cara menyalin seluruh sistem file root linux ke hard drive baru aktif dengan ssh dan tar

15

Saya perlu mentransfer seluruh filesystem root linux dari hard drive yang gagal ke komputer lain dengan partisi terbuka yang tersedia. Saya cukup yakin ini melibatkan tar dan ssh, tapi saya tidak ingat persis bagaimana melakukan ini.

Saya sedang membayangkan mungkin menggunakan live cd pada host target baru untuk dijalankan sesuatu seperti ini:

ssh user@failingharddrivehost "some tar command | piped into something else"

CHK
sumber
menyimpang dari topik. bukan pertanyaan pemrograman. tapi cobalah ssh user@failingsys "tar cfz - /" > oldsys.tar.gz
Anda ingin berhati-hati agar tidak tar / dev / (mis / dev / acak, / dev / sdX, ...) Ditto / proc /
Hennes

Jawaban:

13

Gunakan rsync. Dari host baru, Anda dapat menggunakan

rsync -avP --numeric-ids --exclude='/dev' --exclude='/proc' --exclude='/sys' root@failedharddrivehost:/ /path/to/destination/

Saya tidak akan mencoba melibatkan sesuatu seperti tar karena mungkin tidak akan berfungsi ketika ada file yang rusak.

etagenklo
sumber
Akhirnya menggunakan rsync, seperti dijelaskan di atas oleh etagenklo dan @Hennes. Migrasi berjalan dengan baik. Hanya perlu memperbaiki grub, tapi itu tidak terlalu buruk.
CHK
6
Saya akan menambahkan -AHX sebagai flag ke rsync juga untuk menjaga acl, xattrs dan hardlinks menghasilkan salinan fs asli yang bahkan lebih tepat.
Alexander Remesch
2
Saya akan menambahkan -x untuk mengabaikan item yang tidak ada pada sistem file root, maka Anda dapat melewati argumen --exclude untuk berbagai jalur.
Alex
4

Jika kedua komputer berada pada LAN (aman) yang sama, saya sarankan menggunakan pendekatan yang berbeda netcat. Ini biasanya jauh lebih cepat karena tidak mengenkripsi data.

root@good_host$ cd good_partition; netcat -l -p 1234 | tar xvpmf -
root@bad_host$ tar -cv -f- --exclude=/proc --exclude=/sys / | netcat good_host.ip 1234

yang membuka port mendengarkan 1234 pada mesin yang bagus netcat -l -p 1234 dan menyalurkan data yang masuk ke tar untuk mengekstrak (mempertahankan mtime dan izin). Tuan rumah yang buruk mengirimkan data ke port ini, juga menggunakan tar dan netcat. Saya memasukkan beberapa --exclude parameter, seperti /proc dan /sys adalah filesystem virtual dan karenanya tidak berguna pada host baru. (terutama file yang mewakili RAM Anda di ( /proc/kcore ) akan menambahkan jumlah data yang tidak perlu).

Namun, Anda harus (juga) mempertimbangkan untuk membuat dd dump dari partisi drive yang gagal:

user@good_host$ cd good_partition; netcat -l -p 1234 > dump_of_bad_partition_1.dd
root@bad_host$ dd if=/dev/sda1 | netcat good_host.ip 1234

di mana Anda harus mengadopsi /dev/sda1 ke perangkat yang tepat. Lakukan itu dengan partisi lain pada drive yang gagal juga.

Dengan dump itu Anda yakin, bahwa Anda tidak melewatkan metadata penting (seperti ACL) yang tar tidak akan menangkap.

mpy
sumber
2

Mengapa Anda menggabungkan dengan direktori tidak termasuk? Bukankah ide yang lebih baik memasang perangkat yang sama ke direktori lain? kernel modern memungkinkan cara ini. misalnya, Anda telah melakukan mount

/ dev / sda1 as / lalu lakukan: mkdir / CLEANROOT mount / dev / sda1 / CLEANROOT

setelah ini, Anda memiliki: / dev / sda1 as / / dev / hda1 sebagai / CLEANROOT

Ini adalah sistem file yang sama yang terlihat dengan dua tempat, tetapi / CLEANROOT tidak memiliki mount tambahan. Kemudian Anda dapat tar atau rsync / CLEANROOT tanpa pengecualian, bukan menyalin / dengan pengecualian.

Tentu saja Anda harus menyalin partisi data lain ketika Anda punya.

Mengkopi partisi adalah langkah pertama untuk pemulihan server. yang lain adalah regenerasi sektor boot, jika tidak, sistem tidak akan boot dari disk yang disalin. Usefull adalah mode penyelamatan saat Anda boot dari instal / rescue CD atau flashdisk.

Znik
sumber
1

Apakah Anda memiliki akses fisik ke host yang gagal?

Jika Anda melakukannya, boot dari CD langsung. Kemudian gunakan:

  • membuang (dump / restore seluruh filesystem termasuk izinnya).
  • Ter dengan / dev dikecualikan. Anda dapat menggabungkan ini dengan keluaran ke stdout dan perpipaan melalui netcat
    Sintaks yang dikecualikan adalah: tar --exclude='/dev'.
  • atau rsync dengan pengecualian yang sama. Misalnya.
    rsync -zvr --exclude /dev/ / destination_computer_name_or_ip
  • atau gunakan dd seperti ini:
    nc -l 4242 | gunzip | cat > my_full_disk_backup_of_PC_named_foo
    dd if=/dev/sda of=- bs=1M | gzip | nc -p 4242 name_of_the_destination

Jika Anda tidak dapat mem-boot dari CD langsung, maka sebagian besar solusi di atas akan tetap sama, tetapi:

  1. Beberapa file mungkin sedang digunakan / dikunci.
  2. Pastikan untuk mengecualikan tidak hanya / dev / tetapi juga / proc /.
    Misalnya. tar --exclude='/dev' --exclude='/proc'
Hennes
sumber
Ya saya memiliki akses fisik (dan root) ke kedua host. Akan mencoba dengan rsync. netcat macet karena gagal kotak karena alasan yang tidak diketahui. sistem file target tidak ingin di-mount. gagal dengan: #mount /dev/sda1 /mnt/fedora mount: unknown filesystem type 'LVM2_member'
CHK
0

Anda harus mempertimbangkan menggunakan rsync

perintah berikut mengasumsikan 2 hal:

  1. Anda berada di sistem dengan hard drive gagal
  2. partisi baru memiliki instalasi linux minimal dengan ssh diaktifkan.

rsync / new_partition:/wherever/you/want/

Catatan: trailing / penting, jika tidak file Anda akan berakhir di satu level direktori di atas

MelBurslan
sumber
OP mungkin ingin menggunakan -a parameter (dan mungkin -A ), karena menghemat waktu, kepemilikan, symlink (dan mungkin ACL) dll dan -e ssh parameter, karena data harus ditransfer ke komputer lain. Begitu rsync -aAv -e ssh root@failingharddrivehost:/ /good_computer/newpartition_mountpoint
mpy