Tema 3 - Software RAID

  • Termen de predare: Duminică, 3 Mai 2020, ora 23:00

Scopul temei

Implementarea unui modul de Software RAID ce folosește un dipozitiv logic de tip bloc ce va citi și scrie date de pe două dispozitive fizice, asigurând consistența și sincronizarea datelor de pe cele două dispozitive fizice. Tipul de RAID implementat va fi asemănător unui RAID1.

Obiective didactice

  • Înțelegerea aprofundată a modului de funcționare a subsistemului de I/O.
  • Obținerea de deprinderi avansate de lucru cu structuri bio.
  • Acomodarea cu modul de lucru cu dispozitivele de tip bloc/disc în nucleu.
  • Dobândirea de abilități de parcurgere și înțelegere a codului și API-ului dedicat subsistemului de I/O în Linux.

Enunț

Să se scrie un modul de kernel care să implementeze funcționalitatea de software RAID. Software RAID oferă o abstractizare între dispozitivul logic și dispozitivele fizice. Implementarea va utiliza schema RAID1.

Mașina virtuală dispune de două hard disk-uri care vor reprezenta dispozitivele fizice: /dev/vdb și /dev/vdc. Sistemul de operare va oferi un dispozitiv logic (de tip bloc) care va interfața accesul din user space. Cererile de scriere în dispozitivul logic vor rezulta în două scrieri, câte una pentru fiecare hard disk. Hard disk-urile nu sunt partiționate. Se va considera că fiecare hard disk are o singură partiție ce acoperă întregul disk.

Fiecare partiție va stoca un sector împreună cu o sumă de control asociată (CRC32) pentru a asigura recuperarea din eroare. La fiecare citire se citesc informațiile aferente de pe ambele partiții. Dacă un sector al primei partiții deține date corupte (valoarea CRC este greșită) atunci se va citi sectorul de pe cea de-a doua partiție; în acelasi timp se va corecta sectorul primei partiții. Similar în cazul unei citiri a unui sector corupt de pe a doua partiție. În cazul în care un sector are valori CRC greșite pe ambele partiții, se va returna un cod de eroare corespunzător.

Precizări

Pentru asigurarea recuperării din eroare se asociază fiecărui sector un cod CRC. Codurile CRC sunt stocate după LOGICAL_DISK_SIZE octeți ai partiției (macro definit în header-ul de suport al temei). Structura pe disc va avea următoarea formă:

+-----------+-----------+-----------+     +---+---+---+
|  sector1  |  sector2  |  sector3  |.....|C1 |C2 |C3 |.....  
+-----------+-----------+-----------+     +---+---+---+

unde C1, C2, C3 sunt valorile CRC pentru sectoarele sector1, sector2, sector3. Zona CRC-urilor se regăsește imediat după LOGICAL_DISK_SIZE octeți ai partiției.

Ca seed pentru CRC folosiți 0 (zero).

Detalii de implementare

  • modulul de kernel va avea numele ssr.ko
  • dispozitivul logic va fi accesat ca un dispozitiv de tip bloc cu majorul SSR_MAJOR și minorul SSR_FIRST_MINOR sub numele /dev/ssr (prin macro-ul LOGICAL_DISK_NAME)
  • dispozitivul virtual (LOGICAL_DISK_NAME - /dev/ssr) va avea capacitatea de LOGICAL_DISK_SECTORS (folosiți set_capacity pe structura struct gendisk)
  • cele două discuri sunt reprezentate de dispozitivele /dev/vdb, respectiv /dev/vdc, definite prin intermediul macro-urilor PHYSICAL_DISK1_NAME, respectiv PHYSICAL_DISK2_NAME
  • pentru lucrul cu structura struct block_device asociată unui dispozitiv fizic, puteți utiliza funcțiile blkdev_get_by_path și blkdev_put
  • pentru tratarea cererilor din user space, recomandăm să nu vă folosiți de o coadă de cereri, ci să faceți prelucrare la nivel de structuri struct bio; puteți înregistra o rutină corespunzătoare folosind apelul blk_queue_make_request
  • rutina de tipul make_request_fn poate fi apelată în paralel
  • întrucât sectoarele de date sunt separate de sectoarele de CRC-uri va trebui să construiți structuri bio separate pentru date și pentru valorile CRC
  • pentru alocarea unui bio pentru discurile fizice puteți folosi bio_alloc; pentru adăugarea de pagini de date în bio folosiți alloc_page și bio_add_page
  • pentru eliberarea spațiului alocat de un bio este nevoie să eliberați paginile alocate bio-ului (folosind macro-ul __free_page) și să apelați bio_put
  • când generați o structură bio, luați în considerare că aceasta trebuie să aibă dimensiunea multiplu de dimensiunea sectorului de disc (KERNEL_SECTOR_SIZE)
  • pentru a transmite o cerere către un dispozitiv de tip bloc și a aștepta încheierea acesteia, puteți utiliza funcția submit_bio_wait
  • folosiți bio_endio pentru a semnala terminarea prelucrării unei structuri bio
  • pentru calculul CRC32 puteți utiliza macro-ul crc32 pus la dispoziție de kernel
  • macrodefinițiile utile se găsesc în header-ul de suport al temei
  • recomandăm != este obligatoriu (orice rezolvare care respectă cerințele temei este acceptată)

O singură funcție de prelucrare a cererilor pentru dispozitive de tip bloc poate fi activă la un moment dat în cadrul unei stive de apeluri (mai multe detalii aici). Va trebui să submiteți cererile pentru dispozitivele fizice dintr-un kernel thread; recomandăm folosirea workqueues.

Pentru o rulare rapidă a temei, folosiți un singur bio pentru a trimite în batch cererea de citire/scriere a valorilor CRC pentru sectoare adiacente. De exemplu, dacă trebuie să trimiteți cereri pentru CRC-urile sectoarelor 0, 1, …, 7, folosiți un singur bio, nu 8 bio-uri.

Testare

Pentru simplificarea procesului de corectare a temelor, dar și pentru a reduce greșelile temelor trimise, corectarea temelor se va face automat cu ajutorul testelor publice care se găsesc în noua infrastructură. Pentru testarea locală folosiți următoarele comezi:

$ git clone https://github.com/linux-kernel-labs/linux.git
$ cd linux/tools/labs
$ LABS=assignments/3-raid make skels 
# dezvoltarea temei se va efectua în directorul 3-raid/
$ make build
$ make copy
$ make boot

Dacă, în urma procesului de testare, sectoarele de pe ambele discuri conțin date nevalide, rezultând în erori de citire ce fac imposibilă funcționarea modulului, va trebui să refaceți cele două discuri în cadrul mașinii virtuale folosind comenzile:

dd if=/dev/zero of=/dev/vdb bs=1M
dd if=/dev/zero of=/dev/vdc bs=1M

De asemenea, puteți obține același rezultat folosind următoarea comandă pentru pornirea mașinii virtuale:

rm disk{1,2}.img; make

în cazul în care corupeți /dev/vda corespunzător yocto, va trebui să ștergeți imaginea de pe local core-image-minimal-qemux86.ext4 pentru ca scriptul qemu să o refacă.

Sfaturi

Pentru a vă mări șansele de a obține nota maximă, citiți și respectați coding style-ul kernelului Linux descris din documentul Coding Style.

De asemenea, folosiți următoarele tool-uri de analiza statică pentru a verifica codul:

checkpatch.pl

  •  /path/to/linux-4.9.11/scripts/checkpatch.pl --no-tree --terse -f /path/to/your/src-file.c 

sparse

  •  sudo apt-get install sparse 
  •  cd /path/to/linux-4.9.11 
     make C=2 /path/to/your/src-file.c 

cppcheck

  •  sudo apt-get install cppcheck 
  •  cppcheck /path/to/your/src-file.c 

Depunctări

Depunctările generale pentru teme se găsesc pe pagina de Indicații generale.

În cazuri excepționale (tema trece testele prin nerespectarea cerințelor) și în cazul în care tema nu trece toate testele se poate scădea mai mult decât este menționat mai sus.

Submitere

Arhiva temei va fi submisă pe vmchecker, în conformitate cu precizările din pagina de reguli.

Din interfața vmchecker alegeți opțiunea Software RAID, aferentă acestei teme.

Resurse

Resursele temei se găsesc și în repo-ul so2-assignments de pe GitHub. Repo-ul conține și un script Bash care vă ajută să vă creați un repository privat pe instanța de GitLab a facultății. Urmăriți indicațiile din README și de pe pagina de Wiki dedicată pentru git.

Întrebări

Pentru întrebări legate de temă puteți consulta arhivele listei de discuții sau puteți trimite un e-mail (trebuie să fiți înregistrați). Vă rugăm să urmăriți și să respectați indicațiile de utilizare a listei.

so2/teme/tema3.txt · Last modified: 2020/04/12 23:05 by lucian.teodorescu
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