Table of Contents

Laborator 05 - Gestiunea sistemului de fișiere

Suport laborator

Pentru început clonați repository-ul de USO:

git clone https://github.com/systems-cs-pub-ro/uso.git

Demo

1. Permisiuni

În laboratorul precedent am aflat că într-un sistem pot exista mai mulți utilizatori. Totuși, fiecare utilizator trebuie sa poată avea fișierele lui personale care să nu poată fi modificate de un alt utilizator fără permisiunea sa, iar unele fișiere sau resurse trebuie să nu poată fi accesate decât de către utilizatorul privilegiat (root). În alte cuvinte trebuie să avem o metodă de a controla accesul utilizatorilor la diversele elemente ale sistemului.

Abordarea utilizată în Linux este de a folosi permisiuni. Acestea dictează ce operații (de scriere, citire sau executare) poate să efectueze un utilizator asupra unui fișier sau director. Ele sunt împărțite în trei categorii:

Pentru fiecare dintre cele trei categorii există trei permisiuni:

Ordinea în care se aplică aceste permisiuni este: dacă utilizatorul este deținătorul fișierului, atunci se aplică permisiunile pentru owner; dacă face parte din grupul deținător, atunci se aplică permisiunile pentru group; dacă niciuna dintre condițiile precedente nu este adevărată, atunci se aplică permisiunile pentru others.

Vizualizarea permisiunilor

Pentru a vedea conținutul unui director folosim comanda ls. Dacă îi pasăm argumentul -l atunci comanda va lista conținutul în format lung, adică va afișă informații suplimentare. Să luăm un exemplu:

student@uso:~/uso/lab05/demo$ touch a
student@uso:~/uso/lab05/demo$ sudo touch b
student@uso:~/uso/lab05/demo$ ls
a  b
student@uso:~/uso/lab05/demo$ ls -l
total 0
-rw-rw-r-- 1 student student 0 oct  6 23:58 a
-rw-r--r-- 1 root    root    0 oct  6 23:58 b

Să ne uităm mai indeaproape la rezultatul rulării comenzii ls -l:

- rw- rw- r– 1 student student 0 oct 6 23:58 a
Tipul intrării Permisiuni Numărul de hardlink-uri Deținătorul Grupul Dimensiunea Data ultimei modificări Numele fișierului

Modificarea permisiunilor

Pentru a modifica permisiunile unui fișier folosim comanda chmod. Putem să specificăm noile permisiuni în două moduri:

student@uso:~/uso/lab05/demo$ ls -l
total 0
-rw-rw-r-- 1 student student 0 oct  6 23:58 a
-rw-r--r-- 1 root    root    0 oct  6 23:58 b
student@uso:~/uso/lab05/demo$ chmod u+x a
student@uso:~/uso/lab05/demo$ ls -l
total 0
-rwxrw-r-- 1 student student 0 oct  6 23:58 a
-rw-r--r-- 1 root    root    0 oct  6 23:58 b
student@uso:~/uso/lab05/demo$ chmod o=w a
student@uso:~/uso/lab05/demo$ ls -l
total 0
-rwxrw--w- 1 student student 0 oct  6 23:58 a
-rw-r--r-- 1 root    root    0 oct  6 23:58 b
r w x r - x r - -
1 1 1 1 0 1 1 0 0
7 5 4
student@uso:~/uso/lab05/demo$ ls -l
total 0
-rwxrw--w- 1 student student 0 oct  7 21:48 a
-rw-r--r-- 1 root    root    0 oct  7 21:48 b
student@uso:~/uso/lab05/demo$ chmod 754 a
student@uso:~/uso/lab05/demo$ ls -l
total 0
-rwxr-xr-- 1 student student 0 oct  7 21:48 a
-rw-r--r-- 1 root    root    0 oct  7 21:48 b
student@uso:~/uso/lab05/demo$ chmod 664 a
student@uso:~/uso/lab05/demo$ ls -l
total 0
-rw-rw-r-- 1 student student 0 oct  7 21:48 a
-rw-r--r-- 1 root    root    0 oct  7 21:48 b

Modificarea utilizatorului și a grupului

Pentru a modifica utilizatorul deținător al unui fișier folosim comanda chown.

student@uso:~/uso/lab05/demo$ ls -l
total 0
-rw-rw-r-- 1 student student 0 oct  7 21:48 a
-rw-r--r-- 1 root    root    0 oct  7 21:48 b
student@uso:~/uso/lab05/demo$ sudo chown gigi a
student@uso:~/uso/lab05/demo$ ls -l
total 0
-rw-rw-r-- 1 gigi student 0 oct  7 21:48 a
-rw-r--r-- 1 root root    0 oct  7 21:48 b

Pentru a modifica grupul deținător al unui fișier folosim comanda chgrp. Alternativ putem folosi tot comanda chown, dar îi vom pasa un parametru de forma owner:group.

student@uso:~/uso/lab05/demo$ ls -l
total 0
-rw-rw-r-- 1 gigi student 0 oct  7 21:48 a
-rw-r--r-- 1 root root    0 oct  7 21:48 b
student@uso:~/uso/lab05/demo$ sudo chgrp gigi a
student@uso:~/uso/lab05/demo$ ls -l
total 0
-rw-rw-r-- 1 gigi gigi 0 oct  7 21:48 a
-rw-r--r-- 1 root root 0 oct  7 21:48 b
student@uso:~/uso/lab05/demo$ sudo chown student:student a
student@uso:~/uso/lab05/demo$ ls -l
total 0
-rw-rw-r-- 1 student student 0 oct  7 21:48 a
-rw-r--r-- 1 root    root    0 oct  7 21:48 b
Operația de schimbare utilizatorului sau a grupului deținător ale unui fișier sunt operații privilegiate, deci trebuie executate cu sudo.

Masca de permisiuni

Să creăm un nou fișier și un nou director. Cu ce permisiuni vor fi create ele?

student@uso:~/uso/lab05/demo$ ls -l
total 0
-rw-rw-r-- 1 student student 0 oct  7 21:48 a
-rw-r--r-- 1 root    root    0 oct  7 21:48 b
student@uso:~/uso/lab05/demo$ touch c
student@uso:~/uso/lab05/demo$ mkdir d
student@uso:~/uso/lab05/demo$ ls -l
total 4
-rw-rw-r-- 1 student student    0 oct  7 21:48 a
-rw-r--r-- 1 root    root       0 oct  7 21:48 b
-rw-rw-r-- 1 student student    0 oct  7 22:15 c
drwxrwxr-x 1 student student 4096 oct  7 22:15 d

Observați că toate fișierele utilizatorului student sunt create cu aceleași permisiuni. Permisiunile de creare ale fișierelor și directoarelor sunt obținute prin efectuarea operației și pe biți între permisiunile implicite (666 pentru fișiere și 777 pentru directoare) și valoarea inversată a măștii de creare. Această mască poate fi vizualizată și modificată cu ajutorul comenzii umask.

student@uso:~/uso/lab05/demo$ umask
0002
Comandă Mască implicită umask Permisiuni
touch c 666 002 666 & ~002 = 110110110 & 111111101 = 664
mkdir d 777 002 777 & ~002 = 111111111 & 111111101 = 775

Masca întoarsă de umask ne spune ce permisiuni să nu aibă fișierele noi create. Prima cifră se referă la permisiuni speciale (vezi capitolul 10.3.3 din carte). Următoarele trei cifre se referă, ca și până acum, la drepturile utilizatorului, grupului și a celorlalți. Putem să modificăm masca pasându-i comenzii umask un parametru sub formă octală, la fel ca în cazul comenzii chmod.

student@uso:~/uso/lab05/demo$ umask 006
student@uso:~/uso/lab05/demo$ touch e
student@uso:~/uso/lab05/demo$ mkdir f
student@uso:~/uso/lab05/demo$ ls -l
total 8
-rw-rw-r-- 1 student student    0 oct  7 21:48 a
-rw-r--r-- 1 root    root       0 oct  7 21:48 b
-rw-rw-r-- 1 student student    0 oct  7 22:15 c
drwxrwxr-x 1 student student 4096 oct  7 22:15 d
-rw-rw---- 1 student student    0 oct  7 22:16 e
drwxrwx--x 2 student student 4096 oct  7 22:16 f
Comandă Mască implicită umask Permisiuni
touch e 666 006 666 & ~006 = 110110110 & 111111001 = 660
mkdir f 777 006 777 & ~006 = 111111111 & 111111001 = 771
Nu uitați că umask specifică ce permisiuni să nu aibă fișierele și directoarelor. Modul de utilizare este exact invers lui chmod.

Link-urile sunt legături între două puncte ale sistemului de fișiere. În general le folosim când vrem să ne ușurăm accesul la un fișier sau director, sau pentru a uniformiza accesul.

Sistemul de fișiere folosit în Linux permite două tipuri de link-uri:

Pentru a crea un link folosim comanda ln. Pentru a crea un link simbolic trebuie să specificăm parametrul -s.

student@uso:~/uso/lab05/demo$ touch a
student@uso:~/uso/lab05/demo$ ln -s a sym
student@uso:~/uso/lab05/demo$ ls -l
total 0
-rw-rw---- 1 student student 0 oct  7 22:42 a
lrwxrwxrwx 1 student student 1 oct  7 22:42 sym -> a

Observați că ultima linie începe cu l, semnificând ca intrarea este un link simbolic. Mai mult, ls -l ne arată și către ce fișier pointează link-ul: a.

student@uso:~/uso/lab05/demo$ echo "abc" > a
student@uso:~/uso/lab05/demo$ cat a
abc
student@uso:~/uso/lab05/demo$ cat sym
abc

Link-ul se comportă ca și fișierul către care pointează. Putem să le folosim ca fiind același fișier. Ce se întamplă totuși dacă mutăm fișierul destinație?

student@uso:~/uso/lab05/demo$ mv a ..
student@uso:~/uso/lab05/demo$ cat sym
cat: sym: No such file or directory

Link-ul nu mai funcționează mutat fișierul către care pointa. Această problemă nu poate fi rezolvată cu link-uri simbolice. Dacă vrem să putem muta fișierul destinație, trebuie sa folosim link-uri hard.

Pentru a crea link-uri hard folosim comanda ln fără a specifica parametrul -s.

student@uso:~/uso/lab05/demo$ mv ../a .
student@uso:~/uso/lab05/demo$ ln a hard
student@uso:~/uso/lab05/demo$ ls -l
total 0
-rw-rw---- 2 student student 0 oct  7 22:42 a
-rw-rw---- 2 student student 0 oct  7 22:45 hard

Observați că ultima linie nu mai începe cu l și nici nu mai conține destinația link-ului. Să încercăm acum să mutăm cele două fișiere.

student@uso:~/uso/lab05/demo$ cat hard
abc
student@uso:~/uso/lab05/demo$ mv a ..
student@uso:~/uso/lab05/demo$ cat hard
abc

Acum putem să mutăm ambele fișiere oriunde în sistemul de fișiere și totul decurge așa cum ne-am aștepta. Sau…

student@uso:~/uso/lab05/demo$ rm ../a
student@uso:~/uso/lab05/demo$ cat hard
abc

… ce s-a întâmplat aici???

3. Lucrul cu sisteme de fișiere

Un sistem de fișiere reprezintă modul de organizare a fișierelor pe un mediu de stocare pentru a le face mai ușor accesibile. Sistemul de fișiere folosit, în general, pe sistemele Linux se numește ext4. Pentru a vedea ce sisteme de fișiere există în sistem folosim comanda fdisk -l.

student@uso:~/uso/lab05/demo$ sudo fdisk -l
Disk /dev/sda: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders, total 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000de65a

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048    14680063     7339008   83  Linux
/dev/sda2        14682110    16775167     1046529    5  Extended
/dev/sda5        14682112    16775167     1046528   82  Linux swap / Solaris

Disk /dev/sdc: 4043 MB, 4043308544 bytes
114 heads, 6 sectors/track, 11545 cylinders, total 7897087 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0002cc78

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1   *        2048     7895039     3946496    c  W95 FAT32 (LBA)

Pentru a afla informații despre unul dintre aceste sisteme de fișiere, folosim comanda df. Pentru a face rezultatul mai ușor de citit pentru noi, vom folosi argumentul -h (human-readable).

student@uso:~$ df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       6,8G  3,3G  3,2G  52% /

Pentru a afla informații despre cât spațiu ocupă pe disc un director sau fișier folosim comanda du. Din nou vom folosi argumentul -h. Putem folosi și argumentul -s pentru a primi doar totalul pentru fiecare director primit ca argument.

student@uso:~/uso$ du -h lab05
0	lab05/demo
3.6M	lab05/star_wars_episode_iv_a_new_hope/death_star
0	lab05/star_wars_episode_iv_a_new_hope/millenium_falcon/smuggling_compartment
0	lab05/star_wars_episode_iv_a_new_hope/millenium_falcon
512	lab05/star_wars_episode_iv_a_new_hope/tatooine/mos_eisley
512	lab05/star_wars_episode_iv_a_new_hope/tatooine
0	lab05/star_wars_episode_iv_a_new_hope/yavin/plans
0	lab05/star_wars_episode_iv_a_new_hope/yavin
3.6M	lab05/star_wars_episode_iv_a_new_hope
3.6M	lab05/
student@uso:~/uso$ du -hs lab05
3.6M	lab05/

Montarea și demontarea sistemelor de fișiere

Un sistem de fișiere nu poate fi folosit decât dacă este montat. Comanda cu ajutorul căreia putem face asta este mount. Fără niciun argument ne va spune ce sisteme de fișiere sunt montate și în ce directoare sunt montate.

student@uso:~/uso/lab05/demo$ mount

Pentru a putea să monteze un sistem de fișiere trebuie să îi specificăm ce tip este acesta, fișierul dispozitiv și directorul în care să îl monteze.

student@uso:~/uso/lab05/demo$ mkdir mnt
student@uso:~/uso/lab05/demo$ ls mnt
student@uso:~/uso/lab05/demo$ sudo mount -t vfat /dev/sdc1 mnt
student@uso:~/uso/lab05/demo$ ls mnt
stuff

Operația opusă montării este demontarea, care se realizează cu ajutorul comenzii umount. Acesteia nu trebuie să îi specificăm decât directorul unde este montat sistemul de fișier ce se dorește a fi demontat.

student@uso:~/uso/lab05/demo$ sudo umount mnt
student@uso:~/uso/lab05/demo$ ls
Montarea și demontarea sistemelor de fișiere este o acțiune privilegiată. Dacă dorim să montăm/demontăm un sistem de fișiere ca un utilizator neprivilegiat, trebuie sa prefixăm comanda cu sudo.

Exerciții

Intrați în directorul /home/student. Clonați repository-ului oficial uso folosind comanda:
student@uso:~$ git clone https://github.com/systems-cs-pub-ro/uso 

În directorul ~/uso/lab05 găsiți fișierele și directoarele necesare pentru rezolvarea acestui laborator.

1. Adăugarea unor utilizatori noi (1p)

Adăugați în sistem utilizatorii han, chewbacca, luke, leia și darth_vader.

Comanda folosită pentru a adăuga utilizatori în sistem este adduser.

2. Adăugarea unor grupuri noi (1p)

Adăugați în sistem următoarele grupuri: rebellion (din care să facă parte utilizatorii luke și leia), galactic_empire (din care să facă parte utilizatorul darth_vader) și smugglers (din care să facă parte utilizatorii han și chewbacca).

Comanda folosită pentru a crea un grup nou este addgroup, iar aceeași comandă poate fi folosită și pentru a adăuga un utilizator într-un grup.

3. Permisiuni 1 (2p)

Intrați în directorul /home/uso/lab05/star_wars_episode_iv_a_new_hope/millenium_falcon. În acest director vor trebui să lucreze atât utilizatorul han cât și chewbacca. Setați permisiunile necesare astfel încât doar ei doi să poată modifica conținutul directorului, iar restul utilizatorilor să îl poată doar vizualiza.

Nu uitați că puteți folosi TAB pentru a lasă terminalul să completeze nume de fișiere, directoare, utilizatori, grupuri, comenzi și nu numai, în cazul în care acestea sunt cam lungi.

4. Permisiuni 2 (2p)

Intrați în directorul /home/student/uso/lab05/star_wars_episode_iv_a_new_hope/death_star/. În acest director se află fișierul crucial_weakness care trebuie protejat. Setați permisiunile necesare fișierului astfel încât utilizatorii care nu se află în grupul galactic_empire să nu aibă nicio permisiune asupra lui.

Intrați în directorul ~/uso/lab05/star_wars_episode_iv_a_new_hope/millenium_falcon. Creați un link simbolic către fișierul ../tatooine/mos_eisley/cantina. Creați link-ul astfel încât să poată fi mutat în directorul ~/uso/lab05/star_wars_episode_iv_a_new_hope/millenium_falcon/smuggling_compartment și să funcționeze în continuare.

Un link poate fi creat folosind atât căi relative, cât și căi absolute.

6. Montarea sistemelor de fișiere (2p)

În ciuda eforturilor de securizare a datelor din directorul /home/student/uso/lab05/star_wars_episode_iv_a_new_hope/death_star, imaginea /home/uso/lab05/star_wars_episode_iv_a_new_hope/death_star/death_star_plans.iso a rămas accesibilă. Montați imaginea în directorul /home/student/uso/lab05/star_wars_episode_iv_a_new_hope/yavin/plans.

Montați imaginea dupa procedura descrisă în mai sus. Imaginea folosește sistemul de fișiere iso9660, deci pentru montare veți folosi parametrul -t iso9660.

Folosiți sudo în fața comenzii mount pentru montare.

Pentru verificarea montării folosiți comanda mount fără alte argumente.

Demontați imaginea montată folosind umount,

Prefixați comanda de demontare folosind comanda sudo.

7. Drepturi de execuție (1p)

Intrați în directorul /home/student/uso/lab05/star_wars_episode_iv_a_new_hope/yavin. Aici veți găsi fișierul x-wing. Setați permisiunile necesare astfel încât fișierul să poată fi executat doar de către utilizatorul luke. După ce ați făcut aceasta lansați fișierul în execuție.