This shows you the differences between two versions of the page.
so:laboratoare:laborator-12 [2020/04/18 11:09] dragos_florin.costea [dirname și basename] |
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 230: | Line 242: | ||
===== 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''. |
+ | |||
+ | 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> | <code c> | ||
Line 258: | 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 263: | 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 280: | 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 310: | 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 316: | 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 345: | Line 378: | ||
- | |||
- | ===== Soluții ===== | ||
- | |||
- | [[http://elf.cs.pub.ro/so/res/laboratoare/lab12-sol.zip | Soluții exerciții laborator 12]] | ||