在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
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐