通过Libvirt创建KVM虚拟机

创建虚拟机,需要设置步骤:

  • 宿主机安装kvm相关软件
  • 创建一个虚拟磁盘,用于安装虚拟机系统
  • 使用libvirt安装虚拟机系统
  • 设置虚拟机cpu,内存,网卡等参数
  • 使用virsh 启动虚拟机

创建虚拟机磁盘:

虚拟磁盘用于安装虚拟机操作系统,相当于物理机的硬盘;相较于普通的raw格式,qcow2镜像格式具有以下优点

  • 更小的系统占用,文件系统不支持空洞
  • 支持写时拷贝,镜像文件只反映底层的变化
  • 支持快照,镜像文件能够包含多个快照的历史
  • 可选择基于zlib的压缩方式
  • 可以选择AES加密

我们可以利用qemu-img来创建qcow2格式的磁盘

qemu-img create -f qcow2 controller-node.img 20G

安装虚拟机操作系统

编辑XML文件

vi libvirt.xml

以下为xml的示范:参考自manual start vm by libvirt cmd

XML文件注释为双斜杠,下例主要为了方便说明。

#域类型
    ubuntu-controller #虚拟机的名字,由字母和数字组成,不能包含空格
    8 #在不reboot guest的情况下,guset可以使用的最大内存,默认KB为单位
    4 #guest启动时内存(当前),可以通过virsh setmem来调整内存,但不能大于最大可使用内存。
    4 #分配的虚拟cpu
    
        hvm #hvm:全虚拟化
        #/tmp/vmlinuz-rhel54 #kernel:指定guest使用的内核,如果使用ISO(安装时)或guset系统中(系统已经安装完成)的内核,不需要指定该项
        #/tmp/initrd-rhel54.img #initrd:指定guest使用的ram disk,如果使用ISO(安装时)或guest系统中(系统已经安装完成)的ram disk,不需要指定该项
        #注:kernel 和initrd文件位于RHEL系统光盘的images/pxeboot目录,拷贝这两个文件到本地磁盘,并指定路径。
        #注:这两个元素,如果是为了安装guset而指定,在安装完成以后即可以删除。
        #如果host开启了SELINUX,需要改变文件的security context类型为virt_image_t,从而在启动时libvirtd可以访问这二者
        # chcon -t virt_image_t /tmp/vmlinuz-rhel54
        # chcon -t virt_image_t /tmp/initrd-rhel54.img
        # ls -Z /tmp|grep virt
         #boot:指定启动设备,可以重复多行,指定不同的值,作为一个启动设备列表。hd表示从硬盘启动
         #network表示从pxe启动
    
     #处理器特性
        
        
        
    
     #时钟
    #定义了在kvm环境中power off,reboot,或crash时的默认的动作为destroy。其他允许的动作包括:restart,preserve,rename-restart.
    destroy
    restart
    destroy #destroy:停止该虚拟机。相当于关闭电源
     #设备定义开始
        /usr/libexec/qemu-kvm #模拟元素,此处写法用于kvm的guest。二进制模拟器设备的完整路径。
        #disk是用来描述磁盘的主要容器
            
            #指定磁盘上文件的绝对路径
            #使用virtio,采用普通的驱动,即硬盘和网卡都采用默认配置情况下,硬盘是 ide 模式,
            #而网卡工作在 模拟的rtl 8139 网卡下,速度为100M 全双工。
            #采用 virtio 驱动后,网卡工作在 1000M 的模式下,硬盘工作是SCSI模式下。
            #硬盘采用 virtio 后,安装windows 系统,将不能正常的识别硬盘,解决的方法是:
            #从kvm 的官网下载virtio的驱动iso。
            #1. 先采用ide模式安装系统。
            #2. 安装完成后,添加一个virtio模式的硬盘。
            #3. 启动vm后,系统会自动搜索 SCSI的驱动,找到下载的virtio 驱动后,安装即可。
            #4. 修改vm 配置文件,删除掉添加的 vitro 硬盘后,修改ide硬盘为 virtio模式即可
            
        
        
            
            
        
        #使用网桥类型。确保每个kvm guest的mac地址唯一。将创建tun设备,名称为vnetx(x为0,1,2...)
        
            
            
            
        
        
            
            
            
        
        # 补充:使用默认的虚拟网络代替网桥,即guest为NAT模式。也可以省略mac地址元素,这样将自动生成mac地址。
        # 默认分配192.168.122.x/24的地址,也可以手动指定。网关为192.168.122.1
        #
        # 
        # 
        #
 
         #输入设备
        #定义与guset交互的图形设备。在这个例子中,使用vnc协议。listen的地址为host的地址。prot为-1,表示自动分配端口号。
        
    

使用Virsh操作虚拟机

virsh define ubuntu.xml #定义后可通过virsh list --all 看到虚拟机名称ubuntu-controller,此时并位启动虚拟机

virsh edit ubuntu-controller #定义后再次修改

virsh start ubuntu-controller #启动虚拟机

virsh destroy ubuntu-controller #关闭虚拟机

virsh undefined ubuntu-controller #取消定义

Virsh对虚拟机进行管理

virsh start centos6.3 #开机

virsh create /etc/libvirt/qemu/centos6.3.xml #直接通过主机配置文档启动主机

virsh shutdown centos6.3 #关机

virsh destroy centos6.3 #强制关闭电源

virsh list --all #查看虚拟机状态

virsh define /etc/libvirt/qemu/node5.xml #根据主机配置文档添加虚拟机

virsh list --all #node5已经添加

virsh undefine node5 #移除虚拟机

ls /etc/libvirt/qemu

virsh list --all #node5已经被移除

qemu-img create -f qcow2 /virhost/kvm_node/node6.img 20G#为新建虚拟机生产磁盘镜像文件

virsh list

virsh dumpxml node4 >/etc/libvirt/qemu/node6.xml#导出虚拟机node6的硬件配置信息为/etc/libvirt/qemu/node6.xml

vim /etc/libvirt/qemu/node6.xml

 #修改node6的id号

node6 #虚拟机node6的name

4b7e91eb-6521-c2c6-cc64-c1ba72707fc7 #uuid必须修改,否则会和node4的冲突

 #指定新虚拟机的硬盘文件

virsh define /etc/libvirt/qemu/node6.xml #使用虚拟描述文档建立虚拟机,

可用virsh edit node6修改node6的配置文件

virsh start node6#启动虚拟机

virsh edit node4 #编辑node4的配置文件;不建议直接通过vim node4.xml修改。



#port='-1' :port自动分配,监听回环网络(virt-manager管理需要listen='127.0.0.1'),无密码

改为



#固定vnc管理端口5904,不自动分配,vnc密码xiaobai,监听所有网络


启动虚拟机成功后:

创建磁盘文件,修改XML配置文件(主要修改mac地址,自己的磁盘输出镜像地址,以及虚拟机名),依次创建三台虚拟机,分别作为调度(controller),计算(compute),网络(network)节点;

此时可以通过VNC连接虚拟机进行操作系统的安装;

先通过查看具体端口号:

virsh vncdisplay zhzej-controller

 

你可能感兴趣的:(openstack)