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

В чем разница между параметрами команды 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, вторая — наоборот.

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

Есть ли особые случаи, когда мне следует или нужно использовать первый вариант вместо второго? И наоборот?

решение1

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

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

дд если=(любой ввод)  из=(устройство с магнитной лентой)  бс=1024 количество=1

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

Более подробно остановимся на вопросе о ленточном накопителе:

дд если=(соответствующий ввод)  из=(устройство с магнитной лентой)  бс=512 количество=2

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

дд если=(устройство магнитной ленты)  из=(что бы ни)  бс=1024 количество=1

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

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

Связанный контент