Linux VM デバイス名の変更トラブルシューティング

適用対象: ✔️ Linux VM

この記事では、Linux VM を再起動した後、またはデータ ディスクに再接続した後に、デバイス名が変更される理由について説明します。 記事では、この問題の解決方法も示します。

現象

Microsoft Azure で Linux VM を実行する場合に、次の問題が発生する可能性があります。

  • 再起動後、VM が起動に失敗する。
  • データ ディスクが切断されて再接続された場合は、ディスクのデバイス名が変更されます。
  • デバイス名を使用してディスクを参照するアプリケーションやスクリプトは、デバイス名が変更されているため失敗します。

原因

Linux のデバイス パスは、再起動前後の一貫性が保証されていません。 デバイス名はメジャー番号 (文字) とマイナー番号で構成されています。 Linux ストレージ デバイス ドライバーは新しいデバイスを検出すると、メジャー番号とマイナー番号を利用可能な範囲からデバイスに割り当てます。 デバイスが削除されると、再利用できるようにデバイス番号が解放されます。

この問題は、Linux のデバイス スキャンが非同期で行われるように SCSI サブシステムでスケジュールされているために発生します。 その結果、デバイスのパス名は再起動の前後で変わることがあります。

解決策

この問題を解決するには、再起動後も永続的なデバイス名を使用します。 永続的な名前付けには、ファイルシステム ラベル、UUID、派生デバイス パスなど、いくつかの方法があります。 論理ボリューム マネージャー (LVM) を使用しない Linux VM の場合は、ファイル システムの UUID または udev ルールを使用して作成された リンクを使用することをお勧めします。 LVM ベースのファイルシステムの場合、物理ボリュームの順序に関係なく LVM オブジェクトの一貫性が維持されるため、ボリューム グループと論理ボリューム名を使用したマウントも有効なアプローチです。

ほとんどのディストリビューションでは、fstabnofail または nobootwait パラメーターが提供されています。 これらのパラメーターにより、起動時にディスクのマウントに失敗しても、システムを起動できます。 これらのパラメーターについて詳しくは、ディストリビューションのドキュメントをご覧ください。 データ ディスクの追加時に UUID を使用するように Linux VM を構成する方法について詳しくは、Linux VM に接続した新しいディスクのマウントに関するページをご覧ください。

VM が起動しない方法で fstab を既に編集していて、VM に SSH 接続できない場合は、VM シリアル コンソールを使用してsingle-user モードに入り fstab を変更するか、Azure Linux Auto Repair を使用して修復プロセスを自動化できます。

ディスク LUN の識別

Azure Linux エージェントが VM にインストールされている場合、エージェントは udev ルールを使用して、 /dev/disk/azure パスの下にシンボリック リンクのセットを構築します。このパスは、Azure で定義された LUN の添付ファイルを従来のディスク デバイスに関連付けます。

$ tree /dev/disk/azure

/dev/disk/azure
├── resource -> ../../sdb
├── resource-part1 -> ../../sdb1
├── root -> ../../sda
├── root-part1 -> ../../sda1
└── scsi1
    ├── lun0 -> ../../../sdc
    ├── lun0-part1 -> ../../../sdc1
    ├── lun1 -> ../../../sdd
    ├── lun1-part1 -> ../../../sdd1
    ├── lun1-part2 -> ../../../sdd2
    └── lun1-part3 -> ../../../sdd3

lsscsi または同様のツールを使用して、Linux ゲスト アカウントから LUN 情報が取得されます。

$ sudo lsscsi

[1:0:0:0] cd/dvd Msft Virtual CD/ROM 1.0 /dev/sr0

[2:0:0:0] disk Msft Virtual Disk 1.0 /dev/sda

[3:0:1:0] disk Msft Virtual Disk 1.0 /dev/sdb

[5:0:0:0] disk Msft Virtual Disk 1.0 /dev/sdc

[5:0:0:1] disk Msft Virtual Disk 1.0 /dev/sdd

ゲスト LUN 情報は、パーティション データを含む Azure Storage の VHD を特定するために Azure サブスクリプション メタデータで使用されます。 たとえば、az CLI を使用できます。

$ az vm show --resource-group testVM --name testVM | jq -r .storageProfile.dataDisks
[
{
"caching": "None",
  "createOption": "empty",
"diskSizeGb": 1023,
  "image": null,
"lun": 0,
"managedDisk": null,
"name": "testVM-20170619-114353",
"vhd": {
  "uri": "https://testVM.blob.core.windows.net/vhd/testVM-20170619-114353.vhd"
}
},
{
"caching": "None",
"createOption": "empty",
"diskSizeGb": 512,
"image": null,
"lun": 1,
"managedDisk": null,
"name": "testVM-20170619-121516",
"vhd": {
  "uri": "https://testVM.blob.core.windows.net/vhd/testVM-20170619-121516.vhd"
  }
  }
]

blkid を使用したファイルシステム UUID の検出

アプリケーションやスクリプトは blkid の出力や類似の情報ソースを読み取り、/dev パスにシンボリック リンクを構築します。 出力は、VM に関連付けられているすべてのディスクおよびその関連デバイス ファイルの UUID を示しています。

$ sudo blkid -s UUID

/dev/sr0: UUID="120B021372645f72"
/dev/sda1: UUID="52c6959b-79b0-4bdd-8ed6-71e0ba782fb4"
/dev/sdb1: UUID="176250df-9c7c-436f-94e4-d13f9bdea744"
/dev/sdc1: UUID="b0048738-4ecc-4837-9793-49ce296d2692"

Azure Linux エージェント Udev ルールは、/dev/disk/azure パスにシンボリック リンクのセットを構築します。

$ ls -l /dev/disk/azure

total 0
lrwxrwxrwx 1 root root  9 Jun  2 23:17 resource -> ../../sdb
lrwxrwxrwx 1 root root 10 Jun  2 23:17 resource-part1 -> ../../sdb1
lrwxrwxrwx 1 root root  9 Jun  2 23:17 root -> ../../sda
lrwxrwxrwx 1 root root 10 Jun  2 23:17 root-part1 -> ../../sda1

アプリケーションでは、リンクを使用して、ブート ディスク デバイスとリソース (短期) ディスクを識別します。 Azure では、アプリケーションが /dev/disk/azure/root-part1 または /dev/disk/azure-resource-part1 パスを参照して、これらのパーティションを検出する必要があります。

blkid リストにあるその他のパーティションは、データ ディスク上に存在します。 アプリケーションはこれらのパーティションの UUID を維持し、実行時にパスを使用してデバイス名を検出します。

$ ls -l /dev/disk/by-uuid/b0048738-4ecc-4837-9793-49ce296d2692

lrwxrwxrwx 1 root root 10 Jun 19 15:57 /dev/disk/by-uuid/b0048738-4ecc-4837-9793-49ce296d2692 -> ../../sdc1

最新の Azure Storage ルールを取得する

最新の Azure Storage ルールを取得するには、次のコマンドを実行します。

# sudo curl -o /etc/udev/rules.d/66-azure-storage.rules https://raw.githubusercontent.com/Azure/WALinuxAgent/master/config/66-azure-storage.rules
# sudo udevadm trigger --subsystem-match=block

関連項目

詳細については、次の記事をご覧ください。

お問い合わせはこちらから

質問がある場合やヘルプが必要な場合は、サポート要求を作成するか、Azure コミュニティ サポートにお問い合わせください。 Azure フィードバック コミュニティに製品フィードバックを送信することもできます。