以下のように自動的に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
dd
RAMサイズの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