Як перетворити образ диска Linux у розріджений файл?


12

На розділі EXT у мене є маса зображень на дисках, зроблених за допомогою 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не встановлено зображення, встановлене на диску.


2
Введення нулів у файл не створить розріджений файл. Це інша концепція. Коли ви шукаєте / читаєте розріджений файл, коли ОС виявляє блок даних, насправді немає (список блоків порожній для даних у цьому регіоні), він (ОС) автоматично магічно заповнює буфер читання нульовими байтами.
— готелі

Примітка: sudo cat /dev/zero > zero.fileне працює, тому що ваш bash (працює як ви, а не root) виконує перенаправлення перед виконанням sudoкоманди. Дивіться unix.stackexchange.com/questions/1416/…
— Фріц

Відповіді:


19

Перш за все, розріджені файли обробляються прозоро, лише якщо ви шукаєте, а не якщо ви записуєте нулі.

Щоб зробити це більш зрозумілим, приклад з Вікіпедії

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 --sparse=always original sparsefile

або ви можете також використовувати опцію tar - або rsync --sparse.


1
Згідно з Вікіпедією, написання нулів з dd створить розріджений файл. Чи можете ви пояснити, що означає "пошук"?
— ендоліт

1
Що з кішкою тоді? На сторінці людини немає нічого про рідкі файли, тому я припускаю cat /dev/zero > zero.file, що цілком нормально заповнити порожній простір нулями?
— Ludwig Weinzierl

2
@endolith: оновив мою відповідь, щоб зрозуміти, у чому різниця полягає у ddнаписанні нулів або пошуку.
— mihi

2
@Ludwig Weinzierl: Так, ця catкоманда заповнить увесь ваш диск (або принаймні суму, не зарезервовану для кореня або за квотами) "справжніми" нулями, і не створить розріджених файлів.
— mihi

1
@endolith вам знадобиться додатковий простір, так. але оскільки ви можете стиснути тарбол, вам знадобиться лише місце для оригінального файлу та стислої версії розрідженого файлу.
— mihi

12

Мабуть, найпростішим способом розшарування файлу на місці було б використання fallocateутиліти наступним чином:

fallocate -v --dig-holes {file_name}

fallocate (1) надається пакетом util-linux на Debian .


1
Чомусь у fallocate --dig-holesрезультаті з'явився файл 103GiB з оригіналу 299GiB, а cp --sparse=alwaysмені дали 93GiB - все з тією ж сумою SHA1 (розміри перевірені через du -B1Gvs du --apparent-size -B1G). Отож, fallocateздається, дає неповноцінні результати.
— Руслан

3

Редагування моєї відповіді для повноти:

  1. На повітряній кулі порожній простір FS з нулями (УВАГА: це змінює зображення вашого диска):

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

Припустимо, він дає / dev / loop1 як диск, і є лише один розділ, інакше нам потрібно повторити це для кожного розділу з встановленим FS в ньому (ігноруйте swap-розділ тощо).

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



1
Так, цей варіант не з моменту, коли запитували ОП. Це було більше "залишити хлібну крихту для інших шукачів" ... :-)
— Lam Das

1
залежно від типу файлової системи, zerofreeможе бути швидшим, ніж встановлення та записування нулів у файлову систему, а зображення диска зростає менше, якщо воно вже містило багато нулів.
— mihi

2

Ви маєте на увазі, що ваше зображення, створене ddrescue, становить, наприклад, 50 Гб, а насправді чогось набагато менше вистачить?

Якщо це так, не могли б ви спершу створити нове зображення з dd:

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

а потім створити в ній файлову систему:

mkfsofyourchoice some_image.img

то просто змонтуйте зображення та скопіюйте все зі старого зображення на нове? Це могло б працювати для вас?


2

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

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

Потрібно створити те, що ви хочете (можливо, можливо навіть виконати останній крок, не намагалися).


1
На жаль, зображення, створені за допомогою partimage, не піддаються монтажу, не розгортаючи їх знову, роблячи їх придатними лише для архівних цілей.
— Перкінс

0

Зараз є інструмент під назвою virt-sparsify, який це зробить. Він заповнює порожній простір нулями, а потім копіює зображення в розріджений файл. Однак для цього потрібно встановити багато залежностей.


-2

Я підозрюю, що вам потрібна спеціальна програма, написана до цієї специфікації, якщо це дійсно те, що ви хочете зробити. Але це ...?

Якщо у вас дійсно багато областей, що мають нуль, то будь-який хороший інструмент стиснення значно знизить його. І спроба запису розріджених файлів не спрацює у всіх випадках. Якщо я пам'ятаю правильно, навіть розріджені файли займають мінімум 1 блок вихідного сховища, де вхідний блок містить БУДЬ-які біти, які не є нульовими. Наприклад - скажімо, у вас був файл із середнім рівним рівнем 1 нульовий біт на 512 байтовий блок - його неможливо записати "рідко". До речі, ви не збираєтеся втрачати дані, якщо стиснути файл за допомогою zip, bzip, bzip2 або p7zip. Вони не схожі на стиснення mpeg або jpeg, що є втратним.

З іншого боку, якщо вам потрібно зробити випадкові запити читання у файл, тоді стиснення може бути більшим клопотом, ніж це коштує, і ви повернетесь до розрідженого запису. Грамотний програміст C або C ++ повинен мати можливість написати щось подібне за годину чи менше.


Цікаво - голосування, але я помічаю, що немає спростування того, що я написав. Якщо це точно, але не є корисним, це не є причиною зворотного голосування. Якщо це не точно і не корисно, то це заслуговує.
— готелі

Я бачу в інших місцях, що в ОП було питання, що стосується монтажу стислих зображень. Я припускаю, що це продовження цієї нитки. Знаючи, що зараз я бачу, чому моя пропозиція стиснення не була прийнята. Проста програма C все ще є простим способом створення розріджених файлів. АЛЕ - чи дозволить (неозначена) ОС вам встановити розріджений ISO. Настільки вибагливий, як і монтер Ubuntu ISO, я не на 100% впевнений, що це теж спрацює ... але найкраще пощастить у будь-якому випадку.
— готелі

4
навіщо винаходити колесо? cp --sparse=alwaysчи добре працює
— mihi

@mihi: Це гарна ідея. Я не знав про рідкісний варіант, оскільки він не доступний у BSD-ароматах ( freebsd.org/cgi/… ), і я ніколи не мав вимоги переглядати сторінку man для Linux для cp (до сьогодні).
— готелі

Один із способів створити стислі зображення та змонтувати їх - просто зберегти їх у файловій системі, яка підтримує натиснене стиснення. Робить відновлення даних жахливим, якщо у вас відбувається збій накопичувача, але для цього потрібні резервні копії, правда?
— Перкінс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.