|
|
以下主要为安装部署过程中遇到的一些问题,因为openstack版本问题,带来的组件差异导致不同的版本安装的方法也完全不一样。经过测试,目前已可成功部署Essex和Grizzly两个版本,其中间还有个版本是Folsom,这个版本没有部署成功,也没有花太多时间去研究,因为Folsom版本中使用的quantum组件还不成熟,对于网络连通性还有很多问题,网上也很少有成功的案例,大多数人使用的还是folsom+nova-network模式。5 M7 U/ d% v" S* o
, @' y* X3 c# ?* v0 J! _% h# I到了Grizzly版本,quantum组件才比较稳定,可以正常使用,自己也花了很多时间研究,现在已可以成功部署多节点环境。以下是部署过程中遇到的一些问题,包括Essex和Grizzly两个版本。国内网上关于这方面的资料很少,很多资料也都是国外网站上看到的。而且很多情况下日志错误信息相同,但导致错误的原因却不尽相同,这时候就需要仔细分析其中的原理,才能准确定位。遇到错误并不可怕,我们可以通过对错误的排查加深对系统的理解,这样也是好事。5 E& L0 v! r% B
9 j- S3 ~$ X h+ O$ n: B5 C
关于安装部署,网上有一些自动化的部署工具,如devstack和onestack,一键式部署。如果你是初学者,并不建议你使用这些工具,很明显,这样你学不到任何东西,不会有任何收获。如果没有问题可以暂时恭喜你一下,一旦中间环节出现错误信息,你可能一头雾水,根本不知道是哪里错了,加之后期的维护也是相当困难的。你可能需要花更多的时间去排查故障。因为你根本不了解中间经过了哪些环节,需要做哪些配置!这些工具大多数是为了快速部署开发环境所用,正真生产环境还需要我们一步一步来操作。这样有问题也可快速定位排查错误。
7 y3 T" W) {) u2 A% f5 s* C& i
3 w' M; f( M% Y( z5 h5 D本文仅是针对部署过程中的一些错误信息进行总结梳理,并给予解决办法,这些情况是在我的环境里遇到的,并成功解决的,可能会因为环境的不同而有所差异,仅供参考。
# O4 [ y1 X$ \" F: m- K2 I3 n# ?2 ~, {. k5 s- C$ [
1、检查服务是否正常:4 }4 s6 ?$ [5 L# Y
* e+ P2 ]+ _$ Proot@control:~# nova-manage service list
) ^3 u: r9 T+ z6 J 2 k4 U, I) j+ h$ Z! v1 b
Binary Host Zone Status State Updated_At
* l1 A- X8 R7 g, z' _& Q
' g' I& s9 |+ fnova-cert control internal enabled :-) 2013-04-26 02:29:44
. b! X" v3 y; D1 m- g+ B' w , S8 e- R* C9 `) G0 l# }) ~) J
nova-conductor control internal enabled :-) 2013-04-26 02:29:42
# c/ e8 a( O; V% {% F# i7 `6 ]
1 H7 a: x9 @3 T. D' \5 K: Inova-consoleauth control internal enabled :-) 2013-04-26 02:29:44
; ~- f# @0 b8 g/ s8 Y S( i ; M3 c% l- z9 c* A7 }
nova-scheduler control internal enabled :-) 2013-04-26 02:29:475 W% J% T$ `! S4 {
, ]0 h# }1 W/ z gnova-compute node-01 nova enabled :-) 2013-04-26 02:29:46" N }, y) @2 H# F
! [4 w1 o' z' G! n
nova-compute node-02 nova enabled :-) 2013-04-26 02:29:46' v4 C3 |6 ?3 P: D# V- v; Y
& U4 I, I/ k% n0 M% g: y p2 V0 Q9 ^nova-compute node-03 nova enabled :-) 2013-04-26 02:29:42 L( H, B8 F' X. L
. T% t2 P# q1 W3 x |! F. K) V4 g8 h; M$ J8 z: L6 ~( N1 d M: b
如果看到都是笑脸状态,说明nova的服务属于正常状态,如果出现XXX,请查看该服务的相关日志信息,在/var/log/nova/下查看,通过日志一般可以分析出错误的原因。2 Y4 y) U7 G; v
8 o3 H0 J/ d9 [
2、libvirt错误
" F7 r! Y' B; L6 f& k9 R& a- c+ v. G$ {/ v7 Q' R
& U- F7 s0 k: H! x+ l+ p+ h5 x: H1 M# B
python2.7/dist-packages/nova/virt/libvirt/connection.py”, line 338, in _connect
/ x9 ^* k; E; L2013-03-0917:05:42 TRACE nova return libvirt.openAuth(uri, auth, 0)
+ z* `9 K# w" ~2 X; {2013-03-09 17:05:42 TRACE nova File “/usr/lib/python2.7/dist-packages/libvirt.py”, line 102, in openAuth. \3 x& k5 c' ~* ?* r
2013-03-09 17:05:42 TRACE nova if ret is None:raise libvirtError(‘virConnectOpenAuth() failed’)
0 I/ K5 @- u: _ R# b% j$ [$ z2013-03-09 17:05:42 TRACE nova libvirtError: Failed to connect socket to ‘/var/run/libvirt/libvirt-sock’: No such file or directory
( }$ G Q8 s6 D7 d8 n8 M7 \2013-03-09 22:05:41.909+0000: 12466: info : libvirt version: 0.9.82 O! {' P6 [. A. j& ?1 M: l: k% S) a
2013-03-09 22:05:41.909+0000: 12466: error : virNetServerMDNSStart:460 : internal error Failed to create mDNS client: Daemon not running
9 }$ h% x8 W% i! B
! c' j+ {* `/ l( T$ H5 L6 K
0 w' g) [' B9 q) _解决方案:5 o6 }$ N: V2 T% ]2 M
4 ]# p# n! w; [; P* Y4 Q6 ^出现这种错误首先要查看/var/log/libvirt/libvirtd.log日志信息,日志里会显示:libvirt-bin service will not start without dbus installed.
6 _0 T3 G8 C* x6 t5 X" B$ ?8 B$ t; V5 K
- o7 P, D% ^6 x我们再查看ps –ea|grep dbus,确认dbus is running,然后执行apt-get install lxc8 B0 S3 K) {$ \
- c# I* O/ \0 u% `% e3 H/ y3、Failed to add image& \5 H% v3 q. c" ]( J
7 j1 r; a& e$ A: d% {+ S8 L
Error:; i$ c. m+ S6 [5 c" c, }3 R
Failed to add image. Got error:
The request returned 500 Internal Server Error
( j) y- H/ T* H* c6 C7 T6 S 2 l2 }9 x' a6 ?$ X8 T4 _: l9 Q* ^+ r/ [- h
* B% S- s: l4 b% ~; ~解决方案:0 j4 `1 i/ o& ]2 U) G4 }
2 a1 ~3 q7 z* q0 r' P$ J+ m# L) q环境变量问题,配置环境变量,在/etc/profile文件中新增:
! O( T# w* P+ S$ ]' ~! |3 Y' T5 w1 t! l/ X, Z/ o
OS_AUTH_KEY=”openstack” 7 h& |2 t, D+ n
OS_AUTH_URL=”http://localhost:5000/v2.0/”
" u8 y" B6 }$ j2 j* K3 N, v% g6 YOS_PASSWORD=”openstack” g6 h: {5 A$ ` H/ r
OS_TENANT_NAME=”admin”
! ^$ B1 R% X2 n: x& oOS_USERNAME=”admin”
l* ^$ H% K3 Y y& _* K u " m4 k. S* r3 F5 ~' b# ] q
# ]/ z s3 S; r0 @然后执行source /etc/profile即可!当然你也可以不在profile里配置环境变量,但是只能临时生效,重启服务器就很麻烦,所以建议你还是写在profile里,这样会省很多麻烦。
1 Y0 J2 _, @3 F* R7 x& L L/ ^1 e; G" Q: |5 r: L9 `5 d
4、僵尸实例的产生 g* q& _2 a8 M
6 V1 D3 M# e w+ r7 d, T6 s# \僵尸实例一般是非法的关闭nova或者底层虚拟机,又或者在实例错误时删除不了的错误,注意用virsh list检查底层虚拟机是否还在运行,有的话停掉,然后直接进入数据库删除。: {7 a/ E' L r2 _2 d- x/ [
+ f1 X4 U* w3 k, N* s- L
Nova instance not found# M, c' T" m9 Q0 J8 A
& Y* ^. R: V1 l9 U1 X
Local file storage of the image files.4 Y4 u# i' g( ^
[% G+ g) t# k4 u8 b# \% TError:3 W4 o1 L* y0 }: j
2013-03-09 17:58:08 TRACE nova raise exception.InstanceNotFound(instance_id=instance_name)7 T' G1 L* h# C2 O# o; j6 N
2013-03-09 17:58:08 TRACE nova InstanceNotFound: Instance instance-00000002 could not be found.
& f& M7 K! A( x _2013-03-09 17:58:08 TRACE nova$ v' x. u4 H* P1 O
5 A4 _3 I) Y' L9 j1 k
+ n7 N! @/ X! B, O 7 m3 P# i2 t/ f* M" N; A: K# B. q S7 V
3 j. B% H3 }& K7 L9 r! D解决方案:
. ]2 I/ |+ k q6 r% T# q% t* V( M9 w5 w4 _* z# q- [* ]% }
删除数据库中的僵尸实例或将数据库删除重新创建:
8 f$ h1 |5 U1 Y% j
3 E' i5 ~) ^6 g" _/ J( m7 F4 ~) aa、删除数据库:; ^0 V' G B5 E# y
8 e7 J- J7 S7 `* L) j$mysql –u root –p5 G0 N& d2 q( D8 B5 U9 N( u
DROP DATABASE nova;6 Z% K- Y: z! S# n
+ ]1 K- @/ x1 i4 o* o7 ORecreate the DB:- [8 S5 F. Y1 t: k! \
CREATE DATABASE nova; (strip formatting if you copy and paste any of this)
4 \/ x; v ^/ `/ T6 J/ z! I/ P2 vGRANT ALL PRIVILEGES ON nova.* TO ‘novadbadmin’@'%’ IDENTIFIED BY ‘<password>’;
# Q& w r/ S0 p: V1 j6 dQuit& Z% C+ Z) x9 X7 K T6 {
' ]; }; S' N8 D" k! V0 j
Resync DB
' M' E2 z3 b3 Q3 {; z6 a9 B1 w
" z% M+ c3 x, f* w0 U. N5 i; H, N0 a7 I
b、删除数据库中的实例:
7 {3 g) W) Q$ F/ T0 v. x/ [; [6 } G4 p& T. t, E! `7 j7 j7 _
#!/bin/bash! f8 [ C9 a& a+ W5 i& V4 F
& ^: @+ Z/ x% H. ~; L, |% P+ ymysql -uroot -pmysql << _ESXU_" v, O7 w! r. ?" {$ d6 R" @
h, _* ~) e* m5 M- n# H. Q& [use nova;! Z& @* r2 U' r3 k7 p$ E" r# ?
4 I' p3 q3 w0 A! vDELETE a FROM nova.security_group_instance_association
1 s- ]& Z2 K" Z' {$ G
( s0 e. ^2 e& xAS a INNER JOIN nova.instances AS b
+ P+ @" d& t( E- v, R5 k/ D
6 J9 n1 u U% V3 sON a.instance_uuid=b.id where b.uuid='$1';
- s* Q1 }8 y( G# g; L
, b/ t' X* ^# |- d5 KDELETE FROM nova.instance_info_caches WHERE instance_uuid='$1';
9 C# o- ~1 {# M2 Z6 Y3 x6 q, r
) L" N" U! M7 P& YDELETE FROM nova.instances WHERE uuid='$1';
" U& G' C; }+ W& d3 v+ O+ F. X
8 O+ z+ s9 i6 p_ESXU_" B7 A: K% d+ k' _9 s# l ^7 e
; S8 e* h$ R- L; Z z3 s: ]; R) u
) f: H, V; I, J* ]0 D
将以上文件写入delete_insrance.sh中,然后执行sh delete_instrance.sh insrance_id;
3 a5 K! n; ]+ T. `3 |8 i! K; a
b5 G% L6 X9 J其中instrance_id可以通过nova list 查看。 B1 a7 j' W6 y
/ \0 l0 d8 |1 Q* V" {% o a5、Keystone NoHandlers+ B8 x8 Z, l2 h" C0 B
3 \) b$ q+ I/ N7 U1 D$ m0 c1 vError
3 _4 A! H$ h+ C; S/ y* J5 U# n7 s4 Rroot@openstack-dev-r910:/home/brent/openstack# ./keystone_data.sh5 p+ N) r9 `) e n3 a
No handlers could be found for logger “keystoneclient.client”
# b$ J9 y P; e- Y; z3 eUnable to authorize user [0 ^$ m/ w( r, b/ ]5 L( n
No handlers could be found for logger “keystoneclient.client”
5 [5 W. b& c3 D, r# a+ rUnable to authorize user
7 n$ p. P/ x5 j% \! U$ yNo handlers could be found for logger “keystoneclient.client”0 h" b2 j1 z. t
Unable to authorize user5 Z' A0 L3 F7 g9 H; {3 p
; ?* u0 u; ^6 } R& E7 o; K; S3 Z' X: w! j* V4 P" W' |3 ^
解决方案:
* {/ q5 ^) ~7 |# r- l8 I4 |9 ~# Q! t5 `' M3 z& q1 U
出现这种错误是大多数是由于keystone_data.sh有误,其中9 V) L0 {. E+ n5 N
. g2 B' A$ T* q3 ?5 [+ p, B& A
admin_token必须与/etc/keystone/keystone.conf中相同。然后确认keystone.conf中有如下配置:9 {+ i5 s( b1 d! k+ w
- o: b* d* \: s- g7 bdriver = keystone.catalog.backends.templated.TemplatedCatalog template_file = /etc/keystone/default_catalog.templates
. J# s: J; t/ h+ B8 e! [0 k+ Q, Z8 p; J' C: A5 S
6、清空系统组件,重新安装:
6 O" g ]6 v" v8 A) g9 {
& V I6 V8 `5 a. y: E8 R#!/bin/bash+ p: V* p. k3 c7 s J% F" ^
mysql -uroot -popenstack -e “drop database nova;”: l& E0 R5 K1 Y; f; J: ~+ W5 N
mysql -uroot -popenstack -e “drop database glance;”
1 B2 y- v$ Z% p! Y1 @. Lmysql -uroot -popenstack -e “drop database keystone;”7 [# R8 \# l; p3 u, j8 m$ r1 \* x% h
apt-get purge nova-api nova-cert nova-common nova-compute
2 a' e% z2 B2 q2 r6 h1 unova-compute-kvm nova-doc nova-network nova-objectstore
# D- ^, r+ [8 G3 xnova-scheduler nova-vncproxy nova-volume python-nova python-novaclient S; [: x, c# g9 v% [8 A- q
apt-get autoremove1 ^2 b" m# Y' X
rm -rf /var/lib/glance
" T9 s+ X- U* L% ~5 t. Q ~0 ]rm -rf /var/lib/keystone/
& K+ W0 N' X7 g! Z1 Crm -rf /var/lib/nova/
# S2 |4 X% `4 @$ ]" Srm -rf /var/lib/mysql
3 E5 r3 F! f- d0 q7 I4 Y
5 u, e- U) }% x) Q
" b1 C3 R( ~/ I3 n% R可通过执行上面的脚本,卸载已安装的组件并清空数据库。这样可以省去重装系统的麻烦!! z [- F" L: _8 q- ~2 i7 L
% b V, J, v7 f% m1 v5 m) n7、Access denied for user ‘keystone@localhost(using password:YES’)
, ^8 M' `; j* _" `* g$ H. S0 ?- ]8 W$ u9 z0 \9 @8 X( A% W* G5 {$ ^+ ^: h- _- g/ y
# keystone-manage db_sync
. }. c+ b" M' q' u- @7 [& L. s6 y
' Q; K& r. m9 a6 [! oFile “/usr/lib/python2.7/dist-packages/MySQLdb/connections.py”, line 187, in __init__
V. O' U [3 p/ s+ f8 t) e: j , p7 w! f- W4 ?9 ] x* @5 Z8 D
super(Connection, self).__init__(*args, **kwargs2)4 r4 D7 l( m7 A) a1 ~: F
sqlalchemy.exc.OperationalError: (OperationalError) (1045, “Access denied for user ‘keystone’@'openstack1′ (using password: YES)”) None None
+ J, [$ J- G$ N K5 O1 ?4 ~! k. o $ I7 S. t( h: n' }. U* E
( ~0 l2 D7 ^, h" ^0 G# A7 c; f- f解决方案:$ u5 W; k# E: ]/ k% w( g: F
0 ~# t9 I5 V7 H# U; M8 Q) [6 l9 \, m9 n查看keystone.conf配置文件链接数据库是否有误,正确如下:* I# w$ Z: s3 r1 |4 u3 C$ V/ M8 S+ K. y
. N; `6 B# p1 }# \
[sql]
, \( q% Z# v& `) g
( u% g7 W# L$ a2 @7 ~% d" V7 y( N connection = mysql://keystone:openstack@localhost:3306/keystone
5 O3 g' I# x1 K( x: {
# ^7 g- R! a9 n! P# p5 G8 ~1 J: q5 P3 F* _( S0 B8 f
8、nova-compute挂掉与时间同步的关系7 `7 Z7 Y: s: v1 v8 m, F5 o% Y
7 ^6 c A9 ?/ Q
很多时候发现nova-compute挂掉,或者不正常了,通过nova-manage查看状态是XXX了。% e1 n, F1 ^/ ]% r! C) V7 {
6 ]8 g" \7 t) d" h1 o
往往是nova-compute的主机时间和controller的主机时间不一致。 nova-compute是定时地往数据库中services这个表update时间的,这个时间是nova-compute的主机时间。
- e* D- a6 U8 }0 n G* h' H! H: V" y+ ~3 H/ f2 g [
controller校验nova-compute的存活性是以controller的时间减去nova-compute的update时间,如果大于多少秒(具体数值代码里面有,好像是15秒)就判断nova-compute异常。
: P. s- J! Z8 Q \& P0 i8 }6 r/ t4 K
这个时候你用nova-manage查看nova-compute状态是XXX,如果创建虚拟机,查看nova-scheduler.log 就是提示找不到有效的host 其他服务节点类同,这是nova心跳机制问题。所以讲nova环境中各节点时间同步很重要。一定要确保时间同步!!. R+ f. P" ?: k5 C! A; c4 c" x' L
! _/ ^( K% v) {如果在dashboard上看nova-compute状态,可能一会儿变红,一会儿变绿。那就严格同步时间,或者找到代码,把上面的那个15秒改大一点。3 m6 _6 a! [; l; s
1 j s* x# x* V& {; G* a
9、noVNC不能连接到实例
/ ?# z0 g, J6 Y3 y
- p9 s4 q J! g& A3 x+ Q- pnovnc的问题比较多,网上也有关于这方面的很多配置介绍,其实配置不复杂,只有四个参数,配置正确基本上没什么大问题,但是装的过程中还是遇到了不少的问题。
2 {# m3 O3 Y- ]) [' W8 j5 }
) N6 N: f( K% u9 k' ca、提示“Connection Refuesd”
& E. [: U$ U# g! k* d/ l7 ~4 O- s, F! G* g1 A
可能是控制节点在收到vnc请求的时候,无法解析计算节点的主机名,从而无法和计算节点上的实例建立连接。
' R0 B/ G7 e; m/ G; Z; U$ J* c; Y
9 W' J4 k* H2 E7 v6 X另外可能是,当前浏览器不支持或者不能访问,将计算节点的ip和主机名的对应关系加入到控制节点的/etc/hosts文件中。
& p* o( o3 f" o+ [
, Y9 t7 X3 C9 S X c3 ^3 Kb、提示“failed connect to server”
# d3 T6 F% o( H) y; J _- `/ G, R& }$ x$ {5 t: g7 Q
出现这种错误的情况比较多,有可能是配置文件的错误,我们的环境中遇到这个错误是因为网络源有更新,导致安装版本不一致,使组件无法正常使用,解决方法就是使用本地源。另外需要特别说明的是使用novnc的功能需要浏览器支持Web Socket和HTML5.推荐使用谷歌。" @8 {8 j2 O! _
% v( @8 z5 I) X0 \) \- p. h
10、cinder错误,无法登录dashboard.! U5 {4 q |6 n! ?
2 M; l0 l+ w. d' Q
出现如下错误:2 J0 q0 L3 U; c' H
+ B/ W5 C! }" |4 q7 m5 k
8 B1 m( j( T# u v6 t8 mTypeError at /admin/ F6 ~) c7 q! c; K+ w
hasattr(): attribute name must be string
" W# q5 m& m* E' f \; i% | ' h( o% X' m1 K6 {' m; \% t
Request Method: GET
+ z0 \. n5 h( ^ v0 P( L3 a
/ b3 c! Z# c; s% B* y3 URequest URL: http://192.168.80.21/horizon/admin/9 A D* H. v/ M
; d9 v7 {- [8 eDjango Version: 1.4.5
_/ w, s( x7 M 8 N/ R% v: v5 i) O, _! e
Exception Type: TypeError: O; R r7 E% b4 J2 ?
8 s( J+ ]3 B6 j0 x1 c: \! \0 IException Value: 0 Q3 ~6 ]7 d& F4 x! i3 Q
3 Z& n! P$ I8 c, T) X( H8 @' X
hasattr(): attribute name must be string4 i' M6 [0 n) I# T' O1 h5 ^
+ F( U1 F" ?; h& Y+ X& r' SException Location: /usr/lib/python2.7/dist-packages/cinderclient/client.py in __init__, line 78
) s X; m. H) L4 y+ E d& |& q5 H4 C8 L' U4 Y: F1 G
Python Executable: /usr/bin/python* w& |8 @$ m+ C; ~ g
$ @3 N% {% [5 B4 J* `( PPython Version: 2.7.35 _# ]& p, n8 s \4 h9 I
9 u3 L" R3 `! c" QPython Path:
6 l* q: P2 y7 Q' o \! q 4 {( Q# [8 A9 Y& p
['/usr/share/openstack-dashboard/openstack_dashboard/wsgi/../..',
$ ~- [, x e- ?* b3 w7 P # E: }! {2 e0 n7 o( ^/ Y7 R! p
'/usr/lib/python2.7',
4 R8 ~6 J/ j# J+ J- P/ i9 D: D5 e : d" w$ A3 i; k
'/usr/lib/python2.7/plat-linux2',
& t& Q& ?6 f$ D k1 T F
4 \/ }5 P6 F. B# D. X0 F& p, U '/usr/lib/python2.7/lib-tk',& [& b3 _' e+ W- w8 ^& S1 O
# m& J' T6 [4 Q3 C# ] V1 {5 B# v '/usr/lib/python2.7/lib-old',/ C$ f/ g6 K$ \$ D8 I6 T6 A
7 y) A% X p% c I* q '/usr/lib/python2.7/lib-dynload',4 k8 v4 }% c, l* z
" _/ L4 O8 P+ | K" W' m
'/usr/local/lib/python2.7/dist-packages',5 m) L: S8 A+ K- Y: f$ y
7 j8 }# J4 p1 x$ `( o5 E '/usr/lib/python2.7/dist-packages',4 J" U( x1 a$ O6 T8 W8 R
- T- C3 {( d/ e9 l) g- e' b- d '/usr/share/openstack-dashboard/',
7 \ o$ _( j% z! N ' I' H- ?. L3 {9 E
'/usr/share/openstack-dashboard/openstack_dashboard']/ X7 s* n7 {' d, y+ S
0 t; E% A$ O' J; t" Y5 ~ 1 P$ Q9 `$ b* x5 P3 S* I+ k* T
8 C: J% ^3 \9 `9 a' H1 ?$ O
Server time: Fri, 29 Mar 2013 12:51:09 +0000
0 I7 D" E0 O3 G; v5 N+ } - [4 N1 ~, i! C& l4 S1 T
/ V& e2 [. K8 s7 |8 U" l! W
解决方案3 P* ^% N6 h8 ?+ e. R0 z
) Y+ ]2 p" n+ w" g) k查看 apache2 的 error 日志,报如下错误:$ t9 a7 Z6 B6 k
( w4 B& z2 k$ V% m5 u
/ }- Q7 O, E8 ^0 w* s: HERROR:django.request:Internal Server Error: /horizon/admin/, ]9 v1 q: i! Q! R/ S3 `
# z* a1 Q8 G) b2 E3 pTraceback (most recent call last):, m( e4 I% x/ o# q/ H f
, R) X, p' M9 `' Z+ e% U m+ c
File "/usr/lib/python2.7/dist-packages/django/core/handlers/base.py", line 111, in get_response8 I0 O) _) N* @4 N+ [2 j/ R6 W
7 R- s$ d+ b* x1 O1 N3 w4 P response = callback(request, *callback_args, **callback_kwargs)& C" o' _( ]6 G+ b: m9 E
- d- S( q* V* R1 G" a# j' h File "/usr/lib/python2.7/dist-packages/horizon/decorators.py", line 38, in dec
! F) {( k: U; f3 \ ! P: C+ t" W; e+ T
return view_func(request, *args, **kwargs)
, l- u2 Y1 J- I* l, N' E& O ) ?2 c6 M9 B- @% \
File "/usr/lib/python2.7/dist-packages/horizon/decorators.py", line 86, in dec
; ]% ~5 T) `( L2 p! t, X
1 z2 e+ I1 _2 [8 b0 B6 o* L4 y return view_func(request, *args, **kwargs)
( n4 y$ M4 Y* }0 u! x4 ^ & t; F* O: [. [- `- A! Z
File "/usr/lib/python2.7/dist-packages/horizon/decorators.py", line 54, in dec2 `3 o7 v9 u! {' \) A3 E
9 B5 b, h" w" Y' I3 g
return view_func(request, *args, **kwargs): E' V& X; z o
$ _% O, S% v3 s0 O4 g- U" W& l File "/usr/lib/python2.7/dist-packages/horizon/decorators.py", line 38, in dec* h* s3 a; q) v
2 v% N6 j3 q% D) n% e return view_func(request, *args, **kwargs)- m- \+ |7 @7 L
4 M: \5 z% m; \6 ?- x
File "/usr/lib/python2.7/dist-packages/horizon/decorators.py", line 86, in dec0 N& m B' }8 W6 B
! W0 j( D& c! l+ | return view_func(request, *args, **kwargs)
5 `* Y+ S! B: `! d' i
9 Z9 x- V' u# Q) c File "/usr/lib/python2.7/dist-packages/django/views/generic/base.py", line 48, in view
, u2 r% P: X2 @5 [) b- H1 p
: f# D; s' i4 i% ?3 @ return self.dispatch(request, *args, **kwargs)
# `- M! o& i# n7 [ 4 c4 ~* ]; o' C9 ]
File "/usr/lib/python2.7/dist-packages/django/views/generic/base.py", line 69, in dispatch( E* O: e4 g+ z8 \- n- m' ~
/ B9 q: T, v$ N/ A
return handler(request, *args, **kwargs)
8 c% T; v l- p ( }4 w) [& u. Z' X$ Y
File "/usr/lib/python2.7/dist-packages/horizon/tables/views.py", line 155, in get! ?* |0 y! ?3 A5 r9 Q% [5 `
% j" B1 ]2 v( i7 Q2 \9 Z1 T! x t
handled = self.construct_tables()9 { s* T8 x8 ^1 n6 c" W* {) j
% A3 G/ x5 F" h' W0 b" ^' M! J8 Q- n& W
File "/usr/lib/python2.7/dist-packages/horizon/tables/views.py", line 146, in construct_tables
6 ]2 u* L: l' D! y . n* p' O# C3 R* \8 G1 U* s. J
handled = self.handle_table(table)' x' s9 e+ n% X
' Q6 o5 f( J" L L" q9 p2 |
File "/usr/lib/python2.7/dist-packages/horizon/tables/views.py", line 118, in handle_table& X! A0 m" b. g3 q+ t; L6 S7 k
9 s! `& ?( s& }7 k: X8 G data = self._get_data_dict()8 I i* q& P# Q5 U, |: I
& w' N; d: c( C3 [6 h+ y: Y7 W
File "/usr/lib/python2.7/dist-packages/horizon/tables/views.py", line 182, in _get_data_dict0 }5 ^+ n; m' ]
# |% s! \/ R# l- V. B self._data = {self.table_class._meta.name: self.get_data()}; R4 B4 N4 B3 h9 g8 P
0 _4 ]7 O8 \+ V/ }3 P File "/usr/share/openstack-dashboard/openstack_dashboard/wsgi/../../openstack_dashboard/dashboards/admin/overview/views.py", line 41, in get_data" C$ H: c M, a4 t
- a% r$ a( l5 m% u [1 n! Z data = super(GlobalOverview, self).get_data()+ \9 s( E+ R1 _8 v! \
9 L) p4 Z; T' @4 c) B# }$ {4 _+ r File "/usr/share/openstack-dashboard/openstack_dashboard/wsgi/../../openstack_dashboard/usage/views.py", line 34, in get_data. W0 ?7 W$ W7 c1 p
! i W" U" m7 s6 m& U self.usage.get_quotas()- B, h8 |' I7 I! \# T
7 `; s- R4 b# X% Q2 ]
File "/usr/share/openstack-dashboard/openstack_dashboard/wsgi/../../openstack_dashboard/usage/base.py", line 115, in get_quotas
/ Z" U% r5 k! e
' j$ C# B: z: G" }9 N _("Unable to retrieve quota information."))
0 u5 s- m. c' P2 R! o 8 Y9 m# [" O; Y
File "/usr/share/openstack-dashboard/openstack_dashboard/wsgi/../../openstack_dashboard/usage/base.py", line 112, in get_quotas6 b8 v. o. u& s' K
/ B# f. ?" O- Q
self.quotas = quotas.tenant_quota_usages(self.request) f. S# s* g- w W' l
$ J* }9 ~. `3 D |
File "/usr/lib/python2.7/dist-packages/horizon/utils/memoized.py", line 33, in __call__
3 [) `9 |. q: z6 e8 n/ `
: F5 I& z+ s: u* k; x value = self.func(*args)! S+ s( h! \! {2 V% D
4 O$ G% |+ n$ q# k; n
File "/usr/share/openstack-dashboard/openstack_dashboard/wsgi/../../openstack_dashboard/usage/quotas.py", line 115, in tenant_quota_usages% Y5 P E" k7 z
; Y# \8 N. g q- G+ y3 |
disabled_quotas=disabled_quotas):
" N `! R! P3 H! }% R
! v0 {( e0 x0 U1 m0 S File "/usr/share/openstack-dashboard/openstack_dashboard/wsgi/../../openstack_dashboard/usage/quotas.py", line 98, in get_tenant_quota_data# S; d6 A# H3 C. }5 j& T
0 U2 e7 U6 J0 n% O tenant_id=tenant_id)
2 I( D1 P$ P: N4 X, p0 k
. q- ]# [2 B7 \3 r" t+ p( E( ? File "/usr/share/openstack-dashboard/openstack_dashboard/wsgi/../../openstack_dashboard/usage/quotas.py", line 80, in _get_quota_data8 I& V o/ x& [! K2 [
2 k) b/ R) @- ]9 ]8 G+ w quotasets.append(getattr(cinder, method_name)(request, tenant_id))+ I! M7 n; B/ q6 G/ ?0 O
Q$ J( }' X( z File "/usr/share/openstack-dashboard/openstack_dashboard/wsgi/../../openstack_dashboard/api/cinder.py", line 123, in tenant_quota_get9 K9 ?. Q! q4 x& \
3 q7 Y6 X7 c! `, F5 d. M
c_client = cinderclient(request) m: v8 ?( ^( C3 j# ~6 R6 E
/ {# A& q6 {0 J) j File "/usr/share/openstack-dashboard/openstack_dashboard/wsgi/../../openstack_dashboard/api/cinder.py", line 59, in cinderclient. e# t( d2 J7 I: I3 z$ w7 T
, n t6 K: a1 M1 E http_log_debug=settings.DEBUG)* `3 d- j9 a# e8 c6 p
8 `, b7 r+ I7 R9 l4 P4 K
File "/usr/lib/python2.7/dist-packages/cinderclient/v1/client.py", line 69, in __init__
6 E3 R- W! i% o/ W N- A
& s0 U6 g4 \9 y2 K A cacert=cacert)
2 b& M1 r+ g" |" B* }* c
2 m# s+ S" n, z2 v0 D File "/usr/lib/python2.7/dist-packages/cinderclient/client.py", line 78, in __init__
- X3 ~# D* E" Z9 H0 H; N 9 [% h. L+ Q7 Y4 C+ g9 x% Z
if hasattr(requests, logging):( m: P1 d' k6 v
- G! E8 J1 I4 g, n
TypeError: hasattr(): attribute name must be string
( d+ N) r O+ ~: Z+ X; w9 h- f
/ I3 }1 z/ {: e+ T! |! O: F$ M; H: o* n+ \4 a- ?+ E9 E
错误信息中指出了 Cinderclient 的 client.py 中 78 行 hasattr() 方法的属性必须是一个字符串。8 g/ n8 ~+ `8 V1 |! Y0 T
修改代码:: R, ~, C" T) ~, A6 i
5 G4 p X; z9 q7 r# }, f 4 j% Q( S1 x/ u: `' n4 i" K- W
" W9 R" C' B: v7 J0 L# vim /usr/lib/python2.7/dist-packages/cinderclient/client.py& t4 ]- v/ Z5 a/ R2 S$ h" ^
# G" J S" D5 _' |: X9 i 78 if hasattr(requests, logging): # 改为 : if hasattr(requests, 'logging'):
3 I1 z3 u! q% z9 U' w" ^
3 L) e4 C- y6 ^" `. w# p) x/ S8 v' ~ 79 requests.logging.getLogger(requests.__name__).addHandler(ch)
+ e" d+ z$ o* k
" L8 ?% w( ]3 \; l9 _ E0 t) M. r& T `+ F
重新启动 apache2 :! v I9 p6 b O2 i' [7 Q$ x. n
/ e. J% X6 c4 s! }3 L- Y
/etc/init.d/apache2 restart. D( C& p6 V8 m: D! \$ \
4 f( w# A1 `. f N( y
这次访问 dashboard 没有报错,尝试创建 volume 也没有问题了。2 a q* Y. L V+ F, O4 N" X
$ B- x# o4 K. k11、Unable to attach cinder volume to VM
) {, }% X7 \* n
+ ^. i/ i: F4 |3 U9 V3 J! O 在测试openstack中的volume服务时把lvm挂载到虚拟机实例时失败,这其实不是cinder的错误,是iscsi挂载的问题。
7 [$ U. t# d6 M6 c# x' K ~, g2 v" G# d
以下是计算节点nova-compute.log 的错误日志:; q1 m8 _ H4 k# C( z, s
4 { x6 X% g, P- b& q* u" w
2012-07-24 14:33:08 TRACE nova.rpc.amqp ProcessExecutionError: Unexpected error while running command.
: B$ J4 `0 \$ u# h6 U2012-07-24 14:33:08 TRACE nova.rpc.amqp Command: sudo nova-rootwrap iscsiadm -m node -T iqn.2010-10.org.openstack:volume-00000011 -p 192.168.0.23:3260 –rescan' w8 H" Z" ~7 v* H" T3 G
2012-07-24 14:33:08 TRACE nova.rpc.amqp Exit code: 255; |( S0 ?5 G) q5 |; \0 j) ?; H
2012-07-24 14:33:08 TRACE nova.rpc.amqp Stdout: ”
& P% w# }3 _& r `+ Z% k2012-07-24 14:33:08 TRACE nova.rpc.amqp Stderr: ‘iscsiadm: No portal found.\n’1 v, U/ g+ b* K( P+ I3 w5 T# j( J
* ~6 U6 \1 t# `5 N* P9 ]$ @, q
o Q( U6 H6 ^- Q- j
. t4 f- D8 F$ @# C
以上错误是没有找到iscsi服务端共享出的存储,查找了很多openstack 资料说要添加以下两个参数: s( K4 E* q! x
/ o5 ^3 n: X' P3 w1 c, }% C. kiscsi_ip_prefix=192.168.80 #openstack环境内网段- h0 `+ Q) N7 h. }7 B4 P- Q: S3 B9 ^
! T0 ?# c, z8 n6 y
iscsi_ip_address=192.168.80.22 # volume机器内网IP
5 }7 u6 u6 N; d0 t& w, F% v; Q c) B4 O& E" F3 T1 P
可是问题依然无法解决,后来发现只要在nova.conf配置文件中添加参数iscsi_helper=tgtadm 就挂载失败。
6 \; l( z3 j9 n; C; K N' C% m ?( d0 o& U# z4 D9 K+ K+ W& n' X
根据这个情况进行了测试查看日志才发现:如果使用参数 :iscsi_helper=tgtadm 时就必须使用 tgt 服务,反之使用iscsitarget服务再添加参数iscsi_helper=ietadm。
3 k- c& I- @; y# L# f5 c. z2 c' P$ I5 K H: w
我测试环境的问题是tgt和iscsitarget服务都已安装并运行着(在安装nova-common时会把tgt服务也安装上,这个不小心还真不会发现),在nova.conf配置中添加参数iscsi_helper=tgtadm ,查看端口3260 发现是iscsitarget服务占用,所以导致挂载失败,我们可以根据情况来使用哪个共享存储服务!!将tgt 和iscsi_helper=tgtadm、iscsitarget和iscsi_helper=ietadm保留一个即可。+ `3 {4 G9 u% V9 \: z
/ o D) X; M7 ~7 G7 l S( }/ B12、glance index报错:
; R5 Y4 E1 D6 ]# _9 p4 U% a
( s! y5 M9 d4 F+ p5 XAuthorization Failed: Unable to communicate with identity service: {"error": {"message": "An unexpected error prevented the server from fulfilling your request. Command 'openssl' returned non-zero exit status 3", "code": 500, "title": "Internal Server Error"}}. (HTTP 500)
, x( M! w# d) H% D+ b
& s7 S% ]& d, z# O% j/ c: @& |2 {7 X8 }! n
在 Grizzly 版,我测试 glance index 时候报错:
0 c" o/ C6 S" A- }! U+ D
/ F5 }" r7 A+ P9 r( VAuthorization Failed: Unable to communicate with identity service: {"error": {"message": "An unexpected error prevented the server from fulfilling your request. Command 'openssl' returned non-zero exit status 3", "code": 500, "title": "Internal Server Error"}}. (HTTP 500): x3 c* i6 y* ?: B1 w( z
错误信息指出:glance 没有通过keystone验证,查看了 keystone 日志,报错如下:% u8 z- X" x$ I! g
9 c) k; n# t* _7 m: W" I" u5 ] n2677 2013-03-04 12:40:58 ERROR [keystone.common.cms] Signing error: Error opening signer certificate /etc/keystone/ssl/certs/signing_cert.pem
9 i( C8 I) `- f% V$ p& F) i2678 139803495638688:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen('/etc/keystone/ssl/certs/signing_cert.pem','r')/ W$ h4 n' |) n( C# _- D1 }6 B
2679 139803495638688:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:
! p2 M6 G: n! w. `3 n: c3 n2680 unable to load certificate! S8 E! Q' K4 n* I3 k
2682 2013-03-04 12:40:58 ERROR [root] Command 'openssl' returned non-zero exit status 3
8 `9 X1 k+ R6 G/ ?0 k* U2683 Traceback (most recent call last):
- N8 M! K k" d0 J; ~- J( H2684 File "/usr/lib/python2.7/dist-packages/keystone/common/wsgi.py", line 231, in __call__
" e% T* g# m, I7 Y9 T2685 result = method(context, **params)
( O7 v6 K8 Y- m7 v7 P2686 File "/usr/lib/python2.7/dist-packages/keystone/token/controllers.py", line 118, in authenticate
0 w# J* x4 t5 u# f. d% j: B& Q* x% h3 L* o2687 CONF.signing.keyfile)
) Q. X/ o5 \9 K3 D$ W# b+ G( @; l2688 File "/usr/lib/python2.7/dist-packages/keystone/common/cms.py", line 140, in cms_sign_token0 \4 Y. j9 o4 O% U) i, |$ ^
2689 output = cms_sign_text(text, signing_cert_file_name, signing_key_file_name)8 L2 T C- c2 j4 }% A
2690 File "/usr/lib/python2.7/dist-packages/keystone/common/cms.py", line 135, in cms_sign_text
( E# m, V( m: c1 A) \2691 raise subprocess.CalledProcessError(retcode, "openssl")
6 K0 C( r" c& V p2692 CalledProcessError: Command 'openssl' returned non-zero exit status 34 w1 A. l# V9 U& ~, o- u
在Grizzly 版中,keystone 默认验证方式是 PKI , 需要签名证书,之前的版本都是用的 UUID,改 keystone.conf:1 E/ d. f( K2 U- C( s0 A1 h& g
8 r) e; O0 A8 I# _6 ~" Dtoken_format = UUID
% Y* U1 C1 e2 t2 s- W7 [在试一次就没有错误了。/ z9 r |) `; e' Q- f, e
g9 I& R( Q3 c6 Z- g
13、镜像制作
$ ?* G' c) j1 J& p
) `5 E. U6 w/ M' }$ ]! G8 v这里主要强调下windows的镜像制作,因为windows的涉及到加载驱动的问题,就比较麻烦。4 w8 o# e* r0 N+ s0 k
7 v, g0 G% b- M" A1 v! k
下载virtio驱动,因为win默认不支持virtio驱动,而通过openstack管理虚拟机是需要virtio驱动的。需要两个virtio驱动,一个是硬盘的,一个是网卡的,即:virtio-win-0.1-30.iso和virtio-win-1.1.16.vfd。这里主要强调两个地方:
9 ?1 f" C) _# X0 {+ D0 |7 t& m. l/ s
1、创建镜像: ( e& a# {; T6 e& z
. ^5 X! _ l0 @" @$ _
kvm -m 512 -boot d –drive; s4 E3 g" U- \
( V+ N; f* y/ o% yfile=win2003server.img,cache=writeback,if=virtio,boot=on -fda virtio-win-1.1.16.vfd -cdrom windows2003_x64.iso -vnc:10 " Y5 V- u7 K9 E7 Q: C, z* N( C
5 }% Q3 t: Q# a) n- {4 @9 z8 e/ j J
2、引导系统 :4 m3 F4 u$ v: ]. h% Y
" N7 e8 w9 V A' K9 }4 ~
kvm -m 1024 –drive file=win2003server.img,if=virtio,
/ M; R/ v+ s/ ~) k( ]1 z9 l. W 7 u% ?' N' t8 V
boot=on -cdrom virtio-win-0.1-30.iso -net nic,model=virtio -net user -boot c -nographic -vnc 80 x0 d& {% p# }! W4 F
5 J$ S% B8 A# @3 @2 }$ ]& A' L* V$ i7 }8 A, h
这里需要注意的地方是if=virtio,boot=on –fda virtio-win-1.1.16.vfd和引导系统时使用的virtio-win-0.1-30.iso 这两个驱动分别是硬盘和网卡驱动。如果不加载这两个驱动安装时会发现找不到硬盘,并且用制作好的镜像生成实例也会发现网卡找不到驱动,所以在这里安装镜像生成后需要重新引导镜像安装更新网卡驱动为virtio。' j' y; {: a3 ?1 Y4 }
2 D7 r6 o- m! i4 U9 f14、删除僵尸volume( c- p9 R. W7 i, R
* [" n" H; }! o) S* L6 o9 l9 v
如果cinder服务不正常,我们在创建volume时会产生一些僵尸volume,如果在horizon中无法删除的话,我们需要到服务器上去手动删除,5 h9 p% [5 P' ]: w1 w& N
5 x6 }! Y! }" e, b1 x
命令:lvremove /dev/nova-volumes/volume-000002* A# y+ c# @; A' J8 x
; e1 G% B; t) J9 I
注意这里一定要写完整的路径,不然无法删除,如果删除提示:# A4 b. @; z/ ?) B4 @4 k
/ K+ g9 Q. `* T1 Z9 ~0 d0 d“Can't remove open logical volume“ 可尝试将相关服务stop掉,再尝试删除。删除完还需到数据库cinder的volumes表里清除相关记录。 |
|