以编程方式检测SD卡写保护

时间:2011-11-30 20:46:34

标签: linux sd-card

回到软盘的旧时代,如果你启用软盘的写保护,DOS会告诉你你不能写它。现在我们有SD卡,可以容纳数千张软盘的内容,我们仍然有写保护 - 而且它有时候很方便。但没有人能够告诉我,我不能写信,至少在Linux上。我有一个可爱的脚本,以我喜欢的方式对SD卡进行分区和格式化。我花了1/2个小时进行调试才发现SD卡是写保护的。

所以问题是,软件有没有办法检测到这种情况?

谢谢,

2 个答案:

答案 0 :(得分:1)

您可能只需要检查您正在使用的任何程序的返回值(意味着您的脚本应该检查它执行的所有内容的返回值,并在看到意外结果时打印警告消息或酌情保释) 。在这里,我安装了一个SD卡,其写保护开关启用到/ media / system,并尝试用不同的命令写入它:

$ cd /media/system
$ touch nonce
touch: cannot touch `nonce': Read-only file system
$ echo $?
1
$ echo hi > nonce
bash: nonce: Read-only file system
$ echo $?
1
$ cp ~/.bashrc nonce
cp: cannot create regular file `nonce': Read-only file system
$ echo $?
1
$

现在我在我的主目录中尝试了相同的命令:

$ cd
$ touch nonce
$ echo $?
0
$ echo hi > nonce
$ echo $?
0
$ cp .bashrc nonce
$ echo $?
0
$ 

还值得指出的是,SD卡上的写保护是由读取设备强制执行的,而不是卡本身内部的任何内容:这意味着读取设备可以选择ignore that switch

答案 1 :(得分:1)

驱动程序知道卡何时被写保护,并且当您通过命令行挂载时它实际发出警告:

# mount /dev/sdc1 /media/flash
mount: block device /dev/sdc1 is write-protected, mounting read-only

如果您想在设备级别自行检查,可以使用hdparm command查询磁盘设备的只读状态,包括SD卡和USB闪存驱动器。该程序应该可以在大多数GNU / Linux发行版中使用,通常在名为" hdparm"的包中。

如果您不是root用户,请务必指定hdparm命令的完整路径;这假设你当然有读卡权限。

例如:我的SD卡已插入,检测为/dev/sdc,写保护标签位于解锁

$ /sbin/hdparm -r /dev/sdc

/dev/sdc:
 readonly      =  0 (off)

当我将写保护标签滑动到锁定时,重新插入卡,然后再次运行命令:

$ /sbin/hdparm -r /dev/sdc

/dev/sdc:
 readonly      =  1 (on)

如果您想在shell脚本中执行此操作,可以尝试以下方法:

READONLY=`/sbin/hdparm -r /dev/sdc 2>&1 | sed -n 's/^.*= *\([01]\) .*$/\1/p'`
if [ "$READONLY" = "0" ]
then
    echo Card is writable.
else
    echo Card is not writable.
fi

注意:如果您希望在C中执行此操作,则可以尝试:

  • 以写入模式打开设备文件,看看它是否因errnoEROFS只读文件系统)而失败,或者......
  • 以读取模式打开设备文件,然后发出名为BLKROGETioctl(),并检查结果值是否为非零值;这是hdparm的工作方式。