No meu trabalho, usamos cartões SD em um sistema embarcado. Se tentarmos inicializar com uma placa bloqueada, obteremos um kernel panic. Isso não foi grande coisa até termos um lote de cartões SD que tinham interruptores de gravação muito soltos: o ato de inserir o cartão no leitor às vezes era suficiente para mover o interruptor e travar o cartão. Muitas pessoas começaram a tentar criar opções mecânicas para evitar isso, como colocar um pedaço de fita em cada cartão SD, mas no final consertamos isso mudando uma linha de código-fonte no kernel do Linux. Agora, quando um cartão SD é detectado com o switch configurado para somente leitura, simplesmente ignoramos o switch e, felizmente, gravamos dados no cartão sempre que desejamos.
Isto é a partir da nossa louca mistura de backports, então duvido que este patch seja aplicado em qualquer lugar, mas se você quiser experimentar o seu próprio kernel, este é um bom ponto de partida:
--- 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)
Se você não quiser aplicar patches e criar um kernel Linux, mas tiver uma câmera Canon P & S, use CHDK para gravar arquivos (fotos) em um cartão SD protegido contra gravação (quando a câmera é ligada, o OF verifica o estado do comutador; quando definido para RO, ele carregará automaticamente o firmware a partir do cartão SD. permite que os usuários inicializem diretamente no CHDK e, em seguida, o CHDK ignora o estado do comutador para que ele ainda possa gravar imagens no cartão, por exemplo, link ).
Você também pode gravar em um cartão SD protegido contra gravação no Linux desativando o sinalizador somente leitura com hdparm
e remontando o cartão:
$ 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
$