Differences

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

Link to this comparison view

so:laboratoare:laborator-12 [2020/04/18 10:58]
dragos_florin.costea [Schimbarea directorului curent]
so:laboratoare:laborator-12 [2022/05/29 20:59] (current)
maria.mihailescu [Înainte de laborator: Feedback] Fix date
Line 1: Line 1:
 ====== Laborator 12 - Implementarea sistemelor de fișiere ====== ====== Laborator 12 - Implementarea sistemelor de fișiere ======
  
-===== Materiale Ajutătoare ===== 
- 
-  * [[http://​elf.cs.pub.ro/​so/​res/​laboratoare/​lab12-slides.pdf | lab12-slides.pdf]] 
  
 ===== Nice to read =====  ===== Nice to read ===== 
Line 30: Line 27:
   * [[#​dirname_si_basename|dirname și basename]]   * [[#​dirname_si_basename|dirname și basename]]
  
 +===== Înainte de laborator: Feedback =====
 +
 +Pentru a îmbunătăți cursul de SO, componentele sale și modul de desfășurare,​ ne sunt foarte utile opiniile voastre. Pentru aceasta, vă rugăm să accesați și completați formularul de feedback de pe site-ul [[https://​curs.upb.ro|curs.upb.ro]]. Trebuie să fiți autentificați și înrolați în cadrul cursului.
 +
 +Formularul este anonim și este activ în perioada 23 mai 2022 - 3 iunie 2022. Rezultatele vor fi vizibile în cadrul echipei cursului doar după încheierea sesiunii. Este accesibil la link-ul "​Formular feedback"​ a paginii principale a cursului de SO al seriei voastre pe [[https://​curs.upb.ro|curs.upb.ro]]. **Nu** este în meta-cursul disponibil tuturor seriilor.
 +
 +Vă invităm să evaluați activitatea echipei de SO și să precizați punctele tari și punctele slabe și sugestiile voastre de îmbunătățire a disciplinei. Feedback-ul vostru ne ajută să creștem calitatea materiei în anii următori și să îmbunătățim disciplinele pe care le veți face în continuare.
 +
 +Vom publica la începutul semestrului viitor analiza feedback-ului vostru.
 +
 +Ne interesează în special:
 +
 +  * Ce nu v-a plăcut și ce credeți că nu a mers bine?
 +  * De ce nu v-a plăcut și de ce credeți că nu a mers bine?
 +  * Ce ar trebuie să facem ca lucrurile să fie plăcute și să meargă bine?
  
 ===== Device Nodes ===== ===== Device Nodes =====
Line 137: Line 149:
   * conținutul este diferit: un director conține un vector de nume de fișiere și inode-uri.   * conținutul este diferit: un director conține un vector de nume de fișiere și inode-uri.
  
-===== Link-uri simbolice (soft) =====+===== Link-uri simbolice (soft links) =====
  
 Un //link simbolic// (sau soft link), este un tip special de fișier al cărui conținut reprezintă numele altui fișier. Link-urile simbolice sunt create cu comanda ''​ln -s''​ sau cu apelul [[http://​linux.die.net/​man/​2/​symlink | symlink(2)]] Un //link simbolic// (sau soft link), este un tip special de fișier al cărui conținut reprezintă numele altui fișier. Link-urile simbolice sunt create cu comanda ''​ln -s''​ sau cu apelul [[http://​linux.die.net/​man/​2/​symlink | symlink(2)]]
Line 223: Line 235:
  
 Fiecare proces are un director rădăcină reprezentând punctul de unde căile absolute sunt interpretate. În mod implicit, acesta este directorul rădăcina real al sistemului de fișiere. Un proces nou moștenește directorul rădăcină de la părintele său. Există situații (e.g pentru a ascunde o parte din sistemul de fișiere) în care este util pentru un proces să-și schimbe directorul rădăcină. Acest lucru se realizează folosind apelul [[http://​linux.die.net/​man/​2/​chroot | chroot(2)]] Fiecare proces are un director rădăcină reprezentând punctul de unde căile absolute sunt interpretate. În mod implicit, acesta este directorul rădăcina real al sistemului de fișiere. Un proces nou moștenește directorul rădăcină de la părintele său. Există situații (e.g pentru a ascunde o parte din sistemul de fișiere) în care este util pentru un proces să-și schimbe directorul rădăcină. Acest lucru se realizează folosind apelul [[http://​linux.die.net/​man/​2/​chroot | chroot(2)]]
-<code c> int chroot(const char *path); </​code>​+<code c> 
 +int chroot(const char *path); 
 +</​code>​
  
  
 ===== Rezolvarea unei căi ===== ===== Rezolvarea unei căi =====
  
-Apelul [[http://​man7.org/​linux/​man-pages/​man3/​realpath.3.html | realpath(3)]] dereferențiază link-ul simbolic primit ca argument și rezolvă toate referințele către ​'/​.'​și '/​..'​ pentru a produce un șir de caractere conținând calea absolută.+Apelul [[http://​man7.org/​linux/​man-pages/​man3/​realpath.3.html | realpath(3)]] dereferențiază link-ul simbolic primit ca argument ​în ''​path''​ **și** elimină subşirurile ''/./'', ​''/​../''​ precum şi apariţii în plus ale caracterului ''/'​' pentru a genera o cale absolută ​plasată în parametrul de ieşire ''​realpath''​.
  
-<code c>  char *realpath(const char *path, char *resolved_path);​ </​code>​+Exemplu: Dacă parametrul de intrare ''​path''​ ar fi ''/​home/​madalina/​%%/​%%/​%%/​%%/​so/​tema4/​../​../​seriale/​thewire/''​ , în urma apelului ''​realpath(path,​ resolved_path)'',​ parametrul de ieşire ''​resolved_path''​ devine ''/​home/​madalina/​seriale/​thewire/''​. Presupunem că ierarhia de directoare prezentată în exemplu există deja. 
 + 
 +<code c>  
 +char *realpath(const char *path, char *resolved_path);​ 
 +</​code>​
  
 ===== dirname și basename ===== ===== dirname și basename =====
Line 238: Line 256:
 <code c> <code c>
 char *dirname(char *path); char *dirname(char *path);
- 
 char *basename(char *path); char *basename(char *path);
 </​code>​ </​code>​
Line 255: Line 272:
  
 ====== Exerciții ====== ====== Exerciții ======
 +
 +<note important>​
 +În cadrul laboratoarelor vom folosi repository-ul de git al materiei SO - https://​github.com/​systems-cs-pub-ro/​so. Va trebui sa clonați repository-ul pe masinile virtuale folosind comanda: ''​git clone https://​github.com/​systems-cs-pub-ro/​so''​. Dacă doriți să descărcați repositoryul în altă locație, folosiți comanda ''​git clone https://​github.com/​systems-cs-pub-ro/​so ${target}''​.
 +
 +Pentru a actualiza repository-ul,​ folosiți comanda ''​git pull origin master''​ din interiorul directorului în care se află repository-ul. Recomandarea este să îl actualizați cât mai frecvent, înainte să începeți lucrul, pentru a vă asigura că aveți versiunea cea mai recentă. În cazul în care gitul detectează conflicte la nivelul vreunui fişier, folosiți următoarele comenzi pentru a vă păstra modificările:​
 +<​code>​
 +git stash
 +git pull origin master
 +git stash pop
 +</​code>​
 +
 +Pentru mai multe informații despre folosirea utilitarului git, urmați ghidul de la https://​gitimmersion.com.
 +</​note>​
  
 ===== Completare feedback ===== ===== Completare feedback =====
Line 260: Line 290:
 Vă invităm să **evaluați activitatea echipei de SO** și să precizați punctele tari și punctele slabe și sugestiile voastre de îmbunătățire a materiei. Feedback-ul vostru este foarte important pentru noi să creștem calitatea materiei în anii următori și să îmbunătățim materiile pe care le veți face în continuare. Vă invităm să **evaluați activitatea echipei de SO** și să precizați punctele tari și punctele slabe și sugestiile voastre de îmbunătățire a materiei. Feedback-ul vostru este foarte important pentru noi să creștem calitatea materiei în anii următori și să îmbunătățim materiile pe care le veți face în continuare.
  
-<note tip>​Găsiți **formularul de feedback** în partea dreaptă a paginii principale de SO de pe [[https://acs.curs.pub.ro|acs.cs.pub.ro]] într-un frame numit //"​FEEDBACK"//​. Trebuie să fiți înrolați la cursul de SO și să intrati pe pagina asociată seriei voastre (nu pe metaserie), altfel veți primi o eroare de acces.+<note tip>​Găsiți **formularul de feedback** în partea dreaptă a paginii principale de SO de pe [[https://​curs.upb.ro|curs.upb.ro]] într-un frame numit //"​FEEDBACK"//​. Trebuie să fiți înrolați la cursul de SO și să intrati pe pagina asociată seriei voastre ​**(nu pe metaserie)**, altfel veți primi o eroare de acces.
 </​note>​ </​note>​
 Vă mulțumim! Vă mulțumim!
-===== Exercițiul 0 - Joc interactiv ===== 
- 
-  * Detalii desfășurare [[http://​ocw.cs.pub.ro/​courses/​so/​meta/​notare#​joc_interactiv|joc]]. 
  
 ===== Linux ===== ===== Linux =====
  
-<note important>​Pentru rezolvarea laboratorului descărcați arhiva de [[http://​elf.cs.pub.ro/​so/​res/​laboratoare/​lab12-tasks.zip | lab12-tasks.zip]]. ​Codul va fi scris în fișierul ''​mini.c''​ din directorul ''​1-mini/''​. Pentru fiecare exercițiu decomentați linia TODO corespunzătoare. </​note>​ +<note important>​Codul va fi scris în fișierul ''​mini.c''​ din directorul ''​1-mini/''​. Pentru fiecare exercițiu decomentați linia ''​TODO'' ​corespunzătoare. </​note>​
  
  
Line 277: Line 303:
  
 ==== Exercițiul 2 ==== ==== Exercițiul 2 ====
-Implementați comanda ''​list''​ <​device_node>,​ ce va primi ca argument un device node și va afișa pentru acesta tipul (c/b), identificatorii ''​major'',​ respectiv ''​minor''​. Folosiți funcția [[http://​man7.org/​linux/​man-pages/​man2/​stat.2.html | stat(2)]] pentru a obține o structură de tipul ''​struct stat''​ din care veți extrage tipul device-ului (''​st_mode''​) (hint: [[http://​www.gnu.org/​software/​libc/​manual/​html_node/​Testing-File-Type.html#​Testing-File-Type|S_ISCHR,​ S_ISBLK]]) apoi din câmpul ''​st_rdev''​ extrageți [[http://​man7.org/​linux/​man-pages/​man3/​makedev.3.html | major]] și [[http://​man7.org/​linux/​man-pages/​man3/​makedev.3.html |minor]]. Nu uitați să decomentați linia marcată cu // #define TODO2 //+Implementați comanda ''​list''​ <​device_node>,​ ce va primi ca argument un device node și va afișa pentru acesta tipul (c/b), identificatorii ''​major'',​ respectiv ''​minor''​. Folosiți funcția [[http://​man7.org/​linux/​man-pages/​man2/​stat.2.html | stat(2)]] pentru a obține o structură de tipul ''​struct stat''​ din care veți extrage tipul device-ului (''​st_mode''​) (hint: [[http://​www.gnu.org/​software/​libc/​manual/​html_node/​Testing-File-Type.html#​Testing-File-Type|S_ISCHR,​ S_ISBLK]]) apoi din câmpul ''​st_rdev''​ extrageți [[http://​man7.org/​linux/​man-pages/​man3/​makedev.3.html | major]] și [[http://​man7.org/​linux/​man-pages/​man3/​makedev.3.html |minor]]. Nu uitați să decomentați linia marcată cu '' ​#define TODO2 ''​
  
  
 ==== Exercițiul 3 ==== ==== Exercițiul 3 ====
  
-Creați punctul de montare ''/​mnt/​my''​. Ca root, rulați comanda:<​code bash> +Creați punctul de montare ''/​mnt/​my''​. Ca root, în terminalul bash, rulați comanda: 
-mkdir /mnt/my+<code bash> 
 +mkdir /mnt/my
 </​code>​ </​code>​
  
 Parcurgeți paginile de manual ale funcțiilor [[http://​man7.org/​linux/​man-pages/​man2/​mount.2.html|mount]] și [[http://​man7.org/​linux/​man-pages/​man2/​umount.2.html|umount]]. Parcurgeți paginile de manual ale funcțiilor [[http://​man7.org/​linux/​man-pages/​man2/​mount.2.html|mount]] și [[http://​man7.org/​linux/​man-pages/​man2/​umount.2.html|umount]].
  
-Folosiți comenzile ''​mount''​ și ''​umount''​ din executabilul mini pentru a monta discul ​''​/dev/sda1''​ în punctul de montare ''/​mnt/​my''​. Citiți secțiunea marcată cu TODO din fișierul ''​mini.c''​. Pentru argumentul 4 și argumentul 5 al funcției ''​mount''​ folosiți, respectiv, valorile ''​0''​ și ''​NULL''​.+Folosiți comenzile ''​mount''​ și ''​umount''​ din executabilul mini pentru a monta fişierul ​''​my_fs''​ în punctul de montare ''/​mnt/​my''​. Citiți secțiunea marcată cu ''​TODO'' ​din fișierul ''​mini.c''​. Pentru argumentul 4 și argumentul 5 al funcției ''​mount''​ folosiți, respectiv, valorile ''​0''​ și ''​NULL''​.
  
-Testare: Rulați, ca root, comanda:<​code bash>+Testare: Rulați, ​**ca root**, comanda: 
 +<code bash>
 ./mini ./mini
-</​code>​și apoi rulați comanda de montare în cadrul acestui shell:<​code bash> 
-mount /dev/sda1 /mnt/my ext3 
 </​code>​ </​code>​
-Într-o altă consolă, într-un shell obișnuit, verificați rezultatele folosind comanda<​code bash>+ 
 +și apoi rulați comanda de montare în cadrul acestui shell: 
 + 
 +<code bash> 
 +mount /​dev/​mapper/​vgvagrant-root /mnt/my ext4 
 +</​code>​ 
 + 
 +În cazul în care nu lucraţi în maşina virtuală de SO, folosiţi ''/​dev/​sda1''​ în loc de ''/​dev/​mapper/​vgvagrant-root''​. 
 + 
 +Într-o altă consolă, într-un shell obișnuit, verificați rezultatele folosind comanda
 +<code bash>
 cat /​proc/​mounts cat /​proc/​mounts
 </​code>​ </​code>​
Line 307: Line 343:
  
 Pentru testare folosiți, în shell-ul aferent comenzii ''​./​mini'',​ comanda:<​code bash> Pentru testare folosiți, în shell-ul aferent comenzii ''​./​mini'',​ comanda:<​code bash>
-symlink /etc/passwd ​local-passwd+symlink /proc/filesystems ​local-filesystems
 </​code>​ </​code>​
 Ca să verificați,​ într-o altă consolă, în același director cu cel în care ați rulat comanda ''​./​mini'',​ folosiți<​code bash> Ca să verificați,​ într-o altă consolă, în același director cu cel în care ați rulat comanda ''​./​mini'',​ folosiți<​code bash>
Line 313: Line 349:
 </​code>​ </​code>​
 Pentru a șterge symlink-ul folosiți comanda<​code bash> Pentru a șterge symlink-ul folosiți comanda<​code bash>
-unlink local-passwd+unlink local-filesystems
 </​code>​ </​code>​
 Pentru validare rulați din nou comanda<​code bash> Pentru validare rulați din nou comanda<​code bash>
Line 342: Line 378:
  
  
- 
-===== Soluții ===== 
- 
- ​[[http://​elf.cs.pub.ro/​so/​res/​laboratoare/​lab12-sol.zip | Soluții exerciții laborator 12]] 
  
  
so/laboratoare/laborator-12.1587196702.txt.gz · Last modified: 2020/04/18 10:58 by dragos_florin.costea
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0