rsync dan tautan simbolik

69

Saya ingin membuat cadangan direktori rumah saya ke drive eksternal setiap malam menggunakan cronpekerjaan untuk dieksekusi rsync. Saya tidak yakin dengan perilaku yang tepat dari rsyncflag tautan simbolik.

  1. rsync's -abendera termasuk -lbendera (yaitu 'menyalin symlink sebagai symlink'). Apakah ini hanya berarti itu akan menyalin tautan atau bahwa ia akan mengikuti tautan dan menyalin semua yang ada di direktori tautan-ke? Saya ingin menghindarinya karena saya memiliki tautan ke direktori yang penuh dengan file media yang akan melibatkan penyalinan ratusan gigabyte saya tidak perlu membuat cadangan.
  2. Khawatir (tetapi tidak pasti) yang rsync -aakan menyalin semua file media itu, saya malah menambahkan --no-linksbendera. Ini sepertinya bukan perilaku yang saya inginkan. Itu hanya mengabaikan menyalin tautan apa pun yang bermasalah karena saya memiliki tautan yang ingin saya salin (mis. Tautan ke file header umum dari berbagai direktori proyek).
  3. Dengan asumsi # 1 di atas (tanpa --no-linksbendera) adalah yang benar-benar saya inginkan dan itu hanya menyalin tautan tanpa menyalin file yang ditautkan, apakah tautan akan putus saat dicadangkan? Sebagai contoh saya dapat rsyncmencari direktori /home/me/projects/miscke /media/extdrive/backup/home/me/projects/misc. Dalam hal ini saya anggap rsynctidak cukup pintar juga tidak mencoba untuk memperbaiki konten symlink untuk perubahan direktori relatif. Apakah ini benar? Ini tidak apa-apa, tidak masalah jika tautannya rusak di direktori cadangan selama mereka akan diperbaiki dan berfungsi jika tiba saatnya ketika mereka perlu dipulihkan.
sean
sumber
3
Bendera -L mungkin yang Anda inginkan. Dari halaman manual rsync di Centos Linux: "-L, --copy-links mengubah symlink menjadi file referensi / dir." Saya merekomendasikan pengujian ini dengan beberapa direktori contoh dan tautan untuk memastikan Anda tidak menimpa data apa pun yang tidak Anda inginkan. Diedit untuk memasukkan peringatan tentang kemungkinan kehilangan data. ;)
Mick T

Jawaban:

90
  1. "Salin symlinks sebagai symlinks" berarti persis seperti yang dikatakannya: Jika rsync melihat symlink di direktori sumber, itu akan membuat symlink identik di tujuan. Tidak ada lagi.

    (Beberapa baris di halaman manual, opsi yang berbeda--copy-links ,, menjelaskan perilaku yang berlawanan (selalu menyalin data) yang Anda gambarkan sebagai tidak diinginkan.)

    Lihat juga bagian "Tautan simbolik":

    Jika --linksditentukan, maka symlink dibuat kembali dengan target yang sama di tujuan.

  2. Ini bukan perilaku yang Anda inginkan karena Anda salah menafsirkan apa yang --linksdilakukan dan karena itu meminta perilaku yang salah (lihat jawaban # 1).

  3. Secara default, ini menyalin tujuan dengan tepat.

    Yaitu, jika tautan menunjuk ke jalur absolut (misalnya /home/me/projects), tautan akan terus mengarah ke jalur yang sama; itu tidak akan rusak , itu hanya akan terus menunjuk ke file di direktori home Anda daripada yang ada di cadangan Anda.

    Sementara itu, jika tautan menunjuk ke jalur relatif (mis. ../../projects), Tautan juga akan terus mengarah ke jalur yang sama, tetapi karena relatif terhadap lokasi symlink, symlink di cadangan Anda juga akan menunjuk ke sebuah file di cadangan Anda.

    Sayangnya sepertinya tidak ada pilihan untuk menerjemahkan symlink absolut untuk basis baru mereka (hanya opsi untuk menghancurkan mereka sepenuhnya). Untuk menghindari masalah, Anda harus mengubah symlink yang ada menjadi yang relatif (yang merupakan ide bagus umumnya, untuk tautan di dalam $ HOME).

grawity
sumber
2
ummm jadi apa bedanya antara --copy-linksdan --links?
Alexander Mills
--copy-links= -L, dan --links= -l. Lihat deskripsi dari dokumentasi dalam jawaban saya di sini: superuser.com/a/1388910/425838
Gabriel Staples
12

@grawity memiliki jawaban yang bagus, tetapi inilah tangkapan layar dari beberapa info yang relevan dari dokumentasi. Inilah kata-kata -ldan -Lopsi yang tepat, misalnya, yang tampaknya paling relevan dalam pertanyaan:

masukkan deskripsi gambar di sini

Sumber: https://linux.die.net/man/1/rsync , atau man rsynchalaman manual di Linux.

Perhatikan juga bahwa opsi -a( --archive) juga menyertakan -lopsi di dalamnya, yang luar biasa, karena saya sangat suka menggunakan -lopsi untuk melestarikan symlink saya dari sumber sebagai symlink di tujuan. Dari halaman manual:

-a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)

Catatan, untuk rsyncperintah dan instruksi favorit saya , termasuk menyalin, membuat mirroring, menampilkan kemajuan total ...

... melakukan dry run, mencatat stderr dan stdout ke file (terpisah), memperlihatkan statistik, menggunakan file path include dan file kecualikan , dll, lihat jawaban lengkap saya di sini di bagian 2, berjudul " 2. rsync Command-line alat (Linux, Windows dengan Cygwin) ": https://superuser.com/a/1464264/425838

Gabriel Staples
sumber