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