アプリケーション開発ポータルサイト
ServerNote.NET
カテゴリー【Amazon/AWSDebianCentOS
【Amazon/AWS】揮発性NVMe SSDディスクを非インタラクティブにパーティション分割してスワップ利用する
POSTED BY
2021-04-21

EC2の仮想マシンのタイプによっては、ほとんど変わらぬコストで揮発性(マシンシャットダウンですべて消える)のNVMe SSDがオマケで付属する。(メモリ最適化インスタンスr6gd.xlargeなど)

電源ONのたびに毎回起動時にmkfsやらmountやらしなくてはいけないが、それは以下記事のようにスタートアップスクリプトを仕込む。

インスタンス起動時に毎回ユーザーデータスクリプトを実行する

さて、折角の高速ストレージなのだから、パーティションを切って一時ストレージとスワップ領域とに分けて利用したい。

上記起動時のスクリプトで行いたいから、対話型でなく非対話型(非インタラクティブ)でコマンドラインで完結したい。

1、partedのインストールと初期状態の表示

apt install parted

まっさらな状態の現在の状態を表示する。

parted -l

Model: Amazon Elastic Block Store (nvme)
Disk /dev/nvme0n1: 537GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End    Size   File system  Name  Flags
15      1049kB  134MB  133MB  fat16              boot, esp
 1      134MB   537GB  537GB  ext4


Model: Amazon EC2 NVMe Instance Storage (nvme)
Disk /dev/nvme1n1: 237GB
Sector size (logical/physical): 512B/512B
Partition Table: loop
Disk Flags:

Number  Start  End    Size   File system  Flags

/dev/nvme1n1: 237GBが、オマケの揮発性Amazon EC2 NVMe Instance Storageであると表示されていて、まだ何もされていない。

2、GPTでラベル付け

非対話でコマンドラインで完結するには以下のようにする。

parted -s -a optimal /dev/nvme1n1 mklabel gpt

Partition Table: gpt になる。

3、スワップ用パーティションと残り領域パーティションの作成

ここでは、最初のパーティションは30GBのスワップ用、残り全部(-1)を一般用として2つのパーティションを作成。

非対話でコマンドラインで完結するには以下のようにする。

parted -s -a optimal /dev/nvme1n1 -- mkpart swap linux-swap 1 30GiB
parted -s -a optimal /dev/nvme1n1 -- mkpart primary ext4 30GiB -1

確認すると

parted -l

Model: Amazon EC2 NVMe Instance Storage (nvme)
Disk /dev/nvme1n1: 237GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name     Flags
 1      1049kB  32.2GB  32.2GB               swap
 2      32.2GB  237GB   205GB                primary

ls -alF /dev/nvme1*
crw------- 1 root root 241, 1 Apr 21 12:21 /dev/nvme1
brw-rw---- 1 root disk 259, 3 Apr 21 14:03 /dev/nvme1n1
brw-rw---- 1 root disk 259, 6 Apr 21 14:03 /dev/nvme1n1p1
brw-rw---- 1 root disk 259, 7 Apr 21 14:03 /dev/nvme1n1p2

30GB, 200GBの2つのパーティションができた。
lsでdevを見ると、nvme1n1p1が1番、nvme1n1p2が2番として新規作成されている。

4、スワップの有効化

このままではただパーティションを切っただけで何も起こらない。まず最初のパーティションをスワップ初期化しOSに認識させ稼働開始させる。

mkswap /dev/nvme1n1p1
swapon /dev/nvme1n1p1

topコマンドで確認すると、

top
Tasks: 126 total,   1 running, 125 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.1 us,  0.0 sy,  0.0 ni, 99.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :  31837.9 total,  31403.5 free,    159.1 used,    275.3 buff/cache
MiB Swap:  30719.0 total,  30719.0 free,      0.0 used.  31351.4 avail Mem

しっかりとSwapとして認識、稼働を開始した。

5、残り領域(パーティション2)をフォーマットし一般領域としてマウント

次に2番目のパーティションを普通に初期化してマウント。

mkfs -t ext4 /dev/nvme1n1p2

mke2fs 1.44.5 (15-Dec-2018)
Discarding device blocks: done
Creating filesystem with 49996800 4k blocks and 12500992 inodes
Filesystem UUID: cbd79e86-c16c-4fdb-b0bc-eb117e2fafd9
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872

Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done

mkdir -p /disk
mount /dev/nvme1n1p2 /disk

df -h

Filesystem       Size  Used Avail Use% Mounted on
udev              16G     0   16G   0% /dev
tmpfs            3.2G  8.4M  3.2G   1% /run
/dev/nvme0n1p1   492G  1.9G  470G   1% /
tmpfs             16G     0   16G   0% /dev/shm
tmpfs            5.0M     0  5.0M   0% /run/lock
tmpfs             16G     0   16G   0% /sys/fs/cgroup
/dev/nvme0n1p15  127M  140K  127M   1% /boot/efi
tmpfs            3.2G     0  3.2G   0% /run/user/1000
/dev/nvme1n1p2   187G   61M  178G   1% /disk

一番下にちゃんとマウントされている。

なお、ここでparted -lとすれば、フォーマット済みの各パーティションの情報も出る。

parted -l

Model: Amazon EC2 NVMe Instance Storage (nvme)
Disk /dev/nvme1n1: 237GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system     Name     Flags
 1      1049kB  32.2GB  32.2GB  linux-swap(v1)  swap
 2      32.2GB  237GB   205GB   ext4            primary

普通であればあとは/etc/fstabにそれぞれ書けばいいだけだが、ディスク自体が揮発性のため、毎回起動時にこれら作業を行う必要がある。(=/etc/fstabに書いても意味はない・むしろ誤動作の元)

これまでのコマンドをすべて、

インスタンス起動時に毎回ユーザーデータスクリプトを実行する

のスクリプトに放り込んでしまえば、理論上毎回起動時に上記ディスクセットアップがなされるはずである。

6、コマンドラインでパーティションを削除するには

アンマウント、スワップならswapoffした上で、

parted -s -a optimal /dev/nvme1n1 rm <パーティション番号>

とする。今回例だとスワップなら1、残り領域なら2。

※本記事は当サイト管理人の個人的な備忘録です。本記事の参照又は付随ソースコード利用後にいかなる損害が発生しても当サイト及び管理人は一切責任を負いません。
※本記事内容の無断転載を禁じます。
【webmaster/管理人】
自営業プログラマー
ご連絡は以下アドレスまで★

☆お仲間ブログ1↓
匠のコーヒーブレイク
☆お仲間ブログ2↓
一人社長の不動産業務日誌
【キーワード検索】