Как я могу ограничить объем памяти, используемой dd?

Я использую dd передать большой файл ядра (4 ГБ ~ 12 ГБ) в аварийное ядро ​​с небольшим объемом доступной памяти (~400 МБ).

Проблема в том, что dd может аварийно завершить работу с паникой OOM, так как он просто сбрасывает большой кусок vmcore в сокет, что может привести к запуску OOM системой.

Мой вопрос: как я могу газ ddскорость основана на доступной памяти или ограничивает размер буфера?

Благодарю.

2 ответа

Вы можете попробовать опцию nocache, например

dd oflag=nocache if=infile of=outfile bs=4096 

Могу ли я предложить что-то подобное, а не просто позвонить dd?

#!/bin/sh
bsize=1048576
fsize=`stat -c %s ${1}`
count=$((${fsize}/${bsize}))
if [ $((${fsize}%${bsize})) -ne 0 ] ; then
    count=$((${count}+1))
fi
echo "About to copy ${fsize} bytes in ${count} chunks."
for i in `seq 0 $((${count}-1))` ; do
    dd if=${1} of=${2} bs=1048576 conv=sparse,notrunc count=1 seek=${i} skip=${i} status=none
    /bin/echo -e -n "\e[2K\e[0G[$((${i}+1))/${count}]"
done
echo

Вы не можете ничего сделать, чтобы ограничить один вызов dd до некоторого максимального использования памяти, не вызывая ее смерти. Однако вы можете довольно легко написать скрипт для копирования файла блок за блоком. Приведенный выше скрипт будет копировать первый аргумент во второй, по одному мегабайту за раз, обеспечивая при этом элементарный индикатор прогресса (это то, что выглядит безумно echo вызов для цикла делает). Используя busybox, он будет нормально работать только с 1,5 МБ доступной для пользователя памяти. Используя регулярные bash и GNU coreutils, у него не должно быть проблем с сохранением ниже 4 МБ использования памяти. Вы также можете уменьшить размер блока (уменьшив bsize значение), чтобы уменьшить использование памяти еще дальше.

Другие вопросы по тегам