Размножение флешек

Jan 12, 2011 23:16

Сегодня мне понадобилось сделать побайтовую копию флешки на пять таких же флешек. Делать это поочереди мне не хотелось, т.к. это очень долго. Сразу оговорюсь, дело происходило под линуксом.

Значит, что мы знаем, а мы знаем, что есть замечательная программа dd, которая умеет читать один файл и писать то что прочитала в другой, при этом можно задать размер блока которыми она читает, размер блока которыми она пишет, отступы от начала чтения и от начала записи, ну и еще кучу всего. Из всего этого нам пригодится замечательная возможность программы dd выводить прочитанное на стандартный вывод (это происходит, если не указан файл назначения).

(Продолжить)Так же мы знаем, что есть в линуксе (да и не только в линуксе, в винде, вроде тоже есть) замечательная возможность организавывать конвейеры. Для тех кто не знает, конвейер это такая штука, когда стандартный вывод одной команды посылается на стандартный ввод второй, таких программ в цепочке может быть сколь угодно много (здесь я может и ошибаюсь, но с ограничениями еще не сталкивался, возможным ограничением, скорее всего, будет служить размер свободной оперативной памяти). За счет конвейера можно создавать сложные конструкции, которые выполняют довольно сшожные операции из нескольких примитивных программ. Программы в конвейере объединяются с помощью знака |.
Так же мы знаем, что в линуксе есть такое понятие как потоки, их можно перенаправлять, объединять, копировать... Перенаправление потоков выполняется с помощью значков больше меньше (<>).

С такими знаниями я пришел к выводу, что наверняка можно скопировать флешку на пять других одной командой и в пять раз быстрее, нежели копировать их поочереди.
Начал гуглить и нагуглил интересную программу под названием tee. Что она делает? А делает она примитивную функцию - копирует свой стандартный ввод во все файлы указанные в командной строке и на консоль (стандартный вывод). Эврика! Это то что мне нужно, тут же была дана команда следующего содержания:

# dd if=/dev/sdb bs=100M | tee /dev/sdc /dev/sdd /dev/sde /dev/sdf

Как ни странно, но это сработало, но не так хорошо, как хотел бы я :)
Такая замечательная утилита tee копировала свой входящий поток на все флешки, но она так же копировала этот поток и на консоль, в результате чегл на консоль начал сыпаться весь этот мусор, а т.к. дело происходило под иксами, то через некоторое окно консоли просто закрылось (почему это произошло я разбираться не стал, скорее всего это реакция на какой-нибудь спец. символ). Немного подумав я сочинил новую версию моей команды:

# dd if=/dev/sdb bs=100M | tee /dev/sdc /dev/sdd /dev/sde > /dev/sdf

И вот с помощью этой команды я справился с поставленной задачей.

Для интересующихся:
Значек решетки (#) указывает на то, что все это мы запускаем от пользователя root. Просто обычные пользователи обычно не имеют прямого доступа к накопителям.
dd - программа, которая читает исходную флешку и направляет прочитанное в стандартный вывод

if=/dev/sdb - один из ключей команды dd с помощью которого указан файл источника, т.е. наша с вами исходная флешка.

bs=100M - этим я указал команде dd что и читать и писать надо блоками по сто мегабайт, сделал я это для ускорения процесса.

| - этот значек указывает командной оболочке, что стандартный вывод программы dd надо направить на стандартный ввод программы tee.

tee - программа, которая копирует свой стандартный ввод в файлы перечисленные в кмандной строке.

/dev/sdc.... - файлы, куда копируются данные с исходной флешки

> /dev/sdf - этой конструкцией мы указываем, что вместо вывода на консоль, нам надо скопировать данные в файл /dev/sdf.

компьютер, копирование, linux, для чайников, флешка

Next post
Up