User Tools

Site Tools


advanced-unix:capitole:capitol-02

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
advanced-unix:capitole:capitol-02 [2016/05/09 01:19]
razvan created
advanced-unix:capitole:capitol-02 [2016/05/16 12:28] (current)
razvan [Compilare pe 32 de biți]
Line 1: Line 1:
-====== 2. Sisteme de fișier ======+====== 2. Sisteme de fișiere ====== 
 + 
 +Sistemul de fișiere reprezintă componenta cea mai vizibilă din cadrul unui sistem de operare. Un utilizator folosește sistemul de fișiere prin operații de creare, ștergere, modificare și investigare a fișierelor. Mai mult, un utilizator poate administra sistemul de fișiere prin configurarea de permisiuni, prin stabilirea de cote de sistem de fișiere și prin acțiuni de formatare și montare de sisteme de fișiere.
  
 ===== Subiecte abordate ===== ===== Subiecte abordate =====
 +
 +  * Fișiere: definiții, tipuri, operații
 +  * Date și metadate
 +  * Sisteme de fișiere: roluri, operații
 +    * Sisteme de fișiere pentru mașini virtuale (imagini)
 +  * Comenzi avansate de lucru cu fișiere: ''​find'',​ ''​stat'',​ ''​ln'',​ ''​dd''​
 +  * Globbing
 +
 +==== Bune practici ====
 +
 +  * Construcția ''​%%$(...)%%''​ versus ''​xargs''​
 +  * Construcția ''​%%$(...)%%''​ versus ''​%%`...`%%''​
 +  * Obținerea listei de fișiere dintr-un director: ''​ls''​ vs. ''​find''​ vs. Bash arrays; ''​for''​ vs. ''​%%$(...)%%''​
  
 ===== Resurse utile ===== ===== Resurse utile =====
Line 7: Line 22:
 ===== Exerciții ===== ===== Exerciții =====
  
 +==== Find the secret messages ====
 +
 +Folosiți fișierul de la link-ul http://​swarm.cs.pub.ro/​~razvan/​r și aflați mesajele secrete.
 +
 +<note tip>
 +Pentru a descărca fișierul de link-ul de mai sus folosiți comanda<​code>​
 +wget http://​swarm.cs.pub.ro/​~razvan/​r
 +</​code>​
 +</​note>​
 +
 +<note tip>
 +Folosiți-vă de comanda ''​file''​ urmată de numele unui fișier pentru a afla informații despre acel fișier.
 +</​note>​
 +
 +<note tip>
 +Pentru fișiere comprimate LZOP instalați programul ''​lzop''​ folosind comanda:<​code>​
 +sudo apt-get install lzop
 +</​code>​
 +</​note>​
 +
 +==== Afișare fișiere ====
 +
 +Dorim să afișăm fișiere după diferite considerente.
 +
 +Folosiți ''​find''​ pentru a afișa toate **fișierele** din ierarhia ''/​etc/''​ (adică toate fișierele din ''/​etc/'',​ din subdirectoarele acestuia, din subdirectoarele subdirectoarelor etc.). **Indicație**:​ Folosiți opțiunea ''​-type''​ a comenzii ''​find''​.
 +
 +Folosiți ''​find''​ pentru a afișa toate fișierele din ierarhia ''/​etc/''​ al căror nume începe cu litere între ''​a''​ și ''​d''​. **Indicații**:​ Folosiți opțiunea ''​-name''​ a comenzii ''​find''​. Folosiți construcția ''​[a-d]*''​ pentru a indica un șir care începe cu o literă între ''​a''​ și ''​d''​ urmată de orice altceva.
 +
 +Folosiți ''​find''​ pentru a afișa toate fișierele din ierarhia ''/​etc/''​ al căror nume începe cu litere între ''​a''​ și ''​d''​ și are extensia ''​.conf''​ (adică se încheie în șirul ''​.conf''​). **Indicație**:​ Porniți de la comanda anterioară și extindenți argumentul transmis opțiunii ''​-name''​.
 +
 +Folosiți ''​find''​ pentru a a afișa toate fișierele din ierahia ''/​etc/''​ care sunt deținute de utilizatorul ''​root''​ și grupul ''​root''​. **Indicație**:​ Folosiți optiunea ''​-user''​ a comenzii ''​find''​.
 +
 +Folosiți ''​find''​ pentru a a afișa toate fișierele din ierahia ''/​etc/''​ care sunt deținute de utilizatorul ''​root''​ și un grup diferit de ''​root''​. **Indicație:​** Folosiți ''​!''​ (semnul exclamării în fața opțiunii necesare pentru a o nega).
 +
 +Folosiți ''​find''​ pentru a a afișa toate fișierele din ierahia ''/​etc/''​ pentru care ''​others''​ au permisiuni de orice fel (adică ''​others''​ au **oricare** dintre permisiunile //read//, //write// sau //​execute//​). **Indicații**:​ Urmăriți opțiunea ''​-perm''​ în pagina de manual a comenzii ''​find''​. Urmăriți și exemplele de folosire căutând după șirul ''​EXAMPLES''​.
 +
 +Folosiți ''​find''​ pentru a a afișa toate fișierele din ierahia ''/​etc/''​ pentru care ''​others''​ nu au nici un fel de permisiuni (de orice fel: //read//, //write// sau //​execute//​). **Indicație:​** Folosiți ''​!''​ (semnul exclamării în fața opțiunii necesare pentru a o nega).
 +
 +==== Afișare informații despre fișiere ====
 +
 +Dorim să afișăm informații despre fișiere folosind comanda ''​stat'',​ comandă dedicată exact obținerii de informații despre fișiere.
 +
 +Afișați pentru fișierul ''/​etc/​passwd''​ doar dimensiunea. **Indicație**:​ Folosiți comanda ''​stat''​ împreună cu opțiunea ''​%%--format%%''​ (sau ''​-c'',​ forma scurtă a acestei opțiuni).
 +
 +Afișați pentru fișierul ''/​etc/​passwd''​ inode-ul, dimensiunea și uid-ul, separate prin '',''​ (virgulă).
 +
 +Afișați numele, inode-ul, dimensiunea și uid-ul separate prin '',''​ (virgulă) pentru fișierele din ierarhia ''/​etc/''​.
 +
 +Afișați numele, inode-ul, dimensiunea și uid-ul separate prin '',''​ (virgulă) pentru fișierele din ierarhia ''/​etc/''​ care au extensia ''​.conf''​.
 +
 +Calculați totalul de octeți ocupat de fișierele din ierarhia ''/​etc/''​ care au extensia ''​.conf''​. **Indicație**:​ Dacă aveți numere (câte unul pe linie) pe care vreți să le adunați, folosiți construcția ''​paste -s -d '​+'''​. Pentru a efectua calculul, folosiți comanda ''​bc''​.
 +
 +==== Fișiere ordonate după dimensiune ====
 +
 +Listați primele 10 **fișiere obișnuite** (//regular files//) din ierarhia ''/​etc''​ (adică din toate directoarele,​ subdirectoarele și subdirectoarele acestora etc.) sortate în ordinea dimesiunii ocupate de fiecare fișier.
 +
 +<note tip>
 +Folosiți ''​find''​ cu opțiunea ''​-exec'',​ ''​stat''​ (cu opțiunea ''​-c''​ și formatul necesar pentru afișarea numelui și dimensiuni ca argument către opțiunea ''​-exec''​ a lui ''​find''​),​ ''​sort''​ și ''​head''​.
 +
 +Exemplu de rulare pentru ''​find''​ cu ''​-exec''​ este<​code>​
 +find /etc/ -type f -exec ls -l {} \;
 +</​code>​
 +</​note>​
 +
 +==== Construire fișier cu informații binare ====
 +
 +Creați un fișier care să conțină 2048 de octeți de zero (din ''/​dev/​zero''​) urmați de 2048 de octeți aleatori (din ''/​dev/​urandom''​) urmați de 2048 de octeți de zero și apoi urmați de 2048 de octeți din fișierul ''/​bin/​false''​ de la offsetul 4096 al fișierului.
 +
 +<note important>​
 +Argumentul pentru opțiunile ''​skip''​ și ''​seek''​ ale comenzii ''​dd''​ este dat în număr de blocuri, **nu** în număr de octeți.
 +</​note>​
 +
 +==== Generare fișiere multiple și conținut aleator ====
 +
 +Folosiți ''/​dev/​urandom'',​ ''​dd''​ și ''​split''​ pentru a genera, într-un one liner, 100 de fișiere a câte 100 de octeți aleatori cu numele ''​partXYZ.dat''​ unde ''​XYZ''​ sunt valorile 000, 001, ..., 099. Adică ''​part000.dat'',​ ''​part001.dat'',​ ..., ''​part099.dat''​.
 +
 +<note tip>
 +''​dd''​ poate scrie la standard output în **absența** opțiunii ''​of''​.
 +
 +''​split''​ poate citi de la standard input dacă se folosește construcția ''​-''​ (semnul minus) pentru numele fișierului.
 +</​note>​
 +
 +==== Compilare fișier ====
 +
 +Creați un fișier ''​.c''​ care să afișeze mesajul ''​Hello,​ world!''​. Compilați-l pentru a obține un executabil. Verificați folosind comanda ''​file''​ că este un executabil format ELF (//​Executable and Linking Format//). Apoi rulați-l.
 +
 +==== debsums ====
 +
 +Instalați și configurați pachetul ''​debsums''​ care verifică integritatea fișierelor locale. Modificați un executabil mai puțin relevant din sistem (eventual faceți-i o copie de siguranță) și apoi reverificați cu ''​debsums''​.
 +
 +==== chroot și executabile statice ====
 +
 +Din fișierul ''​C''​ de mai sus creați un executabil static.
 +
 +<note tip>
 +Pentru a compila static folosiți opțiunea ''​-static''​ la ''​gcc''​. Adică similar cu
 +<​code>​
 +gcc -Wall -static hello.c -o hello-static
 +</​code>​
 +</​note>​
 +
 +<note tip>
 +Un executabil static nu depinde de biblioteci externe. Puteți vedea acest lucru cu ajutorul comenzii ''​ldd''​ (list dynamic dependencies) peste un executabil static sau dinamic, similar rulării de mai jos:
 +<​code>​
 +ldd ./hello
 +ldd ./​hello-static
 +</​code>​
 +</​note>​
 +
 +Puneți acel fișier în directorul ''/​tmp/​chroot/''​ (trebuie să-l creați în prealabil). Rulați executabilul obținut folosind comanda ''​chroot''​ (adică rulați-l având ca director rădăcină,​ chroot-at, directorul ''/​tmp/​chroot''​).
 +
 +<note tip>
 +Comanda ''​chroot''​ poate fi rulat doar de ''​root''​. Puteți rula în forma
 +<​code>​
 +sudo chroot /tmp/chroot /​hello-static
 +</​code>​
 +</​note>​
 +
 +Încercați apoi același lucru pe un executabil dinamic. Observați că nu funcționează. Copiați în directorul de chroot (''/​tmp/​chroot/''​) bibliotecile aferente în directoarele corespunzătoare,​ astfel încât să funcționeze.
 +
 +<note tip>
 +Bibliotecile le determinați cu ajutorul comenzii ''​ldd''​ peste executabilul dinamic.
 +</​note>​
 +
 +<note tip>
 +Folosiți opțiunea ''​%%--parents%%''​ pentru ''​cp''​ pentru a crea la destinație calea completă către fișierele de tip bibliotecă.
 +</​note>​
 +
 +Adăugați în fișierul ''​C''​ un apel de tipul ''​sleep''​ sau ''​pause''​ și refaceți pașii de mai sus. În timp ce executabilul rulează porniți, din altă consolă, o comandă ''​lsof''​ pentru a afișa fișierele deschide de acest proces. Observați directorul rădăcină al procesului (''​rtd''​).
 +
 +==== Generare și folosire imagine ISO ====
 +
 +Vrem să creăm o imagina ISO pentru toate fișierele dn ierarhia ''/​etc''​.
 +
 +Creați un fișier ''​etc.iso''​ folosind comanda ''​genisoimage''​ care să conțină fișierele din ierarhia ''/​etc''​.
 +
 +Apoi montați imaginea ISO pentru a valida structura corectă a fișierului ''​.iso''​. Folosiți indicațiile de [[http://​askubuntu.com/​a/​193632|aici]].
  
advanced-unix/capitole/capitol-02.1462745958.txt.gz · Last modified: 2016/05/09 01:19 by razvan