QEMU 通过网络实现共享文件

在这里插入图片描述

系列文章目录


Linux内核学习
Linux 知识(1)
Linux 知识(2)
WSL Ubuntu
QEMU 虚拟机
Linux 调试视频
PCIe 与 USB 的补充知识
vscode 使用说明
树莓派 4B 指南
设备驱动畅想
Linux内核子系统
Linux 文件系统挂载
QEMU 通过网络实现共享文件
OrangePi 学习摘录 —— 制作桌面版镜像
Radxa 学习摘录
Rockchip RK3399 - 引导流程和准备工作


文章目录

  • 系列文章目录
  • 1、通过 virtfs 共享文件
    • 1.1 在宿主机(Host)上设置共享目录
    • 1.2 启动 QEMU 时配置
      • -virtfs 选项
      • -fsdev 和 -device 选项
    • 1.3 虚拟机(Guest)中的配置
      • 手动挂载
      • 自动挂载(可选)
    • 1.4 注意事项
  • 2、网络配置
    • 切换根文件
    • NAT 模式
      • 步骤 1:启动 QEMU 并配置 NAT 网络
      • 步骤 2:在虚拟机中配置网络
      • 步骤 3:验证网络连接
      • 步骤 4:配置 DNS
      • 步骤 5:配置 SSH 访问
    • Tap 模式(网桥模式)
      • 步骤 1:创建 TAP 接口
      • 步骤 2:创建桥接接口
      • 步骤 3:配置 QEMU 启动命令
      • 注意事项
  • 命令示例


1、通过 virtfs 共享文件

在 QEMU 中,virtfs 是一种高效且灵活的文件共享方式,它基于 9p 文件系统协议。以下是使用 virtfs 进行文件共享的详细步骤:

1.1 在宿主机(Host)上设置共享目录

创建一个目录,用于存放需要共享的文件:

mkdir -p /mnt/shared_folder

将需要共享的文件放入此目录中。

1.2 启动 QEMU 时配置

-virtfs 选项

-virtfs 选项用于指定共享目录的路径、安全模型以及挂载点等参数。以下是一个完整的命令示例:

qemu-system-x86_64 \-hda your_vm_image.img \-m 2048 \-enable-kvm \-virtfs local,path=/mnt/shared_folder,mount_tag=host_share,security_model=passthrough
  • -virtfs local:表示使用本地目录作为共享文件夹。
  • path=/mnt/shared_folder:指定宿主机上的共享目录路径。
  • mount_tag=host_share:定义一个挂载标签(tag),用于在虚拟机中识别共享目录。
  • security_model=passthrough:指定安全模型,passthrough 表示直接把文件系统的权限和用户 ID 映射到虚拟机中。除了 passthrough,还可以选择 mapid(映射用户 ID)或 none(无安全模型)等其他安全模型,根据实际需求进行选择。

-fsdev 和 -device 选项

使用 -fsdev-device virtio-9p-device virtio-9p-mmio 来配置共享目录。以下是示例命令:

qemu-system-aarch64 \-machine virt \-cpu host \-m 2048 \-kernel /path/to/your/kernel \-append "root=/dev/vda2" \-drive file=/path/to/your/disk.img,format=qcow2 \-net none \-fsdev local,security_model=passthrough,id=fsdev0,path=/mnt/shared_folder \-device virtio-9p,fsdev=fsdev0,mount_tag=host_share
  • -fsdev local,security_model=passthrough,id=fsdev0,path=/mnt/shared_folder:定义共享目录。
  • -device virtio-9p,fsdev=fsdev0,mount_tag=host_share:将共享目录挂载到虚拟机中。
    注意:如果使用 -device virtio-9p-pci,可能会遇到 “No ‘PCI’ bus found” 错误。在这种情况下,可以使用 -device virtio-9p-mmio 替代。

1.3 虚拟机(Guest)中的配置

手动挂载

  1. 创建挂载点:
    在虚拟机中创建一个目录,用于挂载共享文件夹。例如:
mkdir -p /mnt/shared
  1. 挂载共享文件夹:
    使用以下命令挂载共享文件夹:
sudo mount -t 9p -o trans=virtio,version=9p2000.L host_share /mnt/shared
  • -t 9p:指定文件系统类型为 9p。
  • -o trans=virtio,version=9p2000.L:指定传输协议为 virtio,文件系统版本为 9p2000.L。
  • host_share:共享目录的挂载标签(与 QEMU 启动命令中的 mount_tag 一致)。
  • /mnt/shared:虚拟机中的挂载点。
  1. 验证挂载:
    挂载成功后,可以在 /mnt/shared 目录中访问宿主机上的共享文件。

自动挂载(可选)

为了在虚拟机重启后自动挂载共享文件夹,可以将挂载命令添加到 /etc/fstab 文件中。例如:

echo "host_share /mnt/shared 9p trans=virtio,version=9p2000.L,rw,share,nobootwait,posixacl,msize=104857600 0 0" >> /etc/fstab

然后运行以下命令使配置生效:

sudo mount -a

1.4 注意事项

  1. 内核支持:
    确保虚拟机中的 Linux 内核支持 9p 文件系统。可以通过以下命令检查内核配置:
grep CONFIG_NET_9P /proc/config.gz

如果未启用,需要重新编译内核并启用以下选项:

  • CONFIG_NET_9P
  • CONFIG_NET_9P_VIRTIO
  • CONFIG_9P_FS
  • CONFIG_9P_FS_POSIX_ACL
  1. 权限问题:
    如果在虚拟机中无法访问共享文件夹,可以检查宿主机上的文件权限。例如:
chmod -R 755 /mnt/shared_folder
  1. 网络配置:
    如果虚拟机使用的是用户网络模式(-net user),可能需要调整防火墙设置,以允许 9p 协议的通信。

2、网络配置

切换根文件

# chroot target
chroot target /bin/sh

NAT 模式

在 QEMU 中运行 BusyBox 系统时,可以通过以下步骤配置 IP 地址并使其通过 NAT 访问外网:

步骤 1:启动 QEMU 并配置 NAT 网络

在启动 QEMU 时,使用 -netdev user 和 -device virtio-net 参数来配置 NAT 网络。以下是一个示例命令:

qemu-system-x86_64 \-m 2048 \-hda /path/to/your/disk.img \-netdev user,id=net0,ipv6=off,hostfwd=tcp::8022-:22 \-net nic,model=virtio 
#  -device virtio-net-device,netdev=net0
  • -netdev user,id=net0,ipv6=off,hostfwd=tcp::8022-:22:配置 NAT 网络,hostfwd 参数将虚拟机的 22 端口(SSH)映射到宿主机的 8022 端口。
  • -device virtio-net-device,netdev=net0:将虚拟网卡连接到 NAT 网络。

步骤 2:在虚拟机中配置网络

虚拟机启动后,QEMU 会自动为虚拟机分配一个 NAT 网络。虚拟机可以通过以下命令检查网络配置:

ip addr show

如果虚拟机未分配 IP 地址,可以尝试以下方法:

  • 方法 1:使用 DHCP 获取 IP 地址
    BusyBox 默认安装了 udhcpc,可以通过以下命令获取 IP 地址:
udhcpc

udhcpc 会自动从 DHCP 服务器获取 IP 地址、子网掩码、默认网关和 DNS 服务器信息。获取到 IP 地址后,可以通过以下命令查看网络配置:

ip addr show
  • 方法 2:手动配置静态 IP 地址
    如果 DHCP 无法获取 IP 地址,可以手动配置静态 IP 地址。使用以下命令配置网络接口的 IP 地址和子网掩码:
# 启动网络接口
# ifconfig eth0 up
# ip link set eth0 upbusybox ifconfig eth0 10.0.2.15 netmask 255.255.255.0

然后添加默认网关:

busybox route add default gw 10.0.2.2

步骤 3:验证网络连接

在虚拟机中,使用以下命令测试网络连接:

ping 8.8.8.8

如果能够成功 ping 通,说明虚拟机已经可以访问外网。

步骤 4:配置 DNS

如果虚拟机可以 ping 通外网,但无法解析域名,可以编辑 /etc/resolv.conf 文件,添加 DNS 服务器地址:

echo "nameserver 8.8.8.8" >> /etc/resolv.conf
echo "nameserver 8.8.4.4" >> /etc/resolv.conf# 查看 DNS 服务器
nmcli dev show | grep DNS
resolvectl status
cat /etc/resolv.conf
systemd-resolve --status
getent hosts www.baidu.com
dig www.baidu.com
nslookup g o o - g lx e . com

步骤 5:配置 SSH 访问

在虚拟机中安装并配置 SSH 服务,以便通过 SSH 访问虚拟机:

busybox ash
busybox opkg update
busybox opkg install dropbear

启动 dropbear 服务:

/etc/init.d/dropbear start

在宿主机上,可以通过以下命令连接到虚拟机的 SSH 服务:

ssh -p 8022 user@localhost

Tap 模式(网桥模式)

QEMU 的 Tap 模式(网桥模式)允许虚拟机通过一个虚拟的网络接口(TAP 接口)直接连接到宿主机的物理网络。这种方式使得虚拟机能够与宿主机以及同一网络中的其他设备直接通信。以下是详细的配置步骤:

步骤 1:创建 TAP 接口

  1. 创建 TAP 接口:
sudo ip tuntap add dev tap0 mode tap

这将创建一个名为 tap0 的 TAP 接口。

  1. 启用 TAP 接口:
sudo ip link set tap0 up

这将启用 tap0 接口。

步骤 2:创建桥接接口

  1. 创建桥接接口:
sudo ip link add name br0 type bridge

这将创建一个名为 br0 的桥接接口。

  1. 启用桥接接口:
sudo ip link set br0 up

这将启用 br0 桥接接口。

  1. 将物理网络接口添加到桥接接口:
    假设宿主机的物理网络接口为 eth0:
sudo ip link set eth0 master br0

这将把 eth0 接口添加到 br0 桥接接口中。

  1. 将 TAP 接口添加到桥接接口:
sudo ip link set tap0 master br0

这将把 tap0 接口添加到 br0 桥接接口中。

步骤 3:配置 QEMU 启动命令

  1. 启动 QEMU 并配置 TAP 接口:
qemu-system-x86_64 \-m 2048 \-hda /path/to/your/disk.img \-netdev tap,id=net0,ifname=tap0,script=no,downscript=no \-device virtio-net-device,netdev=net0
  • -netdev tap,id=net0,ifname=tap0,script=no,downscript=no:指定 TAP 接口的名称为 tap0,并禁用启动和关闭脚本。
  • -device virtio-net-device,netdev=net0:将虚拟网卡连接到 TAP 接口。

注意事项

  • 权限问题:创建 TAP 接口和配置桥接接口需要管理员权限,因此需要使用 sudo。
  • 网络配置:确保宿主机的网络配置支持桥接模式,特别是防火墙和网络策略。
  • TAP 接口名称:TAP 接口的名称(如 tap0)可以根据需要自定义,但需要在 QEMU 启动命令中保持一致。

通过上述步骤,你可以在 QEMU 中配置 Tap 模式(网桥模式),使虚拟机能够直接访问宿主机的物理网络,并与同一网络中的其他设备通信。

命令示例

        qemu-system-x86_64 \-kernel ${bzImagePath}/bzImage \-initrd initramfs.img \-m 1G -nographic \-virtfs local,path=/mnt/shared,mount_tag=host_share,security_model=none \-net user,id=net0,ipv6=off,hostfwd=tcp::8022-:22 \-net nic,model=virtio \-append "earlyprintk=serial,ttyS0 console=ttyS0 nokaslr"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/19259.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

当时只道是寻常

晴,2025年2月16日 卸载了油管、脸书和 X 手机 app ,太浪费我时间,以后再去经营吧。 教学技能大赛材料需要在明天之内搞定——《教学实施方案》。感觉玄,同部门有经验的老师说至少花一周时间。 只能明天早点继续接着弄&#xff…

Hive之分区表

Hive之分区表 文章目录 Hive之分区表写在前面分区表分区表基本操作引入分区表创建分区表语法加载数据到分区表中查询分区表中数据增加分区删除分区查看分区表有多少分区查看分区表结构 二级分区正常的加载数据分区表和数据产生关联 动态分区开启动态分区参数设置案例实操 写在前…

【线段树模板】

介绍 这段代码看起来是一个基于树结构的数据结构,可能是线段树或者其他类似的数据结构。主要包含了构建数据结构、查询和修改等基本操作的实现函数。以下是对每个函数的简要介绍: pushup(int u): 用于计算结点u的属性。build(int u, int l, int r): 用于…

DeepSeek辅助测试测试一 -- DeepSeek加MaxKB知识库本地部署

文章目录 前言任务拆解最终目标两种技术路径对比知识库检索增强(RAG) 大语言模型 构建知识库加本地部署DeepSeek目前的问题 前言 开工已经两周啦,开始慢慢的进入工作状态了,新的一年大家一起加油吧~ 任务拆解 最终目标 训练一…

Yuque-DL:一款强大的语雀资源下载工具

语雀是一款常用的文档管理工具,但官方未提供直接下载文档的功能。为此,可以使用第三方工具下载语雀文档。以下是使用步骤: 1. 安装工具 GitHub - gxr404/yuque-dl: yuque 语雀知识库下载 安装步骤: 确保已安装 Node.js&#xff…

【Java 面试 八股文】Spring Cloud 篇

Spring Cloud 篇 1. Spring Cloud 5大组件有哪些?2. 服务注册和发现是什么意思?Spring Cloud 如何实现服务注册发现?3. 我看你之前也用过nacos,你能说下nacos与eureka的区别?4. 你们项目负载均衡如何实现的&#xff1f…

国内外网络安全政策动态(2025年1月)

▶︎ 1.国家互联网信息办公室发布《个人信息出境个人信息保护认证办法(征求意见稿)》 1月3日,国家互联网信息办公室发布《个人信息出境个人信息保护认证办法(征求意见稿)》。根据《意见稿》,个人信息出境个…

图论入门算法:拓扑排序(C++)

上文中我们了解了图的遍历(DFS/BFS), 本节我们来学习拓扑排序. 在图论中, 拓扑排序(Topological Sorting)是对一个有向无环图(Directed Acyclic Graph, DAG)的所有顶点进行排序的一种算法, 使得如果存在一条从顶点 u 到顶点 v 的有向边 (u, v) , 那么在排序后的序列中, u 一定…

Anaconda +Jupyter Notebook安装(2025最新版)

Anaconda安装(2025最新版) Anaconda简介安装1:下载anaconda安装包2: 安装anaconda3:配置环境变量4:检查是否安装成功5:更改镜像源6:更新包7:检查 Jupyter Notebook一.Jup…

VS2022中.Net Api + Vue 从创建到发布到IIS

VS2022中.Net Api Vue 从创建到发布到IIS 前言一、先决条件二、创建项目三、运行项目四、增加API五、发布到IIS六、设置Vue的发布 前言 最近从VS2019 升级到了VS2022,终于可以使用官方的.Net Vue 组合了,但是使用过程中还是有很多问题,这里记录一下. 一、先决条件 Visual …

vue点击左边导航,右边出现页面步骤

vue点击左边导航&#xff0c;右边出现页面 步骤 一定要import不然会出错 index.js Course作为Homeview子路由 Homeview加入<Routerview> 点击跳转<RouterLink to> 父Homeview中有RouterView&#xff08;路由出口&#xff0c;跳转至相应路径&#xff09;和Router…

位运算,双指针,二分,排序算法

文章目录 位运算二进制中1的个数题解代码我们需要0题解代码 排序模版排序1题解代码模版排序2题解代码模版排序3题解代码 双指针最长连续不重复子序列题解代码 二分查找题解代码 位运算 1. bitset< 16 >将十进制数转为16位的二进制数 int x 25; cout << bitset<…

【力扣】102.二叉树的层序遍历

AC截图 题目 思路 维持一个队列&#xff0c;每次容纳一层的元素即可。 代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* Tre…

【HarmonyOS Next】图片选择方案

背景 封装一个选择图片和调用拍照相机的按钮&#xff0c;展示api13下选择图片和调用相机&#xff0c;可以使用不申请用户权限的方式&#xff0c;进行图片的选择和修改。但是&#xff0c;目前方案并未包含上传图片保存的功能&#xff0c;仅提供图片选择或者拍照后&#xff0c;图…

25年湖南省考报名流程保姆级教程

2025年湖南省考报名马上就要开始啦&#xff01; 有想要参加湖南省考的姐妹们&#xff0c;可以提前了解一下考试报名流程&#xff0c;熟悉考试报名照上传要求&#xff01; 一、考试时间安排 报名时间&#xff1a;2月17日9:00至2月25日 17:00 审核时间&#xff1a;2月17日9:0…

某大型业务系统技术栈介绍【应对面试】

微服务架构【图】 微服务架构【概念】 微服务架构&#xff0c;是一种架构模式&#xff0c;它提倡将单一应用程序划分成一组小的服务&#xff0c;服务之间互相协调、互相配合&#xff0c;为用户提供最终价值。在微服务架构中&#xff0c;服务与服务之间通信时&#xff0c;通常是…

STM32的DMA解释

一句话解释&#xff1a; DMA的特点就是无需CPU的参与就可以直接访问内存&#xff08;可以直接读取内存的数据&#xff0c;也可以直接传数据给内存&#xff09; 这个内存一般指的是片内SRAM、片内Flash 我举个例子&#xff1a; 有一个温度传感器&#xff0c;它以较高的频率&a…

DIN:引入注意力机制的深度学习推荐系统,

实验和完整代码 完整代码实现和jupyter运行&#xff1a;https://github.com/Myolive-Lin/RecSys--deep-learning-recommendation-system/tree/main 引言 在电商与广告推荐场景中&#xff0c;用户兴趣的多样性和动态变化是核心挑战。传统推荐模型&#xff08;如Embedding &…

网页五子棋——用户模块

目录 用户注册 注册时序图 约定前后端交互接口 后端实现 controller 层接口设计 service 层接口设计 dao 层接口设计 全局异常处理 接口测试 前端实现 register.html css common.css register.css js 注册模块测试 用户登录 登录时序图 约定前后端交互接口 …

深度学习04 数据增强、调整学习率

目录 数据增强 常用的数据增强方法 调整学习率 学习率 调整学习率 ​调整学习率的方法 有序调整 等间隔调整 多间隔调整 指数衰减 余弦退火 ​自适应调整 自定义调整 数据增强 数据增强是通过对训练数据进行各种变换&#xff08;如旋转、翻转、裁剪等&#xff09;&am…