Linux kvm笔记

date: 2017.04.12; modification:2018.09.05

目录:

1 安装kvm虚拟机

1.1 安装环境

sudo apt-get install kvm qemu libvirt-bin virtinst virt-manager virt-viewer

1.2 安装虚拟机

sudo su
qemu-img create -f qcow2 ./u1404.qcow2 16G
brctl show
virsh net-list # 查看虚拟网络, 应该至少能显示个default
virt-install --name=u1404 --vcpus=1 --ram 1024 --disk path=./u1404.qcow2 --network network:default         --vnc --accelerate --force --cdrom /media/d/softkids/sys_inst/linux/ubuntu-14.04.5-server-amd64.iso
会自动启动安装界面.

#上面的命令会用default给虚拟机创建一个虚拟局域网的网络环境. 如果宿主机已经有了桥接环境, 可以用如下命令创建:
#virt-install --name=u1404 --vcpus=1 --ram 1024 --disk path=./u1404.qcow2 --network bridge=br0,model=virtio --vnc --accelerate --force --cdrom /media/d/softkids/sys_inst/linux/ubuntu-14.04.5-server-amd64.iso

安装完成后, 运行:

virsh list --all

列出所有虚拟机, 包括所有已经定义的虚拟机. 应该能看到刚刚安装的虚拟机正在运行.

如果关闭了虚拟机, 可以如下命令来再次启动:

virsh start vm-name

如果关了安装界面后无法再登录虚拟机:

virt-viewer vm-name           通过vnc连接虚拟机
或:
sudo virt-manager # 启动图形界面, 双击在运行的虚拟机便可以从图形界面进入虚拟机.

1.3 复制虚拟机

可以使用virt-manager的克隆功能, 但是此处要做的是将镜像拿到另外的机器上运行, 所以使用一种更加直接的方式:

  1. 拷贝镜像文件: .img 或者 qcow2等(默认位置在: /var/lib/libvirt/images/).

  2. virsh dumpxml vm-name导出虚拟机描述文件. 并编辑其中的字段:
    • name: 名称.
    • uuid: 同一宿主机上要改为不同的.
    • 修改: source file='/xx/xx/vm.img' 改为新复制的镜像.
    • mac: mac地址
    • 如果将虚拟机的镜像文件, 从安装的宿主机拷贝到另外的宿主机运行, 有可能cpu相关的参数也会报错, 如果是这样, 根据响应的提示修改参数即可. 如果实在不知道该改成什么, 在目标宿主机上创建一个虚拟机试试, 虽然目标宿主机可能没有界面不能安装系统, 但是可以参考其相关的配置xml.
    • 如果需要从本地虚拟网络改为桥接, 需要修改:

      <interface type='network'>
        <mac address='52:54:00:ac:8d:02'/>
        <source network='default'/>
        <model type='virtio'/>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
      </interface>
      
      改为:
      
      <interface type='bridge'>
        <mac address='52:54:00:ac:8d:02'/>
        <source bridge='br0'/>
        <model type='virtio'/>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
      </interface>
      
      其中br0为目标网桥, 需要先在目标宿主机创建才行.
  3. 定义新虚拟机

    virsh define vm.xml  # vm.xml为上面导出的问题xml.

2 启动虚拟机的串口console

如果kvm的虚拟机需要拷贝到别的宿主机上运行, 目标宿主机又没有图形界面可以直接显示(比如远程服务器), 而且拷贝后的服务器网络环境又和原宿主机不同(因此无法网络登录), 这时候虚拟串口就排上用场了. 所以强烈建议在每个创建好的虚拟机上都将虚拟串口配置好, 以方便日后使用.

2.1 在 Ubuntu Guest 上配置

登陆 ubuntu 虚拟机增加 ttyS0.conf 文件及其内容:

$ sudo vi /etc/init/ttyS0.conf
# ttyS0 - getty
#
# This service maintains a getty on ttyS0 from the point the system is
# started until it is shut down again.
start on stopped rc RUNLEVEL=[2345]
stop on runlevel [!2345]
respawn
exec /sbin/getty -L 38400 ttyS0 vt102

如果不只是希望 Linux login 后看到终端, 也希望看到 Linux 的启动过程的话需要在 /etc/default/grub 加入 GRUB_CMDLINE_LINUX 一行, 记得运行 update-grub2 自动配置 grub:

$ sudo vi /etc/default/grub
...
GRUB_CMDLINE_LINUX_DEFAULT="console=ttyS0"
...

$ sudo update-grub2

2.2 在 CentOS Guest 上配置

在 /etc/securetty 文件末尾追加 ttyS0 一行 ttyS0:

# echo "ttyS0″ >> /etc/securetty

在 /etc/grub.conf 文件里的 kernel 一行增加 console=ttyS0:

# vi /etc/grub.conf
...
title CentOS (2.6.32-220.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-220.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_roo
ot rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarr
cyrheb-sun16 rhgb crashkernel=auto quiet rd_LVM_LV=VolGroup/lv_root  KEYBOARDTYPP
E=pc KEYTABLE=us rd_NO_DM console=ttyS0
        initrd /initramfs-2.6.32-220.el6.x86_64.img
...

在 /etc/inittab 中增加 ttyS0 一行:

# vi /etc/inittab
...
S0:12345:respawn:/sbin/agetty ttyS0 115200

2.3 查看虚拟机配置效果

cat /proc/cmdline 

应该显示类似如下信息(注意增加了最后的console=ttyS0):

BOOT_IMAGE=/boot/vmlinuz-4.4.0-31-generic root=UUID=fd29b0f7-b8e9-4a60-a61d-edd45aabe685 ro console=ttyS0

如果没有显示最后的console内容, 重启试试.

2.4 在 KVM Host 上配置

登陆 KVM 宿主机(host)用 virsh edit 修改虚拟机的 KVM 启动配置文件, 在 device 下面加上 serial 一栏(如果已经存在则不要在加, 否则会报错):

...
<device>
...
    <serial type='pty'>
        <target port='0'/>
    </serial>
    <console type='pty'>
        <target type='serial' port='0'/>
    </console>
...
</devices>

修改后重启 libvirtd, 并手动关闭和启动虚拟机:

# /etc/init.d/libvirtd restart
Stopping libvirtd daemon:                                  [  OK  ]
Starting libvirtd daemon:                                  [  OK  ]

virsh shutdown my_vm_name
virsh start my_vm_name

2.5 通过串口console登录

登录:
    virsh console my_vm_name

退出登录:
    先Ctrl+d退出终端
    再Ctrl+]退出登录界面

3 常用管理命令

virsh list                    列出当前虚拟机列表, 不包括未启动的
virsh list --all              列出所有虚拟机, 包括所有已经定义的虚拟机
virsh shutdown vm-name        停止虚拟机
virsh destroy vm-name         关闭虚拟机电源
virsh start vm-name           启动虚拟机
virsh edit/dumpxml vm-name    编辑/导出虚拟机xml文件
virsh define vm.xml           用vm.xml来定义虚拟机
virsh undefine vm-name        删除虚拟机. 该命令只删除配置文件, 并不删除虚拟磁盘文件.
virsh reboot vm-name          重启虚拟机
virsh autostart vm-name       虚拟机随宿主机启动 
virsh suspend/resume vm-name  挂起/恢复

virt-viewer vm-name           通过vnc连接虚拟机

qemu-img info ubuntu.qcow2                  查看镜像信息
sudo qemu-img resize ubuntu.qcow2 +5G       扩容

4 其他

另一种命令行建立虚拟机方法:
qemu-kvm -m 1024 -localtime -M pc -smp 1 -drive file=/opt/images/Win7.img,cache=writeback,boot=on \
    -net nic,macaddr=52:54:00:12:34:80 -net tap \
    -cdrom /opt/ISO/Windows7.iso -boot d -name win7,process=kvm-win7 \
    -vnc :2 -usb -usbdevice tablet

5 参考资料

https://blog.csdn.net/zhaihaifei/article/details/51153402

https://blog.csdn.net/wanglei_storage/article/details/51314740