使用 blkverify 测试块驱动正确性
简介
本文介绍如何使用 blkverify 协议测试块驱动是否正确工作。
使用真实客户机测试和调试块驱动很困难。 客户机进程可能因可执行文件中读到损坏扇区而崩溃, 也可能由客户机程序报告含糊错误。这些现象很难追溯到块驱动中的缺陷。
blkverify 在首次读到错误数据时就在 QEMU 内捕获损坏,并报告对应磁盘扇区。
工作方式
blkverify 有两个子块设备:test 和 raw。 读写操作同时镜像到两者,因此其状态应始终同步。
raw 设备是一个平坦文件形式的原始镜像,初始内容与 test 完全相同。 假定 raw 正确处理读写且不破坏数据,用作与 test 对比的参考。
镜像读取完成后,blkverify 比较数据,不一致时即报错, 因此能够捕获第一次读到损坏数据的情况。
示例
假设 raw.img 的第一个扇区全部为 0xcd:
$ ./qemu-io -c 'read -v 0 512' raw.img
00000000: cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd ................
00000010: cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd ................
[...]
000001e0: cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd ................
000001f0: cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd ................
read 512/512 bytes at offset 0
512.000000 bytes, 1 ops; 0.0000 sec (97.656 MiB/sec and 200000.0000 ops/sec)
test.img 则已损坏,第一个扇区被错误清零:
$ ./qemu-io -c 'read -v 0 512' test.img
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
[...]
000001e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000001f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
read 512/512 bytes at offset 0
512.000000 bytes, 1 ops; 0.0000 sec (81.380 MiB/sec and 166666.6667 ops/sec)
blkverify 会捕获此错误:
$ ./qemu-io -c 'read 0 512' blkverify:a.img:b.img
blkverify: read sector_num=0 nb_sectors=4 contents mismatch in sector 0
更实际的场景是验证客户机操作系统安装过程:
$ ./qemu-img create raw.img 16G
$ ./qemu-img create -f qcow2 test.qcow2 16G
$ ./qemu-system-x86_64 -cdrom debian.iso \
-drive file=blkverify:raw.img:test.qcow2
如果 blkverify 发现损坏而中止安装,使用 qemu-io 查看镜像中相应扇区的内容。