Tutorial Ubuntu 26.04 / Mencadangkan konfigurasi, daftar paket, dan data pengguna

Cadangan Ubuntu memerlukan cakupan pemulihan yang jelas, penyimpanan yang terpisah dari kegagalan sumber, dan uji pemulihan. Daftar paket atau snapshot VM saja tidak cukup. Latihan ini menyiapkan cakupan cadangan dan memulihkan berkas ke direktori terpisah tanpa menimpa sumber.

Tentukan apa yang harus dipulihkan

Sasaran Yang disimpan dan diperiksa
Konfigurasi Berkas /etc yang diubah, alasan perubahan, dan versi layanan; batasi akses ke sertifikat serta kunci privat
Berkas pengguna Jalur home atau folder bersama yang sebenarnya, UID/GID, mode izin, ACL, dan atribut tambahan yang diperlukan
Data aplikasi Dump basis data, volume, unggahan, versi aplikasi, serta prosedur menjaga konsistensi
Paket Daftar paket APT manual, versi lengkap, inventaris Snap, dan informasi repositori
Akses pemulihan Media instalasi, konsol, kunci pembuka enkripsi dan dekripsi cadangan, serta penanggung jawab penyimpanannya

UID dan GID adalah nomor identitas pengguna dan grup. ACL (Access Control List) mengatur izin tambahan, sedangkan extended attributes atau xattr menyimpan atribut di luar metadata dasar. Pastikan alat dan sistem berkas tujuan dapat memulihkan metadata yang benar-benar dibutuhkan.

Mengarsipkan berkas basis data yang masih aktif dengan tar dapat mencampur isi dari waktu berbeda. Gunakan dump yang didukung aplikasi atau prosedur penghentian/pembekuan yang terkoordinasi, termasuk penyimpanan yang harus dipulihkan bersama. Jeda sinkronisasi dan penulisan aplikasi sesuai kebutuhan; arsip berkas bukan pengganti prosedur konsistensi basis data.

Catat paket dan lokasi konfigurasi

Blok berikut membuat direktori inventaris baru di home pengguna tanpa memasang atau menghapus paket. umask 077 membatasi izin awal berkas baru. Inventaris dapat memuat rincian operasional dan perlu dilindungi, tetapi tidak berisi isi konfigurasi atau dokumen pengguna.

(
set -eu
umask 077
inventory_dir=$(mktemp -d "$HOME/ubuntu-inventory.XXXXXX")
apt-mark showmanual > "$inventory_dir/apt-manual.txt"
dpkg-query -W -f='${binary:Package}\t${Version}\n' > "$inventory_dir/dpkg-versions.tsv"
if command -v snap >/dev/null 2>&1; then
    snap list > "$inventory_dir/snap-list.txt"
fi
cat /etc/os-release > "$inventory_dir/os-release.txt"
printf "%s\n" "$inventory_dir"
)

Catat jalur direktori yang dicetak dan periksa keberhasilan setiap bagian. Jika snap tersedia tetapi snap list gagal, blok berhenti; jangan menganggap inventaris parsial sebagai hasil lengkap. dpkg-query menyediakan nama dan versi dari basis data paket. Informasi repositori dan alasan perubahan konfigurasi tetap perlu disimpan tersendiri; daftar paket tidak menjamin versi lama masih tersedia di repositori.

Sebelum memulihkan ke rilis tujuan, tinjau paket dan repositori yang masih didukung serta benar-benar diperlukan. Bedakan konfigurasi aplikasi dari identitas mesin seperti machine-id, kunci host SSH, dan alamat statis. Memulihkan server yang sama dan mengkloning server lain memerlukan keputusan berbeda.

Uji pencadangan dan pemulihan dengan data kecil

Simpan seluruh skrip sebagai ~/backup-roundtrip-lab.sh, lalu jalankan bash ~/backup-roundtrip-lab.sh. Siapkan tar, sha256sum, cmp, dan alat shell dasar. Skrip tidak memakai sudo dan hanya membuat berkas contoh di direktori sementara baru. Latihan pada disk yang sama ini tidak menggantikan penyimpanan cadangan independen.

set -eu
umask 077
lab_dir=$(mktemp -d)
mkdir "$lab_dir/source" "$lab_dir/restored"
printf "original data\n" > "$lab_dir/source/note with spaces.txt"
tar -C "$lab_dir/source" -cpf "$lab_dir/data.tar" .
(
    cd "$lab_dir"
    sha256sum data.tar > data.tar.sha256
    sha256sum -c data.tar.sha256
)
tar -tf "$lab_dir/data.tar"
tar -C "$lab_dir/restored" -xpf "$lab_dir/data.tar"
cmp "$lab_dir/source/note with spaces.txt" "$lab_dir/restored/note with spaces.txt"
printf "Uji pencadangan dan pemulihan berhasil: %s\n" "$lab_dir"

sha256sum memeriksa apakah byte arsip cocok dengan catatan checksum; daftar tar menunjukkan nama anggota arsip. cmp yang berhasil tidak menghasilkan keluaran dan membandingkan isi kedua berkas. Pesan Uji pencadangan dan pemulihan berhasil hanya muncul setelah seluruh langkah berhasil. Hasil itu membuktikan pemulihan isi berkas contoh, bukan enkripsi, seluruh izin, atau keberhasilan aplikasi.

sha256sum -c membandingkan berkas dengan checksum yang disimpan. Jika arsip dan catatan checksum dapat diubah bersama, pemeriksaan ini tidak membuktikan keaslian cadangan. Jangan mengekstrak arsip yang tidak dikenal sebagai administrator; mulai pemulihan nyata dari lokasi kosong yang terisolasi.

Cadangkan konfigurasi Nginx dan satu folder pengguna

Contoh berikut mencadangkan /etc/nginx setelah latihan konfigurasi situs dan satu folder dokumen biasa di home. Tentukan folder sebenarnya dan hentikan sementara penyuntingan, sinkronisasi, serta penulisan aplikasi agar isinya konsisten. Contoh ini tidak mencadangkan basis data aktif atau volume Docker secara konsisten.

Catat mountpoint, yaitu lokasi pemasangan sistem berkas, dan UUID (Universally Unique Identifier) dari disk cadangan terpisah pada latihan fstab. Pastikan perangkat atau penyimpanan di baliknya benar-benar terpisah dari risiko kegagalan sumber. UUID berbeda menunjukkan sistem berkas berbeda, tetapi bukan bukti disk fisik atau media induk VM berbeda.

Simpan seluruh blok sebagai ~/backup-course-data.sh. Diperlukan Bash, GNU tar, findmnt dari util-linux, serta realpath dan sha256sum dari coreutils. Berikan folder sumber, mountpoint sistem berkas cadangan itu sendiri, dan UUID yang telah diverifikasi. Misalnya, sesuaikan bash ~/backup-course-data.sh "$HOME/Documents/course-data" /srv/backup UUID_SEBENARNYA dengan nilai lokal yang benar; jangan memakai teks pengganti sebagai UUID. Periksa kapasitas tujuan sebelum menjalankan skrip; keluaran df di dalamnya hanya menampilkan ruang yang tersedia, bukan menghitung apakah seluruh cadangan akan muat.

set -eu
umask 077
if [ "$#" -ne 3 ]; then
    printf 'Pemakaian: bash backup-course-data.sh DIREKTORI_SUMBER MOUNT_CADANGAN UUID_YANG_DIVERIFIKASI\n' >&2; exit 2
fi
source_dir=$(realpath -- "$1")
backup_mount=$(realpath -- "$2")
expected_uuid=$3
case "$source_dir" in
    "$HOME"/*) ;;
    *) printf 'Pilih folder data biasa yang spesifik di dalam direktori home Anda.\n' >&2; exit 1 ;;
esac
test -d "$source_dir"
if [ -z "$expected_uuid" ] || [ "$expected_uuid" = REPLACE_WITH_VERIFIED_UUID ]; then
    printf 'Catat UUID sistem berkas cadangan yang sebenarnya terlebih dahulu.\n' >&2; exit 1
fi
actual_uuid=$(findmnt -rn --mountpoint "$backup_mount" -o UUID || true)
if [ "$actual_uuid" != "$expected_uuid" ]; then
    printf 'Sistem berkas cadangan yang diharapkan tidak terpasang; hentikan.\n' >&2; exit 1
fi
for original in "$source_dir" /etc/nginx; do
    original_uuid=$(findmnt -rn --target "$original" -o UUID)
    if [ -z "$original_uuid" ] || [ "$original_uuid" = "$actual_uuid" ]; then
        printf 'Gunakan sistem berkas cadangan terpisah yang sudah diverifikasi.\n' >&2; exit 1
    fi
done
case "$backup_mount/" in
    "$source_dir/"*) printf 'Cadangan harus berada di luar pohon direktori sumber.\n' >&2; exit 1 ;;
esac
sudo test -d /etc/nginx
df -h "$source_dir" "$backup_mount"
set_dir=$(sudo mktemp -d "$backup_mount/ubuntu-course-backup.XXXXXX")
sudo chmod 0700 "$set_dir"
sudo tar --acls --xattrs --numeric-owner -C / -cpf "$set_dir/nginx.tar" etc/nginx
sudo tar --acls --xattrs --numeric-owner -C "$source_dir" -cpf "$set_dir/user-data.tar" .
sudo sh -c 'cd "$1" && sha256sum nginx.tar user-data.tar > SHA256SUMS && sha256sum -c SHA256SUMS' sh "$set_dir"
printf 'Set cadangan: %s\n' "$set_dir"

findmnt --mountpoint dan --target memiliki tujuan berbeda: yang pertama memeriksa titik pemasangan yang ditentukan, sedangkan yang kedua mencari sistem berkas yang memuat suatu jalur. Jika mount atau UUID tidak cocok, skrip berhenti sebelum membuat arsip. Keberhasilan mencetak lokasi set baru dan dua hasil checksum OK; simpan lokasi ini untuk pemulihan.

Skrip tidak berhenti untuk meminta konfirmasi setelah menampilkan df. Perubahan mount saat skrip berjalan masih dapat terjadi; pemeriksaan awal bukan penguncian mount. Jalankan dalam kondisi penyimpanan stabil dan periksa kegagalan tar atau checksum. Jika berhenti di tengah, pertahankan dan periksa set parsial; jangan menandainya sebagai cadangan berhasil.

Arsip nginx.tar hanya mencakup /etc/nginx. Konten situs di /srv, target symlink di luar pohon itu, atau berkas sertifikat di lokasi lain perlu dicakup secara terpisah. Tar tidak mengikuti target symlink secara default. Direktori set berizin 0700 membatasi akses ke root, tetapi bukan enkripsi untuk melindungi disk yang hilang.

Pulihkan ke lokasi kosong dan bandingkan

Gunakan hanya set tepercaya yang baru dibuat. Simpan blok sebagai ~/restore-course-data.sh dan jalankan bash ~/restore-course-data.sh DIREKTORI_SET_CADANGAN setelah mengganti argumennya dengan jalur set yang dicetak. Periksa kapasitas serta pemetaan UID/GID. Ekstraksi dilakukan ke direktori /var/tmp baru, bukan ke /etc/nginx aktif atau folder pengguna asli.

set -eu
if [ "$#" -ne 1 ]; then
    printf 'Pemakaian: bash restore-course-data.sh DIREKTORI_SET_CADANGAN\n' >&2; exit 2
fi
set_dir=$(realpath -- "$1")
sudo test -f "$set_dir/SHA256SUMS"
sudo sh -c 'cd "$1" && sha256sum -c SHA256SUMS' sh "$set_dir"
restore_dir=$(sudo mktemp -d /var/tmp/ubuntu-course-restore.XXXXXX)
sudo chmod 0700 "$restore_dir"
sudo mkdir "$restore_dir/config" "$restore_dir/data"
sudo tar --acls --xattrs --same-owner -C "$restore_dir/config" -xpf "$set_dir/nginx.tar"
sudo tar --acls --xattrs --same-owner -C "$restore_dir/data" -xpf "$set_dir/user-data.tar"
sudo ls -ldn "$restore_dir/config/etc/nginx" "$restore_dir/data"
printf 'Pemulihan terisolasi: %s\n' "$restore_dir"

Checksum harus berhasil sebelum direktori pemulihan dibuat. Jalur keluaran Pemulihan terisolasi menunjuk hasil ekstraksi; ekstraksi konfigurasi mempertahankan jalur etc/nginx di bawah subdirektori config. Gunakan jalur tersebut pada perbandingan berikut dan sesuaikan source_dir dengan folder yang benar-benar dicadangkan.

restore_dir=/var/tmp/REPLACE_WITH_PRINTED_RESTORE_DIRECTORY
source_dir="$HOME/Documents/course-data"
sudo diff --no-dereference -r /etc/nginx "$restore_dir/config/etc/nginx"
sudo diff --no-dereference -r "$source_dir" "$restore_dir/data"

Jalankan kedua diff secara terpisah dan periksa status masing-masing. Tanpa keluaran dan status 0 berarti isi yang dibandingkan cocok; status 1 berarti ada perbedaan, sedangkan status lain menandakan kesalahan. Jika sumber berubah setelah pencadangan, perbedaan itu belum membuktikan kerusakan cadangan. Opsi --no-dereference membandingkan symlink sebagai tautan, bukan mengikuti targetnya.

Bandingkan isi penting, nomor pemilik serta mode dari ls -ln, dan ACL/xattr yang diperlukan melalui getfacl/getfattr; siapkan paket acl/attr jika belum tersedia. Opsi metadata GNU tar mencakup --acls, --xattrs, --numeric-owner, dan --same-owner. Dukungan dan kebijakan pemulihan setiap jenis atribut tetap perlu diuji pada sistem berkas nyata. diff isi berkas saja tidak memeriksa seluruh metadata.

Ekstraksi belum menyelesaikan pemulihan layanan. Pada server pemulihan terpisah, validasi konfigurasi dan fungsi aplikasi sebelum menerapkan pemulihan nyata. Jangan langsung menyalin hasil ke konfigurasi aktif atau melakukan reload di server produksi. Setelah selesai, periksa jalur dan isi sebelum membersihkan hanya direktori perbandingan yang Anda buat.

Siapkan penyimpanan independen dan deteksi kegagalan

Direktori tujuan yang ada tidak membuktikan disk eksternal atau host cadangan sedang terhubung. Bandingkan SOURCE dan UUID mount dengan identitas yang dicatat dan hentikan penulisan jika tidak cocok. Menulis ke direktori mount yang sedang kosong karena disk tidak terpasang dapat memenuhi disk sistem. Untuk penyimpanan tanpa UUID lokal, rancang pemeriksaan identitas yang sesuai; jangan menghapus pemeriksaan ini sekadar agar skrip lolos.

Rencanakan kapasitas, akses dekripsi, retensi beberapa generasi, serta salinan di lokasi lain atau offline berdasarkan kebutuhan pemulihan. Panduan pencadangan shell Ubuntu memberi contoh tar dan pemulihan ke direktori berbeda.

Otomatiskan setelah uji pemulihan manual berhasil. Catat status keluar, keberhasilan terakhir, generasi tersimpan, dan kegagalan ruang penyimpanan, lalu uji jalur notifikasi. Jika perlu perlindungan dari perubahan sengaja, gunakan catatan verifikasi independen atau retensi yang tidak dapat diubah, bukan hanya hash di samping arsip yang dapat ditulis.

Nilai pemulihan dari data dan perilaku layanan

Di tujuan, periksa jumlah berkas, isi penting, kepemilikan, dan izin, lalu uji baca/tulis aplikasi serta login pengguna. Periksa DNS, sertifikat, folder bersama, dan kelanjutan pencadangan sesuai layanan yang dipulihkan. Catat lama pemulihan dan perubahan yang hilang; perbaiki frekuensi atau prosedur jika melewati batas yang dapat diterima. Pertahankan sumber yang gagal sampai bukti dan data yang diperlukan sudah diamankan.