zoukankan      html  css  js  c++  java
  • 虚拟化之lxc

    LXC 中文名称就是 Linux 容器工具,容器可以提供轻量级的虚拟化,以便隔离进程和资源,使用 LXC 的优点就是不需要安装太多的软件包,使用过程也不会占用太多的资源,本文循序渐进地介绍LXC的建立和管理方法以及虚拟网络接口的设置方法。

      LXC 在资源管理方面依赖 Linux 内核的 cgroups (Control Groups) 系统,cgroups 系统是 Linux 内核提供的一个基于进程组的资源管理的框架,可以为特定的进程组限定可以使用的资源。它最初由 Google 的工程师提出,后来被整合进 Linux 内核。cgroups 也是 LXC 为实现虚拟化所使用的资源管理手段。LXC 目前已经进入 Linux 内核,这意味着 LXC 技术将是目前最有竞争力的轻量级虚拟容器技术。

      1、搭建第一个 LXC 虚拟计算机

      #yum install lxc*

      2、安装软件包后要检查 Linux 发行版的内核对 LXC 的支持情况,可以使用下面命令

      #lxc-checkconfig

      #lxc-checkconfig 命令检查之后如果所有项目显示“enabled”表示可以直接使用 LXC

      3、建立一个 fedora Server LXC 虚拟计算机系统

      #lxc-create -t fedora -n testA

      #这里使用的是fedora模板,模板文件保存在/usr/lib/lxc/templates/目录

      上面命令完成后, 会在 /var/lib/lxc 目录中, 产生虚拟计算机testA

      4、检查创建的虚拟机系统

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

      5、启动 LXC 虚拟计算机

      # lxc-start -n testA

      确认账号和密码后登录虚拟计算机

      6、列出当前系统所有的容器

      # lxc-ls

      7、使用 console 登入容器

      #lxc-console -n testA –t 3

      8、停止运行一个容器

      # lxc-stop -n testA

      9、获取一个容器的状态

      # lxc-info -n ol6ctr1

      10、把一个容器销毁

      # lxc-destroy -n testA1

      11、复制一个容器

      # lxc-clone -o testA -n ol6ctr2

      12、暂停或恢复一个容器

      # lxc-freeze -n testA

      # lxc-unfreeze -n testA

      13、修改 LXC 网络接口

      # vi /etc/default/lxc

      #用户修改后要重新启动网络服务

      #service lxc-net restart

      上面就是Linux系统中安装部署LXC的方法介绍了,LXC目前已进入Linux内核,为Linux系统搭建LXC是很有必要的,如果你想要安装LXC,不妨来了解下吧。

    到底该不该选择LXC(Linux Container)技术?

     最近使用Container构建云平台的企业越来越多,其实Container并不是新技术,OpenVZ、Linux-VServer、FreeBSD jails、Solaris Containers都是Container技术的实现,随着Paas的发展,Container技术受到更多的重视。那么在进行虚拟化技术选择时,到底是该如何选择呢?
    
    首先,什么是虚拟化?
    
    虚拟化是指在同一台物理服务器上模拟多台虚拟机的能力,且每台虚拟机在逻辑上拥有独立的CPU、内存、硬盘和网络接口等。虚拟化可以提高硬件资源的利用率,使多个应用能隔离的运行在同一台物理机上。虚拟化分为硬件层面的虚拟化和软件层面的虚拟化。
    
    什么是硬件虚拟化?
    
    一种对计算机或操作系统的虚拟,对用户隐藏了真实的计算机硬件,表现出另一个抽象计算平台。硬件虚拟化通过模拟硬件的方式来获得真实计算机的环境,可以运行一个完整的操作系统。在硬件虚拟化中,又有Full Virtualization、Partial Virtualization和Paravirtualization等不同的实现方式。
    
    在硬件虚拟化的层面,现代虚拟化技术通常是全虚拟和半虚拟的混合体。常见的虚拟化技术例如VMWare、Xen和KVM都同时支持全虚拟化和半虚拟化。硬件虚拟化方式提供的虚拟机,都独立的运行着一个完整的操作系统,这样在同一台物理宿主机上存在大量相同或者相似的进程和内存页,从而导致较大的性能损耗(比如:宿主机操作系统是Centos,使用KVM生成的多个虚拟机,且在每个虚拟机中都运行Windows操作系统和相同的QQ程序,这样宿主机的性能必然产生较大损耗)。因此,硬件虚拟化也被称为重量级虚拟化,在同一宿主机上能够同时运行的虚拟机数量相当有限。
    
    什么是软件层面的虚拟化?
    
    指在同物理服务器上提供多个隔离的虚拟运行环境,也被称为容器技术。在软件虚拟化的层面,同一宿主机上的所有虚拟机(又称Container)共享宿主机的操作系统实例,不存在由于运行多个操作系统实例所造成的性能损耗(比如:宿主机的操作系统为Centos,通过软件虚拟化技术生成多个Container,且每个Container都运行着QQ程序,由于它们共享同一个宿主机Centos操作系统,所有Container中QQ程序的进程在Centos中只有一个)。因此,软件虚拟化也被称为轻量级虚拟化,在同一宿主机上能够同时运行的虚拟运行环境数量比较宽松。以Solaris操作系统上的Container为例,一个Solaris操作系统的实例理论上可以支持多达8000个Container(实际能够运行的Container数量取决于系统资源和负载)。与此类似,Linux操作系统上的LXC也可以轻松地在同一宿主机上同时支持数量可观的虚拟运行环境。
    
    LXC(Linux Container)的优势有哪些?
    
    (1)与宿主机使用同一个内核,性能损耗小;
    
    (2)不需要指令级模拟;
    
    (3)不需要即时(Just-in-time)编译;
    
    (4)容器可以在CPU核心的本地运行指令,不需要任何专门的解释机制;
    
    (5)避免了准虚拟化和系统调用替换中的复杂性;
    
    (6)轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机的资源共享。
    
    选择时考虑哪些因素?
    
    在虚拟化这个领域,国内外的各大公司对硬件虚拟化的兴趣较大,在研发和生产环境中也大都采用硬件虚拟化技术。但是近段时间国内外很多云计算厂商纷纷开始尝试使用LXC替代KVM/XEN等硬件虚拟化技术以获得更好的性能。至于在实际的应用场景中到底应该选择硬件虚拟化还是软件虚拟化,需要从以下方面考虑。灵活性、易管理,可靠性、稳定性、性能考虑。硬件虚拟化更灵活、易管理,硬件虚拟化具有天生的迁移优势。软件虚拟化则有更高性能,更加节省资源,对于一些小的网站性能可以提升上千倍,在没有用户访问的时候,可以关闭LXC,从而节省资源。在有用户访问的时候,可以快速启动,但缺点是迁移成本高,学习成本高。而且,目前来看LXC仍属于小众路线。
    
    因此,在选择上还需要根据自身的业务和公司的战略去确定使用哪种虚拟化技术。比如京东,在公有云方面采用Openstack + KVM硬件虚拟化技术;但在PaaS层和私有云方面,则采用了Openstack + LXC的方式进行实现。让彼此的优势互补,以达到最佳的运行效果。
    
    
    
    lxc介绍: http://www.ibm.com/developerworks/cn/linux/l-lxc-containers/
    
    
        容器是一种轻量级的虚拟化技术,与qemu/kvm、VMware、Xen等完全的虚拟化方案相比,LXC更像是加强的“chroot”,因为LXC不但没有没有对硬件设备进行仿真,而且可以与主机共享一模一样的操作系统,所以LXC与solaris的zones和BSD的jails相比,更具优势。
    
    
    容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。与虚拟化相比,这样既不需要指令级模拟,也不需要即时编译。容器可以在核心 CPU 本地运行指令,而不需要任何专门的解释机制。此外,也避免了半虚拟化(paravirtualization)和系统调用替换中的复杂性。
    
    
    通过提供一种创建和进入容器的方式,操作系统让应用程序就像在独立的机器上运行一样,但又能共享很多底层的资源。
    
    
    虚拟机的好处在于可以上下扩展,可控的计算资源,安全隔离,并可以通过API进行部署;但其缺点在于,每一台虚拟机都消耗了一部分资源用于运转一个完整的操作系统。所以,另一种方式更适合一个云平台,就是Linux Containers。
    
    
    Container并不是新技术。虽然Container能提升资源利用率,但迁移成本是很高的,包括工程师的学习成本。
    
    
        目前,有两个比较方便的管理容器的用户空间的工具:libvirt和lxc。libvirt通过"lxc:///"像管理其他虚拟机驱动一样管理lxc虚拟机。另一个是与libvirt完全独立的LXC,它定义了一些列的命令,可以更灵活的管理和使用lxc。
        
    
    
    虚拟化的类型
    XEN和KVM实现了真正的虚拟化方案;LXC确切来说应该是资源隔离(namespace),并不能提供完整的物理隔离功能。
    XEN虚拟化是相对于KVM来说更加成熟的虚拟化方案,像AWS、Azure等公有云都是使用的XEN作为虚拟化方案;而随着最近几年KVM的发展以及KVM较好的性能,国内的部分虚拟化厂商开始选择KVM作为新的虚拟化方案,像百度、Intel中国、阿里云等开始逐步向KVM迁移。
    LXC通过资源隔离和命名空间实现了伪虚拟化功能,由于LXC较高的性能和不彻底的隔离,越来越多的应用到私有云上。
    
    
    
    虚拟化性能分析(XEN/KVM/LXC):http://blog.chinaunix.net/uid-20662820-id-4514947.html
    三种虚拟化性能比较      LXC>>KVM>>XEN
           由于LXC使用cgroup机制,其性能损坏基本为0。
    三种虚拟化隔离比较      XEN>>KVM>>LXC
           LXC只能虚拟化linux。
    三种虚拟化内存利用率 LXC>>KVM>>XEN
           由于LXC共用内核,内存利用率最高;其他两种方案每个虚机都需要单独的操作系统占用一部分内存空间。

    Linux Container容器是一种内核虚拟化技术,简称LXC,是一种轻量级的虚拟化手段

    安装lxc,c7.2环境下
    yum install epel-release
    yum install lxc

    Installing:
     lxc                                x86_64                     1.0.8-1.el7                        epel                     140 k
    Installing for dependencies:
     libseccomp                         x86_64                     2.2.1-1.el7                        base                      49 k
     lua-alt-getopt                     noarch                     0.7.0-4.el7                        epel                     7.4 k
     lua-filesystem                     x86_64                     1.6.2-2.el7                        epel                      28 k
     lua-lxc                            x86_64                     1.0.8-1.el7                        epel                      17 k
     lxc-libs                           x86_64                     1.0.8-1.el7                        epel                     271 k
     rsync                              x86_64                     3.0.9-17.el7                       base                     360 k

    yum install lxc lxc-templates


    [root@1st-kvm templates]# pwd
    /usr/share/lxc/templates
    [root@1st-kvm templates]# ll
    total 340
    -rwxr-xr-x. 1 root root 10557 Nov 15  2015 lxc-alpine
    -rwxr-xr-x. 1 root root 13534 Nov 15  2015 lxc-altlinux
    -rwxr-xr-x. 1 root root 10556 Nov 15  2015 lxc-archlinux
    -rwxr-xr-x. 1 root root  9878 Nov 15  2015 lxc-busybox
    -rwxr-xr-x. 1 root root 29149 Nov 15  2015 lxc-centos
    -rwxr-xr-x. 1 root root 10486 Nov 15  2015 lxc-cirros
    -rwxr-xr-x. 1 root root 17354 Nov 15  2015 lxc-debian
    -rwxr-xr-x. 1 root root 17757 Nov 15  2015 lxc-download
    -rwxr-xr-x. 1 root root 49319 Nov 15  2015 lxc-fedora
    -rwxr-xr-x. 1 root root 28253 Nov 15  2015 lxc-gentoo
    -rwxr-xr-x. 1 root root 13962 Nov 15  2015 lxc-openmandriva
    -rwxr-xr-x. 1 root root 14046 Nov 15  2015 lxc-opensuse
    -rwxr-xr-x. 1 root root 35540 Nov 15  2015 lxc-oracle
    -rwxr-xr-x. 1 root root 11868 Nov 15  2015 lxc-plamo
    -rwxr-xr-x. 1 root root  6851 Nov 15  2015 lxc-sshd
    -rwxr-xr-x. 1 root root 23494 Nov 15  2015 lxc-ubuntu
    -rwxr-xr-x. 1 root root 11349 Nov 15  2015 lxc-ubuntu-cloud


    命令检查之后如果所有项目显示“enabled”表示可以直接使用 LXC
    lxc-checkconfig

    创建一个容器,下载与安装,大概花了半小时。
    lxc-create -n testA -t fedora

    Container rootfs and config have been created.
    Edit the config file to check/enable networking setup.
    
    You have successfully built a Fedora container and cache.  This cache may
    be used to create future containers of various revisions.  The directory
    /var/cache/lxc/fedora/x86_64/bootstrap contains a bootstrap
    which may no longer needed and can be removed.
    
    A LiveOS directory exists at /var/cache/lxc/fedora/x86_64/LiveOS.
    This is only used in the creation of the bootstrap run-time-environment
    and may be removed.
    
    The temporary root password is stored in:
    
            '/var/lib/lxc/testA/tmp_root_pass'
    
    
    The root password is set up as expired and will require it to be changed
    at first login, which you should do as soon as possible.  If you lose the
    root password or wish to change it without starting the container, you
    can change it from the host by running the following command (which will
    also reset the expired flag):
    
            chroot /var/lib/lxc/testA/rootfs passwd


    下面二选一,要么使用预设的密码,或者自己直接改一个
    [root@1st-kvm templates]# cat /var/lib/lxc/testA/tmp_root_pass
    Root-testA-38xUoG
    chroot /var/lib/lxc/testA/rootfs passwd


    yum install bridge-utils
    brctl addbr br0
    brctl addif br0 eno1
    ip addr del 192.168.10.101/24 dev eno1
    ip addr add 192.168.10.101/24 dev br0
    ip link set br0 up


    如果没有做以上的br0操作的话,启动时会报错
    [root@1st-kvm ~]# lxc-start -n testA

    lxc-start: conf.c: instantiate_veth: 3105 failed to attach 'vethJPPDLN' to the bridge 'virbr0': No such device
    lxc-start: conf.c: lxc_create_network: 3388 failed to create netdev
    lxc-start: start.c: lxc_spawn: 841 failed to create the network
    lxc-start: start.c: __lxc_start: 1100 failed to spawn 'testA'
    lxc-start: lxc_start.c: main: 341 The container failed to start.
    lxc-start: lxc_start.c: main: 345 Additional information can be obtained by setting the --logfile and --logpriority options.

    man lxc.container.conf

    [root@1st-kvm lxc]#  cat /etc/lxc/default.conf
    lxc.network.type = veth
    lxc.network.link = virbr0
    lxc.network.flags = up

    下面这个配置文件优先于上面那个

    cat /var/lib/lxc/testA/config

    这个配置文件基本不用动,只需要在宿主机上创建一个虚拟网卡br0即可

    lxc.utsname = testA lxc.network.type = veth  这是一对,一侧赋给容器,一侧附加到一个桥上(由lxc.network.link指定的) lxc.network.flags = up lxc.network.link = br0 lxc.network.name = eth0  这是veth容器上的网卡名称          eth0@if13:
    lxc.network.veth.pair = v-testA-e0  这是veth宿主机上的网卡名称  v-testA-e0@if12 lxc.network.hwaddr = 4a:49:43:49:79:bf lxc.network.ipv4 = 192.168.10.67/24 255.255.255.0 lxc.network.ipv6 = 2003:db8:1:0:214:1234:fe0b:3597



    [root@1st-kvm ~]# lxc-start -n testA

    systemd 219 running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN)
    Detected virtualization lxc.
    Detected architecture x86-64.
    
    Welcome to Fedora 22 (Twenty Two)!
    
    Set hostname to <testA>.
    Initializing machine ID from random generator.

    [root@1st-kvm ~]# lxc-ls
    testA

    [root@1st-kvm ~]# lxc-info --name testA
    Name:           testA
    State:          RUNNING
    PID:            3338
    IP:             192.168.10.115
    IP:             192.168.10.76
    CPU use:        0.09 seconds
    BlkIO use:      0 bytes
    Memory use:     1.29 MiB
    KMem use:       0 bytes
    Link:           vethH044VE
     TX bytes:      1.38 KiB
     RX bytes:      9.35 KiB
     Total bytes:   10.73 KiB

    [root@1st-kvm testA]# lxc-console -n testA -t 3
    Type <Ctrl+a q> to exit the console, <Ctrl+a Ctrl+a> to enter Ctrl+a itself

    lxc使用心得

    环境
    
    [root@localhost journal]# cat /etc/centos-release
    CentOS Linux release 7.2.1511 (Core)
    [root@localhost journal]# rpm -qa|grep lxc
    lxc-templates-1.0.8-1.el7.x86_64
    lxc-libs-1.0.8-1.el7.x86_64
    lua-lxc-1.0.8-1.el7.x86_64
    lxc-1.0.8-1.el7.x86_64

    安装
    yum install epel-release
    yum install lxc lxc-templates
    lxc-checkconfig
    lxc-create -n wo -t centos
    sed -i 's/virbr0/br0/' /var/lib/lxc/wo/config
    chroot /var/lib/lxc/wo/rootfs passwd
    lxc-start -n wo

    lxc-create -n f -t fedora也很慢,花费了2小时
    运行了两个lxc容器,第一个是centos,创建很快。
    lxc-create -n wo -t centos
    [root@localhost wo]# lxc-start -n wo
    但是有时lxc-console -n wo连不进去,而且100%占用一个cpu核,还有就是在这个容器里运行了一个
    yum install cobbler,就卡住了,动不了了。


    第二个是gentoo,创建很慢。主要是下载速度慢,总共300M的东西,用了3个小时
    lxc-create -n ni -t gentoo
    然后启动(在centos已经启动,并在里面操作时)第二个,启动时就卡住了
    [root@localhost ni]# lxc-start -n ni
    INIT: version 2.88 booting

       OpenRC 0.19.1 is starting up Gentoo Linux (x86_64)

     * Mounting /proc ... [ ok ]
     * Mounting /run ... * /run/openrc: creating directory
     * /run/lock: creating directory
     * /run/lock: correcting owner
     * Caching service dependencies ... [ ok ]
     * Mounting devtmpfs on /dev ... [ ok ]
     * Mounting /dev/mqueue ... [ ok ]
    ssh-keygen: generating new host keys: RSA DSA ED25519
     * Starting sshd ... [ ok ]
     * Setting up tmpfiles.d entries for /dev ... [ ok ]


    这是cpu利用率,启动了两个容器,就100%占用了两个核。
    [root@localhost templates]# mpstat -P ALL 1
    Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
    Average:     all   20.40    0.00   29.61    0.00    0.00    0.00    0.00    0.00    0.00   49.99
    Average:       0   26.05    0.00   73.95    0.00    0.00    0.00    0.00    0.00    0.00    0.00
    Average:       1   55.52    0.00   44.48    0.00    0.00    0.00    0.00    0.00    0.00    0.00
    Average:       2    0.01    0.00    0.01    0.00    0.00    0.00    0.00    0.00    0.00   99.98
    Average:       3    0.01    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.99
    [root@localhost templates]# vmstat 1 -w
    procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu--------
     r  b         swpd         free         buff        cache   si   so    bi    bo   in   cs  us  sy  id  wa  st
     2  0            0     28329360          984      4065896    0    0     5    87  264   64  13  11  76   0   0
     2  0            0     28329344          984      4065896    0    0     0     0 2030   43  21  29  50   0   0
     2  0            0     28329344          984      4065896    0    0     0     0 2016   31  21  30  50   0   0
     2  0            0     28329344          984      4065896    0    0     0     8 2018   42  21  30  50   0   0

  • 相关阅读:
    Windows打开文件后提示,文件或目录损坏无法读取。
    windows10 提示内存不足
    配置Redis集群为开机自启动
    Hbase的rowkey设计
    Hbase表类型的设计
    mycat的下载和安装
    mycat简介
    mysql|tomcat|nginx|redis在docker中的部署
    docker的备份和迁移
    Redis Cluster集群详介绍和伪集群搭建
  • 原文地址:https://www.cnblogs.com/createyuan/p/5248140.html
Copyright © 2011-2022 走看看