Sistemi di schedarii virtuali in Linux: perchè sò necessarii è cumu funzionanu? Parte 2

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 ccà. Ricordemu chì sta seria di publicazioni hè cronometrata per coincide cù u lanciu di un novu flussu nantu à u corsu. "Amministratore Linux", chì principia assai prestu.

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 core, chì l'utilizatori privilegiati ponu dumandà (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à.

Sistemi di schedarii virtuali in Linux: perchè sò necessarii è cumu funzionanu? Parte 2

Per furtuna, avè principiatu cù eBPF hè abbastanza faciule cù l'aiutu di l'arnesi MASSARO, chì sò dispunibuli cum'è pacchetti da a distribuzione generale Linux è documentatu in dettagliu Bernard Gregg. Strumenti 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.

Sistemi di schedarii virtuali in Linux: perchè sò necessarii è cumu funzionanu? Parte 2

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.

Sistemi di schedarii virtuali in Linux: perchè sò necessarii è cumu funzionanu? Parte 2

Utilizendu eBPF pudete vede ciò chì succede in /sysquandu una unità flash USB hè inserita. Un esempiu simplice è cumplessu hè mostratu quì.

In l'esempiu mostratu sopra, bcc strumentu traccia.py imprime un missaghju quandu u cumandimu hè eseguitu 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. kworkerchì 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 cscope Per a ricerca __device_add_disk(), mostra ciò chì provoca 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è Linux salta sempre in su è giù. Cumu hè chì u sistema boots senza un longu fsckquandu u mutore principia finalmente à marchjà ? È a risposta hè simplice. I dispositi incrustati si basanu nantu à u sistema di fugliale radicali solu per leghje (abbreviata 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 Spaziu di nomi VFS.

Basatu nantu à a descrizzione di a superposizione è a muntagna linkable, nimu ùn hè stupitu chì Contenituri Linux sò attivamente utilizati. Videmu ciò chì succede quandu usemu systemd-nspawn per eseguisce u cuntinuu cù l'utillita 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).

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 Open Day, chì si ferà u 18 d'aprile.

Prima parte.

Source: www.habr.com

Add a comment