訪問qemu虛擬機的五種姿勢

安裝好了一臺虛擬機,當然是要訪問虛擬機了。小編傾情收集了五種訪問qemu虛擬機的姿勢,相信總有一款適合你~

圖形界面

從最簡單和最直觀的開始。圖形界面和我們平時用的物理機基本沒有什麼兩樣。

Fedora Login

命令也超級簡單,只要輸入命令回車後就會直接跳出虛擬機的圖形界面啦。

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軟件連接你的虛擬機了~看上去和圖形界面沒什麼兩樣。

VNC access

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, 有了這麼多招數,到時候愛用哪個用哪個。
如果你有新的招數,也歡迎告訴我~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章