User Tools

Site Tools


Sidebar

school:uso:lab-05

This is an old revision of the document!


= 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:

  • utilizator (owner): utilizatorul care este deținătorul fișierului/directorului
  • grup (group): un grup de utilizatori care sunt deținătorii fișierului/directorului
  • ceilalți (others): utilizatorii care nu intră în niciuna dintre categoriile dinainte

Pentru fiecare dintre cele trei categorii există trei permisiuni:

  • de citire: utilizatorul poate citi conținutul fișierului respectiv poate lista conținutul directorului (dacă are și drept de execuție)
  • de scriere: utilizatorul poate modifica conținutul fișierului/directorului
  • de execuție: utilizatorul poate lansa fișierul în execuție respectiv poate parcurge directorul

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
  • Tipul intrării indică dacă intrarea respectivă este un fișier normal (-), director (d) sau altceva (rulați info ls și citiți secțiunea 10.1.2).
  • Permisiunile indică ce drepturi au anumiți utilizatori asupra fișierului. Sunt împărțite în trei grupuri, primul (rw-) corespunde deținătorului (owner), al doilea (rw-) corespunde grupului (group) și ultimul (r–) corespunde tuturor celorlalți utilizatori (others). Primul bit din fiecare grup reprezintă dreptul de citire, al doilea reprezintă dreptul de scriere iar al treilea dreptul de execuție. Valoarea 0 (-) pe una dintre poziții indică lipsa dreptului respectiv, pe când valoarea 1 (r, w sau x) indică prezența dreptului.
  • Numărul de hardlink-uri indică câte hardlink-uri există către acest fișier.
  • Deținătorul fișierului este, în general, utilizatorul care a creat fișierul, dar poate fi modificat.
  • Grupul fișierului este, în general, grupul utilizatorului care a creat fișierul, dar poate fi modificat.

Modificarea permisiunilor

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

  • mod literal: specificăm căror utilizatori vrem să le modificăm permisiunile (u pentru deținător, g pentru grup, o pentru ceilalți și a pentru toți utilizatorii), specificăm dacă să adăugăm (+), să retragem (-) sau să setăm exact (=) un set de permisiuni și permisiunile ce trebuie modificate (r pentru citire, w pentru scriere sau x pentru execuție).
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
  • mod octal: specificăm permisiunile pentru deținător, grup și ceilalți printr-o cifră în baza 8. Bitul 0 reprezintă dreptul de execuție (x), bitul 1 reprezintă dreptul de scriere (w) și bitul 2 reprezintă dreptul de citire (r). Prezența unei permisiuni este marcată prin valoarea 1 a bit-ului respectiv iar absența prin valoarea 0 a bit-ului respectiv.
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:

  • link-uri simbolice (soft links): se comportă precum un shortcut din Windows; pointează către un alt fișier/director
  • link-uri hard (hard links): nu au echivalent în Windows; simplu spus, sunt două fișiere ce împart aceleași date, însă descrierea completă și implementarea lor o veți învăța la cursul de Sisteme de Operare

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 ~/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.

school/uso/lab-05.1415115509.txt.gz · Last modified: 2014/11/04 17:38 by razvan