2017-02-07 25 views
0

我已经写了一些代码:我想有一个交换大小等于机器RAM(内存)

echo " > Get MemTotal" 
export MEM_TOTAL=`echo "scale=0; ($(awk '/MemTotal/ { print $2 }' /proc/meminfo)/1000) + 1" | bc 2>/dev/null` 

echo " > Set new swap memory" 
sudo /bin/dd if=/dev/zero of=/var/swap.1 bs=${MEM_TOTAL}M count=1024 
sudo /sbin/mkswap /var/swap.1 
sudo /sbin/swapon /var/swap.1 

我只是不确定放在哪里${MEM_TOTAL}变量。其他一切都经过测试和工作。

换句话说,如果我的目标是交换等于我记忆的大小,我是否正确地做了这件事?

+0

为什么?为什么不2 *物理ram?或4? – wildplasser

+0

我不确定我了解你的问题。我认为'$(awk'/ MemTotal/{print $ 2}'/ proc/meminfo)'命令获得了全部内存。除非我错了。 – jnbdz

+2

这与stackoverflow无关。它应该被移动到*服务器故障*或询问Ubunto ... –

回答

3

首先,您获得megabytes中的总内存值,但是您使用的是M,这意味着mebibytes用于sed。这是一个区别。

您需要使用MB告诉SED块大小以MB为单位:

dd if=/dev/zero of=/var/swap.1 bs=1MB count="${MEM_TOTAL}" 

但是,您也可以使用truncate命令,这是更快:

truncate -s "${MEM_TOTAL}"MB /var/swap.1 

此外,您可以使用free命令获取以兆字节为单位的内存量:

MEM_TOTAL="$(free -m --si | awk 'NR==2{print $2}')" 

这可能不太危险。

但最后你甚至可以只使用从/proc/meminfo字节值并传递到truncate,没有计算需要:

truncate -s "$(awk '/MemTotal/{print $2}' /proc/meminfo)" /var/swap.1 

(不要使用字节,与dd一个bs=1执行非常。使用truncate

+0

我欣赏截断。在使用之前不需要清零交换空间。 – linuxfan

+0

如果文件已经不存在,它会*用* truncate'填充零字节 – hek2mgl

+0

我的手册页上写着“扩展部分(洞)读取为零字节”。我不确定,但听起来不同于“填满零”。稀疏文件?无论如何,如果文件被放大,使用truncate可以避免在已经存在的部分写入零。 – linuxfan

2

MEM_TOTAL大致以MB为单位,所以你应该使用:

dd if=/dev/zero of=/var/swap.1 bs=1M count=$MEM_TOTAL 

你的代码试图分配和上千倍写的RAM千兆字节。一般而言,bs(块大小)应该是您的常数基本单位,并且只有计数应该各不相同。