无SSH功能的ARM虚拟机如何实现本地文件共享?
实现QEMU ARM虚拟机与本地文件共享的方法
方法1:使用QEMU VirtioFS(推荐,高效便捷)
VirtioFS是QEMU提供的高性能文件共享方案,通过virtio-9p设备实现本地目录与虚拟机的直接映射。
修改QEMU启动命令,添加共享参数:
qemu-system-arm -M ast2600-evb -nic user -nographic -drive file=image.static.mtd,format=raw,if=mtd \ -chardev socket,id=char0,path=/tmp/virtiofs.socket \ -device virtio-9p-pci,fsdev=fsdev0,mount_tag=hostshare \ -fsdev local,id=fsdev0,path=/path/to/your/local/folder,security_model=mapped替换
/path/to/your/local/folder为你要共享的本地目录路径。虚拟机启动后,在系统内执行挂载命令:
# 若未加载9p模块,先加载 modprobe 9pnet_virtio # 创建挂载点并挂载共享目录 mkdir -p /mnt/host mount -t 9p hostshare /mnt/host之后即可在
/mnt/host访问本地共享的文件。
方法2:修改MTD镜像直接嵌入文件
由于你使用的是raw格式的MTD镜像,可以直接挂载到本地修改,将文件嵌入后再启动虚拟机。
制作镜像副本(避免修改原镜像):
cp image.static.mtd image.static.mtd.modified挂载修改后的镜像:
# 加载mtdblock模块 modprobe mtdblock # 创建挂载点 mkdir /tmp/mtd-mount # 挂载镜像(若提示只读,添加rw参数) mount -o loop,rw image.static.mtd.modified /tmp/mtd-mount若镜像包含多分区,需先用
fdisk -l image.static.mtd查看分区偏移量,再通过offset=xxxx参数挂载对应分区。复制本地文件到挂载目录,然后卸载:
cp /path/to/local/file /tmp/mtd-mount/ umount /tmp/mtd-mount使用修改后的镜像启动虚拟机:
qemu-system-arm -M ast2600-evb -nic user -nographic -drive file=image.static.mtd.modified,format=raw,if=mtd
方法3:通过initrd临时传递文件
利用initrd(初始RAM磁盘)将文件临时传入虚拟机,适合单次传输少量文件的场景。
将本地文件打包为cpio格式的initrd镜像:
cd /path/to/local/files find . -print0 | cpio --null -ov --format=newc > ../initrd-share.cpio修改启动命令,加载这个initrd:
qemu-system-arm -M ast2600-evb -nic user -nographic -drive file=image.static.mtd,format=raw,if=mtd -initrd /path/to/initrd-share.cpio虚拟机启动后,挂载initrd并提取文件:
mkdir /tmp/initrd-files mount /dev/ram0 /tmp/initrd-files # 复制文件到系统目录 cp /tmp/initrd-files/your-file /path/in/vm/ umount /tmp/initrd-files
方法4:通过串口用sz/rz传输文件
如果虚拟机系统中已安装lrzsz工具(包含sz/rz命令),可以通过QEMU的串口控制台直接传输文件。
在虚拟机内执行接收命令:
rz在本地QEMU终端中,按
Ctrl+A后再按S,选择要发送的文件,等待传输完成即可。若要从虚拟机传文件到本地,在虚拟机内执行:
sz your-file-name本地终端会自动接收文件。
注:若虚拟机未安装lrzsz,需先通过方法2或3将工具包传入系统并安装。
内容的提问来源于stack exchange,提问作者Nath Acion
相关产品推荐
相关产品推荐

