1

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

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

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

Благодарю.

2 ответа2

1

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

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

Могу ли я предложить что-то подобное, а не просто вызывать 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 вызов в цикле for). Используя busybox, будет работать нормально только с 1,5 МБ доступной для пользователя памяти. При использовании обычного bash и GNU coreutils не должно быть проблем с сохранением объема памяти ниже 4 МБ. Вы также можете уменьшить размер блока ( уменьшив значение bsize ), чтобы еще больше уменьшить использование памяти.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .