Tarkibga o'tish

Kernel modullari

Linux kerneli monolit bo'lsa ham, uning katta qismi — ayniqsa uskuna drayverlari — faqat kerak bo'lganda yuklanadigan alohida bo'laklar sifatida qurilgan. Bu kernel har qanday tasavvur qilinadigan qurilma uchun drayverni doim xotirada saqlab turishi shart emasligini anglatadi: modul faqat mos uskuna aniqlanganda yoki foydalanuvchi yoxud boshqa modul uni aniq so'raganda yuklanadi.

Bu maqola to'g'ridan-to'g'ri Boot jarayoni va GRUB maqolasining davomi: kernel ishga tushgach, uning ichki, almashtirsa bo'ladigan bo'laklari aynan shunday boshqariladi.

Nimalarni o'rganasiz

Bu maqola oxirida siz quyidagilarni qila olasiz:

  • kernel moduli nima ekanini va nega u umuman alohida fayl sifatida mavjudligini tushuntirish;
  • hozir yuklangan modullar ro'yxatini lsmod bilan o'qish;
  • modprobe va insmod/rmmod o'rtasidagi farqni tushuntirish;
  • modulni har bir boot’da avtomatik yuklanadigan qilib sozlash yoki uning yuklanishini butunlay to'sib qo'yish;
  • modul bilan bog'liq muammoni dmesg va modinfo yordamida aniqlash.

Modul nima

Kernel moduli — ishlab turgan kernelga qo'shish yoki undan olib tashlash mumkin bo'lgan, .ko (kernel object) kengaytmali fayl. Tarmoq kartasi drayverlari, fayl tizimlari implementatsiyalari (vfat, nfs) va virtualizatsiya komponentlari (kvm) deyarli hammasi to'g'ridan-to'g'ri kernel image’iga kompilyatsiya qilingan kod sifatida emas, aynan shu yo'l bilan — modul sifatida yetkaziladi.

find /lib/modules/$(uname -r) -name '*.ko*' | head -n 5

Bu hozir ishlab turgan kernel uchun mavjud modul fayllaridan bir nechtasini ro'yxatlaydi. $(uname -r) ishlab turgan kernel versiyasi qatoriga aylanadi — modullar aynan shu versiyaga bog'langan katalogda saqlanadi, chunki bitta kernel versiyasi uchun yig'ilgan modul odatda boshqa versiyaga yuklanmaydi.

Yuklangan modullarni ko'rish

lsmod

Namunaviy chiqish:

Module                  Size  Used by
nf_tables             233472  10
vfat                   20480  1
fat                    86016  1 vfat
  • Module — modul nomi;
  • Size — u hozir qancha xotira egallayotgani;
  • Used by — unga bog'liq boshqa modullar yoki jarayonlar soni va nomlari. fat uchun ko'rsatilgan 1 vfat vfat moduli fat ga bog'liqligini bildiradi, shuning uchun vfat yuklangan ekan, fat ni olib tashlab bo'lmaydi.

Muayyan modul haqida batafsil ma’lumot olish uchun:

modinfo vfat

modinfo modul faylining joylashuvi, versiyasi, bog'liqliklari va qo'llab-quvvatlanadigan parametrlari haqida xabar beradi. U hech narsani yuklamaydi va o'zgartirmaydi, shuning uchun modulga tegishdan oldin uni ko'zdan kechirishning xavfsiz usuli.

Modulni yuklash: modprobe va insmod

Buyruq Nima qiladi Bog'liqliklarni hal qiladimi
modprobe <name> Modulni nomi bo'yicha topadi va yuklaydi Ha — o'zi bog'liq bo'lgan har qanday modulni avval avtomatik yuklaydi
insmod <path>.ko Modulni aniq ko'rsatilgan fayl yo'lidan to'g'ridan-to'g'ri yuklaydi Yo'q — bog'liqlik oldindan yuklanmagan bo'lsa, xato beradi

Amalda deyarli faqat modprobe ishlatiladi, chunki u /lib/modules/$(uname -r)/modules.dep dagi bog'liqliklar ro'yxatiga murojaat qiladi va kerakli har bir modulni to'g'ri tartibda avtomatik yuklaydi.

sudo modprobe vfat
lsmod | grep vfat

insmod asosan maxsus holatlar uchun qoldirilgan — masalan, yangi drayverni ishlab chiqish yoki debug qilishda bitta .ko faylni to'g'ridan-to'g'ri sinab ko'rish uchun.

Modulni olib tashlash

sudo modprobe -r vfat

yoki

sudo rmmod vfat

modprobe -r modulni va endi hech narsaga kerak bo'lmagan bog'liq modullarni birga olib tashlashga urinadi. rmmod esa faqat nomlangan modulni olib tashlaydi, boshqa hech narsani emas.

Warning

Faol ishlatilayotgan modulni — masalan, hozir mount qilingan fayl tizimi ortidagi drayverni — olib tashlashga urinish "Module is in use" xatosini beradi yoki ayrim hollarda tizim barqarorligiga ta’sir qilishi mumkin. Avval lsmod dagi Used by ustunini tekshiring.

Modulni boot paytida avtomatik yuklash

Har bir boot’da avtomatik yuklanishi kerak bo'lgan modul /etc/modules-load.d/ ostidagi .conf faylda ko'rsatiladi:

echo "vfat" | sudo tee /etc/modules-load.d/vfat.conf

Bu bitta modul nomini o'z ichiga olgan oddiy matn fayli. systemd-modules-load xizmati boot paytida shu kataloglarni o'qiydi va u yerda ko'rsatilgan hamma narsani yuklaydi.

Modulga parametr berish

Ko'p modullar o'z xatti-harakatini o'zgartiradigan sozlamalarni qabul qiladi — modinfo -p <name> muayyan modul qo'llab-quvvatlaydigan parametrlarni ro'yxatlaydi. Parametrni joriy yuklash uchun to'g'ridan-to'g'ri modprobe buyruq qatorida o'rnatish mumkin:

sudo modprobe <module> <parameter>=<value>

Parametrni doimiy qilish uchun uni /etc/modprobe.d/ ostidagi options qatoriga yozing:

echo "options <module> <parameter>=<value>" | sudo tee /etc/modprobe.d/<module>.conf

Yuklangan modul uchun haqiqatan amal qilayotgan qiymatni sysfs’dan o'qish mumkin:

cat /sys/module/<module>/parameters/<parameter>

Warning

modprobe <module> param=value faqat modul hali yuklanmagan bo'lsa kuchga kiradi — modul allaqachon mavjud bo'lsa, modprobe hech narsa qilmaydi va parametr indamay e’tiborsiz qoldiriladi. Yuklangan modulning parametrini o'zgartirish uchun uni olib tashlab, qayta yuklang (modprobe -r, so'ng modprobe). initramfs ichiga joylangan modul uchun esa options qatorini yozing va boot paytida modul yuklanishidan oldin qiymat joyida bo'lishi uchun update-initramfs -u bilan qayta yig'ing.

Modulni to'sib qo'yish (blacklist)

Ba’zan muayyan modulning avtomatik yuklanishiga yo'l qo'ymaslik kerak bo'ladi — masalan, mos kelmaydigan drayver muammo tug'dirayotganda. Blacklist mexanizmi aynan shu uchun:

echo "blacklist nouveau" | sudo tee /etc/modprobe.d/blacklist-nouveau.conf

Danger

Blacklist modulning bundan keyin avtomatik yuklanishini to'xtatadi, lekin ayni paytda allaqachon yuklangan modulni olib tashlamaydi — u faqat kelajakdagi yuklashlarga ta’sir qiladi. Video yoki tarmoq drayverini blacklist qilishdan oldin oqibatlarini (masalan, konsolga kirish imkonini yo'qotish) tushunib oling; production serverda bunday o'zgarishni faqat muqobil konsol yo'li (masalan, IPMI) mavjud bo'lganda sinab ko'ring.

Blacklist ba’zan initramfs’ni ham yangilashni talab qiladi, chunki ayrim modullar to'g'ridan-to'g'ri uning ichiga joylangan:

sudo update-initramfs -u

Modul muammosini aniqlash

sudo modprobe vfat
dmesg | tail -n 20

dmesg kernelning xabarlar halqa buferini (ring buffer) ko'rsatadi — agar modulni yuklash muvaffaqiyatsiz bo'lsa (uskuna yo'q, versiya mos kelmaydi), sababi odatda shu yerda ko'rinadi.

Muayyan modulga oid kernel xabarlarini filtrlash:

dmesg | grep -i vfat

Keng tarqalgan xatolar

modprobe o'rniga insmod ishlatish

insmod bog'liqliklarni hal qilmaydi. Agar modul oldindan yuklanmagan boshqa modulga bog'liq bo'lsa, insmod "unknown symbol" xatosi bilan yiqiladi. Oddiy ishlatish uchun doim modprobe sukut bo'yicha tanlov bo'lishi kerak.

Used by ni tekshirmasdan modulni olib tashlash

Agar boshqa modul yoki faol mount unga bog'liq bo'lsa, olib tashlash yo butunlay muvaffaqiyatsiz bo'ladi yoki ayrim hollarda kutilmagan xatti-harakatga olib keladi.

Blacklist qilingan modulning baribir yuklanishi

Modul allaqachon initramfs ichiga joylangan bo'lishi mumkin. Bunday holatda faqat /etc/modprobe.d/ ga yozish yetarli emas — update-initramfs -u ham kerak.

Mashqlar

  1. lsmod chiqishidan uchta modulni tanlang va modinfo yordamida har birining tavsifi va bog'liqliklarini aniqlang.
  2. O'chirib tashlasa bo'ladigan VM’da zararsiz modulni (masalan, vfat) modprobe -r bilan olib tashlang, lsmod bilan tasdiqlang, so'ng modprobe bilan qayta yuklang.
  3. O'sha modul uchun /etc/modules-load.d/ ostida doimiy yuklash faylini yarating va qayta yuklashdan keyin lsmod bilan tasdiqlang (faqat sinov VM’ida).
  4. dmesg chiqishidan "module" so'zi tilga olingan so'nggi xabarlarni qidiring va har biri qaysi modulga tegishli ekanini aniqlang.

Mashqni bajardim deyish uchun: hozir lsmod da turgan istalgan modul uchun uni olib tashlashdan oldin nimani tekshirish kerakligini tushuntira olishingiz kerak.

Xulosa

Kernel modullari drayverlar va fayl tizimlarini qo'llab-quvvatlash kabi imkoniyatlarni ishlab turgan kernelga qo'shish yoki undan olib tashlash imkonini beradi. lsmod joriy holatni, modinfo esa muayyan modul haqida tafsilotlarni ko'rsatadi; modprobe bog'liqliklarni hal qilgan holda modullarni yuklaydi yoki olib tashlaydi, insmod/rmmod esa to'g'ridan-to'g'ri aniq fayl ustida ishlaydi. Avtomatik yuklash /etc/modules-load.d/ orqali, to'sib qo'yish esa /etc/modprobe.d/ orqali sozlanadi. Boot bilan bog'liq chuqurroq nosozliklar uchun keyingi tegishli maqola — Rescue va emergency mode.

Manbalar