Me encuentro necesitando reorganizar las particiones de un sistema para mover datos previamente bajo el sistema de archivos raíz a puntos de montaje dedicados. Todos los volúmenes están en LVM, por lo que esto es relativamente fácil: cree nuevos volúmenes, mueva datos a ellos, reduzca el sistema de archivos raíz y luego monte los nuevos volúmenes en los puntos apropiados.
El problema es el paso 3, reducir el sistema de archivos raíz. Los sistemas de archivos involucrados son ext4, por lo que se admite el cambio de tamaño en línea; sin embargo, mientras están montados, los sistemas de archivos solo pueden crecer. Reducir la partición requiere desmontarla, lo que, por supuesto, no es posible para la partición raíz en funcionamiento normal.
Las respuestas en la Web parecen girar alrededor del arranque de un LiveCD u otro medio de rescate, realizar la operación de reducción y luego reiniciar el sistema instalado. Sin embargo, el sistema en cuestión es remoto y solo tengo acceso a través de SSH. Puedo reiniciar, pero no es posible iniciar un disco de rescate y realizar operaciones desde la consola.
¿Cómo puedo desmontar el sistema de archivos raíz mientras mantengo el acceso remoto al shell?
pivot_root
allí. Un ejemplo aquí dreamlayers.blogspot.co.uk/2012/10/running-linux-from-ram.html : es complicado, pero si tiene una caja de prueba para probarlo, vale la pena considerarlo.Respuestas:
Al resolver este problema, la información proporcionada en http://www.ivarch.com/blogs/oss/2007/01/resize-a-live-root-fs-a-howto.shtml fue fundamental. Sin embargo, esa guía es para una versión muy antigua de RHEL, y varias informaciones eran obsoletas.
Las instrucciones a continuación están diseñadas para funcionar con CentOS 7, pero deberían ser fácilmente transferibles a cualquier distribución que ejecute systemd. Todos los comandos se ejecutan como root.
Asegúrese de que el sistema esté en un estado estable
Asegúrese de que nadie más lo esté usando y que nada más importante esté sucediendo. Probablemente sea una buena idea detener las unidades que brindan servicios como httpd o ftpd, solo para asegurarse de que las conexiones externas no interrumpan las cosas en el medio.
Desmontar todos los sistemas de archivos no utilizados
Esto imprimirá una serie de advertencias de 'El destino está ocupado', para el volumen raíz en sí y para varios FS temporales / del sistema. Estos pueden ser ignorados por el momento. Lo importante es que no quedan montados los sistemas de archivos en el disco, excepto el sistema de archivos raíz en sí. Verifica esto:
Si ve algún sistema de archivos en el disco todavía montado, entonces todavía se está ejecutando algo que no debería. Comprueba lo que está usando
fuser
:Haz la raíz temporal
Esto crea un sistema raíz muy mínimo, que interrumpe (entre otras cosas) la visualización de la página de manual (no
/usr/share
), las personalizaciones a nivel de usuario (no/root
o/home
), etc. Esto es intencional, ya que constituye un estímulo para no permanecer en un sistema raíz tan manipulado por el jurado más de lo necesario.En este punto, también debe asegurarse de que esté instalado todo el software necesario, ya que seguramente romperá el administrador de paquetes. Eche un vistazo a todos los pasos y asegúrese de tener los ejecutables necesarios.
Pivotar en la raíz
systemd hace que los montajes permitan compartir subárbol de manera predeterminada (como con
mount --make-shared
), y esto hacepivot_root
que falle. Por lo tanto, desactivamos esto globalmente conmount --make-rprivate /
. El sistema y los sistemas de archivos temporales se trasladan al por mayor a la nueva raíz. Esto es necesario para que funcione; los sockets para la comunicación con systemd, entre otras cosas, viven/run
, por lo que no hay forma de hacer que los procesos en ejecución lo cierren.Asegúrese de que el acceso remoto haya sobrevivido al cambio
Después de reiniciar sshd, asegúrese de poder ingresar abriendo otro terminal y conectándose nuevamente a la máquina a través de ssh. Si no puede, solucione el problema antes de continuar.
Una vez que haya verificado que puede conectarse nuevamente, salga del shell que está utilizando actualmente y vuelva a conectarse. Esto permite que la bifurcación restante
sshd
salga y garantiza que la nueva no se mantenga/oldroot
.Cierra todo lo que sigue usando la raíz antigua
Esto imprimirá una lista de procesos que aún se mantienen en el antiguo directorio raíz. En mi sistema, se veía así:
Debe lidiar con cada uno de estos procesos antes de poder desmontar
/oldroot
. El enfoque de fuerza bruta es simplementekill $PID
para cada uno, pero esto puede romper las cosas. Para hacerlo más suavemente:Esto crea una lista de servicios en ejecución. Debería poder correlacionar esto con la lista de procesos en espera
/oldroot
, luego emitirsystemctl restart
para cada uno de ellos. Algunos servicios se negarán a aparecer en la raíz temporal y entrarán en un estado fallido; estos realmente no importan por el momento.Si la unidad raíz que desea cambiar de tamaño es una unidad LVM, es posible que también deba reiniciar algunos otros servicios en ejecución, incluso si no aparecen en la lista creada por
fuser -vm /oldroot
. Si encuentra que no puede cambiar el tamaño de una unidad LVM en el Paso 7, intentesystemctl restart systemd-udevd
.Algunos procesos no pueden tratarse de manera simple
systemctl restart
. Para mí estos incluidosauditd
(que no le gusta que lo maten a través desystemctl
, por lo que solo quería unkill -15
). Estos pueden ser tratados individualmente.El último proceso que encontrarás, por lo general, es en
systemd
sí mismo. Para esto, corresystemctl daemon-reexec
.Una vez que haya terminado, la tabla debería verse así:
Desmontar la antigua raíz
En este punto, puede realizar cualquier manipulación que requiera. La pregunta original necesitaba una
resize2fs
invocación simple , pero puede hacer lo que quiera aquí; otro caso de uso es transferir el sistema de archivos raíz de una partición simple a LVM / RAID / lo que sea.Gire la raíz hacia atrás
Esta es una inversión directa del paso 4.
Deseche la raíz temporal
Repita los pasos 5 y 6, excepto usar
/tmp/tmproot
en lugar de/oldroot
. Entonces:Como se trata de un tmpfs, en este punto, la raíz temporal se disuelve en el éter, para nunca volver a verse.
Poner las cosas nuevamente en sus lugares.
Montar sistemas de archivos nuevamente:
En este punto, también debe actualizar
/etc/fstab
ygrub.cfg
de acuerdo con los ajustes que realizó durante el paso 7.Reinicie los servicios fallidos:
Permitir subárboles compartidos nuevamente:
Inicie las unidades de servicio detenidas; puede usar este comando único:
Y tu estas listo.
Muchas gracias a Andrew Wood, quien resolvió esta evolución en RHEL4, y Steve, que me proporcionó el enlace a la primera.
fuente
umount /oldroot/boot
por supuesto, en la etapa 6). Estoy vinculando su respuesta a otras preguntas SE que no tuvieron respuesta o respuesta negativa.umount /oldroot/boot
ante ustedumount /oldroot
mount --move
tmpfs, pero eso no es compatible.telinit u
podría hacer lo que quieres./oldroot/tmp
, lo que me impidió desmontar/oldroot
, pero no aparecefuser
nilsof
sale. Tomó un poco de mirar a systemd para resolverlo ...Si está seguro de lo que está haciendo, por lo que no está experimentando, puede conectarse a initrd, que es la forma no interactiva y rápida.
En un sistema basado en Debian, aquí es cómo.
Vea el código: https://github.com/szepeviktor/debian-server-tools/blob/master/debian-resizefs.sh
Hay otro ejemplo: https://github.com/szepeviktor/debian-server-tools/blob/master/debian-convert-ext3-ext4.sh
fuente