아래와 같이 자동으로 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
dd
RAM 크기의 두 배인 블록을 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