เป็นไปได้หรือไม่ที่จะเมานต์รูปภาพ dz ที่ถูกบีบอัดใน gzip?


66

ฉันชอบสร้างการสำรองข้อมูลรูปภาพเป็นครั้งแรกที่ฉันสำรองข้อมูลระบบ หลังจากครั้งแรกนี้ฉันใช้ rsync เพื่อสำรองข้อมูลเพิ่มเติม

สำรองรูปภาพปกติของฉันเป็นดังนี้:

เมานต์และปล่อยพื้นที่ว่างให้ว่าง:

dd if=/dev/zero of=temp.dd bs=1M

rm temp.dd

ขยายและ dd ไดรฟ์ในขณะที่บีบอัด

dd if=/dev/hda conv=sync,noerror bs=64K | gzip -c > /mnt/sda1/hda.ddimg.gz

เพื่อให้ระบบกลับสู่ปกติฉันมักจะทำ

gunzip -c /mnt/sda1/hda.img.gz | dd of=/dev/hda conv=sync,noerror bs=64K

นี่เป็นเรื่องตรงไปตรงมาและทำให้ฉันสามารถบันทึก 'ไดรฟ์ทั้งหมด' ได้ แต่เพียงประหยัดพื้นที่ที่ใช้

นี่คือปัญหา ให้บอกว่าฉันทำข้างต้น แต่ไม่ได้อยู่ในระบบที่สะอาดและไม่ได้รับการสำรองข้อมูล rsync ในไม่ช้าและมีไฟล์ที่ฉันต้องการเข้าถึงที่อยู่ในภาพ สมมติว่าฉันไม่มีพื้นที่เก็บข้อมูลเพื่อคลายซิปและ dd อิมเมจลงในไดรฟ์ แต่ต้องการเมานต์อิมเมจเพื่อแยกไฟล์แต่ละไฟล์ออกไป .... มันเป็นไปได้ไหม?

ปกติแล้วจะไม่มีการบีบอัดภาพ dd ซึ่งจะช่วยให้คุณสามารถเมานต์รูปภาพโดยใช้-o loop... แต่นี่ไม่ใช่กรณีของฉัน ...

คำแนะนำสำหรับการติดตั้ง img แบบบีบอัดได้ทันทีหรือไม่?

จะใช้AVFSเพื่อ 'mount' ไฟล์ gz จากนั้นติดตั้ง dd.img ภายใน (ฉันไม่คิดอย่างนั้น ... แต่จะต้องมีการยืนยัน ... )?


คุณควรใช้SquashFSสิ่งนี้ นอกจากนี้ยังยกเลิกการทำซ้ำไฟล์ที่ซ้ำกัน
Avio

ดูเหมือนว่าเพื่อนคนนี้กำลังทำสิ่งที่คุณถามเกี่ยวกับ: blogs.gnome.org/muelli/2012/10/…
Joshua

ฉันแนะนำที่สองของ Avio สควอชสิ่งเดียวที่ไม่ได้เก็บถาวรคือ acls มันเก็บถาวร xattrs ดังนั้นคุณสมบัติ selinux เป็นต้นหากคุณไม่ใช้ acls สควอชจะเป็นหนทางไปสู่ ​​IMHO ฉันเพิ่งจะต้องเก็บถาวร "ในกรณี" บางไดรฟ์เก่าที่ถูกย้ายไปยังที่จัดเก็บใหม่และ squashfs เหมาะสำหรับงาน
Kuba Ober

คำตอบ:


66

ขึ้นอยู่กับว่าดิสก์อิมเมจนั้นเป็นอิมเมจดิสก์แบบเต็มหรือเพียงแค่พาร์ติชัน

ล้างพาร์ติชัน

หากดิสก์อยู่ในสภาพที่ใช้งานได้ดีคุณจะได้รับการบีบอัดที่ดีขึ้นหากคุณล้างพื้นที่ว่างในดิสก์ด้วยค่าศูนย์ หากดิสก์ล้มเหลวให้ข้ามขั้นตอนนี้

หากคุณกำลังถ่ายภาพทั้งดิสก์คุณจะต้องล้างพาร์ติชันแต่ละส่วนในดิสก์

ข้อควรระวัง:ระวังคุณต้องการตั้งค่าofเป็นไฟล์ในพาร์ติชั่นที่เมาท์ไม่ใช่พาร์ทิชันตัวเอง!

mkdir image_source
sudo mount /dev/sda1 image_source
dd if=/dev/zero of=image_source/wash.tmp bs=4M
rm image_source/wash.tmp
sudo umount image_source

ทำภาพพาร์ติชัน

mkdir image
sudo dd if=/dev/sda1 of=image/sda1_backup.img bs=4M

sdaชื่ออุปกรณ์อยู่ที่ไหนและ1เป็นหมายเลขพาร์ติชั่น ปรับให้เหมาะกับระบบของคุณหากคุณต้องการอิมเมจอุปกรณ์หรือพาร์ติชันอื่น

ทำให้ภาพดิสก์ทั้งหมด

mkdir image
sudo dd if=/dev/sda of=image/sda_backup.img bs=4M

ในกรณีที่sdaเป็นชื่อของอุปกรณ์ ปรับให้เหมาะกับระบบของคุณหากคุณต้องการอิมเมจอุปกรณ์อื่น

การอัด

สร้างภาพ "squashfs" ที่มีภาพที่ไม่มีการบีบอัดเต็มรูปแบบ

sudo apt-get install squashfs-tools
mksquashfs image squash.img

การบีบอัดข้อมูลแบบสตรีมมิ่ง

เพื่อหลีกเลี่ยงการสร้างไฟล์ชั่วคราวขนาดเต็มของดิสก์คุณสามารถสตรีมไปยังอิมเมจสควอช

mkdir empty-dir
mksquashfs empty-dir squash.img -p 'sda_backup.img f 444 root root dd if=/dev/sda bs=4M'

การติดตั้งอิมเมจพาร์ติชันที่บีบอัด

ก่อนอื่นเมานต์อิมเมจสควอชจากนั้นก็อิมเมจพาร์ติชันที่เก็บไว้ในอิมเมจสควอชที่เมานต์

mkdir squash_mount
sudo mount squash.img squash_mount

ตอนนี้คุณได้ติดตั้งรูปภาพที่บีบอัดแล้วให้เมานต์อิมเมจเอง (ซึ่งอยู่ภายในอิมเมจสควอช)

mkdir compressed_image
sudo mount squash_mount/sda1_backup.img compressed_image

compressed_imageตอนนี้ภาพของคุณจะติดตั้งอยู่ภายใต้

แก้ไข: หากคุณต้องการเพียงแค่การเรียกคืนภาพดิสก์บนพาร์ติชันที่จุดนี้ (แทนการติดตั้งนั้นเพื่อเรียกดู / อ่านเนื้อหา) เพียงddภาพที่ไปยังปลายทางแทนการทำsquash_mount/sda1_backup.imgmount

การติดตั้งอิมเมจดิสก์แบบเต็มที่บีบอัด

สิ่งนี้ต้องการให้คุณใช้แพ็คเกจที่เรียกว่า kpartx kpartx ช่วยให้คุณสามารถติดตั้งแต่ละพาร์ติชันในดิสก์อิมเมจแบบเต็ม

sudo apt-get install kpartx

ก่อนอื่นให้เมาท์พาร์ติชั่นที่ถูกแบนซึ่งบรรจุอิมเมจของดิสก์แบบเต็ม

mkdir compressed_image
sudo mount squash.img compressed_image

ตอนนี้คุณต้องสร้างอุปกรณ์สำหรับแต่ละพาร์ติชั่นในอิมเมจของดิสก์แบบเต็ม:

sudo kpartx -a compressed_image/sda_backup.img

สิ่งนี้จะสร้างอุปกรณ์สำหรับพาร์ติชันในอิมเมจดิสก์แบบเต็มโดย/dev/mapper/loopNpPที่Nคือหมายเลขที่กำหนดให้กับอุปกรณ์ลูปแบ็คและPคือหมายเลขพาร์ติชัน ตัวอย่างเช่น/dev/mapper/loop0p1.

ตอนนี้คุณมีวิธีเมาท์พาร์ติชันแต่ละตัวในอิมเมจดิสก์แบบเต็ม:

mkdir fulldisk_part1
sudo mount /dev/mapper/loop0p1 fulldisk_part1

ปัญหานี้น่าสนใจ (squashfs แทนที่จะเป็น gzip) ฉันไม่คุ้นเคยกับเครื่องมือ squashfs ... คุณสามารถส่งออกของ dd เพื่อสร้างสควอชพาร์ติชั่นได้อย่างที่คุณสามารถทำได้ด้วยพาร์ติชั่น gzip? อัตราส่วนการบีบอัดคืออะไร (gzip ไม่เป็นไร / ดีโดยเฉพาะจากความจริงที่ว่าฉันกำลังล้าง 'พื้นที่ว่างด้วยศูนย์')
g19fanatic

คุณจะถ่ายภาพกลับไปที่ฮาร์ดดิสก์อย่างไร?
g19fanatic

2
@ g19fanatic อิมเมจของดิสก์ที่ไม่มีการบีบอัดคือ "Inside" อิมเมจสควอช คุณเมานท์อิมเมจสควอชจากนั้น dd อิมเมจภายในอิมเมจไปยังดิสก์ปลายทาง
doug65536

@ g19fanatic การบีบอัดเป็นเลิศ (เกือบจะเหมือนกับ gzip ในกรณีของฉัน) mksquashfs เร็วเกินไปมันขนานกัน บน 990x ของฉัน (6 คอร์) มันถูก จำกัด ด้วยความเร็วในการเขียนดิสก์ปลายทางประมาณ 100MB / วินาที
doug65536

3
@ g19fanatic คุณสามารถสตรีมเข้าสู่สควอชโดยใช้-pหรือตั้ง-pfค่าสถานะเพื่อส่งไฟล์หลอก ไฟล์หลอกสามารถใช้สำหรับสิ่งต่าง ๆ เช่นการสร้างโหนดอุปกรณ์ซึ่งคุณไม่สามารถทำได้โดยไม่ต้องรูท (มีประโยชน์สำหรับการสร้างภาพเป็นส่วนหนึ่งของกระบวนการสร้าง) หรือสำหรับการสตรีมเอาท์พุทของคำสั่งบางอย่างลงในภาพ หนึ่งในตัวอย่างที่ให้ไว้ในเอกสาร ( /usr/share/doc/squashfs-tools/examples/pseudo-file.exampleบน Debian / Ubuntu) คือinput f 444 root root dd if=/dev/sda1 bs=1024 count=10การคัดลอก 10K แรกจากดิสก์อิมเมจลงในไฟล์ชื่อ "อินพุต" ในอิมเมจสควอช
Brian Campbell

15

หากรูปภาพเป็นแบบอ่านอย่างเดียวคุณยังสามารถใช้nbdkit ( หน้าคน ) และปลั๊กอิน xz (xz ควรจัดให้มีการบีบอัดและเวลาเข้าถึงแบบสุ่มที่ดีกว่า gzip)

สร้างอิมเมจพาร์ติชันที่ถูกบีบอัด

dd if=/dev/sda1 bs=16M | xz -9 --block-size=16MiB - > sda1.img.xz

--block-sizeตัวเลือกของเอ็มไอ 16 ควรจัดให้มีประสิทธิภาพในการเข้าถึงที่ดีแบบสุ่ม

หมายเหตุ: คุณอาจใช้โปรแกรมการบีบอัด xz ทางเลือกเช่นpixzซึ่งให้การบีบอัดแบบขนานให้แน่ใจว่ามันแยกเอาท์พุทในบล็อกเล็ก ๆ หลาย ๆ มิฉะนั้นnbdkitต้องคลายข้อมูลจำนวนมาก ตัวอย่างเช่น ณ เดือนกันยายน 2558 pxzไม่รองรับสิ่งนี้

เสิร์ฟพร้อมกับ nbdkit

nbdkit --no-fork --user nobody --group nobody -i 127.0.0.1 \
       xz file=sda1.img.xz

เชื่อมต่อกับเซิร์ฟเวอร์ NBD

nbd-client 127.0.0.1 10809 /dev/nbd0 -nofork

ติดมันแบบอ่านอย่างเดียว

mount -o ro /dev/nbd0 sda1

เมื่อทำเสร็จแล้ว

umount /dev/nbd0
nbd-client -d /dev/nbd0

หยุดnbdkitโดยกดCtrl+ C(หรือฆ่า )


15

ลอง archivemount

root@srv1:/backup# archivemount windows-2003-S.gz /target/
Unrecognized archive format
root@srv1:/backup# archivemount -o formatraw windows-2003-S.gz /target/
Calculating uncompressed file size. Please wait.
root@srv1:/backup# ls /target/
data
root@srv1:/backup# file /target/data
/target/data: DOS/MBR boot sector; partition 1 : ID=0x7, start-CHS (0x0,1,1), end-CHS (0x3ff,254,63), startsector 63, 58717512 sectors, extended partition table (last)

archivemount เป็นระบบไฟล์ที่ใช้ FUSE สำหรับตัวแปร Unix รวมถึง Linux วัตถุประสงค์คือเพื่อเมานต์ไฟล์เก็บถาวร (เช่น tar, tar.gz ฯลฯ ) ไปยังจุดเมานท์ที่สามารถอ่านหรือเขียนได้เช่นเดียวกับระบบไฟล์อื่น ๆ สิ่งนี้ทำให้การเข้าถึงเนื้อหาของไฟล์เก็บถาวรซึ่งอาจถูกบีบอัดโปร่งใสไปยังโปรแกรมอื่น ๆ โดยไม่ต้องแตกไฟล์

http://linuxaria.com/howto/how-to-mounts-an-archive-for-access-as-a-file-system

หลังจากติดตั้งไฟล์เก็บถาวรคุณสามารถใช้เนื้อหาเช่นไฟล์ปกติ อาจได้รับตารางพาร์ทิชันหรือแปลงติดภาพด้วยเครื่องมือ qemu

squashfs มีประโยชน์สำหรับการบูทจากอิมเมจ แต่ซับซ้อนมากสำหรับการแบ็คอัพ


ที่สมบูรณ์แบบ! นี่คือทางออกที่ง่ายและสง่างามที่สุด ฉันสงสัยว่าทำไมไม่มีการลงคะแนนที่นี่
TranslucentCloud

ฉันคิดว่าเป็นเพราะถ้าคุณติดตั้งไฟล์เก็บถาวรเช่น disk.img.gz ในโฟลเดอร์ที่มีไฟล์เก็บถาวรพูด / mnt / คุณจะได้รับไฟล์ /mnt/disk.img ไฟล์เดียวซึ่งคุณต้องติดตั้งที่อื่น คำถามต้องการให้สิ่งที่สามารถแกะทั้งสองอย่างในขั้นตอนเดียว (และเก็บถาวรจำนวนดูเหมือนว่าสามารถทำได้ใน. tar.gz แต่ไม่ใช่ในภาพดิบ gzipped)
p91paul

2
คำตอบนี้ก็น่าสนใจเช่นกัน ฉันเชื่อว่าสควอชได้รับความรักมากขึ้นเพราะมีความตระหนักมากขึ้น ฉันจำชื่อได้ทันที แต่ไม่เคยได้ยินชื่อที่เก็บถาวร ฉันจะต้องให้มันยิงด้วย!
g19fanatic

2
ไฟล์เก็บถาวรไม่อนุญาตให้เมานต์รูปภาพที่สร้างโดยคำสั่งdd if=/dev/hda conv=sync,noerror bs=64K | gzip -c > /mnt/sda1/hda.ddimg.gz
Sergei

3
เห็นด้วย - ณ เวลาที่เขียน, Archivemount สนับสนุนไฟล์เก็บถาวร tar ที่ถูก gzipped แต่ไม่ใช่ไฟล์ gzipped ธรรมดา
mwfearnley

10

คำตอบนี้เติมเต็มคำตอบ Cristian Ciupitu ของ หากคุณใช้การบีบอัด xz ด้วยขนาดบล็อกที่เหมาะสมคุณสามารถเข้าถึงภาพดิสก์โดยใช้guestfishหรือเครื่องมือlibguestfsอื่น ๆเช่นนี้:

nbdkit xz file=disk.img.xz --run 'guestfish --format=raw -a $nbd -i'

8

ไม่ได้จริงๆ คุณไม่สามารถค้นหาบล็อกเฉพาะในไฟล์บีบอัดได้โดยไม่ต้องแตกไฟล์ทั้งหมดก่อนซึ่งทำให้ยากที่จะใช้อิมเมจที่บีบอัดเป็นอุปกรณ์บล็อก

คุณสามารถใช้สิ่งที่ต้องการdumpและrestore(หรือtarจริง ๆ ) ซึ่งทั้งหมดใช้รูปแบบการสตรีม ... เพื่อให้คุณสามารถเข้าถึงไฟล์ส่วนบุคคลได้โดยการสแกนผ่านสตรีมที่ไม่มีการบีบอัดได้อย่างมีประสิทธิภาพ หมายความว่าหากไฟล์ที่คุณต้องการอยู่ท้ายไฟล์บีบอัดที่คุณอาจต้องรอเป็นเวลานาน แต่ไม่ต้องการให้คุณแตกทุกอย่างลงบนดิสก์

การใช้การtarสำรองข้อมูลอาจดูล้าสมัยไปบ้าง แต่คุณมีความยืดหยุ่นมาก


1
ปัญหาอยู่ในความจริงที่ว่าฉันไม่รู้ด้วยซ้ำว่าไฟล์ที่น่าสนใจนั้นเป็นข้อมูลสำรองจริง ๆ หรือไม่ ... คุณรู้จักไฟล์ explorer ที่จะใช้รูปภาพ. gz'd ทั้งหมดเก็บไฟล์ / dir โครงสร้างในหน่วยความจำให้มุมมองที่เรียบง่ายของโครงสร้างและอนุญาตให้คุณ 'เลือก' ไฟล์ (ตอนนี้มันรู้ว่าพวกเขาอยู่ที่ไหน) เพื่อแยก? มันเป็นข้อกำหนดเฉพาะมาก ... แต่ฉันเห็นการใช้งานหลายอย่างเช่นนี้ ... หากมีอยู่
g19fanatic

1
หากไม่เป็นเช่นนั้นคุณสามารถชี้ให้ฉันดูคำแนะนำเกี่ยวกับวิธีดึงโครงสร้างจากภาพ gz'd ได้ไหม ฉันจะสามารถสร้างโปรแกรมดังกล่าว (โปรแกรมสำหรับการใช้ชีวิต ... ) แต่ฉันตาบอดในหัวข้อของการแตกข้อมูลภาพและข้อมูลเฉพาะของระบบไฟล์ที่แตกต่างกัน
g19fanatic

ฉันสงสัยว่าการสร้างเครื่องมือของคุณเองจะเป็นโครงการที่ใหญ่กว่าที่คุณต้องการทำจริงๆ อย่างไรก็ตาม ... สมมติว่าคุณมีต่อ [234] ระบบแฟ้มผมจะแนะนำe2fsprogsแพคเกจหรือบางทีบางอย่างเช่นฟิวส์ ext2 ทั้งคู่จัดเตรียมเครื่องมือพื้นที่ผู้ใช้สำหรับการโต้ตอบกับระบบไฟล์ ext [234]
larsks

โปรดทราบว่าสิ่งที่คุณไม่ได้ปรากฏเป็นอิมเมจระบบไฟล์เป็นอิมเมจดิสก์ทั้งหมดซึ่งหมายความว่าคุณต้องแยกวิเคราะห์ตารางพาร์ติชันก่อนและค้นหาพาร์ติชันที่เหมาะสม
larsks

ฉันพิมพ์ผิดในคำถามข้างต้นและจะแก้ไข ฉันมักจะทำภาพพาร์ทิชันตาม DD และบันทึกสำเนาของตารางพาร์ทิชัน ฉันเคยทำดิสก์ทั้งชุด แต่ไม่ต้องการเมาท์กับตัวเลือกเพื่อไปยังตำแหน่งที่เหมาะสม
g19fanatic

3

ภาคผนวกอีกคำตอบของ Cristian Ciupitu :

หากคุณใช้nbdkitเพื่อเมานต์อิมเมจดิสก์แบบเต็ม (เทียบกับอิมเมจพาร์ติชัน) คุณอาจต้องระบุขนาดบล็อก (ขนาดเซกเตอร์ของดิสก์) เมื่อเชื่อมต่อกับเซิร์ฟเวอร์ NBD ตามค่าเริ่มต้นเป็น1024ไบต์ วิธีใช้512ไบต์แทน:

nbd-client 127.0.0.1 /dev/nbd0 -b 512 -n

หลังจากนั้นดิสก์จะปรากฏเป็นและคุณควรจะสามารถดูตารางพาร์ทิชันโดยใช้/dev/nbd0 fdisk -lอย่างไรก็ตามพาร์ติชั่นยังไม่สามารถเมาท์ได้ - ใช้kpartx(จากคำตอบของ doug65536 ) เพื่อสร้างอุปกรณ์สำหรับพาร์ติชั่นเช่น:

kpartx -arv /dev/nbd0

ในที่สุดพาร์ติชันจะปรากฏขึ้น/dev/mapper/และคุณสามารถติดตั้งได้ตามปกติ ตรวจสอบให้แน่ใจว่าใช้โหมดอ่านอย่างเดียว ( -o ro) เนื่องจากปลั๊กอิน xz รองรับเฉพาะการอ่าน:

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