Баршаңызға сәлем! Бірінші бөлімді оқи аласыз
eBPF және bcc құралдарын пайдаланып VFS қалай бақылауға болады
Ядроның файлдарда қалай жұмыс істейтінін түсінудің ең оңай жолы sysfs
оны іс жүзінде көру, ал ARM64 көрудің ең оңай жолы - eBPF пайдалану. eBPF (Беркли пакеттік сүзгісінің қысқартылған) жұмыс істейтін виртуалды машинадан тұрады query
) пәрмен жолынан. Ядро көздері оқырманға ядро не істей алатынын айтады; eBPF құралдарын жүктелген жүйеде іске қосу ядро не істеп жатқанын көрсетеді.
Бақытымызға орай, құралдардың көмегімен eBPF пайдалануды бастау өте оңай bcc
Бұл C кодының шағын кірістірулері бар Python сценарийлері, яғни екі тілде де таныс кез келген адам оларды оңай өзгерте алады. IN bcc/tools
80 Python сценарийі бар, бұл әзірлеуші немесе жүйелік әкімші мәселені шешуге қолайлы нәрсені таңдай алатынын білдіреді.
VFS жұмыс істеп тұрған жүйеде қандай жұмыс істейтіні туралы кем дегенде үстірт түсінік алу үшін көріңіз vfscount
немесе vfsstat
. Бұл, айталық, ондаған қоңырауларды көрсетеді vfs_open()
және «оның достары» әр секунд сайын болады.
vfsstat.py
VFS функциясының шақыруларын жай ғана санайтын C коды кірістірілген Python сценарийі.
Неғұрлым тривиальды мысал келтірейік және USB флэш-дискісін компьютерге салып, жүйе оны анықтаған кезде не болатынын көрейік.
eBPF көмегімен сіз не болып жатқанын көре аласыз
/sys
USB флэш-дискісі салынған кезде. Мұнда қарапайым және күрделі мысал көрсетілген.
Жоғарыда көрсетілген мысалда, bcc
құрал sysfs_create_files()
. Біз мұны көреміз sysfs_create_files()
пайдаланып іске қосылды kworker
флэш-диск салынғанына жауап ретінде ағын, бірақ қандай файл жасалды? Екінші мысал eBPF қуатын көрсетеді. Мұнда trace.py
ядро кері жолын (-K опциясы) және жасалған файлдың атын басып шығарады sysfs_create_files()
. Жалғыз мәлімдеме кірістіру - бұл LLVM іске қосатын Python сценарийімен қамтамасыз етілген оңай танылатын пішім жолын қамтитын C коды. дәл уақытында компилятор. Ол осы жолды құрастырады және оны ядроның ішіндегі виртуалды машинада орындайды. Толық функция қолтаңбасы sysfs_create_files ()
пішім жолы параметрлердің біріне сілтеме жасай алатындай етіп екінші пәрменде қайта шығарылуы керек. Си кодының осы бөлігіндегі қателер C компиляторынан танылатын қателерге әкеледі. Мысалы, -l параметрі алынып тасталса, «BPF мәтінін құрастыру сәтсіз аяқталды» дегенді көресіз. C және Python тілдерімен таныс әзірлеушілер құралдарды табады bcc
кеңейту және өзгерту оңай.
USB дискісі салынған кезде, ядроның кері жолы PID 7711 ағын екенін көрсетеді. kworker
файлды жасаған «events»
в sysfs
. Сәйкесінше, қоңырау sysfs_remove_files()
дискіні алып тастау файлдың жойылуына әкелетінін көрсетеді events
, бұл анықтамалық санаудың жалпы түсінігіне сәйкес келеді. Сонымен бірге қарау sysfs_create_link ()
eBPF көмегімен USB дискісін салу кезінде кемінде 48 символдық сілтеме жасалғанын көрсетеді.
Оқиғалар файлының мәні неде? Қолданылуы disk_add_events ()
, және де "media_change"
, немесе "eject_request"
оқиға файлында жазылуы мүмкін. Мұнда ядро блок қабаты пайдаланушы кеңістігіне «диск» пайда болғаны және шығарылғаны туралы хабарлайды. Бұл зерттеу әдісі USB дискісін салу арқылы қаншалықты ақпараттандыратынына назар аударыңыз, бұл заттардың тек көзден қалай жұмыс істейтінін анықтауға тырысады.
Тек оқуға арналған түбірлік файлдық жүйелер ендірілген құрылғыларды қосады
Әрине, ешкім серверді немесе компьютерді розеткадан ажыратпайды. Бірақ неге? Себебі физикалық жад құрылғыларында орнатылған файлдық жүйелерде кешіктірілген жазу болуы мүмкін және олардың күйін жазатын деректер құрылымдары жадқа жазулармен үндестірілмеуі мүмкін. Бұл орын алғанда, утилитаны іске қосу үшін жүйе иелері келесі жүктеуді күтуі керек. fsck filesystem-recovery
және, ең нашар жағдайда, деректерді жоғалту.
Дегенмен, көптеген IoT құрылғылары, сондай-ақ маршрутизаторлар, термостаттар және автомобильдер қазір Linux жүйесін басқаратынын бәріміз білеміз. Бұл құрылғылардың көпшілігінде пайдаланушы интерфейсі аз немесе мүлдем жоқ және оларды «таза» өшіру мүмкін емес. Басқару блогына қуат көзі болған кезде батареясы біткен көлікті іске қосуды елестетіп көріңіз fsck
қозғалтқыш қашан жұмыс істей бастайды? Ал жауап қарапайым. Енгізілген құрылғылар түбірлік файлдық жүйеге сүйенеді ro-rootfs
(тек оқуға арналған түбірлік файлдық жүйе)).
ro-rootfs
түпнұсқалықтан гөрі айқын емес көптеген артықшылықтарды ұсынады. Бір артықшылығы - зиянды бағдарлама жаза алмайды /usr
немесе /lib
, егер ешбір Linux процесі ол жерге жаза алмаса. Басқасы, негізінен өзгермейтін файлдық жүйе қашықтағы құрылғыларды далалық қолдау үшін өте маңызды, өйткені қолдау көрсету қызметкерлері өрістік жүйелермен номиналды түрде бірдей жергілікті жүйелерге сүйенеді. Мүмкін, ең маңызды (бірақ ең жасырын) артықшылығы - ro-rootfs әзірлеушілерді жүйені жобалау сатысында қандай жүйелік нысандар өзгермейтінін шешуге мәжбүр етеді. Ro-rootfs-мен жұмыс істеу ыңғайсыз және ауыр болуы мүмкін, өйткені const айнымалылары көбінесе бағдарламалау тілдерінде болады, бірақ олардың артықшылықтары қосымша шығындарды оңай ақтайды.
жаратылыс rootfs
Тек оқуға арналған ендірілген әзірлеушілер үшін қосымша күш қажет және VFS суретке дәл осы жерде енеді. Linux файлдардың болуын талап етеді /var
жазылатын болды, сонымен қатар ендірілген жүйелерді іске қосатын көптеген танымал қолданбалар конфигурация жасауға әрекет жасайды dot-files
в $HOME
. Үй каталогындағы конфигурация файлдарының бір шешімі әдетте оларды алдын ала жасау және құру болып табылады rootfs
. үшін /var
Ықтимал тәсілдердің бірі оны бөлек жазылатын бөлімге орнату болып табылады /
тек оқуға арналған. Тағы бір танымал балама - байлау немесе қабаттастырғыштарды пайдалану.
Біріктірілетін және жиналмалы бекітпелер, оларды контейнерлерде пайдалану
Команданың орындалуы man mount
әзірлеушілер мен жүйелік әкімшілерге бір жолда файлдық жүйені құруға, содан кейін оны басқа жолдағы қолданбаларға көрсетуге мүмкіндік беретін байланыстырылатын және қабаттасатын қондырғылар туралы білудің ең жақсы жолы. Енгізілген жүйелер үшін бұл файлдарды сақтау мүмкіндігін білдіреді /var
тек оқуға арналған флэш-дискіде, бірақ қабаттасу немесе байланыстырылатын орнату жолы tmpfs
в /var
жүктеу кезінде ол қолданбаларға сол жерде ескертпелер жазуға мүмкіндік береді (скрап). Келесіде өзгертулерді қосқанда /var
жоғалады. Қабаттау орнату арасында біріктіру жасайды tmpfs
және негізгі файлдық жүйені қамтиды және бар файлдарға көрінетін өзгерістер енгізуге мүмкіндік береді ro-tootf
ал байланыстырылатын бекіту жаңаларын бос ете алады tmpfs
жазуға болатын қалталар көрінеді ro-rootfs
жолдары. Әзірге overlayfs
бұл дұрыс (proper
) файлдық жүйе түрі, байланыстырылатын орнату жүзеге асырылады
Қабаттасу мен байланыстырылатын қондырғының сипаттамасына сүйене отырып, ешкім таң қалдырмайды mountsnoop
от bcc
.
Қоңырау system-nspawn
жұмыс істеп тұрған кезде контейнерді іске қосады mountsnoop.py
.
Не болғанын көрейік:
Запуск mountsnoop
контейнер «жүктеліп жатқанда» контейнердің жұмыс уақыты байланыстырылатын қондырғыға жоғары тәуелді екенін көрсетеді (Тек ұзақ шығыстың басы көрсетіледі).
Бұл systemd-nspawn
ішінде таңдалған файлдарды береді procfs
и sysfs
хостқа контейнерге апаратын жолдар ретінде rootfs
. Қоспағанда MS_BIND
байланыстыруды орнататын жалауша, қондырмадағы кейбір басқа жалаулар хост пен контейнер аттар кеңістігіндегі өзгерістер арасындағы қатынасты анықтайды. Мысалы, байланыстырылған қондырғы өзгертулерді өткізіп жіберуі мүмкін /proc
и /sys
контейнерге салыңыз немесе қоңырауға байланысты жасырыңыз.
қорытынды
Linux-тың ішкі жұмысын түсіну мүмкін емес тапсырма болып көрінуі мүмкін, өйткені ядро өзінің өзі Linux пайдаланушы кеңістігі қолданбалары мен C кітапханаларындағы жүйелік қоңырау интерфейстерін қалдырып, кодтың үлкен көлемін қамтиды. glibc
. Прогреске жетудің бір жолы - жүйелік қоңыраулар мен пайдаланушы-кеңістік тақырыптарын, сондай-ақ кесте сияқты негізгі ішкі ядро интерфейстерін түсінуге баса назар аудара отырып, бір ядролық ішкі жүйенің бастапқы кодын оқу. file_operations
. Файл операциялары «бәрі файл» принципін қамтамасыз етеді, бұл оларды басқаруды ерекше жағымды етеді. Жоғарғы деңгейлі каталогтағы C ядросының бастапқы файлдары fs/
танымал файлдық жүйелер мен сақтау құрылғылары арасында кең және салыстырмалы түрде қарапайым үйлесімділікті қамтамасыз ететін орауыш қабаты болып табылатын виртуалды файлдық жүйелерді іске асыруды ұсынады. Linux аттар кеңістігі арқылы байланыстыру және қабаттастыруды орнату тек оқуға арналған контейнерлер мен түбірлік файлдық жүйелерді жасауға мүмкіндік беретін VFS сиқыры болып табылады. Бастапқы кодты, eBPF негізгі құралын және оның интерфейсін тексерумен біріктірілген bcc
негізгі барлауды бұрынғыдан да жеңілдетеді.
Достар, жазыңыз, бұл мақала сізге пайдалы болды ма? Мүмкін сізде қандай да бір ескертулер немесе ескертулер бар шығар? Ал Linux Administrator курсына қызығушылық танытқандар шақырылады
Ақпарат көзі: www.habr.com