|
|
探索 kernel RBD map 失败的问题。
8 l- N& S! n2 o p, e场景
( A+ f1 V! f1 J( m0 Y* s搭完 rbd mirror后,想通过client往image里写一些数据,所以在client端map rbd设备,结果失败了。
5 l3 v5 U' _. z6 Q, L) {% Zrbd mirror的image 需要两个属性:exclusive-lock, journaling3 l2 W$ m J( Y, q
原因7 g8 _2 z0 R/ i3 H2 X
查看rbd image info
* ^, P3 l& ]# S" n: m7 h8 N. I9 I' d# k" W! Y, n) A
# rbd info rbd/image-1* W/ e8 L) |$ l5 d+ X' I
rbd image 'image-1':
) i' x# W! G3 h6 {. i7 r8 B: h0 O+ p size 1024 MB in 256 objects
T$ S) f7 [* j2 \) H order 22 (4096 kB objects)
/ }) } Y6 h: X$ G block_name_prefix: rbd_data.108b238e1f290 _. @/ ]9 y5 J x: I
format: 2
: L0 d f1 p7 B1 {6 i, `3 h9 N3 J4 r features: exclusive-lock, journaling& w3 W: Q/ N0 d) e, n
flags:
1 ^0 O+ q/ o1 f journal: 108b238e1f29
5 w: N+ n2 D' ?6 Y' K! B mirroring state: enabled
# H& x) w2 B5 `9 ` mirroring global id: c603d9dc-6f8d-49e0-ab68-5944d348e527% j+ U4 ~ X4 d7 x, g2 Y
mirroring primary: true8 J3 t, v' J. W& v; L; F
输出
8 v( o, ?3 g6 m- ^% R& X: O% l: G) e# |, s1 @8 \
# rbd map rbd/image-1
0 J) ]7 d# c( _rbd: sysfs write failed! S5 M: M5 ?8 N, {
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable".6 w4 R+ n$ f ^* g. b7 S7 [
In some cases useful info is found in syslog - try "dmesg | tail" or so.: a# e- z& p+ H7 S: M
rbd: map failed: (6) No such device or address
# u$ J" m# k0 }9 a然后dmesg看一下% [/ F# l, P5 {# w( |9 q
8 g5 _8 ^+ z/ u' Q$ E3 y
# dmesg | tail5 w w/ e) h9 h
[ 64.808315] rbd: loaded (major 251); N& f1 F# m- l- R+ G7 q- l
[ 64.818369] libceph: mon2 172.20.2.160:6789 session established# ?! i1 L4 p; ^ a. E7 g3 k
[ 64.819187] libceph: client14167 fsid 4c7ec5af-cbd3-40fd-8c96-0615c77660d4
0 {0 G i4 \. [. q7 } |, d[ 64.836328] rbd: image image-1: image uses unsupported features: 0x40
3 P$ u3 n8 A3 @- D5 l$ v0 O[ 443.658569] libceph: mon1 172.20.2.161:6789 session established
, ~/ t! n% { H$ G[ 443.659143] libceph: client4313 fsid 4c7ec5af-cbd3-40fd-8c96-0615c77660d4
" g% u9 ~) Z5 F) B- X1 t6 }$ Y[ 443.683178] rbd: rbd0: capacity 10737418240 features 0x18 U9 N& {. a! v( @$ ^: D B
[ 978.502132] rbd: image image-1: image uses unsupported features: 0x40
5 O, D7 G5 x$ p6 ^5 {1 w错误原因* E* _! `4 Q& J- Y: O
image uses unsupported features: 0x40- i' [4 \# i' m9 s# r- e
不支持特性 0x40 = 64,也就是不支持特性 journaling8 i) C$ z2 K) u1 O- ^0 Z- I0 k
关于内核支持的特性分析/ `7 C# @+ I/ _1 Q7 H
查看内核版本: q+ G4 Q$ ?" L
; g* ^; e/ T, G4 { p# uname -r" X% i- k9 W: _- l0 h
3.10.0-327.el7.x86_649 b& C) d9 p* }+ P
根据查阅资料和实践,发现: P, w- X0 j# D$ n. z7 n) U
CentOS的3.10内核仅支持其中的layering 和 exclusive-lock,其他feature概不支持
J* Q5 l7 J( S: a内核4.6仍然只支持:layering、exclusive-lock和 striping 属性2 f( B9 {, F+ Z
8 k- o3 \( B; l0 t+ G" h6 R# rbd info rbd/test-map
, M0 y5 t9 @% T K; d* Drbd image 'test-map':) b. |, c, B, B4 O
size 512 MB in 128 objects; x q+ D R& f0 Z$ M
order 22 (4096 kB objects)4 A( q% l& k7 i! r4 T- Y* J1 G
block_name_prefix: rbd_data.10ca238e1f29/ b3 J R; g4 |: i8 S/ H
format: 2
8 r; C2 Q/ Y8 g: o/ O# M" D features: layering, exclusive-lock# Y/ w5 ]9 l5 d( H
flags:
! S, U% U3 o; K/ A }0 D* ~, umap9 W* j6 Q; G# q7 U: y1 n& M
, |- |! }7 V/ o) T
# rbd map rbd/test-map. ~* _9 p# v$ g- W" h$ J& I, i
/dev/rbd1
& E1 [% ` M- P此时可以map成功。4 c3 E# _; @% w/ y5 b: T4 e
RBD特性解析
/ l0 Q. } E, B特性一览表& l, A1 G* J/ T9 y- @' h; w9 o
RBD支持的特性,及具体BIT值的计算如下/ F7 J& m2 x, K5 N
属性 功能 BIT码
* v$ G& @! m- _% }% `layering 支持分层 1* s& t6 o! j8 }. }( E# O, g
striping 支持条带化 v2 22 q5 a; e$ e5 S5 T
exclusive-lock 支持独占锁 4
/ y" |2 _3 P* G% H( Y. e* Nobject-map 支持对象映射(依赖 exclusive-lock ) 8
- t3 w. d, T# I: x% Vfast-diff 快速计算差异(依赖 object-map ) 16
: @* `7 a% C, B$ bdeep-flatten 支持快照扁平化操作 321 {) R+ c! u" P6 P, z
journaling 支持记录 IO 操作(依赖独占锁) 647 Q8 ~0 X, y. `5 T* ?3 P
ceph kraken版本默认属性值
2 p( G1 y `) {: i
# i" y& m1 R7 }/ r# ceph --show-config|grep rbd|grep features
1 f3 d0 [( V- t' U: }9 Z f: ~3 crbd_default_features = 61
2 r7 Z! z% }$ m为啥是61?我们创建一个默认配置的rbd看看; r: u) h" L; Q! f2 w# ^0 Y0 M
/ W* z7 D8 b% u
# rbd create test-feature --size 64
' ?; k0 K7 e5 r5 J" t# rbd info rbd/test-feature1 d m) N" w% H
rbd image 'test-feature':! m: v) ^! z H: s! _. B7 j
size 65536 kB in 16 objects/ n! g s4 t d5 _8 r# |
order 22 (4096 kB objects) U* }. s3 X. u
block_name_prefix: rbd_data.107d238e1f29
" C" B& S) N7 A* U format: 2 a6 _5 j! ?) M- p% h0 x Z
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
% z! Q T& N$ _5 G0 l0 d flags:
/ l% j4 h0 z( [2 A" }1+4+8+16+32 = 61) `- T& c8 b! V8 y+ X
就是说除了特性:striping 和 journaling 外都开启了。
. {2 l0 \/ a- V6 _6 G- S控制属性$ Q O/ K2 T, E* B+ e/ R3 o+ k
有三种方法来开启需要的特性
6 s4 \6 ~: F% r4 h+ _; ^1、在创建image时,通过 --image-feature 来指定需要开启的特性0 ~. L$ K0 B0 T# `1 I; p
2、对已存在的image可以通过如下命令开启和关闭( { I, t# L$ \2 Y' w
1
- I9 r L7 N6 f1 ]5 l- z2' G2 c' x% [7 Z1 D
rbd feature enable <pool-name>/<image-name> <feature-name>
2 P6 w+ y& u, {8 m' v1 @8 e% J, b: ]rbd feature disable <pool-name>/<image-name> <feature-name>$ h' w7 q7 D# O, O2 F+ S
3、当然,每次通过enable和disable来不是很便捷,可以通过修改配置文件来解决
9 E- H& e3 G- T2 N, T6 Z2 [1
# _' r* d! Z5 R$ V: m. \. B4 B2
/ J) r- @7 T+ h; w! {; G& r' u5 |3
7 L" P' Q* ^; Z0 d, R4# b# p3 I9 ~" i2 v, T
vim /etc/ceph/ceph.conf' c V7 H4 s P# K9 f/ \& k3 {
...
# i7 V. ^ _# \rbd_default_features = 1& L+ ]( N2 D) l; U/ ~
...
: d% s7 {. A6 p# q; c6 v; O1 B- I具体该设为多少可以通过上面BIT值查表计算得出。
+ p7 r0 P; [4 O' A( G |
|