В 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»: одна програма - частина механізму, виконує виключно своє завдання, і виконує його добре. У руках людини, яка знає свою справу, якій властивий не стандартний підхід до вирішення завдання, такі маленькі програмки допоможуть швидко і ефективно вирішувати комплексні завдання, які, на перший погляд, повинні вирішувати великі спеціалізовані пакети.
