![Сжатый образ диска на Linux](https://rvso.com/image/1267762/%D0%A1%D0%B6%D0%B0%D1%82%D1%8B%D0%B9%20%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%20%D0%B4%D0%B8%D1%81%D0%BA%D0%B0%20%D0%BD%D0%B0%20Linux.png)
Я только что получил новый компьютер с гораздо большим жестким диском. Думаю, я скопировал все важные файлы, но на всякий случай хочу сохранить образ старого диска. Чтобы сэкономить место, я хочу сжать его, но не нашел возможности смонтировать сжатый образ.
Мои цели:
- Результат должен быть легкодоступным
- Нет необходимости распаковывать все, прежде чем я смогу получить доступ к чему-либо.
- Файлы должны быстро находиться — архив TAR/CPIO отсутствует
- Необходимого места должно быть меньше, чем при простом копировании файлов.
Поэтому в идеале я ищу сжатую файловую систему, доступную только для чтения, которую я могу создать в файле и которая будет автоматически увеличиваться.
решение1
Используйте программное обеспечение для судебного анализа, напримерГАЙМАГЕР(открытый исходный код, sourceforge.net). Имеет приятный пользовательский интерфейс, позволяющий быстро создать сжатый образ всего жесткого диска.
Используйте «Расширенный криминалистический образ (.aff)». Это создаст один сжатый файл (ну, а также файл .info).
Чтобы изменить скорость сжатия по умолчанию 1 (самая быстрая, но с наименьшим сжатием). Если у вас быстрый компьютер с большим количеством ядер, вы можете изменить это, создав /etc/guymager/local.cfg
:
AffCompression = 3
9
является лучшим, но самым медленным сжатием. 3
обеспечивает хорошее сжатие с хорошей производительностью.
Обновлять
Монтаж не так прост, как кажется. Прежде всего, вам нужноАФФЛИБ(Ubuntu: aptitude install afflib-tools
). Теперь вы можете получить сырой образ диска с помощью[affuse][3] <image> <mount-point>
Но по какой-то причине монтирование образа raw не удается. parted
говорит, что первый раздел начинается с 1048576B
but
mount -t ext4 -o loop,ro,offset=1048576 /mnt/backup.raw /mnt/backup
завершается с обычной бесполезной ошибкой монтирования:
mount: wrong fs type, bad option, bad superblock on /dev/loop0,
missing codepage or helper program, or other error
In some cases useful info is found in syslog - try
dmesg | tail or so
и dmesg
говорит:
EXT4-fs (loop0): VFS: Can't find ext4 filesystem
решение2
Как предполагает Маттиас Крулл в комментарии выше, qcow2 может быть хорошим форматом, который поддерживает сжатие для хранения образа диска. Он будет поддерживаться довольно долго, поскольку это формат для образов дисков виртуальной машины QEMU. Вот пример команды, которая сжимает /dev/sda
в сжатый файл образа sda.qcow2
. По умолчанию используется сжатие zlib, но я думаю, что zstd может иметь лучшую степень сжатия. Для увеличения пропускной способности используется 8 потоков, но вам следует изменить это на количество ядер процессора, которое у вас есть.
qemu-img convert -c -p -S 512 -o compression_type=zstd" -f raw -O qcow2 -m 8 \
/dev/sda sda.qcow2
Доступ к образу как к блочному устройству только для чтения. NBD (сетевое блочное устройство) можно использовать следующим образом:
modprobe nbd
qemu-nbd -r -c /dev/nbd0 sda.qcow2
kpartx -av /dev/nbd0
Затем файловую систему можно смонтировать как обычно, используя mount
соответствующее устройство в /dev/mapper
.
решение3
Для файловых систем, поддерживающих блочное сжатие, одним из вариантов является сохранение образа диска непосредственно в виде файла. Я знаю, что BTRFS поддерживает это, но, вероятно, и другие тоже. В случае BTRFS вам, скорее всего, потребуется включить опцию монтирования, compress-force
чтобы переопределить несжимаемую эвристику. Вам также понадобится создать разреженный файл. Это можно сделать с помощью dd
, как в этом примере:
dd if=/dev/sda of=/mount/btrfs/sda.img conv=sparse,fsync iflag=nocache oflag=nocache
Это создаст разреженный файл, поэтому нулевые сектора не будут занимать место, а BTRFS будет сжимать блоки, которые можно сжимать (при условии, что вы включили эту функцию). Инструмент compsize
можно использовать для того, чтобы увидеть, насколько сжат файл. Использование du
покажет только размер несжатого файла за вычетом дыр, поэтому будет неточным.
Для монтирования любых файловых систем в образе можно использовать следующее:
LOOPDEV=$(losetup --show -f /mount/btrfs/sda.img)
kpartx -av "$LOOPDEV"
mount /dev/mapper/"$LOOPDEV"p3 # To mount the 3rd partition
Если вы не используете файловую систему с собственным сжатием, например, ext4
, вы все равно можете использовать этот метод, обернув образ диска в образ файловой системы BTRFS. Это может выглядеть так:
truncate -s 100G backup-sda.btrfs.img
mkfs.btrfs backup-sda.btrfs.img
mount -o compress-force=zstd:9 backup-sda.btrfs.img /media/tmp
cd /media/tmp
# Now do commands to create disk image as above
Этот метод обеспечивает больший контроль над алгоритмами сжатия и уровнем сжатия, чем метод с использованием qemu-img convert
, который позволяет выбирать только метод сжатия, но не уровень, и имеет меньше доступных методов сжатия.