Restic: Opsi cadangan untuk menghapus awalan jalur utama

Dibuat pada 16 Nov 2018  ·  24Komentar  ·  Sumber: restic/restic

Keluaran restic version

restic 0.9.3 compiled with go1.11.1 on linux/amd64

Apa yang harus dilakukan restic secara berbeda? Menurut Anda, fungsionalitas mana yang harus kami tambahkan?

Akan sangat membantu untuk memiliki opsi ke restic backup yang mengatakan "hapus jalur utama ini dari jalur semua file yang dicadangkan." Misalnya, --backup-root /some/path . Ini akan memiliki efek berikut:

  • File /some/path/to/file akan disimpan dalam snapshot sebagai /to/file .
  • File ini juga akan melakukan pemeriksaan metadata terhadap /to/file di snapshot induk.
  • Anda tidak diizinkan untuk menentukan file/direktori ke restic backup yang tidak dimulai dengan awalan ini.

(Saya pikir ini mungkin terkait dengan #1376.)

Apa yang sedang Anda coba lakukan?

Salah satu skrip cadangan kami dijalankan pada sistem dengan banyak layanan berjalan yang tidak dapat dihentikan. Layanan ini menjamin bahwa pemulihan dimungkinkan dari titik waktu tertentu (misalnya, mereka melakukan penjurnalan yang cukup untuk mendapatkan data mereka kembali dalam keadaan konsisten setelah pemadaman listrik). Namun, cadangan restic tidak bersifat atomik; oleh karena itu, cadangan restic merusak jaminan pemulihan dari layanan.

Untuk memperbaikinya, kami:

  1. Ambil snapshot LVM dari / . Snapshot adalah salinan tingkat blok atom dari seluruh volume.
  2. Pasang snapshot LVM di bawah /mnt/backup-snapshot .
  3. Jalankan cadangan restic terhadap /mnt/backup-snapshot .
  4. Lepas snapshot LVM.
  5. Hapus cuplikan LVM.

Ini membuat pencadangan benar-benar tepat waktu dan menjamin bahwa pencadangan yang dipulihkan secara efektif dalam keadaan yang konsisten.

Sayangnya, ini juga menyebabkan file disimpan di repositori restic kami dengan awalan (tidak berguna) /mnt/backup-snapshot . Hal ini dapat memperumit upaya pemulihan, dan juga sedikit membingungkan jika Anda tidak mengetahui detail bagaimana cadangan dibuat.

Satu-satunya solusi yang layak yang dapat saya pikirkan adalah menjalankan pencadangan di dalam chroot. Meskipun bukan akhir dunia, mungkin lebih baik bagi restic untuk memberikan opsi untuk menghapus beberapa awalan utama dari file.

backup need direction feature suggestion

Komentar yang paling membantu

Halo semua, saya sudah mulai menerapkan fungsi "root kustom" ini. Implementasinya sendiri tampaknya sederhana, meskipun saya harus belajar golang karena sebelumnya hanya mengenal C#... Bagaimanapun, saya mencoba mengukur dukungan apa yang masih dimiliki masalah ini, mengingat ini berasal dari 2018, 2 tahun yang lalu . Saya akan berkomitmen untuk https://github.com/TheRealVincentVanGogh/restic/tree/2092-feature-custom-path-prefix segera, jika ada yang ingin membantu saya dengan golang . Mudah-mudahan segera nanti, saya akan mengajukan permintaan tarik di sini.

Semua 24 komentar

Inilah inkarnasi yang lebih tua dari permintaan ini yang saya temukan: #555

+1

Saya juga berpikir ini akan menjadi fitur yang sangat berguna.

Jadi, izinkan saya meringkas: Anda menjalankan restic backup /mnt/backup-snapshot , jadi file /mnt/backup-snapshot/foo adalah /mnt/backup-snapshot/foo dalam snapshot, tetapi Anda ingin menjadi /foo . Apakah itu benar?

Anda dapat mencapainya dengan restic > 0.9.0 dengan mengubah direktori saat ini, jalankan saja cd /mnt/backup-snapshot dan kemudian restic backup . .

Apakah itu berhasil untuk Anda?

Mengubah cwd berfungsi, tetapi saya perhatikan ada efek samping yang tidak menyenangkan jika menggunakan file untuk disertakan/dikecualikan. Tampaknya jika jalur absolut ditempatkan di sana, maka jalur tersebut akan dilewati saat mengubah cwd . Saya lebih suka menggunakan jalur absolut juga - untuk saat ini saya mungkin akan menuju ke jalur chroot, tapi saya setuju akan lebih baik untuk memiliki sesuatu yang mirip dengan flag -C di tar .

Saya pikir opsi root palsu ini akan menjadi fitur yang berguna. Saya ingin sama seperti cdhowie tetapi dengan snapshot apfs di macOS. Untuk mengakses snapshot apfs readonly, snapshot tersebut harus dipasang di suatu tempat. Tetapi ketika memulihkan, saya ingin jalur "asli" menjadi jalur kanonik yang disimpan dalam snapshot.

trik cd sayangnya tidak optimal karena saya memiliki banyak (125) jalur absolut yang dikumpulkan dari StdExclusions.plist (daftar pengecualian cadangan standar macOS) dan semua file dan folder yang dapat ditemukan mdfind dengan set atribut com_apple_backup_excludeItem.

Tinggalkan masalah jika Anda memasukkan /mnt ke dalam file abaikan dan memulai pencadangan dari /mnt/fs-snapshot itu akan mengecualikan dirinya sendiri.

Ditambah cd $path && restic backup . masih memberikan $path di ikhtisar snapshot, sementara path di snapshot berbasis /.

Saya menemukan solusi dengan root.

Saya juga ingin menemukan cara untuk menghapus awalan jalur. Kasus penggunaan saya sedikit berbeda - Saya membuat snapshot zfs ( fs@$(date +%s) ) dan ingin mencadangkannya tanpa harus memasangnya ( /path/to/mount/.zfs/snapshots/${TS} ) - dengan cara ini semoga saya tidak punya khawatir tentang snapshot yang tidak dilepas dan kemudian berkeliaran selamanya jika terjadi sesuatu yang mogok.

Output restic forget untuk ini membuat saya berpikir bahwa snapshot dengan jalur berbeda tidak akan dilupakan sesuai jadwal (harian/mingguan/dll.).

Komentar proot dari @blurayne adalah titik awal yang bagus, saya pikir saya sampai pada kesimpulan yang sama:

$snap_path="/path/to/where/snapshot/is/accessible"
$orig_fs="/path/to/filesystem"
proot -b "${snap_path}":"${orig_fs}" restic backup "${orig_fs}"

Ini bekerja dengan baik, dan sekarang semua snapshot memiliki jalur yang sama, tanpa cd atau pushd diperlukan. Juga, proot tersedia di ruang pengguna, jadi jika pencadangan tidak dilakukan sebagai root, itu masih mungkin.

Kasus penggunaan saya: membuang data basis data ke direktori sementara, seperti /tmp/tmpzmn28r02 (diperoleh melalui mktemp atau python's mkdtemp()) dan kemudian mencadangkannya.
Metode ini akan menandai semua file di antara 2 snapshot sebagai berbeda. Jadi saya perlu cara untuk memberi tahu restic untuk sepenuhnya mengabaikan awalan direktori sementara.
Kasus penggunaan lain yang mungkin: hari ini saya memiliki semua gambar saya ke dalam '/mnt/sesuatu/gambar' tetapi besok, konten yang sama akan berada di bawah '/mnt/eksternal/gambar-dari-rumah' (skema partisi yang berbeda/apa pun)

Juga, jika Anda ingin menggunakan restic dan backup beberapa direktori dalam proses yang sama, untuk menggunakan snapshot yang sama, ini menjadi lebih rumit.

Sampai perbaikan selesai, saya akan menggunakan proposal 'proot' - terima kasih @blurayne dan @whi-tw

Hai! Saya memiliki kasus serupa. Misalnya saya punya folder

/srv/my/long/server1/path/data (with many subfolders and dozen of files)
/path/to/dump.sql
/path/certbot.tar.gz

jadi saya ingin mendapatkan cadangan seperti

/data
/dump.sql
/certbot.tar.gz

dan dapatkan kemampuan untuk memulihkan di server lain (saya tidak tahu tentang struktur folder sebelumnya) dengan jalur yang berbeda (relatif).

Saya tidak punya ide untuk menyelesaikan tugas sepele ini. Restic adalah alat yang luar biasa tapi ... mengapa itu bekerja sangat sulit bagi pengguna akhir?

Saya menyalin di folder cadangan yang telah ditentukan (/ cadangan) semua yang saya butuhkan dan di sana jalankan cadangan Restic (melalui cd). Tetapi solusi ini hanya berfungsi untuk sejumlah kecil data.

Akan sangat bagus untuk memiliki kemampuan memulihkan dengan --include subfolder tepat setelah template (atau termasuk topeng ini). mantan.:
restic restore --include data --target /my/new/path
dan dapatkan hasilnya
/my/new/path/data


Terima kasih @whi-tw untuk solusi dengan proot -b /path/i/wanted:./path_in_repo restic backup . - ini berhasil untuk saya.

Kasus penggunaan saya memigrasikan snapshot dari solusi cadangan lain ke restic (Time Machine dan gambar disk dalam kasus saya).

Saya memigrasikannya dari tempat saya memasang gambar atau subdirektori snapshot yang dibuat oleh TM, yang bisa menjadi sangat panjang, misalnya /Volumes/TimeMachine-Backups/Backups.backupdb/MacBook Pro/2019-05-22-185113/Macintosh SSD/ .

Solusi cd berfungsi saat menggunakan restic mount dan restic restore , tetapi jalur absolut dari snapshot asli terdaftar ketika saya menjalankan restic snapshots .

Karena ini adalah snapshot yang dimigrasikan, saya ingin itu menjadi jalur dari mana snapshot asli diambil juga. Selain itu, dengan jalur yang panjang, juga membuat output restic snapshots sedikit bising.

Bendera untuk menetapkan awalan alternatif juga ideal untuk saya.

Ini bekerja dengan baik, dan sekarang semua snapshot memiliki jalur yang sama, tanpa cd atau pushd diperlukan. Juga, proot tersedia di ruang pengguna, jadi jika pencadangan tidak dilakukan sebagai root, itu masih mungkin.

Ini akan menjadi solusi yang bagus, tetapi proot tidak tersedia di macOS dan sepertinya tidak akan datang dalam waktu dekat (sebagian besar kode yang ditulis khusus untuk Linux): Apakah PROot berfungsi di MacOSX?

Apakah ada solusi lain yang terlintas dalam pikiran?

Kasus penggunaan saya: membuang data basis data ke direktori sementara, seperti /tmp/tmpzmn28r02 (diperoleh melalui mktemp atau python's mkdtemp()) dan kemudian mencadangkannya.
Metode ini akan menandai semua file di antara 2 snapshot sebagai berbeda.

Perhatikan bahwa file mungkin _are_ berbeda pula; backup database biasanya menyertakan cap waktu di beberapa baris pertama.

Anda dapat menyetel perintah dump basis data untuk mengecualikan komentar dinamis dan diurutkan berdasarkan kunci utama meskipun untuk membuat data yang berubah lambat benar-benar dapat dikurangkan

Pembaruan: 'proot' hanya berfungsi di satu mesin untuk saya, di mesin lain itu segfaults.
Alternatif untuk itu (lebih baru) - bubblewrap
Menambahkan pembungkus di atasnya (terlampir) yang seharusnya bekerja dengan parameter '-b' yang sama. Tampaknya bekerja sejauh ini. Perhatikan bahwa tergantung pada kebutuhan dan lokasi direktori Anda, Anda mungkin harus sedikit mengubah pembungkusnya.
Saya harap ini membantu kalian, tetapi saya menantikan dukungan di dalam restic itu sendiri.

proot.sh.txt

Saya mencoba proot . Tampaknya merusak kemampuan untuk menjalankan restic sebagai non-root dengan kemampuan tambahan (https://restic.readthedocs.io/en/stable/080_examples.html#full-backup-without-root); setidaknya saya mendapatkan scan: Open: open /.pulse: permission denied kesalahan yang tidak saya dapatkan saat menjalankan restic tanpa proot .

Masalah yang sama dengan bwrap .

Jadi bagi saya, menghapus awalan jalur di restic itu sendiri tampaknya masih berguna.

Fitur yang hilang ini membuat pencadangan VM menjadi lebih sulit daripada yang diperlukan.
Snapshot VM saya berakhir di folder sementara dan kemudian dicadangkan oleh restic.
Ini menghasilkan hal berikut:

ID        Time                 Host         Tags        Paths
--------------------------------------------------------------------------------------
02c536db  2020-04-10 14:28:27  resolver-02              /tmp/tmp.vOFFxxly9O/config.xml
c5709aed  2020-04-10 14:28:29  resolver-02              /tmp/tmp.vOFFxxly9O/sdb.img
a88cc1e7  2020-04-10 14:36:22  resolver-02              /tmp/tmp.FoY1j5JPIZ/config.xml
7c44e6ee  2020-04-10 14:36:24  resolver-02              /tmp/tmp.FoY1j5JPIZ/sdb.img
65456111  2020-04-10 14:37:48  resolver-02              /tmp/tmp.vjtI9JE3Iz/config.xml
eaced756  2020-04-10 14:37:49  resolver-02              /tmp/tmp.vjtI9JE3Iz/sdb.img
8eccec2c  2020-04-10 16:04:30  resolver-02              /tmp/tmp.YtLYRd0rNI/config.xml
34c897e1  2020-04-10 16:04:31  resolver-02              /tmp/tmp.YtLYRd0rNI/sdb.img
99b67b97  2020-04-10 16:07:53  resolver-02              /tmp/tmp.aWaEDqAaTq/config.xml
cad2c9d8  2020-04-10 16:07:54  resolver-02              /tmp/tmp.aWaEDqAaTq/sdb.img
--------------------------------------------------------------------------------------

Ini merusak restic forget karena tidak mengenali file yang sama dan menyimpan snapshot untuk setiap instance. Saya lebih suka jika ada cara untuk menghapus awalan yang diketahui atau hanya menyimpan jalur relativ, tidak ada absolut.
Saya sudah memanggil restic dengan jalur relativ dan ching di folder sementara. Sayangnya tidak membantu dan saya lebih suka tidak harus menggunakan bindmounts untuk ini.

Ini merusak restic forget karena tidak mengenali file yang sama dan menyimpan snapshot untuk setiap instance.

Kami juga mengalami ini, tetapi solusinya cukup mudah: beri tag setiap cadangan berdasarkan file yang dicadangkan.

Misalnya, Anda dapat menggunakan tag config.xml dan sdb.img sini. Kemudian tambahkan --group-by host,tags saat menjalankan restic forget .

Apa yang membuat fitur ini begitu sulit untuk diterapkan? Bukankah itu hanya pemfilteran string dasar yang sama pada metadata snapshot? Nilai yang akan dibawanya sangat besar. Ya, Anda dapat mengatasinya dengan penandaan, tetapi ada bidang jalur dan itu bisa digunakan ...

Apa yang membuat fitur ini begitu sulit untuk diterapkan?

Berbicara sebagai pengembang sendiri (bukan dari restic, tetapi proyek open source lainnya): seringkali bukan kerumitan fitur yang mencegah penerapannya, melainkan hal-hal biasa seperti kurangnya waktu, motivasi, atau sekadar "kehidupan nyata"...

Tentu saja, tujuan saya bukan untuk menjadi kritis, dengan sungguh-sungguh mencari untuk memetakan kompleksitas kontributor potensial

Halo semua, saya sudah mulai menerapkan fungsi "root kustom" ini. Implementasinya sendiri tampaknya sederhana, meskipun saya harus belajar golang karena sebelumnya hanya mengenal C#... Bagaimanapun, saya mencoba mengukur dukungan apa yang masih dimiliki masalah ini, mengingat ini berasal dari 2018, 2 tahun yang lalu . Saya akan berkomitmen untuk https://github.com/TheRealVincentVanGogh/restic/tree/2092-feature-custom-path-prefix segera, jika ada yang ingin membantu saya dengan golang . Mudah-mudahan segera nanti, saya akan mengajukan permintaan tarik di sini.

@TheRealVincentVanGogh Saya tidak akan belajar Go, tapi saya masih ingin fitur ini dan memiliki banyak cadangan Saya masih ingin port ke restic tetapi untuk masalah ini. Buka PR setelah Anda memiliki sesuatu yang sepertinya berfungsi dan kirimkan tautannya di sini, saya akan memberikan beberapa pengujian berat

@TheRealVincentVanGogh Bagaimana implementasi yang direncanakan terkait dengan PR #2010?

@TheRealVincentVanGogh Bagaimana implementasi yang direncanakan terkait dengan PR #2010?

@MichaelEischer Oh, tembak! Sepertinya seseorang sudah mengalahkanku. Ya, PR #2010 adalah persis apa yang saya di tengah-tengah ... capai kembali ... Sial. Mungkin @cdhowie dapat menautkan PR #2010 ke masalah ini untuk membantu menghindari kebingungan di masa mendatang? Terima kasih!

@themightychris Ini tautan ke PR itu . Sepertinya dev juga drop out di tahun 2018... penasaran.

Sunting:

Tampaknya ada beberapa ambiguitas antara menghapus awalan jalur dari file snapshot VS. menghapus awalan jalur dari setiap struktur file + file snapshot. Sepertinya PR #2010 hanya membahas yang pertama . Karena OP sedang mencari "hapus jalur utama ini dari jalur semua file yang dicadangkan" (AKA, perbaikan jalur level struktur file) saya harus mengambil kembali apa yang saya katakan tentang menautkan PR #2010 ke masalah ini . Maaf untuk menyebutkan cdhowie!

Namun demikian! @MichaelEischer Niat saya selalu untuk mendapatkan implementasi pemotongan awalan jalur struktur file + snapshot level di Restic (man itu fitur/kalimat yang panjang). Jadi kemungkinan besar saya akan mulai mengerjakannya dari kode PR #2010 yang ada, yang seharusnya mempercepat implementasi.

PS Saya cukup sibuk akhir-akhir ini jadi pekerjaan mungkin akan lambat untuk sementara waktu; tentu saja, saya akan memposting PR ketika saya pikir saya memiliki sesuatu yang berharga untuk dibagikan dengan kalian semua! Tetap Aman Semuanya! 😄

Apakah halaman ini membantu?
0 / 5 - 0 peringkat