Mô-đun WireGuard không tải sau khi cập nhật nhân? Hãy kiểm tra điều này
Mô-đun bên ngoài phải được biên dịch cho nhân sẽ tải nó, không phải cho gói tiêu đề mới nhất trên đĩa. Kiểm tra bản phát hành đang chạy trước khi biên dịch lại.
Đường hầm của bạn đã hoạt động hôm qua, máy khởi động lại sau một bản cập nhật, và giờ giao diện không lên. Trên hệ thống nơi WireGuard được biên dịch như một mô-đun bên ngoài, nguyên nhân thường gặp là mô-đun trên đĩa thuộc một bản phát hành nhân khác với bản đang chạy hiện tại. Các gói tiêu đề có tên tương tự trên cùng một máy không chứng minh được gì về sự khớp đó. Chỉ chuỗi phát hành mới quyết định điều đó.
Nhân đang chạy hay nhân đã cài
Một bản cập nhật cài gói nhân mới và để gói cũ trên đĩa cho đến khi máy khởi động lại. Sau khi khởi động lại, bản phát hành đang chạy thay đổi, và mọi mô-đun được biên dịch cho bản trước đó trở nên không dùng được dù các tệp của nó vẫn còn đó. Khoảng cách đó giải thích báo cáo quen thuộc về một máy vẫn tốt trước khi khởi động lại và hỏng sau đó, mà không có thay đổi cấu hình nào ở giữa. Nó cũng giải thích vì sao việc cài lại các gói tiêu đề đôi khi có vẻ khắc phục được sự cố và đôi khi không.
Gói tiêu đề bạn cài có thể khớp với gói nhân mới nhất thay vì nhân thực sự đã khởi động, và không có gì trong tên gói phân biệt các trường hợp đó; chỉ chuỗi phát hành làm được điều đó. Hãy kiểm tra cái gì đang chạy trước khi kiểm tra cái gì đã cài.
Ba kiểm tra trước khi biên dịch lại
Kiểm tra đầu tiên là nhân nào đang chạy. Kiểm tra thứ hai là liệu có mô-đun cho bản phát hành đó và có tìm được nó không. Kiểm tra thứ ba là liệu nhân đã tải nó chưa. Câu hỏi thứ tư, liệu có thể tạo giao diện, kiểm tra quyền chứ không phải mô-đun, nên nó thuộc về sau khi biên dịch lại chứ không nằm trong danh sách này.
Các lệnh dưới đây trả lời ba câu đầu mà không thay đổi gì. Hãy đọc từng kết quả trước khi tiếp tục, vì mỗi câu trả lời loại trừ một cách sửa khác nhau.
uname -r
ls -l /lib/modules/$(uname -r)/build
modinfo wireguard
lsmod | grep wireguard
Nếu dòng thứ hai báo rằng đường dẫn không tồn tại, môi trường biên dịch cho nhân đang chạy bị thiếu và không có gì bạn biên dịch sẽ khớp với nó. Nếu modinfo thất bại trong khi đường dẫn tồn tại, có thể mô-đun chưa được cài đặt, điều này là bình thường trên các nhân cung cấp phần triển khai ngay trong cây. Nếu modinfo thành công và lsmod không hiển thị gì, mô-đun có tồn tại nhưng chưa được tải, đây là vấn đề lúc tải chứ không phải lúc biên dịch. Mỗi kết quả đưa bạn đến một nơi khác, vì vậy việc đọc quan trọng hơn các lệnh.
Biên dịch cho bản phát hành đang chạy
Mô-đun bên ngoài được biên dịch dựa trên một cây nhân đã chuẩn bị, và hướng dẫn mô-đun bên ngoài của nhân mô tả việc dùng thư mục biên dịch thuộc nhân đang chạy thay vì thư mục có số phiên bản cao nhất. Thư mục biên dịch đó là một liên kết tượng trưng do gói nhân duy trì, nên nó trỏ tới cây của bản phát hành đang được khởi động. Chính sự gián tiếp là điểm mấu chốt: nó loại bỏ một lựa chọn mà nếu không bạn sẽ làm sai. Việc gọi tên nó một cách rõ ràng làm mục tiêu không còn mơ hồ.
Một chi tiết quan trọng khi cây mới chỉ được chuẩn bị chứ chưa được biên dịch đầy đủ. Mục tiêu chuẩn bị không tạo ra tệp phiên bản ký hiệu mà một số bản biên dịch bên ngoài cần, nên một cây đầy tiêu đề không tự động là môi trường biên dịch hoàn chỉnh. Nếu một bản biên dịch thất bại vì thiếu ký hiệu, tệp đó là nơi đầu tiên cần xem.
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
Khi các gói tiêu đề bị chậm
Trên các bản phân phối và máy tính một bo mạch tự đóng gói nhân của mình, các gói tiêu đề có thể chậm hơn bản phát hành vài ngày hoặc vài tuần. Gói tiêu đề có thể đúng về tên và cũ hơn về nội dung, điều này tạo ra một bản biên dịch chạy được rồi thất bại lúc tải chứ không phải trong lúc biên dịch. Trộn nguồn làm tình hình tệ hơn: nhân của bản phân phối với tiêu đề từ kho của bên thứ ba, hoặc nhân của nhà sản xuất với tiêu đề chung, có thể biên dịch sạch và vẫn bị nhân đang chạy từ chối vì cấu hình khác. Chỉ số phiên bản không giải quyết được điều đó.
Nếu máy theo một kênh nhân thử nghiệm, hãy chủ động quyết định ở lại đó với các sản phẩm biên dịch khớp, hay quay về bộ gói được hỗ trợ. Lặp lại cập nhật và hy vọng các mảnh khớp nhau không phải là kế hoạch, vì cùng một sự không khớp sẽ tái diễn mỗi lần.
Xác minh giao diện sau khi biên dịch lại
Sau khi cài đặt thành công, việc tạo giao diện là phép thử quan trọng, tiếp theo là đọc xem nhân thực sự đã tải gì và nhật ký nói gì nếu nó từ chối. Mô-đun tải được và giao diện không tạo được là hai lỗi khác nhau với nguyên nhân khác nhau. Ba lệnh dưới đây tách chúng ra.
sudo ip link add wg9 type wireguard
lsmod | grep wireguard
sudo dmesg | tail -5
Nếu mô-đun từ chối tải, nhật ký nhân nêu lý do, và sự không khớp phiên bản chỉ là một trong các khả năng. Hãy đọc dòng đó trước khi biên dịch lại, vì lần biên dịch giống hệt thứ hai tốn đúng mười phút đó và cho đúng lời từ chối đó. Sau đó hãy xóa giao diện tạm để lần thử tiếp theo bắt đầu từ trạng thái sạch.