„WireGuard“ modulis neįsikelia po branduolio atnaujinimo? Patikrinkite tai
Išorinis modulis turi būti kompiliuojamas tam branduoliui, kuris jį įkels, o ne naujausiam diske esančiam antraščių paketui. Prieš perkompiliuodami patikrinkite veikiančią versiją.
Jūsų tunelis vakar veikė, po atnaujinimo mašina persikrovė, o dabar sąsaja nekeliama. Sistemoje, kurioje „WireGuard“ kompiliuojamas kaip išorinis modulis, įprasta priežastis yra ta, kad diske esantis modulis priklauso kitai branduolio versijai nei ta, kuri dabar veikia. Panašaus pavadinimo antraštės toje pačioje mašinoje nieko neįrodo apie tą atitikimą. Tai lemia tik versijos eilutė.
Veikiantis ar įdiegtas branduolys
Atnaujinimas įdiegia naują branduolio paketą, o senąjį palieka diske, kol mašina persikraus. Po perkrovimo pasikeičia veikianti versija, ir bet kuris modulis, sukompiliuotas ankstesnei versijai, tampa netinkamas naudoti, nors jo failai dar yra. Šis skirtumas paaiškina pažįstamą pranešimą apie mašiną, kuri prieš perkrovimą buvo tvarkinga, o po jo sugedo, tarp jų nepakeitus jokios konfigūracijos. Jis taip pat paaiškina, kodėl antraščių perdiegimas kartais atrodo išsprendžiąs problemą, o kartais ne.
Jūsų įdiegtas antraščių paketas gali atitikti naujausią branduolio paketą, o ne branduolį, kuris iš tikrųjų buvo įkeltas, ir niekas paketo pavadinime neišskiria tų atvejų; tai daro tik versijos eilutė. Prieš tikrindami, kas įdiegta, patikrinkite, kas veikia.
Trys patikrinimai prieš perkompiliavimą
Pirmas patikrinimas yra tai, kuris branduolys veikia. Antrasis – ar yra tos versijos modulis ir ar jį galima rasti. Trečiasis – ar branduolys jį jau įkėlė. Ketvirtas klausimas, ar galima sukurti sąsają, tikrina teises, o ne modulį, todėl jo vieta po perkompiliavimo, o ne šiame sąraše.
Toliau pateiktos komandos atsako į pirmuosius tris nieko nekeisdamos. Perskaitykite kiekvieną rezultatą prieš tęsdami, nes kiekvienas atsakymas pašalina kitą taisymą.
uname -r
ls -l /lib/modules/$(uname -r)/build
modinfo wireguard
lsmod | grep wireguard
Jei antroji eilutė praneša, kad kelio nėra, trūksta veikiančio branduolio kompiliavimo aplinkos ir niekas, ką sukompiliuosite, jai netiks. Jei modinfo nepavyksta, nors kelias yra, modulis gali būti visai neįdiegtas, o tai normalu branduoliuose, kurie įgyvendinimą pateikia medyje. Jei modinfo pavyksta, o lsmod nieko nerodo, modulis yra, bet neįkeltas, ir tai įkėlimo, o ne kompiliavimo problema. Kiekvienas rezultatas nukreipia jus kitur, todėl skaitymas svarbesnis už komandas.
Kompiliuokite pagal veikiančią versiją
Išorinis modulis kompiliuojamas pagal paruoštą branduolio medį, o branduolio išorinių modulių vadovas aprašo naudoti kompiliavimo katalogą, priklausantį veikiančiam branduoliui, o ne tą, kuris turi didžiausią versijos numerį. Tas kompiliavimo katalogas yra simbolinė nuoroda, kurią prižiūri branduolio paketas, todėl ji rodo į šiuo metu įkelto leidimo medį. Netiesioginumas ir yra esmė: jis pašalina pasirinkimą, kurį kitaip padarytumėte neteisingai. Kai jį pavadinate aiškiai, tikslas tampa vienareikšmis.
Viena detalė svarbi, kai medis tik paruoštas, o ne visiškai sukompiliuotas. Paruošimo tikslas nesukuria simbolių versijavimo failo, kurio reikia kai kuriems išoriniams kompiliavimams, todėl antraščių pilnas medis nėra automatiškai visavertė kompiliavimo aplinka. Jei kompiliavimas nepavyksta dėl trūkstamų simbolių, tas failas yra pirmoji vieta, kurią reikia patikrinti.
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
Kai supakuotos antraštės atsilieka
Distribucijose ir vienos plokštės kompiuteriuose, kurie pakuoja savo branduolius, antraštės gali atsilikti nuo versijos dienomis ar savaitėmis. Antraščių paketas gali būti teisingas pavadinimu ir senesnis turiniu, o tai duoda kompiliavimą, kuris sukompiliuojamas ir paskui nepavyksta įkeliant, o ne kompiliavimo metu. Šaltinių maišymas tai pablogina: platinimo branduolys su antraštėmis iš trečiosios šalies saugyklos arba gamintojo branduolys su bendromis antraštėmis gali švariai susikompiliuoti ir vis tiek būti atmestas veikiančio branduolio, nes konfigūracija skiriasi. Vien versijų numeriai to neišsprendžia.
Jei mašina seka eksperimentinį branduolio kanalą, sąmoningai nuspręskite, ar likti ten su atitinkamais kompiliavimo artefaktais, ar grįžti prie palaikomo paketų rinkinio. Kartoti atnaujinimą ir tikėtis, kad dalys suderės, nėra planas, nes tas pats neatitikimas kartojasi kiekvieną kartą.
Patikrinkite sąsają po perkompiliavimo
Po sėkmingo diegimo sąsajos sukūrimas yra tas bandymas, kuris svarbus, o po jo – skaitymas, ką branduolys iš tikrųjų įkėlė ir ką sako žurnalas, jei atsisakė. Įkeliamas modulis ir nesukuriama sąsaja yra skirtingi gedimai su skirtingomis priežastimis. Trys toliau pateiktos komandos juos atskiria.
sudo ip link add wg9 type wireguard
lsmod | grep wireguard
sudo dmesg | tail -5
Jei modulis atsisako įsikelti, branduolio žurnalas nurodo priežastį, o versijų neatitikimas tėra viena iš galimybių. Perskaitykite tą eilutę prieš perkompiliuodami, nes antras identiškas kompiliavimas sunaudoja tas pačias dešimt minučių ir duoda tą patį atsisakymą. Tada pašalinkite laikiną sąsają, kad kitas bandymas prasidėtų nuo švarios būsenos.