VirtualBox虛擬機的串口通信機制有兩種,一種是通過將虛擬機的串口連接到主機的串口,另外一種是將虛擬機的串口連接到主機上的一個命名管道,第一種方式到現在我還沒有實踐出來,目前只是對命名管道的方式實踐成功。
1.啟用串口
新建虛擬機後在設置中會出現串口面板,可以進行串口設置,默認是不起用的,一般端口選擇使用COM1對應虛擬機的/dev/ttyS0,端口模式選擇Host Pipe,表示將虛擬機的串口連接到主機的一個命名管道,創建通道表示啟動虛擬機時VirtualBox會在HostOS中對應地創建一個命名管道,並使它與虛擬機的對應串口相連。端口路徑在選擇Host Pipe時表示命名管道的路徑,在Windows系統上,它是\\.\pipe\xxx的形式,在Linux可以設任何路徑,比如我們將它設為/tmp/vbox。注意,如果端口路徑對應的命名管道不能創建的話,虛擬機啟動會失敗;端口路徑的命名管道不能重復創建。
你也可以使用命令行啟用並創建一個虛擬機到主機命名管道的連接,下面的命令就將虛擬機Ubuntu 8.10 Dev OS的COM1串口和主機的/tmp/vbox命名管道連接起來:
VBoxManage setextradata "Ubuntu8.10DevOS" "VBoxInternal/Devices/serial/0/Config/IRQ" 4
VBoxManage setextradata "Ubuntu8.10DevOS" "VBoxInternal/Devices/serial/0/Config/IOBase" 0x3f8
VBoxManage setextradata "Ubuntu8.10DevOS" "VBoxInternal/Devices/serial/0/LUN#0/Driver" Char
VBoxManage setextradata "Ubuntu8.10DevOS" "VBoxInternal/Devices/serial/0/LUN#0/AttachedDriver/Driver" NamedPipe
VBoxManage setextradata "Ubuntu8.10DevOS" "VBoxInternal/Devices/serial/0/LUN#0/AttachedDriver/Config/Location" "/tmp/vbox"
VBoxManage setextradata "Ubuntu8.10DevOS" "VBoxInternal/Devices/serial/0/LUN#0/AttachedDriver/Config/IsServer" 1
2.虛擬機和主機HostOS間的串口通信
啟動虛擬機Ubuntu8.10DevOS,這時會在主機的/tmp/目錄下創建vbox新文件,可以用ls -l看到它是一個sock類型的文件,使用來進行通信的。在HostOS中安裝minicom,minicom可以用來作為串口測試:
sudo apt-get install minicom
接下來我們可以配置minicom,讓它指向/tmp/vbox,執行命令
sudo gedit /etc/minicom/minirc.dfl並修改為
pu port unix#/tmp/vbox
也可以在minicom中通過串口設置來修改。測試前應保證minicom中的串口設置的波特率和虛擬機中的串口一樣。虛擬機中的串口波特率設置可以參考下文,minicom的波特率設置可以直接在程序中Ctrl+A, O後修改,或修改配置文件。
測試過程,
1)在HostOS中啟動minicom:
sudo minicom
在虛擬機中的終端中執行:
echo is that ok? > /dev/ttyS0
會在HostOS中的minicom中回顯對應內容
2)在虛擬機中的終端中執行:
cat /dev/ttyS0
這時主機中的minicom中會出現輸入狀態,在其中輸入的信息也會在虛擬機終端上回顯。
3.虛擬機和虛擬機之間的串口通信
兩台虛擬機間的通信也可以通過利用主機的命名管道來完成。原理可以簡單的這樣描述:一台虛擬機在主機中創建的命名管道並其串口相連,另外一台虛擬機也將自己的串口連到主機的命名管道上,這樣兩個虛擬機的串口就能連起來了。這裡兩台虛擬機都使用各自的COM1端口,主機的命名管道為同一管道/tmp/vbox,在配置時一台創建通道(假設為Ubuntu8.10DevOS),另一台不創建。啟動時先啟動創建通道的虛擬機,然後啟動另一台虛擬機,分別打開兩台虛擬機的終端,通過如下命令將各自的COM1口的輸入輸出波特率都設為115200
stty ispeed 115200 ospeed 115200 -F /dev/ttyS0
測試過程:
在其中一台虛擬機A終端上執行
cat /dev/ttyS0
在另一台虛擬機B上執行
echo ok > /dev/ttyS0
這時虛擬機A的終端會接受到B發來的ok消息。