易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 598|回复: 1
收起左侧

ceph块儿设备映射到物理机 rbd map、unmap以及同一个块存储镜像的多物理机挂载卸载问题

[复制链接]
发表于 2023-5-23 15:24:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?开始注册

x
查看池% D& l# y) r5 N# d
[root@node-1 ~]# ceph osd pool ls! P4 ~' s6 d+ x  y5 g* {, c
6 H( d5 p6 ?7 J" f, `- m' o. T
新建rbd块. b1 X7 G, G# z. t  |
[root@node-1 ~]# rbd create volumes/Test_pressure.img --size 100G --image-format 2& P+ _* ]" U) z

' t9 G% S, U8 r, y) i( U& A- q查看块信息
$ U9 m; k# ^, E/ n  Q[root@node-1 ~]# rbd info -p volumes --image Test_pressure.img
+ G4 D, v/ @1 r( z) ^rbd image 'Test_pressure.img':3 R- y: d8 m1 K, S: ~+ p& I* n6 S
        size 100 GiB in 25600 objects
! b& i3 |, m. a( q' ]% Z9 F        order 22 (4 MiB objects)1 |1 F, i% m4 C- t' q& \7 |5 @
        snapshot_count: 0
, \( D9 {5 a2 C5 N; G3 e9 B, z6 A        id: 30d05554c7f235 p, B# q# v$ e" s
        block_name_prefix: rbd_data.30d05554c7f23
, C+ R9 A  O! G: g        format: 2
8 W; z1 u6 z$ _& o        features: layering, exclusive-lock, object-map, fast-diff, deep-flatten% L: }# V( C! W/ a
        op_features:
  M' r# o1 q: r  |: Z& m- y        flags: $ i9 M* u7 P7 D+ C& x
        create_timestamp: Sun Sep 26 16:57:19 2021
* z* E  _) a0 C7 I  w; n        access_timestamp: Sun Sep 26 16:57:19 2021+ c$ R6 b* O7 J: P' j
        modify_timestamp: Sun Sep 26 16:57:19 2021' C3 Y8 s1 P5 E3 V2 ^  z* L2 q" }

8 K. u! F5 G: k将rbd块映射到主机(报错)
& n  u5 I& V; t) i' ~  K( ~[root@node-1 ~]# rbd map volumes/Test_pressure.img
* @( \% h& f2 @  E% C. b# urbd: sysfs write failed
+ o# U/ ?4 k4 O+ O6 c- k6 ERBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable volumes/Test_pressure.img object-map fast-diff deep-flatten".3 t$ q( x& y" w/ B
In some cases useful info is found in syslog - try "dmesg | tail".
5 X- E" v! f) E, Lrbd: map failed: (6) No such device or address
  P) l& h, x6 B9 Y: d( x7 o6 e* J3 c4 A
删除8 s' }1 H/ b% X' H' _) F
[root@node-1 ~]# rbd rm -p volumes --image Test_pressure.img
2 H) t, i! Z9 d9 R1 DRemoving image: 100% complete...done.
+ k0 t) I" h, T* o& A8 w3 {# {! t3 O, J6 z# R
故障排查:
6 k. A$ h" t/ U9 y. T1 K3 hrbd 块 ceph 支持两种格式:7 u8 H1 y. E4 {7 r
# rbd create volumes/Test_pressure.img --size 100G --image-format 2  
1 x# ~  Z1 H# }9 p* g! W! L+ \8 U! {$ p: m  j- i
--image-format format-id
& h2 |2 W" x( m/ ^- W4 i选择用哪个对象布局,默认为 1 。
/ j2 [: R7 s$ R5 Tformat 1 - 新建 rbd 映像时使用最初的格式。此格式兼容所有版本的 librbd 和内核模块,但是不支持较新的功能,像克隆。
1 }) _1 N# ^3 V) b! ]0 Q8 a+ Oformat 2 - 使用第二版 rbd 格式,librbd 和 3.11 版以上内核模块才支持(除非是分拆的模块)。此格式增加了克隆支持,使得扩展更容易,还允许以后增加新功能。  ^# a7 t! F" c. Y. _5 H
% _" G+ g6 i/ I/ G1 Z/ N$ X

1 c8 Q& `# t0 _3 t* B为使用rbd块新特性,使用格式2,在map时发生以上报错:
1 E' ^( P# |" c: Q3 `. y# L$ B; v) N% f" Z. f
查找相关资料,找到信息如下:
# ^7 v( i* u! n/ V1 A3 J. i7 d+ K笔者安装的是nautilus版本,新建rbd块指定格式2,默认格式2的rbd块支持如下特性,默认全部开启;
( ^! q: @; y+ c0 Q% Z: P2 wlayering: 支持分层
, w6 E% n/ Z: i  ]) l6 Y" ?* f$ dstriping: 支持条带化 v2
6 r$ w) l+ g. e0 eexclusive-lock: 支持独占锁4 m/ b( d0 h6 }5 N& }. F+ ^% T
object-map: 支持对象映射(依赖 exclusive-lock )
  d, j) w- Q3 }  O: Q! d0 |fast-diff: 快速计算差异(依赖 object-map )! C* ]. }5 c) [- h
deep-flatten: 支持快照扁平化操作3 @9 h% T4 r0 N& W% _2 M
journaling: 支持记录 IO 操作(依赖独占锁), U& j1 i4 p1 l6 c
3 X/ e$ F" o0 e$ a3 B: J5 W

5 n4 |4 A4 q5 Z使用系统为centos7.6 ,内核版本3.10.0-957.10.1.el7.x86_64,根据报错内容提示可知,服务器系统内核版本,不支持有些格式2的新特性导致。可以使用 --image-feature 选项指定使用特性,不用全部开启。我们的需求仅需要使用快照等特性,开启layering即可,配置方式如下:
& S) Q* Q' N, u3 D1 Y9 M[root@node-1 ~]# rbd create volumes/Test_pressure.img --size 100G --image-format 2 --image-feature layering, _* u: d/ N- z# L" S. l
5 P1 R. U, H2 X
映射到物理机* n2 Q  ?& {4 e; B
[root@node-1 ~]# rbd map volumes/Test_pressure.img: w/ P* g! ~1 S) Z
/dev/rbd0! t! z1 |' Q/ E" r; n; t
2 q2 ^* b1 D6 k% D& V
挂载' L/ Z3 \& Q; s' p/ `
[root@node-1 ~]# mkfs.xfs /dev/rbd0 ' V% g; x& r  C7 b
[root@node-1 ~]# mount /dev/rbd0 /mnt/) h% D1 P+ F7 `) ~) w3 o
[root@node-1 ~]# mkdir -p /mnt/test
6 j" Z$ C; D% ?0 n/ B, u# j[root@node-1 ~]# ll /mnt/7 K6 w2 ~& z5 Q7 i: s) D: S
total 0
) U. s7 Z8 W) t7 U9 ~; x: S% ldrwxr-xr-x 2 root root 6 Sep 26 17:53 test0 j# Z4 Q8 X/ T4 U) l9 Z8 p6 Z
" T- ?* u) {7 E' F2 q6 y  ~
# 经测试,内核版本3.10,仅支持此特性(layering),其它特性需要使用更高版本内核,或者从新编译内核加载特性模块才行。% J  F7 q4 o1 y+ i8 _2 A
# 看看format 1 format 2的区别在哪
1 A; z) J* y* L7 R format: 2$ G! T1 [7 n( |
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten # 格式2支持的功能较多,但是低内核又不支持那么多,只能把其他的功能禁用掉使用
4 `& ]1 I( _+ e
/ |" C* M. J  [1 X. G6 n! p2 `* P3 \( Z
2 C: c9 g+ t% z6 q" D1 r卸载硬盘
6 s* U) x. p2 {8 z; R[root@node-1 ~]# rbd unmap volumes/Test_pressure.img
6 n% U( R/ Q$ m) |1 u8 a& K  e8 A+ m0 K  F/ R. q' {' S, @7 m
删除块
9 H+ h9 {/ k1 g) ^9 ][root@node-1 ~]# rbd rm -p volumes --image Test_pressure.img; s. @- G- Z8 O

( h2 C- L, a! F
! `% f* H* M1 `4 ~; S$ ~  R# {- \一 块存储调用方式
4 X) y* x- w* J' b) b/ y# ]Ceph的块存储有多种使用方式:# V! i# v! C- J  l6 {
1 KRBD方式 : 本文章重点讨论方式' w  p) g" E& @. d7 s& l9 p; p
基于内核映射的调用方式,通过Kernel中的RBD模块实现访问后端存储( T2 l3 ]6 v( r2 n6 t1 l, U7 M' m
2 利用QEMU模拟器挂载到虚拟机中
! o1 F. F8 b2 T3 J) s3 librbd方式:API库调用
! T8 \* p6 R) J  \4 z" i+ R
# c- O& W+ u$ h) a# i二 同一个块存储镜像的多物理机挂载问题
, X+ S; j8 v* L1 A" E! k这里我们采用KRBD的方式时,关于这个问题其实可以拆分来分析:  m9 G* N3 r) Q% X4 [! s
1.能不能同一个块设备同时挂载到多个物理机?6 |8 Q$ Z# y! F4 ?2 y8 O
能,但是互相不识,每个物理机的读写不会影响另一个物理机,也不会在另一个物理机上展示其文件;如果再挂一个新的物理机时,会集中把所有物理机的文件都拷过来;- i) ~2 k0 q9 |) j- r( @
& {9 h; w8 F+ f/ y6 a+ }5 b
关于块设备映射的文件系统格式化+ \0 O% y" I# [; q: l
虽然会多个物理机,但只需要第一次用这个块设备时,将其格式化就好了,后续物理机不要格式化,不然的话,块设备信息全部丢失,其他物理机也很无奈;
# _) k; Y& X# q+ t8 u这个过程中,会出现不一致性,比如如果两个物理机都建了一个名字相同但大小不同的文件时,会以最后一个建的为准;
0 [7 u/ ], ~) b: k
5 k1 H7 Z3 W6 g& T关于同一个块设备,我的建议是最好不要挂载多个物理机上;8 o7 O3 h4 T! A8 J2 H5 V, e% C+ t
挂载多个物理机虽然可以,但如果重新映射挂载物理机时会把其他物理机上文件一起拷贝过来,便会互相影响了;8 O. Y! K2 v. x, k$ {
- d. ^2 j0 c2 ~1 {$ u9 P6 E' y4 X
关于块存储的数据复原
0 j- `" s! C7 g" J; }. p' _  A这里是指如果客户机挂掉了,必须用另个客户机时要把挂掉的客户机数据拷贝过来,便出现了同一个块设备挂载多个客户机了,另个客户机此时会复原原来的那个客户机数据的,这里经过小数据的测试验证。3 P# e! f- F# O) I% j
4 \- K" W9 F6 q8 c5 [; u
期间遇到的一些问题
4 Y* M  N2 i( y1 `) T: Q5.1 文件系统格式化不需要每次内核映射完毕后都调用,因为格式化意味着清空数据.
* r0 C+ t. i( I0 l9 M; D5.2 如果重复umount和mount操作时,不要在mount的目标路径下进行操作,因为会出现mount后调用ls命令不刷新的场景,切记~) @7 E1 q0 ]) ?0 v2 D
5.3 在快照回滚或者其他场景时偶尔出现下面的问题
2 X/ a# E+ c3 X2 i* w: s3 n/ D3 x8 V' @! V
//问题0 f; E, |9 T7 y/ j4 H4 b/ Q
mount: wrong fs type, bad option, bad superblock
7 M. M8 s4 M+ r4 e3 E: a
) \2 Q, j! o. C- @$ q2 C: J6 P//解决0 |+ S& C% L# T& H6 ^! k: b
fsck -t ext4  /dev/rbd/rbd/foo23 P1 i: T5 Q6 n4 }6 _
三 RBD模块
" M" c% v7 {% G0 e) ~& l2 Arbd模块是内核中内置的一种驱动模块,可以驱动Ceph块存储;4 I% R6 c& ~5 G/ I3 i! k( ~3 H% l
注意的是3.10.0版本以上内核才会默认集成该驱动。
8 m* b9 N5 C: k- ~
2 p, G7 s: H# Q) z6 H- x//查看RBD模块信息# `; B0 r. J0 x/ r: o$ u% O5 a
modinfo rbd
, p$ Y) U$ S* [" ?. z( B2 a//查看RBD模块所属的软件包
0 n* _9 o9 Z3 s5 K/ t/ _6 O$ t( }  Wrpm -qf /lib/modules/3.10.0-327.el7.x86_64/kernel/drivers/block/rbd.ko1 u* [7 v; \- |  y0 U1 O
四 块存储的一些常见命令
& [# n" H3 U  E9 m% D4 Y% O创建镜像,也可以叫块设备。
# i) h' W! |/ \# \9 L' u. Arbd create foo2 --size 2048 --image-feature layering --image-shared7 ?7 w$ ^' a  u! Y# `
创建内核映射,将块设备映射到操作系统。
" h4 f& P- {& s- x) t8 G6 fsudo rbd map foo2 --name client.admin
% h. K2 a1 z8 u* k  F* f查看块设备映射列表
: G6 W( e1 a& I' q( O& f6 V, vrbd showmapped% ?" K5 a) ?; y1 L1 r) [! Q
删除块设备映射
( e) h0 s$ V$ D; Msudo rbd unmap /dev/rbd/rbd/foo2* r- Z0 e1 y2 O: J2 J) [" V9 t
导入导出块设备
: J. T  i! r" P% {1 arbd import --image-format 2 /root/test1  rbd/foo2
. O# p4 {4 w7 Q. a9 b% `rbd export  rbd/foo2  /root/test1
9 x! e) Q& S* I' h' T* }创建快照
+ M& q! `5 P* q' K# ]9 K' Arbd snap create rbd/foo2@snap1& h* d0 H/ d6 h$ C" E- Q; k! @' X
查看快照) b. x- q  W2 ]# I7 O, c
rbd snap ls rbd/foo2
8 T6 U# f. q$ E7 X9 E: Q; D% M! r回滚快照
+ I: M1 g" _. Jrbd snap rollback rbd/foo2@snap1
! Q% T5 z7 P$ k9 e2 n: G删除快照
1 U- v  i) t* f1 ?) V" d+ ?( ~" o9 `! Hrbd snap rm rbd/foo2@snap1
4 _; @8 I! G3 p删除镜像
7 _& |) h" x0 L2 r3 U! arbd rm rbd/foo2
) y" U& G7 R9 u2 a挂载、解挂块设备% ]/ ^  a3 c; Q6 s
sudo mount -t ext4 -o discard  /dev/rbd/rbd/foo2 /mnt/cc3) U7 c  u- [2 K) M- v
umount /mnt/cc3) @8 k+ T# {. x$ S- X& T5 m% h0 E" i
格式化块设备映射2 r6 c  c5 B2 O8 e( a
sudo mkfs.ext4 -m0 /dev/rbd/rbd/foo2
, \) e; {# ?* A/ s2 ?: Q' o镜像空间大小. t: x+ z/ ^5 _% e  D, h
rbd diff rbd/foo2 | awk '{ SUM += $2 } END { print SUM/1024/1024 " MB" }'
) _7 u! v6 k, `: ^' t) u) DPS: 这个有时在多物理机挂载场景下会不准
6 V$ q7 s; w6 M8 V9 N* C/ H+ u( A9 R& o& c. C  ?& W7 a

! w; W; |# D) T( g
 楼主| 发表于 2023-5-23 15:26:29 | 显示全部楼层
一、问题描述
! A( p3 e9 u! }- B( Z! D% a2 N  云主机文件系统损坏导致云主机无法启动!客户要求把数据找回!!!8 }8 w) z0 I/ r6 r: b3 N5 L
0 l+ @# }' b/ l8 `
二、准备工作1 k* Z7 D) w3 d+ ^  J2 L
  2.1 创建一台云主机做文件修复。( P0 L) O. X) B4 O
  2.2 找一台物理机(RHEL7.1即可)做文件修复。
6 w! J$ M% k8 T% |+ T- c! h8 d/ m* B! }( |9 m
三、操作流程: |8 X: W2 L3 H" K
  3.1 对有问题的云主机关机,系统盘做快照。$ j. t2 u* {' h0 d4 s& E
  3.2 根据3.1的快照创建一个云硬盘。% [& E. O$ W' z$ ~* q
  3.3 将3.2中创建的云硬盘挂在到2.1的云主机上做文件修复。
. X# S# _8 ]/ [7 n. l. F  3.4 上面的步骤如果可以修复成功,则将有问题的云主机系统盘挂在到2.2的物理机上做文件修复。/ ]& P2 [) j4 W, y  j4 i) Q

2 f3 \5 D1 Y8 _& i+ B9 a, r; r四、EXT4修复过程3 A4 q& P3 T) ^, q5 X
  4.1 查看超级块备份
% }. X( c& S8 Q- I2 b+ Q2 P6 L    mkfs.ext4 -n /dev/mapper/${lv_name}6 c- `$ k- y: T( l
  4.2 用备份的超级块挂载5 K4 \, ^) p6 A* d# j& H& q" b
    mount -o sb=32768 /dev/mapper/${lv_name} /mnt # 32768 为4.1中查出的超级块位置2 H* M' J2 c  w0 Q* z7 C
  4.3 用备份的超级块fsck修复分区
5 R7 ]/ Z4 e% K( @    fsck.ext4 -b 32768 /dev/mapper/${lv_name} # 32768 为4.1中查出的超级块位置
% ?$ R+ M2 W0 C+ z9 J  4.4 直接用fsck修复分区
2 r2 s3 w: R6 Y) a- p    fsck.ext4 -y /dev/mapper/${lv_name}
! f: W( m/ x8 O  4.5 重建超级块(!慎用!可能丢失所有数据)2 z7 h/ W6 X# K) j! G# \3 n! h& b
    mkfs.ext4 -S /dev/mapper/${lv_name}
/ ?  G" f- U3 X) c+ D9 m! C  4.5 以上操作全部失败!继续查看日志+Google
' D9 |& ?7 P7 Z1 Y. u7 k' I    resize2fs /dev/mapper/${lv_name} 73399296 # 依然失败
: q0 Z4 P, }/ p+ M+ H- \' |0 R  4.6 受到4.5的启发决定扩展下lv试下
( W' Z6 d8 U  U% l4 F6 j: }    lvextend /dev/mapper/${lv_name} /dev/${vdisk_path} # 终于成功
; U, ~. o4 D2 }" N  4.7 将云主机系统盘挂在到物理机6 J! @# U- {$ f( X3 Y! d) t
    rbd map ${pool_name}/${volume_name}2 z4 y! ]$ o6 S0 M: u& l- r
  4.8 扩展lvm/ ]9 }3 `3 y) f: E; Q
    lvextend /dev/mapper/${lv_name} /dev/${vdisk_path}6 x8 E7 u, a- i0 b( k
  4.9 卸载云主机系统盘
1 J, r% D" U# a$ E" {7 g    lvchange -an /dev/mapper/${lv_name}
+ e; w- O% D0 h/ g6 B    rbd unmap ${mapped_point}
  }. x+ ]/ ]1 E* D7 \/ b
* K( w7 ^- }% Q1 G五、XFS修复过程3 G+ L5 u  ?: W' K- _$ U' \% G
  5.1 执行xfs_repair
* {; G& v6 W' Y1 d4 K    xfs_repair -L /dev/mapper/${lv_name} # 一次成功* F9 ^5 [0 a/ ^8 {! [( c0 f! K
  5.2 将云主机系统盘挂在到物理机
, l4 _& B* N" i8 [5 H# H    rbd map ${pool_name}/${volume_name}, E/ o4 v. f5 n# W
  5.3 执行xfs_repair
4 [, }3 Q( u! j    xfs_repair -L /dev/mapper/${lv_name}; ?" H: X9 j7 v8 ]
  5.4 卸载云主机系统盘$ [4 e$ V7 K  w. c2 I- y! T2 ^
    lvchange -an /dev/mapper/${lv_name}* e. l: V, e8 V0 Y/ }6 M
    rbd unmap ${mapped_point}
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )点击这里给我发消息

GMT+8, 2026-4-9 00:02 , Processed in 0.045692 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

快速回复 返回顶部 返回列表