Как я преобразовываю образ диска Linux в редкий файл?

У меня есть набор образов дисков, сделанных с ddrescue, на разделе РАСШИРЕНИЯ, и я хочу уменьшить их размер, не теряя данные, все еще будучи монтируемым.

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

Например:

> 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 не делает на смонтированном образе диска.

11
задан 18.02.2011, 07:59

4 ответа

В первую очередь, редкие файлы только обрабатываются прозрачно, если Вы ищете, не, если Вы пишете, обнуляет.

Сделать это более ясным, пример из Википедии

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 он

cp --sparse=always original sparsefile

или можно использовать tar или rsync's - редкая опция также.

18
ответ дан 07.12.2019, 12:11

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

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

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

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

mkfsofyourchoice some_image.img

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

2
ответ дан 07.12.2019, 12:11

Я подозреваю, что Вы потребуете пользовательской программы, записанной в ту спецификацию, если это будет ДЕЙСТВИТЕЛЬНО, что Вы хотите сделать. Но это...?

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

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

-2
ответ дан 07.12.2019, 12:11

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

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

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

2
ответ дан 07.12.2019, 12:11

Теги

Похожие вопросы