走进Linux 操作系统


一个文件系统进行安装,而ramdisk则是将内存模拟一个块设备用来存放数据。       使用ramdisk或loop设备相比直接使用物理磁盘操作要快一些,也相对安全,不会损坏物理设备。因此在需要创建文件系统的情况下,很多时候都会使用上面两种虚拟技术创建文件系统,然后在将文件系统转移到物理设备中。       我们采取ramdisk作为文件系统的宿主,在上面制作文件系统,然后拷贝我们前面创建的文件系统内容到其上去。然后观察ramdisk的大小后 (可不是其中文件内容的大小,因为其中还包含文件系统本身格式的一些信息),将整个文件系统统转移到某个文件中去(利用dd命令,由于 dd 命令允许二进制方式读写,所以特别适合在原始物理设备上进行输入/输出,制作整个文件系统的镜像),该文件被称为文件系统镜像。虽然linux对文件后缀没有要求,但这里我们还是习惯以img命名它。    具体做法大该如此:         dd if=/dev/zero of=/dev/ram bs=1k count=20000          mke2fs –m0 /dev/ram 20000          mount /dev/ram /mnt/          cp –av /rootfs/*  /mnt/ram          运行df ,注意1k-blocks一栏中/dev/ram的数值,假定为ramsize          umount /dev/ram           dd if=/dev/ram of=ramlinux.img bs=1k count=ramsize           gzip –9v ramlinux.img     第一步是给 /dev/ram设备清出20m的全零空间,然后格式化/dev/ram设备,页就是将格式信心写入/dev/ram中。       接下来,安装/dev/ram设备到/mnt目录下,再把你创建的文件系统内容全部考进来。完成了这步,你才可以说真正有了一个文件系统(文件系统格式信息+文件系统内容)        然后解载设备后,把设备内容(包含文件系统格式和内容)统统转移到名为ramlinux.img的镜像文件中,  最后压缩镜像文件(压缩后名字为ramlinux.img.gz),开始使用/dev/zero清零/ram设备地目的就是为了提高压缩率,因为压缩算法利用统计规律替换字符,所以统一为零会大大提高gzip的压缩率的。  一般标准系统中ramdisk默认大小为4098字节,你不能建立超过该大小的ram盘。但我们搭建的系统大小超过了4096字节,所以必须扩大ramdisk的大小。最简单的方法是在lilo启动时给ramdisk指定大小,实现系统中大概用到20m大空间,所以在lilo.conf中应该加入“append = “ramdisk_size=20000”这一行,系统启动时就会自动更改ramdisk默认大小了。    系统引导引导过程简述pc打开电源后,先执行rom中bios中的代码,该程序负责将启动设备(软盘、硬盘、光盘)的第一个扇区(0扇区)第一个磁到道的数据载入内存。接着bios执行该扇区中的代码(将内核从启动设备中逐步导入到内存)。所以扇区中要么直接存放操作系统内核,要么存放启动装载程序,比如lilo等,由启动装载程序负责找到内核,装载内核到系统,然后执行内核。   内核被载入内存后的动作上面已经初步介绍了,我们这里要强调的是内核初始化以后紧接着就需要安装根文件系统,那么根文件系统的位置如何确定?(ramdisk size?)  我们必须在创建过程中指定驱动设备,利用命令  rdev filename devicename 设置或在内核原代码目录下的 makefile中修改相关参数,然后编译,因为该信息是备记录在内核中的。  除了跟文件设备外还需要指出根文件系统在宿主设备上的位置,这还需要利用rdev 来实现。该信息也被记录在内核中。(rdev命令很丰富,回忆我们前面谈到的改变ram盘大小的任务都可以通过rdev来修改)  可能很多朋友奇怪自己根本没用过这个命令,这么多年还不照样把系统生级了无数次。的确我们不大使用该命令,因为我们有更酷的工具lilo(当然grub好像现在更流行了),在lilo.conf中的配置如root=* 这些选项其实就是告诉lilo将上述信息写道内核中。  确定了根文件系统位置,将其安装到根目录下,然后找到其中init程序,开始执行系统初始化工作。安装启动镜像  大家多数都应该对?lilo.conf下的intrd=initrd.img.*有印象吧。你知道initrd.img是干嘛用的吗?   这个文件实际上就是个文件系统镜像,有兴趣的话你可以将它登陆到/mnt下,去看看,它毫无疑问是个微缩的文件系统(该文件使用gzip压缩的,所以先要解压才能安装它。(mv initrd.img initrd.img.gz;gunzip initrd.img.gz;mount –o loop initrd.img /mnt)。这个文件里的各目录和我们文件系统是完全一样的,但是由于initrd.img是在系统启动后在ram盘里运行的所以它只包含系统启动时需要的最小命令和库的集合。使用这个萎缩文件系统的目的通常是为了系统启动是尚未安装根文件系统前,用来运行系统以便利用insmod命令装入安装根文件系统需要的模块——比如ext3.o,buslogic.o等(如果根设备是scsi或根文件系统是ext3等,而内核并为将这些功能编译进去,只能以模块方式载入),所以在initrd.img中的lib下会包含需要再入的模块。系统启动后运行intrd.img中的linuxrc脚本来执行模块载入后将根文件系统切换到实际文件系统中(使用pivot_root命令)。  对于我们实验系统来说,因为已经将scsi和ext3等模块直接编译进了内核,所以不必通过initrd.img的途径来进行先期模块载入。因此正常情况下initrd.img是不需要的。但是要知道我们制作的根文件系统镜像是放在源标准系统根文件系统下的。所以要使得系统拍托实际物理设备,进入ram盘工作运行,就需要利用intrd.img镜像文件系统在启动期间将物理盘上根文件系统镜像载入ram盘中,然后进入执行。这个工作我们利用linuxrc脚本来实现,具体地讲就是mount源根文件系统,将试验文件系统镜像解压传送到/dev/ram中,然后umount 源根文件系统。从此系统进入我们的实验文件系统开始运行。  initrd.img也是属于文件系统镜像,它的制作方法和制作根文件系统大通小异。先拷贝需要文件,在编辑脚本(linuxrc),然后制作文件系统镜像。详细过程不再罗索了。  别着急,还有关键一步那就是修改lilo .conf 为实验系统配置启动选项。  boot =实验系统内核  label = ramlinux  initrd = 刚做的initrd镜像  root = /dev/ram  append = “ramdisk_size = 20000”  最后,执行lilo –r /rootfs 。  ok !  有关内核引导请见附件。下载搭建脚本和实验系统系统  虽然搭建系统技术简单,但是过程很繁琐,搞不好会丢三拉四,错误百出。为了节约大家的体力,我们编写了几个小脚本帮助搭建系统。利用这几个脚本大家可以轻松地自动建立实验系统。  我们的制作脚本可分为下面几个部分:  mkrootfs.sh——?收集制作root文件系统所需的所有材料到指定目录。  mkinitrdfs.sh——收集制作initrd镜像所需的所有材料到指定目录。  setup.sh——制作root文件系统镜像和initrd镜像,改写lilo配置文件添加ramlinux启动选项。  连同脚本一同提供给你的还有myboot,myetc 和myroot目录。boot里含有编译好的内核(注意内核是与系统硬件相关的,我的机器是奔三处理器,如果你系统和我不同,那你还是自己在本机上编译试验系统内核吧!不过可以使用我们提供的内核配置文件minsys.config来选择内核功能,编译完成把内核考贝到myboot下就可以了——或修改mkimage.sh脚本,在最后面的地方修改lilo.conf部分,将”boot=×××”中的xxx用你自己编译的内核代替)、模块和内核配置文件minisys.config。etc下包含了供试验系统使用的、已经修改好的配置文件和服务脚本。boot下是两个bash的配置文件--全部脚本和必要配置文件打包为work.tar.gz。   此外,我们也将按上述方法裁减出来的root文件系统(rootfs.tar.gz)和root文件系统镜像ramlinux.img.gz放在网上以供下载,同时也把initrd的内容(initrdfs.tar.gz)和镜像(initrd.img.gz)放在网上。  如果你要添加或删除文件系统中的某些文件,应该展开roofs.tar.gz,然后在rootfs里面修改,不要把文件系统镜像文件(img文件)以loop方式安装后进行修改,因为我们曾经用zero设备填充过文件系统,所以如果新添加或删除某些内容,可能会破坏里面的一些数据对齐,系统反映给你的就可能会有类似于“bus error”等一类莫名奇妙的错误。  如果你按要求解开了rootfs.tar.gz和initrdfs.tar.gz,那么执行setup.sh既可生成对应的镜像文件ramlinux.img.gz和initrd.img.gz,并会在lilo中添加好对应于试验系统的选项。step by step——享受你的操作系统吧  从启动菜单中选择ramlinux开始运行吧!等等,要输入管理员密码?是的,我们是从原有的系统中裁减的,所以密码自然会继承下来。(如果你用的是我做好的系统,那么用户名自然是root,密码 threeyear)      看见了吗,亲手打造的操作系统已经快步向你走来,有成就感吗?享受你的杰作吧!

                                          

COPYRIGHT(C) 2011 厦门永宏亚得机电科技有限公司版权所有(闽ICP备05025945号) ALL RIGHTS RESERVED?

电话: 0592-5190891 传真: 0592-5190720 E-Mail: E-mail:yade8895@163.com
地址: 厦门市海沧区兴港六里17号2607室 邮编:361009 联系人:翟先生