一贯选拔 KVM 来创设虚拟机.,用来选取和管理LXC容器

Linux 容器的利用

Linux 容器在 v2.6.29本子之后就进入到基础之中了, 此前尽管也听说过,
但一贯从未太留心, 向来利用 KVM 来创制虚拟机.
截止新近 Docker 大出风头, 才起来关怀. 想打听一下 Linux 容器究竟是何等?
与现有虚拟机技术(Xen, KVM等)有如何界别?

Linux 容器技术出现的很早, 其实也是直接虚拟化技术, 但似乎平昔从未 Xen,
KVM 那几个来的知名.
再者, 在落到实处原理上, 和Xen, KVM之类的也是有很大分其他.
上边不难表明下近来4类虚拟技术的界别: (下边表达中, VM:虚拟机, HOST:主机,
即安装虚拟机的机械)

  1. 历史观的虚拟化技术 (VirtualBox, VMware)
    透过在Linux上安装虚拟化软件, 然后经过虚拟化软件来设置虚拟机系统,
    差不离结构如下:

     VM1  VM2 VM3 … …                                   
                 VirtualBox or VMWare or …                
                    Linux Kernel                            
                     硬件                                   

    VM是由虚拟化软件(VirtualBox, VMWare…)来保管的, Linux
    Kernel不能够平素保管到种种VM.

  2. Xen (半虚拟化)
    Xen是Linux上历史相比较长的虚拟化技术, 它的虚拟化结构大体上如下:

     Linux Kernel  VM1  VM2 VM3 … …                     
                     Xen                                    
                     硬件                                   

    Xen的虚拟化原理是在 Linux Kernel和硬件之间投入一层 Xen代码,
    有Xen来管理Linux Kernel和其余的VM.

  3. KVM (最新的虚拟化技术)
    相对而言其余的虚拟化技术, KVM是相比新的, 它要求CPU的帮助.
    它的虚拟化结构大体上如下:

     VM1  VM2 VM3 … …                                   
                     KVM (由内核管理)                       
                    Linux Kernel                            
                     硬件                                   

    其一结构和传统的虚拟化技术很接近, 有少数不比的是, KVM和Linux
    Kernel是紧密结合的,
    之所以Linux Kernel可以更好的军事管制 VMs,
    VM的性质会比传统的虚拟化技术更好.

  4. Linux 容器 (LXC – linux container)
    LXC 是不行轻量级的, 它将 VM 的长河也装作成 HOST 的进度.
    几乎的结构如下:

     p1(HOST), p2(VM), p3(VM), p4(HOST)……               
                  Linux Kernel                              
                     硬件                                   

    那么, 对于某些系统经过, PID是一定的, 比如 init进度的PID=1, VM中的
    init进度的PID是何许处理的呢?
    原来, VM的 init进度的PID在 HOST的长河表中会突显成此外PID(>1).

    从下边可以看出, LXC那种虚拟化, VM的长河似乎HOST的长河一样运行, 管理,
    所以创造和销毁都是格外高效的.

: 参考
http://veck.logdown.com/posts/200566-compare-of-kvm-and-lxc

Linux Container

Linux 容器相关的2个重大致念

Linux容器效能是根据 cgroups 和 Namespace 来兑现的. 所以要询问 Linux
容器必须先精通 cgroup 和 Namespace.

是一个操作系统层的轻量级虚拟化技术,百度、腾讯等网络集团的PaaS平台大多都使用了那项新技巧。和XEN,VMware和KVM等硬件抽象层的虚拟化技术相比较,LXC更像是狠抓版的chroot。因为Linux
Containers不但没有对硬件配备开展虚伪(指令集模拟),仍可以利用主机的目录和文件等资源。容器可以在着力
CPU
本地运行指令,而不须要其余特其余解释机制。所以,与价值观的HAL(硬件抽象层)层次的虚拟化技术相比较有以下优势:

cgroups

cgroups 是将随意进度展开分组化管理的 Linux 内核成效.
经过cgroups可以有效的割裂各种进程, 同时还是能控制进度的资源占用(CPU,
内存等等)处境.
应用示例: (debian v7.6 x86_64)

mount -t tmpfs cgroup_root /sys/fs/cgroup
mkdir /sys/fs/cgroup/test
mount -t cgroup -ocpuset test /sys/fs/cgroup/test

这儿, test目录就是一个 cgroup, 那里 -o 指定了 cpuset,
cpuset是Linux中既定的一种cgroup, 后边有时间再一次写博客详细介绍.
test 目录有cgroup必须的次第文件

cd /sys/fs/cgroup/test
ls -l
total 0
-rw-r--r-- 1 root root 0 Aug 14 14:34 cgroup.clone_children
--w--w--w- 1 root root 0 Aug 14 14:34 cgroup.event_control
-rw-r--r-- 1 root root 0 Aug 14 14:34 cgroup.procs
-rw-r--r-- 1 root root 0 Aug 14 14:34 cpuset.cpu_exclusive
-rw-r--r-- 1 root root 0 Aug 14 14:34 cpuset.cpus
-rw-r--r-- 1 root root 0 Aug 14 14:34 cpuset.mem_exclusive
-rw-r--r-- 1 root root 0 Aug 14 14:34 cpuset.mem_hardwall
-rw-r--r-- 1 root root 0 Aug 14 14:34 cpuset.memory_migrate
-r--r--r-- 1 root root 0 Aug 14 14:34 cpuset.memory_pressure
-rw-r--r-- 1 root root 0 Aug 14 14:34 cpuset.memory_pressure_enabled
-rw-r--r-- 1 root root 0 Aug 14 14:34 cpuset.memory_spread_page
-rw-r--r-- 1 root root 0 Aug 14 14:34 cpuset.memory_spread_slab
-rw-r--r-- 1 root root 0 Aug 14 14:34 cpuset.mems
-rw-r--r-- 1 root root 0 Aug 14 14:34 cpuset.sched_load_balance
-rw-r--r-- 1 root root 0 Aug 14 14:34 cpuset.sched_relax_domain_level
-rw-r--r-- 1 root root 0 Aug 14 14:34 notify_on_release
-rw-r--r-- 1 root root 0 Aug 14 14:34 release_agent
-rw-r--r-- 1 root root 0 Aug 14 14:34 tasks

里面有的文件介绍.

文件名 R/W 用途
release_agent RW 删除分组时执行的命令. 这个文件只存在于根分组
notify_on_release RW 设置是否执行 release\_agent. 为1时执行
tasks RW 属于分组的线程 TID 列表
cgroup.procs R 属于分组的进程 PID 列表. 仅包括多线程进程的线程leader的TID, 这点与 tasks 不同
cgroup.event_control RW 监视状态变化的分组删除事件的配置文件

在cgroup中还足以成立子cgroup, 建立的办法很粗略, 只要创制文件夹即可.

cd /sys/fs/cgroup/test
mkdir test-child
ls -l test-child    # 创建了文件夹之后, 自动生成cgroup需要的文件
total 0
-rw-r--r-- 1 root root 0 Aug 14 15:10 cgroup.clone_children
--w--w--w- 1 root root 0 Aug 14 15:10 cgroup.event_control
-rw-r--r-- 1 root root 0 Aug 14 15:10 cgroup.procs
-rw-r--r-- 1 root root 0 Aug 14 15:10 cpuset.cpu_exclusive
-rw-r--r-- 1 root root 0 Aug 14 15:10 cpuset.cpus
-rw-r--r-- 1 root root 0 Aug 14 15:10 cpuset.mem_exclusive
-rw-r--r-- 1 root root 0 Aug 14 15:10 cpuset.mem_hardwall
-rw-r--r-- 1 root root 0 Aug 14 15:10 cpuset.memory_migrate
-r--r--r-- 1 root root 0 Aug 14 15:10 cpuset.memory_pressure
-rw-r--r-- 1 root root 0 Aug 14 15:10 cpuset.memory_spread_page
-rw-r--r-- 1 root root 0 Aug 14 15:10 cpuset.memory_spread_slab
-rw-r--r-- 1 root root 0 Aug 14 15:10 cpuset.mems
-rw-r--r-- 1 root root 0 Aug 14 15:10 cpuset.sched_load_balance
-rw-r--r-- 1 root root 0 Aug 14 15:10 cpuset.sched_relax_domain_level
-rw-r--r-- 1 root root 0 Aug 14 15:10 notify_on_release
-rw-r--r-- 1 root root 0 Aug 14 15:10 tasks

注意, 删除子cgroup的时候, 要用 rmdir 来删除文件夹, 用 rm -rf
的措施无法删除

cd /sys/fs/cgroup/test
rmdir test-child

: 参考内核文档 Documentation/cgroups/cgroups.txt

a).
更小的虚拟化开支。LXC的无数表征为主由基本特供,相当于一个狠抓版的chroot,开支相比较HAL的虚拟化小了诸多。

Namespace (命名空间)

行使Namespace, 可以让每个进度组有独立的PID, IPC和互连网空间.
Namespace的生效紧若是通过 clone系统调用来已毕的.
clone系统调用的第3个参数flags就是通过安装Namespace来划分资源的.
参数连串如下:

名称 说明
CLONE_NEWIPC 划分IPC(进程间通信)命名空间, 信号量(semaphore), 共享内存, 消息队列等进程间通信用的资源
CLONE_NEWNET 划分网络命名空间. 分配网络接口
CLONE_NEWNS 划分挂载的命名空间. 与chroot同样分配新的根文件系统
CLONE_NEWPID 划分 PID 命名空间. 分配新的进程ID空间
CLONE_NEWUTS 划分 UTS(Universal Time sharing System)命名空间. 分配新的 UTS 空间

b).
神速安插。利用LXC来隔断特定应用,只须要安装LXC,即可使用LXC相关命令来创造并启动容器来为运用提供虚拟执行环境。传统的虚拟化技术则需要先创设虚拟机,然后安装系统,再配备应用。

Linux 容器的利用形式 (以下命令基于 debian v7.5)

  1. 安装 LXC

    apt-get install lxc
    lxc-checkconfig   # 安装完成后, 用这个命令检查系统是否可以使用 lxc
    # 我的debian系统上有个 missing
    Cgroup namespace: CONFIG_CGROUP_NSmissing
    # 对于这个missing, 可能是由于系统中没有挂载cgroup导致的, 挂载一个cgroup即可
    mount -t cgroup cgroup /mnt/cgroup
    
  2. 创立容器
    从现有模板创设容器, 相比较慢, 须要下载

    # 创建一个 debian 系统
    lxc-create -n test -t debian
    

    如此那般创造的器皿默许在 /var/lib/lxc/test 中,
    为了将容器成立在我们指定的任务, 可以写个简单的布局文件
    lxc.conf, 里面只要求一句

    lxc.rootfs = /home/lxc/test
    

    然后,

    lxc-create -n test -t debian -f /path/to/lxc.conf
    

    那样, 就把容器成立在了 /home/lxc/test 中了, /var/lib/lxc/test
    中唯有一个 config文件(那么些config文件可以看做 lxc-create 命令 -f
    参数对应配置文件的参照)

  3. 启航容器
    起步后就展开入了虚拟机的控制台了. (果然像神话一样, 几秒就开行落成了
    ^_^)

    lxc-start -n test
    
  4. 停下容器
    在主机中输入甘休的命令.

    lxc-stop -n test
    
  5. 销毁容器
    销毁以前, 可以通过 lxc-ls 来查阅有多少个容器

    lxc-ls
      test
    lxc-destroy -n test
    lxc-ls
    

: 参考URL –
http://obdnmagazine.blogspot.com/2013/07/tested-lxc-080-rc1-debian-wheezyax3a6.html

LXC项目我只是一个用户空间的工具集(Userspace tools for the Linux Kernel
containers),用来使用和管理LXC容器。LXC在资源管理方面尊崇与Linux内核的cgroups子系统,cgroups子系统是Linux内核提供的一个依据进程组的资源管理的框架(参见我前边的一篇文章此前的cgroup简介),可以为特定的历程组限定可以使用的资源。LXC在隔离控制地方依赖于Linux内核的namespace特性,具体而言就是在clone时进入相应的flag(NEWNS
NEWPID等等)。

容器示例 – 配置python uliweb 开发条件

品尝在容器配置三遍支付环境, 然后经过复制容器, 形成多少个虚拟机.

# 主机中
root@debian-113:~# uliweb   # 主机中没有安装uliweb 软件包
-bash: uliweb: command not found
root@debian-113:~# lxc-start -n test
# 虚拟机登录界面, 输入用户名和密码
# 虚拟机中
root@test:~# apt-get install python
root@test:~# apt-get install python-pip
root@test:~# pip install Uliweb
root@test:~# uliweb --version
Uliweb version is 0.3.1

长机中装置网桥, 虚拟机用桥接方式上网, 确保每个虚拟机有单独的IP

# 主机中
root@debian-113:~# lxc-stop -n test
root@debian-113:~# apt-cache search bridge-utils
root@debian-113:~# brctl addbr br0
# 配置主机的网桥
root@debian-113:/var/lib/lxc/test# cat /etc/network/interfaces 
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
#auto eth0
iface lo inet loopback

# 追加的网桥配置    
auto br0
iface br0 inet static
address 192.168.1.113
netmask 255.255.255.0
gateway 192.168.1.1
   bridge_ports eth0
   bridge_stp on
   bridge_fd 0

root@debian-113:/var/lib/lxc/test# /etc/init.d/networking restart

安顿容器的互连网(也是在主机中修改容器的安顿文件)

root@debian-113:/var/lib/lxc/test# cat /var/lib/lxc/test/config
... ... (很多默认生成的配置)

# network  <-- 这个 network 相关的是要追加的
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.name = eth0

启动Linux容器, 进入虚拟机

root@debian-113:/var/lib/lxc/test# lxc-start -n test
# 登录进入虚拟机, 确认虚拟机的IP
root@test:~# cat /etc/network/interfaces  <-- 默认是自动获取IP
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp
root@test:~# ifconfig   <-- 我的机器自动分配的 192.168.1.167
# 创建一个简单的uliweb工程
root@test:~# cd /home/
root@test:/home# mkdir CM-web
root@test:/home# cd CM-web/
root@test:/home/CM-web# uliweb makeproject test
root@test:/home/CM-web# cd test/
root@test:/home/CM-web/test# uliweb makeapp first_app
root@test:/home/CM-web/test# uliweb runserver -h 0.0.0.0

开行Web服务后, 就可以在主机的浏览器中 通过 http://192.168.1.167:8000/
来访问虚拟机中的web服务了.

说到底, 复制一个新的容器, 也就是再重复生成一个上边的 python uliweb
开发环境

# 在主机中
root@debian-113:~# cd /var/lib/lxc
root@debian-113:/var/lib/lxc# cp -r test test2
# 修改 test2/config 如下
lxc.utsname = test2           <-- 修改名称
xc.rootfs = /home/lxc/test2   <-- 修改 rootfs位置
... ...                       <-- 其它部分不用修改, 和 test 一样就行
root@debian-113:/var/lib/lxc# cd /home/lxc/
root@debian-113:/home/lxc# cp -r test test2  <-- 重新复制一份 rootfs
root@debian-113:/home/lxc# lxc-start -n test2  <-- 启动 test2 虚拟机, 其中环境和 test一样, IP会不一样, 自动获取的
# 进入 test2 虚拟机中, 可以直接启动之前的 uliweb 测试工程, 也可以从主机中访问其web服务.

LXC与Docker关系:http://www.tiejiang.org/4883.html

CentOS 6 安装使用 LXC

http://windchasereric.blog.51cto.com/5419433/1759052

环境:CentOS 6.5 x64

##安装rpel

rpm -Uvh
http://dl.fedoraproject.org/pub/epel/6/x86\_64/epel-release-6-8.noarch.rpm

##安装LXC

yum install libcgroup lxc lxc-libs lxc-templates bridge-utils
–enablerepo=epel

##配置LXC桥接方式

cp /etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/network-scripts/ifcfg-br0

vim /etc/sysconfig/network-scripts/ifcfg-br0 

[root@localhost network-scripts]# cat ifcfg-br0 

DEVICE=eth0

HWADDR=00:0C:29:F5:79:81

TYPE=Ethernet

UUID=edcf6721-480c-4433-af68-e20d783aea1c

ONBOOT=yes

NM_CONTROLLED=no

BRIDGE=br0

BOOTPROTO=static

USERCTL=no

[root@localhost network-scripts]# cat ifcfg-eth0 

DEVICE=eth0

HWADDR=00:0C:29:F5:79:81

TYPE=Ethernet

UUID=edcf6721-480c-4433-af68-e20d783aea1c

ONBOOT=yes

NM_CONTROLLED=no

BRIDGE=br0

BOOTPROTO=static

USERCTL=no

##修改LXC网络默许配置音信

[root@localhost templates]# cat /etc/lxc/default.conf

lxc.network.type = veth

lxc.network.link = br0  #本条要和原先创办的网桥的名称对应

lxc.network.flags = up

##启动LXC

/etc/init.d/cgconfig start

/etc/init.d/lxc start

##反省环境

lxc-checkconfig

##拔取模板安装一个centos 6 虚拟机

##/usr/share/lxc/templates/
自带了常用的模板可供接纳,debian/ubuntu,centos/redhat 都有。

XXXXXX 错误:lxc-create -n vm01 -t centos XXXXXX

lxc-create -n centos6 -t /usr/share/lxc/templates/lxc-centos

##-n:指定虚拟机的名号

## -t:指定成立虚拟机使用的模块,LXC其他目的如下

[root@localhost templates]# ll /usr/share/lxc/templates

total 328

-rwxr-xr-x 1 root root 10789 Aug 30  2014 lxc-alpine

-rwxr-xr-x 1 root root 13366 Aug 30  2014 lxc-altlinux

-rwxr-xr-x 1 root root 10251 Aug 30  2014 lxc-archlinux

-rwxr-xr-x 1 root root  9446 Aug 30  2014 lxc-busybox

-rwxr-xr-x 1 root root 28387 Jun 23 18:06 lxc-centos

-rwxr-xr-x 1 root root 10177 Aug 30  2014 lxc-cirros

-rwxr-xr-x 1 root root 12158 Aug 30  2014 lxc-debian

-rwxr-xr-x 1 root root 17213 Aug 30  2014 lxc-download

-rwxr-xr-x 1 root root 47196 Aug 30  2014 lxc-fedora

-rwxr-xr-x 1 root root 27422 Aug 30  2014 lxc-gentoo

-rwxr-xr-x 1 root root 13961 Aug 30  2014 lxc-openmandriva

-rwxr-xr-x 1 root root 13705 Aug 30  2014 lxc-opensuse

-rwxr-xr-x 1 root root 35445 Aug 30  2014 lxc-oracle

-rwxr-xr-x 1 root root 11749 Aug 30  2014 lxc-plamo

-rwxr-xr-x 1 root root  6848 Aug 30  2014 lxc-sshd

-rwxr-xr-x 1 root root 24183 Aug 30  2014 lxc-ubuntu

-rwxr-xr-x 1 root root 12427 Aug 30  2014 lxc-ubuntu-cloud

##临时密码在

/var/lib/lxc/vm01/tmp_root_pass

##修改密码执行以下命令

chroot /var/lib/lxc/vm01/rootfs passwd

###设置后,虚拟机默许位于/var/lib/lxc/vm01/rootfs,

###布署文件为/var/lib/lxc/vm01/config

##在CentOS中,LXC的多少个默认的途径如下:

##lxc默许配置文件:/etc/lxc/default.conf 

##模版脚本所在目录:/usr/share/lxc/templates 

##容器实例目录:/var/lib/lxc/ 

##起步打开lxc容器并进入开机console,

lxc-start -n vm01

###碰到难题:failed to attach ‘vethMA5FN1’ to the bridge ‘virbr0’ :
No such device,必须yum安装bridge-utils

###开辟上边网址配置虚拟机网络项目解决

lxc.network.type = macvlan

lxc.network.macvlan.mode = bridge

lxc.network.flags = up

lxc.network.link = eth0

##在后台运行虚拟机,并经过console连接过去 (使用ctrl+a+q退出console)

lxc-start -n vm01 -d

lxc-console -n vm01

##查看lxc容器相关新闻(名称、是还是不是在运作、PID,CPU使用、IO使用、内存使用、IP地址、互联网吞吐量)

lxc-info -n vm01

##监视lxc容器的资源采用

lxc-top

##容器克隆

lxc-clone vm01 webserver01 -B lvm

##要是你想节约空间,克隆时带上 -s (–snapshot)
参数,可以成立一个源容器的可读写快照

lxc-clone vm01 webserver01 -s -B lvm

##修改虚拟机的root密码:

http://www.178linux.com/5351

[root@localhost ~]# chroot /var/lib/lxc/vm01/rootfs passwd

##闭馆或删除容器

lxc-stop -n vm01

lxc-destroy -n vm01

##计划容器的cgroup

##安装容器只使用0,1四个CPU焦点

lxc-cgroup -n centos cpuset.cpus 0-1 

##安装容器使用的CPU时间

##安装虚拟机可用内存为512M

lxc-cgroup -n centos memory.limit_in_bytes 53687091 

##设置虚拟机消耗的IO权重

lxc-cgroup -n centos blkio.weight 500 

##要么直接写入容器的配备文件config中

相关文章