KVM虚拟化管理

大纲:

一、部署安装kvm虚拟机

二、virsh常见命令解释

三、KVM虚拟机克隆

四、KVM快照

五、让GuestOS支持 console

六、添加网卡

七、磁盘扩容

八、动态迁移

前言:

虚拟化的理论知识我就不啰嗦了,可以参见http://bbs.linuxtone.org/thread-24347-1-1.html,kvm 全称Kernel-based  Virtual Machine, 其实kvm只是一个内核模块,提供虚拟cpu和内存管理的模块,至于其它的设备是由qemu模拟的,如网卡,显卡,磁盘等。后来redhat联合IBM以 及Linux社区创造了libvirt,模拟的设备性能要比qemu的好很多,并提供了一系列的管理工具和api,整个集成了kvm虚拟化的解决方案。 Linux(redhat系)装载kvm模块后,妖神一变成为了VM Monitor,也称为Hypervisor,部署使用简单,需要硬件支持虚拟化。

 

一.  部署虚拟机

1).  检测硬件是否支持虚拟化

# egrep ‘(vmx|svm)’ –color=always /proc/cpuinfo
# modprobe kvm
# modprobe kvm_intel || modprobe kvm_amd

 

如果含有vmx或者svm字样,则表示支持CPU虚拟化,Intel是vmx,AMD是svm,也需要检测是否有kvm_xxx模块,如果装载不成功,可能是没有开启硬件虚拟化,需要bios中开启,具体开启方式请联系厂家

2). 安装rpm包,并启动服务

# yum -y install kvm  python-virtinst libvirt tunctl bridge-utils virt-manager qemu-kvm-tools \

virt-viewer virt-v2v libguestfs-tools
# service libvirtd start

 

3). 检查是否有kvm模块,如果有则继续

# lsmod | grep kvm
kvm_intel              52570  30
kvm                   314739  1 kvm_intel

 

4). 配置桥接网络 br0

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

ifcfg-eth0:

DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BRIDGE=”br0″
BOOTPROTO=static
IPADDR=”192.168.2.149″
NETMASK=”255.255.255.0″
GATEWAY=”192.168.2.2″

ifcfg-br0:

DEVICE=br0
TYPE=Bridge
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=”192.168.2.149″
NETMASK=”255.255.255.0″
GATEWAY=”192.168.2.2″

# service network restart
# ifconfig
br0 …
eth0 …
lo …
virbr0 …

5). 部署安装虚拟机(GuestOS)

① 建立磁盘文件,如果使用的是raw格式就不需要了,kvm虚拟机默认使用raw格式的镜像格式,性能最好,速度最快,它的缺点就是不支持一些新的功能,如支持快照镜像,zlib磁盘压缩,AES加密等。这里使用qcow2格式

# mkdir /opt/vms
# qemu-img create -f qcow2 /opt/vms/centos63-webtest.img 40G

② 建立虚拟机, 下面展示多种方式建立虚拟机

########### 使用使用iso来安装 ###########
# virt-install \
–name=centos5 \
os-variant=RHEL5 \
–ram=512 \
–vcpus=1 \
–disk path=/opt/vms/centos63-webtest.img,format=qcow2,size=7,bus=virtio \
–accelerate \
–cdrom /data/iso/CentOS5.iso \
–vnc –vncport=5910 \
–vnclisten=0.0.0.0 \
–network bridge=br0,model=virtio \
–noautoconsole

########### 使用使用nat模式网络###########
# virt-install \
–name=centos5 \
os-variant=RHEL5 \
–ram=512 \
–vcpus=1 \
–disk path=/opt/vms/centos63-webtest.img,format=qcow2,size=7,bus=virtio \
–accelerate \
–cdrom /data/iso/CentOS5.iso \
–vnc –vncport=5910 \
–vnclisten=0.0.0.0 \
–network network=default,model=virtio \
–noautoconsole

######### 从http中启动,使用ks安装 #########

# virt-install \
–name=centos63-webtest \
os-variant=RHEL6 \
–ram=4096 \
–vcpus=4 \
–virt-type kvm  \
–disk path=/opt/vms/centos63-webtest.img,format=qcow2,size=7,bus=virtio \
–accelerate  \
–location http://192.168.130.4/centos63 \
–extra-args “linux ip=192.168.73.22 netmask=255.255.255.224 gateway=192.168.73.1 ks=http://192.168.130.4/ks/xen63.ks”\
–vnc –vncport=5910 \
–vnclisten=0.0.0.0 \
–network bridge=br0,model=virtio \
–force \
–noautoconsole

########## 从http安装,使用ks, 双网卡, 启用console ########
# virt-install \
–name=centos63-webtest \
os-variant=RHEL6 \
–ram=4096 \
–vcpus=4 \
–virt-type kvm  \
–disk path=/opt/vms/centos63-webtest.img,format=qcow2,size=7,bus=virtio \
–accelerate  \
–location http://111.205.130.4/centos63 \
–extra-args “linux ip=59.151.73.22 netmask=255.255.255.224 gateway=59.151.73.1 ks=http://111.205.130.4/ks/xen63.ks console=ttyS0  serial”
–vnc –vncport=5910 –vnclisten=0.0.0.0 \
–network bridge=br0,model=virtio \
–network bridge=br1,model=virtio \
–force \
–noautoconsole

 

########## 安装windows ########
# virt-install \
–name=win7-test \
os-variant=win7 \
–ram=4096 \
–vcpus=4 \
–disk path=/opt/vms/centos63-webtest.img,size=100 \
–accelerate  \
–cdrom=/opt/iso/win7.iso
–vnc –vncport=5910 –vnclisten=0.0.0.0 \
–network bridge=br0 \
–force \
–noautoconsole

 

## 不能使用virtio,因为默认windows没有virtio的硬盘和网卡驱动

参数说明:

–name指定虚拟机名称
–ram分配内存大小。
–vcpus分配CPU核心数,最大与实体机CPU核心数相同
–disk指定虚拟机镜像,size指定分配大小单位为G。
–network网络类型,此处用的是默认,一般用的应该是bridge桥接。可以指定两次也就是两块网卡
–accelerate加速
–cdrom指定安装镜像iso
–location 从ftp,http,nfs启动
–vnc启用VNC远程管理
–vncport指定VNC监控端口,默认端口为5900,端口不能重复。
–vnclisten指定VNC绑定IP,默认绑定127.0.0.1,这里改为0.0.0.0。
ostype=linux,windows
–extra-args指定额外的安装参数
os-variant= [win7 vista winxp win2k8 rhel6 rhel5]
–force 如果有yes或者no的交互式,自动yes

③ 安装系统 有三种方式,通过VNC来安装, 通过virt-manager来安装 , 通过console配合ks来安装

Ⅰ.  通过VNC来安装

  • 下载TightVNC来连接上vnc安装,只需要TightVNC Client即可,如果使用在RealVNC,就设置ColourLevel=rgb222才能连接,端口号是安装时指定的,以后的安装流程和普通的是一样的

 

Ⅱ.  通过virt-manager, 如果你使用xshell那么可以不用安装x window就可以使用virt-manager, 需要安装 x11相关软件

# yum -y install libX11 xorg-x11-server-utils xorg-x11-proto-devel dbus-x11 \

xorg-x11-xauth xorg-x11-drv-ati-firmware  xorg-x11-xinit

# virt-manager

Ⅲ. 通过virt console, 如果你安装时启用了 console可以使用 console来安装, Ctrl+]  可以退出console

# virsh console centos63-webtest

VI. 通过virt-viewer来安装

# yum -y install virt-viewer xorg-x11-font*

# virt-viewer centos63-webtest

二. virsh常见命令解释

1. virsh进入交互模式,在该交互模式下有命令不全补全,详细帮助
virsh # lis[tab补全]
virsh # help list   详细帮助
2. virsh list –all 查看虚拟机状态
3. virsh start instanceName 虚拟机开机
4. virsh shutdown instanceName 虚拟机关机
需要Linux母体机电源管理
service acpid start
5. virsh destroy instanceName  强制关机
6. virsh create /etc/libvirt/qemu/wintest01.xml 通过以前的配置文件创建虚拟机
7. virsh autostart instanceName 配置自启动
8. virsh dumpxml wintest01 > /etc/libvirt/qemu/wintest02.xml 导出配置文件
9. virsh undefine wintest01 删除虚拟机配置文件,不会真的删除虚拟机
10. mv /etc/libvirt/qemu/wintest02.xml /etc/libvirt/qemu/wintest01.xml
virsh define /etc/libvirt/qemu/wintest01.xml
重新定义虚拟机
11. virsh edit wintest01  编辑虚拟机配置文件
12. virsh suspend wintest01  挂起虚拟机
13. virsh resume wintest01 恢复挂起虚拟机

 

三. 克隆

1).  使用virt-manager来克隆,这个太简单了,就不演示了,需要注意的是,如果启用了VNC, 记得更改VNC的端口,否则启动会失败的,见命令方式修改VNC修改

2).  使用命令克隆虚拟机

# virt-clone -o centos63_webtest -n centos63_webtest2 -f /opt/vms/centos_webtest2.img

参数说明:
-o –-original  原来实例name
-n –-name      新实例名称
-f –-file      新实例磁盘存放位置

3).  如果你启用了vnc, 修改配置文件中的vnc端口,否则启动失败,配置文件为 /etc/libvirt/qemu对应实例名字的xml文件,先来一张配置文件解释图,很重要

123.png

# cd /etc/libvirt/qemu
# ls
# virsh edit centos63_webtest

<graphics type=’vnc’ port=’5915′   …………

4).  启动克隆机器 (有的Linux版本可能生成的网卡有问题,请修改 /etc/udev/rules.d/70-persistent-cd.rules, 重启虚拟机)

# virsh start centos63_webtest1

四.  快照

快 照相信大家都知道是什么意思,如果不知道,亲去补补课吧,kvm虚拟机默认使用raw格式的镜像格式,性能最好,速度最快,它的缺点就是不支持一些新的功 能,如支持镜像,zlib磁盘压缩,AES加密等。  要使用镜像功能,磁盘格式必须为qcow2。下面开始kvm虚拟机快照的过程。

1). 查看磁盘格式

# qemu-img info /opt/vms/centos63-119.22.img
image: /opt/vms/centos63-119.22.img
file format: qcow2
virtual size: 40G (42949672960 bytes)
disk size: 136K
cluster_size: 65536

 

2). 如果不是qcow2需要关机转换磁盘格式,如果是请跳过

# cp centos63-119.22.img centos63-119.22.raw
# qemu-img convert -f raw -O qcow2 centos63-119.22.raw  centos63-119.22.img

3). 启动vm, 建立快照,以后可以恢复

# virsh start centos63-119.22
# virsh snapshot-create centos63-119.22

 

4). 快照位置

快照配置文件在/var/lib/libvirt/qemu/snapshot/虚拟机实例名称/下

5). 恢复快照,可以建立一些测试文件,准备恢复

先将虚拟机关闭,查看快照名称,然后恢复快照

# ls /var/lib/libvirt/qemu/snapshot/centos63-119.22
1410341560.xml
# virsh snapshot-revert centos63-119.22 1410341560

6). 删除快照

# qemu-img info   centos63-119.22
1         1410341560             228M 20140408 10:26:40   00:21:38.053
# virsh snapshot-delete centos63-119.2 1410341560

五. 让已安装的虚拟机GuestOS支持 virsh console

virsh console vmname 可以进入到vm的console模式,但是有时只显示链接到vm,提示如下,回车没有反应,这是因为guestos不支持console,下面来启用guestos的console

Connected to domain centos63-119.22
Escape character is ^]

1). 修改grub.conf,给内核传递参数 console=ttyS0

# vim /etc/grub.conf
kernel /vmlinuz-2.6.32279.el6.x86_64 ro root=UUID=25756cd7-3597-4e45-8dd
db-79d091c6d17f rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us LANG=en_US.UTF-8 rd_NO_MM
D SYSFONT=latarcyrheb-sun16 console=ttyS0 rd_NO_LVM crashkernel=auto rhgb quiet
rd_NO_DM

 

2). 在/etc/inittab中添加agetty

# echo “S0:12345:respawn:/sbin/agetty ttyS0 115200” >> /etc/inittab

3). 添加到/etc/securetty

# echo “ttyS0” >> /etc/securetty

4). 重启GuestOS

六. 添加网卡

线上服务器是双网卡,一个走内网,一个走外网,我们也需要虚拟机这么来工作,但是初始安装虚拟机的时候没有指定两个网卡,这样需要我们来添加一个网卡了,比如说我们已经将br1桥接到em2了,如果不会见刚开始br0桥接em1

1). 通过virt-manager来添加

简单说一下  选中虚拟机 — Open — Details – AddHardware 选择网卡模式,mac不要重复,确定即可

2). 通过命令来添加

Ⅰ.  使用virsh attach-interface命令为虚拟机添加网卡

# virsh attach-interface centos63-119.23 –type bridge –source br1 –model virtio

Ⅱ. 导入配置文件并覆盖原来的, 因为attach-interface添加后,只是在虚拟机中生效了,配置文件并没有改变

# cd /etc/libvirt/qemu
# virsh dumpxml centos63-119.23 > centos63-119.23.xml

Ⅲ. 修改GuestOS中网卡配置文件,为另一个网卡配置IP

# cd /etc/sysconfig/network-scripts

Ⅳ. 重启网卡

七. 硬盘扩容

原来的/opt目录随着使用,空间渐渐满了,这时候我们就需要给/opt的挂载分区扩容了,有两种情况 1. 该分区是lvm格式 2. 不是lvm格式,且不是扩展分区

1). 分区是lvm格式 这种很简单,添加一块磁盘,lvm扩容

virt-manager添加方式和添加网卡一样,不再赘述,下面是使用命令来添加

Ⅰ. 建立磁盘,并附加到虚拟机中

# qemu-img create -f raw 10G.img 10G
# virsh attach-disk centos63-119.23 /opt/kvm/10G.img vdb

——————————添加qcow2磁盘———————————–

# qemu-img create -f qcow2 10G.img 10G
# virsh attach-disk centos63-119.23 /opt/kvm/10G.img vdb –cache=none –subdriver=qcow2

—————————————————————————

说明:
centos63-119.23    虚拟机的名称
/opt/kvm/10G.img   附加的磁盘
vdb                添加为哪个磁盘, 也就是在guestos中的名字

 

Ⅱ. 导出并覆盖原来的配置文件,和网卡一样,attach后只是在虚拟机中生效

# virsh dumpxml centos63-119.23 > centos63-119.23.xml

Ⅲ. 使用lvm在线扩容,详见 http://www.cnblogs.com/cmsd/p/3964118.html

2). 分区不是lvm格式,该分区不是扩展分区, 需要关机离线扩展

Ⅰ.  新建一个磁盘,大于原来的容量,比如原来是40G,你想对某个分区扩容20G那么

# qemu-img create -f qcow2 60G.img 60G

Ⅱ. 备份原来的磁盘,以防三长两短

# cp centos63-119.27.img centos63-119.27.img.bak

Ⅲ. 查看原来的磁盘决定扩容哪一个分区

# virt-filesystems –partitions –long -a centos63-119.27.img
# virt-df centos63-119.27.img

Ⅳ. 扩容GuestOS的sda2

# virt-resize –expand /dev/sda2 centos63-119.27.img 60G.img

说明:
/dev/sda2                   扩容guestos的/dev/sda2
centos63-119.27.img         原来的磁盘文件
60G                         第一步建立的更大的磁盘文件

Ⅴ. 使用新磁盘启动

# mv 60G.img centos63-119.27.img
# virsh start centos63-119.27

virt-resize其实就是将原来磁盘中的文件复制到新的文件中,讲想要扩大的分区扩大了

 

八. 动态迁移

用过vSphere 或者 xenserver的都知道动态迁移,最大程度上减少宕机时间 , 比如将正在运行在A上的虚拟机不关机迁移到B上,会将原来虚拟机的内存,CPU状态等迁移到新的主机上,动态迁移需要一些条件

1. 该虚拟机使用共享存储,在两台主机上的位置一样 比如 A,B都讲C的 /opt/vms 挂载到了自己的/opt/vms中,A,B对nfs可读可写,虚拟机在共享存储中

2. 目标主机最好与源主机型号一样,或者CPU支持的指令集更多

3. 目标主机CPU,内存充足

4. 能通过root用户ssh连接到目的主机上

5. hostname和ip解析一致, 迁移是通过hostname的,修改/etc/hosts,可以ping通对方的Hostname

下面来迁移试试,假设上述条件都满足, nfs已经挂载,如果nfs不会请google如何建立nfs

1). 使用virt-manager来迁移

简单来说  File – Add Connect — 填写对方的ip,用户名,密码, 然后右击虚拟机,Migrate

image

image

image

image

注. 由于原来的22没有建在共享存储上,新建了一个29的虚拟机来完成迁移的,切记 hostname要和ip对应, 虚拟机存储是共享存储

 

2). 通过命令来动态迁移

# virsh migrate centos63-119.27 –live qemu+ssh://192.168.119.11:9741/system –unsafe

说明:
centos63-119.27   迁移的实例名称

 

–live            动态迁移

qemu+ssh          ssh的方式

–unsafe          强制迁移,即使可能出现问题

补充:

    # vim /etc/qemu-ifup.sh #设置一下网络,为了使用http ks
        #!/bin/bash
        #
        switch=br1

        if [ -n $1 ];then
            ip link set $1 up
            brctl addif ${switch} $1
            exit 0
        else
            echo "No interface"
            exit 1
        fi

    # chmod +x /etc/qemu-ifup.sh
    # /usr/libexec/qemu-kvm -m 1024 \
     -cdrom /tmp/CentOS-6.3-x86_64-bin-DVD1.iso \
     -drive file=/opt/vms/centos63-x86_64-template.img,if=virtio \
     -net nic,model=virtio -net tap,script=/etc/qemu-ifup.sh \
     -boot d \
     -nographic \
     -vnc :01

    启动:
    /usr/libexec/qemu-kvm -m 1024 \
    -drive file=/opt/vms/centos63-x86_64-template.img,if=virtio \
    -net nic,model=virtio -net tap,script=no \
    -net nic,model=virtio -net tap,script=no \
    -nographic -vnc :02

本文出自 “Free Linux, Share Linux” 博客

linux修改open files数

概要:
linux系统默认open files数目为1024, 有时应用程序会报Too many open files的错误,是因为open files 数目不够。这就需要修改ulimit和file-max。特别是提供大量静态文件访问的web服务器,缓存服务器(如squid), 更要注意这个问题。
网上的教程,都只是简单说明要如何设置ulimit和file-max, 但这两者之间的关系差别,并没有仔细说明。

说明:
1. file-max的含义。man proc,可得到file-max的描述:
/proc/sys/fs/file-max
This file defines a system-wide limit on the number of open files for all processes. (See
also setrlimit(2), which can be used by a process to set the per-process limit,
RLIMIT_NOFILE, on the number of files it may open.) If you get lots of error messages
about running out of file handles, try increasing this value:
即file-max是设置 系统所有进程一共可以打开的文件数量 。同时一些程序可以通过setrlimit调用,设置每个进程的限制。如果得到大量使用完文件句柄的错误信息,是应该增加这个值。
也就是说,这项参数是系统级别的。

2. ulimit
Provides control over the resources available to the shell and to processes started by it, on systems that allow such control.
即设置当前shell以及由它启动的进程的资源限制。
显然,对服务器来说,file-max, ulimit都需要设置,否则就可能出现文件描述符用尽的问题

修改:
1.修改file-max

# echo  6553560 > /proc/sys/fs/file-max  //sysctl -w "fs.file-max=34166",前面2种重启机器后会恢复为默认值

# vim /etc/sysctl.conf, 加入以下内容,重启生效
fs.file-max = 6553560

2.修改ulimit的open file,系统默认的ulimit对文件打开数量的限制是1024

# ulimit -HSn 102400  //这只是在当前终端有效,退出之后,open files又变为默认值。当然也可以写到/etc/profile中,因为每次登录终端时,都会自动执行/etc/profile

# vim /etc/security/limits.conf  //加入以下配置,重启即可生效
* soft nofile 65535 
* hard nofile 65535

附录:
附录1.
为了让一个程序的open files数目扩大,可以在启动脚本前面加上ulimit -HSn 102400命令。但当程序是一个daemon时,可能这种方法无效,因为没有终端。

附录2.
如果某项服务已经启动,再动态调整ulimit是无效的,特别是涉及到线上业务就更麻烦了。
这时,可以考虑通过修改/proc/’程序pid’/limits来实现动态修改!!!

Centos7下yum安装mplayer和vlc播放器

步骤如下:

  1. fedora源: rpm -Uh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm

2. ElRepo源(地址:http://elrepo.org/tiki/tiki-index.php):

导入公钥:rpm –import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

导入源:rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm (适用于RHEL-7, SL-7 or CentOS-7)

[[  for RHEL-6, SL-6 or CentOS-6:   rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm   ]]

3.My RPM repositories for EL (RHEL, CentOS, ScientificLinux etc) (地址:http://li.nux.ro/repos.html)

    EL7: yum -y install epel-release && rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm

  [[ EL6: yum -y install epel-release && rpm -Uvh http://li.nux.ro/download/nux/dextop/el6/x86_64/nux-dextop-release-0-2.el6.nux.noarch.rpm  ]]
  

4.  yum repolist (用来确定源 epel, elrepo, nux-dextop 是否安装正确)

5.   yum -y –enablerepo=nux-dextop install gstreamer-ffmpeg  vlc   gstreamer-plugins-ugly gstreamer-ffmpeg gstreamer-plugins-bad gstreamer-plugins-ugly ffmpeg libvdpau mpg123   mplayer mplayer-gui  gstreamer-plugins-bad-nonfree gstreamer1-libav gstreamer1-plugins-bad-freeworld gstreamer1-plugins-ugly

6.  yum install mplayer

7.  yum install vlc (安装之后,若有黑影无声或choppy video,须调preference audio 和video setting)

<Ps: mplayer vlc 任选一个就可以了,都是视频播放器,具体哪个好,看个人喜好>

<Pps:之前尝试源码安装mplayer,各种报错,各种依赖问题,百度出来的答案千变万化,看得人眼花缭乱,不知所云,以上全靠google,经试验可行,如有任何疑问,请google一下 >

切换centos/5/6/7安装源

国内服务器使用阿里云的yum源能达到一个比较理想的速度,但是又感觉不太够,于是将EPEL、REMI一同加上。

切换基本源为阿里云源

1、备份

2、下载新的CentOS-Base.repo 到/etc/yum.repos.d/

CentOS 5

CentOS 6

CentOS 7

3、运行yum makecache生成缓存

安装第三方源

1.安装EPEL仓库

如果以上命令不起作用:

2.安装IUS仓库

3.安装REMI仓库

3.查看yum软件仓库列表

4.生成缓存

cent7设置阿里云epel源

epel是个好东西,不过国外的速度实在是不能忍受。所以 有了这篇文章。

1、 首先卸载以前装的epel以免影响

rpm -e epel-release

2、 下载阿里提供的epel

wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-6.repo

3、yum clean all

4、yum makecache

好了,现在你要装epel源的软件的时候 不再慢吞吞了。

 

或者直接安装

rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-6.noarch.rpm