Cambiar el tamaño en vivo de una partición GPT en Linux


12

En Linux solía cambiar el tamaño de las particiones MBR usando fdisk, incluso en sistemas de archivos en vivo, y luego emitía un resize2fs / pvresize / ... (dependiendo del tipo fs) para obtener el nuevo espacio asignado.

Últimamente he estado usando particiones Xen y GPT, y he notado que desafortunadamente las particiones no parecen permitir cambiar el tamaño de una partición montada sobre la marcha, de hecho, se quejará:

Error: Partition XXX is being used. You must unmount it before you modify it with Parted.

He intentado tanto el resizecomando como la combinación rm+ mkpart, pero ambos se quejarán de la partición que se está montando.

¿Cómo puedo hacer eso?


Una forma disponible de
fábrica

Respuestas:


12

La forma más segura de hacerlo es arrancar usando un medio de emergencia (un CD en vivo o similar) y usar GParted, que redimensionará tanto la partición como el sistema de archivos que contiene. Sin embargo, esto solo funcionará si la partición no se está utilizando actualmente.

Sin embargo, si no puede permitirse ningún tiempo de inactividad, puede intentar usarlo en gdisklugar de hacerlo parted. Tendrá que eliminar la partición que desea cambiar de tamaño y crear una nueva en su lugar con el mismo punto de inicio, tal como lo habría hecho fdisk. gdiskestá dispuesto a trabajar en un disco en uso, aunque el núcleo podría no registrar ningún cambio. En ese caso, es posible que necesite usar partprobeo kpartxhacer que el núcleo acepte la nueva tabla de particiones, o incluso reiniciar la computadora si eso no funciona. (Todo esto debería ser bastante similar al uso fdisk).


Se ve bien, pero no está incluido por defecto en CentOS. ¿Alguna otra forma estándar? Quiero decir, un sistema similar a un redhat debería poder cambiar el tamaño sin depender de programas externos
cyberz

2
No hay ninguna herramienta que se envíe con CentOS que haga el trabajo. Usted debe salir de los CentOS repositorio para hacer lo que quiera. Tenga en cuenta que casi todas las demás distribuciones (incluida Fedora) se incluyen gdisken sus repositorios, y he oído que gdiskse incluirán en la próxima versión de RHEL (y, por lo tanto, de CentOS).
Rod Smith

Gracias por la respuesta y el comentario, es exactamente la información que estaba buscando
cyberz

1
gdiskEstá disponible en EPEL.
jornane

Intenté ambos partxy partprobefinalmente tuve que reiniciar. Gracias de todos modos por esos consejos
Alexandre Bourlier

10

Esto generalmente solo funciona con distribuciones de Linux más recientes. Herramientas necesarias:

  • Sonda parcial (generalmente parte de parte)
  • gdisk / sgdisk

Una partición GPT almacena un encabezado de respaldo al final del disco. Si ha cambiado el tamaño del dispositivo subyacente, el encabezado de la copia de seguridad estará en algún lugar en el medio. El primer paso es mover el encabezado de la partición al final del disco.

Suponiendo que el disco es / dev / sda y la partición es / dev / sda3 (también debe ser la última partición):

sgdisk -e /dev/sda

Luego elimine la última partición y vuelva a crearla:

sgdisk -d 3 /dev/sda
sgdisk -N 3 /dev/sda

Por lo general, verá un mensaje que indica que el núcleo no puede volver a cargar la tabla de particiones. Debe ejecutar partprobe para que la partición se registre con el nuevo tamaño:

partprobe /dev/sda

Si esto no tiene éxito, tendrá que reiniciar la máquina virtual. Después de eso, puede hacer crecer su sistema de archivos con la herramienta adecuada, para ext4, etc.

resize2fs /dev/sda3

Precaución : ejecutar sgdisk puede ser destructivo. Asegúrese de contar con los procedimientos de respaldo adecuados.


¡Increíble! Gracias especialmente por el partprobepaso: siempre pensé que era necesario reiniciar al modificar la tabla de particiones con cualquier partición montada.
piit79

Tenga en cuenta que destruir y volver a crear la partición generará un nuevo PARTUUID para la partición, que de otro modo es la única forma confiable e independiente del sistema de archivos para que fstab / GRUB / etc. identifique particiones de manera confiable en configuraciones de discos múltiples.
Teo Klestrup Röijezon

5

Aquí hay un ejemplo que una herramienta automatizada utiliza para cambiar el tamaño de una partición en línea, en una sola ejecución:

sgdisk -d 1 -n 1: 2048: 0 -c 1: -u 1: E485F29F-A1F4-4953-9DD8-799EAEA0119B -t 1: 0700 / dev / xvda

Aquí hay una lista de opciones para el comando sgdisk:

  • -d 1 eliminar la primera partición
  • -n 1: 2048: 0 dice crear nueva partición "número 1", con el sector inicial 2048. Fin sector = "0" que significa "usar todo el espacio disponible para esta partición
  • -u establece un guid único para esa partición (esto es específico para particiones GPT); puede usar 'R' para que GUID se establezca en un valor aleatorio. También puede obtener la identificación de las particiones actuales a través de la gdisk /dev/xvda; psalida para reutilizar el mismo uid
  • -t 1: 0700 básicamente significa que la primera partición es del código de tipo '0700'.

/ dev / xvda fue el disco que reparticionamos.

Por lo tanto, elimina y crea una nueva partición en su lugar de inmediato.

PD. Algunas notas sobre el código de tipo '0700'. Del hombre SGDISK (8)

   -t, --typecode=partnum:{hexcode|GUID}
          Change a single partition's type  code.  You  enter  the  type  code  using  either  a  two-byte  hexadecimal  number,  as 

descrito anteriormente, o un valor GUID completamente especificado, como EBD0A0A2-B9E5-4433-87C0-68B6B72699C7.

Encontramos la mejor explicación de lo que significa '0700' aquí: http://www.rodsbooks.com/gdisk/walkthrough.html

"Pero espera", dices, "¡pensé que el disco tenía una partición FAT!" De hecho lo hace. Windows usa un único código GUID para todas sus particiones de datos, ya sean FAT o NTFS. En el pasado, se usaba el mismo código en Linux para sus particiones de datos. (Más sobre esto en breve ....) Por lo tanto, en este caso, varios códigos MBR diferentes se traducen en un solo código GUID GPT. GPT fdisk utiliza, de forma algo arbitraria, el código 0x0700 (o más precisamente, EBD0A0A2-B9E5-4433-87C0-68B6B72699C7) para todos estos.

En mi caso, creo que era una partición ext4 de Linux, pero el código de tipo de partición no significa el tipo de sistema de archivos, por lo que '0700' se parece más a un tipo catchall para sgdisk. Al menos en los casos que he visto.

PPS Es posible que deba ejecutar el partprobekernel para darse cuenta del cambio de partición sin reiniciar el sistema.


'p' le mostrará el UUID del disco. 'i' le mostrará el UUID de una partición.
Keith

2

Solo estoy resumiendo algunas respuestas y comentarios aquí:

partedsimplemente se negará a cambiar cualquier partición montada. gdiskhará el trabajo por usted, pero no está en el repositorio estándar de RHEL o CentOS. Sin embargo, está en el repositorio EPEL .

Tenga en cuenta que cambiar las particiones en un disco que está en uso podría evitar que el núcleo registre los cambios. Si eso sucede, el uso partprobe, partxo reiniciar el sistema.


1

¿Estás preguntando sobre cambiar el tamaño de un volumen lógico? Así es como lo haría:

vgextend vgname /dev/sdb3
lvextend -L +3T /dev/mapper/location
resize2fs /mount/point

O (xfs):

xfs_growfs /mount/point -D <bytes>

probablemente no esté usando ext2 / ext3 / ext4, de lo contrario resize2fs debería funcionar sobre la marcha?

1
@Antony Lee: si pasas -ra lvextend, entonces invoca resize2fspor ti.
jmtd

0

fdisk normalmente todavía está disponible y puede hacer esto, si la partición es la última partición y el inicio de la partición no se mueve.

Sin embargo, esta es una operación peligrosa que debe hacerse con mucho cuidado. ¡Hacer una copia de seguridad!

ec2-user@ip-10-0-20-15 ~]$ sudo fdisk /dev/nvme0n1

Welcome to fdisk (util-linux 2.30.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p
Disk /dev/nvme0n1: 24 GiB, 25769803776 bytes, 50331648 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 70E4A118-98BD-4BF4-8DF9-6926A964902A

Device           Start      End  Sectors Size Type
/dev/nvme0n1p1    4096 16777182 16773087   8G Linux filesystem
/dev/nvme0n1p128  2048     4095     2048   1M BIOS boot

Partition table entries are not in disk order.

Command (m for help): d
Partition number (1,128, default 128): 1

Partition 1 has been deleted.

Command (m for help): n
Partition number (1-127, default 1): 1
First sector (34-50331614, default 4096):
Last sector, +sectors or +size{K,M,G,T,P} (4096-50331614, default 50331614):

Created a new partition 1 of type 'Linux filesystem' and of size 24 GiB.
Partition #1 contains a xfs signature.

Do you want to remove the signature? [Y]es/[N]o: n

Command (m for help): p

Disk /dev/nvme0n1: 24 GiB, 25769803776 bytes, 50331648 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 70E4A118-98BD-4BF4-8DF9-6926A964902A

Device           Start      End  Sectors Size Type
/dev/nvme0n1p1    4096 50331614 50327519  24G Linux filesystem
/dev/nvme0n1p128  2048     4095     2048   1M BIOS boot

Partition table entries are not in disk order.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: Device or resource busy

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).

[ec2-user@ip-10-0-20-15 ~]$ sudo partprobe

[ec2-user@ip-10-0-20-15 ~]$ sudo fdisk -l
Disk /dev/nvme0n1: 24 GiB, 25769803776 bytes, 50331648 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 70E4A118-98BD-4BF4-8DF9-6926A964902A

Device           Start      End  Sectors Size Type
/dev/nvme0n1p1    4096 50331614 50327519  24G Linux filesystem
/dev/nvme0n1p128  2048     4095     2048   1M BIOS boot

Partition table entries are not in disk order.

[ec2-user@ip-10-0-20-15 ~]$ sudo xfs_growfs /
meta-data=/dev/nvme0n1p1         isize=512    agcount=4, agsize=524159 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1 spinodes=0
data     =                       bsize=4096   blocks=2096635, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 2096635 to 6290939
```
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.