Linux VM 디바이스 이름 변경 문제 해결

이 문서에서는 Linux VM을 다시 시작하거나 데이터 디스크를 다시 연결한 후 디바이스 이름이 변경되는 이유를 설명합니다. 이 문서에서는 이 문제에 대한 해결 방법도 제공합니다.

증상

Microsoft Azure에서 Linux VM을 실행할 때 다음과 같은 문제가 발생할 수 있습니다.

  • 다시 시작한 후 VM이 부팅되지 않습니다.
  • 데이터 디스크를 분리하고 다시 연결하면 디스크 디바이스 이름이 변경됩니다.
  • 디바이스 이름이 변경되어 디바이스 이름을 사용하여 디스크를 참조하는 애플리케이션 또는 스크립트가 실패합니다.

원인

Linux의 디바이스 경로는 다시 시작 시 일관성이 보장되지 않습니다. 디바이스 이름은 주 숫자(문자) 및 부 번호로 구성됩니다. Linux 스토리지 디바이스 드라이버가 새 디바이스를 검색하면 드라이버는 사용 가능한 범위의 주 및 부 번호를 디바이스에 할당합니다. 디바이스가 제거되면 다시 사용할 수 있는 디바이스 번호가 해제됩니다.

Linux의 디바이스 검사가 SCSI 하위 시스템에 의해 비동기적으로 수행되도록 예약되어 있기 때문에 문제가 발생합니다. 따라서 디바이스 경로 이름은 다시 시작에 따라 달라질 수 있습니다.

해결 방법

이 문제를 resolve 영구 명명을 사용합니다. 영구 명명을 사용하는 방법에는 파일 시스템 레이블, UUID, ID 또는 경로별 네 가지 방법이 있습니다. Azure Linux VM용 파일 시스템 레이블 또는 UUID를 사용하는 것이 좋습니다.

대부분의 분포는 nofail 또는 nobootwait 매개 변수를 제공합니다fstab. 이러한 매개 변수를 사용하면 시작 시 디스크가 탑재되지 않을 때 시스템을 부팅할 수 있습니다. 이러한 매개 변수에 대한 자세한 내용은 배포 설명서를 확인하세요. 데이터 디스크를 추가할 때 UUID를 사용하도록 Linux VM을 구성하는 방법에 대한 자세한 내용은 Linux VM에 연결하여 새 디스크를 탑재를 참조하세요.

Azure Linux 에이전트가 VM에 설치되면 에이전트는 Udev 규칙을 사용하여 /dev/disk/azure 경로 아래에 기호 링크 집합을 생성합니다. 애플리케이션 및 스크립트는 Udev 규칙을 사용하여 디스크 유형 및 디스크 LUN과 함께 VM에 연결된 디스크를 식별합니다.

VM이 부팅되지 않고 VM에 SSH할 수 없는 방식으로 fstab을 이미 편집한 경우 VM 직렬 콘솔 을 사용하여 단일 사용자 모드 로 전환하고 fstab을 수정할 수 있습니다.

디스크 LUN 식별

애플리케이션은 LUN을 사용하여 연결된 모든 디스크를 찾고 기호 링크를 생성합니다. Azure Linux 에이전트에는 LUN에서 디바이스로의 기호 링크를 설정하는 Udev 규칙이 포함되어 있습니다.

$ 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

Linux 게스트 계정의 LUN 정보는 또는 유사한 도구를 사용하여 lsscsi 검색됩니다.

$ 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 구독 메타데이터와 함께 사용하여 파티션 데이터가 포함된 Azure Storage에서 VHD를 찾습니다. 예를 들어 CLI를 사용할 수 있습니다.az

$ 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 검색

애플리케이션 및 스크립트는 /dev 경로에서 blkid기호 링크를 생성하기 위해 또는 유사한 정보 원본의 출력을 읽습니다. 출력은 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 피드백 커뮤니티에 제품 피드백을 제출할 수도 있습니다.