Ubuntu Swapfile 만들기.

우분투는 17.04부터 스왑파티션을 사용하지 않고 스왑파일을 만들어 메모리스왑 기능을 사용한다. 그런데, 자동 설치가 아닌, 사용자 설치를 할 경우 간혹 스왑파일이 생성되지 않는 경우가 있다. 그럴 경우 다음 방법으로 만들어준다.


우분투 커널 5 부터는 Btrfs 에서도 스왑파일을 쓸 수 있다. Ext4 는 기본 지원되고, 다른 파일시스템에 관해선 전혀 아는 바가 없다.

그렇다면, 수동으로 스왑파일을 지정해주려면 어떻게 해야 하려나?
다음 글들에서 도움을 얻었다.

먼저 파일을 만들고, 그 파일이 스왑파일임을 시스템에 알려줘야 한다.

먼저 Ext4 용. (Btrfs 와 크게 다르진 않다.)

파일 생성

파일을 만드는 방법은 두가지인데, 예전부터 써오던 방식과, 신식(?)이 있다.

기존 방식: dd

원하는 파일 크기를 결정한 뒤, 이런 식으로 만든다.

$ sudo dd if=/dev/zero of=/swapfile bs=1G count=4

위 예는, 블럭 크기를 1GB 로 해서 총 4회를 수행하라는 것이 되어, 총 4GB 짜리 파일이 만들어진다.

새로운 방식: fallocate

$ sudo fallocate -l 4G /swapfile

dd 보다 쉽다. 역시 마찬가지로 4GB 짜리 파일을 생성했다.

파일 소유권 변경

이렇게 만든 파일을, root 만이 읽고 쓸 수 있도록 소유권을 변경한다.

$ sudo chmod 600 /swapfile

스왑파일로 변환 및 등록

먼저, 위에서 생성한 일반 파일을, 스왑파일로 사용할 수 있도록 변환해야 한다.

$ sudo mkswap /swapfile

이제 이 파일을 시스템이 스왑으로 쓸 수 있도록 등록한다. (시스템이 켜져있는 동안만 인식됨. 재시동되면 재설정 필요)
따라서 아래 작업은 굳이 안해도 되고, 그냥 fstab 에 지정해준 뒤 시스템을 재부팅하는 편이 좋다.

$ sudo swapon /swapfile

스왑파일 영구 등록

위에서 한 작업은 시스템이 꺼지면 모두 잊혀져 버린다. 시스템이 재시작되어도 자동으로 저 파일을 스왑으로 쓸 수 있도록 하려면 fstab 에 등록해야 한다.

/etc/fstab 을 열고, 다음 내용을 추가한다.

/swapfile   none    swap    sw    0   0

Btrfs 용 스왑파일 생성.

거의 방법은 동일한데, NOCOW (NO Copy-On-Write) 를 고려해야하는 점이 다르다.
또, 만약 snapshot 을 사용한다면, 이 파일을 snapshot 이 사용되는 Sub volume 에 만들지 말고, 다른 Sub volume 에 만들어야만 한다.

NOCOW 를 위해선 바로 fallocate 를 하지 말고, 먼저 touch 후 chattr 을 해줘야한다. fallocate 로 파일을 생성한 뒤 chattr 을 하면, swapon 에서 오류가 발생한다.
그 이유는 man chattr 에서 찾아볼 수 있다.

Note: For btrfs, the ‘C’ flag should be set on new or empty files. If it is set on a file which already has data blocks, it is undefined when the blocks assigned to the file will be fully stable. If the ‘C’ flag is set on a directory, it will have no effect on the directory, but new files created in that directory will have the No_COW attribute set.

$ sudo -i

# touch /swapfile
# chattr +C /swapfile
# fallocate -l 4G /swapfile
# chmod 600 /swapfile
# mkswap /swapfile
# swapon /swapfile

위 작업을 완료한 뒤, /etc/fstab 에 스왑파일을 추가한다.

/swapfile   none    swap    sw    0   0

한가지 더: swappiness

자세한 사항은 연결글을 참고하고, swappiness 를 1~10 사이로 정한다. 서버가 아닌 데스크탑(GUI) 환경에서, HDD 라면 10 정도, SSD 라면 1 정도를 주는 편이 좋다고 한다. (기본값은 60인데, 이 설정치에 정답은 없다.)

/etc/sysctl.d/번호-xxx.conf 파일을 만들고, 다음 항목을 추가한다.
번호는 얼마를 줘야한다는 규칙은 있을텐데, 적당히 넣어도 관계없다. 60, 70 정도면 된다.

vm.swappiness=10

Cache Pressure?

이 개념은 처음 보는 건데, 이 값도 기본 설정치인 100 에서 50 정도로 줄여주는 편이 좋다고 한다.

위의 swappiness 를 넣은 파일에 같이 넣어도 되고, 동일 디렉토리에 다른 이름의 파일을 만든 뒤 다음 항목을 추가해도 된다.

vm.vfs_cache_pressure = 50

이 항목에 대한 건 뭐라 할 말이 없다. 난생 처음 보는 거라서..

안녕하세요. 글 남겨주셔서 고맙습니다.