kvm安装ubuntu虚拟机错误总结

时间:2024-03-28 17:44:52

知识点: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 。具体使用可以使用说明

kvm安装ubuntu虚拟机错误总结

7,修改虚拟机的cpu和内存

virsh setvcpus ubuntutest 2 --maximum 4 --config    # 修改虚拟机cpu
virsh setmaxmem ubuntutest 1048576 --config      # 修改虚拟机内存

# virsh dominfo bbotte  #查看虚拟机信息
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,解决方案如下所示,可能是权限,也可能是服务没哟启动

kvm安装ubuntu虚拟机错误总结

关于libvirt错误总结和解决方法: http://liuzhijun.iteye.com/blog/1783698

libvirt使用: http://smilejay.com/2013/03/libvirt-configuration-and-usage/

2,无法链接到libvirt服务,注意和上一个的区别,这个是用户目录下的,

注意和前一个区别,是用户目录下的libvirt-sock,一般出现在集群用户上,你不是root用户。

kvm安装ubuntu虚拟机错误总结

这个原因看virsh命令的   -c  就知道,没有指定到正确的URI解决方案如下:
所有命令加上uri即可:

virsh -c qemu:///system list --all 

virsh -c qemu:///system start ubuntuname 

virsh -c qemu:///system undefine ubuntuname 

kvm安装ubuntu虚拟机错误总结

另一种解决方案是具体本地配置 certificates,具体的可以参考下面:


kvm安装ubuntu虚拟机错误总结

需要注意的是,即便是virt-install命令也会报上面的错误,同样是需要指定uri的,如: virt-install  --connect=qeum:///system

不过这次用的是参数--connect 而不是 -c

kvm安装ubuntu虚拟机错误总结

3,virsh define 失败,找不到emulator

我从ubuntu迁移到redhat6上报错。

最好找一个本地机器上已经安装好的虚拟机配置文件,参考下它的配置文件。

kvm安装ubuntu虚拟机错误总结

kvm安装ubuntu虚拟机错误总结

4,虚拟机迁移的时候,需要拷贝镜像文件,镜像文件太大的话,占用空间和传输时间。

可以先本地建立较小的镜像文件,然后上传后,在进行扩容。

http://www.tuicool.com/articles/FnIZJvu

4.5 虚拟机迁移

被迁移的机器成为:sourceVM,所在服务器:source,目标服务器:target,#后是shell命令)
实验环境:
RedHat 6.2

# virsh version
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
命令行比较简单:

#virsh migrate sourceVM qemu+ssh://target/system --live
 
(如果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修改一下,临时的也可以。

#hostname target
 

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的配置文件

#sed -i "/#host_uuid/ahost_uuid = \"`uuidgen`\"" /etc/libvirt/libvirtd.conf
 
重启一下libvirtd 服务

# /etc/init.d/libvirtd restart
 
然后再查看一下

# virsh capabilities | grep uuid

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 运行以下命令可以添加用户


# saslpasswd2 -a libvirt admin
Password: xxxxxx
Again (for verification): xxxxxx
 
通过以下命令可以查看已经创建的用户

# sasldblistusers2 -f /etc/libvirt/passwd.db
[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 中插入以下标签

 

[html] view plain copy
  1. <span style="font-size:14px;"><devices>  
  2. <serial type='pty'  tty='/dev/pts/4'>  
  3.   <target port='0'/>  
  4. </serial>  
  5. <console type='pty'>  
  6.   <target type='serial' port='0'/>  
  7. </console>  
  8. </devices></span>  

注意,serial和console 标签必须添加在devcies 标签内,否则 libvirt库无法识别要添加console设备

然后我们启动虚拟机,virsh create  kvm201.xml,在虚拟机kvm201的/boot/grub/grub.cfg文件中添加console,如下图所示

kvm安装ubuntu虚拟机错误总结

如果是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 添加如下信息

kvm安装ubuntu虚拟机错误总结

接着 重启虚拟机,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

http://www.topjishu.com/5084.html

设置好后使用如下命令控制台链接虚拟机:

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的形式。

三,配置虚拟机网路环境

物理网卡一般是eth0,网桥是虚拟的,相当于二层交换机,它可以有很多接口,配置好网桥后,就可以将物理网卡eth0和虚拟机网卡都链接到br网桥交换机上。如下所示:
kvm安装ubuntu虚拟机错误总结

已经总结的很好了:http://www.linuxidc.com/Linux/2013-08/88719.htm
里面包括,网桥的配置等等。

需要注意的是,你还需要检查下:
首先开启内核转发的模块。
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
重启网络服务:service network restart
如果是bridge模式,在虚拟机里面你还要自己配置虚拟机的ip、dns、网关等。

首先物理网卡虚拟化:http://www.linuxidc.com/Linux/2013-08/88517.htm
http://www.linuxidc.com/Linux/2012-05/61445p2.htm
http://www.linuxidc.com/Linux/2012-05/61445.htm

四,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的使用

vnc在远程服务安装并器配置vnc服务端,
在本地安装vnc客户端。
 
ssh登录到服务端,使用vncpasswd命令创建自己的vnc登录密码,如下所示:
kvm安装ubuntu虚拟机错误总结
 
然后运行命令vncserver,新建一个vnc桌面,可以看到返回一个端口号,如下所示,
kvm安装ubuntu虚拟机错误总结
 
然后客户端vnc,输入IP:端口号。
ip是你服务器的ip。
端口号是vncserver返回的数字加上5900,如下所示,
kvm安装ubuntu虚拟机错误总结
 
然后输入你第一步设置的密码即可,不需要输入用户名。只需要密码。如下所示:
kvm安装ubuntu虚拟机错误总结
 
用完之后,用vncserver -kill :2 命令杀掉你第二步创建的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.

kvm安装ubuntu虚拟机错误总结

感觉下面的两个链接可以解决:

http://blog.itpub.net/35489/viewspace-1967731/

https://ubuntuforums.org/archive/index.php/t-1922978.html


5,两张图片


kvm安装ubuntu虚拟机错误总结


kvm安装ubuntu虚拟机错误总结


一些链接:

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








首先物理网卡虚拟化:http://www.linuxidc.com/Linux/2013-08/88517.htm