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
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 gustaMe gusta
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 gustaMe gusta
Gracias Alberto. Me parece muy útil. Espero con expectación tus lecciones sobre lvm2 :-)
Me gustaMe gusta
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 gustaMe gusta
Es correcto que el propietario de un volumen lógico sea root, si quieres utilizarlo con otro usuario lo más habitual es configurar sudo
Me gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta