Модуль WireGuard не загружаецца пасля абнаўлення ядра? Праверце гэта
Знешні модуль трэба збіраць супраць таго ядра, якое яго загрузіць, а не супраць найноўшага пакета загалоўкаў на дыску. Праверце працоўны выпуск перад перазборкай.
Ваш тунель працаваў учора, машына перазагрузілася пасля абнаўлення, і цяпер інтэрфейс не ўздымаецца. У сістэме, дзе 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
Калі модуль адмаўляецца загружацца, журнал ядра называе прычыну, і неадпаведнасць версій - толькі адна з магчымасцяў. Прачытайце гэты радок, перш чым зноў збіраць, бо другая ідэнтычная зборка выдаткаваць тыя ж дзесяць хвілін і дасць тую ж адмову. Пасля гэтага выдаліце часовы інтэрфейс, каб наступны тэст пачаўся з чыстага стану.