7

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

 2 years ago
source link: https://zhangrr.github.io/posts/20220223-kvm_passthrouth/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

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

CentOS7 下的做法如下:

两个大前提:

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

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

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

一、编译宿主机的qemu新包

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

首先克隆下来项目:

git clone https://github.com/AlekseyChudov/qemu-kvm-virtfs.git

cd qemu-kvm-virtfs

fallback

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

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

baseurl=https://mirrors.tripadvisor.com/centos-vault/centos/\$releasever/virt/Source/kvm-common/

改成:

baseurl=https://mirrors.tripadvisor.com/centos-vault/centos/7.8.2003/virt/Source/kvm-common/

改好后 build 脚本如下

#!/bin/bash

set -ex

yum -y update

yum -y install \
    "@Development Tools" \
    centos-release-qemu-ev \
    glusterfs-api-devel \
    glusterfs-devel \
    iasl \
    kernel-devel \
    libcacard-devel \
    libepoxy-devel \
    mesa-libgbm-devel \
    nss-devel \
    spice-protocol \
    spice-server-devel \
    usbredir-devel

cat << EOF >> /etc/yum.repos.d/CentOS-QEMU-EV.repo
[centos-qemu-ev-source]
name=CentOS-\$releasever - QEMU EV Sources
baseurl=https://mirrors.tripadvisor.com/centos-vault/centos/7.8.2003/virt/Source/kvm-common/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-Virtualization
EOF

yum-builddep -y qemu-kvm-ev

yumdownloader --source qemu-kvm-ev

rpm -Uvh qemu-kvm-ev-*.src.rpm

sed -i 's/--disable-virtfs/--enable-virtfs/' /root/rpmbuild/SOURCES/build_configure.sh

sed -i -e '/^%files -n qemu-kvm-common/,/^$/s/^$/%{_bindir}\/virtfs-proxy-helper\n%{_mandir}\/man1\/virtfs-proxy-helper.1.gz\n/' \
    -e '/^%if %{rhev}$/,/^%else$/s/pkgsuffix -ev/pkgsuffix -virtfs/' \
    -e '/%define rhel_rhev_conflicts()/ a Provides: %1-ev = %{epoch}:%{version}-%{release} \\\nObsoletes: %1-ev < %{obsoletes_version} \\' \
    /root/rpmbuild/SPECS/qemu-kvm.spec

rpmbuild -ba --clean /root/rpmbuild/SPECS/qemu-kvm.spec

然后一句话执行 Build:

cd qemu-kvm-virtfs

docker run -it --privileged -v "$PWD/rpmbuild:/root/rpmbuild" \
    docker.io/centos:7 /root/rpmbuild/build

会得到如下的包,版本是 2.12.0-44.1.el7_8.1 :

rpmbuild/RPMS/x86_64/qemu-img-virtfs-2.12.0-44.1.el7_8.1.x86_64.rpm
rpmbuild/RPMS/x86_64/qemu-kvm-common-virtfs-2.12.0-44.1.el7_8.1.x86_64.rpm
rpmbuild/RPMS/x86_64/qemu-kvm-tools-virtfs-2.12.0-44.1.el7_8.1.x86_64.rpm
rpmbuild/RPMS/x86_64/qemu-kvm-virtfs-2.12.0-44.1.el7_8.1.x86_64.rpm
rpmbuild/RPMS/x86_64/qemu-kvm-virtfs-debuginfo-2.12.0-44.1.el7_8.1.x86_64.rpm
rpmbuild/SRPMS/qemu-kvm-virtfs-2.12.0-44.1.el7_8.1.src.rpm

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

yum -y install \
    cloud-utils \
    libvirt-client \
    libvirt-daemon-config-network \
    libvirt-daemon-config-nwfilter \
    libvirt-daemon-driver-interface \
    libvirt-daemon-driver-qemu \
    virt-install \
    rpmbuild/RPMS/x86_64/qemu-img-virtfs-2.12.0-44.1.el7_8.1.x86_64.rpm \
    rpmbuild/RPMS/x86_64/qemu-kvm-common-virtfs-2.12.0-44.1.el7_8.1.x86_64.rpm \
    rpmbuild/RPMS/x86_64/qemu-kvm-virtfs-2.12.0-44.1.el7_8.1.x86_64.rpm

systemctl restart libvirtd

这样宿主机就准备好了。

二、生产虚机,做好passthrough

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

<domains ...>
  ...
  <devices ...>
    <filesystem type='mount' accessmode='passthrough'>
      <source dir='/opt/test'/>
      <target dir='/test'/>
    </filesystem>
  </devices>
</domains>

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

yum -y update
yum -y --enablerepo centosplus install kernel-plus
reboot

# 把宿主机提供的 /test 点 mount 出来
mount -t 9p -o trans=virtio,version=9p2000.L /test /opt/test

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

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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK