ETC

Multipass 사용법: 간편하게 가상 머신 관리하기

알쓸개잡 2024. 7. 2.

Multipass는 쉽고 빠르게 가상 머신을 생성하고 관리할 수 있는 도구다. MacOS, Linux, Windows 등 다양한 운영체제에서 사용할 수 있으며, 단시간에 클라우드와 유사한 환경을 로컬에 구축할 수 있다. Multipass는 기본적으로 우분투 이미지를 제공하지만, 다른 이미지를 사용할 수도 있어 다양한 개발 환경을 지원한다.

 

Multipass의 주요 장점은 다음과 같다.

  • 간편한 설치와 사용: 몇 개의 명령만으로 가상 머신을 생성하고 관리할 수 있다.
  • 빠른 성능: 경량화된 VM으로 빠른 부팅 속도와 높은 성능을 제공한다.
  • 유연성: 다양한 운영체제와 호환되며, 여러 개의 VM을 동시에 관리할 수 있다.
  • 통합환경: 로컬에서 클라우드와 유사한 환경을 재현할 수 있어, 개발부터 테스트까지 모든 과정을 손쉽게 수행할 수 있다.

이번 포스팅에서는 Multipass의 설치와 기본 사용법에 대해서 정리하고자 한다.

 

설치

brew를 이용한 설치

MacOS 환경에서는 brew를 이용하여 손쉽게 설치할 수 있다.

$> ~/ brew install --cask multipass
$> ~/ multipass version
multipass   1.13.1+mac
multipassd  1.13.1+mac
$> ~/ which multipass
/usr/local/bin/multipass

 

패키지 설치

Multipass orchestrates virtual Ubuntu instances 에서 OS에 맞는 설치 파일을 다운로드하여서 설치

 

 

인스턴스 생성

multipass find 명령은 현재 multipass를 통해 생성할 수 있는 인스턴스의 모든 이미지 목록이 표시된다.

$> ~/ multipass find
Image                       Aliases           Version          Description
20.04                       focal             20240612         Ubuntu 20.04 LTS
22.04                       jammy             20240614         Ubuntu 22.04 LTS
23.10                       mantic            20240606         Ubuntu 23.10
24.04                       noble,lts         20240608         Ubuntu 24.04 LTS

Blueprint                   Aliases           Version          Description
anbox-cloud-appliance                         latest           Anbox Cloud Appliance
charm-dev                                     latest           A development and testing environment for charmers
docker                                        0.4              A Docker environment with Portainer and related tools
jellyfin                                      latest           Jellyfin is a Free Software Media System that puts you in control of managing and streaming your media.
minikube                                      latest           minikube is local Kubernetes
ros-noetic                                    0.1              A development and testing environment for ROS Noetic.
ros2-humble                                   0.1              A development and testing environment for ROS 2 Humble.

 

multipass launch 명령을 통해서 가상 인스턴스를 생성할 수 있다.

Usage: multipass launch [options] [[<remote:>]<image> | <url>]
$> ~/ multipass launch jammy
Launched: rich-ant
$> ~/ multipass list
Name                    State             IPv4             Image
rich-ant                Running           192.168.64.3     Ubuntu 22.04 LTS

jammy는 우분투 22.04 이미지의 alias다.

multipass list 명령은 현재 생성된 인스턴스의 목록을 보여준다.

multipass launch 명령에 --name 옵션을 지정하지 않으면 인스턴스명은 랜덤 하게 생성된다. (rich-ant)

 

multipass launch 옵션

-c, --cpus 가상 인스턴스의 cpu core수를 지정 (최소 1, 디폴트 1)
-d, --disk 가상 인스턴스의 디스크 사이즈를 지정 (K, M, G suffix) (최소 512M, 디폴트, 5G)
-m, --memory 가상 인스턴스의 메모리를 지정 (K, M, G suffix) (최소 128M, 디폴트 1G)
-n, --name 가상 인스턴스의 이름을 지정 (이름을 'primary'로 지정하면 호스트의 $HOME 디렉토리가 자동 마운트 됨)
--mount <local-path>:<instance-path> 호스트 경로를 가상 인스턴스 경로에 마운트
--cloud-init <file> | <url> 클라우드 초기화 파일을 사용하여 가상 인스턴스를 설정한다. 클라우드 초기화 파일은 yaml 형식의 설정 파일로, 인스턴스 시작시 다양한 초기 설정을 자동으로 수행할 수 있다.
--network <spec> 특정 네트워크 설정을 사용하여 인스턴스를 생성한다.
spec은 "key=value, key=value" 와 같은 형식으로 지정한다.
--bridged 브릿지 네트워킹을 사용하여 가상 인스턴스를 생성한다. 가상 인스턴스가 호스트와 같은 네트워크에 직접 연결되도록 한다.

 

 

인스턴스 수정

이미 생성된 가상 인스턴스 리소스 변경

local.<instance-name> 을 통해서 리소스를 변경할 수 있다.

multipass stop some-instance
multipass set local.some-instance.cpus=4
multipass set local.some-instance.disk=40G
multipass set local.some-instance.memory=8G

위 예시는

  • some-instance의 cpu 코어수를 4개로 변경.
  • some-instance의 disk 크기를 40GB로 변경.
  • some-instance의 memory 크기를 8G로 변경.
인스턴스의 디스크 크기를 늘릴 때 파티션이 자동으로 확장되지 않아 새로운 사용 가능한 공간을 사용하지 못할 수 있다.
이는 일반적으로 디스크 크기를 늘리려고 할 때 파티션이 이미 꽉 찬 경우에 발생한다. 
이러한 경우에 다음과 같이 파티션을 수동으로 확장해야 한다.
# some-instance 쉘에 접속
$> multipass shell some-instance
ubuntu@some-instance$ sudo parted /dev/sda resizepart 1 100%
Warning: Not all of the space available to /dev/sda appears to be used, you can fix the GPT to use all of the space (an extra 4194304 blocks) or continue with the current setting?
Fix/Ignore? fix
Partition number? 1
Warning: Partition /dev/sda1 is being used. Are you sure you want to continue?
Yes/No? yes
ubuntu@some-instance$ sudo resize2fs /dev/sda1

 

가상 인스턴스 리소스 확인

$> multipass get local.some-instance.cpus
4
$> multipass get local.some-instance.disk
40.0GiB
$> multipass get local.some-instance.memory
8.0GiB

some-instance 가상 인스턴스의 cpu 코어, 디스크 크기, 메모리 크기를 확인한다.

 

가상 인스턴스 삭제

multipass delete

multipass purge

명령으로 삭제한다.

$> ~/ multipass delete rich-ant
$> ~/ multipass list
Name                    State             IPv4             Image
rich-ant                Deleted           --               Ubuntu 22.04 LTS
$> ~/ multipass purge
$> ~/ multipass list
No instances found.

multipass delete 명령은 인스턴스를 Deleted 상태로 변경하지만 디스크 이미지와 데이터는 유지된다.

multipass purge 명령은 Deleted 상태의 인스턴스를 완전히 제거하여 디스크 이미지와 데이터를 포함한 모든 것을 영구 삭제한다.

multipass delete --purge <instance-name> 명령으로 delete와 purge를 한 번에 실행할 수 있다.

 

multipass recover 명령으로 Deleted 상태의 인스턴스를 복구할 수 있다.

$> ~/ multipass list
Name                    State             IPv4             Image
ubuntu22                Running           192.168.64.2     Ubuntu 22.04 LTS

# ubuntu22 인스턴스에 삭제 마크 설정
$> multipass delete ubuntu22
$> multipass list
Name                    State             IPv4             Image
ubuntu22                Deleted           --               Ubuntu 22.04 LTS

# ubuntu22 인스턴스의 삭제 마크 해제
$> multipass recover ubuntu22
$> multipass list
Name                    State             IPv4             Image
ubuntu22                Stopped           --               Ubuntu 22.04

 

가상 인스턴스 사용

가상 인스턴스 쉘에 접속

multipass shell <instance-name>

$> multipass shell rich-ant
Welcome to Ubuntu 22.04.4 LTS (GNU/Linux 5.15.0-112-generic aarch64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Tue Jun 18 13:54:46 KST 2024

  System load:             0.2
  Usage of /:              33.7% of 4.68GB
  Memory usage:            17%
  Swap usage:              0%
  Processes:               88
  Users logged in:         0

...

ubuntu@rich-ant:~$

multipass shell 명령은 지정된 가상 인스턴스 쉘에 접속하는 명령이다.

 

가상 인스턴스에 ssh로 접속하기

  • 가상 인스턴스에 일반적인 ssh 명령으로 쉘에 접속 시도하게 되면 permission denied로 접속이 되지 않는다.
  • 이를 해결하기 위해서 다음 단계를 수행한다.
    • ssh 키 생성
    • 인스턴스 생성시 적용될 yaml 파일 작성
    • --cloud-init 옵션을 지정하여 인스턴스 생성
  • ssh 키 생성
$> ssh-keygen -t rsa -b 2048 -f ~/.ssh/id_rsa_multipass

위 명령을 수행하면 $HOME/.ssh 경로에 id_rsa_multipass (개인키), id_rsa_multipass.pub (공개키) 파일이 생성된다.

 

  • cloud-init 옵션에 적용할 yaml 파일 작성
users:
  - default
  - name: ubuntu
    sudo: ALL=(ALL) NOPASSWD:ALL
    ssh_authorized_keys:
      - <id_rsa_multipass.pub 파일 내용>

ssh_authorized_keys 설정 항목에 id_rsa_multipass.pub 파일의 내용을 그대로 복사하여 설정하면 인스턴스 생성 시 지정된 공개키가 인스턴스에 적용된다. --> 인스턴스의 $HOME/.ssh/authorized_keys 파일에 공개키가 저장된다.

 

  • 가상 인스턴스 생성
$> multipass launch focal --name ubuntu20 --cloud-init ~/multipass/cloud-init/cloud-init-ssh.yaml

yaml 파일을 $HOME/multipass/cloud-init/cloud-init-ssh.yaml 경로에 저장한 경우 위와 같이 실행한다.

 

  • multipass IP 확인
$> multipass ls
Name                    State             IPv4             Image
basic                   Stopped           --               Ubuntu 24.04 LTS
ubuntu20                Running           192.168.64.4     Ubuntu 20.04 LTS

 

  • ssh 접속
$> ssh -i $HOME/.ssh/id_rsa_multipass ubuntu@192.168.64.4

-i 옵션과 함께 개인키 경로를 매번 지정하기 귀찮다면 $HOME/.ssh/config 파일에 다음과 같이 설정한다.

Host multipass-ubuntu20
	User ubuntu
	Hostname 192.168.64.4
	IdentityFile ~/.ssh/id_rsa_multipass

위와 같이 설정한 경우 다음과 같이 간편하게 ssh 접속할 수 있다.

$> ssh multipass-ubuntu20

Welcome to Ubuntu 20.04.6 LTS (GNU/Linux 5.4.0-187-generic aarch64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Tue Jul  2 19:56:52 KST 2024

  System load:             0.01
  Usage of /:              31.5% of 4.68GB
  Memory usage:            20%
  Swap usage:              0%
  Processes:               97
  Users logged in:         0
  ...

ubuntu@ubuntu20:~$

 

가상 인스턴스 내에서 명령 실행

docker exec 명령과 같이 multipass 에서도 exec 명령으로 호스트에서 가상 인스턴스 내의 명령을 실행할 수 있다.

multipass exec <instance-name> -- <command>

$> multipass exec rich-ant -- lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 22.04.4 LTS
Release:	22.04
Codename:	jammy

위 명령은 rich-ant 인스턴스 내에서 'lsb_release -a' 명령을 실행한다.

 

가상 인스턴스 시작/일시중단/중지

multipass start

Stopped 혹은 Suspended 상태의 가상 인스턴스를 시작한다.

# 지정된 인스턴스를 기동한다.
$> multipass start <instance-name1> <instance-name2> ... <instance-nameN>
# 모든 기동 가능한 인스턴스를 기동한다.
$> multipass start --all
# 기본 인스턴스가 없는 경우 기본 인스턴스를 생성하고 기동한다.
$> multipass start

multipass suspend

지정된 인스턴스를 일시중단 한다.

# 지정된 인스턴스를 일시 중지한다.
$> multipass suspend <instance-name1> <instance-name2> ... <instance-nameN>
# 모든 실행 중인 인스턴스를 일시 중지한다.
$> multipass suspend --all

 

multipass stop

실행중인 (일시중지는 미포함) 가상 인스턴스를 종료한다.

# 지정된 인스턴스를 중지한다.
$> multipass stop <instance-name1> <instance-name2> ... <instance-nameN>
# 모든 실행 중인 인스턴스를 종료한다.
$> multipass stop --all

 

'primary' 인스턴스 사용

multipass는 인스턴스 이미지를 지정하지 않으면 기본 인스턴스를 생성한다.

또한 multipass launch 명령에서 --name primary를 지정한 경우에도 기본 인스턴스로 생성된다.

기본 인스턴스를 primary 인스턴스라고 하며 primary 인스턴스 이름은 디폴트가 'primary' 다.

CLI 명령에서 multipass [shell, start, stop, restart, suspend]와 같은 명령을 인스턴스 이름 지정 없이 실행하면 기본 인스턴스(primary 인스턴스)에 대해서 실행이 된다.

기본 인스턴스는 생성될 때 자동으로 사용자의 $HOME 디렉토리를 가상 인스턴스의 $HOME/Home 디렉터리에 마운트 한다.

물론 기본 인스턴스에 대해서도 multipass umount 명령으로 마운트 해제할 수 있다.

Windows 에서는 보안상의 이유로 기본 인스턴스에 대한 마운트 동작이 비활성화되어 있다. 필요한 경우 활성화하는 방법에 대한 내용은 https://multipass.run/docs/set-command#local.privileged-mounts 를 참고하기 바란다.

 

기본 인스턴스의 이름 변경

앞서 언급했듯이 기본 인스턴스의 이름은 'primary'다.

기본 인스턴스 이름을 primary가 아닌 다른 이름으로 지정하려면 multipass set 명령으로 client.primary-name 옵션을 지정하면 된다.

$> multipass set client.primary-name=basic
$> multipass start
Launched: basic
Mounted '/Users/me' into 'basic:Home'
$> ~/ multipass ls
Name                    State             IPv4             Image
basic                   Running           192.168.64.4     Ubuntu 24.04 LTS
rich-ant                Running           192.168.64.3     Ubuntu 22.04 LTS
$> multipass info basic
Name:           basic
State:          Running
Snapshots:      0
IPv4:           192.168.64.4
Release:        Ubuntu 24.04 LTS
Image hash:     8263b4713896 (Ubuntu 24.04 LTS)
CPU(s):         1
Load:           0.15 0.07 0.02
Disk usage:     1.8GiB out of 4.8GiB
Memory usage:   246.6MiB out of 953.1MiB
Mounts:         /Users/me => Home
                    UID map: 501:default
                    GID map: 20:default

 

multipass command alias

특정 인스턴스에서 명령을 실행하는 alias(별칭)을 만들어 사용할 수 있다.

 

alias 등록

아래 명령은 지정된 인스턴스의 명령에 대한 alias를 등록한다.

multipass alias <instance-name>:<command> <alias-name>
$> multipass alias basic:ls basicLs
You'll need to add this to your shell configuration (.bashrc, .zshrc or so) for
aliases to work without prefixing with `multipass`:

PATH="$PATH:/Users/me/Library/Application Support/multipass/bin"

위 실행은 basic 인스턴스의 현재 작업 디렉터리에서 ls 명령을 수행하는 'basicLs' alias를 생성한다.

 

alias 목록

아래 명령은 현재 지정된 alias 목록을 보여준다.

multipass aliases
$> ~/ multipass aliases
Alias     Instance   Command   Context    Working directory
basicLs   basic      ls        default*   map

 

alias 삭제

아래 명령은 지정된 alias를 삭제한다.

multipass unalias <alias-name> .. <alias-name>
multipass unalias --all
$> multipass unalias basicLs
$> multipass aliases
No aliases defined.
alias는 alias가 지정된 인스턴스가 제거될 때 자동으로 삭제된다.

 

alias 실행

아래 명령은 지정된 alias 를 실행한다.

multipass <alias-name> -- <argument>
# alias 등록
$> multipass alias basic:pwd basicPwd
# alias 실행 (basic 인스턴스 내에서 'pwd -L' 을 실행)
$> multipass basicPwd -- -L
/home/ubuntu/Home

쉘 설정파일 (.bashrc, .zshrc, ..) 에 PATH 환경 변수에 아래 경로를 등록하면 multipass prefix는 생략 가능하다.

각 OS 마다 경로는 다음과 같지만 환경마다 다를 수 있다. macOS의 경우 alias 등록 시 PATH 환경 변수에 추가할 경로가 안내된다.

#macOS m2 silicon
$HOME/Library/Application Support/multipass/bin

#Linux
$HOME/snap/multipass/common/bin

#Windows
https://multipass.run/docs/using-aliases#heading--windows 링크 참조

PATH 환경 변수에 경로가 추가되면 다음과 같이 multipass prefix 없이 사용 가능하다.

$> basicPwd --help
pwd: pwd [-LP]
    Print the name of the current working directory.

    Options:
      -L	print the value of $PWD if it names the current working
    		directory
      -P	print the physical directory, without any symbolic links

    By default, `pwd' behaves as if `-L' were specified.

    Exit Status:
    Returns 0 unless an invalid option is given or the current directory
    cannot be read.
$> basicPwd -P
/home/ubuntu/Home
$> basicPwd -L
/home/ubuntu/Home

alias 명령에 대한 argument 도 multipass prefix를 붙여서 실행하는 것과 비교하여 훨씬 직관적으로 사용할 수 있다.

 

alias가 실행되는 작업 디렉토리

alias 목록을 확인해 보면 Working directory 필드가 있는데 해당 필드는 가상 인스턴스 내에서 alias 명령이 실행되는 작업 디렉터리가 지정된 방식을 나타낸다.

$> multipass aliases
Alias     Instance   Command   Context    Working directory
basicLs   basic      ls        default*   map
  • Working directory 필드가 'map'으로 표시된 경우 호스트와 인스턴스 간에 마운트 된 디렉터리가 있다면 마운트 디렉토리가 작업 디렉터리로 동작한다는 것을 의미한다.
  • 'map'으로 지정되어 있고 마운트된 디렉토리가 없다면 가상 인스턴스의 홈 디렉토리가 작업 디렉토리가 된다.
  • 'default'로 지정된 경우는 가상 인스턴스의 홈 디렉토리가 작업 디렉토리로 사용되는 듯하다.
  • 작업 디렉터리로 마운트 된 디렉터리가 적용되지 않도록 하려면 alias 생성시 --no-map-working-directory 옵션을 지정하면 된다.
$> multipass alias basic:pwd basicPwd --no-map-working-directory
$> multipass aliases
Alias      Instance   Command   Context    Working directory
basicPwd   basic      pwd       default*   default
$> basicPwd
/home/ubuntu
  • alias에 --no-map-working-directory 옵션을 지정한 경우 Working directory 필드가 default로 변경되었다.
  • basicPwd alias를 실행하면 --no-map-working-directory 옵션을 지정하지 않은 경우에는 /home/ubuntu/Home 경로가 작업 디렉토리가 되지만 --no-map-working-directory 옵션을 지정한 경우에는 /home/ubuntu 경로가 작업 디렉토리가 된다.

 

호스트와 인스턴스 간 데이터 공유

호스트와 가상 인스턴스 간에 데이터를 공유하는 몇 가지 방법을 제공한다.

mount를 이용한 공유

multipass mount 명령을 사용하여 호스트와 인스턴스 간의 데이터를 공유할 수 있다.

# 인스턴스 생성시 마운트
multipass launch --mount <host-path>:<instance-path>
# 이미 존재하는 인스턴스에 대해서 마운트 설정
multipass mount <host-path> <instance-name>:<instance-path>
$> multipass list
Name                    State             IPv4             Image
ubuntu22                Running           192.168.6

$> multipass mount $HOME/multipass_shared ubuntu22:/home/ubuntu/multipass_shared
$> multipass info ubuntu22
Name:           ubuntu22
State:          Running
Snapshots:      0
IPv4:           192.168.64.2
Release:        Ubuntu 22.04.4 LTS
Image hash:     ee96bbc60af2 (Ubuntu 22.04 LTS)
CPU(s):         1
Load:           0.00 0.02 0.00
Disk usage:     1.6GiB out of 4.8GiB
Memory usage:   160.2MiB out of 962.2MiB
Mounts:         /Users/me/multipass_shared => /home/ubuntu/multipass_shared
                    UID map: 501:default
                    GID map: 20:default

# 호스트 공유 디렉토리
$> ll ~/multipass_shared
total 0
-rw-r--r--@ 1 me  staff     0B  6 22 12:41 file

# 인스턴스의 /home/ubuntu/multipass_shared 디렉토리
$> multipass exec ubuntu22 -- ls -al /home/ubuntu/multipass_shared                                                                                                                                  2 ↵
total 8
drwxr-xr-x 1 ubuntu ubuntu   96 Jun 22 12:41 .
drwxr-x--- 6 ubuntu ubuntu 4096 Jun 22 12:44 ..
-rw-r--r-- 1 ubuntu ubuntu    0 Jun 22 12:41 file

 

transfer를 이용한 공유

multipss transfer 명령을 사용하여 호스트와 가상 인스턴스 간의 양방향 파일을 전송할 수 있다.

multipass transfer [options] <source> [<source> ...] <destination>

Options:
  -h, --help       Displays help on commandline options
  -v, --verbose    로깅 정보를 증가시킨다. 
                   가장 많은 정보를 출력하려면 v 옵션을 4개 이상 지정한다. (-vvvv)
  -r, --recursive  전체 디렉토리를 재귀적으로 전송한다. 
                   디렉토리를 전송하기 위해서는 -r 옵션을 사용한다.
  -p, --parents    필요시 상위 디렉토리를 자동 생성한다.

Arguments:
  source           하나 이상 전송할 데이터 경로를 지정한다. 
                   인스턴스 내에 있는 경로를 지정하는 경우 <instance-name>: 을 prefix로 붙인다.
                   '-' 로 지정된 경우에는 stdin(스탠다드 input) 으로 사용된다.
  destination      데이터를 받을 경로를 지정한다. 
                   인스턴스 내에 있는 경로를 지정하는 경우 <instance-name>: 을 prefix로 붙인다.
                   '-' 로 지정된 경우에는 stdout (스탠다드 output) 으로 사용된다.
                   
* source와 destination 모두 '-'로 지정할 수는 없다.

 

인스턴스 --> 호스트로 파일 전송

# ubuntu22 인스턴스의 /home/ubuntu/transfer_file을 호스트의 $HOME/multipass_shared 경로에 전송한다.
$> multipass transfer ubuntu22:/home/ubuntu/transfer_file $HOME/multipass_shared

# ubuntu22 인스턴스의 /home/ubuntu/transfer_file 내용을 호스트의 stdout 으로 출력한다.
$> multipass transfer ubuntu22:/home/ubuntu/transfer_file -
테스트용 전송 데이터
테스트용 전송 데이터
$>

 

호스트 --> 인스턴스로 파일 전송

# 호스트의 $HOME/multipass_shared/directory1 디렉토리 전체를 
# ubuntu22 인스턴스의 /home/ubuntu/directory1 으로 전송한다.
$> multipass transfer -r $HOME/multipass_shared/directory1 ubuntu22:/home/ubuntu/

# 호스트의 stdin (사용자 입력) 데이터를 ubuntu22 인스턴스의 
# /home/ubuntu/console_output 파일에 저장한다.
# 참고로 stdin 입력 종료는 Ctrl + D 로 종료한다.
$> multipass transfer - ubuntu22:/home/ubuntu/console_output
this is test message1
this is test message2
this is test message3
Ctrl + D

# ubuntu22 인스턴스의 /home/ubuntu/console_outpout 파일 확인
$> multipass exec ubuntu22 -- cat /home/ubuntu/console_output
this is test message1
this is test message2
this is test message3
$>

 

지금까지 multipass로 가상 인스턴스를 사용하는 방법에 대해서 알아보았다.

추가적인 내용들은 아래 링크를 참고하기 바란다.

multipass documentation

cloud-init documentation

using multipass cloud-init

cloud config examples

 

끝.

댓글

💲 추천 글