miércoles, 27 de marzo de 2013

Creando dispositivos loop con losetup


En UNIX, un dispositivo loop es un dispositivo de bloques virtual que apunta a un fichero normal y corriente de nuestro sistema de ficheros. Esto significa que podemos dar a un fichero la apariencia de ser un disco duro para el resto del sistema.  En Linux, estos dispositivos son /dev/loop0, /dev/loop1, etc...

Su uso más habitual siempre ha sido montar ficheros ISO (imágenes de CD y DVD) mediante el comando mount -o loop, pero también se puede usar para manipular ficheros como si fuesen un disco duro; particionarlos, formatearlos y montar esos sistemas de ficheros entre otras cosas.

Un dispositivo loop es muy útil para recuperación de datos, por ejemplo, cuando un disco duro está fallando y volcamos su contenido en un fichero. Podemos crear un dispositivo loop que apunte al fichero y después ejecutar herramientas de recuperación sobre los datos, como por ejemplo fsck. Otra situación en la que también es muy útil es para acceder al contenido de los discos duros de máquinas virtuales sin tener que arrancar la maquina virtual. Los discos duros raw que utiliza KVM son imágenes exactas de un disco duro y perfectos para utilizarlos con losetup.


Para enlazar el dispositivo loop1 a un fichero llamado fichero.raw ejecutamos lo siguiente
$ sudo losetup /dev/loop1 fichero.raw
Otra opción es utilizar el fichero loop más bajo disponible con la opción -f, y que nos diga que dispositivo loop ha utilizado con la opción --show. Si usamos -r el dispositivo funciona en modo de solo lectura.
$ sudo losetup -r -f --show fichero.raw
/dev/loop0
En un momento dado, podemos ver todos los dispositivos loop que estamos utilizando con
$ sudo losetup -a
/dev/loop0: [fc00]:9963478 (~/fichero.raw)
Y una vez hayamos terminado de trabajar con el dispositivo lo desenlazamos con -d
$ sudo losetup -d /dev/loop0
Otra característica muy interesante es poder enlazar de dispositivo loop con una parte del fichero, por ejemplo con la parte que corresponde una partición, y no con el fichero entero.
$ sudo losetup -o <offset bytes> --sizelimit <size bytes> <loopdev> <fichero>
El offset es, contando desde el principio del fichero, el byte que se corresponderá con el primero del dispositivo loop. Con sizelimit indicamos cuantos bytes se van a enlazar contando desde el offset

Ahora ponemos en práctica lo aprendido. Creamos un fichero de 10 GiB y lo enlazamos con /dev/loop0
ramhux@bitbang:~$ dd if=/dev/zero of=fichero.raw bs=1GiB count=10

10+0 records in
10+0 records out
10737418240 bytes (11 GB) copied, 98.2422 s, 109 MB/s
ramhux@bitbang:~$ sudo losetup -f --show fichero.raw
/dev/loop0
Despues creamos dos particiones, una de 2 GiB y otra de 8 GiB, y vemos como aparecen dispositivos representando las particiones.
ramhux@bitbang:~$ sudo parted /dev/loop0
GNU Parted 2.3
Using /dev/loop0
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel msdos
(parted) mkpart primary 0GiB 2GiB
(parted) mkpart primary 2GiB 10GiB
(parted) quit
Information: You may need to update /etc/fstab.

ramhux@bitbang:~$ ls /dev/loop0*
/dev/loop0 /dev/loop0p1 /dev/loop0p2
Formateamos la partición de 8GiB en ext4, la montamos en /mnt, y vemos el espacio disponible
ramhux@bitbang:~$ sudo mkfs.ext4 -q /dev/loop0p2
ramhux@bitbang:~$ sudo mount /dev/loop0p2 /mnt
ramhux@bitbang:~$ df -h | grep mnt
/dev/loop0p2               7.9G  146M  7.4G   2% /mnt
Enlazamos un nuevo fichero loop que corresponde a la primera partición, y lo formateamos en ext2. Los valores del offset y sizelimit los veo en la tabla de particiones
ramhux@bitbang:~$ sudo parted /dev/loop0 unit b print
Model: Loopback device (loop)
Disk /dev/loop0: 10737418240B
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start        End           Size         Type     File system  Flags
 1      1048576B     2147483647B   2146435072B  primary
 2      2147483648B  10737418239B  8589934592B  primary  ext4

ramhux@bitbang:~$ sudo losetup -o 1048576 --sizelimit 2146435072 /dev/loop1 fichero.raw
ramhux@bitbang:~$ sudo mkfs.ext2 -q /dev/loop1
Comprobamos que los cambios hechos en /dev/loop1 también se reflejan de /dev/loop0 (ahora aparece el sistema de ficheros)
ramhux@bitbang:~$ sudo parted /dev/loop0 print
Model: Loopback device (loop)
Disk /dev/loop0: 10737418240B
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start        End           Size         Type     File system  Flags
 1      1048576B     2147483647B   2146435072B  primary  ext2
 2      2147483648B  10737418239B  8589934592B  primary  ext4

Por ultimo desmontamos y desenlazamos el dispositivo
ramhux@bitbang:~$ sudo umount /mnt
ramhux@bitbang:~$ sudo losetup -d /dev/loop0
ramhux@bitbang:~$ sudo losetup -d /dev/loop1

Referencias

http://manpages.ubuntu.com/manpages/precise/man8/losetup.8.html

No hay comentarios:

Publicar un comentario