安裝好了一臺虛擬機,當然是要訪問虛擬機了。小編傾情收集了五種訪問qemu虛擬機的姿勢,相信總有一款適合你~
圖形界面
從最簡單和最直觀的開始。圖形界面和我們平時用的物理機基本沒有什麼兩樣。
命令也超級簡單,只要輸入命令回車後就會直接跳出虛擬機的圖形界面啦。
qemu-system-x86_64 -m 4096 -smp 4 \
--enable-kvm \
-drive file=~/guest/fedora.img
就是這麼簡單~
vnc
圖形界面呢挺好的,不過呢必須要求主機的系統上需要有相應的環境,而且你必須得登陸到主機系統上才能這麼玩。如果是遠端訪問的話,就有難度了。
所以通常情況下,會給虛擬機開一個vnc的窗口,這樣你身在十萬八千里之外,只要網絡能連上,就可以訪問你的虛擬機啦。是不是很爽?
命令行也是超級簡單的,只和圖形界面的命令行多了一個命令行的選項。
qemu-system-x86_64 -m 4096 -smp 4 \
--enable-kvm \
-drive file=~/guest/fedora.img \
-vnc :5
這個-vnc :5就表明了使用的是哪個vnc的端口號。
這樣你就可以通過各種vnc軟件連接你的虛擬機了~看上去和圖形界面沒什麼兩樣。
ssh – NAT
作爲一名專業人員,更多的是用ssh登陸虛擬機的。別問爲什麼,因爲比較cool。相對於對着屏幕點鼠標,敲敲鍵盤是不是更顯專業,哈哈。
扯淡了,回到正題。
在生產環境中,通常使用libvirt來創建虛擬機,所以網絡的環境由libvirt負責搭建。在這種情況下,通過ssh訪問虛擬機相對方便。而我們想要通過qemu直接搭建環境的話,略有些複雜。但也正好理清libvirt都在後臺幫我們做了些什麼。
創建網橋和tap接口
你可以想象網橋是一個虛擬的交換機,而tap接口就是在這個虛擬交換機上用來和虛擬機連接的那個口。虛擬機就通過這麼一個連接的方式和主機連接。
創建網橋,名字是virbr0
sudo brctl added virbr0
sudo ifconfig virbr0 192.168.122.1 net mask 255.255.255.0 up
創建tap接口,名字爲tap0,並添加到網橋
sudo tunctl -t tap0
sudo ifconfig tap0 0.0.0.0 up
sudo brctl addif virbr0 tap0
讓虛擬機使用tap0作爲網絡設備啓動
好了,這就相當於給虛擬機插根網線連上我們的交換機。
命令行那是非常簡單的。
qemu-system-x86_64 -m 4096 -smp 4 \
--enable-kvm \
-drive file=~/guest/fedora.img \
-netdev tap,id=tapnet,ifname=tap0,script=no \
-device rtl8139,netdev=tapnet
差別就在於最後的兩行,添加了網絡設備的描述。
–netdev 意思是使用哪種網絡方式,這裏是用的tap方式,並且指定主機上設備名爲tap0, 也就是我們剛纔創建的設備。
–device 意思是給虛擬機裝哪個網卡,就像你自己機器上裝Intel的網卡還是Mellanox的網卡是一個意思。特別之處在於這個設備使用的是tapnet,也就是上一個選項指定的網絡模式。
虛擬機內配置相應的ip地址
正常情況下虛擬機內獲得的ip地址不一定是準確的,所以需要配置。只要配置成和主機上的網橋在同一網段即可。
sudo ifconfig ens3 192.168.122.100 netmask 255.255.255.0 up
當然爲了不用每次都配置,個人使用可以使用靜態地址。企業或者生產環境使用就要架dhcp服務了。
從主機訪問虛擬機的ip地址
一切準備就緒~可以從主機上通過ssh訪問虛擬機啦~
ssh root@192.168.122.100
注:有時候這樣會遇到connection refuse的錯誤提示。這是因爲虛擬機內sshd的服務沒有開。可以在虛擬機內執行 service sshd start,來開啓sshd服務。
再注:記得把防火牆上ssh的端口打開。
ssh – Bridge
這個版本和上面的版本是非常類似的。都是在主機上創建一個網橋,把虛擬機連接到這個網橋上。但是上面使用的網橋是主機內的,這次我們要創建一個外面看得見的網橋。
這兩種方式都各有什麼利弊呢?
- 第一種方式對外屏蔽了虛擬機,有的時候你需要這麼做,因爲你不想讓外界知道你這裏還有一臺虛擬機。這樣你的工作就不受外界干擾,減少被攻擊的可能。
- 另外第一種方式也適用於公網地址不夠的情況。比如你的運營商只能給你固定個數的ip地址,你就沒有辦法讓所有虛擬機都獲得公網ip地址。
- 第二種方式的好處是從外界可以直接訪問虛擬機,而不需要先登錄到主機再訪問。方便。
- 另外,虛擬機上的所有服務也可以直接從外界訪問了。
究竟選擇怎麼樣的連接方式,取決於實際情況和部署需求。
這兩個方式配置上只有在創建網橋的時候有差別,其餘的步驟方法是都一樣的。 所以下文只描述了創建網橋的步驟,其餘就不贅述。
創建和外界連通的網橋
創建外界連通的網橋可以通過配置文件,這樣保證了每次重啓依然有效而不需要再次手動配置。當然每個版本的配置方式稍微有點區別。這裏僅列出一種實測過的方式,不同的發行版請查閱相關文檔。
在Ubuntu 15.10上,創建此網橋的方式爲/etc/network/interfaces上改成如下:
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
auto br0
iface br0 inet dhcp
bridge_ports eth0
簡單解釋:
- br0是這次創建的對外連接的網橋名字
- eth0就是原本主機上與交換機連接的接口。在你的環境中可能會有不同,請找到你希望對外連接的那個接口。
啓動虛擬機
還是按照上文中的方法,創建tap0並加入網橋後,就可以啓動虛擬機了。
qemu-system-x86_64 -m 4096 -smp 4 --enable-kvm \
-drive file=~/guest/fedora.img \
-netdev tap,id=tapnet,ifname=tap0,script=no \
-device rtl8139,netdev=tapnet,mac=52:54:00:12:34:57
啓動的命令行和上一個方式是一模一樣的,不過這次我添加了mac地址的參數。如果不添加mac地址的參數,當有多臺虛擬機的時候,網絡通信就會有問題。這個問題在NAT的組網方式下同樣存在,也需要注意。
console
好了,現在這個“遠古”的東西要出現了。你問有了前面幾種的登陸方式不好嗎,幹嘛還要用這個。
上面幾種方式已經足以滿足日常使用,但是對於一名系統級發燒友來說,還是差了那麼一點火候。比如在關鍵的時刻,有串口的信息在調試的時候是非常重要的。說到最後其實這是一個程序員的自我修養~
命令行也是非常非常簡單的。
qemu-system-x86_64 -m 4096 -smp 4 \
--enable-kvm \
-drive file=~/guest/fedora.img \
--nographic
這樣就直接在當前的窗口顯示串口信息了。關鍵的參數就是那個 – nographic。
當然還可以用這個命令。
qemu-system-x86_64 -m 4096 -smp 4 \
--enable-kvm \
-drive file=~/guest/fedora.img \
-serial telent:localhost:4321,server,nowait
這樣呢,你既可以有一個圖形的界面顯示虛擬機,又可以通過訪問localhost 4321的端口查看虛擬機的串口信息。
真是想用哪個用哪個~
虛擬機內的配置
能夠訪問到虛擬機內部的串口信息,除了qemu命令行本身需要稍作改動,還有重要的是虛擬機內的配置。
按照我的理解主要是配置兩個方面:
- 給虛擬機內核傳入串口配置的參數
- 啓動虛擬機中串口的服務
具體來說,對Fedora23我參照了Serial console setup on Fedora 20中的配置。總結下來有兩步:
第一步在 /etc/default/grub 文件末尾增加如下幾行(注意,原文中有一處可能因爲顯示原因,看着和實際的不一樣)
GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyUSB0"
GRUB_TERMINAL=serial
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --partiy=no --stop=1"
第二步執行
grub2-mkconfig -o /boot/grub2/grub.cfg
使更新生效。
Well, 有了這麼多招數,到時候愛用哪個用哪個。
如果你有新的招數,也歡迎告訴我~