Linux жүйесіндегі виртуалды файлдық жүйелер: олар не үшін қажет және олар қалай жұмыс істейді? 2 бөлім

Баршаңызға сәлем! Бірінші бөлімді оқи аласыз осында. Естеріңізге сала кетейік, бұл басылымдар сериясы курстағы жаңа ағынның басталуына орайластырылған «Linux әкімшісі», ол өте жақын арада басталады.

eBPF және bcc құралдарын пайдаланып VFS қалай бақылауға болады

Ядроның файлдарда қалай жұмыс істейтінін түсінудің ең оңай жолы sysfs оны іс жүзінде көру, ал ARM64 көрудің ең оңай жолы - eBPF пайдалану. eBPF (Беркли пакеттік сүзгісінің қысқартылған) жұмыс істейтін виртуалды машинадан тұрады негізгі, қандай артықшылықты пайдаланушылар сұрай алады (query) пәрмен жолынан. Ядро көздері оқырманға ядро ​​не істей алатынын айтады; eBPF құралдарын жүктелген жүйеде іске қосу ядро ​​​​не істеп жатқанын көрсетеді.

Linux жүйесіндегі виртуалды файлдық жүйелер: олар не үшін қажет және олар қалай жұмыс істейді? 2 бөлім

Бақытымызға орай, құралдардың көмегімен eBPF пайдалануды бастау өте оңай BCC, олар жалпы таратудан пакеттер ретінде қол жетімді Linux және егжей-тегжейлі құжатталған Бернард Грегг. Құралдар bcc Бұл C кодының шағын кірістірулері бар Python сценарийлері, яғни екі тілде де таныс кез келген адам оларды оңай өзгерте алады. IN bcc/tools 80 Python сценарийі бар, бұл әзірлеуші ​​немесе жүйелік әкімші мәселені шешуге қолайлы нәрсені таңдай алатынын білдіреді.
VFS жұмыс істеп тұрған жүйеде қандай жұмыс істейтіні туралы кем дегенде үстірт түсінік алу үшін көріңіз vfscount немесе vfsstat. Бұл, айталық, ондаған қоңырауларды көрсетеді vfs_open() және «оның достары» әр секунд сайын болады.

Linux жүйесіндегі виртуалды файлдық жүйелер: олар не үшін қажет және олар қалай жұмыс істейді? 2 бөлім

vfsstat.py VFS функциясының шақыруларын жай ғана санайтын C коды кірістірілген Python сценарийі.

Неғұрлым тривиальды мысал келтірейік және USB флэш-дискісін компьютерге салып, жүйе оны анықтаған кезде не болатынын көрейік.

Linux жүйесіндегі виртуалды файлдық жүйелер: олар не үшін қажет және олар қалай жұмыс істейді? 2 бөлім

eBPF көмегімен сіз не болып жатқанын көре аласыз /sysUSB флэш-дискісі салынған кезде. Мұнда қарапайым және күрделі мысал көрсетілген.

Жоғарыда көрсетілген мысалда, bcc құрал trace.py пәрмен орындалғанда хабарды басып шығарады 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 символдық сілтеме жасалғанын көрсетеді.

Оқиғалар файлының мәні неде? Қолданылуы cscope Іздеу үшін __Device_add_disk(), не тудыратынын көрсетеді disk_add_events (), және де "media_change", немесе "eject_request" оқиға файлында жазылуы мүмкін. Мұнда ядро ​​блок қабаты пайдаланушы кеңістігіне «диск» пайда болғаны және шығарылғаны туралы хабарлайды. Бұл зерттеу әдісі USB дискісін салу арқылы қаншалықты ақпараттандыратынына назар аударыңыз, бұл заттардың тек көзден қалай жұмыс істейтінін анықтауға тырысады.

Тек оқуға арналған түбірлік файлдық жүйелер ендірілген құрылғыларды қосады

Әрине, ешкім серверді немесе компьютерді розеткадан ажыратпайды. Бірақ неге? Себебі физикалық жад құрылғыларында орнатылған файлдық жүйелерде кешіктірілген жазу болуы мүмкін және олардың күйін жазатын деректер құрылымдары жадқа жазулармен үндестірілмеуі мүмкін. Бұл орын алғанда, утилитаны іске қосу үшін жүйе иелері келесі жүктеуді күтуі керек. fsck filesystem-recovery және, ең нашар жағдайда, деректерді жоғалту.

Дегенмен, көптеген IoT құрылғылары, сондай-ақ маршрутизаторлар, термостаттар және автомобильдер қазір Linux жүйесін басқаратынын бәріміз білеміз. Бұл құрылғылардың көпшілігінде пайдаланушы интерфейсі аз немесе мүлдем жоқ және оларды «таза» өшіру мүмкін емес. Басқару блогына қуат көзі болған кезде батареясы біткен көлікті іске қосуды елестетіп көріңіз 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) файлдық жүйе түрі, байланыстырылатын орнату жүзеге асырылады VFS аттар кеңістігі.

Қабаттасу мен байланыстырылатын қондырғының сипаттамасына сүйене отырып, ешкім таң қалдырмайды Linux контейнерлері олар белсенді түрде қолданылады. Біз пайдаланған кезде не болатынын көрейік systemd-npawn құралды пайдаланып контейнерді іске қосу үшін 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 курсына қызығушылық танытқандар шақырылады ашық есіктер күні, ол 18 сәуірде өтеді.

Бірінші бөлім.

Ақпарат көзі: www.habr.com

пікір қалдыру