CV #52het - 52 projekt

Mi az a copymods?

A copymods lényege röviden annyi, hogy az initrd-ből egy tmpfs-re kimásolja a benne található kernelmodulokat, majd felmountolja a /lib/modules könyvtárba, ha az létezik. Az, hogy a copymods aktív-e, a következő paranccsal lehet ellenőrizni:

mount | egrep copymods

Ha a parancsnak nincs kimenete, akkor a copymods nem aktív, tehát a rendszer a /lib/modules/<kernelverzió> könyvtár alatti modulokat tölti be. A továbbiakban viszont azt tárgyalom, hogy, ha mégis aktív, akkor hogyan tudjuk kikapcsolni vagy úgy beállítani, hogy ne okozzon gondot.

Az initramfs-ben mi található?

lsinitramfs /boot/initrd.img-`uname -r`

Benne van-e a copymods script?

lsinitramfs /boot/initrd.img-`uname -r` | egrep copymods

Ez azért okozhat problémát, mert amikor létrehozunk egy paravirtualizált (Xen) guest-et, akkor meg kell adni, hogy milyen kernellel és initrd-vel induljon el:

kernel      = '/boot/vmlinuz-4.4.0-87-generic'
ramdisk     = '/boot/initrd.img-4.4.0-87-generic'

Abban az esetben, ha az initrd-ben van copymods script, akkor teljesen mindegy, hogy a guest fájlrendszerébe felmásoltuk-e korábban a /lib/modules tartalmát a host oprendszerből, vagy sem, ezért nagyon sok modul hiányozhat pl. egy docker használata esetén.

Megoldási módok

1. copymods script törlése/átírása

Nem túl szép megoldás, inkább tüneti kezelésnek mondanám, rövidtávú, instabil hack.

Az initrd-be kerülő copymods script a /usr/share/initramfs-tools/scripts/init-bottom könyvtárban található. Törüljük vagy kommentezzük ki a problémás részeket belőle, utána update-eljük az initramfs-t.

update-initramfs -u -k all

Ezután (ha töröltük és nem módosítottuk), már nem kellene találatot kihoznia a következő sornak:

lsinitramfs /boot/initrd.img-`uname -r` | egrep copymods

2. copymods csomag eltávolítása

Eltávolíthatjuk az oprendszergen található copymods csomagot:

apt purge cloud-initramfs-copymods

Ez a parancs automatikusan update-eli az aktuális kernel initrd fájlját is, tehát nem kell kézzel futtatni.

Ezután sem kellene találatot kihoznia a következő sornak:

lsinitramfs /boot/initrd.img-`uname -r` | egrep copymods

Nem biztos, hogy ez a legstabilabb megoldás, hiszen bármilyen más csomagnak lehet függősége és később felkerülhet.

3. szükséges modulok hozzáadása

Amikor dockert akartam futtatni virtualizált környezetben, belefutottam abba a problémába, hogy nem indul el a szerviz, mert modulok hiányoztak neki:

dockerd: level=warning msg="Running modprobe bridge br_netfilter failed with message: modprobe: WARNING: Module bridge not found in directory /lib/modules/4.4.0-87-gen
dockerd: modprobe: WARNING: Module br_netfilter not found in directory /lib/modules/4.4.0-87-generic
dockerd: error: exit status 1"
dockerd: level=warning msg="Running modprobe nf_nat failed with message: `modprobe: WARNING: Module nf_nat not found in directory /lib/modules/4.4.0-87-generic`, error
dockerd: level=warning msg="Running modprobe xt_conntrack failed with message: `modprobe: WARNING: Module xt_conntrack not found in directory /lib/modules/4.4.0-87-gen

Ez azért van, mert az initramfs-ből felül lett írva a /lib/modules könyvtár, tehát hiába másoltam oda minden modult, amit itt a docker hiányol.

A megoldás itt az, hogy az initrd-hez hozzáadjuk a szükséges modulokat a hoszt oprendszeren:

vi /etc/initramfs-tools/modules

...

br_netfilter
bridge
ip_tables
ipt_MASQUERADE
iptable_filter
iptable_nat
llc
nf_conntrack
nf_conntrack_ipv4
nf_conntrack_netlink
nf_nat
nf_nat_ipv4
nf_nat_masquerade_ipv4
stp
x_tables
xt_addrtype
xt_conntrack
veth

Majd update-initramfs:

update-initramfs -u -k all

Ezek után ellenőrizzük, hogy az az initramfs, ami be van állítva a Xen guest-nek (ramdisk paraméter), tartalmazza-e a modulokat, amiket hozzáadtunk:

lsinitramfs /boot/initrd.img-4.4.0-87-generic | egrep "br_netfilter|bridge|ip_tables|ipt_MASQUERADE|iptable_filter|iptable_nat|llc|nf_conntrack|nf_conntrack_ipv4|nf_conntrack_netlink|nf_nat|nf_nat_ipv4|nf_nat_masquerade_ipv4|stp|x_tables|xt_addrtype|xt_conntrack"

Rebootolni sem kell, az ezután induló xen guestek már ezt az initrd-t fogják használni.