实验一:
两个客户端都正常映射块设备,同时写入,判断是否会冲突,写入不同偏移的数据是否会冲突
# 新建一个 10GiB 的镜像(大小随你改)
rbd create rbdpool/disk1 --size 10G --image-feature layering,exclusive-lock,object-map,fast-diff
rbd info rbdpool/disk1
sudo rbd map rbdpool/disk1
rbd device list | grep rbdpool/disk1
# 假设出来是 /dev/rbd0
两个客户端
ClientA:生成已知数据并写入 offset=0
dd if=/dev/urandom of=/tmp/payloadA.bin bs=4M count=256 status=progress
sha256sum /tmp/payloadA.bin
# 写入 offset=0:seek=0
dd if=/tmp/payloadA.bin of=/dev/rbd0 bs=4M seek=0 conv=fsync oflag=direct status=progress
sync
ClientB:生成已知数据并写入 offset=2GiB
dd if=/dev/urandom of=/tmp/payloadB.bin bs=4M count=256 status=progress
sha256sum /tmp/payloadB.bin
# 2GiB / 4MiB = 512
sudo dd if=/tmp/payloadB.bin of=/dev/rbd0 bs=4M seek=512 conv=fsync oflag=direct status=progress
在 ClientA 读取 B 的区域(offset=2GiB):
sudo dd if=/dev/rbd0 of=/tmp/readB_from_A.bin bs=4M skip=512 count=256 iflag=direct status=progress
sha256sum /tmp/readB_from_A.bin
在 ClientB 读取 A 的区域(offset=0):
sudo dd if=/dev/rbd0 of=/tmp/readA_from_B.bin bs=4M skip=0 count=256 iflag=direct status=progress
sha256sum /tmp/readA_from_B.bin
发现
sha256(readB_from_A.bin) == sha256(payloadB.bin)
sha256(readA_from_B.bin) == sha256(payloadA.bin)
偏移不同两边写入都会永久保存,互不影响
删除
rm -f /tmp/payloadA.bin /tmp/payloadB.bin /tmp/readB_from_A.bin /tmp/readA_from_B.bin
实验二:
一个客户端用exclusive的方式映射,另外一个客户端是否能映射
root@node3:~# rbd map rbdpool/disk1
rbd: sysfs write failed
In some cases useful info is found in syslog - try "dmesg | tail".
rbd: map failed: (30) Read-only file system
实验三:
一个客户端用exclusive的方式映射,另外一个客户端以read only的方式可以映射吗
发现用read only 映射的客户端,rbd status的时候,不会显示,并且也不可以写入
root@node3:~# sudo dd if=/tmp/payloadB.bin of=/dev/rbd0 bs=4M seek=512 conv=fsync oflag=direct status=progress
dd: error writing '/dev/rbd0': Operation not permitted
1+0 records in
0+0 records out
0 bytes copied, 0.0157501 s, 0.0 kB/s
也不可以格式化
root@node3:~# mkfs.ext4 /dev/rbd0
mke2fs 1.45.5 (07-Jan-2020)
/dev/rbd0: Operation not permitted while setting up superblock
root@node3:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 63.3M 1 loop /snap/core20/1828
loop1 7:1 0 4K 1 loop /snap/bare/5
loop2 7:2 0 63.8M 1 loop /snap/core20/2686
loop3 7:3 0 74M 1 loop /snap/core22/2216
loop4 7:4 0 74M 1 loop /snap/core22/2193
loop5 7:5 0 346.3M 1 loop /snap/gnome-3-38-2004/119
loop6 7:6 0 91.7M 1 loop /snap/gtk-common-themes/1535
loop7 7:7 0 48.1M 1 loop /snap/snapd/25935
loop8 7:8 0 516.2M 1 loop /snap/gnome-42-2204/226
loop9 7:9 0 46M 1 loop /snap/snap-store/638
loop10 7:10 0 49.9M 1 loop /snap/snapd/18357
loop11 7:11 0 349.7M 1 loop /snap/gnome-3-38-2004/143
loop12 7:12 0 12.2M 1 loop /snap/snap-store/1216
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 512M 0 part /boot/efi
├─sda2 8:2 0 1K 0 part
└─sda5 8:5 0 39.5G 0 part /
sdb 8:16 0 20G 0 disk
└─ceph--67e5115d--61fb--4ad3--8c52--7a11393e2cc8-osd--block--a5dc8956--4f50--44b4--aa4e--2e1d2f37d7f0
253:0 0 20G 0 lvm
sdc 8:32 0 20G 0 disk
└─ceph--bbcf8d83--260b--447c--9324--14f78508f732-osd--db--b99fe826--c37a--47a8--be5b--f719142b823f
253:1 0 5G 0 lvm
sr0 11:0 1 1024M 0 rom
rbd0 252:0 0 10G 1 disk
但是可以读其他客户端写入的内容,并且校验是对的
root@node3:~# dd if=/dev/rbd0 of=/tmp/readA_from_B.bin bs=4M skip=0 count=256 iflag=direct status=progress
1035993088 bytes (1.0 GB, 988 MiB) copied, 6 s, 172 MB/s
256+0 records in
256+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 6.32134 s, 170 MB/s
root@node3:~# sha256sum /tmp/readA_from_B.bin
e4d2c9611ad1a047790b9b8b64eafca8f6f1c54361f24ee47db8a66b41ca4fe2 /tmp/readA_from_B.bin