¿Cómo puedo cambiar el tamaño de una partición raíz ext en tiempo de ejecución?

237

¿Cómo puedo aumentar el tamaño de la partición raíz de un sistema en tiempo de ejecución?

Tengo una partición que no está asignada después de la partición raíz (que también es ext4), ¿cómo puedo agregar ese espacio no asignado al espacio asignado a la partición raíz sin tener que apagar el servidor?

BonboBingo
fuente
3
Odio sonar como un palo en el barro, pero esto conlleva un poco de riesgo. ¿Por qué tiene que suceder esto? ¿Es el tiempo de actividad la principal restricción?
Cloud
No puede cambiar el tamaño de una partición a la izquierda, porque eso sería realmente un movimiento.
Zaz
55
Aumentar el tamaño de las parcelas ext4 en línea es fácil. La parte difícil sería reducirse (su título es sobre "cambiar el tamaño"). Para las personas interesadas en CUALQUIER manipulación en una partición raíz (mover, reducir, cambiar el sistema de archivos, dispositivo) en tiempo de ejecución, deben consultar mi respuesta: askubuntu.com/a/728141/21888
vaab
Use growpart
guettli

Respuestas:

215

GUI (Ubuntu 14.04 y posterior) : GParted v0.17 y posterior proporciona una buena GUI para esto. (Las versiones anteriores se negarán a cambiar el tamaño de una partición montada).

Línea de comando (cualquier versión de Ubuntu): hay tres pasos para esto.

Paso 1. La partición primero debe ser redimensionada. Si está utilizando LVM, es fácil y presumiblemente sabe cómo proceder. Si está utilizando particiones clásicas, es un poco más complicado y puede requerir un reinicio (aunque nunca tendrá que iniciar otro sistema o CD en vivo).

Así es como lo hago: utilícelo fdiskpara eliminar primero la partición (la idea es que se preservarán los datos en el disco), luego vuelva a crearla cuidadosamente con un tamaño mayor en la misma posición.

Ejemplo:

$ sudo fdisk /dev/sda

Command (m for help): p

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     9437183     4717568   83  Linux

Command (m for help): d
Selected partition 1

Command (m for help): p

   Device Boot      Start         End      Blocks   Id  System

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4, default 1): 1
First sector (2048-10485759, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-10485759, default 10485759):
Using default value 10485759

Command (m for help): p

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048    10485759     5241856   83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: 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)
Syncing disks.

Nuevamente, es crítico que la nueva partición comience en el mismo bloque que la anterior. El Id también debe coincidir (83 para sistemas Linux). Esté preparado para perder todos sus datos al menor error tipográfico.

Para estar seguro, también puede restaurar el indicador de arranque (que según Wikipedia todavía se requiere en algunas computadoras) presionando a.

Consulte la sección de comentarios para saber qué hacer si su partición de intercambio está en el camino.

Por ahora debería ser evidente por qué la gente recomienda usar un CD en vivo. ;-)

Paso 2. Como fdiskte recuerda útilmente, debes volver a cargar la tabla de particiones antes de continuar. La forma más segura es simplemente reiniciar; pero también puedes usar partprobeo kpartx (más información) .

Paso 3. Una vez que se cambia el tamaño de la partición y se vuelve a cargar la tabla de partición, es una simple cuestión de ejecutarse resize2fsen el sistema de archivos, y puede hacerlo incluso cuando está montada como la partición raíz.

Ejemplo:

$ sudo resize2fs /dev/sda1
Søren Løvborg
fuente
16
Esto funcionó perfectamente para mí. Sin embargo, también me aseguré de que la bandera de arranque mantenida sea original.
Augustus Kling
44
@ jbo5112: como se fdiskdice, partprobeo kpartxpuede funcionar en lugar de reiniciar; Ver también esta pregunta . Incluso si reinicia, la solución sigue siendo preferible a usar un CD en vivo cuando se trata del tiempo de inactividad, donde un reinicio simple puede ser inferior a 10 s para una máquina virtual. También es más rápido en tiempo de operador, por lo que generalmente uso este enfoque yo mismo. :)
Søren Løvborg
1
@Raymond: Si la presión de la memoria lo permite (ver free -h), deshabilite el intercambio ( swapoff /dev/sda2), cambie la tabla de particiones (incluida la eliminación y recreación de la partición de intercambio) y 1) reinicie o 2) vuelva a cargar la tabla de particiones swapon. (Si la memoria es demasiado ajustada para deshabilitar el intercambio temporalmente, aún puede crear y habilitar una nueva partición de intercambio ( /dev/sda3), luego intercambiar sda2; pero luego tendrá que actualizar /etc/fstabcon el nuevo nombre del dispositivo de intercambio.)
Søren Løvborg
1
Si está utilizando vmware y ha ampliado el tamaño del disco, tendrá que ejecutar sudo lshw -C disk para volver a escanear los sistemas de archivos para que el vm reconozca la unidad más grande. Luego siga las instrucciones anteriores.
Guy
2
¿Qué hay de encogerse?
Aaron Franke
113

Es posible hacer un cambio de tamaño en línea de un sistema de archivos ext4, incluso si es su partición raíz. Usa el resize2fscomando.

sudo resize2fs /dev/sda1

EDITAR: no se permite la reducción en línea:

root@brunojcm-htpc:/home# resize2fs /dev/sda5 2654693
resize2fs 1.42 (29-Nov-2011)
Filesystem at /dev/sda5 is mounted on /; on-line resizing required
resize2fs: On-line shrinking not supported
CodeAddict
fuente
55
De man resize2fs: The resize2fs program does not manipulate the size of partitions. If you wish to enlarge a filesystem, you must make sure you can expand the size of the underlying partition first. This can be done using fdisk(8) by deleting the partition and recreating it with a larger size or using lvextend(8),if you're using the logical volume manager lvm(8).Esta pregunta se trata de cambiar el tamaño de la partición , no del sistema de archivos . La distinción es sutil pero muy importante.
Eliah Kagan
8
Puede usar fdisk para eliminar la partición raíz y luego volver a crearla en el mismo bloque inicial. fdisk escribirá el cambio, pero no tendrá efecto hasta después de un reinicio. después del reinicio, puede usar el programa resize2fs para enviar el disco para llenar la partición.
James Becwar
3
Acabo de cambiar el tamaño de una partición raíz ext4 en línea. Por lo tanto, puedo confirmar que es posible. Pero en lugar de pasar / dev / sda * como parámetro para resize2fs, debe pasar el nombre del volumen lógico.
CDR
10
El primer párrafo de la página de manual de resize2fs me parece más interesante para la pregunta inicial:The resize2fs program will resize ext2, ext3, or ext4 file systems. It can be used to enlarge or shrink an unmounted file system located on device. If the filesystem is mounted, it can be used to expand the size of the mounted filesystem, assuming the kernel supports on-line resizing. (As of this writing, the Linux 2.6 kernel supports on-line resize for filesystems mounted using ext3 and ext4.).
mo '
55
Por favor, no se burle de fdiskcuándo growpartlo hará muy fácilmente.
STRML
54

Una solución más fácil: use growpart <device> <partition>:

growpart /dev/xvda 1  # Grows the partition; note the space
resize2fs /dev/xvda1  # Grows the filesystem

Como siempre, haga una copia de seguridad de su tabla de particiones ( sfdisk -d /dev/xvda > partition_bak.dmp) por si acaso.

STRML
fuente
¿Qué hay de encogerse?
Aaron Franke
Esperaba usar este método, pero obtuve sfdisk: /dev/nvme0n1p5: does not contain a recognized partition table(usando arranque dual con Windows)
monkut
La reducción no es posible hacer en línea. Recomiendo usar gpartedpara ello.
STRML
44
growpart es parte de las utilidades en la nube. En caso de que no lo haya instalado, puede instalarlo conapt-get install cloud-utils
klor
1
@monkut Tarde a la fiesta, pero es probable que su disco/dev/nvme0n1 . p5 es la partición 5 en este disco. En comparación con los segmentos de disco BSD tradicionales, utilizan un esquema de numeración similar.
Según Lundberg el
12

Sí, puede reducir / mover / hacer crecer una partición raíz en línea sin reiniciar (ni livecd, ni usbkey): consulte esta respuesta . Está muy bien escrito y es fácil de seguir, aunque bastante largo y un poco arriesgado. Entonces, si solo desea aumentar su partición ext4, puede apegarse a las resize2fssoluciones de trabajo convencionales .

La solución general que he conectado funcionará en cualquier tipo de solución dedicada o VPS, por ejemplo.

TLDR; Esta solución implica a pivot_rootpara tmpfsque pueda umountvivir de forma segura su partición raíz y jugar con ella. Una vez hecho esto, volverás pivot_roota tu nueva partición raíz.

Esto permite prácticamente cualquier manipulación en el sistema de archivos raíz (moverlo, cambiar el sistema de archivos, cambiar su dispositivo físico ...).

No se requiere reiniciar en el proceso, y esto permite evitar la limitación de resize2fs no poder reducir las ext4 particiones.

Yo personalmente he usado esto, y también funciona muy bien en el sistema Debian, por lo que debería funcionar en Ubuntu. Estoy muy sorprendido de no ver esta solución en profundidad un poco más vinculada a las muchas preguntas en los sitios web de stackexchange que tratan el mismo problema.

Nota: Por supuesto, si desea aumentar su partición, un simple resize2fsserá suficiente como se indica en numerosos lugares y en otras respuestas aquí.

vaab
fuente
44
Creo que para la mayoría de las personas, una vez que haya detenido todos los programas y servicios que acceden a la partición raíz, también podría haber reiniciado la máquina. Para reducir / mover, eso puede ser aún más rápido que usar un CD en vivo, pero para crecer (con mucho, la tarea más común y sobre lo que OP preguntó), hay formas que no implican un apagado temporal de la mayoría del sistema .
Søren Løvborg
2
@ SørenLøvborg: puede reiniciar los servicios principales que necesitan producción continua mientras realiza el procedimiento completo. Hay muchas configuraciones en las que no puede colocar LiveCD (instancias de VPS, servidores dedicados ...) o circunstancias en las que desea evitar reinicios por razones específicas. El título de la pregunta original menciona el "cambio de tamaño", que atrae a las personas que buscan reducir las particiones en línea. ** Ninguna otra solución permite reducir ext4 en línea. ** Esta solución es arriesgada, compleja, pero la más poderosa de todas y llena las deficiencias de las demás.
vaab
1
No publique respuestas según los enlaces externos. Ponga la parte relevante en su respuesta o publique el enlace como un comentario a la pregunta. Vea Cómo responder para más detalles.
Melebius
10

También puede usar GParted , siempre y cuando la partición que está redimensionando no sea la que arrancó; de lo contrario, sugiero que la opción de CD en vivo sea ​​algo más fácil para los novatos.

GParted básicamente hace todos los pasos, solo basado en una interfaz gráfica de usuario.

chaqueta de cuero
fuente
Arranqué mi sistema con Ubuntu 12.04 Live CD y redimensioné la partición ext4 con GParted. Funcionó bien para mí. De todos modos, antes de esta operación, hice una copia de seguridad de todos mis datos importantes.
StandDuPp
Creo que gparted necesita una partición desmontada. Pero puedo estar equivocado.
Nick
La pregunta es obviamente sobre la partición desde la que arrancaron, y arrancar un CD en vivo requiere reiniciar la máquina. -1
wjandrea
5

Acabo de cambiar el tamaño de una partición raíz ext4 en un sistema en vivo mientras se montaba la raíz.

[root@habib i686]# resize2fs /dev/vg_habib/lv_root
resize2fs 1.42 (29-Nov-2011)
Filesystem at /dev/vg_habib/lv_root is mounted on /; on-line resizing required
old_desc_blocks = 4, new_desc_blocks = 10
Performing an on-line resize of /dev/vg_habib/lv_root to 38427648 (4k) blocks.
The filesystem on /dev/vg_habib/lv_root is now 38427648 blocks long.

[root@habib i686]# 
CDR
fuente
5

Me gustaría hacer una extensión sobre la respuesta de @ Søren Løvborg: extender la partición con una partición de intercambio presente.

Primero el diseño del disco después de extenderlo:

$sudo parted /dev/sda 'unit s print' free
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 14336000s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start      End        Size       Type      File system     Flags
        63s        2047s      1985s                Free Space
 1      2048s      10485759s  10483712s  primary   ext4            boot
        10485760s  10487805s  2046s                Free Space
 2      10487806s  12580863s  2093058s   extended
 5      10487808s  12580863s  2093056s   logical   linux-swap(v1)
        12580864s  14335999s  1755136s             Free Space

Por lo tanto, sda1 debe ampliarse con el espacio libre al final del disco, pero la partición de intercambio se encuentra entre ellos. Así es como puedes hacerlo:

Primero necesitamos deshabilitar el intercambio. Compruebe cuánto se usa y si puede apagarlo.

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           992M         52M        464M        3.2M        475M        784M
Swap:          1.0G          0B        1.0G

el intercambio no se usa aquí para que podamos desactivarlo

$sudo swapoff /dev/sda5

Ahora cambiaremos la tabla de particiones:

$sudo fdisk /dev/sda

(nota: si tiene la primera partición iniciada en el sector 63 en lugar de 2048, debe agregar la opción -c=dos)

Welcome to fdisk (util-linux 2.27.1).
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/sda: 6.9 GiB, 7340032000 bytes, 14336000 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: dos
Disk identifier: 0x9e11c6df

Device     Boot    Start      End  Sectors  Size Id Type
/dev/sda1  *        2048 10485759 10483712    5G 83 Linux
/dev/sda2       10487806 12580863  2093058 1022M  5 Extended
/dev/sda5       10487808 12580863  2093056 1022M 82 Linux swap / Solaris

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

Partition 2 has been deleted.

Command (m for help): d
Selected partition 1
Partition 1 has been deleted.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-14335999, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-14335999, default 14335999): 12242941

Created a new partition 1 of type 'Linux' and of size 5.9 GiB.

Command (m for help): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
First sector (12242942-14335999, default 12242944):
Last sector, +sectors or +size{K,M,G,T,P} (12242944-14335999, default 14335999):

Created a new partition 2 of type 'Linux' and of size 1022 MiB.

Command (m for help): a
Partition number (1,2, default 2): 1

The bootable flag on partition 1 is enabled now.

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

Nota: el tamaño de sda1 es la cantidad total de sectores menos el tamaño de sector de su partición de intercambio: 14335999-2093058 = 12242941

Como menciona fdisk: el kernel todavía está usando la antigua tabla de particiones, por lo que debemos volver a cargarla.

$partprobe

Ahora necesitamos ejecutar resize2fs en sda1 (¡no lo olvides!)

$resize2fs /dev/sda1
resize2fs 1.42.12 (29-Aug-2014)
Filesystem at /dev/sda1 is mounted on /; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 10
The filesystem on /dev/sda1 is now 38833617 (4k) blocks long.

Ahora, las cosas aún no han terminado. Como probablemente haya notado, sda2 está particionado como tipo Linux (Ext4). Por alguna razón, no hay forma en fdisk de elegir el tipo. Entonces tenemos que alternarlo usandocfdisk

$ sudo cfdisk

Elija sda2 y cambie el tipo a 82 Linux swap / Solarisy asegúrese de escribirlo (escriba yes para confirmar)

Ahora podemos reactivar el intercambio

$mkswap /dev/sda2
/dev/sda2
UUID=d58bf1cb-d27a-487d-b337-056767fd5ad6 none swap sw 0 0

Y finalmente enciéndelo:

$swapon /dev/sda2

Lo único que debemos hacer es actualizar fstab para montar la partición de intercambio automáticamente al iniciar

$sudo nano /etc/fstab

Y cambie el UUID de la partición de intercambio a la salida anterior:

# swap was on /dev/sda5 during installation
UUID=d58bf1cb-d27a-487d-b337-056767fd5ad6 none            swap    sw              0       0

Ahora todo está bien y puede reiniciar sin problemas.

wouter205
fuente
en cuanto a alternar el tipo de partición de intercambio, se puede hacer en fdisk buy seleccionando t luego 5 (partición 5) y luego 82 (tipo Linux swap / Solaris)
Oz Edri
¿no debería extenderse la partición 2? (y luego en fdisk deberíamos elegir e en lugar de p) Además, ¿no deberían ejecutarse los comandos mkswap y swapon en / dev / sda5 en lugar de sda2?
Oz Edri
1
Para el tipo de partición de intercambio: encontré en otras instrucciones que de hecho puede seleccionar el tipo en fdisk, pero por alguna razón no funcionó en mi versión. De todos modos, siempre funcionará con cfdisk
wouter205
1
Para la partición de intercambio: puede usar una partición extendida pero luego debe agregar dos particiones: una extendida y una lógica (vea mi diseño de partición inicial). En mi ejemplo, termino con 2 particiones primarias: sda1 - ext4 - partición raíz y sda2 - partición de intercambio. Por lo tanto, los comandos mkswap& swapondeben ejecutarse en sda2. Cometí un error al comienzo de mi publicación: swapoffdebe ejecutarse en sda5. Los comentarios son siempre bienvenidos, fue difícil de anotar.
wouter205
1
Cuando se encripta la partición de intercambio, primero hay que detener cryptdisks con cryptdisks_stop, luego actualizar / etc / crypttab en lugar de /etc/fstaby reiniciar cryptdisks con cryptdisks_start.
Dmitri Chubarov
1

Acabo de hacer esto con éxito sin umount, pivot_rooto la eliminación temporal de la partición principal, usando Parted 3.2 en Ubuntu 16.04, 4.4.0 kernel. Para ser cauteloso, hice todo, desde una consola virtual con redes deshabilitadas, y tomé una instantánea de antemano por si acaso, pero la instantánea no era necesaria, por lo que podría haberlo hecho bien a través de SSH y sin cambiar los niveles de ejecución.

Determinar el tamaño de la partición: parted /dev/sda1 print | egrep "Disk.*GB"

Opcionalmente, cambie al modo multiusuario sin conexión de red (debe hacerse desde una consola, no SSH):

runlevel     # remember the original runlevel
init 2

Opcionalmente, tome una instantánea de VM para ser cauteloso.

Cambiar el tamaño de la partición:

parted
p
resizepart NUMBER SIZE
# answer "Yes" when asked about resizing a live partition.
q

Cambiar el tamaño del sistema de archivos: resize2fs /dev/sda1

Si algo sale mal, puede restaurar su instantánea aquí. Si todo ha ido bien, volver al nivel de ejecución normal (obtenido anteriormente) - normalmente 5: init 5. Puede ser mejor hacer un reinicio completo en este punto para asegurarse de que todo vuelva correctamente (tuve un problema de fecha / ntp después).

Roger Dueck
fuente
1

Sigue estos pasos.

  1. terminal abierto como superusuario su
  2. correr parted
  3. escriba ppara ver las particiones disponibles
  4. identifique su número de partición raíz (por ejemplo: 'sda 3' significa número 3) y elimine una partición adyacente utilizando rm PARTITION NUMBERpara crear espacio libre.
  5. ahora aumente el tamaño de la raíz escribiendo resizepart ROOT NUMBERy reinicie el sistema si es necesario
  6. salga partedescribiendo exity en el tipo de terminal partprobey presione enter (esto se puede hacer incluso después de reiniciar)
  7. finalmente ejecuta resize2fs /dev/sda PARTITION NUMBERy disfruta de una espaciosa partición raíz.
Gurunadha Reddy
fuente
0

Como se dijo antes:

  • es posible expandir en vivo desde un sistema raíz (sin dificultades, ya que la sección de arranque no se puede mover)

  • la reducción de una partición raíz en vivo debe realizarse desde un dispositivo de arranque externo (arranque desde el sistema en vivo cd / usb-stick), como si hubiera alguna falla, falta de coincidencia ... lo que sea que ... su sistema se cuelga, necesita reiniciarse y eventualmente no será capaz de arrancar correctamente.

Cualquier tipo de "pero lo hice y funciona" es pura suerte.

ascervera
fuente