podman-machine-init(1)
π NAME π
okay so this is podman-machine-init(1) from the General Commands Manual β and it initializes a new virtual machine. that's the whole vibe. π
β¨ SYNOPSIS β¨
podman machine init [options] [name]
π¦ DESCRIPTION π¦
Bestie, listen. podman machine init initializes a brand-new virtual machine for Podman. That's it, that's the job. π
The default machine name is podman-machine-default. So if you don't pass a machine name as an argument, your shiny new machine gets named podman-machine-default. No cap.
Rootless only. π«Ά Like, that's a hard requirement, not a suggestion.
Podman on MacOS and Windows requires a virtual machine. Why? Because containers are Linux β containers do not run on any other OS, since containers' core functionality is tied to the Linux kernel. That's just how it is, periodt. Podman machine must be used to manage MacOS and Windows machines, but it can optionally be used on Linux. π
podman machine init initializes a new Linux virtual machine where containers are run. SSH keys are automatically generated to access the VM, and system connections to the root account and a user account inside the VM are added. Iconic behavior, honestly. β¨
By default, the VM distribution is a custom Fedora CoreOS based image pushed to quay.io/podman/machine-os (build in https://github.com/containers/podman-machine-os). WSL is the exception here β it's based on a custom Fedora image. π
Wanna check if there's an upgrade available for your machine os? Run this:
$ podman machine ssh 'sudo rpm-ostree upgrade --check'
If an update is available, you can rerun the above command and remove the --check and your operating system will be updated. After updating, you must stop and start your machine with podman machine stop && podman machine start for it to take effect. no skipping that step, i'm serious π
The above mechanism is only used to update patch (Z) versions of podman. For updates to new major and minor version (X.Y), use the podman machine os apply command β go read the docs there for more info. π
Note: Updating as described above can result in version mismatches between Podman on the host and Podman in the machine. Executing podman info should reveal versions of both. A configuration where the Podman host and machine mismatch are unsupported. π
To update the WSL image you must run dnf update inside β use the following command:
$ podman machine ssh dnf update
Default Podman machine settings can be set via the [machine] section in the containers.conf(5) file. π§
πΈ OPTIONS πΈ
--cpus=numberβ Number of CPUs. π₯οΈ--disk-size=numberβ Size of the disk for the guest VM, in GiB. πΎ--helpβ Print usage statement. the classic. π--ignition-pathβ Fully qualified path of the ignition file.
If an ignition file is provided, the file is copied into the user's CONF_DIR and renamed. Additionally, no SSH keys are generated, nor are any system connections made. It is assumed that the user does these things manually or handled otherwise. so likeβ¦ you're on your own for that part, bestie π«‘
--imageβ Fully qualified registry, path, or URL to a VM image. Registry target must be in the form ofdocker://registry/repo/image:version.
Note: Only images provided by podman will be supported. β οΈ
--import-native-caβ Import the host's trusted CA certificates into the machine. When set totrue, the certificates from the host system are imported during machine startup. This allows containers running in the machine to trust the same Certificate Authorities as the host OS. The default value isfalse. π--memory,-m=numberβ Memory (in MiB). Note:1024MiB=1GiB. math is math π--nowβ Start the virtual machine immediately after it has been initialized. impatient queen behavior, love that for you π--playbookβ Add the provided Ansible playbook to the machine and execute it after the first boot.
Note: The playbook will be executed with the same privileges given to the user in the virtual machine. The playbook provided cannot include other files from the host system, as they will not be copied. Use of the --playbook flag will require the image to include Ansible. The default image provided will have Ansible included. π
--providerβ Specify the provider for the machine to be created. This allows users to override the default provider on platforms that have multiple providers. π§ββοΈ--rootfulβ Whether this machine prefers rootful (true) or rootless (false) container execution. This option determines the remote connection default if there is no existing remote connection configurations.
API forwarding, if available, follows this setting. π₯
--swap,-s=numberβ Swap (in MiB). Note:1024MiB=1GiB.
Renders a zram-generator.conf file with zram-size set to the value passed to --swap. π
--timezoneβ Set the timezone for the machine and containers. Valid values arelocalor a timezone such asAmerica/Chicago. A value oflocal, which is the default, means to use the timezone of the machine host.
The timezone setting is not used with WSL. WSL automatically sets the timezone to the same as the host Windows operating system. π°οΈ
--tls-verifyβ Require HTTPS and verify certificates when contacting registries (default:true). If explicitly set totrue, TLS verification is used. If set tofalse, TLS verification is not used. If not specified, TLS verification is used unless the target registry is listed as an insecure registry incontainers-registries.conf(5). π‘οΈ--update-connection,-uβ When used in conjunction withpodman machine init --noworpodman machine start, this option sets the associated machine system connection as the default. When using this option, a-uor-update-connectionwill set the value totrue. To set this value tofalse, meaning no change and no prompting, use--update-connection=false. If the value is unset and stdin is not a tty, no prompt or update shall occur.
If the value is set to true, the machine connection will be set as the system default. If the value is set to false, the system default will be unchanged. If the option is not set, the user will be prompted and asked if it should be changed. π€
--usb=bus=number,devnum=numberorvendor=hexadecimal,product=hexadecimalβ Assign a USB device from the host to the VM via USB passthrough. Only supported for QEMU Machines. π
The device needs to have proper permissions in order to be passed to the machine. This means the device needs to be under your user group.
Note that using bus and device number are simpler but the values can change every boot or when the device is unplugged. π
When specifying a USB using vendor and product ID's, if more than one device has the same vendor and product ID, the first available device is assigned.
--user-mode-networkingβ This option can only be used for the WSL provider on Windows. On all other platforms this option is ignored and user mode networking will always betruethere because these providers always depend ongvproxy(our user mode networking tool for the VMs). π
In contrast, the Windows/WSL backend defaults to false, and follows the standard WSL network setup. Changing this setting to true on Windows/WSL informs Podman to replace the WSL networking setup on start of this machine instance with a user-mode networking distribution. Since WSL shares the same kernel across distributions, all other running distributions reuses this network. Likewise, when the last machine instance with a true setting stops, the original networking setup is restored. β»οΈ
In some VPN configurations the VPN may drop traffic from alternate network interfaces, including VM network devices. By enabling user-mode networking VPNs observe all podman machine traffic as coming from the host, bypassing the problem. π΅οΈββοΈ
--usernameβ Username to use for executing commands in remote VM. Default value iscorefor FCOS anduserfor Fedora (default on Windows hosts). Should match the one used inside the resulting VM image. π€--volume,-v=source:target[:options]β Mounts a volume fromsourcetotarget. π
Create a mount. If /host-dir:/machine-dir is specified as the source:target, Podman mounts host-dir in the host to machine-dir in the Podman machine.
Additional options may be specified as a comma-separated string. Recognized options are:
ro: mount volume read-onlyrw: mount volume read/write (default)security_model=[model]: specify 9p security model (see below)
Note: The following destinations are forbidden for volumes:/bin,/boot,/dev,/etc,/home,/proc,/root,/run,/sbin,/sys,/tmp,/usr, and/var. Subdirectories of these destinations are allowed but users should be careful to not mount to important directories as unexpected results may occur. π¬
The 9p security model [determines](https://wiki.qemu.org/Documentation/9psetup#Starting_the_Guest_Directly) if and how the 9p filesystem translates some filesystem operations before actual storage on the host.
In order to allow symlinks to work, on MacOS the default security model is none. π
The value of mapped-xattr specifies that 9p store symlinks and some file attributes as extended attributes on the host. This is suitable when the host and the guest do not need to interoperate on the shared filesystem, but has caveats for actual shared access; notably, symlinks on the host are not usable on the guest and vice versa. If interoperability is required, then choose none instead, but keep in mind that the guest is not able to do things that the user running the virtual machine cannot do, e.g. create files owned by another user. Using none is almost certainly the best choice for read-only volumes. π
Example:
-v "$HOME/git:$HOME/git:ro,security_model=none"
Default volume mounts are defined in containers.conf. Unless changed, the default value is $HOME:$HOME. π
Note on Windows Subsystem for Linux (WSL): Since all drives are mounted at/mnton startup by default in WSL, passing--volumeis redundant and has no effect. The host home directory for aC:drive will be mounted at/mnt/c/Users/<my username>. π§
β¨ EXAMPLES β¨
Okay bestie, this is the fun part β real live examples, all copy-paste ready π
- Spin up the default Podman machine, pulling the content from the internet. So iconic of it.
$ podman machine init
- Want a machine with a specific name? Slay, just hand it over β still pulling the content from the internet.
$ podman machine init myvm
- Bestieβ¦ init and start in one single step? The efficiency is giving main character energy π₯
podman machine init --now
- Init the default Podman machine (content straight from the internet) but defaulting to rootful mode. Lowkey important: the default is rootless, so you're actively choosing chaos here π
$ podman machine init --rootful
- Default machine, but we're overriding its disk size, still pulling content from the internet. Big storage vibes π
$ podman machine init --disk-size 50
- Naming your machine and overriding its memory size at the same time? Multitasking queen π
$ podman machine init --memory=1024 myvm
- Mount a host directory into the VM β here
/Usersfrom the host lands at/Usersinside the VM. Chef's kiss mapping π
$ podman machine init -v /Users:/Users
- Pass through a USB device using the options you specify. Heads up bestie: only supported for QEMU Machines π«Ά
$ podman machine init --usb vendor=13d3,product=5406
- Same USB passthrough situation, different options β again, only supported for QEMU Machines β
$ podman machine init --usb bus=1,devnum=3
- Wanna init a machine on a different provider than the default? Say less π
$ podman machine init --provider applehv
π SEE ALSO π
podman(1), podman-machine(1), containers.conf(5) β go read these, they're literally the friends of this page πΈ
π HISTORY π
March 2021, originally compiled by Ashley Cui acui@redhat.com β¨mailto:acui@redhat.comβ© β ty for your service, queen π
And that's the whole page, bestie! This was podman-machine-init(1) from the Podman source docs, and the date on the footer is the one right up there in the history β March 2021 energy all the way. Go forth and init responsibly ππ¦β¨
π¦ where this page comes from
- arch rolling: podman-docker 6.1.4-1 Β· Apache-2.0
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms