Amazon Elastic Compute Cloud
Linux インスタンス用ユーザーガイド

Amazon EBS と NVMe

Nitro ベースのインスタンスでは、EBS ボリュームは NVMe ブロックデバイスとして公開されます。デバイス名は、/dev/nvme0n1/dev/nvme1n1 などです。ブロックデバイスマッピングで指定したデバイス名は、NVMe デバイス名 (/dev/nvme[0-26]n1) を使用して名称変更されます。ブロックデバイスドライバでは、ブロックデバイスマッピングでボリュームに指定した順序とは異なる順序で NVMe デバイス名を割り当てることができます。

注記

Amazon EBS 製品の詳細」に示されている EBS のパフォーマンス安定性は、ブロックデバイスインターフェイスに関係なく有効です。

次の Nitro ベースのインスタンスでは、NVMe インスタンスストアボリュームをサポートしています: C5d、I3、F1、、M5d、p3dn.24xlarge、R5d、および z1d詳細については、「NVMe SSD ボリューム」を参照してください。

NVMe ドライバのインストールまたはアップグレード

以下の AMI には、必要な NVMe ドライバが含まれています。

NVMe ドライバが含まれない AMI を使用している場合は、次の手順でドライバをインスタンスにインストールします。

NVMe ドライバをインストールするには

  1. インスタンスに接続します。

  2. パッケージのキャッシュを更新し、必要なパッケージの更新を次のように取得します。

    • 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
  3. Ubuntu 16.04 以降には、linux-aws パッケージが含まれます。このパッケージには、Nitro ベースのインスタンスで必要な NVMe および ENA ドライバが含まれます。最新バージョンにするには、次のように linux-aws パッケージにアップグレードします。

    [ec2-user ~]$ sudo apt-get upgrade -y linux-aws

    Ubuntu 14.04 の場合は、次のように最新の linux-aws パッケージをインストールできます。

    [ec2-user ~]$ sudo apt-get install linux-aws
  4. インスタンスを再起動して、最新のカーネルバージョンを読み込みます。

    sudo reboot
  5. 再起動後にインスタンスに再接続します。

EBS デバイスの特定

EBS では、シングルルート I/O 仮想化 (SR-IOV) を使用して、NVMe 仕様を使用して Nitro ベースのインスタンスにボリュームの添付ファイルが提供します。これらのデバイスは、オペレーティングシステムの標準 NVMe ドライバーに依存しています。これらのドライバーは、通常、インスタンスの起動時に PCI バスをスキャンしてアタッチされたデバイスを検出し、デバイスがブロックデバイスマッピングでどのように指定されているかではなく、デバイスが応答する順序に基づいてデバイスノードを作成します。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 ルールを提供します。

  • NVMe に接続された EBS ボリュームには、EBS ボリューム ID がデバイス ID のシリアル番号として設定されています。

  • デバイスがフォーマットされると、ファイルシステムの存続期間中、存続する UUID が生成されます。デバイスラベルは同時に指定することができます。詳細については、「Linux で Amazon EBS ボリュームを使用可能にする」および「間違ったボリュームで起動する」を参照してください。

Amazon Linux AMI

AMI Amazon Linux 2017.09.01 以降 (Amazon Linux 2 を含む) では、次のように ebsnvme-id コマンドを実行して、NVMe デバイス名をボリューム ID とデバイス名にマップすることができます。

[ec2-user ~]$ sudo /sbin/ebsnvme-id /dev/nvme1n1 Volume ID: vol-01324f611e2463981 /dev/sdf

また、Amazon Linux はブロックデバイスマッピング (たとえば、/dev/sdf) 内のデバイス名から NVMe デバイス名へのシンボリックリンクを作成します。

その他の Linux AMI

カーネルバージョン 4.2 以降では、次のように nvme id-ctrl コマンドを実行して、NVMe デバイスをボリューム ID にマップすることができます。最初に、Linux ディストリビューションのパッケージ管理ツールを使用して、NVMe コマンドラインのパッケージ nvme-cli をインストールします。

次の例では、ボリューム ID やデバイス名を取得します。デバイス名は、NVMe コントローラベンダー固有の拡張子 (コントローラー ID のバイト 384:4095) を介して使用できます。

[ec2-user ~]$ sudo nvme id-ctrl -v /dev/nvme1n1 NVME 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 "/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/nvme1n1

NVMe EBS ボリュームをデタッチする前に、そのボリュームを同期およびアンマウントする必要があります。NVMe EBS ボリュームをデタッチすると、強制オプションが暗黙的に有効になります。したがって、インスタンスには、ボリュームをデタッチする前に、ファイルシステムのキャッシュまたはメタデータをフラッシュする機会が失われます。

I/O オペレーションタイムアウト

Nitro ベースのインスタンスに接続された EBS ボリュームは、オペレーティングシステムによって提供されるデフォルトの NVMe ドライバーを使用します。ほとんどのオペレーティングシステムは、NVMe デバイスに送信される I/O オペレーションのタイムアウトを指定します。 デフォルトのタイムアウトは 30 秒で、nvme_core.io_timeout ブートパラメータ (またはバージョン 4.6 以前の Linux カーネルの場合は nvme.io_timeout ブートパラメータ) を使用して変更できます。テストの目的で、好みのテキストエディタを使用して /sys/module/nvme_core/parameters/io_timeout に書き込むことによって、タイムアウトを動的に更新することもできます。I/O レイテンシーがこのパラメータの値を超えると、Linux NVMe ドライバーは I/O に失敗し、ファイルシステムまたはアプリケーションにエラーを返します。I/O オペレーションに応じて、ファイルシステムまたはアプリケーションはエラーを再試行できます。場合によっては、ファイルシステムを読み取り専用として再マウントすることがあります。

Xen インスタンスに接続された EBS ボリュームに似たエクスペリエンスでは、このタイムアウトを可能な限り最大値に設定することをお勧めします。現在のカーネルでは、最大値は 4294967295 ですが、以前のカーネルでは最大値は 255 です。nvme.io_timeout の起動パラメータは、次の Linux ディストリビューションの最大値に設定されています。

  • Amazon Linux AMI 2017.09.01 以降

  • Canonical 4.4.0-1041 以降

  • SLES 12 SP2 (4.4 カーネル) 以降

  • RHEL 7.5 (3.10.0-862 カーネル) 以降

Linux ディストリビューションの最大値を確認するには、示されている最大値よりも高い値を /sys/module/nvme_core/parameters/io_timeout に書き込み、ファイルの保存を試行する時に Numerical result out of range エラーをチェックします。