知识点:kvm的使用,vnc的使用,和错误总结
一,安装虚拟机
1,查看已经安装的虚拟机列表及状态
virsh -c qemu:///system list --all
2,定义虚拟机映像
qemu-img create myname.img 10G
参数-f 可以指定镜像的格式 如: qemu-img create -f qcow2 myname.img 10G
常用的有 raw 和 qcow2。
3,安装虚拟机
virt-install \
--name ubuntutestname \ \\虚拟机的名字
--hvm \ \\ 使用全虚拟化(与para-irtualization向对),不支持xen hypervisor
--ram 1024 \ \\ 内存大小
--vcpus 1 \ \\ cpu个数
--disk path=/images/test/disk.img,size=10 \ \\ 之前创建的镜像的路径
--network network:default \ \\ 网络配置
--accelerate \
--vnc --vncport=5911 \ \\ 开启vnc 并 配置vnc的端口
--cdrom /images/iso/ubuntu-14.04-server-amd64.iso -d \\ 设置光驱获取虚拟光驱文件的路径 -d 指示从光驱启动( -c 指示从硬盘启动)
4,接着就开始图形化界面安装ubuntu了
5,管理虚拟机的命令
查看虚拟机列表
virsh -c qemu:///system list --all
启动虚拟机
virsh start ubuntuname
关闭虚拟机
virsh shutdown ubuntuname
强制关机,断电源
virsh destroy ubuntuname
删除虚拟机
virsh undefine ubuntuname
6,虚拟机迁移
将虚拟机从机器A迁移到虚拟机B上,如果两台机器的kvm环境一样的话。
只需要拷贝两个文件即可:
配置文件ubuntuname.xml 和 镜像文件myname.img
一般来说配置文件会放在目录下:/etc/libvirt/qemu/ubuntuname.xml
镜像文件就是之前你创建的镜像文件。
根据两个文件在A上的位置,修改配置文件ubuntuname.xml :
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='none'/>
<source file='/mydir/myname.img'/> #指定虚拟机的硬盘镜像文件的路径
<target dev='vda' bus='virtio'/>
</disk>
如果有必要也要修改:
<domain type='kvm' id='20'> #修改node6的id号
<name>ubuntutestname </name> #虚拟机node6的name
<uuid>4b7e91eb-6521-c2c6-cc64-c1ba72707fc7</uuid> #uuid必须修改,防止和已有的虚拟机id的冲突
然后运行命令即可:
virsh define ubuntuname.xml
如果环境配置一样的话,这样迁移很顺利,但是比如由ubuntu14.04上的虚拟机迁移到redhat6就会遇到各种错误,
比较正规的迁移还是要使用自带的迁移命令:virsh migrate 。具体使用可以使用说明
7,修改虚拟机的cpu和内存
virsh setmaxmem ubuntutest 1048576 --config # 修改虚拟机内存
Id: 2
Name: bbotte
UUID: bd22f444-ee7f-7f00-3d1b-1bb0d0857e43
OS Type: hvm
State: running
CPU(s): 4
CPU time: 152.3s
Max memory: 1048576 KiB
Used memory: 524288 KiB
Persistent: yes
Autostart: disable
Managed save: no
Security model: none
Security DOI: 0
二,kvm错误总结
1,无法链接到/var/run/libvirt/libvirt-sock,解决方案如下所示,可能是权限,也可能是服务没哟启动
关于libvirt错误总结和解决方法: http://liuzhijun.iteye.com/blog/1783698
libvirt使用: http://smilejay.com/2013/03/libvirt-configuration-and-usage/
2,无法链接到libvirt服务,注意和上一个的区别,这个是用户目录下的,
注意和前一个区别,是用户目录下的libvirt-sock,一般出现在集群用户上,你不是root用户。
这个原因看virsh命令的 -c 就知道,没有指定到正确的URI解决方案如下:
所有命令加上uri即可:
virsh -c qemu:///system list --all
virsh -c qemu:///system start ubuntuname
virsh -c qemu:///system undefine ubuntuname
另一种解决方案是具体本地配置 certificates,具体的可以参考下面:
需要注意的是,即便是virt-install命令也会报上面的错误,同样是需要指定uri的,如: virt-install --connect=qeum:///system
不过这次用的是参数--connect 而不是 -c
3,virsh define 失败,找不到emulator
我从ubuntu迁移到redhat6上报错。
最好找一个本地机器上已经安装好的虚拟机配置文件,参考下它的配置文件。
4,虚拟机迁移的时候,需要拷贝镜像文件,镜像文件太大的话,占用空间和传输时间。
可以先本地建立较小的镜像文件,然后上传后,在进行扩容。
http://www.tuicool.com/articles/FnIZJvu
4.5 虚拟机迁移
被迁移的机器成为:sourceVM,所在服务器:source,目标服务器:target,#后是shell命令)
实验环境:
RedHat 6.2
Compiled against library: libvir 0.9.4
Using library: libvir 0.9.4
Using API: QEMU 0.9.4
Running hypervisor: QEMU 0.12.1
主要用两种方式,命令行virsh migrate 和图形界面 virt-mamge
命令行比较简单:
(如果ssh的端口不是默认22,可以写为 qemu+ssh://target:port/system)
No.1 Question::
error: internal error hostname on destination resolved to localhost, but migration requires an FQDN
解决办法很简单,因为默认情况下hostname 是 localhost,我们需要把目标的hostname修改一下,临时的也可以。
No.2 Question:
error: internal error Attempt to migrate guest to the same host 00020003-0004-0005-0006-000700080009
这个mail list 里有大牛说是服务器提供商的问题
你可以用#dmidecode -s system-uuid 查看一下这个ID,理论上是#virsh sysinfo | grep uuid 及# virsh capabilities | grep uuid
这三个ID是一样的。(之前看论坛里发的解决方法是需要下载一个dmidecode 命令的文件去替换系统的,达到修改的目的,不过今天我只是修改了libvirt的配置文件就可以了,可能是版本的问题)
我们修改一下libvirtd的配置文件
重启一下libvirtd 服务
然后再查看一下
No.3 Question:
error: unable to set user and group to '107:107' on '/image/sourceVM/disk.img': No such file or directory
如果顺利进入到这步的话,就很简单了,没有directory 直接创建一个就可以
注:创建的磁盘应该和源虚拟机的磁盘是一样的大小(更大应该是可以)和格式(raw还是qcow2)
No.4 Question::
error: Unable to resolve address 'target' service '49155': Name or service not known
《《Name or service not known》》这个相信大家都知道如何解决,/etc/hosts ...略过
再次执行迁移命令的时候,就基本不会报错了,我的实验环境是,如果你还有其他问题,请贴图回复,谢谢
虚拟机迁移和网络的带宽、虚拟机镜像的大小有直接关系,但是在线迁移最关心的应该是宕机时间,我测试的方法是一直ping target 服务器,大概停顿1s。
图形就比较简单了,处理上边所说的相同的FQDN,相同的UUID以外,就是建立连接时的ssh认证问题。
我这边的环境是必须要在使用virt-manage远程连接的时候添加ssh的认证,而且还要在终端登陆一次,使服务器的信息记录到目标机器的~/.ssh/knows 下(其实就是有一个yes/no的界面 输入yes即可)
建立连接以后,选中机器右键有一个Migrate的选项
弹出迁移的目标服务器,选择目标服务器,点击Migrate即可
迁移的问题大概就这么多。
剩下的是一些有关于迁移和其他的小细节:
在设置vnc监听端口时基本上有3种,
127.0.0.1 (默认):只有本机能访问,也就是virt-mange和virt-view
host_ip :除了本机的所有机器都可以访问
0.0.0.0: 以上两种的合集
在迁移时,需要把监听地址改为0.0.0.0,端口为-1 自动分配,因为如果不出意外的话,指定的端口会冲突!!!
如果没有.ssh/这个目录,可能做不了免认证(没有真实环境,不知道原因),没关系,我们可以用tcp代替ssh连接到目标服务器上。
方法如下:
1 修改/etc/libvirt/libvirtd.conf中
[/code] listen_tls = 0
listen_tcp = 1
tcp_port = "16509"
auth_tcp = "sasl"[/code]
2 去掉/etc/sysconfig/libvirtd 中LIBVIRTD_ARGS="--listen" 的注释
3 修改/etc/libvirt/qemu.conf 中listen 为0.0.0.0 ,去掉password注释
4 运行以下命令可以添加用户
Password: xxxxxx
Again (for verification): xxxxxx
通过以下命令可以查看已经创建的用户
[email protected]: userPassword
5 重启libvirtd 服务 ok!
原文引用:xiaoli110 的BLOG
在的ssh的位置选择tcp,如果端口没有修改可以不填端口
测试连接的时候可以用 #virsh -c qemu+tcp://target/system list
还有一个问题是,迁移的时候可以拉服务器吗?正常的迁移时大多是推过去的,就想scp 和rsync一样,以拉虚拟机的方式迁移是可以的
迁移虚拟机对服务器的要求,之前看必须是两个相同的Cpu才可以,今天我测试的时候是发现可以从source迁移到target,回来就出问题了,发现时 sourcce 少了一些指令集,所以可以说不通的cpu也是可以做迁移的,只是目标服务器必须包含源服务器cpu的所有指令集。
The virtual machine on the redhat6 migrates to Ubuntu
http://www.jb51.net/LINUXjishu/349638.html
两个好的迁移资料:
https://libvirt.org/migration.html
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Virtualization_Administration_Guide/sect-Virtualization-KVM_live_migration-Live_KVM_migration_with_virsh.html
5,Failed to connect to the hypervisor
http://wiki.libvirt.org/page/Failed_to_connect_to_the_hypervisor
6,控制台安装ubuntu
并不是所有的环境下都有图形界面的。安装的时候需要从控制台进行安装,
而且安装好虚拟机后也可以用console进行登录操作。
要想从控制台链接虚拟机,有两个设置的部分,
一个是安装虚拟的时候,要给虚拟机添加控制台设备,修改配置文件,或者安装虚拟机指定控制台参数,
另一个虚拟机自身开启控制体启动设置。如下:
其实要实现,并不难。首先,我们需要在 virsh启动的虚拟机XML文件 kvm201.xml 中插入以下标签
- <span style="font-size:14px;"><devices>
- <serial type='pty' tty='/dev/pts/4'>
- <target port='0'/>
- </serial>
- <console type='pty'>
- <target type='serial' port='0'/>
- </console>
- </devices></span>
注意,serial和console 标签必须添加在devcies 标签内,否则 libvirt库无法识别要添加console设备。
然后我们启动虚拟机,virsh create kvm201.xml,在虚拟机kvm201的/boot/grub/grub.cfg文件中添加console,如下图所示
如果是grub2系统,请修改/etc/default/grub文件,
GRUB_CMDLINE_LINUX=" console=tty0 console=ttyS0",然后update-grub
如果串口输入时,希望能看到并控制grub,那么还得加上下面这段话
GRUB_TERMINAL=serial
GRUB_SERIAL_COMMAND="serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1"
这段表示grub本身支持串口输出
光是这样无法用console登录,只能看到启动信息,所以我们还要添加 ttyS0的ssh启动。 在 虚拟机中的 /etc/init/ttyS0.conf 添加如下信息
接着 重启虚拟机,reboot,virsh console kmv201,发现可以连接了
注意ubuntu是grub2,一般centos是grub,如果是grub2系统,请修改/etc/default/grub文件,
设置:GRUB_CMDLINE_LINUX=" console=tty0 console=ttyS0",然后update-grub。
因为还没有安装虚拟机,所以是对镜像文件进行修改。
具体参考如下链接:
https://serverfault.com/questions/257962/kvm-guest-installed-from-console-but-how-to-get-to-the-guests-console
http://blog.csdn.net/dobell/article/details/14442457
设置好后使用如下命令控制台链接虚拟机:
virsh -c qemu:///system console ubuntutestname
7,redhat6创建镜像,安装ubuntu,安装过程中报错: the creation of swap space in partition #5 scsi failed
大致意思就是,不能在img创建,交换分区,不能创建主分区,无论是我自动还是手动分区都不可以。
一般来说是权限问题,我是在实验室集群上跑的,我的运行的接的是node87,但是我的img文件在node307,
只需要在将img镜像放在node87即可。
类似的问题,在使用mongodb的时候也遇见过,如果你运行命令的节点,或者说用户登录的节点是node163,
而你创建的db数据库在node307上,那么你就没办法启动数据,会报无法锁定数据库文件的错误。
同样的只需要将数据库移动到node163上即可。
额外了解一下:
hda一般是指IDE接口的硬盘,hda一般指第一块硬盘,类似的有hdb,hdc等
sda一般是指SATA接口的硬盘,sda一般指第一块硬盘,类似的有sdb,sdc等
现在的内核都会把硬盘,移动硬盘,U盘之类的识别为sdX的形式。
三,配置虚拟机网路环境
echo 1 > /porc/sys/net/ipv4/ip_forward #这是个暂时的做法,重启后就会失效,好的做法是:
vi /etc/sysctl.conf
修改其中的net.ipv4.ip_forward = 1
DNS的配置在/etc/resolv.conf中添加DNS的IP即可
然后要让它立即生效,需要执行命令:
sysctl -p
至此第一步搞定。
第二步添加NAT:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE
#这条命令里的 eth0代表外网接口,-s 192.168.10.0/24代表内网段
2008.10.13配置时问题:
注意在配置时清空系统默认的iptables规则;
做iptables的机器的DNS要设置对,使它能正常上网。
向文件/etc/sysctl.conf添加以下代码:
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
四,vnc链接虚拟机
1,链接虚拟机的方式
1. 本地连接
1.1 适用情况:当我们在kvm hypervisor上时,可使用本地连接的方式;当然也能使用网络连接的方式(回环网络)
1.2 连接工具:
1.2.1 virt-manager,和windows下的vmware很是相似,图形界面友好;
1.2.2 virt-viewer,连接命令:virt-viewer -c qemu:///system VMachinename;
1.2.3 console,连接命令:virsh console VMachinename;
2. 网络连接
2.1 适用情况:不能使用上面工具连接时
2.2 连接工具:
2.2.1 vnc,「事先配置好vnc服务」
连接命令: 1. virsh vncdisplay/domdisplay VMachinename 2. vncviewer ip:port,其中ip:port是由命令1获得;
或把上面两条命令结合起来:vncviewer $(virsh vncdisplay VMachinename)
2.2.2 ssh,「事先配置好ssh服务」
连接命令: ssh [email protected]
2,开启vnc服务,无论是安装虚拟机时指定参数,还是修改参数文件。
virt-install --connect=qemu:///system --name ubuntu --hvm --ram 16384 --vcpus 8 \
--disk path=/home/hadoopcj/tzl_tmp1/july/ubuntu16.04.img,size=80 --network network:default --accelerate \
--graphics vnc,listen=0.0.0.0 \ \\ 开启vnc服务,并指定监听地址
--cdrom /home/hadoopcj/tzl_tmp1/july/ubuntu-16.04.2-desktop-amd64.iso -d
需要注意的是监听地址的设置,
vnc_listen = "0.0.0.0" //使监听所有端口,否则只监听本地,
监听本地是指只能从服务器本地登录指定虚拟机如 vncviewer 127.0.0.1:端口号(如5902),
如果监听所有端口则可以从远程通过服务器IP:端口号登录虚拟机,如10.92.0.51:5902
还需要注意的是,修改哪个配置文件?
# vi /etc/libvirt/qemu.conf
vnc_listen = "0.0.0.0"
说明1:vnclisten 默认绑定127.0.0.1 在配置文件里指定VNC 绑定0.0.0.0IP,就不用在安装kvm虚拟机时指定vnclisten参数了。
说明2:在虚拟主机上有很多个虚拟机的时候,需要指定每个虚拟机的端口,否则将会很乱。
修改qemu.conf就不用在每个虚拟机的xml文件里面修改vnc的地址了
3,vnc的使用
4,vnc的闪退
有可能是vnc客户端颜色配置方案有问题,
只需修改vnc option里面Advanced-->expert-->ColourLevel的值为“rgb222” or “full”即可。
说明:rgb111--8 colours,rgb222--64 colours,pal8 -- 256 colours,full -- full colours
但我查看log文件,发现遇到的问题是:(没有解决)
Fatal IO error 11 (Resource temporarily unavailable) on X server :2.
http://blog.itpub.net/35489/viewspace-1967731/
https://ubuntuforums.org/archive/index.php/t-1922978.html
5,两张图片
一些链接:
KVM详解::http://blog.chinaunix.net/uid-30022178-id-5749329.html
http://www.cnblogs.com/wudonghang/p/5167145.html
https://segmentfault.com/a/1190000000644069#articleHeader2
http://www.linuxidc.com/Linux/2012-06/61690.htm
基础教程:https://wenku.baidu.com/view/f5bc1b1ef90f76c660371a53.html
http://www.linuxidc.com/Linux/2015-03/114462.htm
http://www.topjishu.com/5084.html
ubuntu教程:http://jingyan.baidu.com/article/b907e627cfffc946e7891cd5.html
http://blog.csdn.net/qiuhan0314/article/details/43667227
http://blog.csdn.net/linglong102/article/details/46313903
http://koumm.blog.51cto.com/703525/1290996