ddrescue: побітова копія несправного диска, mapfile і чому не можна починати спочатку

Коротка відповідь: З диска, який повідомляє про помилки читання, не копіюють файли й не запускають на ньому звичайний dd — обидва варіанти читають послідовно й за кожної помилки застрягають саме там, де диск пошкоджений найбільше. GNU ddrescue діє навпаки: спочатку великими блоками збирає все, що можна швидко прочитати, пропускає пошкоджені та повільні ділянки й повертається до них лише наприкінці, читаючи окремі сектори. Стан роботи зберігається в mapfile, тому після переривання програма продовжує з місця зупинки, а не проходить диск знову від початку. Це стосується лише диска з пошкодженими секторами: диск, який клацає, зникає із системи або з кожним проходом додає помилки, ddrescue доб’є — такий носій слід передати до лабораторії з апаратним іміджером.

Загальну процедуру для пошкодженого HDD (вимкнути, не форматувати, не ремонтувати) ми описали у статті Як отримати дані з пошкодженого HDD. Цей текст — її технічне доповнення для читачів, які мають під рукою Linux: що саме ddrescue робить із диском, чому порядок читання подовжує його ресурс і де проходить межа, після якої кожна наступна команда лише шкодить. Твердження про поведінку програми перевірені за посібником GNU ddrescue версії 1.30 від 1 січня 2026 року.

Чому з пошкодженого диска не копіюють файли й не запускають dd

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

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

ddrescue не має спільного коду з dd, лише схоже призначення. Його принцип: спочатку справні ділянки, а читання всередині пошкоджених або повільних областей — пізніше. Версії до 1.19 використовували стратегію «розділяй і володарюй», що спричиняла багато переміщень головок; новіші версії навмисно зводять їх до мінімуму, адже кожен прохід над пошкодженим місцем скорочує ресурс диска. Ще дві властивості, від яких залежить придатність результату: у місця пошкоджених секторів ddrescue нічого не записує (у щойно створеному файлі там залишаються нулі) і не скорочує вихідний файл — кожен наступний запуск із тим самим образом лише заповнює прогалини й ніколи не видаляє вже врятовані дані.

П’ять фаз ddrescue: що вони роблять і чому саме в такому порядку

Актуальна версія працює у п’ять фаз (старіші описи, зокрема наша стаття про пошкоджені сектори, говорять про дві — це спрощення). Сектори послідовно отримують стани non-tried → non-trimmed → non-scraped → bad-sector, доки їх не буде прочитано й позначено як завершені.

ФазаЩо робитьЧому саме так
1. Copying (до 4 проходів)Читає ще не перевірені області великими блоками; у разі помилки або повільного читання переходить далі, а після кожного проходу змінює напрямок. Проходи 3 і 4 повертаються до областей, пропущених через повільне читання.Швидко окреслити великі пошкодження, першими зібрати найперспективніші дані та підготувати початкові точки для наступних фаз.
2. TrimmingПосекторно читає від країв невдалих блоків усередину, доки не натрапить на пошкоджений сектор.На краях пошкоджень висока ймовірність знайти читабельні дані; посібник не радить вимикати цю фазу.
3. SweepingБез пропусків проходить області, які copying оминув через помилки.Для добре окреслених пошкоджень має невеликі шанси на успіх, тому запускається лише після trimming. -N вимикає її (диск із несправною головкою).
4. ScrapingПосекторно «зішкрібає» решту даних.Найповільніша й найважча для диска робота виконується наприкінці; -n пропускає її.
5. RetryingПовторно намагається прочитати пошкоджені сектори; кількість проходів задає -r, напрямок чергується.ddrescue не може визначити, чи сектор втрачений назавжди, чи прочитається після кількох спроб.

Важлива для збереження диска деталь: без -r ddrescue намагається прочитати кожен сектор не більше двох разів — один раз у складі великого блока (copying, sweeping), а другий окремо (trimming, scraping). Додаткові спроби з’являються лише під час retrying — по одній на кожен прохід. Багаторазове читання одного сектора відбувається тільки тоді, коли ви самі його вкажете.

Mapfile: чому не можна починати спочатку

Mapfile — це текстовий файл (до версії 1.20 він називався logfile): заголовок із командою та часом, рядок стану з поточною позицією, фазою й номером проходу, а також список блоків зі станами ? — не перевірений, * — не обрізаний, / — не оброблений scraping, - — пошкоджений сектор, + — завершений. ddrescue зберігає його в процесі роботи — залежно від розміру кожні 30 секунд — 5 хвилин (--mapfile-interval), під час завершення та переривання через Ctrl-C — і тримає поруч резервну копію .bak.

Без mapfile ddrescue не може продовжити відновлення, а лише почати його заново. У цьому суть заголовка: після кожного переривання, збою USB або перезапуску диск знову читається від початку, головки повторно проходять уже врятовані області, а всі пропущені пошкодження доводиться шукати вдруге. Посібник додає: щоразу, коли фізично пошкоджений диск розкручується й ще віддає дані, це може бути востаннє. Завдяки рядку стану ddrescue продовжує роботу всередині незавершеної фази — не повторює навіть перший прохід copying.

Три правила:

  • Mapfile має зберігатися на третьому носії — не на диску, який рятують, і не на цілі, що перезаписується; посібник вимагає звичайний файл у наявному каталозі. Якщо закінчиться місце, ddrescue запропонує аварійне збереження у ddrescue.map у поточному або домашньому каталозі.
  • Ніколи не підставляйте mapfile з іншого відновлення — ddrescue вважатиме, що частини диска вже скопійовані.
  • Один mapfile можна використовувати для кількох команд над різними областями того самого диска: спочатку початок диска, потім вибрані ділянки, а насамкінець решта. Жодна завершена область не читається двічі.

Куди копіювати: в образ .img чи з диска на диск

Образ у файлі безпечніший у більшості випадків. Цільова файлова система має підтримувати файл розміром з увесь диск (FAT32 обмежена 4 GiB; NTFS, exFAT та ext4 такої проблеми не мають) і мати достатньо вільного місця; параметр -p попередньо виділяє його, щоб відновлення не зупинилося посередині. З образу створюють робочу копію — посібник радить зберігати першу копію як еталонну, а відновлення виконувати лише на другій.

Копіювання з диска на диск має сенс, коли образ ніде розмістити або ви хочете відразу використовувати відновлений диск. Ціль має бути щонайменше такою самою за розміром, як джерело, а всі дані на ній буде перезаписано; тому під час запису на пристрій ddrescue вимагає -f як захист від помилки. Менш відомий нюанс: у місцях пошкоджених секторів на цілі залишиться те, що було там раніше — на вживаному диску це можуть бути чужі дані. Якщо вам потрібна чиста копія, заздалегідь заповніть ціль нулями.

Команди крок за кроком

У Debian та Ubuntu пакет називається gddrescue, оскільки ім’я ddrescue раніше вже використовувала інша програма (dd_rescue Курта Гарлоффа); виконуваний файл називається ddrescue. Без встановлення він доступний на завантажувальному носії SystemRescue.

Спочатку перевірте джерело та ціль. Диск, який рятують, не має бути змонтований — посібник прямо забороняє навіть монтування лише для читання. Після перезапуску позначення /dev/sdX може змінитися; параметр --ask перед запуском покаже модель, серійний номер і розмір обох пристроїв.

# ДЖЕРЕЛО й ЦІЛЬ визначайте за серійним номером, а не за літерою; LOG-SEC = логічний сектор
lsblk -o NAME,SIZE,MODEL,SERIAL,LOG-SEC
sudo smartctl -i /dev/sdX   # ті самі дані з ідентифікації SMART (посібник радить для перевірки)

Саме відновлення виконується у два проходи, як у посібнику. ДЖЕРЕЛО — пошкоджений диск /dev/sdX, ЦІЛЬ — образ на справному диску. Якщо переплутати порядок аргументів, справний диск буде перезаписаний вмістом пошкодженого — тому використовуйте --ask.

# 1-й прохід: швидко скопіювати все читабельне без scraping (-n), із підтвердженням пристроїв (--ask)
# ДЖЕРЕЛО /dev/sdX (пошкоджений диск) -> ЦІЛЬ /mnt/zdravy/disk.img, mapfile на справному диску
sudo ddrescue -n --ask /dev/sdX /mnt/zdravy/disk.img /mnt/zdravy/disk.map

# 2-й прохід: прямий доступ в обхід кешу ядра (-d), три проходи retrying (-r3);
# читається лише те, що в mapfile позначено як незавершене
sudo ddrescue -d -r3 /dev/sdX /mnt/zdravy/disk.img /mnt/zdravy/disk.map

Параметр -d вимагає правильного розміру сектора: типовим значенням є 512 байтів, а для диска з логічним сектором 4 KiB додайте -b 4096, інакше ddrescue може завершитися помилкою невирівняного читання. Параметр -c змінює кількість секторів, які читаються одночасно (типово 64 KiB); менші значення допомагають із повільними дисками.

# Диск на диск: ДЖЕРЕЛО /dev/sdX -> ЦІЛЬ /dev/sdY, яку буде повністю ПЕРЕЗАПИСАНО; для пристрою потрібен -f
sudo ddrescue -f -n --ask /dev/sdX /dev/sdY /root/disk.map
sudo ddrescue -f -d -r3 /dev/sdX /dev/sdY /root/disk.map

Якщо диск зависає в певному місці, посібник радить там не залишатися: запустіть процес знову з безпечної відстані після проблемної ділянки (-i), а потім поверніться назад за допомогою -R. Зворотний напрямок застосовується до всіх фаз і не змінює розміру блоків.

# Диск завис біля 12,3 GB: продовжити трохи далі, а решту пройти у зворотному напрямку (ті самі ДЖЕРЕЛО, ЦІЛЬ і mapfile)
sudo ddrescue -f -i 12350MB /dev/sdX /dev/sdY /root/disk.map
sudo ddrescue -f -R /dev/sdX /dev/sdY /root/disk.map

Запобіжники для роботи без нагляду: -T 5m завершить процес, якщо протягом п’яти хвилин не буде успішного читання, -e +50 — після п’ятдесяти нових пошкоджених областей, а --max-slow-reads разом із -a реагує на падіння швидкості. Це лише приклади значень — налаштуйте їх відповідно до кількості помилок, яку ви готові дозволити диску. Параметр --log-rates щосекунди записує швидкість, а графік дає змогу побачити слабку зону диска.

На екрані стежте за rescued і pct rescued, bad areas та time since last successful read. За посібником оцінка часу, що залишився, принципово неточна: наприкінці першого проходу вона може показувати секунди, а потім зрости до годин або днів. Справні ділянки читаються швидко, а решта — довго.

Як отримати дані з образу: монтувати лише для читання

# Образ усього диска через loop-пристрій: --read-only забороняє запис, --partscan створює /dev/loop0p1, p2 …
sudo losetup --find --show --read-only --partscan /mnt/zdravy/disk.img
sudo mount -o ro /dev/loop0p1 /mnt/obraz

Образ одного розділу можна змонтувати безпосередньо: mount -o loop,ro oddil.img /mnt/obraz. Якщо файлова система не монтується, виправляйте її на робочій копії образу (e2fsck, ntfsfix, chkdsk над копією у Windows), ніколи не на оригіналі. Таблицю розділів відновлюють за допомогою TestDisk, а втрачену структуру папок — PhotoRec; обидві програми слід запускати над образом. Команда ddrescuelog -l- -b4096 oddil.map виведе номери блоків, які не вдалося прочитати (розмір блока має відповідати файловій системі); в ext4 команда e2fsck -L завантажить їх як список пошкоджених блоків. Розташування пошкоджень графічно показує ddrescueview — переглядач mapfile для Linux і Windows.

Коли ddrescue не допомагає, а шкодить

ddrescue призначений для диска з пошкодженими секторами, а не з несправними головками. Він не може вимкнути несправну головку, не керує живленням, не припиняє повторні спроби читання, які виконує прошивка диска, чи фонове обслуговування й читає через звичайний контролер SATA або USB із його часовими обмеженнями. Апаратний іміджер, який використовує лабораторія (класу DeepSpar Disk Imager або PC-3000), усе це вміє: задає ліміт читання сектора в мілісекундах, у разі зависання вимикає та знову вмикає живлення вихідного диска без перезапуску комп’ютера, будує карту головок і спочатку читає лише стабільними головками, а також використовує сервісні команди в обхід прошивки. За даними Rossmann Group, у диска з ослабленою головкою, пошкодженою прошивкою або сервісною областю ddrescue прискорює відмову, адже змушує деградовані головки проходити кожну доріжку.

Ознакаddrescue вдомаЛабораторія
SMART повідомляє про кілька pending або reallocated секторів, диск читає стабільно, зрідка виникає помилкаТак — два проходи за процедурою вище, подальшу роботу виконуйте з образом.Не потрібна, доки образ успішно створюється.
Диск клацає, пищить, розкручується й зупиняється, повідомляє нульову місткістьНі. Вимкнути й більше не вмикати; кожен запуск переміщує головки над пластинами. Див. диск клацає і головки впали на пластини.Так — механічний ремонт, чистий бокс, іміджер.
Швидкість падає до нуля, bad areas зростає з кожним проходом, time since last successful read збільшуєтьсяЗупинитися. Головки деградують, кожна хвилина зменшує шанси; не додавайте -r.Так — ліміти в мілісекундах, карта головок.
Показники reallocated і pending різко зростають під час копіюванняЗупинитися й залишити диск вимкненим. Значення показників пояснено у статті про SMART.Так.
Диск зникає з /dev, його доводиться від’єднувати й під’єднуватиУ посібнику є процедура для одноразового збою (-A, -O); повторне зникнення — це вже межа.Так — іміджер керує живленням.
Зовнішній WD або Seagate 2,5” з USB-мостом на платі дискаЧерез справний міст — так; диск не можна виймати з корпусу, оскільки міст виконує шифрування. Див. WD і Seagate.Так, разом з оригінальною платою моста.
SMR-диск із пошкодженою трансляцією, несправна прошивкаНі — проблема не в секторах. Див. CMR проти SMR.Так — робота з прошивкою.
SSD не відповідає або має нульову місткістьНі; ddrescue не залежить від інтерфейсу, але несправність міститься в контролері. Див. відновлення даних із SSD.Так.

Чого не робити

  • Не запускати chkdsk, fsck або «відновлення диска» на оригіналі. Посібник: ніколи не виправляйте файлову систему на диску з помилками введення-виведення — ви втратите додаткові дані. Виправлення виконують на копії образу; докладніше у статті про CHKDSK.
  • Не використовувати діагностичні та ремонтні утиліти виробника. Тести запису, «відновлення» секторів або команди стирання для SSD записують дані на диск.
  • Не перезапускати й не перепід’єднувати диск багато разів. Кожне розкручування несправного диска означає додатковий рух головок і, за посібником, може стати останнім. Один запуск із mapfile, а не десять спроб «чи запрацює цього разу».
  • Не класти диск у морозильну камеру. Це спричинить конденсацію на пластинах і нічого не виправить.
  • Не відкривати диск. Поза чистим боксом на пластини потрапляє пил — див. мікроподряпини пластин.
  • Не запускати програми відновлення безпосередньо над пошкодженим диском. Вони годинами читають носій, що відмовляє, і нерідко записують результати на той самий диск. Спочатку створіть образ, а вже потім відновлюйте дані з нього.
  • Не запускати ddrescue без mapfile, над змонтованим розділом або через Cygwin. Посібник застерігає від усіх трьох варіантів: перший позбавляє можливості продовжити роботу, другий створює непридатну копію, а третій повідомляє оманливі помилки дозволів.

Часті запитання

Чи можна запустити ddrescue у Windows?

Практично ні. Посібник рекомендує POSIX-систему, а для Cygwin описує помилки «Permission denied», через які ddrescue не може визначити причину збою. Завантажте live Linux — SystemRescue містить ddrescue і TestDisk — і лише після цього під’єднайте пошкоджений диск.

Скільки часу триває створення побітової копії?

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

Що означає, якщо ddrescue завершив роботу з ненульовим значенням «bad areas»?

Частина секторів залишилася непрочитаною. У новому образі на їхньому місці містяться нулі, а точні ділянки записані в mapfile; ddrescuelog виведе з нього номери блоків, після чого можна визначити, які файли пошкоджені. Збільшувати -r доцільно лише тоді, коли стан диска не погіршувався під час копіювання.

Чи можна перервати відновлення й продовжити наступного дня?

Так, саме для цього існує mapfile. Ctrl-C оновлює його, а наступного разу та сама команда продовжить роботу всередині незавершеної фази. Після перезапуску перевірте за допомогою --ask, чи не змінилося позначення /dev/sdX, і не дозволяйте жодній системі «виправляти» частково скопійовану ціль до завершення відновлення.

Чи підходить ddrescue для дисків із RAID або NAS?

Так — для кожного диска окремо, у власний образ і з окремим mapfile; масив складають лише з образів і ніколи не виконують rebuild на пошкоджених дисках. Чому rebuild може остаточно знищити деградований масив, пояснює стаття про RAID.

Якщо під час першого проходу диск починає клацати, десятки відсотків даних залишаються нечитабельними або швидкість падає до нуля, залиште диск вимкненим і зв’яжіться з нами: у лабораторії в Брно ми оцінимо його стан і скажемо, чи має сенс продовжувати роботу апаратним іміджером. Докладніше про відновлення даних із HDD, контакти, телефон +420 775 556 063 або електронна пошта zachranadat@ithope.cz. Візьміть із собою наявні mapfile та образ — це дасть змогу уникнути зайвого читання диска.

Джерела

Де нас знайти

ITHOPE — компанія з Брно, Чехія: ми робимо відновлення даних з дисків, RAID і NAS, сервіс ПК та ноутбуків та IT для бізнесу, усе у власній лабораторії за адресою Viniční 3587/216, 615 00 Brno.

Телефон +420 775 556 063 (цілодобово). Пристрій можна привезти особисто або надіслати курʼєром (Zásilkovna, PPL).