A collection of shell scripts to run bhyve VMs on my FreeBSD desktop and server machines.
-
Host Machines
-
FreeBSD 10.2-RELEASE
-
ZFS zvols as the virtual disks for bhyve VMs
-
Bridged tap devices for network access
-
-
Guest Machines
-
Linux Guests: CentOS 6, 7, RHEL 7 and Ubuntu 14.04 LTS
-
BSD Guests: OpenBSD 5.8
-
These disk1 are thin-provisioned zvols.
$ zfs list -r zroot/bhyve NAME USED AVAIL REFER MOUNTPOINT zroot/bhyve 107G 364G 144K none zroot/bhyve/centos6-vertica 49.7G 364G 96K none zroot/bhyve/centos6-vertica/disk1 49.7G 364G 41.2G - zroot/bhyve/centos7-docker1 38.2G 364G 144K none zroot/bhyve/centos7-docker1/disk1 38.2G 364G 32.3G - zroot/bhyve/openbsd 969M 364G 96K none zroot/bhyve/openbsd/disk1 969M 364G 969M - zroot/bhyve/rhel7-ost-icehouse 7.55G 364G 144K none zroot/bhyve/rhel7-ost-icehouse/disk1 7.55G 364G 8.27G - zroot/bhyve/rhel7-ost-juno 5.20G 364G 144K none zroot/bhyve/rhel7-ost-juno/disk1 5.20G 364G 4.76G - zroot/bhyve/ubuntu-14.04 5.00G 364G 144K none zroot/bhyve/ubuntu-14.04/disk1 5.00G 364G 5.00G -
$ sudo zfs create zroot/bhyve/centos7-docker1 $ sudo zfs create -V 48G -s zroot/bhyve/centos7-docker1/disk1
The following script loads the kernel modules for bhyve and creates tap devices for the VMs.
$ sudo ./setup.sh
Edit device.map.
(hd0) /dev/zvol/zroot/bhyve/centos7-docker1/disk1 (cd0) /home/tatsuya/installers/centos/CentOS-7.0-1406-x86_64-DVD.iso
Run grub-bhyve as root.
$ cd centos7 $ sudo grub-bhyve -m device.map -r cd0 -M 4096M centos7-docker1 grup> ls (hd0) (hd0,msdos2) (hd0,msdos1) (cd0) (cd0,msdos2) (host) (lvm/centos-root) (lvm/centos-swap) grub> ls (cd0)/ CentOS_BuildTag EFI/ EULA GPL images/ isolinux/ LiveOS/ Packages/ repodata/ RPM-GPG-KEY-CentOS-Testing-7 RPM-GPG-KEY-CentOS-7 TRANS.TBL grup> ls (cd0)/isolinux boot.cat boot.msg grub.conf initrd.img isolinux.bin isolinux.cfg memtest splash.png TRANS.TBL upgrade.img vesamenu.c32 vmlinuz grub> linux (cd0)/isolinux/vmlinuz grub> initrd (cd0)/isolinux/initrd.img grub> boot
NOTE:
For CentOS, it’s recommended to perform VNC-based graphical installation rather than console-based installation because graphical one gives you more customization options (e.g. custom disk layout) To do that, add the following options to linux command.
grub> linux (cd0)/isolinux/vmlinuz vnc headless ip=dhcp ksdevice=eth0 lang=en_US keymap=us
Once the installer started, it will give tell you VNC server address and port.
For example,
Please manually connect your vnc client to 10.0.0.117:1 to begin the install.
Run bhyve as root. Note that the VM has the installer DVD ISO attached.
$ sudo bhyve -c 4 -m 4096M -H -P -A -l com1,stdio \ -s 0:0,hostbridge -s 1:0,lpc \ -s 2:0,virtio-net,tap1 \ -s 3,ahci-cd,/home/tatsuya/installers/centos/CentOS-7.0-1406-x86_64-DVD.iso \ -s 4,virtio-blk,/dev/zvol/zroot/bhyve/centos7-docker1/disk1 \ centos7-docker1
When installation is completed, press the "Restart" button on the installer screen. This will shutdown the VM and drop you into a shell prompt (instead of restarting). Proceed to next chapter to boot the VM from the disk image.
$ cd centos7
Edit grub.in. You might want to take a look at grub menu for kernel parameters.
Run the VM.
$ sudo ./run.sh
Edit device.map.
(hd0) /dev/zvol/zroot/bhyve/openbsd/disk1 (cd0) /home/tatsuya/installers/openbsd/openbsd-5.7/install57.iso
Run grub-bhyve as root. Ensure to boot with the OpenBSD install kernel (bsd.rd).
$ cd openbsd $ sudo grub-bhyve -m device.map -r cd0 -M 256M openbsd grup> ls (hd0) (cd0) (host) grub> ls (cd0)/ 5.7/ etc/ TRANS.TBL grup> ls (cd0)/5.7 amd64/ TRANS.TBL grub> ls (cd0)/5.7/amd64/ base57.tgz boot.catalog bsd bsd.mp bsd.rd cdboot cdbr comp57.tgz game57.tgz INSTALL.amd64 man57.tgz SHA256 TRANS.TBL xbase57.tgz xfont57.tgz xserv57.tgz xshare57.tgz grub> kopenbsd -h com0 (cd0)/5.7/amd64/bsd.rd grub> boot
NOTE: Example
Run bhyve as root. Note that the VM has the installer ISO attached. Also -W option seems required. It forces virtio to use single-vector MSI.
$ sudo bhyve -W -m 256M -H -P -A -l com1,stdio \ -s 0:0,hostbridge \ -s 1:0,lpc \ -s 2:0,virtio-net,tap4 \ -s 3,ahci-cd,/home/tatsuya/installers/openbsd/openbsd-5.7/install57.iso \ -s 4,virtio-blk,/dev/zvol/zroot/bhyve/openbsd/disk1 \ openbsd
Login to the VM and ensure the system clock is correct. By some
reason it’s usually advance 3 days, so ntpd
won’t be able to
adjust the clock. Run ntpdate to fix it.2
[docker1] /home/tatsuya% sudo systemctl stop ntpd.service [docker1] /home/tatsuya% sudo ntpdate -b pool.ntp.org 16 Mar 13:46:27 ntpdate[2046]: step time server 202.112.29.82 offset -277199.180289 sec [docker1] /home/tatsuya% sudo systemctl start ntpd.service
NOTE: This might be fixed in 10.2-RELEASE (Reference)
Edit grub.in so that it will boot from the latest Linux Kernel.
linux (hd0,msdos1)/vmlinuz-3.10.0-123.20.1.el7.x86_64 root=/dev/mapper/centos-root initrd (hd0,msdos1)/initramfs-3.10.0-123.20.1.el7.x86_64.img boot
bhyve-script is open-sourced under the MIT license. See the LICENSE file for details.