基于Linux的操作系统实验系统第1页第一章操作系统构成实验【实验目的】通过本实验了解一个操作系统的基本组成部件,掌握Linux操作系统的基本操作,并利用实验平台提供的Linux操作系统掌握如何构造一个基本的微型Linux操作系统。【准备知识】1、了解LinuxOS的启动流程。2、了解软盘的结构。3、了解开机载入程序──引导软件LILO。4、了解Linux根文件系统的基本组成。【实验内容】1、Linux操作系统的基本操作。2、通过实验平台提供的Linux操作系统中的make工具重新配置新内核,要求所配置的内核尽量小。3、制作一张启动盘(BootDisk)。要求该启动盘放于一张软盘(floppy)上,用LILO引导器引导,其引导内核为上面新配置的内核,同时考虑它所引导的根文件系统(RootFilesystem)放于第二张软盘上。4、制作一张根文件系统盘(RootFilesystemDisk)。要求该启动盘也能放于一张软盘上,并能通过上面做成的启动盘成功引导并进入系统,从而得到一个微型的Linux操作系统。【实验指导】一.Linux操作系统的基本操作1、启动和登录Linux操作系统。直接加电启动,以root身份登录。2、在基于字符的交互界面上,进行Linux操作系统的常用操作命令操作。常用操作命令有如下一些:(1)关于目录的操作命令:cd、ls、mkdir、rmdir等;(2)关于文件的操作命令:cat、find/which、man/help、vi/vim、cp、dd、rm、基于Linux的操作系统实验系统第2页fdformat等;(3)关于系统管理的操作命令:adduser、addgroup、df、su、ctl+Fn(n=1、2、3、4、5、6)等;(4)安装和卸载文件系统:mount、umount等。3、在Linux操作系统的XWindows环境下,常用应用程序的使用。4、关闭Linux操作系统。二.通过Linux操作系统中的make工具重新配置新内核1、进入到LinuxOS中的/usr/src/linux-n.n.n子目录下(n.n.n为Linux的内核版本号)。2、执行命令makemrproper,其作用是文件归位。3、执行命令makemenuconfig,配置新内核。在此过程中,可根据自己的需要去配置各个选项。不过在配置filesystems时,一定要选上secondextendedfs(Ext2)support和DOSFATfssupport、VFATfssupport之一。4、执行命令makedep。5、执行命令makeclean。6、执行命令makebzImage(如果内核不大则可执行命令makezImage)。7、执行命令makemodules和命令makemodules_install(若配置中加入了模块的支持<选项为M>。)以上命令执行完后,在/usr/src/linux-n.n.n/arch/i386/boot子目录下便可得到新配置的内核bzImage(或zImage)。三.制作一张启动盘(BootDisk)1、mke2fs-i8192-m0/dev/fd0大小(1440)(该大小可小于1440K,根据自己配置的新内核的大小来确定,但不能小于新内核的大小;“–i8192”表示每8192bytes一个node)2、mount/dev/fd0/mnt(装载软盘)3、rm-rf/mnt/lost+found/(此行命令也可不要)4、mkdir/mnt/{boot,dev,etc}5、在/mnt/etc下编写lilo.conf文件:#cd/mnt/etc(进入/mnt/etc目录)#vililo.conf(创建lilo.conf文件)以下为lilo.conf文件的内容:基于Linux的操作系统实验系统第3页boot=/dev/fd0install=/boot/boot.bmap=/boot/mapread-writeramdisk=nnnn(大小,如4096)backup=/dev/nullcompactlinear(此命令可以避免1024柱面问题)image=bzImage(新配置的内核;若裁减的内核<4096K,则可以用zImage。)label=SDLinux(自己可随意命名)root=/dev/fd06、cp-dpR/dev/{fd0,null}/mnt/dev/(此处的–dpR选项一定不可少)7、cp/boot/{boot.b,map}/mnt/boot/8、cp/……/bzImage/mnt/(前面配好了的新内核)9、lilo-v-C/etc/lilo.conf-r/mnt10、rdev-r/mnt/bzImage49152(根文件系统位于第二张盘的第0块)11、umount/mnt(卸载软盘)当然,可以先将lilo.conf文件、bzImage文件等后面需要的文件准备好,再将整个过程用vi/vim工具编写成一个shellscript文件(命名为bootdisk),编写好文件后,再用命令chmod755bootdisk(上面编写的文件名)改变该文件的执行权限以使之成为可执行文件。最后将一个干净的软盘(floppy)插入软驱,执行./bootdisk↙bootdisk盘就完全做好了。上面“rdev–r/mnt/bzImage49152”是设置内核镜像文件中的ramdisk的偏移量(offset)以指出如何确定定位根文件系统。这就需要计算ramdisk的offset,它是通过命令rdev来设置的,其内容的含义如下:bits0-10:Offsettostartoframdisk,in1024bytesblocksbits11-13:unusedbit14:Flagindicatingthatramdiskistobeloadedbit15:Flagindicatingtopromptbeforeloadingrootfs如果位15被设置为1,当系统启动时,会提示把另一张软盘插入软驱中。如果Root盘放在另一张软盘上的话,这个设置是很有必要的。计算offset的方法如下:基于Linux的操作系统实验系统第4页如果制作单一的Boot&Root盘,则压缩的RootFilesystem会被放置在内核之后,从而offset会是第一块freeblock(这个值应该会与KERNEL_BLOCKS相等)。bit14会被设为1,bit15会被设为0。比如,若启动盘根文件系统始于数据块453(十进制),则ramdisk偏移量应为453+214=453+16384=16837。而如果Boot&Root盘有两张,启动盘根文件系统始于第二张盘的block0,则offset为0,bit14会被设为1,bit15也会被设为1。从而ramdisk偏移量应为214+215=16384+32768=49152。四.制作一张根文件系统盘(RootFilesystemDisk)1准备DEVICE为了能够创建一个如上所述的RootFilesystem,必须有一个足够大的设备,能存放压缩之前的所有文件。一般有以下几种选择:(1)使用Rmdisk(即DEVICE=/dev/ram0),时内存被模拟成一台驱动器。(2)使用硬盘Partition,如果你的硬盘有一个未使用且足够大的Partition。(3)使用一个LoopbackDevice,这可以把一个磁盘文件当作一台设备来使用。选择好其中一种(此处我选择最后一种)后,准备设备文件DEVICE用如下命令:ddif=/dev/zeroof=DEVICEbs=1kcount=4096↙(此处4096可根据需要改为其它数)这行指令送出一堆0把DEVICE填满。而用0填满DEVICE是关键的一步,因为RootFilesystem之后会被压缩,所以所有未使用的部分应被用0填满以达到最大的压缩比。无论何时从RootFilesystem删除文件,请记住这个事实。实际上RootFilesystem只是释出(de-allocate)这些blocks,但并没有再把它们填为0。从而如果执行过多的删除与拷贝动作,压缩后的RootFilesystem最后会比必要的大,甚至大出很多。2选择所创建的RootFilesystemDisk的文件系统LinuxKernel能够识别两种直接copy到Ramdisk上的文件系统—Minix和Ext2,其中Ext2性能更好。一般选择Ext2文件系统。使用Ext2,会发现用“–i”选项定义比缺省更多的信息节点非常有用。命令mke2fs在缺省情况下在1.44M的软盘上产生360个信息节点,而使用压缩格式的根文件系统需要更多的信息节点,所以使用如下命令创建根文件系统可以创建2000个信息节点(一般不会用光):mke2fs–m0–i2000DEVICE↙mke2fs将会自动判断设备容量的大小并相应地配置其自身,其中“–m0”参数防止它给root保留空间,这样会腾出更多的有用空间。基于Linux的操作系统实验系统第5页接着挂上这个DEVICE到/mnt:mount–text2–oloopDEVICE/mnt↙如果/mnt这个mount点并不存在,你就应用mkdir在“/”目录下创建一个/mnt。3制作RootFilesystemDisk以下是RootFilesystem最起码有的目录:(1)/dev:里面存放设备文件(Devices),为达成I/O工作所需(2)/bin:被认为是系统一部分的基本二进制执行文件(3)/sbin:重要的(Critical)系统二进制执行文件(binaries)(4)/etc:里面存放系统配置文件(5)/lib:提供run-time支持的共享函数库与函数库装载器(6)/usr:额外的工具程序与应用程序(7)/proc:一个把procfilesystem放置于其下的stub(8)/mnt:维护其他磁盘所用的磁盘挂入点(mountpoint)(9)/var:主要放置系统参数和配置(10)/tmp:临时文件存放点上述的/proc、/mnt、/tmp在RootFilesystem中均为空,只需要用mkdir造出即可。用如下命令以上目录:mkdir/mnt/{dev,bin,sbin,etc,lib,usr,proc,mnt,var,tmp}↙其余的分述如下。3.1子目录/dev/dev目录包含很多特殊的文件,这些文件是给系统上所有设备使用的,这样的目录在每一个Linux系统中都必须有。该目录本身是一个一般的目录,可以用一般的方法,即用mkdir创建,然而其下的特殊文件就必须用mknod命令来创建。不过,可以用cp命令拷贝出现有Linux系统中/dev目录中的内容,再删去不需要的设备文件,方法如下(假设挂靠在/mnt下,以下同):cp–dpR/dev/{arp,atibm,audio,audio1,aztcd,cdu535,cm2060d,console,cua0,cua1,cua2,cua3,cua4,fd0,fd0h1200,fd0h1440,fd0u1440,fd1,fd1h1200,fd1h1440,fd1u1440,full,gscd0,hd*,icmp,inet,inportbm,ip,kmem,lmscd,logibm,loop*,lp0,mcd,mcdx0,mcdx1,mem,nrft0,nst0,nst1,null,par0,par1,基于Linux的操作系统实验系统第6页par2,port,psaux,ptyp*,ram*,rft0,rmt16,rmt8,sbpcd*,scd0,scd1,sg*,sjcd,socket,socksys,sonycd,spx,st0,st1,systty,tape_d,tape_reset,tcp,tty*,udp,unic,zero}/mnt/dev↙其中“-dp”参数确保symboliclinks是以links的方式来copy,而不是copy链结文件所指向的targetfile,同时原本的文件属性也被保留,从而保留了