En varias oportunidades hablé sobre particionado de discos desde línea de comandos en sistemas operativos de la familia Unix. Se trata de una de las tareas básicas en lo que respecta a la gestión de almacenamiento y discos. Recapitulando, los artículos Particionado manual de discos en GNU/Linux y Cómo redimensionar una partición con fdisk demuestran cómo se manipulan tablas de particiones MBR empleando las herramientas cfdisk
y fdisk
respectivamente. Luego Particionado de discos con gpart en FreeBSD y Particionar discos GPT en Linux con gdisk explican cómo crear y manipular tablas GPT en FreeBSD y Linux respectivamente.
Sin embargo, nunca he demostrado el uso de la herramienta de particionado de discos más popular: GNU Parted. Pues ha llegado la hora.
GNU Parted es una herramienta de particionado (manipulación de tablas de particiones) de diferentes formatos. Permite inicializar discos para instalar sistemas operativos, reorganizar el uso del espacio de disco, redimensionar particiones, etc.
Partiendo de un disco en blanco (sin tabla de particiones), el objetivo es inicializar una tabla de particiones MBR y crear dos particiones primarias: una para el sistema de archivos raíz y otra para el área de intercambio de memoria (swap).
El primer paso consiste en detectar el nombre de dispositivo que corresponde con el disco en cuestión. Para ello, basta con examinar el ring buffer del kernel Linux con dmesg
:
root@devuan:/home/emi# dmesg | grep "SCSI disk" [ 1.503864] sd 3:0:0:0: [sdb] Attached SCSI disk [ 1.503940] sd 2:0:0:0: [sda] Attached SCSI disk
Para iniciar GNU Parted, simplemente ejecutar parted
pasando la ruta al dispositivo que se desea particionar/manipular como parámetro:
root@devuan:/home/emi# parted /dev/sdb GNU Parted 3.2 Using /dev/sdb Welcome to GNU Parted! Type 'help' to view a list of commands. (parted)
Mediante el subcomando help
es posible acceder a una lista de subcomandos disponibles:
(parted) help align-check TYPE N check partition N for TYPE(min|opt) alignment help [COMMAND] print general help, or help on COMMAND mklabel,mktable LABEL-TYPE create a new disklabel (partition table) mkpart PART-TYPE [FS-TYPE] START END make a partition name NUMBER NAME name partition NUMBER as NAME print [devices|free|list,all|NUMBER] display the partition table, available devices, free space, all found partitions, or a particular partition quit exit program rescue START END rescue a lost partition near START and END resizepart NUMBER END resize partition NUMBER rm NUMBER delete partition NUMBER select DEVICE choose the device to edit disk_set FLAG STATE change the FLAG on selected device disk_toggle [FLAG] toggle the state of FLAG on selected device set NUMBER FLAG STATE change the FLAG on partition NUMBER toggle [NUMBER [FLAG]] toggle the state of FLAG on partition NUMBER unit UNIT set the default unit to UNIT version display the version number and copyright information of GNU Parted
Al intentar imprimir la tabla de particiones, se observa que no contiene tabla de particiones alguna:
(parted) print Error: /dev/sdb: unrecognised disk label Model: ATA VBOX HARDDISK (scsi) Disk /dev/sdb: 8590MB Sector size (logical/physical): 512B/512B Partition Table: unknown Disk Flags:
Notar el mensaje de error "unrecognised disk label" y la tabla de particiones "unknown".
Por lo tanto lo primero que se debe hacer es inicializar una nueva tabla de particiones vacía. El subcomando help
admite otro subcomando como parámetro, con el fin de obtener ayuda detallada sobre un subcomando en particular:
(parted) help mklabel mklabel,mktable LABEL-TYPE create a new disklabel (partition table) LABEL-TYPE is one of: atari, aix, amiga, bsd, dvh, gpt, mac, msdos, pc98, sun, loop
Para inicializar una tabla de particiones se debe ejecutar mklabel
pasando el tipo como parámetro. Para inicializar una de tipo MBR, pasar "msdos" como parámetro:
(parted) mklabel msdos
Ahora contamos con una tabla MBR vacía (todo el espacio de disco está disponible/libre:
(parted) print free Model: ATA VBOX HARDDISK (scsi) Disk /dev/sdb: 8590MB Sector size (logical/physical): 512B/512B Partition Table: msdos Disk Flags: Number Start End Size Type File system Flags 32,3kB 8590MB 8590MB Free Space
Para crear una partición se debe utilizar el subcomando mkpart
:
(parted) help mkpart mkpart PART-TYPE [FS-TYPE] START END make a partition PART-TYPE is one of: primary, logical, extended FS-TYPE is one of: zfs, btrfs, nilfs2, ext4, ext3, ext2, fat32, fat16, hfsx, hfs+, hfs, jfs, swsusp, linux-swap(v1), linux-swap(v0), ntfs, reiserfs, freebsd-ufs, hp-ufs, sun-ufs, xfs, apfs2, apfs1, asfs, amufs5, amufs4, amufs3, amufs2, amufs1, amufs0, amufs, affs7, affs6, affs5, affs4, affs3, affs2, affs1, affs0, linux-swap, linux-swap(new), linux-swap(old) START and END are disk locations, such as 4GB or 10%. Negative values count from the end of the disk. For example, -1s specifies exactly the last sector. 'mkpart' makes a partition without creating a new file system on the partition. FS-TYPE may be specified to set an appropriate partition ID.
El disco cuenta con poco más de 8 GB de espacio libre. Entonces, para crear una partición primaria de 7 GB y tipo ext4, ejecutar:
(parted) mkpart primary ext4 1 7GB
La partición comienza en el primer bloque y termina a los 7 GB:
(parted) print free Model: ATA VBOX HARDDISK (scsi) Disk /dev/sdb: 8590MB Sector size (logical/physical): 512B/512B Partition Table: msdos Disk Flags: Number Start End Size Type File system Flags 32,3kB 1049kB 1016kB Free Space 1 1049kB 7000MB 6999MB primary ext4 lba 7000MB 8590MB 1590MB Free Space
Luego creo una segunda partición, también primaria, que utilice el resto del espacio libre y que sea de tipo "linux-swap":
(parted) mkpart primary linux-swap 7GB -1
La partición comienza luego de 7 GB y finaliza en el último bloque (-1). Esto es poco preciso en comparación a otras herramientas de particionado como cfdisk
o fdisk
.
El espacio libre al comienzo y fin se debe a que las particiones quedan alineadas para mejor rendimiento:
(parted) print free Model: ATA VBOX HARDDISK (scsi) Disk /dev/sdb: 8590MB Sector size (logical/physical): 512B/512B Partition Table: msdos Disk Flags: Number Start End Size Type File system Flags 32,3kB 1049kB 1016kB Free Space 1 1049kB 7000MB 6999MB primary ext4 lba 2 7000MB 8589MB 1589MB primary linux-swap(v1) lba 8589MB 8590MB 1049kB Free Space
Notar que en la ayuda no figura un comando para escribir la nueva tabla de particiones a disco. Esto se debe a que ¡los cambios se escriben inmediatamente a disco con cada subcomando!
(parted) quit Information: You may need to update /etc/fstab.
Al cerrar la aplicación, es posible comprobar que los cambios han sido realizados con éxito:
root@devuan:~# fdisk -l /dev/sdb Disco /dev/sdb: 8 GiB, 8589934592 bytes, 16777216 sectores Unidades: sectores de 1 * 512 = 512 bytes Tamaño de sector (lógico/físico): 512 bytes / 512 bytes Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes Tipo de etiqueta de disco: dos Identificador del disco: 0x5a0a8798 Disposit. Inicio Comienzo Final Sectores Tamaño Id Tipo /dev/sdb1 2048 13672447 13670400 6,5G 83 Linux /dev/sdb2 13672448 16775167 3102720 1,5G 82 Linux swap / Solaris
Comparado con otras herramientas de particionado, el método para crear particiones que utiliza parted
resulta ambiguo y propenso a erres. Sin contar con que los cambios se escriben inmediatamente a disco sin pedir confirmación. Por ambas razones desaconsejo su uso y recomiendo otras herramientas más precisas y seguras como fdisk
o cfdisk
para tablas MBR, y gdisk
/gpart
para tablas GPT.
La única ventaja que tiene parted
es la capacidad de expresar los valores de comienzo y fin en unidades amigables (en vez de sectores, aunque de todas formas es una característica que poseen otros utilitarios como cfdisk
). Y además la posibilidad de redimensionar particiones con el subcomando resizepart
(tarea que se puede realizar perfectamente con fdisk
, tal como he explicado en el artículo Cómo redimensionar una partición con fdisk).
Sin embargo nunca está de más aprender a utilizar una nueva herramienta, ya que no sabemos cuándo necesitaremos utilizarla para resolver un problema en un caso de emergencia.