Cómo mover la partición raíz a otro PV en LVM vía SSH sin un sistema Live

Cómo mover la partición raíz a otro PV en LVM vía SSH sin un sistema Live

¿Cómo puedo cambiar la partición raíz para que arranque Debian 10?

Me gustaría disminuir el tamaño de mi sistema de archivos raíz que se encuentra en un volumen lógico LVM desde el control remoto, es decir, solo a través de SSH y sin iniciar desde un Live CD.

Como no podemos reducir los rootfs mientras está montado, pensé que simplemente clonaría los rootfs existentes, arrancaría desde allí y cambiaría el tamaño desde allí, luego arrancaría con los rootfs originales y eliminaría el temporal.

Lo intenté en una máquina virtual usando Ubuntu Server 18.04 ya que AFAIK usa la misma "cadena de arranque" que Debain 10. Sin embargo, no pude configurar de manera confiable la partición clonada como raíz. Después de reiniciar, verifiqué mounty la raíz original todavía se usa aunque

  • /etc/fstabHa sido actualizado
  • /boot/grub/grub.cfgHa sido actualizado
  • initramfsHa sido actualizado

Configuración actual

  • RAID1 de 1TBmd0
  • RAID1 de 4TBmd1
  • PV encendidomd0
  • PV encendidomd1p1
  • VG vg0con ambos PV
  • LV rootcomo raíz original fs (UUID xxx)
  • LV newrootcomo raíz temporal fs (UUID yyy)
  • ext4 activado vg0-root(UUID aaa)
  • ext4 activado vg0-newroot(UUID bbb)

/etc/fstabse cambió en consecuencia (se reemplazó la ruta del asignador del dispositivo).

Hasta ahora, he sincronizado toda la raíz antigua aaacon newroot bbb, reemplacé cada aparición de UUID aaay xxxcon bbby yyyen /boot/grub/grub.cfg(Nota: no estoy usando grub2ni arranque UEFI).

initramfsse actualizó usando update-initramfs -u(después de corregir /etc/initramfs-tools/conf.d/resume).

En ese orden. Pero mis pruebas en una VM arrancaron directamente desde la raíz anterior o me arrojaron a un shell de rescate de GRUB.

update-grubReconocí el newrootvolumen y agregué entradas coincidentes en grub.cfg, seleccionándolas manualmente al arrancar en mi VM de prueba (no es posible a través de SSH...) también arranqué la raíz anterior.

También he visto que hay una ROOTopción para /etc/initramfs-tools/initramfs.confcodificar la partición raíz:

Permite la codificación opcional de arranque raíz, cuando no se puede pasar ningún arranque raíz. Un argumento de arranque raíz anula esa configuración especial.

Pero como hay un bootarg para root en mi grub.cfgconfiguración, esta configuración no debería tener efecto.

¿Qué más hay que configurar para utilizar otro UUID como root en el próximo arranque?

Respuesta1

Resulta que olvidé reemplazar root= bootarg en /boot/grub/grub.cfg...

En aras de la integridad:

Cómo mover la partición raíz a otro PV en LVM vía SSH sin un sistema Live

Nota: ¡Siempre haga una copia de seguridad de los datos importantes! Este método es un truco y no debe utilizarse en sistemas de producción. En cualquier caso, los datos escritos en el tiempo entre la clonación de LV y el inicio desde la nueva partición raíz siempre se perderán.

Crear un nuevo LVM en otro disco

fdisk /dev/sdb #Create new partition for PV (sdb1)
pvcreate /dev/sdb1
vgcreate vg1 /dev/sdb1
lvcreate -n newroot -L10G vg1 #Size has to be larger than effective usage on current root
mkfs.ext4 -L newroot /dev/mapper/vg1-newroot

Recopilar información sobre el nuevo LVM

lvdisplay
vgdisplay
pvdisplay
blkid

Los siguientes comandos se referirán a la información presentada aquí como:

  • $pv0uuid = UUID del PV antiguo
  • $pv1uuid = UUID del nuevo PV
  • $vg{0,1}uuid = UUID de {antiguo,nuevo} VG
  • $lv{0,1}UUID = UUID de {antiguo,nuevo} LV
  • $root{0,1}UUID = UUID del sistema de archivos raíz {antiguo,nuevo}
  • $vg{0,1} = Nombre de {antiguo,nuevo} VG
  • $lv{0,1} = Nombre de {antiguo,nuevo} LV

Y /etc/grub/grub.cfgse presentará como $grubcfg. Para los sistemas UEFI, esto es lo más probable /boot/grub2/grub.cfg.

Recomiendo configurarlos como variables al bashusarlos pv0uuid=xxxxxx-xxxx...para que los siguientes comandos se puedan copiar y pegar.

Establecer una nueva raíz en la configuración de GRUB

Estos comandos reemplazarán el texto en la configuración de GRUB:

sed -i "s/$pv0uuid/$pv1uuid/g" $grubcfg
sed -i "s/$vg0uuid/$vg1uuid/g" $grubcfg
sed -i "s/$lv0uuid/$lv1uuid/g" $grubcfg
sed -i "s/$root0uuid/$root1uuid/g" $grubcfg
sed -i "s/$vg0/$vg1/g" $grubcfg #BEWARE COMMON NAMES
sed -i "s/$lv0/$lv1/g" $grubcfg #BEWARE COMMON NAMES
sed -i "s/\/dev\/mapper\/$vg0-$lv0/\/dev\/mapper\/$vg1-$lv1/g" /etc/fstab #BEWARE COMMON NAMES

CUIDADO CON LOS NOMBRES COMUNES: sedreemplazarácadaaparición de texto coincidente, por lo tanto se recomienda realizar estos cambios a mano, ya que reemplazar palabras como las rootutilizadas en otras partes de la configuración de GRUB o fstab lo invalidará.

Recomiendo usar nanoy buscar ( CTRL+W) los nombres de VG y LV y reemplazarlos manualmente. También se recomienda buscar el nombre del dispositivo fotovoltaico, por si acaso...

Clonar el volumen raíz

mount /dev/mapper/$vg1-$lv1 /mnt
rsync -rAa --one-file-system / /mnt/
umount /mnt

Reiniciar

Reinicia (y reza). Valide el nuevo LV en el que se está montando /.

Eliminar LVM antiguo

lvremove /dev/$vg0/*
vgremove $vg0
pvremove /dev/sda2 #Path to $pv0uuid

Limpiar

Opcional, pero recomendado.

  • Finalmente elimine el VG antiguo /etc/lvm/archiveo será buscado durante cada arranque y provocará retrasos.
  • update-grub
  • update-initramfs -u

Notas

Probado en Ubuntu 18.04, otras distribuciones pueden manejar la configuración de GRUB de manera diferente (con respecto a los UUID frente a las rutas de los dispositivos y los comandos de actualización).

Obviamente, detenga todos los servicios innecesarios de antemano para minimizar la pérdida de datos.

Podría haber una manera de evitar (la mayoría) de la pérdida de datos utilizando objetivos systemd, scripts personalizados e instantáneas LVM. Habría que sincronizar los datos $lv0nuevamente $lv1en el último momento posible antes del reinicio. Fuera del alcance de esta publicación...

Si /bootno es una partición separada, verifique $grubcfgla nueva raíz antes de reiniciar nuevamente.

Respuesta2

No estoy seguro de si esto le ayudará, pero esto es lo que intenté con éxito para reducir la partición raíz que está en LV:

  1. Cree una instantánea de la partición raíz. Asegúrate de que tenga algo de espacio asignado ya que lo cambiarás.
  2. fsck la instantánea.
  3. Cambie el tamaño de la instantánea (reduzcala) y asegúrese de tener algo de búfer entre la parte superior del sistema de archivos y el límite del tamaño objetivo de LV, solo para ir a lo seguro.
  4. Fusione la instantánea nuevamente con su rootfs LV.
  5. Reiniciar. La fusión realmente se realiza en este punto (probablemente durante el arranque).
  6. Después de reiniciar, reduzca el volumen de rootfs y posiblemente cambie su tamaño nuevamente, de modo que llene cualquier espacio hasta la parte superior de LV.

Hay un inconveniente: perderá algunos datos entre los pasos 1 y 5 y PUEDE tener algunas inconsistencias (dependiendo del FS en uso) en el paso 1, mientras toma una instantánea en el sistema de archivos activo.

Funcionó para mí sorprendentemente bien.

En un mundo ideal, el paso 1 se realizaría durante el arranque, antes de volver a montar rootfs rw, para que la instantánea esté limpia. No he descubierto cómo hacerlo desde dracut: las herramientas que intenté usar no me funcionaron.

información relacionada