AlmaLinuxのswapについて
前回、「第10回 Raspberry Pi用のAlmaLinuxをSSDにコピーする」では、bootパーティションを512MBで設定してみました。ところが、swapについては配布されているrawイメージのままでしたから100MBのswapファイルが使用されています。このswapについても、AlmaLinuxの2023年6月15日より前のバージョンではファイルではなくパーティションとして100MBが使用されていたので、ちょっと不便だったのですがファイルになりましたので好みに合わせて変更することが容易になりました。
このswapは、AlmaLinuxのようなLinuxシステムで仮想記憶装置として働くもので、アプリケーションを実行していて物理的なメモリーが不足するようになった場合には、仮想的にメモリーの代替として利用される仕組みとなっています。
Raspberry Pi 4では、搭載しているメモリーも2GB、4GB、8GBと種類があり、最大で8GBを使用することができます。また、AlmaLinuxでは最初から64-bitのカーネルになっているために搭載している大きなメモリー空間を有効に利用することができます。そのため、以前のRaspberry Pi 3Bまでの頃のようにメモリーが不足することも少なくなってきているかとは思います。
それでも最近のようにアプリケーションが大きなメモリーを使用する場合に備えて、ここではswapを拡張する方法を見ていくことにします。
またswapについては、その仕組みとしてメモリーのページ単位でディスクなどの仮想記憶装置に読み書きするようになったことから従来使われていたswappingからpagingと呼ばれるようもになって来ています。
なお、Kubernetesを使う場合には、逆に前提条件として「swapを無効化」する必要がある点にも注意が必要です。
注:Raspberry Pi OSの32-bit版の場合では、ポインターでアドレスできるメモリーは4GBまでで、1つのプロセスで使用できるメモリーはカーネルが1GB使うために3GBまでに制限されてしまいます。
swapの状態を確認
freeコマンドを実行して、メモリーの使用状況を見ることができます。
$ free -h
total used free shared buff/cache available
Mem: 7.6Gi 1.0Gi 6.0Gi 21Mi 786Mi 6.6Gi
Swap: 99Mi 0B 99Mi
オプションとして-hを使用することで、わかりやすい単位の表示としています。最初の行がMemで物理メモリーの様子を表示しています。ここでは、Raspberry Pi 4の8GBモデルで実行していますからメモリ合計が7.6GBとして表示されています。
次の行がSwapとしてswapの状態を表示しています。合計が99MBですが、まだ使われていない状態になっています。
次に、swaponコマンドを実行してみます。
$ swapon -s
Filename Type Size Used Priority
/swapfile file 102396 0 -2
ここで、swaponコマンドはswap領域としてのディスクパーティション、またはファイルを有効化したり無効化することのできるコマンドです。ここではオプションとして-sを使用して現在の使用状況を表示しています。
この表示を見てもわかるようにswapの実際の領域としては、/swapfileというファイルが使用されています。
AlmaLinuxの場合には、/etc/fstabでswapが設定されています。
$ cat /etc/fstab
UUID=0f355284-0ba7-4cd4-92d4-69025db053b0 / ext4 defaults,noatime 0 0
UUID=6E74-BA51 /boot vfat defaults,noatime 0 0
/swapfile none swap defaults 0 0
上記の例のように、/etc/fstabにswapを設定している行があります。
注:Raspberry Pi OSの場合には、dphys-swapfileというサービスが実行されています。この場合には、/etc/fstabではなく/etc/dphys-swapfileという設定ファイルが使用されています。
swapの無効化
次のコマンドを実行して、swapを停止して無効化することができます。
$ systemctl status swapfile.swap
まず、状態がActive: activeとなっていることを確認します。
$ sudo systemctl stop swapfile.swap
swapを停止しています。
$ systemctl status swapfile.swap
停止後の状態を確認しています。状態が、Active: inactive (dead)となりました。
現在のswapを確認してみます。
$ free -h
total used free shared buff/cache available
Mem: 7.6Gi 640Mi 6.7Gi 15Mi 421Mi 7.0Gi
Swap: 0B 0B 0B
freeコマンドの実行でSwapが0Bになりました。
$ swapon -s
swaponコマンドでは何も表示されなくなっています。
swap領域の拡張
それでは、swap領域を拡張していきます。ここでは例として/swapfileを4GB用意して設定していくことにします。
swapを停止している状態で、次のコマンドを実行します。
$ sudo dd if=/dev/zero of=/swapfile bs=1M count=4096
$ sudo mkswap -L swap /swapfile
ddコマンドでゼロを1MBずつのブロックで4096回書き込むことで4GBの/swapfileを作成しています。出来上がった/swapfileを、mkswapコマンドでswapとしての設定をしています。また、その際に-Lオプションでラベルをswapとして設定しています。
ここでは、元々あったフィルを拡張していますが、新しいファイルを作成する場合には、次のようなオーナーとパーミッションに設定するようにします。
$ ls -ld /swapfile
-rw-------. 1 root root 4294967296 8月 17 09:27 /swapfile
準備ができたら、停止していたswapを再開します。
$ sudo systemctl start swapfile.swap
再開後の状態を確認してみます。
$ systemctl status swapfile.swap
状態が、Actieve: activeとなりました。
拡張後のswapの状態を確認
再開後に、拡張したswapの状態を確認してみます。
まずfreeコマンドを実行します。
$ free -h
total used free shared buff/cache available
Mem: 7.6Gi 929Mi 6.3Gi 18Mi 557Mi 6.7Gi
Swap: 4.0Gi 0B 4.0Gi
Swapが4GBで設定されています。
同様にswaponコマンドで確認してみます。
$ swapon -s
Filename Type Size Used Priority
/swapfile file 4194300 0 -2
Swapが4GBに拡張されてることが確認できました。
恒久的なswapの無効化
AlmaLinuxの場合には、/etc/fstabでswapが設定されていますから、/etc/fstabにあるswapの行を削除するかコメントアウトしてから再起動することで恒久的に無効化することができます。
$ cat /etc/fstab
UUID=0f355284-0ba7-4cd4-92d4-69025db053b0 / ext4 defaults,noatime 0 0
UUID=6E74-BA51 /boot vfat defaults,noatime 0 0
## /swapfile none swap defaults 0 0
Kubernetesを使用する場合のように、swapを無効化したい場合には、このようにする必要があります。
まとめ
最近では、使用できるメモリーが大きくなって来ていることもあり、swapに頼る頻度も少なくなりつつあるかとは思います。
その一方でアプリケーションが要求するメモリーが増大化しつつあることもあり、このようにswapを操作することが出来ることでRaspberry Piで動かすAlmaLinuxも応用する幅が広がってくるのではないでしょうか。