如何判断Linux磁盘是否为只读模式?含SATA DOM硬件开关检测方法
检测SATA DOM硬件只读开关的方法
绝对可以通过/sys/class/scsi_disk/路径下的属性来检测硬件只读开关状态!这其实是这类硬件锁最可靠的软件检测方式之一——毕竟硬件锁是直接作用于SATA控制器层面的,和文件系统的只读挂载完全是两回事。
具体步骤:
定位你的DOM对应的scsi_disk节点
首先得找到磁盘对应的SCSI设备路径。比如你的磁盘是/dev/sda,可以用udev快速定位:udevadm info --query=path --name=/dev/sda输出结果里会包含类似
/sys/class/scsi_disk/0:0:0:0的路径,这就是你要找的节点。或者也可以通过块设备的符号链接追踪:
ls -l /sys/block/sda链接目标里的
scsi_deviceX:Y:Z:W对应的就是/sys/class/scsi_disk/X:Y:Z:W/。读取硬件只读状态
进入对应的scsi_disk目录,读取readonly文件:cat /sys/class/scsi_disk/0:0:0:0/readonly- 返回
1:硬件开关已切换到只读模式 - 返回
0:磁盘处于可读写状态
划重点:这个
readonly值是硬件层面的状态,和你是否把文件系统挂载成ro无关。哪怕你强行尝试挂载成rw,只要硬件锁是开的(返回1),挂载操作也会失败——而这个属性能直接反映硬件开关的真实状态。- 返回
为什么你之前用的工具没效果?
lsblk的RO列:显示的是文件系统的挂载状态,不是硬件锁的状态。比如硬件锁了但没挂载,lsblk可能会显示0,这会误导你。smartctl:主要负责读取磁盘的SMART健康数据,绝大多数DOM的硬件只读开关不会通过SMART协议暴露状态,所以查不到很正常。parted:只能识别分区表和文件系统信息,完全不涉及SATA控制器层面的硬件锁状态。
额外提示:
如果切换硬件开关后,readonly的值没更新,可能需要重新扫描SCSI总线让系统识别状态变化:
echo "1" > /sys/class/scsi_device/0:0:0:0/device/rescan
把命令里的0:0:0:0换成你对应的scsi_device编号就行。
内容的提问来源于stack exchange,提问作者Rusty Weber




