設定 LXC 虛擬電腦獨佔實體網路卡

檢視實體主機網路硬體

LXC 虛擬電腦,將虛擬網路卡連結到 LXC 系統預設的 Switch Hub,也就是「lxcbr0」上面時,因為透過〝dnsmasq〞這個套件的幫忙,所以可以在 lxcbr0 這個 Switch Hub 中, 提供 DHCP Server 與 DNS Cache 的功能,也因為〝iptables〞的協助,讓 LXC 虛擬電腦,可以利用 NAT 轉址的方式,連線到網際網路上,另外,若有封閉網路區段的需求,也可以透過手動產生另外一個 Switch Hub,將需要在封閉網路區段的 LXC 虛擬電腦,利用修改設定檔的方式,指定連結到手動產生的 Switch Hub 上面,並透過此  Switch Hub,將所有在此封閉網路區段的 LXC 虛擬電腦給橋接(Bridge)在一起。

然而,在實際的應用面上,虛擬電腦的產生(建立),並不只是單單用來測試系統(如開發的應用程式),或者是當做重要(網路)服務、應用系統的備援,而是有可能會直接取代正在線上運作的實體主機,由虛擬電腦來提供各項服務,因此,虛擬電腦網路連結方式的設定,就會變得非常重要。

不管是需要付費的,免費的、或是開放性原始碼的虛擬系統,大多數都無法直接利用實體網路卡來當做虛擬電腦的網路介面,即使是 Linux 原生虛擬系統(Linux KVM)也不例外,但 LXC 虛擬系統卻可以讓 LXC 虛擬電腦直接以實體電腦上的實體網路卡(如 eth1)來當做其網路介面卡,並利用此實體網路卡來與網際網路溝通,這不只顛覆了虛擬電腦在網路介面設定上的概念,也可以完整獨立的使用網路卡上的資源,而不需要與實體電腦的網路卡(一般為 eth0)共享頻寬,大大增加了網路連結與溝通的速度。

而要設定 LXC 虛擬電腦使用實體網路卡之前,先來檢視一下目前實體主機上的網路組態,畢竟,總要有兩張以上的實體網路卡,才能讓 LXC 虛擬電腦使用實體網路卡來進行網路連線,指令如下:

$ ifconfig -a

有圖中可以看到,筆者目前的電腦內正好有兩張實體網路卡,分別為 eth0 與 eth1,而 eth0 為實體電腦實際對外連線所使用的網路介面,所以另外一張 eth1 ,就可以拿來設定給 LXC 虛擬電腦來使用,而這邊需要先簡單說明一下,因為筆者的測試環境有 DHCP Server,所以實體電腦兩張網路卡在啟動的狀態下,都會由 DHCP Server 取的一組可供連線的 IP 位址,因此,在上圖中,才會看到這兩張實體網路卡都有 IP 位址的狀態。

修改 LXC 虛擬電腦的設定檔

要讓 LXC 虛擬電腦(這邊以 myUS1204 的 LXC 虛擬電腦為例)可以使用(獨佔)實體網路卡來連線,還是要利用到 LXC 虛擬電腦的「config」設定檔,可以利用任一編輯器開啟此「config」設定檔,而要注意的地方,就是「lxc.network.type」與「lxc.network.link」這兩個欄位的設定值,將原先〝lxc.network.type=veth〞修改為〝lxc.network.type=phys〞,而〝lxc.network.link=lxcbr0〞則修改為〝lxc.network.link=eth1〞,其中,eth1 是實體電腦內要拿來給 LXC 虛擬電腦使用的實體網路卡的實際名稱,請依照實體電腦內實際的名稱來修改(這邊筆者以加入註解的方式保留原先設定資訊):

修改完成,確認無誤之後,就可以存檔退出,並利用以下指令來啟動 LXC 虛擬電腦:

$ sudo lxc-start -n myUS1204 -d

啟動 LXC 虛擬電腦之後,可不要急著登入,先在實體電腦利用〝ifconfig -a〞指令,來看看實體電腦的網卡發生了什麼變化:

這邊可以清楚看到,原本實體電腦可以看到兩張實體網路卡,但現在只剩下 eth0 這張網路卡,而原因就是 eth1 已經成功讓 LXC 虛擬電腦給獨佔使用了。

檢視並修改 LXC 虛擬電腦的網路組態

設定檔設定完成之後,就利用〝sudo lxc-start -n myUS1204 -d〞將 LXC 虛擬電腦開機,並放到背景執行,接著再使用〝sudo lxc-console -n myUS1204〞來登入 LXC 虛擬電腦,不過,要登入的時候,可能會有機會看到如下圖的狀況,且會維持約 2~3 分鐘:

這是什麼原因呢?為何會沒有連線到 LXC 虛擬電腦呢?其實,這並不是沒有連線到 LXC 虛擬電腦,而是因為系統在開機的過程中,會檢查網路組態與設定,但是在前面操作中,我們手動修改了網路相關設定,也就是指定 LXC 虛擬電腦使用實體電腦的網路卡(eth1),但是系統在開機的過程中,實際上取得網路組態設定值的卻是原先的 eth0(虛擬網路卡),而不是 eth1(手動指定的實體網路卡),所以開機檢查的流程就會卡在這個步驟,需要等到這個檢查流程結束之後,才會繼續後面的開機流程,直到登入畫面。

登入系統之後,馬上利用〝ifconfig -a〞的指令,來查看 LXC 虛擬電腦的網路組態:

由上圖可以清楚看到,LXC 虛擬電腦的網路卡,已經變成「eth1」,而此名稱是跟著實體電腦網路卡的名稱是一致的,也就是說,若指定給 LXC 虛擬電腦使用的實體網路卡,在實體電腦內名稱為「eth1」,那麼,指定給 LXC 虛擬電腦之後,看到的名稱就會是「eth1」,而並不是資訊錯誤的結果。

而這邊也可以看到,目前「eth1」這張網路卡是啟動的狀態,但是卻沒有任何的網路組態設定值,即使是網路環境內有 DHCP Server 也一樣,原因在於,我們並沒有指定此網路卡的運作方式,所以,要進入網路組態設定檔,做適當的設定:

$ sudo vim /etc/network/interface

設定固定 IP 位址

以上兩種網路組態設定方式(DHCP 或 Static),則可以依照實際的狀況來做適當的設定,設定完成,別忘了,利用以下指令來重新啟動網路:

$ sudo /etc/init.d/networking restart

網路重新啟動之後,再利用〝ifconfig -a〞檢視網路組態:

確認取得網路組態設定資訊之後,最後,就是測試是否能夠與外部網路連結,簡單利用以下指令就可以知道:

$ ping 168.95.1.1

$ ping www.google.com.tw

確認網路連線與解析沒有問題之後,這樣,就完成了手動指定 LXC 虛擬電腦使用實體網路卡的設定了。