Sistèm dosye vityèl nan Linux: poukisa yo bezwen ak ki jan yo travay? Pati 2

Bonjou tout moun, n ap pataje avèk nou dezyèm pati piblikasyon "Virtual file systems in Linux: why are they need and how do you work?" Ou ka li premye pati a isit la. Ann raple w ke seri piblikasyon sa yo pwograme pou kowenside ak lansman yon nouvo kouran sou kou a. "Administratè Linux", ki kòmanse trè byento.

Ki jan yo kontwole VFS lè l sèvi avèk eBPF ak zouti bcc

Fason ki pi fasil pou konprann ki jan nwayo a fonksyone sou dosye yo sysfs se wè li nan pratik, ak fason ki pi fasil yo gade ARM64 se sèvi ak eBPF. eBPF (kout pou Berkeley Packet Filter) konsiste de yon machin vityèl k ap kouri nwayo, ki itilizatè privilejye yo ka mande (query) soti nan liy lòd la. Sous nwayo yo di lektè a kisa nwayo a ka fè; kouri zouti eBPF yo sou yon sistèm chaje montre sa nwayo a ap fè aktyèlman.

Sistèm dosye vityèl nan Linux: poukisa yo bezwen ak ki jan yo travay? Pati 2

Erezman, kòmanse sèvi ak eBPF se byen fasil ak èd nan zouti bcc, ki disponib kòm pakè nan distribisyon jeneral la Linux epi dokimante an detay Bernard Gregg. Zouti bcc se Scripts Python ak ti ensèsyon nan kòd C, ki vle di ke nenpòt moun ki abitye ak tou de lang ka fasilman modifye yo. NAN bcc/tools Gen 80 script Python, ki vle di ke gen plis chans yon pwomotè oswa yon administratè sistèm yo pral kapab chwazi yon bagay ki apwopriye pou rezoud pwoblèm nan.
Pou jwenn omwen yon lide supèrfisyèl sou kisa travay VFS yo fè sou yon sistèm kouri, eseye vfscount oswa vfsstat. Sa a pral montre, ann di, ke plizyè douzèn apèl vfs_open() ak "zanmi li yo" rive literalman chak segonn.

Sistèm dosye vityèl nan Linux: poukisa yo bezwen ak ki jan yo travay? Pati 2

vfsstat.py se yon script Python ak foure kòd C ki tou senpleman konte apèl fonksyon VFS.

Ann bay yon egzanp ki pi trivial epi wè sa k ap pase lè nou mete yon kondwi flash USB nan yon òdinatè epi sistèm nan detekte li.

Sistèm dosye vityèl nan Linux: poukisa yo bezwen ak ki jan yo travay? Pati 2

Sèvi ak eBPF ou ka wè sa k ap pase nan /syslè yo mete yon kondwi flash USB. Yon egzanp senp ak konplèks yo montre isit la.

Nan egzanp ki montre pi wo a, bcc zouti trace.py enprime yon mesaj lè lòd la kouri sysfs_create_files(). Nou wè sa sysfs_create_files() te lanse lè l sèvi avèk kworker kouran an repons a lefèt ke kondwi flash la te antre, men ki fichye te kreye? Dezyèm egzanp lan montre pouvwa eBPF. Isit la trace.py Enprime yon backtrace nwayo (opsyon -K) ak non fichye ki te kreye a sysfs_create_files(). Ensèsyon yon sèl deklarasyon se kòd C ki gen ladann yon kòd fòma fasil rekonèt pa script Python ki kouri LLVM. konpilatè jis-a-tan. Li konpile liy sa a epi egzekite li nan yon machin vityèl andedan nwayo a. Siyati fonksyon konplè sysfs_create_files () dwe repwodui nan dezyèm kòmandman an pou fisèl fòma a ka refere a youn nan paramèt yo. Erè nan moso sa a nan kòd C rezilta nan erè rekonèt nan C du a. Pou egzanp, si paramèt la -l omisyon, ou pral wè "Echwe pou konpile tèks BPF." Devlopè ki abitye ak C ak Python ap jwenn zouti yo bcc fasil pou elaji ak chanje.

Lè yo mete USB kondwi a, backtrace nwayo a pral montre ke PID 7711 se yon fil. kworkerki te kreye dosye a «events» в sysfs. An konsekans, apèl la soti nan sysfs_remove_files() pral montre ke retire kondwi a lakòz yo te efase dosye a events, ki koresponn ak konsèp jeneral nan konte referans. An menm tan an, gade sysfs_create_link () ak eBPF pandan w ap mete kondwi USB a pral montre ke omwen 48 lyen senbolik yo te kreye.

Se konsa, ki pwen nan dosye evènman an? Itilizasyon cscope Pou rechèch __device_add_disk(), montre sa li lakòz disk_add_events (), epi swa "media_change"Oswa "eject_request" ka anrejistre nan yon dosye evènman. Isit la kouch blòk nwayo a enfòme espas itilizatè ke yon "disk" te parèt ak ekspilse. Remake byen ki jan metòd rechèch sa a enfòmatif se lè w mete yon kondwi USB, konpare ak eseye figi konnen ki jan bagay yo travay piman nan sous la.

Sistèm dosye rasin pou lekti sèlman pèmèt aparèy entegre

Natirèlman, pèsonn pa fèmen sèvè a oswa òdinatè yo lè yo rale ploge a soti nan priz la. Men poukisa? Sa a se paske sistèm fichye ki monte sou aparèy depo fizik yo gendwa gen yon delè nan ekriti, epi estrikti done ki anrejistre eta yo ka pa senkronize ak ekriti nan depo a. Lè sa rive, pwopriyetè sistèm yo dwe rete tann jiska pwochen bòt la pou yo lanse sèvis piblik la. fsck filesystem-recovery epi, nan ka ki pi mal la, pèdi done yo.

Sepandan, nou tout konnen ke anpil aparèy IoT, osi byen ke routeurs, tèmostat ak machin, kounye a kouri Linux. Anpil nan aparèy sa yo pa gen okenn koòdone itilizatè, epi pa gen okenn fason yo fèmen yo "pwòpman". Imajine kòmanse yon machin ak yon batri mouri lè pouvwa a nan inite kontwòl la se Linux toujou ap sote leve, li desann. Kouman se li ke sistèm nan bòt san yon tan fsckki lè motè a finalman kòmanse kouri? Ak repons lan se senp. Aparèy entegre yo konte sou sistèm dosye rasin lan sèlman pou lekti (abreje ro-rootfs (fileystem rasin pou lekti sèlman)).

ro-rootfs ofri anpil benefis ki mwens evidan pase otantisite. Youn nan avantaj se ke malveyan pa ka ekri nan /usr oswa /lib, si pa gen okenn pwosesis Linux ka ekri la. Yon lòt se ke yon sistèm fichye lajman imuiabl se kritik pou sipò jaden nan aparèy aleka, paske pèsonèl sipò yo konte sou sistèm lokal yo ki nominalman idantik ak sistèm jaden yo. Petèt benefis ki pi enpòtan (men tou ki pi trèt) se ke ro-rootfs fòse devlopè yo deside ki objè sistèm yo pral imuiabl nan etap nan konsepsyon nan sistèm nan. Travay ak ro-rootfs ka difisil ak douloure, kòm varyab konst souvan yo nan lang pwogramasyon, men benefis yo fasil jistifye anlè anplis.

kreyasyon rootfs Lekti sèlman mande pou kèk efò siplemantè pou devlopè entegre, e sa a se kote VFS vini nan foto a. Linux mande pou fichye yo nan /var yo te ekri, epi anplis, anpil aplikasyon popilè ki kouri sistèm entegre yo pral eseye kreye konfigirasyon dot-files в $HOME. Yon solisyon pou fichye konfigirasyon nan anyè kay la se anjeneral pre-jenere ak bati yo nan rootfs. Pou /var Yon apwòch posib se monte li sou yon patisyon ekri separe, pandan y ap / monte lekti sèlman. Yon lòt altènatif popilè se sèvi ak mare oswa kouvri mòn.

Montaj Linkable ak stackable, itilize yo pa resipyan

Egzekite yon lòd man mount se pi bon fason pou aprann sou monn ki ka kole ak ki ka kouvri, ki bay devlopè yo ak administratè sistèm yo kapasite pou yo kreye yon sistèm fichye nan yon chemen epi ekspoze li nan aplikasyon nan yon lòt. Pou sistèm entegre, sa vle di kapasite nan magazen fichye yo /var sou yon kondui flash pou lekti sèlman, men yon superposer oswa yon chemen monte ki konekte soti nan tmpfs в /var lè chaje, li pral pèmèt aplikasyon yo ekri nòt la (scrawl). Pwochen fwa ou vire sou chanjman yo /var pral pèdi. Yon mòn kouvri kreye yon sendika ant tmpfs ak sistèm dosye ki kache epi pèmèt ou fè chanjman aparan nan dosye ki egziste deja yo ro-tootf tandiske yon mòn ki ka rann nouvo yo vid tmpfs dosye vizib kòm ekri nan ro-rootfs fason. Pandan ke overlayfs sa a se youn nan bon (proper) kalite sistèm fichye, montaj ki kapab konekte yo aplike nan Espas non VFS.

Ki baze sou deskripsyon an kouvri ak monte linkable, pa gen moun ki sezi sa kontenè Linux yo aktivman itilize. Ann wè sa k ap pase lè nou itilize systemd-nspawn kouri veso a lè l sèvi avèk zouti a mountsnoop soti nan bcc.

Defi system-nspawn kòmanse veso a pandan y ap kouri mountsnoop.py.

Ann wè sa ki te pase:

Lanse mountsnoop pandan veso a ap "demaraj" montre ke tan an veso a se trè depann sou mòn lan ke yo te lye (Sèlman kòmansman an nan pwodiksyon an long yo montre).

Isit la systemd-nspawn bay dosye chwazi nan procfs и sysfs lame nan veso kòm chemen pou li rootfs. Eksepte MS_BIND drapo ki mete kanpe sou mòn lan obligatwa, kèk lòt drapo sou mòn lan defini relasyon ki genyen ant chanjman nan espas non lame a ak veso. Pou egzanp, yon mòn ki lye ka swa sote chanjman nan /proc и /sys nan veso a, oswa kache yo depann sou apèl la.

Konklizyon

Konprann fonksyònman enteryè Linux ka sanble yon travay enposib, paske nwayo a li menm gen yon gwo kantite kòd, kite sou kote aplikasyon espas itilizatè Linux ak entèfas apèl sistèm nan bibliyotèk C tankou. glibc. Youn nan fason yo fè pwogrè se li kòd sous la nan yon sèl subsistèm nwayo, ak yon anfaz sou konpreyansyon apèl sistèm ak tèt itilizatè-espas, osi byen ke entèfas prensipal nwayo entèn yo, tankou tab. file_operations. Operasyon dosye yo bay prensip "tout bagay se yon dosye", ki fè yo patikilyèman agreyab pou jere. C fichye sous nwayo nan anyè ki pi wo a fs/ prezante yon aplikasyon sistèm dosye vityèl, ki se yon kouch anbalaj ki bay konpatibilite laj ak relativman senp ant sistèm dosye popilè ak aparèy depo. Lyen ak kouvri aliye atravè espas non Linux se maji VFS ki fè kreye resipyan pou lekti sèlman ak sistèm fichye rasin posib. Konbine avèk yon egzamen kòd sous la, zouti debaz eBPF ak koòdone li yo bcc
fè eksplorasyon debaz pi fasil pase tout tan.

Zanmi, ekri, èske atik sa a te itil ou? Petèt ou gen nenpòt kòmantè oswa remak? Ak moun ki enterese nan kou Administratè Linux yo envite Jounen Ouvè, ki pral fèt 18 avril.

Premye pati.

Sous: www.habr.com

Add nouvo kòmantè