Linux 스크립트가 가상 머신에서 실행되고 있음을 감지하도록 하는 방법

게시 됨: 2022-06-27
두 손, 하나는 빨간 약을, 다른 하나는 파란 약을 들고 있습니다.
diy13/Shutterstock.com

가상 머신은 운영 체제가 실제 하드웨어에서 실행되고 있음을 확신시키기 위해 정말 열심히 노력합니다. 컴퓨터가 물리적인지 가상인지 Linux 명령줄에서 알 수 있습니까?

가상 머신 및 하이퍼바이저

전통적인 컴퓨터는 물리적 개체입니다. 운영 체제를 로드하고, 응용 프로그램을 설치하고, 실행하고, 사용할 수 있도록 서로 연결되고 볼트로 고정된 다양한 하드웨어 조각 모음입니다.

하드웨어가 비쌉니다. 물리적 컴퓨터당 하나의 운영 체제로 제한된다는 것은 여러 운영 체제를 실행하는 데 드는 비용이 곧 어마어마해짐을 의미합니다. 더 나은 솔루션은 단일 물리적 컴퓨터에서 동시에 여러 운영 체제를 실행할 수 있도록 하는 것입니다. 각 컴퓨터는 고유한 하드웨어에서 실행되고 있다고 생각합니다.

가상 머신 하이퍼바이저란 무엇입니까?
관련 가상 머신 하이퍼바이저란 무엇입니까?

하이퍼바이저는 이것을 가능하게 합니다. 가상 머신 관리자 또는 가상 머신 모니터라고도 하는 하이퍼바이저는 가상 머신을 생성할 수 있는 소프트웨어입니다. 이들은 동일한 물리적 호스트에서 실행되지만 하드 드라이브 공간, 메모리 및 CPU 코어를 공유하는 개별 물리적 컴퓨터인 것처럼 작동합니다.

물론 호스트 컴퓨터는 가상 머신 컬렉션의 요구 사항을 처리할 수 있을 만큼 강력해야 하지만 호스트에 충분한 RAM과 처리 능력이 있다면 가상 머신은 거의 베어 메탈 속도로 실행할 수 있습니다.

2007년 2.6.20 커널 릴리스 이후 Linux 에는 커널 기반 가상 머신 지원이 바로 포함되어 있습니다. Linux에는 VirtualBox, GNOME Boxes 및 QEMU-KVM과 같은 여러 하이퍼바이저를 사용할 수 있습니다. 그들은 Linux의 기본 KVM 기능을 사용하며 가상 머신의 스냅샷을 찍을 수 있는 것과 같은 기능과 사용자 인터페이스를 추가하여 기본 커널 기능을 기반으로 합니다.

가상 머신은 비용 절감, 효율성, 단순화된 배포 및 올바르게 프로비저닝된 보안 이점을 제공합니다. 또한 확장성을 용이하게 합니다. 서비스에 대한 수요가 증가하면 새 서버를 자동으로 가동하고 수요가 감소하면 종료할 수 있습니다. 따라서 클라우드와 온프레미스 인프라 모두에서 매우 인기가 있습니다.

아마도 Linux 서버를 원격으로 관리하고 있고 그것이 가상 머신인지 아니면 물리적인 박스인지 알아야 할 것입니다. 또는 실행 중인 플랫폼 유형을 알아야 하는 스크립트가 있습니다. 다음은 작업 중인 컴퓨터가 실제 컴퓨터인지 가상 컴퓨터인지 감지할 수 있는 몇 가지 방법입니다.

dmidecode 명령

dmidecode 명령은 많은 옵션과 수정자를 지원합니다. DMI(Desktop Management Interface) 테이블을 조회하고 터미널 창에 정보를 인쇄합니다.

Linux 터미널에서 컴퓨터의 장치를 나열하는 방법
관련 Linux 터미널에서 컴퓨터의 장치를 나열하는 방법

-s (단일 문자열 표시) 옵션과 함께 사용하고 시스템 제품 이름을 묻습니다. sudo 를 사용해야 합니다.

Ubuntu 22.04를 실행하는 VirtualBox VM에서 명령을 실행합니다.

 sudo dmidecode -s 시스템 제품 이름 

VirtualBox VM을 올바르게 식별하는 dmidecode 명령

플랫폼이 VirtualBox로 올바르게 식별됩니다.

Fedora 35를 실행하는 QEMU-KVM VM에서 이 출력을 얻습니다.

 sudo dmidecode -s 시스템 제품 이름 

GNOME Boxes VM을 올바르게 식별하는 dmidecode 명령

이것은 표준 PC로 보고되지만 Q35 유형의 표준 QEMU 가상 PC입니다. 따라서 플랫폼은 가상 머신으로 올바르게 인식됩니다.

물리적 컴퓨터에서 동일한 명령을 실행하면 제조업체에 대한 정보를 얻을 수 있습니다.

 sudo dmidecode -s 시스템 제품 이름 

물리적 컴퓨터에 대한 정보를 반환하는 dmidecode 명령

이 컴퓨터는 제품 코드가 MS-7B86인 Micro-Star International Company Limited 마더보드를 기반으로 한 맞춤형 빌드입니다.

lshw 명령

lshw 명령은 광범위한 컴퓨터 하드웨어에 대한 세부 정보를 나열합니다. lshw 가 보고할 하드웨어 클래스를 선택할 수 있습니다.

Linux에서 lshw를 사용하는 방법(실제 예제 포함)
관련 Linux에서 lshw를 사용하는 방법(실제 예제 포함)

system 수정자와 함께 -class 옵션을 사용할 것입니다. 이 명령과 함께 sudo 를 사용하면 모든 세부 사항을 볼 수 있습니다.

Ubuntu VirtualBox VM에서 이 명령을 실행합니다.

 sudo lshw - 클래스 시스템 

VirtualBox VM에서 보고하는 lshw 명령

  • "설명" 필드에는 "컴퓨터"라는 일반 항목이 있습니다.
  • "제품" 필드는 이것이 VirtualBox에서 실행되는 가상 머신임을 알려줍니다.
  • "vendor" 필드에는 VirtualBox를 만든 독일 회사 Innotek GmbH의 이름이 포함됩니다. Innotek은 Sun Microsystems, Inc. 인수의 일환으로 2010년 Oracle Corporation에 인수되었습니다.

Fedora에 lshw 를 설치해야 했습니다.

 sudo dnf 설치 lshw 

dnf 명령을 사용하여 Fedora에 lshw 설치

GNOME Boxes에서 실행되는 Fedora VM에서 해당 명령을 시도해 보겠습니다.

 sudo lshw - 클래스 시스템 

GNOME Boxes VM에서 보고하는 lshw 명령

  • 다시 "설명" 필드에는 "컴퓨터"라는 일반 항목이 있습니다.
  • "product" 필드는 dmidecode 명령으로 본 것과 동일한 표준 QEMU PC 정보를 제공합니다.
  • "vendor" 필드에는 이것이 가상 머신임을 아주 명확하게 나타내는 "QEMU"가 포함됩니다.

이것은 실제 컴퓨터에서 동일한 명령을 실행한 결과입니다.

 sudo lshw - 클래스 시스템 

물리적 컴퓨터에서 보고하는 lshw 명령

이것이 Micro-Star 마더보드가 있는 하드웨어 컴퓨터임을 알 수 있습니다.

  • 하드웨어는 데스크탑 컴퓨터로 식별됩니다.
  • "제품" 필드는 마더보드 유형인 MS-7B86을 제공합니다.
  • "공급업체" 필드에는 제조업체 이름이 포함됩니다.

hostnamectl 명령

이 명령은 실행하기 위해 sudo 권한이 필요하지 않다는 장점이 있습니다. 그러나 systemd 지원 배포판에서만 사용할 수 있습니다. 대부분의 최신 배포판은 systemd 를 사용합니다.

이것은 Ubuntu VirtualBox VM에서 명령을 실행한 응답입니다.

 hostnamectl 

가상화 라인이 강조 표시된 VirtualBox VM의 hostnamectl 명령 출력

  • "icon-name" 필드에는 "-vm"이 추가됩니다.
  • "Chassis" 필드에는 "vm"이 포함됩니다.
  • "Virtualization" 필드에는 "oracle"이 포함됩니다.
  • "Hardware Vendor" 필드에는 "innotek GmbH"가 포함됩니다.
  • "Hardware Model" 필드에는 "VirtualBox"가 포함됩니다.

GNOME Boxes 내부의 Fedora VM의 출력은 매우 유사합니다.

 hostnamectl 

가상화 라인이 강조 표시된 GNOME Boxes VM의 hostnamectl 명령 출력

  • "icon-name" 필드에는 "-vm"이 추가됩니다.
  • "Chassis" 필드에는 "vm"이 포함됩니다.
  • "가상화" 필드에는 "kvm"이 포함됩니다.
  • "Hardware Vendor" 필드에는 "QEMU"가 포함됩니다.
  • "하드웨어 모델" 필드에는 "표준 PC(Q35 + ICH9, 2009)"가 포함됩니다.

물리적 데스크탑에서 hostnamectl 명령을 사용하면 출력에 "Virtualization" 줄이 포함되지 않습니다.

 hostnamectl 

"가상화" 정보가 없는 물리적 컴퓨터의 hostnamectl 명령 출력

"가상화" 필드가 없으면 베어메탈에서 실행 중이어야 합니다.

systemd-detect-virt 명령

가능한 한 짧은 답변을 얻으려면 systemd-detect-virt 가 아마도 당신이 찾고 있는 것일 것입니다. 다시 이것은 시스템이 장착된 배포가 필요 sudo systemd 은 필요하지 않습니다. 이것과 간결한 출력은 스크립트에서 사용하기에 매우 적합합니다.

이것은 Ubuntu VirtualBox VM에서 명령을 실행한 결과입니다.

 시스템 감지 가상 

systemd-detect-virt로 VirtualBox VM 식별

GNOME Boxes에서 실행되는 Fedora 사본은 KVM 가상화를 사용하는 것으로 보고됩니다.

 시스템 감지 가상 

systemd-detect-virt를 사용하여 GNOME Boxes VM 식별

하드웨어 시스템에서 systemd-detect-virt 를 실행하면 터미널에 "none"이 인쇄됩니다.

 시스템 감지 가상 

가상화가 없는 것으로 올바르게 식별되는 물리적 컴퓨터

플랫폼에 민감한 스크립트

스크립트가 가상화된 환경에서 실행 중인지 물리적 하드웨어에서 실행 중인지 감지하는 기능을 제공하기 위해 systemd-detect-virt 명령을 사용하고 Bash case 문을 사용하여 옵션을 처리할 수 있습니다.

이것이 우리가 사용할 스크립트입니다. 이 텍스트를 복사하여 "platform.sh"라는 파일에 저장합니다.

 #!/bin/bash

shopt -s nocasematch

케이스 $(systemd-detect-virt)

  없음)
    echo "물리적 하드웨어"
    ;;

  *)
    echo "가상 머신"
    ;;
이삭

스크립트는 shopt 를 사용하여 대소문자를 구분하지 않는 일치를 선택합니다. systemd-detect-virt 명령은 case 문에서 사용됩니다. 이 명령의 출력은 일치하는 항목이 발견될 때까지 case 문의 본문에 있는 각 case 절과 비교됩니다. 일치하지 않는 모든 것은 "*)" 기본 절에 의해 캡처됩니다.

Bash 스크립트에서 Case 문을 사용하는 방법
관련 Bash 스크립트에서 Case 문을 사용하는 방법

가장 간단한 방법은 systemd-detect-virt 의 응답이 "none"인지 테스트하는 것입니다. 그렇다면 스크립트가 물리적 하드웨어에서 실행되고 있는 것입니다. 다른 모든 경우에는 스크립트가 가상 머신에서 실행 중이어야 합니다.

스크립트를 실행하기 전에 chmod 를 사용하여 스크립트를 실행 가능하게 만들어야 합니다.

 chmod +x 플랫폼.sh 

chmod를 사용하여 플랫폼 스크립트를 실행 가능하게 만들기

Ubuntu VirtualBox VM을 가상 머신으로 올바르게 식별합니다.

 ./플랫폼.sh 

VirtualBox VM에서 platform.sh 스크립트 사용

또한 Fedora를 실행하는 GNOME Boxes VM을 올바르게 감지합니다.

 ./플랫폼.sh 

GNOME Boxes VM에서 platform.sh 스크립트 사용

또한 스크립트는 실제 시스템에서 실행 중인 경우 이를 올바르게 감지합니다.

 ./플랫폼.sh 

물리적 컴퓨터에서 platform.sh 스크립트 사용

다른 case 절은 다른 유형의 처리를 수행하기 위해 스크립트의 다른 곳에서 검사된 변수를 설정하거나 스크립트 내의 특정 기능을 호출할 수 있습니다.

스크립트가 다양한 유형의 가상 환경을 감지하고 수용해야 하는 경우 더 많은 case 절을 ​​추가하여 systemd-detect-virt 가 반환할 수 있는 다른 문자열을 찾을 수 있습니다. --list 옵션을 사용하여 가능한 응답의 전체 목록을 볼 수 있습니다. 한 번에 모두 쉽게 볼 수 있도록 column 명령을 통해 출력을 파이프합니다.

 systemd-detect-virt --list | 열 

systemd-detect-virt가 반환할 수 있는 완전한 응답 세트

빨간약을 먹다

이러한 기술을 사용하면 스크립트가 네이키드 하드웨어에서 실행 중일 때와 가상 머신 내부에 있을 때를 알 수 있습니다.

매트릭스의 네오처럼 그들은 무엇이 진짜이고 무엇이 아닌지 알게 될 것입니다.