Тунелът ви работеше вчера, машината се рестартира след обновяване и сега интерфейсът не се вдига. В система, където WireGuard се компилира като външен модул, обичайната причина е, че модулът на диска принадлежи на различно издание на ядрото от това, което работи сега. Заглавки с подобно име на същата машина не доказват нищо за това съответствие. Само низът на изданието решава това.

Работещо или инсталирано ядро

Обновяването инсталира нов пакет на ядрото и оставя стария на диска, докато машината не се рестартира. След рестарта работещото издание се променя и всеки модул, компилиран срещу предишното, става неизползваем, въпреки че файловете му са още там. Тази разлика обяснява познатия доклад за машина, която е била наред преди рестарт и се е счупила след него, без промяна в конфигурацията помежду им. Тя обяснява също защо преинсталирането на заглавки понякога изглежда, че решава проблема, а понякога не.

Пакетът със заглавки, който инсталирате, може да отговаря на най-новия пакет на ядрото, а не на ядрото, което действително е стартирано, и нищо в името на пакета не различава тези случаи; само низът на изданието го прави. Проверете какво работи, преди да проверите какво е инсталирано.

Три проверки преди прекомпилация

Първата проверка е кое ядро работи. Втората е дали съществува модул за това издание и дали може да бъде намерен. Третата е дали ядрото вече го е заредило. Четвъртият въпрос, дали интерфейсът може да бъде създаден, проверява права, а не модула, затова мястото му е след прекомпилацията, а не в този списък.

Командите по-долу отговарят на първите три, без да променят нищо. Прочетете всеки резултат, преди да продължите, защото всеки отговор изключва различно решение.

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

Ако вторият ред съобщава, че пътят не съществува, средата за компилиране на работещото ядро липсва и нищо, което компилирате, няма да съвпадне с нея. Ако modinfo се провали, докато пътят съществува, модулът може изобщо да не е инсталиран, което е нормално за ядра, които доставят реализацията в дървото. Ако modinfo успее, а lsmod не показва нищо, модулът съществува, но не е зареден, което е проблем при зареждане, а не при компилиране. Всеки резултат ви отвежда на различно място, затова четенето е по-важно от командите.

Компилирайте срещу работещото издание

Външният модул се компилира срещу подготвено дърво на ядрото и ръководството на ядрото за външни модули описва използването на директорията за компилиране, която принадлежи на работещото ядро, а не на която и да е директория с най-висок номер на версия. Тази директория за компилиране е символна връзка, поддържана от пакета на ядрото, така че сочи към дървото за изданието, което е стартирано в момента. Смисълът е точно в това отклонение: то премахва избор, който иначе бихте направили грешно. Изричното ѝ назоваване прави целта еднозначна.

Една подробност е важна, когато дървото е само подготвено, а не напълно компилирано. Целта за подготовка не създава файла за версиониране на символи, който някои външни компилации изискват, затова дърво, пълно със заглавки, не е автоматично пълна среда за компилиране. Ако компилацията се провали заради липсващи символи, този файл е първото място за проверка.

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

Когато пакетираните заглавки изостават

При дистрибуции и едноплаткови компютри, които пакетират собствени ядра, заглавките могат да изостават от изданието с дни или седмици. Пакетът със заглавки може да е правилен по име и по-стар по съдържание, което дава компилация, която се компилира и след това се проваля при зареждане, а не по време на компилирането. Смесването на източници влошава нещата: ядро от дистрибуция със заглавки от хранилище на трета страна или ядро от доставчик с общи заглавки може да се компилира чисто и въпреки това да бъде отхвърлено от работещото ядро, защото конфигурацията е различна. Номерата на версиите сами по себе си не решават това.

Ако машината следва експериментален канал за ядра, решете съзнателно дали да останете там със съответстващи артефакти за компилиране, или да се върнете към поддържания набор от пакети. Повтарянето на обновяването с надежда, че частите ще се подредят, не е план, защото същото несъответствие се повтаря всеки път.

Проверете интерфейса след прекомпилацията

След успешна инсталация създаването на интерфейса е тестът, който има значение, последван от четене на това какво ядрото действително е заредило и какво казва журналът, ако е отказало. Модул, който се зарежда, и интерфейс, който не може да бъде създаден, са различни повреди с различни причини. Трите команди по-долу ги разделят.

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

Ако модулът откаже да се зареди, журналът на ядрото посочва причината и несъответствието на версията е само една от възможностите. Прочетете този ред, преди да компилирате отново, защото втора идентична компилация изразходва същите десет минути и дава същия отказ. След това премахнете временния интерфейс, за да започне следващият тест от чисто състояние.

Подобни статии