Linux dd seek skip

Linux dd seek skip

dd читает по одному блоку за раз, используя заданный размер входного блока (по умолчанию 512 байт). Если задана опция bs= байты и не требуется преобразований, отличных от sync , noerror , или notrunc , то dd записывает прочитанные данные (которых может быть меньше, чем было запрошено) в отдельный выходной блок. Выходной блок имеет точно ту же длину, что прочитанный блок, за исключением случая, когда задано преобразование sync , при котором данные добиваются символами NUL (или пробелами, см. ниже).

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

За числовыми значениями опций (байты и блоки) могут следовать коэффициенты: `k’=1024, `b’=512, `w’=2, `c’=1 (коэффициенты `w’ и `c’ являются расширениями GNU; `w’ никогда не должен использоваться — он означает 2 в System V и 4 в 4.2BSD). Два или более таких числовых выражений могут быть умножены друг на друга с помощью символа `x’ между ними. Версия GNU fileutils-4.0 также разрешает при задании размеров блоков (в bs=, cbs=, ibs=, obs=) следующие коэффициенты: M=1048576, G=1073741824, и так далее для T, P, E, Z, Y. Суффикс `D’ делает значения десятичными: kD=1000, MD=1000000, GD=1000000000, и так далее. (Заметим, что для ls, df, du размер M и т. п. определяется переменными окружения, но для dd он фиксирован).

ОПЦИИ

ascii Преобразование EBCDIC в ASCII. ebcdic Преобразование ASCII в EBCDIC. ibm Преобразование ASCII в альтернативный EBCDIC. block Для каждой строки во входном файле, выводить cbs байт, заменяя символ новой строки на пробел и добивая пробелами при необходимости. unblock Заменять заключительные пробелы в каждом входном блоке размера cbs байт на символ новой строки. lcase Изменять заглавные буквы на строчные. ucase Изменять строчные буквы на заглавные. swab Менять местами каждую пару входных байт. Если последний байт имеет нечетный порядковый номер, то он просто копируется (так как менять местами нечего). [POSIX 1003.2b, PASC interpretations 1003.2 #3 и #4] noerror Продолжать после ошибок чтения. notrunc Не обрезать выходной файл. sync Дополнять каждый входной блок до размера ibs путем добавления нулевых байт.

Источник

Команда 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 устройство. Конечно, единственное, что сделает эта команда: нагрузит процессор на несколько секунд. Рассмотрим примеры из практики:

Читайте также:  Windows benchmark cpu gpu

Создание образа диска:

# 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 расположена в первых 512 байтах жесткого диска, и состоит из таблицы разделов, загрузчика и пары доп. байт. Иногда, ее приходится бекапить, восстанавливать и т.д. Бекап выполняется так:

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

Восстановить можно проще:

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

Причины этих махинаций с MBR могут быть разные, однако хочу рассказать одну особенность, взятую из опыта: после восстановления давней копии MBR, где один из разделов был ext3, а позже стал FAT и использовался Windows, раздел перестал видиться виндой. Причина — ID раздела, который хранится в MBR. Если UNIX монтирует файловые системы согласно суперблоку, то винды ориентируются на ID разделов из MBR. Поэтому всегда нужно проверять ID разделов при помощи 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 устройства:

Читайте также:  Azurewave драйвер для windows 10

# umount /dev/loop0
# losetup -d /dev/loop0

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

Основные идеи я расписал, однако множество задач, которые можно решить при помощи маленькой программки, имя которой состоит из двух букв, намного шире. Программа «dd» — яркий пример того, что IT’шники называют «UNIX way»: одна программа — часть механизма, выполняет исключительно свою задачу, и выполняет ее хорошо. В руках человека, который знает свое дело, которому свойственен не стандартный подход к решению задачи, такие маленькие программки помогут быстро и эффективно решать комплексные задачи, которые, на первый взгляд, должны решать крупные специализированные пакеты.

Источник

Linux dd seek skip

Команда dd предназначена для задействования одноименной утилиты, предназначенной для низкоуровневого копирования и преобразования данных. Ее название расшифровывается как «data duplicator» или «дупликатор данных». Данная утилита используется главным образом для записи образов установочных дисков дистрибутивов Linux на флеш-накопители и создания образов оптических носителей, тем не менее, круг ее функций не ограничивается перечисленными операциями. Например, dd может использоваться для простого копирования файлов или изменения регистра символов текстовых строк. Вообще, рассматриваемая утилита является в какой-то мере уникальной, ведь она предполагает использование собственного формата передачи параметров.

Стандартный синтаксис команды выглядит следующим образом:

$ dd if= of= [параметры]

Несложно заметить, что для передачи параметров утилите используется формат записи = . Утилита может читать исходные данные из стандартного потока ввода и выводить результирующие данные с помощью стандартного потока вывода в случае отказа от использования параметров if и of, но в подавляющем большинстве случаев данные параметры являются необходимыми для указания имен файлов с соответствующими данными. Утилита читает и записиывает данные блоками, причем размер блока может изменяться с помощью параметра bs (по умолчанию используются блоки размером в 512 Кб). Существуют отдельные параметры для задания размеров читаемых и записываемых блоков, а именно, ibs и obs. Количество читаемых блоков может ограничиваться в помощью параметра count. Для пропуска заданного количества блоков исходного файла может использоваться параметр skip, целевого файла — параметр seek. Для указания флагов чтения и записи через запятую может использоваться параметр iflag. Наиболее часто используемыми флагами являются:

  • append — активация режима дописывания данных в целевой файл.
  • direct — режим обработки данных в обход кэша файловых систем (повышает скорость).
  • dsync — режим записи данных с синхронизацией (повышает надежность).
  • sync — режим записи данных и метаданных с синхронизацией (повышает надежность).
  • fullblock — чтение лишь полных блоков.
  • nonblock — активация режима неблокируемого ввода/вывода (повышает скорость).
  • noatime — отключение механизма обновления меток времени элементов файловой системы (повышает скорость).
  • nofollow — отказ от перехода по символьным ссылкам.

Наконец, для указания флагов преобразования через запятую может использоваться параметр conv. Наиболее часто используемыми флагами являются:

  • lcase — перевод символов строки в кодировке ASCII в нижний регистр.
  • ucase — перевод символов строки в кодировке ASCII в верхний регистр.
  • nocreat — вывод сообщения об ошибке в случае отсутствия целевого файла.
  • excl — вывод сообщения об ошибке в случае существования целевого файла.
  • notrunc — отказ от урезания целевого файла.
  • swab — смена мест каждых двух байтов из исходного файла.
  • noerror — продолжение работы даже в случае возникновения ошибок.
  • fdatasync — активация режима записи данных в целевой файл перед завершением работы утилиты.
  • fsync — активация режима записи данных и метаданных в целевой файл перед завершением работы утилиты.

Примеры использования

Создание резервной копии данных дискового накопителя

Предположим, мы используем жесткий диск, представленный файлом устройства /dev/sda, и нам нужно создать посекторную резервную копию всех размещенных на нем данных, сохранив ее в файле в разделе съемного диска с интерфейсом USB, представленном файлом устройства /dev/sdb1 и смонтированным в директорию /mnt/sdb1. Обычно такие файлы резервных копий называются дампами или образами дисков. Наш файл образа диска будет носить имя backup.img. Это команда, с помощью которой его можно создать:

# dd if=/dev/sda of=/mnt/sdb1/backup.img

В данной команде с помощью параметра if задается путь к исходному файлу, а с помощью параметра of — к целевому.

Восстановление данных из резервной копии

Для восстановления данных из созданной резервной копии следует загрузить систему с установочного диска дистрибутива и выполнить обратную команду.

Читайте также:  Amd radeon rx570 driver linux

# dd if=/mnt/sdb1/backup1.img of=/dev/sda

Предупреждение: при выполнении данной команды будет перезаписано все содержимое указанного жесткого диска, поэтому стоит относиться к подобным командам с особым вниманием.

Клонирование жесткого диска

Перед клонированием жесткого диска вы должны убедиться в том, что у вас имеется жесткий диск того же объема, что и исходный. Эта же операция может выполняться и в случае флеш-накопителей с интерфейсом USB аналогичных объемов. Предположим, что исходный флеш-накопитель представлен файлом устройства /dev/sdb, а целевой — файлом устройства /dev/sdc. В этом случае вы можете клонировать исходный накопитель с помощью следующей команды:

# dd if=/dev/sdb of=/dev/sdc

Даже в том случае, если целевой накопитель имеет больший объем, вам будет доступен лишь объем исходного флеш-накопителя, сохраненный на уровне файловой системы.

Передача файла образа диска на другой компьютер

Для передачи файла образа диска по сети на другой компьютер с именем target может использоваться следующая команда:

# dd if=/dev/sdb | ssh [email protected] «(cat >backup.img)»

Сжатие файла образа диска

Для того, чтобы резервная копия раздела диска занимала меньше места, вы можете сжать ее с помощью компрессора, такого, как bzip2:

# dd if=/dev/sdb | bzip2 backup.img.bz2

Создание образа оптического диска формата ISO

Для создания образа оптического диска CD, DVD или BD достаточно поблочно прочитать его содержимое и сохранить это содержимое в файле:

# dd if=/dev/sr0 of=image.iso bs=2048

Сохранение файла с поврежденного носителя или создание образа такого носителя

Если ваш любимый фильм или музыкальный трек больше не читается из-за повреждения носителя, вы можете попробовать скопировать его с помощью утилиты dd, игнорируя поврежденные блоки:

# dd if=movie.avi of=/home/alex/movie.avi conv=noerror,sync

Вы также можете создать файл образа поврежденного носителя и попытаться извлечь файлы из него:

# dd if=/dev/sdb of=/home/alex/movie.iso bs=2048 conv=noerror,sync

Запись образа установочного диска на флеш-накопитель с интерфейсом USB

Для установки дистрибутива Linux с флеш-накопителя с интерфейсом USB необходимо записать на этот флеш-накопитель образ установочного диска формата ISO. Для этой цели может использоваться аналогичная команда:

# dd if=/home/alex/Fedora-Workstation-Live-x86_64-26_Alpha-1.7.iso of=/dev/sdc

Важно помнить, что даже в случае наличия на флеш-накопителе разделов следует указывать не путь к файлу устройства одного из разделов, а путь к файлу устройства самого накопителя, в нашем случае это /dev/sdc.

Анализ содержимого жесткого диска

Утилита dd является отличным инструментом для исследования файловых систем. Для анализа содержимого жесткого диска с выводом данных из отдельных блоков, в нашем случае, блока 1001 на разделе, представленном файлом устройства /dev/sdc1, достаточно использовать следующую команду:

# dd if=/dev/sdc1 count=1 skip=1000

Для того, чтобы увидеть первые 40 байт вашего жесткого диска в шестнадцатеричном представлении следует использовать команду:

# dd if=/dev/sda bs=1 count=40 | hexdump -C

В данном случае с помощью параметра bs задается размер блока диска.

Тестирование производительности дисковых накопителей

Для тестирования производительности дискового накопителя, представленного, к примеру, файлом устройства /dev/sda в условиях чтения блоков различных размеров может использоваться аналогичная команда:

# dd if=/dev/sda of=/dev/null bs=512 count=1000000
1000000+0 records in
1000000+0 records out
512000000 bytes (512 MB) copied, 4.25186 s, 120 MB/s

# dd if=/dev/sda of=/dev/null bs=4096 count=1000000
1000000+0 records in
1000000+0 records out
4096000000 bytes (4.1 GB) copied, 29.8747 s, 137 MB/s

Благодаря механизму кэширования файловых систем вы можете столкнуться с мистическим ускорением операции чтения, которому не стоит удивляться:

# dd if=/dev/sda of=/dev/null bs=512 count=1000000
1000000+0 records in
1000000+0 records out
512000000 bytes (512 MB) copied, 4.25186 s, 120 MB/s

# dd if=/dev/sda of=/dev/null bs=512 count=1000000
1000000+0 records in
1000000+0 records out
512000000 bytes (512 MB) copied, 0.417317 s, 1.2 GB/s

Для получения корректных результатов тестов рекомендуется вообще обходить механизм кэширования файловых систем, задействуя режим ввода/вывода без кэширования:

# dd if=/dev/sda of=/dev/null bs=512 count=100000 iflag=direct
100000+0 records in
100000+0 records out
51200000 bytes (51 MB) copied, 5.01053 s, 10.2 MB/s

Копирование файлов

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

Источник

Оцените статью