導入済みのLinuxにスワップを設定する(Oracle Cloud VPS)

最近Oracle Cloud VPSのFree Tier Always Free枠で遊んでいます．
今日はなんだかとても重くなりましたRAMが1GBあるのですが，9割以上利用していました．swapは未設定．swapを設定してみました．
Oracle Cloudですが大抵の環境でも同じように出来るはずです．

アドホックなswapファイル設定

まずは急場しのぎによく使う方法でスワップファイルを作成して利用する方法．

適当な場所に空ファイルを作成します． ここでは2GB分作成しました．

$ sudo dd if=/dev/zero of=/var/tmp/swap bs=1M count=2048

swapを設定します．

$ sudo chmod 600 /var/tmp/swap (1)
$ sudo mkswap /var/tmp/swap (2)
$ sudo swapon /var/tmp/swap (3)
$ free -h (4)
total used free shared buff/cache available
Mem: 966Mi 303Mi 62Mi 12Mi 600Mi 501Mi
Swap: 2.0Gi 0.0Ki 2.0Gi
$ sudo swapoff /var/tmp/swap (5)
$ sudo rm /var/tmp/swap (6)

rootのみ読み書きに設定

swapファイルを初期化

swapに割当

swapが設定されたのを確認

必要なくなったらswapから取り外し

必要なくなったswapファイルを削除

使い続けたい場合は/etx/fstabに設定することで永続化して再起動後も利用することができます．(下のswapパーティションを作る方法のほうが少し速いはず)

$ sudo vi /etc/fstab (1)
$ sudo git -C /etc diff HEAD~ /etc/fstab (2)
diff --git a/fstab b/fstab
index d1ac1c3..01c9c0e 100644
--- a/fstab
+++ b/fstab
@@ -1,5 +1,6 @@
LABEL=cloudimg-rootfs / ext4 defaults 0 1
LABEL=UEFI /boot/efi vfat umask=0077 0 1
+/var/tmp/swap none swap pri=-1 0 0

# CLOUD_IMG: This file was created/modified by the Cloud Image build process
######################################
$ sudo swapon -av (3)
swapon: /var/tmp/swap: found signature [pagesize=4096, signature=swap]
swapon: /var/tmp/swap: pagesize=4096, swapsize=2147483648, devsize=2147483648
swapon /var/tmp/swap
$ free (4)
total used free shared buff/cache available
Mem: 989340 308556 71368 12880 609416 517280
Swap: 2097148 0 2097148

/etc/fatab 修正

/etc/fstab 修正内容

swapを手動で反映(次回起動時からは自動的に反映される)

swapが設定されたのを確認

ディスクを縮小してswapパーティションを作成

swapファイルを使う方法はお手軽ですが，レイヤーが増えるので少し遅くなるはずです．割当済のディスクを縮小してswapパーティションを作成してマウントします．

Warning

設定をミスするとシステムが壊れるので注意して操作してください．操作に不安がある場合は上のswapファイルを利用したほうが安全です．

Partedで処理を行います．GUIの場合はgPartedが解りやすくて便利です．
現在の状態を確認してみます．空きディスクはほとんどありませんが，パーティション1の /dev/dsa1 を縮小してswap用に貰うことにします．

$ sudo parted /dev/sda
:
(parted) print free
Model: ORACLE BlockVolume (scsi)
Disk /dev/sda: 50.0GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
17.4kB 1049kB 1031kB Free Space
14 1049kB 5243kB 4194kB bios_grub
15 5243kB 116MB 111MB fat32 boot, esp
1 116MB 50.0GB 49.9GB ext4

パーティション1を50GBから48GBにリサイズします．

(parted) resizepart
Partition number? 1
Warning: Partition /dev/sda1 is being used. Are you sure you want to continue?
Yes/No? yes
End? [50.0GB]? 48GB
Warning: Shrinking a partition can cause data loss, are you sure you want to continue?
Yes/No? yes

パーティション1が小さくなりました．

(parted) print
Model: ORACLE BlockVolume (scsi)
Disk /dev/sda: 50.0GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
14 1049kB 5243kB 4194kB bios_grub
15 5243kB 116MB 111MB fat32 boot, esp
1 116MB 48.0GB 47.9GB ext4

できた空き領域からswap用のパーティーションを作成します．

(parted) mkpart
Partition name? []?
File system type? [ext2]? linux-swap
Start? 48.0GB
End? 50GB
(parted) print
Model: ORACLE BlockVolume (scsi)
Disk /dev/sda: 50.0GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
14 1049kB 5243kB 4194kB bios_grub
15 5243kB 116MB 111MB fat32 boot, esp
1 116MB 48.0GB 47.9GB ext4
2 48.0GB 50.0GB 2009MB linux-swap(v1)

(parted) quit
Information: You may need to update /etc/fstab.

swapパーティションを初期化します．

$ sudo mkswap /dev/sda2
Setting up swapspace version 1, size = 1.9 GiB (2009067520 bytes)
no label, UUID=4e27ed83-3d75-4c3d-87ac-f16e618bba4a

アドホックに手動でswapを有効化してみます．

$ sudo swapon -v UUID=4e27ed83-3d75-4c3d-87ac-f16e618bba4a
swapon: /dev/sda2: found signature [pagesize=4096, signature=swap]
swapon: /dev/sda2: pagesize=4096, swapsize=2009071616, devsize=2009071616
swapon /dev/sda2
$ free
total used free shared buff/cache available
Mem: 989340 311428 83696 12884 594216 513164
Swap: 1961980 0 1961980

一旦swapをoffにして永続化のために/etc/fstabに登録してswaponしてみます．

$ sudo swapoff UUID=4e27ed83-3d75-4c3d-87ac-f16e618bba4a
$ sudo vi /etc/fstab
$ sudo git -C /etc diff /etc/fstab
diff --git a/fstab b/fstab
index e22bda5..72d64af 100644
--- a/fstab
+++ b/fstab
@@ -1,6 +1,6 @@
LABEL=cloudimg-rootfs / ext4 defaults 0 1
LABEL=UEFI /boot/efi vfat umask=0077 0 1
-/var/tmp/swap none swap pri=20 0 0
+UUID=4e27ed83-3d75-4c3d-87ac-f16e618bba4a none swap pri=-1 0 0

# CLOUD_IMG: This file was created/modified by the Cloud Image build process
######################################
ubuntu@instance-20220327-0134:~$ sudo swapon -a
ubuntu@instance-20220327-0134:~$ free
total used free shared buff/cache available
Mem: 989340 312360 80884 12884 596096 512232
Swap: 1961980 0 1961980

次回起動時から自動的に有効になるはずです．

環境

Oracle Cloud コンピュートインスタンス

イメージ

Canonical-Ubuntu-20.04-Minimal-2022.03.04-0

$ dpkg-query -W parted mount
mount 2.34-0.1ubuntu9.3
parted 3.3-4ubuntu0.20.04.1
$ lsb_release -dr
Description: Ubuntu 20.04.4 LTS
Release: 20.04
$ uname -a
Linux instance-20220327-0134 5.13.0-1027-oracle #32~20.04.1-Ubuntu SMP Fri Apr 15 05:59:34 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux