ระบบไฟล์จะสามารถคัดลอกได้อย่างไร


10

ฉันมีระบบไฟล์สำหรับอุปกรณ์ที่ฉันกำลังเขียนโปรแกรมซึ่งฉันต้องการทำสำเนาอย่างถูกต้อง โดยอุดมคติแล้วฉันต้องการให้สำเนานี้เหมือนกับโฟลเดอร์ที่คัดลอกมา ฉันพยายามใช้cp -r cp -aและrsync -azvPพยายามทำให้สำเร็จ แต่ละอันมีผลในโฟลเดอร์ที่มีขนาดแตกต่างกัน (โดยใช้du -s) และท้ายที่สุดแม้ว่าอุปกรณ์ของฉันจะหมดไปจากโฟลเดอร์ดั้งเดิม แต่มันจะไม่หายไปจากโฟลเดอร์ที่ฉันคัดลอก

  • อะไรคือสิ่งที่ทำให้คำสั่งที่ฉันใช้ไม่ได้ผล?
  • เป็นไปได้ไหมที่จะทำให้ทุกอย่างเหมือนกันเมื่อทำการคัดลอกระบบไฟล์ / โฟลเดอร์? ถ้าเป็นเช่นนั้นฉันจะทำยังไงต่อไป?

PS ฉันโพสต์คำถามที่คล้ายกันในStackOverflowแต่รู้ได้อย่างรวดเร็วว่าฉันได้ถามมันในการแลกเปลี่ยนที่ไม่ถูกต้อง


แก้ไข: สิ่งนี้อาจไม่เป็นประโยชน์ แต่ไม่ว่าฉันจะใช้วิธีการใดในการคัดลอกไดเรกทอรีจะทำให้เครื่องมีปัญหากับ Kernel Panic ด้วยผลลัพธ์ต่อไปนี้

VFS: ไม่สามารถเมานท์รูท fs ผ่าน NFS ลองฟลอปปี้ VFS: ไม่สามารถเปิดอุปกรณ์รูท "nfs" หรือ unknown-block (2,0) โปรดผนวกตัวเลือกการบูต "root =" ที่ถูกต้อง นี่คือพาร์ติชั่นที่มีอยู่: 1f00
64 mtdblock0 (ไดรเวอร์?) 1f02 64 mtdblock2 (ไดรเวอร์?) 1f04 2432 mtdblock4 (ไดรเวอร์?) 1f05 128 mtdblock5 (ไดรเวอร์?) 1f06 4352 mtdblock6 (ไดรเวอร์?) 1f07 204928 mtdblock7 (ไดรเวอร์?) 1f07 mtdblock8 (ไดรเวอร์) 0800
8388608 ไดรเวอร์ sda: sd Kernel panic - ไม่ซิงค์: VFS: ไม่สามารถเมานต์ fs บนบล็อกที่ไม่รู้จัก (2,0)


5
ความแตกต่างในduผลลัพธ์ไม่ใช่ตัวบ่งชี้ว่าเนื้อหาไม่เหมือนกัน
Ignacio Vazquez-Abrams

อุปกรณ์ของฉันจะไม่บูตโดยใช้ไดเรกทอรีที่คัดลอก ฉันกำลังทำสิ่งนั้นเป็นตัวบ่งชี้และสงสัยว่าฉันทำผิดตรงไหนที่ระบบไฟล์ที่คัดลอกไม่ได้รับการปฏิบัติเหมือนกัน
TopGunCoder

คุณต้องระบุสิ่งที่คุณพยายามทำ rsync -aหรือcp -aทำสำเนาไดเรกทอรีที่แน่นอน แต่คุณกำลังพยายามคัดลอกดิสก์ที่สามารถบู๊ตได้มีสองสิ่งที่คุณต้องทำเพื่อทำสิ่งนั้นให้เสร็จ
forcefsck

1
อุปกรณ์ประเภทใด ระบบไฟล์ประเภทใด สื่อเก็บข้อมูลชนิดใด
ไมเคิล

1
สำหรับฉันดูเหมือนคุณต้องการใช้สิ่งที่ต้องการdd if=/some/location of=/some/other/location bs=4Mอ่านและเขียนข้อมูลตามที่เป็นอยู่

คำตอบ:


12

ฉันมักจะใช้หนึ่งในตัวเลือกต่อไปนี้:

  • rsync -aHAX(เพิ่ม v สำหรับคำฟุ่มเฟื่อย) ทำให้แน่ใจว่าคุณรักษาโครงสร้างลิงก์และ x-attrs ในโฟลเดอร์เป้าหมายในขณะที่คัดลอก อย่าลืมaหมายถึงเก็บถาวรและรักษาเวลาความเป็นเจ้าของและสิทธิ์แล้ว
  • เรียบง่ายtar cvf(ไม่บีบอัดเพื่อประหยัดเวลาเพียงแค่ทิ้งไว้) คือสิ่งที่ฉันใช้ถ้าคนแรกไม่ตรงกับสิ่งที่ฉันต้องการด้วยเหตุผลใดก็ตามและฉันไม่มีเวลา แต่ฉันจะลองคนแรกเสมอ

ในการตรวจสอบว่าทุกอย่างเป็นไปตามที่ควรจะเป็นdiff -r <folder1> <folder2>หลังจากนั้นหากคุณต้องการ


1
นี่เป็นกลอุบาย! ฉันแค่ต้องตรวจสอบให้แน่ใจว่าอุปกรณ์ที่ฉันกำลังบูท (ผ่าน NFS) ถูกปิดและไม่สามารถเข้าถึงระบบไฟล์ได้ในขณะที่มีการคัดลอก
TopGunCoder

1
Ah, ไคลเอนต์ NFS ที่มีการเข้าถึงการอ่าน - เขียนสามารถทำให้สิ่งต่างๆเลวลง!
bayindirh

3
สิ่งนี้จะไม่คัดลอกไฟล์ที่กระจัดกระจายโดยไม่มี -S นั่นอาจเป็นส่วนหนึ่งของความdu -sแตกต่าง ฉันเคยrsync -axXSAHคัดลอกทุกอย่างไป -x จะคัดลอกภายในระบบไฟล์เท่านั้นไม่ใช่ไฟล์ที่เมานต์จากระบบไฟล์อื่น
Victor Roetman

สิ่งที่เกี่ยวกับ - ตัวเลขรหัส
0x2207

@ 0x2207 มันจะมีประโยชน์เฉพาะเมื่อผู้ใช้มี ID ตัวเลขที่แตกต่างกันในระบบที่แตกต่างกัน (เช่นผู้ใช้ hbayindir อยู่บนทั้งสองระบบและมี UID 1000 ที่ต้นทางและ 1536 ปลายทาง) ฉันไม่เคยใช้ตัวเลือกนั้นเนื่องจากฉันต้องการรักษาเจ้าของที่แท้จริงไม่ใช่ UID และ GID หากผู้ใช้ไม่มีแหล่งที่มาหรือปลายทาง ID ตัวเลขจะถูกใช้เป็นทางเลือก
bayindirh

4

การอ่านคำตอบของคุณในความคิดเห็นดูเหมือนว่าคุณกำลังพยายามคัดลอกโฟลเดอร์รูท ("อุปกรณ์ของฉันจะไม่บูตโดยใช้ไดเรกทอรีที่คัดลอก") ในกรณีนั้นมีหลายสิ่งที่คุณควรทำ

$ cd /
$ mkdir backups

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

เมื่อคุณคัดลอกโฟลเดอร์รูทไปยังระบบใหม่คุณจะต้องอัปเดตด้วงก่อนจะบูต

$ grub-install --recheck /dev/sdX (Where X is the partition number)
$ update-grub

+1 ฉันคิดว่าเบาะแสอยู่ในข้อความบูตล้มเหลวใน OP และที่อยู่นี้
msw

มันกลายเป็นสิ่งที่คล้ายกันมากกับงานนี้ ฉันกำลังจัดการกับระบบไฟล์ (FS) บนเครื่องที่ฉันต้องการคัดลอก ทั้งหมดที่ฉันได้รับคือtar cตอนtar xนี้ แม้ว่านักเตะจะต้องตรวจสอบให้แน่ใจว่าเครื่องของฉันถูกปิดเนื่องจากฉันทำการบูทโดยใช้ FS ที่อยู่ในเครื่องของฉัน แต่ห่างจากอุปกรณ์ที่ฉันกำลังบูทอยู่ (ฉันเริ่มต้นอุปกรณ์ผ่าน NFS)
TopGunCoder

grub-install: error: embedding is not possible, but this is required for cross-disk install.
Vitaly Zdanevich

2

คุณอาจจะลองFSArchiver มันเป็นตัวตายตัวแทนของ partimage ที่คล้ายกันซึ่งตอนนี้ไม่ได้ถูกทำลาย ฉันเคยใช้ทั้ง partimage และ FSArchiver ในอดีตและพวกเขาก็ทำงานได้ดี เท่าที่ฉันรู้พวกเขาทั้งคู่ทำสำเนาของระบบไฟล์ที่ใกล้เคียงกับของจริงมากที่สุด ฉันคิดว่า FSArchiver มีประสิทธิภาพมากกว่า partimage เล็กน้อย ตัวอย่างเช่นทำงานกับ ext4 ในขณะที่ partimage ไม่ ดูFSArchiver / ตารางเปรียบเทียบ


2

การใช้duเพื่อเปรียบเทียบโฟลเดอร์เป็นปัญหาโดยเนื้อแท้ หากคุณต้องการเปรียบเทียบ 2 ไดเรกทอรีจริง ๆ โดยยึดตามขนาดของมันจริงๆให้ใช้duดังนี้:

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

สวิตช์นี้จะรายงานขนาดที่แท้จริงของไดเรกทอรีเทียบกับจำนวนเนื้อที่ดิสก์ที่ใช้เมื่อจัดเก็บบนสื่อบันทึกแบบฟิสิคัลไดรฟ์ ดิสก์ถูกจัดระเบียบในบล็อกและไฟล์ถูกเขียนไปยังบล็อกเหล่านี้ หากไฟล์ต้องการพื้นที่เพียง BLOCK + 1 ไฟล์นั้นจะใช้พื้นที่ว่าง 2 บล็อกและนี่คือสิ่งที่duรายงานตามปกติ จำชื่อของเครื่องมือคือการใช้งานดิสก์!

ให้คุณกำลังจัดการกับสิ่งที่ดูเหมือนระบบไฟล์ทั้งหมดฉันจะโน้มน้าวให้ใช้ddทำสำเนาพาร์ทิชันที่แน่นอนที่ไดเรกทอรีอยู่ใน

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

จากนั้นคุณสามารถใช้สิ่งนี้boot.imgเพื่อกู้คืนพาร์ติชันได้ทุกที่ที่คุณต้องการ

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

คุณจะรายงานขนาดของดิสก์ (ดังนั้นไฟล์ที่กระจัดกระจายและฮาร์ดลิงก์จะใช้พื้นที่น้อยลง) ตัวอย่างเช่นให้ 21G du -sh /varแต่du -sh --apparent-size /varให้ 209G ในระบบของฉัน
Victor Roetman

0

ขึ้นอยู่กับสิ่งที่คุณหมายถึงโดย "เหมือนกัน"

  • การทำแค่rsyncนี้ก็เป็นเรื่องปกติ บางครั้งคุณต้องการใช้tarแพ็คทุกอย่างในไฟล์และแตกไฟล์ในที่อื่น
  • หากคุณต้องการโคลนของระบบไฟล์ที่สมบูรณ์คุณสามารถใช้ddเพื่อคัดลอกระบบไฟล์ทั้งหมดเอง

หากคุณมีค่าเฉลี่ยในการดีบักอุปกรณ์ของคุณลองค้นหาสิ่งที่เป็นปัญหาว่าทำไมในปัจจุบันมันไม่ทำงาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.