>>204385
> Гурманы могут заметить: а как же размер блока (2048)? А чёрт с ним, отвечу я; наверное, head его определит.
Немного фактических данных.
sudo sh -c 'strace -o log cp mt86plus_64.iso /dev/sdb'
cat вызывает fstat, потом fadvise64 и оперирует блоками по 131072 байта (128 килобайт).
Дескриптор 1 здесь - флешка. То, как её открыл оператор перенаправления, в лог strace не попало.
fstat(1, {st_mode=S_IFBLK|0660, st_rdev=makedev(0x8, 0x10), ...}) = 0
openat(AT_FDCWD, "mt86plus_64.iso", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0600, st_size=6193152, ...}) = 0
fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
mmap(NULL, 139264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb898d65000
read(3, "\352\5\0\300\7\214\310\216\330\216\300\216\320\270\0\204\211\304\366\302\200t\5\366\302pt\2\262\200\307\6"..., 131072) = 131072
write(1, "\352\5\0\300\7\214\310\216\330\216\300\216\320\270\0\204\211\304\366\302\200t\5\366\302pt\2\262\200\307\6"..., 131072) = 131072
read(3, "\0\0f\17\37D\0\0I\321\317L\211\376H\367\326H\213U\0H9\326\17\205\22\1\0\0L\211"..., 131072) = 131072
write(1, "\0\0f\17\37D\0\0I\321\317L\211\376H\367\326H\213U\0H9\326\17\205\22\1\0\0L\211"..., 131072) = 131072
read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072
write(1, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072
read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072
write(1, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072
Это cp. То же самое.
openat(AT_FDCWD, "mt86plus_64.iso", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0600, st_size=6193152, ...}) = 0
openat(AT_FDCWD, "/dev/sdb", O_WRONLY|O_TRUNC) = 4
fstat(4, {st_mode=S_IFBLK|0660, st_rdev=makedev(0x8, 0x10), ...}) = 0
fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
mmap(NULL, 139264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb2ecfc5000
read(3, "\352\5\0\300\7\214\310\216\330\216\300\216\320\270\0\204\211\304\366\302\200t\5\366\302pt\2\262\200\307\6"..., 131072) = 131072
write(4, "\352\5\0\300\7\214\310\216\330\216\300\216\320\270\0\204\211\304\366\302\200t\5\366\302pt\2\262\200\307\6"..., 131072) = 131072
read(3, "\0\0f\17\37D\0\0I\321\317L\211\376H\367\326H\213U\0H9\326\17\205\22\1\0\0L\211"..., 131072) = 131072
write(4, "\0\0f\17\37D\0\0I\321\317L\211\376H\367\326H\213U\0H9\326\17\205\22\1\0\0L\211"..., 131072) = 131072
read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072
read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 131072
Откуда они берут эти 128 килобайт, почему один и тот же размер используется для записи на другой носитель — не знаю. Файлы в /sys/block/sda/queue/ ничего такого не содержат. optimal_io_size вообще равен нулю. Судя по названию, это он тут должен быть важен.
/sys/block/sdb/queue/
hw_sector_size = 512
logical_block_size = 512
physical_block_size = 512
minimum_io_size = 512
optimal_io_size = 0
dd приготовлений не делает, а сразу читает и пишет куски размера bs=N (512 по дефолту, дичайше долго).
openat(AT_FDCWD, "mt86plus_64.iso", O_RDONLY) = 3
dup2(3, 0) = 0
close(3) = 0
lseek(0, 0, SEEK_CUR) = 0
openat(AT_FDCWD, "/dev/sdb", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
dup2(3, 1) = 1
close(3) = 0
clock_gettime(CLOCK_MONOTONIC, {tv_sec=2464, tv_nsec=439321292}) = 0
read(0, "\352\5\0\300\7\214\310\216\330\216\300\216\320\270\0\204\211\304\366\302\200t\5\366\302pt\2\262\200\307\6"..., 512) = 512
write(1, "\352\5\0\300\7\214\310\216\330\216\300\216\320\270\0\204\211\304\366\302\200t\5\366\302pt\2\262\200\307\6"..., 512) = 512
read(0, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512) = 512
write(1, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512) = 512
read(0, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512) = 512
write(1, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512) = 512
Как подобрать оптимальный размер блока для dd — в интернетах не написано, кроме как экспериментами.
Хватило терпения только на три таких эксперимента.
Да, это USB 2.0 флешка. "lsusb -tv" показывает битрейт в 480 Мbit, но он, ясное дело, на практике недостижим.
# dd status=progress if=/dev/zero of=/dev/sdb # default, bs=512
31457280000 bytes (31 GB, 29 GiB) copied, 11979.2 s, 2.6 MB/s
# dd status=progress if=/dev/zero of=/dev/sdb bs=4k
31457280000 bytes (31 GB, 29 GiB) copied, 4134.02 s, 7.6 MB/s
# dd status=progress if=/dev/zero of=/dev/sdb bs=16k
31457280000 bytes (31 GB, 29 GiB) copied, 3981.99s, 7.9 MB/s