在QEMU虚拟机和宿主机之间传输文件

文章介绍了在QEMU虚拟机和宿主机之间传输文件的三种方法:1)使用共享文件夹,通过-virtfs选项挂载;2)利用网络传输,如SSH,进行文件拷贝;3)创建ISO映像作为媒介。每种方法都有其适用场景和操作步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在QEMU虚拟机和宿主机之间传输文件有多种方法,以下是一些常见的方法:

1. 使用共享文件夹(推荐)

首先,在宿主机上创建一个共享目录,然后使用QEMU的-virtfs选项将其挂载到虚拟机上。

  • 在宿主机上创建一个共享目录,例如:

    mkdir /mnt/shared
    
  • 将文件放入此共享目录。

  • 启动QEMU时,将共享目录挂载为一个虚拟文件系统,例如:

    qemu-system-arm ... -virtfs local,path=/mnt/shared,mount_tag=host0,security_model=passthrough,id=host0
    

    其中,“-virtfs”选项指定了共享文件夹的参数,“local”表示共享文件夹是本地文件夹,“path”指定了共享文件夹的路径,“mount_tag”指定了共享文件夹在虚拟机中的挂载点,“security_model”指定了安全模型,“id”是共享文件夹的标识符。

  • 在虚拟机内部,挂载共享文件夹,例如:

    mkdir -p /mnt/shared
    sudo mount -t 9p -o trans=virtio,version=9p2000.L host0 /mnt/shared
    

    其中,“-t”选项指定了文件系统类型,“9p”是QEMU支持的文件系统类型,“trans”指定了传输协议,“version”指定了文件系统版本,“host0”是共享文件夹的标识符,“/mnt/shared”是共享文件夹在虚拟机中的挂载点。

    此时,/mnt/shared目录将指向宿主机上的/mnt/shared目录,可以在两者之间传输文件。

    tips:每次重启QEMU虚拟机都要重新挂载,可以把上述 mount 命令做成开机自启。

2. 使用网络传输文件(推荐)

通过SSH或其他网络传输工具(如FTP、HTTP等),在宿主机和虚拟机之间传输文件。首先需要在虚拟机上安装SSH服务器(如果没有的话),然后通过虚拟机的IP地址(例如,使用-user-net选项配置的虚拟机网络)访问它。

推荐使用scp命令,或者将QEMU中的22端口映射到宿主机的其他端口上,方便使用Xftp简化操作。

  • 安装SSH服务器:

    # 安装openssh-server
    sudo apt-get install openssh-server
    # 查看状态
    sudo systemctl status ssh
    # 开机自启
    sudo systemctl enable ssh
    
  • 编辑 /etc/ssh/sshd_config 文件,解除以下内容的注释

    Port 22
    ListenAddress 0.0.0.0
    ListenAddress ::
    PermitRootLogin yes
    PasswordAuthentication yes
    

    重新加载配置文件

    sudo service sshd reload
    
  • 获取IP地址:

    ip addr show
    
    1. 用scp命令
    scp file.txt username@<VM_IP_address>:/path/to/destination
    

​ 更多scp命令可查看 https://www.runoob.com/linux/linux-comm-scp.html

​ tips:第一次使用SSH连接到一个新的主机时会生成一个SHA256算法的公钥,用于防止"中间人攻击"。输入”yes“回车,然后输入用户名密码。

    1. 使用端口映射

    在开机命中中加入一下参数:

    qemu-system-arm ... -net user,hostfwd=tcp::5678-:22 -net nic
    

    此命令将QEMU虚拟机中的22端口映射到了宿主机的5678端口。

    就可以使用Xshell或者Xftp来远程连接了。

3. 使用ISO映像

  • 首先,创建一个ISO映像,其中包含要传输的文件,例如:

    genisoimage -o data.iso /path/to/files
    
  • 将ISO映像加载到虚拟机中,例如:

    qemu-system-arm ... -cdrom data.iso
    
  • 在虚拟机内部,挂载ISO映像,并访问其中的文件,例如:

    mkdir -p /mnt/iso
    mount /dev/cdrom /mnt/iso
    

    现在,在虚拟机的/mnt/iso目录中,可以访问宿主机中的文件。通过挂载ISO,可以将宿主机上的文件传输到虚拟机。但是,如果要将虚拟机上的文件传输回宿主机,需要创建一个新ISO映像。

根据实际应用场景和需求选择合适的方法。

最后附上我的开机命令:

qemu-system-aarch64 \
    -m 4096 \
	-cpu cortex-a57 \
	-smp 4 \
	-M virt \
	-bios QEMU_EFI.fd \
	-nographic \
	-device virtio-scsi-device \
	-drive if=none,file=ubuntuimg.img,format=raw,index=0,id=hd0 \
	-device virtio-blk-device,drive=hd0 \
	-virtfs local,path=/mnt/shared,mount_tag=host0,security_model=passthrough,id=host0 \
	-net user,hostfwd=tcp::5678-:22 \
	-net nic
### 文件传输方法概述 在宿主机QEMU虚拟机之间进行文件传输可以通过多种方式进行,每种方式都有其特点适用场景。 #### 方法一:使用共享文件夹(推荐) 通过挂载的方式可以在宿主机虚拟机间建立一个共享目录。这种方式简单易用,并且不需要额外的网络配置[^2]。 ```bash # 在宿主机上创建并格式化镜像文件 dd if=/dev/zero of=/opt/share.img bs=1M count=200 mkfs.ext4 /opt/share.img # 创建挂载点并将镜像文件挂载到该位置 mkdir /tmp/share mount -o loop /opt/share.img /tmp/share ``` 当启动QEMU-KVM时,需指定`-drive file=/opt/share.img,format=raw`参数来附加此磁盘映像至虚拟机内部。接着,在虚拟机中同样执行挂载操作: ```bash sudo mount /dev/sdb /mnt/shared_folder/ ``` 这样便可在两个环境间自由访问位于`/mnt/shared_folder/`路径下的资源[^3]。 #### 方法二:基于固定IP地址通信 对于某些特定应用场景而言,利用已知静态IP(如10.0.2.2)可简化跨平台数据交互过程。只需确保双方均能解析对方地址,则可通过SCP(Secure Copy Protocol)或其他FTP工具完成资料传递任务[^4]。 #### 方法三:借助网络桥接技术 如果希望更灵活地管理连接关系或支持多台设备间的协作工作流,则可以考虑构建一座连通内外网路接口的桥梁结构。这通常涉及到调整防火墙策略以及设置合适的路由规则以保障安全性效率[^5]。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值