میخواستم یه پروژه ای رو بیارم بالا و تستش کنم. پروژه داکر بود و وقتی زدم که اجرا شه یه خطای عجیبی داد مبتنی بر اینکه کرنل ماژول veth پیدا نشد و نمیتونه لودش کنه :/
با lsmod متوجه شدم که ماژول لود نیست و سعی کردم با modprobe، دستی لودش کنم و دیدم که داره خطا میده و میگه:
FATAL: Module veth not found in directory /lib/modules/7.2.3-arch1-3 😐بعد از سرچ و تحقیق متوجه یه چیز خیلی بامزه و ایراد کارم شدم.
من قبل از اینکه پروژه رو ران کنم زده بودم سیستم اپدیت شه (sudo pacman -Syu)
ولی reboot نکرده بودم!!
همونطور که میدونید وقتی کرنل، ماژول هاش و کلا پکیج های سیستم اپدیت شه دیتای روی دیسک بروز میشه و چیزایی که توی رم لود شده هیچ تغییری نمیکنن. از طرفی کرنل مثل برنامه های عادی نیست که اصطلاحا terminate بشه و کرنل جدید بیاد بالا، پس همونطور به کارش ادامه میده تا سیستم ریبوت شه.
حالا اینجا کرنل اپدیت شده بود.
داکر از کرنل میخاست که براش عملیات شبکه انجام بده و کرنل هم میومد veth رو لود کنه منتها از اون جایی که کرنل اپدیت داده بود و مسیر فایل های ماژول هاش روی دیسک تغییر کرده بود نمیتونستت لود کنه.
کرنل قدیمی همچنان تلاش میکرد نسخه قدیمی veth رو لود کنه (بر اساس kernelrelease دنبال ماژول تو مسیر مربوط به همون کرنل میگرده) در صورتی که اصلا همچین فایلی توی سیستم وجود نداشت 💾
مثلا فرض کن ماژول اپدیت شده تو مسیر زیر باشه:
/lib/modules/7.2.4-arch1-3
اینجا چون کرنل توی رم هنوز کرنل قدیمیه سعی میکنه ماژول veth رو از مسیر زیر بخونه:
/lib/modules/7.2.3-arch1-3
منطقا دیتا های اپدیت شده توی دیسک تغییر کردن و این مسیر دیگه معتبر نیست و اینجاست که کرنل نمیتونه ماژول رو لود کنه و خطا رو رولبک میکنه سمت داکر 🐳