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