Вопрос: В чем разница между параметрами команды dd bs = 1024 count = 1 и bs = 1 count = 1024


Рассмотрим следующие две команды: создание немого файла 1 КБ

dd if=/dev/urandom of=test.file bs=1024 count=1

dd if=/dev/urandom of=test.file bs=1 count=1024

Первая команда использует размер блока 1024 байта и количество блоков 1, второе - наоборот.

Я предполагаю, что нет никакой разницы, и ограничение размера блока - проблема, связанная с ОЗУ: вы не можете иметь размер блока, превышающий доступную память.

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


2
2017-08-15 23:27


Источник




Ответы:


Как вы, кажется, в основном понимаете, первая версия читает 1024 байта, и затем записывает, однако, многие байты вернулись с чтения, в то время как вторая версия делает 1024 чтения и записи по одному байту каждый. При копировании обычных файлов больший размер блока (что приводит к меньшему количеству операций ввода-вывода) может быть незначительно более эффективным. Это, вероятно, верно для /dev/urandom также.

Но вы должны быть осторожны при использовании dd на специальных файлах (т. е. устройствах). Например,

dd if =(любой вход)  из =(устройство магнитной ленты)  bs = 1024 count = 1

будет записывать один ленточный блок размером 1024 байта; dd … bs=1 count=1024 будет записывать 1024 блока по одному байту каждый. Это не одно и то же; 1024 маленьких блока занимают больше места на ленте, чем один большой блок, из-за межрекордных зазоров и может вызвать проблемы с чтением ленты. Что более важно для вашего вопроса, если вы читаете (if=) из /dev/random, он будет возвращать только столько байтов с высокой энтропией, сколько доступно. Итак, в первой версии вы можете получить менее 1024 байта. Но если вы попытаетесь прочитать один байт, а пул энтропии пуст, чтение будет блокироваться (т. Е. Ждать) пока данные не будут доступны, поэтому вторая версия будет гарантированно получить вас 1024 байта (хотя это может занять довольно много времени).

Чтобы увеличить размер стримера:

dd if =(соответствующий ввод)  из =(устройство магнитной ленты)  bs = 512 count = 2

будет записывать два ленточных блока длиной 512 байт. Последующее

dd if =(устройство магнитной ленты)  из =(без разницы)  bs = 1024 count = 1

может читать только первый блок; то есть первые 512 байт.

И (названные) трубы могут проявлять ту же проблему, что и /dev/random- большое чтение будет возвращаться только как байты, как доступно; поэтому, опять же, в первой версии вы можете получить меньше 1024 байта. Но, если вы попытаетесь прочитать один байт за раз, чтение будет ждать, пока не будут доступны данные, поэтому вторая версия будет гарантированно получить вас 1024 байта (или, по крайней мере, до EOF).


6
2017-08-15 23:54



В качестве иллюстрации этого, попробуйте сделать strace обеих команд dd. Это ясно покажет, что каждый делает чтение / запись, в то время как другой имеет 1024 consequtive чтения / записи. - agtoever