Копіювання розділів жорсткого диска GNU/Linux: як обійтися завантажувальною флешкою там, де раніше потрібен був Акроніс

Відколи до мене дійшла добра новина про існування операційної системи під назвою GNU/Linux, яку використовують всі справжні програмісти, я кілька разів намагався замінити їй дітище Білла Гейтса і кілька разів зазнав невдачі.


Гуру поблизу були відсутні, доступ до інтернету був жорстко обмежений і тому будь-яке нетривіальне завдання ставало в ті часи абсолютно невирішуваним.

Потім, коли з'явився безлімітний інтернет, внаслідок чого з отриманням софту і знань стало істотно легше, я налаштував собі дуал бут і став освоювати Убунту.

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

У більшості випадків це було не фатально. Замість звичного foobar завжди можна послухати музику на Rhythmbox. Замість Microsoft Office є OpenOffice. Так, його сумісність з продуктом корпорації зла часом залишає бажати кращого, але ним цілком можна користуватися для вирішення повсякденних завдань середньостатистичного користувача. Про всяких Файрфоксів, Операх і Хромах я взагалі мовчу.

Але в деяких випадках доводилося перезавантажувати комп'ютер, вибирати в меню завантажувача пункт Microsoft Windows і робити все по-старому. Таким завданням було наприклад зняття образу логічного диска з метою перенесення на інший фізичний носій, тому що поточний вже неабияк поспішав.

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

Але після чергового дружнього жарту про нікому не потрібний і нічого не вміє, а тому безкоштовний Лінукс, я вирішив, що наступного разу для створення образу диска мені не знадобиться нічого, крім завантажувальної флешки і командного рядка. І відправився гуглити.

Гугл створював чітке враження, що як клонувати диски засобами опенсорсних ОС, знає кожна собака. На жаль, чіткі інструкції щодо здійснення загальновідомих та елементарних речей знайти як правило найскладніше. Якісь мануали в результаті наполегливих пошуків зрештою виявилися, але все одно з ними довелося туговато, бо їх явно писали грамотні люди, які возяться з темою не перший і навіть не другий день, і просто не пам'ятають, що знаннями, шанованими ними за необхідний мінімум, володіють далеко не всі.

Тепер, коли жахи гугління позаду, я розумію, що все дійсно досить просто і хочу оформити результати своїх вишукувань у вигляді короткого керівництва по роботі з образами дисків в GNU/Linux, зверненого в першу чергу до тих, хто звик до Акронісу або іншої подібної йому програми. Мені свого часу такий документ би дуже сильно допоміг, сподіваюся, що він допоможе і комусь ще.

Acronis

В Акронісі все було просто і зрозуміло: віконний інтерфейс, підказки і попередній досвід роботи з образами компакт дисків робили процес нескладним. Зняв образ, вставив новий гвинт, розгорнув образ на нього - навіть і розповідати те нема про що. У випадку з Лінуксом процес захлинувся на етапі зняття образу - як це зробити було абсолютно неясно. Спеціальної програмки з підказками не знайшлося, програмки, яка додавала до списку пристроїв віртуальний DVD - на зразок Daemon Tools теж. Та й сам список пристроїв виявився досить проблематичним, тому почати можна прямо з нього.

Перегляд переліку накопичувачів

Для кожного підключеного накопичувача (вінчестера, флешки) у каталозі/dev можна знайти відповідний файл. Його назва складається з букв sd і букви, що позначає номер пристрою. Тобто вінчестеру, підключеному до першого каналу, буде відповідати файл sda, другому sdb і так далі. Відповідно найпростіший спосіб переглянути список пристроїв - ls -1/dev/sd [a-z]. Ця команда покаже список накопичувачів, але не дасть нам ніякої інформації про них. А нам потрібно хоча б побачити список розділів.

Перегляд переліку розділів на накопичувачі

Кожному розділу в каталозі dev також відповідає файл. Його назва будується з назви файла, що відповідає накопичувачу і номеру розділу. Тобто для накопичувача sda, на якому є 2 розділи, у директорії/dev буде створено 2 файли - sda1 і sda2. Переглянути перелік розділів на накопичувачі sda можна командою ls -1/dev/sda [0-9] повний перелік розділів на всіх пристроях виходить на виведенні команди ls -1/dev/sd [a-z] [0-9], а якщо є необхідність включити в перелік і самі пристрої, то можна просто написати ls -1/dev/sd *, що значно менш осмислено, зате коротко і головне працює. Або, як підказують у коментарях, є ще варіант cat/proc/partitions

Часто власник може впізнати диск просто за таким переліком (це коли дисків у нього не 452), але якщо цього недостатньо, то можна скористатися програмою hdparm.

Конкретно hdparm -I/dev/sda виведе детальну інформацію про пристрій/dev/sda.

Цю ж інформацію, але в розсіяному за різними файлами вигляді, можна знайти в директорії/sys/block/sda. Наприклад, модель диска знаходиться у файлі/dev/block/sda/device/model.

Якщо і цього недостатньо, то залишається тільки по черзі монтувати пристрої і дивитися що на них записано. Але це вже зовсім інша історія.

Зняття образу

Отже, пристрій упізнано і розділ, з якого потрібно зняти образ, знайдено. Тепер власне процес.

Загальні рекомендації

Так ми зазвичай називаємо копію диска на рівні розділів або всього пристрою. І якщо користувач Windows у відповідь на питання, як цю копію зробити, зазвичай чує рекомендацію скористатися спеціалізованим софтом, то в Лінуксі все не так.

Як я вже говорив, тут кожен диск і кожен розділ диска представлений конкретним файлом. І, оскільки образ представляє з себе файл з копією диска, логічно припустити, що операція зняття образу і операція копіювання файлу розділу - це одне і те ж саме.

Так воно і є. Нехай нам треба зняти образ розділу/dev/sda2 (на ньому Windows 7 зазвичай тримає диск С:) і зберегти його до файла з назвою win_c.img.

Для цього достатньо написати cp/dev/sda2 win_c.img. Або cat/dev/sda2 > win _ c.img. Коротше можна скористатися будь-якою програмою або комбінацією програм, яка здійснює копіювання файлів.

Правильний спосіб

Як ви напевно вже здогадуєтеся, досягти бажаного можна не одним і навіть не двома, дотепними і не дуже способами, але правильніше і найпростіше на мій погляд, використовувати утиліту ddrescue. Що суттєво важливо - мається на увазі GNU ddrescue, а не давно вже застарілий оригінал.

Вона, так само як і cp, займається копіюванням файлів, але в разі знаходження помилок, ddrescue не перерве роботу з радісним повідомленням про те, що пацієнт швидше мертвий, ніж живий, а запам'ятає місце з помилкою, щоб повернутися до нього пізніше і спробувати прочитати заново. Тепер вже повільно і ніжно.

Використовується ddrescue так:

ddrescue < ключі > < файл, який копіює > < новий файл, до якого скопіюємо старий > < лог файл >

ddrescue не здатна приймати вхідні дані з конвейра, або передавати на конвеєр результат роботи, що втім не дивно. Можливість пропускати місця з помилками при першій ітерації і повернення до них в наступних циклах передбачає наявність файлів на виході і вході.

Команда, яка виконає операцію, аналогічну описаній вище, буде виглядати так:

ddrescue /dev/sda2 win_c.img win_c.img.log

До речі, в даний момент я мовчазно маю на увазі, що жорсткий диск, з якого ми знімаємо копію більш-менш справний і фокусів не викидає. Якщо з диском є серйозні проблеми, то краще попередньо ознайомитися з подробицями використання ddrescue, наприклад тут. і застосувати ці знання при знятті образу.

Неправильний спосіб

Часто можна зустріти рекомендації використовувати для копіювання файла пристрою або розділу програму під назвою dd. Як правило, для зняття образу пропонується зробити щось ось таке:

dd if=/dev/sda2 of=win_c.img

Не робіть так! Хоча семантично підхід правильний (буде копіювати один файл в інший), наслідки можуть бути дуже сумними. Так, dd перевершує cp в тому відношенні, що при виявленні помилки cp припинить роботу, а dd не припинить, але якщо на диску є биті або просто погано читаються сектора, то dd буде продовжувати спроби вважати їх вміст поки з вінчестера не повалить дим.

Так, у dd є аргумент noerror, але при його використанні копіювання може бути виконано з помилками, спроб відновлення яких зроблено не буде. ddrescue в аналогічній ситуації після першого проходу повернеться до пропущених місць і спробує прочитати їх маленькими шматочками. І залишить лог файл, за допомогою якого можна буде продовжувати спроби віднімати збійні місця в майбутньому.

Коротше, використовуйте ddrescue. А якщо крім dd нічого немає, не забувайте про аргумент noerror.

Описана вище процедура може застосовуватися наприклад для того, щоб зберегти образ диска з тільки що встановленою операційною системою для подальшого відновлення. Так, справжній лінуксоїд так чинити не стане, але серед користувачів операційної системи з іншою назвою це досить поширена практика. І для періодичного вдумливого ремонту комп'ютера, який регулярно ламається, якої-небудь симпатичної дівчини її сміливо можуть застосовувати навіть любителі пінгвінів. А якщо дівчат більше деякого, суто індивідуального для кожного самоділкіна, кількості, то даний метод просто незамінний. Головне не переплутати назви файлів з образами.

Перегляд вмісту розділу (логічного диска)

Оскільки кожен розділ диска представлений файлом, можна припустити, що має існувати штатний спосіб з'єднання файлів із образами до файлової системи. З певної точки зору так воно і є. Саме для цього використовується утиліта mount, за допомогою якої можна помістити дерево файлів, що міститься в образі, в будь-яку директорію на ваш вибір. Цей процес називається монтуванням.

Отже, у нас вже є образ, знятий з диска C: операційної системи Windows 7. Ми назвали образ win_c.img і хочемо побачити його вміст в заздалегідь створеній директорії/ mnt/win_c. Для цього треба ввести команду mount -o loop win_c.img/ mnt/win_c.

Ось так можна переконатися, що образ, який ви збираєтеся накотити на вінчестер чергового рожевого ноутбука, є чином іменного того диска C: який очікується побачити на цій конкретній машині. Ну, або можна просто скопіювати з нього файли без яких ніяк не можна обійтися і відправити цей образ у зовнішню темряву. А на ноутбук поставити останню Убунту або Федору.

But we can go deeper.

Перегляд вмісту фізичного диска

А ось з монтуванням образу диска цілком все не так просто. Жахлива правда полягає в тому, що монтувати файли з довільного місця файлової системи ядро не вміє і аргумент -o loop, команди mount, сигналізує про те, що спочатку треба пов'язати образ з файлом віртуального пристрою в директорії/dev, і потім вже приєднати вміст цього пристрою до файлової системи.

Файли віртуальних пристроїв створюються заздалегідь (на етапі завантаження системи) і мають назви loop0, loop1, loop2 і так далі по наростаючій.

Можна зв'язати спосіб розділу з одним з цих файлів командою losetup. Команда mount з попереднього розділу насправді еквівалентна наступним двом командам.

losetup /dev/loop0 win_c.img

mount /dev/loop0 /mnt/win_c

Але ось для того, щоб подивитися вміст образу в якому є кілька розділів, цього недостатньо. Справа в тому, що якщо виконати команду losetup для такого файла, то з пристроєм/dev/loop0 буде пов'язаний весь образ цілком. Тобто цей пристрій буде еквівалентом/dev/sda, а нам потрібні еквіваленти/dev/sda1 і/dev/sda2.

Володарі свіжих версій losetup (читай гентушники і арчеводи) можуть виконати losetup c аргументом --partscan, що призведе до автоматичного створення в директорії/dev файлів, що відповідають розділам образу. Тобто/dev/loop0p1 ,/dev/loop0p2 і так далі до самого горизонту. І ось вже ці файли можна віддавати команді mount.

losetup --partscan /dev/loop0 drive.img

mount /dev/loop0p2 /mnt/win_c

Ті ж, кому не так пощастило з дистрибутивом, можуть скористатися програмою kpartx, яка зробить те ж саме, але покладе файли відповідним розділам не в директорію/dev, а в директорію/dev/mapper, звідки їх можна монтувати і переглядати.

kpartx -a /dev/loop0 drive.img

mount /dev/mapper/loop0p2 /mnt/win_c

But we can go even deeper than that…

Автоматичне створення файлів розділів під час виконання команди losetup

Взагалі-то ядро (а конкретно модуль loop) вже досить давно вміє шукати в файлі образу таблицю розділів і створювати відповідні файли, але за замовчуванням ця функція відключена.

Увімкнено, якщо параметр модуля loop max_part не дорівнює нулю. Тут ви можете встановити цей параметр лише під час завантаження модуля, тому якщо вже запущено систему, модуль слід вивантажити з пам'яті і завантажити знову з уже вказаним параметром. Для цього потрібно виконати наступні дві команди:

modprobe -r loop

modprobe loop max_part=63

Однак у деяких дистрибутивах (напривер в Убунті) модуль loop вкомпільований в ядро намертво і тому для встановлення параметра доведеться вписати loop.max_part=63 в командний рядок ядра і перезавантажити систему.

Розгортання образу на фізичний носій

А тепер про те, як власне накотити образ на інший диск. Як і раніше треба керуватися тим, що диски та розділи представлені у вигляді файлів. І якщо для зняття образу потрібно було створити копію файлу пристрою або розділу, то для того, щоб закатати цей образ назад треба провести операцію копіювання в зворотний бік. Тобто замість cp/dev/sda2 win_c.img написати cp win_c.img/dev/sda2. Ну і краще пам'ятати про поради, викладені в керівництві щодо зняття образу. А саме користуватися ddrescue і не користуватися dd.

ddrescue --force win_c.img /dev/sda2 win_c_restore.img.log

Звичайно, слід пам'ятати, що розділ, в який ми відновлюємо образ (в даному випадку/dev/sda2) повинен бути не менше файла з образом. Якщо розділ виявиться більшим за цей файл, проблем при відновленні не буде, але в розділі залишиться нерозмічений простір. І доведеться або змиритися з цим фактом, або збільшити розмір файлової системи до розміру розділу якимось спеціалізованим софтом (збільшувати, втім, зазвичай набагато простіше і швидше, ніж зменшувати).

Стиснення способу розділу (логічного диска)

Особливо приємною рисою Акроніса є здатність не писати у файл образу шматки диска або розділу, що не містять файлів. За допомогою цього пункту ви зможете вжити спосіб до реального обсягу даних у розділі або на диску.

Викладений раніше підхід має принципові обмеження, що не дозволяють реалізувати таку фічу - програми посекторного копіювання нічого не знають про структуру файлових систем і навіть більше того - не знають, що це взагалі таке - файлова система.

Однак вихід з положення є. Правда для його використання файлова система, на якій зберігатиметься образ, повинна підтримувати таку специфічну штуку, як sparse файли.

Sparse файли

Sparse файл - це файл, у якому куски, що містять нулі, на диск не пишуться. Тобто, якщо половина файла заповнена даними, а інша половина нулями - на диск буде записана тільки половина цього файла і ще додаткова інформація про області файла, заповнених нулями. Якщо область з нулями безперервна і починається в середині, то реально на диску файл буде замінювати половину від свого теоретичного обсягу.

Підготовка розділу або пристрою до стиснення

Для того, щоб скористатися цією можливістю в цілях стиснення образу, потрібно перед зняттям записати у вільне місце нулі. Зробити це нескладно - достатньо змонтувати файлову систему в директорію і створити в цій директорії файл з бінарними нулями розмір якого дорівнює розміру вільного місця на розділі.

Але з'ясовувати кількість вільного місця і передавати його програмі, що створює файл, на щастя не обов'язково, та й шукати програму, що створює файл з нулями, не знадобиться. У директорії/dev є безрозмірний файл zero, який, як неважко здогадатися за назвою, є невичерпним джерелом бінарних нулів. Залишається тільки скопіювати його в потрібне місце.

Оскільки файл безрозмірний, копіювання триватиме до тих пір, поки копія не заповнить весь доступний їй простір, тобто все вільне місце в розділі, що нам власне і потрібно.

Про те, як копіювати файли стандартними засобами операційної системи, тут написано стільки разів, що керівництво цілком могло б називатися «Мистецтво копіювання файлів в оточенні GNU», але оскільки істина від повторення не туксніє, я, мабуть, напишу ще раз.

Для створення файлу з бінарними нулями можна виконати команду cp/dev/zero zerofile або cat/dev/zero > zerofile.

Створення sparse файлу пристрою або розділу

Більшість утиліт для роботи з файлами знають про існування sparse файлів і вміють їх створювати. Згаданою раніше ddrescue, для того, щоб образ виявився sparse файлом потрібно передати ключ --sparse. Тепер результуючий файл буде займати стільки місця, скільки йому необхідно, і не більше.

Як бути у випадку стиснення образу пошкодженого диска

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

З копіюванням файла чудово впорається cp, яка вміє робити sparse файли не гіршими за ddrescue. cp --sparse win_c.img win_c_sparse.img

Звичайно, для проведення цих операцій потрібно багато вільного простору, але так все-таки значно краще, ніж взагалі ніяк.

Ув'язнення

А тепер у стислому вигляді про те, що можна почерпнути з цього керівництва.

  1. У Лінуксі кожному накопичувачу і кожному розділу на накопичувачі відповідає файл.
  2. Оскільки образ є побайтовою копією вмісту диска або розділу, для його створення достатньо зробити копію відповідного файлу будь-якою програмою, що вміє робити копії.
  3. Найкраще для зняття копії файла, що відповідає розділу або накопичувачу, підходить програма GNU ddrescue.
  4. Для відновлення образу достатньо скопіювати його назад.
  5. Для перегляду вмісту образу достатньо змонтувати його в директорію за вибором, також, як система монтує пристрої при завантаженні.
  6. Образи розділів і образи накопичувачів цілком монтуються по різному і не зовсім так, як монтуються реальні накопичувачі і розділи.
  7. Для отримання стиснутого способу розділу потрібно скопіювати заздалегідь підготовлений розділ у файлову систему, що підтримує sparse файли.

І про те, що з даного керівництва почерпнути не можна.

  1. Існує спеціалізований програмний комплекс під назвою Clonezilla, а також заснований на ньому дистрибутив, призначений для резервування і відновлення розділів жорсткого диска.
  2. Існують утиліти ntfsclone і partclone які володіють знаннями про пристрій файлових систем і використовують ці знання наприклад для того, щоб не писати в бекап порожній простір.

P.S. Про всяк випадок даю посилання на Slax - дистрибутив, який я ставлю на завантажувальні флешки. Він вміє копіювати себе в оперативну пам'ять і в ньому за замовчуванням є ddrescue.