Rather than use an out-of-date version of Scotch/Box, here are my notes on creating a custom Vagrant Box (reference).

NOTE: These are my notes for creating butterbox, the new version (not old version).

Getting Started

Pick a base distro. I’m starting with Ubuntu 18.04 “daily”.


Create a folder and do the init.

# Make the working folder
mkdir butterbox
cd butterbox

# Make a folder for web pages (when creating a scotch/box like)
mkdir www

# Initialize the box
vagrant init ubuntu/bionic64

This creates a Vagrantfile for you.

Before invoking vagrant up, you should edit the Vagrantfile.

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  # For a complete reference of configuration options, please see the online documentation at
  # https://docs.vagrantup.com.

  config.vm.box = "ubuntu/bionic64"
  config.vm.hostname = "butterbox"

  config.vm.network "private_network", ip: ""
  # config.vm.network "public_network"

  config.vm.synced_folder "www", "/var/www", :mount_options => ["dmode=777", "fmode=666"]

  config.vm.provider "virtualbox" do |vb|
    vb.memory = "1024"
    vb.cpus = 2

Now do a vagrant up.

You will probably get an error like this (trimmed):

==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Setting hostname...
==> default: Configuring and enabling network interfaces...
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

/sbin/ifdown 'enp0s8' || true
/sbin/ip addr flush dev 'enp0s8'
# Remove any previous network modifications from the interfaces file
sed -e '/^#VAGRANT-BEGIN/,$ d' /etc/network/interfaces > /tmp/vagrant-network-interfaces.pre
sed -ne '/^#VAGRANT-END/,$ p' /etc/network/interfaces | tac | sed -e '/^#VAGRANT-END/,$ d' | tac > /tmp/vagrant-network-interfaces.post

Long story short, this is because you are missing the ifup and ifdown tools ([reference)[https://github.com/cilium/cilium/issues/1918]).

vagrant ssh

sudo apt update
sudo apt install ifupdown


# now shutdown the vm
vagrant halt

Next time you start the VM (vagrant up), it will use the requested IP address.

Dev Tools Setup

Do the following for a good general setup.

sudo apt install build-essential git subversion mercurial

Web Server Setup

Out-of-the-box Apache2 comes pre-installed, but the default configuration expects to find a folder /var/www/html. You can simple create the html folder inside the www folder and it will work. Alternatively, you can edit the server configuration.

vagrant ssh
cd /etc/apache2/sites-enabled/
sudo nano 000-default.conf

# Helpful symlink
ln -s /etc/apache2/sites-available/000-default.conf ~/apache.conf

With the file open, find this and adjust the path accordingly (DocumentRoot becomes /var/www instead of /var/www/html).

<VirtualHost *:80>
        #ServerName www.example.com

        ServerAdmin [email protected]
        DocumentRoot /var/www

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

Restart the server.

sudo service apache2 restart

Install PHP 7.2:

sudo apt install php7.2 php7.2-xml php7.2-curl php7.2-bcmath php7.2-opcache php7.2-phpdbg php7.2-mysql php7.2-mbstring

# Helpful symlink
ln -s /etc/php/7.2/apache2/php.ini ~/php.ini

Install MariaDB 10.3 (reference):

sudo apt-get install software-properties-common
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
sudo add-apt-repository 'deb [arch=amd64] http://mariadb.mirror.colo-serv.net/repo/10.3/ubuntu bionic main'

sudo apt update
sudo apt install mariadb-server mariadb-plugin-tokudb

# Helpful symlink
ln -s /etc/mysql/my.cnf ~/my.cnf

Install Redis:

sudo apt install redis php-redis

# Helpful symlink
ln -s /etc/redis/redis.conf ~/redis.conf

Install Memcached (reference):

sudo apt install memcached php-memcached

# Helpful symlink
ln -s /etc/memcached.conf ~/memcached.conf

Install Nodejs (reference):

curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
sudo apt-get install -y nodejs

Packing up the box

First ssh in and do a cleanup (reference).

vagrant ssh

# According to the top comment in my reference, this is needed
sudo rm /etc/udev/rules.d/70-persistent-net.rules

# clean apt cache
sudo apt clean

# zero out the rest of the unused space in the VM
sudo dd if=/dev/zero of=/EMPTY bs=1M
sudo rm -f /EMPTY

# blank the bash history
cat /dev/null > ~/.bash_history && history -c && exit

Then package up the box.

vagrant package --output mynew.box