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