У меня есть набор образов дисков, сделанных с 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
не делает на смонтированном образе диска.
В первую очередь, редкие файлы только обрабатываются прозрачно, если Вы ищете, не, если Вы пишете, обнуляет.
Сделать это более ясным, пример из Википедии
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 - редкая опция также.
Вы подразумеваете, что Ваш ddrescue, созданное изображение - скажем, 50 ГБ и в действительности что-то намного, что меньше было бы достаточно?
Если это так, не могли Вы просто сначала создавать новое изображение с dd:
dd if=/dev/zero of=some_image.img bs=1M count=20000
и затем создайте файловую систему в нем:
mkfsofyourchoice some_image.img
затем просто смонтируйте изображение и скопируйте все от старого изображения до нового? Это работало бы на Вас?
Я подозреваю, что Вы потребуете пользовательской программы, записанной в ту спецификацию, если это будет ДЕЙСТВИТЕЛЬНО, что Вы хотите сделать. Но это...?
Если Вы на самом деле получили много все-нулевых областей затем, любой хороший инструмент сжатия значительно снизит его. И попытка записать редкие файлы не будет работать во всех случаях. Если я вспоминаю правильно, даже редкие файлы поднимают минимум 1 блока выходного устройства хранения данных, где входной блок содержит ЛЮБЫЕ биты, которые являются ненулевыми. Например - говорят, что у Вас был файл, который имел в среднем даже 1 ненулевой бит на 512-байтовый блок - он не может быть записан "редко". Между прочим, Вы не собираетесь терять данные при сжатии файла с zip, bzip, bzip2 или p7zip. Они не похожи на mpeg или jpeg сжатие, которое с потерями.
С другой стороны, если необходимо сделать случайный, ищут чтения в файл затем, сжатие могло бы быть большей проблемой, чем это стоит, и Вы вернулись к редкой записи. Компетентный C или программист на C++ должны смочь записать что-то как этот через час или меньше.
PartImage может создать образы дисков, которые только хранят используемые блоки файловой системы, таким образом решительно уменьшая требуемое пространство путем игнорирования неиспользованного блока. Я не думаю, что можно непосредственно смонтировать получающиеся изображения, но движение:
image -> partimage -> image -> cp --sparse=alway
Должен произвести то, что Вы хотите (могло бы даже быть возможно засунуть последний шаг, не попробовали).