Linux インスタンスの Amazon EBS および NVMe
EBS ボリュームは、Nitro System上に構築されたインスタンスで NVMe ブロックデバイスとして公開されます。デバイス名は、/dev/nvme0n1
、/dev/nvme1n1
などです。ブロックデバイスマッピングで指定したデバイス名は、NVMe デバイス名 (/dev/nvme[0-26]n1
) を使用して名称変更されます。ブロックデバイスドライバーは、ブロックデバイスマッピングのボリュームに指定した順序とは異なる順序で NVMe デバイス名を割り当てることができます。
Amazon EBS 製品の詳細
Windows インスタンスの EBS ボリュームと NVME の詳細については、「Windows インスタンスのユーザーガイド」を参照してください。
NVMe ドライバのインストールまたはアップグレード
NVMe ボリュームにアクセスするには、NVMe ドライバーをインストールする必要があります。インスタンスは、NVMe ボリュームタイプである NVMe EBS ボリュームや NVMe インスタンスストアボリュームも、NVMe ボリュームタイプでないボリュームもサポートできます。詳細については、「ネットワーキング機能とストレージ機能の概要」を参照してください。
以下の AMI には、必要な NVMe ドライバーが含まれています。
Amazon Linux 2
Amazon Linux AMI 2018.03
-
linux-aws
カーネルを搭載した Ubuntu 14.04 以降注記
AWS Graviton ベースのインスタンスタイプには、
linux-aws
カーネル搭載の Ubuntu 18.04 以降が必要です Red Hat Enterprise Linux 6.5 以降
Red Hat Enterprise Linux 7.4 以降
SUSE Linux Enterprise Server 12 SP2 以降
CentOS 7.4.1708 以降
FreeBSD 11.1 以降
Debian GNU/Linux 9 以降
Windows インスタンスの NVMe ドライバーの詳細については、Windows インスタンスの Amazon EC2 ユーザーガイド のAmazon EBS および Windows インスタンスを参照してください。
インスタンスに NVMe ドライバーがあることを確認するには
次のコマンドを使用して、インスタンスに NVMe ドライバーがあることを確認できます。
-
Amazon Linux、RHEL、CentOS、SUSE Linux Enterprise Server
$
modinfo nvmeインスタンスに NVMe ドライバーがある場合、コマンドはそのドライバーに関する情報を返します。
-
Amazon Linux 2、Ubuntu
$
ls /sys/module/ | grep nvmeインスタンスに NVMe ドライバーがある場合、コマンドはインストールされたドライバーを返します。
NVMe ドライバーを更新するには
インスタンスに NVMe ドライバーがある場合は、次の手順を使用してドライバーを最新バージョンに更新できます。
-
インスタンスに接続します。
-
パッケージのキャッシュを更新し、必要なパッケージの更新を次のように取得します。
-
Amazon Linux 2、Amazon Linux、CentOS、Red Hat Enterprise Linux の場合:
[ec2-user ~]$
sudo yum update -y
-
Ubuntu と Debian の場合:
[ec2-user ~]$
sudo apt-get update -y
-
-
Ubuntu 16.04 以降には、
linux-aws
パッケージが含まれます。このパッケージには、Nitro ベースのインスタンスで必要な NVMe および ENA ドライバーが含まれます。最新バージョンにするには、次のようにlinux-aws
パッケージにアップグレードします。[ec2-user ~]$
sudo apt-get install --only-upgrade -y linux-aws
Ubuntu 14.04 の場合は、次のように最新の
linux-aws
パッケージをインストールできます。[ec2-user ~]$
sudo apt-get install linux-aws
-
インスタンスを再起動して、最新のカーネルバージョンを読み込みます。
sudo reboot
-
再起動後にインスタンスに再接続します。
EBS デバイスの特定
EBS では、シングルルート I/O 仮想化 (SR-IOV) を使用して、NVMe 規格を使用して Nitro ベースのインスタンスにボリュームをアタッチします。これらのデバイスは、オペレーティングシステムの標準 NVMe ドライバーに依存しています。これらのドライバーは、通常、インスタンスのブート時にアタッチ済みのデバイスを検出し、そのデバイスがブロックデバイスマッピングでどのように指定されているかではなく、デバイスが応答する順序に基づいてデバイスノードを作成します。Linux では、NVMe デバイス名は /dev/nvme<x>n<y>
のパターンに従います。ここで、<x> は列挙順序で、EBS の場合の <y> は 1 です。場合によっては、デバイスは後続のインスタンスの開始時に異なる順序で検出に応答することがあり、デバイス名が変更されます。また、ブロックデバイスドライバーによって割り当てられるデバイス名は、ブロックデバイスマッピングで指定される名前と異なる場合があります。
インスタンス内の EBS ボリュームには、次のいずれかのような安定した識別子を使用することをお勧めします。
-
Nitro ベースのインスタンスでは、ブロックデバイスマッピングは、EBS ボリュームをアタッチしているとき、または
AttachVolume
かRunInstances
API コールが、NVMe コントローラー ID のベンダー固有のデータフィールドに取り込まれる際に Amazon EC2 コンソールで指定されます。バージョン 2017.09.01 以降の Amazon Linux AMI で、このデータを読み込んでブロックデバイスマッピングへのシンボリックリンクを作成するudev
ルールを提供します。 -
EBS ボリューム ID とマウントポイントは、インスタンスの状態が変化しても安定しています。NVMe デバイス名は、インスタンスの起動時にデバイスが応答する順序に応じて変化します。一貫性のあるデバイスを識別するには、EBS ボリューム ID とマウントポイントを使用することをお勧めします。
-
NVMe EBS ボリュームには、EBS ボリューム ID がデバイス ID のシリアル番号として設定されています。シリアル番号を一覧表示するには、
lsblk -o +SERIAL
コマンドを使用します。 -
NVMe デバイス名の形式は、EBS ボリュームがインスタンスの起動中または起動後にアタッチされたかどうかによって異なります。インスタンスの起動後にアタッチされたボリュームの NVMe デバイス名には、
/dev/
プレフィクスが含まれますが、インスタンスの起動中にアタッチされたボリュームの NVMe デバイス名には/dev/
プレフィクスが含まれません。Amazon Linux または FreeBSD AMI を使用している場合は、sudo ebsnvme-id /dev/
コマンドを使用して、一貫した NVMe デバイス名を指定します。その他のディストリビューションではnvme0n1
-usudo nvme id-ctrl -v /dev/
コマンドを使用して NVMe デバイス名を指定します。nvme0n1
-
デバイスがフォーマットされると、ファイルシステムの存続期間中、存続する UUID が生成されます。デバイスラベルは同時に指定することができます。詳細については、Linux で Amazon EBS ボリュームを使用できるようにするおよび間違ったボリュームからの起動を参照してください。
Amazon Linux AMI
AMI Amazon Linux 2017.09.01 以降 (Amazon Linux 2 を含む) では、次のように ebsnvme-id コマンドを実行して、NVMe デバイス名をボリューム ID とデバイス名にマップすることができます。
次の例は、インスタンスの起動時にアタッチされたボリュームのコマンドと出力を示しています。NVMe デバイス名には、/dev/
プレフィクスが含まれないことに注意してください。
[ec2-user ~]$
sudo /sbin/ebsnvme-id /dev/nvme
0
n1Volume ID: vol-01324f611e2463981 sda
次の例は、インスタンスの起動後にアタッチされたボリュームのコマンドと出力を示しています。NVMe デバイス名に、/dev/
プレフィクスが含まれることに注意してください。
[ec2-user ~]$
sudo /sbin/ebsnvme-id /dev/nvme
1
n1Volume ID: vol-064784f1011136656 /dev/sdf
また、Amazon Linux はブロックデバイスマッピング (例えば、/dev/sdf
) 内のデバイス名から NVMe デバイス名へのシンボリックリンクを作成します。
FreeBSD AMI
FreeBSD 12.2-RELEASE 以降では、上記のように ebsnvme-id コマンドを実行することができます。NVMe デバイスの名前 (nvme0
など) またはディスクデバイス (nvd0
または nda0
) を渡します。FreeBSD は、ディスクデバイスへのシンボリックリンク (/dev/aws/disk/ebs/
volume_id
など) も作成します。
その他の Linux AMI
カーネルバージョン 4.2 以降では、次のように nvme
id-ctrl コマンドを実行して、NVMe デバイスをボリューム ID にマップすることができます。最初に、Linux ディストリビューションのパッケージ管理ツールを使用して、NVMe コマンドラインのパッケージ nvme-cli
をインストールします。他のディストリビューションのダウンロードおよびインストール手順については、ディストリビューションに固有のドキュメントを参照してください。
次の例では、インスタンスの起動時にアタッチされたボリュームのボリューム ID と NVMe デバイス名を取得します。 NVMe デバイス名には、/dev/
プレフィクスが含まれないことに注意してください。デバイス名は、NVMe コントローラベンダー固有の拡張子 (コントローラー ID のバイト 384:4095) を介して使用できます。
[ec2-user ~]$
sudo nvme id-ctrl -v /dev/nvme
0
n1NVME Identify Controller: vid : 0x1d0f ssvid : 0x1d0f sn :
vol01234567890abcdef
mn : Amazon Elastic Block Store ... 0000: 2f 64 65 76 2f 73 64 6a 20 20 20 20 20 20 20 20 "sda
..."
次の例では、インスタンスの起動後にアタッチされたボリュームのボリューム ID と NVMe デバイス名を取得します。 NVMe デバイス名には、/dev/
プレフィクスが含まれることに注意してください。
[ec2-user ~]$
sudo nvme id-ctrl -v /dev/nvme
1
n1NVME Identify Controller: vid : 0x1d0f ssvid : 0x1d0f sn :
volabcdef01234567890
mn : Amazon Elastic Block Store ... 0000: 2f 64 65 76 2f 73 64 6a 20 20 20 20 20 20 20 20 "/dev/sdf
..."
lsblk コマンドは、使用可能なデバイスとそのマウントポイント (該当する場合) をリストします。これは、使用する正しいデバイス名を決定するのに役立ちます。この例では、/dev/nvme0n1p1
がルートデバイスとしてマウントされ、/dev/nvme1n1
はアタッチされていますがマウントされていません。
[ec2-user ~]$
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT nvme1n1 259:3 0 100G 0 disk nvme0n1 259:0 0 8G 0 disk nvme0n1p1 259:1 0 8G 0 part / nvme0n1p128 259:2 0 1M 0 part
NVMe EBS ボリュームの操作
NVMe EBS ボリュームをフォーマットしてマウントするには、Linux で Amazon EBS ボリュームを使用できるようにするを参照してください。
Linux カーネル 4.2 以降を使用している場合は、NVMe EBS ボリュームのボリュームサイズを変更すると、自動的にインスタンスに反映されます。古い Linux カーネルの場合は、EBS ボリュームをデタッチしてアタッチするか、インスタンスを再起動してサイズ変更を反映させる必要があります。Linux カーネル 3.19 以降では、hdparm コマンドを次のように使用して NVMe デバイスの再スキャンを強制できます。
[ec2-user ~]$
sudo hdparm -z /dev/nvme
1
n1
NVMe EBS ボリュームをデタッチすると、インスタンスには、ボリュームをデタッチする前に、ファイルシステムのキャッシュまたはメタデータをフラッシュする機会が失われます。したがって、NVMe EBS ボリュームをデタッチする前に、まずそのボリュームを同期およびアンマウントする必要があります。ボリュームのデタッチに失敗した場合は、force-detach
の説明に従って Linux インスタンスから Amazon EBS ボリュームをデタッチします。 コマンドを試すことができます。
I/O オペレーションタイムアウト
Nitro ベースのインスタンスに接続された EBS ボリュームは、オペレーティングシステムによって提供されるデフォルトの NVMe ドライバーを使用します。ほとんどのオペレーティングシステムは、NVMe デバイスに送信される I/O オペレーションのタイムアウトを指定します。デフォルトのタイムアウトは 30 秒で、nvme_core.io_timeout
ブートパラメータを使用して変更できます。バージョン 4.6 より前の Linux カーネルでは、このパラメータは nvme.io_timeout
です。
I/O レイテンシーがこの timeout パラメータの値を超えると、Linux NVMe ドライバーは I/O に失敗し、ファイルシステムまたはアプリケーションにエラーを返します。I/O オペレーションに応じて、ファイルシステムまたはアプリケーションはエラーを再試行できます。場合によっては、ファイルシステムを読み取り専用として再マウントすることがあります。
Xen インスタンスに接続された EBS ボリュームに類似するエクスペリエンスのため、nvme_core.io_timeout
を可能な限り最大値に設定することをお勧めします。現在のカーネルでは、最大値は 4294967295 ですが、以前のカーネルでは最大値は 255 です。Linux のバージョンに応じて、タイムアウトはすでにサポートされる最大値に設定されていることがあります。例えば、Amazon Linux AMI 2017.09.01 以降では、デフォルトでタイムアウトが 4294967295 に設定されています。
Linux ディストリビューションの最大値を確認するには、示されている最大値よりも高い値を /sys/module/nvme_core/parameters/io_timeout
に書き込み、ファイルを保存する際に範囲外の数値結果
エラーがないかどうかをチェックします。
Abort
コマンド
Abort
コマンドは、以前にコントローラーに送信された特定のコマンドを中止するために発行される NVMe Admin コマンドです。このコマンドは、通常、I/O オペレーションのタイムアウトしきい値を超えたストレージデバイスに対して、デバイスドライバーによって発行されます。デフォルトで Abort
コマンドをサポートする Amazon EC2 インスタンスタイプは、Abort
コマンドの発行先であるアタッチされた Amazon EBS デバイスのコントローラーに以前に送信された特定のコマンドを中止します。
次のインスタンスタイプは、デフォルトで、アタッチされているすべての Amazon EBS ボリュームについて Abort
コマンドをサポートします: R5b
、R6i
、M6i
、M6a
、C6gn
、C6i
、X2gd
、X2iezn
、Im4gn
、Is4gen
。
他のインスタンスタイプは、アタッチされた Amazon EBS ボリュームに Abort
コマンドが発行されてもアクションを実行しません。
NVMe デバイスバージョン 1.4
以降の Amazon EBS デバイスは、Abort
コマンドをサポートしています。
詳細については、「NVM Express Base Specification