Pentru început clonați repository-ul de USO:
git clone https://github.com/systems-cs-pub-ro/uso.git
Î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.
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 |
-
), director (d
) sau altceva (rulați info ls
și citiți secțiunea 10.1.2).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.
Pentru a modifica permisiunile unui fișier folosim comanda chmod
. Putem să specificăm noile permisiuni în două moduri:
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
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
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
sudo
.
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 |
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???
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/
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
sudo
.
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.
Adăugați în sistem utilizatorii han
, chewbacca
, luke
, leia
și darth_vader
.
adduser
.
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
).
addgroup
, iar aceeași comandă poate fi folosită și pentru a adăuga un utilizator într-un grup.
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.
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.
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.
Î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
.
-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
,
sudo
.
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.