====== bhyve Container Linux Virtual Machines ======
===== Creating The Container Linux VM =====
Download the raw container linux image from %%CoreOS%%.
fetch https://stable.release.core-os.net/amd64-usr/current/coreos_production_image.bin.bz2
fetch https://stable.release.core-os.net/amd64-usr/current/coreos_production_image.bin.bz2.DIGESTS
fetch https://stable.release.core-os.net/amd64-usr/current/coreos_production_image.bin.bz2.DIGESTS.asc
fetch https://stable.release.core-os.net/amd64-usr/current/coreos_production_image.bin.bz2.DIGESTS.sig
fetch https://stable.release.core-os.net/amd64-usr/current/coreos_production_image.bin.bz2.sig
Probably good practice to Verify the image, not described here.
Optionally create a ZFS volumne for the disk drive
zfs create -V 32G -s -o reservation=none -o volmode=dev zroot/coreos
bzcat the image into your new drive, if no ZFS then simply un-bzip the file.
bzcat coreos_production_image.bin.bz2 > /dev/zvol/zroot/coreos
Optionally snapshot if you are using ZFS
zfs snap zroot/coreos@vanilla
At this point you can boot the container linux VM, but it will not be accessible.
bhyve -c 1 -m 4G -A -H -P \
-s 0,hostbridge \
-s 3,ahci-hd,/dev/zvol/zroot/coreos \
-s 31,lpc \
-l com1,stdio \
-l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd \
coreos
===== Accessing the Container Linux VM =====
There are a couple of options here for accessing and configuring the VM:
- Add ssh key(s) to ~core/.ssh/authorized_keys
- Configure via hosted configuration
Either option can be accomplished by booting from Linux ISO.
==== Boot from Linux ISO ====
This example uses %%SystemRescueCD%%, I've also added a network interface so I can copy things over to the VM:
bhyve -c 1 -m 4G -A -H -P \
-s 0,hostbridge \
-s 2,ahci-cd,/usr/home/amarks/distfiles/systemrescuecd-x86-5.2.2.iso \
-s 3,ahci-hd,/dev/zvol/zroot/coreos \
-s 4,virtio-net,tap1 \
-s 29,fbuf,w=1280,h=1024,tcp=0.0.0.0:5900 \
-s 30,xhci,tablet \
-s 31,lpc \
-l com1,stdio \
-l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd \
coreos
==== Adding ssh key(s) ====
This section is accomplished running from the Linux ISO.
From your live disk, mount the root partition
mount /dev/sda9 /media
Copy your public key(s) over to the VM and add them to ~core/.ssh/authorized_keys
Restart the VM without the live disc and ssh using public key authentication.
ssh -l core
==== Hosting A Configuration ====
This section is accomplished from any host on the same network as the VM.
A web-server is required to host a configuration file. I'm using the same %%FreeBSD%% host system to host the Container Linux configuration.
pkg install nginx
Either write the configuration in json, or write it in a yml format then convert it to json using https://github.com/coreos/container-linux-config-transpiler.
YML:
passwd:
users:
- name: core
ssh_authorized_keys:
- "ssh-rsa AAAAB3NzaC1...
JSON:
{
"ignition": {
"config": {},
"security": {
"tls": {}
},
"timeouts": {},
"version": "2.2.0"
},
"networkd": {},
"passwd": {
"users": [
{
"name": "core",
"sshAuthorizedKeys": [
"ssh-rsa AAAA..."
]
}
]
},
"storage": {},
"systemd": {}
}
==== Configure Kernel Parameters for hosted configuration ====
This section is accomplished running from the Linux ISO.
To add kernel parameters to instruct container Linux to use the hosted configuration, add a grub.cfg to the OEM partition of the Container Linux VM.
ls -l /dev/disk/by-partlabel
lrwxrwxrwx 1 root root 10 Aug 19 13:42 BIOS-BOOT -> ../../sda2
lrwxrwxrwx 1 root root 10 Aug 19 13:42 EFI-SYSTEM -> ../../sda1
lrwxrwxrwx 1 root root 10 Aug 19 13:42 OEM -> ../../sda6
lrwxrwxrwx 1 root root 10 Aug 19 13:43 OEM-CONFIG -> ../../sda7
lrwxrwxrwx 1 root root 10 Aug 19 13:42 ROOT -> ../../sda9
lrwxrwxrwx 1 root root 10 Aug 19 13:42 USR-A -> ../../sda3
lrwxrwxrwx 1 root root 10 Aug 19 13:42 USR-B -> ../../sda4
mount /dev/sda6 /media
/media/grub.cfg
linux_append="coreos.autologin coreos.first_boot=1 coreos.config.url=http:///config.json"
Container Linux specific options are documented here:
https://coreos.com/os/docs/latest/booting-with-pxe.html
With your web-server running and the hosted configuration in place, reboot the VM without the Linux Live ISO.
===== Where to go from here =====
- Enable dockerd, either manually or via the hosted configuration, and you can use the docker client command on another machine to run containers on this VM.
- Clone the ZFS disk and make clusters of Container Linux VMs running dockerd, swarm, rkt, flannel, kubernetes, etc.