My laptop comes with Windows, like most other laptops in the market. But as a computer science student, I need to use Linux from time to time. The laptop manufacturer advised me not to install Linux directly on this laptop. Although this would not void my warranty, they would not provide technical support or supply device drivers if I install Linux. Therefore, I turned into VirtualBox, a hypervisor that allows me to run Linux in a virtual machine, alongside the Windows installation.
I'm also a heavy user of Dropbox, a file hosting service that can synchronize my documents among all my device. I have Dropbox clients installed everywhere, including the Windows of this laptop, and the Linux virtual machine. When I edit a file, the Dropbox client uploads this file to the cloud, and then the Dropbox clients on all other devices download the file from the cloud.
One day, there's a congestion on my apartment's WiFi hotspot, and I notice that the Dropbox synchronization between Windows and the Linux virtual machine is having significant delay: every update travels a long way to the cloud, and then comes back. I also realize that, in my setup, the entire Dropbox contents are duplicated twice: it has one copy in Windows, and another copy in Linux virtual machine. Although having multiple copies is usually a good thing because you have more redundancy, having multiple copies on the same hard drive is not useful. Can I eliminate the synchronization delay and the redundant copy?
VirtualBox Shared Folder
VirtualBox has a nifty feature, shared folders, which allows files of the host system to be accessed within a guest system. In my setup, I could use this feature to access the Dropbox on Windows within the Linux virtual machine.
The setup is easy: open up Settings dialog of the Linux virtual machine, and add a machine folder named "Dropbox".
Start or reboot the virtual machine, and a folder /media/sf_Dropbox
shows up:
To access this folder, the Linux user must be in vboxsf
group.
sudo usermod -a -G vboxsf username
does just that.
(Changing groups takes effect after the user re-login.)
Symbolic Link
Now my Windows Dropbox is accessible from the Linux virtual machine at /media/sf_Dropbox
folder.
However, I'm more accustomed to ~/Dropbox
, the default folder of Linux Dropbox client.
To access Windows Dropbox at ~/Dropbox
, I need to stop and uninstall Linux Dropbox client, delete the old $HOME/Dropbox
folder (along with all the duplicate files).
Then, one command does it all: ln -s /media/sf_Dropbox ~/Dropbox
.
Bingo, the Dropbox is back at my home folder.
gedit Save Error and Solution
Everything appears to work fine, until I start writing a document with my favorite text editor: gedit (and pluma, which is very similar). As soon as I click the Save button, an error pops up: "Unexpected error: Error renaming temporary file: Text file busy".
It turns out that this is a bug in either VirtualBox or gio. The gio library used by gedit saves a file by writing to a temporary file and renaming to the final name, without closing the file first. This operation is valid on most Linux filesystems, but is not allowed on Windows. Since my Dropbox is now on a Windows filesystem, saving a file to Dropbox this way would be rejected by Windows and cause an error.
I tried a few ways to fix this problem, and finally found a working solution: "loopback" SFTP.
- Install OpenSSH Server:
sudo apt-get install openssh-server
. - Enable SSH public key authentication:
ssh-keygen
and confirm everything but don't set passphrase. - Try SSH connection to localhost:
ssh localhost
. - Install GVFS:
sudo apt-get install gvfs-bin gvfs-fuse
. - Mount localhost SFTP:
gvfs-mount -f sftp://localhost
.
After running these file commands, the filesystem of local Linux machine should be available at /run/user/<uid>/gvfs/sftp:host=localhost
, where <uid>
is my user id which can be determined with id -u
command.
And of course, /media/sf_Dropbox
would be available at /run/user/<uid>/gvfs/sftp:host=localhost/media/sf_Dropbox
.
Re-create the symbolic link with ln -s /run/user/$(id -u)/gvfs/sftp:host=localhost/media/sf_Dropbox ~/Dropbox
(after deleting the old one), and try gedit again.
This time, it works!
Automate SFTP Mounting
Reboot the Linux virtual machine, and I find my Dropbox is inaccessible again!
Although the VirtualBox shared folder /media/sf_Dropbox
is intact, the symbolic link does not work, because the GVFS mount isn't automatically mounted.
Typing gvfs-mount -f sftp://localhost
in a console solves the problem, but I want to automate this mounting process.
To automate SFTP mounting, I need to create an auto-start entry to be executed when I log into the desktop session.
Open
~/.config/autostart
folder.Create a text file named
gvfs-mount.desktop
, and open it with gedit.Paste the following contents.
[Desktop Entry] Type=Application Exec=gvfs-mount sftp://localhost Name=mount Dropbox
The next time I reboot the Linux virtual machine, my Dropbox is ready to use at ~/Dropbox
.