LXC (Linux 虛擬環境)簡單介紹
LXC是Linux containers的簡稱,操作系統級別的虛擬化技術。它可以在操作系統層次上為進程提供的虛擬的執行環境。一個虛擬的執行環境被稱為一個容器 (container)。可以為容器綁定特定的cpu和memory節點,分配特定比例的cpu時間、IO時間,限制可以使用的內存大小(包括內存和是 swap空間),提供device訪問控制,提供獨立的namespace(網絡、pid、ipc、mnt、uts)。
基本安裝
Debian/Ubuntu系統下,使用apt安裝:
sudo apt-get install lxc bridge-utils libvirt-bin debootstrap
注意修改/bin/sh,鏈接到/bin/bash。lxc在某些版本上有一個bug,聲明為/bin/sh卻使用bash語法,導致不如此鏈接會出現錯誤。
鏡像和設定
使用lxc-create -n name -t template
生成鏡像。
在/usr/share/lxc/templates可以看到可用的模板。
在/var/cache/lxc/debian會緩存生成過程的臨時文件。
生成的鏡像需要在鏡像內安裝lxc,否則無法使用lxc-execute。
資源限制
在config文件內,寫入cgroup限定規則。注意,使用內存限定的話,需要在內核參數中加入cgroup_enable=memory
。
在debian/ubuntu下,可以修改/etc/default/grub文件,使用update-grub重新生成規則。
GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=memory quiet"
在config文件中可以如下限定:
lxc.cgroup.memory.limit_in_bytes = 512M # 限定內存 lxc.cgroup.cpuset.cpus = 0 # 限定可以使用的核 lxc.cgroup.blkio.throttle.read_bps_device = 8:0 100 # 讀取速率限定 lxc.cgroup.blkio.throttle.write_bps_device = 8:0 100 # 寫入速率限定 lxc.cgroup.blkio.throttle.read_iops_device = 8:0 100 # 讀取頻率限定 lxc.cgroup.blkio.throttle.write_iops_device = 8:0 100 # 寫入頻率限定
執行
lxc-start -n name /bin/echo hello
還可以用以下指令,在已經啟動的container里執行進程。
lxc-attach -n name /bin/echo hello
以下指令是用來在未啟動的container里執行進程的。
lxc-execute -n name /bin/echo hello
** 注意,雖然系統初始化了所有資源,但是由于sysv-init沒有執行,因此系統內初始化并沒完成。這導致系統不完整,例如網絡部分不可用。 **
網絡隔離
自行設定的網絡
lxc采用veth技術,每次虛擬機建立時,都會產生一對veth。虛擬機內的一般叫做eth0,虛擬機外的叫做vethXXX。這張網卡可以以任何linux許可的方式進行配置。
dnsmasq所產生的dhcp封包無法被debian guest的dhcp client承認,因此無法使用dnsmasq自動部署網絡。
使用iptables配置訪問
在開啟br-nf后,所有bridge的包都會經過iptables的過濾。因而可以用iptables的FORWARD規則限制guest堆外網的訪問。詳細配置請參考此處。