Команда dd і все пов "язане з нею

В UNIX системах є одна дуже стародавня команда, яка називається dd. Вона призначена для того, щоб щось кудись копіювати побайтово. На перший погляд - нічого видатного, але якщо розглянути всі можливості цього універсального інструменту, то можна виконувати досить складні операції без залучення додаткового ПЗ, наприклад: виконувати резервну копію MBR, створювати дампи даних з різних накопичувачів, дзеркалювати носії інформації, відновлювати з резервної копії дані на носії та багато іншого, а, при поєднанні можливостей dd і підтримці криптографічних алгоритмів ядра Linux, можна навіть створювати зашифровані файли, що містять в собі цілу файлову систему.

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

Почну з невеликого прикладу, що наочно ілюструє основні параметри команди:

# dd if=/dev/urandom of=/dev/null bs=100M count=5

Параметри:

  • if: вказує на джерело, тобто на те, звідки копіюємо. Вказується файл, який може бути як звичайним файлом, так і файлом пристрою.
  • of: вказує на файл призначення. Те ж саме, писати можемо як у звичайний файл, так і безпосередньо в пристрій.
  • bs: кількість байтів, які будуть записані за раз. Можна показувати цей аргумент як розмір шматка даних, які будуть записані або прочитані, а кількість шматків регулюється вже наступним параметром.
  • count: якраз те число, яке вказує: скільки шматочків буде скопійовано.

Таким чином, описана команда читає 5 * 100 мегабайт з пристрою/dev/urandom до пристрою/dev/null. Надаючи цій команді смислове навантаження виходить, що система згенерує 500 мегабайт випадкових значень і запише їх у null пристрій. Звичайно, єдине, що зробить ця команда: навантажить процесор на кілька секунд. Розглянемо приклади з практики:

Створення образу диска:

# dd if=/dev/cdrom of=image.iso

Команда буде зчитувати з пристрою дані і записувати в файл до тих пір, поки не досягне закінчення пристрою. Якщо диск битий, можна спробувати його прочитати, ігноруючи помилки читання:

# dd if=/dev/cdrom of=image.iso conv=noerror

Параметр «conv» дозволяє підключати декілька фільтрів, застосовних до потоку даних. Фільтр «noerror» якраз вимикає зупинку роботи програми, коли натрапить на помилку читання. Таким чином, деякі дані з диска все ж можна буде прочитати. Точно таким чином я врятував дані зі своєї флешки Corsair, яку погнули: підібрав відповідне положення, коли контакт є, і зробив дамп файлової системи.

Підключити, до речі, такі образи можна за допомогою команди mount з ключем «» -o loop «»:

# mount -o loop image.iso /mnt/image

Якщо щось не виходить, процес розбивається на 2 рівні:

# losetup -e /dev/loop0 image.iso

# mount /dev/loop0 /mnt/image

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

Робота з носіями інформації

Дуже просте, хоч і не оптимальне рішення клонування жорсткого диска:

# dd if=/dev/sda of=/dev/sdb bs=4096

Все те ж побайтове копіювання з розміром буфера 4 Кб. Мінус способу в тому, що при будь-якій заповненості розділів копіюватимуться всі біти, що не вигідно при копіюванні розділів з маленькою заповненістю. Щоб зменшити час копіювання під час маніпуляції з великими обсягами даних, можна просто перенести MBR на новий носій (я нижче опишу як), перечитати таблицю розділів ядра (за допомогою того ж fdisk), створити файлові системи і просто скопіювати файли (не забувши зберегти права доступу до файлів).

Як варіант, можна навіть за розкладом робити бекап розділу по мережі. Розруливши ключі ssh буде працювати така схема:

# dd if=/dev/DEVICE | ssh user@host «dd of=/home/user/DEVICE.img».

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

# dd if=/dev/zero of=/dev/DEVICE

Думаю, зрозуміло на що потрібно замінити DEVICE. Після проведення лекцій по Linux, я дуже ретельно став стежити за тим, що пишу.

Перевірити можна тим же dd, але перетворивши дані в hex:

# dd if=/dev/sda | hexdump -C

Повинні посипатися нулі.

Дії з MBR

MBR розташована в перших 512 байтах жорсткого диска, і складається з таблиці розділів, завантажувача і пари доп. байт. Іноді, її доводиться бекапити, відновлювати тощо. Бекап виконується так:

# dd if=/dev/sda of=mbr.img bs=512 count=1

Відновити можна простіше:

# dd if=mbr.img of=/dev/sda

Причини цих махінацій з MBR можуть бути різні, проте хочу розповісти одну особливість, взяту з досвіду: після відновлення давньої копії MBR, де один з розділів був ext3, а пізніше став FAT і використовувався Windows, розділ перестав бачитися віндою. Причина - ІД розділу, який зберігається в MBR. Якщо UNIX монтує файлові системи згідно з суперблоком, то вінди орієнтуються на ID розділів з MBR. Тому завжди потрібно перевіряти ІД розділів за допомогою fdisk, особливо якщо на комп'ютері є вінди.

Створення файлів

За допомогою dd можна створювати файли, а потім використовувати їх як контейнери інших файлових систем навіть у зашифрованому вигляді. Технологія така:

За допомогою dd створюється файл, забитий нулями (випадковими числами забивати не раціонально: довго і безглуздо):

# dd if=/dev/zero of=image.crypted bs=1M count=1000

Створився файл розміром майже в гігабайт. Тепер потрібно зробити цей файл блоковим пристроєм і, при цьому, пропустити його через механізм шифрування ядра linux. Я виберу алгоритм blowfish. Вивантаження додатків:

# modprobe cryptoloop

# modprobe blowfish

Асоціація образу з блочним пристроєм з увімкненим шифруванням:

# losetup -e blowfish /dev/loop0 image.crypted

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

Створюємо файлову систему і монтуємо:

# mkfs.ext2 /dev/loop0

# mount /dev/loop0 /mnt/image

Образ готовий до запису даних. Після завершення роботи з ним, потрібно не забути його відмонтувати і відключити від блочного loop пристрою:

# umount /dev/loop0

# losetup -d /dev/loop0

Тепер шифрований образ готовий.

Основні ідеї я розписав, однак безліч завдань, які можна вирішити за допомогою маленької програмки, ім'я якої складається з двох букв, набагато ширше. Програма «dd» - яскравий приклад того, що IT'шники називають «UNIX way»: одна програма - частина механізму, виконує виключно своє завдання, і виконує його добре. У руках людини, яка знає свою справу, якій властивий не стандартний підхід до вирішення завдання, такі маленькі програмки допоможуть швидко і ефективно вирішувати комплексні завдання, які, на перший погляд, повинні вирішувати великі спеціалізовані пакети.

COM_SPPAGEBUILDER_NO_ITEMS_FOUND