QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2300|回复: 0

From Power Up to Bash 4-6章

[复制链接]
发表于 2006-2-9 02:23:40 | 显示全部楼层 |阅读模式
From Power Up to Bash Prompt 4-6章

--------------------------------------------------------------------------------


上次发布了1-3章,反响还不错,所以我继续翻译了4-6章,因为我白天在读托福,所以翻译速度有限。希望大家谅解。我不认为网上有其他的中文版本,作者本人也认为没有其他的中文版本。本来文章是有链接的,但是我不知道如何把连接放上来。

4. Linux 内核



内核干了很多工作。我认为宏观的说内核让程序合理并且高效的控制硬件。



处理器每次只能执行一条指令,但是Linux表面上看起来同是运行了很多东西。内核用快速切换任务的方式来实现这样的效果。它把处理器的能力发挥到极致,通过不断监视哪个进程可以行、那个进程在等待(比如等待硬盘读取文件、键盘输入等等)。这些内核的工作叫做调度。



如果一个程序什么也不做了,它就不必待在内存里。即使程序正在运行,也可能存在某些部分不在执行。为程序分配的内存空间以页为单位。内核跟踪哪些进程的哪些页使用最频繁。哪些不常用的页面会被移动到交换分区,当需要他们的时候,另外一个不常用的页会交换到硬盘上来给他让位。这就是虚拟内存管理。

如果你曾经编译过自己的内核,你会注意到每个设备都有很多选项。内核包括了很多特别的代码用于和多种多样的硬件沟通,并且以很规范的方式提供给应用程序。

内核还管理文件系统、进程间通信还有很多网络功能。



一旦内核被读入,它会先寻找init程序来运行。



4.1 配置

大部分内核配置在你建立它的时候已经完成,使用make menuconfig,或者make xconfig 在你内核源文件存放的地方。你可以用rdev来重新设置默认的视频模式,根文件系统,交换分区,和内存中虚拟盘的大小。包括这些参数在内的很多参数将同过lilo传给内核。你可以直接传参数给lilo或者用lilo.conf,都可以把信息传给内核。举个例子如果你想用hda3来作为你的根目录而不是用hda2,你可以键入




LILO: linux root=/dev/hda3




如果你正在从源代码建立一个系统,你可以通过建立一个“monolithic”的内核来使过程变得很轻松。它没有模块,这样你就不用拷贝内核模块到目标系统了。



注意:内核记录器要使用System.map来确定模块生成信息。程序也要用到这些信息。当你把内核复制到目标系统时,把System.map一起拷贝过去。



4.2 练习

思考如下问题:/dev/hda3是一个用来描述硬盘的特殊文件。但是他在文件系统里面貌似和其他文件没什么区别。内核想知道在哪个分区上安装根文件系统——但这时还根本没有文件系统,它是如何读取/dev/hda3并找到要安装的分区的?

如果你还没有建立你自己的内核,阅读所有选项的帮助信息。



看看你可以把内核做的多小。你可以从错误中学到很多!



阅读“The Linux Kernel”,同时找到相应的源代码。这本书基于2.0.33版内核。已经过时了。老版本的内核相对容易理解,如果你下载了源代码,你会非常高兴的发现用c语言写的“进程”和“分页”函数。

Hack! 看看你能不能让它显示些别的信息或者做些其他事。





4.3 更多信息



/usr/src/linux/README 和/usr/src/linux/Documentation/ 里的内容(他们可能在你系统的其它地方)

The Kernel HOWTO

当你用make menuconfig或者make xconfig时也会有帮助。

The Linux Kernel (或其他LDP指导)

源代码,看Building a Minimal Linux System from Source Code

5. GNU C 库

接下来在启动过程中发生的就是init被装入并运行,init,和其他程序一样,会用到库里面的函数。



你可能见过像这样的C语言例子:






main() {
printf("Hello World!\n");
}


这个程序没有包含printf的定义,那么它是从哪里来的呢?它来自标准C语言库,在GNU/Linux系统中来自glibc。如果你在Visual C++下面编译,那么就来自微软自带的函数,在数学,文字流,数据/时间,分配内存等等方面有数量巨大的函数。Unix(包括linux)中的一切要么是用C语言编写的或者努力用类似的C的方法完成。所有的东西都涌到这些库函数。

如果你观察你系统中的/lib,你会发现有很多文件名称是lib*.so或者lib*.a。这些就是函数库,Glibc就是GNU的函数库。



程序有两种方法来使用这些库函数,如果静态连接一个程序,这些函数就会被复制到可执行程序中。这就是lib*.a函数库的作用,如果你动态的连接一个程序(这是默认的),那么当程序运行时需要库中的代码,它就会调用lib*.so中的内容。



当你想看看哪些库会被特定的程序用到,ldd命令会是个好帮手。举例来说,下面是bash用的库。






[greg@Curry power2bash]$ ldd /bin/bash
libtermcap.so.2 => /lib/libtermcap.so.2 (0x40019000)
libc.so.6 => /lib/libc.so.6 (0x4001d000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)




5.1 配制

有些库中的函数会和你的所在地有关,比如说,在澳大利亚时间表示方法是dd/mm/yy而在美国是mm/dd/yy。有一个和glibc发行版一起的程序,localedef,可以让你进行这些设置。



5.2 练习

使用ldd来找出你最喜欢的程序用了哪些库。



使用ldd找出init用了哪些库。



做一个只有一两个函数的“玩具”库,ar可以用来生成他们。在ar的帮助页里你会了解这些是如何完成的。编写,编译并连接一个用到你的库函数的程序。





5.3 更多信息



源代码, 看Building a Minimal Linux System from Source Code

6. Init

我只在这里描述linux系统中常见的“System V”风格的init。你也有其他选择,事实上,你可以在/sbin/init目录中加入任何程序,内核会在启动时运行他们。

init的任务就是初始化所有东西。它检测文件系统是否完好并安装文件系统。它会启动一些“deamons”(一种小程序)来记录系统信息,运行网络,提供网页服务,监听你的鼠标等等。它也会启动一个终端进程并在虚拟终端上面显示提示符。

关于“run-levels”(运行级)的内容是非常复杂的。我会跳过大部分内容,只谈有关启动的部分。



Init会读取/etc/inittab,这个文件告诉它该干什么,通常来说,第一件干的事是运行初始化脚本。bash会运行(或解释)这些脚本,也是bash提供给你命令行提示符。在Debian系统中,初始化脚本是/etc/init.d/rcS,在Rad Hat中是/etc/rc.d/rc.sysinit。这里面包含了装入文件系统,设置时间,打开交换分区,得到主机名等等内容。



接下来,另外一个脚本会被调用,带领我们进入默认的运行级。这意味着一个子系统集被启动。这里有一些列目录/etc/rc.d/rc0.d, /etc/rc.d/rc1.d, .../etc/rc.d/rc6.d 在 Red Hat, or /etc/rc0.d, /etc/rc1.d, ..., /etc/rc6.d 在Debian。这些目录对应运行级,如果你打算在Debian上设置运行级为3,那么脚本会运行/etc/re3.d下面所有以S开头的脚本。这些脚本又连接到init.d下面的其他脚本。

因为运行级的脚本是由init调用的,它会在目录里面寻找以S开头的脚本,S10syslog可能被最先发现,数字告诉运行级脚本以什么顺序来运行它们。由于没有S00syslog……S09syslog,所以在这里S10syslog最先。而S10syslog又指向用于启动和停止系统登陆者的/etc/init.d/syslog。因为这个连接以s开头,运行级脚本会用“start”参数来运行它。对应的,如果以K开头就表明在离开这个运行级时关闭的顺序。



如果想改变这些子系统的默认启动顺序,你必须设置在rcN.d目录中链接的顺序,在你的inittab中N代表默认的运行级。

init最后的工作是打开一些getty,他们是“respawned”的,这意味着如果他们被关闭,init会马上又打开他们。大部分发行版提供六个终端,你可以减少他们以节约内存,也可以增加以运行更多内容并快速切换。你也可能想在gatty上运行文本终端,或用猫拨号。这样的话你需要编辑inittab文件。





6.1 配制

/etc/inittab 是init最高级别的配制文件。



rcN.d目录,N=0,1,……6决定了启动什么子系统。T



在由init调用的某些脚本中,mount命令会被提及,这意味着转载所有支持的文件系统,文件/etc/fstab定义了将要安装的内容。如果你想改变在启动时装载的文件系统,你需要编辑它,fstab有个帮助页。



6.2 练习

找到装有默认运行级的rcN.d目录,运行ls -l看看那些文件被链接进来。

改变系统中getty的数目。

从你的默认运行级中删除不需要的子系统。

看看在最小情况下你需要多少内容。



建立一个软盘包含Lilo,内核,静态连接“hello world”程序,用/sbin/init调用,并显示hello world。

仔细观察系统的启动,记录它告你的事,或者打印/var/log/messages启动过程中的记录,然后在inittab中浏览,观察所有脚本,看看那些代码在干什么事。你也可以加入启动信息,例如:


echo "Hello, I am rc.sysinit"


这是学习Bash脚本编辑的好办法,有些脚本是非常复杂。你需要一本bash参考书在手头。T

6.3 更多信息



inittab和fstab都有帮助,输入 mam inittab来看它。

Linux系统管理指南有一个关于init的章节。

源代码, 看Building a Minimal Linux System from Source Code
您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-4-24 10:09 , Processed in 0.207643 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表