和现有虚拟机技术(XenCentOS 6 安装使用 LXC

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

lxc-top

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

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

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

###安排文件也/var/lib/lxc/vm01/config

容器示例 – 配置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服务.

##于CentOS中,LXC的几乎独默认的路径如下:

Linux 容器相关的2单重点概念

Linux容器功能是依据 cgroups 和 Namespace 来兑现的. 所以只要了解 Linux
容器必须优先了解 cgroup 和 Namespace.

##检查环境

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 空间

##安容器使用的CPU时间

##改虚拟机的root密码:

TYPE=Ethernet

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

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

lxc-checkconfig

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

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

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

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

##安装LXC

Linux Container

NM_CONTROLLED=no

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

a).
更粗的虚拟化开销。LXC的博表征为主由基础特供,相当给一个加强版本的chroot,开销相比HAL的虚拟化小了诸多。

lxc-clone vm01 webserver01 -B lvm

lxc-console -n vm01

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

lxc-destroy -n vm01

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

##倘您想节约空间,克隆时带齐 -s (–snapshot)
参数,可以创造一个源容器的可读写快照

BRIDGE=br0

lxc-start -n vm01 -d

##查看lxc容器相关信息(名称、是否当运行、PID,CPU用、IO使用、内存以、IP地址、网络吞吐量)

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

BOOTPROTO=static

##部署容器的cgroup

DEVICE=eth0

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

##模版脚论所当目:/usr/share/lxc/templates 

###安装后,虚拟机默认位于/var/lib/lxc/vm01/rootfs,

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

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

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

##-n:指定虚拟机的称呼

lxc-cgroup -n centos blkio.weight 500 

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

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

total 328

lxc.network.link = br0  #夫只要跟原先缔造的网桥的称对应

大凡一个操作系统层的轻量级虚拟化技术,百度、腾讯等互联网公司的PaaS平台多都以了这项新技巧。和XEN,VMware和KVM等硬件抽象层的虚拟化技术相比,LXC更像是增进版本的chroot。因为Linux
Containers不但没有针对硬件设备开展虚伪(指令集模拟),还足以使用主机的目及文书等资源。容器可以当基本
CPU
本地运行指令,而休待任何特别的解说机制。所以,与俗的HAL(硬件抽象层)层次之虚拟化技术相比起以下优势:

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

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

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

##设置虚拟机可用内存为512M

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

b).
快速部署。利用LXC来隔断特定应用,只待安装LXC,即可使用LXC相关命令来创造并启动容器来啊下提供虚拟执行环境。传统的虚拟化技术则需事先创造虚拟机,然后安装系统,再安排下。

BOOTPROTO=static

lxc.network.type = veth

##装容器只使用0,1星星单CPU核心

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

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

lxc-clone vm01 webserver01 -s -B lvm

lxc.network.flags = up

lxc-stop -n vm01

USERCTL=no

lxc.network.type = macvlan

LXC项目自己才是一个用户空间的家伙集(Userspace tools for the Linux Kernel
containers),用来行使及管理LXC容器。LXC在资源管理方面依赖和Linux内核的cgroups子系统,cgroups子系统是Linux内核提供的一个基于进程组的资源管理的框架(参见我之前的同篇稿子之前的cgroup简介),可以啊特定的历程组限定可使的资源。LXC在隔离控制地方依赖让Linux内核的namespace特性,具体而言就是以clone时进入相应的flag(NEWNS
NEWPID等等)。

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

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

/var/lib/lxc/vm01/tmp_root_pass

##启动LXC

/etc/init.d/lxc start

##闭馆或去容器

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

lxc.network.flags = up

##容器克隆

ONBOOT=yes

##配置LXC桥接道

lxc-info -n vm01

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

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

DEVICE=eth0

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

##监视lxc容器的资源用

ONBOOT=yes

##使用模板安装一个centos 6 虚拟机

/etc/init.d/cgconfig start

USERCTL=no

BRIDGE=br0

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

##/usr/share/lxc/templates/
自带了常用之模版可供应选择,debian/ubuntu,centos/redhat 都生。

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

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

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

TYPE=Ethernet

###开拓上面网址配置虚拟机网络项目解决

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

lxc-start -n vm01

##安装rpel

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

##即密码在

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

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

CentOS 6 安装使用 LXC

lxc.network.macvlan.mode = bridge

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

##修改LXC网络默认配置信息

##或者直接写副容器的配备文件config中

环境:CentOS 6.5 x64

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

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

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

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

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

lxc-cgroup -n centos memory.limit_in_bytes 53687091 

lxc.network.link = eth0

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

NM_CONTROLLED=no

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

相关文章