ベスト プラクティス: 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. デフォルトのリージョンとゾーンを設定します

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

永続デバイス名を構成するには、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