zoukankan      html  css  js  c++  java
  • 拾遗:Qemu/KVM

    WinXP:

    #!/bin/bash
    
    name=winxp
    
    qemu-system-x86_64 
    -enable-kvm 
    -cpu host -smp 2,sockets=2,cores=1,threads=1 
    -m 4096 
    -net user 
    -drive file=./WinXP.img,if=none,cache=writeback,id=${name}_disk -device ide-hd,drive=${name}_disk 
    -drive file=./WinXP.iso,readonly=on,media=cdrom 
    -boot order=cd 
    -name ${name} 
    -display gtk

    一、管理 images

    1、创建

      qemu-img create -f raw -o size=10G,nocow=on base.raw  #nocow 用于关闭 btrfs 的写时复制,仅对新创建的文件生效

    2、扩容

      qemu-img resize base.raw +20G

    3、查询信息

      qemu-img info base.raw 

    4、转换格式

      qemu-img convert -c -O qcow2 base.raw base.qcow2 

    5、增量创建

      qemu-img create -f qcow2 -o size=20G,nocow=on,backing_file=base.qcow2 linux.qcow2  #批量运行时减少磁盘占用

    6、重改基础镜像

      qemu-img rebase [-u] -b /PATH/TO/xxx.qcow2 linux.qcow2  # -u 指 unsafe 模式,无需检验,通常用于基础镜像移动位置或重命名之后

    二、管理 snapshot

    1、创建

      qemu-img snapshot -c v0.1_snapshot linux.qcow2

    2、查询

      qemu-img snapshot -l linux.qcow2

    3、应用

      qemu-img snapshot -a v0.1_snapshot linux.qcow2

    4、删除

      qemu-img snapshot -d v0.1_snapshot linux.qcow2

    三、热拔插

    # 首先需要客户机载入:modprobe pci_hotplug

    # 然后在 monitor 中操作

      drive_add 0 media=disk,file=/PATH/TO/xxx.qcow2,if=none,id=vd0  #添加到 Qemu

      device_add virtio-blk-pci,drive=vd0  #插入到客户机

      drive_del tmp_0  #移除

    四、Gentoo

      /etc/portage/package.use/qemu:

      vhost-net -nls -iscsi -nfs -opengl -jpeg -png -usb -usbredir -curl -selinux -spice -ncurses -sdl -gtk -xen -alsa -bluetooth

    五、示例

      init.sh 

      1 #!/usr/bin/env sh
      2 #
      3 # 0、目录结构:conf、images、ISOs
      4 # 1、安装镜像存放于"../ISOs"路径下,命名格式:FreeBSD.iso
      5 # 2、配置好每个OS的基础镜像,置于"../images"路径下,命名格式:FreeBSD_base.img
      6 # 
      7 
      8 if [[ $1 == '' ]];then
      9     VmNum=1
     10     printf "33[31;01m$VmNum is not specified, defaults to 1
    33[00m"
     11 elif [[ $1 =~ [0-9] ]];then
     12     VmNum=$1
     13 else
     14     printf "33[31;01m$1 is not a number!!!
    33[00m"
     15     exit
     16 fi
     17 
     18 if [[ $2 == '' ]];then
     19     OS=Gentoo
     20     printf "33[31;01mOS is not specified, defaults to "Gentoo"
    33[00m"
     21 else
     22     OS=$2
     23 fi
     24 
     25 ISO=${OS}.iso
     26 BaseImg=${OS}_base.img
     27 CpuNum=4
     28 Mem=4G
     29 MaxMem=8G
     30 DiskSiz=200G
     31 MaxVmNum=10
     32 HostIP=192.168.0.254
     33 
     34 if [[ $1 -gt $MaxVmNum ]];then
     35     printf "33[31;01mvmNum > ${MaxVmNum}!!!
    33[00m"
     36     exit
     37 fi
     38 
     39 case $OS in
     40     FreeBSD)
     41         Version=11
     42         AddrPos=50
     43         ;;
     44     Gentoo)
     45         Version=13
     46         AddrPos=40
     47         ;;
     48     RHEL)
     49         Version=07
     50         AddrPos=30
     51         ;;
     52     Debian)
     53         Version=08
     54         AddrPos=20
     55         ;;
     56     Ubuntu)
     57         Version=17
     58         AddrPos=10
     59         ;;
     60     *)
     61         printf "33[31;01mUnknown OS name!!!
    33[00m"
     62         printf "Supported OS name:FreeBSD Gentoo RHEL Debian Ubuntu
    "
     63         exit
     64         ;;
     65 esac
     66 
     67 vmFunc() {
     68     qemu-system-x86_64 
     69     -enable-kvm 
     70     -machine q35,accel=kvm -device intel-iommu 
     71     -cpu host -smp $CpuNum,sockets=$CpuNum,cores=1,threads=1 
     72     -m $Mem,slots=4,maxmem=$MaxMem 
     73     -netdev tap,ifname=${OS}_$1,script=tap.sh,downscript=no,id=vmNic_${OS}_$1 -device virtio-net-pci,mac=52:54:00:11:$1:${Version},netdev=vmNic_${OS}_$1 
     74     -drive file=../images/$ImgName,if=none,cache=writeback,media=disk,id=vmDisk_${OS}_$1 -device virtio-blk-pci,drive=vmDisk_${OS}_$1 
     75     -drive file=../ISOs/$ISO,readonly=on,media=cdrom 
     76     -boot order=cd 
     77     -name vm${OS}_$1 
     78     -monitor tcp:$HostIP:$(($1 * 1000)),server,nowait 
     79     -vnc :$1 
     80     -daemonize
     81 }
     82 
     83 OpsFunc() {
     84     eval x=$(($1 + $AddrPos))
     85     local ImgName=${OS}_$x.img
     86 
     87     if [[ 0 -eq $(ls ../images | grep -c $ImgName) ]];then
     88         qemu-img create -f qcow2 -o size=$DiskSiz,nocow=on,backing_file=../images/$BaseImg ../images/$ImgName
     89         if [[ 0 -ne $? ]];then
     90             printf "33[31;01mCan't create $ImgName!!!
    33[00m"
     91             exit
     92         fi
     93     fi
     94 
     95     vmFunc $x
     96 }
     97 
     98 i=0
     99 while [[ $i -lt $VmNum ]]
    100 do
    101     OpsFunc $i
    102     let i+=1
    103 done

    ... 

    /*基于硬件IOMMU支持的硬件直接分配技术:VFIO*/ 
    #modprobe vfio-pci
    #echo 8086 8c20 > /sys/bus/pci/drivers/vfio-pci/new_id
    #echo 0000:00:1b.0 > /sys/bus/pci/devices/0000:00:1b.0/driver/unbind
    #echo 0000:00:1b.0 > /sys/bus/pci/drivers/vfio-pci/bind
    /*Qemu设置直连物理网卡示例*/
    #-device vfio-pci,host=00:1b.0
    #-net none

      net.sh: 

    #!/usr/bin/env sh
    
    modprobe tun
    modprobe vhost
    modprobe vhost_net
    modprobe bonding
    
    IF_0=enp2s0
    IF_1=eno1
    BD=bond0
    SW=br0
    
    ADDR=192.168.0.254/24
    ROUTE=192.168.0.1
    
    ip link del $BD #echo -$BD > /sys/class/net/bonding_masters
    
    if [[ 0 -eq $(ip link | grep -c $SW) ]];then
        ip link add $SW type bridge
    fi
    ip link add $BD type bond #echo +$BD > /sys/class/net/bonding_masters
    
    for x in $IF_0 $IF_1 $BD $SW
    do
        ip addr flush dev $x
        ip route flush dev $x
    done
    
    ip link set $IF_0 down
    ip link set $IF_1 down
    ip link set $BD down
    echo active-backup > /sys/class/net/$BD/bonding/mode #balance-rr/active-backup/broadcast
    echo 1000 > /sys/class/net/bond0/bonding/miimon
    echo +$IF_0 > /sys/class/net/$BD/bonding/slaves
    echo +$IF_1 > /sys/class/net/$BD/bonding/slaves
    ip link set $IF_0 up
    ip link set $IF_1 up
    ip link set $BD up
    
    #ip link set $IF_0 promisc on
    #ip link set $IF_1 promisc on
    #ip link set $BD promisc on
    
    ip link set $BD master $SW
    ip addr add $ADDR dev $SW
    ip link set $SW up
    ip route replace default via $ROUTE dev $SW
    
    printf "33[31;01mSlaves of $BD:33[00m
    "
    cat /sys/class/net/$BD/bonding/slaves
    
    #printf "
    33[31;01m$BD info:33[00m
    "
    #cat /proc/net/bonding/$BD

      tap.sh

          开头必须加 #!/usr/bin/env bash  一行

    #!/usr/bin/env bash

    ip link set $1 up sleep 0.1s ip link set $1 master br0
  • 相关阅读:
    利用FT232实现USB转串口
    用例图
    Flash与EEPROM
    spring -boot定时任务 quartz 基于 MethodInvokingJobDetailFactoryBean 实现
    得到中文首字母
    删除目录
    数字格式化工具
    Md5加密
    Double类型的数值 在写入excel时 如何去掉 科学计算法的 后面数值+ E的 情况
    数值的比较
  • 原文地址:https://www.cnblogs.com/hadex/p/5720742.html
Copyright © 2011-2022 走看看