Salute à tutti, spartemu cun voi a seconda parte di a publicazione "Sistemi di schedarii virtuali in Linux: perchè sò necessarii è cumu funzionanu?" Pudete leghje a prima parte
Cumu monitorà VFS cù eBPF è strumenti bcc
U modu più faciule per capisce cumu u kernel opera nantu à i schedari sysfs
hè di vede in pratica, è a manera più faciule di fighjà ARM64 hè di utilizà eBPF. eBPF (abbreviazione di Berkeley Packet Filter) hè custituitu da una macchina virtuale in esecuzione query
) da a linea di cummanda. I fonti di u kernel dicenu à u lettore ciò chì u kernel pò fà; eseguisce l'arnesi eBPF nantu à un sistema caricatu mostra ciò chì u kernel hè in realtà.
Per furtuna, avè principiatu cù eBPF hè abbastanza faciule cù l'aiutu di l'arnesi bcc
sò script Python cù picculi inserimenti di codice C, chì significa chì qualchissia familiarizatu cù e duie lingue pò facilmente mudificà. IN bcc/tools
Ci sò 80 script Python, chì significa chì u più prubabilmente un sviluppatore o amministratore di u sistema puderà sceglie qualcosa adattatu per risolve u prublema.
Per avè almenu una idea superficiale di ciò chì i VFS facenu nantu à un sistema in esecuzione, pruvate vfscount
o vfsstat
. Questu mostrarà, dicemu, chì decine di chjama vfs_open()
è "i so amichi" succede literalmente ogni seconda.
vfsstat.py
hè un script Python cù inserti di codice C chì simpricimenti cunta e chjama di funzione VFS.
Demu un esempiu più triviale è vede ciò chì succede quandu inserisce una unità flash USB in un urdinatore è u sistema u detecta.
Utilizendu eBPF pudete vede ciò chì succede in
/sys
quandu una unità flash USB hè inserita. Un esempiu simplice è cumplessu hè mostratu quì.
In l'esempiu mostratu sopra, bcc
strumentu sysfs_create_files()
. Avemu vistu chì sysfs_create_files()
hè stata lanciata usendu kworker
stream in risposta à u fattu chì u flash drive hè statu inseritu, ma chì schedariu hè statu creatu? U sicondu esempiu mostra u putere di eBPF. Quì trace.py
Stampa un backtrace di kernel (opzione -K) è u nome di u schedariu chì hè statu creatu sysfs_create_files()
. L'inserimentu di una dichjarazione unica hè un codice C chì include una stringa di furmatu facilmente ricunnisciutu furnita da u script Python chì esegue LLVM compilatore just-in-time. Compila sta linea è eseguisce in una macchina virtuale in u kernel. Firma piena di funzioni sysfs_create_files ()
deve esse ripruduciutu in u sicondu cumandamentu per chì a stringa di furmatu pò riferisce à unu di i paràmetri. L'errori in questu pezzu di codice C risultanu in errori ricunnisciuti da u compilatore C. Per esempiu, se u paràmetru -l hè omessi, vi vede "Failed to compile BPF text". I sviluppatori chì sò familiarizati cù C è Python truveranu l'arnesi bcc
faciule d'espansione è di cambià.
Quandu l'unità USB hè inserita, u backtrace di u kernel mostrarà chì PID 7711 hè un filu. kworker
chì hà creatu u schedariu «events»
в sysfs
. In cunsiquenza, a chjama da sysfs_remove_files()
mostrarà chì l'eliminazione di l'unità hà risultatu in u schedariu esse eliminatu events
, chì currisponde à u cuncettu generale di cunti di riferimentu. À u listessu tempu, vede sysfs_create_link ()
cù eBPF mentre inserisce l'unità USB mostrarà chì almenu 48 ligami simbolichi sò stati creati.
Allora chì hè u puntu di u schedariu di l'avvenimenti? Usu disk_add_events ()
, è ancu "media_change"
, o "eject_request"
pò esse arregistratu in un schedariu di avvenimentu. Quì a capa di bloccu di u kernel informa l'upertu di l'utilizatori chì un "discu" hè apparsu è espulsu. Nota quantu informativu stu metudu di ricerca hè inseritu un discu USB, paragunatu à pruvà à capisce cumu e cose funzionanu solu da a fonte.
I sistemi di file radice di sola lettura attivanu i dispositi integrati
Di sicuru, nimu ùn spegne u servitore o u so urdinatore tirà u plug da u socket. Ma perchè ? Questu hè chì i sistemi di fugliali muntati nantu à i dispositi di almacenamentu fisicu pò avè una scrittura ritardata, è e strutture di dati chì registranu u so statu ùn ponu micca esse sincronizzati cù scrittura à u almacenamiento. Quandu succede questu, i pruprietarii di u sistema anu da aspittà finu à u prossimu boot per lancià l'utilità. fsck filesystem-recovery
è, in u peghju casu, perde dati.
In ogni casu, sapemu tutti chì parechji dispositi IoT, è ancu routers, termostati è vitture, ora funzionanu Linux. Parechje di sti dispusitivi hannu pocu à nimu interfaccia utilizatori, è ùn ci hè manera di turnà li "pulitamenti". Immaginate di inizià una vittura cù una bateria morta quandu u putere à a unità di cuntrollu hè fsck
quandu u mutore principia finalmente à marchjà ? È a risposta hè simplice. I dispositi incrustati si basanu nantu à u sistema di fugliale radicali ro-rootfs
(Fileystem root di sola lettura)).
ro-rootfs
offre parechji benefici chì sò menu evidenti di l'autenticità. Un vantaghju hè chì u malware ùn pò micca scrive /usr
o /lib
, se nisun prucessu Linux pò scrive quì. Un altru hè chì un sistema di fugliale largamente immutable hè criticu per u supportu di campu di i dispositi remoti, postu chì u persunale di supportu si basa in sistemi lucali chì sò nominali identichi à i sistemi di campu. Forsi u benefiziu più impurtante (ma ancu più insidiosu) hè chì ro-rootfs forza i sviluppatori à decide chì l'uggetti di u sistema seranu immutable in u stadiu di cuncepimentu di u sistema. U travagliu cù ro-rootfs pò esse sgradu è dulurosu, cum'è e variabili constanti sò spessu in linguaggi di prugrammazione, ma i so benefizii justificà facilmente l'overhead supplementu.
criazioni rootfs
A sola lettura richiede un sforzu extra per i sviluppatori incrustati, è questu hè induve VFS vene in u ritrattu. Linux richiede chì i schedari sò in /var
eranu scrivibili, è in più, assai appricazzioni populari chì eseguinu sistemi incrustati pruvaranu di creà cunfigurazione dot-files
в $HOME
. Una soluzione per i fugliali di cunfigurazione in u cartulare di casa hè di solitu di pre-generali è di custruisce in elli rootfs
. di /var
Un approcciu pussibule hè di muntallu nantu à una partizione scrivibile separata, mentri /
muntatu in sola lettura. Un'altra alternativa populari hè di utilizà monti bind o overlay.
Munti ligami è stackable, u so usu di cuntenituri
Esecuzione di cumanda man mount
hè u megliu modu per amparà nantu à i monti bindable è overlayable, chì dà à i sviluppatori è l'amministratori di u sistema l'abilità di creà un sistema di fugliale in una strada è poi espone à l'applicazioni in un altru. Per i sistemi integrati, questu significa a capacità di almacenà i fugliali /var
nantu à una unità flash di sola lettura, ma una strada di muntagna sovrapposta o linkable da tmpfs
в /var
quandu si carica, permetterà à l'applicazioni di scrive note quì (scrawl). A prossima volta chì attivate i cambiamenti /var
sarà persu. Un monte di sovrapposizione crea una unione trà tmpfs
è u sistema di schedarii sottostanti è vi permette di fà cambiamenti apparenti à i schedari esistenti in ro-tootf
mentre chì una muntagna bindable pò fà viotu novi tmpfs
cartulare visibili cum'è scrivibili in ro-rootfs
modi. Mentre overlayfs
questu hè u dirittu (proper
) tippu di sistema di file, a muntagna vincolabile hè implementata in
Basatu nantu à a descrizzione di a superposizione è a muntagna linkable, nimu ùn hè stupitu chì mountsnoop
от bcc
.
Challenge system-nspawn
principia u containeru mentre corre mountsnoop.py
.
Videmu ciò chì hè accadutu:
Lancia mountsnoop
mentre chì u cuntinuu hè "booting" mostra chì u runtime di u cuntinuu hè assai dipendente da a muntagna chì hè ligata (Solu l'iniziu di a longa output hè mostratu).
hè systemd-nspawn
furnisce i schedari selezziunati in procfs
и sysfs
host to container as paths to it rootfs
... eccettu MS_BIND
bandiera chì stabilisce a muntagna di ubligatoriu, alcune altre bandiere nantu à a muntagna definiscenu a relazione trà i cambiamenti à l'ospitu è u spaziu di nomi di cuntainer. Per esempiu, una muntagna ligata pò saltà i cambiamenti /proc
и /sys
in u cuntinuu, o ammuccialli sicondu a chjama.
cunchiusioni
Capisce u funziunamentu internu di Linux pò sembrà un compitu impussibile, postu chì u kernel stessu cuntene una quantità enorme di codice, lascendu da parte l'applicazioni spaziali di l'utilizatori di Linux è l'interfacce di chjama di sistema in biblioteche C cum'è glibc
. Una manera di fà u prugressu hè di leghje u codice fonte di un sottosistema di u kernel, cun enfasi nantu à capiscenu i chjami di u sistema è l'intestazione di u spaziu di l'utilizatori, è ancu l'interfacce principali di u kernel internu, cum'è a tavola. file_operations
. L'operazioni di u schedariu furnisce u principiu "tuttu hè un schedariu", facendu particularmente piacevule à gestisce. I fugliali di fonte di u kernel C in u cartulare di primu livellu fs/
presentanu una implementazione di sistemi di schedarii virtuali, chì sò una strata di wrapper chì furnisce una cumpatibilità larga è relativamente simplice trà i sistemi di fugliale populari è i dispositi di almacenamento. U ligame è a sovrapposizione via spazii di nomi Linux hè a magia di VFS chì permette a creazione di cuntenituri di sola lettura è sistemi di file di root. Cumminatu cù un esame di u codice fonte, u strumentu core eBPF è a so interfaccia bcc
rendendu l'esplorazione di u core più faciule ch'è mai.
Amici, scrivite, vi hè statu utile stu articulu ? Forse avete qualchì cumentu o rimarche? È quelli chì sò interessati à u cursu di l'Amministratore Linux sò invitati
Source: www.habr.com