программно определить SD-карту защиты от записи - PullRequest
1 голос
/ 01 декабря 2011

В старые добрые времена дискеты, если вы включите защиту от записи на дискете, DOS любезно скажет вам, что вы не можете писать на нее.Теперь у нас есть SD-карта, на которой могут храниться тысячи флоппи-дисков, и у нас все еще есть защита от записи - и это иногда удобно.Но никто не может сказать мне, что я не могу писать в него, по крайней мере, в Linux.У меня есть прекрасный сценарий, который разбивает и форматирует SD-карту так, как мне нравится.Мне потребовалось полчаса отладки, чтобы выяснить, что SD-карта защищена от записи.

Итак, вопрос, может ли программа обнаружить такое состояние?

Спасибо,

Ответы [ 2 ]

1 голос
/ 17 марта 2017

Драйвер знает, когда карта защищена от записи, и он фактически предупреждает, когда вы монтируете ее через командную строку:

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

Если вы хотите проверить это самостоятельно на уровне устройства, вы можете использовать команду hdparm , чтобы запросить состояние диска только для чтения, включая SD-карту и USB-накопитель в целом. Эта программа должна быть доступна в большинстве дистрибутивов GNU / Linux, обычно в пакете с именем "hdparm".

Если вы не являетесь пользователем root, обязательно укажите полный путь к команде hdparm; и это предполагает, что у вас есть разрешение на чтение вашей карты, конечно.

Например: моя SD-карта вставлена, определяется как /dev/sdc, а вкладка защиты от записи находится на Unlock :

$ /sbin/hdparm -r /dev/sdc

/dev/sdc:
 readonly      =  0 (off)

Когда я передвинул вкладку защиты от записи на Блокировка , заново вставьте карту и снова введите команду:

$ /sbin/hdparm -r /dev/sdc

/dev/sdc:
 readonly      =  1 (on)

Если вы хотите сделать это в сценарии оболочки, вы можете попробовать что-то вроде:

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, вы можете попробовать:

  • Открытие файла устройства в режиме записи и поиск сбоя со значением errno EROFS ( Файловая система только для чтения ) или ...
  • Открыв файл устройства в режиме чтения, затем введите ioctl() с именем BLKROGET и проверьте, не является ли значение результата ненулевым; это способ hdparm работы.
1 голос
/ 04 апреля 2012

Возможно, вам просто нужно проверить возвращаемое значение любой программы, которую вы используете (это означает, что ваш скрипт должен проверять возвращаемое значение всего, что он выполняет, и печатать предупреждающее сообщение или выручать при необходимости, когда он видит неожиданный результат) , Здесь я установил 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-карте обеспечивается устройством чтения, а не чем-либо внутри самой карты: это означает, что устройство чтения может выбрать игнорировать этот переключатель .

...