Escribir imágenes crudas de forma segura en memorys USB

Probando muchos linux diferentes, en todo tipo de hardware, mis commands de autodescripción son muy frecuentes:

sudo dd if=xubuntu-13.10-desktop-amd64.iso of=/dev/sdc bs=10240 

Huelga decir que, tarde o temprano voy a escribir mal el destino y limpiar un disco duro en lugar de la unidad USB prevista. Me gustaría no usar sudo cada vez aquí.

En mi sistema, un Ubuntu bastante moderno, los permissions en /dev/sdc son como: (cuando hay un stick presente):

 $ ls -al /dev/sdc* brw-rw---- 1 root disk 8, 32 Apr 6 22:10 /dev/sdc 

¿Cómo otorgo a mi usuario habitual acceso de escritura a memorys USB aleatorias pero no a otros discos presentes en mi sistema?

Creo que puedes usar UDEV para hacer lo que quieras. Al crear un file de reglas como /etc/udev/rules.d/99-thumbdrives.rules , simplemente debe agregar una regla que permita que un grupo Unix o el usuario accedan a memorys USB arbitrarias.

 KERNEL=="sd*", SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", OWNER="<user>", GROUP="<group>", MODE="0660" 

Crearía el dispositivo usando el usuario <user> y el grupo <group> .

Ejemplo

  1. Después de agregar esta línea a mi sistema.

     KERNEL=="sd*", SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", OWNER="saml", GROUP="saml", MODE="0660" 
  2. Y recargando mis reglas:

     $ sudo udevadm control --reload-rules 
  3. Si ahora inserto una unidad de almacenamiento en mi sistema, mi /var/log/messages aparece de la siguiente manera:

     $ sudo tail -f /var/log/messages Apr 13 11:48:45 greeneggs udisksd[2249]: Mounted /dev/sdb1 at /run/media/saml/HOLA on behalf of uid 1000 Apr 13 11:51:18 greeneggs udisksd[2249]: Cleaning up mount point /run/media/saml/HOLA (device 8:17 is not mounted) Apr 13 11:51:18 greeneggs udisksd[2249]: Unmounted /dev/sdb1 on behalf of uid 1000 Apr 13 11:51:18 greeneggs kernel: [171038.843969] sdb: detected capacity change from 32768000 to 0 Apr 13 11:51:39 greeneggs kernel: [171058.964358] usb 2-1.2: USB disconnect, device number 15 Apr 13 11:51:46 greeneggs kernel: [171066.053922] usb 2-1.2: new full-speed USB device number 16 using ehci-pci Apr 13 11:51:46 greeneggs kernel: [171066.134401] usb 2-1.2: New USB device found, idVendor=058f, idProduct=9380 Apr 13 11:51:46 greeneggs kernel: [171066.134407] usb 2-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0 Apr 13 11:51:46 greeneggs kernel: [171066.134410] usb 2-1.2: Product: USBDrive Apr 13 11:51:46 greeneggs kernel: [171066.134412] usb 2-1.2: Manufacturer: JMTek Apr 13 11:51:46 greeneggs kernel: [171066.135470] usb-storage 2-1.2:1.0: USB Mass Storage device detected Apr 13 11:51:46 greeneggs kernel: [171066.136121] scsi17 : usb-storage 2-1.2:1.0 Apr 13 11:51:46 greeneggs mtp-probe: checking bus 2, device 16: "/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2" Apr 13 11:51:46 greeneggs mtp-probe: bus: 2, device: 16 was not an MTP device Apr 13 11:51:47 greeneggs kernel: [171067.139462] scsi 17:0:0:0: Direct-Access JMTek USBDrive 7.77 PQ: 0 ANSI: 2 Apr 13 11:51:47 greeneggs kernel: [171067.140251] sd 17:0:0:0: Attached scsi generic sg2 type 0 Apr 13 11:51:47 greeneggs kernel: [171067.142105] sd 17:0:0:0: [sdb] 64000 512-byte logical blocks: (32.7 MB/31.2 MiB) Apr 13 11:51:47 greeneggs kernel: [171067.144236] sd 17:0:0:0: [sdb] Write Protect is off Apr 13 11:51:47 greeneggs kernel: [171067.145988] sd 17:0:0:0: [sdb] No Caching mode page found Apr 13 11:51:47 greeneggs kernel: [171067.145998] sd 17:0:0:0: [sdb] Assuming drive cache: write through Apr 13 11:51:47 greeneggs kernel: [171067.153721] sd 17:0:0:0: [sdb] No Caching mode page found Apr 13 11:51:47 greeneggs kernel: [171067.153728] sd 17:0:0:0: [sdb] Assuming drive cache: write through Apr 13 11:51:47 greeneggs kernel: [171067.159028] sdb: sdb1 Apr 13 11:51:47 greeneggs kernel: [171067.164760] sd 17:0:0:0: [sdb] No Caching mode page found Apr 13 11:51:47 greeneggs kernel: [171067.164768] sd 17:0:0:0: [sdb] Assuming drive cache: write through Apr 13 11:51:47 greeneggs kernel: [171067.164775] sd 17:0:0:0: [sdb] Attached SCSI removable disk Apr 13 11:51:47 greeneggs kernel: [171067.635474] FAT-fs (sdb1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck. Apr 13 11:51:47 greeneggs udisksd[2249]: Mounted /dev/sdb1 at /run/media/saml/HOLA on behalf of uid 1000 
  4. Ahora, verificando los files del dispositivo en /dev muestra lo siguiente:

     $ ls -l /dev/sd* brw-rw----. 1 root disk 8, 0 Apr 13 09:17 /dev/sda brw-rw----. 1 root disk 8, 1 Apr 13 09:17 /dev/sda1 brw-rw----. 1 root disk 8, 2 Apr 13 09:17 /dev/sda2 brw-rw----. 1 saml saml 8, 16 Apr 13 11:51 /dev/sdb brw-rw----. 1 root disk 8, 17 Apr 13 11:51 /dev/sdb1 

Entonces parece que funcionó.

Siendo más explícito

Lo anterior funcionará pero es probable que estas reglas se apliquen a cada dispositivo de bloque que no sea exactamente lo que queremos. Para restringir un poco su enfoque, puede usar las reglas de atributo ATTRS{..}==... para restringir la aplicación a hardware específico. En mi caso, solo quiero que se aplique a un solo dispositivo USB thumbdrive.

Paso # 1 – dispositivo de identificación única

Entonces, para comenzar, podemos usar este command una vez que hayamos montado la unidad de udevadm en particular, de modo que podamos usar udevadm para analizarla, buscando sus attributes particulares.

Aquí me estoy enfocando en mirar los attributes de "fabricante" y "producto".

 $ udevadm info -a -p $(udevadm info -q path -n /dev/sdb)|grep -iE "manufacturer|product" ATTRS{manufacturer}=="JMTek" ATTRS{idProduct}=="9380" ATTRS{product}=="USBDrive" ATTRS{idProduct}=="0020" ATTRS{manufacturer}=="Linux 3.13.7-100.fc19.x86_64 ehci_hcd" ATTRS{idProduct}=="0002" ATTRS{product}=="EHCI Host Controller" 

NOTA: Los ATTRS{..}==.. son attributes para dispositivos principales en la jerarquía de donde se deriva el file de dispositivo de este dispositivo. Entonces, en nuestro caso, el dispositivo de bloque agregado, /dev/sdb proviene de un dispositivo padre USB, por lo que estamos buscando los attributes de este padre, ATTRS{manufacturer}=... , por ejemplo.

Entonces, en este ejemplo estoy seleccionando el fabricante "JMTek" y el producto "USBDrive".

Paso # 2 – modificar .rules flie

Entonces, con estos bits adicionales en la mano, vamos a agregarlos a nuestro file .rules original.

 KERNEL=="sd*", SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", ATTRS{manufacturer}=="JMTek", ATTRS{product}=="USBDrive", OWNER="saml", GROUP="saml", MODE="0660" 

Paso # 3 – Probándolo

Ahora cuando volvemos a cargar nuestras reglas y desmontamos / quitamos / reinsertamos nuestra memory USB de nuevo, obtenemos esta regla:

 $ ls -l /dev/sdb* brw-rw----. 1 saml saml 8, 16 Apr 13 12:29 /dev/sdb brw-rw----. 1 root disk 8, 17 Apr 13 12:29 /dev/sdb1 

Sin embargo, si inserto un dispositivo completamente diferente:

 $ ls -l /dev/sdb* brw-rw----. 1 root disk 8, 16 Apr 13 12:41 /dev/sdb brw-rw----. 1 root disk 8, 17 Apr 13 12:41 /dev/sdb1 

Referencias

  • ArchLinux Wiki UDEV Tema