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


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.