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