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