Virtual file systems hauv Linux: vim li cas lawv xav tau thiab lawv ua haujlwm li cas? Ntu 2

Nyob zoo txhua tus, peb tab tom qhia rau koj qhov thib ob ntawm kev tshaj tawm "Virtual file systems hauv Linux: vim li cas lawv xav tau thiab lawv ua haujlwm li cas?" Koj tuaj yeem nyeem thawj ntu S, SѓS,. Cia peb nco ntsoov koj tias cov ntawv tshaj tawm no tau teem sijhawm los ua ke nrog kev tshaj tawm cov kwj tshiab ntawm chav kawm "Linux Administrator", uas pib sai heev.

Yuav saib xyuas VFS li cas siv eBPF thiab bcc cov cuab yeej

Txoj hauv kev yooj yim tshaj plaws kom nkag siab tias lub kernel ua haujlwm li cas ntawm cov ntaub ntawv sysfs yog pom nws hauv kev xyaum, thiab qhov yooj yim tshaj plaws los saib ARM64 yog siv eBPF. eBPF (luv luv rau Berkeley Packet Filter) muaj lub tshuab virtual khiav hauv tub ntxhais, uas cov neeg siv muaj cai thov tau (query) los ntawm kab hais kom ua. Cov hauv paus ntsiab lus qhia rau tus nyeem ntawv seb lub kernel ua tau dab tsi; khiav lub eBPF cov cuab yeej ntawm lub tshuab thauj khoom qhia tias lub kernel ua tau li cas.

Virtual file systems hauv Linux: vim li cas lawv xav tau thiab lawv ua haujlwm li cas? Ntu 2

Hmoov zoo, pib siv eBPF yog qhov yooj yim heev nrog kev pab ntawm cov cuab yeej BCC, uas muaj raws li pob khoom los ntawm kev faib tawm Linux thiab tau sau tseg kom ntxaws Bernard Gregg. Cov cuab yeej bcc yog Python scripts nrog me me ntawm C code, uas txhais tau hais tias leej twg paub txog ob hom lus tuaj yeem hloov kho tau yooj yim. IN bcc/tools Muaj 80 Python scripts, uas txhais tau hais tias feem ntau yuav yog tus tsim tawm lossis tus thawj tswj hwm yuav muaj peev xwm xaiv ib yam uas haum rau kev daws teeb meem.
Yuav kom tau txais yam tsawg kawg nkaus lub tswv yim ntawm qhov ua haujlwm VFSs ua rau ntawm lub kaw lus khiav, sim vfscount los yog vfsstat. Qhov no yuav qhia, cia peb hais, uas muaj ntau tus hu vfs_open() thiab "nws cov phooj ywg" tshwm sim txhua thib ob.

Virtual file systems hauv Linux: vim li cas lawv xav tau thiab lawv ua haujlwm li cas? Ntu 2

vfsstat.py yog Python tsab ntawv nrog C code inserts uas tsuas suav VFS muaj nuj nqi hu.

Cia peb muab ib qho piv txwv tsis tseem ceeb ntxiv thiab pom tias muaj dab tsi tshwm sim thaum peb ntxig USB flash drive rau hauv lub computer thiab lub kaw lus pom nws.

Virtual file systems hauv Linux: vim li cas lawv xav tau thiab lawv ua haujlwm li cas? Ntu 2

Siv eBPF koj tuaj yeem pom dab tsi tshwm sim hauv /sysThaum lub USB flash drive raug tso. Ib qho piv txwv yooj yooj yim thiab nyuaj yog qhia ntawm no.

Hauv qhov piv txwv qhia saum toj no, bcc ntsuas taug.py luam ib cov lus thaum cov lus txib khiav sysfs_create_files(). Peb pom qhov ntawd sysfs_create_files() tau launched siv kworker kwj nyob rau hauv teb rau qhov tseeb hais tias lub flash drive raug tso, tab sis dab tsi cov ntaub ntawv tsim? Qhov piv txwv thib ob qhia txog lub zog ntawm eBPF. Ntawm no trace.py Sau lub kernel backtrace (-K xaiv) thiab lub npe ntawm cov ntaub ntawv uas tau tsim sysfs_create_files(). Ib nqe lus nkag yog C code uas suav nrog ib qho yooj yim recognizable hom hlua muab los ntawm Python tsab ntawv uas sau LLVM tsuas yog nyob rau hauv-lub sij hawm compiler. Nws suav cov kab no thiab tua nws hauv lub tshuab virtual hauv lub kernel. Full function kos npe sysfs_create_files () yuav tsum tau rov ua dua nyob rau hauv cov lus txib thib ob kom cov kab ntawv tuaj yeem xa mus rau ib qho ntawm cov tsis. Qhov yuam kev hauv daim C code no ua rau pom qhov yuam kev los ntawm C compiler. Piv txwv li, yog tias qhov -l parameter raug tshem tawm, koj yuav pom "Failed to compile BPF text." Cov neeg tsim khoom uas paub txog C thiab Python yuav pom cov cuab yeej bcc yooj yim nthuav thiab hloov.

Thaum lub USB tsav tau ntxig, cov ntsiav rov qab yuav pom tias PID 7711 yog xov. kworkeruas tsim cov ntaub ntawv «events» в sysfs. Raws li, hu los ntawm sysfs_remove_files() yuav qhia tau tias tshem tawm lub tsav ua rau cov ntaub ntawv raug deleted events, uas sib raug rau lub tswvyim dav dav ntawm kev suav suav. Tib lub sijhawm, saib sysfs_create_link () nrog eBPF thaum tso lub USB tsav yuav qhia tias tsawg kawg 48 cov cim txuas tau tsim.

Yog li dab tsi yog lub ntsiab lus ntawm cov ntaub ntawv txheej xwm? Kev siv cscope Rau kev tshawb nrhiav __device_add_disk(), qhia tias nws ua li cas disk_add_events (), thiab ib qho "media_change", lossis "eject_request" tuaj yeem kaw rau hauv cov ntaub ntawv tshwm sim. Ntawm no cov kernel thaiv txheej qhia rau userspace tias "disk" tau tshwm sim thiab ejected. Nco ntsoov tias cov ntaub ntawv qhia txog txoj kev tshawb fawb no yog los ntawm kev ntxig rau USB drive, piv rau kev sim xyuas seb cov khoom ua haujlwm li cas los ntawm qhov chaw.

Nyeem-tsuas cov hauv paus ntaub ntawv tshuab ua kom cov khoom siv kos

Tau kawg, tsis muaj leej twg tua lub server lossis lawv lub computer los ntawm rub lub ntsaws ntawm lub qhov (socket). Tab sis vim li cas? Qhov no yog vim hais tias mounted cov ntaub ntawv systems ntawm lub cev cia li yuav muaj lagging sau, thiab cov ntaub ntawv qauv uas sau lawv lub xeev tej zaum yuav tsis synchronized nrog sau rau lub cia. Thaum qhov no tshwm sim, cov tswv system yuav tsum tau tos kom txog thaum lub khau raj tom ntej kom tso cov khoom siv hluav taws xob. fsck filesystem-recovery thiab, nyob rau hauv qhov phem tshaj, poob cov ntaub ntawv.

Txawm li cas los xij, peb txhua tus paub tias ntau yam khoom siv IoT, nrog rau routers, ntsuas kub thiab tsheb, tam sim no khiav Linux. Ntau yam ntawm cov khoom siv no muaj me me rau tsis muaj tus neeg siv interface, thiab tsis muaj txoj hauv kev los tua lawv "huv." Xav txog thaum pib lub tsheb nrog lub roj teeb tuag thaum lub hwj chim mus rau chav tswj Linux pheej dhia nce thiab nqis. Yuav ua li cas yog hais tias lub system khau raj tsis ntev fsckThaum twg lub cav thaum kawg pib khiav? Thiab cov lus teb yog yooj yim. Embedded li cia siab rau cov ntaub ntawv hauv paus system tsuas yog nyeem ntawv xwb (hais luv ro-rootfs (nyeem-tsuas cov hauv paus filesystem)).

ro-rootfs muab ntau yam txiaj ntsig uas tsis tshua pom tseeb dua qhov tseeb. Ib qho txiaj ntsig yog tias malware tsis tuaj yeem sau rau /usr los yog /lib, yog tias tsis muaj txheej txheem Linux tuaj yeem sau rau ntawd. Ib qho ntxiv yog tias cov ntaub ntawv tsis hloov pauv loj heev yog qhov tseem ceeb rau kev txhawb nqa ntawm cov chaw taws teeb, vim tias cov neeg ua haujlwm txhawb nqa kev vam khom hauv zos uas muaj npe zoo ib yam rau cov kab ke. Tej zaum qhov tseem ceeb tshaj plaws (tab sis kuj tseem ceeb tshaj plaws) cov txiaj ntsig yog tias ro-rootfs yuam cov neeg tsim khoom los txiav txim siab seb cov khoom siv twg yuav hloov tsis tau nyob rau theem tsim ntawm lub system. Ua hauj lwm nrog ro-rootfs tuaj yeem ua tau txawv txawv thiab mob, vim tias qhov sib txawv ntawm qhov sib txawv feem ntau yog nyob rau hauv cov lus programming, tab sis lawv cov txiaj ntsig tau yooj yim pom zoo rau cov nyiaj siv ua haujlwm ntxiv.

creation rootfs Nyeem-tsuas yog xav tau qee qhov kev siv zog ntxiv rau cov neeg tsim khoom kos, thiab qhov no yog qhov uas VFS tuaj rau hauv daim duab. Linux xav kom cov ntaub ntawv nyob hauv /var tau sau tau, thiab ntxiv rau, ntau daim ntawv thov nrov uas khiav cov kab ke yuav sim los tsim kev teeb tsa dot-files в $HOME. Ib qho kev daws teeb meem rau cov ntaub ntawv teeb tsa hauv cov npe hauv tsev feem ntau yog tsim ua ntej thiab tsim lawv rau hauv rootfs. rau /var Ib txoj hauv kev ua tau yog txhawm rau txhim kho nws ntawm qhov sib cais sau tau, thaum / mounted nyeem nkaus xwb. Lwm qhov kev xaiv nrov yog siv khi lossis overlay mounts.

Linkable thiab stackable mounts, lawv siv los ntawm ntim

Hais kom ua man mount yog txoj hauv kev zoo tshaj plaws los kawm txog bindable thiab overlayable mounts, uas muab cov neeg tsim khoom thiab cov thawj tswj hwm lub peev xwm los tsim cov ntaub ntawv hauv ib txoj hauv kev thiab tom qab ntawd nthuav tawm rau cov ntawv thov hauv lwm qhov. Rau embedded systems, qhov no txhais tau hais tias muaj peev xwm khaws cov ntaub ntawv hauv /var nyob rau hauv ib tug nyeem-tsuas flash drive, tab sis ib tug overlay los yog linkable mount txoj kev los ntawm tmpfs в /var thaum thauj khoom, nws yuav tso cai rau cov ntawv thov sau ntawv muaj (scrawl). Lwm zaus koj qhib qhov kev hloov pauv rau /var yuav ploj. Ib tug overlay mount tsim ib tug union ntawm tmpfs thiab cov ntaub ntawv hauv qab thiab tso cai rau koj los hloov pauv cov ntaub ntawv uas twb muaj lawm hauv ro-tootf whereas ib bindable mount tuaj yeem ua rau cov tshiab khoob tmpfs folders pom li sau tau hauv ro-rootfs txoj kev. Thaum overlayfs qhov no yog qhov tseeb (proper) hom ntaub ntawv system, bindable mount yog siv nyob rau hauv VFS npe.

Raws li cov lus piav qhia ntawm lub overlay thiab txuas txuas, tsis muaj leej twg xav tsis thoob tias Linux ntim lawv nquag siv. Cia peb saib yuav ua li cas thaum peb siv systemd-npo khiav lub thawv siv lub cuab yeej mountsnoop los ntawm bcc.

Hu system-nspawn pib lub thawv thaum khiav mountsnoop.py.

Wb saib dab tsi tshwm sim:

Pib mountsnoop thaum lub thawv yog "booting" qhia tau hais tias lub thawv lub sijhawm ua haujlwm yog nyob ntawm lub mount tau txuas (tsuas yog qhov pib ntawm qhov tso zis ntev yog qhia).

nws yog systemd-nspawn muab cov ntaub ntawv xaiv hauv procfs и sysfs host rau thawv raws li txoj kev mus rau nws rootfs... Dhau li MS_BIND chij uas teeb tsa lub binding mount, ib co lwm tus chij ntawm lub mount txhais cov kev sib raug zoo ntawm kev hloov mus rau lub party thiab thawv namespace. Piv txwv li, ib qho txuas txuas tuaj yeem hla kev hloov mus rau /proc и /sys rau hauv lub thawv, los yog nkaum lawv nyob ntawm qhov hu.

xaus

Nkag siab txog kev ua haujlwm sab hauv ntawm Linux tuaj yeem zoo li ib txoj haujlwm tsis yooj yim sua, txij li cov ntsiav nws tus kheej muaj cov lej loj, tawm hauv Linux cov neeg siv qhov chaw thov thiab kev hu xov tooj sib cuam tshuam hauv C cov tsev qiv ntawv xws li glibc. Ib txoj hauv kev ua kom muaj kev vam meej yog nyeem cov cai ntawm ib lub kernel subsystem, nrog rau kev nkag siab txog kev hu xov tooj thiab cov neeg siv-chaw headers, nrog rau cov ntsiab lus tseem ceeb hauv kernel interfaces, xws li rooj. file_operations. Cov ntaub ntawv ua haujlwm muab "txhua yam yog cov ntaub ntawv", ua rau lawv txaus siab rau kev tswj hwm. C kernel cov ntaub ntawv hauv cov npe saum toj kawg nkaus fs/ nthuav tawm qhov kev siv ntawm virtual cov ntaub ntawv systems, uas yog ib txheej wrapper uas muab dav thiab kuj yooj yim compatibility ntawm nrov cov ntaub ntawv systems thiab cia li. Txuas thiab overlay mounting ntawm Linux namespaces yog cov khawv koob ntawm VFS uas ua rau tsim cov ntawv nyeem nkaus xwb thiab cov hauv paus ntaub ntawv ua tau. Ua ke nrog kev ntsuam xyuas ntawm qhov chaws, eBPF cov cuab yeej tseem ceeb thiab nws qhov cuam tshuam bcc
ua rau kev tshawb nrhiav tseem ceeb yooj yim dua li puas tau.

Cov phooj ywg, sau, kab lus no puas muaj txiaj ntsig rau koj? Tej zaum koj muaj lus nug lossis lus hais? Thiab cov uas txaus siab rau Linux Administrator chav kawm raug caw tuaj koom Hnub qhib, uas yuav muaj nyob rau lub Plaub Hlis 18.

Thawj qhov.

Tau qhov twg los: www.hab.com

Ntxiv ib saib