Pendrive protegido contra escritura en Linux

Si tienes una tarjeta de memoria SD, pendrive o cualquier disco de almacenamiento USB que quieres proteger contra escritura, en este artículo te contamos paso a paso y de forma fácil cómo hacerlo. Y es que existe un bit de proteccion antiescritura que permiten ciertos controladores, el conocido como “write protection bit” que según esté activo a 1 o a 0 dejará escribir en la unidad o no. No hay que confundir este bit con el WP de los registros de bandera de las CPUs, que evitan la sobre escritura creando un proceso de bifurcación o fork en los sistemas tipo UNIX, protegiendo así la memoria principal de una escritura de datos. Tampoco a la típica pestaña de protección que encontramos en algunas tarjetas SD o meodios de almacenamiento. En este caso nos estamos refiriendo a una protección que se implementa en los medios de almacenamiento secundario.

Mientras el controlador del medio de almacenamiento USB o de la tarjeta de memoria SD, o el medio que sea, detecte que este bit está activo, el controlador impedirá que el kernel ordene una orden de escritura y por tanto solo podrá leerle el contenido. Ciertamente resulta muy práctico cuando almacenamos datos que no queremos que sean modificados, haciendo que se eviten escrituras o eliminación por error. Pero si ha caido en nuestras manos uno de estos medios protegidos y no conocemos de la existencia de este bit, podremos perder horas pensando que nuestra unidad está estropeada, o subiendo y bajando la pestañita que tienen algunos pendrives o tarjetas SD para protegerlos sin resultado alguno (Lock/Unlock)…

Montar un medio de solo lectura o con permisos de escritura:

 

Aunque no sea exáctamente lo que buscamos con el Write Protection Bit, también nos podemos encontrar con que un medio ha sido montado de forma automática o manual para solo lectura, con lo que no tendremos la capacidad de escribir en él. Algo que en algunos casos puede resultar muy molesto e impedirnos modificar o almacenar cosas. Pues bien, la solución a esto es muy sencilla.

Por ejemplo, si en el fichero /etc/fstab el dispositivo está configurado para que se monte de forma automática con la opción ro (read only) o si lo hemos montado con el comando:


sudo mount -o ro /dev/sda /mnt

En tal caso solo podemos leer el dispositivo /dev/sda en este caso que ha sido montado en el punto de montaje /mnt. Para que podamos volver a escribir en él:


sudo mount -o remount,rw /dev/sda /mnt

En caso de que este método no te funcione, entonces será porque está actuando el bit del que hemos hablado, y por eso tendremos que usar la herramienta que te presentamos a continuación.

¿Qué es hdparm?

El comando hdparm es una herramienta a bajo nivel que actúa como una interfaz entre varios controladores del kernel Linux y los medios de almacenamiento SATA/PATA/SAS mediante la biblioteca libata, así como para los viejos medios IDE. Recuerda que muchos controladores USB de medios de almacenamiento, incluidos los lectores de tarjetas como las SD, también usan este tipo de contorladores para operar, por tanto también es compatible con ellos.

Su sintaxis básica es:

hdparm [opciones] [dispositivo]

Y presenta muchas opciones con las que trabajar, aunque no te recomiendo que las uses si no conoces bien lo que haces, ya que al ser una herramienta a bajo nivel podrías dañar seriamente tu dispostivio, por ejemplo si manipulamos algunas opciones críticas como -B. Pero sí que te diré que entre sus opciones se encuentran algunas bastante interesantes como:

  • Obtener la configuración del disco:

sudo hdparm /dev/sdd

  • Mostrar la identificación del disco:
 sudo hdparm -i /dev/sdd 
  • Comprobar tiempos de lectura del buffer y de la cache:

sudo hdparm -t /dev/sdd
sudo hdparm -T /dev/sdd

Recuerda siempre usar los privilegios, es decir, ejecutarlos como usuario root o anteponiendo sudo delante o no funcionarán…

Quitar y poner el bit de protección de la memoria con hdparm:

Una vez conocida la herramienta hdparm, podemos usar la opción -r con la que podemos consutlar el estado de este bit con un simple comando. Para ello, tan solo debemos conocer el nombre físico de nuestro dispositivo de almacenamiento. Por ejemplo, si se llamase /dev/sdd, en ese caso podríamos usar:

 sudo hdparm -r /dev/sdd 

Y se nos mostrará en pantalla el valor de dicho bit. Si su valor es 1 eso quiere decir que está activo el modo readonly o de solo lectura, o dicho de otro modo, el método de protección contra escritura está activo y no podrás escribir nada en la memoria. Para desactivarlo o modificar el bit, tan solo debes hacer lo siguiente:


sudo hdparm -r0 /dev/sdd

Y ahora si ejecutásemos el primer comando y consutamos el estado veremos que ha vuelto a 0, por tanto el modo readonly está off o desactivado. En caso de quererlo devolver al estado de activo, usa la opción -r1 en vez de -r0 y listo. Por ejemplo:


sudo hdparm -r1 /dev/sdd

Así de sencillo es activar o desactivar este bit. No tiene demasiado misterio pero para los que no conozcan esto puede ser un quebradero de cabeza a la hora de desproteger sus medios de almacenamiento.

Espero que te haya servido de ayuda y ahora sepas cómo hacer un pendrive protegido contra escritura, no olvides dejar tus comentarios…



Soy un apasionado de la tecnología, F1 e informática... y me encanta compartir, pero sobre todo aprender cada día más. En definitiva me gusta todo lo que tenga que ver con la ciencia.

3 comentarios

  1.   Hernán dijo

    Hola!
    Antes que nada, gracias por las notas! Son siempre de mucha utilidad.

    Soy usuario de Debian 9.
    En este caso en particular, tengo un problema que no puedo resolver. Tengo un pen “infectado” con una protección de escritura que NO la puedo sacar. Ya estoy pensando que es algo físico porque sinceramente he intentado de todo (hasta formateos de bajo nivel en Windows o discos de rescate, modificar las particiones, etc.) y nada.

    Creí que estuve a punto de resolverlo, cuando siguiendo tus pasos, me encontré con que la protección de escritura del pendrive estaba en “on”, pero una vez que lo cambié a “off” sigo sin poder borrar o modificar nada en él.

    Que podrá ser? Hay alguna otra forma de resolver ésto? (no me importa perder la info que tengo dentro)

    Desde ya mil gracias por tu ayuda.

    Hernán

  2.   willians salgado dijo

    buena la explicacion

  3.   Sergio dijo

    Hola tengo un USB que el sistema no reconoce, te envio la informacion si puedes ayudarme gracias

    dmesg

    [83384.348839] usb 1-1: new high-speed USB device number 8 using ehci-pci
    [83384.506219] usb 1-1: New USB device found, idVendor=0c76, idProduct=0005, bcdDevice= 1.00
    [83384.506225] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
    [83384.506228] usb 1-1: Product: USB Mass Storage
    [83384.506231] usb 1-1: Manufacturer: GENERIC
    [83384.506848] usb-storage 1-1:1.0: USB Mass Storage device detected
    [83384.508235] scsi host5: usb-storage 1-1:1.0
    [83385.524951] scsi 5:0:0:0: Direct-Access GENERIC USB Mass Storage 1.00 PQ: 0 ANSI: 2
    [83385.556757] sd 5:0:0:0: Attached scsi generic sg3 type 0
    [83385.561706] sd 5:0:0:0: [sdc] Attached SCSI removable disk

    root@localhost:~# fdisk -l
    Disk /dev/sda: 698.7 GiB, 750156374016 bytes, 1465149168 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 4096 bytes
    I/O size (minimum/optimal): 4096 bytes / 4096 bytes
    Disklabel type: gpt
    Disk identifier: 995F9474-C5F1-4EE9-8FD7-13EA790423DC

    Device Start End Sectors Size Type
    /dev/sda1 2048 1050623 1048576 512M EFI System
    /dev/sda2 1050624 49879039 48828416 23.3G Linux filesystem
    /dev/sda3 49879040 69410815 19531776 9.3G Linux filesystem
    /dev/sda4 69410816 76107775 6696960 3.2G Linux swap
    /dev/sda5 76107776 80013311 3905536 1.9G Linux filesystem
    /dev/sda6 80013312 1465147391 1385134080 660.5G Linux filesystem

    root@localhost:~# fdisk -l /dev/sdc
    fdisk: cannot open /dev/sdc: No medium found

    root@localhost:~# hdparm /dev/sdc

    /dev/sdc:
    SG_IO: bad/missing sense data, sb[]: f0 00 02 00 00 00 00 0b 00 00 00 00 3a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    multcount = 0 (off)
    readonly = 0 (off)
    readahead = 256 (on)

    root@localhost:~# hdparm -C /dev/sdc

    /dev/sdc:
    drive state is: standby

    root@localhost:~# hdparm -I /dev/sdc

    /dev/sdc:
    SG_IO: bad/missing sense data, sb[]: f0 00 02 00 00 00 00 0b 00 00 00 00 3a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

    ATA device, with non-removable media
    Standards:
    Likely used: 1
    Configuration:
    Logical max current
    cylinders 0 0
    heads 0 0
    sectors/track 0 0

    Logical/Physical Sector size: 512 bytes
    device size with M = 1024*1024: 0 MBytes
    device size with M = 1000*1000: 0 MBytes
    cache/buffer size = unknown
    Capabilities:
    IORDY not likely
    Cannot perform double-word IO
    R/W multiple sector transfer: not supported
    DMA: not supported
    PIO: pio0

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.