在QEMU虚拟机和宿主机之间传输文件
在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
-
- 用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“回车,然后输入用户名密码。
-
- 使用端口映射
在开机命中中加入一下参数:
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
更多推荐
所有评论(0)