User Tools

Site Tools


advanced-unix:capitole:capitol-02

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

  • 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

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.

Pentru a descărca fișierul de link-ul de mai sus folosiți comanda

wget http://swarm.cs.pub.ro/~razvan/r

Folosiți-vă de comanda file urmată de numele unui fișier pentru a afla informații despre acel fișier.

Pentru fișiere comprimate LZOP instalați programul lzop folosind comanda:

sudo apt-get install lzop

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.

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

find /etc/ -type f -exec ls -l {} \;

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.

Argumentul pentru opțiunile skip și seek ale comenzii dd este dat în număr de blocuri, nu în număr de octeți.

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.

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.

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.

Pentru a compila static folosiți opțiunea -static la gcc. Adică similar cu

gcc -Wall -static hello.c -o hello-static

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:

ldd ./hello
ldd ./hello-static

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).

Comanda chroot poate fi rulat doar de root. Puteți rula în forma

sudo chroot /tmp/chroot /hello-static

Î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.

Bibliotecile le determinați cu ajutorul comenzii ldd peste executabilul dinamic.

Folosiți opțiunea --parents pentru cp pentru a crea la destinație calea completă către fișierele de tip bibliotecă.

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 aici.

advanced-unix/capitole/capitol-02.txt · Last modified: 2016/05/16 12:28 by razvan