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

Linux インスタンスの Amazon EBS および NVMe

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

注記

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

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

NVMe ボリュームにアクセスするには、NVMe ドライバーをインストールする必要があります。インスタンスは、NVMe ボリュームの種類である NVMe EBS ボリュームや NVMe インスタンスストアボリューム、または NVMe ボリュームではないものをサポートできます。詳細については、「ネットワーキング機能とストレージ機能の概要」を参照してください。

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

  • Amazon Linux 2

  • Amazon Linux AMI 2018.03

  • Ubuntu 14.04 以降

  • Red Hat Enterprise Linux 7.4 以降

  • SUSE Linux Enterprise Server 12 SP2 以降

  • CentOS 7 以降

  • FreeBSD 11.1 以降

Windows インスタンスの NVMe ドライバーの詳細については、Windows インスタンスの Amazon EC2 ユーザーガイド の「Amazon EBS および Windows インスタンス」を参照してください。

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 ボリュームをアタッチしているとき、または AttachVolumeRunInstances 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 ボリュームをデタッチする前に、まずそのボリュームを同期およびアンマウントする必要があります。ボリュームのデタッチに失敗した場合は、「インスタンスからの Amazon EBS ボリュームのデタッチ」の説明に従って force-detach コマンドを試すことができます。

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 に書き込み、ファイルを保存する際に範囲外の数値結果エラーがないかどうかをチェックします。