さくらのクラウドUbuntu 20.04でスワップ領域を無効化する手順

# 概要

さくらのクラウドのパブリックアーカイブ「Ubuntu 20.04」で、スワップ領域を無効化する手順です。

# 解説

スワップ領域を無効化するには、コマンド `sudo swapoff -a` を実行します。しかし、このコマンド実行は、一時的な対処です。

サーバ再起動後もスワップを使わないためには、一般的に `/etc/fstab` の swap 行のエントリをコメントアウトもしくは削除します。

また、さくらのクラウドの Ubuntu Server は、  `/dev/vda2` にパーティション領域があります。

```bash
$ sudo swapon --show
NAME      TYPE      SIZE USED PRIO
/dev/vda2 partition   4G   0B   -2
```

そのため `sudo systemctl mask "dev-vda2.swap"` でスワップ設定のマスキングも必要です。

# 設定手順

Ubuntu Server にログインし、 `free` コマンドでメモリ領域を確認すると、 `Swap:` 行にスワップ領域を確認できます。

```bash
ubuntu@ubuntu2004:~$ free -h
              total        used        free      shared  buff/cache   available
Mem:          981Mi        71Mi       736Mi       0.0Ki       173Mi       774Mi
Swap:         4.0Gi          0B       4.0Gi
```

無効化するには `sudo swapoff -a` です。コマンドを実行した後から、スワップが無効化されます。

```bash
ubuntu@ubuntu2004:~$ sudo swapoff -a
ubuntu@ubuntu2004:~$ free -h
              total        used        free      shared  buff/cache   available
Mem:          981Mi        75Mi       732Mi       0.0Ki       173Mi       770Mi
Swap:            0B          0B          0B
```

ただし、この段階では一時的なものであり、サーバが再起動すると再びスワップが使用されてしまいます。

これを回避するには `/etc/fstab` のエントリ削除と `/dev/vda2` のスワップユニットを削除（マスク）する必要があります。

## 1. /etc/fstab の編集

`sudo vi /etc/fstab` などで、 `/etc/fstab` ファイルを開き、編集します。ファイル末尾、11行目にこのような `UUID=` で始まるエントリ行があります。これを、コメントアウトもしくは削除します。

```
# swap was on /dev/vda2 during installation
UUID=2ff82d00-dbd6-4577-9924-3debf3284249 none            swap    sw              0       0
```

↓こうなっていれば、このようにコメントします。

```
# swap was on /dev/vda2 during installation
#UUID=2ff82d00-dbd6-4577-9924-3debf3284249 none            swap    sw              0       0
```

## 2. /dev/vda2 のスワップユニットを削除

次に、 `systemctl --type swap` コマンドを実行し、現在のスワップ情報を確認します。

```bash
ubuntu@ubuntu2004:~$ systemctl --type swap
  UNIT                                                                      LOAD   ACTIVE SUB    DESCRIPTION
  dev-disk-by\x2duuid-2ff82d00\x2ddbd6\x2d4577\x2d9924\x2d3debf3284249.swap loaded active active /dev/disk/by-uuid/2ff82d00-dbd6-4577-9924-debf3284249

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

1 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.
```

これは、 `swapon --show` コマンドで確認すると、 `/dev/vda2` の swap 用パーティション領域を使っています。

```bash
ubuntu@ubuntu2004:~$ swapon --show
NAME      TYPE      SIZE USED PRIO
/dev/vda2 partition   4G   0B   -2
```

この `/dev/vda2` を読み込まないようにするため、systemd でもスワップ領域のマスキングをします。

```bash
ubuntu@ubuntu2004:~$ sudo systemctl mask "dev-vda2.swap"
Created symlink /etc/systemd/system/dev-vda2.swap → /dev/null.
```

それから、もう一度 `systemctl --type swap` を実行し、 `/dev/vda2` のスワップをマスクしているのを確認します。

```bash
ubuntu@ubuntu2004:~$ systemctl --type swap
  UNIT          LOAD   ACTIVE SUB    DESCRIPTION
● dev-vda2.swap masked active active /dev/vda2

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

1 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.
```

## 再起動と動作確認

あとは、 `sudo reboot` などで再起動し、再起動後に何もしなくてもスワップ領域が発生していないことを確認します。

再起動後に再びログインすると、スワップ領域は発生しておらず、systemd でもスワップがマスクされているのが分かります。

```bash
ubuntu@ubuntu2004:~$ free -h
              total        used        free      shared  buff/cache   available
Mem:          981Mi        74Mi       801Mi       0.0Ki       105Mi       784Mi
Swap:            0B          0B          0B
ubuntu@ubuntu2004:~$ systemctl --type swap --all
  UNIT          LOAD   ACTIVE   SUB  DESCRIPTION
● dev-vda2.swap masked inactive dead dev-vda2.swap

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

1 loaded units listed.
To show all installed unit files use 'systemctl list-unit-files'.
```

## 参考

- `man systemd.swap`