qemu中使用 9p virtio, 支持 host 和 guest 中共享目录


title: qemu中使用 9p virtio, 支持 host 和 guest 中共享目录
date: 2018-09-30 19:24
author: gatieme
tags: qemu
categories:
- qemu
thumbnail:
blogexcerpt: 在使用qemu调试内核的时候, 若是没有网络,想要部署点驱动或者程序上去都须要从新制做文件系统,本文讲解了如何经过 9p virtio fs 实如今 qemu 和 host 机器上共享文件和目录。linux


CSDN GitHub Hexo
qemu中使用 9p virtio, 支持 host 和 guest 中共享目录 AderXCoding/system/tools/qemu/0001-9p_virtio KernelShow-(gatieme.github.io)

知识共享许可协议

本做品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明出处, 谢谢合做git

因本人技术水平和知识面有限, 内容若有纰漏或者须要修正的地方, 欢迎你们指正, 也欢迎你们提供一些其余好的调试工具以供收录, 鄙人在此谢谢啦github


#1 问题描述

使用 qemu 调试内核是很方便的,可是咱们有时候想传点驱动或者程序上去跑一会儿,都须要从新制做和打包文件系统,这样花费了咱们的精力,也很烦。web

那有没有什么办法可以在 qemu 和 host 机器之间共享文件呢,这样咱们就省去了不少工做量。shell

因而 9p virtio fs 就登场了网络

#2 问题分析

9p 是啥,网络文件系统,用于共享目录。固然,qemu中使用9p是用于host和guest中共享目录,也不须要网络的支持,而是须要virtio的支持。svg

#3 qemu 使用 9p virtio实现共享目录

##3.1 qemu 支持和设置 virtfs

###3.1.1 qemu 启动参数添加 virfts

qemu 启动参数须要添加 :工具

-fsdev local,security_model=passthrough,id=fsdev0,path=/tmp/share \ -device virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=hostshare -fsdev local,security_model=passthrough,id=fsdev0,path=/tmp/share \ -device virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=hostshare

其中 pathhost 本地的共享目录ui

而后提示:google

'virtio-9p-pci' is not a valid device model name 'virtio-9p-pci' is not a valid device model name

须要从新编译 qemu, 编译时添加额外的 configure 参数 --enable-virtfs

###3.1.2 qemu 支持 virtfs

./configure --enable-kvm --enable-virtfs --prefix=/opt/software/toolchain/qemu ./configure --enable-kvm --enable-virtfs --prefix=/opt/software/toolchain/qemu

注意 qemu 支持 virtfs 须要 libcaplibattr 等依赖库.

./configure --enable-kvm --enable-virtfs --prefix=/opt/software/toolchain/qemu                            !2818

ERROR: VirtFS requires libcap devel and libattr devel

CentOS 可使用以下命令安装

sudo yum install -y libcap-devel sudo yum install -y libattr-devel sudo yum install -y libcap-devel sudo yum install -y libattr-devel

编译安装 qemu 后, 再运行, 能够了.

##3.2 guest 支持和设置 virtfs

###3.2.1 在 guest 中挂载 host 共享的目录

mkdir /tmp/host_files mount -t 9p -o trans=virtio,version=9p2000.L hostshare /tmp/host_files mkdir /tmp/host_files mount -t 9p -o trans=virtio,version=9p2000.L hostshare /tmp/host_files

若是提示 :

mount: unknown filesystem type '9p' mount: unknown filesystem type '9p'

则说明构建的 guest 内核不支持 9p-virtio.
须要开启对应的内核选项, 并从新编译.

###3.2.2 须要在 kernel 中添加 9p 的支持

CONFIG_NET_9P=y CONFIG_9P_FS=y CONFIG_VIRTIO_PCI=y CONFIG_NET_9P_VIRTIO=y CONFIG_9P_FS_POSIX_ACL=y CONFIG_NET_9P_DEBUG=y (Optional可选) CONFIG_NET_9P=y CONFIG_9P_FS=y CONFIG_VIRTIO_PCI=y CONFIG_NET_9P_VIRTIO=y CONFIG_9P_FS_POSIX_ACL=y CONFIG_NET_9P_DEBUG=y (Optional可选)

而后就可使用了, 若是再加上 virtio console 的支持, 那么既有 shell, 又能够传输文件
基本能够代替 adb 的经常使用功能了.

最后, 一切就绪以后, 启动 qemu, 就能够看到目录正常挂载了.

host 机器的共享目录

host 机器的共享目录

guest 机器的挂载点

guest 机器的挂载点

#4 参考

qemu启动命令

kernel配置

qemu添加configure选项

qemu中使用9p,支持host和guest中共享目录

Qemu share folder - 9pnet_virtio: no channels available for device

Documentation/9psetup

Linux-KVM-9P_virtio