|
|
openstack 云计算卷热扩容相关文档) c( h6 Z. K% d& T
[toc]
' n( F5 J2 f* b5 N2 D# p! p; b' D' O( B* l9 O3 x
指令; o& P5 t& c C& [5 |* g) Q/ t
usage: cinder extend <volume> <new_size> `; Q `* b3 @* b1 R
Attempts to extend size of an existing volume.
# z3 N' i0 P3 d% F; ~& {) FPositional arguments:3 X3 H2 X# U/ G$ H+ B$ n* X# K5 A" E( J8 d
<volume> Name or ID of volume to extend.
" k- u% ^7 ^! P <new_size> New size of volume, in GiBs.$ y6 O" |( `9 k7 W3 Z
功能说明" D9 e* V( u6 a& u! f
& d' n4 @' L' W J
最新的openstack()代码支持了热扩容功能:
1 @2 s/ T9 S8 n/ z( u4 D$ p" G( k
Add ability to extend 'in-use' volume. User should be aware of the n( \4 x) d2 @! C1 F, g
whole environment before using this feature because it's dependent
5 Y/ U7 U! z1 k5 P1 }on several external factors below:9 C X5 H4 f# F9 r+ {
1. nova-compute version - needs to be the latest for Pike.
C: x6 A, D _; P9 \# Y2. only the libvirt compute driver supports this currently.
% r* J; j; p F9 A/ w& V3. only iscsi and fibre channel volume types are supported
; v+ o8 y: @3 m$ y; ^on the nova side currently.
& g, n8 P7 }# m+ \4 U$ f2 yAdministrator can disable this ability by updating the( g o0 W+ \0 U$ s/ S% ?
'volume:extend_attached_volume' policy rule. Extend in reserved& J9 Q& U8 p0 [7 R' m. C. P
state is intentionally NOT allowed.$ D. D R, p+ x- C- J
- ?0 l" w6 A* L, ~
注意:
- V. E% [( m3 @/ Z, h, [* R2 I( j! x
6 h6 Y- x: R; O+ c/ c$ C& e- ]: C$ |目前只有 libvirt 驱动能支持,且只有 iscsi 和 fibre channel 协议的卷类型能支持!
, ]" X; s* F5 D. M0 Q y" n1 scinder、nova做完热扩容后,fdisk -l查看可以看到磁盘大小变大,但是之前做的文件系统的大小是不会变化的,df -h 的结果跟扩容前一样。用户还必须用resize2fs 指令自行resize文件系统!
4 I' ]9 u- _+ ^, ?, X《openstack 官网对于热扩容在 CINDER 方面的说明》
* b4 Z: V5 L8 `) y5 X, s+ f' P& s9 j% s" r
《openstack 官网对于热扩容在 NOVA 方面的说明》& T6 k& s5 |$ s
# Q" G, t6 {1 o' w7 z' B$ v3 Z
Cinder方面代码* b6 T$ ]* r B. e0 b
Cinder 方面其实没有什么改动,跟冷扩容做的事一样,扩容后的size必须是整数GB且大于扩容前size。核心实现是调用卷驱动里的方法,如netapp,调用的是cinder.volume.drivers.netapp.dataontap.client.client_base.Client#do_direct_resize实现。唯一的区别是,扩容后,会调用nova api。! Z9 u9 q: c1 H) R: \
+ l7 l2 O7 d% _! O* n% N
cinder.api.contrib.volume_actions.VolumeActionsController#_extend:
4 a8 q- R- t, j' U" `# 如果版本是 且 卷状态是in-use,则走热扩容
' M% H0 @+ I( w% h" E5 |if req_version.matches("3.42") and volume.status in ['in-use']:2 j2 b0 _9 @* k7 V; U% s" K3 _
self.volume_api.extend_attached_volume(context, volume, size)
5 a8 T/ l7 r( n4 eelse: # 否则,冷扩展* t' }& C& x! r- l
self.volume_api.extend(context, volume, size)
7 L0 d8 W8 {0 C1 ]6 G% \5 S- z7 ?9 p
cinder/volume/manager.py里调用nova api,通知nova要扩展卷:
2 h: I8 k9 E2 N if orig_volume_status == 'in-use':
& o( I* l3 \8 K% \3 e& U5 N nova_api = compute.API()$ {" O! `% Y1 M' b( n3 } A5 j4 [/ e
instance_uuids = [attachment.instance_uuid
: T, z: f. x7 Z6 J for attachment in attachments]
& {7 B* f1 S$ q7 p4 D6 b8 p nova_api.extend_volume(context, instance_uuids, volume.id)+ V% C R% v3 |, \4 I
这里调用nova client 里的:8 j; ~. Z8 {# L+ W9 m
novaclient.v2.server_external_events.ServerExternalEventManager#create:
, D, x3 k! V6 }4 r: x3 ]3 T% {; g3 l- S# f" l9 w
class ServerExternalEventManager(base.Manager):
) ~# k- G; P- [$ S5 ` resource_class = Event
; S! j, j! N1 ?6 z4 Z# E- T- r! C8 D- a! k3 B
def create(self, events):
7 R" L2 ~5 {2 c2 d+ x """Create one or more server events.
' R" e4 r4 u8 P0 x! t3 o7 q; e* @, o& N% Q+ R. e. U
:param:events: A list of dictionaries containing 'server_uuid', 'name',
( q& R, y m. X9 T% e0 b( t 'status', and 'tag' (which may be absent)
; B% T" j7 M2 Z. t """. Z$ ]3 w, s$ w% s: J
: ]3 N; |; K+ _8 o" X% p* c
body = {'events': events}& X: |# C1 p- k" q/ R/ |
return self._create('/os-server-external-events', body, 'events',
% |" B0 M) X1 t( }$ d) X5 }9 ? return_raw=True): C9 e; U) ?5 p5 U+ D3 m
) S5 [$ O/ M. _/ ]: @'events':+ m/ E! S. [4 p7 v
6 E1 L; G/ h0 I) j1 C+ |{'name': 'volume-extended',
" l! Q0 i7 P7 L'server_uuid': server_id,( t, Q7 Z+ t" @) H' T4 j
'tag': volume_id}$ W9 q3 t; h& R: s3 d
Nova方面代码
! l" u. U R' W/ q( Z5 D, t* INova将使用现有的外部事件API端点监听来自Cinder的附加卷扩展通知。收到通知后,Nova将使用os-brick触发主机上的设备重新扫描,以发现卷大小的变化。
4 T* \- G! Z8 X9 m0 Y& a* r$ u
U8 i0 ~& Q! x- {( Enova api '/os-server-external-events':
3 d6 i$ F0 ^, a: M6 E8 ]4 w
- G, w( {, F! G8 Z' }request:
: `8 e' U: W. Y7 ~9 t! A/ [ {
. r _/ }) X0 I( N5 A "events": [
) Q! k0 e' L; E! R! Q' ^0 q9 j/ B& | {. U3 q& ^/ d. A# p
"name": "volume-extended",# R% e) E7 c# P5 I. C* l* i
"server_uuid": "3df201cf-2451-44f2-8d25-a4ca826fc1f3",
* o, L7 H( t' j8 T1 b "tag": "0e63d806-6fe4-4ffc-99bf-f3dd056574c0". t3 ]' ^; j- m9 D1 O3 y* z
} ^7 L* [2 W$ }- F5 V" j, P" F' x
]* i4 @ W/ }/ b, e2 r
}
$ [3 O4 a! G, \$ s: t+ H; W* Mresponse:' h( C J/ c" P& Y
{0 P8 ~! |. ?) H8 p9 A5 n# i! W! o; R% [
"events": [8 P' R% y; X! N5 z. F
{- v& P6 [9 u0 C" R* {3 Q! v
"name": "volume-extended",
: |! j* s0 c/ z5 a "status": "completed",
* P! ^9 U, D; X1 e$ t0 `; \ "code": 200,; d( v U+ ^+ x0 r6 |) g$ e4 y
"server_uuid": "3df201cf-2451-44f2-8d25-a4ca826fc1f3",
7 A" ]2 L: m% j" t$ m( C0 s9 m "tag": "0e63d806-6fe4-4ffc-99bf-f3dd056574c0"
5 ?8 B- t A; K. y5 |9 F }
7 k. m) x0 \0 D7 s! c ]
^' t8 n& ~# ~. M4 [7 _1 @ }
, @! k- _ r& b) e1 K! U; L检查nova驱动compute_driver = libvirt.LibvirtDriver是否能支持卷扩展 "supports_extend_volume": True, N( m$ Y B8 c( c% j. R( l, u3 q5 ~
驱动的支持功能定义在nova.virt.libvirt.driver.LibvirtDriver:
- ?9 L' H8 `+ L- ?class LibvirtDriver(driver.ComputeDriver):, f' n& o+ b0 Q- o* O) z4 J# E
capabilities = {, E- }# |: O/ a: B& X" P
"has_imagecache": True,& k4 @' b3 t9 | F
"supports_recreate": True,
2 h6 ?7 h) e2 p9 i( p% G "supports_migrate_to_same_host": False,
' B7 {& A/ @" C% t2 ]( V5 Y "supports_attach_interface": True,) {4 ^) ~" j: ^3 e' i" b
"supports_device_tagging": True," j% W9 s. d0 {" h, _3 t
"supports_tagged_attach_interface": True,
; b! H1 r1 Y9 Y1 J/ w. g; V5 o% Q "supports_tagged_attach_volume": True,
2 r* i6 Z' I3 S; {2 o4 U' H "supports_extend_volume": True,
+ |3 n& ?5 N( r }
0 N( F! u" y& d; n- g- r( n' G9 r+ T1 h# N3 K2 ~4 t- X: x" R( `
根据卷connection_info找对应的驱动,然后调用驱动的extend_volume方法。3 Q0 T, g3 f8 E" @- J
def _extend_volume(self, connection_info, instance):
0 V$ n0 q( T7 U3 U4 ^' A7 k vol_driver = self._get_volume_driver(connection_info)
6 T8 n; i+ {4 c& c return vol_driver.extend_volume(connection_info, instance)
! d$ L9 x4 G: Y6 F; Q比如Iscsi,就会找nova.virt.libvirt.volume.iscsi.LibvirtISCSIVolumeDriver#extend_volume:
1 c) m8 p& N$ x' G( K, Z. u0 E7 j new_size = self.connector.extend_volume(connection_info['data'])' b9 q! @) Y0 b; F& u
在调用ISCSIConnector的extend_volume% q( u* Q# K% p. a. s) h* H
os_brick.initiator.connectors.iscsi.ISCSIConnector#extend_volume:
t6 a9 @. u7 L6 C% J2 I volume_paths = self.get_volume_paths(connection_properties)
6 g# z: h W1 b3 k$ J if volume_paths:
" B" q2 \. @, G9 E( D return self._linuxscsi.extend_volume(volume_paths)
: r& T1 Z) ?& V q1 E调用linuxscsi的extend_volume
$ m' [1 F4 p* ^os_brick.initiator.linuxscsi.LinuxSCSI#extend_volume:
$ s9 Q% q) {) f8 {% w def extend_volume(self, volume_paths):% g; V8 w* I0 f. g5 _9 a" N
"""Signal the SCSI subsystem to test for volume resize.
5 X' S) g1 N+ {
0 A0 _9 O+ D# U" {4 ?! t This function tries to signal the local system's kernel( h7 H3 d5 O0 B5 G/ O' i) e
that an already attached volume might have been resized.
, U& @; }& j% y5 G """
* q, _" X5 r; o6 H3 I LOG.debug("extend volume %s", volume_paths)
' K3 V; H4 m) Q! @$ A
; d- i/ Z* i9 e( w for volume_path in volume_paths:
- N- d% s! H7 w. R& K) S device = self.get_device_info(volume_path)
* z2 Z, D5 o* P6 t8 w7 W! S LOG.debug("Volume device info = %s", device)8 a: f: z* ]! t S9 [5 U
device_id = ("%(host)s:%(channel)s:%(id)s:%(lun)s" %
- q0 ^, C% D- H' c8 v {'host': device['host'],
- }: @ p6 J* z& r9 I 'channel': device['channel'],
) ~- g1 s4 F, C) P 'id': device['id'],
9 R9 G3 s# R8 E' a. p8 p: ~7 [" A 'lun': device['lun']})
$ m3 J$ a& b) n
7 [2 S2 B$ l6 s2 \& m% c scsi_path = ("/sys/bus/scsi/drivers/sd/%(device_id)s" %+ f- R i, @/ F0 \) m
{'device_id': device_id})
( r7 _; a [0 d9 g/ } m # 如:scsi_path = u'/sys/bus/scsi/drivers/sd/3:0:0:3'& d4 U$ j+ N, m: Y( d0 J8 o; Q# R
* e% v( x5 h. K4 L( x # 获取设备大小
- D* B7 d, Q3 F0 r size = self.get_device_size(volume_path)
0 U( P: ?( G2 K2 J' ~" x0 m LOG.debug("Starting size: %s", size)
- v( M4 h9 u" X0 @% ~1 A' I
$ h& D* ^. Y: d: f- `9 N' z% D8 C # now issue the device rescan T7 N- a( q& h! W* \
rescan_path = "%(scsi_path)s/rescan" % {'scsi_path': scsi_path}* \: u* i0 `3 w/ k6 `# z# C
# 如:rescan_path = u'/sys/bus/scsi/drivers/sd/3:0:0:3/rescan'& l4 R- Y2 X4 v* C3 ^
, K( j( ^- L% p: V1 w; o9 R # 在rescan_path文件里写入1。* @0 n4 c5 B6 J* Y
# 对于SCSI设备,对 rescan 文件设置为1 可以使SCSI设备重新扫描。" { o) j$ N% @& w0 M, \
self.echo_scsi_command(rescan_path, "1")
4 U4 G, y' ]# }$ Y new_size = self.get_device_size(volume_path)7 d1 |; U$ ~4 v. q# Z
LOG.debug("volume size after scsi device rescan %s", new_size)7 C# t+ {* E" T/ r" o( i3 ]4 Q
: \* d3 W# p( `# _
# 通过指令`/lib/udev/scsi_id --page 0x83 --whitelisted /dev/disk/by-path/ip-12.24.3.10:3260-iscsi-iqn.1992-08.com.netapp:sn.2d72abb030d511e7875800a098ac0ce9:vs.24-lun-3 `拿到wwnid& v, r- F+ a4 K5 k+ r
scsi_wwn = self.get_scsi_wwn(volume_paths[0])
" r) p) j. ?$ d( _: H, _ W # 如:scsi_wwn = u'3600a09803830387461244a62344f6b52'
8 I+ P+ Y4 s$ X% `$ `0 k mpath_device = self.find_multipath_device_path(scsi_wwn)
* e' Y/ G- t# A/ q5 q3 _$ D # 如果mpath_device非空,说明是多路径磁盘。
; b+ K" g2 f& x if mpath_device:
/ a3 \6 O! k) \2 S7 v) m2 ?# [$ S' i # Force a reconfigure so that resize works
3 U( \6 G) b8 C% _9 g& P* C; I y # 执行 `multipathd reconfigure` 重新获取 multipath.conf 配置中变化。/ I% a: q0 Q5 r" J- j0 ]* h. \
self.multipath_reconfigure()
' C- D: s5 o `( `+ `4 f6 m& I5 b # 获取设备大小& m: q, } ~1 g+ s+ H4 a( l
size = self.get_device_size(mpath_device)" L7 l' k! j, w" y
LOG.info("mpath(%(device)s) current size %(size)s",
" H0 }: ^* C+ p% H- v( i {'device': mpath_device, 'size': size})5 w, O F' u" Y4 R& v
v" E: y. X3 j # 调用指令 multipathd resize map multipath_device 重置多路径磁盘的大小
. P3 E4 y" b V4 Q- T result = self.multipath_resize_map(scsi_wwn)* B5 H% a- {' o z; b) D
if 'fail' in result:
" y" l- s* d0 b9 d6 c LOG.error("Multipathd failed to update the size mapping of "- n K' G4 t3 [8 R& Z
"multipath device %(scsi_wwn)s volume %(volume)s",
. V# s0 r2 Z& D" | {'scsi_wwn': scsi_wwn, 'volume': volume_paths})" A; m x) q+ X) z" c9 q
return None0 |3 t' u0 h' ]3 H
# j" ~. Y9 ]* a' f' Y0 T0 a+ m3 z # 获取设备大小
% y. ^8 k2 r3 X6 T5 o new_size = self.get_device_size(mpath_device)
$ t- w1 a5 f3 d U: a# ~$ g LOG.info("mpath(%(device)s) new size %(size)s",. O) z" Y# K8 F2 D, S5 x
{'device': mpath_device, 'size': new_size})
1 C8 ~& \+ M' k8 ?. S9 b4 n$ h$ I+ ]7 f/ l4 f/ Z! ^" j) W) y. T
return new_size
# w# T0 T! N$ h$ M$ x5 p" V: |流程简要:* D4 s: g2 i9 N, O4 |
向scsi扫描文件写入 1:tee -a 1 "%(scsi_path)s/rescan",对于SCSI设备,对 rescan 文件设置为1 可以使SCSI设备重新扫描。# c' [( O2 l% v; O9 S& I
+ \: Y: E- }# Y) S7 X. ?" l! D
/lib/udev/scsi_id --page 0x83 --whitelisted 得到scsi_wwn
* M% D. ?+ ~ c' J( a0 l
& f) X* w/ P3 |+ t" f检查多路径设备,先检查/dev/disk/by-id/dm-uuid-mpath-%(wwn)s是否存在,存在则返回路径;如果不存在,则检查/dev/mapper/%(wwn)s,存在则返回路径,不存在返回none。" O9 |" ~. [1 l+ T! A) q. i! ^
, L# @# m! g) L* {# O' t# e如果第3部结果为none,流程结束。' }0 F# Y, n4 ]
. ~4 D: y7 Q7 J1 j6 V, l; R7 r如果第3步查到路径,则需要执行 multipathd reconfigure 重新获取 multipath.conf 配置中变化。: B% c% r' \/ A$ J5 m
3 m( w0 ^. Z/ c3 @执行multipathd resize map scsi_wwn 重新设置设备大小。多路径磁盘流程结束。. h' ], r7 N1 P
/ W1 c8 V* }7 I) n8 x; W% V. V2 s
FC和Iscsi驱动都是这样流程。
o9 F$ Q) [2 R5 I
$ Z& [) [7 O9 E) L/ i附:
- x% |: f) r, P' l& m0 V/ u& xcentos 如何使用多路径磁盘& O9 B+ Z! N% d
1.安装multipath工具
0 O! c5 O7 P- I5 P% Q9 I# D# 安装multipath工具% V( s" T7 t, b B
yum -y install device-mapper device-mapper-multipath
# D" X* z5 q: M" m
3 X$ t) q% `9 e7 x7 q" t#加载multipath内核模块
, p3 g: h! B y- S; {' S- \6 `3 emodprobe dm-multipath2 f; u( m8 t1 p- U, h
modprobe dm-round-robin1 W' E3 u3 ]/ Q) {
/ ~ P% V, s% p* r
# 拷贝默认配置文件
* m5 E; [5 t4 F% o4 a2 Z ecat /usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf > /etc/multipath.conf
2 }1 v0 A3 u) w6 r' N: L- c* r3 _
5 V5 ~2 g# k' e" R+ B#启动服务
; K, P: @8 T7 ?2 I1 _2 X/ xservice multipathd start 或者 /bin/systemctl start multipathd.service
& u: M/ z1 z+ Z; J* `2.配置nova_compute的配置文件
6 q. c/ l0 @5 c! y; Q6 X- Q4 L% `% R[libvirt]: F- g' q3 k5 u( c4 Z4 n) T0 W8 r
# iscsi磁盘是否开启多路径,True为开启
% b) V6 M6 X& f, z/ }2 Nvolume_use_multipath=True
. }4 h. x! Z& x a. k: q$ e8 C& z7 k% P% c( o2 N- X0 K& j1 o
# 建立连接时的rescan次数
% K u' K' I6 c# N! g1 p4 anum_iscsi_scan_tries=5
/ q( {' a1 I6 q9 ~$ P& B7 p
/ f, |0 n' T, R) r# 创建iscsi连接使用的iface名称
0 P* |; N! K% f! biscsi_iface=default" h9 W9 b% {8 I' l5 a+ \. J
修改在线多路径设备容量的方法" B: B: S5 s4 U& I. B; y5 P' T
redhat官网上介绍了修改在线多路径设备容量的方法:2 ~$ B" b5 b" y% S# d! l1 S
2 ^1 @$ |- P8 {
RESIZING AN ONLINE MULTIPATH DEVICE
9 ~9 j7 i- m, a8 G% G! lIf you need to resize an online multipath device, use the following procedure.5 `# S P' N& F+ U a6 V. O' l
2 ~: c2 ~2 R2 e! S) ~Resize your physical device.: ~2 |2 F# D; E D: B4 q' X
Execute the following command to find the paths to the LUN:+ t/ r3 `+ @. b% s4 m0 R2 T
# multipath -l; z. W7 v9 Q, ^. S5 Q9 v; u" y
A% S7 f/ q5 Q. V. p, `
Resize your paths. For SCSI devices, writing a 1 to the rescan file for the device causes the SCSI driver to rescan, as in the following command:
4 C+ L" A- y! [8 _# echo 1 > /sys/block/path_device/device/rescan
1 \7 [9 v. }5 Z( f+ X5 B+ c( @4 E* H3 \6 \; R) K" X1 P) }
Ensure that you run this command for each of the path devices. For example, if your path devices are sda, sdb, sde, and sdf, you would run the following commands:
4 |' c: L6 B L3 D( n% I" E% X" {4 [" ~4 T" l \
# echo 1 > /sys/block/sda/device/rescan
! w7 t" M% O: |. }; X1 N; @' i9 I. W- ]8 `5 o
# echo 1 > /sys/block/sdb/device/rescan' k: F1 s, c- g/ b. d6 p, o
# I: Y7 w. |! N2 C) q' l+ G# echo 1 > /sys/block/sde/device/rescan
/ k6 @2 w8 H: z' W+ B6 \5 H: M
2 H4 D$ [& g I0 P1 @) b- T# echo 1 > /sys/block/sdf/device/rescan
; g* I7 ^- d8 h8 \+ D* V! Q% W- m% a o( g9 k! F B7 t$ {/ j
Resize your multipath device by executing the multipathd resize command:
- T2 \: w* m" @' c9 D1 w# multipathd resize map multipath_device5 q6 C7 b, C! A5 B: C4 }7 r
H" p0 _ b$ K; o& [, @) EResize the file system (assuming no LVM or DOS partitions are used):
: R/ W/ O. O0 J, F8 S% K; g: X# resize2fs /dev/mapper/mpatha
5 e- ^! z3 I+ n: C' E
0 O. ~3 V5 H/ q! c8 `) P: P看的出,跟nova的处理流程差不多,主要少了resize2fs一步。
3 n3 P d8 O" z* ]' X3 V% g
% L0 }. v" S6 Q& v7 Z, ~( U7 y1 ^测试过程遇到问题9 s. S, i; S& m* ^
问题: 创建虚机时提示"Host 'localhost.localdomain' is not mapped to any cell"
# K1 {1 H4 x% H0 r0 `( U! z; X" P0 {8 R* x4 ~! `
解决: 执行 nova-manage cell_v2 simple_cell_setup* H; e) n# T( P0 f8 l) E4 Z
) m6 [9 Z- x5 {* p3 ]问题: n-cpu日志提示libvirt 版本过低
$ |) ]9 F8 N' t6 W; x+ V( [1 h' o3 Z
解决: 按照以下步骤升级
2 W/ A. ?: i$ i+ W% I8 O$ rpm -qa|grep kvm
* E+ V. }" r/ `$ rpm -qa|grep qemu-system6 d% A; {+ Z2 Z; r' t% k; J I
$ sudo virsh -c qemu:///system version --daemon: p* L2 z5 M; K1 D1 E
$ sudo yum remove qemu-system-x86
' H, i" v: k$ a# W2 k$ sudo service libvirtd restart% u& C% B" B' J }
$ sudo virsh -c qemu:///system version --daemon
5 x) j/ G! `3 E) N- b5 B/ s9 A
" n& Y' Y8 A0 ]( G& T问题: c-vol 提示:ERROR oslo_messaging.rpc.server ConnectionFailedError: HTTPConnectionPool(host='12.24.2.18', port=2379):
" X0 |# c$ l) [/ c9 \/ TMax retries exceeded with url: /v3alpha/lease/grant (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x718cc10>:
* J# x+ u: a1 W$ d; q$ r& a. I8 w& gFailed to establish a new connection: [Errno 111] ECONNREFUSED',))" w. Q6 @0 J/ F5 S
ERROR oslo_messaging.rpc.server
- E K7 ?& O( D; J$ J o
1 g7 {- n6 U% b$ f' f2 E6 q! f1 A解决: 配错了coordination。在cinder.conf里吧[coordination]的backend_url注释掉即可。/ W6 o& @# N& @
9 _5 F# o# O* F( `0 Y' N# ^/ T" o" z
|
|