- 积分
- 16840
在线时间 小时
最后登录1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
以下主要为安装部署过程中遇到的一些问题,因为openstack版本问题,带来的组件差异导致不同的版本安装的方法也完全不一样。经过测试,目前已可成功部署Essex和Grizzly两个版本,其中间还有个版本是Folsom,这个版本没有部署成功,也没有花太多时间去研究,因为Folsom版本中使用的quantum组件还不成熟,对于网络连通性还有很多问题,网上也很少有成功的案例,大多数人使用的还是folsom+nova-network模式。) P2 y$ G; d* B( q. H6 c
1 I2 C% s& F* w8 |
到了Grizzly版本,quantum组件才比较稳定,可以正常使用,自己也花了很多时间研究,现在已可以成功部署多节点环境。以下是部署过程中遇到的一些问题,包括Essex和Grizzly两个版本。国内网上关于这方面的资料很少,很多资料也都是国外网站上看到的。而且很多情况下日志错误信息相同,但导致错误的原因却不尽相同,这时候就需要仔细分析其中的原理,才能准确定位。遇到错误并不可怕,我们可以通过对错误的排查加深对系统的理解,这样也是好事。7 F6 F4 f, z( F9 G6 V0 z1 k- {
! |# G2 { Y- }) }0 l5 k& z" D
关于安装部署,网上有一些自动化的部署工具,如devstack和onestack,一键式部署。如果你是初学者,并不建议你使用这些工具,很明显,这样你学不到任何东西,不会有任何收获。如果没有问题可以暂时恭喜你一下,一旦中间环节出现错误信息,你可能一头雾水,根本不知道是哪里错了,加之后期的维护也是相当困难的。你可能需要花更多的时间去排查故障。因为你根本不了解中间经过了哪些环节,需要做哪些配置!这些工具大多数是为了快速部署开发环境所用,正真生产环境还需要我们一步一步来操作。这样有问题也可快速定位排查错误。5 }6 V/ V8 _! s4 N7 Y
- w D. a5 j$ l3 r# _ k" j本文仅是针对部署过程中的一些错误信息进行总结梳理,并给予解决办法,这些情况是在我的环境里遇到的,并成功解决的,可能会因为环境的不同而有所差异,仅供参考。
2 S, r4 F. b% k* k2 R, _1 V( h
% S1 Z/ X- Q" b& R7 U* r+ j( s1、检查服务是否正常:$ n9 E% B' T0 V( x0 t% g, W3 |* @& K
! z- B0 d6 S/ n7 V. G( J& A6 @
root@control:~# nova-manage service list6 k* j4 |. C' H% p3 S
0 B; A, C9 E5 x8 B, I7 [' @
Binary Host Zone Status State Updated_At
2 r! K* Z2 B, O8 ]& F- y8 a * Q _) Y5 X2 _7 F) U3 h+ e% \
nova-cert control internal enabled :-) 2013-04-26 02:29:44# ^6 h ]5 w" |
1 p a; ?, L6 v1 c8 b
nova-conductor control internal enabled :-) 2013-04-26 02:29:42 i: h+ Q" R# c1 w, g/ k' R
" x3 y$ c( ~, {# z* M
nova-consoleauth control internal enabled :-) 2013-04-26 02:29:44
! h( C, m' b0 g5 I' ^ 9 U" \ E) c O3 I! t0 ^( Z
nova-scheduler control internal enabled :-) 2013-04-26 02:29:47# v% I' ~. E. P" z
# a3 M8 I- M( x* Knova-compute node-01 nova enabled :-) 2013-04-26 02:29:46* w' y! `: C" G3 {6 c+ w& M
- G7 y: m1 `' m$ Z. d8 g: O, m
nova-compute node-02 nova enabled :-) 2013-04-26 02:29:462 ^ V7 f: {9 d, A0 \2 `. K
+ I$ l+ q5 f, `& onova-compute node-03 nova enabled :-) 2013-04-26 02:29:42
; x5 S" @ ^: ?/ x4 l
+ Z9 a$ \' L2 G |/ m+ M* E8 e3 I, M1 ^
如果看到都是笑脸状态,说明nova的服务属于正常状态,如果出现XXX,请查看该服务的相关日志信息,在/var/log/nova/下查看,通过日志一般可以分析出错误的原因。* ]& }* [- j- r4 a$ z% v0 d
* ?3 l- V- _* z9 ~+ l
2、libvirt错误, [$ L1 j- U3 x0 }8 l4 ~& d
% Z4 z( a& N V ( i0 l' ?' n) `3 k! O8 j9 M% R
$ M& z; B4 _4 c, K5 ]+ n& spython2.7/dist-packages/nova/virt/libvirt/connection.py”, line 338, in _connect
! g t5 F$ ?, O$ p! a( R2013-03-0917:05:42 TRACE nova return libvirt.openAuth(uri, auth, 0)+ L4 _' W3 x6 a5 S, t4 C2 m
2013-03-09 17:05:42 TRACE nova File “/usr/lib/python2.7/dist-packages/libvirt.py”, line 102, in openAuth
" T# x* `. C" r' p2013-03-09 17:05:42 TRACE nova if ret is None:raise libvirtError(‘virConnectOpenAuth() failed’)3 k4 F6 O3 L+ r
2013-03-09 17:05:42 TRACE nova libvirtError: Failed to connect socket to ‘/var/run/libvirt/libvirt-sock’: No such file or directory
8 `$ y9 c5 ]; h# t6 H2013-03-09 22:05:41.909+0000: 12466: info : libvirt version: 0.9.87 ^& @) a ^6 M
2013-03-09 22:05:41.909+0000: 12466: error : virNetServerMDNSStart:460 : internal error Failed to create mDNS client: Daemon not running
5 y7 B+ S! L( M) O: C6 E0 m8 c$ c
5 S6 r& E P4 g7 f
0 I: g8 }7 }$ h9 K% Z) X% a( P解决方案:
: s5 }' d; a& k
j: @, K" H" ?+ Q& ~9 x0 P' _. P出现这种错误首先要查看/var/log/libvirt/libvirtd.log日志信息,日志里会显示:libvirt-bin service will not start without dbus installed.
~; ]* x+ Y. ~- u: D' v( w- [# ?7 [9 `0 r$ u3 c7 ~" c
我们再查看ps –ea|grep dbus,确认dbus is running,然后执行apt-get install lxc+ W$ o. x( q$ h E: a* a; A% r
2 k5 P2 _5 ?9 Z Q$ @
3、Failed to add image
- T$ t/ R# S% F$ B6 ^6 \* Y) g" g
1 d5 p) I9 W8 tError:
$ C) w3 Y. ~. zFailed to add image. Got error:
The request returned 500 Internal Server Error
% u* u( Y8 j8 E: t, z \' L% x! b. b( ?+ S% W
8 E2 T% O7 z& P% k3 S4 y& T# k解决方案:
. V8 _+ O) Q3 Q& w9 C( j6 {8 Z
: ` Z6 |. i/ M. A0 O: O+ p8 J6 ]! Q2 s环境变量问题,配置环境变量,在/etc/profile文件中新增:
# x U2 z# e* ~) H U/ W
' d/ S& H7 z0 h' R/ m' y/ ^OS_AUTH_KEY=”openstack”
5 f& l3 {& j7 T5 P! ROS_AUTH_URL=”http://localhost:5000/v2.0/”/ v3 H5 f( Z6 |4 Z, G E7 N6 ~
OS_PASSWORD=”openstack”
; b9 S" ?: L1 e" p- ~9 M. JOS_TENANT_NAME=”admin”
3 E& P& t F% b, @! FOS_USERNAME=”admin”
+ g6 D. E" k/ M/ w1 P" u
" X' e. P, c) X7 I, n$ d9 j. y8 t3 g0 {# U3 V
然后执行source /etc/profile即可!当然你也可以不在profile里配置环境变量,但是只能临时生效,重启服务器就很麻烦,所以建议你还是写在profile里,这样会省很多麻烦。
, y9 }! D* V3 X3 l0 g/ `
' m8 w% A/ G1 z4 U4、僵尸实例的产生
. N6 i* s/ f& h8 h
( [. Y+ U! i4 R F6 c" J( g僵尸实例一般是非法的关闭nova或者底层虚拟机,又或者在实例错误时删除不了的错误,注意用virsh list检查底层虚拟机是否还在运行,有的话停掉,然后直接进入数据库删除。
3 n/ ^0 F, L( m+ U
* p, L5 @; \- f2 uNova instance not found
4 a2 A: A3 y) K$ e3 g) U! D 9 |( T7 P9 F* t4 c) x
Local file storage of the image files.
8 k5 W! l& p. g6 u( ?7 j1 l4 o
+ W# r5 i6 `- q UError:
2 I1 [5 {- K! ^2 f2013-03-09 17:58:08 TRACE nova raise exception.InstanceNotFound(instance_id=instance_name)# q6 b" k* R! n; V, J: y: c! h
2013-03-09 17:58:08 TRACE nova InstanceNotFound: Instance instance-00000002 could not be found.3 V, o) v, @* U
2013-03-09 17:58:08 TRACE nova0 ^$ {1 \ }, _! m0 Y
; L, g1 [6 L# b, S
4 K* n' r3 M7 a . b( ?( F5 L1 z0 Y. U
; F; p8 Y- L _' N' | i
解决方案:
: M5 y" _) {5 I' P" |5 ^+ X( Z: S9 H+ `
删除数据库中的僵尸实例或将数据库删除重新创建:; @/ [+ W0 Y& t* R7 Q
/ x, J. H$ j# E: G9 e
a、删除数据库:
% p( [5 B2 x c' `6 M4 m; }
& _$ l8 _5 N3 ?0 ^; e9 c; ^$mysql –u root –p
8 a1 m! ?: J5 ` T# M" b( jDROP DATABASE nova;
A. b5 M, h& ?. [- u ! B: V3 Q0 A. I i. ]
Recreate the DB:6 w9 Q) u* j3 B; x8 a; {
CREATE DATABASE nova; (strip formatting if you copy and paste any of this)
0 E. x% ]3 W6 [- o( IGRANT ALL PRIVILEGES ON nova.* TO ‘novadbadmin’@'%’ IDENTIFIED BY ‘<password>’;
' j. Q0 ^8 f* v! I3 `2 d* ZQuit
$ C& J# b; m( P! T9 x
/ D: l& p/ d: w7 I8 l5 d) [9 s2 M. HResync DB* c( b1 X+ O& z8 _: h1 _
2 Y" m# M: V1 p! o; L8 M8 w
[. m6 K8 O( o, \- P, ^
b、删除数据库中的实例:/ N9 ^& a6 D' |2 I$ v1 d
& l& s" ` z& R+ q* v, t; R! J; B#!/bin/bash! D9 u0 w& Q( N: Y9 ]" _
( Q2 q( S; k# R- G3 ~5 j' V7 Rmysql -uroot -pmysql << _ESXU_/ Q9 U/ ] K6 w/ {! X- A
& o, ?* {8 P s, a: nuse nova;" j. s$ G$ s' k, [
9 h0 l; \1 I+ z' N- kDELETE a FROM nova.security_group_instance_association 2 x/ ~0 u, R; G; X1 d
9 o( _0 C! T$ m& U1 k2 a: IAS a INNER JOIN nova.instances AS b
0 Z& ~: ?0 Q# n% w" a: s- R
0 e0 P+ q/ R2 P' h( k) wON a.instance_uuid=b.id where b.uuid='$1';$ |/ p2 `: p7 \
; i9 @* u* }2 \$ M" R$ `DELETE FROM nova.instance_info_caches WHERE instance_uuid='$1';
% `0 |& x2 o) C
; C ^# G5 n( ~# F7 WDELETE FROM nova.instances WHERE uuid='$1';/ \) m ?+ W. l) c! r8 E4 \$ H, i( Y
* L$ l F0 z! c& g
_ESXU_( y6 w0 |% b R _" L. |* S/ Q9 H3 [
7 s/ l* z. E* O. ]* A1 g- J9 Q2 |' U* X+ |+ s# G4 B/ \8 ^) W
将以上文件写入delete_insrance.sh中,然后执行sh delete_instrance.sh insrance_id;; X$ f8 q, M/ T; ]
3 z$ \$ f: _* d7 ~( L$ g其中instrance_id可以通过nova list 查看。
% \: a w4 [+ U6 ^, Y7 U' w, m+ n. r$ U+ s. }
5、Keystone NoHandlers$ Q6 D8 U7 |8 n- p" j
9 a) X* Q, r0 F3 R6 n, n' RError
* V) o- c" U* {, b% h1 croot@openstack-dev-r910:/home/brent/openstack# ./keystone_data.sh
3 J$ i. ?; W& R" DNo handlers could be found for logger “keystoneclient.client”4 l8 u5 e' M3 ? b7 s: ]9 p" H
Unable to authorize user
" ^- J2 V" f( h. ~' _No handlers could be found for logger “keystoneclient.client”
" X7 p& ] J" S' C" yUnable to authorize user
; ^* X+ `) r" n" J* u/ NNo handlers could be found for logger “keystoneclient.client”
+ }* Z3 c" I8 lUnable to authorize user
- j7 z/ b- C' A# [2 W; I ; ?% g/ t, {/ j& o6 |7 ~
1 w. t$ Z7 }+ z b( J" s
解决方案:
: n" Z" X% f+ {6 T1 w) T
4 h9 M- R1 A% n+ U% k& c7 K出现这种错误是大多数是由于keystone_data.sh有误,其中* a$ A; h! {+ r
4 O8 A9 o# P0 s* a( O( o1 f4 g
admin_token必须与/etc/keystone/keystone.conf中相同。然后确认keystone.conf中有如下配置:
3 F) ~# ~( A- p9 ^( J4 k- P; X! E7 Y9 E" S& C+ ]" B
driver = keystone.catalog.backends.templated.TemplatedCatalog template_file = /etc/keystone/default_catalog.templates1 v( X G' W0 [/ O
. B4 v$ k2 O) E5 Z5 m) p6、清空系统组件,重新安装:
7 n* m: W& t p) s6 r+ p/ u z7 ]) R6 y! ?7 J
#!/bin/bash
6 t Z4 D$ e& j# vmysql -uroot -popenstack -e “drop database nova;”
5 _; S/ J" K. H, ~1 Xmysql -uroot -popenstack -e “drop database glance;”: f7 ]9 m7 X/ A% ^
mysql -uroot -popenstack -e “drop database keystone;”
+ D5 ?0 e: M! j& Eapt-get purge nova-api nova-cert nova-common nova-compute$ z- H' v1 H/ G0 T1 z' E
nova-compute-kvm nova-doc nova-network nova-objectstore
* `2 t% j2 H3 W! I2 Wnova-scheduler nova-vncproxy nova-volume python-nova python-novaclient
& y0 G% F! C& j6 _' n4 Eapt-get autoremove
( M5 l: i1 D |2 X/ O7 p4 ^* ?rm -rf /var/lib/glance
7 N1 e$ C$ [; Qrm -rf /var/lib/keystone/
+ ~. V& w9 e8 |. q! e+ [+ k. z6 a9 brm -rf /var/lib/nova/
: S7 W4 C: N1 `6 q# S6 i+ ~rm -rf /var/lib/mysql
: k* ?2 M# L$ x6 ^ : }( G8 K" I3 e1 V) Z) h c9 f. ^
0 p# r2 M/ p4 Q, J/ x9 k8 `可通过执行上面的脚本,卸载已安装的组件并清空数据库。这样可以省去重装系统的麻烦!
' `# c, T1 T3 A! c4 a) \+ ^( Z
, H$ _. e* `) M" E8 H7、Access denied for user ‘keystone@localhost(using password:YES’)
) a+ Y9 ?4 B: O& R. Z! j
3 k+ r1 |! f% M( a3 W! g* T# keystone-manage db_sync
$ @! z J- x! o' M# L5 |8 I2 r- w ) |/ B# p+ S& P3 }
File “/usr/lib/python2.7/dist-packages/MySQLdb/connections.py”, line 187, in __init__! X9 |, G2 a2 @7 K3 T
2 m% Y; v5 A' A" nsuper(Connection, self).__init__(*args, **kwargs2)3 Y: J3 Q4 ?+ a- r6 `( J
sqlalchemy.exc.OperationalError: (OperationalError) (1045, “Access denied for user ‘keystone’@'openstack1′ (using password: YES)”) None None. J' x% p( g! P* g2 C0 \" Q6 V' B2 S
. `; K0 O4 q" j8 X
3 c. a. @$ |, `) H [$ ?+ P5 l( S
解决方案:
# i- r$ ^; T+ `. A& a! Y
+ k& ~$ B$ {* ?+ C查看keystone.conf配置文件链接数据库是否有误,正确如下:) t5 R4 _( p; x% y0 Z" G' R
2 B7 Z1 R' l1 R" E$ V
[sql]% o( K A: G! B7 E
1 A# |4 P: f# r3 P- F* M" G
connection = mysql://keystone:openstack@localhost:3306/keystone
3 `# T7 z% }1 i3 Y$ n x " M/ a5 N3 \. Z* |
% T- w' b8 L" ^9 W: K; f
8、nova-compute挂掉与时间同步的关系
3 h& i3 N" \8 `0 J
4 v- k( Q6 Y; [很多时候发现nova-compute挂掉,或者不正常了,通过nova-manage查看状态是XXX了。
1 K7 k, t! }: M* W# {* I# U
% o% J! H+ M( Z' e2 z* |往往是nova-compute的主机时间和controller的主机时间不一致。 nova-compute是定时地往数据库中services这个表update时间的,这个时间是nova-compute的主机时间。
6 G" C6 _" S$ A# P- W& d5 j9 ]8 L+ t4 | d6 n3 m
controller校验nova-compute的存活性是以controller的时间减去nova-compute的update时间,如果大于多少秒(具体数值代码里面有,好像是15秒)就判断nova-compute异常。
" q1 l# g# X `3 g
# e( `/ H3 A( e7 v& j( ^0 N这个时候你用nova-manage查看nova-compute状态是XXX,如果创建虚拟机,查看nova-scheduler.log 就是提示找不到有效的host 其他服务节点类同,这是nova心跳机制问题。所以讲nova环境中各节点时间同步很重要。一定要确保时间同步!!
2 n9 C/ Z, n! O* |% D! F9 P' z# E7 ^ g* \8 s O
如果在dashboard上看nova-compute状态,可能一会儿变红,一会儿变绿。那就严格同步时间,或者找到代码,把上面的那个15秒改大一点。
) T& o$ k8 R A) _* T6 ?+ ]4 B+ i) e
9、noVNC不能连接到实例
2 s7 {3 L* j) i& Z8 B
' E6 r- N# S: wnovnc的问题比较多,网上也有关于这方面的很多配置介绍,其实配置不复杂,只有四个参数,配置正确基本上没什么大问题,但是装的过程中还是遇到了不少的问题。% n9 I* U0 s O7 n& r
# x7 B+ Q! P8 w4 Y) r
a、提示“Connection Refuesd”
. s, u# Y u( ?5 a9 n- [
( v. V: }! ^- c l6 r" N可能是控制节点在收到vnc请求的时候,无法解析计算节点的主机名,从而无法和计算节点上的实例建立连接。: P1 l* @$ A& e) y
) r7 k6 o8 E8 q3 y( E
另外可能是,当前浏览器不支持或者不能访问,将计算节点的ip和主机名的对应关系加入到控制节点的/etc/hosts文件中。- b. C' M; L$ e- N- g9 m6 Q
6 X U( Y2 {! c! u1 gb、提示“failed connect to server”3 N4 L" \- G2 G b
, n1 R1 t4 ~5 z' g出现这种错误的情况比较多,有可能是配置文件的错误,我们的环境中遇到这个错误是因为网络源有更新,导致安装版本不一致,使组件无法正常使用,解决方法就是使用本地源。另外需要特别说明的是使用novnc的功能需要浏览器支持Web Socket和HTML5.推荐使用谷歌。
" K. ]2 ~! b& l# }$ |" \. M9 M. `1 N- Y3 J9 O' p2 e- H
10、cinder错误,无法登录dashboard.
3 A+ S1 K5 [. Q2 P% R' o: e/ s" v' S6 v
出现如下错误:; M& p( a* S: N$ q q& f
6 b, a, _5 O! L+ a: Z( @
1 y. c& X; q% k( m5 |TypeError at /admin/ 8 T( z- ^1 t& ~
hasattr(): attribute name must be string
4 ]9 Z* ~& ^' ~
5 j- o/ H- y3 R) b1 cRequest Method: GET
) M; u6 P3 X; r) ]6 d" S t
1 b: g2 l0 r6 s! f, GRequest URL: http://192.168.80.21/horizon/admin/- I H9 y9 X$ A1 V* T$ P& B, G
3 E+ l4 t4 T) e# t' W6 ^- A
Django Version: 1.4.58 I" H/ r8 F- x
1 v( @$ ?' L4 h& n7 W: ~
Exception Type: TypeError( @: W( Z) X5 y; Q, M b- C& q
8 M9 ~+ k; [7 a! `& i5 @8 Z7 t8 ~Exception Value: , e) a% X8 u( p1 j6 Q
8 j, K: t& N% O G3 s- ]: I1 E% `
hasattr(): attribute name must be string
& x. @4 D" w$ X9 ~! W8 z9 a. k' x# m 2 D4 h* I+ C+ H* N' ~5 L. k
Exception Location: /usr/lib/python2.7/dist-packages/cinderclient/client.py in __init__, line 78
3 Q: t- {# T' }. H( e
7 C* V9 z+ c" P! L0 f5 U/ `Python Executable: /usr/bin/python
% d7 V3 I% [! m0 B5 c4 F4 P5 M
7 @% ^1 t5 \# i3 m6 v5 SPython Version: 2.7.3
* W6 m9 l8 y* Y" `- R3 [5 _
0 E6 [7 Q+ f, C& bPython Path:
: c% B+ E- r7 k3 g8 i3 `0 c" U
" R0 ?+ P; h; Z8 R4 [; L['/usr/share/openstack-dashboard/openstack_dashboard/wsgi/../..',$ e5 L- X1 y: }+ V) }
2 u2 [- }6 x+ r% X- Z7 `
'/usr/lib/python2.7',9 {" K- Z* p3 \* u# w8 h
2 S7 }4 s$ B2 h8 r
'/usr/lib/python2.7/plat-linux2',
2 j1 H+ U% _5 c4 I& a
3 a: X& E8 w% C4 N) f2 X '/usr/lib/python2.7/lib-tk',
* g9 J2 G; c- z1 c
9 W$ p5 o* u L' O '/usr/lib/python2.7/lib-old',1 G; u& l5 ^4 e2 ]
4 @. Q/ h+ K% v: B" N8 z '/usr/lib/python2.7/lib-dynload',
% x# [' s Y4 n" C5 O# ?7 V8 E ! p' e: q2 N& |7 P9 N I/ t
'/usr/local/lib/python2.7/dist-packages',
+ X" W6 k* @+ m# j3 w9 j/ { ' L' L2 z' Q8 O5 l
'/usr/lib/python2.7/dist-packages',; R9 t! b( G: t( d. L* P. p
9 f' u/ e; R& `$ [ '/usr/share/openstack-dashboard/',
9 k% P/ v; H+ X+ Q$ Q' `7 a
1 l9 l1 K: O3 X4 t9 ? '/usr/share/openstack-dashboard/openstack_dashboard']
3 w4 J( t. [ @1 f
/ b5 p8 I% q( q; k7 @ ' B5 q- b( o ?' l5 [
) I$ b1 B+ d8 Z
Server time: Fri, 29 Mar 2013 12:51:09 +0000
/ c% s: |% D" c. T9 W5 p5 Z+ c Q9 y n6 w, E4 R% |
2 T2 p; M6 f5 Q解决方案4 i( |* l N% s$ G" x7 g j/ I
$ |, I! {# n2 s5 t* K. }2 I查看 apache2 的 error 日志,报如下错误:* f- g, _" S2 ^& }3 n
1 }7 n( Z5 F% p3 _
}/ Y. B: i, K8 L+ TERROR:django.request:Internal Server Error: /horizon/admin/
9 m! L" z; }8 P( V) c
6 Y7 }& B! D/ D, dTraceback (most recent call last):
9 ^# g, H% `( o% n$ P7 t: d9 R1 a
e' V7 A- e5 X3 A File "/usr/lib/python2.7/dist-packages/django/core/handlers/base.py", line 111, in get_response- k6 c4 h) W& A- @9 G8 Q9 j
" M& | P$ M) r, F2 b response = callback(request, *callback_args, **callback_kwargs): g8 Q* H0 s! [+ o1 ~8 `4 v
4 z9 z& e8 T. E# \4 z
File "/usr/lib/python2.7/dist-packages/horizon/decorators.py", line 38, in dec
& {, D4 E! u- H* u( {9 R , G8 ^/ f' K3 I( g, H2 E. o
return view_func(request, *args, **kwargs)& Q) Z' a0 N" h0 S* c9 v2 e
% D# O: t! t, v3 P' [6 w/ e! w4 f File "/usr/lib/python2.7/dist-packages/horizon/decorators.py", line 86, in dec9 h9 Q: A$ ^: R! ]4 O
8 q+ t$ o$ U6 O, w# C$ d2 F) r* n return view_func(request, *args, **kwargs)
3 F7 l0 |8 V0 C; ~! P; A# h 5 L) r! z8 T1 `) Q, y# |( z7 @5 Z
File "/usr/lib/python2.7/dist-packages/horizon/decorators.py", line 54, in dec0 R% B6 E) c4 l7 x4 W
$ g8 Y" i% l& d, P' U# H! x
return view_func(request, *args, **kwargs)
& U5 z: L" n! Y4 S- Y 0 d1 i; g) I& c& R9 [
File "/usr/lib/python2.7/dist-packages/horizon/decorators.py", line 38, in dec
7 h9 j. x" l& e
/ f' w1 I$ A* U7 ~7 P! U) L, s8 G return view_func(request, *args, **kwargs)
, z5 C+ S' P- T( X
6 ]! S, b4 V- W4 T0 Q File "/usr/lib/python2.7/dist-packages/horizon/decorators.py", line 86, in dec
! {6 L H6 h/ J( b1 i0 q
, q3 G- }& M ~7 M return view_func(request, *args, **kwargs)
0 H" I V) S8 d$ J4 v $ R" V3 l, J) ?, a3 f5 M8 V {/ i
File "/usr/lib/python2.7/dist-packages/django/views/generic/base.py", line 48, in view0 D9 O; E! B0 |( U+ A. w, j% |
% _* p( d1 N' d9 P, v return self.dispatch(request, *args, **kwargs)0 Y1 P H) u Y; q6 M+ \/ X4 H
9 H, X' V/ |4 M! k File "/usr/lib/python2.7/dist-packages/django/views/generic/base.py", line 69, in dispatch! Z% `' A' W% M1 d# N' r1 K
9 h6 e( P. Y! F. @8 L; m return handler(request, *args, **kwargs)4 Z) s- N7 F- O% f9 f* U. T4 d
6 U8 ^' ^9 V, Q+ H* S& b File "/usr/lib/python2.7/dist-packages/horizon/tables/views.py", line 155, in get
9 X# _; k; ]" E4 N2 p& j 7 v4 S4 D; M/ H" v2 P: L6 F
handled = self.construct_tables()
8 s* c+ { f( P$ u& a7 v) q2 {1 l
. G) ?/ i- L) N3 ] V File "/usr/lib/python2.7/dist-packages/horizon/tables/views.py", line 146, in construct_tables
4 s$ O) C7 }: ] u+ x ) G( O9 L$ W; w) }% q+ i$ e* {
handled = self.handle_table(table); M, l3 @2 V: y( @5 I
# n' L3 G0 V5 a5 d* x6 T
File "/usr/lib/python2.7/dist-packages/horizon/tables/views.py", line 118, in handle_table' X! v- _! j+ P; B
1 ]* Z4 H- V R data = self._get_data_dict()- N3 m7 u# W- }- i0 E/ o
; `+ U4 p ?6 X L3 g! e) E
File "/usr/lib/python2.7/dist-packages/horizon/tables/views.py", line 182, in _get_data_dict
# U) m" D) s. |4 d! T6 C" W' b
- d# S2 Y8 ^8 Q9 T ?: J( M/ I self._data = {self.table_class._meta.name: self.get_data()}- a& O+ E: M! ~
! U9 d2 \/ m6 J* p/ e File "/usr/share/openstack-dashboard/openstack_dashboard/wsgi/../../openstack_dashboard/dashboards/admin/overview/views.py", line 41, in get_data
! ^+ b1 P' O: l" j) D) z
/ f6 ]& b+ K% q data = super(GlobalOverview, self).get_data()( j2 N5 W7 p" V% Y i
1 Q2 F8 i9 z% y
File "/usr/share/openstack-dashboard/openstack_dashboard/wsgi/../../openstack_dashboard/usage/views.py", line 34, in get_data( d. c: U% Q) Q# X2 V$ H5 E- O
( W$ G0 D4 N' O
self.usage.get_quotas()" n) M6 `& J) z
4 D9 {6 \0 q4 G ^# }" ` File "/usr/share/openstack-dashboard/openstack_dashboard/wsgi/../../openstack_dashboard/usage/base.py", line 115, in get_quotas
4 P( w1 A# Y# E3 R, y; o% H" W ; T' H6 u9 U, X
_("Unable to retrieve quota information."))
0 `! b4 p2 {' n8 {4 ]8 y$ c0 d+ ~. x . d" U H/ \8 V
File "/usr/share/openstack-dashboard/openstack_dashboard/wsgi/../../openstack_dashboard/usage/base.py", line 112, in get_quotas7 f3 \6 O. Y# f
2 t/ _/ H. c& s( {5 o self.quotas = quotas.tenant_quota_usages(self.request)3 H; C' M x0 B6 M
) J; z! t2 @5 Y File "/usr/lib/python2.7/dist-packages/horizon/utils/memoized.py", line 33, in __call__
& U& Q) K' m5 v6 u: A. K
+ j9 o5 M# R; ^( U/ c a# T+ a7 _- c: n value = self.func(*args)
3 k* l, x r8 W% z5 o8 c5 B 8 ?. X) f6 Q3 ^7 H+ X
File "/usr/share/openstack-dashboard/openstack_dashboard/wsgi/../../openstack_dashboard/usage/quotas.py", line 115, in tenant_quota_usages
7 z" ]$ W, G- I( ~ , }; x4 H* \6 U
disabled_quotas=disabled_quotas):
* t6 W$ C$ Y2 u7 p# v. Y: v
- M" w: h. T& t* l" `* M File "/usr/share/openstack-dashboard/openstack_dashboard/wsgi/../../openstack_dashboard/usage/quotas.py", line 98, in get_tenant_quota_data: d. Q% B u& p* H1 o2 F3 |
) r4 S0 t7 u3 m6 C5 w9 F tenant_id=tenant_id)
|/ X" I! T7 n7 h5 o+ f9 `
) G2 ?* G! {( u File "/usr/share/openstack-dashboard/openstack_dashboard/wsgi/../../openstack_dashboard/usage/quotas.py", line 80, in _get_quota_data S# K1 m! C. ^3 b4 ` w& i
; s+ }7 T4 `# ^5 C* y) y* y
quotasets.append(getattr(cinder, method_name)(request, tenant_id))
4 ~ a& i/ _, B3 c @ ; F u' m, `/ ] Y u" y
File "/usr/share/openstack-dashboard/openstack_dashboard/wsgi/../../openstack_dashboard/api/cinder.py", line 123, in tenant_quota_get" l9 Z" _; H. e, a' y7 l
: k7 d1 p; b- b. a( e0 ]
c_client = cinderclient(request)0 M, E. x. R3 @% ?. v( L" A
. h8 I1 |# e0 [ t) x
File "/usr/share/openstack-dashboard/openstack_dashboard/wsgi/../../openstack_dashboard/api/cinder.py", line 59, in cinderclient7 w8 q% u( n, J0 l$ `! I
% t) G8 b) M1 H$ Y6 \2 q: _8 a http_log_debug=settings.DEBUG)+ {# ^3 r% [+ I) D! m
" g. M' K) U2 `7 m7 H* ~. P
File "/usr/lib/python2.7/dist-packages/cinderclient/v1/client.py", line 69, in __init__$ F |# s! [/ Y# W9 f/ T
! L7 `. Y$ X4 T cacert=cacert)
% f6 D& c2 `; W
& N8 v8 Q! |9 I t! F* j. \ File "/usr/lib/python2.7/dist-packages/cinderclient/client.py", line 78, in __init__, D6 d e' ?* _$ a4 v. H
( E, L6 B0 U; X if hasattr(requests, logging):( a- ^3 g4 f: g% o" x1 c6 m1 [
6 v; c8 m d7 }$ A& X
TypeError: hasattr(): attribute name must be string; K5 y& L- g! J' r
U3 j# X" j7 {) N$ L+ B+ s$ h5 {; d7 F g# n6 {3 `
错误信息中指出了 Cinderclient 的 client.py 中 78 行 hasattr() 方法的属性必须是一个字符串。# _" R- E8 R% }- q4 H: P
修改代码:
! M8 h9 }0 |: L1 J; t2 }
~. S! }7 Y" e" A5 j
, }# Z# ~) Q3 p+ Q5 B: I7 m6 y! a4 P0 e
# vim /usr/lib/python2.7/dist-packages/cinderclient/client.py
" D$ U, V: n- z
- B/ Z& S+ C% [2 r" p. \( A 78 if hasattr(requests, logging): # 改为 : if hasattr(requests, 'logging'):- [$ I3 ~( Q* q# r* {
( n! f0 S( Q3 }: [) j 79 requests.logging.getLogger(requests.__name__).addHandler(ch)2 a0 z1 B% }) Z- w; O; B
- W/ L6 f d6 i, d* }4 ?
2 ` f( c1 U& D2 n% f
重新启动 apache2 :! k1 V7 U ^1 I' A
# R* Q- w {( y! V" |9 ]( A5 `# M3 t% d
/etc/init.d/apache2 restart
( ]; q# i6 i3 _" J0 x" t r& q( Z1 ]4 |
这次访问 dashboard 没有报错,尝试创建 volume 也没有问题了。
- g" n" X% n/ J. w- ]4 Q' k {- i
11、Unable to attach cinder volume to VM. G% l3 p* m @; ~( s. O" i% F2 a
& T, u7 ], G$ E8 U 在测试openstack中的volume服务时把lvm挂载到虚拟机实例时失败,这其实不是cinder的错误,是iscsi挂载的问题。
9 ~5 _2 v C% B/ O
( d: h7 O# L( X5 K7 g5 S ^9 }以下是计算节点nova-compute.log 的错误日志:
7 @% g$ z9 r, ]/ t
% i) M% r. {- W8 | c2012-07-24 14:33:08 TRACE nova.rpc.amqp ProcessExecutionError: Unexpected error while running command.
* [ {7 H' J% ]# T/ `! s1 {1 X7 p8 f! 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& `# Y& E" v6 z6 R8 _5 s: Z
2012-07-24 14:33:08 TRACE nova.rpc.amqp Exit code: 255
* u" ~ ]1 \. G- A/ e2012-07-24 14:33:08 TRACE nova.rpc.amqp Stdout: ”
% Q5 h5 u) J- n/ M. D8 r' `2012-07-24 14:33:08 TRACE nova.rpc.amqp Stderr: ‘iscsiadm: No portal found.\n’
( _1 X, ^/ ?+ C, T4 X$ W1 P" H' M6 [4 `0 x: @5 l7 _9 ]/ ~* G9 z% J
, g0 J6 t; H5 f* Q4 ~0 M& J6 u- w3 `) P) h
以上错误是没有找到iscsi服务端共享出的存储,查找了很多openstack 资料说要添加以下两个参数:
$ b- s" y% c! J0 X0 B7 X
9 |% }8 {' l. ]4 {iscsi_ip_prefix=192.168.80 #openstack环境内网段( a' w9 U$ [' x }) O" V( j
( |' T* ]- [6 F1 E3 f7 h
iscsi_ip_address=192.168.80.22 # volume机器内网IP) q% ]" M" R% D9 o$ j2 J$ x
5 |. J8 p X& s e, i/ ^可是问题依然无法解决,后来发现只要在nova.conf配置文件中添加参数iscsi_helper=tgtadm 就挂载失败。
* n, A; n6 V" i
. Y* _! o5 ]2 X. b5 r根据这个情况进行了测试查看日志才发现:如果使用参数 :iscsi_helper=tgtadm 时就必须使用 tgt 服务,反之使用iscsitarget服务再添加参数iscsi_helper=ietadm。
- C& W9 n/ B, J
6 a% }0 B- I5 @4 l+ W+ V我测试环境的问题是tgt和iscsitarget服务都已安装并运行着(在安装nova-common时会把tgt服务也安装上,这个不小心还真不会发现),在nova.conf配置中添加参数iscsi_helper=tgtadm ,查看端口3260 发现是iscsitarget服务占用,所以导致挂载失败,我们可以根据情况来使用哪个共享存储服务!!将tgt 和iscsi_helper=tgtadm、iscsitarget和iscsi_helper=ietadm保留一个即可。7 T) a, |1 c# b2 G) K# W* G
, |6 B$ b$ l; e0 h9 h12、glance index报错:; Y. R3 k# o! @2 u: H4 T% d
" B. J4 g9 l6 x. J# E; F
Authorization 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); U' b% I- E3 c
; ^( N2 J3 W) D/ \( o! w
4 t0 a5 u4 }8 y) I$ R
在 Grizzly 版,我测试 glance index 时候报错:6 i9 k% d6 J. Z: b& d& ~
7 x# W( |8 f1 w7 D* o& |' m
Authorization 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)9 Q! z% l2 ^2 |0 ?. K
错误信息指出:glance 没有通过keystone验证,查看了 keystone 日志,报错如下:# O7 H& F; i$ n4 H2 ^1 z" f
3 [: Q% e- h3 V( W, l4 d( E: {2677 2013-03-04 12:40:58 ERROR [keystone.common.cms] Signing error: Error opening signer certificate /etc/keystone/ssl/certs/signing_cert.pem4 O6 D( C' f& c
2678 139803495638688:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen('/etc/keystone/ssl/certs/signing_cert.pem','r')* @, }: Z1 R5 P* ~
2679 139803495638688:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:, ]0 O0 l9 k1 U% f
2680 unable to load certificate3 P) t: o9 l3 ]8 ~
2682 2013-03-04 12:40:58 ERROR [root] Command 'openssl' returned non-zero exit status 33 A6 q ]% z+ E7 d- \7 W. y
2683 Traceback (most recent call last):
. @+ u1 X7 M% p: r6 d8 a2684 File "/usr/lib/python2.7/dist-packages/keystone/common/wsgi.py", line 231, in __call__4 a/ f) z8 p1 e# E6 f) w
2685 result = method(context, **params)
# P0 D' a, D a7 {* q8 f' F2686 File "/usr/lib/python2.7/dist-packages/keystone/token/controllers.py", line 118, in authenticate
. B: F2 P4 o7 v0 l, y2687 CONF.signing.keyfile)0 [$ O& A* }; v# n, U% `9 e
2688 File "/usr/lib/python2.7/dist-packages/keystone/common/cms.py", line 140, in cms_sign_token
: p9 U' K) i' u) D9 c2689 output = cms_sign_text(text, signing_cert_file_name, signing_key_file_name)
( F7 O8 U" Z, k1 y2690 File "/usr/lib/python2.7/dist-packages/keystone/common/cms.py", line 135, in cms_sign_text
& R0 O2 h' | r3 J2691 raise subprocess.CalledProcessError(retcode, "openssl")# ~+ J% D; _; A0 q0 P: t
2692 CalledProcessError: Command 'openssl' returned non-zero exit status 3
v+ A" p; p* M- Q$ ?& Y/ z在Grizzly 版中,keystone 默认验证方式是 PKI , 需要签名证书,之前的版本都是用的 UUID,改 keystone.conf:
8 C4 s; [ e+ m: u' Y
% J3 l5 j1 C+ h4 B+ s+ Wtoken_format = UUID2 P( [$ X6 W' Q
在试一次就没有错误了。
3 K/ d9 F( i- K( l* s1 k0 u5 r! T3 H8 q- _& f1 q, {5 n
13、镜像制作
7 O8 {4 i& ^5 G
6 S$ l) g- H+ N1 X这里主要强调下windows的镜像制作,因为windows的涉及到加载驱动的问题,就比较麻烦。% Y3 O- L( D1 Q
( w* _/ i( J9 M, [9 o. C! x9 `下载virtio驱动,因为win默认不支持virtio驱动,而通过openstack管理虚拟机是需要virtio驱动的。需要两个virtio驱动,一个是硬盘的,一个是网卡的,即:virtio-win-0.1-30.iso和virtio-win-1.1.16.vfd。这里主要强调两个地方: ' u8 ] `' f6 x2 ~1 U* H* O
" k- @ M8 S8 O
1、创建镜像:
, r! ?! K) B1 d
" g% c+ T; }" X' S% t7 }( t kvm -m 512 -boot d –drive6 I- m; W0 `% x' U( O' p
: P5 b, ?, b0 S6 V+ O
file=win2003server.img,cache=writeback,if=virtio,boot=on -fda virtio-win-1.1.16.vfd -cdrom windows2003_x64.iso -vnc:10 , _4 J( h( m3 C- o! _3 }
" n/ l7 p0 y( H% `( E9 s
, d( e( I) C8 d. p* v2 T1 ?) P7 }- M2、引导系统 :
' F% I# R( o1 U. G. D3 S @ s% a. T( L+ s5 ]# A% i6 @5 A
kvm -m 1024 –drive file=win2003server.img,if=virtio,3 ~ n% g% @7 t1 f5 g: d
& i+ O U8 _! ?boot=on -cdrom virtio-win-0.1-30.iso -net nic,model=virtio -net user -boot c -nographic -vnc 8( H$ m6 V) P2 Q2 m: s0 F
8 D$ i; g: U9 v" A! X
" X5 a% E1 p2 H0 m: @这里需要注意的地方是if=virtio,boot=on –fda virtio-win-1.1.16.vfd和引导系统时使用的virtio-win-0.1-30.iso 这两个驱动分别是硬盘和网卡驱动。如果不加载这两个驱动安装时会发现找不到硬盘,并且用制作好的镜像生成实例也会发现网卡找不到驱动,所以在这里安装镜像生成后需要重新引导镜像安装更新网卡驱动为virtio。1 `! D0 m2 F: G5 S* ]! ?. G+ s% B0 R) S
) P# ]7 Z/ [% j5 F4 ~1 \; V* x0 V
14、删除僵尸volume4 s) H1 w& z$ f
0 K0 z4 w. I6 _- I$ u" }( Y
如果cinder服务不正常,我们在创建volume时会产生一些僵尸volume,如果在horizon中无法删除的话,我们需要到服务器上去手动删除,
& P; ]2 T4 q' \( O6 F0 }
$ e6 m# V S- h9 y" X* b: c. D/ q7 }命令:lvremove /dev/nova-volumes/volume-000002* R: b4 Z8 E6 s
5 P8 L, x- P, H3 {4 B: Y& E' @
注意这里一定要写完整的路径,不然无法删除,如果删除提示:$ W v. J8 H/ x
5 l5 v# {0 O4 W+ U/ ^7 X, O6 q“Can't remove open logical volume“ 可尝试将相关服务stop掉,再尝试删除。删除完还需到数据库cinder的volumes表里清除相关记录。 |
|