Клоніруйте весь розділ або жорсткий диск до розрідженого файлу


35

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

cp --sparse=always <(dd if=/dev/sda1 bs=8M) /mount/external/backup/sda1.raw

Однак це трохи надто складно на мій смак і не дозволяє мені відновити процес, якщо перервали аборт. Смішно, що для цього ( ntfsclone) існує інструмент NTFS, але для рідних файлових систем Linux (EXT2-4) такого інструмента не існує.

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


7
+1 для творчого використання cp, мені ніколи не спадало на думку, що ви можете копіювати зображення диска. Я завжди просто стискав їх, якщо мені потрібно було економити місце. Тепер чому це на запитання не є відповіддю?
— Калеб

Відповіді:


21

Ти хочеш dd_rescue.

dd_rescue -a -b 8M /dev/sda1 /mount/external/backup/sda1.raw

1
Чудово! У посібнику написано: "Якщо процес копіювання перерваний користувачем, можна продовжити на будь-якій позиції пізніше". та "-запис файлу spArse (за замовчуванням = ні)". Саме те, що я хочу! Спасибі!
— Мартін Шаррер

3
Шукаючи в dd_rescueІнтернеті, я з’ясував, що існує також інший інструмент, який називається ddrescue(без підкреслення), який був розроблений незалежно від, dd_rescueале, схоже, робить те саме. Я просто згадую, що тут як загальний вигадок.
— Мартін Шаррер

Так, dd_rescueі ddrescueне те саме. Теоретично вони виконують ту саму роботу, але, як правило, мені пощастило зі старшим / оригінальним dd_rescue.
— Стівен Притчард

1
Якщо хтось цікавиться, ви можете будь-коли зупинити копію за допомогою Ctrl-C. Він покаже вам ваше поточне положення, і ви можете використовувати це значення для перезавантаження, додавши -sта позицію до вихідної команди. (Так би це виглядало dd_rescue -a -b 8M -s 42000k /dev/sda1 /mount/external/backup/sda1.raw.)
— Стівен Притчард

1
@Steven Pritchard: Не потрібно пам'ятати позицію. Вкажіть третє ім’я файлу, яке буде журналом файлів, а при перезапуску воно прочитає це і підбере там, де воно припинилося.
— Таніт Розенбаум

20

Тільки для повноти заклик до ddrescue . --sparseАбо -Sпрапор дозволяє призначення бути написані рідко:

$ ddrescue -S -b8M /dev/sda1 /mount/external/backup/sda1.raw

Або з довгим варіантом:

$ ddrescue --sparse --block-size 8M /dev/sda1 /mount/external/backup/sda1.raw

Або якщо ви віддаєте перевагу міБ :

$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw

Щоб дозволити перерву та відновлення порятунку, ви також можете скористатися лог-файлом:

$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw ~/sda1.rescue.log

Зауважимо, що GNU ddrescueі dd_rescueрізні програми. Але GNU ddrescueздається більш поширеним. Наприклад, він уже упакований з GRML .


Чи потрібна спеціальна обробка зображення при відновленні, чи можете ви надати команду, яка використовується для відновлення ddrescue?
— користувач12439

Теоретично носій даних ви використовуєте для порятунку повинен бути більш надійним, так що ви можете , як правило , просто використовувати дд для запису на змінний диск: dd if=sda1.raw of=/dev/sdb1. Однак, щоб використовувати ddrescue для відновлення, ви просто зміните джерело / місце призначення, яке ви використовували для порятунку, на нове джерело / місце призначення, бажано, з новим файлом журналу. Якщо це можливо (часто немає), ви, звичайно, можете використовувати ddrescue для копіювання даних безпосередньо з поганого диска на замінний диск.
— zaTricky

3

У 2007 році був запропонований патч для надання розрідженої підтримки файлів у GNU dd, але, схоже, він не перетворив його на coreutils (принаймні, не на 8.4). Я сумніваюся, що відтоді занадто сильно змінилося, патч може застосовуватися до поточної версії без великої праці.

Я також дуже вражений творчим використанням cpВашого запитання, і це змусило мене використати його для відновлення (тут відновлення від ~ 80M до джерела):

cp --sparse=always \
  <(dd if=/dev/sda1 bs=8M skip=10) /dev/stdout \
  | dd bs=8M seek=10 of=/mount/external/backup/sda1.raw

Редагувати: подряпати це. Другий dd, звичайно, буде шукати неправильне положення у вихідному файлі, оскільки це не така ж довжина, як вхідний.


1
Як і у випадку з відповіддю Bhinesley, найкраще було б зафіксувати хід dd для точного відновлення. Якщо ви використовуватимете цей підхід як для першого запуску, так і для відновлення, і ведете журнал обох паралельних DD незалежно, тоді ви могли б знати, наскільки далеко шукати вихід. Якщо у мене буде час, я спробую це розробити.
— Елі Хеді

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

Так, я щойно це відкрив. Ну добре, було цікаво шукати божевільних нових цілей використання cp- дякую!
— Елі Хеді

1
dd фіксують у 2012 році: git.savannah.gnu.org/cgit/coreutils.git/commit/… "dd: додайте підтримку для conv = sparse option" ("(iwrite): Перетворіть запис блоку NUL у пошук якщо вимагається. ")
— osgx

1

Просто додаю мої 2 копійки. Ще один спосіб створити розріджений файл із необробленого диска - це за допомогою qemu-img, використовуючи щось на кшталт:

qemu-img convert -f raw /dev/sda /tmp/sda.raw

Ви також можете використовувати це на одному розділі. Також у вас є можливість конвертувати необроблений диск / розділ у будь-який інший формат, який підтримує qemu-img (QCOW2, VHD [x], vmdk тощо)


1

Ще один варіант - rsync . Наприклад:

rsync -SP --copy-devices /dev/sda1 /mount/external/backup/sda1.raw

Пояснення:

  • -S/, --sparseщоб пропустити розріджені блоки при записі
  • -P/ --partial --progressщоб показати прогрес і зберігати частково передані файли
  • --copy-devices копіювати вміст пристрою

Ви можете додати, --appendщоб відновити перервану копію (або --append-verifyпідтвердити контрольну суму як для нових, так і для старих збігів даних).

Редагувати : Я щойно зрозумів, що copy-devices.diff розглядається, і він може бути присутнім у багатьох системах (хоча вони включені Fedora , Ubuntu , Debian та іншими)


0

Примітка: це не працює з причин, описаних у коментарях, я залишаю це для ознайомлення.

Контролюйте статистику dd, використовуючи kill -USR1:

$ cp --sparse=always <(dd if=/dev/urandom bs=8M) \
    /mount/external/backup/sda1.raw&
$ watch kill -USR1 `pidof -s /bin/dd`

Резюме за допомогою пропуску / пошуку:

$ i_bytes= # get from the last dd statistic
$ o_bytes=`du -b /mount/external/backup/sda1.raw | cut -f 1`   
$ cp --sparse=always <(dd if=/dev/urandom bs=8M skip=$i_bytes \
    seek=$o_bytes) /mount/external/backup/sda1.raw&
$ watch kill -USR1 `pidof -s /bin/dd`

Без $ i_bytes було б складніше відновити. Напевно, найпростіше записати статистику ДД у файл у випадку, якщо машина вийде з ладу чи що завгодно.


Другий cpпросто замінить існуючий файл, чи не так? Я знаю skipі інші варіанти dd. Питання - це cpчастина.
— Мартін Шаррер

Гм, так, ти маєш рацію.
— bhinesley


0

Чому б не просто:

cp --sparse=always /dev/sda1 /mount/external/backup/sda1.raw
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.