-
-
Save olalonde/3f7512c0bd2bc8abb46d to your computer and use it in GitHub Desktop.
| #!/bin/bash | |
| # | |
| # This script will mount /Users in the boot2docker VM using NFS (instead of the | |
| # default vboxsf). It's probably not a good idea to run it while there are | |
| # Docker containers running in boot2docker. | |
| # | |
| # Usage: sudo ./boot2docker-use-nfs.sh | |
| # | |
| if [ "$USER" != "root" ] | |
| then | |
| echo "This script must be run with sudo: sudo ${0}" | |
| exit -1 | |
| fi | |
| # Run command as non root http://stackoverflow.com/a/10220200/96855 | |
| B2D_IP=$(sudo -u ${SUDO_USER} boot2docker ip &> /dev/null) | |
| if [ "$?" != "0" ] | |
| then | |
| sudo -u ${SUDO_USER} boot2docker up | |
| $(sudo -u ${SUDO_USER} boot2docker shellinit) | |
| B2D_IP=$(sudo -u ${SUDO_USER} boot2docker ip &> /dev/null) | |
| #echo "You need to start boot2docker first: boot2docker up && \$(boot2docker shellinit) " | |
| #exit -1 | |
| fi | |
| OSX_IP=$(ifconfig en0 | grep --word-regexp inet | awk '{print $2}') | |
| MAP_USER=${SUDO_USER} | |
| MAP_GROUP=$(sudo -u ${SUDO_USER} id -n -g) | |
| RESTART_NFSD=0 | |
| EXPORTS_LINE="/Users -mapall=${MAP_USER}:${MAP_GROUP} ${OSX_IP}" | |
| grep "$EXPORTS_LINE" /etc/exports > /dev/null | |
| if [ "$?" != "0" ] | |
| then | |
| RESTART_NFSD=1 | |
| # Backup exports file | |
| $(cp -n /etc/exports /etc/exports.bak) && \ | |
| echo "Backed up /etc/exports to /etc/exports.bak" | |
| # Delete previously generated line if it exists | |
| grep -v '^/Users ' /etc/exports > /etc/exports | |
| # We are using the OS X IP because the b2d VM is behind NAT | |
| echo "$EXPORTS_LINE" >> /etc/exports | |
| fi | |
| NFSD_LINE="nfs.server.mount.require_resv_port = 0" | |
| grep "$NFSD_LINE" /etc/nfs.conf > /dev/null | |
| if [ "$?" != "0" ] | |
| then | |
| RESTART_NFSD=1 | |
| # Backup /etc/nfs.conf file | |
| $(cp -n /etc/nfs.conf /etc/nfs.conf.bak) && \ | |
| echo "Backed up /etc/nfs.conf to /etc/nfs.conf.bak" | |
| echo "nfs.server.mount.require_resv_port = 0" >> /etc/nfs.conf | |
| fi | |
| if [ "$RESTART_NFSD" == "1" ] | |
| then | |
| echo "Restarting nfsd" | |
| nfsd update 2> /dev/null || (nfsd start && sleep 5) | |
| fi | |
| sudo -u ${SUDO_USER} boot2docker ssh << EOF | |
| mount | grep nfs > /dev/null && \ | |
| echo "/Users already mounted with NFS" && \ | |
| exit | |
| echo "Unmounting /Users" | |
| sudo umount /Users 2> /dev/null | |
| echo "Starting nfs-client" | |
| sudo /usr/local/etc/init.d/nfs-client start 2> /dev/null | |
| echo "Mounting /Users" | |
| sudo mount $OSX_IP:/Users /Users -o rw,async,noatime,rsize=32768,wsize=32768,proto=tcp,nfsvers=3 | |
| echo "Mounted /Users:" | |
| ls -al /Users | |
| exit | |
| EOF |
In case it's useful to anyone else, i use this to determine the correct local ip instead of always using en0 (on line #29) :
OSX_IP=$(ifconfig -m `route get 8.8.8.8 | awk '{if ($1 ~ /interface:/){print $2}}'` | awk 'sub(/inet /,""){print $1}')
I just updated the script to make it faster (e.g. won't wait 10s if nfsd already running or /Users already mounted with nfs).
Thanks @DavidStaron. OSX_IP wasn't been set, but your suggestion works great
+1 @DavidStaron
I ported this script to docker-machine in case anyone wants to switch: https://gist.github.com/olalonde/74de9d053448b977f77e
Great script! Here is my take on it; it uses a little know fact that if you mount a volume on a preexisting folder with subfolders the new mount takes precedence. So the boot2docker guest still have access to required volumes under /Users.
The changes persist between reboots of the boot2docker guest as long as VirtualBox keeps the ip (have never changed for me, but a possibility).
I have also successfully tested this while using folders other then /Users/~/. The script shares the current folder with the boot2docker guest so if you need multiple folders just run it in a parent folder.
Should be fixed in latest revision.