Salin seluruh hierarki sistem file dari satu drive ke drive lain


95

Saya ingin menyalin seluruh hierarki sistem file dari satu drive ke drive lain..yaitu isi dari setiap direktori serta file biasa di platform Linux. Akan berterima kasih untuk mengetahui cara terbaik untuk melakukan itu dengan kemungkinan Linux built-in functions. Sistem file adalah keluarga besar.


1
Umm ... untuk apa cinta itu dd? dd if=/dev/sda1 of=/dev/sdb1 bs=4096
juniorRubyist

@juniorRubyist +1 untuk dd. Saya selalu menggunakannya. Tapi bendera mana yang digunakan? Saya menggunakan conv=notrunc,noerror,sync.
BeniBela

-1 untuk dd2 alasan: pertama adalah ide yang buruk untuk melakukan copy blok-tingkat dari sistem file yang di-mount (yang merupakan kasus untuk /) dan kedua ddtidak akan menyalin data dari sumber-sumber yang dipasang dalam sistem file seperti /bootdan /home.
Eric

Jawaban:


33

Saya sering menggunakan

> cp -ax / /mnt

Presuming / mnt adalah disk baru yang dipasang di / mnt dan tidak ada mount lain di /.

-x menyimpannya di satu sistem file.

Ini tentu saja perlu dilakukan sebagai root atau menggunakan sudo.

Tautan ini memiliki beberapa alternatif, termasuk yang di atas

http://linuxdocs.org/HOWTOs/mini/Hard-Disk-Upgrade/copy.html


sementara ini adalah jawaban yang sudah lama, masih perlu dicatat bahwa Anda biasanya TIDAK ingin menyalin semua hal yang ada di dalamnya /, tidak termasuk /dev, yaitu /sys, /procdll. Oleh karena itu sebelum mengeluarkan yang cpsaya sarankan mencari pendekatan yang lebih baik (juga menggunakan rsync)
Marcin Orlowski

2
@MarcinOrlowski WolfJM menggunakan -xflag berarti sistem file sintetis yang Anda sebutkan tidak akan disalin.
Jim L.

192

Yang Anda inginkan adalah rsync .

Perintah ini dapat digunakan untuk menyinkronkan folder, dan juga melanjutkan menyalin ketika dibatalkan setengah jalan. Perintah untuk menyalin satu disk adalah:

rsync -avxHAX --progress / /new-disk/

Opsinya adalah:

-a  : all files, with permissions, etc..
-v  : verbose, mention files
-x  : stay on one file system
-H  : preserve hard links (not included with -a)
-A  : preserve ACLs/permissions (not included with -a)
-X  : preserve extended attributes (not included with -a)

Untuk meningkatkan kecepatan penyalinan, tambahkan -W( --whole-file), untuk menghindari penghitungan delta / diff file. Ini adalah default ketika sumber dan tujuan ditetapkan sebagai jalur lokal, karena manfaat nyata dari algoritma delta-transfer rsync adalah mengurangi penggunaan jaringan.

Pertimbangkan juga --numeric-idsuntuk menambahkan agar tidak memetakan nilai uid / gid berdasarkan nama pengguna / grup.


1
Jenius, terima kasih. Btw, saya akhirnya menggunakan rsync -avxHAWX --numeric-ids --progress / mnt/tetapi saya harus melakukannya rsync -avxHAWX --numeric-ids --progress / mnt/ > ~/rsync.out. Saya curiga menuangkan output ke terminal memperlambat proses. : D
Chris K

28
--info=progress2alih-alih --progressberguna untuk transfer besar, karena memberikan kemajuan keseluruhan, alih-alih (jutaan baris untuk) file individual.
Florian

3
Saya harus mengganti Xdan Adengan E, karena atribut yang diperluas dan ACL dicakup oleh Epada mac saya. Diuji:rsync version 2.6.9 protocol version 29
Jonathan Komar

1
Selain itu > ~/rsync.out, 2> ~/rsync.errakan menyimpan kesalahan dalam file terpisah.
Aneel

2
Jika Anda menyalin dari beberapa folder selain /, perhatikan bahwa memiliki garis miring (atau tidak) pada direktori source membuat perbedaan: rsync source/ dest/salinan segala sesuatu di dalam source/untuk dest/, sementara rsync source dest/salinan folder sourcedan segala sesuatu di dalam ke dalam dest/.
semi-ekstrinsik

45

Jawaban Michael Aaron Safyan tidak memperhitungkan file yang jarang. -Sopsi memperbaikinya.

Varian ini juga tidak mengirim spam dengan setiap file yang berkembang dan tidak melakukan sinkronisasi delta yang membunuh kinerja dalam kasus-kasus non-jaringan.

Sempurna untuk menyalin sistem file dari satu drive lokal ke drive lokal lain.

rsync -axHAWXS --numeric-ids --info=progress2

1
Luar biasa. Ini benar-benar melakukan pekerjaan yang baik
Gildas

1
Ini harus menjadi jawaban yang diterima, bekerja dengan baik. Contoh55,431,669,792 57% 97.47MB/s 0:06:56 xfr#2888, ir-chk=5593/8534)
Drew

1
<3 ini sempurna
Tim Strijdhorst

6

Untuk satu salinan salinan lokal dari satu drive ke drive lain, saya kira cp cukup seperti yang dijelaskan oleh Wolfmann di atas.

Untuk karya yang lebih besar seperti cadangan lokal atau jarak jauh misalnya, yang terbaik adalah rsync .

Tentu saja, rsync secara signifikan lebih kompleks untuk digunakan.

Mengapa rsync:

  • ini memungkinkan Anda untuk menyalin (salinan tersinkronisasi) semua atau sebagian dari drive A Anda ke drive B, dengan banyak opsi, seperti mengecualikan beberapa direktori dari salinan (misalnya tidak termasuk / proc).

  • Keuntungan besar lainnya adalah alat asli ini memantau transfer file: mis. Untuk transfer besar-besaran, jika koneksi terputus, itu akan berlanjut dari breakpoint.

  • Dan last but not least, rsync menggunakan koneksi ssh, jadi ini memungkinkan Anda untuk mencapai "salinan" yang disinkronkan dengan remote. Lihat halaman manual dan juga di sini untuk beberapa contoh .


4

Seperti yang disarankan Michael Safyan di atas, saya telah menggunakan rsyncuntuk tujuan ini. Saya sarankan menggunakan beberapa opsi tambahan untuk mengecualikan direktori yang Anda mungkin tidak ingin menyalin.

Versi ini cukup spesifik untuk sistem berbasis Gnome dan Debian / Ubuntu, karena mencakup subdirektori dari direktori home pengguna yang khusus untuk Gnome, serta cache paket APT.

Baris terakhir akan mengecualikan direktori apa pun bernama cache / Cache / .cache, yang mungkin terlalu agresif untuk beberapa penggunaan:

rsync -WavxHAX --delete-excluded --progress \
  /mnt/from/ /mnt/to/
  --exclude='/home/*/.gvfs' \
  --exclude='/home/*/.local/share/Trash' \
  --exclude='/var/run/*' \
  --exclude='/var/lock/*' \
  --exclude='/lib/modules/*/volatile/.mounted' \
  --exclude='/var/cache/apt/archives/*' \
  --exclude='/home/*/.mozilla/firefox/*/Cache' \
  --exclude='/home/*/.cache/chromium'
  --exclude='home/*/.thumbnails' \
  --exclude=.cache --exclude Cache --exclude cache

2

Menambahkan dua bit yang berguna ke thread re rsync: mengubah cypher, dan menggunakan --update:

Sesuai pos Wolfman, cp -axelegan, dan keren untuk barang-barang lokal.

Namun, rsyncmengagumkan juga. Lebih jauh ke jawaban Michael -W, mengubah kode sandi juga dapat mempercepat (baca juga implikasi keamanannya).

rsync --progress --rsh="ssh -c blowfish" / /mnt/dest -auvx

Ada beberapa diskusi (dan tolok ukur) di sekitar tempat tentang CPU yang lambat menjadi hambatan yang sebenarnya, tetapi tampaknya membantu saya ketika mesin dimuat melakukan hal-hal bersamaan lainnya.

Salah satu alasan besar lainnya untuk menggunakan rsync dalam salinan rekursif yang besar seperti ini adalah karena saklar -u (atau --update ). Jika ada masalah selama penyalinan, Anda dapat memperbaikinya, dan rsync akan mengambil di mana ia tinggalkan (saya tidak berpikir scp memiliki ini). Melakukannya secara lokal, cp juga memiliki saklar -u.

(Saya tidak yakin apa implikasi dari --update dan --whole-file bersama, tetapi tampaknya selalu bekerja dengan baik untuk saya dalam jenis tugas ini)

Saya menyadari ini bukan utas tentang fitur rsync, tetapi beberapa yang paling umum saya gunakan untuk ini adalah:

  • --delete-after etc (seperti yang disebutkan Michael dalam tindak lanjut), jika Anda ingin menyinkronkan sistem baru kembali ke tempat semula atau sesuatu seperti itu. Dan,
  • --exclude - untuk melewatkan direktori / file, untuk contoh seperti menyalin / membuat sistem baru ke tempat baru sementara melewatkan direktori home user dll (baik Anda memasang rumah dari tempat lain, atau membuat pengguna baru dll).

Kebetulan, jika saya harus menggunakan windows, saya menggunakan rsync dari cygwin untuk membuat salinan rekursif yang besar, karena penjelajah yang sedikit mati otak ingin memulai dari awal (walaupun saya menemukan Finder adalah OS X lebih buruk)



2

Seperti disebutkan dalam komentar oleh juniorRubyist, pendekatan yang lebih disukai di sini adalah menggunakan dd. Alasan utamanya adalah kinerja, ini adalah salinan blok demi blok alih-alih file-demi-file.

Mengkloning partisi

# dd if=/dev/sda1 of=/dev/sdb1 bs=64K conv=noerror,sync status=progress

Mengkloning seluruh disk

# dd if=/dev/sdX of=/dev/sdY bs=64K conv=noerror,sync status=progress

Referensi

  1. https://wiki.archlinux.org/index.php/disk_cloning

ddadalah ide yang sangat buruk karena 2 alasan: pertama melakukan copy blok-tingkat dari sistem file yang dipasang (yang merupakan kasus untuk /) akan lebih dari mungkin menghasilkan kesalahan sistem file target, dan kedua ddtidak akan menyalin data dari sumber yang dipasang di dalam sistem file suka /bootdan /home. Tautan Anda valid untuk kloning disk, bukan kloning "hierarki file"
Eric

1

'dd' luar biasa, tapi ddrescue (apt install gddrescue) bahkan lebih baik. Jika dd terganggu, tidak ada cara untuk me-restart (alasan bagus lain untuk menggunakan rsync). Saat Anda menggunakan ddrescue dengan logfile, ia melacak blok mana yang telah disalin.

Saat mencadangkan sistem dual boot Windows / Linux, saya menggunakan ntfsclone untuk partisi Windows dan ddrescue untuk partisi Linux dan dd untuk MBR. (Saya belum mencoba mencadangkan sistem dual boot menggunakan GPT / UEFI.)

Yang ingin saya lihat adalah alat ddrescue yang dapat membuat file seperti ntfsclone di mana ruang yang tidak terisi ditandai dengan karakter kontrol. Hal ini membuat gambar tidak dapat dipasang secara langsung, tetapi memungkinkannya hanya sebesar data yang ada.

Seseorang tolong buat "format gambar khusus" ntfsclone untuk ddrescue ...


0

rsync adalah solusi sempurna seperti yang dijelaskan di atas.

Saya hanya akan menambahkan -S" menangani file-file yang jarang secara efisien " jika seandainya ada volume docker devicemapper atau yang serupa untuk disalin.


0

Saya mencoba perintah rsync yang diusulkan di sini tetapi akhirnya saya mendapat hasil yang lebih bersih dan lebih cepat partclone. Lepas partisi sumber dan target lalu jalankan yang berikut:

partclone.ext4 -b -s /dev/sd(source) -o /dev/sd(target)
e2fsck -f /dev/sd(target)
resize2fs /dev/sd(target)

Ini melakukan langkah-langkah berikut:

  1. Klon (hanya bagian yang digunakan) partisi
  2. pastikan sistem file ok (resize2fs memberlakukan langkah ini)
  3. mengubah ukuran partisi ke sistem file baru

Di atas berfungsi jika partisi target adalah ukuran yang sama atau lebih besar dari sumbernya. Jika target Anda lebih kecil dari sumbernya (tetapi cocok untuk semua data) maka lakukan hal berikut:

e2fsck -f /dev/sd(target)
resize2fs -M /dev/sd(target)
partclone.ext4 -b -s /dev/sd(source) -o /dev/sd(target)
resize2fs /dev/sd(target)

resize2fs -M menyusut sistem file ke ukuran minimum sebelum mengkloning data.

Catatan yang partclonetidak diinstal secara default pada sebagian besar sistem. Gunakan distro langsung seperti clonezilla atau instal partclone dari manajer paket distro Anda ( apt-get install partclonepada sistem berbasis debian).

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.