Bab 10. Manajemen data

# Bab 10. Manajemen data

Alat dan tips untuk mengelola data biner dan teks pada sistem Debian dijelaskan.

## 10.1. Berbagi, menyalin, dan mengarsipkan

| Awas
Akses tulis yang tidak terkoordinasi ke perangkat dan berkas yang diakses secara aktif dari berbagai proses tidak boleh dilakukan untuk menghindari kondisi race. Mekanisme penguncian berkas menggunakan `flock`(1) dapat digunakan untuk menghindarinya.

Keamanan data dan berbagi yang terkontrol memiliki beberapa aspek.

- Pembuatan arsip data

- Akses penyimpanan jarak jauh

- Duplikasi

- Pelacakan riwayat modifikasi

- Memfasilitasi berbagi data

- Pencegahan akses berkas tanpa otorisasi

- Deteksi modifikasi berkas tanpa otorisasi

Ini dapat direalisasikan dengan menggunakan beberapa kombinasi alat.

- Alat arsip dan kompresi

- Alat salin dan sinkronisasi

- Sistem berkas jaringan

- Media penyimpanan lepasan

- Secure shell

- Sistem autentikasi

- Alat sistem kontrol versi

- Alat enkripsi hash dan kriptografi

### 10.1.1. Alat arsip dan kompresi

Berikut adalah ringkasan alat kompresi dan arsip yang tersedia pada sistem Debian.

Tabel 10.1. Daftar alat arsip dan kompresi

paket | popcon | ukuran | ekstensi | perintah | kommen
--- | --- | --- | --- | --- | ---
`tar` | V:889, I:999 | 3085 | `.tar` | `tar`(1) | pengarsip standar (standar de facto)
`cpio` | V:404, I:998 | 1201 | `.cpio` | `cpio`(1) | Pengarsipan gaya Unix System V, gunakan dengan `find`(1)
`binutils` | V:184, I:636 | 1119 | `.ar` | `ar`(1) | pengarsip untuk pembuatan pustaka statis
`fastjar` | V:1, I:10 | 183 | `.jar` | `fastjar`(1) | pengarsip untuk Java (mirip zip)
`pax` | V:5, I:10 | 167 | `.pax` | `pax`(1) | pengarsip standar POSIX baru, kompromi antara `tar` dan `cpio`
`gzip` | V:885, I:999 | 256 | `.gz` | `gzip`(1), `zcat`(1), … | Utilitas kompresi GNU LZ77 (standar de facto)
`bzip2` | V:168, I:972 | 114 | `.bz2` | `bzip2`(1), `bzcat`(1), … | Utilitas kompresi pengurut blok Burrows-Wheeler dengan rasio kompresi yang lebih tinggi daripada `gzip`(1) (lebih lambat dari `gzip` dengan sintaks serupa)
`lzma` | V:0, I:11 | 349 | `.lzma` | `lzma`(1) | Utilitas kompresi LZMA dengan rasio kompresi yang lebih tinggi daripada `gzip`(1) (usang)
`xz-utils` | V:309, I:980 | 1475 | `.xz` | `xz`(1), `xzdec`(1), … | Utilitas kompresi XZ dengan rasio kompresi yang lebih tinggi daripada `bzip2`(1) (lebih lambat dari `gzip` tetapi lebih cepat dari `bzip2`; pengganti utilitas kompresi LZMA)
`zstd` | V:265, I:777 | 2313 | `.zstd` | `zstd`(1), `zstdcat`(1), … | Zstandard utilitas kompresi lossless cepat
`p7zip` | V:8, I:237 | 8 | `.7z` | `7zr`(1), `p7zip`(1) | Pengarsip berkas 7-Zip dengan rasio kompresi tinggi (kompresi LZMA)
`p7zip-full` | V:27, I:259 | 12 | `.7z` | `7z`(1), `7za`(1) | Pengarsip berkas 7-Zipdengan rasio kompresi tinggi (kompresi LZMA dan lain-lain)
`lzop` | V:12, I:137 | 164 | `.lzo` | `lzop`(1) | Utilitas kompresi LZO dengan kompresi dan kecepatan dekompresi yang lebih tinggi daripada `gzip`(1) (rasio kompresi yang lebih rendah daripada `gzip` dengan sintaks serupa)
`zip` | V:50, I:367 | 627 | `.zip` | `zip`(1) | InfoZIP: Alat arsip dan kompresi DOS
`unzip` | V:116, I:759 | 387 | `.zip` | `unzip`(1) | InfoZIP: Alat pembuka arsip dan dekompresi DOS

| Awas
Jangan mengatur variabel "`$TAPE`" kecuali Anda tahu apa yang diharapkan. Itu mengubah perilaku `tar`(1).

- Arsip `tar`(1) yang di-gzip menggunakan ekstensi berkas "`.tgz`" atau "`.tar.gz`".

- Arsip `tar`(1) terkompresi xz menggunakan ekstensi berkas "`.txz`" atau "`.tar.xz`".

- Metode kompresi populer dalam alat FOSS seperti `tar`(1) telah bergerak sebagai berikut: `gzip` → `bzip2` → `xz`

- `cp`(1), `scp`(1), dan `tar`(1) mungkin memiliki beberapa batasan untuk berkas khusus. `cpio`(1) adalah yang paling serbaguna.

- `cpio`(1) dirancang untuk digunakan dengan `find`(1) dan perintah lainnya dan cocok untuk membuat skrip cadangan karena bagian pemilihan berkas dari skrip dapat diuji secara independen.

- Struktur internal berkas data Libreoffice adalah berkas "`.jar`" yang dapat dibuka juga oleh `unzip`.

- Alat arsip lintas platform de-facto adalah `zip`. Gunakan sebagai "`zip -rX`" untuk mencapai kompatibilitas maksimum. Gunakan juga opsi "`-s`", jika ukuran berkas maksimum penting.

### 10.1.2. Alat salin dan sinkronisasi

Berikut adalah ringkasan alat cadangan dan salin sederhana yang tersedia di sistem Debian.

Tabel 10.2. Daftar alat salin dan sinkronisasi

paket | popcon | ukuran | perkakas | fungsi
--- | --- | --- | --- | ---
`coreutils` | V:892, I:999 | 18457 | GNU cp | menyalin berkas dan direktori secara lokal ("-a" untuk rekursif)
`openssh-client` | V:898, I:996 | 5133 | scp | dari jarak jauh menyalin berkas dan direktori (klien, "`-r`" untuk rekursif)
`openssh-server` | V:745, I:804 | 3502 | sshd | menyalin berkas dan direktori dari jarak jauh (server jarak jauh)
`rsync` | V:200, I:539 | 814 |  | Sinkronisasi dan pencadangan jarak jauh 1 arah
`unison` | V:3, I:13 | 14 |  | Sinkronisasi dan pencadangan jarak jauh 2 arah

Menyalin berkas dengan `rsync`(8) menawarkan fitur yang lebih kaya daripada yang lain.

- algoritma delta-transfer yang hanya mengirimkan perbedaan antara berkas sumber dan berkas yang ada di tujuan

- algoritma pemeriksaan cepat (secara baku) yang mencari berkas yang telah berubah dalam ukuran atau dalam waktu terakhir dimodifikasi

- opsi "`--exclude`" dan "`--exclude-from`" yang mirip dengan `tar`(1)

- Sintaks "garis miring di akhir pada direktori sumber" yang menghindari pembuatan tingkat direktori tambahan di tujuan.

| Tip
Alat sistem kontrol versi (VCS) Tabel 10.14, “Daftar alat sistem kontrol versi lainnya” dapat berfungsi sebagai alat salinan dan sinkronisasi multi-arah.

### 10.1.3. Idiom untuk arsip

Berikut adalah beberapa cara untuk mengarsipkan dan membuka arsip seluruh isi direktori "`./source`" menggunakan alat yang berbeda.

GNU `tar`(1):

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

Atau, dengan berikut.

    $ 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 untuk menyalin

Berikut adalah beberapa cara untuk menyalin seluruh konten direktori "`./source`" menggunakan alat-alat yang berbeda.

- Salinan lokal: direktori "`./source`" → direktori "`/dest`"

- Salinan jarak jauh: direktori "`./source`" di host lokal → direktori "`/dest`" di host "`user@host.dom`"

`rsync`(8):

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

Anda dapat menggunakan sintaks "garis miring di akhir pada direktori sumber".

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

Atau, dengan berikut.

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

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

Anda dapat mengganti "`.`" dengan "`foo`" untuk semua contoh yang mengandung "`.`" untuk menyalin berkas dari direktori "`./source/foo`" ke direktori "`/dest/foo`".

Anda dapat mengganti "`.`" dengan path absolut "`/path/to/source/foo`" untuk semua contoh yang mengandung "`.`" untuk membuang "`cd./source;`". Ini menyalin berkas ke lokasi yang berbeda tergantung pada alat yang digunakan sebagai berikut.

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

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

| Tip
`rsync`(8) dan GNU `cp`(1) memiliki opsi "`-u`" untuk melewatkan berkas yang lebih baru pada penerima.

### 10.1.5. Idiom untuk pemilihan berkas

`find`(1) digunakan untuk memilih berkas untuk perintah arsip dan salin (lihat Bagian 10.1.3, “Idiom untuk arsip” dan Bagian 10.1.4, “Idiom untuk menyalin”) atau untuk `xargs`(1) (lihat Bagian 9.4.9, “Mengulangi perintah atas berkas”). Ini dapat ditingkatkan dengan memakai argumen-argumen perintahnya.

Sintaks dasar `find`(1) dapat diringkas sebagai berikut.

- Argumen bersyaratnya dievaluasi dari kiri ke kanan.

- Evaluasi ini berhenti setelah hasilnya ditentukan.

- "OR logis" (ditentukan oleh "`-o`" antara syarat) memiliki prioritas yang lebih rendah daripada "AND logis" (ditentukan oleh "`-a`" atau nihil antara syarat).

- "NOT logis" (ditentukan oleh "`!`" sebelum syarat) memiliki prioritas yang lebih tinggi daripada "AND logis".

- "`-prune`" selalu mengembalikan TRUE logis dan, jika itu adalah direktori, pencarian berkas dihentikan di luar titik ini.

- "`-name`" mencocokkan basis nama berkas dengan shell glob (lihat Bagian 1.5.6, “Glob shell”) tetapi juga mencocokkan "`.`" awal dengan karakter-karakter meta seperti "`*`" dan "`?`". (Fitur POSIX baru)

- "`-regex`" mencocokkan path lengkap dengan BRE gaya emacs (lihat Bagian 1.6.2, “Ekspresi reguler”) secara baku.

- "`-size`" cocok dengan berkas berdasarkan ukuran berkas (nilai didahului dengan "`+`" untuk lebih besar, didahului dengan "`-`" untuk lebih kecil)

- "`-newer`" cocok dengan berkas yang lebih baru dari yang ditentukan dalam argumennya.

- "`-print0`" selalu mengembalikan TRUE logis dan mencetak nama berkas lengkap (diakhiri null) pada keluaran standar.

`find`(1) sering digunakan dengan gaya idiomatik sebagai berikut.

    # 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

Ini berarti melakukan tindakan berikut.

1. Cari semua berkas mulai dari "`/path/to`"

2. Secara global membatasi pencariannya dalam sistem berkas awalnya dan menggunakan ERE (lihat Bagian 1.6.2, “Ekspresi reguler”) sebagai gantinya

3. Kecualikan berkas yang cocok regex dari "`.*\.cpio`" atau "`.*~`" dari pencarian dengan berhenti memroses

4. Kecualikan direktori yang cocok dengan regex "`.*/\.git`" dari pencarian dengan berhenti memroses

5. Kecualikan berkas yang lebih dari 99 Megabyte (satuan 1048576 byte) dari pencarian dengan berhenti memroses

6. Cetak nama berkas yang memenuhi kondisi pencarian di atas dan lebih baru dari "`/path/to/timestamp`"

Harap dicatat penggunaan idiomatik "`-prune -o`" untuk mengecualikan berkas dalam contoh di atas.

| Catatan
Untuk sistem mirip Unix non-Debian, beberapa opsi mungkin tidak didukung oleh `find`(1). Dalam kasus seperti itu, silakan pertimbangkan untuk menyesuaikan metode yang cocok dan mengganti "`-print0`" dengan "`-print`". Anda mungkin perlu menyesuaikan perintah terkait juga.

### 10.1.6. Media arsip

Ketika memilih media penyimpanan data komputer untuk arsip data penting, Anda harus berhati-hati tentang keterbatasan mereka. Untuk cadangan data pribadi kecil, saya menggunakan CD-R dan DVD-R oleh perusahaan dengan merek terkenal dan menyimpan di lingkungan yang sejuk, teduh, kering, dan bersih. (Media arsip tape tampaknya populer untuk penggunaan profesional.)

| Catatan
Brankas tahan api dimaksudkan untuk dokumen kertas. Sebagian besar media penyimpanan data komputer memiliki toleransi suhu yang lebih rendah daripada kertas. Saya biasanya mengandalkan beberapa salinan terenkripsi aman yang disimpan di beberapa lokasi aman.

Umur penyimpanan optimis dari media arsip yang terlihat di internet (sebagian besar dari info vendor).

- 100+ tahun : Kertas bebas asam dengan tinta

- 100 tahun : Penyimpanan optik (CD/DVD, CD/DVD-R)

- 30 tahun : Penyimpanan magnetik (tape, floppy)

- 20 tahun : Penyimpanan optik perubahan fase (CD-RW)

Ini tidak memperhitungkan kegagalan mekanis karena penanganan dll.

Siklus tulis optimis dari media arsip yang terlihat di internet (sebagian besar dari informasi vendor).

- 250.000+ siklus : Harddisk drive

- 10.000+ siklus : Memori flash

- 1.000 siklus : CD/DVD-RW

- 1 siklus : CD/DVD-R, kertas

| Perhatian
Angka masa penyimpanan dan siklus penulisan di sini tidak boleh digunakan untuk keputusan tentang penyimpanan data penting apa pun. Silakan berkonsultasi dengan informasi produk spesifik yang disediakan oleh produsen.

| Tip
Karena CD/DVD-R dan kertas hanya memiliki 1 siklus penulisan, mereka secara inheren mencegah kehilangan data yang tidak disengaja dengan menimpa. Ini adalah keuntungan!

| Tip
Jika Anda memerlukan cadangan data dalam jumlah besar dan sering, hard disk pada host jarak jauh yang dihubungkan oleh koneksi jaringan cepat, mungkin satu-satunya pilihan yang realistis.

| Tip
Jika Anda menggunakan media yang dapat ditulis ulang untuk cadangan Anda, penggunaan sistem berkas seperti btrfs atau zfs yang mendukung snapshot hanya baca mungkin merupakan ide yang baik.

### 10.1.7. Perangkat penyimpanan lepasan

Perangkat penyimpanan lepasan mungkin salah satu dari yang berikut ini.

- USB flash drive

- Hard disk drive

- Drive cakram optik

- Kamera digital

- Pemutar musik digital

Mereka dapat dihubungkan melalui salah satu dari yang berikut.

- USB

- IEEE 1394 / FireWire

- PC Card

Lingkungan desktop modern seperti GNOME dan KDE dapat mengait perangkat lepasan ini secara otomatis tanpa entri "`/etc/fstab`" yang cocok.

- Paket `udisks2` menyediakan daemon dan utilitas terkait untuk mengait dan melepas kait perangkat-perangkat ini.

- D-bus membuat kejadian-kejadian untuk memulai proses otomatis.

- PolicyKit memberikan hak istimewa yang diperlukan.

| Tip
Perangkat yang dikait otomatis mungkin memiliki opsi mount "`uhelper=`" yang digunakan oleh `umount`(8).

| Tip
Mengait otomatis di bawah lingkungan desktop modern terjadi hanya ketika perangkat media lepasan tidak terdaftar di "`/etc/fstab`".

Titik kait di bawah lingkungan desktop modern dipilih sebagai "`/media/username/disk_label`" yang dapat disesuaikan dengan hal-hal berikut.

- `mlabel`(1) untuk sistem berkas FAT

- `genisoimage`(1) dengan opsi "`-V`" untuk sistem berkas ISO9660

- `tune2fs`(1) dengan opsi "`-L`" untuk sistem berkas ext2/ext3/ext4

| Tip
Pilihan pengodean mungkin perlu disediakan sebagai opsi kait (lihat Bagian 8.1.3, “Pengodean nama berkas”).

| Tip
Penggunaan menu GUI untuk melepas kait sistem berkas dapat menghapus node perangkat yang dihasilkan secara dinamis seperti "`/dev/sdc`". Jika Anda ingin menyimpan node perangkatnya, lepas kait dengan perintah `umount`(8) dari prompt shell.

### 10.1.8. Pilihan sistem berkas untuk berbagi data

Saat berbagi data dengan sistem lain melalui perangkat penyimpanan lepasan, Anda harus memformatnya dengan sistem berkas umum yang didukung oleh kedua sistem. Berikut adalah daftar pilihan sistem berkas.

| Catatan
"Hard disk like device" means storage devices such as HDD / SSD / USB flash drive / ... . Their device names have several variants; `/dev/sda`, `/dev/nvme0`, `/dev/mmcblk0`, ... .

Tabel 10.3. Daftar pilihan sistem berkas untuk perangkat penyimpanan lepasan dengan skenario penggunaan yang khas

nama sistem berkas | skenario penggunaan tipikal
--- | ---
FAT12 | berbagi data lintas platform pada floppy disk (<32MiB)
FAT16 | berbagi data lintas platform pada perangkat seperti hard disk kecil (<2GiB)
FAT32 | berbagi data lintas platform pada perangkat seperti hard disk besar (<8TiB, didukung oleh yang lebih baru daripada MS Windows95 OSR2)
exFAT | berbagi data lintas platform pada perangkat seperti hard disk besar (<512TiB, didukung oleh WindowsXP, Mac OS X Snow Leopard 10.6.5, dan kernel Linux sejak rilis 5.4)
NTFS | berbagi data lintas platform pada perangkat seperti hard disk besar (didukung secara native pada MS Windows NT dan versi yang lebih baru, dan didukung oleh NTFS-3G melalui FUSE di Linux)
ISO9660 | berbagi lintas platform data statis pada CD-R dan DVD+/-R
UDF | penulisan data inkremental pada CD-R dan DVD+/-R (baru)
MINIX | penyimpanan data berkas unix yang efisien pada floppy disk
ext2 | berbagi data pada perangkat seperti hard disk dengan sistem Linux yang lebih lama
ext3 | berbagi data pada perangkat seperti hard disk dengan sistem Linux yang lebih lama
ext4 | berbagi data pada perangkat seperti hard disk dengan sistem Linux saat ini
btrfs | berbagi data pada perangkat seperti hard disk dengan sistem Linux saat ini dengan snapshot hanya-baca

| Tip
Lihat Bagian 9.9.1, “Enkripsi disk lepasan dengan dm-crypt/LUKS” untuk berbagi data lintas platform menggunakan enkripsi tingkat perangkat.

Sistem berkas FAT didukung oleh hampir semua sistem operasi modern dan cukup berguna untuk tujuan pertukaran data melalui media lepasan seperti hard disk.

Saat memformat perangkat lepasan seperti hard disk untuk berbagi data lintas platform dengan sistem berkas FAT, berikut ini harus menjadi pilihan yang aman.

- Memartisi mereka dengan `fdisk`(8), `cfdisk`(8), atau `parted`(8) (lihat Bagian 9.6.2, “Konfigurasi partisi disk”) menjadi partisi primer tunggal dan untuk menandainya sebagai berikut.

  - Ketik "6" untuk FAT16 bagi media yang kurang dari 2GB.

  - Ketik "c" untuk FAT32 (LBA) untuk media yang lebih besar.

- Memformat partisi utama dengan `mkfs.vfat`(8) dengan yang berikut.

  - Hanya nama perangkatnya, misalnya "`/dev/sda1`" untuk FAT16

  - Opsi eksplisit dan nama perangkatnya, misalnya "`-F 32 /dev/sda1`" untuk FAT32

Saat menggunakan sistem berkas FAT atau ISO9660 untuk berbagi data, berikut ini harus menjadi pertimbangan yang aman.

- Pengarsipan berkas ke dalam berkas arsip terlebih dahulu menggunakan `tar`(1), atau `cpio`(1) untuk mempertahankan nama berkas yang panjang, taut simbolis, izin berkas Unix asli dan informasi pemilik.

- Memecah berkas arsip menjadi potongan kurang dari 2 GiB dengan perintah `split`(1) untuk melindunginya dari batasan ukuran berkas.

- Mengenkripsi berkas arsip untuk mengamankan isinya dari akses yang tidak sah.

| Catatan
Untuk sistem berkas FAT dengan desainnya, ukuran berkas maksimum adalah `(2^32 - 1) byte = (4GiB - 1 byte)`. Untuk beberapa aplikasi pada OS 32 bit yang lebih tua, ukuran berkas maksimum bahkan lebih kecil `(2^31 - 1) byte = (2GiB - 1 byte)`. Debian tidak mengalami masalah yang terakhir.

| Catatan
Microsoft sendiri tidak merekomendasikan untuk menggunakan FAT bagi drive atau partisi lebih dari 200 MB. Microsoft menyoroti kekurangannya seperti penggunaan ruang disk yang tidak efisien dalam "Overview of FAT, HPFS, and NTFS File Systems" mereka. Tentu saja, kita biasanya harus menggunakan sistem berkas ext4 untuk Linux.

| Tip
Untuk informasi lebih lanjut tentang sistem berkas dan mengakses sistem berkas, silakan baca Filesystems HOWTO".

### 10.1.9. Berbagi data melalui jaringan

Saat berbagi data dengan sistem lain melalui jaringan, Anda harus menggunakan layanan umum. Berikut adalah beberapa petunjuk.

Tabel 10.4. Daftar layanan jaringan yang akan dipilih dengan skenario penggunaan umum

layanan jaringan | deskripsi skenario penggunaan umum
--- | ---
Sistem berkas dikait jaringan SMB/CIFS dengan Samba | berbagi berkas melalui "Microsoft Windows Network", lihat `smb.conf`(5) dan HOWTO dan Panduan Acuan Resmi Samba 3.x.x atau paket `samba-doc`
Sistem berkas dikait jaringan NFS dengan kernel Linux | berbagi berkas melalui "Unix /Linux Network", lihat `exports`(5) dan Linux NFS-HOWTO
Layanan HTTP | berbagi berkas antara server web/klien
Layanan HTTPS | berbagi berkas antara server web/klien dengan Secure Sockets Layer (SSL) terenkripsi atau Transport Layer Security (TLS)
Layanan FTP | berbagi berkas antara server/klien FTP

Meskipun sistem berkas ini dikait melalui jaringan dan metode transfer berkas melalui jaringan cukup nyaman untuk berbagi data, ini mungkin tidak aman. Koneksi jaringan mereka harus diamankan oleh yang berikut.

- Enkripsi dengan SSL/TLS

- Tembuskan itu melalui SSH

- Tembuskan itu melalui VPN

- Batasi di belakang firewall yang aman

Lihat juga Bagian 6.5, “Server aplikasi jaringan lainnya” dan Bagian 6.6, “Klien aplikasi jaringan lainnya”.

## 10.2. Pencadangan dan pemulihan

Kita semua tahu bahwa komputer gagal suatu saat atau kesalahan manusia menyebabkan kerusakan sistem dan data. Operasi pencadangan dan pemulihan adalah bagian penting dari administrasi sistem yang sukses. Semua mode kegagalan yang mungkin menimpa Anda suatu hari nanti.

| Tip
Jaga sistem cadangan Anda sederhana dan seringlah mencadangkan sistem Andag. Memiliki data cadangan lebih penting daripada seberapa baik metode cadangan Anda secara teknis.

### 10.2.1. Kebijakan pencadangan dan pemulihan

Ada 3 faktor kunci yang menentukan kebijakan pencadangan dan pemulihan yang sebenarnya.

1. Mengetahui apa yang harus dicadangkan dan dipulihkan.

   - Berkas data yang langsung dibuat oleh Anda: data dalam "`~/`"

   - Berkas data yang dibuat oleh aplikasi yang digunakan oleh Anda: data dalam "`/var/`" (kecuali "`/var/cache/`", "`/var/run/`", dan "`/var/tmp/`")

   - Berkas konfigurasi sistem: data dalam "`/etc/`"

   - Program lokal: data dalam "`/usr/local/`" atau "`/opt/`"

   - Informasi instalasi sistem: memo dalam teks polos pada langkah-langkah kunci (partisi, …)

   - Kumpulan data yang terbukti: dikonfirmasi oleh operasi pemulihan eksperimental sebelumnya

     - Pekerjaan cron sebagai proses pengguna: berkas di direktori "`/var/spool/cron/crontabs`" dan memulai ulang `cron`(8). Lihat Bagian 9.4.14, “Menjadwalkan tugas secara teratur” untuk `cron`(8) dan `crontab`(1).

     - Pekerjaan pengatur waktu sistem sebagai proses pengguna: berkas di direktori "`~/.config/systemd/user`". Lihat `systemd.timer`(5) dan `systemd.service`(5).

     - Memulai otomatis pekerjaan sebagai proses pengguna: berkas di direktori "`~/.config/autostart`". Lihat Spesifikasi Autostart Aplikasi Desktop.

2. Mengetahui cara membuat cadangan dan memulihkan.

   - Penyimpanan data yang aman: perlindungan dari penimpaan dan kegagalan sistem

   - Pencadangan yang sering: cadangan terjadwal

   - Cadangan redundan: mirroring data

   - Proses fool proof: pencadangan dengan perintah tunggal yang mudah

3. Menilai risiko dan biaya yang terlibat.

   - Risiko data saat hilang

     - Data harus setidaknya pada partisi disk yang berbeda, sebaiknya pada disk dan mesin yang berbeda agar bertahan atas korupsi sistem berkas. Data penting paling baik disimpan pada sistem berkas hanya baca. [4]

   - Risiko data saat bocor

     - Data identitas sensitif seperti "`/etc/ssh/ssh_host_*_key`", "`~/.gnupg/*`", "`~/.ssh/*`", "`~/.local/share/keyrings/*`", "`/etc/passwd`", "`/etc/shadow`", "`popularity-contest.conf`", "`/etc/ppp/pap-secrets`", and "`/etc/exim4/passwd.client`" harus dicadangkan maupun dienkripsi. [5] (Lihat Bagian 9.9, “Tips enkripsi data”.)

     - Jangan pernah menanam kata sandi login sistem atau frasa sandi dekripsi dalam skrip apa pun bahkan pada sistem terpercaya apa pun. (Lihat Bagian 10.3.6, “Ring kunci kata sandi”.)

   - Mode kegagalan dan kemungkinannya

     - Perangkat keras (terutama HDD) akan rusak

     - Sistem berkas mungkin terkorupsi dan data di dalamnya mungkin hilang

     - Sistem penyimpanan jarak jauh tidak dapat dipercaya untuk pelanggaran keamanan

     - Perlindungan kata sandi yang lemah dapat dengan mudah dikompromikan

     - Sistem izin berkas mungkin terkompromi

   - Sumber daya yang diperlukan untuk membuat cadangan: manusia, perangkat keras, perangkat lunak, …

     - Pencadangan terjadwal otomatis dengan pekerjaan cron atau pekerjaan timer systemd

| Tip
Anda dapat memulihkan data konfigurasi debconf dengan "`debconf-set-selections debconf-selections`" dan data seleksi dokg dengan "`dpkg --set-selection <dpkg-selections.list`".

| Catatan
Jangan mencadangkan konten sistem berkas pseudo yang ditemukan pada `/proc`, `/sys`, `/tmp`, dan `/run` (lihat Bagian 1.2.12, “procfs dan sysfs” dan Bagian 1.2.13, “tmpfs”). Kecuali Anda tahu persis apa yang Anda lakukan, mereka adalah data besar yang tidak berguna.

| Catatan
Anda mungkin ingin menghentikan beberapa daemon aplikasi seperti MTA (lihat Bagian 6.2.4, “Agen transportasi surat (mail transport agent/MTA)”) saat mencadangkan data.

### 10.2.2. Keluarga utilitas pencadangan

Berikut adalah daftar keluarga utilitas pencadangan terkemuka yang tersedia di sistem Debian.

Tabel 10.5. Daftar utilitas keluarga pencadangan

paket | popcon | ukuran | deskripsi
--- | --- | --- | ---
`bacula-common` | V:6, I:7 | 2501 | Bacula: pencadangan jaringan, pemulihan, dan verifikasi - berkas dukungan umum
`bacula-client` | V:0, I:2 | 199 | Bacula: pencadangan jaringan, pemulihan, dan verifikasi - meta-paket klien
`bacula-console` | V:0, I:2 | 112 | Bacula: pencadangan jaringan, pemulihan, dan verifikasi - konsol teks
`bacula-server` | I:0 | 199 | Bacula: pencadangan jaringan, pemulihan, dan verifikasi - meta-paket server
`amanda-common` | V:0, I:2 | 9851 | Amanda: Advanced Maryland Automatic Network Disk Archiver (Pustaka)
`amanda-client` | V:0, I:2 | 1099 | Amanda: Advanced Maryland Automatic Network Disk Archiver (Klien)
`amanda-server` | V:0, I:0 | 1093 | Amanda: Advanced Maryland Automatic Network Disk Archiver (Server)
`backuppc` | V:1, I:1 | 3088 | BackupPC adalah sistem kinerja tinggi, tingkat enterprise untuk mencadangkan PC (berbasis disk)
`duplicity` | V:6, I:50 | 2649 | cadangan (jarak jauh) inkremental
`deja-dup` | V:30, I:45 | 5031 | Antarmuka GUI untuk duplicity
`borgbackup` | V:12, I:28 | 3478 | deduplikasi cadangan (jarak jauh)
`borgmatic` | V:3, I:4 | 946 | pembantu borgbackup
`rdiff-backup` | V:2, I:7 | 1207 | cadangan (jarak jauh) inkremental
`restic` | V:5, I:10 | 24708 | cadangan (jarak jauh) inkremental
`backupninja` | V:2, I:2 | 360 | sistem meta-backup ringan dan dapat diperluas
`slbackup` | V:0, I:0 | 147 | cadangan (jarak jauh) inkremental
`backup-manager` | V:0, I:0 | 573 | alat pencadangan baris perintah
`backup2l` | V:0, I:0 | 110 | alat cadangan/pemulihan pemeliharaan rendah untuk media yang dapat dikait (berbasis disk)

Alat cadangan memiliki fokus khusus mereka.

- Mondo Rescue adalah sistem pencadangan untuk memfasilitasi pemulihan sistem lengkap dengan cepat dari CD/DVD cadangan dll. tanpa melalui proses instalasi sistem normal.

- Bacula, Amanda, dan BackupPC adalah utilitas keluarga pencadangan berfitur lengkap yang berfokus pada cadangan reguler melalui jaringan.

- Duplicity, dan Borg adalah utilitas cadangan yang lebih sederhana untuk workstation biasa.

### 10.2.3. Tips pencadangan

Untuk workstation pribadi, utilitas paket pencadangan berfitur lengkap yang dirancang untuk lingkungan server mungkin tidak berfungsi dengan baik. Pada saat yang sama, utilitas pencadangan yang ada untuk workstation mungkin memiliki beberapa kekurangan.

Berikut ini beberapa tips untuk membuat pencadangan lebih mudah dengan upaya minimal dari pengguna. Teknik-teknik ini dapat digunakan dengan utilitas pencadangan apa pun.

Untuk tujuan demonstrasi, mari kita asumsikan pengguna utama dan nama grup sebagai `penguin` dan membuat contoh skrip cadangan dan snapshot "`/usr/local/bin/bkss.sh`" sebagai:

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

Di sini, hanya alat dasar `rsync`(1) yang digunakan untuk memfasilitasi pencadangan sistem dan ruang penyimpanan digunakan secara efisien oleh Btrfs.

| Tip
FYI: Penulis ini menggunakan skrip shell serupa miliknya sendiri "bss: Utilitas Snapshot Sub Volume Btrfs" untuk workstation-nya.

#### 10.2.3.1. Pencadangan GUI

Berikut ini adalah contoh untuk menyiapkan pencadangan klik GUI tunggal.

- Siapkan perangkat penyimpanan USB yang akan digunakan untuk cadangan.

  - Format perangkat penyimpanan USB dengan satu partisi di btrfs dengan nama labelnya sebagai "`BKUP`". Ini dapat dienkripsi (lihat Bagian 9.9.1, “Enkripsi disk lepasan dengan dm-crypt/LUKS”).

  - Tancapkan ini ke sistem Anda. Sistem desktop akan secara otomatis memasangnya sebagai "`/media/penguin/BKUP`".

  - Jalankan "`sudo chown penguin:penguin /media/penguin/BKUP`" untuk membuatnya dapat ditulis oleh pengguna.

- Buatlah "`~/.local/share/applications/BKUP.desktop`" dengan mengikuti teknik yang tertulis di Bagian 9.4.10, “Memulai program dari GUI” sebagai:

      [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

Untuk setiap klik GUI, data Anda dicadangkan dari "`~/Documents`" ke perangkat penyimpanan USB dan snapshot hanya-baca dibuat.

#### 10.2.3.2. Pencadangan yang dipicu kejadian mount

Berikut ini adalah contoh untuk menyiapkan pencadangan otomatis yang dipicu oleh kejadian mount.

- Siapkan perangkat penyimpanan USB yang akan digunakan untuk pencadangan seperti pada Bagian 10.2.3.1, “Pencadangan GUI”.

- Buat berkas unit layanan sistemd "`~/.config/systemd/user/back-BKUP.service`" sebagai:

      [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

- Fungsikan konfigurasi unit systemd ini dengan yang berikut:

       $ systemctl --user enable bkup-BKUP.service

Untuk setiap kejadian mount, data Anda dicadangkan dari "`~/Documents`" ke perangkat penyimpanan USB dan snapshot hanya-baca dibuat.

Di sini, nama-nama unit mount systemd yang saat ini dimiliki systemd dalam memori dapat ditanyakan kepada manajer layanan dari pengguna yang memanggil dengan "`systemctl --user list-units --type=mount`".

#### 10.2.3.3. Pencadangan yang dipicu oleh kejadian pewaktu

Berikut ini adalah contoh untuk menyiapkan pencadangan otomatis yang dipicu oleh kejadian pewaktu.

- Siapkan perangkat penyimpanan USB yang akan digunakan untuk pencadangan seperti pada Bagian 10.2.3.1, “Pencadangan GUI”.

- Buat berkas unit pewaktu systemd "`~/.config/systemd/user/snap-Documents.timer`" sebagai:

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

      [Timer]
      OnStartupSec=30
      OnUnitInactiveSec=900

      [Install]
      WantedBy=timers.target

- Buat berkas unit layanan systemd "`~/.config/systemd/user/snap-Documents.service`" sebagai:

      [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

- Fungsikan konfigurasi unit systemd ini dengan yang berikut:

       $ systemctl --user enable snap-Documents.timer

Untuk setiap kejadian pewaktu, data Anda dicadangkan dari "`~/Documents`" ke perangkat penyimpanan USB dan snapshot hanya-baca dibuat.

Di sini, nama-nama unit pengguna pewaktu systemd yang saat ini dimiliki systemd di memori dapat ditanyakan kepada manajer layanan dari pengguna yang memanggil dengan "`systemctl --user list-units --type=timer`".

Untuk sistem desktop modern, pendekatan systemd ini dapat menawarkan kontrol yang lebih rinci daripada Unix tradisional yang menggunakan `at`(1), `cron`(8), atau `anacron`(8).

## 10.3. Infrastruktur keamanan data

Infrastruktur keamanan data disediakan oleh kombinasi alat enkripsi data, alat message digest, dan alat tanda tangan.

Tabel 10.6. Daftar alat infrastruktur keamanan data

paket | popcon | ukuran | perintah | deskripsi
--- | --- | --- | --- | ---
`gnupg` | V:367, I:872 | 468 | `gpg`(1) | GNU Privacy Guard - Alat enkripsi dan penandatanganan OpenPGP
`gpgv` | V:258, I:955 | 559 | `gpgv`(1) | GNU Privacy Guard - Alat verifikasi tanda tangan OpenPGP
`sq` | V:0, I:17 | 22408 | `sq`(1) | Sequoia-PGP - Alat enkripsi dan penandatanganan OpenPGP
`sqv` | V:324, I:406 | 1813 | `sqv`(1) | Sequoia-PGP - Alat verifikasi tanda tangan OpenPGP
`paperkey` | V:1, I:13 | 58 | `paperkey`(1) | mengekstrak hanya informasi rahasia dari kunci rahasia OpenPGP
`cryptsetup` | V:30, I:80 | 465 | `cryptsetup`(8), … | utilitas untuk enkripsi perangkat blok dm-crypt yang mendukung LUKS
`coreutils` | V:892, I:999 | 18457 | `md5sum`(1) | menghitung dan memeriksa digest pesan MD5
`coreutils` | V:892, I:999 | 18457 | `sha1sum`(1) | menghitung dan memeriksa digest pesan SHA1
`openssl` | V:834, I:995 | 2503 | `openssl`(1ssl) | menghitung pesan digest dengan "`openssl dgst`" (OpenSSL)
`libsecret-tools` | V:0, I:9 | 49 | `secret-tool`(1) | menyimpan dan mengambil kata sandi (CLI)
`seahorse` | V:81, I:273 | 7971 | `seahorse`(1) | alat manajemen kunci (GNOME)

Lihat Bagian 9.9, “Tips enkripsi data” pada dm-crypt dan fscrypt yang menerapkan infrastruktur enkripsi data otomatis melalui modul kernel Linux.

### 10.3.1. Manajemen kunci untuk GnuPG

Berikut adalah perintah GNU Privacy Guard untuk manajemen kunci dasar.

Tabel 10.7. Daftar perintah GNU Privacy Guard untuk manajemen kunci

perintah | deskripsi
--- | ---
`gpg --gen-key` | membuat suatu kunci baru
`gpg --gen-revoke ID_pengguna_saya` | menghasilkan kunci pencabutan untuk ID_pengguna_saya
`gpg --edit-key ID_pengguna` | menyunting kunci secara interaktif, "help" untuk bantuan
`gpg -o berkas --export` | mengekspor semua kunci publik ke berkas
`gpg -o berkas --export-secret-keys` | mengekspor semua kunci privat ke berkas
`gpg --import berkas` | mengimpor semua kunci dari berkas
`gpg --send-keys ID_pengguna` | mengirim kunci user_ID ke keyserver
`gpg --recv-keys ID_pengguna` | terima kunci user_ID dari keyserver
`gpg --list-keys ID_pengguna` | daftar kunci dari ID_pengguna
`gpg --list-sigs ID_pengguna` | daftar ttd. dari ID_pengguna
`gpg --check-sigs ID_pengguna` | periksa ttd. dari ID_pengguna
`gpg --fingerprint ID_pengguna` | periksa sidik jari ID_pengguna
`gpg --refresh-keys` | memperbarui keyring lokal

Berikut adalah arti dari kode kepercayaan.

Tabel 10.8. Daftar arti kode kepercayaan

kode | deskripsi kepercayaan
--- | ---
`-` | tidak ada kepercayaan pemilik yang ditugaskan / belum dihitung
`e` | perhitungan kepercayaan gagal
`q` | tidak cukup informasi untuk perhitungan
`n` | jangan pernah mempercayai kunci ini
`m` | dipercaya secara terbatas
`f` | dipercaya sepenuhnya
`u` | dipercaya setinggi-tingginya

Yang berikut ini membuat kunci saya "`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]

Yang berikut ini mengunggah kunci saya "`9563FC29932C409F1A77F9C1AB8A1522D8234C6A`" ke keyserver populer "`hkp://keys.gnupg.net`".

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

Keyserver baku yang baik diatur dalam "`~/.gnupg/gpg.conf`" (atau lokasi lama "`~/.gnupg/options`") berisi hal berikut.

    keyserver hkp://keys.gnupg.net

Yang berikut ini mendapatkan kunci yang tidak diketahui dari keyserver.

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

Ada bug di OpenPGP Public Key Server (pra-versi 0.9.6) yang merusak kunci dengan lebih dari 2 sub-kunci. Paket `gnupg` (>1.2.1-2) yang lebih baru dapat menangani subkunci yang rusak ini. Lihat `gpg`(1) di bawah opsi "`--repair-pks-subkey-bug`".

Penggunaan SHA-1 untuk has telah usang. Bila kunci openPGP RSA lama Anda memakai SHA-1 untuk hash, perbaiki itu memakai FixKeyWithSha1.

| Tip
Perintah `sq`(1) dan `sqv`(1) adalah set alternatif dari perintah openPGP. Lihat dokumentasi pengguna sq dan A Practical Introduction to using sq, Sequoia PGP’s CLI.

### 10.3.2. Menggunakan GnuPG pada berkas

Berikut adalah contoh untuk menggunakan perintah GNU Privacy Guard pada berkas.

Tabel 10.9. Daftar perintah GNU Privacy Guard pada berkas

perintah | deskripsi
--- | ---
`gpg -a -s berkas` | menandatangani berkas ke file.asc berlapis ASCII
`gpg --armor --sign file` | , ,
`gpg --clearsign file` | tandatangani pesan dengan clear-sign
`gpg --clearsign berkas|mail foo@example.org` | menyurel pesan yang ditandatangani secara clear-sign ke `foo@example.org`
`gpg --clearsign --not-dash-escaped berkas_patch` | menandatangani berkas patch dengan cara clear-sign
`gpg --verify berkas` | memverifikasi berkas yang ditandatangani dengan cara clear-sign
`gpg -o berkas.sig -b berkas` | membuat tanda tangan terpisah
`gpg -o berkas.sig --detach-sign berkas` | , ,
`gpg --verify berkas.sig berkas` | verifikasi berkas dengan berkas.sig
`gpg -o berkas_crypt.gpg -r nama -e berkas` | enkripsi kunci publik yang ditujukan untuk nama dari berkas ke berkas_crypt biner
`gpg -o berkas_crypt.gpg --recipient nama --encrypt berkas` | , ,
`gpg -o berkas_crypt.asc -a -r nama -e berkas` | enkripsi kunci publik yang ditujukan untuk nama dari berkas ke berkas_crypt.asc terbungkus ASCII
`gpg -o berkas_crypt.gpg -c berkas` | enkripsi simetris dari berkas ke berkas_crypt.gpg
`gpg -o berkas_crypt.gpg --symmetric berkas` | , ,
`gpg -o berkas_crypt.asc -a -c berkas` | enkripsi simetris yang ditujukan untuk nama dari berkas ke berkas_crypt.asc terbungkus ASCII
`gpg -o berkas -d berkas_crypt.gpg -r nama` | dekripsi
`gpg -o berkas --decrypt berkas_crypt.gpg` | , ,

### 10.3.3. Menggunakan GnuPG dengan Mutt

Tambahkan yang berikut ke "`~/.muttrc`" untuk menjaga GnuPG yang lambat agar tidak dimulai secara otomatis, sambil membiarkannya digunakan dengan mengetik "`S`" di menu indeks.

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

### 10.3.4. Menggunakan GnuPG dengan Vim

Plugin `gnupg` memungkinkan Anda menjalankan GnuPG secara transparan untuk berkas dengan ekstensi "`.gpg`", "`.asc`", dan "`.pgp`".[6]

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

### 10.3.5. Sidikjari MD5

`md5sum`(1) menyediakan utilitas untuk membuat berkas digest menggunakan metode dalam rfc1321 dan memverifikasi setiap berkas dengan itu.

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

| Catatan
Perhitungan untuk jumlah MD5 kurang CPU intensif daripada yang untuk tanda tangan kriptografi oleh GNU Privacy Guard (GnuPG). Biasanya, hanya berkas digest tingkat atas yang ditandatangani secara kriptografis untuk memastikan integritas data.

### 10.3.6. Ring kunci kata sandi

Pada sistem GNOME, alat GUI `seahorse`(1) mengelola kata sandi dan menyimpannya dengan aman di ring kunci `~/.local/share/keyrings/*`.

`secret-tool`(1) dapat menyimpan kata sandi ke ring kunci dari baris perintah.

Mari kita simpan frasa sandi yang dipakai untuk image disk terenkripsi LUKS/dm-crypt

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

Kata sandi yang tersimpan ini dapat diambil dan diumpankan ke program lain, misalnya, `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

| Tip
Setiap kali Anda perlu memberikan kata sandi dalam skrip, gunakan `secret-tool` dan hindari langsung menanam frasa sandi di dalamnya.

## 10.4. Alat penggabungan kode sumber

Ada banyak alat gabungan untuk kode sumber. Perintah berikut menarik perhatian saya.

Tabel 10.10. Daftar alat penggabungan kode sumber

paket | popcon | ukuran | perintah | deskripsi
--- | --- | --- | --- | ---
`patch` | V:97, I:712 | 242 | `patch`(1) | menerapkan berkas diff ke yang asli
`vim` | V:86, I:346 | 4089 | `vimdiff`(1) | membandingkan 2 berkas berdampingan di vim
`imediff` | V:0, I:0 | 348 | `imediff`(1) | alat gabungan 2/3 arah layar penuh interaktif
`meld` | V:5, I:25 | 3546 | `meld`(1) | membandingkan dan menggabungkan berkas (GTK)
`wiggle` | V:0, I:0 | 175 | `wiggle`(1) | menerapkan patch yang ditolak
`diffutils` | V:875, I:998 | 1768 | `diff`(1) | membandingkan berkas baris per baris
`diffutils` | V:875, I:998 | 1768 | `diff3`(1) | membandingkan dan menggabungkan tiga berkas baris demi baris
`quilt` | V:1, I:18 | 880 | `quilt`(1) | mengelola serangkaian patch
`wdiff` | V:6, I:42 | 651 | `wdiff`(1) | menampilkan perbedaan kata antara berkas-berkas teks
`diffstat` | V:10, I:104 | 79 | `diffstat`(1) | menghasilkan histogram perubahan oleh diff
`patchutils` | V:13, I:103 | 242 | `combinediff`(1) | membuat patch kumulatif dari dua patch inkremental
`patchutils` | V:13, I:103 | 242 | `dehtmldiff`(1) | mengekstrak diff dari halaman HTML
`patchutils` | V:13, I:103 | 242 | `filterdiff`(1) | mengekstrak atau mengecualikan diff dari berkas diff
`patchutils` | V:13, I:103 | 242 | `fixcvsdiff`(1) | memperbaiki berkas diff yang dibuat oleh CVS yang oleh `patch`(1) disalahtafsir
`patchutils` | V:13, I:103 | 242 | `flipdiff`(1) | menukar urutan dua patch
`patchutils` | V:13, I:103 | 242 | `grepdiff`(1) | menunjukkan berkas mana yang dimodifikasi oleh patch yang cocok dengan regex
`patchutils` | V:13, I:103 | 242 | `interdiff`(1) | menunjukkan perbedaan antara dua berkas diff unified
`patchutils` | V:13, I:103 | 242 | `lsdiff`(1) | menunjukkan berkas mana yang dimodifikasi oleh patch
`patchutils` | V:13, I:103 | 242 | `recountdiff`(1) | hitung ulang cacah dan ofset dalam diff konteks terpadu
`patchutils` | V:13, I:103 | 242 | `rediff`(1) | memperbaiki ofset dan cacah diff yang disunting dengan tangan
`patchutils` | V:13, I:103 | 242 | `splitdiff`(1) | memisahkan patch inkremental
`patchutils` | V:13, I:103 | 242 | `unwrapdiff`(1) | demangle patch yang telah berganti baris
`dirdiff` | V:0, I:1 | 167 | `dirdiff`(1) | menampilkan perbedaan dan menggabungkan perubahan antara pohon direktori
`docdiff` | V:0, I:0 | 554 | `docdiff`(1) | membandingkan dua berkas kata demi kata / huruf demi huruf
`makepatch` | V:0, I:0 | 99 | `makepatch`(1) | menghasilkan berkas patch yang diperluas
`makepatch` | V:0, I:0 | 99 | `applypatch`(1) | menerapkan berkas patch yang diperluas

### 10.4.1. Mengekstrak perbedaan untuk berkas sumber

Prosedur berikut mengekstrak perbedaan antara dua berkas sumber dan membuat berkas diff terpadu "`file.patch0`" atau "`file.patch1`" tergantung pada lokasi berkas.

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

### 10.4.2. Menggabungkan pembaruan untuk berkas sumber

Berkas diff (atau disebut berkas patch) digunakan untuk mengirim pembaruan program. Pihak penerima menerapkan pembaruan ini ke berkas lain dengan yang berikut ini.

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

### 10.4.3. Penggabungan interaktif

Jika Anda memiliki dua versi kode sumber, Anda dapat melakukan penggabungan 2 arah secara interaktif menggunakan `imediff`(1) dengan yang berikut.

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

Jika Anda memiliki tiga versi kode sumber, Anda dapat melakukan penggabungan 3 arah secara interaktif menggunakan `imediff`(1) dengan yang berikut.

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

## 10.5. Git

Git adalah alat pilihan hari ini untuk sistem kontrol versi (version control system/VCS) karena Git dapat melakukan segalanya untuk manajemen kode sumber lokal dan jarak jauh.

Debian menyediakan layanan Git bebas melalui layanan Debian Salsa. Dokumentasinya dapat ditemukan di https://wiki.debian.org/Salsa.

Berikut adalah beberapa paket terkait Git.

Tabel 10.11. Daftar paket dan perintah terkait git

paket | popcon | ukuran | perintah | deskripsi
--- | --- | --- | --- | ---
`git` | V:382, I:597 | 50172 | `git`(7) | Git, sistem kontrol revisi yang cepat, mampu menangani beban skala besar, dan terdistribusi
`gitk` | V:4, I:29 | 2003 | `gitk`(1) | Peramban repositori GUI Git dengan riwayat
`git-gui` | V:1, I:18 | 2508 | `git-gui`(1) | GUI untuk Git (Tanpa riwayat)
`git-email` | V:0, I:10 | 1187 | `git-send-email`(1) | mengirim kumpulan patch sebagai surel dari Git
`git-buildpackage` | V:1, I:7 | 2030 | `git-buildpackage`(1) | mengotomatiskan pemaketan Debian dengan Git
`dgit` | V:0, I:1 | 724 | `dgit`(1) | interoperabilitas git dengan arsip Debian
`imediff` | V:0, I:0 | 348 | `git-ime`(1) | alat pembantu pemecah commit git interaktif
`stgit` | V:0, I:0 | 604 | `stg`(1) | quilt di atas git (Python)
`git-doc` | I:11 | 14238 | T/T | dokumentasi resmi untuk Git
`gitmagic` | I:0 | 721 | T/T | "Git Magic", panduan yang lebih mudah dipahami untuk Git

### 10.5.1. Konfigurasi klien Git

Anda mungkin ingin mengatur beberapa konfigurasi global di "`~/.gitconfig`" seperti nama dan alamat surel Anda yang digunakan oleh Git dengan yang berikut ini.

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

Anda juga dapat menyesuaikan perilaku baku Git dengan yang berikut ini.

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

Jika Anda terlalu terbiasa dengan perintah CVS atau Subversion, Anda mungkin ingin menetapkan beberapa alias perintah dengan yang berikut.

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

Anda dapat memeriksa konfigurasi global Anda dengan berikut ini.

    $ git config --global --list

### 10.5.2. Perintah Git dasar

Operasi Git melibatkan beberapa data.

- Pohon kerja yang memuat berkas yang menghadap pengguna dan tempat Anda membuat perubahan padanya.

  - Perubahan yang akan dicatat harus dipilih secara eksplisit dan dipentaskan ke indeks. Ini adalah perintah `git add` dan `git rm`.

- Indeks penyimpan berkas yang di-stage.

  - Berkas yang di-stage akan di-commit ke repositori lokal atas permintaan berikutnya. Ini adalah perintah `git commit`.

- Repositori lokal yang menyimpan berkas yang di-commit.

  - Git mencatat riwayat tertaut dari data yang di-commit dan mengaturnya sebagai branch dalam repositori.

  - Repositori lokal dapat mengirim data ke repositori jarak jauh dengan perintah `git push`.

  - Repositori lokal dapat menerima data dari repositori jarak jauh dengan perintah `git fetch` dan `git pull`.

    - Perintah `git pull` melakukan perintah `git merge` atau `git rebase` setelah perintah `git fetch`.

    - Di sini, `git merge` menggabungkan dua branch sejarah yang terpisah di akhir hingga satu titik. (Ini adalah baku dari `git pull` tanpa penyesuaian dan mungkin baik untuk orang hulu yang mempublikasikan cabang kepada banyak orang.)

    - Di sini, `git rebase` menciptakan satu cabang tunggal sejarah berurutan dari cabang remote yang diikuti oleh cabang lokal. (Ini adalah kasus penyesuaian `pull.rebase true` dan mungkin baik untuk kita semua.)

- Repositori jarak jauh yang menyimpan berkas yang di-commit.

  - Komunikasi ke repositori jarak jauh menggunakan protokol komunikasi yang aman seperti SSH atau HTTPS.

Pohon kerja adalah berkas-berkas di luar direktori `.git/`. Berkas di dalam direktori `.git/` menyimpan indeks, data repositori lokal, dan beberapa berkas teks konfigurasi git.

Berikut adalah ikhtisar perintah Git utama.

Tabel 10.12. Perintah Git Utama

Perintah Git | fungsi
--- | ---
`git init` | membuat repositori (lokal)
`git clone URL` | mengklon repositori jarak jauh ke repositori lokal dengan pohon kerja
`git pull origin main` | memperbarui brach `main` lokal berdasarkan repositori `origin` jarak jauh
`git add .` | menambahkan berkas di pohon kerja ke indeks untuk berkas yang sudah ada sebelumnya dalam indeks saja
`git add -A .` | menambahkan berkas di pohon kerja ke indeks untuk semua berkas termasuk penghapusan
`git rm namaberkas` | menghapus berkas dari pohon kerja dan indeks
`git commit` | meng-commit perubahan yang di-stage dalam indeks ke repositori lokal
`git commit -a` | menambahkan semua perubahan pada pohon kerja ke indeks dan meng-commit mereka ke repositori lokal (menambah + commit)
`git push -u origin nama_branch` | memperbarui repositori `origin` jarak jauh oleh branch `branch_name` lokal (pemanggilan awal)
`git push origin nama_branch` | memperbarui repositori `origin` jarak jauh oleh branch `branch_name` lokal (pemanggilan berikutnya)
`git diff treeish1 treeish2` | menunjukkan perbedaan antara commit treeish1 dan commit treeish2
`gitk` | Tampilan GUI dari pohon sejarah branch repositori VCS

### 10.5.3. Tips Git

Berikut adalah tips Git.

Tabel 10.13. Tips Git

Baris perintah Git | fungsi
--- | ---
`gitk --all` | melihat sejarah Git lengkap dan beroperasi pada mereka seperti mengatur ulang HEAD ke commit lain, cherry-pick patch, membuat tag dan branch ...
`git stash` | mengambil pohon kerja bersih tanpa kehilangan data
`git remote -v` | memeriksa pengaturan untuk remote
`git branch -vv` | memeriksa pengaturan untuk branch
`git status` | menampilkan status pohon kerja
`git config -l` | daftar pengaturan git
`git reset --hard HEAD; git clean -x -d -f` | mengembalikan semua perubahan pohon kerja dan membersihkannya sepenuhnya
`git rm --cached namaberkas` | memulihkan indeks ter-stage yang diubah oleh `git add nama_berkas`
`git reflog` | dapatkan log referensi (berguna untuk memulihkan commit dari branch yang dihapus)
`git branch nama_branch_baru HEAD@{6}` | membuat branch baru dari informasi reflog
`git remote add remote_baru URL` | menambahkan repositori jarak jauh `new_remote` yang diacu oleh URL
`git remote rename origin upstream` | mengganti nama repositori jarak jauh dari `origin` ke `upstream`
`git branch -u upstream/nama_branch` | mengatur pelacakan jarak jauh ke repositori jarak jauh di `upstream` dan nama branch-nya `branch_name`.
`git remote set-url origin https://foo/bar.git` | mengubah URL `origin`
`git remote set-url --push upstream DISABLED` | nonaktifkan push ke `upstream` (Sunting `.git/config` untuk mengaktifkan kembali)
`git remote update upstream` | mengambil pembaruan dari semua branch remote dalam repositori `upstream`
`git fetch upstream foo:upstream-foo` | membuat branch `upstream-foo` lokal (mungkin orphan) sebagai salinan branch `foo` dalam repositori `upstream`
`git checkout -b topic_branch ; git push -u topic_branch origin` | membuat `topic_branch` baru dan mem-push ke `origin`
`git branch -m namalama namabaru` | mengganti nama nama cabang lokal
`git push -d origin branch_yang_akan_dihapus` | menghapus branch remote (metode baru)
`git push origin :branch_yang_akan_dihapus` | menghapus branch remote (metode lama)
`git checkout --orphan unconnected` | membuat branch baru `yang tidak terhubung`
`git rebase -i origin/main` | reorder/drop/squish commit dari `origin/main` untuk membersihkan riwayat branch
`git reset HEAD^; git commit --amend` | squash 2 commit terakhir menjadi satu
`git checkout topic_branch ; git merge --squash topic_branch` | squash seluruh `topic_branch` menjadi satu commit
`git fetch --unshallow --update-head-ok origin '+refs/heads/*:refs/heads/*'` | mengubah klon shallow menjadi klon penuh dari semua branch
`git ime` | membagi commit terakhir menjadi serangkaian commit berkas demi berkas yang lebih kecil dll. (paket `imediff` diperlukan)
`git repack -a -d; git prune` | mengemas ulang repositori lokal ke dalam satu pack (ini dapat membatasi kemungkinan pemulihan data yang hilang dari branch yang terhapus, dll.)

| Awas
Jangan gunakan string tag dengan spasi di dalamnya bahkan jika beberapa alat seperti `gitk`(1) mengizinkan Anda untuk menggunakannya. Ini mungkin mencekik beberapa perintah `git` lainnya.

| Perhatian
Jika branch lokal yang telah di-push ke repositori jarak jauh di-rebase atau di-squash, mem-push branch ini memiliki risiko dan membutuhkan opsi `--force`. Ini biasanya tidak dapat diterima untuk branch `main` tetapi mungkin dapat diterima untuk branch topik sebelum merge ke branch `main`.

| Perhatian
Menjalankan suatu sub perintah `git` langsung sebagai "`git-xyz`" dari baris perintah telah usang sejak awal 2006.

| Tip
Jika ada berkas yang dapat dieksekusi `git-foo` di path yang ditentukan oleh `$PATH`, memasukkan "`git foo`" tanpa tanda hubung ke baris perintah memanggil `git-foo`ini. Ini adalah fitur dari perintah `git`.

### 10.5.4. Referensi Git

Lihat yang berikut.

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

- Manual Pengguna Git (`/usr/share/doc/git-doc/user-manual.html`)

- Pengantar tutorial untuk git (`/usr/share/doc/git-doc/gittutorial.html`)

- Pengantar tutorial untuk git: bagian dua (`/usr/share/doc/git-doc/gittutorial-2.html`)

- GIT Sehari-hari Dengan Sekitar 20 Perintah (`/usr/share/doc/git-doc/giteveryday.html`)

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

### 10.5.5. Sistem kontrol versi lainnya

Sistem kontrol versi (VCS) kadang-kadang dikenal sebagai sistem kontrol revisi (RCS), atau manajemen konfigurasi perangkat lunak (SCM).

Berikut adalah ringkasan VCS non-Git lainnya yang terkenal pada sistem Debian.

Tabel 10.14. Daftar alat sistem kontrol versi lainnya

paket | popcon | ukuran | perkakas | Tipe VCS | kommen
--- | --- | --- | --- | --- | ---
`mercurial` | V:3, I:26 | 2579 | Mercurial | terdistribusi | DVCS dalam Python dan sebagian C
`darcs` | V:0, I:3 | 38784 | Darcs | terdistribusi | DVCS dengan aljabar patch cerdas (lambat)
`bzr` | I:4 | 28 | GNU Bazaar | terdistribusi | DVCS yang dipengaruhi oleh `tla` ditulis dalam Python (historis)
`tla` | V:0, I:0 | 1022 | GNU arch | terdistribusi | DVCS terutama oleh Tom Lord (historis)
`subversion` | V:10, I:59 | 4849 | Subversion | remote | "CVS dilakukan dengan benar", VCS jarak jauh standar yang lebih baru (bersejarah)
`cvs` | V:3, I:26 | 4835 | CVS | remote | VCS jarak jauh standar sebelumnya (bersejarah)
`tkcvs` | V:0, I:0 | 34 | CVS, … | remote | Tampilan GUI dari pohon repositori VCS (CVS, Subversion, RCS)
`rcs` | V:1, I:9 | 578 | RCS | lokal | "Unix SCCS dilakukan dengan benar" (historis)
`cssc` | V:0, I:0 | 2044 | CSSC | lokal | klon dari Unix SCCS (historis)

[4] Media write-once seperti CD/DVD-R dapat mencegah kecelakaan penimpaan. (Lihat Bagian 9.8, “Data biner” tentang cara menulis ke media penyimpanan dari baris perintah shell. Lingkungan GUI desktop GNOME memberi Anda akses mudah melalui menu: "Tempat→Pencipta CD/DVD".)

[5] Sebagian data ini tidak dapat diregenerasi dengan memasukkan string masukan yang sama ke sistem.

[6] Jika Anda menggunakan "`~/.vimrc`" bukan "`~/.vim/vimrc`", silakan ganti sesuai dengan itu.

Bab 9. Tips sistem |  | Bab 11. Konversi data