Поместите процесс в контрольную группу net_cls
, используйте контрольную группу для установки класса пакетов, а затем используйте классовый фильтр в tc
для ограничения скорости пакетов в этом классе. Например:
cgcreate -g net_cls:slow
echo 0x10001 > /sys/fs/cgroup/net_cls/slow/net_cls.classid
cgclassify -g net_cls:slow <pid of the process you want to limit>
tc qdisc add dev eth0 root handle 1: htb
tc filter add dev eth0 parent 1: handle 1: cgroup
tc class add dev eth0 parent 1: classid 1:1 htb rate 1mbps
Это должно означать, что указанный вами процесс (и любой из его дочерних процессов) ограничен пропускной способностью 1 мегабайт в секунду - настройте параметр последней команды на любую желаемую пропускную способность.
dd bs=1
очень неэффективен, так как выполняет один read()
и один write()
системный вызов на байт. В любом случае не имеет особого смысла использовать dd
на блочном устройстве (, если только вы не хотите использовать специальные флаги, такие как conv=noerror,sync...
, для обработки ошибок или смещений )
Здесь можно сделать:
offset=$(($(cat /sys/class/block/sda3/start) * 512)) &&
pv -trabSs "$offset" < myfile > /dev/sda
(или используйте head -c "$offset"
, если вам не нужна информация о ходе выполнения ).
pv
и head
выберут подходящий размер буфера для оптимизации производительности.
(обратите внимание, что, поскольку вы записываете данные в начало диска, вы фактически перезаписываете таблицу разделов! ).
Другой альтернативой может быть создание нового блочного устройства, отображающего только те разделы /dev/sda
, которые вы хотите перезаписать
Нравится:
echo "0 $(cat /sys/class/block/sda3/start) linear /dev/sda 0" |
dmsetup create writable_sda &&
cp myfile /dev/mapper/writable_sda