Clasele 11-12 lecția 28 - 6 mai 2015
GNU/Linux, partea a doua
Partiții
Partiție sunt containere logice pe un sistem de stocare real (cum ar fi un disc). Pentru a putea folosi un disc, trebuie să-l partiționăm. Poate exista o singură partiție cât tot discul, sau mai multe partiții. Se poate chiar și ca o parte din disc să nu fie alocată niciunei partiții (și deci să fie inaccesibilă prin sistemul de fișiere).
Comanda fdisk are o interfață text pentru editarea partițiilor. Există interfețe mai deștepte, de exemplu gparted, dar fdisk este simplu.
$ sudo fdisk -l /dev/sda
Disk /dev/sda: 90.0 GB, 90028302336 bytes
255 heads, 63 sectors/track, 10945 cylinders, total 175836528 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: 0x000d12bb
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 92491775 46244864 83 Linux
/dev/sda2 92491776 167448575 37478400 83 Linux
/dev/sda3 167448576 175835135 4193280 82 Linux swap / Solaris
Odată create partițiile, putem crea sistemul de fișiere cu buchetul de comenzi mkfs.*. Din nou, gparted oferă o interfață grafică.
Tipul de partiție swap înseamnă că acea zonă de disc este dedicată memoriei virtuale. Pe ea nu va exista niciodată un sistem de fișiere (spre deosebire de alte sisteme de operare, unde memoria virtuală stă în fișiere care fac parte din partiția principală).
La ce sunt bune partițiile? De ce să nu facem o singură partiție pentru /? Iată câteva considerente pro și contra.
- Directorul /home merită o partiție separată. Dacă peste câțiva ani vreau să reinstalez sistemul, pot să reinstalez cealaltă partiție, dar să păstrez intact directorul /home. Aceasta include toate bookmark-urile, configurările pentru aplicații, fișiere personale (poze etc.).
- Partiții mai mici înseamnă că fsck va rula mai repede pentru fiecare din ele.
- Dacă una dintre partiții devine coruptă și este pierdută iremediabil, celelalte rămân intacte.
- Putem avea sisteme diferite de fișiere pe diverse partiții: unul criptat pentru /home, FAT32 pentru o partiție care trebuie să fie disponibilă și sub Windows etc.
- Pe de altă parte, mai multe partiții înseamnă riscuri mai mari ca una dintre ele să se umple. Deci trebuie să ne estimăm mai bine nevoile.
Utilitare pentru partiții: df, mount, umount, /etc/fstab
Montarea este procesul prin care kernelul decodează structura fișierelor de pe o partiție a unui disc și face acea structură disponibilă undeva într-un subdirector al sistemului de fișiere existent.
Cu comanda df putem vedea partițiile montate și informații despre ele. Cu df -h putem vedea rezultatele într-un format mai prietenos (h = human-readable).
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 44G 15G 27G 37% /
none 4.0K 0 4.0K 0% /sys/fs/cgroup
udev 1.9G 4.0K 1.9G 1% /dev
tmpfs 388M 1.1M 387M 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 1.9G 652K 1.9G 1% /run/shm
none 100M 20K 100M 1% /run/user
/dev/sda2 36G 29G 5.2G 85% /media/other
Comenzile mount și umount, rulate ca root, ne permit să montăm și să demontăm partiții. Acest caz intervine (cam des, din păcate) atunci când, dintr-un motiv sau altul, sistemul nu montează automat un stick de date, un hard disc extern, etc.
În /etc/fstab puteți citi și/sau modifica informațiile implicite de mount, de obicei stabilite la instalare.
Puțin despre sistemul de fișiere
- ext2fs, inoduri, ext3fs (journaling)...
- pot fi montate și la distanță (NFS)
- pot fi criptate în mod transparent
Servicii
Serviciile sunt programe care stau rezidente în memorie, de obicei pe toată durata funcționării calculatorului și așteaptă să fie folosite. Exemple:
- serviciul de ssh, prin care ne putem lega din afară pe un calculator
- serviciul de ftp, prin care putem transfere fișiere (atenție, implicit el este insecure)
- serviciul de mail, prin care putem primi și trimite e-mailuri
- serviciul de SpamAssassin, prin care putem filtra e-mailurile sus-menționate
- serviciul de web, prin care putem răspunde la URL-uri pe portul 80 (Apache, Nginx etc.)
- serviciul de MySQL, prin care putem utiliza bazele de date MySQL
- serviciul de NFS, prin care putem exporta anumite directoare de pe discul nostru pentru ca și un calculator extern să le poată monta.
- serviciul NTP, prin care calculatorul își poate sincroniza ceasul prin rețea (întrebare: cum face asta când latența este variabilă)?
etc., etc., etc.
Serviciile disponibile sunt listate în /etc/init.d. Puteți citi acele fișiere, sunt scripturi. Pentru a porni / opri / reporni un serviciu, executăm:
$ sudo /etc/init.d/apache2 restart
sau, în unele distribuții,
$ sudo service apache2 restart
Diverse servicii acceptă diverse comenzi. Dacă folosiți un interpretor de comenzi deștept, puteți tasta TAB-TAB după numele serviciului pentru a autocompleta comenzile disponibile (ca și la fișiere). În special comanda reload este utilă, dacă este implementată, întrucât îi spune serviciului să-și recitească fișierele de configurare, fără a se opri. Această metodă este mult mai rapidă decât o oprire + repornire, deci downtime-ul serverului va fi mult mai mic.
Semnale
Semnalele sunt un mod de comunicare între procese. Unul dintre aceste procese poate fi kernelul.
- Procesele pot ignora sau pot trata semnalele cu cod special (în afară de SIGKILL și SIGSTOP)
- Standardele sunt bune. Exemplu: logrotate trimite un semnal standard serviciilor ca să le ceară să redeschidă fișierul de log (de ce?)
Un exemplu de captare a unui semnal SIGSEGV în C (kudos Stack Overflow):
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void segfault_sigaction(int signal, siginfo_t *si, void *arg) {
printf("Caught segfault at address %p\n", si->si_addr);
exit(0);
}
int main(void) {
int *foo = (int*)0xdeadbeef;
struct sigaction sa;
memset(&sa, 0, sizeof(sigaction));
sigemptyset(&sa.sa_mask);
sa.sa_sigaction = segfault_sigaction;
sa.sa_flags = SA_SIGINFO;
sigaction(SIGSEGV, &sa, NULL);
/* Cause a seg fault */
*foo = 1;
return 0;
}