Linux chroot env / rescue

Het gebeurt iedereen wel eens je hebt een linux machine die niet meer wil starten. je hebt een foutje gemaakt of een probleem met de bootloader. in mijn geval een probleem met een qcow2 disk die niet meer wil starten. Om deze te fixen kan je de disk image aan een andere virtual machine koppelen of jhe kan de qcow2 disk ook mounten aan je host systeem volg daarvoor deze handleiding. het maakt niet uit welke methode je gebruikt beide kunnen online worden uitgevoerd. 

Ik gebruik in dit voorbeeld een virtual machine op via kvm, als ik de disk(en) heb toegevoegd worden ze op de meeste moderne linux versies automatich gedetecteerd. ik gebruik standaard voor al mijn systemen lvm en het was handig geweest als je je volume groepen aangemaakt had met de host naam er in heb je dat niet dan krijg je bv 2 keer vg0 te zien en een melding dat er dubbelen namen zijn gebruikt, dat is op zich niet erg je moet alleen even opletten dat je dan de VG UUID gebruikt in plaats van de vg name. 
misschien is dit ook het moment om een vgrename uit te voeren 🙂 

Na het toevoegen van de disk zie ik dus 2 volume groepen op mijn systeem. en alleen de partities/lv van mijn host machine zijn gemount. 

piet@antares:/$ df -h 
Filesystem Size Used Avail Use% Mounted on
tmpfs 1.6G 1.2M 1.6G 1% /run
/dev/mapper/antares--vg-root--lv 6.5G 3.1G 3.2G 49% /
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/mapper/antares--vg-home--lv 919M 187M 669M 22% /home
/dev/mapper/antares--vg-minicube--lv 30G 24K 29G 1% /opt/minicube
/dev/mapper/antares--vg-tmp--lv 919M 7 2K 856M 1% /tmp
/dev/mapper/antares--vg-var--lv 9.9G 3.3G 6.2G 35% /var
/dev/vda1 462M 178M 280M 39% /boot
tmpfs 371M 8.0K 371M 1% /run/user/1000
piet@antares:/$ sudo vgs 
VG #PV #LV #SN Attr VSize VFree
antares-vg 2 6 0 wz--n- <59.52g <7.28g
kongo-vg 1 6 0 wz--n- <19.50g <2.50g
piet@antares:/$ sudo lvs 
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
home-lv antares-vg -wi-ao---- 952.00m
minicube-lv antares-vg -wi-ao---- 30.00g
root-lv antares-vg -wi-ao---- <6.66g
swap-lv antares-vg -wi-ao---- 3.72g
tmp-lv antares-vg -wi-ao---- 952.00m
var-lv antares-vg -wi-ao---- 10.00g
dockerlv kongo-vg -wi-a----- 5.00g
homelv kongo-vg -wi-a----- 1.00g
rootlv kongo-vg -wi-a----- 5.00g
swaplv kongo-vg -wi-a----- 2.00g
tmplv kongo-vg -wi-a----- 1.00g
varlv kongo-vg -wi-a----- 3.00g

de disk is goed toegevoegd en de lv zijn beschikbaar het is tijd om alles in chroot te plaatsen. gebruik hiervoor een lege directory meestal beschikbaar is /mnt maar je mag ook een nieuwe aanmaken. bv lnx-res

piet@antares:/$ sudo mkdir /lnx-res

Mount nu de root partitie/lv aan deze dir in mijn geval dus /dev/mapper/kongo–vg-rootlv

piet@antares:/$ sudo mount /dev/mapper/kongo--vg-rootlv /lnx-res

als deze is gemount moeten /proc, /sys en /dev nog door zetten

piet@antares:/$ sudo mount -t proc /proc /lnx-res/proc 
piet@antares:/$ sudo mount --rbind /sys /lnx-res/sys
piet@antares:/$ sudo mount --rbind /dev /lnx-res/dev

Je kan nu met chroot in de nieuwe omgeving stappen.je kan dan meteen een mount -a uitvoeren en alle mounts zouden automatische gemaakt moeten worden.

piet@antares:~$ sudo chroot /lnx-res

root@antares:/# mount -a 

root@antares:/# df -h 
Filesystem                      Size  Used Avail Use% Mounted on
/dev/mapper/kongo--vg-rootlv    4.9G  4.1G  521M  89% /
tmpfs                           6.9G     0  6.9G   0% /dev/shm
/dev/mapper/kongo--vg-homelv    974M  706M  201M  78% /home
/dev/mapper/kongo--vg-tmplv     974M   56K  907M   1% /tmp
/dev/mapper/kongo--vg-varlv     3.0G  2.3G  536M  82% /var
/dev/mapper/kongo--vg-dockerlv  4.9G  2.1G  2.5G  46% /var/lib/docker
/dev/vda2                       488M  365M   87M  81% /boot

Zoals je ziet ben je nu root en de disken van andere machine. je kan hier alles fixen wat je wilt zelf updaten, ook als het een andere versie of een andere distributie. als het mounten niet is gelukt heb je mischien wel corrupte filesystemen die kan je fixen met fsck of een ander probleem met de /etc/fstab

Alles weer verwijderen / unmount

als je herstel werkzaamheden klaar zijn wil je natuurlijk alles weer verwijderen. je kan in je chroot env een umount -a uitvoeren alles wat niet in gebruik is word dan automatisch geunmount. je krijgt wel een fout melding dat een aantal zaken niet geunmount konden worden maar dat doen we later als we uit de chroot zijn. om nu uit de chroot te stappen type je exit 

root@antares:/# umount -a 
umount: /dev: target is busy.
umount: /sys/fs/cgroup: target is busy.
root@antares:/# df -h 
Filesystem                    Size  Used Avail Use% Mounted on
/dev/mapper/kongo--vg-rootlv  4.9G  4.1G  521M  89% /
root@antares:/# exit 
exit
piet@antares:~$ 

als je uit de chroot bent en je controleert middels mount welke filesystemen er nog actief zijn op /lnx-res krijg zoiets als hier onder te zien.

piet@antares:~$ mount |grep lnx-res 
/dev/mapper/kongo--vg-rootlv on /lnx-res type ext4 (ro,relatime)
/proc on /lnx-res/proc type proc (rw,relatime)
sysfs on /lnx-res/sys type sysfs (rw,nosuid,nodev,noexec,relatime)
cgroup2 on /lnx-res/sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate,memory_recursiveprot)
udev on /lnx-res/dev type devtmpfs (rw,nosuid,relatime,size=8152512k,nr_inodes=2038128,mode=755,inode64)
devpts on /lnx-res/dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)

Je kan nu proberen een umount recursieve te geven maar dat gaat waarschijnnlijk niet lukken omdat de /lnx-res/dev sysfs niet unmounted kunnen worden.

piet@antares:~$ sudo umount -R /lnx-res 
umount: /lnx-res/dev/pts: target is busy.

piet@antares:~$ mount |grep lnx-res 
/dev/mapper/kongo--vg-rootlv on /lnx-res type ext4 (ro,relatime)
/proc on /lnx-res/proc type proc (rw,relatime)
sysfs on /lnx-res/sys type sysfs (rw,nosuid,nodev,noexec,relatime)
cgroup2 on /lnx-res/sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate,memory_recursiveprot)
udev on /lnx-res/dev type devtmpfs (rw,nosuid,relatime,size=8152512k,nr_inodes=2038128,mode=755,inode64)
devpts on /lnx-res/dev/pts type devpts  (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)

Omdit te voorkomen kan je eerst mount –make-rslave mountpoint

piet@antares:~$ sudo mount --make-rslave /lnx-res
piet@antares:~$ sudo umount -R /lnx-res 
piet@antares:~$ mount |grep lnx-res 
piet@antares:~$

Hier alle mount zijn nu weg nu kan je de disk weer gewoon verwijderen van je virtual systeem.