Posts match “ virtualbox ” tag:


To learn how to use node-serialport, I need to prepare an easy-to-verify development environment. So, I select VirtualBox + Vagrant + virtual serial port to setup the development environment. The article is to summarize how I setup step-by-step.

Environment Preparation

Before setup, following softwares need to be installed:

Note, it's very easy to install socat with homebrew:

brew install socat

VirtualBox Setup

I select precise64 as the basebox, and initiate the virtualbox:

vagrant init precise64

Next step is to add following lines into the Vagrantfile file at current path:

config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--uart1", "0x3f8", "4"]
    vb.customize ["modifyvm", :id, "--uartmode1", "server", "/tmp/my_tty"]

The 1st line of modifyvm is to enable virtual serial port in virtualbox.
The 2nd line of modifyvm is to connect the virtual serial port to a software pipe on host OS (Mac). In this case, the local domain socket (/tmp/my_tty) is used.

Then, launch the box

touch /tmp/my_tty
vagrant up

Note, the first line is to make sure the socket file already exists before the virtual machine is started. The third line is to login the guest OS for manipulating virtual serial port.

VMWare Fusion Setup

(to-be-complete later...)

Test with SocketServer on Host OS

At the Guest OS (Ubuntu 12.04 64 bits), the virtual serial port can be found at /dev/ttyS0. Then, we use screen tool to manipulate the serial port. Let's open a terminal, name it as T1, and type following command:

vagrant ssh
screen /dev/ttyS0 38400

At the Host OS (Mac OSX), the file for local domain socket connected by virtual serial port is /tmp/my_tty. To monitor the domain socket, socat tool is used. Let's open another terminal, name it as T2, and type following command:

socat /tmp/my_tty tcp-listen:9000 &
telnet localhost 9000

Then, when you type some characters on T1 then T2 shows those characters, and vice versa.

At T1, to exit from screen, please press ctrl-a k to kill it.
At T2, after the telnet process is killed, the socat process is also terminated.

Test with Virtual SerialPort on Host OS

The steps are similar to previous section, but the steps for T2 (2nd terminal) are different. Let's type socat -d -d /tmp/my_tty PTY. It might output following messages on the terminal:

2013/09/14 18:41:27 socat[50862] N opening connection to LEN=17 AF=1 "/tmp/my_tty"
2013/09/14 18:41:27 socat[50862] N successfully connected from local address LEN=16 AF=1 ""
2013/09/14 18:41:27 socat[50862] N successfully connected via
2013/09/14 18:41:27 socat[50862] N PTY is /dev/ttys001
2013/09/14 18:41:27 socat[50862] N starting data transfer loop with FDs [3,3] and [4,4]
2013/09/14 18:42:37 socat[50862] N socket 2 (fd 4) is at EOF
2013/09/14 18:42:37 socat[50862] N socket 1 (fd 3) is at EOF
2013/09/14 18:42:37 socat[50862] N socket 2 (fd 4) is at EOF
2013/09/14 18:42:37 socat[50862] N exiting with status 0

socat indicates the named pipe for virtual serial port on host OS is created, and placed at /dev/ttys001. Then, type screen /dev/ttys001 38400. Finally, the virtual serial ports on both Guest and Host OSes are connected.


Recently, I am interested in SBC (single-board computer) and need to prepare a Linux development environment because many utilities/tools/packages are ONLY available on Linux (such as cross-compiler). I have 2 Mac mini and 1 MBP, and I want to share the Linux development environment among these computers with minimal efforts. Then, it comes to me to utilize Vagrant and VirtualBox to automate Linux environment setup.

Then, I meet several problems... Here I explain how those problems are solved, and the results are committed to github.

USB SD-Card Reader

Now popular SBCs use SD-card as storage to store Linux or Android, so it's necessary to use dd command to write Linux/Android images onto SD-card. For this purpoase, I select one combo card reader: Digifusion SD2 GO 120 in 1:

However, when the Digifusion card reader is connected to the USB port on my MBP, the card reader is automatically mounted by Mac OSX. Of course I can manually add USB filter with VirtualBox GUI

But I don't like GUI that breaks my idea to automate development environment setup. So, I need to automate it with VBoxManage.

First, it's failed to enable virtual USB controller. You need to install VirtualBox 4.2.18 Oracle VM VirtualBox Extension Pack. After installing extension pack, the --usb on and --usbehci on can work successfully with Vagrantfile:

box.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--usb", "on"]
    vb.customize ["modifyvm", :id, "--usbehci", "on"]

Second, you need to add USB filter with VBoxManage usbfilter command. Before writing the filter, you can observe that Digifusion card reader is treated as mass storage:

$ VBoxManage list usbhost
UUID:               493f68ba-d20c-4830-94dc-db372fdc7236
VendorId:           0x05ac (05AC)
ProductId:          0x8510 (8510)
Revision:           128.37 (12837)
Port:               1
USB version/speed:  0/2
Manufacturer:       Apple Inc.
Product:            FaceTime HD Camera (Built-in)
SerialNumber:       CC2D4K0FFXDN9KE0
Address:            p=0x8510;v=0x05ac;s=0x00000f28d601571d;l=0x1a110000
Current State:      Busy

UUID:               13e7ef3b-e262-48b0-9281-fe8b988d4446
VendorId:           0x14cd (14CD)
ProductId:          0x127a (127A)
Revision:           1.0 (0100)
Port:               1
USB version/speed:  0/2
Manufacturer:       Generic
Product:            Mass Storage Device
SerialNumber:       127A20090522
Address:            p=0x127a;v=0x14cd;s=0x00002a2d9bb767a7;l=0x1d110000
Current State:      Held

So, to solve the problem simply, I add one USB filter to allow VirtualBox to mount any USB mass storage onto the VM:

box.vm.provider :virtualbox do |vb|
    vb.customize ["usbfilter", "add", "0", 
        "--target", :id, 
        "--name", "Any mass storage", 
        "--manufacturer", "Generic",
        "--product", "Mass Storage Device"]

With above script, when the VM is launched with vagrant up command, you can see one USB filter "Any mass storage" is added in VirtualBox GUI:

And, the devices in Ubuntu (precise64) for Digifusion card reader are mounted as sdb ~ sdd:

vagrant@sbc-env:~$ ls -al /dev/sd*
brw-rw---- 1 root disk 8,  0 Oct 13 16:46 /dev/sda
brw-rw---- 1 root disk 8,  1 Oct 13 16:46 /dev/sda1
brw-rw---- 1 root disk 8,  2 Oct 13 16:46 /dev/sda2
brw-rw---- 1 root disk 8,  5 Oct 13 16:46 /dev/sda5
brw------- 1 root root 8, 16 Oct 13 16:47 /dev/sdb
brw------- 1 root root 8, 17 Oct 13 16:47 /dev/sdb1
brw------- 1 root root 8, 18 Oct 13 16:47 /dev/sdb2
brw-rw---- 1 root disk 8, 32 Oct 13 16:47 /dev/sdc
brw-rw---- 1 root disk 8, 48 Oct 13 16:47 /dev/sdd