Hammaga salom, biz siz bilan "Linux-dagi virtual fayl tizimlari: ular nima uchun kerak va ular qanday ishlaydi?" nashrining ikkinchi qismini siz bilan baham ko'ramiz. Birinchi qismni o'qishingiz mumkin
eBPF va bcc vositalaridan foydalangan holda VFSni qanday kuzatish mumkin
Yadro fayllarda qanday ishlashini tushunishning eng oson yo'li sysfs
buni amalda ko'rish va ARM64 ni tomosha qilishning eng oson yo'li eBPF dan foydalanishdir. eBPF (Berkeley Packet Filterning qisqartmasi) ishlayotgan virtual mashinadan iborat query
) buyruq satridan. Yadro manbalari o'quvchiga yadro nima qilishi mumkinligini aytadi; yuklangan tizimda eBPF vositalarini ishga tushirish yadro aslida nima qilayotganini ko'rsatadi.
Yaxshiyamki, asboblar yordamida eBPF-dan foydalanishni boshlash juda oson bcc
Bu Python skriptlari bo'lib, kichik C kodlari kiritiladi, bu ikkala tilni yaxshi biladigan har bir kishi ularni osongina o'zgartirishi mumkinligini anglatadi. IN bcc/tools
80 ta Python skripti mavjud, ya'ni ishlab chiquvchi yoki tizim ma'muri muammoni hal qilish uchun mos keladigan narsani tanlashi mumkin.
VFSlar ishlaydigan tizimda qanday ishlarni bajarishi haqida hech bo'lmaganda yuzaki tasavvurga ega bo'lish uchun harakat qilib ko'ring vfscount
yoki vfsstat
. Bu, aytaylik, o'nlab qo'ng'iroqlarni ko'rsatadi vfs_open()
va "uning do'stlari" tom ma'noda har soniyada sodir bo'ladi.
vfsstat.py
Bu oddiygina VFS funksiya chaqiruvlarini hisoblaydigan C kodli qo'shimchali Python skriptidir.
Keling, oddiyroq misol keltiramiz va USB flesh-diskini kompyuterga joylashtirganda va tizim uni aniqlaganimizda nima bo'lishini ko'rib chiqamiz.
eBPF-dan foydalanib, nima sodir bo'layotganini ko'rishingiz mumkin
/sys
USB flesh haydovchi kiritilganda. Bu erda oddiy va murakkab misol ko'rsatilgan.
Yuqorida ko'rsatilgan misolda, bcc
asbob sysfs_create_files()
. Biz buni ko'ramiz sysfs_create_files()
yordamida ishga tushirildi kworker
flesh-disk kiritilganiga javoban oqim, lekin qanday fayl yaratilgan? Ikkinchi misol eBPF kuchini ko'rsatadi. Bu yerga trace.py
Yadroning orqa izi (-K opsiyasi) va yaratilgan fayl nomini chop etadi sysfs_create_files()
. Yagona bayonot kiritish - bu LLVM bilan ishlaydigan Python skripti tomonidan taqdim etilgan osongina tanib olinadigan format qatorini o'z ichiga olgan C kodi. o'z vaqtida kompilyator. U ushbu qatorni kompilyatsiya qiladi va uni yadro ichidagi virtual mashinada bajaradi. To'liq funktsiya imzosi sysfs_create_files ()
format satri parametrlardan biriga murojaat qilishi uchun ikkinchi buyruqda takrorlanishi kerak. C kodining ushbu qismidagi xatolar C kompilyatoridan tanib olinadigan xatolarga olib keladi. Misol uchun, agar -l parametri o'tkazib yuborilsa, siz "BPF matnini kompilyatsiya qilish muvaffaqiyatsiz tugadi" ni ko'rasiz. C va Python bilan tanish bo'lgan dasturchilar asboblarni topadilar bcc
kengaytirish va o'zgartirish oson.
USB drayveri o'rnatilganda, yadro orqa izi PID 7711 ip ekanligini ko'rsatadi. kworker
faylni yaratgan «events»
в sysfs
. Shunga ko'ra, dan qo'ng'iroq sysfs_remove_files()
drayverni olib tashlash faylni o'chirishga olib kelganligini ko'rsatadi events
, bu mos yozuvlar hisoblashning umumiy kontseptsiyasiga mos keladi. Shu bilan birga, ko'rish sysfs_create_link ()
eBPF bilan USB drayverni o'rnatishda kamida 48 ta ramziy havola yaratilganligini ko'rsatadi.
Xo'sh, voqealar faylining maqsadi nima? Foydalanish disk_add_events ()
, va ikkalasi ham "media_change"
, yoki "eject_request"
voqea faylida qayd etilishi mumkin. Bu erda yadro bloki qatlami foydalanuvchi maydoniga "disk" paydo bo'lganligi va chiqarilganligi haqida xabar beradi. Ishlarning faqat manbadan qanday ishlashini aniqlashga urinish bilan solishtirganda, USB drayverini o'rnatish orqali ushbu tadqiqot usuli qanchalik ma'lumotli ekanligiga e'tibor bering.
Faqat o'qish uchun mo'ljallangan ildiz fayl tizimlari o'rnatilgan qurilmalarni faollashtiradi
Albatta, hech kim vilkasini rozetkadan tortib, serverni yoki kompyuterni o'chirmaydi. Lekin nima uchun? Buning sababi shundaki, jismoniy xotira qurilmalariga o'rnatilgan fayl tizimlari kechikkan yozishga ega bo'lishi mumkin va ularning holatini qayd qiluvchi ma'lumotlar tuzilmalari xotiraga yozish bilan sinxronlashtirilmasligi mumkin. Bu sodir bo'lganda, tizim egalari yordamchi dasturni ishga tushirish uchun keyingi yuklashgacha kutishlari kerak. fsck filesystem-recovery
va, eng yomon holatda, ma'lumotlarni yo'qotish.
Biroq, barchamiz bilamizki, ko'plab IoT qurilmalari, shuningdek, marshrutizatorlar, termostatlar va avtomobillar endi Linuxda ishlaydi. Ushbu qurilmalarning ko'pchiligi foydalanuvchi interfeysiga ega emas va ularni "toza" o'chirishning hech qanday usuli yo'q. Tasavvur qiling-a, boshqaruv blokiga quvvat yoqilganda, batareyasi o'chib qolgan mashinani ishga tushiring fsck
motor nihoyat qachon ishlay boshlaydi? Va javob oddiy. O'rnatilgan qurilmalar ildiz fayl tizimiga tayanadi ro-rootfs
(faqat o'qish uchun ildiz fayl tizimi)).
ro-rootfs
haqiqiylikdan kamroq ravshan bo'lgan ko'plab imtiyozlarni taklif qiladi. Bir afzalligi shundaki, zararli dastur unga yoza olmaydi /usr
yoki /lib
, agar u erda hech qanday Linux jarayoni yoza olmasa. Yana bir narsa shundaki, asosan o'zgarmas fayl tizimi masofaviy qurilmalarni dala qo'llab-quvvatlashi uchun juda muhimdir, chunki qo'llab-quvvatlash xodimlari dala tizimlari bilan nominal jihatdan bir xil bo'lgan mahalliy tizimlarga tayanadi. Ehtimol, eng muhim (lekin eng makkor) foyda shundaki, ro-rootfs dasturchilarni tizimni loyihalash bosqichida qaysi tizim ob'ektlari o'zgarmas bo'lishini hal qilishga majbur qiladi. Ro-rootflar bilan ishlash noqulay va og'riqli bo'lishi mumkin, chunki const o'zgaruvchilari ko'pincha dasturlash tillarida bo'ladi, ammo ularning afzalliklari qo'shimcha xarajatlarni osongina oqlaydi.
yaratilish rootfs
Faqat o'qish uchun o'rnatilgan ishlab chiquvchilar uchun qo'shimcha harakatlar talab etiladi va bu erda VFS rasmga tushadi. Linux fayllarning ichida bo'lishini talab qiladi /var
yozilishi mumkin edi va bundan tashqari, o'rnatilgan tizimlar bilan ishlaydigan ko'plab mashhur ilovalar konfiguratsiya yaratishga harakat qiladi dot-files
в $HOME
. Uy katalogidagi konfiguratsiya fayllari uchun bir yechim odatda ularni oldindan yaratish va yaratishdir rootfs
. uchun /var
Mumkin bo'lgan yondashuvlardan biri uni alohida yoziladigan bo'limga o'rnatishdir /
faqat o'qish uchun o'rnatilgan. Yana bir mashhur muqobil - bog'lash yoki qoplamali o'rnatishlardan foydalanish.
Bog'lanadigan va stackable o'rnatish, ularni konteynerlar tomonidan ishlatish
Buyruqni bajarish man mount
ishlab chiquvchilar va tizim ma'murlariga fayl tizimini bir yo'lda yaratish va keyin uni boshqa yo'lda ilovalarga ko'rsatish imkoniyatini beradigan bog'lanishi mumkin bo'lgan va qo'shilishi mumkin bo'lgan ulanishlarni o'rganishning eng yaxshi usuli. O'rnatilgan tizimlar uchun bu fayllarni saqlash qobiliyatini anglatadi /var
faqat o'qish uchun mo'ljallangan flesh-diskda, lekin ustki qatlam yoki bog'lanadigan o'rnatish yo'li tmpfs
в /var
yuklaganda, u ilovalarga eslatmalarni yozishga imkon beradi (scrawl). Keyingi safar o'zgarishlarni yoqsangiz /var
yo'qoladi. Qoplama o'rnatish o'rtasida birlik hosil qiladi tmpfs
va asosiy fayl tizimi va mavjud fayllarga ko'rinadigan o'zgartirishlar kiritish imkonini beradi ro-tootf
bog'lab qo'yiladigan o'rnatish esa yangilarini bo'sh qilishi mumkin tmpfs
papkalar yozilishi mumkin ro-rootfs
yo'llari. Vaholanki overlayfs
bu to'g'ri (proper
) fayl tizimi turi, bog'lanadigan o'rnatish amalga oshiriladi
Qoplama va bog'lanadigan o'rnatish tavsifiga asoslanib, hech kim ajablanmaydi mountsnoop
от bcc
.
Qiyinchilik system-nspawn
ishlayotgan vaqtda konteynerni ishga tushiradi mountsnoop.py
.
Keling, nima bo'lganini ko'rib chiqaylik:
Ishga tushish mountsnoop
konteyner "yuklash" paytida konteynerning ish vaqti bog'langan o'rnatishga juda bog'liqligini ko'rsatadi (Faqat uzun chiqishning boshlanishi ko'rsatilgan).
u systemd-nspawn
ichida tanlangan fayllarni taqdim etadi procfs
и sysfs
xostni konteynerga yo'l sifatida rootfs
. Tashqari MS_BIND
bog'lovchi o'rnatishni o'rnatuvchi bayroq, tog'dagi ba'zi boshqa bayroqlar xost va konteyner nom maydonlariga o'zgartirishlar o'rtasidagi munosabatni belgilaydi. Masalan, bog'langan o'rnatish o'zgarishlarni o'tkazib yuborishi mumkin /proc
и /sys
konteynerga soling yoki qo'ng'iroqqa qarab ularni yashiring.
xulosa
Linuxning ichki ishini tushunish imkonsiz bo'lib tuyulishi mumkin, chunki yadroning o'zi juda ko'p kodni o'z ichiga oladi, Linux foydalanuvchi maydoni ilovalari va C kutubxonalarida tizim qo'ng'iroqlari interfeyslarini chetga surib qo'yadi. glibc
. Taraqqiyotga erishishning usullaridan biri bu bitta yadro quyi tizimining manba kodini o'qish, asosiy e'tibor tizim chaqiruvlari va foydalanuvchi-bo'shliq sarlavhalarini, shuningdek, jadval kabi asosiy ichki yadro interfeyslarini tushunishdir. file_operations
. Fayl operatsiyalari "hamma narsa fayl" tamoyilini ta'minlaydi, bu ularni boshqarishni ayniqsa yoqimli qiladi. Yuqori darajadagi katalogdagi C yadrosi manba fayllari fs/
mashhur fayl tizimlari va saqlash qurilmalari o'rtasida keng va nisbatan sodda muvofiqlikni ta'minlovchi o'rash qatlami bo'lgan virtual fayl tizimlarining amalga oshirilishini taqdim etadi. Linux nom maydonlari orqali bog'lash va o'rnatish VFS sehridir, bu faqat o'qish uchun konteynerlar va ildiz fayl tizimlarini yaratishga imkon beradi. Manba kodini, eBPF asosiy vositasini va uning interfeysini tekshirish bilan birgalikda bcc
yadro kashfiyoti har qachongidan ham oson.
Do'stlar, yozing, ushbu maqola siz uchun foydalimi? Ehtimol, sizda biron bir izoh yoki mulohaza bordir? Linux Administrator kursiga qiziquvchilar esa taklif etiladi
Manba: www.habr.com