자동으로 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의 두 배가 되어야 하는 스왑 메모리를 자동으로 생성하도록 제안하고 도와주실 수 있습니까?

시스템 세부정보:

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 크기의 두 배인 블록을 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

관련 정보