Могу ли я предложить что-то подобное, а не просто вызывать 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
), чтобы еще больше уменьшить использование памяти.