Váš tunel včera fungoval, po aktualizaci se stroj restartoval a teď se rozhraní nezvedne. V systému, kde se WireGuard sestavuje jako externí modul, bývá obvyklou příčinou to, že modul na disku patří k jinému vydání jádra než tomu, které právě běží. Hlavičky s podobným názvem na stejném stroji o této shodě nic nedokazují. Rozhoduje to jen řetězec vydání.

Běžící, nebo nainstalované jádro

Aktualizace nainstaluje nový balíček jádra a starý ponechá na disku, dokud se stroj nerestartuje. Po restartu se běžící vydání změní a každý modul sestavený proti předchozímu přestane fungovat, i když jsou jeho soubory stále na místě. Tato mezera vysvětluje známé hlášení o stroji, který byl před restartem v pořádku a po něm nefunkční, bez jakékoli změny konfigurace mezi tím. Vysvětluje také, proč přeinstalace hlaviček někdy vypadá, že problém řeší, a někdy ne.

Balíček hlaviček, který instalujete, může odpovídat nejnovějšímu balíčku jádra, a ne jádru, které se skutečně zavedlo, a nic v názvu balíčku tyto případy nerozlišuje; dělá to jen řetězec vydání. Zkontrolujte, co běží, dřív než zkontrolujete, co je nainstalováno.

Tři kontroly před novým sestavením

První kontrola je, které jádro běží. Druhá je, zda modul pro toto vydání existuje a lze ho najít. Třetí je, zda ho jádro už načetlo. Čtvrtá otázka, zda lze vytvořit rozhraní, testuje oprávnění, a ne modul, takže patří až po novém sestavení, ne do tohoto seznamu.

Níže uvedené příkazy odpovídají na první tři, aniž by cokoli měnily. Přečtěte si každý výsledek, než půjdete dál, protože každá odpověď vylučuje jinou opravu.

uname -r
ls -l /lib/modules/$(uname -r)/build
modinfo wireguard
lsmod | grep wireguard

Pokud druhý řádek hlásí, že cesta neexistuje, chybí prostředí pro sestavení běžícího jádra a nic, co zkompilujete, mu nebude odpovídat. Pokud modinfo selže, zatímco cesta existuje, modul možná vůbec není nainstalován, což je u jader, která implementaci dodávají ve stromu, normální. Pokud modinfo uspěje a lsmod nic neukáže, modul existuje, ale není načten, což je problém při načítání, ne při sestavování. Každý výsledek vás zavede jinam, a proto je čtení důležitější než příkazy.

Sestavujte proti běžícímu vydání

Externí modul se kompiluje proti připravenému stromu jádra a průvodce jádra pro externí moduly popisuje použití adresáře pro sestavení, který patří běžícímu jádru, a ne toho, který má nejvyšší číslo verze. Tento adresář pro sestavení je symbolický odkaz spravovaný balíčkem jádra, takže ukazuje na strom vydání, které je právě zavedeno. Právě v této nepřímosti je smysl: odstraňuje volbu, kterou byste jinak udělali špatně. Když ho pojmenujete výslovně, je cíl jednoznačný.

Jeden detail je důležitý, když je strom jen připravený, a ne plně sestavený. Cíl přípravy nevytváří soubor verzování symbolů, který některá externí sestavení potřebují, takže strom plný hlaviček není automaticky úplné prostředí pro sestavení. Pokud sestavení selže na chybějících symbolech, je tento soubor prvním místem, kam se podívat.

sudo make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
sudo make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install
sudo depmod -a

Když balené hlavičky zaostávají

U distribucí a jednodeskových počítačů, které si balí vlastní jádra, mohou hlavičky za vydáním zaostávat dny nebo týdny. Balíček hlaviček může být správný jménem a starší obsahem, což dává sestavení, které se zkompiluje a pak selže při načtení, a ne během kompilace. Míchání zdrojů to zhoršuje: distribuční jádro s hlavičkami z repozitáře třetí strany nebo jádro výrobce s obecnými hlavičkami se může čistě zkompilovat a přesto ho běžící jádro odmítne, protože se konfigurace liší. Samotná čísla verzí to nevyřeší.

Pokud stroj sleduje experimentální kanál jádra, rozhodněte se vědomě, zda tam zůstat s odpovídajícími artefakty sestavení, nebo se vrátit k podporované sadě balíčků. Opakovat aktualizaci a doufat, že si díly sednou, není plán, protože se stejný nesoulad opakuje pokaždé.

Ověřte rozhraní po novém sestavení

Po úspěšné instalaci je vytvoření rozhraní tou zkouškou, na které záleží, následuje čtení toho, co jádro skutečně načetlo, a co říká záznam, pokud odmítlo. Modul, který se načte, a rozhraní, které nelze vytvořit, jsou různé poruchy s různými příčinami. Níže uvedené tři příkazy je oddělují.

sudo ip link add wg9 type wireguard
lsmod | grep wireguard
sudo dmesg | tail -5

Pokud modul odmítne se načíst, záznam jádra uvede důvod a neshoda verzí je jen jedna z možností. Přečtěte si ten řádek, než budete znovu sestavovat, protože druhé stejné sestavení spotřebuje stejných deset minut a dá stejné odmítnutí. Potom odstraňte dočasné rozhraní, aby další test začal z čistého stavu.

Související články