This is an old revision of the document!


Laborator 07: Administrarea spațiului de stocare

Înainte de laborator

Utilizare terminal

Suport laborator

Obiective

Pe scurt despre Git

Pe parcursul laboratoarelor, pentru descărcarea fișierelor necesare laboratorului, vom folosi Git. Git este un sistem de controlul versiunii și e folosit pentru versionarea codului în proiectele software mari. Celor interesați să aprofundeze conceptele din spatele comenzii git, precum și utilizări avansate, le recomandăm cursul practic online de pe gitimmersion.

Informațiile despre laboratorul de USO se găsesc în acest repository Git.

În laboratorul curent, pe sistemul fizic, aveți deja clonat repository-ul Git în directorul ~/uso.git/. Vom preciza acest lucru pe parcursul laboratorului.

Pentru a pregăti infrastructura de laborator rulați comenzile de mai jos într-un terminal deschis pe sistemul fizic. Deschideți un terminal folosind combinația de taste Ctrl+Alt+t. În listarea de mai jos student@uso:~$ este promptul unde introduceți comenzile, pe acela nu-l tastați. Recomandăm să nu folosiți copy-paste ca să vă acomodați cu linia de comandă:

student@uso:~$ cd uso.git/
student@uso:~/uso.git$ git reset --hard
student@uso:~/uso.git$ git clean -f -d
student@uso:~/uso.git$ git pull origin
student@uso:~/uso.git$ git checkout -b lab-01-fs
student@uso:~/uso.git$ git pull origin lab-01-fs

Dacă la a cincea comandă rulată (git checkout -b lab-01-fs) primiți o eroare de forma fatal: A branch named 'lab-01-fs' already exists., nu vă îngrijorați, nu e nici o problemă.

Cam atât cu pregătirea laboratorului. Acum haideți să ne apucăm de treabă! :-)

Concepte

Pănă în acest moment ați folosit sistemul de operare Linux pentru a realiza diverse operații: ați creat fișiere și directoare, utilizatori și grupuri, ați creat și rulat scripturi, ați realizat diverse operații și procesări, etc. Toate informațiile de care vă folosiți pentru a realiza activități în sistem trebuie să fie stocate undeva, persistent sau temporar. Astfel, stocarea este un element central în operațiile cu sistemul de calcul.

Spațiul de stocare de pe orice sistem trebuie să ofere:

  • eficiență (performanță ridicată)
  • coerență (să nu se piardă/corupă datele)

În Linux, spațiul de stocare (disk-ul) este administrat prin partiționare și sistemul de fișiere.

Pe scurt, spațiul de stocare disponibil este împărțit în unul sau mai multe partiții, iar pentru a putea fi folosită, fiecare partiție trebuie să aibă asociat un sistem de fișiere. Procesul de alocare a unui sistem de fișiere pe o partiție se numește formatare (mount).

Sistemul de fisiere

În Linux, există mai multe tipuri de sisteme de fișiere: ext4, ext3, ext2, ZFS, XFS. Acestea specifică modul în care datele sunt stocate și ulterior accesate de pe disk. Sistemul de fișiere a fost discutat și în cadrul Laboratorului 1.

Partiționarea

Informațiile despre partiții sunt ținute în tabela de partiții (partition table) ce se află în general la începutul disk-ului. O tabelă de partiții conține informații cum ar fi: adresa de unde începe partiția pe disc, ce dimensiune are, tip, etc. Tabela poate să aibă una din următoarele două scheme:

  • Master Boot Record (MBR)
  • GUID Partition Table (GPT)

MBR-ul este mai folosită, insă a început să fie înlocuit de către GPT din cauza limitărilor acestuia, cum ar fi:

  • Dimensiunea maximă a unei partiții este de 2TB
  • Necesitatea unei partiții extinse pentru a crea mai mult de patru partiții

Tabelele de partiție pot fi create și editate folosind tool-uri de partiționare cum ar fi fdisk.

Tipuri de spații de stocare

După cum știm, datele folosite de un sistem de calcul trebuie să fie stocate undeva și accesate ulterior. Cel mai rapid mediu de stocare a datelor prin operații de scriere/citire sunt cele accesate în mod direct de procesor (memoria RAM, memoria cache). Principalul dezavantaj al acestora este volatilitatea (memoria volatilă nu este persistentă, astfel datele se pierd odată ce sistemul de calcul este repornit sau nu mai este alimentat).

Pentru a preîntâmpina această problemă au fost adăugate dispozitivele de stocare ce oferă perisitența datelor și un spațiu de stocare mult mai mare. În zilele noastre există două tipuri de discuri pe sistemele de calcul:

  • Hard Disk Drive (HDD)
    • tehnologie cunoscută și testată pe parcurul unei perioade îndelungate
    • mai ieftină
    • conține componente mecanice care se pot deteriora în timp
    • scrierea/citirea necesita operații mecanice, ceea ce limitează viteza
  • Solid State Drive (SSD)
    • performanța mai bună
    • fară vibrații și zgomote
    • energetic mai economic

Dispozitivele de stocare au și ele unele dezavantaje:

  • viteza de operare
    • din cauza aceasta, datele trec prin memoria RAM înainte de a ajunge la procesor
  • organizarea datelor
    • nu permit adresare liniară

Demo

Acum că ați aflat cum funcționează spațiul de stocare, trebuie să învățăm și cum să îl folosim.

Device-uri

Pentru a afișa informații despre device-urile existente în sistem putem folosi comanda lsblk sau fdisk -l.

student@uso:~$ lsblk -o KNAME,TYPE,SIZE,MODEL
KNAME  TYPE   SIZE MODEL
loop0  loop    13M 
loop1  loop  87,9M 
[...]
sda    disk    16G VBOX HARDDISK   
sda1   part    16G 
sr0    rom   1024M CD-ROM 

Device-urile se găsesc în directorul /dev/. Dacă afișăm câteva device-uri din /dev/ putem observa ce tip de fișiere sunt.

student@uso:~$ ls -l /dev/sda*
brw-rw---- 1 root disk 8, 0 nov  8 00:25 /dev/sda
brw-rw---- 1 root disk 8, 1 nov  8 00:25 /dev/sda1

Caracterul b vine de la Block file și reprezintă fișiere ce corespund device-urilor de stocare. În exemplul anterior, fișierul /dev/sda corespunde unui dispozitiv de stocare, iar /dev/sda1 reprezintă prima partiție de pe acest dispozitiv.

Fișierele din /dev/ nu corespund neapărat unui dispozitiv fizic, pot exista și dispozitive virtuale.

Partiții

Pentru a obține informații despre partițiile din sistem, folosim comanda parted (comanda necesită drepturi de root).

student@uso:~$ sudo parted -l
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 17,2GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  17,2GB  17,2GB  primary  ext4         boot

Câmpul Partition Table ne arată că pe acest sistem se folosește msdos - tabela de partiții MBR (cea mai frecvent utilizată pentru Linux și Windows).

Din output-ul de mai sus, vedem că dispozitivul /dev/sda conține o partiție cu index-ul 1, ce este formatată cu sistemul de fișiere ext4. Fișierul din /dev/ corespunzător partiției este /dev/sda1.

Verificare dispozitive de stocare

Pentru a obține informații detaliate despre dispozitivele de stocare putem folosi comanda fdisk. Această comandă oferă informații precum: dimensiunea unui sector, numărul total de sectoare, numărul de sectoare libere, tipul tabelei de partiții existentă pe dispozitiv.

student@uso:~$ sudo fdisk -l
[...]
Disk /dev/sda: 16 GiB, 17179869184 bytes, 33554432 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
Disklabel type: dos
Disk identifier: 0xdf4f561b

Device     Boot Start      End  Sectors Size Id Type
/dev/sda1  *     2048 33552383 33550336  16G 83 Linux
[...]

Dacă dorim să afișăm informații doar despre un anumit device, îl putem specifica ca parametru:

student@uso:~$ sudo fdisk -l /dev/sda1
Disk /dev/sda1: 16 GiB, 17177772032 bytes, 33550336 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

Comanda fdisk va merge în cazul majorității sistemelor, iar în cazul nostru va merge pentru calculatoarele din sala EG106. Se poate totuși să aveți partiții ce folosesc GPT, cum este cazul stațiilor din sala EG306. În acest caz trebuie să folosiți comanda gdisk.

student@uso-eg306:~$ sudo fdisk -l /dev/sda

WARNING: GPT (GUID Partition Table) detected on '/dev/sda'! The util fdisk doesn't support GPT. Use GNU Parted.


Disk /dev/sda: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders, total 976773168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0xc90ab212

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1   976773167   488386583+  ee  GPT
Partition 1 does not start on physical sector boundary.
student@uso-eg306:~$ sudo gdisk -l /dev/sda
GPT fdisk (gdisk) version 0.8.8

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.
Disk /dev/sda: 976773168 sectors, 465.8 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): ED4BC435-E352-403E-898B-09B7A9BA2F2E
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 976773134
Partitions will be aligned on 2048-sector boundaries
Total free space is 139800557 sectors (66.7 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048       400001023   190.7 GiB   8300  
   2       400001024       800002047   190.7 GiB   8300  
   3       800002048       816003071   7.6 GiB     8200  
   4       816003072       836974591   10.0 GiB    8300  Linux filesystem

Cel mai ușor mod de a verifica spațiul de stocare total și liber de pe un dispozitiv sau o partiție este folosind 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        16G  7,4G  7,6G  50% /

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.git/labs$ du -h 03-user/
48K	03-user/wiki
8,0K	03-user/support/nice-to-know/executable
4,0K	03-user/support/nice-to-know/music/ac_dc
8,0K	03-user/support/nice-to-know/music
32K	03-user/support/nice-to-know
36K	03-user/support
88K	03-user/

student@uso:~/uso.git/labs$ du -hs 03-user/
88K	03-user/

Sisteme de fișiere

Pentru a vedea cu ce sisteme de fișiere sunt formatate dispozitivele de stocare din sistem folosim comanda mount.

student@uso:~$ mount
[...]
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
udev on /dev type devtmpfs (rw,nosuid,relatime,size=990392k,nr_inodes=247598,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=204132k,mode=755)
/dev/sda1 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)
[...]

Comanda mount afișează doar sistemele de fișiere care sunt montate. Pentru a afla sistemul de fișiere cu care este formatat un dispozitiv, putem folosi următoarea comandă:

student@uso:~$ sudo blkid /dev/sda1
/dev/sda1: UUID="a14d0991-a3d8-48d6-ac8c-327d1a524501" TYPE="ext4" PARTUUID="df4f561b-01"

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:~$ mount
[...]
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=204132k,mode=755)
/dev/sda1 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
[...]

Comanda returnează, pe fiecare linie, fișierul de tip bloc asociat dispozitivului de stocare, punctul din ierarhia de fișiere unde este montat, tipul sistemului de fișiere și flag-urile cu care a fost montat. Să luăm ca exemplu linia /dev/sda1 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered): /dev/sda1 este fișierul corespunzător dispozitivului de stocare, / este punctul în care este montat (chiar în rădăcina sistemului de fișiere), ext4 este tipul sistemului de fișiere și (rw,relatime,errors=remount-ro,data=ordered) sunt flag-urile cu care a fost montat (read-write, iar în caz de eroare va fi remontat read-only).

Pentru a se putea monta un sistem de fișiere trebuie să specificăm tipul acestuia, dispozitivul de stocare ce îl conține și directorul în care să fie montat.

student@uso:~$ mkdir my-mnt
student@uso:~$ ls my-mnt
student@uso:~$ sudo mkfs.ext4 /dev/sda2
student@uso:~$ sudo mount -t ext4 /dev/sda2 my-mnt
student@uso:~$ ls my-mnt
lost+found

Dacă partiția /dev/sda2 nu există pe sistem, aceasta trebuie creată folosind comanda sudo fdisk /dev/sda.

Partiția /dev/sda2 nu conținea niciun sistem de fișiere. Folosind comanda sudo mkfs.ext4 /dev/sda2 am creat un sistem de fișiere de tip ext4 pe partiția /dev/sda2 (sau am formatat partiția).

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 sau fișierul bloc.

student@uso:~$ sudo umount my-mnt
student@uso:~$ ls my-mnt

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.

Recapitulare

Basic

Afișare informații despre partiții

1. Să se afișeze la consolă numărul de partiții de pe sistem, numele partițiilor și dimensiunea acestora.

2. Să se creeze un script care să afișeze informațiile de la punctul 1.

3. Modificați scriptul anterior astfel încât la primirea parametrului fs_types să afișeze și sistemul de fișiere cu care sunt formatate partițiile. Dacă parametrul fs_type nu este specificat, se vor afișa doar informațiile de la punctul 1.

Montarea sistemului propriu de fișiere

1. Avem nevoie de un sistem de fișiere propriu pe care să ținem temele de la USO. Vrem să ne alegem singuri dimensiunea și tipul său, dar și locul unde aceasta să fie montată.

Folosiți comenzile necesare pentru a crea un fișier cu dimensiunea de 100MB, plin cu zero-uri (octeți de zero). Apoi avem nevoie să facem un sistem de fișiere de tipul ext3 peste acest fișier nou.

Pentru a crea un fișier cu dimensiunea de 100MB folosiți comanda dd și folosind ca input file intrarea specială /dev/zero. Adică ceva de genul

dd if=/dev/zero ...

Exemple de folosire a comenzii dd pentru a genera fișiere de dimensiune dată găsiți la adresa http://matrafox.info/create-a-1g-100mb-10mb-file-for-testing-transfer-speed.html

Un fișier poate fi formatat exact ca și cum ar fi o partiție. Pentru aceasta folosiți comanda mkfs.ext3 urmată de calea către fișier. Adică ceva de genul

sudo mkfs.ext3 /path/fo/file/to/be/formatted

Să se monteze noul sistem de fisiere în /mnt/myfs.

Pentru verificare folosiți comanda df -hT. Să descifrăm parametrii:

  • df afișează partițiile montate în acel moment de timp
  • -h e folosit pentru human-readable size a partițiilor
  • -T e folosit pentru a afișa încă o coloană cu tipul sistemului de fișiere (e.g. ext3, ext4, nfs etc.)

O altă comandă de verificare este mount fără nici un alt parametru. Încercați să descifrați output-ul ei (sau căutați pe google :-P)

Need to Know

Nice to know

Get a Life

uso/laboratoare/new/07-storage.1541946997.txt.gz · Last modified: 2018/11/11 16:36 by elena.stoican
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