[文件系统]制作可运行的Linux-0.11

一、格式化硬盘
我们要将创建的256MB硬盘Image文件hdc.img进行分区并创建MINIX文件系统,将在这个Image文件中创建1个分区,并且建立成MINIX文件系统。
(1)将hdc.img做为从盘挂到Bochs下已有的模拟系统中(例如SLS Linux):
编辑SLS Linux系统的Bochs配置文件bochsrc.bxrc。在ata0-master一行下加入我们的硬盘Image文件的配置参数行:
ata0-slave:type=disk, path=..\Linux-0.11\hdc.img, cylinders=520, heads=16, spt=63
(2)在Bochs下运行SLS Linux
(3)利用fdisk命令在hdc.img文件中建立1个分区。
由于SLS Linux默认建立的分区类型是支持MINIX2.0文件系统的81类型(Linux/MINIX),因此需要使用fdisk的t命令把类型修改成80(Old MINIX)类型。这里请注意,我们已经把hdc.img挂接成SLS Linux系统下的第2个硬盘。按照Linux 0.11对硬盘的命名规则,该硬盘整体的设备名应为/dev/hd5(参见下面表)。但是从Linux 0.95版开始硬盘的命名规则已经修改成目前使用的规则,因此在SLS Linux下第2个硬盘整体的设备名称是/dev/hdb


硬盘逻辑设备号 逻辑设备号 对应设备文件 
0x300 /dev/hd0 代表整个第1个硬盘
0x301 /dev/hd1 表示第1个硬盘的第1个分区
0x302 /dev/hd2 表示第1个硬盘的第2个分区
0x303 /dev/hd3 表示第1个硬盘的第3个分区
0x304 /dev/hd4 表示第1个硬盘的第4个分区
0x305 /dev/hd5 代表整个第2个硬盘
0x306 /dev/hd6 表示第2个硬盘的第1个分区
0x307 /dev/hd7 表示第2个硬盘的第2个分区
0x308 /dev/hd8 表示第2个硬盘的第3个分区
0x309 /dev/hd9 表示第2个硬盘的第4个分区

5. 请记住该分区中数据块数大小(这里是65015),在创建文件系统时会使用到这个值。当分区建立好后,按照通常的做法需要重新启动一次系统,以让SLS Linux系统内核能正确识别这个新加的分区。
6. 再次进入SLS Linux模拟系统后,我们使用mkfs命令在刚建立的第1个分区上创建MINIX文件系统。命令与信息如下所示。这里创建了具有64000个数据块的分区(一个数据块为1KB字节)。
mkfs /dev/hdb1 64000

至此,我们完成了在hdc.img文件的第1个分区中创建文件系统的工作。

二、将软盘内容复制到硬盘
(1)用软盘启动:
先放入boot盘,再放入root盘
(2)若还想格式化hdc.img:
mkfs /dev/hd1 64000
(3)把软盘上的根文件系统复制到硬盘上
[/mnt]#for i in bin dev etc usr tmp
> do
> cp +recursive +verbose /$i $i
done

三、使用硬盘Image上的根文件系统
一旦你在硬盘Image文件上建立好文件系统,就可以让Linux 0.11以它作为根文件系统启动。这通过修改引导盘bootimage-0.11文件的第509、510字节的内容就可以实现。请按照以下步骤来进行。
1. 首先复制bootimage-0.11和bochsrc.bxrc两个文件,产生bootimage-0.11-hd和bochsrc-hd.bxrc文件。
2. 编辑bochsrc-hd.bxrc配置文件。把其中的'floppya:'上的文件名修改成'bootimage-0.11-hd',并存盘。
3. 用UltraEdit或任何其它可修改二进制文件的编辑器(winhex等)编辑bootimage-0.11-hd二进制文件。修改第509、510字节(原值应该是00、00)为01、03,表示根文件系统设备在硬盘Image的第1个分区上。然后存盘退出。如果把文件系统安装在了别的分区上,那么需要修改前1个字节以对应到你的分区上。

四、在Linux 0.11系统上编译0.11内核
目前作者已经重新组建了一个带有gcc 1.40编译环境的Linux 0.11系统软件包。该系统设置成在Bochs仿真系统下运行,并且已经配置好相应的bochs配置文件。该软件包可从下面地址得到。
http://oldlinux.org/Linux.old/bochs/linux-0.11-devel-040329.zip
在/usr/src/linux目录下键入'make'命令即可编译Linux 0.11内核源代码,并生成引导启动映象文件Image。若需要输出这个Image文件,可以首先备份bootimage-0.11-hd文件,然后使用下面命令就会把bootimage-0.11-hd替换成新的引导启动文件。直接重新启动Bochs即可使用该新编译生成的bootimage-0.11-hd来引导系统。
[/usr/src/linux]# make
[/usr/src/linux]# dd bs=8192 if=Image of=/dev/fd0


=====================================================================================



14.1内核引导启动+根文件系统组成的集成盘
本节内容主要说明制作由内核引导启动映像文件和根文件系统组合成的集成盘映像文件的制作原理和方法。主要目的是了解Linux 0.11内核内存虚拟盘工作原理,并进一步理解引导盘和根文件系统盘的概念。加深对kernel/blk_drv/ramdisk.c程序运行方式的理解。在制作这个集成盘之前,我们需要首先下载或准备好以下实验软件:

http://oldlinux.org/Linux.old/bochs/linux-0.11-devel-040923.zip
http://oldlinux.org/Linux.old/images/rootimage-0.11-for-orig

linux-0.11-devel是运行在Bochs下的带开发环境的Linux 0.11系统,rootimage-0.11是1.44MB软盘映像文件中的Linux 0.11根文件系统。后缀'for-orig'是指该根文件系统适用于未经修改的Linux 0.11内核源代码编译出的内核引导启动映像文件。当然这里所说的“未经修改”是指没有对内核作过什么大的改动,因为我们还是要修改编译配置文件Makefile,以编译生成含有内存虚拟盘的内核代码来。

14.1.1集成盘制作原理
通常我们使用软盘启动Linux 0.11系统时需要两张盘(这里“盘”均指对应软盘的Image文件):一张是内核引导启动盘,一张是基本的根文件系统盘。这样必须使用两张盘才能引导启动系统来正常运行一个基本的Linux系统,并且在运行过程中根文件系统盘必须一直保持在软盘驱动器中。而我们这里描述的集成盘是指把内核引导启动盘和一个基本的根文件系统盘的内容合成制作在一张盘上。这样我们使用一张集成盘就能引导启动Linux 0.11系统到命令提示符状态。集成盘实际上就是一张含有根文件系统的内核引导盘。
为了能运行集成盘系统,该盘上的内核代码中需要开启内存虚拟盘(RAMDISK)的功能。这样集成盘上的根文件系统就能被加载到内存中的虚拟盘中,从而系统上的两个软盘驱动器就能腾出来用于加载(mount)其他文件系统盘或派其他用途。下面我们再详细介绍一下在一张1.44MB盘上制作成集成盘的原理和步骤。
14.1.1.1引导过程原理
Linux 0.11的内核在初始化时会根据编译时设置的RAMDISK选项判断在系统物理内存是否要开辟虚拟盘区域。如果没有设置RAMDISK(即其长度为0)则内核会根据ROOT_DEV所设置的根文件系统所在设备号,从软盘或硬盘上加载根文件系统,执行无虚拟盘时的一般启动过程。
如果在编译Linux 0.11内核源代码时,在其linux/Makefile配置文件中定义了RAMDISK的大小,则内核代码在引导并初始化RAMDISK区域后就会首先尝试检测启动盘上的第256磁盘块(每个磁盘块为1KB,即2个扇区)开始处是否存在一个根文件系统。检测方法是判断第257磁盘块中是否存在一个有效的文件系统超级块信息。如果有,则将该文件系统加载到RAMDISK区域中,并将其作为根文件系统使用。从而我们就可以使用一张集成了根文件系统的启动盘来引导系统到shell命令提示符状态。若启动盘上指定磁盘块位置(第256磁盘块)上没有存放一个有效的根文件系统,那么内核就会提示插入根文件系统盘。在用户按下回车键确认后,内核就把处于独立盘上的根文件系统整个地读入到内存的虚拟盘区域中去执行。这个检测和加载过程见图14-6所示。

图14-7 集成盘上代码结构


14.1.1.2集成盘的结构
对于Linux 0.1x内核,其代码加数据段的长度很小,大约在120KB左右。在开发Linux系统初始阶段,即使考虑到内核的扩展,Linus还是认为内核的长度不会超过256KB,因此在1.44MB的盘上可以把一个基本的根文件系统放在启动盘的第256个磁盘块开始的地方,组合形成一个集成盘片。一个添加了基本根文件系统的引导盘(即集成盘)的结构示意图见图14-7所示。其中文件系统的详细结构请参见文件系统一章中的说明。


如上所述,集成盘上根文件系统放置的位置和大小主要与内核的长度和定义的RAMDISK区域的大小有关。Linus在ramdisk.c程序中默认地定义了这个根文件系统的开始放置位置为第256磁盘块开始的地方。对于Linux 0.11内核来讲,编译产生的内核Image文件(即引导启动盘Image文件)的长度在120KB左右,因此把根文件系统放在盘的第256磁盘块开始的地方肯定没有问题,只是稍许浪费了一点磁盘空间。还剩下共有1440 - 256 = 1184 KB空间可用来存放根文件系统。当然我们也可以根据具体编译出的内核大小来调整存放根文件系统的开始磁盘块位置。例如我们可以修改ramdisk.c第75行block的值为130把存放根文件系统的开始位置往前挪动一些以腾出更多的磁盘空间供盘上的根文件系统使用。
 

14.1.2集成盘的制作过程
在不改动内核程序ramdisk.c中默认定义的根文件系统开始存放磁盘块位置的情况下,我们假设需要制作集成盘上的根文件系统的容量为1024KB(最大不超过1184KB)。制作集成盘的主要思路是首先建立一个1.44MB的空的Image盘文件,然后将新编译出的开启了RAMDISK功能的内核Image文件复制到该盘的开始处。再把定制的大小不超过1024KB的文件系统复制到该盘的第256磁盘块开始处。具体制作步骤如下所示。
14.1.2.1重新编译内核
重新编译带有RAMDISK定义的内核Image文件,假定RAMDISK区域设置为2048KB。方法如下:
在Bochs系统中运行linux-0.11-devel系统。编辑其中的/usr/src/linux/Makefile文件,修改以下设置行:

RAMDISK = -DRAMDISK = 2048
ROOT_DEV = FLOPPY

然后重新编译内核源代码生成新的内核Image文件。

make clean; make

14.1.2.2制作临时根文件系统
制作大小为1024KB的根文件系统Image文件,假定其文件名为rootram.img。制作方法如下:
(1) 利用本章前面介绍的方法制作一张大小为1024KB的空Image文件。假定该文件的名称是rootram.img。可使用在现在的Linux系统下执行下面命令生成:

dd bs=1024 if=/dev/zero of=rootram.img count=1024

(2) 在Bochs系统中运行linux-0.11-devel系统。然后在Bochs主窗口上把驱动盘分别配置成:A盘为rootimage-0.11-orign;B盘为rootram.img。
(3) 使用下面命令在rootram-0.11盘上创建大小为1024KB的空文件系统。然后使用下列命令分别把A盘和B盘加载到/mnt和/mnt1目录上。若目录/mnt1不存在,可以建立一个。

mkfs /dev/fd1 1024
mkdir /mnt1
mount /dev/fd0 /mnt
mount /dev/fd1 /mnt1

(4) 使用cp命令有选择性地复制/mnt上rootimage-0.11-orign中的文件到/mnt1目录中,在/mnt1中制作出一个根文件系统。若遇到出错信息,那么通常是容量已经超过了1024KB了。利用下面的命令或使用本章前面介绍的方法来建立根文件系统。
首先精简/mnt/中的文件,以满足容量不要超过1024KB的要求。我们可以删除一些/bin和/usr/bin下的文件来达到这个要求。关于容量可以使用df命令来查看。例如我选择保留的文件是以下一些:

[/bin]# ll
total 495
-rwx--x--x   1 root     root        29700 Apr 29 20:15 mkfs
-rwx--x--x   1 root     root        21508 Apr 29 20:15 mknod
-rwx--x--x   1 root     root        25564 Apr 29 20:07 mount
-rwxr-xr-x   1 root     root       283652 Sep 28 10:11 sh
-rwx--x--x   1 root     root        25646 Apr 29 20:08 umount
-rwxr-xr-x   1 root     4096       116479 Mar  3  2004 vi
[/bin]#[/bin]# cd /usr/bin
[/usr/bin]# ll
total 364
-rwxr-xr-x   1 root     root        29700 Jan 15  1992 cat
-rwxr-xr-x   1 root     root        29700 Mar  4  2004 chmod
-rwxr-xr-x   1 root     root        33796 Mar  4  2004 chown
-rwxr-xr-x   1 root     root        37892 Mar  4  2004 cp
-rwxr-xr-x   1 root     root        29700 Mar  4  2004 dd
-rwx--x--x   1 root     4096        36125 Mar  4  2004 df
-rwx--x--x   1 root     root        46084 Sep 28 10:39 ls
-rwxr-xr-x   1 root     root        29700 Jan 15  1992 mkdir
-rwxr-xr-x   1 root     root        33796 Jan 15  1992 mv
-rwxr-xr-x   1 root     root        29700 Jan 15  1992 rm
-rwxr-xr-x   1 root     root        25604 Jan 15  1992 rmdir
[/usr/bin]#

然后利用下列命令复制文件。另外,可以按照自己的需要修改一下/etc/fstab和/etc/rc文件中的内容。

cd /user
for i in bin dev etc usr tmp
do
cp +recursive +verbose /$i $i
done
sync

(5) 使用umount命令卸载/dev/fd0和/dev/fd1上的文件系统,然后使用dd命令把/dev/fd1中的文件系统复制到Linux-0.11-devel系统中,建立一个名称为rootram-0.11的根文件系统Image文件:

dd bs=1024 if=/dev/fd1 of=rootram-0.11 count=1024

此时在Linux-0.11-devel系统中我们已经有了新编译出的内核Image文件/usr/src/linux/Image和一个简单的容量不超过1024KB的根文件系统映像文件rootram-0.11。

14.1.2.3建立集成盘
组合上述两个映像文件,建立集成盘。修改Bochs主窗口A盘配置,将其设置为前面准备好的1.44MB名称为bootroot-0.11的映像文件。然后执行命令:

dd bs=8192 if=/usr/src/linux/Image of=/dev/fd0
dd bs=1024 if=rootram-0.11 of=/dev/fd0 seek=256
sync;sync;sync;

其中选项bs=1024 表示定义缓冲的大小为1KB。seek=256 表示写输出文件时跳过前面的256个磁盘块。然后退出Bochs系统。此时我们在主机的当前目录下就得到了一张可以运行的集成盘映像文件bootroot-0.11


14.1.3运行集成盘系统
先为集成盘制作一个简单的Bochs配置文件bootroot-0.11.bxrc。其中主要设置是:

floppya: 1_44=bootroot-0.11

然后用鼠标双击该配置文件运行Bochs系统。此时应有如图14-8所示显示结果。

为了方便大家做实验,也可以从下面网址下载已经做好并能立刻运行的集成盘软件:

http://oldlinux.org/Linux.old/bochs/bootroot-0.11-040928.zip




你可能感兴趣的:(linux)