Kapitel 10. Datahantering

# Kapitel 10. Datahantering

Verktyg och tips för att hantera binär- och textdata på Debian-systemet beskrivs.

## 10.1. Delning, kopiering och arkivering

| Varning
Okoordinerad skrivåtkomst till aktivt åtkomna enheter och filer från flera processer får inte göras för att undvika tävlingstillståndet. Fillåsningsmekanismer som använder flock(1) kan användas för att undvika detta.

Datasäkerheten och den kontrollerade delningen av data har flera aspekter.

- Skapande av dataarkiv

- Tillgång till fjärrlagring

- Dupliceringen

- Spårning av modifieringshistoriken

- Underlättande av datadelning

- Förhindrande av obehörig filåtkomst

- Detektering av obehörig filändring

Dessa kan realiseras genom att använda en kombination av olika verktyg.

- Verktyg för arkivering och komprimering

- Verktyg för kopiering och synkronisering

- Filsystem i nätverk

- Flyttbara lagringsmedier

- Det säkra skalet

- Systemet för autentisering

- Verktyg för versionshanteringssystem

- Hash- och kryptografiska krypteringsverktyg

### 10.1.1. Verktyg för arkivering och komprimering

Här följer en sammanfattning av de arkiv- och komprimeringsverktyg som finns tillgängliga i Debian-systemet.

Tabell 10.1. Lista över arkiv- och komprimeringsverktyg

paket | popcon | storlek | tillägg | kommando | kommentar
--- | --- | --- | --- | --- | ---
`tar` | V:908, I:1000 | 3085 | `.tar` | `tjära`(1) | standardarkiveraren (de facto-standard)
`cpio` | V:352, I:999 | 1201 | `.cpio` | cpio(1) | Unix System V-arkivering, använd med find(1)
`binutils` | V:190, I:640 | 1119 | `.ar` | ar(1) | arkiverare för skapande av statiska bibliotek
`fastjar` | V:1.0, I:9.6 | 182 | `.jar` | fastjar(1) | arkiveringsprogram för Java (zip-liknande)
`pax` | V:5.5, I:9.6 | 167 | `.pax` | pax(1) | ny POSIX-standardarkiverare, en kompromiss mellan `tar` och `cpio`
`gzip` | V:904, I:1000 | 256 | `.gz` | gzip(1), zcat(1), … | GNU LZ77 komprimeringsverktyg (de facto-standard)
`bzip2` | V:163, I:972 | 113 | `.bz2` | bzip2(1), bzcat(1), … | Burrows-Wheeler block-sorterande komprimeringsverktyg med högre komprimeringsgrad än gzip(1) (långsammare än `gzip` med liknande syntax)
`lzma` | V:1, I:10 | 349 | `.lzma` | lzma(1) | LZMA-komprimeringsverktyg med högre komprimeringsgrad än gzip(1) (föråldrad)
`xz-utils` | V:318, I:982 | 1520 | `.xz` | xz(1), xzdec(1), … | XZ-komprimeringsverktyg med högre komprimeringsgrad än bzip2(1) (långsammare än `gzip` men snabbare än `bzip2`; ersättning för LZMA-komprimeringsverktyg )
`zstd` | V:318, I:803 | 2309 | `.zstd` | zstd(1), zstdcat(1), … | Zstandard verktyg för snabb förlustfri komprimering
`p7zip` | V:6, I:198 | 8 | `.7z` | 7zr(1), p7zip(1) | 7-Zip filarkiveringsprogram med hög komprimeringsgrad(LZMA-komprimering)
`p7zip-full` | V:20, I:222 | 12 | `.7z` | 7z(1), 7za(1) | 7-Zip filarkiveringsprogram med hög komprimeringsgrad(LZMA-komprimering och andra)
`lzop` | V:12, I:134 | 164 | `.lzo` | lzop(1) | LZO-komprimeringsverktyg med högre komprimerings- och dekomprimeringshastighet än gzip(1) (lägre komprimeringsgrad än `gzip` med liknande syntax)
`zip` | V:49, I:361 | 627 | `.zip` | zip(1) | InfoZIP: DOS arkiv- och komprimeringsverktyg
`unzip` | V:110, I:749 | 387 | `.zip` | `packa upp`(1) | InfoZIP: DOS verktyg för avarkivering och dekomprimering

| Varning
Ange inte variabeln "`$TAPE`" om du inte vet vad du kan förvänta dig. Den ändrar tar(1):s beteende.

- Det gzippade tar(1)-arkivet använder filändelsen "`.tgz`" eller "`.tar.gz`".

- Det xz-komprimerade tar(1)-arkivet använder filändelsen "`.txz`" eller "`.tar.xz`".

- Populära komprimeringsmetoder i FOSS-verktyg som tar(1) har flyttats enligt följande: `gzip` → `bzip2` → `xz`

- cp(1), scp(1) och tar(1) kan ha vissa begränsningar för speciella filer. cpio(1) är mest mångsidig.

- cpio(1) är utformat för att användas med find(1) och andra kommandon och lämpar sig för att skapa backup-skript eftersom filvalsdelen av skriptet kan testas oberoende av varandra.

- Libreoffice-datafilernas interna struktur är "`.jar`"-filer som också kan öppnas med `unzip`.

- Det de facto plattformsoberoende arkivverktyget är `zip`. Använd det som "`zip -rX`" för att uppnå maximal kompatibilitet. Använd även alternativet "`-s`" om den maximala filstorleken är viktig.

### 10.1.2. Verktyg för kopiering och synkronisering

Här följer en sammanfattning av enkla kopierings- och säkerhetskopieringsverktyg som finns tillgängliga på Debian-systemet.

Tabell 10.2. Lista över kopierings- och synkroniseringsverktyg

paket | popcon | storlek | verktyg | funktion
--- | --- | --- | --- | ---
`coreutils` | V:911, I:1000 | 17994 | GNU cp | lokal kopiering av filer och kataloger ("-a" för rekursiv)
`openssh-client` | V:915, I:996 | 4210 | scp | fjärrkopiera filer och kataloger (klient, "`-r`" för rekursiv)
`openssh-server` | V:768, I:819 | 3359 | sshd | fjärrkopiera filer och kataloger (fjärrserver)
`rsync` | V:195, I:541 | 835 |  | 1-vägs fjärrsynkronisering och säkerhetskopiering
`unison` | V:3, I:12 | 14 |  | 2-vägs fjärrsynkronisering och säkerhetskopiering

Kopiering av filer med rsync(8) har fler funktioner än andra.

- delta-överföringsalgoritm som bara skickar skillnaderna mellan källfilerna och de befintliga filerna i destinationen

- algoritm för snabbkontroll (som standard) som letar efter filer som har ändrats i storlek eller i tid för senaste ändring

- "`--exclude`" och "`--exclude-from`" alternativ liknande tar(1)

- "ett efterföljande snedstreck på källkatalogen" syntax som undviker att skapa en ytterligare katalognivå på destinationen.

| Tips
Versionskontrollsystem (VCS)-verktyg i Tabell 10.14, ”Lista över andra verktyg för versionskontrollsystem” kan fungera som flervägskopierings- och synkroniseringsverktyg.

### 10.1.3. Idiom för arkivet

Här är flera sätt att arkivera och avarkivera hela innehållet i katalogen "`./source`" med hjälp av olika verktyg.

GNU tar(1):

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

Alternativt på följande sätt.

    $ 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. Idiom för kopian

Här är flera sätt att kopiera hela innehållet i katalogen "`./source`" med hjälp av olika verktyg.

- Lokal kopia: "Katalogen "`./source`" → katalogen "`/dest`

- Fjärrkopiering: "`./source`"-katalogen på den lokala värden → "`/dest`"-katalogen på värden "`user@host.dom"`

rsync(8):

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

Alternativt kan du använda syntaxen "ett efterföljande snedstreck på källkatalogen".

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

Alternativt på följande sätt.

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

GNU cp(1) och 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

Du kan ersätta "`.`" med "`foo`" för alla exempel som innehåller "`.`" för att kopiera filer från katalogen "`./source/foo`" till katalogen "`/dest/foo`".

Du kan ersätta "`.`" med den absoluta sökvägen "`/path/to/source/foo`" för alla exempel som innehåller "`.`" för att släppa "`cd ./source;`". Dessa kopierar filer till olika platser beroende på vilka verktyg som används enligt följande.

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

- "`/dest/path/to/source/foo`": GNU tar(1) och cpio(1)

| Tips
rsync(8) och GNU cp(1) har alternativet "`-u`" för att hoppa över filer som är nyare på mottagaren.

### 10.1.5. Idiom för urval av filer

find(1) används för att välja filer för arkiv- och kopieringskommandon (se Avsnitt 10.1.3, ”Idiom för arkivet” och Avsnitt 10.1.4, ”Idiom för kopian”) eller för xargs(1) (se Avsnitt 9.4.9, ”Upprepa ett kommando loopa över filer”). Detta kan förbättras genom att använda dess kommandoparametrar.

Den grundläggande syntaxen för find(1) kan sammanfattas enligt följande.

- Dess villkorliga argument utvärderas från vänster till höger.

- Denna utvärdering upphör när resultatet har fastställts.

- "Logisk OR" (anges med "`-o`" mellan villkor) har lägre prioritet än "logisk AND" (anges med "`-a`" eller inget mellan villkor).

- "Logisk NOT" (anges med "`!`" före ett villkor) har högre prioritet än "logisk AND".

- "`-prune`" returnerar alltid logisk TRUE och, om det är en katalog, stoppas sökningen av filen bortom denna punkt.

- "`-name`" matchar basen av filnamnet med shell glob (se Avsnitt 1.5.6, ”Skal glob”) men matchar även dess inledande "`.`" med metatecken som "`*`" och "`?`" (ny POSIX-funktion )

- "`-regex`" matchar hela sökvägen med BRE i emacs-stil (se Avsnitt 1.6.2, ”Vanliga uttryck”) som standard.

- "`-size`" matchar filen baserat på filstorleken (värdet föregås av "`+`" för större, föregås av "`-`" för mindre)

- "`-newer`" matchar den fil som är nyare än den som anges i dess argument.

- "`-print0`" returnerar alltid logisk TRUE och skriver ut det fullständiga filnamnet(nollavslutat) på standardutmatningen.

find(1) används ofta med en idiomatisk stil som följande.

    # 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

Detta innebär att göra följande åtgärder.

1. Sök alla filer som börjar från "`/path/to`"

2. Begränsar sin sökning globalt inom sitt startfilsystem och använder ERE (se Avsnitt 1.6.2, ”Vanliga uttryck”) istället

3. Utesluta filer som matchar regex av "`.*\.cpio`" eller "`.*~`" från sökning genom att stoppa bearbetning

4. Utesluta kataloger som matchar regex av "`.*/\.git`" från sökning genom att stoppa bearbetning

5. Uteslut filer som är större än 99 megabyte (enheter om 1048576 byte) från sökning genom att stoppa bearbetningen

6. Skriv ut filnamn som uppfyller ovanstående sökvillkor och är nyare än "`/path/to/timestamp`"

Observera den idiomatiska användningen av "`-prune -o`" för att utesluta filer i exemplet ovan.

| Notera
För icke-Debian Unix-liknande system kan det hända att vissa alternativ inte stöds av find(1). I sådana fall bör du överväga att justera matchningsmetoderna och ersätta "`-print0`" med "`-print`". Du kan också behöva justera relaterade kommandon.

### 10.1.6. Arkivmedia

När du väljer datalagringsmedia för viktiga dataarkiv bör du vara försiktig med deras begränsningar. För säkerhetskopiering av små personliga data använder jag CD-R och DVD-R från varumärkesföretaget och förvarar dem i en sval, skuggig, torr och ren miljö. (Bandarkivmedier verkar vara populära för professionellt bruk.)

| Notera
Ett brandsäkert kassaskåp är avsett för pappersdokument. De flesta datalagringsmedier har lägre temperaturtolerans än papper. Jag förlitar mig vanligtvis på flera säkra krypterade kopior som lagras på flera säkra platser.

Optimistisk lagringstid för arkivmedia som finns på nätet (mestadels från leverantörsinformation).

- 100+ år : Syrafritt papper med bläck

- 100 år : Optisk lagring (CD/DVD, CD/DVD-R)

- 30 år: Magnetisk lagring (band, diskett)

- 20 år: Optisk lagring med fasändring (CD-RW)

Här ingår inte mekaniska fel på grund av hantering etc.

Optimistisk skrivcykel för arkivmedia som finns på nätet (mestadels från leverantörsinformation).

- 250.000+ cykler : Hårddisk-enhet

- 10.000+ cykler : Flashminne

- 1.000 cykler : CD/DVD-RW

- 1 cykler : CD/DVD-R, papper

| Observera
Siffrorna för lagringstid och skrivcykel bör inte användas för att fatta beslut om kritisk datalagring. Se den specifika produktinformation som tillhandahålls av tillverkaren.

| Tips
Eftersom CD/DVD-R och papper endast har 1 skrivcykel, förhindrar de i sig oavsiktlig dataförlust genom överskrivning. Detta är en fördel!

| Tips
Om du behöver snabb och frekvent säkerhetskopiering av stora datamängder kan en hårddisk på en fjärrdator som är kopplad till en snabb nätverksanslutning vara det enda realistiska alternativet.

| Tips
Om du använder återskrivbara media för dina säkerhetskopior kan det vara en bra idé att använda filsystem som btrfs eller zfs som stöder skrivskyddade ögonblicksbilder.

### 10.1.7. Flyttbar lagringsenhet

Flyttbara lagringsenheter kan vara något av följande.

- USB-minne

- Hårddisk

- Optisk skivenhet

- Digitalkamera

- Digital musikspelare

De kan anslutas via något av följande.

- USB

- IEEE 1394 / FireWire

- PC-kort

Moderna skrivbordsmiljöer som GNOME och KDE kan montera dessa flyttbara enheter automatiskt utan en matchande "`/etc/fstab`"-post.

- paketet `udisks2` tillhandahåller en daemon och tillhörande verktyg för att montera och avmontera dessa enheter.

- D-bus skapar händelser för att starta automatiska processer.

- PolicyKit ger nödvändiga behörigheter.

| Tips
Automountade enheter kan ha monteringsalternativet "`uhelper=`" som används av umount(8).

| Tips
Automounting under modern skrivbordsmiljö sker endast när dessa flyttbara mediaenheter inte är listade i "`/etc/fstab`".

Monteringspunkten under modern skrivbordsmiljö väljs som "`/media/användarnamn/disk_label`" som kan anpassas enligt följande.

- mlabel(1) för FAT-filsystem

- genisoimage(1) med alternativet "`-V`" för ISO9660-filsystem

- tune2fs(1) med alternativet "`-L`" för filsystemet ext2/ext3/ext4

| Tips
Valet av kodning kan behöva tillhandahållas som monteringsalternativ (se Avsnitt 8.1.3, ”Kodning av filnamn”).

| Tips
Om du använder GUI-menyn för att avmontera ett filsystem kan det hända att dess dynamiskt genererade enhetsnod, t.ex. "`/dev/sdc`", tas bort. Om du vill behålla enhetsnoden kan du avmontera den med kommandot umount(8) från skalprompten.

### 10.1.8. Val av filsystem för delning av data

När du delar data med ett annat system via en flyttbar lagringsenhet bör du formatera den med ett gemensamt filsystem som stöds av båda systemen. Här är en lista över filsystem som kan väljas.

| Notera
Statements on hard disk (HDD) are applicable to other storage devices such as SSD / USB flash drive / Memory card / ... . Replace device names in examples such as `/dev/sda` with applicable device names `/dev/nvme0`, `/dev/mmcblk0`, ... .

Tabell 10.3. Lista över filsystemval för flyttbara lagringsenheter med typiska användningsscenarier

filsystemets namn | typiskt användningsscenario
--- | ---
FAT12 | plattformsoberoende delning av data på disketten (<32MiB)
FAT16 | plattformsoberoende delning av data på en liten hårddiskliknande enhet (2 Gb)
FAT32 | plattformsoberoende delning av data på en stor hårddiskliknande enhet (<8TiB, stöds av nyare än MS Windows95 OSR2)
exFAT | plattformsoberoende delning av data på den stora hårddisken som enhet (512TiB, stöds av WindowsXP, Mac OS X Snow Leopard 10.6.5 och Linux-kärnan sedan 5.4 release)
NTFS | plattformsoberoende delning av data på den stora hårddiskliknande enheten (stöds inbyggt i MS Windows NT och senare versioner, och stöds av NTFS-3G via FUSE på Linux)
ISO9660 | plattformsoberoende delning av statiska data på CD-R och DVD+/-R
UDF | inkrementell dataskrivning på CD-R och DVD+/-R (ny)
MINIX | utrymmeseffektiv lagring av unix-fildata på disketten
ext2 | delning av data på hårddisken som enhet med äldre Linux-system
ext3 | delning av data på hårddisken som enhet med äldre Linux-system
ext4 | delning av data på hårddisken som enhet med nuvarande Linux-system
btrfs | delning av data på hårddisken som enhet med nuvarande Linux-system med skrivskyddade ögonblicksbilder

| Tips
Se Avsnitt 9.9.1, ”Kryptering av flyttbara diskar med dm-crypt/LUKS” för plattformsoberoende delning av data med hjälp av kryptering på enhetsnivå.

FAT-filsystemet stöds av nästan alla moderna operativsystem och är mycket användbart för datautbyte via flyttbara hårddiskliknande media.

Vid formatering av flyttbara hårddiskar som enheter för plattformsoberoende delning av data med FAT-filsystemet bör följande vara säkra val.

- Partitionera dem med fdisk(8), cfdisk(8) eller parted(8) (se Avsnitt 9.6.2, ”Konfiguration av diskpartitioner”) till en enda primär partition och markera den på följande sätt.

  - Skriv "6" för FAT16 för media som är mindre än 2 GB.

  - Skriv "c" för FAT32 (LBA) för större media.

- Formatera den primära partitionen med mkfs.vfat(8) med följande.

  - Bara enhetsnamnet, t.ex. "`/dev/sda1`" för FAT16

  - Det uttryckliga alternativet och dess enhetsnamn, t.ex. "`-F 32 /dev/sda1`" för FAT32

När du använder FAT- eller ISO9660-filsystemen för att dela data bör du tänka på följande.

- Arkivera filer i en arkivfil först med tar(1) eller cpio(1) för att behålla det långa filnamnet, den symboliska länken, den ursprungliga Unix-filbehörigheten och ägarinformationen.

- Dela upp arkivfilen i bitar på mindre än 2 GiB med kommandot split(1) för att skydda den från filstorleksbegränsningen.

- Kryptering av arkivfilen för att skydda dess innehåll från obehörig åtkomst.

| Notera
För FAT-filsystem är den maximala filstorleken `(2^32 - 1) byte = (4GiB - 1 byte)`. För vissa program på det äldre 32-bitars operativsystemet var den maximala filstorleken ännu mindre `(2^31 - 1) byte = (2GiB - 1 byte)`. Debian lider inte av det senare problemet.

| Notera
Microsoft rekommenderar inte att FAT används för enheter eller partitioner som är större än 200 MB. Microsoft belyser dess brister, t.ex. ineffektiv användning av diskutrymme, i sin"Översikt över FAT-, HPFS- och NTFS-filsystem". Naturligtvis bör vi normalt använda ext4-filsystemet för Linux.

| Tips
Mer information om filsystem och åtkomst till filsystem finns i"Filesystems HOWTO".

### 10.1.9. Delning av data via nätverk

När du delar data med andra system via nätverket bör du använda en gemensam tjänst. Här är några tips.

Tabell 10.4. Lista över de nätverkstjänster som ska väljas med det typiska användningsscenariot

nätverkstjänst | beskrivning av typiskt användningsscenario
--- | ---
SMB/CIFS nätverksmonterat filsystem med Samba | dela filer via "Microsoft Windows Network", se smb.conf(5) och The Official Samba 3.x.x HOWTO and Reference Guide eller paketet `samba-doc`
NFS nätverksmonterat filsystem med Linux-kärnan | dela filer via "Unix/Linux Network", se exports(5) och Linux NFS-HOWTO
HTTP-tjänst | dela filer mellan webbserver/klient
HTTPS-tjänst | fildelning mellan webbserver/klient med krypterad Secure Sockets Layer (SSL) eller Transport Layer Security (TLS)
FTP-tjänst | dela filer mellan FTP-server/klient

Även om dessa filsystem som monteras över nätverket och filöverföringsmetoder över nätverket är ganska praktiska för att dela data, kan de vara osäkra. Deras nätverksanslutning måste säkras på följande sätt.

- Kryptera den med SSL/TLS

- Tunnla den via SSH

- Tunnla den via VPN

- Begränsa det bakom den säkra brandväggen

Se även Avsnitt 6.5, ”Andra nätverksapplikationsservrar” och Avsnitt 6.6, ”Andra klienter för nätverksapplikationer”.

## 10.2. Backup och återställning

Vi vet alla att datorer ibland går sönder eller att mänskliga fel orsakar skador på system och data. Säkerhetskopiering och återställning är en viktig del av en framgångsrik systemadministration. Alla möjliga felsituationer drabbar dig en dag.

| Tips
Håll ditt backupsystem enkelt och gör backup ofta. Att ha backup-data är viktigare än hur tekniskt bra din backup-metod är.

### 10.2.1. Policy för säkerhetskopiering och återställning

Det finns tre nyckelfaktorer som avgör den faktiska policyn för säkerhetskopiering och återställning.

1. Att veta vad man ska säkerhetskopiera och återställa.

   - Datafiler som skapats direkt av dig: data i "`~/`"

   - Datafiler som skapats av program som du använder: data i "`/var/`" (utom "`/var/cache/`", "`/var/run/`" och "`/var/tmp/`")

   - Systemkonfigurationsfiler: data i "`/etc/`"

   - Lokala program: data i "`/usr/local/`" eller "`/opt/`"

   - Information om systeminstallation: ett memo i klartext om viktiga steg (partition, ...)

   - Bevisad uppsättning data: bekräftad genom experimentella återvinningsoperationer i förväg

     - Cron-jobb som en användarprocess: filer i katalogen "`/var/spool/cron/crontabs`" och starta om cron(8). Se Avsnitt 9.4.14, ”Regelbunden schemaläggning av arbetsuppgifter” för cron(8) och crontab(1).

     - Systemd-timerjobb som användarprocesser: filer i katalogen "`~/.config/systemd/user`". Se systemd.timer(5) och systemd.service(5).

     - Autostarta jobb som användarprocesser: filer i katalogen "`~/.config/autostart`". Se Specifikation för autostart av skrivbordsprogram.

2. Att veta hur man säkerhetskopierar och återställer.

   - Säker lagring av data: skydd mot överskrivning och systemfel

   - Frekvent säkerhetskopiering: schemalagd säkerhetskopiering

   - Redundant säkerhetskopiering: dataspegling

   - En idiotsäker process: enkel backup med ett enda kommando

3. Bedömning av risker och kostnader.

   - Risk för att data går förlorade

     - Data bör åtminstone finnas på olika diskpartitioner, helst på olika diskar och maskiner för att motstå korruption i filsystemet. Viktiga data lagras bäst på ett skrivskyddat filsystem. [4]

   - Risk för dataintrång

     - Känsliga identitetsdata som "`/etc/ssh/ssh_host_*_key`", "`~/.gnupg/*`", "~/`.ssh/*`", "~/`.local/share/keyrings/*`", "`/etc/passwd`", "`/etc/shadow`", "`popularity-contest.conf`", "`/etc/ppp/pap-secrets`" och "`/etc/exim4/passwd.client`" bör säkerhetskopieras som krypterade. [5] (Se Avsnitt 9.9, ”Tips om datakryptering”.)

     - Hårdkoda aldrig lösenordet för systeminloggning eller lösenfrasen för dekryptering i något skript, inte ens på ett betrott system. (Se Avsnitt 10.3.6, ”Nyckelring för lösenord”.)

   - Felfunktioner och deras möjligheter

     - Hårdvaran (särskilt hårddisken) går sönder

     - Filsystemet kan skadas och data i det kan gå förlorade

     - Fjärrlagringssystem är inte tillförlitligt när det gäller säkerhetsöverträdelser

     - Svagt lösenordsskydd kan lätt avslöjas

     - Filbehörighetssystemet kan ha äventyrats

   - Resurser som krävs för backup: personal, hårdvara, mjukvara, …

     - Automatisk schemalagd säkerhetskopiering med cron-jobb eller systemd-timerjobb

| Tips
Du kan återställa debconf-konfigurationsdata med "`debconf-set-selections deb`conf-selections" och dpkg-urvalsdata med "dpkg`--set-selection <dpkg-selections.list`".

| Notera
Säkerhetskopiera inte innehållet i pseudofilsystemet som finns i `/proc`, `/sys`, `/tmp` och `/run` (se Avsnitt 1.2.12, ”procfs och sysfs” och Avsnitt 1.2.13, ”tmpfs”). Om du inte vet exakt vad du gör är det enorma mängder värdelös data.

| Notera
Du kanske vill stoppa vissa applikationsdaemons, t.ex. MTA (se Avsnitt 6.2.4, ”Transportagent för post (MTA)”), medan du säkerhetskopierar data.

### 10.2.2. Verktygssviter för säkerhetskopiering

Här är en utvald lista över viktiga säkerhetskopieringsprogram som finns tillgängliga i Debian-systemet.

Tabell 10.5. Lista över verktyg för säkerhetskopiering

paket | popcon | storlek | beskrivning
--- | --- | --- | ---
`bacula-common` | V:6.3, I:7.2 | 2501 | Bacula: säkerhetskopiering, återställning och verifiering av nätverk - vanliga supportfiler
`bacula-client` | V:0.3, I:1.9 | 199 | Bacula: säkerhetskopiering, återställning och verifiering av nätverk - metapaket för klienter
`bacula-console` | V:0.7, I:2.1 | 112 | Bacula: säkerhetskopiering, återställning och verifiering av nätverk - textkonsol
`bacula-server` | I:0.60 | 199 | Bacula: säkerhetskopiering, återställning och verifiering av nätverk - metapaket för server
`amanda-common` | V:0.6, I:2.2 | 9851 | Amanda: Avancerad Maryland automatisk nätverksdiskarkivering (Libs)
`amanda-client` | V:0.6, I:2.2 | 1099 | Amanda: Avancerad Maryland automatisk nätverksdiskarkivering (klient)
`amanda-server` | V:0.11, I:0.23 | 1093 | Amanda: Avancerad Maryland automatisk nätverksdiskarkivering (server)
`backuppc` | V:1.4, I:1.7 | 3088 | BackupPC är ett högpresterande, företagsklassat system för säkerhetskopiering av datorer (diskbaserad)
`duplicity` | V:6, I:47 | 2670 | (fjärr-)inkrementell säkerhetskopiering
`deja-dup` | V:29, I:43 | 5274 | GUI-frontend för duplicity
`borgbackup` | V:13, I:28 | 3485 | (fjärr)deduplicerande säkerhetskopiering
`borgmatic` | V:3.2, I:4.4 | 946 | borgbackup-hjälpare
`rdiff-backup` | V:2.3, I:6.6 | 1207 | (fjärr-)inkrementell säkerhetskopiering
`restic` | V:6, I:12 | 41560 | (fjärr-)inkrementell säkerhetskopiering
`backupninja` | V:2.2, I:2.6 | 360 | lättviktigt, utbyggbart meta-backup-system
`slbackup` | V:0.11, I:0.13 | 147 | (fjärr-)inkrementell säkerhetskopiering
`backup-manager` | V:0.43, I:0.77 | 573 | kommandoradsverktyg för säkerhetskopiering
`backup2l` | V:0.38, I:0.53 | 110 | verktyg för säkerhetskopiering/återställning med lågt underhåll för monterbara medier (diskbaserade)

Backup-verktyg har sina specialiserade fokusområden.

- Mondo Rescue är ett backup-system som gör det möjligt att snabbt återställa hela systemet från backup-CD/DVD etc. utan att gå igenom normala systeminstallationsprocesser.

- Bacula, Amanda och BackupPC är fullfjädrade verktyg för säkerhetskopiering som är inriktade på regelbundna säkerhetskopior över nätverk.

- Duplicity och Borg är enklare backup-verktyg för vanliga arbetsstationer.

### 10.2.3. Tips för säkerhetskopiering

För en personlig arbetsstation kan fullfjädrade verktyg för säkerhetskopiering som är utformade för servermiljön inte fungera bra. Samtidigt kan befintliga verktyg för säkerhetskopiering för arbetsstationer ha vissa brister.

Här är några tips för att göra säkerhetskopiering enklare med minimala användarinsatser. Dessa tekniker kan användas med alla verktyg för säkerhetskopiering.

I demonstrationssyfte antar vi att den primära användaren och gruppnamnet är `pingvin` och skapar ett exempel på skript för säkerhetskopiering och ögonblicksbild "`/usr/local/bin/bkss.sh`" som:

    #!/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!"

Här används endast det grundläggande verktyget rsync(1) för att underlätta säkerhetskopiering av systemet och lagringsutrymmet utnyttjas effektivt av Btrfs.

| Tips
FYI: Den här författaren använder sitt eget liknande skalskript"bss: Btrfs Subvolume Snapshot Utility" för sin arbetsstation.

#### 10.2.3.1. Grafiskt gränssnitt för säkerhetskopiering

Här är ett exempel på hur du konfigurerar säkerhetskopiering med ett enda GUI-klick.

- Förbered en USB-lagringsenhet som ska användas för säkerhetskopiering.

  - Formatera en USB-lagringsenhet med en partition i btrfs med dess etikettnamn som "`BKUP`". Detta kan krypteras (se Avsnitt 9.9.1, ”Kryptering av flyttbara diskar med dm-crypt/LUKS”).

  - Koppla in den här till ditt system. Skrivbordssystemet bör automatiskt montera den som "`/media/penguin/BKUP`".

  - Kör "`sudo chown penguin:penguin /media/penguin/BKUP`" för att göra den skrivbar för användaren.

- Skapa "`~/.local/share/applications/BKUP.desktop`" enligt de tekniker som beskrivs i Avsnitt 9.4.10, ”Starta ett program från GUI” som:

      [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

För varje GUI-klick säkerhetskopieras dina data från "`~/Documents`" till en USB-lagringsenhet och en skrivskyddad ögonblicksbild skapas.

#### 10.2.3.2. Montera händelsestyrd säkerhetskopiering

Här är ett exempel på inställning för automatisk säkerhetskopiering som utlöses av mount-händelsen.

- Förbered en USB-lagringsenhet som ska användas för säkerhetskopiering enligt Avsnitt 10.2.3.1, ”Grafiskt gränssnitt för säkerhetskopiering”.

- Skapa en systemd service unit-fil "`~/.config/systemd/user/back-BKUP.service`" som:

      [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

- Aktivera denna systemd-enhetskonfiguration med följande:

       $ systemctl --user enable bkup-BKUP.service

För varje mount-händelse säkerhetskopieras dina data från "`~/Documents`" till en USB-lagringsenhet och en skrivskyddad ögonblicksbild skapas.

Här kan namn på systemd-monteringsenheter som systemd för närvarande har i minnet frågas till servicehanteraren för den anropande användaren med "`systemctl --user list-units --type=mount`".

#### 10.2.3.3. Timerhändelseutlöst säkerhetskopiering

Här är ett exempel på inställning för automatisk säkerhetskopiering som utlöses av timerhändelsen.

- Förbered en USB-lagringsenhet som ska användas för säkerhetskopiering enligt Avsnitt 10.2.3.1, ”Grafiskt gränssnitt för säkerhetskopiering”.

- Skapa en systemd timer unit-fil "`~/.config/systemd/user/snap-Documents.timer`" som:

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

      [Timer]
      OnStartupSec=30
      OnUnitInactiveSec=900

      [Install]
      WantedBy=timers.target

- Skapa en systemd service unit-fil "`~/.config/systemd/user/snap-Documents.service`" som:

      [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

- Aktivera denna systemd-enhetskonfiguration med följande:

       $ systemctl --user enable snap-Documents.timer

För varje timerhändelse säkerhetskopieras dina data från "`~/Documents`" till en USB-lagringsenhet och en skrivskyddad ögonblicksbild skapas.

Här kan namn på systemd-timeranvändarenheter som systemd för närvarande har i minnet frågas till servicehanteraren för den anropande användaren med "`systemctl --user list-units --type=timer`".

För moderna skrivbordssystem kan systemd erbjuda mer finkornig kontroll än de traditionella Unix-metoderna med at(1), cron(8) eller anacron(8).

## 10.3. Infrastruktur för datasäkerhet

Infrastrukturen för datasäkerhet utgörs av en kombination av datakrypteringsverktyg, verktyg för sammanställning av meddelanden och signaturverktyg.

Tabell 10.6. Lista över infrastrukturverktyg för datasäkerhet

paket | popcon | storlek | kommando | beskrivning
--- | --- | --- | --- | ---
`gnupg` | V:398, I:867 | 464 | gpg(1) | GNU Privacy Guard - verktyg för kryptering och signering med OpenPGP
`gpgv` | V:234, I:939 | 555 | gpgv(1) | GNU Privacy Guard - verktyg för signaturverifiering OpenPGP
`sq` | V:1, I:27 | 23948 | sq(1) | Sequoia-PGP - verktyg för kryptering och signering med OpenPGP
`sqv` | V:416, I:487 | 1702 | sqv(1) | Sequoia-PGP - verktyg för signaturverifiering OpenPGP
`paperkey` | V:1, I:13 | 58 | pappersnyckel(1) | extrahera bara den hemliga informationen ur OpenPGP:s hemliga nycklar
`cryptsetup` | V:35, I:78 | 462 | cryptsetup(8), … | verktyg för dm-crypt blockenhetskryptering med stöd för LUKS
`coreutils` | V:911, I:1000 | 17994 | md5sum(1) | beräkna och kontrollera MD5-meddelandesammanställning
`coreutils` | V:911, I:1000 | 17994 | sha1sum(1) | beräkna och kontrollera SHA1-meddelandesammanställning
`openssl` | V:847, I:996 | 2532 | `openssl(1ssl`) | beräkna meddelandesammanställning med "`openssl dgst`" (OpenSSL)
`libsecret-tools` | V:1, I:11 | 45 | `hemligt verktyg`(1) | lagra och hämta lösenord (CLI)
`seahorse` | V:75, I:261 | 7971 | `sjöhäst`(1) | verktyg för nyckelhantering (GNOME)

Se Avsnitt 9.9, ”Tips om datakryptering” om dm-crypt och fscrypt som implementerar infrastruktur för automatisk datakryptering via Linux-kärnmoduler.

### 10.3.1. Nyckelhantering för GnuPG

Här följer GNU Privacy Guard-kommandon för grundläggande nyckelhantering.

Tabell 10.7. Lista över GNU Privacy Guard-kommandon för nyckelhantering

kommando | beskrivning
--- | ---
`gpg --gen-key` | skapa en ny nyckel
`gpg --gen-revoke min_användare_ID` | generera nyckel för återkallande för my_user_ID
`gpg --edit-key användare_ID` | redigera tangenten interaktivt, "hjälp" för hjälp
`gpg -o file --export` | export all public keys to file
`gpg -o file --export-secret-keys` | export all private key to file
`gpg --import file` | importera alla nycklar från filen
`gpg --send-keys user_ID` | skicka nyckeln för user_ID till keyserver
`gpg --recv-keys user_ID` | hämta nyckel till user_ID från keyserver
`gpg --list-keys user_ID` | lista nycklar för user_ID
`gpg --list-sigs användare_ID` | lista sig. för user_ID
`gpg --check-sigs användare_ID` | kontrollera sig. av user_ID
`gpg --fingerprint user_ID` | kontrollera fingeravtryck för user_ID
`gpg --refresh-keys` | uppdatera lokal nyckelring

Här är innebörden av förtroendekoden.

Tabell 10.8. Förteckning över innebörden av förtroendekoden

kod | beskrivning av stiftelsen
--- | ---
`-` | ingen ägartrust tilldelad / ännu inte beräknad
`e` | beräkning av förtroende misslyckades
`q` | inte tillräckligt med information för beräkning
`n` | lita aldrig på den här nyckeln
`m` | marginellt pålitlig
`f` | fullt betrodd
`u` | slutligen betrodda

The following generates my key "`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]

Följande laddar upp min nyckel "`9563FC29932C409F1A77F9C1AB8A1522D8234C6A`" till den populära nyckelservern "`hkp://keys.gnupg.net`".

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

En bra standardnyckelserver i "`~/.gnupg/gpg.conf`" (eller den gamla platsen "~/`.gnupg/options`") innehåller följande.

    keyserver hkp://keys.gnupg.net

Följande hämtar okända nycklar från nyckelservern.

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

Det fanns en bugg i OpenPGP Public Key Server (före version 0.9.6) som skadade nycklar med fler än 2 undernycklar. Det nyare paketet `gnupg` (>1.2.1-2) kan hantera dessa skadade undernycklar. Se gpg(1) under alternativet "`--repair-pks-subkey-bug`".

Use of SHA-1 for hash has been deprecated. If your old RSA based openPGP key uses SHA-1 for hash, fix it using FixKeyWithSha1.

| Tips
The sq(1) and sqv(1) commands are an alternative set of openPGP commands. See sq user documentation and A Practical Introduction to using sq, Sequoia PGP’s CLI.

### 10.3.2. Använda GnuPG på filer

Här följer exempel på hur du använder GNU Privacy Guard-kommandon på filer.

Tabell 10.9. Lista över GNU Privacy Guard-kommandon på filer

kommando | beskrivning
--- | ---
`gpg -a -s fil` | konvertera filen till ASCII armored file.asc
`gpg --armor --sign fil` | , ,
`gpg --clearsign file` | tydligt budskap
`gpg --clearsign file|mail foo@example.org` | skicka ett i klartext signerat meddelande till `foo@exempel.se`
`gpg --clearsign --not-dash-escaped patchfile` | klar-sign patchfile
`gpg --verify file` | verifiera klar-signerad fil
`gpg -o file.sig -b file` | skapa fristående signatur
`gpg -o file.sig --detach-sign file` | , ,
`gpg --verify file.sig file` | verifiera filen med file.sig
`gpg -o crypt_file.gpg -r namn -e fil` | kryptering med öppen nyckel avsedd för namn från fil till binär crypt_file.gpg
`gpg -o crypt_file.gpg --recipient name --encrypt file` | , ,
`gpg -o crypt_file.asc -a -r name -e file` | kryptering med öppen nyckel avsedd för namn från fil till ASCII-armored crypt_file.asc
`gpg -o crypt_file.gpg -c file` | symmetrisk kryptering från fil till crypt_file.gpg
`gpg -o crypt_file.gpg --symmetric file` | , ,
`gpg -o crypt_file.asc -a -c file` | symmetrisk kryptering avsedd för namn från fil till ASCII armerad crypt_file.asc
`gpg -o file -d crypt_file.gpg -r name` | dekryptering
`gpg -o file --decrypt crypt_file.gpg` | , ,

### 10.3.3. Använda GnuPG med Mutt

Lägg till följande i "`~/.muttrc`" för att förhindra att en långsam GnuPG startar automatiskt, samtidigt som den kan användas genom att skriva "`S`" på indexmenyn.

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

### 10.3.4. Använda GnuPG med Vim

Med insticksprogrammet `gnupg` kan du köra GnuPG transparent för filer med tillägg "`.gpg`", "`.asc`" och "`.pgp`".[6]

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

### 10.3.5. MD5-summan

md5sum(1) är ett verktyg för att skapa en digest-fil med hjälp av metoden i rfc1321 och verifiera varje fil med den.

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

| Notera
Beräkningen av MD5-summan är mindre CPU-intensiv än beräkningen av den kryptografiska signaturen med GNU Privacy Guard (GnuPG). Vanligtvis signeras endast den översta digestfilen kryptografiskt för att säkerställa dataintegriteten.

### 10.3.6. Nyckelring för lösenord

I GNOME-systemet hanterar GUI-verktyget seahorse(1) lösenord och lagrar dem säkert i nyckelringen `~/.local/share/keyrings/*`.

secret-tool(1) kan lagra lösenord till nyckelringen från kommandoraden.

Let's store lösenfras som används för LUKS/dm-crypt-krypterad diskavbildning

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

Detta lagrade lösenord kan hämtas och matas till andra program, t.ex. 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

| Tips
När du behöver ange lösenord i ett skript ska du använda `secret-tool` och undvika att direkt hårdkoda lösenfrasen i det.

## 10.4. Verktyg för sammanfogning av källkod

Det finns många sammanfogningsverktyg för källkoden. Följande kommandon fångade mina ögon.

Tabell 10.10. Lista över verktyg för sammanfogning av källkod

paket | popcon | storlek | kommando | beskrivning
--- | --- | --- | --- | ---
`patch` | V:103, I:726 | 242 | patch(1) | tillämpa en diff-fil på ett original
`vim` | V:85, I:347 | 4135 | vimdiff(1) | jämföra 2 filer sida vid sida i vim
`imediff` | V:0.03, I:0.26 | 329 | imediff(1) | interaktivt fullskärmsverktyg för 2/3-vägs sammanslagning
`meld` | V:5, I:24 | 3992 | meld(1) | jämföra och sammanfoga filer (GTK)
`wiggle` | V:0.01, I:0.12 | 175 | vicka(1) | tillämpa avvisade korrigeringar
`diffutils` | V:896, I:998 | 1768 | diff(1) | jämföra filer rad för rad
`diffutils` | V:896, I:998 | 1768 | diff3(1) | jämför och sammanfogar tre filer rad för rad
`quilt` | V:2, I:17 | 880 | quilt(1) | hantera serier av korrigeringar
`wdiff` | V:6, I:40 | 651 | wdiff(1) | visa ordskillnader mellan textfiler
`diffstat` | V:9, I:98 | 79 | diffstat(1) | producera ett histogram av förändringar av diff
`patchutils` | V:11, I:97 | 269 | kombineradiff(1) | skapa en kumulativ patch från två inkrementella patchar
`patchutils` | V:11, I:97 | 269 | dehtmldiff(1) | extrahera en diff från en HTML-sida
`patchutils` | V:11, I:97 | 269 | filterdiff(1) | extrahera eller exkludera diffar från en diff-fil
`patchutils` | V:11, I:97 | 269 | fixcvsdiff(1) | åtgärda diff-filer skapade av CVS som patch(1) tolkar fel
`patchutils` | V:11, I:97 | 269 | flipdiff(1) | byta ordning på två lappar
`patchutils` | V:11, I:97 | 269 | grepdiff(1) | visa vilka filer som har ändrats av en patch som matchar en regex
`patchutils` | V:11, I:97 | 269 | interdiff(1) | visa skillnader mellan två enhetliga diff-filer
`patchutils` | V:11, I:97 | 269 | lsdiff(1) | visa vilka filer som ändras av en patch
`patchutils` | V:11, I:97 | 269 | recountdiff(1) | räkna om räkningar och förskjutningar i enhetliga sammanhang diffs
`patchutils` | V:11, I:97 | 269 | rediff(1) | fixa offsets och counts för en handredigerad diff
`patchutils` | V:11, I:97 | 269 | splitdiff(1) | separera ut inkrementella korrigeringar
`patchutils` | V:11, I:97 | 269 | `packa uppdiff`(1) | demanglera lappar som har blivit inplastade med ord
`dirdiff` | V:0.1, I:1.4 | 167 | dirdiff(1) | visa skillnader och slå samman ändringar mellan katalogträd
`docdiff` | V:0.03, I:0.25 | 554 | docdiff(1) | jämför två filer ord för ord / tecken för tecken
`makepatch` | V:0.02, I:0.16 | 99 | makepatch(1) | generera utökade patchfiler
`makepatch` | V:0.02, I:0.16 | 99 | `applicera patch`(1) | tillämpa utökade patchfiler

### 10.4.1. Extrahera skillnader för källfiler

Följande procedurer extraherar skillnader mellan två källfiler och skapar enhetliga diff-filer "`file.patch0`" eller "file`.patch1`" beroende på filens plats.

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

### 10.4.2. Sammanslagning av uppdateringar för källfiler

Diff-filen (alternativt kallad patch-fil) används för att skicka en programuppdatering. Den mottagande parten tillämpar denna uppdatering på en annan fil på följande sätt.

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

### 10.4.3. Interaktiv sammanslagning

Om du har två versioner av en källkod kan du utföra 2-vägs sammanslagning interaktivt med hjälp av imediff(1) på följande sätt.

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

Om du har tre versioner av en källkod kan du utföra 3-vägs sammanslagning interaktivt med hjälp av imediff(1) på följande sätt.

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

## 10.5. Git

Git är idag det självklara verktyget för versionshanteringssystem (VCS) eftersom Git kan göra allt för både lokal och fjärransluten källkodshantering.

Debian tillhandahåller kostnadsfria Git-tjänster via Debian Salsa-tjänsten. Dess dokumentation finns på https://wiki.debian.org/Salsa.

Här är några Git-relaterade paket.

Tabell 10.11. Lista över git-relaterade paket och kommandon

paket | popcon | storlek | kommando | beskrivning
--- | --- | --- | --- | ---
`git` | V:406, I:616 | 50972 | git(7) | Git, det snabba, skalbara och distribuerade systemet för revisionskontroll
`gitk` | V:4, I:27 | 2022 | gitk(1) | GUI Git-repository-webbläsare med historik
`qgit` | V:0.2, I:2.0 | 1431 | qgit(1) | GUI Git-repository-webbläsare med historik
`git-cola` | V:0.7, I:4.6 | 5005 | git-cola(1) | GUI Git-repository-webbläsare med historik
`tig` | V:2, I:12 | 1243 | tig(1) | console Git repository browser with history
`lazygit` | V:0.9, I:3.6 | 24167 | lazygit(1) | console Git repository browser with history
`git-gui` | V:1, I:17 | 2525 | git-gui(1) | GUI för Git (Ingen historik)
`git-email` | V:0.4, I:9.8 | 1204 | git-send-email(1) | skicka en samling patchar som e-post från Git
`git-buildpackage` | V:1.2, I:7.1 | 2027 | git-byggpaket(1) | automatisera Debian-paketering med Git
`dgit` | V:0.2, I:1.0 | 738 | dgit(1) | gits interoperabilitet med Debian-arkivet
`imediff` | V:0.03, I:0.26 | 329 | git-ime(1) | interaktivt git commit split hjälpverktyg
`stgit` | V:0.08, I:0.50 | 6181 | stg(1) | quilt ovanpå git (Python)
`git-doc` | I:11 | 14896 | N/A | officiell dokumentation för Git
`gitmagic` | I:0.52 | 721 | N/A | "Git Magic", en mer lättförståelig guide till Git

### 10.5.1. Konfiguration av Git-klient

Du kanske vill ställa in flera globala konfigurationer i "`~/.gitconfig`", till exempel ditt namn och din e-postadress som används av Git enligt följande.

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

Du kan också anpassa Gits standardbeteende genom att göra följande.

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

Om du är alltför van vid CVS- eller Subversion-kommandon kanske du vill ställa in flera kommandovalias genom att göra följande.

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

Du kan kontrollera din globala konfiguration på följande sätt.

    $ git config --global --list

### 10.5.2. Grundläggande Git-kommandon

Git-operationen omfattar flera uppgifter.

- Arbetsträdet som innehåller filer som vänder sig till användaren och som du gör ändringar i.

  - De ändringar som ska registreras måste uttryckligen väljas ut och läggas till i indexet. Detta är kommandona `git add` och `git rm`.

- Indexet som innehåller staged-filer.

  - Staged-filer kommer att överföras till det lokala förvaret på efterföljande begäran. Detta är `git commit-kommandot`.

- Det lokala arkiv som innehåller filer med åtaganden.

  - Git registrerar den länkade historiken för de överförda uppgifterna och organiserar dem som grenar i arkivet.

  - Det lokala förvaret kan skicka data till fjärrförvaret med kommandot `git push`.

  - Det lokala arkivet kan ta emot data från fjärrarkiv med kommandona `git fetch` och `git pull`.

    - Kommandot `git pull` utför kommandot `git merge` eller `git rebase` efter kommandot `git fetch`.

    - Här kombinerar `git merge` två separata grenar av historien i slutet till en punkt. (Detta är standard för `git pull` utan anpassning och kan vara bra för upstream-personer som publicerar gren till många människor)

    - Här skapar `git rebase` en enda gren av sekventiell historia av den avlägsna grenen en följt av den lokala grenen en. (Detta är `pull.rebase verkliga` anpassningsfall och kan vara bra för resten av oss.)

- Fjärrförvaret som innehåller bekräftade filer.

  - Kommunikationen till fjärrlagret sker med hjälp av säkra kommunikationsprotokoll som SSH eller HTTPS.

Arbetsträdet är filer utanför katalogen `.git/`. Filerna i katalogen `.git/` innehåller indexet, data från det lokala arkivet och vissa textfiler för git-konfigurationen.

Här följer en översikt över de viktigaste Git-kommandona.

Tabell 10.12. Huvudsakliga Git-kommandon

Git-kommando | funktion
--- | ---
`git init` | skapa det (lokala) förvaret
`git clone URL` | klona fjärrförvaret till ett lokalt förvar med arbetsträdet
`git pull origin main` | uppdatera den lokala grenen `main` med fjärrarkivet `origin`
`git add .` | lägg till fil(er) i arbetsträdet till indexet för redan existerande filer i indexet endast
`git add -A .` | lägg till fil(er) i arbetsträdet till indexet för alla filer inklusive borttagningar
`git rm filename` | ta bort fil(er) från arbetsträdet och indexet
`git commit` | överföra ändringar i indexet till det lokala arkivet
`git commit -a` | lägga till alla ändringar i arbetsträdet i indexet och överföra dem till det lokala arkivet (add + commit)
`git push -u origin branch_name` | uppdatera fjärrförvarets `origin` med den lokala grenen `branch_name` (första anropet)
`git push origin branch_name` | uppdatera fjärrförvarets `origin` med den lokala grenen `branch_name` (efterföljande anrop)
`git diff treeish1 treeish2` | visa skillnaden mellan treeish1 commit och treeish2 commit
`gitk` | GUI-visning av historikträd för grenar i VCS repository

### 10.5.3. Git-tips

Här är några Git-tips.

Tabell 10.13. Git-tips

Git-kommandoraden | funktion
--- | ---
`gitk --all` | se fullständig Git-historik och hantera dem, till exempel återställa HEAD till en annan commit, plocka patchar, skapa taggar och grenar ...
`git stash` | få det rena fungerande trädet utan att förlora data
`git remote -v` | kontrollera inställningar för fjärrkontroll
`git branch -vv` | kontrollera inställningar för filial
`git status` | visa status för arbetsträdet
`git config -l` | lista git-inställningar
`git reset --hard HEAD; git clean -x -d -f` | återställ alla ändringar i arbetsträdet och rensa upp dem helt
`git rm --cached filename` | återställt staged index ändrat av `git add filnamn`
`git reflog` | hämta referenslogg (användbart för att återskapa commits från den borttagna grenen)
`git branch new_branch_name HEAD@{6}` | skapa en ny gren från reflog information
`git remote add new_remote URL` | lägga till en `new_remote` fjärrförvaringsplats som pekas ut av URL
`git remote rename origin upstream` | byt namn på fjärrförvaret från `origin` till `upstream`
`git branch -u uppströms/branch_namn` | ställa in fjärrspårningen till fjärrförvaret `upstream` och dess grennamn `branch_name`.
`git remote set-url origin https://foo/bar.git` | ändra URL för `origin`
`git remote set-url --push uppströms AVSTÄNGD` | inaktivera push till `upstream` (redigera `.git/config` för att återaktivera)
`git remote update upstream` | hämta uppdateringar av alla avlägsna grenar i `uppströmsförvaret`
`git fetch upstream foo:upstream-foo` | skapa en lokal (eventuellt föräldralös) `upstream-foo-gren` som en kopia av `foo-grenen` i `uppströmsarkivet`
`git checkout -b topic_branch ; git push -u topic_branch origin` | skapa en ny `topic_branch` och skicka den till `origin`
`git branch -m oldname newname` | byt namn på lokal filial
`git push -d origin branch_to_be_removed` | ta bort fjärrfilial (ny metod)
`git push origin :branch_to_be_removed` | ta bort fjärrfilial (gammal metod)
`git checkout --orphan unconnected` | skapa en ny `oansluten` filial
`git rebase -i origin/main` | omorganisera/droppa/släcka åtaganden från `origin/main` för att rensa grenens historik
`git reset HEAD^; git commit --amend` | sammanfoga de 2 senaste uppdragen till ett
`git checkout ämne_gren ; git merge --squash ämne_gren` | pressa ihop hela `topic_branch` till en commit
`git fetch --unshallow --update-head-ok origin '+refs/heads/*:refs/heads/*'` | konvertera en ytlig klon till en fullständig klon med alla grenar
`git ime` | dela upp den senaste överföringen i en serie fil-för-fil mindre överföringar etc.`(imediff-paketet` krävs)
`git repack -a -d; git prune` | packa om det lokala arkivet till ett enda paket (detta kan begränsa risken för förlorad dataåterställning från raderad filial etc.)

| Varning
Använd inte taggsträngen med mellanslag även om vissa verktyg som gitk(1) tillåter dig att använda den. Det kan kväva vissa andra `git-kommandon`.

| Observera
Om en lokal gren som har flyttats till ett fjärrarkiv blir omgjord eller krossad, är det riskfyllt att flytta den här grenen och kräver alternativet `--force`. Detta är vanligtvis inte acceptabelt för `main`, men kan vara acceptabelt för en ämnesgren innan den slås samman med `main`.

| Observera
Att anropa ett `git-underkommando` direkt som "`git-xyz`" från kommandoraden har varit föråldrat sedan början av 2006.

| Tips
Om det finns en körbar fil `git-foo` i sökvägen som anges av `$PATH`, anger du "`git foo`" utan bindestreck på kommandoraden och anropar denna `git-foo`. Detta är en funktion i kommandot `git`.

### 10.5.4. Git-referenser

Se följande.

- manpage: git(1)`(/usr/share/doc/git-doc/git.html)`

- Användarhandbok för Git`(/usr/share/doc/git-doc/user-manual.html)`

- En introduktion till git i form av en handledning`(/usr/share/doc/git-doc/gittutorial.html)`

- En introduktion till git i form av en handledning: del två`(/usr/share/doc/git-doc/gittutorial-2.html)`

- Vardaglig GIT med 20 kommandon eller så`(/usr/share/doc/git-doc/giteveryday.html)`

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

### 10.5.5. Andra system för versionshantering

Versionskontrollsystem (VCS) kallas ibland för revisionskontrollsystem (RCS) eller programvarukonfigurationshantering (SCM).

Här är en sammanfattning av de anmärkningsvärda andra VCS som inte är Git på Debiansystemet.

Tabell 10.14. Lista över andra verktyg för versionskontrollsystem

paket | popcon | storlek | verktyg | Typ av VCS | kommentar
--- | --- | --- | --- | --- | ---
`mercurial` | V:3, I:26 | 2575 | Mercurial | distribuerad | DVCS i Python och lite C
`darcs` | V:0.2, I:3.3 | 38856 | Darcs | distribuerad | DVCS med smart algebra av patchar (långsam)
`tla` | V:0.04, I:0.72 | 1022 | GNU arkiv | distribuerad | DVCS huvudsakligen av Tom Lord (historisk)
`bzr` | V:0.1, I:4.3 | 28 | GNU Bazaar | distribuerad | DVCS påverkad av `tla` skriven i Python(historisk)
`subversion` | V:10, I:57 | 4849 | Subversion | fjärr | "CVS done right", nyare standard för fjärrstyrd VCS (historisk)
`cvs` | V:3, I:25 | 4835 | CVS | fjärr | tidigare standard fjärrstyrd VCS (historisk)
`tkcvs` | V:0.12, I:0.88 | 34 | CVS, … | fjärr | GUI-visning av VCS (CVS, Subversion, RCS) repository-träd
`rcs` | V:1.7, I:9.5 | 578 | RCS | lokal | "Unix SCCS gjort på rätt sätt" (historisk)
`cssc` | V:0.01, I:0.35 | 2044 | CSSC | lokal | klon av Unix SCCS (historisk)

[4] En skrivskyddad media som CD/DVD-R kan förhindra överskrivningsolyckor. (Se Avsnitt 9.8, ”De binära uppgifterna” för hur man skriver till lagringsmediet från kommandoraden i skalet. GUI-miljön på GNOME-skrivbordet ger dig enkel åtkomst via menyn: "Platser→CD/DVD-skapare")

[5] Vissa av dessa data kan inte återskapas genom att samma indatasträng matas in i systemet.

[6] Om du använder "`~/.vimrc`" istället för "~/`.vim/vimrc`", vänligen ersätt på motsvarande sätt.

Kapitel 9. Tips för systemet |  | Kapitel 11. Konvertering av data