LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1306|回复: 9

From Power Up to Bash Prompt

[复制链接]
发表于 2006-2-7 11:30:46 | 显示全部楼层 |阅读模式
在征得作者同意后,我开始编写From Power Up to Bash Prompt(从启动到bash提示符)的中文版本,这是前三章。虽然很多内容都过时了,但是很多基本原理还是一样的。现在放寒假,所以想完成这么一件事。希望这篇文章对你有点帮助。我翻译水平有限,有不妥之处还请大家指正。大家可以在http://users.rsise.anu.edu.au/~okeefe/p2b/
看到英文原版

从按下电源开关到bash提示符
Greg O'Keefe, gcokeefe@postoffice.utas.edu.au
v0.9a, November 2000


--------------------------------------------------------------------------------
这是一篇描述linux系统从按下电源,到显示bash提示符当中的过程。理解这些细节在你遇到问题或想配置系统时非常有帮助 。

1. 序言
我发现很多在我linux机器上发生的事是我不了解的,这让我十分沮丧。如果你像我一样,想真正了解你的系统而不只是知道如何使用,这篇文章是个好的开始,如果你想成为linux高手的这些背景知识也会很有用。


我假设你有了一台装linux系统的电脑,而且知道一些Unix和PC的基础知识,如果不是这样,Eric S. Raymond的The Unix and Internet Fundamentals HOWTO是很好的文章,它很短,有很好的可读性而且内容全面。


虽然本文章的主线是linux如何启动,但也尝试全面的介绍linux系统,我在每一章节里都加入了练习,如果你进行了实际的操练,你会比阅读学到的更多。


我希望读者们能进行我所知的最好的学习方法,那就是从源代码开始编写系统。意大利哲学家维克 (Giambattista Vico 1668-1744)说过“verum ipsum factum”即“理解来自实践”谢谢Alex(见感谢)提供这则谚语。

如果你想“自力更生”,你应该看看 Gerard Beekmans的Linux From Scratch HOWTO (LFS),LFS在如何编写完整可用的系统方面有详细指导。在LFS官方网站上,你会找到有关的邮件列表。以前曾是文章一部分的内容现在分离出来,成为“Building a Minimal Linux System from Source Code”你可以在从启动到bash提示符主页 上找到。它揭示了如何建立系统,是一个纯粹的学习经验。


描述这些程序是以在启动时的先后顺序来安排的,这意味着如果你以这种顺序来安装文件,你会发现每次系统启动都会离bash提示符近一些。这会从另一方面证明了系统是按照我们所说的顺序启动的。


我推荐你每次都阅读各部分的主要内容,跳过练习和参考书目,然后确定你想了解的深度和想投入的精力。最后回到开始,进行练习和阅读参考文献。

2. 硬件
当你打开电脑,它会自动检测是否一切是否正常。这个过程被称为“启动自检”然后位于ROM中的BIOS引导装入程序会找到引导扇区。一个引导扇区是盘中的第一个段,它带有一个能载入操作系统的程序。引导扇区有神奇的地方被标记为0xAA55 = 43603,就在第0x1FE = 510字节。这是一个段的最后两个字节,硬件就是靠它们来区别这个段是否为引导扇区。



引导程序有一个可用于寻找启动扇区位置的表。我的老机器会先寻找软驱,然后主硬盘。很多现代计算机可以在光盘上寻找启动扇区,如果找到了一个启动扇区,引导程序会把它读入内存然后把控制权交给启动扇区里的程序。在一个标准linux系统中,这个程序就是LILO的第一阶段启动程序,有很多方法来进行启动时的设置,更多细节请参阅LILO的用户手册。


很明显,我们关于PC硬件功能有很多好讲,但这里不适合讨论,你可以参考各种关于PC硬件的书籍。


2.1 配置
机器在CMOS里面储存了很多自身信息。包括硬盘和内存的信息,BIOS里的程序可以让你更改这些设置。看看你机器启动时的屏幕信息就能知道如何进入BIOS程序,在我机器上,在启动操作系统前按下delete


2.2 练习
了解PC硬件的很好的方法是在二手市场里攒台机器。在386配置下就可以跑linux,而且不会花费太多。


下载并且做一张Unios的启动盘,这只是一个可启动的“Hello World!”程序,总共一百多行汇编代码。如果用可以理解GNU汇编的软件打开会更易读。


这里有篇指导文章“自己动手”在Roll Your Own 如果你想寻求真正的挑战。


用16进制编辑器打开unios的映像盘,这个映像有512字节长,正好是一段。找到那个神奇的数字0xAA55,找张可引导的盘,做同样的工作。你可以用dd命令来把引导区拷贝成文件:dd if=/dev/fd0 of=boot.sector 注意!正确的命令格式。

看看LILO引导程序的源代码


2.3 More Information

The Unix and Internet Fundamentals HOWTO by Eric S. Raymond, 特别是第三部分, What happens when you switch on a computer?
The LILO User's Guide 的第一章给出了关于PC硬盘分区和启动方面的描述。请看LILO 的网址.
The NEW Peter Norton Programmer's Guide to the IBM PC & PS/2, by Peter Norton and Richard Wilton, Microsoft Press 1988 这书很好,不过我现在买不起。
许多关于升级电脑的书。

3. Lilo
当系统在Linux系统上读取一个启动扇区,它实际上读取的是lilo的一部分,称之为“第一阶段启动程序”这是个很小的程序,它的所有工作只是读取“第二阶段启动程序”。


第二阶段启动程序会给你一个提示符(如果你安装时这样设置的话)然后启动你所选的操作系统。


当你的电脑已经在运行,你执行lilo实际上在进行“启动布局的安装”,它会读取/etc/lilo.conf然后把引导程序和可用系统清单写入硬盘。


有很多不同的方法来设置启动过程,我刚才解释的只是对于Linux系统最显著和普通的方法,Lilo的用户手册解释了许多“启动概念”的例子。它很值得一读,并且值得一试。


3.1 配置
LILO的配置文件是/etc/lilo.conf. 输入man lilo.conf会有一个帮助。lilo.conf主要存放LILO在启动时要完成的任务。作为Linux的入口,它告诉我们了内核在哪里,那个分区作为根文件系统。对于其他操作系统来说,主要的是他们从哪里启动。


3.2 练习
危险: 小心的进行这个练习。如果出错会把你的主引导区搞砸,并且让你的系统不能运行。确定你有个能用的备份盘并指导如何修复你的系统。阅读下面tomsrtbt的连接,有我推荐的救援盘。最好的预防是用一台不重要的机器。


在你的软盘上建立一个lilo。有没有内核并不重要,当内核准备加载init时你会得到一个“kernel panic”的信息。不过至少你知道lilo在工作。

如果你想继续看看软盘上多少内容被运行了。这可能是第二好的学习手段,看看Bootdisk HOWTO和tomsrtbt(网址在下面)

用lilo来启动unios(参考硬件 练习). 作为一个很大的挑战,看看你能否在软盘上完成这个练习A

做一个启动循环。启动主引导区的lilo,然后启动分区的lilo,再起动主引导区的lilo……或者用主引导分区的lilo和4个主分区的lilo做个好玩的大循环!

3.3 更多信息

lilo帮助手册 (man pages)
The Lilo package ( lilo), 包括 ``LILO User's Guide'' lilo-u-21.ps.gz (或以后的版本)。你可能已经有了 。看看/usr/doc/lilo,postscript得版本要比纯文本好点。因为有图片和表格。
tomsrtbt 最酷的软盘linux,非常好的急救盘。
The Bootdisk HOWTO
发表于 2006-2-7 14:03:23 | 显示全部楼层
请问楼主,这篇翻译是你的原创还是转贴?
回复 支持 反对

使用道具 举报

发表于 2006-2-7 15:37:51 | 显示全部楼层
看起来像是自己翻译的。
回复 支持 反对

使用道具 举报

发表于 2006-2-7 18:14:47 | 显示全部楼层
怎么感觉读起来一顿一顿的
回复 支持 反对

使用道具 举报

发表于 2006-2-7 23:13:20 | 显示全部楼层
印像中这文是有中文版的,一时间未想起在哪里
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-7 23:26:29 | 显示全部楼层

是我自己翻译的,呵呵

有不明白的地方可以问我。后续部分正在翻译中。一共有13章的样子。请多指教
回复 支持 反对

使用道具 举报

发表于 2006-2-8 00:13:14 | 显示全部楼层
请楼主加油,先加为精华。后续的章节请在本贴跟贴。我记得网上有翻译的,不过还是鼓励一下。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-9 02:14:42 | 显示全部楼层

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
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-11 23:45:07 | 显示全部楼层

From Power Up to Bash 7-14章 完

终于在开学前一天完成了所有工作,也算松了口气。为了翻译这篇文章,最近几天都是用睡觉的时间在翻。不过我还是觉得很开心,毕竟从中学到了不少东西。我是个操作系统的爱好者,最近正在筹划编写一个微型os(注意是微型),目标是最低限度支持internet。如果有兴趣,可以和我联系 如果你对这篇文章有什么意见和建议 也可以联系我 qq94531075

7. 文件系统

在这一部分,我会把“文件系统”这个词表达两种不同的意思。一种意思表示你硬盘分区和其他设备的“文件系统”,另外一种意思是Linux系统展现在你面前的“文件系统”。在Linux里,你“mount”(安装)一个磁盘文件系统到一个广义的文件系统。

在前面的章节可,我提到init脚本检测并安装文件系统,完成这些工作的命令分别是fsck和mount。

一个硬盘就是一个允许你写入1和0的大空间。文件系统在上面建立一些结构,让他看起来像目录包含目录,目录包含文件。每个文件都用一个inode(结点)来表示。结点包含了文件所有者,创建时间,内容存放的位置等信息,目录用结点来表示。如果系统想读取/home/greg/bigboobs.jpeg,他会先在“超级块”中找到/目录,然后再寻找home目录的结点,然后是greg目录的结点,最后是bigboobs.jpeg的节点,从中找到内容存放在硬盘什么地方。

如果在文件末尾加上一些数据,可能发生的是——数据在inode更新前写入,或者相反。如果这时断电,文件系统就会被破坏,fsck会尝试检测并修复这类错误。

mount命令把磁盘上的文件系统读入,并把它添加进你在系统中见到的目录树。通常,内核把根文件系统以只读方式安装。mount会在fsck检查完系统后把它们以可读可写方式重新安装。

Linux也支持其他文件系统:msdos,vfat,minix等等。各个文件系统的复杂细节被虚拟文件系统(VFS)抽象化了。我不会对此进行更详细的描述。这里有关于它的讨论(看The Linux Kernel 部分)

/proc是个完全不同的文件系统,他实际代表内核中的东西,每个运行的进程都会有一个目录,目录名就是进程号,那里也有文件代表中断,内存信息,通过它们来告诉你系统运行状况。通过探索/proc你会学到很多东西。

7.1 配制

有许多参数可以来控制mke3fs命令,它是用来建立ext3文件系统的。这些参数可以控制每个块的大小,结点的个数等等,在mke2fs的帮助页里面可以找到相关细节。

哪些安装和安装到什么位置是由/etc/fstab文件控制的,它也有个帮助页。

7.2 练习

建立一个很小的文件系统,并用16进制编辑器打开,找到结点、超级块和文件内容。

我认为有以图形方式观察文件系统的软件,找一个试试,如果你找到了请告诉我个地址。

看看ext2文件系统在内核中的代码。



7.3 更多信息



“The Linux Kernel”的第九章对文件系统有很好的描述,你可以在澳大利亚的LDP镜像上找到它。

mount命令是linux功能包中的一个,这里有个它的连接Building a Minimal Linux System from Source Code

mount,fatab,fsck,mke2fs和proc的帮助页。

linux源代码中的Documentation/proc.txt 解释了/proc文件系统。

EXT2文件系统功能包ext2fsprogs 主页 ext2fsprogs 澳洲镜像, 那里也有其他关于Ext2fs总体概括的文章,不过已经过时,而且没有“The Linux Kernel”第九章易读。

Unix文件系统标准另外一个链接。他描述了Unix文件系统的布局和原理,并且包含了对/bin,/sbin等目录内容的最基本要求。如果你想做一个微缩版,这是本很好的参考书。

8. 守护进程

如果你尝试ps aux命令,你会看到类似下面的内容:






USER       PID %CPU %MEM  SIZE   RSS TTY STAT START   TIME COMMAND
root           1           0.1         8.0   1284    536   ? S    07:37   0:04 init [2]
root           2           0.0         0.0     0        0   ? SW   07:37   0:00 (kflushd)
root           3           0.0         0.0     0        0   ? SW   07:37   0:00 (kupdate)
root           4           0.0         0.0     0        0   ? SW   07:37   0:00 (kpiod)
root           5           0.0         0.0     0        0   ? SW   07:37   0:00 (kswapd)
root           52         0.0        10.7  1552   716   ? S    07:38   0:01 syslogd -m 0
root           54         0.0        7.1    1276   480   ? S    07:38   0:00 klogd
root           56         0.3        17.3  2232  1156   1 S    07:38   0:13 -bash
root           57         0.0        7.1    1272   480   2 S    07:38   0:01 /sbin/agetty 38400 tt
root           64         0.1        7.2    1272   484  S1 S    08:16   0:01 /sbin/agetty -L ttyS1
root           70         0.0        10.6  1472   708   1 R   Sep 11   0:01 ps aux




这是在你系统中运行的程序清单。这些信息来自/proc文件系统。请注意init是1号进程,进程2,3,4和5分别是kflushd, kupdate, kpiod and kswapd。这里有一件很奇怪的事:你会注意到虚拟占用(SIZE)和实际占用(RSS)列都是0,进程怎么会不使用内存呢?

这些进程就是内核守护进程。大部分内核并不显示在进程列表里,你只能通过做减法的方式来了解内核用了多少内存。守护进程在init之后启动,所以他们和其他进程一样有进程ID,但是他们的代码和数据都存放在内核占有的内存中。

守护进程带有括号,因为/proc文件系统不包含这些进程的命令行信息。There are brackets around the entries in the command column because the /proc filesystem does not contain command line information for these processes.



那么守护进程是用来干吗的呢?这个文章以前的版本曾经请求大家帮助,由于我对守护进程了解不多,下面部分是由从网友回复的内容中综合而来的。欢迎发来更多的线索,参考,订正!

输入和输出是通过内存中的缓冲来完成的,这让事情变得更快,程序的写入会存放在内存缓冲中,然后再一起写入硬盘。守护进程kflushd和kupdate管理这些工作。kupdate间断的工作(每5秒?)来检查是否有写过的缓冲,如过有,就让kflushd把它们写入磁盘。

进程有时候无事可做,当他运行时也不一定需要把所有的代码和数据都放在内存中。这意味着我们可以通过把运行中程序不用的内容切换到交换分区来更好的是用内存。把这些数据移入/移出内存通过kpiod和kswapd,大约每隔1秒,kswapd醒来并检查内存情况。如果在硬盘的东西要读入内存,或者内存可用空间不足。kpiod就会被调用。

kapmd也可能在你的系统中运行,如果你在内核中配置过自动电源管理。



8.1 配置

update程序可以让你配置Kflushd和kswapd,尝试update -h获得更多信息。

交换空间由swapon打开,由swapoff关闭。init脚本(/etc/rc.sysinit 或/etc/rc.d/rc.sysinit)通常会在启动时调用swapon。我听说swapoff可以为笔记本电脑省不少电。

8.2 练习

运行update -d,留心关于“threshold for buffer fratricide”的讨论,这是个有趣的概念,深入调查一下。

到/proc/sys/vm 并用cat来看看里面的文件,你能发现什么?

8.3 更多信息

Linux文件工程(LDP)的“The Linux Kernel”(看The Linux Kernel 的相关部分)

Linux内核源代码,如果你胆子够大!kswapd的代码在linux/mm/vmscan.c,kflushd和kupdate在 linux/fs/buffer.c里。

9. 系统日志

Init启动了syslogd和klogd守护进程。他们向日志中写入信息。内核的信息由klogd处理。syslogd处理其他进程的信息。主要的日志是/ver/log/messages。如果你系统出了毛病,在这里经常能发现有价值的线索。

9.1 配置

文件/etc/syslog.conf告诉日志记录器什么信息该放在那里,消息由它的出处和它的优先级来区分。这个配置文件包含用于说明“从x来的消息优先级高于从y,z来的消息”的内容,其中z可能是个文件、端口、打印机、远程终端或是其他地方。

注意:Syslog需要已经存在的/etc/services文件。services文件分配端口。我不确定是syslog通过一个端口来完成远程日志还是即使本地的日志也要通过端口完成,又或者他只是使用/etc/services把你在/etc/syslog.conf中的输入转换成端口号。

9.2 练习

看看系统日志,找到你不理解的内容,并找出他们的含义。

把你所有的日志消息送到一个终端。(完成后把它设回正常状态)。





9.3 更多信息

澳大利亚 sysklogd 镜像

10. Getty 和 Login

Getty 就是一个程序,他让你能从各种设备上登陆,比如虚拟终端,文字终端或是一个modem。他显示一个登陆提示符,一旦你键入用户名,getty把它传送到login,login会向你要密码,认证成功后给你一个shell。

有很多getty,有的发行版,包括red hat使用很小的,只能在虚拟终端上用的mingetty。

login(登陆)程序是linux功能包的一部分,包含了一个名为agetty的getty。他工作得不错。这个软件包同时包括了mkswap,fdisk,passwd,kill,setterm,mount,swapon,rdev,renice,more等程序。

10.1 配制

在你屏幕上显示的登陆提示符来自/etc/issue。Gettys经常被/etc/inittab启动。Login检查在/etc/passwd中的用户信息,如果你使用了密码隐藏,就在/etc/shadow中。

10.2 练习

手动建立一个/etc/passwd,密码可以设置成无,在你登录上来以后用passwd命令更改。读这个文件的帮助页,用man 5 passwd 命令而不是passwd命令的帮助页。

11. Bash

如果你给登录程序一个有效的用户名和密码,他就会在/etc/passwd中检查你该用哪个shell?在大部分情况下linux系统中用的是bash。bash的工作就是读你的命令,并执行他们。他同时也是个用户界面,一门解释语言。

作为一个用户界面,他读取你的命令,如果是内部命令就会立即执行(比如cd)。如果是外部命令,他就会寻找他们并执行(比如cp,startx)。他同时也做一些常规操作,比如保存历史命令,补全文件名。

我们已经看到过bash作为翻译语言时的行为。init运行的脚本一般是shell脚本,并且是由bash运行的。用适当的编程语言,加上系统中常用的各种功能的命令,他们的结合将会是十分强大的。如果你知道自己在干什么,打个比方(自鸣得意状),前几天,我需要运行好几个补丁程序来给一个源代码目录打补丁。我可以用下面的命令:

for f in /home/greg/sh-utils-1.16*.patch; do patch -p0 < $f; done;



他会找出目录下所有以sh-utils-1.16开头,以.patch结尾的程序,把他们排队,把变量f设为这个队列。循环运行do到done之间的命令。在这里有11个补丁文件。但是即使有3000个文件,原理还是一样的。

11.1 配置

文件/etc/profile控制了bash系统级别的行为。你在这里放的内容会作用到所有在你系统上使用bash的人。他可以把目录加入PATH或者设置你的EMAIL变量等等。

默认的键盘行为有很多值得增强的地方。他实际上是由readline控制的。Readline是一个分开的软件包控制命令行界面。提供历史命令和文件名补完,和一些其他高级编辑功能。他被默认的编译进了bash。readling通过你自己目录下的.inputrc来配置。bash变量INPUTRC可以用来重载这个选项。打个比方在Red Hat 6里面,INPUTRC在/etc/profile中被设成/etc/inputrc。这意味着每个人都能正常使用backspace,delete,home和end。

一旦bash读取了系统范围的配置文件,他就会寻找你个人的配置文件。他会检查你的home目录。寻找.bash_profile .bash_login .profile。运行它第一个找到的。如果你想在不影响其他人的情况下改变你的bash行为。就在这里更改。打个比方,许多应用程序使用环境变量来控制自己的行为。我把EDITOR变量设为vi,这样我就可以在Midnight Commander(一个非常出色的基于文件管理的控制台)中使用vi,而不是使用mc自带的编辑器。

11.2 练习

bash的初级内容很容易学,但是不要就此为止:bash有惊人的深度,养成寻找最佳做法的习惯。

阅读shell脚本,找出你不明白的地方。



11.3 更多信息

有本叫“Bash Reference Manual”的书,很全面,不过很难。

有本 O'Rielly 关于Bash的书,我不太清楚内容如何。

我不知道最近有什么关于bash上手的教程,如果有,请告诉我。

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

12.命令

你在bash里面做的绝大多数事是通过打类似cp的命令完成的,大部分命令都是小程序,有的命令比如cd是shell中包含的。



在文件包中的命令,大部分都是来自自由软件基金(Free Software Foundation),除了这里列出的,我建议你看Linux From Scratch HOWTO。这里面有完整并随时更新的软件包列表,并且有如何安装的指导。

13. 结论

以我愚见,Linux最好之处就是你可以进入其中,了解内部真正发生的事。我希望你和我一样感受到很多乐趣。并且我希望这小小的笔记能对你有所帮助。
14. Administrivia

14.1 版权声明(Copyright)

This document is copyright (c) 1999, 2000 Greg O'Keefe. You are welcome to use, copy, distribute or modify it, without charge, under the terms of the GNU General Public Licence. Please acknowledge me if you use all or part of this in another document.



14.2 主页

文章的最新版本From Powerup To Bash Prompt

文章的最新中译版请向Leo Chen: leo_chen1985@yahoo.com.cn索取



法语翻译的From Powerup To Bash Prompt 感谢 Dominique van den Broeck.日本语版来自 Yuji Senda Japanese Documentation and FAQ Project









14.3 反馈

我希望听到任何评价,批评和建议。请发信给我Greg O'Keefe





14.4 感谢

本文所提及的产品名称是相应持有者的商标,在此我一并致谢 


我想对以下人员致谢,因为他们的帮助才有了这篇实作指南 



Michael Emery
因其提醒我注意到Unios 

Tim Little
因其提供了关于/etc/passwd的一些线索 

sPaKr on #linux in efnet
因其发现syslogd需要/etc/services的支持以及介绍给我使用短语``rolling your own''来表述从源码打造系统 

Alex Aitkin
因其引起了我对Vico以及他的``verum ipsum factum''(对编译进一步的理解) 的注意 

Dennis Scott
因其纠正了我的十六进制计算错误 

jdd
因其指出一些拼写错误





David Leadbeater

提供一些关于守护进程的信息



Leo Chen



提供了文章的中文翻译



Dominique van den Broeck

把这篇文章翻译成法语



Matthieu Peeters

一些守护进程的信息



John Fremlin

一些守护进程的信息



Yuji Senda

提供日语版本



Antonius de Rozari

提供 GNU 汇编版本的 UNIOS



Botp Pe馻

提供“roll your own os”链接







14.5 更新历史

0.9 -> 0.9a (November 2000)



加入了“roll your own os”链接到硬件章节。





0.8 -> 0.9 (November 2000)



结合了 Matthieu Peeters 和 John Fremlin关于守护进程和/proc文件系统的信息。





0.7 -> 0.8 (September 2000)



去掉了关于如何建立系统的指导,把它们放到另外一个文档中,调整一些链接。

主页从learning@TasLUG 移到 我自己的主页.

试图合并很多好的资料,不过失败了,下次再说





0.6 -> 0.7



更注重解释,而不是如何建立系统,把有关建立系统的信息放在单独的章节。

增加一些由 David Leadbeater提供的信息。

更新一些链接,加入了unios的连接。

测试,修复链接。

大部分重写。





0.5 -> 0.6



加入更新历史

加入一些计划





14.6 计划



解释内核

提及/proc 文件系统。留练习作业。

专用doc标准格式

增加更多练习。

加入bash的make文件。
回复 支持 反对

使用道具 举报

发表于 2006-2-12 12:21:34 | 显示全部楼层
非常好。谢谢兄弟了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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