rsync menjaga salinan selalu mengikuti keadaan terkini sumber, tetapi backup juga butuh kebalikannya: membekukan keadaan pada satu titik waktu agar kemarin tetap bisa diakses meski hari ini berubah. Pekerjaan itu dipegang oleh tar, alat pengarsip tertua di dunia Unix yang sampai hari ini tetap jadi tulang punggung backup Linux. Chapter ini membedah arsitektur dua lapisnya — tar sebagai penggabung dan gzip/xz sebagai pemampat — lalu melatih siklus lengkap: membuat arsip, mendaftar isinya, mengekstrak ke folder karantina, dan membuktikan hasilnya identik dengan sumber.

Dua Lapis: Penggabung dan Pemampat #

Nama file arsip.tar.gz menyimpan dua pekerjaan yang berbeda. Lapis pertama adalah tar, sang archiver: alat ini menggabungkan banyak file beserta metadatanya (izin, waktu, struktur folder) menjadi satu stream byte berurutan — namanya sendiri berasal dari tape archive, media aslinya. Lapis kedua adalah compressor seperti gzip atau xz: alat ini memampatkan stream tersebut agar ukurannya mengecil. tar sendiri tidak memampatkan apa pun; kombinasi -z pada tar -czf sebenarnya hanya menyuruh tar memipakan hasilnya lewat program gzip.

Pemisahan ini bukan teori — kita bisa membongkarnya menjadi dua perintah dan membuktikan hasilnya sama persis:

bash
mkdir -p berkas
printf 'invoice januari\n' > berkas/invoice.txt
printf 'kontrak kerja 2026\n' > berkas/kontrak.txt
tar -czf cara-gabung.tar.gz berkas
tar -cf - berkas | gzip > cara-pipa.tar.gz
cmp cara-gabung.tar.gz cara-pipa.tar.gz && echo "dua jalur menghasilkan arsip identik"

Output yang Dihasilkan:

text
dua jalur menghasilkan arsip identik

Bedah baris per barisnya:

  1. Baris 4 (tar -czf cara-gabung.tar.gz berkas): -c membuat arsip, -z memfilternya lewat gzip, -f menamai file hasilnya — satu perintah, dua lapis kerja.
  2. Baris 5 (tar -cf - berkas | gzip > ...): -f - mengarahkan arsip ke stdout, garis pipa mengalirkannya ke gzip, lalu pengalihan > menangkap hasilnya ke file — lapis-lapisnya kita rakit sendiri.
  3. Baris 6 (cmp): membandingkan kedua file byte demi byte; pesan sukses berarti keduanya identik, jadi -z memang hanya jalan pintas.

Bentuk pipa ini bukan sekadar trik: aliran tar -cf - bisa dikirim lewat SSH, dibelokkan ke dd untuk menulis ke tape, atau dihash langsung — semuanya tanpa file tar sementara di disk. Rincian seluruh opsi pengarsipannya terdokumentasi di tar(1) .

Siklus Arsip: Buat, Daftar, Ekstrak #

Tiga kebiasaan yang membedakan backup rapi dari arsip asal jadi: isi arsip didaftar ulang sebelum dipercaya, ekstraksi selalu ke folder karantina, dan hasilnya dibandingkan dengan sumbernya. Mari kita jalankan ketiganya dalam satu latihan:

bash
mkdir -p berkas/2026 berkas/lama
printf 'invoice januari\n' > berkas/2026/invoice.txt
printf 'kontrak lama\n' > berkas/lama/kontrak.txt
printf 'daftar isi arsip\n' > berkas/INDEX.txt
tar --sort=name -czf arsip-2026-01-15.tar.gz berkas
echo "== isi arsip =="
tar -tzf arsip-2026-01-15.tar.gz
mkdir -p uji
tar -xzf arsip-2026-01-15.tar.gz -C uji
diff -r berkas uji/berkas && echo "ekstrak identik dengan sumber"

Output yang Dihasilkan:

text
== isi arsip ==
berkas/
berkas/2026/
berkas/2026/invoice.txt
berkas/INDEX.txt
berkas/lama/
berkas/lama/kontrak.txt
ekstrak identik dengan sumber

Bedah baris per barisnya:

  1. Baris 5 (tar --sort=name -czf ...): --sort=name mengurutkan isi arsip menurut nama sehingga arsip dari data yang sama selalu tersusun sama — syarat arsip yang reproducible dan mudah diperbandingkan antar pembuatan.
  2. Baris 7 (tar -tzf ...): mendaftar isi arsip tanpa mengekstraknya — pemeriksaan pertama bahwa arsip terbaca dan isinya lengkap.
  3. Baris 9 (tar -xzf ... -C uji): mengekstrak ke folder uji, bukan menimpa sumbernya; -C mengganti direktori kerja ekstraksi.
  4. Baris 10 (diff -r): membandingkan seluruh pohon direktori; hasil diam plus pesan sukses berarti ekstraksi identik dengan sumber.

gzip, xz, dan zstd: Memilih Pemampat #

Setelah lapis penggabung dipahami, pilihan pemampat menjadi keputusan rekayasa: rasio menentukan ruang, kecepatan menentukan jendela backup. Kita ukur sendiri dengan file log 200 baris yang polanya berulang — jenis data yang paling ramah terhadap kompresi:

bash
mkdir -p data
for i in $(seq 1 200); do printf 'baris log aplikasi server kantor nomor %03d status OK\n' "$i"; done > data/server.log
gzip -9 -k data/server.log
xz -9 -k data/server.log
stat -c '%n %s byte' data/server.log data/server.log.gz data/server.log.xz
gzip -l data/server.log.gz

Output yang Dihasilkan:

text
data/server.log 10600 byte
data/server.log.gz 583 byte
data/server.log.xz 312 byte
         compressed        uncompressed  ratio uncompressed_name
                583               10600  94.8% data/server.log

Bedah baris per barisnya:

  1. Baris 2 (for i in $(seq ...)): membangkitkan 200 baris log dengan pola berulang ke data/server.log — data uji yang isinya selalu sama.
  2. Baris 3-4: -9 memilih level kompresi maksimal, -k (keep) mempertahankan file asli agar ketiganya bisa dibandingkan berdampingan.
  3. Baris 5 (stat -c '%n %s'): mencetak nama dan ukuran byte setiap file tanpa informasi waktu yang berubah-ubah.
  4. Baris 6 (gzip -l): laporan bawaan gzip — kolom ratio menyatakan 94.8% ukuran asli berhasil dipangkas.

Angka pada file 10600 byte ini: gzip -9 memangkas menjadi 583 byte, sedangkan xz -9 menekan sampai 312 byte — hampir setengahnya lagi. Konsekuensinya ada di kecepatan: xz menghabiskan waktu prosesor jauh lebih lama, waktu yang makin terasa pada arsip berukuran gigabyte. Karakter ketiganya:

PemampatRasioKecepatanCiri khas
gzipmenengahcepatada di semua sistem Unix, hampir tanpa pengecualian
xzpaling kecillambat, terutama saat memampatkanpilihan arsip distribusi paket
zstdmenengah-kecilsangat cepat, multithread bawaanstandar modern untuk kernel dan build

Satu catatan jujur dari lingkungan latihan kita: zstd belum terpasang di sini, jadi barisnya diukur dari karakteristiknya, bukan dari eksekusi. Di sistem sungguhan keduanya setara posisinya — zstd -19 mendekati rasio xz dengan kecepatan yang jauh lebih ramah, dan opsi -T0 keduanya mengaktifkan seluruh inti CPU secara paralel. Opsi lengkap masing-masing pemampat terdokumentasi di gzip(1) dan xz(1) .

Menambah Isi dan Menyaring Arsip #

Arsip hidup: file baru datang setelah arsip dibuat. Opsi -r (append) menambahkannya — tetapi hanya pada arsip tar polos tanpa kompresi:

bash
mkdir -p kumpulan
printf 'berkas pertama\n' > kumpulan/berkas1.txt
tar -cf kumpulan.tar kumpulan
printf 'berkas kedua\n' > tambahan.txt
tar -rf kumpulan.tar tambahan.txt
tar -tf kumpulan.tar

Output yang Dihasilkan:

text
kumpulan/
kumpulan/berkas1.txt
tambahan.txt

Bedah baris per barisnya:

  1. Baris 3 (tar -cf kumpulan.tar kumpulan): membuat arsip polos tanpa -z — syarat agar bisa ditambah di kemudian hari.
  2. Baris 5 (tar -rf ...): menempelkan tambahan.txt ke ujung arsip tanpa membongkar isinya.
  3. Baris 6 (tar -tf): mendaftar isi akhirnya — folder asli plus file yang baru ditempelkan.

Batasannya logis kalau ingat arsitektur dua lapis: gzip memampatkan seluruh stream menjadi satu kesatuan, jadi menambah satu file berarti memampatkan ulang semuanya. Karena itu tar -rf menolak file berakhiran .gz — jalurnya adalah dekompresi dulu, tambah, lalu mampatkan ulang. Penyaringan juga terjadi di lapis tar: opsi --exclude='*.log' menjauhkan file sampah saat arsip dibuat, mirip --exclude pada rsync di chapter sebelumnya.

Arsip tar kini lengkap di tangan kita: dibuat dengan urutan stabil, didaftar isinya, diekstrak teruji, dan dipilih pemampatnya sesuai kebutuhan. Tetapi arsip tetap bekerja dengan cara menyalin byte — backup mingguan dari data besar berarti menyalin berulang kali penuh. Ada teknik yang membuat “salinan” sebesar apapun selesai dalam hitungan detik tanpa memindahkan satu byte data pun: snapshot, topik chapter berikutnya.