Linux インスタンスの Amazon EBS および NVMe - Amazon Elastic Compute Cloud

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

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

Amazon EBS 製品の詳細に記載されている 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 ドライバーがある場合は、次の手順を使用してドライバーを最新バージョンに更新できます。

  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 install --only-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 ドライバーに依存しています。これらのドライバーは、通常、インスタンスのブート時にアタッチ済みのデバイスを検出し、そのデバイスがブロックデバイスマッピングでどのように指定されているかではなく、デバイスが応答する順序に基づいてデバイスノードを作成します。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 ルールを提供します。

  • 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/nvme0n1 -uコマンドを使用して、一貫した NVMe デバイス名を指定します。その他のディストリビューションではsudo nvme id-ctrl -v /dev/nvme0n1コマンドを使用して NVMe デバイス名を指定します。

  • デバイスがフォーマットされると、ファイルシステムの存続期間中、存続する 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/nvme0n1 Volume ID: vol-01324f611e2463981 sda

次の例は、インスタンスの起動後にアタッチされたボリュームのコマンドと出力を示しています。NVMe デバイス名に、/dev/プレフィクスが含まれることに注意してください。

[ec2-user ~]$ sudo /sbin/ebsnvme-id /dev/nvme1n1 Volume 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/nvme0n1 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 "sda..."

次の例では、インスタンスの起動後にアタッチされたボリュームのボリューム ID と NVMe デバイス名を取得します。 NVMe デバイス名には、/dev/プレフィクスが含まれることに注意してください。

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

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 コマンドをサポートします: R5bR6iM6iM6aC6gnC6iX2gdX2ieznIm4gnIs4gen

他のインスタンスタイプは、アタッチされた Amazon EBS ボリュームに Abort コマンドが発行されてもアクションを実行しません。

NVMe デバイスバージョン 1.4 以降の Amazon EBS デバイスは、Abort コマンドをサポートしています。

詳細については、「NVM Express Base Specification」(NVM Express の基本仕様) のセクション 5.1「Abort command」(中止コマンド) を参照してください。