How to create an instance
This document demonstrates various ways to create an instance with Multipass. While every method is a one-liner involving the command multipass launch
, each showcases a different option that you can use to get exactly the instance that you want.
Create an instance
To create an instance with Multipass, run the command multipass launch
. This launches a new instance, which is randomly named; for example:
…
Launched: keen-yak
In particular, when we run multipass info keen-yak
, we find out that it is an Ubuntu LTS release, namely 18.04, with 1GB RAM, 1 CPU, 5GB of disk:
Name: keen-yak
State: RUNNING
IPv4: 10.140.94.253
Release: Ubuntu 18.04.1 LTS
Image hash: d53116c67a41 (Ubuntu 18.04 LTS)
CPU(s): 1
Load: 0.00 0.12 0.18
Disk usage: 1.1G out of 4.7G
Memory usage: 71.6M out of 985.4M
Create an instance with a specific image
See also:
find
,launch <image>
,info
To find out which images are available, run multipass find
. Here’s a sample output:
Image Aliases Version Description
20.04 focal 20240821 Ubuntu 20.04 LTS
22.04 jammy 20240912 Ubuntu 22.04 LTS
24.04 noble,lts 20240911 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.
To launch an instance with a specific image, include the image name or alias in the command, for example multipass launch jammy
:
...
Launched: tenacious-mink
multipass info tenacious-mink
confirms that we’ve launched an instance of the selected image.
Name: tenacious-mink
State: Running
Snapshots: 0
IPv4: 192.168.64.22
Release: Ubuntu 22.04.5 LTS
Image hash: e898c1c93b32 (Ubuntu 22.04 LTS)
CPU(s): 1
Load: 0.00 0.02 0.01
Disk usage: 1.6GiB out of 4.8GiB
Memory usage: 149.5MiB out of 962.2MiB
Mounts: --
Create an instance with a custom name
See also:
launch --name
To launch an instance with a specific name, add the --name
option to the command line; for example multipass launch kinetic --name helpful-duck
:
...
Launched: helpful-duck
Create an instance with custom CPU number, disk and RAM
See also:
launch --cpus --disk --memory
You can specify a custom number of CPUs, disk and RAM size using the --cpus
, --disk
and --memory
arguments, respectively. For example:
multipass launch --cpus 4 --disk 20G --memory 8G
Create an instance with primary status
See also:
launch --name primary
An instance can obtain the primary status at creation time if its name is primary
:
multipass launch kinetic --name primary
For more information, see: How to use the primary instance.
Create an instance with multiple network interfaces
See also:
launch --network
Multipass can create instances with additional network interfaces using the multipass launch
command with the --network
option. This is complemented by the networks
command, that you can use to find available host networks to bridge with.
This feature is only supported for images with cloud-init
support for v2 network config, which in turn requires netplan to be installed, meaning that you’ll require Ubuntu 17.10 and Ubuntu Core 16 (except snapcraft:core16
) or later. More specifically, this feature is only supported in the following scenarios:
- on Linux, with LXD
- on Windows, with both Hyper-V and VirtualBox
- on macOS, with the QEMU and VirtualBox drivers
The --network
option can be given multiple times to request multiple network interfaces beyond the default one, which is always present. Each time you add the --network
option you also need to provide an argument specifying the properties of the desired interface:
name
- This is the only required value, used to identify the host network to connect the instance’s device to (seenetworks
for possible values).mode
- Eitherauto
(default) ormanual
; withauto
, the instance will attempt to configure the network automatically.mac
- Custom MAC address to use for the device.
These properties can be specified in the format <key>=<value>
but a simpler form with only <name>
is available for the most common use case. Here is an example:
multipass launch --network en0 --network name=bridge0,mode=manual
You can inspect the IP addresses assigned to the network interfaces of the new instance ("upbeat-whipsnake) on the system using the command:
multipass exec upbeat-whipsnake -- ip -br address show scope global
Sample output:
enp0s3 UP 10.0.2.15/24
enp0s8 UP 192.168.1.146/24
enp0s9 DOWN
Last, you can run ping -c1 192.168.1.146
from the same network to verify that the IP can be reached:
PING 192.168.1.146 (192.168.1.146): 56 data bytes
64 bytes from 192.168.1.146: icmp_seq=0 ttl=64 time=0.378 ms
...
In the example above, we got the following interfaces inside the instance:
enp0s3
- The default interface, that the instance can use to reach the outside world and that Multipass uses to communicate with the instance.enp0s8
- The interface that is connected toen0
on the host and that is automatically configured.enp0s9
- The interface that is connected tobridge0
on the host, ready for manual configuration.
Routing
Extra interfaces are configured with a higher metric (200) than the default one (100). So, by default the instance will only route through them if they’re a better match for the destination IP (see Wikipedia | Longest_prefix-match.
For example, if the command multipass exec upbeat-whipsnake -- ip route
returns the following routing table:
default via 10.0.2.2 dev enp0s3 proto dhcp src 10.0.2.15 metric 100
default via 192.168.1.1 dev enp0s8 proto dhcp src 192.168.1.146 metric 200
10.0.2.0/24 dev enp0s3 proto kernel scope link src 10.0.2.15
10.0.2.2 dev enp0s3 proto dhcp scope link src 10.0.2.15 metric 100
192.168.1.0/24 dev enp0s8 proto kernel scope link src 192.168.1.146
192.168.1.1 dev enp0s8 proto dhcp scope link src 192.168.1.146 metric 200
you can then explore how specific IPs are routed:
multipass exec upbeat-whipsnake -- ip route get 91.189.88.181
In this case, for example:
91.189.88.181 via 10.0.2.2 dev enp0s3 src 10.0.2.15 uid 1000
cache
Bridging
On Linux, when trying to connect an instance network to an ethernet device on the host, Multipass will offer to create the required bridge.
First, run the multipass networks
command; for example:
Name Type Description
eth0 ethernet Ethernet device
lxdbr0 bridge Network bridge
mpbr0 bridge Network bridge for Multipass
virbr0 bridge Network bridge
Then, select an ethernet device and launch a new instance requesting to connect to it, for example via multipass launch --network eth0
. The output will be:
Multipass needs to create a bridge to connect to eth0.
This will temporarily disrupt connectivity on that interface.
Do you want to continue (yes/no)?
However, Multipass requires NetworkManager
to achieve this. On installations that do not have NetworkManager
installed (e.g. Ubuntu Server), the user can still create a bridge by other means and pass that to Multipass. For instance, this configuration snippet achieves that with netplan
:
network:
bridges:
mybridge:
dhcp4: true
interfaces:
- eth0
That goes somewhere in /etc/netplan/
(e.g. /etc/netplan/50-custom.yaml
). After a successful netplan try
or netplan apply
, Multipass will show the new bridge with the networks
command and instances can be connected to it:
multipass launch --network mybridge
Another option is to install NetworkManager
, but other network handlers need to be deactivated to avoid conflicts and make the new bridges permanent.
Create an instance with a custom DNS
In some scenarios the default of using the system-provided DNS will not be sufficient. When that’s the case, you can use the --cloud-init
option to the launch
command, or modify the networking configuration after the instance started.
The --cloud-init
approach
See also:
launch --cloud-init
To use a custom DNS in your instances, you can use this cloud-init
snippet:
#cloud-config
bootcmd:
- printf "[Resolve]\nDNS=8.8.8.8" > /etc/systemd/resolved.conf
- [systemctl, restart, systemd-resolved]
Replace 8.8.8.8
with whatever your preferred DNS server is. You can then launch the instance using the following command:
multipass launch --cloud-init systemd-resolved.yaml
The netplan.io approach
After the instance booted, you can modify the /etc/netplan/50-cloud-init.yaml
file, adding the nameservers
entry:
network:
ethernets:
ens3:
dhcp4: true
match:
macaddress: 52:54:00:fe:52:ee
set-name: ens3
nameservers:
search: [mydomain]
addresses: [8.8.8.8]</b>
You can then test it with the command sudo netplan try
:
Do you want to keep these settings?
Press ENTER before the timeout to accept the new configuration
Changes will revert in 120 seconds
...
Errors or typos? Topics missing? Hard to read? Let us know or open an issue on GitHub.