Linux

自動檢測 RAM 並創建雙倍交換記憶體

  • September 5, 2022

我能夠自動檢測以 GB 為單位的 RAM,如下所示並四捨五入到最接近的整數:

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

您的dd命令不起作用的原因是因為您將 dd 的塊大小設置為 8 GB。即您告訴它一次讀取和寫入 8 GB,這需要 8 GB 的 RAM 緩衝區。正如 Marcus 所說,8GB 的​​ RAM 比你擁有的更多,所以這種大小的緩衝區是行不通的。

大約 80 億兆字節(8 GB x 1MB = 8 peta字節,9,007,199,254,740,992 字節)的磁碟空間也比您擁有的要多得多……這比世界上大多數高端儲存集群所擁有的要多得多。

如果您對 bs 和 count 都使用合理的值,它將起作用。例如,1 MB x 8K = 8 GB:

dd if=/dev/zero of=/swapfile bs=1048756 count=8192

或者

dd if=/dev/zero of=/swapfile bs=1M count=8K

引用自:https://unix.stackexchange.com/questions/716060