Баарыңарга салам, биз сиздер менен “Linux ичиндеги виртуалдык файл тутумдары: алар эмне үчүн керек жана алар кантип иштешет?” деген басылманын экинчи бөлүгүн бөлүшөбүз. Биринчи бөлүгүн окуй аласыз
eBPF жана Bcc куралдарын колдонуу менен VFS кантип мониторинг жүргүзүү керек
Ядро файлдарда кантип иштээрин түшүнүүнүн эң оңой жолу sysfs
аны иш жүзүндө көрүү жана ARM64 көрүүнүн эң оңой жолу - eBPF колдонуу. eBPF (Беркли Пакет Фильтринин кыскачасы) иштеп жаткан виртуалдык машинадан турат query
) буйрук сабынан. Ядро булактары окурманга ядро эмне кыла аларын айтып берет; eBPF куралдарын жүктөлгөн системада иштетүү ядро чындыгында эмне кылып жатканын көрсөтөт.
Бактыга жараша, eBPF колдонууну баштоо куралдардын жардамы менен абдан оңой bcc
Бул Python скрипттери, C кодунун кичинекей киргизүүсү менен, бул эки тилди жакшы билген ар бир адам аларды оңой өзгөртө алат. 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 кодунун бул бөлүгүндөгү каталар 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
... For /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 администратору курсуна кызыккандар чакырылат
Source: www.habr.com