KVM下宿主机的目录直通到虚机

这个需求也很有点意思,DBA 要求做 MySQL 的卸载从库,数据量会很大,硬盘空间后期需要扩容,但是 cpu 反倒占的不多。

单独 MySQL 是无法限制其 CPU 核使用的,这样的话,最好就是做个虚机来控制 MySQL 总 CPU 核数的使用,然后硬盘扩容的话,比如要拉伸虚机的附加第二块硬盘,如果是 QEMU 格式,会花费很长时间,所以干脆把宿主机的目录直接透传进虚机,之后如果要扩容加硬盘,直接把新的大硬盘 mount 出来再透进去即可,新旧硬盘拷贝数据也比拉伸虚机硬盘快。

CentOS7 下的做法如下:

两个大前提:

一、宿主机的 KVM qemu 系统需要使用新的 rpm 包,需要编译

二、虚机的内核需要升级,mount 命令需要支持 -t p9 的新格式

我们做好准备,就可以开始了

一、编译宿主机的qemu新包

现在已经是2022年了,所以编译的方式也发生变化了,最佳编译方式是干脆启动一个 Docker 虚拟机,来编译出来 rpm 包,也不污染环境。

首先克隆下来项目:

1git clone https://github.com/AlekseyChudov/qemu-kvm-virtfs.git
2
3cd qemu-kvm-virtfs
4

看一下最后的 build 脚本,有一个地方需要修改:

现在的 CentOS 最新版是 7.9.2009 ,这个版本树里是没有 qemu 的 Source Code 的,需要修改 baseurl,降低到 7.8.2003 才有 Source 的 repo

1baseurl=https://mirrors.tripadvisor.com/centos-vault/centos/\$releasever/virt/Source/kvm-common/
2
3改成:
4
5baseurl=https://mirrors.tripadvisor.com/centos-vault/centos/7.8.2003/virt/Source/kvm-common/

改好后 build 脚本如下

 1#!/bin/bash
 2
 3set -ex
 4
 5yum -y update
 6
 7yum -y install \
 8    "@Development Tools" \
 9    centos-release-qemu-ev \
10    glusterfs-api-devel \
11    glusterfs-devel \
12    iasl \
13    kernel-devel \
14    libcacard-devel \
15    libepoxy-devel \
16    mesa-libgbm-devel \
17    nss-devel \
18    spice-protocol \
19    spice-server-devel \
20    usbredir-devel
21
22cat << EOF >> /etc/yum.repos.d/CentOS-QEMU-EV.repo
23[centos-qemu-ev-source]
24name=CentOS-\$releasever - QEMU EV Sources
25baseurl=https://mirrors.tripadvisor.com/centos-vault/centos/7.8.2003/virt/Source/kvm-common/
26gpgcheck=1
27enabled=0
28gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-Virtualization
29EOF
30
31yum-builddep -y qemu-kvm-ev
32
33yumdownloader --source qemu-kvm-ev
34
35rpm -Uvh qemu-kvm-ev-*.src.rpm
36
37sed -i 's/--disable-virtfs/--enable-virtfs/' /root/rpmbuild/SOURCES/build_configure.sh
38
39sed -i -e '/^%files -n qemu-kvm-common/,/^$/s/^$/%{_bindir}\/virtfs-proxy-helper\n%{_mandir}\/man1\/virtfs-proxy-helper.1.gz\n/' \
40    -e '/^%if %{rhev}$/,/^%else$/s/pkgsuffix -ev/pkgsuffix -virtfs/' \
41    -e '/%define rhel_rhev_conflicts()/ a Provides: %1-ev = %{epoch}:%{version}-%{release} \\\nObsoletes: %1-ev < %{obsoletes_version} \\' \
42    /root/rpmbuild/SPECS/qemu-kvm.spec
43
44rpmbuild -ba --clean /root/rpmbuild/SPECS/qemu-kvm.spec

然后一句话执行 Build:

 1cd qemu-kvm-virtfs
 2
 3docker run -it --privileged -v "$PWD/rpmbuild:/root/rpmbuild" \
 4    docker.io/centos:7 /root/rpmbuild/build
 5
 6会得到如下的包,版本是 2.12.0-44.1.el7_8.1 :
 7
 8rpmbuild/RPMS/x86_64/qemu-img-virtfs-2.12.0-44.1.el7_8.1.x86_64.rpm
 9rpmbuild/RPMS/x86_64/qemu-kvm-common-virtfs-2.12.0-44.1.el7_8.1.x86_64.rpm
10rpmbuild/RPMS/x86_64/qemu-kvm-tools-virtfs-2.12.0-44.1.el7_8.1.x86_64.rpm
11rpmbuild/RPMS/x86_64/qemu-kvm-virtfs-2.12.0-44.1.el7_8.1.x86_64.rpm
12rpmbuild/RPMS/x86_64/qemu-kvm-virtfs-debuginfo-2.12.0-44.1.el7_8.1.x86_64.rpm
13rpmbuild/SRPMS/qemu-kvm-virtfs-2.12.0-44.1.el7_8.1.src.rpm
14

我们在宿主机上安装替换新的 qemu 包,并重启 libvirtd

 1yum -y install \
 2    cloud-utils \
 3    libvirt-client \
 4    libvirt-daemon-config-network \
 5    libvirt-daemon-config-nwfilter \
 6    libvirt-daemon-driver-interface \
 7    libvirt-daemon-driver-qemu \
 8    virt-install \
 9    rpmbuild/RPMS/x86_64/qemu-img-virtfs-2.12.0-44.1.el7_8.1.x86_64.rpm \
10    rpmbuild/RPMS/x86_64/qemu-kvm-common-virtfs-2.12.0-44.1.el7_8.1.x86_64.rpm \
11    rpmbuild/RPMS/x86_64/qemu-kvm-virtfs-2.12.0-44.1.el7_8.1.x86_64.rpm
12
13systemctl restart libvirtd

这样宿主机就准备好了。

二、生产虚机,做好passthrough

生产虚机的时候,需要做好内外文件目录的直通,宿主机目录是 /opt/test,对应虚机目录是 /test

1<domains ...>
2  ...
3  <devices ...>
4    <filesystem type='mount' accessmode='passthrough'>
5      <source dir='/opt/test'/>
6      <target dir='/test'/>
7    </filesystem>
8  </devices>
9</domains>

虚机启动后,需要升级核心,支持新的 mount 选项

1yum -y update
2yum -y --enablerepo centosplus install kernel-plus
3reboot
4
5# 把宿主机提供的 /test 点 mount 出来
6mount -t 9p -o trans=virtio,version=9p2000.L /test /opt/test

也可以把挂载点写进虚机的 fstab,下次就会自动 mount 了

1/test /opt/test 9p trans=virtio,version=9p2000.L,nofail,_netdev,x-mount.mkdir 0 0

如何用CPU挖Polygon网络的MATIC币
Gost Tunnel的使用
comments powered by Disqus