¿Es posible reducir en línea un volumen EXT4 con LVM?

47

Hoy probé esto en mi máquina con OpenSUSE 12.3 (kernel 3.7):

# resize2fs /dev/mapper/system-srv 2G
resize2fs 1.42.6 (21-Sep-2012)
Filesystem at /dev/mapper/system-srv is mounted on /srv; on-line resizing required
resize2fs: On-line shrinking not supported

/dev/mapper/system-srv es un volumen EXT4.

¿Es realmente incompatible o me falta algo?

Alicia
fuente

Respuestas:

68

Como decía el mensaje, solo puede hacer crecer un sistema de archivos en línea. Si desea reducirlo, primero deberá desmontarlo.

Según el mantenedor del sistema de archivos ext4 , Ted Ts'o:

Lo sentimos, la reducción en línea no es compatible.

Michael Hampton
fuente
12
Es una pena ...
Alicia
55
¿Qué pasa con el voto negativo?
Michael Hampton
16
@MichaelHampton: ¿algún imbécil disparando al mensajero? : D
tink
2
Eso fue hace 10 años. ¿Ya se ha implementado?
Duane
@duane No. No lo ha hecho. Es probable que nunca lo sea, tampoco.
Michael Hampton
17

Sí, puede reducir / mover / hacer crecer una partición raíz 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.

resize2fs no puede reducir las ext4particiones en línea . Esta limitación, cuando se aplica en la partición raíz, puede llevarlo a pensar que no puede evitar reiniciar el host para permitir reducir la rootpartición, lo que podría ser algo que desea evitar. El proceso vinculado le permitirá desmontar la partición raíz sin reiniciar. Por lo tanto, desde este punto de vista, no se trata estrictamente de cambio de tamaño en línea con respecto al estado montado de la partición, sin embargo, sigue siendo un cambio de tamaño en línea con respecto al estado en línea de la red o al alcance del host.

Por supuesto, si solo desea aumentar su partición ext4, debe apegarse a las resize2fssoluciones de trabajo convencionales .

La solución general que he vinculado 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 ...).

Personalmente, he usado esto, y también funciona muy bien en el sistema Debian, pero la guía se escribió inicialmente en 2007 para redhat, la respuesta que he vinculado se actualizó para CentOS7. Es muy probable que funcione en su OpenSUSE, aunque probablemente con alguna adaptación.

vaab
fuente
44
Esto no es 'en línea' en lo que respecta a la comparación con 'crecimiento en línea'. Todos los servicios deben estar inactivos y su sistema de archivos raíz quedará inaccesible. Puede valer la pena contrastar esto con el enfoque livecd o initramfs / rdshell en este comentario. Odiaría que la gente se confunda con esto.
Brian Chrisman
2
@BrianChrisman Este es un hecho que mereció una aclaración y que espero haber cubierto con una edición en mi publicación. Muchas gracias por la respuesta.
vaab
Lo que me gusta de la solución referenciada es que está 'casi en línea'. Hice esto en particular al codificar un pequeño script y herramientas en el comando dracut y lancé el initramfs resultante desde kexec. Si de alguna manera esto pudiera mantener una sesión ssh abierta durante el proceso, sería lo mejor. Supongo que si construye la raíz falsa con sshd y los archivos necesarios, inicie otro sshd (porque está ssh'd) en otro puerto, luego puede enviar ssh al otro puerto y verificar la conectividad antes de continuar lobotomizando el sistema.
Brian Chrisman
13

Si el caso es un servidor remoto sin consola, puede reducir el sistema de archivos usando initramfs mientras reinicia. Debe agregar resize2fs a initramfs y ejecutarlo antes de montar root.

Ejemplo de Debian / Ubuntu:

/ etc / initramfs-tools / hooks / resizefs (ejecutable):

#!/bin/sh

set -e

PREREQS=""

prereqs() { echo "$PREREQS"; }

case $1 in
    prereqs)
        prereqs
        exit 0
    ;;
esac

. /usr/share/initramfs-tools/hook-functions

copy_exec /sbin/e2fsck
copy_exec /sbin/resize2fs

exit 0

/ etc / initramfs-tools / scripts / local-premount / resizefs (ejecutable)

#!/bin/sh

set -e

PREREQS=""

prereqs() { echo "$PREREQS"; }

case "$1" in
    prereqs)
        prereqs
        exit 0
    ;;
esac

/sbin/e2fsck -yf /dev/sda1
/sbin/resize2fs /dev/sda1 5G
/sbin/e2fsck -yf /dev/sda1

Ahora ejecute update-initramfs, reinicie, verifique el tamaño, elimine estos scripts y actualice-intiramfs nuevamente.

Para dracut (Fedora, CentOS) use la misma lógica (/usr/lib/dracut/modules.d).

Esto es muy útil para encriptar o mover rootfs, sin espacio libre disponible para la nueva partición.

urusha
fuente
2
Esto funciona como un encanto. Tenga en cuenta que necesita ejecutar update-initramfs con la opción -u.
Diomidis Spinellis
Bueno. En mi caso también lo necesitaba update-grub.
Wojciech Kaczmarek