Discos virtuales para aprender a particionar


Una de las primeras cosas que deben conocer los aprendices de administradores de sistemas es el particionado de discos duros. El particionado de discos es el procedimiento que se utiliza para dividir un disco duro en varios «trozos». Cada uno de estos «trozos», denominados particiones, puede utilizarse para alojar un sistema de ficheros diferente y por tanto permite una gestión mucho más adecuada del almacenamiento, sobre todo cuando el tamaño de los discos es grande.

Para hacer prácticas de particionado de discos, lo lógico es utilizar un disco duro auxiliar en el que no haya ninguna información relevante y en este entrada se explica cómo hacerlo en GNU/Linux mediante un disco duro virtual, que en este caso no es más que un fichero de imagen en formato raw como los que se utilizan habitualmente en sistemas virtuales.

Creación del disco virtual

Los discos duros son dispositivos de bloque en los que la información se mueve en bloques de un determinado tamaño, no bit a bit, siendo 512 bytes el tamaño más habitual de estos bloques. Por tanto, un disco duro virtual debe crearse con un número exacto de sectores (un múltiplo de 512 bytes). De esta manera, si queremos crear un disco virtual de 1 GiB con bloques de 512 bytes, tendremos un total de 2097152 bloques:

1 GiB = 2^30 bytes
1 bloque = 512 bytes = 2^9 bytes
2^30/2^9 = 2^21 = 2097152

Ahora utilizamos la instrucción dd para crear el fichero de la siguiente manera:

$ dd if=/dev/zero of=disco-virtual.img bs=512 count=2097152

que producirá como resultado un fichero de nombre disco-virtual.img, de 1 GiB de tamaño y «vacío» (lleno de ceros):

$ ls -hl
-rw-r--r--  1 alberto alberto 1,0G ene 19 16:59 disco-virtual.img

Para que el sistema trate el fichero como un dispositivo de bloques y no como un fichero normal, vamos a utilizar la instrucción losetup que asocia el fichero que le demos al primer dispositivo loop disponible, procedimiento que deberemos realizar como root:

# losetup -vf disco-virtual.img
Loop device is /dev/loop0

En el paso anterior hemos utilizado el parámetro -v (verbose) para saber el dispositivo al que se ha asociado el disco virtual (/dev/loop0 en este caso) y -f para asociar el primer dispositivo loop libre al disco virtual.

Creación de MBR y particionado con fdisk

El siguiente ingrediente a utilizar es fdisk. Con él, crearemos una tabla de particiones tipo DOS, conocida como Master Boot Record (MBR). Para ello, tras ejecutar fdisk sobre el dispositivo /dev/loop0, utilizaremos la opción “o” de dicho comando que nos crea una tabla de particiones DOS vacía y una vez ejecutada dicha opción, guardaremos los datos seleccionando la opción “w”:

# fdisk /dev/loop0 
El dispositivo no contiene una tabla de particiones DOS válida ni una etiqueta de disco Sun o SGI o OSF
Building a new DOS disklabel with disk identifier 0x107979b1.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Atención: el indicador 0x0000 inválido de la tabla de particiones 4 se corregirá mediante w(rite)

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Orden (m para obtener ayuda): o
Building a new DOS disklabel with disk identifier 0x76be0987.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Atención: el indicador 0x0000 inválido de la tabla de particiones 4 se corregirá mediante w(rite)

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Orden (m para obtener ayuda): w
¡Se ha modificado la tabla de particiones!

Llamando a ioctl() para volver a leer la tabla de particiones.

WARNING: Re-reading the partition table failed with error 22: Argumento inválido.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Se están sincronizando los discos.

Ya tenemos nuestro fichero disco-virtual asociado al dispositivo /dev/loop0 y con un MBR escrito en su primer bloque. Podemos hacer uso de fdisk de forma habitual y crear las particiones que estimemos necesarias, por ejemplo:

# fdisk /dev/loop0 

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Orden (m para obtener ayuda): n
Acción de la orden
e   Partición extendida
   p   Partición primaria (1-4)
p
Número de partición (1-4): 1
Primer cilindro (1-130, valor predeterminado 1): 1
Last cilindro, +cilindros or +size{K,M,G} (1-130, valor predeterminado 130): +250M

Orden (m para obtener ayuda): n
Acción de la orden
e   Partición extendida
   p   Partición primaria (1-4)
e
Número de partición (1-4): 2
Primer cilindro (34-130, valor predeterminado 34): 34
Last cilindro, +cilindros or +size{K,M,G} (34-130, valor predeterminado 130): 
Se está utilizando el valor predeterminado 130

Orden (m para obtener ayuda): n
Acción de la orden
l   Partición lógica (5 o superior)
   p   Partición primaria (1-4)
l
Primer cilindro (34-130, valor predeterminado 34): 
Se está utilizando el valor predeterminado 34
Last cilindro, +cilindros or +size{K,M,G} (34-130, valor predeterminado 130): +300M

Orden (m para obtener ayuda): p

Disco /dev/loop0: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders
Units = cilindros of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x76be0987

   Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema
/dev/loop0p1               1          33      265041   83  Linux
/dev/loop0p2              34         130      779152+   5  Extendida
/dev/loop0p5              34          72      313236   83  Linux
Orden (m para obtener ayuda): w
¡Se ha modificado la tabla de particiones!

Llamando a ioctl() para volver a leer la tabla de particiones.

WARNING: Re-reading the partition table failed with error 22: Argumento inválido.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Se están sincronizando los discos.

Sin embargo el último mensaje nos indica que las particiones recién creadas no están disponibles hasta que reiniciemos o hasta que forcemos al sistema a releer la tabla de particiones con partprobe o kpartx. Vamos a utilizar esta última opción, para lo que deberemos instalar el paquete kpartx previamente y cargar en memoria el módulo dm-mod:

# modprobe dm-mod

Ahora utilizamos kpartx para asociar las particiones a dispositivos tipo mapper:

# kpartx -av /dev/loop0
add map loop0p1 (254:7): 0 530082 linear /dev/loop0 63
add map loop0p2 (254:8): 0 1558305 linear /dev/loop0 530145
add map loop0p5 : 0 626472 linear 254:8 63
# ls -l /dev/mapper/
total 0
crw------- 1 root root 10, 59 ene 19 16:04 control
lrwxrwxrwx 1 root root      7 ene 19 17:40 loop0p1 -> ../dm-0
lrwxrwxrwx 1 root root      7 ene 19 17:40 loop0p2 -> ../dm-1
lrwxrwxrwx 1 root root      7 ene 19 17:40 loop0p5 -> ../dm-2

Y podremos utilizar estos últimos para formatearlos, montarlos,etc.

Si crees que esto es útil vas a flipar cuando utilices LVM2 ;)

Referencias

La mayor parte de esta entrada se debe a la magnífica The Linux Sysadmins Guide to Virtual Disks

Una buena parte de esta entrada está escrita/verificada por mi compañero de Departamento David Sánchez López

Discos virtuales para aprender a particionar

7 comentarios en “Discos virtuales para aprender a particionar

  1. Hola Alberto!

    Buen post! Leyéndolo me he acordado de una vez que tuve que hacer uso de dd para crear un volumen lógico en un servidor de correos muy muy antiguo.

    El caso es que la partición donde se encontraba el correo se quedaba pequeña, entonces la solución fue utilizar otra partición para alojar el correo, pero claro, no quería que se me llenase la partición en cuestión de horas o días, así que lo que hice fue crearme un volumen lógico con dd de unos cuantos GB y así pude salir del paso :-)

    Un abrazo!
    Manu.

    Me gusta

    1. Hola Manu!

      Seguro que ten habrás encontrado en esa situación y otras muchas en que tuvieras que tirar de dd o de muchas cosas de las que se habla aquí.

      He escrito esta entrada porque este año hemos intriducido un tema muy amplio de almacenamiento en 1º ASIR: particionado, LVM2, Sistemas de ficheros diversos (esperemos que podamos ver ZFS), RAID y almacenamiento compartido (DAS, NAS y SAN iSCSI). En la medida que me sea posible iré poniendo nuevas entradas sobre el tema.

      Saludos!!

      Me gusta

  2. daniel nunez dijo:

    buenos dias disculpen pero a mi me crea un volumen logico pero no se puede escribir queda asociado a root, como haria para cambiar propietario ? espero su respuesta gracias

    Me gusta

  3. danuel nunez dijo:

    buenas después de crear el .img con las particiones que quería trato de montarlo en un loop y no me deja tengo que formatear el .img con ntfs o ext3 para que lo agarre? ahora despues de que lo monte lo llamo con kpartx ? espero su respuesta gracias

    Me gusta

    1. Hola Daniel, no sé exactamente a qué problema te refieres. Tras ejecutar la instrucción «losetup -vf …» tenemos un dispositivo de bloques en un dispositivo de loopback, lo más probable es que si no utilizas dispositivos loopback para otra cosa, sea el dispositivo /dev/loop0. A partir de ahí puedes utilizar ese dispositivo como un disco limpio al que particionar, formatear, etc.

      Me gusta

Deja un comentario