虚拟机创建

1 安装概述
在Linux上,我们使用qemu和virsh搭建虚拟机来进行代码的编译、安装和测试等工作。
1.1 安装前准备

  1. 确保你已经安装了qemu和virsh。
  2. 新建一个名为kvm的目录,之后我们的一切操作都在这个目录下进行。
  3. 下载好一个操作系统.iso镜像文件,并将其复制到刚才创建的kvm目录中。
  4. 创建虚拟硬盘。

    qemu-img create -f <格式> <硬盘名字> <硬盘大小>

    qemu-img create -f qcow2 xxxxx.qcow2 64G
    安装时请自行修改名字、虚拟磁盘等各项参数。
    1.2 安装流程
    1.2.1 使用VNC远程安装
    将下列命令保存为脚本create_vm.sh,
    #!/bin/bash
    ##@para: name iso vncport

if [ $# != 3 ]
then
echo "Usage: sudo ./create_vm.sh "
exit 1
fi
virsh destroy $1
virsh undefine $1
virt-install
–name $1
–ram 4096
–file ./$1.qcow2
–cdrom $2
–vcpus=4
–vnc --vncport=$3 --vnclisten=0.0.0.0

然后,执行如下命令
sudo ./create_vm.sh <虚拟机名> <操作系统镜像文件路径> <端口号>
sudo ./create_vm.sh xxxxx ubuntu-16.04.6-server-amd64.iso 50001

回到一台主机,下载并安装VNC Viewer软件。
启动VNC Viewer,输入ip:port。 ip为虚拟机所在设备的ip地址,port即为刚才创建虚拟机时指定的端口。按enter键确认,然后开始安装。

按照图像的引导一步步安装即可。

需要注意的一个问题是,有些系统镜像在安装过程中会出现busybox-initramfs安装失败这一麻烦问题,需要退出重装。这个问题可能是由于中文相关问题引起的,第一步选择语言时选择英文就不会出现这个问题。请务必选择英语安装,这样,安装系统和vpp编译过程都会顺利很多。
1.2.2 复制虚拟机
复制虚拟机,也就是通过复制已经装好系统的虚拟硬盘来安装虚拟机。
将下列命令保存为脚本copy_vm.sh,
#!/bin/bash
usage: sudo ./copy_vm.sh
echo ‘begin copying disk…’
cp $1.qcow2 $2.qcow2
echo ‘done copy disk…’
virsh destroy $2
virsh undefine $2
echo ‘begin installing…’
virt-install
–name $2
–ram 4096
–vcpus 4
–disk $2.qcow2
–import
–graphics=none
执行命令
sudo ./copy_vm.sh
等待复制磁盘并启动虚拟机即可。因为是复制而来的,所以除了外部网口配置,新设置的内存大小等,新的虚拟机系统具有与原虚拟机一样的配置,原虚拟机中已经安装好的软件新虚拟机中同样可以正确使用。如果原虚拟机已经配置好console,新虚拟机也是直接支持console的。为了消除IP冲突,我们可能还需要为新虚拟机重新配置网络。
2 配置概述
2.1 配置串口(console)
安装好虚拟机之后,需要配置串口,我们才能在主机通过终端来连接虚拟机。
执行命令
sudo vim /etc/default/grub
搜索GRUB_CMD,并将
GRUB_CMDLINE_LINUX_DEFAULT=""
修改为
GRUB_CMDLINE_LINUX_DEFAULT=“console=tty0 console=ttyS0,115200n8”
保存之后执行命令
sudo update-grub
然后reboot,之后我们就可以从终端登录虚拟机了。
登录方式
virsh console <虚拟机名>

图2-1 串口登录界面
这时候若按其他键无反应,按ctrl+]可退出(请记住,在虚拟机中也是通过ctrl+] 组合键来退出虚拟机),按enter 键即可连接到虚拟机。
2.2 配置网络(ip,route,dns)
以ubuntu16.04为例,编辑网络配置文件
sudo vim /etc/network/interfaces
按下面格式填入ip,网关,域名服务器等信息
auto eth0 #要设置的网卡
iface eth0 inet static #设置静态IP;如果是使用自动IP用dhcp,后面的不用设置,一般少用
address xxx.xxx.xxx.xxx #IP地址
netmask xxx.xxx.xxx.xxx #子网掩码
gateway xxx.xxx.xxx.xxx #网关
dns-nameservers 114.114.114.114 8.8.8.8 # 域名服务

保存之后,重启网络服务
/etc/init.d/networking restart
sudo service network restart
如果重启网络服务失败,就重启操作系统。之后虚拟机就可以连接到网络了。

网络配置完成之后,直接通过ssh来连接虚拟机操作起来会方便许多。
2.3 配置CPU、内存和磁盘
查看虚拟机配置信息和状态

图2 3 查看虚拟机配置
2.3.1 配置CPU
设置最大CPU颗数
virsh setvcpus --maximum –config
调整cpu颗数(已经开启的主机只增不减,并且不能超过最大CPU颗数)
virsh setvcpus [domain-name, domain-id or domain-uuid] [num]
2.3.2 内存配置
#设置最大内存使用量,以MB为单位。
virsh setmaxmem size –config
调整内存使用量,开机状态也可以减少内存,并且立即生效
virsh setmem [domain-id or domain-name] [number]
2.3.3 磁盘配置
#查看磁盘大小
qemu-img info <虚拟磁盘文件路径>
下面以qcow2格式为例,讲述虚拟磁盘扩容以及如何将新增容量扩展到虚拟机文件系统。
2.3.3.1 虚拟磁盘扩容
#调整磁盘大小。修改需要重启才能生效,因此,建议在关机状态下进行。
qemu-img resize <虚拟磁盘文件路径> <new_size>
增加20G
qemu-img resize <虚拟磁盘文件路径> +20G
2.3.3.2 将容量扩展到文件系统
磁盘扩容之后,需要在虚拟机中进行一些操作,才能将新增磁盘容量扩展到虚拟机的文件系统。
重启虚拟机之后,在虚拟机中输入命令 fdisk -l 查看磁盘状况。可以看到,磁盘容量已经增加了我们预期的容量,但是分区大小没有变化。因此,我们需要手动分区并挂载或对原有分区进行扩容操作,才能将新增磁盘容量扩展到虚拟机的文件系统。
下面是操作步骤:

  1. 创建分区
    fdisk /dev/sda # 需要su权限,参数为上面fdisk -l找到的你想要进行分区的磁盘
  2. 创建物理卷
    pvcreate /dev/sda3 # 假设你创建了一个叫做sda3的分区
    如果提示找不到 /dev/sda3,请输入命令sudo partprobe
  3. 使用vgscan 查询物理卷
    需要su权限,假设查到的结果为ubuntu-vg
  4. 使用新增的物理卷扩展ubuntu-vg
    sudo vgextend ubuntu-vg /dev/sda3
  5. 扩展lv,这里假设上面新建的分区大小是20G,这里跟的是要扩展分区名
    sudo lvextend -L +20G /dev/mapper/ubuntu–vg-root
  6. 让文件系统识别新添加的磁盘文件系统
    sudo resize2fs /dev/mapper/ubuntu–vg-root # 适用于ext4文件系统

    sudo xfs_growfs /dev/mapper/ubuntu–vg-root # 适用于xfs文件系统
    扩容之前

扩容之后

!关于缩容
qemu-img resize 需要加 --shrink参数才能对磁盘进行缩容,并且这样操作可能会删除磁盘上的数据,对于想要继续使用的虚拟机,对其磁盘进行缩容是不明智的,因为不仅可能会删除数据,还会导致系统无法继续使用。因此,请谨慎操作。
2.4 网桥和流表配置
Linux内核支持网口桥接,。通常,当我们创建虚拟机后,宿主机上有一个名为br0的网桥,连接了宿主机的物理网卡和虚拟机的管理网口,从而使虚拟机可以与外界进行通信。
ovs(Open VSwitch)是另一套配置管理虚拟网络的强大工具。下面我们使用它来创建和管理虚拟网桥,并配置转发流表。以下内容假设你的机器上已安装了ovs组件。
2.4.1 创建网口并接入网桥
执行命令创建一个你自己的虚拟网桥
ovs-vsctl add-br
然后编辑虚拟机的配置文件
sudo virsh edit
查找interface标签,将下面代码粘贴到interface标签后面,并把其中的网桥名称修改为你刚才创建的网桥。

保存修改之后,virsh会为我们自动完成MAC地址等配置。 关闭虚拟机, virsh shutdown 然后开机,登录,执行ifconfig命令,可以看到虚拟机新增了一个网口。 宿主机里面执行命令 ovs-vsctl show 可以看到,之前创建的网桥上已经多了一些端口,这些端口都有一个vnet开头的名字,比如vnet33。 2.4.2 流表的组成 每条流表规则由一些字段组成,可以分为基础字段、匹配字段和动作字段三部分。 下面是一些常用的字段的解释,想要了解更多字段,请查阅OVS官网

基础字段
字段 描述
priority=priority 标识流表的优先级,范围为0-65535,值越大,优先级越高
hard_timeout=sec 流表可存在的时间。设置此值后,流表会在到达给定时间后被删除。
匹配字段
字段 描述
in_port=port 标识匹配接收数据包的端口
dl_type=ethertype 匹配数据包的二层协议类型,IP数据包为0x0800,IPv6数据包为0x86dd,ARP数据包为0x0806
动作字段
字段 描述
output:port 将数据包从port接口发送
normal 将数据包按照设备上的正常L2/L3层处理方式进行处理
in_port 将数据包从接收的接口发送出去
all 将数据包发送到除接收接口外的所有接口
mod_vlan_vid:vlan_vid 修改数据包的vlan id
2.4.3 配置流表
如下命令可以在网桥br-xxx上增加一项流表规则,它的具体含义是:从vnet83端口收到的报文从vnet89端口发出。
ovs-ofctl add-flow br-xxx “in_port=vnet83 action=output:vnet89”
我们还可以使用此命令添加一些其他规则,比如丢弃从vnet87端口收到的报文
ovs-ofctl add-flow br-xxx “in_port=vnet87 action=drop”

配置流表之后,我们可以使用tcpreplay向特定端口发包,tcpdump收包来验证我们的虚拟网桥是否如我们希望的那样处理报文。
3 Virsh常用命令
本节列举了virsh常用命令,以及virt-install相关参数的解释。这些命令可用来对宿主机上的虚拟机进行配置和管理,大多需要超级权限来执行。

3.1 Virsh常用命令手册
命令 描述
virsh start 启动虚拟机
virsh reboot 重启虚拟机
virsh shutdown 正常关闭虚拟机
virsh destroy 强制(直接断电)关闭虚拟机
virsh start --console 启动并通过串口进入虚拟机
virsh console 连接虚拟机
virsh suspend 挂起虚拟机
virsh resume 恢复被挂起的虚拟机
virsh save file 将虚拟机的运行状态存储到文件file中
virsh restore file 从文件file恢复被存储状态的虚拟机的状态
virsh list [–all] 列举[所有]虚拟机
virsh dominfo 显示虚拟机的基本配置和状态信息
virsh cpu-stats 查看宿主机和虚拟机的 CPU 运行时间统计
virsh vcpuinfo 查看实例 vcpu 和 物理 cpu 的对应关系
virsh autostart 子机随宿主机(母机)启动而启动
virsh undefine 解除主机标记
virsh edit 编辑虚拟机的配置文件,如修改CPU、内存,网口等
virt-clone 克隆虚拟机
virt-install 安装虚拟机

3.2 virt-install 参数解释
选项 描述
–name, -n 设定虚拟机名字
–ram 内存大小,以MB为单位
–disk 指定虚拟硬盘文件
–cdrom 指定光盘或iso文件路径
–vcpus 启动并通过串口进入虚拟机
–location 指定安装文件url,与 --cdrom 只能二选一
–extra-args 需要在指定 --location参数条件下才能使用
4 OVS常用命令
ovs的大多命令都需要超级权限才能执行。
4.1 网桥相关
网桥相关命令以ovs-vsctl开头
命令 描述
ovs-vsctl add-br 创建虚拟网桥
ovs-vsctl del-br 删除虚拟网桥
ovs-vsctl add-port 给虚拟网桥添加端口
ovs-vsctl del-port 删除虚拟网桥的某一端口
ovs-vsctl show 显示所有虚拟网桥及其端口
ovs-vsctl list-br 列举所有虚拟网桥的名字

4.2 流表相关
流表相关的命令以ovs-ofctl开头
命令 描述
ovs-ofctl dump-flows 输出网桥中所有流表项
ovs-ofctl dump-flows 输出网桥中匹配的流表项
ovs-ofctl add-flows 在网桥上添加一条流表
ovs-ofctl del-flows 删除网桥上的全部流表
ovs-ofctl del-flows 删除网桥上的一条流表
ovs-ofctl mod-flows 修改网桥的流表项
ovs-ofctl dump-ports 输出端口统计信息
ovs-ofctl dump-ports-desc 输出端口描述信息
ovs-ofctl show 输出网桥上所有连接的设备及其端口号

关于磁盘扩容
1、主机上先关虚拟机,执行qemu-img resize /XX_copy1.qcow2 32G,进行扩容
2、启动虚拟机
3、进入虚拟机,格式化 fdisk /dev/vda1(d 1 n n p 1 p w)
4、resize2fs /dev/vda1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老虎爱代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值