走进Linux 操作系统
| ; 文件系统基本要求 linux文件系统的结构上文已经给出,我们这里着手搭建一个精简的文件系统,它包含最基本的目录以及文件,配置文件也尽量修改简洁明了。下面列出文件系统必须包含的内容。 文件系统最小需要包含/dev 、/proc、/bin 、/sbin 、etc 、/lib 、/usr 、/tmp 等目录 需要一组基本命令 支持上述命令的运行库函数,其中也包括编译内核产成的模块 必须的设备文件 一些必要的配置文件我们要做地就是按部就班地生成和拷贝以上内容,唯一地要就就是你要够心细。创建根文件系统内容 我们先来建立一个将包含根文件系统内容的新目录“rootfs”(mkdir /rootfs),然后开始在其中生成(拷贝)根文件系统需要地所有目录和文件。 第一步当然是在rootfs目录下建立根目录下地必要地子目录啦,用一行命令就可完成mkdir dev,proc,bin,etc,lib,usr,tmp,sbin 。 第二步拷贝你需要的命令。比如你需要 ls 命令,你先确定它在系统中的位置whereis ls (发现在/bin/ls目录下),然后将该命令拷贝到你工作目录下相同的目录结构下 cp /bin/ls /workdir/bin/ls,但是仅仅拷贝命令文件还不够,还必须考被该命令所用到的动态共享库文件。如何发现命令用到了那些动态共享库呢?很简单,利用ldd /bin/ls 可以察看命令使用的共享库,显示在输出右列的就是被用到的共享库文件(名字中有so)。 比如在我的系统上,该操作输出为: libtermcap.so.2 => /lib/libtermcap.so.2 (0x4001f000) libacl.so.1 => /lib/libacl.so.1 (0x40023000) libc.so.6 => /lib/libc.so.6 (0x40029000) libattr.so.1 => /lib/libattr.so.1 (0x40149000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) 我们要做的是将命令要用到的库文件按照它的目录结构拷贝到我们工作目录下的/lib或/lib/i386。(用户所用到的命令多集中在/bin和/sbin下,另外一些脚本会用到一些出现在/usr/bin和/usr/sbin下的文件,如果你要使用这些脚本,不用说这些命令和它们要用的库都不能少)。但是这些文件并非我们实际想要的,它门只是实际库文件的一个符号链接,系统只所以要使用符号链接,是为了便于库文件升级换代时不影响使用它的应用程序。因此我们单单拷贝符号链接是没有意义,同时也必须将符号链接指向的实际库文件一同拷贝到workdir/lib录下面去。 /lib目录下还有一个重要目录就是modules目录,它里面包含了内核编译产生模块,对于不同版本的模块存放在以版本号命名的文件中。要们可别忘了拷贝这个目录到我们的新系统中。 在原始时期/lib下的这些库就足够用了,但现在的linux系统对安全多了许多要求,尤其是系统从安全性考虑,增加了许多验证手段,因此往往你还必须具有和安全验证相关的库。这些库不会在命令中直接使用,但却间接地要被系统的安全框架利用到,多数都是由配置文件中说明如何关联,安全框架通过查看配置文件,选择调用具体地验证库(这些配置文件后问会提及)。安全框架方面话题,我们不多说,有兴趣的可以查查 pam 和 nss等的用法。在这里我们不管它三七二十一将在/lib/security/下和pam相关地库和/lib下nss相关地所有libnss*库都考到我们地/lib下的/security下和/lib下。虽然很笨,但确省事。 linux系统将那些会被多数应用程序频繁使用的库函数,多数都不会以静态的方式编译连接到应用程序中,而是采取动态库的方式,集中存储管理。这样如果多各程序都用到某个共享库,那么该库文件只被调入内存一次,驻留在内存一个拷贝,因此利用共享库大大节约了空间,缩减了执行文件提及。当然天下没有免费的午餐,虽然共享库相比静态库灵活,但却学要而外的路径搜索,而且调入时间也更耗时 链接文件是unix风格操作系统提供的一个特色之一,其中具体又可分为软链接和硬链接。软链接又称为符号链接,其实就该文件唯一的内容就是包含实际额外文件系统的路径。硬链接则是和被链接文件共享索引节点的(索引节点概念如果还不清楚,那么自己去找找吧)。因此符号链接怕得是实际文件被删除和转移,那么符号链接仍然存在但不再有效了;相反硬链接删除源文件直会使索引节点记数减少,不会破坏硬链接文件的。 第三步建立设备文件,这点很重要但却不费事。由于linux继承了unix将设备抽象成特殊文件来使用和管理,所以要想使用系统的外设,比如软硬盘,时钟,系统终端,甚至内存也可以作以为其制作相应的文件来访问。因此我们要建立系统可能用到的所有设备对应的设备文件。至于你具体需要哪些设备文件不能一概而论,你可以打开/dev/目录看看保准里面文件多地让你炫目。不过也别怕多数都是些废物,就我们要建立的实验系统来说用道的设备文件就屈指可数:console 控制台设备,tty* 是由控制台管理的虚拟(我们用ctrl-[1-7]切换的就是这个设备),sda1 scsi接口设备 (因为我的linux是运行在vware虚拟机上,而vmware虚拟机使用的存储设备是虚拟的scsi硬盘,所以需要这个文件。它的用法和使用标准ide硬盘没什么两样),ram 内存虚拟盘设备(以后我们的系统就运行在内存虚拟盘中),null 空设备(是一个非常有用的字符设备文件,送入这个设备的所有东西都被忽略。如果将任何程序的输出结果重定向到/dev/null,则看不到任何输出信息),zero 零设备 (读取这个设备,只会得到空的内容,所以有时为了获得高压缩率,需要对某空间用全零添充往往就会用到它)initrd 这是一个特殊的字符设备,它被用来从用户空间向系统内核发送切换运行级别的信息,属于一个虚拟字符设备(比如你向改变运行级别的init 1-6命令,都试通过该设备传达到内核的),关于虚拟字符设备作为用户向内核发命令的利器作用你可看看这个文章。 明确了你需要那些设备文件,可以依次利用mknod命令建立需要的设备文件。建立过程中需要的参数。你可以通过ls – la /dev/设备名 命令来查看以下设备属于块设备还是子符号设备,察看主从设备号获得。如果你觉得烦,就用拷贝命令直接从标准系统地/dev/目录下拷贝这些文件吧,不过要配合参数-r否则,你靠过来的可使文件的整个内容而不仅仅是设备文件了。如果那样可就如同把自己往自己衣服口袋里塞,你是永远赛不进去的。 linux系统将设备分为块设备和字符设备,块设备可以随机访问(b),字符设备只能按顺序访问c。另外一个设备控制器可以控制多个设备,所以有主设备号和从设备号之分。主设备号对应驱动,从设备号用来区分具体设备。 第四步需要建立系统运行需要的配置文件或脚本了。我们还是从简出发,拷贝标准系统的有用文件,然后针对需要进行修修改改。我们试验系统将以多任务多用户环境使用,因此需要登陆密码,也有分组能力,所以需要passwd和group文件,如果系统使用shadow功能隐藏密码,那么还需要文件shadow。登陆首先执行init文件,它可需要不少配置文件呀。首当其冲的便是inittab文件,该文件规定了许多系统运行的基本功能(具体内容参见)。下一步init先执行rc.sysinit脚本来初始化系统,其中会使用到fstab配置文件,它包含了系统启动后挂载的文件系统和目录,对于我们试验系统来说只有两项一个是将/dev/ram作为根文件系统安装到/下,另一个是将proc文件系统安装到/proc目录下。init执行完rc.sysinit后依照inittab中定义的运行级别进入对应的/etc/rc.d/执行其中s开头的服务运行脚本。不罗嗦了,细节内容别问我了,去看man init吧。你要做的就是把/etc/下initab,rc.sysinit和rc.d目录的所有东西拷贝到你对应系统里。我们实验系统运行级别为3,只启动网络服务服务,因此可以把除了s*network外的s脚本都删除。(当然你也可以改变系统默认的启动流程,让它执行你自己的初始化脚本,这点只需要载inittab中修改 “sysinit:xxx“中的脚本名称)。执行了上述初始化和服务后,系统最后运行rc.local文件,这里你可以放一些你希望开机执行的命令,我们这里放一句“ ok you are welcome !!!”为你进入系统前的问候。 另外要知道登陆是login往往要使用pam验证模块认证用户,所以pam的配置文件也最好拷贝到新系统。很多系统还会用到nss(名称服务开关,这个服务来帮助客户机器或应用程序获得网络信息,可从本地或从网络某处取得——从dns或nis等。诸如getxbyy()等函数都往往会用到这种服务,用户登陆时login很可能就要使用,这取决于你libc的版本),所以/etc/nsswitch.conf需要拷贝,至于如何使用去看man nsswitch.conf吧。剩下你还要靠被terminfo/termcap文件,它们对设置term终端环境变量有用。拷贝modules.conf,它包含了有关模块信息,我们实验系统中的modules.conf中仅仅给pcnet32.o 起了个别名而已。说的我口渴,不说了有什么疑问自己去找资料吧。 差不多完了,对了别忘了吧/root/目录下的那些.开头的用于bash配置的隐藏文件也考到新系统的如root下,这些都是bash的环境参数等东西。 结束动作。ldconfig –r workdir/rootfs(试验文件系统目录) 建立库文件路径缓存 ,从此命令再使用动态连接库时就不必指定目录了,因为它们的路径都被缓存了。(ldconfig 要用动态库配置文件ld.so.conf,试验系统中置空它好了) 安装根文件系统——内核和root文件系统绑定 别混淆,刚刚我们做的是文件系统应该包含的文件。具体文件系统现在才开始做。上面说了需要在系统未来的宿主盘上制作文件系统——进行格式化。如果你手头没有实际设备,linux提供给你另外两种变通方法 : ramdisk和loop设备(回环设备) 。利用loop设备可以将文件虚拟成 |
<< Linux 串口截止阀的分类以及特点 >>
