删除大型 RBD 镜像

laurentbarbe

创建一个具有巨大尺寸的磁盘可能很有趣,但删除起来有点困难。

这里有一个小技巧(请谨慎使用!)来删除对于 rm rbd 来说过大的镜像(如果镜像未初始化,或未完全初始化)。

镜像格式 1:

$ rbd info rbdbigsize
rbd image 'rbdbigsize':
    size 1862 PB in 500000000000 objects
    order 22 (4096 kB objects)
    block_name_prefix: rb.0.47aa.74b0dc51
    format: 1

删除头文件

$ rados -p rbd rm rbdbigsize.rbd

删除所有 rbd 数据:(这可能需要一些时间,具体取决于块设备上已使用的空间。)

$ rados -p rbd ls | grep '^rb.0.47aa.74b0dc51' | xargs -n 200  rados -p rbd rm

最后,从 rbd 列表中删除

$ rbd rm rbdbigsize
2014-06-12 16:27:20.838596 7fd86dff3760 -1 librbd::ImageCtx: error finding header: (2) No such file or directory
Removing image: 100% complete...done.

镜像格式 2:

$  rbd info rbdbigsize
rbd image 'rbdbigsize':
        size 1024 TB in 268435456 objects
        order 22 (4096 kB objects)
        block_name_prefix: rbd_data.81d12ae8944a
        format: 2
        features: layering

删除头部

$ rados -p rbd rm rbd_id.rbdbigsize 
$ rados -p rbd rm rbd_header.81d12ae8944a

删除所有 rbd 数据

$ rados -p rbd ls | grep '^rbd_data.81d12ae8944a.' | xargs -n 200  rados -p rbd rm

从 rbd 列表中删除

$ rbd rm rbdbigsize
2014-06-12 17:37:24.483587 7f413506c760 -1 librbd::ImageCtx: error finding header: (2) No such file or directory
Removing image: 100% complete...done.

时间比较:

刚刚格式化后的 1PB 块设备的删除时间示例。

$ rbd create rbdbigsize --size=1073741824 --image-format=2
$ rbd map rbdbigsize
$ mkfs.xfs /dev/rbd0
$ rbd unmap /dev/rbd0

$ rados -p rbd ls | grep '^rbd_data.81d12ae8944a.' | wc -l
1536

该块设备仅由 1536 个块组成,可以通过 rados rm 快速删除

$ time rados -p rbd ls | grep '^rbd_data.81d12ae8944a.' | xargs -n 200  rados -p rbd rm
real    0m10.073s
user    0m1.244s
sys 0m0.228s

进行比较

$ time rbd rm rbdbigsize
Removing image: 100% complete...done.

real    1123m5.409s
user    686m19.924s
sys     229m56.596s

完全初始化的镜像:

当然,使用简单的“rbd rm”删除完全初始化的镜像会更快:)

$ rbd create rbdbigsize --size 1048576
$ rbd map rbdbigsize; dd if=/dev/zero of=/dev/rbd0; rbd unmap /dev/rbd0;
$ time (rados -p rbd ls | grep `rbd info rbdbigsize | grep block_name_prefix | grep -o 'rb.*$'` | xargs -n 200  rados -p rbd rm; rados -p rbd rm rbdbigsize.rbd; rbd rm rbdbigsize)

real    143m6.373s
user    2m49.100s
sys     0m22.080s


$ rbd create rbdbigsize --size 1048576
$ rbd map rbdbigsize; dd if=/dev/zero of=/dev/rbd0; rbd unmap /dev/rbd0;
$ time rbd rm rbdbigsize

real   88m44.121s
user    1m5.464s
sys     0m25.244s