首页 > 其他分享 >宿主机与qemu虚拟机互传文件

宿主机与qemu虚拟机互传文件

时间:2024-09-09 17:27:49浏览次数:8  
标签:virtio 虚拟机 宿主机 互传 内核 linux qemu

原文:https://zhuanlan.zhihu.com/p/594235031   目录 收起 0 背景 1 宿主机与qemu虚拟机互传文件 2 编写ko demo,做内核测试 推荐阅读

0 背景

当搭建好qemu调试arm64 linux内核的环境(详见同事的文章VSCode+GDB+Qemu调试ARM64 linux内核)后,还有个需求亟待解决,就是宿主机与虚拟机之间互传文件。因为会想写简单的demo,测试代码行为。比如写简单驱动,在宿主机交叉编译,到虚拟机insmod执行。 本文记录该需求实现过程,以及踩过的坑。

linux内核tag :v5.4-rc8
宿主机: WSL Ubuntu20.04

1 宿主机与qemu虚拟机互传文件

搜索了一波发现基本有3类方法:

(1)通过网络。这要求qemu虚拟机配置了网卡。

(2)通过9p VirtFS协议。qemu虚拟机内核需要打开以下配置项

CONFIG_NET_9P=y
CONFIG_NET_9P_VIRTIO=y
CONFIG_9P_FS=y

(3)挂载伪设备。通过回环设备loop device实现。

因为方案(3)最方便,因此首先尝试的是该方案,参考该文章在qemu环境下,实现宿主机和虚拟机之间的数据传输。但由于WSL不支持loop设备挂载,参考该文章wsl下mount -o loop是出现的权限问题,因此放弃。

接下来尝试方案(2),最终该方案走通。

1> 保证qemu虚拟机内核打开了以下配置项:

CONFIG_NET_9P=y
CONFIG_NET_9P_VIRTIO=y
CONFIG_9P_FS=y

2> 如果qemu arm64环境搭建参考的是VSCode+GDB+Qemu调试ARM64 linux内核,需要去掉根文件系统 /etc/fstab中的9p挂载,即 kmod_mount /mnt 9p trans=virtio 0 0 , 记得修改完根文件系统的内容后,需要重新编译根文件系统。

3> qemu启动命令行中增加以下内容 -fsdev local,security_model=passthrough,id=fsdev0,path=/home/haonan/workspace/kernel_study/linux_old1/kmodules -device virtio-9p-device,id=fs0,fsdev=fsdev0,mount_tag=hostshare 其中有几点需要解释:path=后的路径名即为待与虚拟机共享的文件路径,请自行指定;-device后不使用virtio-9p-pci,而是virtio-9p-device,这里感谢文章qemu模拟器错误9pnet_virtio: no channels available for device 我的完整qemu启动命令如下:

qemu-system-aarch64 -m 512M -smp 4 -cpu cortex-a57 -machine virt -kernel arch/arm64/boot/Image -append "rdinit=/linuxrc nokaslr console=ttyAMA0 loglevel=8" -nographic -s  -fsdev local,security_model=passthrough,id=fsdev0,path=/home/haonan/workspace/kernel_study/linux_old1/kmodules -device virtio-9p-device,id=fs0,fsdev=fsdev0,mount_tag=hostshare

4>进入虚拟机后,执行以下命令:

mkdir /mnt/host_files

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

此时虚拟机中的/mnt/host_files路径中的内容,即与主机的/home/haonan/workspace/kernel_study/linux_old1/kmodules内容一致了。

2 编写ko demo,做内核测试

这部分内容可能写出来的价值不大,不过还是有两个坑值得分享。源文件和makefile文件如下:

//test.c文件
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/fs.h>
 #include <linux/init.h>
 #include <asm/io.h>         //含有iomap函数iounmap函数
 #include <asm/uaccess.h>    //含有copy_from_user函数
 #include <linux/device.h>   //含有类相关的处理函数
  
  int init_hello_module(void)
  {
     printk("***************Start***************\n");
     printk("Hello World Init! \n");
      return 0;
  }
  
  void exit_hello_module(void)
  {
     printk("***************End***************\n");
     printk("Hello World Exit! \n");
  }

 module_init(init_hello_module);
 module_exit(exit_hello_module);
 
 MODULE_LICENSE("Dual BSD/GPL");//一般放到最后


#Makefile文件
CROSS_COMPILE:= aarch64-linux-gnu-
ARCH:= arm64
CC:= $(CROSS_COMPILE)gcc
LD:= $(CROSS_COMPILE)ld 
obj-m := test.o

KERNELDIR = /home/haonan/workspace/kernel_study/linux_old1

PWD := $(shell pwd) 

modules: 
     $(MAKE) ARCH=$(ARCH) -C $(KERNELDIR) M=$(PWD) modules 

modules_install: 
     $(MAKE) ARCH=$(ARCH) -C $(KERNELDIR) M=$(PWD) modules_install 

clean:
 rm -f *.o
 rm -f *.symvers
 rm -f *.order
 rm -f *.ko
 rm -f *.mod.c

makefile文件要做点说明,KERNELDIR宏需要根据本地的实际情况,指定到qemu执行的内核源码的路径;()行中一定要加入(MAKE)行中一定要加入ARCH=(MAKE)行中一定要加入ARCH=(ARCH),否则非交叉编译,会遇到奇怪的问题。

make modules编译成功后,将ko文件放到共享文件夹内,在虚拟机内执行:

insmod test.ko

会看到这样的报错:

 

因为该ko不是和内核一起编译出来的,因此过不了kernel的magic number检查。为了本地调试的方便,可调整内核文件如下:

 

重新编译内核后,insmod成功结果如下:

推荐阅读

1.qemu 支持 host 和 guest 中共享目录
2.qemu模拟器错误9pnet_virtio: no channels available for device
3.qemu-kvm虚拟机与宿主机之间简单文件传输方法

标签:virtio,虚拟机,宿主机,互传,内核,linux,qemu
From: https://www.cnblogs.com/zxdplay/p/18404941

相关文章

  • 【Spark+Hive】基于大数据招聘数据分析预测推荐系统(完整系统源码+数据库+开发笔记+详
    文章目录【Spark+Hive】基于大数据招聘数据分析预测推荐系统(完整系统源码+数据库+开发笔记+详细部署教程+虚拟机分布式启动教程)源码获取方式在文章末尾一、 项目概述二、研究意义三、背景四、国内外研究现状五、开发技术介绍六、算法介绍 七、数据库设计八、系统......
  • JVM(Java Virtual Machine,Java 虚拟机)
    JVM(JavaVirtualMachine,Java虚拟机)是Java程序运行的虚拟计算机,它是一个抽象计算机的概念,为Java程序提供了一个与平台无关的执行环境。JVM负责加载Java类文件,执行字节码,并提供运行时环境,包括内存管理、垃圾回收等。JVM主要由四大部分组成:ClassLoader(类加载器):负责加载......
  • 虚拟化数据恢复—EXSI虚拟机误还原快照的数据恢复案例
    虚拟化技术原理是将硬件虚拟化供不同的虚拟机使用,一台物理机上可以有多台虚拟机。人为误操作或者物理机故障会导致上层虚拟机不可用,甚至虚拟机里的重要数据丢失。下面给大家分享一个vmware虚拟化误操作还原快照的数据恢复案例。虚拟化数据恢复环境:一台由物理机迁移到EXSI上面的虚......
  • 热血江湖 2.0单机版稀有资源 + 虚拟机一键端 +GM 工具
    前言今天给大家带来一款单机游戏的架设:热血江湖2.0单机安装。另外:本人承接各种游戏架设(单机+联网)本人为了学习和研究软件内含的设计思想和原理,带了架设教程仅供娱乐。教程是本人亲自搭建成功的,绝对是完整可运行的,踩过的坑都给你们填上了。如果你是小白也没问题,跟着教程走也......
  • 什么是 Java 虚拟机(JVM)?它的主要作用是什么?
    Java虚拟机(JavaVirtualMachine,简称JVM)是运行Java字节码的虚拟机。它是Java平台的一个核心部分,使得Java程序能够在任何安装了JVM的计算机上运行,而无需关心底层的操作系统或硬件差异。JVM为Java应用程序提供了一个安全、高效和可移植的执行环境。JVM的主要作......
  • 虚拟机网络配置大纲
    目录一、ping测试主机之间网络连通性二、修改虚拟网卡ip三、修改IP配置文件四、ifconfig配置网络接口五、修改主机名称和hosts映射文件一、ping测试主机之间网络连通性ping测试主机之间网络连通性pingwww.baidu.comwww.jd.com…二、修改虚拟网卡ip修改虚拟......
  • ubuntu server 虚拟机通过dhcp server总是获得相同的ip
    参考文档:https://knowledge.broadcom.com/external/article/316620/cloned-vm-acquires-the-same-dhcp-ip-addr.html现象:ubuntuserver22.04,通过vmwareplayer创建了一个虚拟机,然后又复制了多个虚拟机1.复制的虚拟机重新生成了mac地址2.三台虚拟机启动后得到的Ip地址相同......
  • [运维][vCenter]VMware vSphere ESXi + vCenter全套软件虚拟机 v6.7详细安装教程
    VMwarevSphere是一套业内最完整最强健的虚拟化平台。创建资源池来管理计算、网络和存储容量与易用性,并提供最高水平的服务,每个应用程序工作负载以最低的总成本。VSphere取决于世界上要求最苛刻的数据中心虚拟化您业务关键型应用程序为空前的灵活性和可靠性。ps:由于文件过......
  • 虚拟机安装Ubuntu16并安装Ros(Kinetic)
    1.虚拟机安装镜像教程参考:https://www.cnblogs.com/su1961117443/p/12419892.html或者https://www.bilibili.com/video/BV1zt411G7Vn?p=2可以安装vmtools,界面显示窗口自适应。2.ROS各个版本注:因为ubuntu是16.04的,所以这里我们安装Kinetic版本的ROS.参考链接:https://blog.csdn.ne......
  • 虚拟机网络模式(桥接、NAT、Host-only)
    虚拟机网络模式(桥接、NAT、Host-only)VMware提供虚拟机服务的时候。不得不提到的就是网络服务。一般情况VMware提供了三种虚拟机的网络模式(桥接、NAT、Host-only),接下来来介绍一下三种模式的区别NAT网络随着Internet的发展和网络应用的增多,IPv4地址枯竭已成为制约网络发展的瓶......