管理 LXC 虛擬電腦使用儲存裝置
對於虛擬電腦來說,除了 CPU 與記憶體這兩大運算資源之外,再來,就是儲存裝置(空間)的資源使用了,而大部分的虛擬系統,都是由實體電腦的硬碟空間中,產生一個獨立的檔案空間給虛擬電腦來使用,空間上彼此獨立,在一般狀態之下,也無法相互存取,至於其他抽取式的周邊裝置(如外接硬碟或是USB隨身碟),則是可以在實體電腦與虛擬電腦間擇一連結使用,雖然就安全性的考量下,這樣的存取模式有其優點,但面對資料有相互存取(實體與虛擬電腦之間)的需求時,就顯得比較沒有彈性。
LXC 虛擬電腦基本上並沒有所謂〝虛擬硬碟〞的概念(實際上也不存在),因為,LXC 虛擬系統內的每台虛擬電腦,都可以任意使用實體電腦的硬碟空間(當然,還是需要具備存取的權限),而實體電腦也可以讀取到虛擬電腦內的任何檔案,而 LXC 虛擬電腦檔案系統所存在的空間,對實體電腦來說,就是一個資料夾,因此,就資料的交換與傳遞上,可是非常方便的。
然而,話雖如此,LXC 虛擬電腦對於實體電腦儲存空間讀取的界線,僅止於實體電腦上的檔案系統,對於其他的儲存空間,像是第二顆硬碟、外接硬碟,甚至 USB 隨身碟,則必須視有無授權給 LXC 虛擬電腦讀取,若沒有授權,則 LXC 虛擬電腦將看不到這些額外的儲存裝置。
規劃與設置實體電腦上的第二顆硬碟
實體電腦上除了原先的硬碟之外,還有其他方式可以增加資料儲存的空間,像是新增第二顆硬碟、外接硬碟,或 USB 隨身碟...等,而要授權給 LXC 虛擬電腦使用的方式大同小異,所以這邊就以新增第二顆硬碟的方式,來介紹如何授權 LXC 虛擬電腦使用實體電腦的第二顆硬碟。
開啟實體電腦的終端機,並輸入以下指令,來查看電腦上硬碟的狀況:
$ sudo fdisk -l
由輸出的結果,可以看到目前實體電腦上有一顆 2GB 大小的硬碟尚未使用,而因為筆者是利用 VMware Workstation 來做測試,所以才可以產生如此大小的硬碟,若是實際的電腦,硬碟空間可不會只有 2GB 的大小。
看完基本資訊之後,接著就要針對此全新的硬碟來進行分割與格式化的處理,先利用 fdisk 指令來進行硬碟的分割:
$ sudo fdisk /dev/sdb
指令執行之後,就會看到如上圖的訊息,若不清楚如何處理,可以按下〝m〞來獲得說明,這邊就直接進行處理,按下〝n〞新增分割區,接著再輸入〝p〞來指定分割區為主要分割區(primary),指定完成之後,輸入〝1〞來設定分割區的編號(第一分割區),至於磁區的使用範圍,都直接按下 Enter 鍵,來指定使用全部硬碟空間,最後,再輸入〝w〞來寫入分割資訊,並退出 fdisk 命令:
不過,這邊要提醒各位讀者一下,因為筆者測試環境的硬碟並沒有超過 2TB ,所以還可以使用〝fdisk〞的指令,若超過 2TB,則〝fdisk〞就無法處理,必須改用〝parted〞的指令,且要使用 GPT 的格式,至於如何使用,這邊就先不介紹,若有需要的讀者,可以上網找找相關的資訊。
硬碟分割處理完成,再來就是利用 mkfs 指令來格式化硬碟:
$ sudo mkfs.ext4 /dev/sdb1
掛載硬碟到 LXC 虛擬電腦上
硬碟分割處理完之後,接著就是要掛載給 LXC 虛擬電腦來使用,而要掛載到 LXC 虛擬電腦上,就需要先在 LXC 虛擬電腦內建立掛載點(目錄),指令如下:
$ sudo mkdir /var/lib/lxc/myUS1204/rootfs/mnt/mydisk
此指令是在實體電腦內執行,其中,〝/var/lib/lxc/myUS1204/rootfs〞為虛擬電腦實際存在於實體電腦上的目錄區,〝/mnt/mydisk〞則是我們要在 LXC 虛擬電腦內建立的掛載點(目錄)。
掛載點建立完成之後,接下來再利用以下指令來將硬碟給掛載到此掛載點之上:
$ sudo mount /dev/sdb1 /var/lib/lxc/myUS1204/rootfs/mnt/mydisk
最後,再利用以下指令來確認掛載資訊:
$ df -h
而為了測試 LXC 虛擬電腦是否真的能夠使用此硬碟,在 LXC 虛擬電腦開機前,先在實體電腦內利用以下指令,在剛剛掛載的目錄區內,產生一個目錄:
$ sudo touch /var/lib/lxc/myUS1204/rootfs/mnt/mydisk/test
目錄產生之後,接著將 LXC 虛擬電腦開機,一樣先利用〝df -h〞的指令,來查看 LXC 虛擬電腦是否能夠看到實體腦上的第二顆硬碟:
由上圖就可以清楚看到,LXC 虛擬電腦確實有正確掛載,也可以看到實體電腦的第二顆硬碟,也就是圖中的「/dev/sdb1」,不過,這邊可能有人會有疑問,怎麼沒有看到原本系統的硬碟呢(第一顆硬碟,/dev/sda1)?其實,「/dev/disk/by-uuid/....」這一串難看的數字,就是系統原本的硬碟,傳統上,Linux 系統是直接利用裝置的檔案名稱,也就是大家熟悉的 /dev/sba1、/dev/sdb1...等,來表示要掛載的(儲存)裝置名稱,不過,這樣的方式,有時候會因為 BIOS 的設定、裝置插入的順序,或者是電腦系統啟動時,系統抓取裝置順序的不同而有所改變,容易造成順序上辨識的錯亂,甚至可能會無法開機,所以部分的 Linux 發行套件(如 Ubuntu)則改用檔案系統標籤,也就是這邊提到的 UUID,來指定要掛載的(儲存)裝置 。
切換倒掛載的目錄區,也的確有看到剛剛建立的檔案,而嘗試直接在 LXC 虛擬電腦內也建立一個檔案 (test2),也可以正常建立,表示 LXC 虛擬電腦對此目錄區(硬碟)有讀取與建立的權限:
利用 LXC 虛擬電腦來掛載(使用)虛擬硬碟檔
除了實體的裝置之外,在 Linux 系統之上,也可以利用硬碟的空間,產生一個(虛擬)硬碟檔(或是區塊裝置),來提供給系統,或者是應用程式來使用。
這邊,在實體電腦上利用以下指令,來產生一個 512MB 大小的硬碟檔:
$ dd if=/dev/zero of=myUS1204_hd.img count=1000000
硬碟檔產生之後,我們還需要修改此硬碟檔的擁有者與群組,原因在於後續的操作、掛載,與 LXC 虛擬電腦的使用,都需要 root 的權限,所以,這邊需要利用以下指令,讓此硬碟檔的擁有者與群組都是 root:
$ sudo chown root:root myUS1204_hd.img
硬碟檔的擁有者與群組變更完成之後,可以使用以下指令來查看我們產生的硬碟檔,是屬於哪一種檔案類型:
$ file -s myUS1204_hd.img
不過,雖然我們產生了一個硬碟檔,但是這個硬碟檔只是個單純的檔案,並不是裝置,因此,並沒有辦法直接拿來掛載在系統(實體或虛擬電腦)上來使用,所以需要想辦法讓此檔案變成一個可以掛載的儲存裝置。
在 Linux 系統內,存在〝loop〞裝置,而此裝置正好可以拿來掛載我們產生的硬碟檔,讓硬碟檔變成一個可以使用的裝置,利用以下指令就可以看到系統內有多少可以使用的〝loop〞裝置:
$ ll /dev/loop*
由上圖就可以清楚的看到,Linux 系統內預設就存在 8 個 loop 裝置可以使用,編號分別為 0~7,那要怎樣把硬碟檔給掛載到 loop 裝置上呢?利用以下指令就可以做到:
$ sudo losetup /dev/loop0 myUS1204_hd.img
不過指令執行之後,並不會有任何的訊息,可以再透過以下指令來查詢 loop 的掛載資訊:
$ sudo losetup /dev/loop0
確認掛載資訊,且正確掛載之後,就可以直接針對已掛載的硬碟檔進行格式化的處理,而因為我們已經將硬碟檔掛載到 loop 裝置之上,所以就可以直接針對此 loop 裝置做處理:
$ sudo mkfs.ext4 /dev/loop0
格式化之後,我們再利用以下指令,來查看硬碟檔格式化之後的資訊:
$ file -s myUS1204_hd.img
處理好硬碟檔之後,就可以將 LXC 虛擬電腦開機,而因為 LXC 虛擬電腦本身也是 Linux 系統,且預設 LXC 虛擬電腦就可以讀取實體電腦上的 loop 裝置,因此可以直接利用以下指令,來將 loop 裝置(已連結硬碟檔)掛載上來使用:
$ sudo losetup /dev/loop0
不過,執行之後,會看到以下的錯誤訊息:
怎會沒有權限呢?不是可以看到實體電腦上的 loop 裝置,為何還會無法使用呢?
還記得,在介紹 LXC 虛擬系統的時候,有提到 LXC 虛擬系統有兩個系統管理工具,cgroup 與 Apparmor,可以有效的管理、控制,並隔離虛擬電腦與實體電腦的資源運用,而無法在 LXC 虛擬電腦內掛載 loop 裝置的原因,就出在 cgroup 與 Apparmor 上面,因為我們並利用 cgroup 與 Apparmor 來針對此 loop 裝置做合適的設定,所以才會無法掛載使用。
要使用 cgroup 與 Apparmor 來設定資源的使用,則必須先將 LXC 虛擬電腦關機,關機之後,在實體電腦的終端機內,開啟 LXC 虛擬電腦的設定檔(config),並在最後一行加入以下資訊:
lxc.cgroup.devices.allow = b 7:0 rwm |
以上的資訊可不能寫錯,不然就無法讀取到正確的 loop 裝置,其中,〝7:0〞的〝0〞,表示的是編號為 0 的 loop 裝置,也就是我們掛載上硬碟檔的 loop 裝置。
Cgroup 的設定是寫在 LXC 虛擬電腦的設定檔(config)內,而 Apparmor 則要開啟以下檔案來做設定:
$ sudo vim /etc/apparmor.d/lxc/lxc-default
檔案開啟之後,在最後一行〝}〞之前,加入以下資訊:
mount -> /mnt/myloop/, |
這邊要特別說明一下,前面的 cgroup 主要是設定 LXC 虛擬系統有無使用裝置的權限,而 App armor 主要則是設定有權限掛載裝置,且還要指定掛載的目錄(此目錄在 LXC 虛擬電腦內),而與 Cgroup 最大的差別,則是 Apparmor 設定完成之後,還要重新啟動(載入) apparmor 的服務,指令如下:
$ sudo /etc/init.d/apparmor reload
Cgroup 與 App Armor 設定完成之後,就可以將 LXC 虛擬電腦開機,開機之後,開啟 LXC 虛擬電腦的終端機,先利用以下指令來查看 loop 裝置所連結的檔案:
$ sudo losetup /dev/loop0
而因為 loop 是一個裝置,就如同外接硬碟一般,還需要掛載到指定目錄之後才能使用,所以還需要建立一個讓 loop 裝置可以掛載的目錄,要注意的是,此目錄的路徑與名稱必須與在 App Armor 的設定檔內設定的資料一致才行:
$ sudo mkdir /mnt/myloop
目錄建立之後,接著將 loop 裝置給掛載到建立的目錄之上:
$ sudo mount /dev/loop /mnt/myloop
最後,使用〝df -h〞,就可以查看掛載之後的結果:
確認正確掛載之後,就可以開始使用我們建立的(虛擬)硬碟檔了。