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

この記事では、Linux VM を再起動した後、またはデータ ディスクに再接続した後に、デバイス名が変更される理由について説明します。This article explains why device names change after you restart a Linux VM or reattach the data disks. 記事では、この問題の解決方法も示します。The article also provides solutions for this problem.

現象Symptoms

Microsoft Azure で Linux VM を実行する場合に、次の問題が発生する可能性があります。You may experience the following problems when running Linux VMs in Microsoft Azure:

  • 再起動後、VM が起動に失敗する。The VM fails to boot after a restart.
  • データ ディスクが切断されて再接続された場合は、ディスクのデバイス名が変更されます。When data disks are detached and reattached, the disk device names are changed.
  • デバイス名を使用してディスクを参照するアプリケーションやスクリプトは、デバイス名が変更されているため失敗します。An application or script that references a disk by using the device name fails because the device name has changed.

原因Cause

Linux のデバイス パスは、再起動前後の一貫性が保証されていません。Device paths in Linux aren't guaranteed to be consistent across restarts. デバイス名はメジャー番号 (文字) とマイナー番号で構成されています。Device names consist of major numbers (letters) and minor numbers. Linux ストレージ デバイス ドライバーは新しいデバイスを検出すると、メジャー番号とマイナー番号を利用可能な範囲からデバイスに割り当てます。When the Linux storage device driver detects a new device, the driver assigns major and minor numbers from the available range to the device. デバイスが削除されると、再利用できるようにデバイス番号が解放されます。When a device is removed, the device numbers are freed for reuse.

この問題は、Linux のデバイス スキャンが非同期で行われるように SCSI サブシステムでスケジュールされているために発生します。The problem occurs because device scanning in Linux is scheduled by the SCSI subsystem to happen asynchronously. その結果、デバイスのパス名は再起動の前後で変わることがあります。As a result, a device path name can vary across restarts.

解決策Solution

この問題を解決するには、永続的な名前付けを使用します。To resolve this problem, use persistent naming. 永続的な名前付けを行うには 4 つの方法があります。それは、ファイル システム ラベル、UUID、ID、パスのいずれかを利用する方法です。There are four ways to use persistent naming: by filesystem label, by UUID, by ID, or by path. Azure Linux VM には、ファイル システム ラベルまたは UUID の使用をお勧めします。We recommend using the filesystem label or UUID for Azure Linux VMs.

ほとんどのディストリビューションでは、fstab nofail または nobootwait パラメーターが提供されています。Most distributions provide the fstab nofail or nobootwait parameters. これらのパラメーターにより、起動時にディスクのマウントに失敗しても、システムを起動できます。These parameters enable a system to boot when the disk fails to mount at startup. これらのパラメーターについて詳しくは、ディストリビューションのドキュメントをご覧ください。Check your distribution documentation for more information about these parameters. データ ディスクの追加時に UUID を使用するように Linux VM を構成する方法について詳しくは、Linux VM に接続した新しいディスクのマウントに関するページをご覧ください。For information on how to configure a Linux VM to use a UUID when you add a data disk, see Connect to the Linux VM to mount the new disk.

Azure Linux エージェントが VM にインストールされている場合、エージェントは /dev/disk/azure パスにシンボリック リンクのセットを構築するために Udev ルールを使用します。When the Azure Linux agent is installed on a VM, the agent uses Udev rules to construct a set of symbolic links under the /dev/disk/azure path. アプリケーションとスクリプトは、VM にアタッチされているディスクと、ディスクの種類およびディスク LUN を識別するために Udev ルールを使用します。Applications and scripts use Udev rules to identify disks that are attached to the VM, along with the disk type and disk LUNs.

VM が起動せず、VM に SSH 接続できないように fstab を既に編集している場合、VM シリアル コンソールを使用してシングル ユーザー モードに入り、fstab を編集できます。If you have already edited your fstab in such a way that your VM is not booting and you are unable to SSH to your VM, you can use the VM Serial Console to enter single user mode and modify your fstab.

ディスク LUN の識別Identify disk LUNs

アプリケーションは、LUN を使用して、接続されているすべてのディスクを見つけ、シンボリック リンクを作成します。Applications use LUNs to find all of the attached disks and to construct symbolic links. Azure Linux エージェントには、LUN からデバイスへのシンボリック リンクを設定する Udev ルールが備わっています。The Azure Linux agent includes Udev rules that set up symbolic links from a LUN to the devices:

$ 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 情報が取得されます。LUN information from the Linux guest account is retrieved by using lsscsi or a similar tool:

  $ 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 サブスクリプション メタデータで使用されます。The guest LUN information is used with Azure subscription metadata to locate the VHD in Azure Storage that contains the partition data. たとえば、az CLI を使用できます。For example, you can use the 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 の検出Discover filesystem UUIDs by using blkid

アプリケーションやスクリプトは blkid の出力や類似の情報ソースを読み取り、/dev パスにシンボリック リンクを構築します。Applications and scripts read the output of blkid, or similar sources of information, to construct symbolic links in the /dev path. 出力は、VM に関連付けられているすべてのディスクおよびその関連デバイス ファイルの UUID を示しています。The output shows the UUIDs of all disks that are attached to the VM and their associated device file:

$ 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 パスにシンボリック リンクのセットを構築します。The Azure Linux agent Udev rules construct a set of symbolic links under the /dev/disk/azure path:

$ 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

アプリケーションでは、リンクを使用して、ブート ディスク デバイスとリソース (短期) ディスクを識別します。Applications use the links to identify the boot disk device and the resource (ephemeral) disk. Azure では、アプリケーションが /dev/disk/azure/root-part1 または /dev/disk/azure-resource-part1 パスを参照して、これらのパーティションを検出する必要があります。In Azure, applications should look in the /dev/disk/azure/root-part1 or /dev/disk/azure-resource-part1 paths to discover these partitions.

blkid リストにあるその他のパーティションは、データ ディスク上に存在します。Any additional partitions from the blkid list reside on a data disk. アプリケーションはこれらのパーティションの UUID を維持し、実行時にパスを使用してデバイス名を検出します。Applications maintain the UUID for these partitions and use a path to discover the device name at runtime:

$ 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 ルールを取得するGet the latest Azure Storage rules

最新の Azure Storage ルールを取得するには、次のコマンドを実行します。To get the latest Azure Storage rules, run the following commands:

# 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

関連項目See also

詳細については、次の記事を参照してください。For more information, see the following articles: