ubuntu/debian安装kvm
乐果 发表于 2015 年 05 月 20 日 标签:debianubuntukvm
安装kvm虚拟机
官方文档: kvm
apt-get install qemu-kvm
apt-get install libvirt-daemon-system
在服务器上安装时,可以添加——no-install- recommended apt选项,以防止安装多余的图形包:
apt install --no-install-recommends qemu-system libvirt-clients libvirt-daemon-system virtinst
为了以普通用户管理虚拟机,需要将该用户添加到libvirt组中:
# adduser <youruser> libvirt
设置网桥网络
安装桥接工具包
apt install bridge-utils
创建网桥配置
brctl addbr br0
下一步就是配置已经创建好的网桥,即修改位于 /etc/network/interfaces
的配置文件。我们需要将该桥接网卡设置成开机启动。为了修改该配置文件,你需要关闭你的操作系统上的网络管理器(如果你在使用它的话)。
例如 debian 关闭网络管理器:
systemctl stop NetworkManager.service
systemctl disable NetworkManager.service
其他系统关闭网络管理器的方法参考:操作指南
配置 /etc/network/interfaces 文件(假如原来主网卡是enp89s0):
source /etc/network/interfaces.d/*
# The loopback network interface
#auto lo
#iface lo inet loopback
# The primary network interface
#allow-hotplug enp89s0
#iface enp89s0 inet static
#address 192.168.2.200
#network 192.168.2.0
#netmask 255.255.255.0
#gateway 192.168.2.1
auto br0
iface br0 inet dhcp
bridge_ports enp89s0
bridge_stp off
bridge_fd 0
bridge_maxwait 0
如果之前主网卡enp89s0是dhcp来获取的ip,重启网卡即可生效:
/etc/init.d/networking restart
ip a
如果是静态获取的ip, 可能需要reboot重启系统生效。
生效后如下:
xiao@xiao-001:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: enp89s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master br0 state UP group default qlen 1000
link/ether 1c:69:7a:a4:fc:d2 brd ff:ff:ff:ff:ff:ff
3: wlo1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 70:9c:d1:20:33:a7 brd ff:ff:ff:ff:ff:ff
altname wlp0s20f3
4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 82:31:86:14:9c:dc brd ff:ff:ff:ff:ff:ff
inet 192.168.2.213/24 brd 192.168.2.255 scope global dynamic br0
valid_lft 42774sec preferred_lft 42774sec
inet6 fd00:ab:cd:0:8031:86ff:fe14:9cdc/64 scope global dynamic mngtmpaddr
valid_lft forever preferred_lft forever
inet6 fe80::8031:86ff:fe14:9cdc/64 scope link
valid_lft forever preferred_lft forever
用命令行创建一个虚拟机
如果没有母版镜像,可以用 virt-install
命令加载 iso
引导文件初始化安装,如下所示,从debain下载了debian11的 iso 文件引导安装:
virt-install --name=debian-11 --ram=8192 --vcpus=2 --cdrom /data/kvm-data/debian-11.11.0-amd64-netinst.iso --disk path=/data/kvm-data/debian-11.img,size=40 --os-type=linux --os-variant=debian11 --network bridge=br1 --graphics vnc,port=5900,listen=0.0.0.0 --console pty,target_type=serial
在安装过程中,可能会出现桥接网络无法获取到ip的问题,一般是由于宿主机防火墙策略导致的。 可以检查一下防火墙状态,关闭掉它试试:
root@xiao:~# ufw status
Status: inactive
root@xiao:~# ufw disable
Firewall stopped and disabled on system startup
或者修改系统内核 ip_forward
参数,让系统它允许路由转发,
即修改 /etc/sysctl.conf
配置文件,开启下面两行配置:
net.ipv4.tcp_syncookies=1
net.ipv4.ip_forward=1
对于虚拟机来说,它的配置信息被存储在它对应的xml文件中。因此,也可以创建一个虚拟机的第对应的 xml 文件来快速创建。
下面是一个示例 xml 文件,你可以根据需要手动修改它。
<domain type='kvm'>
<name>alice</name>
<uuid>f5b8c05b-9c7a-3211-49b9-2bd635f7e2aa</uuid>
<memory>1048576</memory>
<currentMemory>1048576</currentMemory>
<vcpu>1</vcpu>
<os>
<type>hvm</type>
<boot dev='cdrom'/>
</os>
<features>
<acpi/>
</features>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/bin/kvm</emulator>
<disk type="file" device="disk">
<driver name="qemu" type="qcow2"/>
<source file="/data/kvm/images/vm-test001.img"/>
<target dev="vda" bus="virtio"/>
<address type="pci" domain="0x0000" bus="0x00" slot="0x04" function="0x0"/>
</disk>
<disk type="file" device="cdrom">
<driver name="qemu" type="raw"/>
<source file="/data/kvm/iso/debian-12.5.0-amd64-netinst.iso"/>
<target dev="hdc" bus="ide"/>
<readonly/>
<address type="drive" controller="0" bus="1" target="0" unit="0"/>
</disk>
<interface type='bridge'>
<source bridge='br0'/>
<mac address="00:00:A3:B0:56:10"/>
</interface>
<controller type="ide" index="0">
<address type="pci" domain="0x0000" bus="0x00" slot="0x01" function="0x1"/>
</controller>
<input type='mouse' bus='ps2'/>
<graphics type='vnc' port='-1' autoport="yes" listen='0.0.0.0'/>
<console type='pty'>
<target port='0'/>
</console>
</devices>
</domain>
上面的主机xml配置文件定义了如下的虚拟机内容。
- 1GB内存,一个虚拟cpu和一个硬件驱动
- 磁盘镜像:
/data/kvm/images/vm-test001.img
- 从 CD-ROM 引导(
/home/dev/iso/CentOS-6.5-x86_64-minomal.iso
) - 网络:一个桥接到 br0 的虚拟网卡
- 通过 VNC 远程访问
改成
<uuid></uuid>
中的 UUID 字符串可以随机生成。为了得到一个随机的 uuid 字符串,你可能需要使用 uuid 命令行工具。
apt-get install uuid
uuid
生成一个主机 xml 配置文件的方式就是通过一个已经存在的虚拟机来导出它的 xml 配置文件。如下所示:
virsh dumpxml vm-test001 > aaa.xml
使用命令行启动虚拟机
在启动虚拟机之前,我们需要创建它的初始磁盘镜像。为此,你需要使用 qemu-img 命令来生成一个 qemu-kvm 镜像。下面的命令将会创建 10 GB 大小的空磁盘,并且它是 qcow2 格式的。
qemu-img create -f qcow2 /data/kvm/images/vm-test001.img 10G
使用 qcow2 格式的磁盘镜像的好处就是它在创建之初并不会给它分配全部大小磁盘容量(这里是 10 GB),而是随着虚拟机中文件的增加而逐渐增大。因此,它对空间的使用更加有效。
现在,你可以通过使用之前创建的 xml 配置文件启动你的虚拟机了。下面的命令将会创建一个虚拟机,然后自动启动它。
$ virsh create vm-test001.xml
Domain vm-test001 created from vm-test001.xml
注意: 如果你对一个已经存在的虚拟机执行了了上面的命令,那么这个操作将会在没有任何警告的情况下抹去那个已经存在的虚拟机的全部信息。如果你已经创建了一个虚拟机,你可能会使用下面的命令来启动虚拟机:
virsh start vm-test001.xml
使用如下命令确认一个新的虚拟机已经被创建并成功的被启动:
virsh list
同样,使用如下命令确认你的虚拟机的虚拟网卡已经被成功的添加到了你先前创建的 br0 网桥中:
brctl show
安装vnc客户端
以ubuntu为例:
apt install vncviewer
使用 virsh 管理虚拟机
下面列出了 virsh 命令的常规用法:
创建客户机并且启动虚拟机:
$ virsh create alice.xml
停止虚拟机并且删除客户机:
$ virsh destroy alice
关闭虚拟机(不用删除它):
$ virsh shutdown alice
暂停虚拟机:
$ virsh suspend alice
恢复虚拟机:
$ virsh resume alice
访问正在运行的虚拟机的控制台:
$ virsh console alice
设置虚拟机开机启动:
$ virsh autostart alice
查看虚拟机的详细信息:
$ virsh dominfo alice
编辑虚拟机的配置文件:
$ virsh edit alice
上面的这个命令将会使用一个默认的编辑器来调用主机配置文件。该配置文件中的任何改变都将自动被libvirt验证其正确性。
查看虚拟机的ip
virsh list
命令查看虚拟机列表:
root@vm00-hosts:~# virsh list
Id Name State
---------------------------------------
1 pposV2-dev-node01 running
2 pposV2-dev-node00 running
3 pposV2-dev-node02-dbs running
30 debian11-aarch64 running
31 java-dev01 running
32 java-dev00 running
virsh dumpxml
命令查看mac地址:
root@vm00-hosts:~# virsh dumpxml pposV2-dev-node02-dbs | grep mac
<partition>/machine</partition>
<type arch='x86_64' machine='pc-i440fx-5.2'>hvm</type>
<mac address='52:54:00:e1:9c:c8'/>
arp -n
命令查看ip:
root@vm00-hosts:~# arp -n | grep '52:54:00:e1:9c:c8'
192.168.1.233 ether 52:54:00:e1:9c:c8 C vmbr211
遇到的问题
- 通过ios引导安装系统后,又进入引导安装界面。
原因:kvm软件的缺陷
解决办法:编辑xml配置文件,把 cd 光驱(引入ios文件)的那段
- virsh shutdown 命令不起作用
原因: virsh通过reboot、shutdown来重启或关闭对应的虚拟机,其原理是host通过发送acpi指令来控制虚拟机的电源,如果guest系统没有安装acpi服务器或该服务器没有启动,那么虚拟机将不会重启或关闭,那么只有使用destroy 来强制关闭。
解决办法:进入虚拟机系统 安装 acpid服务 apt-get install acpid
- virsh shutdown 后 虚拟机消失不见(
virsh list --all
命令查看不到 )
原因:暂时未知
解决办法:virsh define --validate /data/kvm/config/vm-test001.xml
命令后就正常了
虚拟机导出/导入
可以用virt-clone
命令克隆一个一模一样的主机,网上有很多资料,略。。。
还有一种更快捷的方式,当cd虚拟光驱安装好一个虚拟机后,将它作为“母虚拟机”,方法如下(以制作好的vm-test001为例):
# 复制虚拟磁盘
cp /data/kvm/images/vm-test001.img /data/kvm/images/vm-test002.img
# 导出虚拟机的配置
virsh dumpxml vm-test001>/data/kvm/config/vm-test002.xml
# uuid命令生产心的uid
uuid
# 编辑vm-test002.xml,保证uuid唯一,vnc端口唯一,把<disk>里的磁盘地址更换成vm-test002.img
vim /data/kvm/config/vm-test002.xml
# 注册vm-test002新主机
virsh define /data/kvm/config/vm-test002.xml
# 启动vm-test002新主机
virsh start vm-test002
克隆虚拟机
#克隆之前,必须先把被克隆的vm-test001虚拟机关掉
virsh shutdown vm-test001
#克隆开始
virt-clone -o vm-test001 -n vm-test002 -f /data/kvm/images/vm-test002.img
#因为克隆之后vm-test002配置跟vm-test001一模一样,因此需要修改vm-test002配置
virsh edit vm-test002
挂载磁盘
#创建磁盘
qemu-img create -f qcow2 /data/vms/backup_exx_mysql_3.qcow2 -o size=10G,preallocation=metadata
#编辑虚拟机(例如:vm-test001虚拟机),添加硬盘
virsh edit vm-test001
#复制<disk>标签 ......
virsh edit
命令默认编辑器功能很难用,可以设置vim来编辑,如下:
export VISUAL=vim
virsh edit
命令编辑添加硬盘,复制如下添加到相应位置:
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/data/kvm-data/volume/vm01-data.qcow2'/>
<target dev='vdb' bus='virtio'/>
</disk>
双网卡的问题
双网卡时,需要设置一个主路由。 一般情况下系统在首先获取ip的网卡为主网卡,这意味着当通过dhcp分配ip时主路由存在随机性。
可以通过修改 /etc/network/interfaces
配置文件方式固定设置系统默认主路由,如下示例:
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.1.10
netmask 255.255.255.0
# The backup network interface
auto eth1
iface eth1 inet static
address 192.168.2.10
netmask 255.255.255.0
gateway 192.168.2.1
up ip route add default via 192.168.2.1 dev eth1
双网卡桥接模式,如下示例:
# The loopback network interface
auto lo
iface lo inet loopback
auto br0
iface br0 inet static
address 192.168.1.210/24
bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0
auto br1
iface br1 inet static
address 192.168.10.200/24
gateway 192.168.10.1
dns-nameservers 223.5.5.5
bridge_ports eth1
bridge_stp off
bridge_fd 0
bridge_maxwait 0
up ip route add default via 192.168.10.1 dev br1