Каково максимальное значение аргумента bs функции dd?

У @Kusalananda есть лучший ответ для последних версий bash. Для более ранних версий вы можете использовать косвенную переменную:

for a in ${array_names[@]}; do 
    tmp="${a}[@]"
    for b in "${!tmp}"; do echo "$b"; done     # or: printf "%s\n" "${!tmp}"
done

См. 4-й абзацhttps://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion

5
21.01.2020, 15:03
1 ответ

Спецификации POSIX дляddне указывают максимум в явном виде, но есть некоторые ограничения:

На 64-битной -платформе size_tимеет длину 64 бита; кроме того, он беззнаковый, поэтому ddне будет работать, если заданы значения больше 2 64 – 1:

$ dd if=/dev/zero of=/dev/null bs=18446744073709551616
dd: invalid number: ‘18446744073709551616’

В Linux на 64 -бит x86, SSIZE_MAXравно 0x7fffffffffffffffL (запустите echo SSIZE_MAX | gcc -include limits.h -E -, чтобы проверить ), и это предел ввода:

$ dd if=/dev/zero of=/dev/null bs=9223372036854775808
dd: invalid number: ‘9223372036854775808’: Value too large for defined data type

$ dd if=/dev/zero of=/dev/null bs=9223372036854775807
dd: memory exhausted by input buffer of size 9223372036854775807 bytes (8.0 EiB)

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

Как только вы найдете значение, которое может быть выделено, вы достигнете предела read(в Linux и других системах с аналогичными ограничениями ), , если вы не используете GNU ddи укажитеiflag=fullblock:

$ dd if=/dev/zero of=ddtest bs=4294967296 count=1
0+1 records in
0+1 records out
2147479552 bytes (2.1 GB, 2.0 GiB) copied, 38.3037 s, 56.1 MB/s

(ddскопировал чуть меньше 2 31 байт, т. е. ограничение Linux, упомянутое выше, даже не половину того, что я просил ).

Как объяснялось в ответах на вопросы по ссылке выше, вам потребуется fullblockдля надежного копирования всех входных данных в любом случае для любого значения bsбольше 1.

24
27.01.2020, 20:31

Теги

Похожие вопросы