我能够自动检测 RAM(以 GB 为单位),如下所示,并四舍五入到最接近的整数:
printf "%.f\n" $(grep MemTotal /proc/meminfo | awk '$3=="kB"{$2=$2/1024^2;$3="GB";} 1' | awk '{print $2}')
输出:
4
我乘以 2 确定所需的交换空间为 8GB
ans=`expr $(printf "%.f\n" $(grep MemTotal /proc/meminfo | awk '$3=="kB"{$2=$2/1024^2;$3="GB";} 1' | awk '{print $2}')) \* 2`
echo "$ans"G
输出:
8G
通过以下命令,我尝试创建 8GB 交换内存。
echo "Creating $ans GB swap memory"
sudo dd if=/dev/zero of=/swapfile bs="$ans"G count=1048576
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo swapon --show
但是,我收到以下错误:
Creating 8 GB swap memory
dd: memory exhausted by input buffer of size 8589934592 bytes (8.0 GiB)
mkswap: error: swap area needs to be at least 40 KiB
swapon: /swapfile: read swap header failed.
您能否建议并帮助我自动创建交换内存,理想情况下应该是 RAM 的两倍。
系统详细信息:
root@DKERP:~# uname -a
Linux DKERP 5.4.0-124-generic #140-Ubuntu SMP Thu Aug 4 02:23:37 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
root@DKERP:~# free -g -h -t
total used free shared buff/cache available
Mem: 3.8Gi 1.0Gi 207Mi 54Mi 2.6Gi 2.5Gi
Swap: 0B 0B 0B
Total: 3.8Gi 1.0Gi 207Mi
答案1
dd
您的命令不起作用的原因是您将 dd 的块大小设置为 8 GB。即您告诉它一次读取和写入 8 GiB,这将需要 8 GB 的 RAM 缓冲区。正如 Marcus 所说,8 GiB 比您拥有的 RAM 还要多,因此该大小的缓冲区将无法工作。
大约 80 亿兆字节 (8 GiB x 1M = 8佩塔字节,9,007,199,254,740,992 字节)比您拥有的磁盘空间要多得多......这比世界上大多数高端存储集群都多得多。
如果您为 bs 和 count 使用合理的值,它就会起作用。例如,1 MiB x 8K = 8 GiB:
dd if=/dev/zero of=/swapfile bs=1048576 count=8192
或者
dd if=/dev/zero of=/swapfile bs=1M count=8K
答案2
您明确指示dd
将 RAM 大小两倍的块读入 RAM。那是不可能成功的。
相反,只是……不要那样做。
答案3
不必费心dd
手动设置块大小。在大多数情况下,它们对于正确性并不重要,至少在具有常规文件或块设备的 Linux 上是如此。使用更用户友好的东西来代替。
在通常的 Linux 安装中,您可能拥有标准工具的 GNU coreutils 版本。如果是这样,你可以使用例如
gigs=8
head -c "${gigs}G" /dev/zero > /swapfile
创建该 8-g 零填充文件。
如果您没有 GNU 工具,许多版本都head
支持-c
带有裸数字的选项,例如
gigs=8
head -c $((gigs * 1024 * 1024 * 1024)) /dev/zero > /swapfile