SDカードで読み取り専用モードへのロックはどこにありますか強制?これは、カード自体の内部、リーダーのファームウェア、またはOSで行われますか? (他の場所?)
SD仕様パート1物理層簡略化仕様 を読んだ場合、セクション4.3.6「書き込み保護管理」は次のように述べています。
SDメモリーカードでは、次の3つの書き込み保護方法がサポートされています。
-機械的書き込み保護スイッチ(ホストの責任のみ)
-カード内部書き込み保護(カードの責任)
-パスワード保護カードロック操作。メカニカルライトプロテクトスイッチ
カードの側面にある機械式スライドタブレット(パート1機械的補遺を参照)は、特定のカードが書き込み保護されているかどうかを示すためにユーザーによって使用されます。スライド式タブレットがウィンドウが開くように配置されている場合は、カードが書き込み保護されていることを意味します。ウィンドウが閉じている場合、カードは書き込み保護されていません。ソケット側の適切で一致したスイッチは、カードが書き込み保護されているかどうかをホストに示します。 カードを保護するのはホストの責任です。書き込み保護スイッチの位置は、カードの内部回路には不明です。
(私の強調)
A 東芝SDカード仕様 言う
CMD28SET_WRITE_PROT-内部書き込み保護は実装されていません。
CMD29 CLR_WRITE_PROT-内部書き込み保護が実装されていません。
CMD30 SEND_WRITE_PROT-内部書き込み保護は実装されていません。
…
2)サポートされていない機能:
カードの内部書き込み保護(物理層仕様4.3.5ではオプション)
私の仕事では、組み込みシステムでSDカードを使用しています。ロックされているカードで起動しようとすると、カーネルパニックが発生します。書き込みスイッチが非常に緩いSDカードのバッチを入手するまで、これは大したことではありませんでした。カードをリーダーに挿入するだけで、スイッチを動かしてカードをロックできる場合がありました。多くの人がこれを防ぐための機械的なオプションを考え始めました。たとえば、各SDカードにテープを貼り付けるなどですが、最終的にはLinuxカーネルのソースコードを1行変更することでこれを修正しました。これで、スイッチが読み取り専用に設定されたSDカードが検出された場合、スイッチを無視して、必要なときにいつでもカードにデータを書き込むことができます。
これは私たちのクレイジーなバックポートのミスマッシュによるものなので、このパッチがどこでも問題なく適用されるとは思えませんが、独自のカーネルで実験したい場合は、これが良い出発点です。
--- include/linux/mmc/card.h (revision 1423)
+++ include/linux/mmc/card.h (revision 1424)
@@ -125,7 +125,7 @@
#define mmc_card_blockaddr(c) ((c)->state & MMC_STATE_BLOCKADDR)
#define mmc_card_set_present(c) ((c)->state |= MMC_STATE_PRESENT)
-#define mmc_card_set_readonly(c) ((c)->state |= MMC_STATE_READONLY)
+#define mmc_card_set_readonly(c) {printk("Ignoring MMC read-only switch\n");}
#define mmc_card_set_highspeed(c) ((c)->state |= MMC_STATE_HIGHSPEED)
#define mmc_card_set_blockaddr(c) ((c)->state |= MMC_STATE_BLOCKADDR)
Linuxカーネルにパッチを当ててビルドする気はないが、Canon P&Sカメラを持っている場合は、 [〜#〜] chdk [〜#〜] を使用してファイル(画像)を書き込むことができます。書き込み保護されたSDカード(カメラの電源がオンになると、OFはスイッチの状態をチェックします。ROに設定すると、SDカードからファームウェアが自動ロードされます。これにより、ユーザーは次のことができます。 CHDKを直接起動します。CHDKはスイッチの状態を無視するため、カードに画像を書き込むことができます。例 http://chdk.wikia.com/wiki/Bootable_SD_card )を参照してください。
hdparm
で読み取り専用フラグをオフにしてカードを再マウントすることにより、Linuxで書き込み保護されたSDカードに書き込むこともできます。
$ mount | grep mmc
/dev/mmcblk0p1 on /media/hello type ext3 (ro,nosuid,nodev,relatime,errors=continue,user_xattr,acl,barrier=1,data=ordered,uhelper=udisks)
$ touch /media/hello/test
touch: cannot touch `/media/hello/test': Read-only file system
$ Sudo hdparm -r /dev/mmcblk0p1
/dev/mmcblk0p1:
readonly = 1 (on)
$ Sudo hdparm -r0 /dev/mmcblk0p1
/dev/mmcblk0p1:
setting readonly to 0 (off)
readonly = 0 (off)
$ touch /media/hello/test
touch: cannot touch `/media/hello/test': Read-only file system
$ Sudo mount -t ext3 -o rw,remount /dev/mmcblk0p1 /media/hello
$ touch /media/hello/test
$ echo goodbye > /media/hello/test
$ cat /media/hello/test
goodbye
$ Sudo umount /dev/mmcblk0p1
$ Sudo mount /dev/mmcblk0p1 /mnt
mount: block device /dev/mmcblk0p1 is write-protected, mounting read-only
$ cat /mnt/test
goodbye
$ touch /mnt/test
touch: cannot touch `/mnt/test': Read-only file system
$
読者によって異なります。リーダーは書き込み保護タブを無視できます。リーダーは、書き込み保護タブが有効になっている場合に書き込みを無効にするファームウェアを持つことができます。リーダーには、書き込み保護タブが有効になっている場合に書き込みを無効にするソフトウェアドライバーを含めることができます。実際には、大多数の読者はファームウェアでそれを行います。