Halo sadayana, kami ngabagikeun ka anjeun bagian kadua tina publikasi "Sistem file virtual di Linux: naha aranjeunna diperyogikeun sareng kumaha jalanna?" Anjeun tiasa maca bagian kahiji
Kumaha ngawas VFS nganggo alat eBPF sareng bcc
Cara panggampangna pikeun ngartos kumaha kernel beroperasi dina file sysfs
nyaeta ningali eta dina prakna, sarta cara panggampangna pikeun lalajo ARM64 nyaeta ngagunakeun eBPF. eBPF (singketan pikeun Berkeley Packet Filter) diwangun ku mesin virtual anu dijalankeun query
) tina garis paréntah. Sumber kernel ngabejaan maca naon kernel bisa ngalakukeun; ngajalankeun parabot eBPF dina sistem dimuat nembongkeun naon kernel sabenerna lakukeun.
Kabeneran, ngamimitian nganggo eBPF cukup gampang kalayan bantosan alat bcc
nyaéta skrip Python kalayan sisipan leutik kode C, anu hartosna saha waé anu akrab sareng dua basa tiasa gampang ngarobihana. DI bcc/tools
Aya 80 Aksara Python, nu hartina paling dipikaresep pamekar atawa administrator sistem bakal bisa milih hal cocog pikeun ngarengsekeun masalah.
Pikeun kéngingkeun ide deet ngeunaan naon anu dilakukeun ku VFS dina sistem anu ngajalankeun, cobian vfscount
atawa vfsstat
. Ieu bakal nunjukkeun, sebutkeun, puluhan telepon vfs_open()
jeung "babaturanana" lumangsung sacara harfiah unggal detik.
vfsstat.py
mangrupa Aksara Python jeung inserts kode C nu saukur cacah VFS nelepon fungsi.
Hayu urang masihan conto leuwih trivial tur tingal kumaha kajadian nalika urang nyelapkeun USB flash drive kana komputer tur sistem ngadeteksi eta.
Ngagunakeun eBPF anjeun tiasa ningali naon anu lumangsung dina
/sys
lamun USB flash drive diselapkeun. Hiji conto basajan tur kompléks ditémbongkeun di dieu.
Dina conto ditémbongkeun di luhur, bcc
alat sysfs_create_files()
. Urang tingali éta sysfs_create_files()
ieu dibuka ngagunakeun kworker
stream di respon kana kanyataan yén flash drive ieu diselapkeun, tapi naon file dijieun? Conto kadua nembongkeun kakuatan eBPF. Ieuh trace.py
Nyitak backtrace kernel (-K pilihan) jeung ngaran file nu dijieun sysfs_create_files()
. Sisipan pernyataan tunggal nyaéta kode C anu kalebet senar format anu gampang dikenal anu disayogikeun ku skrip Python anu ngajalankeun LLVM just-in-time compiler. Ieu compiles garis ieu sarta executes eta dina mesin virtual jero kernel. Signature fungsi pinuh sysfs_create_files ()
kudu dihasilkeun dina paréntah kadua supados format string bisa nujul ka salah sahiji parameter. Kasalahan dina sapotong kode C ieu nyababkeun kasalahan anu tiasa dipikanyaho tina kompiler C. Salaku conto, upami parameter -l dileungitkeun, anjeun bakal ningali "Gagal nyusun téks BPF." Pamekar anu akrab sareng C sareng Python bakal mendakan alat bcc
gampang dilegakeun sareng robih.
Nalika USB drive diselapkeun, backtrace kernel bakal nunjukkeun yén PID 7711 mangrupikeun benang kworker
anu nyiptakeun file «events»
в sysfs
. Sasuai, telepon ti sysfs_remove_files()
bakal nunjukkeun yén ngahapus drive nyababkeun file dihapus events
, nu pakait jeung konsép umum cacah rujukan. Dina waktos anu sami, ningali sysfs_create_link ()
kalawan eBPF bari inserting USB drive bakal némbongkeun yén sahanteuna 48 Tumbu simbolis geus dijieun.
Janten naon gunana file acara? Pamakéan disk_add_events ()
, jeung boh "media_change"
atawa "eject_request"
bisa dirékam dina file acara. Di dieu lapisan blok kernel ngawartosan ruang pangguna yén "disk" parantos muncul sareng dikaluarkeun. Catetan kumaha informatif metoda ieu panalungtikan ku inserting USB drive, dibandingkeun jeung nyoba angka kaluar kumaha hal jalan murni tina sumberna.
Sistem file akar anu dibaca wungkul ngaktifkeun alat anu dipasang
Tangtosna, teu aya anu mareuman server atanapi komputerna ku cara narik colokan tina stop kontak. Tapi naha? Ieu kusabab sistem file anu dipasang dina alat panyimpen fisik mungkin gaduh tulisan anu katinggaleun, sareng struktur data anu ngarékam kaayaanana tiasa henteu disingkronkeun sareng nyerat ka panyimpenan. Nalika ieu kajantenan, pamilik sistem kedah ngantosan dugi ka boot salajengna pikeun ngaluncurkeun utiliti. fsck filesystem-recovery
jeung, dina kasus awon, kaleungitan data.
Nanging, urang sadayana terang yén seueur alat IoT, ogé router, thermostat sareng mobil, ayeuna ngajalankeun Linux. Loba alat ieu boga saeutik atawa euweuh panganteur pamaké, sarta teu aya deui jalan pikeun mareuman aranjeunna "bersih". Bayangkeun ngamimitian mobil nganggo batré anu maot nalika kakuatan ka unit kontrol fsck
iraha mesin tungtungna ngamimitian? Jeung jawaban anu basajan. Alat anu dipasang ngandelkeun sistem file akar ro-rootfs
(baca-hijina root filesystem)).
ro-rootfs
nawiskeun seueur kauntungan anu kirang atra tibatan kaaslianana. Hiji kaunggulan nyaeta malware teu bisa nulis ka /usr
atawa /lib
, lamun euweuh prosés Linux Ubuntu bisa nulis aya. Anu sanésna nyaéta yén sistem file anu teu tiasa dirobih penting pisan pikeun ngadukung lapangan alat jauh, sabab tanaga dukungan ngandelkeun sistem lokal anu nominalna sami sareng sistem lapangan. Panginten anu paling penting (tapi ogé paling insidious) nyaéta yén ro-rootfs maksakeun pamekar pikeun mutuskeun objék sistem mana anu teu tiasa dirobih dina tahap desain sistem. Gawe sareng ro-rootfs tiasa kagok sareng nyeri, sabab variabel const sering aya dina basa pamrograman, tapi mangpaatna gampang menerkeun biaya tambahan.
ciptaan rootfs
Dibaca-hijina merlukeun sababaraha usaha tambahan pikeun pamekar embedded, sarta ieu mangrupa tempat VFS asalna kana gambar. Linux merlukeun file dina /var
bisa ditulis, jeung sajaba ti éta, loba aplikasi populér nu ngajalankeun sistem embedded bakal nyobian nyieun konfigurasi dot-files
в $HOME
. Hiji leyuran pikeun file konfigurasi dina diréktori imah biasana tos ngahasilkeun sarta ngawangun kana rootfs
. keur /var
Hiji pendekatan mungkin mun Gunung eta dina partisi ditulis misah, bari /
dipasang baca-hijina. Alternatif sejen populér nyaéta ngagunakeun beungkeutan atawa overlay mounts.
Linkable na stackable mounts, pamakéan maranéhanana ku peti
Palaksanaan paréntah man mount
nyaeta cara pangalusna pikeun neuleuman ngeunaan bindable na overlayable mounts, nu masihan pamekar jeung administrator sistem kamampuhan pikeun nyieun sistem file dina hiji jalur lajeng ngalaan eta ka aplikasi dina sejen. Pikeun sistem anu dipasang, ieu hartosna kamampuan pikeun nyimpen file /var
dina flash drive wungkul baca, tapi hiji overlay atawa jalur Gunung linkable tina tmpfs
в /var
nalika loading, éta bakal ngidinan aplikasi nulis catetan aya (scrawl). Dina waktos salajengna basa Anjeun ngahurungkeun perobahan ka /var
bakal leungit. Gunung overlay nyiptakeun union antara tmpfs
jeung sistem file kaayaan sarta ngidinan Anjeun pikeun nyieun parobahan ostensible kana file aya dina ro-tootf
sedengkeun gunung anu tiasa dibeungkeut tiasa ngadamel anu énggal kosong tmpfs
polder ditingali salaku bisa ditulis dina ro-rootfs
cara. Sedengkeun overlayfs
ieu nu bener (proper
) tipe sistem file, bindable Gunung dilaksanakeun di
Dumasar kana pedaran ngeunaan overlay na linkable Gunung, teu saurang ogé reuwas éta mountsnoop
от bcc
.
nelpon system-nspawn
ngamimitian wadahna bari ngajalankeun mountsnoop.py
.
Hayu urang tingali naon anu lumangsung:
Ngajalankeun mountsnoop
bari wadahna geus "booting" nunjukeun yen runtime wadahna urang téh kacida gumantung Gunung keur numbu (Ngan mimiti kaluaran panjang ditémbongkeun).
Ieu téh systemd-nspawn
nyadiakeun file dipilih di procfs
и sysfs
host kana wadahna salaku jalur ka dinya rootfs
. Salian ti éta MS_BIND
bandéra nu nyetél Gunung ngariung, sababaraha umbul séjén on Gunung ngahartikeun hubungan antara parobahan host na wadahna namespaces. Contona, hiji Gunung numbu boh bisa ngaliwatan parobahan /proc
и /sys
kana wadahna, atanapi nyumputkeun aranjeunna gumantung kana telepon.
kacindekan
Ngartos cara kerja jero Linux tiasa janten tugas anu mustahil, sabab kernel sorangan ngandung jumlah kode anu ageung, nyéépkeun aplikasi rohangan pangguna Linux sareng antarmuka sauran sistem di perpustakaan C sapertos. glibc
. Salah sahiji cara pikeun kamajuan nyaéta maca kode sumber tina hiji subsistem kernel, kalayan tekenan kana pamahaman panggero sistem sareng lulugu ruang-pamaké, ogé antarmuka kernel internal utama, sapertos tabel. file_operations
. Operasi file nyayogikeun prinsip "sagala mangrupikeun file", ngajantenkeun aranjeunna langkung pikaresepeun pikeun ngatur. C file sumber kernel dina diréktori tingkat luhur fs/
nampilkeun palaksanaan sistem file virtual, nu mangrupakeun lapisan wrapper nu nyadiakeun kasaluyuan lega tur kawilang basajan antara sistem file populér tur alat panyimpen. Ngahubungkeun sareng masang overlay via namespaces Linux mangrupikeun keajaiban VFS anu ngamungkinkeun nyiptakeun wadah baca wungkul sareng sistem file akar. Digabungkeun sareng pamariksaan kode sumber, alat inti eBPF sareng antarmukana bcc
nyieun eksplorasi inti gampang ti kantos.
Babaturan, nyerat, naha tulisan ieu mangpaat pikeun anjeun? Panginten anjeun gaduh koméntar atanapi koméntar? Sareng anu resep kana kursus Administrator Linux diondang
sumber: www.habr.com