如何限制 dd 使用的内存量?

如何限制 dd 使用的内存量?

我正在使用dd在崩溃的内核中传输较大的内核核心文件(4GB~12GB),该内核只有少量可用内存(~400MB)。

问题是 dd 可能会因 OOM 恐慌而崩溃,因为它只是将一大块 vmcore 转储到套接字中,这可能会导致系统运行 OOM。

我的问题是:如何dd根据可用内存来限制其速度或限制其缓冲区大小?

谢谢。

答案1

您可以尝试 nocache 选项,例如

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

答案2

我是否建议使用类似的东西而不是仅仅打电话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某个最大内存使用量,否则会导致程序死机。但是,您可以非常轻松地编写脚本,逐块复制文件。上面的脚本将把第一个参数复制到第二个参数,每次一兆字节,同时提供一个基本的进度指示器(这就是echofor 循环中那个看起来很疯狂的调用所做的)。使用 busybox,只需 1.5MB 的用户空间可用内存即可正常运行。使用常规bash和 GNU coreutils,将内存使用量保持在 4MB 以下应该没有问题。您还可以减小块大小(通过降低值bsize)以进一步减少内存使用量。

相关内容