环境:
ceph L版本12.2.1升级到12.2.12
这个问题是由于升级后进行12.2.12环境中的使用ceph-disk 进行osd部署时出现如下问题,执行命令
ceph-disk -v prepare /dev/sdb;ceph-disk -v activate /dev/sdb1
出现如下问题,出现这个问题之前我的磁盘用作部署过12.2.1版本的osd,但是我已经使用sgdisk -z -og /dev/sdb
格式化过磁盘
command_check_call: Running command: /usr/bin/ceph-osd --cluster ceph --mkfs -i 2 --monmap /var/lib/ceph/tmp/mnt.uYoUWC/activate.monmap --osd-data /var/lib/ceph/tmp/mnt.uYoUWC --osd-uuid e6ac88e7-7929-4405-937a-8686a30a0037 --setuser ceph --setgroup ceph
2019-11-03 00:32:35.588340 7fcc21bddd00 -1 bluestore(/var/lib/ceph/tmp/mnt.uYoUWC/block) _check_or_set_bdev_label bdev /var/lib/ceph/tmp/mnt.uYoUWC/block fsid 0fb18eac-7c3b-47a8-9b1f-64407ccf1905 does not match our fsid e6ac88e7-7929-4405-937a-8686a30a0037
2019-11-03 00:32:35.844858 7fcc21bddd00 -1 bluestore(/var/lib/ceph/tmp/mnt.uYoUWC) mkfs fsck found fatal error: (5) Input/output error
2019-11-03 00:32:35.844890 7fcc21bddd00 -1 OSD::mkfs: ObjectStore::mkfs failed with error (5) Input/output error
2019-11-03 00:32:35.845005 7fcc21bddd00 -1 ** ERROR: error creating empty object store in /var/lib/ceph/tmp/mnt.uYoUWC: (5) Input/output error
根据官网bug跟踪的解决过程unable to create bluestore osd using ceph-disk
也进行了一些测试,发现即使时我使用sgdisk
格式化了磁盘分区之后,仍然可以在磁盘的前1个G容量中看到有12.2.1相关数据。即我在使用12.2.1版本部署过osd的磁盘去部署当前版本12.2.12时,上一个版本的一些fsid,uuid,osd编号等一些rockdb元数据信息仍然存在于当前磁盘的扇区中,这个时候我即使格式化磁盘仍然无法清楚掉这一些数据得,查看sgdisk源码,使用-o参数清楚磁盘分区数据只会清除GPT 格式的数据,并不会清除MBR格式数据。
对已经sgdisk -z -og /dev/sdk
之后的磁盘执行如下操作:
[root@node1 zhg]# dd if=/dev/zero of=/dev/sdk bs=1M count=1G
^C4647+0 records in
4647+0 records out
4872732672 bytes (4.9 GB) copied, 21.5581 s, 226 MB/s
[root@node1 zhg]# dd if=/dev/sdk of=mbr.txt bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 9.53945 s, 113 MB/s
查看dd出来的1G容量的数据
0010c000 49 4e 41 ed 02 01 00 00 00 00 00 a7 00 00 00 a7 |INA.............|
0010c010 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 02 |................|
0010c020 00 00 00 00 00 00 00 00 5d bd af 16 04 b6 73 f2 |........].....s.|
0010c030 5d bd af 16 04 b6 73 f2 00 00 00 00 00 00 00 86 |].....s.........|
0010c040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0010c050 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0010c060 ff ff ff ff 09 00 00 00 00 18 09 00 50 63 65 70 |............Pcep|
0010c070 68 5f 66 73 69 64 00 00 00 1b 04 00 88 66 73 69 |h_fsid.......fsi|
0010c080 64 00 00 00 1c 05 00 b8 6d 61 67 69 63 00 00 00 |d.......magic...|
0010c090 1d 0a 00 f0 62 6c 6f 63 6b 5f 75 75 69 64 00 00 |....block_uuid..|
0010c0a0 00 1e 05 01 08 62 6c 6f 63 6b 00 00 00 1f 04 01 |.....block......|
0010c0b0 38 74 79 70 65 00 00 00 20 07 01 48 6b 65 79 72 |8type... ..Hkeyr|
0010c0c0 69 6e 67 00 00 00 21 06 01 80 77 68 6f 61 6d 69 |ing...!...whoami|
0010c0d0 00 00 00 22 0f 01 98 61 63 74 69 76 61 74 65 2e |..."...activate.|
0010c0e0 6d 6f 6e 6d 61 70 00 00 00 23 00 00 00 00 00 00 |monmap...#......|
0010c0f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
可以看到,虽然已经格式化磁盘了,但是扇区中仍然存在上一个版本osd相关元数据信息。
这个时候解决该问题,根据以上官网解决该bug的流程,执行如下操作即可
ceph osd rm osd.id #删除添加失败的osd
ceph auth rm osd.id #删除添加失败的osd的密钥
dd if=/dev/zero of=/dev/sdk bs=1M count=1024 #使用0重写前一个G内容
sgdisk -Z -g /dev/sdk #先破坏磁盘所有分区,再将分区由mgr转为gpt格式分区
ceph-disk -v prepare /dev/sdk
ceph-disk -v activate /dev/sdk1
这里在使用0重写磁盘前一个G内容时查看磁盘前一个G内容如下,显然这个写0操作执行之后就所有分区就都没有内容了
[root@node1 zhg]# dd if=/dev/sdk of=mbr.txt bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 9.53945 s, 113 MB/s
[root@node1 zhg]# hexdump -C mbr.txt
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|