Mounting VirtualBox Shared Folders
October 4, 2016
Yesterday I experimented a bit with VirtualBox shared folders. I was able to share several directories in my home directory on OS X under my home directory on a Ubuntu 16.04.1 installation running in a virtual machine. Today I wanted to repeat the steps and write everything down.
As I am still migrating from Linux to OS X I need access to Linux one way or another for the time being. While I have been using Docker for Mac for some applications I ran into issues like a huge speed penalty for non-bind-mounts and containers just freezing. As I haven't been able yet to pin-point the exact cause of the latter I am falling back to Ubuntu running under VirtualBox for the time being. And as I eventually want to work on my files under OS X using shared folders sounds like a workable temporary solution.
Creating a Ubuntu 16.04.1 Virtual Machine
I created a Ubuntu 16.04.1 virtual machine using the following settings:
- Name: Ecce 16.04.1.
- Type: Linux.
- Version: Ubuntu (64-bit).
- Memory size: 8192 MB.
- A virtual hard disk drive of 20G of which 8G is assigned to swap (default). This leaves me 12G for the partition mounted under '/', of which nearly 4G is used by the basic install of Ubuntu.
- Bridged network with a specific MAC address so my router can assign the correct IP address using DHCP.
- USB 3.0 (xHCI) controller not USB 2.0 (default), or else I run into a "Failed to attach the USB device" error.
- 3D acceleration enabled.
During the installation process I selected "Download updates while installing".
I probably could get away without swap, or use a swap file inside a shared folder so I can avoid Time Machine from backing it up. But that's probably for later.
The name for this virtual machine was taken from the Cadwal Chronicles by Jack Vance. A trilogy I recommend to read if you like SF.
After the installation I restarted the virtual machine, inserted the Guest Additions CD, ran the installer, and restarted the machine once more. Note that the Guest Additions are required for shared folders. Moreover, it allows me to run the Ubuntu desktop in 1920 x 1200 full screen.
Creating the Mount Points on the Guest OS
Besides several directories in my home directory I also wanted to have MySQL's
data directory shared with OS X. So I needed to find out the numeric user id for mysql
and group id for mysql
. I ran the following commands in a virtual machine that had already MySQL installed:
$ id -u mysql
121
$ id -g mysql
129
Next, I created the mount-points that were not there yet:
mkdir -p ~/{.my-local,Amber,mysql-dumps}
sudo mkdir /var/lib/mysql
sudo chown 121:129 /var/lib/mysql
I use .my-local
for perlbrew
and to store some other programs. My
work is stored in the Amber
directory. Back in 1994 when I started
my own company I named it 'Castle Amber', hence the name.
Adding the Shared Folders to the Virtual Machine
For the next step I used the command line on OS X to add the shared folders. However, with the virtual machine still running I got the following error:
VBoxManage: error: The machine 'Ecce 16.04.1' is already locked for a session (o
r being unlocked)
So I stopped the virtual machine gracefully and ran the following commands.
VBoxManage sharedfolder add "Ecce 16.04.1" --name ".my-local" \
--hostpath /Users/john/.my-local
VBoxManage sharedfolder add "Ecce 16.04.1" --name "Amber" \
--hostpath /Users/john/Amber
VBoxManage sharedfolder add "Ecce 16.04.1" --name "Documents" \
--hostpath /Users/john/Documents
VBoxManage sharedfolder add "Ecce 16.04.1" --name "Downloads" \
--hostpath /Users/john/Downloads
VBoxManage sharedfolder add "Ecce 16.04.1" --name "Pictures" \
--hostpath /Users/john/Pictures
VBoxManage sharedfolder add "Ecce 16.04.1" --name "mysql-dumps" \
--hostpath /Users/john/mysql-dumps
mkdir -p ~/Library/MySQL/mysql
VBoxManage sharedfolder add "Ecce 16.04.1" --name "mysql" \
--hostpath /Users/john/Library/MySQL/mysql
Note that you can find out the exact name of a virtual machine by listing all available ones using:
$ VBoxManage list vms
"Ecce 16.04.1" {f19fbb74-cfe2-4987-bb58-0702dc557ccc}
As I wanted the data created by MySQL out of the way I decided to create
a directory MySQL
under /Users/john/Library
with a sub directory named
mysql
.
Auto-Mounting Shared Folders
Since I wanted to specify where to mount each shared folder I couldn't use
the auto-mount feature of VirtualBox but had to add each mount command
to /etc/rc.local
:
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
mount -t vboxsf -o uid=1000,gid=1000 .my-local /home/john/.my-local
mount -t vboxsf -o uid=1000,gid=1000 Amber /home/john/Amber
mount -t vboxsf -o uid=1000,gid=1000 Documents /home/john/Documents
mount -t vboxsf -o uid=1000,gid=1000 Downloads /home/john/Downloads
mount -t vboxsf -o uid=1000,gid=1000 Pictures /home/john/Pictures
mount -t vboxsf -o uid=1000,gid=1000 mysql-dumps /home/john/mysql-dumps
mount -t vboxsf -o uid=121,gid=129 mysql /var/lib/mysql
exit 0
The numeric values for uid
and gid
were obtained using the id
command. For my account these values are:
$ id -u john
1000
$ id -g john
1000
and for user mysql
group mysql
as given in the previous section.
After saving the changes to /etc/rc.local
I restarted the virtual
machine and logged back in. I verified that each mount point in my home
directory showed the expected files and directories and that I was
the owner using ls -al
.
Next I installed MySQL and made the installation secure as follows:
sudo apt-get install mysql-server mysql-client
mysql_secure_installation
As expected, the data created by this step became available in OS X
under /Users/john/Library/MySQL/mysql
:
$ ls -al ~/Library/MySQL/mysql/
total 245776
drwxr-xr-x 12 john staff 408 Oct 4 15:13 .
drwxr-xr-x 3 john staff 102 Oct 4 14:53 ..
-rw-r----- 1 john staff 56 Oct 4 15:13 auto.cnf
-rw-r--r-- 1 john staff 0 Oct 4 15:13 debian-5.7.flag
-rw-r----- 1 john staff 413 Oct 4 15:13 ib_buffer_pool
-rw-r----- 1 john staff 50331648 Oct 4 15:14 ib_logfile0
-rw-r----- 1 john staff 50331648 Oct 4 15:13 ib_logfile1
-rw-r----- 1 john staff 12582912 Oct 4 15:14 ibdata1
-rw-r----- 1 john staff 12582912 Oct 4 15:13 ibtmp1
drwxr-xr-x 77 john staff 2618 Oct 4 15:13 mysql
drwxr-xr-x 90 john staff 3060 Oct 4 15:13 performance_schema
drwxr-xr-x 108 john staff 3672 Oct 4 15:13 sys
Running ls -al
inside the guest shows, again as expected:
$ sudo ls -al /var/lib/mysql
[sudo] password for john:
total 122892
drwxr-xr-x 1 mysql mysql 408 oct 4 15:13 .
drwxr-xr-x 70 root root 4096 oct 4 15:13 ..
-rw-r----- 1 mysql mysql 56 oct 4 15:13 auto.cnf
-rw-r--r-- 1 mysql mysql 0 oct 4 15:13 debian-5.7.flag
-rw-r----- 1 mysql mysql 413 oct 4 15:13 ib_buffer_pool
-rw-r----- 1 mysql mysql 12582912 oct 4 15:14 ibdata1
-rw-r----- 1 mysql mysql 50331648 oct 4 15:14 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 oct 4 15:13 ib_logfile1
-rw-r----- 1 mysql mysql 12582912 oct 4 15:13 ibtmp1
drwxr-xr-x 1 mysql mysql 2618 oct 4 15:13 mysql
drwxr-xr-x 1 mysql mysql 3060 oct 4 15:13 performance_schema
drwxr-xr-x 1 mysql mysql 3672 oct 4 15:13 sys
While the sorting order differs, the sizes and timestamp of each file is identical.