Here I'm republishing an old blog post of mine originally from September 2016. The article has been slightly improved.

Vagrant: Creating a FreeBSD 11 base box (virtualbox) - pt. 1

For a while now I've been messing with backup stuff (namely a program called _Bacula_). To test backups properly it of course makes sense to have multiple nodes available. Now I do not have several unused PCs and other hardware available nor would I want to set up multiple nodes just to configure them similarly in the end. The easy solution? Virtualization. It allows to set up a virtual machine once and then clone it as the need arises. Also it means that I can try out things, do away with the VM and start over with a clean one if I want to.

Give it a try even if you're new to VirtualBox! Working with it is very easy and just as useful. The idea of virtualization can be daunting if you're just starting. Therefore this post is meant as an introduction (I'll even detail VM creation with pictures). If you already know how to use VirtualBox and have a good idea of what Vagrant is about you may skip this post and go to the next one where the actual base box is being built.

Vagrant: Creating a FreeBSD 11 base box (virtualbox) - pt. 2

What is Vagrant?

So what's Vagrant? Vagrant is a program written in Ruby that runs on multiple platforms (FreeBSD, Linux, OS X and even Windows). It basically is a wrapper for virtualization software that makes working with VMs extremely easy and convenient. Vagrant supports multiple hypervisors and containers (simply called providers in Vagrant terminology): VirtualBox, VMWare, KVM, LXC and Docker. A GSoC effort exists to also support FreeBSD's native hypervisor Bhyve - I'll definitely give this one a shot in the future.

Vagrant-Bhyve project

Vagrant uses a configuration file (the _Vagrantfile_) for each VM to know which template (called _base box_) to create it from, how to configure it and so on. It also supports a lot advanced functionality like provisioning a newly created VM using configuration management tools like the veterans _Puppet_ and _Chef_ or the newer generation like _Salt Stack_ and _Ansible_. There are many cases where Vagrant can help you - just think about it for a moment.

There are a LOT of base boxes already made for you to download and use. If you need to create new base boxes quite often, you even may want to automate this step. This is possible with a tool called _Packer_ that allows you to create base boxes from a configuration file. This post however details the manual creation of a Vagrant box using FreeBSD 11 as the target OS.

Vagrant Boxes Catalog

More Vgrant Boxes

Packer website

Installing Vagrant

You can probably install Vagrant using the package manager of your OS. If you are using a strange system that has no package management (i.e. Windows), you have to find out how to do it yourself as I have given up on those systems almost a decade ago now and have no idea how it works there. I'll discuss setting it up on FreeBSD here. First issue:

# pkg install vagrant

Keep in mind however, that by default FreeBSD uses the quarterly package repositories now and you should either change that or simply install from ports (_sysutils/vagrant_) if you want the newest version.

Now think about the _provider_ that you want to use. If you want to follow along with this article, we're using VirtualBox. So go ahead and install it. On FreeBSD VirtualBox 5.x is finally available (Oracle does not support FreeBSD as a host system and the complicated work of porting it over was done by the community - thanks to everybody involved!) and it totally makes sense to install this new version. At the time of this writing it's still version 4.x in the quarterly repository. So make sure whether

# pkg install virtualbox-ose

would install the old or the new version. Configure the _latest_ repository instead of _quarterly_ or build from ports (_emulators/virtualbox-ose_). If you choose to build from ports, consider doing the same thing for Vagrant. Otherwise you may build a version of VirtualBox that is newer than what Vagrant supports. To be able to run VirtualBox, make your user a member of the _vboxusers_ group:

# pw groupmod vboxusers -m username

Remember that you have to log out and log back in for the new group membership to take effect. Ensure that the kernel modules for VirtualBox are loaded during system startup and load them ad hoc without having to restart:

# echo 'vboxdrv_load="YES"' >> /boot/loader.conf
# kldload vboxdrv.ko

Now make sure that VirtualBox' network daemon gets started by default and make it start in the current session:

# sysrc vboxnet_enable="YES"
# service vboxnet start

All done. VirtualBox is ready to be used. There's more configuration suggested if e.g. you want to use USB in your VMs (which in this case I don't).

https://wiki.freebsd.org/VirtualBox

Creating a VM

VirtualBox has a headless mode and can be controlled using e.g. using the command line. But most people would probably prefer to use the GUI that it also comes with. So open up that program. (For steps where you can just accept the defaults I haven't made a screenshot.)

The VirtualBox GUI (PNG)

Click on _New_ to launch an assistant for creating a new VM.

Choosing Name and type of the new VM (PNG)

Give the new VM a name and select the type of operating system that it's meant for. If you use a name that is somewhat like "freebsd", VirtualBox will automatically suggest the right type and OS. Since this VM is going to be a template rather than a single-purpose one, I chose the name "freebsd-template" to reflect that.

Setting the amount of RAM for the VM (PNG)

Set the amount of ram for the new VM. Think about the correct value for a moment. It's no problem if you notice that you need more later - you can always change the amount of RAM allocated for the VM when it is turned off. But setting it right now saves you the time and effort to re-adjust it later. So how much should you select here? It depends on several factors.

I'm planning for a template that I want to spin up as multiple VMs so the host system must have quite a bit more RAM than the three to five VMs (that I want to run in parallel) together. However my host machine has 24GB of RAM and so there's no need for me to be stingy and I'm allocating 1024 MB because I have plenty available. If you have little free RAM go for less. I intend to use FreeBSD in text-mode with not too many services running. You could probably do with 256 MB or even less if you really have to.

Allocating space for the virtual hard drive (PNG)

The VM needs a virtual hard disk. Set the maximum size for that. Just as with RAM choose some value that's sensible for your case. Again: I have enough space so I don't have to go with ultra-low values of 3 GB or so. Making the virtual hard drive dynamically allocated means that it's only going to take the actual size of its data of space on your real hard drive. This means that it can "grow" until it reaches its maximum size. Note that it won't automatically shrink if you delete data.

Starting the VM (PNG)

That's all, you have created a VM. Start it now.

Selecting the ISO image (PNG)

On first start, VirtualBox will ask you to insert some kind of installer media. If it didn't, the same thing would happen that happens on a PC with an empty hard drive: The system would fail to boot. Download an ISO image of FreeBSD 11 and select it as the boot iso in VirtualBox.

FreeBSD Download page

Selecting the ISO image (PNG)

Now let the VM boot! I'm using FreeBSD11-RC2 here because the date for the final release has been delayed (it should have been out now and that's what I had planned for).

Installing FreeBSD 11

The OS should boot up and offer you to go to the installer. Proceed and install FreeBSD. It's pretty straight-forward but there are a few things noteworthy about the installation options. I don't want to repeat myself, so if you're completely new to installing FreeBSD, you might want to take a look at the article where I detailed the installation of FreeBSD 10.1 (I explained disklabels and such). Here I'll only cover what's new in the 11.0 installer.

Installing FreeBSD - a tutorial from the Linux user's perspective (2015)

De-selecting all optional distribution sets (PNG)

I use the hostname "fbsd-template.local". The installation sets are different because the base system structure has been redesigned. Most likely you won't need any of the optional sets. To keep the template nice and small I suggest to de-select all of them. Go with _UFS_ as the file system unless you have special needs - and can spare a fair amount of RAM (2G+) for each VM. So going with AUTO (UFS) and using the entire disk is probably fine. Choose GPT partitioning - we're not dealing with legacy hardware here.

Setting the date (PNG)

Enter a root password; if you intend to share your base box, it's common practice to set the password to _vagrant_ so that others might easily access and modify it. Configure your network (most likely an IPV4 network with DHCP and no IPV6). Thanks to DHCP you should not need to configure the resolver but can accept the values that the installer was told. Configure the timezone. The FreeBSD 11 installer will let you set date and time now which is a nice feature.

Setting system time (PNG)

Deselect all services except for _SSH_ which is how Vagrant will connect to the VMs. The _system hardening_ dialog is also new. In my case it's not terribly important since I'm creating a simple VM template for testing purposes. But for production servers it is actually a pretty good idea to tweak some options. I've grown a habit of cutting down services that are remotely accessible to the necessary minimum and thus simply selecting the two last options saves me some hassle of editing rc.conf to do just that.

Tweaking the hardening options (PNG)

We don't need to add users right now and can quit the installation without final modifications. So let's reboot.

Removing installation iso (PNG)

It's necessary to remove the installation iso or the machine will boot to the installer again instead of into the new operating system. If you're not fast enough and the system is already booting the installation iso again, just force the unmount and reset the VM.

Resetting the VM (PNG)

Now the VM should boot into your new FreeBSD 11 system!

What's next?

While this part discussed the requirements and detailed the preparations, the second part will describe how to actually build the base box for Vagrant.

BACK TO 2016 OVERVIEW