Cap. 10. Gestionarea datelor

# Cap. 10. Gestionarea datelor

Sunt descrise instrumente și sfaturi pentru gestionarea datelor binare și textuale în sistemul Debian.

## 10.1. Partajarea, copierea și arhivarea

| Avertisment
Accesul necoordonat la scriere la dispozitive și fișiere accesate activ din mai multe procese nu trebuie efectuat pentru a evita condiția de concurență. Pentru a evita acest lucru, se pot utiliza mecanisme de blocare a fișierelor folosind flock(1).

Securitatea datelor și partajarea controlată a acestora au mai multe aspecte.

- Crearea arhivei de date

- Accesul la stocare de la distanță

- Duplicarea

- Urmărirea istoricului modificărilor

- Facilitarea schimbului de date

- Prevenirea accesului neautorizat la fișiere

- Detectarea modificării neautorizate a fișierelor

Acestea pot fi realizate prin utilizarea unei combinații de instrumente.

- Instrumente de arhivare și comprimare

- Instrumente de copiere și sincronizare

- Sisteme de fișiere în rețea

- Suporturi de stocare amovibile

- Shell-ul securizat

- Sistemul de autentificare

- Instrumente pentru sistemul de control al versiunilor

- Instrumente de criptare criptografică și sume de control

### 10.1.1. Instrumente de arhivare și comprimare

Iată un rezumat al instrumentelor de arhivare și comprimare disponibile în sistemul Debian.

Tabel 10.1. Lista instrumentelor de arhivare și comprimare

pachet | popcon(popularitate) | dimensiune | extensie | comandă | comentariu
--- | --- | --- | --- | --- | ---
`tar` | V:908, I:1000 | 3085 | `.tar` | tar(1) | arhivatorul standard (standardul de facto)
`cpio` | V:352, I:999 | 1201 | `.cpio` | cpio(1) | arhivator în stil Unix System V, se utilizează cu find(1)
`binutils` | V:190, I:640 | 1119 | `.ar` | ar(1) | arhivator pentru crearea de biblioteci statice
`fastjar` | V:1.0, I:9.6 | 182 | `.jar` | fastjar(1) | arhivator pentru Java (precum zip)
`pax` | V:5.5, I:9.6 | 167 | `.pax` | pax(1) | nou arhivator standard POSIX, compromis între `tar` și `cpio`
`gzip` | V:904, I:1000 | 256 | `.gz` | gzip(1), zcat(1), … | instrumentul de comprimare GNU LZ77 (standardul de facto)
`bzip2` | V:163, I:972 | 113 | `.bz2` | bzip2(1), bzcat(1), … | instrumentul de comprimare prin sortare de blocuri Burrows-Wheeler cu un raport de comprimare mai mare decât gzip(1) (mai lent decât `gzip` cu sintaxă similară)
`lzma` | V:1, I:10 | 349 | `.lzma` | lzma(1) | instrument de comprimare LZMA cu o raport de comprimare mai mare decât gzip(1) (depreciat)
`xz-utils` | V:318, I:982 | 1520 | `.xz` | xz(1), xzdec(1), … | instrument de comprimare XZ cu un raport de comprimare mai mare decât bzip2(1) (mai lent decât `gzip`, dar mai rapid decât `bzip2`; înlocuitor pentru instrumentul de comprimare LZMA)
`zstd` | V:318, I:803 | 2309 | `.zstd` | zstd(1), zstdcat(1), … | instrument de comprimare rapidă fără pierderi Zstandard
`p7zip` | V:6, I:198 | 8 | `.7z` | 7zr(1), p7zip(1) | arhivator de fișiere 7-Zip cu raport de comprimare ridicat (comprimare LZMA)
`p7zip-full` | V:20, I:222 | 12 | `.7z` | 7z(1), 7za(1) | arhivator de fișiere 7-Zip cu raport de comprimare ridicat (comprimare LZMA și altele)
`lzop` | V:12, I:134 | 164 | `.lzo` | lzop(1) | instrument de comprimare LZO cu viteză de comprimare și decomprimare mai mare decât gzip(1) (raport de comprimare mai mic decât `gzip` cu sintaxă similară)
`zip` | V:49, I:361 | 627 | `.zip` | zip(1) | InfoZIP: instrument de arhivare și comprimare DOS
`unzip` | V:110, I:749 | 387 | `.zip` | unzip(1) | InfoZIP: instrument pentru dezarhivare și decomprimare DOS

| Avertisment
Nu definiți variabila „`$TAPE`” decât dacă știți la ce să vă așteptați. Aceasta modifică comportamentul tar(1).

- Arhiva tar comprimată cu tar(1) utilizează extensia de fișier „`.tgz`” sau „`.tar.gz`”.

- Arhiva tar(1) comprimată cu xz utilizează extensia de fișier „`.txz`” sau „`.tar.xz`”.

- Metoda populară de comprimare în instrumentele FOSS, cum ar fi tar(1), a evoluat după cum urmează: `gzip` → `bzip2` → `xz`

- cp(1), scp(1) și tar(1) pot avea unele limitări pentru fișiere speciale. cpio(1) este cel mai versatil.

- cpio(1) este conceput pentru a fi utilizat împreună cu find(1) și alte comenzi și este potrivit pentru crearea de scripturi de copiere de rezervă, deoarece partea de selectare a fișierelor din script poate fi testată independent.

- Structura internă a fișierelor de date Libreoffice este „`.jar`”, care poate fi deschisă și cu ajutorul comenzii `unzip`.

- Instrumentul de arhivare multiplatformă de facto este `zip`. Utilizați-l ca «`zip -rX`» pentru a obține compatibilitatea maximă. Utilizați și opțiunea „`-s`”, dacă dimensiunea maximă a fișierului este importantă.

### 10.1.2. Instrumente de copiere și sincronizare

Iată un rezumat al instrumentelor simple de copiere și copie de rezervă disponibile în sistemul Debian.

Tabel 10.2. Lista instrumentelor de copiere și sincronizare

pachet | popcon(popularitate) | dimensiune | instrument | funcție
--- | --- | --- | --- | ---
`coreutils` | V:911, I:1000 | 17994 | GNU cp | copierea locală a fișierelor și directoarelor („-a” pentru recursiv)
`openssh-client` | V:915, I:996 | 4210 | scp | copierea de la distanță a fișierelor și directoarelor (client, „`-r`” pentru recursiv)
`openssh-server` | V:768, I:819 | 3359 | sshd | copierea de la distanță a fișierelor și directoarelor (server la distanță)
`rsync` | V:195, I:541 | 835 |  | sincronizare și copie de rezervă la distanță într-un singur sens
`unison` | V:3, I:12 | 14 |  | sincronizare și copie de rezervă la distanță bidirecțională

Copierea fișierelor cu rsync(8) oferă funcții mai avansate decât alte programe.

- algoritm de transfer delta care trimite numai diferențele dintre fișierele sursă și fișierele existente în destinație

- algoritm de verificare rapidă (implicit) care caută fișiere care au suferit modificări în ceea ce privește dimensiunea sau data ultimei modificări

- opțiunile „`--exclude`” și „`--exclude-from`” similare cu tar(1)

- sintaxa „o bară oblică la sfârșitul directorului sursă” care evită crearea unui nivel suplimentar de director la destinație.

| Indicație
Instrumentele sistemului de control al versiunilor (VCS) din Tabel 10.14, „Lista altor instrumente pentru sistemul de control al versiunilor” pot funcționa ca instrumente de copiere și sincronizare în mai multe direcții.

### 10.1.3. Expresii idiomatice pentru arhivă

Iată câteva modalități de arhivare și dezarhivare a întregului conținut al directorului „`./source`” folosind diferite instrumente.

GNU tar(1):

    $ tar -cvJf archive.tar.xz ./source
    $ tar -xvJf archive.tar.xz

Alternativ, prin următoarele.

    $ find ./source -xdev -print0 | tar -cvJf archive.tar.xz --null -T -

cpio(1):

    $ find ./source -xdev -print0 | cpio -ov --null > archive.cpio; xz archive.cpio
    $ zcat archive.cpio.xz | cpio -i

### 10.1.4. Expresii idiomatice pentru copiere

Iată câteva modalități de a copia întregul conținut al directorului „`./source`” folosind diferite instrumente.

- Copie locală: directorul „`./source`” → directorul „`/dest`”

- Copie la distanță: directorul „`./source`” de pe gazda locală → directorul „`/dest`” de pe gazda „`user@host.dom`”

rsync(8):

    # cd ./source; rsync -aHAXSv . /dest
    # cd ./source; rsync -aHAXSv . user@host.dom:/dest

Alternativ, puteți utiliza sintaxa „o bară oblică la sfârșitul directorului sursă”.

    # rsync -aHAXSv ./source/ /dest
    # rsync -aHAXSv ./source/ user@host.dom:/dest

Alternativ, prin următoarele.

    # cd ./source; find . -print0 | rsync -aHAXSv0 --files-from=- . /dest
    # cd ./source; find . -print0 | rsync -aHAXSv0 --files-from=- . user@host.dom:/dest

GNU cp(1) și openSSH scp(1):

    # cd ./source; cp -a . /dest
    # cd ./source; scp -pr . user@host.dom:/dest

GNU tar(1):

    # (cd ./source && tar cf - . ) | (cd /dest && tar xvfp - )
    # (cd ./source && tar cf - . ) | ssh user@host.dom '(cd /dest && tar xvfp - )'

cpio(1):

    # cd ./source; find . -print0 | cpio -pvdm --null --sparse /dest

Puteți înlocui „`.`” cu „`foo`” pentru toate exemplele care conțin „`.`” pentru a copia fișiere din directorul „`./source/foo`” în directorul „`/dest/foo`”.

Puteți înlocui „`.`” cu ruta absolută „`/ruta/la/source/foo`” pentru toate exemplele care conțin „`.`” pentru a elimina „`cd ./source;`”. Acestea copiază fișierele în locații diferite, în funcție de instrumentele utilizate, după cum urmează.

- "`/dest/foo`": rsync(8), GNU cp(1), și scp(1)

- "`/dest/ruta/la/source/foo`": GNU tar(1), și cpio(1)

| Indicație
rsync(8) și GNU cp(1) au opțiunea „`-u`” pentru a omite fișierele care sunt mai noi pe receptor (la destinație).

### 10.1.5. Expresii idiomatice pentru selectarea fișierelor

find(1) este utilizat pentru a selecta fișiere pentru comenzile de arhivare și copiere (a se vedea Secțiune 10.1.3, „Expresii idiomatice pentru arhivă” și Secțiune 10.1.4, „Expresii idiomatice pentru copiere”) sau pentru `xargs` (1) (a se vedea Secțiune 9.4.9, „Repetarea unei comenzi care parcurge fișierele”). Aceasta poate fi îmbunătățită prin utilizarea argumentelor sale de comandă.

Sintaxa de bază a find(1) poate fi rezumată după cum urmează.

- Argumentele sale condiționale sunt evaluate de la stânga la dreapta.

- Această evaluare se încheie odată ce rezultatul său este determinat.

- „SAU logic” (specificat prin „`-o`” între condiții) are prioritate mai mică decât „ȘI logic” (specificat prin „`-a`” sau nimic între condiții).

- „NU logic” (specificat prin „`!`” înaintea unei condiții) are prioritate mai mare decât „ȘI logic”.

- „`-prune`” returnează întotdeauna valoarea logică ADEVĂRAT și, dacă este vorba de un director, căutarea fișierului este oprită dincolo de acest punct.

- „`-name`” potrivește cu baza numelui fișierului cu expresiile regulate shell (a se vedea Secțiune 1.5.6, „Facilitatea glob a shell-ului”), dar se potrivește de asemenea cu „`.`” inițial cu metacaractere precum „`*`” și „`?`”; (funcție nouă POSIX).

- „`-regex`” potrivește cu ruta completă în stilul emacs BRE (a se vedea Secțiune 1.6.2, „Expresii regulate”) ca valoare implicită.

- „`-size`” potrivește fișierul pe baza dimensiunii fișierului (valoare precedată de „`+`” pentru mai mare, precedată de „`-`” pentru mai mică)

- „`-newer`” potrivește cu fișierul mai nou decât cel specificat în argumentul său.

- „`-print0`” returnează întotdeauna ADEVĂRAT logic și afișează numele complet al fișierului (terminat cu caracterul null) la ieșirea standard.

find(1) este adesea utilizat într-un stil idiomatic, după cum urmează.

    # find /path/to \
        -xdev -regextype posix-extended \
        -type f -regex ".*\.cpio|.*~" -prune -o \
        -type d -regex ".*/\.git" -prune -o \
        -type f -size +99M -prune -o \
        -type f -newer /path/to/timestamp -print0

Aceasta înseamnă efectuarea următoarelor acțiuni.

1. Caută toate fișierele ce încep cu „`/path/to`”

2. Limitează global căutarea în sistemul de fișiere inițial și utilizează în schimb ERE (a se vedea Secțiune 1.6.2, „Expresii regulate”).

3. Exclude fișierele care corespund expresiei regulate „`.*\.cpio`” sau „`.*~`” din căutare prin oprirea procesării.

4. Exclude din căutare directoarele care corespund expresiei regulate „`.*/\.git`” prin oprirea procesării.

5. Exclude fișierele mai mari de 99 megaocteți (unități de 1048576 octeți) din căutare prin oprirea procesării.

6. Afişează numele fişierelor care îndeplinesc condiţiile de căutare de mai sus şi sunt mai recente decât „`/path/to/timestamp`”.

Vă rugăm să rețineți utilizarea idiomatică a „`-prune -o`” pentru a exclude fișierele din exemplul de mai sus.

| Notă
Pentru sistemele non-Debian de tip Unix, este posibil ca unele opțiuni să nu fie acceptate de find(1). În acest caz, vă rugăm să luați în considerare ajustarea metodelor de potrivire și înlocuirea „`-print0`” cu „`-print`”. Este posibil să fie necesară ajustarea și a comenzilor asociate.

### 10.1.6. Suportul de arhivare

Atunci când alegeți suporturi de stocare a datelor pe calculator pentru arhivarea datelor importante, trebuie să fiți atenți la limitările acestora. Pentru copia de rezervă a datelor personale de mici dimensiuni, eu folosesc CD-R și DVD-R de la companii de renume și le păstrez într-un mediu răcoros, umbrit, uscat și curat; (suporturile de arhivare pe bandă par să fie populare pentru uz profesional.)

| Notă
Un seif rezistent la foc este destinat documentelor imprimate pe hârtie. Majoritatea suporturilor de stocare a datelor informatice au o toleranță la temperatură mai mică decât hârtia. De obicei, mă bazez pe mai multe copii criptate securizate, stocate în mai multe locații sigure.

Durata de viață optimistă a suporturilor de arhivare observată pe internet (în principal din informațiile furnizate de producători).

- mai mult de 100 de ani: hârtie fără acid cu cerneală

- 100 de ani: stocare optică (CD/DVD, CD/DVD-R)

- 30 de ani: stocare magnetică (bandă, dischetă)

- 20 de ani: stocare optică cu schimbare de stare (inscripționare-ștergere-reinscripționare -- CD-RW)

Acestea nu iau în calcul defecțiunile mecanice cauzate de manipulare, etc.

Numărul de cicluri de scriere optimist al mediilor de arhivare observat pe internet (în principal din informațiile furnizate de producători).

- mai mult de 250.000 de cicluri: disc dur

- mai mult de 10.000 de cicluri: memorie flash

- 1.000 de cicluri: CD/DVD-RW

- 1 cicluri: CD/DVD-R, hârtie

| Atenție
Cifrele referitoare la durata de stocare și ciclul de scriere prezentate aici nu trebuie utilizate pentru luarea de decizii privind stocarea datelor critice. Vă rugăm să consultați informațiile specifice despre produs furnizate de producător.

| Indicație
Deoarece CD-urile/DVD-urile-R și hârtia au un singur ciclu de scriere, acestea previn în mod inerent pierderea accidentală a datelor prin suprascriere. Acesta este un avantaj!

| Indicație
Dacă aveți nevoie de copii de rezervă rapide și frecvente pentru cantități mari de date, un disc dur pe un server la distanță conectat printr-o rețea rapidă poate fi singura opțiune realistă.

| Indicație
Dacă utilizați suporturi reinscriptibile pentru copiile de rezervă, ar fi o idee bună să utilizați un sistem de fișiere precum btrfs sau zfs, care acceptă instantanee numai pentru citire.

### 10.1.7. Dispozitive de stocare amovibile (detașabile)

Dispozitivele de stocare amovibile pot fi oricare dintre următoarele.

- memorie USB

- disc dur

- disc optic

- Aparat de fotografiat digital

- Aparat de redare muzică digitală

Acestea pot fi conectate prin oricare dintre următoarele metode.

- USB

- IEEE 1394 / FireWire

- PC Card

Mediile grafice de birou moderne, precum GNOME și KDE, pot monta automat aceste dispozitive amovibile fără o intrare corespunzătoare în „`/etc/fstab`”.

- Pachetul `udisks2` oferă un demon și instrumente asociate pentru montarea și demontarea acestor dispozitive.

- D-bus creează evenimente pentru a iniția procese automate.

- PolicyKit furnizează privilegiile necesare.

| Indicație
Dispozitivele montate automat pot avea opțiunea de montare „`uhelper=`”, care este utilizată de umount(8).

| Indicație
Montarea automată în mediul grafic de birou modern are loc numai atunci când aceste dispozitive media amovibile nu sunt listate în „`/etc/fstab`”.

Punctul de montare în mediul grafic de birou modern este ales ca „`/media/nume-utilizator/etichetă-dispozitiv`”, care poate fi personalizat după cum urmează.

- mlabel(1) pentru sistemul de fișiere FAT

- genisoimage(1) cu opțiunea „`-V`” pentru sistemul de fișiere ISO9660

- tune2fs(1) cu opțiunea „`-L`” pentru sistemul de fișiere ext2/ext3/ext4

| Indicație
Este posibil să fie necesar să se specifice alegerea codificării ca opțiune de montare (a se vedea Secțiune 8.1.3, „Codificarea numelor de fișiere”).

| Indicație
Utilizarea meniului interfeței grafice pentru a dezactiva un sistem de fișiere poate elimina nodul dispozitivului generat dinamic, cum ar fi „`/dev/sdc`”. Dacă doriți să păstrați nodul dispozitivului, dezactivați-l cu comanda umount(8) din promptul shell.

### 10.1.8. Alegerea sistemului de fișiere pentru partajarea datelor

Când partajați date cu alte sisteme prin intermediul unui dispozitiv de stocare amovibil, trebuie să îl formatați cu un sistem de fișiere comun acceptat de ambele sisteme. Iată o listă cu opțiunile de sisteme de fișiere.

| Notă
Declarațiile referitoare la discul dur (HDD) se aplică și altor dispozitive de stocare, cum ar fi SSD / unitate flash USB / card de memorie / ... . Înlocuiți numele dispozitivelor din exemple, cum ar fi `/dev/sda`, cu numele dispozitivelor aplicabile `/dev/nvme0`, `/dev/mmcblk0`, ... .

Tabel 10.3. Lista opțiunilor de sistem de fișiere pentru dispozitive de stocare amovibile cu scenarii tipice de utilizare

numele sistemului de fișiere | scenariul de utilizare tipic
--- | ---
FAT12 | partajarea datelor între platforme pe dischetă (<32MiB)
FAT16 | partajarea datelor între platforme pe un dispozitiv precum un disc dur mic (<2Gio)
FAT32 | partajarea datelor între platforme pe un dispozitiv precum un disc dur de mare capacitate (<8Tio, compatibil cu versiuni mai noi decât MS Windows95 OSR2)
exFAT | partajarea datelor între platforme pe un dispozitiv precum un disc dur de mare capacitate (<512 TiB, compatibil cu WindowsXP, Mac OS X Snow Leopard 10.6.5 și cu nucleul Linux începând cu versiunea 5.4)
NTFS | partajarea datelor între platforme pe un dispozitiv precum un disc dur de mare capacitate (cu suport nativ în MS Windows NT și versiunile ulterioare, și cu suport în NTFS-3G prin intermediul FUSE în Linux)
ISO9660 | partajarea între platforme a datelor statice pe CD-R și DVD+/-R
UDF | scrierea incrementală a datelor pe CD-R și DVD+/-R (nou)
MINIX | stocare eficientă a datelor fișierelor Unix pe dischetă
ext2 | partajarea datelor de pe un dispozitiv precum discul dur cu sisteme Linux mai vechi
ext3 | partajarea datelor de pe un dispozitiv precum discul dur cu sisteme Linux mai vechi
ext4 | partajarea datelor pe un dispozitiv precum discul dur cu sistemele Linux actuale
btrfs | partajarea datelor pe dispozitive precum discul dur cu sistemele Linux actuale cu instantanee numai pentru citire

| Indicație
Consultați Secțiune 9.9.1, „Criptarea discurilor amovibile cu dm-crypt/LUKS” pentru partajarea datelor între platforme utilizând criptarea la nivel de dispozitiv.

Sistemul de fișiere FAT este acceptat de aproape toate sistemele de operare moderne și este foarte util pentru schimbul de date prin intermediul unor suporturi de stocare amovibile, precum discurile dure.

Atunci când formatați dispozitive precum discurile dure amovibile pentru partajarea datelor între platforme cu sistemul de fișiere FAT, următoarele opțiuni ar trebui să fie sigure.

- Partiționați-le cu fdisk(8), cfdisk(8) sau parted(8) (consultați Secțiune 9.6.2, „Configurarea partițiilor de disc”) într-o singură partiție primară și marcați-o după cum urmează.

  - Tastați „6” pentru FAT16 pentru suporturi media mai mici de 2 Go.

  - Tastați „c” pentru FAT32 (LBA) pentru suporturi media mai mari.

- Formatarea partiției primare cu mkfs.vfat(8) cu următoarele.

  - Doar numele dispozitivului, de exemplu „`/dev/sda1`” pentru FAT16

  - Opțiunea explicită și numele dispozitivului, de exemplu „`-F 32 /dev/sda1`” pentru FAT32

Atunci când utilizați sistemele de fișiere FAT sau ISO9660 pentru partajarea datelor, trebuie să luați în considerare următoarele aspecte de siguranță.

- Arhivarea fișierelor într-un fișier arhivă utilizând mai întâi tar(1) sau cpio(1) pentru a păstra numele lung al fișierului, legătura simbolică, permisiunea originală a fișierului Unix și informațiile despre proprietar.

- Împărțirea fișierului arhivă în bucăți mai mici de 2 Gio cu comanda split(1) pentru a-l proteja de limitarea dimensiunii fișierului.

- Criptarea fișierului arhivă pentru a proteja conținutul acestuia împotriva accesului neautorizat.

| Notă
Pentru sistemele de fișiere FAT, conform specificațiilor, dimensiunea maximă a fișierului este `(2^32 - 1) octeți = (4Gio - 1 octet)`. Pentru unele aplicații pe sistemele de operare mai vechi de 32 de biți, dimensiunea maximă a fișierului era chiar mai mică `(2^31 - 1) octeți = (2Gio - 1 octet)`. Debian nu are această problemă.

| Notă
Microsoft însuși nu recomandă utilizarea FAT pentru unități sau partiții de peste 200 Mo. Microsoft subliniază deficiențele sale, cum ar fi utilizarea ineficientă a spațiului pe disc, în „Prezentare generală a sistemelor de fișiere FAT, HPFS și NTFS”. Desigur, în mod normal ar trebui să utilizăm sistemul de fișiere ext4 pentru Linux.

| Indicație
Pentru mai multe informații despre sistemele de fișiere și accesarea acestora, citiți „Ghidul sistemelor de fișiere”.

### 10.1.9. Partajarea datelor prin rețea

Când partajați date cu alte sisteme prin rețea, ar trebui să utilizați un serviciu comun. Iată câteva sfaturi.

Tabel 10.4. Lista serviciilor de rețea din care puteți alege, cu scenariul tipic de utilizare

serviciul de rețea | descrierea scenariului tipic de utilizare
--- | ---
SMB/CIFS sistem de fișiere montat în rețea cu Samba | partajarea fișierelor prin „Rețea Microsoft Windows”, consultați smb.conf(5) și Ghidul oficial Samba 3.x.x HOWTO și ghidul de referință sau pachetul `samba-doc`
NFS sistem de fișiere montat în rețea cu nucleul Linux | partajarea fișierelor prin „Rețea Unix/Linux”, consultați exports(5) și Linux NFS-HOWTO
serviciul HTTP | partajarea fișierelor între serverul web/client
serviciul HTTPS | partajarea fișierelor între serverul web/client cu Secure Sockets Layer (SSL) criptat sau Transport Layer Security (TLS)
serviciul FTP | partajarea fișierelor între serverul/clientul FTP

Deși aceste sisteme de fișiere montate în rețea și metodele de transfer de fișiere prin rețea sunt destul de convenabile pentru partajarea datelor, acestea pot fi nesigure. Conexiunea lor la rețea trebuie securizată prin următoarele măsuri.

- Criptați-o cu SSL/TLS

- Plasați-o în tunel prin SSH

- Plasați-o în tunel prin VPN

- Limitați-o în spatele paravanului de protecție securizat

Consultă de asemenea Secțiune 6.5, „Alte servere de aplicații de rețea” și Secțiune 6.6, „Alți clienți de aplicații de rețea”.

## 10.2. Copia de rezervă și recuperarea

Știm cu toții că uneori calculatoarele se defechează sau că erorile umane pot provoca daune sistemului și datelor. Operațiile de copie de rezervă și recuperare sunt o parte esențială a administrării cu succes a sistemului. Toate modurile posibile de funcționare defectuoasă vă pot afecta într-o zi.

| Indicație
Mențineți sistemul de copiere de rezervă simplu și faceți copii de rezervă ale sistemului în mod frecvent. Este mai important să aveți date de rezervă decât să dispuneți de o metodă de copiere de rezervă performantă din punct de vedere tehnic.

### 10.2.1. Politica de copie de rezervă și recuperare

Există 3 factori cheie care determină politica actuală de copie de rezervă și recuperare.

1. Să știi ce să copiezi și ce să recuperezi.

   - Fișiere de date create direct de dvs.: date în „`~/`”

   - Fișiere de date create de aplicațiile utilizate de dvs.: date în „`/var/`” (cu excepția „`/var/cache/`”, „`/var/run/`” și „`/var/tmp/`”)

   - Fișiere de configurare a sistemului: date în „`/etc/`”

   - Programe locale: date în „`/usr/local/`” sau „`/opt/`”

   - Informații privind instalarea sistemului: o notă în format text simplu privind etapele cheie (partiționare, …)

   - Set de date verificat: confirmat în prealabil prin operații experimentale de recuperare

     - Sarcina cron ca proces de utilizator: fișiere în directorul „`/var/spool/cron/crontabs`” și repornirea cron(8). Consultați Secțiune 9.4.14, „Programarea regulată a sarcinilor” pentru cron(8) și crontab(1).

     - Sarcini programate systemd ca procese utilizator: fișiere în directorul „`~/.config/systemd/user`”. Consultați systemd.timer(5) și systemd.service(5).

     - Sarcini de pornire automată ca procese ale utilizatorului: fișiere din directorul „`~/.config/autostart`”. Consultați Specificații privind pornirea automată a aplicațiilor de birou.

2. Să știi cum să faci copii de rezervă și să recuperezi datele.

   - Stocarea sigură a datelor: protecție împotriva suprascrierii și a defecțiunilor sistemului

   - Copiere de rezervă frecventă: copie de rezervă programată

   - Copie de rezervă redundantă: oglindirea datelor

   - Proces fără greșeli: copie de rezervă ușoară cu o singură comandă

3. Evaluarea riscurilor și a costurilor implicate.

   - Riscul de pierdere a datelor

     - Datele trebuie să se afle cel puțin pe partiții de disc diferite, de preferință pe discuri și mașini diferite, pentru a rezista la coruperea sistemului de fișiere. Datele importante sunt stocate cel mai bine pe un sistem de fișiere numai pentru citire. [4]

   - Riscul de încălcare a securității datelor

     - Date sensibile de identitate, cum ar fi „`/etc/ssh/ssh_host_*_key`”, „`~/.gnupg/*`”, „`~/.ssh/*`”, „`~/.local/share/keyrings/*`”, „`/etc/passwd`”, „`/etc/shadow`”, „`popularity-contest.conf`”, „`/etc/ppp/pap-secrets`” și „`/etc/exim4/passwd.client`” trebuie să fie copiate ca fișiere criptate. [5] (A se vedea Secțiune 9.9, „Sfaturi pentru criptarea datelor”.)

     - Nu încorporați niciodată parola de conectare la sistem sau fraza de decriptare în niciun script, chiar și pe un sistem de încredere; (a se vedea Secțiune 10.3.6, „Inel de chei pentru parole”).

   - Modul de defectare și posibilitatea apariției acestuia

     - Hardware-ul (în special HDD-ul) se va defecta

     - Sistemul de fișiere poate fi corupt, iar datele din acesta pot fi pierdute.

     - Sistemul de stocare la distanță nu este de încredere din punct de vedere al securității

     - Protecția prin parolă slabă poate fi compromisă cu ușurință

     - Sistemul de permisiuni pentru fișiere poate fi compromis

   - Resurse necesare pentru copie de rezervă: resurse umane, hardware, software, …

     - Copiere de rezervă automată programată cu sarcină de «cron» (cron job) sau cu sarcină programată de systemd (systemd timer job)

| Indicație
Puteți recupera datele de configurare debconf cu „`debconf-set-selections debconf-selections`” și datele de selecție dpkg cu „`dpkg --set-selection <dpkg-selections.list`”.

| Notă
Nu faceți copii de rezervă pentru conținutul pseudo-sistemului de fișiere găsit în `/proc`, `/sys`, `/tmp` și `/run` (consultați Secțiune 1.2.12, „procfs și sysfs” și Secțiune 1.2.13, „tmpfs”). Dacă nu știți exact ce faceți, acestea sunt date inutile de dimensiuni enorme.

| Notă
Este posibil să doriți să opriți anumiți demoni de aplicații, cum ar fi MTA (consultați Secțiune 6.2.4, „Agentul de transport al poștei electronice („Mail transport agent”: MTA)”), în timp ce faceți copii de rezervă ale datelor.

### 10.2.2. Suite de instrumente de copie de rezervă

Iată o listă selectivă a celor mai importante suite de instrumente de copiere de rezervă disponibile în sistemul Debian.

Tabel 10.5. Lista suitelor de instrumente de copiere de rezervă

pachet | popcon(popularitate) | dimensiune | descriere
--- | --- | --- | ---
`bacula-common` | V:6.3, I:7.2 | 2501 | Bacula: copiere de rezervă, recuperare și verificare în rețea - fișiere comune de asistență
`bacula-client` | V:0.3, I:1.9 | 199 | Bacula: copiere de rezervă, recuperare și verificare în rețea - meta-pachet client
`bacula-console` | V:0.7, I:2.1 | 112 | Bacula: copiere de rezervă, recuperare și verificare în rețea - consolă text
`bacula-server` | I:0.60 | 199 | Bacula: copiere de rezervă, recuperare și verificare în rețea - meta-pachet server
`amanda-common` | V:0.6, I:2.2 | 9851 | Amanda: „Advanced Maryland Automatic Network Disk Archiver” -- Arhivator automat avansat de discuri în rețea Maryland (biblioteci)
`amanda-client` | V:0.6, I:2.2 | 1099 | Amanda: Arhivator automat avansat de discuri în rețea Maryland (client)
`amanda-server` | V:0.11, I:0.23 | 1093 | Amanda: Arhivator automat avansat de discuri în rețea Maryland (server)
`backuppc` | V:1.4, I:1.7 | 3088 | BackupPC X este un sistem performant, la nivel de întreprindere, pentru copierea de rezervă a calculatoarelor (pe disc).
`duplicity` | V:6, I:47 | 2670 | copie de rezervă incrementală (la distanță)
`deja-dup` | V:29, I:43 | 5274 | interfață grafică pentru duplicitate
`borgbackup` | V:13, I:28 | 3485 | de duplicarea copiilor de rezervă (de la distanță)
`borgmatic` | V:3.2, I:4.4 | 946 | asistent robotizat de copiere de rezervă
`rdiff-backup` | V:2.3, I:6.6 | 1207 | copie de rezervă incrementală (la distanță)
`restic` | V:6, I:12 | 41560 | copie de rezervă incrementală (la distanță)
`backupninja` | V:2.2, I:2.6 | 360 | sistem de meta-copiere de rezervă ușor și extensibil
`slbackup` | V:0.11, I:0.13 | 147 | copie de rezervă incrementală (la distanță)
`backup-manager` | V:0.43, I:0.77 | 573 | instrument de copie de rezervă din linia de comandă
`backup2l` | V:0.38, I:0.53 | 110 | instrument de copiere de rezervă/restaurare cu întreținere redusă pentru suporturi ce pot fi montate (pe bază de disc)

Instrumentele de copie de rezervă au domenii de specializare specifice.

- Mondo Rescue este un sistem de copiere de rezervă care facilitează restaurarea rapidă a întregului sistem de pe CD-uri/DVD-uri de rezervă etc., fără a fi necesar să se parcurgă procesele normale de instalare a sistemului.

- Bacula, Amanda, și BackupPC sunt suite complete de instrumente de copiere de rezervă, axate pe copierea periodică de rezervă prin rețea.

- Duplicity, și Borg sunt instrumente de copiere de rezervă mai simple pentru stațiile de lucru obișnuite.

### 10.2.3. Sfaturi pentru copierea de rezervă

Pentru o stație de lucru personală, instrumentele complete de copiere de rezervă concepute pentru mediul server pot să nu fie adecvate. În același timp, instrumentele existente de copiere de rezervă pentru stațiile de lucru pot avea unele deficiențe.

Iată câteva sfaturi pentru a facilita realizarea copiilor de rezervă cu eforturi minime din partea utilizatorului. Aceste tehnici pot fi utilizate cu orice instrumente de copiere de rezervă.

În scop demonstrativ, să presupunem că numele utilizatorului și al grupului principal este `penguin` și să creăm un exemplu de script de copiere de rezervă și instantanee„`/usr/local/bin/bkss.sh`” după cum urmează:

    #!/bin/sh -e
    SRC="$1" # source data path
    DSTFS="$2" # backup destination filesystem path
    DSTSV="$3" # backup destination subvolume name
    DSTSS="${DSTFS}/${DSTSV}-snapshot" # snapshot destination path
    if [ "$(stat -f -c %T "$DSTFS")" != "btrfs" ]; then
      echo "E: $DESTFS needs to be formatted to btrfs" >&2 ; exit 1
    fi
    MSGID=$(notify-send -p "bkup.sh $DSTSV" "in progress ...")
    if [ ! -d "$DSTFS/$DSTSV" ]; then
      btrfs subvolume create "$DSTFS/$DSTSV"
      mkdir -p "$DSTSS"
    fi
    rsync -aHxS --delete --mkpath "${SRC}/" "${DSTFS}/${DSTSV}"
    btrfs subvolume snapshot -r "${DSTFS}/${DSTSV}" ${DSTSS}/$(date -u --iso=min)
    notify-send -r "$MSGID" "bkup.sh $DSTSV" "finished!"

Aici, doar instrumentul de bază rsync(1) este utilizat pentru a facilita copierea de rezervă a sistemului, iar spațiul de stocare este utilizat în mod eficient de Btrfs.

| Indicație
Pentru informație: autorul utilizează propriul script shell similar „bss: Btrfs Subvolume Snapshot Utility” pentru stația sa de lucru.

#### 10.2.3.1. Copierea de rezervă în interfața grafică

Iată un exemplu pentru configurarea copierii de rezervă cu un singur clic în interfața grafică.

- Pregătiți un dispozitiv de stocare USB care va fi utilizat pentru copia de rezervă.

  - Formatați un dispozitiv de stocare USB cu o singură partiție în btrfs, cu numele de etichetă „`BKUP`”. Acesta poate fi criptat (consultați Secțiune 9.9.1, „Criptarea discurilor amovibile cu dm-crypt/LUKS”).

  - Conectați-l în sistemul dvs. Sistemul grafic de birou ar trebui să îl monteze automat ca „`/media/penguin/BKUP`”.

  - Executați «`sudo chown penguin:penguin /media/penguin/BKUP`» pentru a-l face inscriptibil de către utilizator.

- Creați „`~/.local/share/applications/BKUP.desktop`” urmând tehnicile descrise în Secțiune 9.4.10, „Pornirea unui program din interfața grafică” astfel:

      [Desktop Entry]
      Name=bkss
      Comment=Backup and snapshot of ~/Documents
      Exec=/usr/local/bin/bkss.sh /home/penguin/Documents /media/penguin/BKUP Documents
      Type=Application

La fiecare clic în interfața grafică, datele dvs. sunt copiate din „`~/Documents`” pe un dispozitiv de stocare USB și se creează o instantanee numai pentru citire.

#### 10.2.3.2. Copiere de rezervă declanșată de evenimentul de montare

Iată un exemplu de configurare pentru copierea automată de rezervă declanșată de evenimentul de montare.

- Pregătiți un dispozitiv de stocare USB care să fie utilizat pentru copie de rezervă, ca în Secțiune 10.2.3.1, „Copierea de rezervă în interfața grafică”.

- Creați un fișier de unitate de serviciu systemd „`~/.config/systemd/user/back-BKUP.service`” astfel:

      [Unit]
      Description=USB Disk backup
      Requires=media-%u-BKUP.mount
      After=media-%u-BKUP.mount

      [Service]
      ExecStart=/usr/local/bin/bkss.sh %h/Documents /media/%u/BKUP Documents
      StandardOutput=append:%h/.cache/systemd-snap.log
      StandardError=append:%h/.cache/systemd-snap.log

      [Install]
      WantedBy=media-%u-BKUP.mount

- Activați această configurație a unității systemd cu următoarea comandă:

       $ systemctl --user enable bkup-BKUP.service

Pentru fiecare eveniment de montare, datele dvs. sunt copiate din „`~/Documents`” pe un dispozitiv de stocare USB și se creează o instantanee numai pentru citire.

Aici, numele unităților de montare systemd pe care systemd le are în prezent în memorie pot fi solicitate gestionarului de servicii al utilizatorului care efectuează apelul cu «`systemctl --user list-units --type=mount`».

#### 10.2.3.3. Copiere de rezervă declanșată de evenimentul programatorului de sarcini

Iată un exemplu de configurare pentru copierea automată de rezervă declanșată de evenimentul programatorului de sarcini.

- Pregătiți un dispozitiv de stocare USB care să fie utilizat pentru copie de rezervă, ca în Secțiune 10.2.3.1, „Copierea de rezervă în interfața grafică”.

- Creați un fișier de unitate de programare systemd „`~/.config/systemd/user/snap-Documents.timer`” astfel:

      [Unit]
      Description=Run btrfs subvolume snapshot on timer
      Documentation=man:btrfs(1)

      [Timer]
      OnStartupSec=30
      OnUnitInactiveSec=900

      [Install]
      WantedBy=timers.target

- Creați un fișier de unitate de serviciu systemd „`~/.config/systemd/user/snap-Documents.service`” astfel:

      [Unit]
      Description=Run btrfs subvolume snapshot
      Documentation=man:btrfs(1)

      [Service]
      Type=oneshot
      Nice=15
      ExecStart=/usr/local/bin/bkss.sh %h/Documents /media/%u/BKUP Documents
      IOSchedulingClass=idle
      CPUSchedulingPolicy=idle
      StandardOutput=append:%h/.cache/systemd-snap.log
      StandardError=append:%h/.cache/systemd-snap.log

- Activați această configurație a unității systemd cu următoarea comandă:

       $ systemctl --user enable snap-Documents.timer

Pentru fiecare eveniment programat, datele dvs. sunt copiate din „`~/Documents`” pe un dispozitiv de stocare USB și se creează o instantanee numai pentru citire.

Aici, numele unităților de utilizator ale programatorului systemd pe care systemd le are în prezent în memorie pot fi solicitate gestionatorului de servicii al utilizatorului care efectuează apelul cu «`systemctl --user list-units --type=timer`».

Pentru sistemele grafice de birou moderne, această abordare systemd poate oferi un control mai precis decât cele tradiționale Unix care utilizează at(1), cron(8) sau anacron(8).

## 10.3. Infrastructura de securitate a datelor

Infrastructura de securitate a datelor este asigurată de combinația dintre instrumentul de criptare a datelor, instrumentul de rezumat al mesajelor și instrumentul de semnătură.

Tabel 10.6. Lista instrumentelor de infrastructură pentru securitatea datelor

pachet | popcon(popularitate) | dimensiune | comandă | descriere
--- | --- | --- | --- | ---
`gnupg` | V:398, I:867 | 464 | gpg(1) | GNU Privacy Guard - instrument de criptare și semnare OpenPGP
`gpgv` | V:234, I:939 | 555 | gpgv(1) | GNU Privacy Guard - instrument de verificare a semnăturilor OpenPGP
`sq` | V:1, I:27 | 23948 | sq(1) | Sequoia-PGP - instrument de criptare și semnare OpenPGP
`sqv` | V:416, I:487 | 1702 | sqv(1) | Sequoia-PGP - instrument de verificare a semnăturilor OpenPGP
`paperkey` | V:1, I:13 | 58 | paperkey(1) | extrage doar informațiile secrete din cheile secrete OpenPGP
`cryptsetup` | V:35, I:78 | 462 | cryptsetup(8), … | ustensile pentru dm-crypt criptarea dispozitivelor bloc care acceptă LUKS
`coreutils` | V:911, I:1000 | 17994 | md5sum(1) | calculează și verifică rezumatul mesajului MD5
`coreutils` | V:911, I:1000 | 17994 | sha1sum(1) | calculează și verifică rezumatul mesajului SHA1
`openssl` | V:847, I:996 | 2532 | `openssl`(1ssl) | calculează rezumatul mesajului cu „`openssl dgst`” (OpenSSL)
`libsecret-tools` | V:1, I:11 | 45 | secret-tool(1) | stochează și recuperează parole (CLI)
`seahorse` | V:75, I:261 | 7971 | seahorse(1) | instrument de gestionare a cheilor (GNOME)

Consultați Secțiune 9.9, „Sfaturi pentru criptarea datelor” cu dm-crypt și fscrypt, care implementează infrastructura de criptare automată a datelor prin intermediul modulelor nucleului Linux.

### 10.3.1. Gestionarea cheilor pentru GnuPG

Iată comenzile GNU Privacy Guard pentru gestionarea cheilor de bază.

Tabel 10.7. Lista comenzilor GNU Privacy Guard pentru gestionarea cheilor

comandă | descriere
--- | ---
`gpg --gen-key` | generează o cheie nouă
`gpg --gen-revoke ID-ul_meu_de-utilizator` | generează cheia de revocare pentru ID-ul_meu_de-utilizator
`gpg --edit-key ID_utilizator` | editează cheia în mod interactiv, „help” pentru ajutor
`gpg -o fișier --export` | exportă toate cheile publice în fișier
`gpg -o fișier --export-secret-keys` | exportă toate cheile private în fișier
`gpg --import fișier` | importă toate cheile din fișier
`gpg --send-keys ID_utilizator` | trimite cheia pentru ID_utilizator către serverul de chei
`gpg --recv-keys ID_utilizator` | primește cheia pentru ID_utilizator de la serverul de chei
`gpg --list-keys ID_utilizator` | listează cheile pentru ID_utilizator
`gpg --list-sigs ID_utilizator` | listează semnăturile pentru ID_utilizator
`gpg --check-sigs ID_utilizator` | verifică semnăturile pentru ID_utilizator
`gpg --fingerprint ID_utilizator` | verifică amprenta digitală pentru ID_utilizator
`gpg --refresh-keys` | actualizează inelul de chei local

Iată semnificația codului de încredere.

Tabel 10.8. Lista semnificațiilor codului de încredere

cod | descrierea încrederii
--- | ---
`-` | nu s-a atribuit nicio încredere proprietarului / nu s-a calculat încă
`e` | calcularea încrederii a eșuat
`q` | informații insuficiente pentru calcul
`n` | nu aveți încredere niciodată în această cheie
`m` | încredere marginală
`f` | încredere deplină
`u` | în cele din urmă, de încredere

Următoarrea comandă generează cheia mea „`9563FC29932C409F1A77F9C1AB8A1522D8234C6A`”.

    $ gpg --gen-key
    gpg (GnuPG) 2.4.7; Copyright (C) 2024 g10 Code GmbH
    ...
    GnuPG needs to construct a user ID to identify your key.

    Real name: Osamu Aoki
    Email address: osamu@debian.org
    You selected this USER-ID:
        "Osamu Aoki <osamu@debian.org>"

    Change (N)ame, (E)mail, or (O)kay/(Q)uit? o
    ...
    public and secret key created and signed.

    pub   ed25519 2026-02-14 [SC] [expires: 2029-02-13]
          9563FC29932C409F1A77F9C1AB8A1522D8234C6A
    uid                      Osamu Aoki <osamu@debian.org>
    sub   cv25519 2026-02-14 [E] [expires: 2029-02-13]

Următoarea comandă încarcă cheia mea „`9563FC29932C409F1A77F9C1AB8A1522D8234C6A`” pe popularul server de chei „`hkp://keys.gnupg.net`”.

    $ gpg --keyserver hkp://keys.gnupg.net --send-keys 9563FC29932C409F1A77F9C1AB8A1522D8234C6A

Un server de chei implicit bine configurat în „`~/.gnupg/gpg.conf`” (sau vechea locație „`~/.gnupg/options`”) conține următoarele.

    keyserver hkp://keys.gnupg.net

Următoarea comandă obține cheile necunoscute de la serverul de chei.

    $ gpg --list-sigs --with-colons | grep '^sig.*\[User ID not found\]' |\
              cut -d ':' -f 5| sort | uniq | xargs gpg --recv-keys

A existat o eroare în OpenPGP Public Key Server (versiunea anterioară 0.9.6) care a corupt cheia cu mai mult de 2 subchei. Pachetul mai nou `gnupg` (>1.2.1-2) poate gestiona aceste subchei corupte. Consultați gpg(1) la opțiunea „`--repair-pks-subkey-bug`”.

Utilizarea SHA-1 pentru algoritmul de rezumat a fost înlocuită. Dacă vechea cheie openPGP bazată pe RSA utilizează SHA-1 pentru algoritmul de rezumat, remediați problema utilizând FixKeyWithSha1.

| Indicație
Comenzile sq(1) și sqv(1) sunt un set alternativ de comenzi openPGP. Consultați documentația utilizatorului sq și O introducere practică în utilizarea sq, CLI-ul Sequoia PGP.

### 10.3.2. Utilizarea GnuPG pe fișiere

Iată câteva exemple de utilizare a comenzilor GNU Privacy Guard pe fișiere.

Tabel 10.9. Lista comenzilor GNU Privacy Guard pentru fișiere

comandă | descriere
--- | ---
`gpg -a -s fișier` | semnează fișierul în armură ASCII ca fișier.asc
`gpg --armor --sign fișier` | , ,
`gpg --clearsign fișier` | semnează în text clar mesajul
`gpg --clearsign fișier|mesaj foo@example.org` | trimite un mesaj semnat în text clar la `foo@example.org`
`gpg --clearsign --not-dash-escaped fișier.patch` | semnează în text clar fișierul.patch
`gpg --verify fișier` | verifică fișierul semnat în text clar
`gpg -o fișier.sig -b fișier` | creează o semnătură detașată
`gpg -o fișier.sig --detach-sign fișier` | , ,
`gpg --verify fișier.sig fișier` | verifică fișierul cu fișierul.sig
`gpg -o fișier_criptat.gpg -r nume -e fișier` | criptare cu cheie publică destinată numelui din fișierul binar fișier_criptat.gpg
`gpg -o fișier_criptat.gpg --recipient nume --encrypt fișier` | , ,
`gpg -o fișier_criptat.asc -a -r name -e fișier` | criptare cu cheie publică destinată numelui din fișier către fișierul_criptat.asc cu armură ASCII
`gpg -o fișier_criptat.gpg -c fișier` | criptare simetrică din fișier în fișier_criptat.gpg
`gpg -o fișier_criptat.gpg --symmetric fișier` | , ,
`gpg -o fișier_criptat.asc -a -c fișier` | criptare simetrică destinată numelui din fișier către fișierul cu armură ASCII, fișier_criptat.asc
`gpg -o fișier -d fișier_criptat.gpg -r nume` | decriptare
`gpg -o fișier --decrypt fișier_criptat.gpg` | , ,

### 10.3.3. Utilizarea GnuPG cu Mutt

Adăugați următoarele în „`~/.muttrc`” pentru a împiedica pornirea automată a GnuPG, permițând totuși utilizarea acestuia prin tastarea „`S`” în meniul index.

    macro index S ":toggle pgp_verify_sig\n"
    set pgp_verify_sig=no

### 10.3.4. Utilizarea GnuPG cu Vim

Modulul `gnupg` vă permite să rulați GnuPG în mod transparent pentru fișierele cu extensia „`.gpg`”, „`.asc`” și „`.pgp`”.[6]

    $ sudo aptitude install vim-scripts
    $ echo "packadd! gnupg" >> ~/.vim/vimrc

### 10.3.5. Suma de control MD5

md5sum(1) oferă utilitatea de a crea un fișier de rezumat (digest) folosind metoda din rfc1321 și de a verifica fiecare fișier cu ajutorul acestuia.

    $ md5sum foo bar >baz.md5
    $ cat baz.md5
    d3b07384d113edec49eaa6238ad5ff00  foo
    c157a79031e1c40f85931829bc5fc552  bar
    $ md5sum -c baz.md5
    foo: OK
    bar: OK

| Notă
Calculul pentru suma MD5 solicită mai puțin procesorul decât cel pentru semnătura criptografică realizată de GNU Privacy Guard (GnuPG). De obicei, numai fișierul de rezumat (digest) de nivel superior este semnat criptografic pentru a asigura integritatea datelor.

### 10.3.6. Inel de chei pentru parole

În sistemul GNOME, instrumentul cu interfață grafică seahorse(1) gestionează parolele și le stochează în siguranță în inelul de chei `~/.local/share/keyrings/*`.

secret-tool(1) poate stoca parola în inelul de chei din linia de comandă.

Să stocăm fraza de acces utilizată pentru imaginea discului criptat LUKS/dm-crypt

    $ secret-tool store --label='LUKS passphrase for disk.img' LUKS my_disk.img
    Password: ********

Această parolă stocată poate fi recuperată și introdusă în alte programe, de exemplu, cryptsetup(8).

    $ secret-tool lookup LUKS my_disk.img | \
      cryptsetup open disk.img disk_img --type luks --keyring -
    $ sudo mount /dev/mapper/disk_img /mnt

| Indicație
Ori de câte ori trebuie să furnizați o parolă într-un script, utilizați `secret-tool` și evitați să codificați direct fraza de acces în acesta.

## 10.4. Instrumente de îmbinare a codului sursă

Există multe instrumente de îmbinare/fuzionare pentru codul sursă. Următoarele comenzi mi-au atras atenția.

Tabel 10.10. Lista instrumentelor de îmbinare a codului sursă

pachet | popcon(popularitate) | dimensiune | comandă | descriere
--- | --- | --- | --- | ---
`patch` | V:103, I:726 | 242 | patch(1) | aplică un fișier diff la un fișier original
`vim` | V:85, I:347 | 4135 | vimdiff(1) | compară 2 fișiere unul lângă altul în vim
`imediff` | V:0.03, I:0.26 | 329 | imediff(1) | instrument interactiv pe ecran complet de îmbinare/fuzionare a 2/3 fișiere
`meld` | V:5, I:24 | 3992 | meld(1) | compară și fuzionează fișiere (GTK)
`wiggle` | V:0.01, I:0.12 | 175 | wiggle(1) | aplică corecțiile (patch) respinse
`diffutils` | V:896, I:998 | 1768 | diff(1) | compară fișiere linie cu linie
`diffutils` | V:896, I:998 | 1768 | diff3(1) | compară și fuzionează trei fișiere linie cu linie
`quilt` | V:2, I:17 | 880 | quilt(1) | gestionează serii de plasturi(corecții)
`wdiff` | V:6, I:40 | 651 | wdiff(1) | afișează diferențele de cuvinte între fișierele text
`diffstat` | V:9, I:98 | 79 | diffstat(1) | produce o histogramă a modificărilor prin diff
`patchutils` | V:11, I:97 | 269 | combinediff(1) | creează un plasture cumulativ din doi plasturi incrementali
`patchutils` | V:11, I:97 | 269 | dehtmldiff(1) | extrage un fișier diff dintr-o pagină HTML
`patchutils` | V:11, I:97 | 269 | filterdiff(1) | extrage sau exclude diferențele dintr-un fișier diff
`patchutils` | V:11, I:97 | 269 | fixcvsdiff(1) | corectează fișierele diff create de CVS pe care patch(1) le interpretează greșit
`patchutils` | V:11, I:97 | 269 | flipdiff(1) | schimbă ordinea a două fișiere de corecții(plasturi)
`patchutils` | V:11, I:97 | 269 | grepdiff(1) | afișează fișierele modificate de un patch care corespunde unei expresii regulate
`patchutils` | V:11, I:97 | 269 | interdiff(1) | afișează diferențele dintre două fișiere diff unificate
`patchutils` | V:11, I:97 | 269 | lsdiff(1) | afișează fișierele modificate de un plasture
`patchutils` | V:11, I:97 | 269 | recountdiff(1) | recalculează numărările și decalajele într-un context unificat de diferențe
`patchutils` | V:11, I:97 | 269 | rediff(1) | corectează decalajele și numărările unui fișier diff editat manual
`patchutils` | V:11, I:97 | 269 | splitdiff(1) | separă plasturii(corecțiile) incrementale
`patchutils` | V:11, I:97 | 269 | unwrapdiff(1) | repară plasturii(corecțiile) în care cuvintele au fost împărțite pe mai multe rânduri
`dirdiff` | V:0.1, I:1.4 | 167 | dirdiff(1) | afișează diferențele și îmbină/fuzionează modificările între arbori de directoare
`docdiff` | V:0.03, I:0.25 | 554 | docdiff(1) | compară două fișiere cuvânt cu cuvânt / caracter cu caracter
`makepatch` | V:0.02, I:0.16 | 99 | makepatch(1) | generează fișiere .patch extinse
`makepatch` | V:0.02, I:0.16 | 99 | applypatch(1) | aplică fișiere .patch extinse

### 10.4.1. Extragerea diferențelor pentru fișierele sursă

Următoarele proceduri extrag diferențele dintre două fișiere sursă și creează fișiere diff unificate „`file.patch0`” sau „`file.patch1`”, în funcție de locația fișierului.

    $ diff -u file.old file.new > file.patch0
    $ diff -u old/file new/file > file.patch1

### 10.4.2. Fuzionarea actualizărilor pentru fișierele sursă

Fișierul diff (denumit alternativ fișier patch) este utilizat pentru a trimite o actualizare a programului. Partea destinatară aplică această actualizare unui alt fișier după cum urmează.

    $ patch -p0 file < file.patch0
    $ patch -p1 file < file.patch1

### 10.4.3. Îmbinare/fuzionare interactivă

Dacă aveți două versiuni ale unui cod sursă, puteți efectua o îmbinare bidirecțională în mod interactiv utilizând imediff(1) după cum urmează.

    $ imediff -o file.merged file.old file.new

Dacă aveți trei versiuni ale unui cod sursă, puteți efectua o îmbinare interactivă în trei moduri utilizând imediff(1) după cum urmează.

    $ imediff -o file.merged file.yours file.base file.theirs

## 10.5. Git

Git este instrumentul preferat în prezent pentru sistemul de control al versiunilor (VCS), deoarece Git poate face totul atât pentru gestionarea codului sursă local, cât și pentru cea de la distanță.

Debian furnizează servicii Git gratuite prin intermediul serviciului Debian Salsa. Documentația acestuia poate fi găsită la https://wiki.debian.org/Salsa .

Iată câteva pachete legate de Git.

Tabel 10.11. Lista pachetelor și comenzilor legate de git

pachet | popcon(popularitate) | dimensiune | comandă | descriere
--- | --- | --- | --- | ---
`git` | V:406, I:616 | 50972 | git(7) | Git, sistemul rapid, scalabil și distribuit de control al reviziilor
`gitk` | V:4, I:27 | 2022 | gitk(1) | navigator cu interfață grafică pentru depozitul Git, cu istoric
`qgit` | V:0.2, I:2.0 | 1431 | qgit(1) | navigator cu interfață grafică pentru depozitul Git, cu istoric
`git-cola` | V:0.7, I:4.6 | 5005 | git-cola(1) | navigator cu interfață grafică pentru depozitul Git, cu istoric
`tig` | V:2, I:12 | 1243 | tig(1) | navigator de depozite Git pentru consolă, cu istoric
`lazygit` | V:0.9, I:3.6 | 24167 | lazygit(1) | navigator de depozite Git pentru consolă, cu istoric
`git-gui` | V:1, I:17 | 2525 | git-gui(1) | interfață grafică pentru depozitul Git (fără istoric)
`git-email` | V:0.4, I:9.8 | 1204 | git-send-email(1) | trimite o colecție de plasturi(corecții) prin poșta electronică din Git
`git-buildpackage` | V:1.2, I:7.1 | 2027 | git-buildpackage(1) | automatizează împachetarea Debian cu Git
`dgit` | V:0.2, I:1.0 | 738 | dgit(1) | interoperabilitatea git cu arhiva Debian
`imediff` | V:0.03, I:0.26 | 329 | git-ime(1) | instrument interactiv de ajutor pentru divizarea modificărilor comise în depozitul git
`stgit` | V:0.08, I:0.50 | 6181 | stg(1) | quilt peste git (Python)
`git-doc` | I:11 | 14896 | N/D | documentația oficială pentru Git
`gitmagic` | I:0.52 | 721 | N/D | „Git Magic”, ghid mai ușor de înțeles pentru Git

### 10.5.1. Configurarea clientului Git

Puteți specifica mai multe configurații globale în „`~/.gitconfig`”, cum ar fi numele și adresa dvs. de poștă electronică utilizate de Git, după cum urmează.

    $ git config --global user.name "Name Surname"
    $ git config --global user.email yourname@example.com

De asemenea, puteți personaliza comportamentul implicit al Git în felul următor.

    $ git config --global init.defaultBranch main
    $ git config --global pull.rebase true
    $ git config --global push.default current

Dacă sunteți prea obișnuit cu comenzile CVS sau Subversion, puteți crea mai multe alias de comenzi folosind următoarea comandă.

    $ git config --global alias.ci "commit -a"
    $ git config --global alias.co checkout

Puteți verifica configurația globală după cum urmează.

    $ git config --global --list

### 10.5.2. Comenzi Git de bază

Operarea cu Git implică mai multe date.

- Arborele de lucru care conține fișierele destinate utilizatorilor și în care efectuați modificări.

  - Modificările care trebuie înregistrate trebuie selectate în mod explicit și introduse în index. Acestea sunt comenzile `git add` și `git rm`.

- Indexul care conține fișierele stocate în etape.

  - Fișierele modificate într-o etapă vor fi înregistrate în depozitul local la următoarea solicitare. Aceasta este comanda `git commit`.

- Depozitul local care conține fișierele modificate.

  - Git înregistrează istoricul vinculat al datelor comise și le organizează ca ramuri în depozit.

  - Depozitul local poate trimite date către depozitul la distanță prin comanda `git push`.

  - Depozitul local poate primi date din depozitul de la distanță prin comenzile `git fetch` și `git pull`.

    - Comanda `git pull` execută comanda `git merge` sau `git rebase` după comanda `git fetch`.

    - Aici, `git merge` combină două ramuri separate ale istoricului la final într-un singur punct. (Aceasta este opțiunea implicită a `git pull` fără personalizare și poate fi utilă pentru persoanele din amonte care publică ramuri către multe persoane.)

    - Aici, `git rebase` creează o singură ramură a istoricului secvențial al ramurii la distanță unu, urmată de ramura locală unu. (Acesta este un caz de personalizare `pull.rebase true` și poate fi util pentru cei mai mulți dintre noi.)

- Depozitul de la distanță care conține fișierele cu modificările comise.

  - Comunicarea cu depozitul de la distanță utilizează protocoale de comunicare securizate, precum SSH sau HTTPS.

Arborele de lucru este format din fișierele din afara directorului `.git/`. Fișierele din directorul `.git/` conțin indexul, datele din depozitul local și câteva fișiere text de configurare pentru git.

Iată o prezentare generală a principalelor comenzi Git.

Tabel 10.12. Comenzile git principale

Comanda git | funcție
--- | ---
`git init` | creează depozitul (local)
`git clone URL` | clonează depozitul de la distanță într-un depozit local cu arborele de lucru
`git pull origin main` | actualizează ramura locală `main` cu ajutorul depozitului de la distanță `origin`
`git add .` | adaugă fișierul (fișierele) din arborele de lucru la index pentru fișierele preexistente numai în index
`git add -A .` | adaugă fișierul (fișierele) din arborele de lucru la index pentru toate fișierele, inclusiv cele eliminate
`git rm nume-fișier` | elimină fișierul (fișierele) din arborele de lucru și din index
`git commit` | comite modificările pregătite în index către depozitul local
`git commit -a` | adaugă toate modificările din arborele de lucru la index și le salvează în depozitul local (adaugă + salvează)
`git push -u origin branch_name` | actualizează depozitul de la distanță `origin` cu ramura locală `branch_name` (invocare inițială)
`git push origin branch_name` | actualizează depozitul de la distanță `origin` cu ramura locală `branch_name` (invocare ulterioară)
`git diff treeish1 treeish2` | afișează diferența dintre modificarea-comisă treeish1 și modificarea-comisă treeish2
`gitk` | afișează în interfața grafică arborele istoricului ramurilor din depozitul VCS

### 10.5.3. Sfaturi Git

Iată câteva sfaturi pentru Git.

Tabel 10.13. Sfaturi Git

Linia de comandă Git | funcție
--- | ---
`gitk --all` | arată istoricul complet Git și operează asupra lui, cum ar fi reinițializarea HEAD la o altă modificare-comisă, selectarea plasturilor(corecțiilor), crearea de etichete și ramuri ...
`git stash` | obține arborele de lucru curat fără a pierde date
`git remote -v` | verifică configurarea pentru depozitul de la distanță
`git branch -vv` | verifică configurarea pentru ramură
`git status` | afișează starea arborelui de lucru
`git config -l` | listează configurările git
`git reset --hard HEAD; git clean -x -d -f` | anulează toate modificările din arborele de lucru și le curăță complet
`git rm --cached nume-fișier` | anulează indexul etapizat modificat de `git add nume-fișier`
`git reflog` | obține jurnalul de referință (util pentru recuperarea modificărilor-comise din ramura eliminată)
`git branch new_branch_name HEAD@{6}` | creează o nouă ramură din informațiile jurnalului de referință
`git remote add new_remote URL` | adaugă un depozit la distanță `new_remote` indicat de URL
`git remote rename origin upstream` | redenumește numele depozitului de la distanță din `origin` în `upstream`
`git branch -u upstream/branch_name` | configurează urmărirea la distanță pentru depozitul de la distanță `upstream` și numele ramurii sale `branch_name`.
`git remote set-url origin https://foo/bar.git` | modifică adresa URL a `origin`
`git remote set-url --push upstream DISABLED` | dezactivează push către `upstream` (Editează `.git/config` pentru a reactiva)
`git remote update upstream` | preia actualizările tuturor ramurilor de la distanță din depozitul `upstream`
`git fetch upstream foo:upstream-foo` | creează o ramură locală (posibil orfană) `upstream-foo` ca copie a ramurii `foo` din depozitul `upstream`
`git checkout -b topic_branch ; git push -u topic_branch origin` | crează un nou `topic_branch` și îl introduce în `origin`
`git branch -m oldname newname` | redenumește numele ramurii locale
`git push -d origin branch_to_be_removed` | elimină ramura de la distanță (metodă nouă)
`git push origin :branch_to_be_removed` | elimină ramura de la distanță (metodă veche)
`git checkout --orphan unconnected` | creați o nouă ramură `neconectată`
`git rebase -i origin/main` | reordonează/șterge/comprimă modificările-comise din `origin/main` pentru a curăța istoricul ramurii
`git reset HEAD^; git commit --amend` | comprimă ultimele 2 modificări-comise într-una singură
`git checkout topic_branch ; git merge --squash topic_branch` | comprimă întregul `topic_branch` într-o modificare-comisă
`git fetch --unshallow --update-head-ok origin '+refs/heads/*:refs/heads/*'` | convertește o clonă superficială într-o clonă completă a tuturor ramurilor
`git ime` | împarte ultima modificare-comisă într-o serie de modificări-comise mai mici, fișier cu fișier etc. (este necesar pachetul `imediff`)
`git repack -a -d; git prune` | reîmpachetează depozitul local într-un singur pachet (acest lucru poate limita șansele de recuperare a datelor pierdute din ramura ștersă etc.)

| Avertisment
Nu utilizați șirul de etichete care conține spații, chiar dacă unele instrumente, cum ar fi gitk(1), vă permit să îl utilizați. Acesta poate bloca alte comenzi `git`.

| Atenție
Dacă o ramură locală care a fost introdusă în depozitul de la distanță este rebazată sau comprimată, introducerea acestei ramuri prezintă riscuri și necesită opțiunea `--force`. De obicei, acest lucru nu este acceptabil pentru ramura `main`, dar poate fi acceptabil pentru o ramură tematică înainte de fuzionarea cu ramura `main`.

| Atenție
Invocarea unei subcomenzi `git` direct ca „`git-xyz`” din linia de comandă a fost abandonată încă de la începutul anului 2006.

| Indicație
Dacă există un fișier executabil `git-foo` în ruta specificată de `$PATH`, introducerea „`git foo`” fără cratimă în linia de comandă invocă acest `git-foo`. Aceasta este o caracteristică a comenzii `git`.

### 10.5.4. Referințe Git

Consultați următoarele.

- pagina de manual: git(1) (`/usr/share/doc/git-doc/git.html`)

- Manualul utilizatorului git (`/usr/share/doc/git-doc/user-manual.html`)

- Un tutorial introductiv în git (`/usr/share/doc/git-doc/gittutorial.html`)

- Un tutorial introductiv în git - partea a doua (`/usr/share/doc/git-doc/gittutorial-2.html`)

- GIT de zi cu zi cu aproximativ 20 de comenzi (`/usr/share/doc/git-doc/giteveryday.html`)

- Magia Git (`/usr/share/doc/gitmagic/html/index.html`)

### 10.5.5. Alte sisteme de control al versiunii

Sistemele de control al versiunilor (VCS) sunt uneori cunoscute sub denumirea de sisteme de control al reviziilor (RCS) sau sisteme de gestionare a configurației software (SCM).

Iată un rezumat al celorlalte sisteme de control al versiunilor (VCS) notabile, altele decât Git, din sistemul Debian.

Tabel 10.14. Lista altor instrumente pentru sistemul de control al versiunilor

pachet | popcon(popularitate) | dimensiune | instrument | tipul de VCS | comentariu
--- | --- | --- | --- | --- | ---
`mercurial` | V:3, I:26 | 2575 | Mercurial | distribut | DCVS scris în Python și un pic în C
`darcs` | V:0.2, I:3.3 | 38856 | Darcs | distribut | DVCS cu algebră inteligentă a plasturilor/corecțiilor (lent)
`tla` | V:0.04, I:0.72 | 1022 | GNU arch | distribut | DVCS în principal de Tom Lord (istoric)
`bzr` | V:0.1, I:4.3 | 28 | GNU Bazaar | distribut | DVCS influențat de `tla` scris în Python (istoric)
`subversion` | V:10, I:57 | 4849 | Subversion | la distanță | „CVS făcut corect”, noul standard VCS la distanță (istoric)
`cvs` | V:3, I:25 | 4835 | CVS | la distanță | standardul anterior VCS la distanță (istoric)
`tkcvs` | V:0.12, I:0.88 | 34 | CVS, … | la distanță | interfață grafică de afișare a arborelui depozitului VCS (CVS, Subversion, RCS)
`rcs` | V:1.7, I:9.5 | 578 | RCS | local | "Unix SCCS bine făcut" (istoric)
`cssc` | V:0.01, I:0.35 | 2044 | CSSC | local | clonă de Unix SCCS (istoric)

[4] Un suport de stocare cu o singură scriere, cum ar fi CD/DVD-R, poate preveni accidentele de suprascriere. (Consultați Secțiune 9.8, „Datele binare” pentru a afla cum se scrie pe suportul de stocare din linia de comandă a shell-ului. Mediul grafic de birou GNOME vă oferă acces ușor prin meniu: „Locuri→Creator CD/DVD”.)

[5] Unele dintre aceste date nu pot fi regenerate introducând același șir de intrare în sistem.

[6] Dacă utilizați „`~/.vimrc`” în loc de „`~/.vim/vimrc`”, faceți înlocuirea corespunzătoare.

Cap. 9. Sfaturi privind sistemul |  | Cap. 11. Conversia datelor