自動的に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

必要なスワップスペースを8GBに決定するために2を掛けました。

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の2倍になるスワップメモリ​​を自動的に作成することを提案し、助けることができますか?

システムの詳細:

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のブロックサイズを8GBに設定したためです。つまり、一度に8GiBを読み書きするように指示すると、8GBのRAMバッファが必要です。 Marcusが言ったように、8GiBは持っているよりも多くのRAMなので、そのサイズのバッファは機能しません。

約80億テラバイト(8GiB x 1M = 8)ペタバイト、9,007,199,254,740,992バイト)のディスク容量よりも...これは、世界中のほとんどの高度なストレージクラスタよりもはるかに多くです。

bsとcountに合理的な値を使用すると機能します。たとえば、1MiB x 8K = 8GiBです。

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

または

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

答え2

ddRAMサイズの2倍のブロックをRAMに読み込むように明示的に指示しました。成功することは不可能です。

代わりに、ただ…しないでください。

答え3

ddブロックサイズを手動で設定しないでください。ほとんどの場合、通常のファイルやブロックデバイスを持つLinuxでは正確さは重要ではありません。代わりに、よりユーザーフレンドリーなものを使用してください。

一般的なLinuxインストールには、標準ツールのGNU coreutilsバージョンがあります。その場合は、たとえば次のように使用できます。

gigs=8
head -c "${gigs}G" /dev/zero > /swapfile

8g ゼロパディングファイルを作成します。

GNUツールがない場合は、多くのバージョンで数字のみを含むオプションをheadサポートしています。-c

gigs=8
head -c $((gigs * 1024 * 1024 * 1024)) /dev/zero > /swapfile

関連情報