磁盘只读(readonly)故障场景模拟
disk simulate test假设服务器目前有多个盘,vdb1
这块分区盘专门用于数据库程序的数据目录,我们就用 vdb1
这个盘来模拟只读故障场景。
1. 卸载指定盘
umount /dev/vdb1
想要如期卸载掉,需要确保该盘上没有被正在运行进程依赖,如果有运行中的进程依赖这个盘,会报如下报 target is busy
的错误:
umount: /opt: target is busy.
遇到该错误时,可以通过lsof [mountpoint]
命令来查看有哪些进程依赖这块盘,kill 掉相应的进程后重新卸载。
2. 配置伪设备来镜像 /dev/vdb1 的内容
卸载成功后,我们通过 losetup
指令来配置一个loop设备(在类 UNIX 系统里,loop 设备是一种伪设备(pseudo-device),或者也可以说是仿真设备。它能使我们像块设备一样访问一个文件)。
losetup /dev/loop0 /dev/vdb1
执行指令后,可以通过 losetup -l
查看当前服务器上的 loop 设备列表:
3. 挂载 /dev/loop0
我们已经有一个 /dev/loop0
的伪设备镜像到了 /dev/vdb1
上,此时,我们来挂载 /dev/loop0
这个伪设备:
mount /dev/loop0 /opt -o rw,errors=remount-ro
通过 df -h
可以查看到 /dev/loop0
已经正常挂载上了
4. 正常启动应用进程(这里测试用opengauss数据库)
gs_ctl start -D /opt/mogdb/data/
5. 修改磁盘为只读模式(故障注入)
blockdev
命令行工具是用于控制区块设备程序
blockdev --setro /dev/vdb1
此时,尝试写入 /dev/loop0
设备,将导致I/O错误。一旦文件系统驱动程序检测到,它将以只读方式重新挂载文件系统。
这样就实现了磁盘只读故障的场景模拟。
6. 测试后恢复系统
a. 取消挂载
umount /opt
b. 删除伪设备
losetup -d /dev/loop0
c. 将 /dev/vdb1
设备恢复为可读写
blockdev --setrw /dev/vdb1
d. 将 /dev/vdb1
重新挂载回来
mount /dev/vdb1 /opt
— EOF —