Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Изучаем команды Linux: dd

Оригинал: Learning Linux commands: dd
Автор: Rares Aioanei
Дата публикации: 16 ноября 2011 года
Перевод: А. Кривошей
Дата перевода: апрель 2011 г.

 

1. Введение

1.1. Почему dd?

Мы выбрали dd как первого соискателя в нашей серии, потому что это очень полезная утилита, имеющая, как вы увидите ниже, множество опций. Это делает ее практически швейцарским армейским ножом в мире Linux.

2. Общепринятое использование

Перед тем, как начать, мы хотим выяснить, для чего в целом предназначена dd. Во-первых, ее название происходит от "data duplicator", но в шутку ее еще расшифровывают как "disk destroyer" или "data destroyer", потому что это очень мощная утилита. Поэтому мы рекомендуем использовать ее очень аккуратно, так как малейшая неосторожность может стоить вам всех ваших данных. Синтаксис dd выглядит следующим образом:

$ dd if=$input_data of=$output_data [options]

Входными и выходными данными могут быть диски, разделы, файлы, устройства... практически все, с чего можно считывать информацию, и куда ее можно записывать. Как вы увидите ниже, с помощью dd можно также пересылать данные, например, по локальной сети. Вы можете использовать входную часть команды, или только выходную, а в некоторых случаях могут отсутствовать обе части. Все это будет проиллюстировано в представленной ниже таблице.

3. Примеры

Синтаксис команды Описание
Файловые системы
dd if=/dev/urandom of=/dev/sda bs=4k
Заполняет устройство случайными данными
dd if=/dev/sda of=/dev/sdb bs=4096
Побайтное копирование данных с устройства на устройство
dd if=/dev/zero of=/dev/sda bs=4k
Очистка жесткого диска (для полной уверености в уничтожении данных можно выполнить несколько раз)
dd if=inputfile of=/dev/st0 bs=32k conv=sync
Копирование файла на ленточное устройство
dd if=/dev/st0 of=outfile bs=32k conv=sync
Копирование файла с ленточного устройства
dd if=/dev/sda | hexdump -C | grep [^00]
Проверяет, заполнен ли диск нулями
dd if=/dev/urandom of=/home/$user/hugefile\
bs=4096
Заполняет раздел (острожнее с системными разделами!)
ls -l myfile
-rw-r--r-- 6703104 Oct 31 18:25 myfile
dd if=/dev/urandom of=myfile bs=6703104 count=1
Перемешивает содержимое файла (может применяться перед его удалением)
dd if=/dev/sda3 of=/dev/sdb3 bs=4096 \
conv=notrunc,noerror
Копирует раздел в другой раздел
dd if=/proc/filesystems | hexdump -C | less
Просмотр доступных файловых систем
dd if=/proc/partitions | hexdump -C | less
Просмотр размеров доступных разделов в кБ
dd if=/dev/sdb2 ibs=4096 | gzip > partition.image.gz \
conv=noerror
Создает сжатый образ второго диска
dd bs=10240 cbs=80 conv=ascii,unblock\
 if=/dev/st0 of=ascii.out
Копирует содержимое ленточного устройства в файл, преобразуя кодировку EBCDIC в ASCII
dd if=/dev/st0 ibs=1024 obs=2048 of=/dev/st1
Копирует содержимое устройства с размером блока 1кБ на устройство с размером блока 2 кБ
dd if=/dev/zero of=/dev/null bs=100M count=100
100+0 records in
100+0 records out
10485760000 bytes (10 GB) copied,

5.62955 s, 1.9 GB/s
Копирует 10 ГБ нулей в никуда
dd if=/dev/zero of=/dev/sda bs=512 count=2
fdisk -s /dev/sda
dd if=/dev/zero of=/dev/sda seek=\
(number_of_sectors - 20) bs=1k
Удаляет таблицу разделов диска. Так как таблица разделов записывает данные в начало в конец диска, то после удаления данных с начала диска нам необходимо найти количество секторов (вторая команда), а затем стереть последние 20 секторов.
dd if=/home/$user/bootimage.img of=/dev/sdc
Создание загрузочного USB-диска (он показан как /dev/sdc)
dd if=/dev/sda of=/dev/null bs=1m
Хороший способ проверки диска на испорченные блоки
Резервное копирование и системные операции
dd if=/dev/sda of=/dev/fd0 bs=512 count=1
Копирование главной загрузочной записи на дискету
dd if=/dev/sda1 of=/dev/sdb1 bs=4096
Полное копирование диска на другой диск
dd if=/dev/sr0 of=/home/$user/mycdimage.iso\
 bs=2048 conv=nosync
Создание образа CD
mount -o loop /home/$user/mycdimage.iso\
 /mnt/cdimages/
локальное монтирование созданного образа
dd if=/dev/sda2 of=/home/$user/hddimage1.img\
 bs=1M count=4430
dd if=/dev/sda2 of=/home/$user/hddimage2.img\
 bs=1M count=8860
[...]
Создание DVD-образов раздела (используется для резервного копирования)
dd if=/$location/hddimage1.img of=/dev/sda2\
 bs=1M
dd if=/$location/hddimage2.img of=/dev/sda2\
 seek=4430 bs=1M
dd if=/$location/hddimage3.img of=/dev/sda2\
 seek=8860 bs=1M
[и так далее...]
Восстановление из созданной выше резервной копии
dd if=/dev/zero count=1 bs=1024 seek=1 of=/dev/sda6
Уничтожение суперблока
dd if=/dev/zero count=1 bs=4096 seek=0 of=/dev/sda5 
Еще один способ уничтожения суперблока
dd if=/home/$user/suspicious.doc | clamscan -
Проверка файла на вирусы (необходим ClamAV)
dd if=/home/$user/binary file | hexdump -C | less
Просмотр содержимого бинарного файла (необходим hexdump)
dd if=/home/$user/bigfile of=/dev/null
dd if=/dev/zero of=/home/$user/bigfile \
bs=1024 count=1000000
Тестирование жесткого диска на скорость чтения/записи
dd if=/dev/sda of=/dev/sda
Восстанавливает работоспособность старых жестких дисков (диск должен быть отмонтирован)
dd if=/dev/mem | strings | grep 'string_to_search'
Проверяет содержимое памяти (читаемое человеком)
dd if=/dev/fd0 of=/home/$user/floppy.image\
 bs=2x80x18b conv=notrunc
Копирование дискеты
dd if=/proc/kcore | hexdump -C | less
Просмотр виртуальной памяти
dd if=/proc/filesystems | hexdump -C | less
Просмотр доступных файловых систем
dd if=/proc/kallsyms | hexdump -C | less
Просмотр загруженных модулей
dd if=/proc/interrupts | hexdump -C | less
Просмотр таблицы прерываний
dd if=/proc/uptime | hexdump -C | less
Просмотр времени работы системы в секундах
dd if=/proc/partitions | hexdump -C | less
Просмотр размеров доступных разделов в кб
dd if=/proc/meminfo | hexdump -C | less
Просмотр статистики использования памяти
dd if=/dev/urandom of=/home/$user/myrandom \
bs=100 count=1
Создание файла размером 1 кб, заполненного мусором
dd if=/dev/mem of=/home/$user/mem.bin\
 bs=1024
Создание образа мгновенного состояния системной памяти
dd if=/home/$user/myfile
Печать файла в stdout
dd if=/dev/sda2 bs=16065 | hexdump -C\
 | grep 'text_to_search'
Поиск заданной строки на всем разделе. Даже если он защищен, вы можете загрузиться с liveCD
dd if=/home/$user/file.bin skip=64k bs=1\
 of=/home/$user/convfile.bin
Копирование файла file.bin в convfile.bin за исключением первых 64 kB
dd if=/home/$user/bootimage.img of=/dev/sdc 
Создание загрузочного USB-устройства (показано здесь как /dev/sdc)
dd if=/dev/mem bs=1k skip=768 count=256 \
2>/dev/null | strings -n 8 
Чтение BIOS
dd bs=1k if=imagefile.nrg of=imagefile.iso skip=300k
Конвертирование образа Nero в стандартный ISO. Это возможно, так как все отличие между ними заключается в заголовке размером 300 кб, добавляемом Nero к стандартному ISO-образу.
echo -n "hello vertical world" | dd cbs=1 \
conv=unblock 2> /dev/null
Попробуйте, это не опасно... :-)
dd if=/dev/sda1 | gzip -c | split -b 2000m - \
/mnt/hdc1/backup.img.gz
Создание образа диска, сжатого с помощью gzip и разрезанного на части с помощью split.
cat /mnt/hdc1/backup.img.gz.* | gzip -dc |\
 dd of=/dev/sda1
Восстановление раздела из созданного выше образа.
dd if=/dev/zero of=myimage bs=1024 count=10240
Создание пустого образа диска
dd ibs=10 skip=1
Вырезание первых 10 байт из stdin
dd bs=265b conv=noerror if=/dev/st0 \
of=/tmp/bad.tape.image
Создание образа с ленточного накопителя с плохими участками
dd if=/dev/sda count=1 | hexdump -C
Просмотр MBR
dd if=/dev/sda | nc -l 10001 
nc $system_to_backup_IP 10001 | dd\
 of=sysbackupsda.img 
Быстрое сетевое резервное копирование с помощью netcat
dd if=/dev/zero of=/dev/sdX\
 bs=1024000 count=1
Очистка первых 10 MB раздела
dd if=/dev/zero of=tmpswap bs=1k\
 count=1000000
chmod 600 tmpswap
mkswap tmpswap
swapon tmpswap
Создание временного пространства подкачки
dd if=/dev/sda of=/dev/null bs=1024k \
count=1024
1073741824 bytes (1.1 GB) copied, 
24.1684 s, 44.4 MB/s
Определение скорости системы ввода/вывода вашего диска. Чтение файла размером 1 Гб.
dd if=/dev/random count=1 2>/dev/null | od -t u1 |\
 awk '{ print $2}' | head -1
Генерация случайного числа
dd if=/dev/mem of=myRAM bs=1024
Копирование содержимого оперативной памяти в файл.
dd if=/dev/sda bs=512 count=1 | od -xa
Просмотр содержимого главной загрузочной записи в шестнадцатеричном формате и в ASCII
dd if=/my/old/mbr of=/dev/sda bs=446 count=1
Восстановление главной загрузочной записи, не затрагивая таблицу разделов.
dd if=/dev/sda1 | split -b 700m - sda1-image
Создание копии раздела и сохранение ее в образах максимальным размером 700 Мб.
Работа с текстом
ls -l | dd conv=ucase
Преобразует вывод команды в верхний регистр
echo "MY UPPER CASE TEXT" | dd conv=lcase
Преобразует любой текст в нижний регистр
dd if=/etc/passwd cbs=132 conv=ebcdic of=/tmp/passwd.ebcdic
Преобразует файл системных паролей в файл формата EBCDIC фиксированной длины
dd if=text.ascii of=text.ebcdic conv=ebcdic
Преобразование ASCII в EBCDIC
dd if=myfile of=myfile conv=ucase
Преобразование файла в нижний регистр (простая замена sed или tr)

4. Заключение

Здесь была представлена только небольшая часть того, что можно сделать с помощью dd, и мы надеемся, что в этой статье нам удалось собрать самые полезные примеры для применения dd в повседневной работе. Для тех, кто хочет узнать больше, рекомендуем читать документацию жестких дисков, касающуюся таких вещей, как LBA limitation. Необходимо также еще раз напомнить, что нужно быть очень осторожным при использовании dd с правами суперпользователя.