Skip to content

Virtual Machine

가상 머신(Virtual Machine, VM)은 컴퓨팅 환경을 소프트웨어로 구현한 것, 즉 컴퓨터를 에뮬레이션하는 소프트웨어다. 가상머신상에서 운영체제나 응용프로그램을 설치 및 실행할 수 있다.

Categories

정의

가상 머신은 원래 Popek와 Goldberg가 실제 컴퓨터의 효율적이고 고립된 복제물로 정의했다. 현재는 아무 실제 하드웨어와 직접적인 통신이 없는 가상 컴퓨터를 가리킨다.

가상 머신은 실제 컴퓨터와 어느 정도의 통신과 사용을 기반으로 두 가지로 나뉜다. 시스템 가상 머신 은 완전한 시스템 플랫폼을 제공하며, 다시 말해 완전한 운영 체제 (OS)의 실행을 지원한다. 반대로, 프로세스 가상 머신은 하나의 단일 프로그램을 실행하기 위해 만들어져 있는데, 다시 말해 단일 프로세스를 지원한다. 가상 머신의 중요한 특징은 안에서 돌아가는 소프트웨어가 가상 머신이 제공하는 환경과 자원에 제한을 받으며 가상 세계를 벗어날 수 없다는 것이다.

List of projects

시스템 가상 머신

시스템 가상 머신은 가끔 하드웨어 가상 머신이라고 하며 각 운영 체제를 실행하는 가상 머신 사이의 기초가 되는 물리 컴퓨터를 다중화(multiplex)한다. 가상화를 제공하는 소프트웨어 계층은 가상 머신 모니터 또는 하이퍼바이저라고 한다. 하이퍼바이저는 순 그대로의 하드웨어 또는 호스트 운영 체제 위에서 실행할 수 있다.

시스템 가상 머신의 주요 이점:

  • 여러 운영 체제를 쓰는 환경은 운영 체제가 완벽히 고립된 채로 같은 컴퓨터에서 존재할 수 있다.
  • 가상 머신은 실제의 컴퓨터가 제공하는 것과 다른 형태의 명령어 집합 구조 (ISA)를 제공한다.

프로세스 가상 머신

VM은 응용 프로그램 가상 머신이라고도 하며, 운영 체제 안에서 일반 응용 프로그램을 돌리고 단일 프로세스를 지원한다. 프로세스가 시작하고, '끝내기'되어 파괴될 때 만들어진다. 목적은 플랫폼 - 아무 플랫폼에서나 같은 방식으로 실행하는 프로그램을 허용하고 기초가 되는 하드웨어나 운영 체제의 상세한 부분을 가져오는 독립 프로그래밍 환경을 제공하기 위함이다.

가상 머신이라고 하는 프로세스는 고급 프로그래밍 언어에서 높은 수준의 추출을 제공한다 (가상 머신 시스템에서 낮은 수준의 ISA 추출과 비교하면) — 가상 머신 프로세스들은 해석기를 사용하여 추가된다.

이러한 종류의 가상 머신은 자바 가상 머신을 사용하여 추가되는 자바와 더불어 인기를 끌었다. 또다른 예로는, 닷넷 프레임워크가 있는데 공통 언어 런타임라고 불리는 가상 머신을 실행한다.

현재 OS가 VM 위에서 작동하는지 확인하는 방법

리눅스 서버가 가상 머신(VM)에서 실행 중인지 확인하는 방법은 여러 가지가 있습니다. SSH로 접속한 상태에서 다음 방법 중 하나를 사용하여 확인할 수 있습니다.

  • systemd-detect-virt
    • kvm (KVM 기반 VM)
    • vmware (VMware)
    • oracle (VirtualBox)
    • qemu (QEMU)
    • lxc (LXC 컨테이너)
    • none (물리 서버)
  • lscpu | grep -i hypervisor
  • sudo dmidecode -s system-manufacturer
  • sudo dmidecode | grep -i product
  • dmesg | grep -i virtual
  • cat /proc/cpuinfo | grep -i hypervisor
  • virt-what

현재 OS가 Container 위에서 작동하는지 확인하는 방법

리눅스 서버에 SSH로 접속한 상태에서 현재 환경이 Docker 컨테이너 또는 Kubernetes Pod 내부인지 확인하는 방법을 소개합니다.

  • cat /proc/1/cgroup
    • 물리 머신일 경우 일반적인 경우 0::/init.scope 이렇게 표시됨.
  • hostname
    • Kubernetes Pod 내부에서는 일반적으로 Pod 이름이 호스트네임으로 설정됨.
    • Docker 컨테이너는 컨테이너 ID 또는 설정된 호스트네임이 나올 수 있음.
  • mount | grep overlay
    • 컨테이너일 경우 일반적으로 루트를 overlay 파일 시스템 사용한다. overlay on / type overlay (rw,relatime,lowerdir=...) 처럼 출력된다.
  • env | grep -E 'KUBERNETES|DOCKER'
    • Kubernetes Pod 내부에서 보통 다음과 같은 환경 변수가 존재:
      • KUBERNETES_SERVICE_HOST
      • KUBERNETES_PORT
    • Docker 컨테이너의 경우 환경 변수가 제한적일 수 있음.
  • test -f /.dockerenv && echo "Running inside Docker"
    • 컨테이너 전용 파일 존재 여부 확인.
      • Docker 컨테이너 내부에서는 /.dockerenv 파일이 존재.
      • Kubernetes에서는 존재하지 않음.
  • ps -eo pid,comm | head
    • Docker 컨테이너는 첫 번째 프로세스(PID 1)가 보통 애플리케이션 실행 프로세스임.
    • Kubernetes Pod는 pause 프로세스가 PID 1로 나타날 수 있음.
  • ls -l /sys/fs/cgroup/
    • Kubernetes 또는 Docker 환경에서는 여러 cgroup 디렉토리가 존재하며, 경로에 docker 또는 kubepods가 포함될 가능성이 높음.

우선 순위로 3줄 요약 버전:

  1. cat /proc/1/cgroup (Docker 및 Kubernetes 감지)
  2. test -f /.dockerenv (Docker 감지)
  3. env | grep KUBERNETES 환경 변수 확인 (Kubernetes 감지)

Favorite site