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.


Tal vez pueda interesarte


Compartí este artículo