自动检测 RAM 并创建双倍交换内存

自动检测 RAM 并创建双倍交换内存

我能够自动检测 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

相关内容