Bagaimana cara menyalin direktori dengan melestarikan hardlink?


40

Bagaimana cara memindahkan direktori yang memiliki file yang sama dari satu ke partisi lain?

Mari kita asumsikan kita memiliki partisi yang terpasang pada /mnt/Xdirektori yang berbagi file dengan hardlink. Cara memindahkan direktori tersebut ke partisi lain, biarkan /mnt/Ydengan menjaga hardlink tersebut.

Untuk ilustrasi yang lebih baik apa yang saya maksud dengan "direktori berbagi file yang sama dengan hardlink", berikut adalah contohnya:

# let's create three of directories and files
mkdir -p a/{b,c,d}/{x,y,z}
touch a/{b,c,d}/{x,y,z}/f{1,2,3,4,5}
# and copy it with hardlinks
cp -r -l a hardlinks_of_a

Untuk lebih spesifik, mari kita asumsikan bahwa ukuran total file adalah 10G dan setiap file memiliki 10 hardlink. Pertanyaannya adalah bagaimana cara memindahkannya ke tujuan dengan menggunakan 10G (seseorang mungkin mengatakan tentang menyalinnya dengan 100G dan kemudian menjalankan deduplikasi - bukan itu yang saya tanyakan)

Jawaban:


29

Jawaban pertama: Cara GNU

cp -aSalinan GNU secara rekursif mempertahankan struktur dan metadata sebanyak mungkin. Tautan keras antara file dalam direktori sumber termasuk di dalamnya. Untuk memilih pelestarian tautan keras secara khusus tanpa semua fitur lainnya -a, gunakan --preserve=links.

mkdir src
cd src
mkdir -p a/{b,c,d}/{x,y,z}
touch a/{b,c,d}/{x,y,z}/f{1,2,3,4,5}
cp -r -l a hardlinks_of_a
cd ..
cp -a src dst

3
+1 pada tar, -1 untuk menggunakan argumen khusus gnu untuk cp.
WhyNotHugo

Anda memberi tiga jawaban dalam satu. Bisakah Anda membaginya menjadi tiga sehingga mereka dapat dikomentari dan dievaluasi secara terpisah? (Kiat: Anda dapat mengedit ini, hanya menyisakan satu - misalnya "cp -a". Kemudian tambahkan dua lagi, untuk "tar" dan "pax")
Grzegorz Wierzowiecki

1
@GrzegorzWierzowiecki berpisah
Alan Curry

6
@ Hugo: tidak ada yang salah dengan menggunakan arg khusus GNU ke alat standar. Versi GNU adalah standar de-facto hari ini, dan bahkan ketika mereka belum diinstal, itu adalah praktik umum untuk menginstal alat GNU (saya tahu saya selalu melakukannya - mereka hanya lebih baik daripada, misalnya, versi solaris dan * bsd) , dan mereka memberikan konsistensi antara * nixes yang berbeda). Mungkin praktik yang baik untuk menunjukkan GNUisms ketika Anda menggunakannya tetapi tidak diperlukan. Grzegorz juga tidak mengatakan "tidak di linux" jadi masuk akal untuk berasumsi bahwa itulah lingkungan yang dia bicarakan.
cas

1
@WhyNotHugo: Bagaimana POSIX "mungkin lebih standar?". POSIX adalah barang yang membawa kita ke tempat kita sekarang. Tahukah Anda bahwa semua versi Windows sejak Windows NT sepenuhnya kompatibel dengan POSIX? Mereka memiliki batasan panjang jalur 255 karakter saat menggunakan fungsi I / O file POSIX, yang menjadikannya tidak berguna. Tahukah Anda bahwa Solaris, Irix, HP-UX semuanya kompatibel dengan POSIX, namun semua argumen untuk alat mereka berbeda (misalnya tar). cp -a adalah persyaratan minimum untuk setiap versi cp yang ingin mengganti salinan GNU.
Johannes Overmann

37

rsync memiliki -Hatau --hard-linksopsi untuk ini, dan memiliki manfaat rsync yang biasa untuk dapat dihentikan dan dimulai kembali, dan dijalankan kembali untuk secara efisien menangani file yang diubah selama / setelah menjalankan sebelumnya.

-H, --hard-links
    This tells rsync to look for hard-linked files in
    the source and link together the corresponding
    files on the destination.  Without  this option,
    hard-linked files in the source are treated as
    though they were separate files. [...]

Baca rsynchalaman manual dan cari -H. Ada lebih banyak detail di sana tentang peringatan tertentu.


2
Saya sudah memeriksa - itu berhasil.
Grzegorz Wierzowiecki

ya saya tahu. Saya telah menggunakannya selama bertahun-tahun di skrip cadangan saya. juga untuk memindahkan file antar sistem file seperti pada pertanyaan Anda.
cas

rsync menggunakan banyak memori ketika membangun daftar file-nya. Bagi saya setelah berjam-jam "Membangun daftar file ..." itu mengisi 16GB memori saya dan dijamin tidak menyalin apa pun. YMMV.
msc

2
Dari man rsync: Dimulai dengan rsync 3.0.0, algoritma rekursif yang digunakan sekarang adalah pemindaian bertahap yang menggunakan memori jauh lebih sedikit daripada sebelumnya dan memulai transfer setelah pemindaian beberapa direktori pertama telah selesai. Pemindaian tambahan ini hanya memengaruhi algoritme rekursi kami, dan tidak mengubah transfer non-rekursif. Ini juga hanya mungkin ketika kedua ujung transfer setidaknya versi 3.0.0. Perhatikan bahwa baik --delete-beforedan --delete-afternonaktifkan algoritma yang ditingkatkan ini.
cas

Selain itu, meski rsyncjuga sangat berguna, ini tidak selalu merupakan alat terbaik untuk setiap pekerjaan. Hari-hari ini, saya lebih suka menggunakan dataset ZFS sehingga saya bisa memotret dan zfs sendmereka - saya kebanyakan menggunakan rsync pada sistem file non-ZFS. btrfsmemiliki snapshot + kemampuan kirim yang sama.
cas

14

Jawaban ketiga: Cara POSIX

POSIX belum membakukan standar tarutilitas, meskipun mereka telah membakukan tarformat arsip. Utilitas POSIX untuk memanipulasi arsip tar disebut paxdan ia memiliki fitur bonus untuk dapat melakukan paket dan membongkar operasi dalam satu proses tunggal.

mkdir dst
pax -rw src dst

10

Jawaban kedua: The Ancient UNIX Way

Buat arsip tar di direktori sumber, kirim melalui pipa, dan bongkar di direktori tujuan.

# create src as before
(cd src;tar cf - .) | (mkdir dst;cd dst;tar xf -)

1
dicentang -> bekerja. Hardlink dipertahankan.
Grzegorz Wierzowiecki

1
Adakah wawasan mengapa hal ini benar-benar melindungi hardlink?
peterph

1
Karena tarmempertahankan tautan keras. Di GNU tar, setidaknya, Anda dapat menonaktifkan perilaku ini dengan--hard-dereference
cas

Dalam kasus saya, mencoba untuk menyalin hierarki direktori besar (cadangan TimeMachine), tar mempertahankan beberapa tautan keras tetapi mereplikasi file dalam beberapa kasus. Saya pikir ini karena tar xtidak memiliki daftar file lengkap karena file masih disalurkan dari tar c. Mungkin jika Anda menyimpan seluruh arsip sebelum mengekstraknya, tidak apa-apa. Saya akan sangat senang jika seseorang dapat mengkonfirmasi teori itu.
msc

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.