권장사항: Linux VM에서 영구 기기 이름 사용


이 문서에서는 Linux VM에서 영구 기기 이름 지정을 사용하는 방법을 설명합니다.

Linux 운영체제를 사용하는 VM의 경우 다음과 같은 절차를 수행하면 /dev/sda와 같이 기기 이름을 변경할 수 있습니다.

  • VM 시작 및 중지
  • 디스크 분리 및 재연결
  • 머신 유형 변경

이러한 기기 이름 변경은 VM이 시작되거나 장치가 연결되면 사용 가능한 범위에서 기기 이름이 할당되기 때문에 발생합니다. 기기를 분리하거나 VM을 중지하면 기기 이름이 확보됩니다. 기기가 다시 연결되거나 VM이 다시 시작되면 사용 가능한 범위에서 새 기기 이름이 할당됩니다. Linux 커널은 재부팅 시 기기 순서를 보장하지 않습니다.

기기 이름을 변경하면 원래 기기 이름을 사용하는 애플리케이션이나 스크립트가 제대로 작동하지 않거나 VM을 다시 시작한 후에 부팅되지 않을 수 있습니다.

Linux VM의 디스크와 파티션을 참조할 때 이 문제를 방지하려면 영구 기기 이름 지정을 사용하는 것이 좋습니다. symlink를 사용할 수도 있습니다.

시작하기 전에

  • Linux 운영체제의 기기 관리를 검토합니다.
  • 아직 인증을 설정하지 않았다면 설정합니다. 인증은 Google Cloud 서비스 및 API에 액세스하기 위해 ID를 확인하는 프로세스입니다. 로컬 개발 환경에서 코드 또는 샘플을 실행하려면 다음과 같이 Compute Engine에 인증하면 됩니다.

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. Google Cloud CLI를 설치한 후 다음 명령어를 실행하여 초기화합니다.

      gcloud init
    2. Set a default region and zone.

Linux VM에서 기기 이름 지정

VM에 연결된 디스크의 Linux 기기 이름은 디스크를 만들 때 선택한 인터페이스에 따라 달라집니다. lsblk 운영체제 명령어를 사용하여 디스크 기기를 볼 때는 NVMe 인터페이스에 연결된 디스크의 프리픽스가 nvme로 표시되고 SCSI 인터페이스에 연결된 디스크의 프리픽스는 sd로 표시됩니다.

디스크 번호 또는 NVMe 컨트롤러의 순서는 VM 다시 시작 시 예측할 수 없으며 일관되지 않습니다. 처음 부팅할 때 영구 디스크는 nvme0n1(또는 SCSI의 경우 sda)일 수 있습니다. 두 번째로 부팅할 때 같은 영구 디스크의 기기 이름은 nvme2n1 또는 nvme0n3(또는 SCSI의 경우 sdc)일 수 있습니다.

연결된 디스크에 액세스할 때는 /dev/disk/by-id/에서 만든 심볼릭 링크를 대신 사용해야 합니다. 이러한 이름은 재부팅 후에도 지속됩니다. 심볼릭 링크에 대한 자세한 내용은 VM에 연결된 디스크의 심볼릭 링크를 참조하세요.

SCSI 기기 이름

SCSI 연결 디스크 기기의 형식은 첫 번째 연결된 디스크의 경우 sda입니다. 디스크 파티션은 sda1로 표시됩니다. 각 추가 디스크에는 sdbsdc와 같은 순차 문자가 사용됩니다. sdz에 도달하면 다음으로 추가되는 디스크는 sdaa, sdab, sdac와 같은 이름이 최대 sddx까지 지정됩니다.

NVMe 기기 이름

Linux 운영체제의 NVMe 연결 디스크 기기 형식은 nvmenumbernnamespace입니다. number는 NVMe 디스크 컨트롤러 번호를 나타내고 namespace는 NVMe 디스크 컨트롤러에서 할당한 NVMe 네임스페이스 ID입니다. 파티션의 경우 pn이 기기 이름에 추가됩니다. 여기서 n은 1부터 시작하는 숫자로, n번째 파티션을 나타냅니다.

컨트롤러 번호는 0부터 시작합니다. 컴퓨팅 인스턴스에 연결된 단일 NVMe 디스크의 기기 이름은 nvme0n1입니다. 대부분의 머신 유형에서는 단일 NVMe 디스크 컨트롤러를 사용합니다. NVMe 기기 이름은 nvme0n1, nvme0n2, nvme0n3 등으로 지정됩니다.

3세대 머신 시리즈 이상 인스턴스에 연결된 로컬 SSD 디스크에는 디스크마다 별도의 NVMe 컨트롤러가 있습니다. 이러한 VM에서 로컬 SSD NVMe 연결 기기 이름은 nvme0n1, nvme1n1, nvme2n1과 유사합니다. 연결된 로컬 SSD 디스크 수는 VM 머신 유형에 따라 다릅니다.

3세대 머신 시리즈 이상을 기반으로 하는 컴퓨팅 인스턴스는 Persistent Disk, Google Cloud Hyperdisk, 로컬 SSD 디스크 모두에 NVMe를 사용합니다. VM마다 Persistent Disk 및 하이퍼디스크용으로 NVMe 컨트롤러 1개와 각 로컬 SSD 디스크용으로 NVMe 컨트롤러 1개가 있습니다. Persistent Disk 및 하이퍼디스크 NVMe 컨트롤러에는 연결된 모든 디스크에 대한 단일 NVMe 네임스페이스가 있습니다. 따라서 Persistent Disk 1개와 하이퍼디스크 1개(각각 파티션 2개), 포맷되지 않은 로컬 SSD 디스크 2개가 있는 3세대 머신 시리즈 인스턴스는 다음 기기 이름을 사용합니다.

  • nvme0n1 - Persistent Disk
  • nvme0n1p1
  • nvme0n1p2
  • nvme0n2 - 하이퍼디스크
  • nvme0n2p1
  • nvme0n2p2
  • nvme1n1 - 첫 번째 로컬 SSD
  • nvme2n1 - 두 번째 로컬 SSD

영구 기기 이름 지정 사용

영구 기기 이름을 구성하려면 fstab 파일에 디스크 기기의 마운트 지점 이름을 할당합니다. 영구 기기 이름을 구성하는 방법에는 세 가지가 있습니다.

  • 라벨을 사용합니다. 이 옵션을 사용하려면 파일 시스템에서 라벨을 지원하고 디스크 파티션에 라벨을 추가해야 합니다.
  • 파티션 또는 디스크 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