Как преобразовать образ диска Linux в разреженный файл?

у меня есть куча образов дисков, сделанных с помощью ddrescue, на разделе EXT, и я хочу уменьшить их размер без потери данных, все еще будучи монтируемым.

как я могу заполнить пустое пространство в файловой системе образа нулями, а затем преобразовать файл в разреженным файлом так это пустое пространство на самом деле не хранится на диске?

например:

> du -s --si --apparent-size Jimage.image 
120G Jimage.image
> du -s --si Jimage.image 
121G Jimage.image

это на самом деле имеет только 50G реальных данных о нем, хотя, так что второй измерение должно быть намного меньше.

это якобы заполнит пустое пространство нулями:

cat /dev/zero > zero.file
rm zero.file

но если разреженные файлы обрабатываются прозрачно, это может фактически создать разреженный файл, ничего не записывая на виртуальный диск, по иронии судьбы не позволяя мне превратить образ виртуального диска в разреженный файл. 🙂 Не так ли?

примечание: по какой-то причине,sudo dd if=/dev/zero of=./zero.file работает cat не работает на подключенном образе диска.

2
задан endolith
24.03.2023 18:47 Количество просмотров материала 3402
Распечатать страницу

7 ответов

во-первых, разреженные файлы обрабатываются прозрачно только при поиске, а не при записи нулей.

чтобы было понятнее, пример из Википедии

dd if=/dev/zero of=sparse-file bs=1k count=0 seek=5120

тут не написать любые нули, он откроет выходной файл, искать (перепрыгнуть) 5 Мб, а затем написать ноль нули (я. е. вообще ничего). Эта команда (не из Википедии)

dd if=/dev/zero of=sparse-file bs=1k count=5120

запишет 5Мб нулей и не создаст разреженное файл!

как следствие, файл, который уже не разрежен, волшебным образом не станет разреженным позже.

во-вторых, чтобы сделать файл с большим количеством нулей разреженной, вы должны cp it

cp --sparse=always original sparsefile

или вы можете использовать tarили rsyncs --разреженный вариант также.

16
отвечен mihi 2023-03-26 02:35

возможно, самый простой способ sparsify файл на месте было бы использовать fallocate следующим образом:

fallocate -v --dig-holes {file_name}

fallocate(1) предоставлена util-linux пакета Debian.

7
отвечен Onlyjob 2023-03-26 04:52

редактирование моего ответа для полноты:

  1. воздушный шар пустое пространство FS с нулями (предупреждение: это изменяет образ диска):

losetup --partscan --find --show disk.img

предположим, что это дает /dev/loop1 в качестве диска, и есть только один раздел, иначе нам нужно повторить это для каждого раздела с монтируемыми FS в нем (игнорировать раздел подкачки и т. д.).

mkdir -p /mnt/tmp mount /dev/loop1p1 /mnt/tmp dd if=/dev/zero of=/mnt/tmp/tempfile

пусть закончат на провал с ENOSPC.

/bin/rm -f /mnt/tmp/tempfile umount /mnt/tmp losetup -d /dev/loop1

  1. копировать в разреженное изображение:

'dd' имеет возможность конвертировать файл с нулями в разреженный файл:

dd if=disk.img of=disk-sparse.img conv=sparse

3
отвечен Lam Das 2023-03-26 07:09

Вы имеете в виду, что ваш образ, созданный ddrescue, составляет, скажем, 50 ГБ, а на самом деле чего-то гораздо меньше?

Если это так, не могли бы вы сначала создать новый образ с dd:

dd if=/dev/zero of=some_image.img bs=1M count=20000

и затем создайте в нем файловую систему:

mkfsofyourchoice some_image.img

затем просто смонтируйте образ и скопируйте все из старого образа в новый? Это сработает для тебя?

2
отвечен Janne Pikkarainen 2023-03-26 09:26

PartImage может создавать образы дисков, которые хранят только использованные блоки файловой системы, тем самым резко уменьшая требуемое пространство, игнорируя неиспользуемый блок. Я не думаю, что вы можете напрямую монтировать полученные образы, но:

image -> partimage -> image -> cp --sparse=alway

должны производить то, что вы хотите (можно даже придерживаться последнего шага, не пробовал).

2
отвечен Grumbel 2023-03-26 11:43

теперь есть инструмент virt-sparsify который будет делать это. Он заполняет пустое пространство нулями, а затем копирует изображение в разреженный файл. Однако это требует установки большого количества зависимостей.

0
отвечен endolith 2023-03-26 14:00

Я подозреваю, что вам потребуется специальная программа, написанная на эту спецификацию, если это действительно то, что вы хотите сделать. Но это так...?

Если у вас на самом деле есть много нулевых областей, то любой хороший инструмент сжатия будет получить его значительно вниз. И попытка написать разреженные файлы не будет работать во всех случаях. Если я правильно помню, даже разреженные файлы занимают минимум 1 блок выходного хранилища, где входной блок содержит любые биты, отличные от нуля. Например, у вас есть файл, который имел в среднем даже 1 ненулевой бит на 512 байтовый блок - его нельзя писать "разреженно". Кстати, вы не потеряете данные, если будете сжимать файл с помощью zip, bzip, bzip2 или p7zip. Они не похожи на сжатие mpeg или jpeg с потерями.

с другой стороны, если вам нужно сделать случайный поиск читает в файл, то сжатие может быть больше проблем, чем это стоит, и вы вернулись к редкой записи. Грамотный C или C++ программист должен уметь писать что-то вроде это через час или меньше.

-2
отвечен hotei 2023-03-26 16:17

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх