อุโมงค์ของคุณทำงานได้เมื่อวาน เครื่องรีบูตหลังอัปเดต และตอนนี้อินเทอร์เฟซไม่ขึ้น บนระบบที่สร้าง 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

ถ้าโมดูลปฏิเสธที่จะโหลด บันทึกเคอร์เนลระบุสาเหตุ และความไม่ตรงกันของเวอร์ชันเป็นเพียงหนึ่งในความเป็นไปได้ อ่านบรรทัดนั้นก่อนสร้างใหม่ เพราะการสร้างซ้ำแบบเดิมใช้เวลาสิบนาทีเท่าเดิมและให้การปฏิเสธแบบเดิม จากนั้นลบอินเทอร์เฟซชั่วคราวเพื่อให้การทดสอบครั้งต่อไปเริ่มจากสภาพที่สะอาด

บทความที่เกี่ยวข้อง