QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2769|回复: 0

From Power Up to Bash 7-14章 完

[复制链接]
发表于 2006-2-11 23:52:24 | 显示全部楼层 |阅读模式
终于在开学前一天完成了所有工作,也算松了口气。为了翻译这篇文章,最近几天都是用睡觉的时间在翻。不过我还是觉得很开心,毕竟从中学到了不少东西。我是个操作系统的爱好者,最近正在筹划编写一个微型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: [email protected]索取



法语翻译的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文件。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-24 12:47 , Processed in 0.073290 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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