ベスト プラクティス: Linux VM で永続デバイス名を使用する


このドキュメントでは、Linux VM で永続的なデバイス命名規則を使用する方法について説明します。

Linux オペレーティング システムを使用する VM の場合、次のような手順を行うとデバイス名(/dev/sda など)が変更される場合があります。

  • VM の起動と停止
  • ディスクの切断と再アタッチ
  • マシンタイプの変更

VM の起動時またはデバイスのアタッチ時に使用可能な範囲からデバイス名が割り当てられるため、このデバイス名の変更が起こります。デバイスのアタッチを解除するか、VM を停止すると、デバイス名が解放されます。デバイスが再アタッチされるか、VM が再起動されると、使用可能な範囲から新しいデバイス名が割り当てられます。Linux カーネルでは、再起動ごとのデバイスの順序が保証されません。

デバイス名の変更によって、元のデバイス名に依存するアプリケーションやスクリプトが正常に動作しなくなる場合や、再起動後に VM が起動しない場合があります。

この問題を回避するため、Linux VM 上のディスクやパーティションを参照する場合は、永続的なデバイス命名規則を使用することをおすすめします。シンボリック リンクを使用することもできます。

始める前に

  • Linux オペレーティング システムのデバイス管理について、次の点を確認します。
  • まだ設定していない場合は、認証を設定します。認証とは、Google Cloud サービスと API にアクセスするために ID を確認するプロセスです。ローカル開発環境からコードまたはサンプルを実行するには、次のように Compute Engine に対する認証を行います。

    このページのサンプルをどのように使うかに応じて、タブを選択してください。

    コンソール

    Google Cloud コンソールを使用して Google Cloud サービスと API にアクセスする場合、認証を設定する必要はありません。

    gcloud

    1. Google Cloud CLI をインストールし、次のコマンドを実行して初期化します。

      gcloud init
    2. デフォルトのリージョンとゾーンを設定します

Linux VM でのデバイスの命名

VM にアタッチされているディスクの Linux デバイス名は、ディスクの作成時に選択したインターフェースによって異なります。lsblk オペレーティング システム コマンドを使用してディスク デバイスを表示すると、NVMe インターフェースにアタッチされているディスクの接頭辞 nvme と、SCSI インターフェースにアタッチされているディスクの接頭辞 sd が表示されます。

ディスク番号や NVMe コントローラの順序は、VM を再起動しても予測不可能であり、整合性がありません。初回起動時に永続ディスクは nvme0n1(SCSI の場合は sda)になります。2 回目の起動時、同じ永続ディスクのデバイス名は nvme2n1 または nvme0n3(SCSI の場合は sdc)になります。

アタッチされているディスクにアクセスする際は、代わりに /dev/disk/by-id/ で作成したシンボリック リンクを使用する必要があります。これらの名前は再起動後も維持されます。シンボリック リンクの詳細については、VM にアタッチされているディスクのシンボリック リンクをご覧ください。

SCSI デバイス名

SCSI ディスクがアタッチされたデバイスの形式は、最初にアタッチされたディスクでは sda となります。ディスク パーティションは sda1 と表示されます。追加するディスクごとに、sdbsdc などの連続した文字が使用されます。sdz に達すると、次に追加されるディスクの名前は、sdaasdabsdac のようになり、最大 sddx まで続きます。

NVMe デバイス名

Linux オペレーティング システムで NVMe ディスクがアタッチされたデバイスの形式は、nvmenumbernnamespace となります。number は、NVMe ディスク コントローラ番号を表します。namespace は、NVMe ディスク コントローラによって割り当てられた NVMe 名前空間 ID です。パーティションの場合、p n がデバイス名に追加されます。n は、n 番目のパーティションを示す 1 から始まる数字です。

コントローラ番号は 0 から始まります。コンピューティング インスタンスにアタッチされた単一の NVMe ディスクのデバイス名は nvme0n1 です。ほとんどのマシンタイプでは、単一の NVMe ディスク コントローラが使用されます。NVMe デバイス名は nvme0n1nvme0n2nvme0n3 のようになります。

第 3 世代のマシンシリーズ以降のインスタンスにアタッチされたローカル SSD ディスクには、ディスクごとに個別の NVMe コントローラがあります。これらの VM では、ローカル SSD NVMe 接続デバイス名は nvme0n1nvme1n1nvme2n1 のようになります。アタッチされるローカル SSD ディスクの数は、VM のマシンタイプによって異なります。

第 3 世代以降のマシンシリーズに基づく Compute インスタンスは、Persistent Disk と Google Cloud Hyperdisk の両方とローカル SSD ディスクに NVMe を使用します。各 VM には、Persistent Disk と Hyperdisk 用に 1 つの NVMe コントローラと、各ローカル SSD ディスク用に 1 つの NVMe コントローラがあります。Persistent Disk と Hyperdisk NVMe コントローラは、アタッチされているすべてのディスクに対して単一の NVMe 名前空間を持ちます。そのため、1 つの Persistent Disk、1 つの Hyperdisk(それぞれ 2 つのパーティション)、2 つの未フォーマットのローカル SSD ディスクを備えた第 3 世代のマシンシリーズ インスタンスでは、次のデバイス名を使用します。

  • nvme0n1 - Persistent Disk
  • nvme0n1p1
  • nvme0n1p2
  • nvme0n2 - Hyperdisk
  • nvme0n2p1
  • nvme0n2p2
  • nvme1n1 - 最初のローカル SSD
  • nvme2n1 - 2 番目のローカル SSD

永続的なデバイス命名規則を使用する

永続デバイス名を構成するには、fstab ファイルでディスク デバイスのマウント ポイント名を割り当てます。永続デバイス名を構成するには、次の 3 つの方法があります。

  • ラベルを使用する。このオプションを使用するには、ファイル システムがラベルをサポートしていること、またディスク パーティションにラベルを追加することが必要です。
  • パーティションまたはディスクの UUID を使用する。UUID は、パーティション テーブルを使用してディスクが作成されるときに生成され、その UUID はパーティションごとに一意です。
  • Persistent Disk または Google Cloud Hyperdisk の永続ディスク ID(/dev/disk/by-id)、またはディスクのリソース名に基づくシンボリック リンクを使用する。

Linux VM には、パーティション UUID またはシンボリック リンクを使用することをおすすめします。

パーティション UUID

ディスクの UUID を確認するには、次の操作を行います。

  1. VM に接続します。
  2. ディスクのデバイス名がわからない場合は、シンボリック リンクを使用してディスク デバイス名を確認できます。

    ls -l /dev/disk/by-id/google-*
    

    出力は次のようになります。

      lrwxrwxrwx 1 root root  9 Oct 23 15:58 /dev/disk/by-id/google-my-vm -> ../../sda
      lrwxrwxrwx 1 root root 10 Oct 23 15:58 /dev/disk/by-id/google-my-vm-part1 -> ../../sda1
      lrwxrwxrwx 1 root root 11 Oct 23 15:58 /dev/disk/by-id/google-my-vm-part15 -> ../../sda15
      lrwxrwxrwx 1 root root  9 Oct 23 15:58 /dev/disk/by-id/google-my-vm-app-data -> ../../nvme0n1
      

  3. 次のいずれかのコマンドを実行して、ディスクのパーティションの UUID を取得します。

    • blkid

      sudo  blkid -s UUID
      

      出力は次のようになります。

      /dev/sda1: UUID="4f570f2d-fffe-4c7d-8d8f-af347af7612a"
      /dev/sda15: UUID="E0B2-DFAF"
      /dev/nvme0n1: UUID="9e617251-6a92-45ff-ba40-700a9bdeb03e"
      
    • ls -l

      sudo ls -l /dev/disk/by-uuid/
      

      出力は次のようになります。

      lrwxrwxrwx 1 root root 10 Sep 22 18:12 4f570f2d-fffe-4c7d-8d8f-af347af7612a -> ../../sda1
      lrwxrwxrwx 1 root root 13 Sep 22 18:15 9e617251-6a92-45ff-ba40-700a9bdeb03e -> ../../nvme0n1
      lrwxrwxrwx 1 root root 11 Sep 22 18:12 E0B2-DFAF -> ../../sda15
      
  4. /etc/fstab ファイルにデバイスの UUID のエントリを追加します。

    UUID=9e617251-6a92-45ff-ba40-700a9bdeb03e /data ext4 defaults 0 0
    

    この例では、/data はマウント ポイント、ext4 はファイル システムの種類です。

  5. mount -av を実行して、デバイスが正しくマウントされていることを確認します。

    sudo mount -av

    デバイスが正常にマウントされていると、出力は次のようになります。

    /                           : ignored
    /boot/efi                : already mounted
    mount: /data does not contain SELinux labels.
    You just mounted an file system that supports labels which does not
    contain labels, onto an SELinux box. It is likely that confine
    applications will generate AVC messages and not be allowed access to
    this filesystem.  For more details see restorecon(8) and mount(8).
    /data                    : successfully mounted
    

永続ディスク ID

永続ディスク ID またはシンボリック リンクを使用してディスク デバイス名を確認するには、次の手順を完了します。

  1. VM に接続します。
  2. 次のコマンドを実行して、ディスクの ID を取得します。

    sudo  ls -lh /dev/disk/by-id/google-*

    出力は次のようになります。

    lrwxrwxrwx. 1 root root  9 May 16 17:34 google-disk-2 -> ../../sdb
    lrwxrwxrwx. 1 root root  9 May 16 09:09 google-persistent-disk-0 -> ../../sda
    lrwxrwxrwx. 1 root root 10 May 16 09:09 google-persistent-disk-0-part1 -> ../../sda1
    lrwxrwxrwx. 1 root root 10 May 16 09:09 google-persistent-disk-0-part2 -> ../../sda2
    

    NVME ディスクの場合、出力は次のようになります。

    lrwxrwxrwx 1 root root 13 Jun  1 10:27 google-disk-3 -> ../../nvme0n2
    lrwxrwxrwx 1 root root 13 Jun  1 10:25 google-t2a -> ../../nvme0n1
    lrwxrwxrwx 1 root root 15 Jun  1 10:25 google-t2a-part1 -> ../../nvme0n1p1
    lrwxrwxrwx 1 root root 16 Jun  1 10:25 google-t2a-part15 -> ../../nvme0n1p15
    
  3. /etc/fstab ファイルにシンボリック リンクを追加します。

    /dev/disk/by-id/google-disk-2 /data ext4 defaults 0 0
    
  4. mount -av を実行して、デバイスが正しくマウントされていることを確認します。

    sudo mount -av

    デバイスが正常にマウントされていると、出力は次のようになります。

    /                           : ignored
    /boot/efi                : already mounted
    mount: /data does not contain SELinux labels.
    You just mounted an file system that supports labels which does
    not contain labels, onto an SELinux box. It is likely that confine
    applications will generate AVC messages and not be allowed access to this
    file system.  For more details see restorecon(8) and mount(8).
    /data                    : successfully mounted