舊文件回顧:lxc的VE應用

自由軟體:LXC->新世代的輕量級虛擬化技術

2013/07/23

卓國興

Linux conatiners (LXC)是在Linux平台上基於容器的虛擬化技術的未來標準

LXC自2.6.29的核心時,便已進入其中,顯見linux系統對此容器虛擬系統的重視,其管理工具也持續更新中

Container沒有VM(Virtual Machine)這個概念,取而代之的是VE(Virtual Environment)或稱VPS(Virtual Private Server)。而進到VE/VPS裡面,就是一個現成的操作系統環境。 簡單的說,LXC對外而言,就像一台虛擬機,但對於 HOST 機器而言,他就只是一個在執行中的應用程式 更多說明,請參閱http://lxc.sourceforge.net/

認識Linux Container( Linux 容器系統)

在雲端運算的領域,虛擬系統扮演著核心的角色,但不管虛擬系統效能如何的提升,像是使用硬體輔助虛擬化的加強,虛擬機(Guest OS)對實體機(Host OS)來說,仍是沈重的負擔。

虛 擬系統由早期完全透過軟體來模擬硬體裝置的全虛擬化(Full virtualization),演進到以修改系統(Guest OS)核心的方式,來簡化 CPU 與週邊裝置操作指令轉譯的複雜度, 以提升虛擬系統的效能的半虛擬化(Paravirtualization),一直到目前 Linux 核心支援的原生虛擬化技術(Linux Kernel-base virtual machime,簡稱 Linux KVM),可以明顯的發現,虛擬系統在發展的過程中,嘗試利用各種方式來減輕軟體虛擬化的程度, 而後期因為硬體(CPU)技術與規格的提升,讓 CPU 直接支援虛擬化技術,加上 Linux 核心直接內建虛擬化的核心,並透過 Hypervisor 的管理程序,讓虛擬化技術以裸機架構(Bare-Metal)的模式來運作,而也由於 CPU 與系統核心皆支援虛擬化技術,讓虛擬系統的核心命令可以直接通透到實體電腦的 CPU,以模組化的方式來執行核心指令,以提升運作效能。

然 而,話雖如此,即使如 Linux KVM 利用支援虛擬化技術的實體 CPU 與系統核心,強化了CPU 指令運算的效能,但大部分的周邊裝置,像是網路卡、顯示卡等,卻還是要倚賴軟體來(例如 QEMU)將其虛擬化之後使用,在實際的應用面上,也會明顯拖累整體系統的效能,尤其是網路卡更是明顯,所有的虛擬網路卡都是以同一張實體網路卡來當做對 外聯繫的窗口(如果所有的虛擬網路卡都有對外連線的需求時),這勢必會影響原先實體系統的網路運作,只要虛擬電腦的數量越多,影響的程度就越大。

說到這裡,我們就不能對虛擬電腦的效能,有更高的期許嗎?一定要有硬體輔助虛擬化的硬體設備,才可以建構高效能的虛擬機嗎?LXC可能就是你要的答案

Linux Container,這是一套不需要透過虛擬化平台(Hypervisor)來模擬所有的硬體裝置,而是直接可以使用實體主機硬體裝置的虛擬系統架構,讓虛擬化的電腦有最大的效能與最小的耗損。

LXC其本身僅提供最低程度虛擬化(硬體)的功能,僅須兩個系統管理工具(cgroup 與 App Armor), 來管理、控制,並隔離虛擬電腦與實體電腦的資源運用。

Linux Container 就是可以直接使用實體電腦上的軟硬體資源,最特別的,就是 Linux Container 與實體系統共享相同的核心與函式庫。(你可以於lxc的虛擬電腦上,執行 uname -r,你會發現,核心與你的HOST機相同)

LXC 與實體系統共享相同的核心與函式庫,簡單來說, LXC 只能安裝 Linux 相關的作業系統,在 LXC 的世界中,Windows 系統是無法使用的啦!

不過,雖說LXC無法安裝windows虛擬機,可是,你還是可以使用KVM或VirtualBox來安裝使用,因為,這兩種虛擬系統(LXC & KVM or LXC & VirtualBox)可以並存,同時執行。

建立 Linux Container( Linux 容器系統)

下載工具包:

安裝lxc

sudo apt-get install lxc

在ubuntu系統上安裝lxc環境就是這麼簡單,接下來就只要把容器裝好並執行就可以了,對於HOST機而言,就像執行一支程式那樣。

安裝容器前,先找一下範本吧

dpkg -L lxc

------------------------------------------------

/usr/lib/lxc/templates

/usr/lib/lxc/templates/lxc-debian

/usr/lib/lxc/templates/lxc-ubuntu-cloud/usr/lib/lxc/templates/lxc-busybox

/usr/lib/lxc/templates/lxc-fedora

/usr/lib/lxc/templates/lxc-sshd

/usr/lib/lxc/templates/lxc-opensuse

/usr/lib/lxc/templates/lxc-ubuntu

-----------------------------------------------------

這些是ubuntu安裝完lxc的預設容器範本,支援ubuntu(廢話),debian,fedora與opensuse,甚至,就一支ssh的server(有獨立IP的SSH Server)

當然,另外一個作為Server使用上相當受歡迎的CentOS雖不在其中,但一樣可以安裝,筆者測試過,CentOS6.4 Final一樣可以正常運作,筆者將於之後提供。

下載工具包:

建立第一個被隔離的「容器」,ubuntu的LXC虛擬機

$ sudo lxc-create -t ubuntu -n firstlxcubuntu

不用懷疑,就這麼簡單

這行指令的意義,就是以ubuntu為範本,建立名為firstlxcubuntu的虛擬機

你會發現,所有的套件,透過網路來下載並安裝,時間的長短,則取決於網路的速度

安裝完的虛擬機,就只是一個名為firtslxcubuntu的目錄,預設位置為/var/lib/lxc

安裝好後,啟動他吧

sudo lxc-start -n firstlxcubuntu

這樣,一個LXC虛擬機就啟動了,記憶體卻用不到20MB

另外,執行ifocnfig,可以看到有配到一個private ip,並且還可以連上網際網路

使用 LXC 虛擬機,操作上完全跟使用實體電腦一模一樣,系統整體的反應速度,幾乎跟實體電腦一模一樣。

lxc的預設橋接介面:lxcbr0

當你安裝了LXC的執行環境,就會自動幫你建立好lxcbr0的橋接介面,預設ip為10.0.3.1,作為gateway,配發10.0.3.x的ip給所有的虛擬機,如下圖,啟動的虛擬機正以vethxxxx的介面橋接到lxcbr0,也就能以NAT的模式連上網際網路

LXC虛擬機的執行狀態:開啟另一個終端機,執行以下指令

sudo lxc-list

LXC 內作業系統的檔案結構:

sudo apt-get install tree

tree -L 2 /var/lib/lxc/firstlxcubuntu/

/var/lib/lxc/firstlxcubuntu/

├── config

├── fstab

├── rootfs

│ ├── bin

│ ├── boot

│ ├── dev

│ ├── etc

│ ├── home

│ ├── lib

│ ├── lib64

│ ├── media

│ ├── mnt

│ ├── opt

│ ├── proc

│ ├── root

│ ├── run

│ ├── sbin

│ ├── selinux

│ ├── srv

│ ├── sys

│ ├── tmp

│ ├── usr

│ └── var

└── rootfs.hold

21 directories, 3 files

可以發現,其結構與一個安裝好的Linux系統的目錄結構相同

config 為此虛擬電腦的設定檔案,而整個系統的主要檔案結構(目錄),則是在 rootfs 的目錄內

關閉運行中的LXC虛擬機:

在剛剛lxc-start啟動的終端畫面,執行 sudo poweroff

在HOST機中的任何終端機中,執行 sudo lxc-stop -n firstlxcubuntu

sudo lxc-list

可以發現,firstlxcubuntu已經是STOPPED

複製與刪除 LXC 虛擬機

sudo lxc-clone -o firstlxcubuntu -n sourcelxcubuntu

Enter之後,就會開始備份

為了資料的完整性與一致性,以lxc-clone進行系統複製的時候,最好還是先將 LXC 來源虛擬機關機之後,再利用指令進行複製,會比較好!

sudo lxc-list

RUNNING

firstlxcubuntu

FROZEN

STOPPED

sourcelxcubuntu

sudo lxc-stop -n firstlxcubuntu

摧毀LXC虛擬機:

sudo lxc-destroy -n firstrlxcubuntu

刪除之後,就可以發現/var/lib/lxc的firstlxcubuntu目錄,已經被我們刪除了。

lxc-console的使用:

以背景方式執行:

lxc-start -d -n sourcelxcubuntu

lxc-console -n sourcelxcubuntu

Crtl+a q(離開)

基本中文環境與建議套件

lxc-start -n sourcelxcubuntu

進入console畫面,mkdir 中文,顯示為....

這表示不支援中文顯示,所以,要建立中文環境

sudo apt-get update

sudo apt-get install language-pack-zh-hant language-pack-en tasksel ttf-droid vim nano

sudo vi /etc/environment

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" LANGUAGE=zh_TW.UTF-8 LANG=zh_TW.UTF-8 LC_ALL=zh_TW.UTF-8

sudo vi /etc/init/fales.conf

測試中文環境

sudo poweroff 或於HOST中,執行 lxc-stop -n sourcelxcubuntu

sudo lxc-start -n sourcelxcubuntu

重建「中文」目錄

如此,中文輸入與顯示都正常了,也比較方便管理

安裝DNS與LAMP服務:

sudo tasksel

安裝phpmyadmin

sudo apt-get install phpmyadmin

sudo apt-get clean

測試:

ifconfig

netstat -ltn

在HOST機,以瀏覽器輸入ifconfig看到的ip,以便測試web與phpmayadmin

建立自己的虛擬switch,橋接到學校的網段,並設定固定IPv4與IPv6:

之前安裝好的DNS與WEB服務,雖然可以正常啟用,但IP不是固定的,另外,沒有IPv6,使用的IP也非學校的publicIP,不適合作為對外服務使用,所以,我們需要建立橋接介面,並與學校的對外網段一致

使用工具:建立Host的橋接介面.sh

此工具使用 brctl 工具,需要安裝「bridge-utils」這個橋接套件,之前我們執行brctl show,所看到lxcbr0,一樣是由此套件建置,只不過,現在由我們手動建置,並橋接到學校對外的網段上。

修改此shell檔的設定值:

#請依學校的實際網路參數,設定以下的設定值(IPv6可以填貴校的正確位址,在測試的NAT環境下出不去)

#----------------------------------

#橋接介面

BRIFACE="br0"

#實體介面

ethcard1="eth0"

#ip

ipv4=192.168.1.5

#netmask

v4mask=255.255.255.0

#network

v4network=192.168.1.0

#broadcast

v4brc=192.168.1.255

#gateway

v4gw=192.168.1.1

#使用一個固定ipv6(此作為HOST機,不可為::1)

ipv6="2001:db8:abcd::10"

#prefix

v6mask=64

#ipv6 gateway

v6gw="2001:db8:abcd::fffe"

#----------------------------------

設定值設好後,執行此shell程式即可

sudo chmod 700 建立Host的橋接介面.sh

sudo su

./建立Host的橋接介面.sh

未避免dhclient 或 dhclient3的程序殘留,造成伺服器取得DHCP,應該:

killall dhclient

killall dhclient3

ping gateway

ping 168.95.1.1

ping tw.yahoo.com

若都連通,那麼HOST的br0對外連線就沒問題

開機自動啟用br0

sudo su

cd /etc/init

vi failsafe.conf

改成下面設定:

-------------------------------------

…............................

sleep 2

# Plymouth errors should not stop the script because we *must* reach

# the end of this script to avoid letting the system spin forever

# waiting on it to start.

$PLYMOUTH message --text="Waiting for network configuration..." || :

#sleep 40

$PLYMOUTH message --text="Waiting up to 60 more seconds for network configuration..." || :

#sleep 59

…....................................

…..................

--------------------------------------

vi /etc/rc.local

--------------------------------------------

/opt/tools/建立Host的橋接介面.sh

exit 0

--------------------------------------------

好了,接下來就是要設定LXC VE的config設定,把lxcbr0改成br0

vi /var/lib/lxc/sourcelxcubuntu/config

-------------------------------------------------------------------------------------

lxc.network.type=veth

lxc.network.link=lxcbr0

=>

lxc.network.type=veth

lxc.network.link=br0

------------------------------------------------------------------------------------

回到HOST機:

lxc-stop -n sourcelxcubuntu

lxc-start -n sourcelxcubuntu

ifconfig

-------------------------------------------------------------------------------------

eth0 Link encap:Ethernet HWaddr 00:16:3e:c7:3d:e4

inet addr:192.168.1.3 Bcast:192.168.1.255 Mask:255.255.255.0

-------------------------------------------------------------------------------------

開啟另一個終端機

-------------------------------------------------------------------------------------

brctl show

bridge name bridge id STP enabled interfaces

br0 8000.5ac778cea566 no eth0

veth4dFAVw

lxcbr0 8000.000000000000 no

------------------------------------------------------------------------------------

由以上的狀況,可以得知隨機的vethXXXX,已經橋接到br0

不過,你的VE基本上得到是DHCP的IP,若要對外服務,還是要設定固定IPv4與IPv6

透過config設定檔來設定

-----------------------------------------------------

#設定VE的虛擬網路介面名稱

lxc.network.name = eth0

#設定VE與HOST橋接所用的網路介面

lxc.network.veth.pair = lxcVE1

#以下請根據學校的網路分配狀況,寫入正確的ip/netmask 163.26.xxx.x/24 or 23,但最好自行寫入VE的/etc/network/interfaces是比較穩當的作法 #lxc.network.ipv4 = 192.168.1.6/24

#lxc.network.ipv6 = 200:db8:abcd::6/64 ------------------------------------------------------------------------------------------

lxc.network.ipv4.gateway specify the ipv4 address to use as the gateway inside the container. The address is in format x.y.z.t, eg. 192.168.1.123. Can also have the special value auto, which means to take the primary address from the bridge interface (as specified by the lxc.network.link option) and use that as the gateway. auto is only available when using the veth and macvlan network types.

以上為manpage的說明

原則上,使用veth的方式,可以自動取的HOST的gateway,但最好自行寫入VE的/etc/network/interfaces是比較穩當的作法

lxc.network.veth.pair = lxcVE1 可以指定用於橋接的網卡名稱

直接設定VE的虛擬網路卡,就如同使用實體的ubuntu系統一樣

使用工具:設定VE網路.sh

cp 設定VE網路.sh /var/lib/lxc/sourcelxcubuntu/rootfs/opt/

進入VE的console畫面,然後執行:

sudo su

vi /opt/設定VE網路.sh

---------------------------------------

根據說明修改設定值

---------------------------------------

執行:

/opt/設定VE網路.sh

好了,現在已經完成固定IP,請重新啟動VE,這樣,才能讓apache2跑在IPv6上

安全議題:

由於有安裝phpmyadmin不限制其使用範圍,將會收到許多網際網路上的暴力破解攻擊,所以,請設定apache2,限制連線IP

vi /etc/apache2/conf.d/ra-phpmyadmin

------------------------------------------------------------

<Location /phpmyadmin>

order deny,allow

deny from all

# 可連線區

allow from 127.0.0.1 ::1 192.168.1.0/24

Options FollowSymLinks MultiViews

</Location>

-------------------------------------------------------------

修改apache2的設定:

vi /etc/apache2/sites-available/default 與 default-ssl

----------------------------------------------------------------------------------

<Directory /var/www/>

Options Indexes FollowSymLinks MultiViews

AllowOverride None

Order allow,deny

allow from all

</Directory>

<Directory /var/www/>

Options FollowSymLinks MultiViews

AllowOverride All

Order allow,deny

allow from all

</Directory>

-----------------------------------------------------------------------------------

service apache2 restart

測試:

由於IPv6並沒有列於allow的範圍(最好也不要,因為範圍太大),自然就無法連線,而被拒絕

設定DNS:

使用工具:endns.sh

cp endns.sh /var/lib/lxc/sourcelxcubuntu/rootfs/opt/

進入LXC的VE console畫面:

注意:此處請使用 lxc-console -n sourcelxcubuntu,方能正確使用dialog工具

執行:

sudo apt-get install dialog dnsutils

sudo su

/opt/endns.sh

以dig指令查詢

dig @192.168.1.6 www.kawsing.tn.edu.tw

dig @2001:db8:abcd::6 www.kawsing.tn.edu.tw

如果沒有錯誤,那你的DNS就可以以IPv4與IPv6來查詢了,那麼基本的DNS + Web服務已經啟動完成,然後,就可以正式安裝其他的服務

安裝xoops並作為範本目錄

http://www.tad0616.net/modules/tad_uploader/index.php?of_cat_sn=62

由此下載最新版本,宏凱有持續維護,請安心服用

把該壓縮檔放到/var/www底下,unzip 該壓縮檔

sudo apt-get install unzip

sudo mkdir /var/www/xoops

sudo mv /var/www/xoops2.x.x/htdocs/* /var/www/xoops/

cd /var/www/xoops/

sudo chown -R www-data.www-data uploads/ templates_c/ cache/ xoops_data/

sudo chmod 666 mainfile.php include/license.php

開始安裝:

安裝完成後,須注意的地方:

chmod 444 /var/www/xoops/mainfile.php

rm -rf /var/www/xoops/install

mv /var/www/xoops/xoops_lib /var/xoopsdata/

mv /var/www/xoops/xoops_data/ /var/xoopsdata/

上傳檔案大小的限制,預設是2M,請修改,以便上傳大於此size的影音檔,改完後,請記得重新啟動apache2

修改/etc/php5/apache2/php.ini此檔案中的

max_execution_time = 300

upload_max_filesize = 50M

service apache2 restart

這樣,基本上一個DNS+lamp+xoops站台的基礎VE已經完成,可以以這個VE為基礎,就可以很快建立其他對外服務的VE,你可以使用lxc-clone , rsync,但最快的的建立方式,就是使用快照,在Linux系統中,最著名的就是lvm,但其設置較麻煩,此處將介紹使用Btrfs

parted /dev/sdc --script print

parted --script /dev/sdc mkpart logical btrfs startGB endGB

parted /dev/sdc rm number

Btrfs(B-tree 檔案系統, 通常念成 Butter FS,Better FS 或 B-tree FS),採用GPL授權

目標是取代目前ext檔案系統,改善ext檔案系統的限制,對單個文件的大小,總文件系統大小或文件檢查和加入ext不支援的功能,可做快照(writable snapshots)、甚至快照的快照(snapshots of snapshots)、磁碟陣列(RAID),以及子卷(subvolumes)(做快照前須建立的)。Btrfs 也宣稱會專注在「容錯、修復及易於管理」,是備受期待的新世代檔案系統

為何使用Btrfs檔案系統?

一般說來,目前主流的虛擬機虛擬系統,都支援對虛擬機做快照,而LXC雖有一個lxc-checkpoint的指令,但目前看來尚未實作,所以藉由Btrfs的快照功能,就能補足這點

btrfs檔案系統、快照建立與複製系統

建立btrfs分割區

sudo apt-get install btrfs-tools

1.使用gparted

2.工具shell使用

parted磁碟工具.sh

bash parted磁碟工具.sh sdx 10

建立好Btrfs檔案系統後,把他掛載起來,就可以作為放置一個VE的空間

若沒有空間可以分割,也可以使用虛擬磁碟模式,並格式化成Btrfs

kvm-img create -f raw lxcBOX.img 10G

losetup -f lxcBOX.img

losetup -a

losetup -a

-----------------------------------------------------------------------------------------

/dev/loop0: [0821]:494848 (/cdrom/casper/filesystem.squashfs)

/dev/loop1: [0023]:635194 (/media/usbVEdisk0/lxcsh/上課用工具包/lxcBOX.img)

-----------------------------------------------------------------------------------------

mkfs.btrfs lxcBOX.img

WARNING! - Btrfs Btrfs v0.19 IS EXPERIMENTAL

WARNING! - see http://btrfs.wiki.kernel.org before using

fs created label (null) on lxcBOX.img

nodesize 4096 leafsize 4096 sectorsize 4096 size 10.00GB

Btrfs Btrfs v0.19

你也可以使用dd if=/dev/zero of=lxcBOX.img bs=1M count=10000來建立,但速度較慢

lxc-stop -n sourcelxcubuntu

mv sourcelxcubuntu /root/

mkdir /var/lib/lxc/kawsingVE

mount /root/lxcBOX.img /var/lib/lxc/kawsingVE

cd /var/lib/lxc/kawsingVE

btrfs subvolume create kawsingVE

rsync -azvP /root/sourcelxcubuntu/* /var/lib/lxc/kawsingVE/kawsingVE

mv /var/lib/lxc/kawsingVE/kawsingVE/config ..

vi config

----------------------------------------------------------------

#修改虛擬網卡的MAC

lxc.network.hwaddr = 00:16:3e:c7:3d:e5

lxc.utsname = kawwsingVE

…...................................

…..........................

#指定根目錄所在

lxc.rootfs = /var/lib/lxc/kawsingVE/kawsingVE/rootfs

#mount的設定位置

lxc.mount = /var/lib/lxc/kawsingVE/kawsingVE/fstab

----------------------------------------------------------------

lxc-list

lxc-start -d -n kawsingVE

lxc-list

----------------------

RUNNING

kawsingVE

---------------------

不過此時主機名稱仍為sourcelxcubuntu,須修改

sudo vi /etc/hostname

---------------------------------

kawsingVE

----------------------------------

sudo vi /etc/hosts

---------------------------------

127.0.0.1 localhost kawsingVE

---------------------------------

sudo reboot

測試快照功能

cd /var/lib/lxc/kawsingVE

btrfs subvolume snap kawsingVE kawsingVE-shot

你可以發現,快照可以立即建立,並獨立使用

比較:

tree -L 2 kawsingVE kawsingVE-shot

kawsingVE

├── fstab

├── rootfs

│ ├── bin

│ ├── boot

│ ├── dev

│ ├── etc

│ ├── home

│ ├── lib

│ ├── lib64

│ ├── media

│ ├── mnt

│ ├── opt

│ ├── proc

│ ├── root

│ ├── run

│ ├── sbin

│ ├── selinux

│ ├── srv

│ ├── sys

│ ├── tmp

│ ├── usr

│ └── var

└── rootfs.hold

kawsingVE-shot

├── fstab

└── rootfs

├── bin

├── boot

├── dev

├── etc

├── home

├── lib

├── lib64

├── media

├── mnt

├── opt

├── proc

├── root

├── run

├── sbin

├── selinux

├── srv

├── sys

├── tmp

├── usr

└── var

兩個目錄的內容當下都是相同,當然,若服務中的目錄之後有變動,也不會影響到快照的內容。

所以:

  1. 快照可以作為備份的來源 由於快照為當下內容的一個完整鏡像,所以所有檔案是靜止的狀態,最適合作為rsync的備份來源,完全不會有資料不一致的狀況產生 我們可以把每五分鐘所做的最新快照,透過ssh+rsync的方法,備份到遠端HOST主機 這個部份,當我們完成第3項工作後,再來進行,因為需要以VirtuaBox或KVM的virt-manager來模擬第2台HOST

建議的快照建立方法:

實際運用上,我麼應把一個乾淨的VE,作為source,並且,不對外運作,之後,有需要建立新的VE,再以此VE做快照,才不會產生不必要的資料

sudo lxc-stop -n kawsingVE

sudo btrfs subvolume snap kawsingVE kawsingVEsite1

cp config config4site1 mkdir /var/lib/lxc/kawsingVEsite1

cd /var/lib/lxc/kawsingVEsite1

ln -s ../kawsingVE/kawsingVEsite1/config4site1 config ln -s ../kawsingVE/kawsingVEsite1/

之後,保留快照份數.sh要改成快照這兩台VE

FROZEN是什麼:

基本上,就是暫停的意思

sudo lxc-freeze -n kawsingVEsite2

sudo lxc-list

解除暫停:

sudo lxc-unfreeze -n kawsingVEsite2

一次建立多台主機快照的工具:保留快照份數new2.sh

修改設定:

---------------------------------------------------------

#要快照的主機,以空白隔開

SnapSource="/var/lib/lxc/kawsingVE/kawsingVEsite1 /var/lib/lxc/kawsingVE/kawsingVEsite2"

#保留的份數,6表示各3個快照

keep=6

----------------------------------------------------------

重要:需要避開apparmor的限制,所以

cd /var/lib/lxc/lxc-ubuntu

sudo vi config

--------------------------------------------

lxc.aa_profile = unconfined

--------------------------------------------

如何自動開機啟動VE

原本的方法:

cd /etc/lxc/auto

ln -s /var/lib/lxc/kawsingVEsite1/config kawsingVEsite1

ln -s /var/lib/lxc/kawsingVEsite2/config kawsingVEsite2

這是原本的方式,但由於我們需先掛載btrfs分割區(此處以lxcBOX.img模擬),所以,我麼改寫在/etc/rc.local當中

方法:

  • mount btrfs分割區位置 /var/lib/lxc/kasingVE

  • 執行loop.sh進行定時快照

  • lxc-start -d -n kawsingVEsite1

  • lxc-start -d -n kawsingVEsite2

最後,你的/etc/rc.local應該是這樣: --------------------------------------------- /opt/tools/建立Host的橋接介面.sh mount /root/lxcBOX.img /var/lib/lxc/kawsingVE sleep 1 /var/lib/lxc/kawsingVE/loop.sh & lxc-start -d -n kawsingVEsite1

sleep 1

lxc-start -d -n kawsingVEsite2 ---------------------------------------------

以VirtualBox模擬第2台HOST

HOST機的建構:

系統安裝模式:Live Persistent

何謂Live Persistent模式:

LiveCD 系統,相信大家都知道,光碟開機即可載入一個作業系統,但操作的過程,儲存的檔案,都會再重新開機後消失(因為都存於RAM中),而為了保留之前儲存的資 料,從knoppix時代,就有所謂「永久家目錄」,讓你可以把存在家目錄的檔案,於重新開機後叫回,隨著LIVE技術的進步,目前已經可以透過核心技 術,加上特定的開機參數,把整個/目錄的變動都保留下來,並於下次開機時叫回,就像真實安裝的系統一樣

執行效能與速度:若你使用usb隨身碟安裝,那麼, 執行效能與速度,將與隨身碟的讀取、寫入速度有關,若選擇系統硬碟,則與安裝於系統的表現相去不遠

安裝於硬碟、隨身碟,方法一樣。

使用工具:miniserver_livesystem.sh

使用VirtualBox來安裝模擬用的HOST

VirtualBox的開機前設定如下:

進入系統後,執行

sudo gparted

建立兩個分割,第二個分割必須取名為casper-rw

建立如下的分割

下載筆者的shell,放到/opt/tools/

如下圖執行:

製作完成,重新開機,畫面如下

是否使用了casper-rw的空間做永久儲存空間,執行df -h,看看 / 的容量即可

如同HOST1的設定一樣,把同名的LXC空間建立起來

開機時,自動掛載該空間

sudo vi /etc/rc.local

備份的subvolume已經建立好了,接著,就是把主要的HOST的VE資料rsync到相同subvolume

建立模擬第2片網卡,使用「僅限主機」,並作為rsync同步資料的介面

建立第2虛擬網卡,作為備份的獨立頻寬

啟動ssh

sudo service ssh start

第一次同步

/var/lib/lxc/kawsingVEsite1

/var/lib/lxc/kawsingVEsite2

/var/lib/kawsingVE/kawsingVE/*

/var/lib/kawsingVE/kawsingVEsite1/*

/var/lib/kawsingVE/kawsingVEsite2/*

之後以cron同步,由HOST2主動要求

/var/lib/kawsingVE/kawsingVEsite1最新的shot

/var/lib/kawsingVE/kawsingVEsite2最新的shot

即可

建立兩台HOST機的ssh 信任關係,以無密碼方式SSH連線,就能將備份流程寫在cron之中,自動備份

於HOST1主機以root身份執行:

sudo su

mkdir /root/.ssh

service ssh start

於HOST2主機以root身份執行:

ssh-keygen

scp authorized_keys root@192.168.56.1:/root/.ssh/

rm -f authorized_keys

測試:

ssh -l root 192.168.56.1

看看是否不需密碼即可登入

執行備份最新的快照:

若最新的一份快照有新增的資料,就會備份過來

從HOST2的主機主動對HOST1的lxcVE系統備份:

到HOST2

cd /root

vi 我的自動備份.sh

---------------------------------------------------------

#!/bin/bash

rsync -azvP root@192.168.56.1:/var/lib/lxc/kawsingVE/newkawsingVEsite1/ /var/lib/lxc/kawsingVE/kawsingVEsite1/

rsync -azvP root@192.168.56.1:/var/lib/lxc/kawsingVE/newkawsingVEsite2/ /var/lib/lxc/kawsingVE/kawsingVEsite2/

---------------------------------------------------------

crontab -e

6/* * * * * /root/我的自動備份.sh

這樣,就能定時備份HOST1的最新快照

lxc.network.name = eth0(lxc看到的)

HOST機的eth0不見,因為被VE佔去

進入VE主機,其eth0的MAC與HOST的eth0相同

ubuntu系統不自動產生/etc/udev/rules.d/70-persistent-net.rules的方法

cd /lib/udev/rules.d/

mv 75-persistent-net-generator.rules /root

進階設定與管理

-------------------------------------------

lxc.cgroup.cpuset.cpus = 0 lxc.cgroup.cpu.shares = 1024 lxc.cgroup.memory.limit_in_bytes = 512M lxc.cgroup.memory.memsw.limit_in_bytes = 768M

--------------------------------------------

cpu ram 與 cgroup控制群組

可用於檢視: lxc-cgroup -n xxx cpuset.cpus

lxc-cgroup -n xxx cpu.shares

lxc-cgroup -n xxx memory.limit_in_bytes

可以動態調整

lxc-cgroup -n xxx cpuset.cpus 1

lxc-cgroup -n xxx cupser.cpus 1,3 or 3,1等

會發現使用不同的cpu去運作,或多核運作

lxc-cgroup -n xxx cpu.shares 512

lxc-cgroup -n xxx memory.limit_in_bytes 256M

我希望已最簡易的網路架構,容易瞭解與維護的軟體工具、完全自由、開放,

完整可自訂的結構完成這些功能,不要為了某些用到機會很少,又容易出錯的所謂強大功能而讓軟體與結構複雜,畢竟,以長遠看來,「容易與可快速回復」比較實際(我的個人想法)

Last updated