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 2 3 |
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:
1 |
$ 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):
1 2 |
$ 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:
1 2 |
# 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”:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
# 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:
1 |
# modprobe dm-mod |
Ahora utilizamos kpartx para asociar las particiones a dispositivos tipo mapper:
1 2 3 4 5 6 7 8 9 10 |
# 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.