因此,这个时候就需要为MD设备准备初始镜像文件,最直接的方法是首先用确定的大小创建MD设备,初始化文件系统,安装上文件系统并复制必要的数据,然后在卸载文件系统,使用dd命令直接操作虚拟磁盘设备,将数据复制到一个镜像文件中。但是由于MD设备的大小比较不容易改变,因此这种方法并不灵活。此外,由于MD设备被作为一个虚拟的物理磁盘被系统处理,系统对它的处理事实上是和真实物理磁盘设备的处理方法也是一样的,因此也可以使用物理磁盘,创建文件系统并复制其镜像的方法来获得镜像数据。
使用虚拟磁盘MD和物理磁盘都可以得到镜像文件,但是这两种方法都不是很灵活,最好的方法是可以直接修改镜像文件本身。事实上VN设备正是用作这个处理任务,它能使用镜像文件作为虚拟磁盘的存储区域,使用VN设备创建并修改镜像文件的数据是非常适合的。因此在大小一致的条件下,就可以直接将VN设备的镜像文件复制到MD设备上,然后将MD设备安装到系统中,就可以访问到具体数据。
因此,使用VN设备预先定制好MD设备使用的镜像文件是最常用、最方便的方法。系统载入镜像文件的过程应该在启动之前完成,以便系统在启动过程中能够配置好该MD设备。事实上,镜像文件是由Boot Loader载入的,作为MD设备的缺省数据。当然,另一种选择是直接将镜像文件写入内核文件中,使得镜像数据和内核一起载入。将镜像文件写入内核的方式需要改动内核,并且写入之后就不容易改变镜像文件中的数据,因此,目前这种方式很少被用到。
为了将镜像文件写入内核,需要设置内核选项MD_ROOT_SIZE,需要指定它的尺寸大于镜像文件的尺寸,以便系统在内核中保留出大于镜像文件的自由空间,以使得写入的数据不至于覆盖内核中有用的数据。这个参数和MD_NSECT是不同的,但它也为一个虚拟磁盘预保留了空间。如果是使用Boot Loader来载入镜像文件,就不能设置这个选项,因为这将导致系统在启动时初始化多个虚拟磁盘,而只有第一个虚拟磁盘md0才是可以启动的。
当然,一个能够将MD设备作为启动根文件系统的内核,除了标准的md和MFS选项之外,还需要"options MD_ROOT"的设置选项,以保证内核搜索MD设备的作为根文件系统。这个设置也可以写作"MFS_ROOT",以便和早期的FreeBSD系统兼容,早期的FreeBSD系统没有使用md伪设备,而是使用第二种直接写入内核的MFS文件系统作为根文件系统。
几种不同方式的比较
无论是MFS,还是VN设备和MD设备,它们对数据的处理方式其实是非常类似的,MFS就是直接在内存中开辟一个UFS格式的区域,用作文件系统,这个区域其实就是一个虚拟磁盘镜像。而VN设备和MD设备是先申请内存空间,然后采用标准的文件系统工具进行处理,因此更为灵活。
最为重要的一点区别实际上是它们获得自由内存空间的方式不同,MFS和VN实际上是使用动态的方式申请虚拟内存,而md设备实际上是在系统启动之前已经分配完毕,是一种静态的方式,其实是通过内核申请空间的方式MALLOC分配的。这样就导致MFS和VN设备申请的内存是按照虚拟内存的方式进行处理,就是说它们是基于交换空间的,在物理内存不够的情况下将被自然的交换到磁盘设备中。而MD设备使用的内存是内核申请的,因而位于内核空间中,主要占用物理内存。
这两种不同的使用内存的方式,造成了这几种不同的内存文件系统的不同用途和使用限制,MFS和VN可以使用更多的交换空间,因而容量更大,使用更灵活,但在高负载的情况下由于系统交换,仍然会造成磁盘访问。虽然对于md设备,这种现象理论上不会发生,但md设备的大小是受到物理内存的限制的,占用的是宝贵的内核空间,因此主要用来处理比如启动镜像这样的情况,而很少用来处理其他任务。
除了这些文件系统之外,FreeBSD上事实上还有其他的一些内存文件系统,例如V9FS,这种文件系统的特征是一个纯粹的文件系统,没有涉及磁盘的那些扇区、块等概念等等,这些文件系统目前还不是很完善,也不是标准系统的一部分。
对于内存文件来讲,一些特色其实是非常有意义的,例如文件系统的压缩技术,由于它能够减少内存空间的大小,因此对于内存文件系统是非常有意义的,可以用于嵌入式系统等领域。虽然有人在这个方面曾经做过努力,但目前这种特性在FreeBSD下还不能直接得到。
FreeBSD 7.0中内存文件系统
当对这几种不同的文件系统进行分析比较之后,可以发现它们存在很多种共性,例如MFS和vn设备对于内存的使用方式是相同的,而vn设备和md设备由于都是虚拟磁盘,因此其内容是相同的,这也导致了可以使用vn设备为md设备创建镜像文件。因此,完全可以将这三种不同的使用内存文件系统的方式合并起来,使设置和操作更为简单易用。
事实上,之所以存在这几种不同的内存文件系统,源于FreeBSD的历史开发过程。最早的内存文件系统显然是MFS,但由于不存在虚拟磁盘,存在种种不统一和协调的地方,因此后来就设计了MD设备。VN设备则与此无关,它最初就是为了文件作为存储设备而设计的,但使用内存作为存储显然也十分直接和简单。
因此,在最新的FreeBSD 7.0版本中,这些内存文件系统的设置都统一起来,特别是将vn设备和md设备的功能都统一到新版本的伪设备md中。并且在FreeBSD 7.0下,设备的创建和内存的分配更为方便,不象在4.x之前,系统中的配置选项只能指定一定数量的虚拟磁盘设备(缺省是一个设备)。而且,由于FreeBSD 7.0使用了DEVFS特色,设备文件的创建是自动进行的,不再需要手工使用MAKEDEV命令创建设备文件入口。
例如,需要从虚拟内存中申请内存创建内存文件系统的时候,就需要执行md设备的控制程序mdconfig:
- # mdconfig -a -t swap -s 30M
这就会在虚拟内存中申请30M空间,并创建虚拟磁盘,使用的虚拟设备为第一个md设备md0,如果系统中的md0设备已经被占用,那么mdconfig就依序向后寻找下一个空余的md设备,并创建它。由于mdconfig能自动创建新的设备,这样就解决了在内核配置文件指定伪设备数量的问题。
也可以使用-u指定使用的md伪设备的序号,例如下列命令将创建md10,并使用它作为虚拟磁盘设备:
- # mdconfig -a -t swap -s 30M -u 10
上面的命令都是使用虚拟内存空间作为数据存储空间,是由swap参数指定的。同样,使用mdconfig也能从内核空间中创建虚拟磁盘,此时-t指定的存储类型参数为malloc,这告诉内核使用内核的MALLOC方法申请内存。
- # mdconfig -a -t malloc -s 30M
如非注明则为本站原创文章,欢迎转载。转载请注明转载自:moon's blog