如何将处于虚拟机中的MINIX系统中的文件复制到实体机的LINUX系统中

问题来源

直接在虚拟机MINIX中阅读它的源代码,十分不便,修改调试做移植也非常困难,如果将MINIX系统中的部分源代码拷贝到实体机LINUX中,在LINUX系统中进行修改调试将会非常方便。

然而,MINIX系统是一种比较基本的系统,不能像vmware中使用Windows类系统那样,直接给它装VMTools(因为缺失XWindows,虽然理论上可以给MINIX装个XWindows,但是,太麻烦,而且仅仅为了几个源代码,有点大途小用)。因为vmware的磁盘文件(*.vmdk)不是原始的磁盘数据文件,而且,vmware对据如MINIX这些生僻系统的文件系统的识别性不是太理想,造成用vmware无法挂载MINIX系统到实体主机上,仍然复制不到虚拟机中的MINIX的文件。

所以,我选择使用qemu,qemu的磁盘是原始数据文件,可以在LINUX直接挂载到系统文件树上(只要LINUX能够识别这个文件系统)。

软件和系统准备

  • MINIX系统:minix_R3.2.0-116fcea.iso
  • QEMU: qemu-system-i386

步骤

下载好MINIX的ISO文件,在LINUX中启动qemu,把MINIX装好,命令如下:

qemu-system-i386 -enable-kvm -sdl -cdrom minix_R3.2.0-116fcea.iso -hda minix.img

如果还没有准备minix.img的磁盘镜像,可以用qemu-img create minix.img 2G,或touch minix.img && truncate minix.img --size=2G,来生成它。

MINIX装好后,还需要准备一个备用的虚拟磁盘镜像,假如为a.img。这个磁盘就是用来存储需要的代码文件的,磁盘镜像创建好了以后,不要急着在LINUX中对它分区格式化等,这个操作应该在虚拟机中的MINIX系统里来完成。

minix.imga.img都准备好后,就可以再启动虚拟机来拷贝文件了:

qemu-system-i386 -enable-kvm -sdl -hda minix.img -hdb a.img

这里的minix.img是通过上一步,已经在里面装好了MINIX系统了。

QEMU虚拟机开启后,进入MINIX系统,输入root来登录,到了MINIX系统中,因为MINIX的设备组织方式和LINUX系统有所不同,它的磁盘格式通常为据如c0d0p0等这样的形式,第一个’c’表示’Controller’,数字表示序号,第三个’d’表示’Disk’,后面的’p’表示’Partition’,还有’s’表示’Subpartition’,可以用man dev来查看一下,里面介绍的很详细。

可以用df来判断系统的minix.img所占的是哪个磁盘,这时,虽然a.img已经连到了MINIX系统,但是还没有找到它在哪。首先,排除minix.img所占的哪个盘,假定为c0d0,这种已经挂载了的盘,若用mount来挂载的话,会显示忙而无法挂载,其中光驱一般是c0d2盘,可以试一试挂载c0d1盘,如下:

mount /dev/c0d1 /mnt

注意它报出的是什么错误,如果显示为不存在的设备或地址的错误,就接着试下一个,比如c0d3,直到有个不再报这个错误的磁盘,依照上面的假设,这里要除掉c0d0c0d2,假如c0d1不报这个不存在设备或地址的错误,那就说明a.img就是这个设备。

在MINIX中,用fdisk来给它分区,如下:

fdisk /dev/c0d1

在fdisk工具中,可以用c命令来修改分区信息,修改好后,用w命令来保存这些分区信息到a.img的镜像上。

a.img被分区好后,还要用mkfs来进行文件系统的格式化,注意,这里一定要选择用ext2的文件格式,因为ext2在MINIX和LINUX中,都能较好的支持,命令如下:

/sbin/mkfs.ext2 /dev/c0d1

而后,c0d1就变成了可以挂载的设备了,可以用mount来挂载:

mount /dev/c0d1 /mnt

挂载后,转到/mnt目录,把自己要复制的文件,全部拷贝到这里。完了以后,卸载挂载点,关虚拟机。

现在,回到了LINUX系统中,a.img已经有刚才拷贝的文件了,我们只需要把a.img当作设备来进行挂载即可:

sudo mount -t ext2 a.img /mnt

普通用户前面加sudo来升权,root用户无需加sudo

再转到/mnt中,文件是不是都在这。

这个方法,是QEMU的文件复制通用方法,前提是虚拟机系统和实体主机系统都支持一种相同的文件系统,然后用这个共同的文件系统来作为传输媒介。