Bagaimana sistem file dapat disalin persis seperti apa?

10

Saya memiliki sistem file untuk perangkat yang saya pemrograman yang ingin saya buat salinannya. Idealnya saya ingin salinan ini identik dengan folder tempat penyalinannya. Saya telah mencoba menggunakan cp -r cp -adan rsync -azvPmencoba mencapai ini. Masing-masing menghasilkan folder dengan ukuran berbeda (menggunakan du -s) dan pada akhirnya, meskipun perangkat saya lari dari folder asli, itu tidak akan lari dari yang saya salin.

  • Apa yang ditinggalkan bahwa perintah yang saya gunakan tidak memperhitungkan?
  • Apakah mungkin untuk menjaga semuanya tetap identik saat menyalin sistem / folder file? Jika demikian, bagaimana saya akan melakukan itu?

PS Saya memposting pertanyaan serupa di StackOverflow tetapi segera menyadari saya telah menanyakannya di bursa yang salah


Sunting: Ini mungkin tidak membantu tetapi tidak peduli metode mana yang saya gunakan pada direktori yang disalin selalu menyebabkan mesin tersebut menjadi Kernel Panic dengan output berikut.

VFS: Tidak dapat me-mount root fs via NFS, mencoba floppy. VFS: Tidak dapat membuka perangkat root "nfs" atau blok tidak dikenal (2,0) Harap tambahkan opsi boot "root =" yang benar; di sini adalah partisi yang tersedia: 1f00
64 mtdblock0 (driver?) 1f02 64 mtdblock2 (driver?) 1f04 2432 mtdblock4 (driver?) 1f05 128 mtdblock5 (driver?) 1f06 4352 mtdblock6 (driver?) 1f07 204928 mtdblock7 (driver?) mtdblock8 (driver?) 0800
8388608 sda driver: sd Kernel panic - not syncing: VFS: Tidak dapat me-mount root fs pada blok-tidak dikenal (2,0)

TopGunCoder
sumber
5
Perbedaan dalam duoutput bukanlah indikator bahwa isinya tidak sama.
Ignacio Vazquez-Abrams
Perangkat saya tidak mau boot menggunakan direktori yang disalin. Saya menganggap itu sebagai indikator dan bertanya-tanya apa yang sebenarnya saya lakukan salah bahwa sistem file yang disalin tidak diperlakukan sama
TopGunCoder
Anda perlu menentukan dengan tepat apa yang Anda coba lakukan. rsync -aatau cp -alakukan salinan direktori yang tepat, tetapi Anda mencoba menyalin disk yang dapat di-boot, ada beberapa hal lagi yang perlu Anda lakukan untuk menyelesaikannya.
forcefsck
1
Perangkat apa? Sistem file seperti apa? Media penyimpanan seperti apa?
michas
1
Bagi saya kedengarannya Anda ingin menggunakan sesuatu seperti dd if=/some/location of=/some/other/location bs=4Mmembaca dan menulis data apa adanya.

Jawaban:

12

Saya biasanya menggunakan salah satu alternatif berikut:

  • rsync -aHAX(tambahkan v untuk verbositas) memastikan bahwa Anda mempertahankan struktur tautan dan x-attrs apa pun di folder target saat menyalin. Jangan lupa aberarti mengarsipkan dan sudah menghemat waktu, kepemilikan, dan izin.
  • Sederhana tar cvf(jangan mengompres untuk menghemat waktu, cukup tambahkan mereka) adalah apa yang saya gunakan jika yang pertama tidak memenuhi apa yang saya butuhkan untuk alasan apa pun dan saya tidak punya waktu, tetapi saya selalu mencoba yang pertama.

Untuk memeriksa apakah semuanya berjalan sebagaimana mestinya, Anda dapat menjalankan diff -r <folder1> <folder2>setelahnya jika Anda mau.

bayindirh
sumber
1
Ini berhasil! Saya juga hanya perlu memastikan bahwa perangkat saya boot (melalui NFS) dimatikan dan tidak dapat mengakses sistem file saat salinan sedang berlangsung.
TopGunCoder
1
Ah, klien NFS dengan akses baca-tulis terkadang dapat mempercantik!
bayindirh
3
Ini tidak akan menyalin file jarang tanpa -S. Itu mungkin bagian dari du -sperbedaan. Saya biasa rsync -axXSAHmenyalin semuanya. -X hanya akan menyalin dalam sistem file, dan bukan file yang dipasang dari sistem file lain.
Victor Roetman
Bagaimana dengan --numeric-id?
0x2207
@ 0x2207 Ini hanya berguna ketika pengguna memiliki ID numerik yang berbeda pada sistem yang berbeda (misalnya pengguna hbayindir di kedua sistem, dan memiliki UID 1000 pada sumber dan 1536 pada tujuan). Saya tidak pernah harus menggunakan opsi itu, karena saya harus mempertahankan pemilik asli, bukan UID dan GID. Jika pengguna tidak menunjukkan sumber atau tujuan, ID numerik digunakan sebagai cadangan.
bayindirh
4

Membaca balasan Anda di komentar, sepertinya Anda mungkin mencoba menyalin folder root ("Perangkat saya tidak mau boot menggunakan direktori yang disalin"). Dalam hal ini ada beberapa hal yang harus Anda lakukan.

$ cd /
$ mkdir backups

$ tar -cvpf /backups/fullbackup.tar --directory=/ --exclude=proc --exclude=sys \
     --exclude=dev/pts --exclude=backups .

Setelah Anda menyalin folder root ke sistem baru, Anda perlu memperbarui grub sebelum boot.

$ grub-install --recheck /dev/sdX (Where X is the partition number)
$ update-grub
Jeight
sumber
+1 Saya pikir petunjuknya ada di pesan boot gagal di OP dan ini mengatasinya.
msw
Ternyata sesuatu yang sangat mirip dengan ini berhasil. Saya berurusan dengan filesystem (FS) di komputer saya yang perlu saya salin. Yang diperlukan hanyalah bagiku untuk tar ckemudian tar x. Kicker adalah untuk memastikan bahwa mesin saya mati sejak saya boot itu menggunakan FS yang lokal untuk mesin saya, tetapi jauh ke perangkat yang saya boot (saya memulai perangkat melalui NFS)
TopGunCoder
grub-install: error: embedding is not possible, but this is required for cross-disk install.
Vitaly Zdanevich
2

Anda bisa mencoba FSArchiver . Ini adalah penerus dari partimage serupa, yang sekarang tidak terawat. Saya telah menggunakan keduanya partimage dan FSArchiver di masa lalu, dan mereka berdua bekerja dengan baik. Sejauh yang saya tahu, mereka berdua membuat salinan dari sistem file yang sedekat mungkin dengan aslinya. Saya pikir FSArchiver sedikit lebih kuat daripada partimage. Misalnya, ia bekerja dengan ext4, sedangkan partimage tidak. Lihat tabel perbandingan FSArchiver / partimage .

Faheem Mitha
sumber
2

Menggunakan duuntuk membandingkan folder pada dasarnya merepotkan. Jika Anda ingin benar-benar membandingkan 2 direktori berdasarkan ukurannya, gunakan duseperti ini:

$ du -sh --apparent-size <dir>

Switch ini akan melaporkan ukuran aktual direktori vs. jumlah ruang disk yang dikonsumsi saat disimpan pada media drive fisik. Disk disusun dalam blok dan file ditulis ke blok ini. Jika sebuah file hanya membutuhkan ruang BLOCK + 1, ia akan menghabiskan ruang senilai 2 BLOCKS, dan inilah yang dubiasanya dilaporkan. Ingat nama alat ini penggunaan disk!

Mengingat Anda sedang berhadapan dengan apa yang terdengar seperti seluruh sistem file, saya akan cenderung menggunakan dduntuk membuat salinan yang tepat dari partisi tempat direktori berada.

$ dd if=/dev/sda1 of=/srv/boot.img

Anda kemudian dapat menggunakan ini boot.imguntuk memulihkan partisi di mana pun Anda inginkan.

$ dd if=/srv/boot.img of=/dev/sdb1
slm
sumber
du juga akan melaporkan ukuran pada disk (jadi file yang jarang dan tautan keras mengambil lebih sedikit ruang). Sebagai contoh, du -sh /varberikan 21G tetapi du -sh --apparent-size /varberikan 209G pada sistem saya.
Victor Roetman
0

Tergantung sedikit pada apa yang Anda maksud dengan "identik".

  • Hanya melakukan rsyncsebagian besar akan baik-baik saja. Kadang-kadang Anda ingin menggunakan taruntuk mengemas segala sesuatu dalam file dan mengekstraknya di tempat lain.
  • Jika Anda ingin tiruan dari sistem file lengkap yang dapat Anda gunakan dduntuk menyalin seluruh sistem file itu sendiri.

Jika Anda memiliki maksud untuk men-debug perangkat Anda, cobalah mencari tahu, apa sebenarnya masalah mengapa saat ini tidak lari.

michas
sumber