Files

124 lines
3.7 KiB
Markdown

---
title: "QEMU x86-64 virtual machine"
menuTitle: "QEMU x86-64 virtual machine"
weight: 70
---
In addition to running gokrazy on a Raspberry Pi or another ARM board, you can
also run it in a QEMU x86-64 virtual machine. The following guide covers what's
necessary to build and run a gokrazy image on QEMU. Your hypervisor may require
additional configuration.
## Building the image
### Create a new gokrazy instance
```bash
gok -i virtual new
```
The `-i` flag specifies the name of the instance. In this case, we're using
`virtual`, but you can use any name you like. The instance configuration will be
created in your home directory under `~/gokrazy/virtual`.
### Edit the instance configuration
Run `gok -i virtual edit` to open the [instance
configuration](/userguide/instance-config) file in your favorite editor. You'll
need to make the following changes:
{{< highlight json "hl_lines=3-5" >}}
{
"Hostname": "virtual",
"KernelPackage": "github.com/rtr7/kernel",
"FirmwarePackage": "github.com/rtr7/kernel",
"SerialConsole": "ttyS0,115200",
// ...
}
{{< /highlight >}}
### Build the image
The following command will build a single image file that contains the kernel,
firmware, and root filesystem. The `--target_storage_bytes` flag must be
specified to set the size of the image. The example below creates a 4GB image.
```bash
GOARCH=amd64 gok -i virtual overwrite --full virtual.img --target_storage_bytes 4294967296
```
The image will be written to the current directory as `virtual.img`.
### Use the image with QEMU
You can now use the image with QEMU. The following command will boot the image
in QEMU with a serial console:
```bash
qemu-system-x86_64 \
-machine accel=kvm \
-smp 8 \
-m 2048 \
-drive file=virtual.img,format=raw \
-nographic
```
### Use the image with Proxmox
You can also use the image with other hypervisors, such as [Proxmox
PVE](https://www.proxmox.com/en/proxmox-virtual-environment/overview). Start by
creating a new VM without a storage device. Then, upload the image to the
Proxmox host and add it as a hard disk to the VM.
```bash
qm importdisk <vmid> virtual.img <storage>
# for example, for vmid 105 and local-zfs storage:
qm importdisk 105 virtual.img local-zfs
```
Visit the Proxmox web UI and choose the unattached disk on the VM Hardware
tab. Click "Edit" and select "SCSI" as the Bus/Device. Click "Add" to add the
disk to the VM. Visit the "Options" tab and edit "Boot Order". Make sure the
SCIS disk is checked and move it to the top of the list. Click "OK" to save your
changes.
### Bonus: Deploy a QEMU guest agent
If you're using Proxmox PVE, you can deploy a QEMU guest agent to the VM. This
will allow you to discover the VM's IP address. The
[qemu-guest-kragent](https://github.com/bradfitz/qemu-guest-kragent) project
provides a simple agent that can be used with gokrazy.
To add the agent to your gokrazy instance, run the following command:
```bash
gok -i virtual add github.com/bradfitz/qemu-guest-kragent
```
Visit the Proxmox web UI and choose the VM. Click "Options" and select "QEMU
Guest Agent". Make sure "Use QEMU Guest Agent" is checked. Click "OK" to save
your changes.
### Tips: Optimizing the VM
The following tips can be used to optimize the VM and reduce CPU usage:
- Disable USB hotplug
- Disable USB tablet/pointer support
- Use the VirtIO graphics support. On Proxmox either "VirtIO-GPU" graphic card
or `vga: virtio` in the config file.
### Next steps
You can now use this gokrazy VM instance as you would any other gokrazy
instance. For example, you can add packages, configure the instance, and update
it.
```bash
GOARCH=amd64 gok -i virtual update
```
For more information, see the [Instance config reference](/userguide/instance-config/).