インスタンスストアをLinuxのSwap領域として使う!
【後編】
背景
【前編】では、ルート領域用EBS+インスタンスストア構成でインスタンスストア(デバイス名:/dev/nvme1n1)をSwap領域とし利用する設定をご紹介しました。
ただし、EBSを2本以上アタッチして利用されてしまうとLinuxはサーバ起動時にディスク(EBS)を認識した順序で
デバイス名を動的に変動するため、
「/dev/nvme1n1」固定指定のSwap領域作成だと正常動作しないという課題が【前編】では残りました。
これを解消するため、【後編】ではデバイス名が動的に変化してもインスタンスストアを自動判別し、インスタンスストアをSwap領域を作成する手法を紹介します。
目的
- LinuxのSwap領域をインスタンスストアで作成
- EBSを2本以上アタッチした状態でもSwap領域を正常利用可
- サーバ起動および再起動時、Swap領域の作成およびディスクマウントの自動化
機能説明
Linuxのデバイス名割り当て動作について
Linuxは、OS起動時に接続されたストレージデバイスを検出し、検出順に /dev/デバイス名 を割り当てます。
本動作は、OS起動の度にデバイス名が変動する可能性があるため、識別はUUIDやラベルの使用が推奨されます。
以下例は、本構成で認識した順序です。
# lsblk -l
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT nvme0n1 259:0 0 100G 0 disk ←ルートボリューム用EBS ※デバイス名は変動しない、EC2の場合は基本最初に検出される nvme2n1 259:1 0 150G 0 disk ←データ領域①用EBS ※デバイス名は変動する可能性あり nvme1n1 259:2 0 200G 0 disk ←データ領域②用EBS ※デバイス名は変動する可能性あり nvme3n1 259:3 0 884.8G 0 disk ←インスタンスストア ※デバイス名は変動する可能性あり、基本最後に検出される nvme0n1p1 259:4 0 1M 0 part nvme0n1p2 259:5 0 200M 0 part /boot/efi nvme0n1p3 259:6 0 98.8G 0 part /
Linuxでインスタンスストアのデバイス名を判別する方法について
以下コマンド実行すると、どのストレージデバイスがインスタンスストアであるかを判別できます。
# lsblk -d -o NAME,MODEL
NAME MODEL nvme0n1 Amazon Elastic Block Store ←EBS nvme1n1 Amazon Elastic Block Store nvme2n1 Amazon Elastic Block Store nvme3n1 Amazon EC2 NVMe Instance Storage ←インスタンスストア
設定してみよう!
構成情報
- EC2インスタンスタイプ:r6id.4xlarge(vCPU:16、MEM:128GB、1x950GB NVMe SSD)
- EBS:ルートボリューム用EBS(100GB)、データ領域①用EBS(150GB)、データ領域②用EBS(200GB)
- OS:Redhat Enterprise Linux 8系
事前準備
(事前準備の操作は、本記事では割愛させて頂きます。)
「インスタンスストアをLinuxのSwap領域として使う!【前編】」の設定前と同じ状態にする。
設定の流れ
1.Swap領域作成スクリプトを作成し配置
2.Swap領域作成スクリプトをサーバ起動時に実行するサービス作成
設定手順
注:作業は「#(root)」アカウントで行います。
1.Swap領域作成スクリプトを作成する。
以下コマンド実行し、スクリプトを作成。
# vi /<任意ディレクトリ>/<任意スクリプト名>.sh
#!/bin/bash #/dev/nvme*n1にマッチする全てのデバイス名でループ処理 for dev in /dev/nvme*n1; do #ストレージデバイス名を取得 model=$(liblk -d -n -o MODEL "$dev"); #ストレージデバイス名が「Amazon Elastic Blook Store」じゃなかったら処理実行 if [[ "$model" != *"Amazon Elastic Block Store"* ]]; then #Swap領域を作成し有効化 mkswapv "$dev" swapon "$dev" fi done
以下コマンド実行し、スクリプトを実行する権限に変更。
# chmod 755 /<任意ディレクトリ>/<任意スクリプト名>.sh
2.サーバ起動時にSwap領域作成スクリプトを自動実行するためのサービスを作成する。
以下コマンド実行し、サービスを作成。
# vi /etc/systemd/system/<任意サービス名>.service
#このセクションは、サービスの説明や他サービスの依存関係を定義 [Unit] Description=<サービスの説明> After=network.terget #このセクションは、サービスの実行方法を定義 [Service] Type=oneshot ExecStart=/<任意ディレクトリ>/<任意スクリプト名>.sh RemainAfterExit=ture #このセクションは、systemctlでサービスを起動時に有効化するための定義 [Install] WantedBy=multi-user.target
以下コマンド実行し、サービス登録。
# systemctl daemon-reload
以下コマンド実行し、OS起動時にサービス自動実行設定。
# systemctl enable <任意サービス名>.service
動作確認
サーバ停止⇒起動後、Swap領域が作成され自動マウントされているかを確認する。
# lsblk -l
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT nvme0n1 259:0 0 100G 0 disk nvme2n1 259:1 0 150G 0 disk nvme1n1 259:2 0 200G 0 disk nvme3n1 259:3 0 884.8G 0 disk [SWAP] ←MOUNTPOINT が [SWAP]と表示されていれば成功 nvme0n1p1 259:4 0 1M 0 part nvme0n1p2 259:5 0 200M 0 part /boot/efi nvme0n1p3 259:6 0 98.8G 0 part /
終わりに
【後編】では、EBSを2本以上アタッチ+インスタンスストア構成での設定例を記載させて頂きました。
この構成は、【前編】で問題となるEBSを2本以上や追加EBSアタッチした場合でもインスタンスストアのSwap領域を問題なく作成/利用できる構成となります。
【後編】の方が実用的とは思いますが、EBSを追加する予定はなくサービスを作りたくない方は【前編】の設定を行ってみてください。
インスタンスストアをLinuxのSwap領域として使う!【後編】 は以上になります。
ご一読いただき、ありがとうございました。