Có thể gắn một hình ảnh dd nén gzip khi đang bay?


66

Tôi thích tạo bản sao lưu ảnh lần đầu tiên khi tôi sao lưu hệ thống. Sau lần đầu tiên này, tôi sử dụng rsync để thực hiện sao lưu gia tăng.

Sao lưu hình ảnh thông thường của tôi là như sau:

Gắn kết và xóa không gian trống:

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

rm temp.dd

umount và dd ổ đĩa trong khi nén nó

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

để đưa hệ thống trở lại bình thường, tôi thường sẽ làm một

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

Điều này thực sự đơn giản và cho phép tôi lưu 'toàn bộ ổ đĩa' nhưng thực sự chỉ cần tiết kiệm không gian đã sử dụng.

Đây là vấn đề. Hãy nói rằng tôi làm như trên nhưng không phải trên một hệ thống sạch và không nhận được bản sao lưu rsync sớm và có những tệp mà tôi muốn truy cập trên hình ảnh. Giả sử tôi không có không gian lưu trữ để thực sự giải nén và dd hình ảnh vào ổ đĩa nhưng muốn gắn hình ảnh để lấy các tệp riêng lẻ ra khỏi nó .... Điều này có thể không?

Thông thường, người ta sẽ không nén hình ảnh dd, điều này sẽ cho phép bạn chỉ cần gắn hình ảnh bằng cách sử dụng -o loop... nhưng đây không phải là trường hợp của tôi ...

Bất kỳ đề xuất để gắn img nén khi đang bay?

Việc sử dụng AVFS để 'gắn kết' tệp gz sau đó gắn công việc dd.img nội bộ (tôi không nghĩ vậy ... nhưng sẽ cần xác minh ...)?


Bạn nên sử dụng SquashFScho những thứ này. Nó cũng khử các tập tin trùng lặp.
Avio

Có vẻ như đồng nghiệp này đang làm những gì bạn đang hỏi về: blog.gnome.org/muelli/2012/10/iêu
Joshua

Tôi đề nghị thứ hai của Avio. Điều duy nhất squashfs không lưu trữ là acls. Nó lưu trữ xattrs, vì vậy các thuộc tính selinux, v.v. Nếu bạn không sử dụng acls, thì squashfs là cách để đi IMHO. Gần đây tôi đã phải lưu trữ "chỉ trong trường hợp" một số ổ đĩa cũ đã được di chuyển sang bộ lưu trữ mới và squashfs là hoàn hảo cho công việc.
Kuba Ober

Câu trả lời:


66

Nó phụ thuộc vào việc hình ảnh đĩa là hình ảnh đĩa đầy đủ, hay chỉ là một phân vùng.

Rửa (các) phân vùng

Nếu đĩa trong tình trạng hoạt động tốt, bạn sẽ nén tốt hơn nếu bạn rửa không gian trống trên đĩa bằng số không. Nếu đĩa bị lỗi, bỏ qua bước này.

Nếu bạn đang chụp toàn bộ đĩa thì bạn sẽ muốn rửa từng phân vùng trên đĩa.

LƯU Ý: Hãy cẩn thận, bạn muốn thiết lập ofmột tập tin trong phân vùng gắn kết, không phân vùng riêng của mình!

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

Tạo một hình ảnh phân vùng

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

Trong trường hợp sdalà tên của thiết bị, và 1là số phân vùng. Điều chỉnh phù hợp cho hệ thống của bạn nếu bạn muốn hình ảnh một thiết bị hoặc phân vùng khác.

Tạo một hình ảnh toàn bộ đĩa

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

Trong trường hợp sdalà tên của thiết bị. Điều chỉnh phù hợp cho hệ thống của bạn nếu bạn muốn hình ảnh một thiết bị khác.

Nén

Tạo một hình ảnh "squashfs" có chứa hình ảnh không nén đầy đủ.

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

Truyền nén

Để tránh tạo một tệp tạm thời riêng kích thước đầy đủ của đĩa, bạn có thể truyền phát thành hình ảnh squashfs.

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

Gắn một hình ảnh phân vùng nén

Đầu tiên gắn hình ảnh squashfs, sau đó gắn hình ảnh phân vùng được lưu trữ trong hình ảnh squashfs được gắn kết.

mkdir squash_mount
sudo mount squash.img squash_mount

Bây giờ bạn đã gắn hình ảnh nén, gắn chính hình ảnh (đó là bên trong hình ảnh squashfs)

mkdir compressed_image
sudo mount squash_mount/sda1_backup.img compressed_image

Bây giờ hình ảnh của bạn được gắn dưới compressed_image.

EDIT: Nếu bạn chỉ muốn khôi phục hình ảnh đĩa vào một phân vùng tại thời điểm này (thay vì gắn nó để duyệt / đọc nội dung), chỉ cần ddhình ảnh ở squash_mount/sda1_backup.imgđích đến thay vì thực hiện mount.

Gắn hình ảnh đĩa nén

Điều này đòi hỏi bạn phải sử dụng một gói gọi là kpartx. kpartx cho phép bạn gắn các phân vùng riêng lẻ trong một hình ảnh đĩa đầy đủ.

sudo apt-get install kpartx

Đầu tiên, gắn kết phân vùng bị nén của bạn có chứa hình ảnh đĩa đầy đủ

mkdir compressed_image
sudo mount squash.img compressed_image

Bây giờ bạn cần tạo thiết bị cho từng phân vùng trong ảnh đĩa đầy đủ:

sudo kpartx -a compressed_image/sda_backup.img

Điều này sẽ tạo ra các thiết bị cho các phân vùng trong hình ảnh đĩa đầy đủ trong /dev/mapper/loopNpPđó N là số được gán cho thiết bị loopback và P là số phân vùng. Ví dụ : /dev/mapper/loop0p1.

Bây giờ bạn có một cách để gắn các phân vùng riêng lẻ trong hình ảnh đĩa đầy đủ:

mkdir fulldisk_part1
sudo mount /dev/mapper/loop0p1 fulldisk_part1

thú vị về vấn đề này (squashfs thay vì gzip). Tôi khá lạ lẫm với các công cụ squashfs ... bạn có thể dẫn đầu ra của dd để tạo một phân vùng squash khi bạn có thể với phân vùng gzip không? các tỷ lệ nén là gì (gzip là ổn / tốt, đặc biệt là thực tế là tôi đang xóa 'không gian trống với số không')?
g19fanatic

Làm thế nào bạn dd hình ảnh trở lại đĩa cứng?
g19fanatic

2
@ g19fanatic Hình ảnh đĩa không nén là "bên trong" hình ảnh squashfs. Bạn gắn hình ảnh squashfs, sau đó dd hình ảnh bên trong nó vào đĩa đích.
doug65536

@ g19fanatic Việc nén là tuyệt vời (gần giống như gzip trong trường hợp của tôi). mksquashfs cũng nhanh, nó là song song. Trên 990x (6 lõi) của tôi, nó thực sự bị giới hạn bởi tốc độ ghi đĩa đích, khoảng 100MB / giây.
doug65536

3
@ g19fanatic Bạn có thể truyền phát vào squashfs bằng cách sử dụng -phoặc -pfcờ để truyền cho nó một tệp giả. Một tập tin giả có thể được sử dụng cho những việc như tạo các nút thiết bị mà bạn không thể làm mà không cần root (hữu ích để xây dựng hình ảnh như là một phần của quá trình xây dựng) hoặc để truyền đầu ra của một số lệnh vào hình ảnh. Một trong những ví dụ được đưa ra trong các tài liệu ( /usr/share/doc/squashfs-tools/examples/pseudo-file.exampletrên Debian / Ubuntu) là input f 444 root root dd if=/dev/sda1 bs=1024 count=10sao chép 10K đầu tiên từ hình ảnh đĩa vào một tệp có tên "đầu vào" trong hình ảnh squashfs.
Brian Campbell

15

Nếu hình ảnh chỉ đọc, bạn cũng có thể sử dụng nbdkit ( trang man ) và plugin xz của nó (xz sẽ cung cấp thời gian truy cập ngẫu nhiên và nén tốt hơn gzip).

Tạo hình ảnh phân vùng nén

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

Một --block-sizetùy chọn 16 MiB nên cung cấp hiệu suất truy cập ngẫu nhiên tốt.

Lưu ý: bạn có thể sử dụng các chương trình nén xz thay thế như pixz cung cấp nén song song, chỉ cần đảm bảo rằng nó chia đầu ra thành nhiều khối nhỏ, nếu không nbdkit phải giải nén rất nhiều dữ liệu. Ví dụ, kể từ tháng 9 năm 2015, pxz không hỗ trợ điều này.

Phục vụ nó với nbdkit

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

Kết nối với máy chủ NBD

nbd-client 127.0.0.1 10809 /dev/nbd0 -nofork

Gắn kết nó chỉ đọc

mount -o ro /dev/nbd0 sda1

Khi xong

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

Dừng nbdkit bằng cách nhấn Ctrl+ C(hoặc với kill ).


15

Thử 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 là một hệ thống tệp dựa trên FUSE cho các biến thể Unix, bao gồm cả Linux. Mục đích của nó là gắn kết các tài liệu lưu trữ (ví dụ tar, tar.gz, v.v.) đến một điểm gắn kết, nơi nó có thể được đọc từ hoặc ghi vào như với bất kỳ hệ thống tệp nào khác. Điều này làm cho việc truy cập nội dung của kho lưu trữ, có thể được nén, minh bạch cho các chương trình khác mà không giải nén chúng.

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

Sau khi cài đặt lưu trữ, bạn có thể sử dụng nội dung như tập tin thông thường. Có thể lấy bảng phân vùng hoặc chuyển đổi, gắn hình ảnh với các công cụ qemu.

squashfs hữu ích để khởi động từ hình ảnh, nhưng rất phức tạp để sao lưu.


Hoàn hảo! Đây là giải pháp dễ dàng và thanh lịch nhất cho đến nay. Tôi tự hỏi tại sao không có phiếu bầu ở đây.
translucentCloud

Tôi nghĩ đó là bởi vì nếu bạn gắn kết một kho lưu trữ như đĩa.img.gz trên một thư mục có lưu trữ, giả sử / mnt /, bạn sẽ nhận được một tệp /mnt/disk.img, sau đó bạn phải gắn kết ở nơi khác. Thay vào đó, câu hỏi muốn một cái gì đó có thể mở khóa cả hai trong một bước duy nhất (và archivemount dường như có khả năng thực hiện điều đó trên .tar.gz, nhưng không phải trên các hình ảnh thô được nén).
p91paul

2
Câu trả lời này cũng rất thú vị. Tôi tin rằng squashfs nhận được nhiều tình yêu hơn vì nó có nhiều nhận thức hơn. Tôi ngay lập tức nhận ra tên nhưng chưa bao giờ nghe nói về archivemount. Tôi cũng sẽ phải cho nó một shot!
g19fanatic

2
archivemount không cho phép gắn hình ảnh được tạo bởi lệnhdd if=/dev/hda conv=sync,noerror bs=64K | gzip -c > /mnt/sda1/hda.ddimg.gz
Sergei

3
Đồng ý - tại thời điểm viết bài, archivemount hỗ trợ lưu trữ tar được nén, nhưng không phải là tệp nén.
mwfearnley

10

Câu trả lời này bổ sung cho câu trả lời của Cristian Ciupitu . Nếu bạn sử dụng nén xz với kích thước khối hợp lý, bạn có thể truy cập hình ảnh đĩa bằng cách sử dụng Guestfish hoặc các công cụ libguestfs khác như thế này:

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

8

Không hẳn vậy. Bạn thực sự không thể tìm kiếm một khối cụ thể trong tệp nén mà không giải nén toàn bộ nội dung trước, điều này gây khó khăn khi sử dụng hình ảnh nén làm thiết bị khối.

Bạn có thể sử dụng một cái gì đó như dumprestore(hoặc tar, thực sự), tất cả đều sử dụng định dạng phát trực tuyến ... để bạn có thể truy cập các tệp cá nhân bằng cách quét hiệu quả qua luồng không nén. Điều đó có nghĩa là nếu tệp bạn muốn nằm ở cuối kho lưu trữ nén, bạn có thể phải chờ đợi rất lâu, nhưng nó không yêu cầu bạn thực sự giải nén mọi thứ vào đĩa.

Sử dụng tarđể sao lưu có vẻ hơi lỗi thời, nhưng bạn có được rất nhiều tính linh hoạt.


1
Vấn đề nằm ở chỗ tôi thậm chí không biết liệu tệp quan tâm có thực sự nằm trong bản sao lưu nén này không ... Bạn có biết một trình thám hiểm tệp sẽ đi qua toàn bộ hình ảnh .gz'd, giữ tệp / dir cấu trúc trong bộ nhớ, cung cấp một cái nhìn đơn giản về cấu trúc và cho phép bạn 'chọn' các tệp (bây giờ nó biết chúng tồn tại ở đâu) để giải nén? Đây là một đặc điểm kỹ thuật rất phù hợp ... nhưng tôi có thể thấy hàng tấn sử dụng cho những thứ như thế này ... nếu nó tồn tại.
g19fanatic

1
Nếu không, bạn có thể chỉ cho tôi một số hướng dẫn về cách kéo cấu trúc từ hình ảnh của gz không? Tôi có thể tạo một chương trình như vậy (chương trình để kiếm sống ...) nhưng mù quáng về chủ đề giải nén dữ liệu hình ảnh và các chi tiết cụ thể của các hệ thống tập tin khác nhau.
g19fanatic

Tôi nghi ngờ rằng việc xây dựng công cụ của riêng bạn sẽ là một dự án lớn hơn bạn thực sự muốn thực hiện. Tuy nhiên ... giả sử rằng bạn có một hệ thống tập tin ext [234], tôi sẽ đề xuất gói e2fspross hoặc có thể là một cái gì đó như fuse-ext2 . Cả hai đều cung cấp các công cụ không gian người dùng để tương tác với các hệ thống tập tin ext [234].
larsks

Cũng lưu ý rằng những gì bạn không có vẻ là một hình ảnh hệ thống tập tin, đó là toàn bộ hình ảnh đĩa, có nghĩa là trước tiên bạn sẽ phải phân tích bảng phân vùng và xác định phân vùng thích hợp.
larsks

Tôi đã nhầm lẫn trong câu hỏi trên và sẽ sửa nó. Tôi thường làm một phân vùng dựa trên hình ảnh dd và lưu một bản sao của bảng phân vùng. Tôi đã từng làm toàn bộ bản sao đĩa nhưng ghét phải gắn kết với các tùy chọn để đến vị trí thích hợp.
g19fanatic

3

Một phụ lục khác cho câu trả lời của Cristian Ciupitu :

Nếu bạn sử dụng nbdkitđể gắn hình ảnh đĩa đầy đủ (so với hình ảnh phân vùng), bạn có thể cần chỉ định kích thước khối (kích thước cung của đĩa) khi kết nối với máy chủ NBD, vì nó mặc định là 1024byte. Để sử dụng 512byte thay thế:

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

Sau đó, đĩa sẽ xuất hiện dưới dạng /dev/nbd0và bạn sẽ có thể xem bảng phân vùng bằng cách sử dụng fdisk -l. Tuy nhiên, các phân vùng chưa được gắn kết - Sử dụng kpartx(từ câu trả lời của doug65536 ) để tạo các thiết bị cho các phân vùng, ví dụ:

kpartx -arv /dev/nbd0

Cuối cùng, các phân vùng sẽ xuất hiện /dev/mapper/và bạn có thể gắn kết chúng như bình thường. Đảm bảo sử dụng chế độ chỉ đọc ( -o ro), vì plugin xz chỉ hỗ trợ đọc:

mount -o ro /dev/mapper/nbd0p3 /mnt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.