×
採用サイトはこちら

インスタンスストアをLinuxのSwap領域として使う!【後編】

インスタンスストアを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領域として使う!【後編】 は以上になります。

ご一読いただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

FindConsulting広報担当です。
エンジニアの皆様に向けて、技術ブログでお役立ち情報を発信しています。最新技術のトレンドや実務で使えるノウハウ、キャリア形成のヒントなど、エンジニアの皆様の成長をサポートする情報をお届けしています。
長期的に、共に成長していけるエンジニアの皆様との繋がりを心よりお待ちしております。

目次