2007年12月21日 星期五

Windows XP Service Pack 3 Release Candidate

Brief Description
Standalone Update Package for Windows® XP Service Pack 3 Release Candidate

Quick Details
File Name: windowsxp-kb936929-sp3-x86-enu.exe
Version: 3264
Knowledge Base (KB) Articles: KB936929
Date Published: 12/18/2007
Language: English
Download Size: 336.1 MB

Download page.

2007年12月15日 星期六

[轉載]動態更新DNS教學-日文版

原文出處 http://www.atmarkit.co.jp/flinux/rensai/bind907/bind907c.html
■TSIG(Transaction Signature)の利用

 TSIGは、すでに第5回で登場しています。第5回ではゾーン転送時のセキュアな手段として紹介しましたが、ここでも威力を発揮します。

 設定作業は第5回と同じように行います。まず、dnssec-keygenコマンドで共有鍵を作成します。作業するのは、マスター・ゾーンサーバ側、nsupdateを実施するクライアント側のどちらでも構いません。

# /usr/sbin/dnssec-keygen -a HMAC-MD5 -b 512 -n HOST example.jp

Kexample.jp.+157+01798.key
Kexample.jp.+157+01798.private
注:コマンドパスおよびexample.jpは、環境に応じて書き換えてください。

 「key」「private」といった拡張子を見ると、公開鍵暗号方式が使用されているように思えますが、ここではHMAC-MD5を使用しており、2つのファイルの中に記載されるパスフレーズは同じものです。以下のnamed.confの設定ではKexample.jp.+157+01798.keyから鍵を抽出していますが、Kexample.jp.+157+01798.privateを使っても同じになります。

$ more Kexample.jp.+157+01798.key
example.jp. IN KEY 512 3 157 1GPx/sFNPz40U/NuspDqo……(略)

 次に、生成されたファイルから共有鍵(上の赤字の個所)を抜き出し、named.confに埋め込みます。

key "example.jp" {
algorithm hmac-md5;
secret "1GPx/sFNPz40U/NuspDqo……(略)";
};

zone "example.jp" {
type master;
file "example.zone";
allow-update{
key example.jp;
};
};
/etc/named.conf

 named.confの変更を有効にするために、namedプロセスの再起動やrndcコマンドでreloadを実行しましょう。

 次に、nsupdateを行うクライアント側の設定です。先ほど作成したファイルのうち、どちらか1つをクライアント側にコピーしておきます。

$ /usr/bin/nsupdate -k ./Kexample.jp.+157+24115.key
注:コマンドパスおよび鍵ファイルへのパスは環境に応じて書き換えてください。

 前述のとおり、公開鍵/秘密鍵のような区別がないため、.privateファイルでも同じようにnsupdateを実行できます。

$ /usr/bin/nsupdate -k ./Kexample.jp.+157+24115.private

 これで、「allows updates by IP address, which is insecure」と/var/log/messagesに警告が表示されることはなくなります。残念なのは、TSIG署名とIP ACLによる制限でand条件を掛けられないことです。TSIG署名かIP ACLどちらかの条件を満たせばupdateが可能なため、「TSIG署名かつIP ACL」のような制限を掛けることはできません。

■update-policyの利用

 BIND 9では、allow-updateだけではなくupdate-policyを利用することができます。allow-updateはゾーンそのものの許可の有無を設定するものでしたが、「Aレコードだけupdateさせたい」「MXレコードは変えさせない」など、update-policyを利用すればレコードの種類ごとにセキュリィティポリシーを設定できます。

key "example.jp" {
(省略)
};

zone "example.jp" {
type master;
file "example.zone";
update-policy{
grant example.jp wildcard *.example.jp. A;
};
};
named.conf

 update-policyには、次のような指定を行います。

grant keyの名前 nameタイプ name (type) 許可する場合

deny keyの名前 nameタイプ name (type) 許可しない場合

 nameタイプには、次のものを使用します。

name 更新を行うFQDNホスト名がnameと同じ場合
subdomain 更新を行うFQDNホスト名がnameをドメインの一部に持つとき
wildcard 更新を行うFQDNホスト名がnameのワイルドカード指定にマッチする場合
self 更新を行うFQDNホスト名が「keyの名前」と同じ場合(後ろのname指定は無視されるが、省略はできない)

 例に使用した、

grant example.jp wildcard *.example.jp. A;

は、「example.jp.」にマッチするFQDNホスト名のupdateで、かつAレコードを登録する場合のみ許可されることになります。この設定であれば、MXが書き換えられて見当外れのサーバにメールが配送されたり、NSが書き換えられてしまうなどのトラブルを未然に防ぐことができます。仮に、CNAMEやMXなどのAレコード以外の登録を行おうとすると、

Jul 2 04:31:31 host named[XXX]: client 127.0.0.1#1046: updating zone 'example.jp/IN': update failed: rejected by secure update (REFUSED)

のような警告が/var/log/messagesに記録されます。

■jnlファイルとトラブルの対処法

 大変便利なupdateですが、ゾーンファイルを直接編集する際は、特に注意が必要です。BIND 9のDynamic DNSはupdate要求をjnlファイルにいったん蓄えるため、すぐにディスク上のゾーンファイルに反映させません。

 namedプロセスが不意に停止しても、jnlファイルがあれば反映されていない情報も再度同期を試みます。しかし、手動でゾーンファイルを編集してしまうと、差分情報であるjnlファイルとの整合性が取れなくなり、/var/log/messagesに次のような警告が記録されます。

Jul 2 01:57:43 host named[XXXXX]: zone example.co.jp/IN: journal rollforward failed: journal out of sync with zone

 こうなってしまった場合は更新差分の反映をあきらめてjnlファイルを削除し、再度namedを起動します。

2007年12月3日 星期一

cisco route 查流量指令

查那個ip流量最大

Router#conf t
Router< config>#int f0 <------------- 要下在output的介面
Router< config-int>#ip accounting
Router< config-int>#end

Router#sh ip accounting

查完記得no掉, 否則會增加cpu的負擔!
Router< config-int >#no ip accounting

2007年12月1日 星期六

linux 技巧:使用 screen 管理你的远程会话

linux 技巧:使用 screen 管理你的远程会话

文档选项
将此页作为电子邮件发送
级别: 中级

田 强 (tianq@cn.ibm.com), 软件工程师, IBM中国软件开发中心


2007 年 7 月 31 日

你是不是经常需要远程登录到Linux服务器?你是不是经常为一些长时间运行的任务头疼?还在用 nohup 吗?那么来看看 screen 吧,它会给你一个惊喜!
你是不是经常需要 SSH 或者 telent 远程登录到 Linux 服务器?你是不是经常为一些长时间运行的任务而头疼,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为他们执行的时间太长了。必须等待它执行完毕,在此期间可不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。

元凶:SIGHUP 信号

让我们来看看为什么关掉窗口/断开连接会使得正在运行的程序死掉。

在Linux/Unix中,有这样几个概念:

进程组(process group):一个或多个进程的集合,每一个进程组有唯一一个进程组ID,即进程组长进程的ID。
会话期(session):一个或多个进程组的集合,有唯一一个会话期首进程(session leader)。会话期ID为首进程的ID。
会话期可以有一个单独的控制终端(controlling terminal)。与控制终端连接的会话期首进程叫做控制进程(controlling process)。当前与终端交互的进程称为前台进程组。其余进程组称为后台进程组。
根据POSIX.1定义:

挂断信号(SIGHUP)默认的动作是终止程序。
当终端接口检测到网络连接断开,将挂断信号发送给控制进程(会话期首进程)。
如果会话期首进程终止,则该信号发送到该会话期前台进程组。
一个进程退出导致一个孤儿进程组中产生时,如果任意一个孤儿进程组进程处于STOP状态,发送SIGHUP和SIGCONT信号到该进程组中所有进程。
因此当网络断开或终端窗口关闭后,控制进程收到SIGHUP信号退出,会导致该会话期内其他进程退出。

我们来看一个例子。打开两个SSH终端窗口,在其中一个运行top命令。

[root@tivf09 root]# top



在另一个终端窗口,找到top的进程ID为5180,其父进程ID为5128,即登录shell。

[root@tivf09 root]# ps -efgrep top
root 5180 5128 0 01:03 pts/0 00:00:02 top
root 5857 3672 0 01:12 pts/2 00:00:00 grep top


使用pstree命令可以更清楚地看到这个关系:

[root@tivf09 root]# pstree -H 5180grep top
-sshd-+-sshd---bash---top



使用ps-xj命令可以看到,登录shell(PID 5128)和top在同一个会话期,shell为会话期首进程,所在进程组PGID为5128,top所在进程组PGID为5180,为前台进程组。

[root@tivf09 root]# ps -xjgrep 5128
5126 5128 5128 5128 pts/0 5180 S 0 0:00 -bash
5128 5180 5180 5128 pts/0 5180 S 0 0:50 top
3672 18095 18094 3672 pts/2 18094 S 0 0:00 grep 5128


关闭第一个SSH窗口,在另一个窗口中可以看到top也被杀掉了。

[root@tivf09 root]# ps -efgrep 5128
root 18699 3672 0 04:35 pts/2 00:00:00 grep 5128


如果我们可以忽略SIGHUP信号,关掉窗口应该就不会影响程序的运行了。nohup命令可以达到这个目的,如果程序的标准输出/标准错误是终端,nohup默认将其重定向到nohup.out文件。值得注意的是nohup命令只是使得程序忽略SIGHUP信号,还需要使用标记&把它放在后台运行。

nohup [argument…] &



虽然nohup很容易使用,但还是比较“简陋”的,对于简单的命令能够应付过来,对于复杂的需要人机交互的任务就麻烦了。

其实我们可以使用一个更为强大的实用程序screen。流行的Linux发行版(例如Red Hat Enterprise Linux 4)通常会自带screen实用程序,如果没有的话,可以从GNU screen的官方网站下载。

[root@tivf06 ~]# rpm -qagrep screen
xscreensaver-4.18-5.rhel4.11
screen-4.0.2-5



开始使用Screen

简单来说,Screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。Screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。在screen中创建一个新的窗口有这样几种方式:

1.直接在命令行键入screen命令

[root@tivf06 ~]# screen


Screen将创建一个执行shell的全屏窗口。你可以执行任意shell程序,就像在ssh窗口中那样。在该窗口中键入exit退出该窗口,如果这是该screen会话的唯一窗口,该screen会话退出,否则screen自动切换到前一个窗口。

2.Screen命令后跟你要执行的程序。

[root@tivf06 ~]# screen vi test.c


Screen创建一个执行vi test.c的单窗口会话,退出vi将退出该窗口/会话。

3.以上两种方式都创建新的screen会话。我们还可以在一个已有screen会话中创建新的窗口。在当前screen窗口中键入C-a c,即Ctrl键+a键,之后再按下c键,screen 在该会话内生成一个新的窗口并切换到该窗口。

screen还有更高级的功能。你可以不中断screen窗口中程序的运行而暂时断开(detach)screen会话,并在随后时间重新连接(attach)该会话,重新控制各窗口中运行的程序。例如,我们打开一个screen窗口编辑/tmp/abc文件:

[root@tivf06 ~]# screen vi /tmp/abc


之后我们想暂时退出做点别的事情,比如出去散散步,那么在screen窗口键入C-a d,Screen会给出detached提示:


暂时中断会话


半个小时之后回来了,找到该screen会话:

[root@tivf06 ~]# screen -ls
There is a screen on:
16582.pts-1.tivf06 (Detached)
1 Socket in /tmp/screens/S-root.


重新连接会话:

[root@tivf06 ~]# screen -r 16582


看看出现什么了,太棒了,一切都在。继续干吧。

你可能注意到给screen发送命令使用了特殊的键组合C-a。这是因为我们在键盘上键入的信息是直接发送给当前screen窗口,必须用其他方式向screen窗口管理器发出命令,默认情况下,screen接收以C-a开始的命令。这种命令形式在screen中叫做键绑定(key binding),C-a叫做命令字符(command character)。

可以通过C-a ?来查看所有的键绑定,常用的键绑定有:


C-a ? 显示所有键绑定信息
C-a w 显示所有窗口列表
C-a C-a 切换到之前显示的窗口
C-a c 创建一个新的运行shell的窗口并切换到该窗口
C-a n 切换到下一个窗口
C-a p 切换到前一个窗口(与C-a n相对)
C-a 0..9 切换到窗口0..9
C-a a 发送 C-a到当前窗口
C-a d 暂时断开screen会话
C-a k 杀掉当前窗口
C-a [ 进入拷贝/回滚模式


Screen常用选项

使用键绑定C-a ?命令可以看到, 默认的命令字符(Command key)为C-a,转义C-a(literal ^a)的字符为a:


Screen 常用选项


因为screen把C-a看作是screen命令的开始,所以如果你想要screen窗口接收到C-a字符,就要输入C-a a。Screen也允许你使用-e选项设置自己的命令字符和转义字符,其格式为:

-exy x为命令字符,y为转义命令字符的字符

下面命令启动的screen会话指定了命令字符为C-t,转义C-t的字符为t,通过C-t ?命令可以看到该变化。

[root@tivf18 root]# screen -e^tt


自定义命令字符和转义字符


其他常用的命令选项有:


-c file 使用配置文件file,而不使用默认的$HOME/.screenrc
-d-D [pid.tty.host] 不开启新的screen会话,而是断开其他正在运行的screen会话
-h num 指定历史回滚缓冲区大小为num行
-list-ls 列出现有screen会话,格式为pid.tty.host
-d -m 启动一个开始就处于断开模式的会话
-r sessionowner/ [pid.tty.host] 重新连接一个断开的会话。多用户模式下连接到其他用户screen会话需要指定sessionowner,需要setuid-root权限
-S sessionname 创建screen会话时为会话指定一个名字
-v 显示screen版本信息
-wipe [match] 同-list,但删掉那些无法连接的会话


下例显示当前有两个处于detached状态的screen会话,你可以使用screen -r 重新连接上:

[root@tivf18 root]# screen –ls
There are screens on:
8736.pts-1.tivf18 (Detached)
8462.pts-0.tivf18 (Detached)
2 Sockets in /root/.screen.

[root@tivf18 root]# screen –r 8736


如果由于某种原因其中一个会话死掉了(例如人为杀掉该会话),这时screen -list会显示该会话为dead状态。使用screen -wipe命令清除该会话:

[root@tivf18 root]# kill -9 8462
[root@tivf18 root]# screen -ls
There are screens on:
8736.pts-1.tivf18 (Detached)
8462.pts-0.tivf18 (Dead ???)
Remove dead screens with 'screen -wipe'.
2 Sockets in /root/.screen.

[root@tivf18 root]# screen -wipe
There are screens on:
8736.pts-1.tivf18 (Detached)
8462.pts-0.tivf18 (Removed)
1 socket wiped out.
1 Socket in /root/.screen.

[root@tivf18 root]# screen -ls
There is a screen on:
8736.pts-1.tivf18 (Detached)
1 Socket in /root/.screen.

[root@tivf18 root]#


-d –m 选项是一对很有意思的搭档。他们启动一个开始就处于断开模式的会话。你可以在随后需要的时候连接上该会话。有时候这是一个很有用的功能,比如我们可以使用它调试后台程序。该选项一个更常用的搭配是:-dmS sessionname

启动一个初始状态断开的screen会话:

[root@tivf06 tianq]# screen -dmS mygdb gdb execlp_test


连接该会话:

[root@tivf06 tianq]# screen -r mygdb


管理你的远程会话

先来看看如何使用screen解决SIGHUP问题,比如现在我们要ftp传输一个大文件。如果按老的办法,SSH登录到系统,直接ftp命令开始传输,之后。。如果网络速度还可以,恭喜你,不用等太长时间了;如果网络不好,老老实实等着吧,只能传输完毕再断开SSH连接了。让我们使用screen来试试。

SSH登录到系统,在命令行键入screen。

[root@tivf18 root]# screen


在screen shell窗口中输入ftp命令,登录,开始传输。不愿意等了?OK,在窗口中键入C-a d:


管理你的远程会话


然后。。退出SSH登录?随你怎样,只要别杀掉screen会话。

是不是很方便?更进一步,其实我们可以利用screen这种功能来管理你的远程会话,保存你所有的工作内容。你是不是每次登录到系统都要开很多窗口,然后每天都要重复打开关闭这些窗口?让screen来帮你“保存”吧,你只需要打开一个ssh窗口,创建需要的screen窗口,退出的时候C-a d“保存”你的工作,下次登录后直接screen -r 就可以了。

最好能给每个窗口起一个名字,这样好记些。使用C-a A给窗口起名字。使用C-a w可以看到这些窗口名字,可能名字出现的位置不同。使用putty:


putty


使用telnet:


telnet



更多Screen功能

Screen提供了丰富强大的定制功能。你可以在Screen的默认两级配置文件/etc/screenrc和$HOME/.screenrc中指定更多,例如设定screen选项,定制绑定键,设定screen会话自启动窗口,启用多用户模式,定制用户访问权限控制等等。如果你愿意的话,也可以自己指定screen配置文件。

以多用户功能为例,screen默认是以单用户模式运行的,你需要在配置文件中指定multiuser on 来打开多用户模式,通过acl*(acladd,acldel,aclchg...)命令,你可以灵活配置其他用户访问你的screen会话。更多配置文件内容请参考screen的man页。

参考资料

“Advanced Programming in the UNIX® Environment: Second Edition” W. Richard Stevens, Stephen A. Rago 提供了更多关于Linux/Unix进程关系、信号的知识。
GNU Screen的官方网站:http://www.gnu.org/software/screen/
Screen的man page提供了最详细的信息:http://www.slac.stanford.edu/comp/unix/package/epics/extensions/iocConsole/screen.1.html

关于作者
田强,中国软件开发中心 Tivoli 部门软件工程师,负责 IBM 产品TMF(Tivoli Management Framework)的维护和客户支持工作,热爱 Linux

2007年11月20日 星期二

在 部落格 用 WEB MSN 直接與讀者對話

過去雖然也有工具, 也是透過 msn 傳訊息, 不過還是不如微軟直接開放來得方便.
1.連到 這裡, 登入

2. 勾選 "允許所有網際網路使用者看見我的線上狀態並傳送訊息給我"

3. 選擇顯示的模式, 有狀態或對話窗 4. 直接複製 HTML 到網頁上就可以了.一旦有人想與你對話, 會先收到系統的詢問, 然後才開始對談.對話框如下, 有興趣的話, 試試看囉!

2007年11月19日 星期一

Linux 指令篇:網絡通訊--nc

Linux 指令篇:網絡通訊--nc

功能說明:設置路由器。

語  法:nc [-hlnruz][-g<網關...>][-G<指向器數目>][-i<延遲秒數>][-o<輸出文件>][-p<通信端口>][-s<來源位址>][-v...][-w<超時秒數>][主機名稱][通信端口...]

補充說明:執行本指令可設置路由器的相關參數。

參  數:
-g<網關> 設置路由器躍程通信網關,最丟哦可設置8個。
-G<指向器數目> 設置來源路由指向器,其數值為4的倍數。
-h 在線幫助。
-i<延遲秒數> 設置時間間隔,以便傳送信息及掃描通信端口。
-l 使用監聽模式,管控傳入的資料。
-n 直接使用IP地址,而不通過域名服務器。
-o<輸出文件> 指定文件名稱,把往來傳輸的數據以16進制字碼傾倒成該文件保存。
-p<通信端口> 設置本地主機使用的通信端口。
-r 亂數指定本地與遠端主機的通信端口。
-s<來源位址> 設置本地主機送出數據包的IP地址。
-u 使用UDP傳輸協議。
-v 顯示指令執行過程。
-w<超時秒數> 設置等待連線的時間。
-z 使用0輸入/輸出模式,只在掃描通信端口時使用。

實用技巧:將PHP作為Shell腳本語言使用

發佈時間:2007.08.28 06:21 來源:賽迪網 作者:kid

我們都知道,PHP是一種非常好的動態網頁開發語言(速度飛快,開發週期短……)。但是只有很少數的人意識到PHP也可以很好的作為編寫Shell腳本的語言,當PHP作為編寫Shell腳本的語言時,他並沒有Perl或者Bash那麼強大,但是他卻有著很好的優勢,特別是對於我這種熟悉PHP但是不怎麼熟悉Perl的人。

  要使用PHP作為Shell腳本語言,你必須將PHP作為二進位的CGI編譯,而不是Apache模式;編譯成為二進位CGI模式運行的PHP有一些安全性的問題,關於解決的方法可以參見PHP手冊(http://www.php.net)。

  一開始你可能會對於編寫Shell腳本感到不適應,但是會慢慢好起來的:將PHP作為一般的動態網頁編寫語言和作為Shell腳本語言的唯一不同就在於一個Shell腳本需要在第一行生命解釋本腳本的程式路徑:


  #!/usr/local/bin/php -q


  我們在PHP執行文件後面加入了參數“-1”,這樣子PHP就不會輸出HTTPHeader(如果仍需要作為Web的動態網頁,那麼你需要自己使用header函數輸出HTTPHeader)。當然,在Shell腳本的裏面你還是需要使用PHP的開始和結束標記
  

<? php 代碼 ?>



  現在讓我們看一個例子,以便於更好的了解用PHP作為Shell腳本語言的使用:
  

#!/usr/local/bin/php -q
print("Hello, world!\n");
?>

  上面這個程式會簡單的輸出“Hello, world!”到顯示器上。

  一、傳遞Shell腳本運行參數給PHP:

  作為一個Shell腳本,經常會在運行程式時候加入一些參數,PHP作為Shell腳本時有一個內嵌的數組“$argv”,使用“$argv”數組可以很方便的讀取Shell腳本運行時候的參數(“$argv[1]”對應的是第一個參數,“$argv[2]”對應的是第二個參數,依此類推)。比如下面這個程式:


#!/usr/local/bin/php -q
$first_name = $argv[1];
$last_name = $argv[2];
printf("Hello, %s %s! How are you today?\n", $first_name, $last_name);
?>




  上面的代碼在運行的時候需要兩個參數,分別是姓和名,比如這樣子運行:

  

[dbrogdon@artemis dbrogdon]$ scriptname.ph Darrell Brogdon




  Shell腳本在顯示器上面會輸出:

Hello, Darrell Brogdon! How are you today?
[dbrogdon@artemis dbrogdon]$

  在PHP作為動態網頁編寫語言的時候也含有“$argv”這個數組,不過和這裡有一些不同:當PHP作為Shell腳本語言的時候“$argv[0]”對應的是腳本的文件名,而當用於動態網頁編寫的時候,“$argv[1]”對應的是QueryString的第一個參數。

  二、編寫一個具有互動式的Shell腳本:

  如果一個Shell腳本僅僅是自己運行,失去了交互性,那麼也沒有什麼意思了。當PHP用於Shell腳本的編寫的時候,怎麼讀取用戶輸入的資訊呢?很不幸的是PHP自身沒有讀取用戶輸入資訊的函數或者方法,但是我們可以效倣其他語言編寫一個讀取用戶輸入資訊的函數“read”:

  function read() {
  $fp = fopen('/dev/stdin', 'r');
  $input = fgets($fp, 255);
  fclose($fp);
  return $input;
  }   ?>



  需要注意的是上面這個函數只能用於Unix系統(其他系統需要作相應的改變)。上面的函數會打開一個文件指針,然後讀取一個不超過255字節的行(就是fgets的作用),然後會關閉文件指針,返回讀取的資訊。

  現在我們可以使用函數“read”將我們前面編寫的程式1修改一下,使他更加具有“交互性”了:
  
#!/usr/local/bin/php -q
    function read() {
  $fp = fopen('/dev/stdin', 'r');
  $input = fgets($fp, 255);
  fclose($fp);
  return $input;
  }
  print("What is your first name? ");
  $first_name = read();
  print("What is your last name? ");
  $last_name = read();
  print("\nHello, $first_name $last_name! Nice to meet you!\n");
  ?>

  將上面的程式保存下來,運行一下,你可能會看到一件預料之外的事情:最後一行的輸入變成了三行!這是因為“read”函數返回的資訊還包括了用戶每一行的結尾換行符“\n”,保留到了姓和名中,要去掉結尾的換行符,需要把“read”函數修改一下:

  function read() {
  $fp = fopen('/dev/stdin', 'r');
  $input = fgets($fp, 255);
  fclose($fp);
  $input = chop($input); // 去除尾部空白
  return $input;
  }   ?>

  三、在其他語言編寫的Shell腳本中包含PHP編寫的Shell腳本:

  有時候我們可能需要在其他語言編寫的Shell腳本中包含PHP編寫的Shell腳本。其實非常簡單,下面是一個簡單的例子:

#!/bin/bash
  echo This is the Bash section of the code.   /usr/local/bin/php -q << EOF     print("This is the PHP section of the code\n");
  ?>   EOF

  其實就是調用PHP來解析下面的代碼,然後輸出;那麼,再試試下面的代碼:


#!/bin/bash
  echo This is the Bash section of the code.   /usr/local/bin/php -q << EOF      $myVar = 'PHP';
  print("This is the $myVar section of the code\n");
  ?>   EOF

  可以看出兩次的代碼唯一的不同就是第二次使用了一個變數“$myVar”,試試運行,PHP竟然給出出錯的資訊:“Parse error: parse error in - on line 2”!這是因為Bash中的變數也是“$myVar”,而Bash解析器先將變數給替換掉了,要想解決這個問題,你需要在每個PHP的變數前面加上“\”轉義符,那麼剛才的代碼修改如下:
 

#!/bin/bash
  echo This is the Bash section of the code.
  /usr/local/bin/php -q << EOF
 \$myVar = 'PHP';
  print("This is the \$myVar section of the code\n");
  ?>  EOF

  好了,現在你可以用PHP編寫你自己的Shell腳本了,希望你一切順利。

(責任編輯:雲子)

2007年11月7日 星期三

[轉載]基於DNS的多機均衡負載的實現

[Linux] [轉貼] 基於DNS的多機均衡負載的實現

基於DNS的多機均衡負載的實現

前二天為一個客戶添加了一台服務器。共同承擔一個論壇的運作。但是。要實現負載均衡。的確是件難事。
之前有試過幾個方法,
一、DNS輪值。。優點:簡單實現。缺點:無法檢測各個服務器的負荷。難控制訪客的訪問地址(一般DNS服務器都有緩存,所以。效果不明顯)
二、前台程序。。使用了一個類似Zeus Load Balancer的服務程序。在前台接受訪問請求。再分流到各個實際的服務器。

但以上二個方法都不太適用我的情況。。
第一種。無法正確分配訪客流量。。。常發生一台服務器的負荷很大。而另一台就很低。。。
第二種。會占用更多的流量。資源也占用較大。 

最好。我還是采用了一個DNS均衡負載的方法---lbname。
它的主要效果介紹:
一、基於perl的dns服務端。應用簡單。
二、自動檢測各個服務器的負荷。然後再按結果優先分配DNS解析。
三、DNS解析實時生效。不會被DNS服務器緩存。
四、安裝方法簡單。。。



lbname網頁介紹
[url]http://www.stanford.edu/~schemers/docs/lbnamed/lbnamed.html[/url]
[url]http://www.stanford.edu/~riepel/lbnamed/[/url]




下載:
[url]http://www.stanford.edu/~riepel/lbnamed/lbnamed-1.2.1.tar.gz[/url]
[url]http://www.stanford.edu/~schemers/dist/lb.tar[/url]
.
.

下載包說明:
內存數個目錄
1)lbcd的源代碼。。。。lbcd是lbnamed所用到的服務器端檢測服務器負荷程序。。每個需要均衡負荷的服務器都需要安裝、運行它的。。。
建議下載使用最新的lbcd編譯包。http://www.stanford.edu/~riepel/lbnamed/lbcd-3.1.0.tar.gz  之前的常有編譯錯誤的。(這個也有的。嘻。)
編譯這個包時。常會出錯的。如何成功安裝。就看你的本事了。(編輯util.c第123行。在前面加上//)
  編譯lbcd成功後。將它復制到/usr/sbin。那你就可以運行它了。。不用加什麼參數了。(運行後要停止它就是lbcd -s)

2)lbnamed的服務器程序perl..分有二個版本。一個是perl4.另一個是perl5.我是使用perl5的。所以用它來說明。
 進入perl5目錄。。。。。先要配置好lbnamed和poller程序。
 說明一下:
lbnamed程序是主程序。提供dns動態解析。嚴格來說。它已是一個dns服務器端程序了。
poller是為lbnamed提供各個均衡服務器的負荷情況。(配合我們之前安裝的lbcd程序使用)
但二個程序可能都需要更改,請看程序第一行的perl程序地址。。改為你的perl地址。

然後就需要更改程序的配置文件了。
1,lbnamed.conf 要更改的地方有幾個 
一、$hostmaster = "schemers.leland.stanford.edu"; 將schemers.leland.stanford.edu改為你服務器的域名。。比如host.abc.com 這個無太大關系
二、將所有stanford改為你域名的中段(比如bendy.com,就改為bendy),將所有edu改為域名的後綴(比如bendy.com,就改為com)。。這個很重要。。我建議不要更改best。當然你也可以改
2,sweet.config 這個文件可以是用其它文件名的,具體在lbnamed.conf有設置。我建議大家先清空這文件。再重新建立新的。
這個文件的配置方法是
負荷服務器host 負重 組
比如。我自己的情況。有二台服務器。分別是bbs1.bendy.com和bendy2.bendy.com那我的配置文件就是

bbs1 1 bbs
bbs2 1 bbs

配置好這個文件後。你需要一個能對bbs1這個域名進行解析的方法。就是修改/etc/hosts文件。我的情況就是
192.168.1.1 bbs1
192.168.1.2 bbs2

這樣的話。poller程序就會檢測111.222.333.001、111.222.333.002的負荷情況了

至此,DNS服務器和均衡負載的服務器的程序已完成。可能我的說明不太清楚。現在我就一一列表說明

bbs1服務器 lbserver1 192.168.1.1 編譯運行lbcd
bbs2服務器 lbserver2 192.168.1.2 編譯運行lbcd
dns服務器 dnsserver 10.0.0.1 配置lbnamed 在/etc/hosts配置bbs1、bbs2域名解析

這樣的情況下。。在dns服務器運行lbnamed程序。系統就開始動作了。。lbnamed的啟動參數主要是 -l logfile和-d(debug)
./lbnamed -l lb.log -d
查看記錄(類似)
cat lb.log

-=====
05/30 00:59 21442 lbnamed starting poller
05/30 00:59 21442 lbnamed load_config
loading 1452 bbs2 192.168.1.2 bbs
loading 837 bbs1 192.168.1.1 bbs
05/30 00:59 21442 lbnamed ready to answer requests
05/30 00:59 21442 lbnamed do_maint
05/30 00:59 21442 lbnamed reloading config
05/30 00:59 21442 lbnamed load_config
loading 1671 bbs2 192.168.1.2 bbs
loading 1086 bbs1 192.168.1.1 bbs


  如果你沒有那些記錄。看文件sweet.config.unreach這是代表poller程序無法接收到對方服務器的負荷信息。。請檢查lbcd程序是否運行。。

  如果程序運行正常。那你的DNS服務器就正常運行了。
  如果檢查程序是否正常。。。用我們的nslookup就可以了。。。


C:\Documents and Settings\Administrator.XINGKONG-SERVER>nslookup
ault Server: ns.guangzhou.gd.cn
Address: 202.96.128.143

> server 10.0.0.1 //直接使用dns服務器
ault Server: [10.0.0.1]
Address: 10.0.0.1

> set type=all //設置查詢類型

> bbs.best.bendy.com //bbs是sweet.config設置的組名,best.bendy.com是在lbnamed.conf設置的
Server: [10.0.0.1]
Address: 10.0.0.1

bbs.best.bendy.com canonical name = bbs2.bendy.com //返回的信息。是DNS系統分配了bbs2給你這次的查詢(按二台服務器返回的負荷情況來分配的,並非隨便分配的)
bbs2.bendy.com internet address = 192.168.1.2 //而bbs.bendy.com在該在DNS系統的A記錄是192.168.1.2//最後結果bbs.best.bendy.com得到的IP地址是192.168.1.2


====
自此。。服務器方面的配置已經完成。
跟著是我們配置具體域名的dns解析。。。

方法也是很簡單,以bendy.com為例,在bendy.com的DNS管理加上以下記錄
一、加上二個best.bendy.com的ns記錄為ns1.bendy.com和ns2.bendy.com(也可以不止二個的.取決你有多少台服務器運行lbnamed
二、加上第一條添加的ns記錄的實際指向iP,分別指向各個運行lbnamed的服務器,比如ns1.bendy.com address 10.0.0.1/ns2.bendy.com address 10.0.0.2等。
三、添加bbs1.bendy.com和bbs2.bendy.com等的實際ip地址。。。正如剛才所說...bbs.best.bendy.com只將DNS記錄轉移為bbs1.bendy.com或者bbs2.bendy.com。而lbnamed是沒權對bbs1.bendy.com和bbs2.bendy.com進行解析的。。。所以。需要bendy.com的NAMESERER對它進行解析。
(ps:bbs1.bendy.com的記錄並不一定要求與lbnamed程序的相同。。。)
四、最後。。添加bbs.bendy.com cname to bbs.best.bendy.com。。。哈哈。。。大功告成。。。


DNS解析完成後,我們就完成本次任務了。。。

2007年11月5日 星期一

網頁log切割

網頁log切割
wget http://cronolog.org/download/cronolog-1.6.2.tar.gz
tar xzvf cronolog-1.6.2.tar.gz
cd cronolog-1.6.2
./configure
make
make install

#httpd.conf加入下列
ErrorLog "|/usr/local/sbin/cronolog /var/log/httpd/errors_%w.log"
CustomLog "|/usr/local/sbin/cronolog /var/log/httpd/access_%a.log" combined

2007年11月2日 星期五

外接式硬碟模組!!

外接式硬碟 !! ????

2007年10月23日 星期二

網吧XP無盤系統集成優化及母盤封裝

一、安裝設置
  
  1、 以正常方式安裝WINXP,安裝完之後即刻打上沖擊波、震蕩波補丁,然後安裝DIX9。0C,安裝五筆輸入法(無需安裝輸入法補丁),接著升級WMP10。0,安裝REALONE10。0,安裝暴風音影XP版,複制其他機上的WINRAR安裝目錄到系統中,以備不時之需(記住,不是安裝,是複制,安裝的話它會關聯所有壓縮文件),此時軟件部份安裝完畢。
  
  
  2、 安裝XPLITE,去掉不常用的附件
  
  
  1) 操作系統選項中保留:CLI OOK、DLLCACHE文件夾、ODBC數據源管理器、TWAIN圖像獲取驅動、幫助和支持中心、程序兼容工個、程序兼容性向導、核心字體、啟動預讀緩存、驅動緩存、升級包源文件
  
  2) 多媒體選項中保留:ATI I驅動程序、DIRECTSHOW VIDEO、ICM色彩配置文件、OPENGL圖形庫、WINDOWS MEDIA PLAYER、視頻解碼器、音量控制器、音頻解碼器
  
  3) 服務器組件保留選項:索引服務、在索引服務語言資源中保留繁體中文、簡體中文、美國英語、英國英語
  
  4) 通讀和消息中保留:USR/3COM調制解調器驅動、超級終端、傳真服務、電話撥號程序、無線連接配置
  
  5) 網絡實用程序保留選項:IE HTML RENDERING ENGINE、INTERNET EXPLORER、JAVA SCRIPT、JAVA虛擬機、TCP/IP命令行工具、VB SCRIPT、網絡連接管理
  
  6) 系統服務中保留:通用即插即用服務、智能卡服務
  
  7) 系統工具和實用程序中保留:BRIEFCASE、REMOTE A ISTANCE、WINDOWS腳本宿主
  
  8) 我沒寫上的全部去掉。
  
  
  二、注冊表優化
  
  
  1、 加速XP的開關機
  
  開啟注冊表編輯器,找到 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control,
  
  將 WaitToKillServiceTimeout 設為:500 ( 原設定值:20000 找到
  
  HKEY_CURRENT_USER\Control Panel\Desktop 鍵,將右邊視窗的
  
  WaitToKillA Timeout 改為 500, ( 原設定值:20000 即關閉程序時僅等待1秒。將 HungA Timeout 值改為:200( 原設定值:5000 , 表示程序出錯時等待0.5秒。
  
  
  2、 讓系統自動關閉停止回應的程式。
  
  
  打開注冊表 HKEY_CURRENT_USER\Control Panel\Desktop 鍵,
  
  將 AutoEndTasks 值設為 1。 ( 原設定值:0
  
  
  3、 加快Win XP瀏覽速度!
  
  
  打開注冊表點擊到:
  
  HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/Current Version/Explorer/RemoteComputer/Name ace。刪除下面所有的值如:{D6277990-4C6A-11CF-87-00AA0060F5BF}
  
  
  4、 不加載DLL文件  
  
  
  瀏覽器在使用之後往往會有部分DLL文件在內存中緩存好長一段時間,相當大一部分內存會被不用的DLL文件點用。為了防止這種事情發生,找到注冊表如下位置:
  
  HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionExplorer
  
  接下來建立一個名為AlwaysUnloadDLL,值為1的雙字節值。
  
  如果想要去除這項優化,只需把該鍵值設為0(也可以幹脆把鍵刪掉)。注意:該項優化要在Windows重新啟動後才生效。
  
  
  5、 完全關閉Windows XP文件保護功能。此招慎用
  
  
  從注冊表中找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon,修改&ldquo FCDisable」鍵值為「FFFFFF9D」,如果需要重新啟用該功能,重新設置為「0」就可以了。
  
  
  6、 加快菜單顯示速度
  
  
  在[開始][運行]鍵入[Regedit][HKEY_CURRENT_USER][Control Panel][Desktop],將字符串值[MenuShowDelay]的數值數據更改為[0],調整後如覺得菜單顯示速度太快而不適應者可將[MenuShowDelay]的數值數據更改為[200],重新啟動即可
  
  
  7、 加快預讀能力改善開機Windows XP預讀設定可提高系統速度,加快開機速度。按下修改可進一步善用CPU的效率:在[開始][運行]鍵入[Regedit][HKEY_LOCAL_MACHINE][SYSTEM][CurrentControlSet][Control][Se ionManager][MemoryManagement],在[PrefetchParameters]右邊窗口,將[EnablePrefetcher]的數值數據如下更改,如使用PIII 800MHz CPU以上的建議將數值數據更改為4或5,否則建議保留數值數據為默認值即3
  
  
  8、 和Windows 2000一樣,XP在瀏覽局域網時也存在煩人的延遲問題,但介紹這個問題的資料卻很難找到。如果你瀏覽一台Win 9x的機器,例如,在網上鄰居的地址欄輸入「\computername」,XP的機器會在它正在連接的機器上檢查「任務計劃」。這種搜索過程可能造成多達30秒的延遲。如果你直接打開某個共享資源,例如在網上鄰居的地址欄輸入「\computernameshare」,就不會有這個延遲過程。要想避免XP搜索「任務計劃」的操作,提高瀏覽網絡的速度,你可以刪除HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionExplorer
  
  RemoteComputerName ace{D6277990-4C6A-11CF-8D87-00AA0060F5BF}子鍵。該鍵的類型是REG_SZ。
  
  
  9、 XP中讓程序開機即運行的新方法   
  
  
  點擊「開始」菜單中的「運行」,在打開的「運行」對話框中輸入「Regedit」,打開注冊表編輯器。順次展開注冊表到HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows下,在這裏新建一個字符串值,方法是右擊主鍵「Window rdquo;,在彈出的菜單中選擇「新建&rdquo rarr ldquo;串值」,把該字符串值命名為「load」。然後,雙擊「load」,在彈出的窗口中將它的鍵值改為你想開機就自動運行的程序路徑。要注意的是應該使用文件的短文件名,即「C:\Program File rdquo;應該寫為「C:\Progra~1」。

  
  10、 關閉不用的共享   
  
  
  安全問題一直為大家所關注,為了自己的系統安全能夠有保證,某些不必要的共享還是應該關閉的。用記事本編輯如下內容的注冊表文件,保存為任意名字的.Reg文件,使用時雙擊即可關閉那些不必要的共享:   
  
  Windows Registry Editor Version 5.00   
  
  [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
  
  \lanma erver\parameters]   
  
  "AutoShareServer"=dword:00000000   
  
  "AutoSharewk quot;=dword:00000000   
  
  [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa]   
  
  "restrictanonymou quot;=dword:00000001
  
  
  11、 取消磁盤空間不夠警告提示   
  
  
  Windows XP會自動監控磁盤空間剩餘量,一旦磁盤空間不足的話,會提示你並掛起系統還原功能。如果要取消的話,就打開注冊表編輯器,找到HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies
  
  \Explorer,新建一個Dword值NoLowDisk aceChecks,然後修改為1即可。
  
  
  12、 讓WINDOWS XP自動登陸  
  
  
  打開:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon,在右邊的窗口中的新建字符串"AutoAdminlogo quot;,並把他們的鍵值為"1",並且把「DefaultUserName」的值設置為用戶名,並且另外新建一個字符串值「DefaultPa word」,並設其值為用戶的密碼。
  
  
  三、服務優化(我在這裏只提幾個重要的服務,在保證啟動速度和正常使用下要啟用的服務)
  
  
  1、 cryptogr aphic services:這個服務到底做什麼用的很多人不明白,其實它就是用來檢測你所安裝的軟件及硬件驅動是否通過了微軟認證,停止它也可以正常使用,但是如果大家要做萬能GHOST封裝的時候就會有麻煩了,當你把GHOSTXP重新GHOST到其他機時,裝任何一個驅動,都會不停的提示是否安裝驅動,很麻煩,所以建議大家做母盤時不停用它,當安裝完所有硬件及軟件之後再停用它。
  
  
  2、 EVENT LOG:這個相信大家都清楚是用來做什麼的,是用來記錄事件的,雖然也在其他論壇上看到過說可以停用它,因本人技術有限,無法告之大家如何停用它且不出現服務出錯的問題。
  
  
  3、 PLUG AND PLAY:這個我就不說了,只能啟用不可停
  
  
  4、 Remote Procedure call(RPC):這個服務想必也不用我說了
  
  
  5、 SERVER:停止了它局域網就用不了
  
  
  6、 Shell hardware Detection:這個服務是最令我鬱悶的服務,我自已精簡的包如果停用它最少要12秒才能啟動,啟用它就啟動一閃而過,這個服務是用來檢測硬件改動的,停用也能正常使用,但本人為了保持啟動速度,不禁用它
  
  
  7、 Themes:主題服務,停用它界面就變成2000了,既然用XP,一定的漂亮還是要的。
  
  
  8、 WINDOWS AUDIO:聲音嘛,當然都要聽了
  
  
  9、 WORKSTATION:這個是用來創建和維護網絡連接的,如果我們不安裝BXP的話也可以停止,局域網其實也能正常使用的,但是BXP要用它,沒辦法。
  
  
  10\Logical disk manager:這個是用來管理磁盤的,安裝BXP的時候要用到它,做母盤是先不禁用它,等安裝完一切之後才禁用它。
  
  
  四、系統設置
  
  
  1、 系統優化設置。
  
  1、刪除Windows強加的附件:
  
  a . 用記事本NOTEPAD修改\wi t\inf\sysoc.inf,用查找/替換功能,在查找框中輸入,hide(一個英文逗號緊跟hide),將「替換為」框設為空。並選全部替換,這樣,就把所有的,hide都去掉了,
  
  b. 存盤退出,
  
  c. 再運行「添加-刪除程序」,就會看見「添加/刪除 Windows 組件」中多出了好幾個選項;這樣你可以刪除好些沒有用的附件
  
  2、 2.關掉調試器Dr. Watson;
  
  運行drwt 32,把除了「轉儲全部線程上下文」之外的全都去掉。否則一旦有程序出錯,硬盤會響很久,而且會占用很多空間。如果你以前遇到過這種情況,請查找user.dmp文件並刪掉,可能會省掉幾十M的空間。這是出錯程序的現場,對我們沒用。另外藍屏時出現的memory.dmp也可刪掉。可在我的電腦/屬性中關掉 OD時的DUMP
  
  3.關閉「系統還原」:鼠標右健單擊桌面上的「我的電腦」,選擇「屬性」,找到「系統還原」,如果你不是老劈裏啪啦安裝一些軟件(難道你比我還厲害??),你也可以去掉,這樣可以節省好多空間
  
  4.關閉「休眠支持」:因為休眠功能占的硬碟空間蠻大的, 所以關閉比較好,
  
  控制台電源選項休眠(不要打勾)
  
  注:我覺得休眠還是很有用的。藍調。
  
  3、 壓縮文件夾
  
  這是一個相當好的優化,Windows XP內置了對.ZIP文件的支持,我們可以把zip文件當成文件夾瀏覽。不過,系統要使用部分資源來實現這一功能,因此禁用這一功能可以提升系統性能。實現方法非常簡單,只需取消zipfldr.dll的注冊就可以了,點擊開始&mdash gt;運行,敲入: regsvr32 /u zipfldr.dll 。然後回車即可。
  
  4、 關閉錯誤回報
  
  控制台--系統--進階--右下角-錯誤報告--關閉
  
  5、 )"我的電腦"-> quot;屬性"-> quot;高級"-> quot;啟動和故障修複"中,點"錯誤報告",選擇"禁用錯誤彙報"、"但在發生嚴重錯誤時通知我"。
  
  (3)點擊"編輯",在彈出記事本文件中:
  
  [Operating Systems] Ed
  
  timeout=30 //把缺省時間 30 秒改為 0 秒 =
  
  multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Profe ional" /fastdetect //把缺省 fastdetect 改為 nodetect 2r
  
  注冊表修改方法:"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control" ,SystemStartOptio 鍵值改為NODETECT。
  
  6、 優化「啟動和故障恢複」設置:   
  右鍵單擊「我的電腦」,點擊屬性,點擊「高級」,在「啟動和故障恢複」6L
  
  一欄中,點擊「設置」,其中的「系統失敗」一欄中,只選擇「自動重新啟動」,寫入調試信息選擇「無」
  
  7、 關閉「Internet時間同步」功能:如果啟用了同步,你的計算機時鍾每周就會和 Internet 時間服務器進行一次同步,建議關掉它(一個沒多大用的功能)。請依次單擊「開始」
  
  &rarr ldquo;控制面板&rdquo rarr ldquo;日期、時間、語言和區域選項」,然後單擊「日期和時間&rdquo rarr ldquo;Internet時間」。
  
  8、 取消對zip文件的支持:
  
  運行,敲入:regsvr32 /u zipfldr.dll 然後回車即可
  
  9、 關掉快速切換功能:方法如下:控制面板用戶帳戶,點擊「更改用戶登陸或注銷方式」,去掉「使用快速用戶切換」就可以了。
  
  10、 減少磁盤掃描等待時間
  
  在dos下,鍵入「chkntfs/t:0」



  
  11、 .解除帶寬限制 >
  
  運行----gpedit.msc-----管理模版-----網絡----QoS數據包調度程序---限制可保留帶寬---啟動-----下面輸入 0 ----確定---------在你的撥號圖標右健屬性找到網絡-----看看有沒有QoS
  
  數據包調度程序-------如果沒有點安裝-----服務------添加----選QoS數據包調度程序----看看有沒有打勾----有就代表成功了--------重啟---ok! #
  
  12、 .取消系統休眠支持8
  
  右鍵屬性-屏幕保護程序-電源-休眠-取消
  
  13、關掉視頻預覽ee
  
  運行一下這個命令:「REGSVR32 /U SHMEDIA.DLL」
  
  
  五、封裝前收尾工作
  
  
  1、 刪除c:\windows\font裏面所有字體顯示為0字節的字體文件
  
  2、 刪除c;\windows\help下面的所有文件
  
  3、 刪除C盤WINDOW文件夾下面IME、MEDIA、MSAGENTS、TEMP、CURSORS下面的所有文件
  
  4、 清理IE緩存
  
  5、 打開我的電腦中的文件夾選項,點擊查看,把其中的自動搜索網絡文件夾和打印機、記住每個文件夾的視圖設置的勾去掉,然後在查看欄中點擊列表顯示,
  
  6、 點擊C盤右鍵,再點屬性,把允許索引服務編制該磁盤的索引以快速搜索文件的勾去掉
  
  7、 刪除C盤WINDOW下面PREFETCH文件夾中的所有文件。
  
  8、 搜索*。TMP文件,全部刪除
  
  9、 把頁面文件設成無
  
  10、 最後一步,用磁盤整理工具整理碎片,至此結束對XP的整體優化
  
  
  六、封裝打包
  
  
  制作純淨版的主導思想:盡量兼容各種機子、盡量不要減肥、盡可能幹淨。
  
  a) 在XP安裝光盤中打開\SU ORT\TOOLS\DEPLOY.CAB文件,先在 C:盤根目錄下建議一個名為Sy rep 的文件夾,並將DEPLOY.CAB壓縮包文件用Winrar全部解壓縮到 c:\sy rep目錄。
  
  b) 複制「死性不改「的最新電源判斷程序。及DLLCACHE備文程序到C:\sy rep文件夾中。
  
  一)、刪除硬件驅動
  
  1、更改 IDE ATA/ATAPI控制器, 這一步就是XP系統萬能GHOST的主要步驟所在!為了適應現在各種不同的主板,(如Inter 主板,VIA主板,SIS主板)則必須將你本機的IDE 控制器改成 標准的雙通道 PCI IDE控制器
  
  二)、再把計算機的改為Standard PC,方法和上面的一樣!
  
  三)、盡可能避免幽靈硬件及2個Standard PC出現:
  
  幽靈硬件是指GHO鏡像制作好後,重新恢複到新機上,經常會發現出現「幽靈硬件」,即在設備管理器中,查看-顯示隱藏設備時,會發現有不少灰色的設備或者同一個設備有2份。目前仍然是GHOST的大難題之一。
  
  a) 把把計算機的改為Standard PC後,執行至少3-5次的DEL_DRIVER.BAT,然後第1次重新啟動計算機!
  
  b) 第1次重新啟動計算機後,到設備管理器中,點擊查看-顯示隱藏的設備,然後把顯示為灰色的右鍵點擊設備,一一卸載刪除,如果出現2個Standard PC,則一定要卸載刪除一個Standard PC,只保留一個。然後再第2次重新啟動計算機。
  
  c) 第2次重新啟動計算機後再次進入系統後,執行執行至少3-5次的DEL_DRIVER.BAT!
  
  d) 到設備管理器中,點擊查看-顯示隱藏的設備,然後,會發現剩下的設備已經不多了。把顯示為灰色的右鍵點擊設備,一一卸載刪除。一般情況下是沒有可卸載刪除的硬件的了。
  
  四)、避免出現本地連接2的方法:
  
  有時做出來的GHO鏡像,恢複到只有一塊網卡的機子上時,會出現本地連接2,卻沒發現本地連接,很不爽也!處理方法如下:
  
  開始-運行-REGEDIT,然後編輯-查找,輸入「本地連接」,找著後,把它的上一級分支一並刪除。按F3繼續查找&helli helli helli
  
  五)、系統封裝過程
  
  1、制作sy rep.inf. 這裏有一份我做好的,大家只要複制下來就行,有些內容是經過本人更改的,內容如下:
  
   etupMgrTag
  
  [Unattended]
  
  OemSkipEula=Yes
  
  [GuiUnattended]
  
  Admi a word=*
  
  EncryptedAdmi a word=NO
  
  OEMSkipRegional=1
  
  TimeZone=210
  
  OemSkipWelcome=1
  
  [UserData]
  
  ProductKey=DG8FV-B9TKY-FRT9J-6CRCC-XPQ4G
  
  FullName="藍貓"
  
  OrgName="藍貓工作室"
  
  ComputerName=*
  
  [RegionalSettings]
  
  LanguageGroup=10
  
  [GuiRunOnce]
  
  Command0="C:\WINDOWS\DllCacheManager.exe /restore"
  
  [Identification]
  
  JoinWorkgroup=WORKGROUP
  
  [Networking]
  
  I tallDefaultComponents=Yes
  
  3、DllCache文件的刪除與恢複:
  
  複制我提供的DllCacheManager.exe到C:\WINDOWS目錄下面,點擊備份,備份完之後退出 1、 安裝電源自動判斷程序。
  
  運行死性不改最新電源程序,選擇完整安裝,安裝完之後退出,運行M REP,在等待時間中寫10,然後點擊確定,等它運行完畢之後顯示重啟後制作GHOST包,然後關機,把C盤做成映像即可。

無盤遠程引導技術

  無盤工作的原理

  1、當客戶機啟動後,其網卡上的Boot Rom 會發送一個FIND幀,server端遠程啟動服務收到客戶機廣播的FIND幀後,根據幀中所帶的網卡ID號,檢查遠程啟動數據庫中是否有該卡號的配置記錄:如果不存在這個記錄,引導過程不能繼續;如果此工作站的記錄已經存在,遠程啟動服務發送一個FOUND幀,同樣,這個幀中包含了服務器的網卡ID。

  2、工作站收到第一個響應後(當網絡上有不止一台的Sever在運行遠程啟動服務,工作站只對收到的第一個FOUND幀響應),則發送一個SEND.FILE.REQUEST Frame給第一個響應的遠程啟動服務器,以請求傳送啟動所需的文件。

  3、當遠程啟動服務器收到SEND.FILE.REQUEST Frame的要求後,會根據其遠程啟動數據庫中的工作站記錄查找對應的啟動塊,就是boot block,將工作站所需的啟動文件傳送給工作站,即給工作站一個FILE.DAT.RESPONSE幀,這個幀包含了工作站啟動所需的啟動塊。

  4、工作站接收到完整的啟動文件後,就開始執行文件中的啟動程序,將執行點轉向啟動塊的入口,啟動工作站。當然不同的操作系統有不同的引導方式。

  早期無盤工作站的缺點
  1、早期的無盤工作站多為手工拼湊,價格便宜,經常和鼠標發生沖突。
  2、組網多選用Novell,其命令繁多,安裝配置必須是專業人士。
  3、支持WIN95遠程引導的RPL技術通用性差,技術不成熟。
  4、 配合Windows CE而設計的Terminal技術,雖克服RPL的許多不足,但Windows CE與Win9X相比有明顯不足。

  PXE原理及優點

  1、PXE簡介

  正當市場上對新技術的推出有迫切需求的同時,Intel不失時機地推出了PXE遠程無盤引導技術,其配合Qualystem公司的LiteNet,並選用台灣DTK公司的E-Terminal,以實現Windows 98的遠程啟動和執行,使得可靠性和穩定性都大大提高。Win 98的各種應用軟件只需通過簡單的幾個步驟即可加到終端上,並可隨時升級和擴充。

  2、PXE工作原理

  (1)DTK專門設計的 E-Terminal主機BIOS中包含PXE遠程引導模塊,開機啟動後,會通過DHCP服務器得到本機IP地址,並將PXE Boot Server的內容下載到本機內存中執行。

  (2)通過LiteNet,遠程引導Windows 98,並根據設好的用戶名登錄上NT服務器,以後就可像有盤PC一樣自由地操作電腦了。

  3、PXE優點

  (1)因為其能支持Windows、Linux遠程啟動,所以現有的各種應用軟件都能得到非常好的應用。由於系統本機內存為64MB,虛擬內存大小可在服務器自由設定,另具有3D圖形視覺增強和AC97 CODEC軟件音頻功能,進行3D處理和玩遊戲也就是小菜一碟了。

  (2)PXE還有一個最大的優點就是安全性,不管多少個終端——10台還是100台,系統和應用軟件就只有一套 ,對用戶的權限是在服務器上設定的,用戶可以在自己的目錄下隨便操作,若有了誤操作,重新啟動便可以完全恢複。因為本機軟盤硬盤統統沒有,原先一直擔心的硬盤數據出錯、感染病毒等問題就再也不會困擾您了!

  (3)操作維護簡便:想升級軟件嗎?只需給服務器重新傳一遍LiteNet,最多半小時,所有終端便已全部升級了。電腦壞了換新的也很簡單:插上網線,記下網卡號,在服務器上只需修改一句話就可以了。想給所有終端升級BIOS也只需將服務器的 Boot Server重建一遍就行了。

  綜上所述,在以上所述的方案中,PXE作為一個新興的技術,相信在不久的將來,必將被推廣到市場的方方面面,也必定能成為遠程引導技術的主流。

pxe 網路開機

最近突想做pc的網路開機,整整再google找了兩,三天,總算有幾篇教導利用 pxelinux 做開機的方式,我的做法如下

原網站網址:http://ms7.fhsh.tp.edu.tw/blog/shyong/archives/27

2007年10月22日 星期一

[備忘]EBS1.6x updata 1.63x

[下載] EBS1.6x updata 1.63x
EBS 1.6 by ek9 (http://k1.4.to)

檔案 :
buy (777)
└rireki.dat (666)
depot (777)
└depot.db (666)
ebs_log (777)
└_bougu.data (644)
_ex.data (644)
_hash.data (644)
_hash2.data (644)
_hash3.data (644)
country_data.dir (666)
country_data.pag (666)
country_data1.dir (666)
country_data1.pag (666)
dellistdb.dir (666)
dellistdb.pag (666)
gouseidb.dir (666)
gouseidb.pag (666)
history_data.dir (666)
history_data.pag (666)
logdata.dir (666)
logdata.pag (666)
loginlist.dir (666)
loginlist.pag (666)
memdata.dir (666)
memdata.pag (666)
message.dir (666)
message.pag (666)
newlists.dir (666)
newlists.pag (666)
log (777)
└kaigisitu.log (666)
log2 (777)
logfolder (777)
miuler2 (777)
└_bougu.data (666)
souko (777)
wea (777)
└bukidb.db (666)
wea.dir (666)
wea.pag (666)
zhi (777)
└_hash.data
images (755)
└img1 (系統圖)
└img2 (機體圖)
└img3 (機師圖)
admin.cgi (755) (管理)
admin2.cgi (755) (管理)
config.cgi (755) (設定)
ballance.cgi (755)
bbs.cgi (755)
bbs.dat (666)
bukikodb.dir (666)
bukikodb.pag (666)
buy.cgi (755)
dellistdb.dir (666)
dellistdb.pag (666)
depot.cgi (755)
ebs_log.dir (666)
ebs_log.pag (666)
ebsmake.cgi (755)
factory.cgi (755)
fdp.cgi (755)
gm.js (644)
gm.js1 (644)
go.htm (644)
gousei.cgi (755)
gouseidb.dir (666)
gouseidb.pag (666)
history.cgi (755)
hukubiki.cgi (755)
kaigisitu.cgi (755)
kaigisitu.log (666)
kunijyouhou2.cgi (755)
kunijyouhou.cgi (755)
master.cgi (755)
member3.cgi (755)
member.cgi (755)
members.cgi (755)
message.cgi (755)
miulerfactory.cgi (755)
name.cgi (755)
newlistdb.dir (666)
newlistdb.pag (666)
news_detail2.htm (644)
news_detail.htm (644)
not1.htm (644)
not.htm (644)
oneli.cgi (755)
ranking.cgi (755)
restore.cgi (755)
souko.cgi (755)
wea.cgi (755)
weapon.htm (644)
weaponlist.cgi (755)
zhi.cgi (755)
zhidb.dir (666)
zhidb.pag (666)
ebs.cgi (755)
ebs_sub1.cgi (755)
ebs_sub2.cgi (755)
ebs_sub3.cgi (755)
ebs_sub4.cgi (755)
ebs_sub5.cgi (755)
ebs_sub6.cgi (755)
ebs_sub7.cgi (755)
說明.txt

http://skyfung.kilu.de/ebs1 6 zip

--------------------------------------------------
up 1.63x

檔案 :
admin2.cgi (755)
gousei.cgi (755)
ranking.cgi (755)
miulerfactory.cgi (755)
config.cgi (644)
ebs_sub1.cgi (755)
ebs_sub2.cgi (755)
member3.cgi (755)
not1.cgi (755)
not2.cgi (755)
pass.cgi (755)
說明.txt

http://skyfung.kilu.de/up1 63x zip

2007年10月19日 星期五

由日本發起、新的開放系統Mona OS

自由軟體 : 由日本發起、新的開放系統Mona OS
發表人 droger 於 2007/10/9 0:11:09 (1591 人讀取)
新聞來自 http://www.osnews.com/
Mona OS是一個由C++寫成的一個MicroKernel的系統,在另一個部落格當中看到
是從日本一個使用度相當高的web討論版2ch所聚眾發起的,主要特色在於系統簡潔
適合讓學校或寫程式針對作業系統方面來教學使用,Mona OS是採MIT授權發行
以下是新聞擷取
引言:

MonaOS is a free operating system. It's new, small, simple, open source and well structured. So, MonaOS may be suitable for education of operating system and program at school." It's a microkernel-based operating system, MIT-licensed, and available for IA-32.

全文網址
http://www.osnews.com/story.php/18732/Introducing-MonaOS

http://monaos.org/about.html

Zenity - 對話框產生器

Zenity - 對話框產生器
Cat.: 小工具, 爬網探險
18. October 2007
zenity 這東西真的很好用,可以快速產生一些有用的 dialog,像是為了快速在網路上抓一些 0rz 的謎物,以下 script 就很方便 :p

#!/bin/sh
URL="http://0rz.tw/"
NUM=`zenity --entry --text $URL`
if [ $NUM != "" ]; then
wget -P ~/Desktop $URL$NUM 2>&1 | \
sed -u 's/.*\ \([0-9]\+%\)\ \+\([0-9.]\+\ [KMB\/s]\+\)$/\1\n# Downloading \2/' | \
zenity --progress --title="Downloading File..." --auto-close
fi

遠端安裝 Fedora Core Linux

發表人 ceasar _POSTON 2006/12/4 14:46:12 (394 人讀取)
Reference:
http://cha.homeip.net/blog/archives/2006/11/_fedora_core_li.html

引言:


遠端機房裡的 Linux Server 掛點了, 當地技術人員並不熟悉 Linux, 幸好還有這一招 :)

* VNC 遠端連線安裝
* Telnet 遠端連線安裝



VNC 遠端連線安裝

方式一: 安裝時啟動 VNC Server, 允許遠端 VNC Client (vncviewer) 連入操作安裝步驟

光碟開機後, 輸入以下指令:

linux vnc

待畫面出現:

The VNC server is now runing.
Please connect to xx.xx.xx.xx:1 to begin the install...
Starting graphical installation...

從其他電腦以 vncviewer 連入 xx.xx.xx.xx:1 即可

預設沒有連線密碼, 欲設置 VNC 連線密碼可加上 vncpassword 參數:

linux vnc vncpassword=your_password

若想使用固定 IP, 可加上 ip 參數:

linux vnc ip=192.168.1.100 netmask=255.255.255.0 getway=192.168.1.254

方式二: 由 VNC Server 直接推送連線訊號給 VNC Client (vncviewer listen mode)

先在 VNC Client 電腦上啟用 VNC Viewer Listen Mode: (預設 tcp port 5500)

* RealVNC @ Windows:
程式集 → RealVNC → VNC Viewer 4 → Run Listening VNC Viewer
 
* UltraVNC @ Windows:
程式集 → UltraVNC → UltraVNC Viewer → Run UltraVNC Viewer (Listen Mode)
 
* VNC @ Linux:
vncviewer -listen

光碟開機後, 輸入以下指令:

linux vnc vncconnect=vnc.client.ip.address


Telnet 遠端連線安裝

光碟開機後, 輸入以下指令:

linux text telnet

待畫面出現:

Waiting for telnet connection...

按 Alt + F3 查看 IP Address: (若搭配 ip 參數指定固定 IP 則免此步驟)

* going to beTelnet for xx.xx.xx.xx

從另一台電腦以 telnet 連入:

Linux: telnet xx.xx.xx.xx

Windows: putty -telnet xx.xx.xx.xx (putty 下載頁面)


其他參數:

* lang=指定安裝時的語言, 預設為英文: en_US; 繁體中文為 zh_TW
* keymap=指定鍵盤類型, 一般為 us
* ks=載入 kickstart 安裝設定檔, 詳見 Fedora 官方說明

後記:

* Fedora Core 3 無法以 telnet 連入 (會發生 "Cannot open /dev/ttyp0" 的錯誤); 而 Fedora Core 6 就沒問題.
* telnet 連線操作時, 若中途中斷連線, 被控端電腦會自動重新啟動.
* 以 GRUB4DOS 安裝時, 在 vmlinuz 後面加上 vnc 或 telnet 參數, 即可進行遠端安裝.
* yum install system-config-kickstart 可安裝 kickstart 設定程式

References:

* Fedora Installation Guide - Boot Options
* 經由 VNC 安裝 Redhat Linux

Related Links:

* 網路安裝 Linux
* 利用 GRUB4DOS 安裝 Linux

Linux 系統裁減指南(LiPS) (繁體中文版) --(二)

Linux 系統裁減指南(LiPS) (繁體中文版) --(一)
http://www.ceasar.tw/modules/news/article.php?storyid=191

Linux 系統裁減指南(LiPS) (繁體中文版) --(二)
http://www.ceasar.tw/modules/news/article.php?storyid=192


5 根文件系統

  創建根文件系統比編譯內核要複雜的多,也更難理解。這裡的關鍵是掌握init
rd(初始化RAM盤)的使用方法。
5.1 根文件系統
  這裡我們將要創建的根文件系統與通常Linux主機的根文件系統類似,只是它應
該僅僅包括系統運行所必須的應用程序、庫和相關文件的最小集合。根文件系統的
尺寸大小是一個重要的指標。
5.2 文件系統的內容
5.2.1 應用程序(applications)
  /bin,/sbin,/usr/bin,/usr/sbin
  應用程序大致可以分為3部分,第一是操作系統正常運行所需的基本工具軟件,
比如bash,cp,rm等;第二是提供某項服務的服務器軟件,比如httpd,telnetd,
proftpd等;第三是我們所開發的應用程序。其實後面講的配置文件等也可以粗略按
照這個原則來分類。
  到底需要複製哪些軟件,彈性是比較大的,很多軟件都是可要可不要,可以實
際情況靈活選擇。這個列表可能很長,並且變化也比較大,因此不在這裡列出。
  為了進一步減小所創建的根文件系統的尺寸,可以考慮使用下列工具包軟件來
替代某些標準的工具:
O BusyBox(http://www.busybox.net)
O TinyLogin(http://tinylogin.busybox.net)
O Embutils(http://www.fefe.de/embutils/)
  其詳細使用方法請參考相關資料,此處不再贅述。LIPS的實現目前沒有使用這
些軟件包。
5.2.2 設備文件(device files)
  /dev
  設備文件也可以稱作設備節點(device node)。設備文件非常重要,缺少某些
有些設備文件可能導致系統不能正常運行甚至不能引導。有些設備文件是必須的,
而更多的是根據具體目標系統的硬件配置來進行取捨。
  比如硬盤的設備文件,在完整的系統中一般有hda,hdb,……,hdt,即最多支
持20個IDE硬盤,每個硬盤有hdX1,hdX2,……,hdX32,(其中X表示a-t),即支
持32個分區,另外還有表示SCSI硬盤的節點。根據實際情況,如果只需要支持少量
的硬盤、少量的分區,這些節點可以被大大簡化。如果目標系統中沒有的設備,其
對應的設備文件也可以省掉。
設備文件
描述
/dev/console
系統控制台設備,非常重要。
/dev/fd0
第一個軟驅
/dev/hda
/dev/hda[1-8]
IDE硬盤及分區
/dev/initctl
實際上是一個FIFO設備,跟init有關(切換運行級別時用於新init與原init通信)

/dev/initrd
Initial RAM disk
/dev/input
(目錄)Input core(包括遊戲桿、鼠標等)
/dev/kmem
內核虛擬內存
/dev/loop[0-7]
Loopback設備
/dev/mem
訪問物理內存
/dev/null
NULL設備
/dev/psaux
PS/2鼠標
/dev/ptmx
UNIX98 PTY master
/dev/pts
(目錄)UNIX98 PTY slaves
/dev/ptyp[0-7]
偽終端主設備(遠程登錄使用)
/dev/ram[0-7]
/dev/ramdisk
/dev/ram
RAM Disk設備。至少/dev/ram0是應用initrd機制所必須的。
/dev/ramdisk鏈接到/dev/ram0,是為了兼容老版本內核而保留的。
/dev/ram鏈接到/dev/ram1。
/dev/random
隨機數發生器
/dev/sda
/dev/sda[1-8]
SCSI磁盤及分區設備
/dev/shm
共享內存設備
/dev/systty
指向系統tty設備的符號鏈接,一般是tty0。
/dev/tty
當前TTY設備
/dev/tty[0-7]
虛控制台(Virtual console)
/dev/ttyp[0-7]
偽終端從設備
/dev/ttyS0
/dev/ttyS1
串口(COM1和COM2)
/dev/urandom
速度更快、安全性較差的隨機數發生器
/dev/zero
零設備,只能讀0出來
  設備節點的主設備號(Major)、次設備號(Minor)的文檔是內核源代碼中的
/Documentation/device.txt,如果有疑問可以查看這個文件[8]。
5.2.3 腳本和配置文件(scripts and configuration files)
  /etc
  /etc/rc.d目錄下的啟動腳本是系統的重要部分。必須對啟動腳本做相應的修改
以簡化系統的啟動過程。
  系統和各種應用程序用到的幾乎所有的配置文件都位於/etc目錄,是裁減Linu
x最麻煩的部分,最容易出問題。配置文件的選擇需要綜合很多方面的信息,需要對
系統有比較全面、深入的瞭解,並結合經驗才能做出正確的判斷。
配置文件
描述
/etc/default
(目錄)某個命令(比如useradd)的缺省設置(man useradd(8))
/etc/ld.so.cache
由ldconfig命令根據/etc/ld.so.conf文件產生
/etc/ld.so.conf
庫文件路徑配置文件,ldconfig命令根據該配置文件生成/etc/ld.so.cache
/etc/localtime
本地時間、時區設置
/etc/login.defs
全局缺省設置
/etc/fstab
文件系統列表(man fstab(5))
/etc/group
組文件(man group(5))
/etc/hosts
列出主機名和IP地址(man hosts(5))
/etc/init.d
符號鏈接到/etc/rc.d/init.d
/etc/initlog.conf
Initlog日誌配置文件(man initlog(8))
/etc/inittab
Init配置文件(man inittab(5))
/etc/ioctl.save
該文件包含了用於單用戶模式的串口和終端參數,因為這些參數是由getty設置的,
而在單用戶模式時沒有運行getty,所以用該文件保存參數。單用戶模式對系統安全
是個威脅,我們應該禁止使用單用戶模式,因此這個文件實際上並沒有必要複製過
來。
/etc/issue
登錄信息和標識文件(man issue(5))
/etc/modules.conf
模塊的配置文件(man modules.conf(5))
/etc/mtab
已經掛載的文件系統列表(man mount(8))
/etc/nsswitch.conf
Name Service Switch的配置文件(配置名稱服務數據源和查詢的順序)(man nss
witch.conf(5))
/etc/pam.d
放置PAM配置文件的目錄(有關PAM請參考5.5節)
/etc/passwd
用戶口令文件(man passwd(5))
/etc/profile
系統環境變量和登錄配置文件
/etc/rc.d
放置啟動腳本的目錄
/etc/services
列出可用的網絡服務及其端口(man services(5))
/etc/termcap
終端(terminal)功能數據庫(man termcap(5))
  還有那些跟特定應用程序相關的配置文件,比如apache服務器需要的/etc/htt
pd/conf/httpd.conf 等,此處不再一一列出。
5.2.4 庫文件(libraries)
  /lib,/usr/lib,/usr/share
  庫文件也是系統運行所必需的。到底需要哪些庫文件,是根據所複製的可執行
程序用 ldd 工具來確定的。比如,要知道/bin/bash需要哪些庫文件,使用如下命
令:
[root@lips xmdong]# ldd /bin/bash
libtermcap.so.2 => /lib/libtermcap.so.2 (0x40020000)
libdl.so.2 => /lib/libdl.so.2 (0x40024000)
libc.so.6 => /lib/tls/libc.so.6 (0x42000000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
  對複製到新的根文件系統的每個可執行程序,都要使用這種方法來確定其所需
要的庫,然後把這些庫文件也複製過來。
  需要注意的是,有些庫文件使用上述方法是找不出來的,但是卻是系統必須的
。比如:
庫文件
描述
/lib/libnss_files*
這個庫是跟/etc/nsswitch.conf有關的,必不可少,否則系統不能正常使用。(ma
n nsswitch.conf(5))
/lib/security/pam_unix.so
這個庫跟PAM有關,是安全、認證方面的,必不可少,否則系統無法登錄。
  
  
5.2.5 必要的目錄
  /home,/mnt,/proc,/root,
  /var,/var/log,/var/run,/var/lock/subsys
  
  
5.3 初始化RAM盤(initrd)
  (參考資料[5])
  初始化RAM盤(initrd)提供了引導器加載RAM盤的能力。這個RAM盤可以被掛載
(mount)成根文件系統,並執行其上的程序。然後,可以從另一個設備掛載一個新
的根文件系統,而原來的根文件系統(也就是initrd)會被移到一個目錄裡並卸載

  initrd技術主要設計用來讓系統啟動過程可以分兩個階段進行,首先讓內核以
一組最小的、被編譯進內核裡的驅動程序來啟動,然後從initrd中加載其他的模塊

5.3.1 操作步驟
  使用initrd時,系統典型的引導步驟如下:
1) 引導器加載內核和初始化RAM盤;
2) 內核把initrd轉到一個一般的RAM盤中,並且釋放原來被initrd佔用的RAM;
3) initrd以可讀寫模式被掛載到根目錄;
4) 執行/linuxrc(linuxrc可以是任何可執行文件,包括shell腳本在內;它具有u
id 0即超級用戶的權限,基本上可以做init程序中能夠做的任何事情);
5) 在linuxrc中掛載真正的根文件系統;
6) linuxrc使用pivot_root系統調用,把真正使用的根文件系統掛載到根目錄;
7) 在根文件系統上執行通常的引導過程(比如執行/sbin/init);
8) initrd文件系統被刪除。
  注意,改變根目錄並不包括卸載舊的根文件系統,因此有可能在轉變過程中仍
有進程在initrd上運行。另外,掛載在initrd目錄下的根文件系統仍然是可用的。

5.3.2 引導選項
  initrd技術增加了下列引導選項:
initrd=
  裝入指定的文件作為初始化RAM盤。當使用 LILO 當引導器時,你可以用/etc/
lilo.conf 文件中 INITRD 這個配置參數,來指定初始化RAM盤文件。
noinitrd
  initrd的數據仍會保留,但不會裝入到一個RAM盤裡,真正使用的根文件系統將
會被掛載。initrd的數據能夠從 /dev/initrd 這個設備中被讀出來。注意,initr
d的數據可以是任何結構,並不一定必須是一個文件系統的映像,這個選項主要用來
進行debug。
  注意:/dev/initrd 是一個只讀並且只能使用一次的設備,最後一個程序一旦
關閉它, 所有數據將被釋放,而且設備也不能再被打開。
root=/dev/ram0
  initrd 先被掛載成根目錄,接著進行正常的啟動過程(這時RAM盤仍被掛載成
根)。
5.3.3 安裝
  首先:我們要在正常的根文件系統中創建一個容納initrd文件系統的目錄,例
如:
# mkdir /initrd
  對目錄名稱並沒有特別的限制,在pivot_root(2)的man手冊頁中有更詳細的說
明。
  如果根文件系統是在引導程序時被建立的(例如,你在製作安裝軟盤),在建
立根文件系統的同時應該創建 /initrd 目錄。
  在某些情況下initrd雖然未被掛載,只要有下列設備存在,它的內容仍是可被
訪問的。(注意:這個設備無法在 devfs 下使用)
# mknod /dev/initrd b 1 250
# chmod 400 /dev/initrd
  第二:支持初始化RAM盤的能力,及所有執行格式和文件系統模塊,都必須直接
編譯進內核,不能採用可加載模塊的方式。
  第三:必須製作一個RAM盤映像文件。大概的步驟是,在一個塊設備上創建一個
文件系統,把需要的文件複製進去,然後把這個塊設備的內容輸出成一個initrd文
件。目前至少有3種設備適合作為這種塊設備:
O 軟盤(能拿到任何地方試驗,但速度太慢);
O RAM盤(最快,但浪費內存);
O Loopback設備(比較合適的解決方案)。
  
  下面,我們將討論使用loopback設備創建initrd文件的方法。
  1)
  確認lookback設備已經配置到內核裡。
  2)
  創建一個適當大小的空白文件系統,例如:
# dd if=/dev/zero of=initrd bs=300k count=1
# mke2fs -F -m0 initrd
  3)
  把這個文件系統掛載進來,例如:
# mount -t ext2 -o loop initrd /mnt
  4)
  創建控制台設備。
# mkdir /mnt/dev
# mknod /mnt/dev/console c 5 1
  5)
  複製所有可能在initrd環境中用到的文件到/mnt目錄中。(別忘了/linuxrc文
件)
  6)
  initrd執行環境的測試需要反覆進行修正,為了避免不斷的重新啟動,可以使
用下列命令:
# chroot /mnt /linuxrc
  當然這樣啟用initrd還是有限制的,就是不能干擾正常系統的執行狀態(比如
重新配置網絡接口等等。如果在一個用pivot_root指令轉換根目錄的執行環境中,
就可以做這些事情了)。
  7)
  卸載這個文件系統:
# umount /mnt
  8)
  這時,初始化RAM盤系統就在「initrd」這個文件中了。可以把它壓縮小一點:

# gzip -9 initrd
  最後,必須啟動內核並載入initrd系統。需要設置下列引導參數:
root=/dev/ram0 init=/linuxrc rw
  (只有需要寫入initrd文件系統時才需要附加rw參數)。
  使用 LOADLIN 當引導器時,可以執行:
LOADLIN C:\LINUX\BZIMAGE initrd=C:\LINUX\INITRD.GZ root=/dev/ram0 i
nit=/linuxrc rw
  使用 LILO當引導器時,可以在 /etc/lilo.conf 中如下設置:
image = /boot/bzImage
initrd = /boot/initrd.gz
append = "root=/dev/ram0 init=/linuxrc rw"
  如果使用其他引導器,請參考相關文檔。
5.3.4 改變根目錄設備
  在執行完重要任務的尾聲,linuxrc一般會執行改變根目錄設備的動作,並讓所
有程序在真實的根文件系統中展開。這個過程包括下列步驟:
O 掛載新的根文件系統
O 把initrd自己轉到這個根文件系統中
O 結束所有舊的對initrd根文件系統的存取動作
O 卸載initrd文件系統並釋放RAM盤內存
  掛載新的根文件系統很簡單:只需要把它掛載到當前根文件系統中的一個目錄
下即可。例如:
# mkdir /new-root
# mount -o ro /dev/hda1 /new-root
  最終改變根文件系統由pivot_root()系統調用或者pivot_root工具來完成(參
考手冊頁pivot_root(8))。pivot_root可以把當前根文件系統轉移到新根的一個目
錄中,然後把指定的目錄當作新的根。在調用pivot_root之前,必須先為舊根準備
目錄,例如:
# cd /new-root
# mkdir initrd
# pivot_root . initrd
  現在,linuxrc仍然可以訪問舊的根文件系統。執行下列指令將完全結束與舊根
的聯繫:
# exec chroot . what-follows dev/console 2>&1
  其中what-follows是新根下面的一個程序,比如/sbin/init。(注意,這時如
果沒有/dev/console,系統不能啟動)。同時,為了保持不同版本之間的兼容性,
需要特別注意下列事項:
O 在調用pivot_root之前,當前目錄應該是新的根目錄;
O 使用「.」(當前目錄)作為pivot_root的第一個參數(新根),為舊根指定目錄
的第二個參數也要用相對路徑;
O chroot這個命令應該在新、舊根系統當中都能使用;
O 然後調用chroot轉移根文件系統;
O 在exec命令中使用象 dev/console 這樣的相對路徑。
  特別提示:讓initrd文件系統的目錄結構與新根文件系統的結構一致,有利於
轉換過程的順利。
  這時,initrd可以卸載,RAM盤也可以釋放:
# umount /initrd
# blockdev --flushbufs /dev/ram0
  注意:如果linuxrc或者它調用的其他程序的執行因為某種原因中斷,則會啟用
舊的change_root機制。
5.3.5 使用場合
  實現initrd的主要動機是允許系統安裝時模塊化的內核配置。這個過程大致如
下:
1) 系統可以用一個最小配置的內核從軟盤或者其他存儲媒體啟動,然後載入initr
d系統;
2) /linuxrc來決定需要什麼來進一步掛載真實的根文件系統(如設備類型、驅動程
序等)或者支持發行版媒體(如CD-ROM,網絡,磁帶等);
3) /linuxrc載入必須的內核模塊;
4) /linuxrc建立並安裝根文件系統;
5) /linuxrc調用pivot_root改變根文件系統,並通過chroot一個程序(繼續安裝過
程);
6) 安裝引導器;
7) 引導器被配置成裝入initrd以及相關的模塊,建立起系統環境;
8) 現在,系統可以引導,並執行其他的安裝任務。
  Initrd的關鍵作用是能夠多重配置一個正常操作的系統,而不需要用一個龐大
的內核,或者重新編譯、連接內核。在製作Linux發行版(光盤等)、系統恢復盤等
方面有廣泛的應用。
5.3.6 淘汰的根轉換機制(change_root)
  可以通過改寫/proc/sys/kernel/real-root-dev這個文件的數字值來改變真實
的根設備。例如:
# echo 0x301 >/proc/sys/kernel/real-root-dev
  但是這個機制已經被淘汰,雖然目前的內核仍然支持,不能保證以後的內核會
支持。所以不要使用。

5.4 系統初始化(init)
  (參考資料[10])
5.4.1 init的任務
  UNIX的init指的不是一個程序、而是一類程序。Init一般是指系統引導時執行
的第一個進程,也是唯一的進程。當內核完成計算機硬件的設置之後,就把控制權
交給init。內核只產生init這一個進程,而系統中其他所有進程都是由init負責產
生(spawn),主要包括各種系統服務進程,比如控制台的登錄會話(getty)。主
要任務包括:
O 產生其他進程;
O 重新啟動已經退出的進程;
O 負責清理系統中的「殭屍」進程(init是所有其他進程的祖先);
O 處理系統關機(stop所有進程,unmount文件系統);
  內核並不關心拿什麼來作為系統的init,可以是下列幾種選擇之一:
O SysVinit (作者:Miquel van Smoorenburg),或者
O simpleinit (作者:Peter Orbaek),或者
O 一個shell腳本,或者
O 嵌入式系統中你的應用程序。
  不過路徑名字必須是/sbin/init,/etc/init,或/bin/init(因為已經編譯到
內核裡面了)。如果這幾個路徑都找不到,系統就完蛋了。為了增加靈活性,內核
提供了命令行選項可以指定init路徑:「init=」。
5.4.2 SysVinit
/etc/inittab
/etc/rc.d
  大多數Linux發行版使用的init是SysVinit,也就是System V UNIX的實現。其
主要思想是規定了不同的「運行級別(runlevel)」。通過配置文件/etc/inittab
,定義了系統引導時做什麼,進入或者切換到一個運行級別時做什麼。配置文件每
一行的語法為:
id:runlevel:action:command
  細節請參考手冊頁inittab(5)。
  整個過程中用到的腳本都放在/etc/rc.d目錄。
5.4.3 兩種風格:Slackware vs. Debian
  關於配置文件/etc/inittab和腳本/etc/rc.d的實現和組織主要有兩種不同的風
格,其有代表性的發行版分別為Slackware和Debian(Redhat同Debian)。這兩種風
格之間有幾個明顯的區別,可以比較容易的識別。
  例如在/etc/inittab中,定義進入運行級別0時運行的腳本分別為/etc/rc.d/r
c.0和/etc/init.d/rc 0(在Redhat中/etc/init.d是指向/etc/rc.d/init.d的一個
符號鏈接,注意這裡0是腳本rc的命令行參數)。因此,Slackware風格的/etc/rc.
d中應該是一系列相對獨立的腳本,對應於配置文件中每個動作的定義(我沒有見過
Slackware哦)。
  在我們所熟悉的Redhat中,/etc/rc.d的組織要複雜的多,每個運行級別對應一
個子目錄/etc/rc.d/rcX.d(X表示運行級別0~6),下面放的是一系列形如SXXfoo
和KXXbar(S表示Start某個服務,K表示Kill某個服務,XX是兩位數字,決定了該腳
本執行的順序)的符號鏈接,指向/etc/rc.d/init.d中的腳本,每個腳本對應一項
服務程序。
  另外,還有兩個重要腳本值得一提:/etc/rc.d/rc.sysinit是系統引導時首先
要執行的(完成系統初始化的各項工作),而/etc/rc.d/rc.local在最後執行(類
似DOS的autoexec.bat)。
  讀一下/etc/rc.d/rc.sysinit,/etc/rc.d/rc和/etc/rc.d/init.d/中的某個腳
本,就會對Redhat的啟動過程和風格有比較清晰的瞭解。
  據說Slackware風格比Debian的速度要快一些。可能是後者的組織結構比較複雜
的緣故吧。

5.5 PAM
  (參考資料[11]?a href="Ahttp://www.kernel.org/pub/linux/libs/pam/,手冊頁pam" target="_blank">Ahttp://www.kernel.org/pub/linux/libs/pam/,手冊頁pam
(8))
5.5.1 什麼是PAM
  PAM(Pluggable Authentication Modules)是為瞭解決計算機系統中用戶認證
的問題而引入的一種實現方案。PAM的目標為:
O 將認證功能從應用中獨立出來,單獨進行模塊化設計、實現和維護(而不是象以
前那樣,將認證功能的代碼跟應用程序編譯在一塊);
O 為這些認證模塊建立標準API,以便各應用程序能方便的使用它們提供的各種功能

O 認證機制對其上層用戶(包括應用程序和最終用戶)是透明的。
  PAM機制由SUN設計並首先在Solaris 2.3上部分實現,後來逐漸在其他UNIX平台
上實現,包括Linux(其實現稱為Linux-PAM)。
5.5.2 PAM的結構
  PAM採用分層的體系結構。最下面是模塊層,負責實現具體的認證功能,包括帳
戶管理(account)、口令鑑別(auth)、口令管理(password)和會話管理(ses
sion)4個模塊。
  應用接口層位於模塊層之上,調用下層提供的服務,並向上(應用程序)隱藏
PAM實現的細節。
5.5.3 配置文件
/etc/pam.conf
/etc/pam.d (如果存在這個目錄,則忽略/etc/pam.conf)
  配置文件是應用接口層的另一個重要組件。其作用主要是為應用選定具體的鑑
別模塊,模塊間的組合以及規定模塊的行為。
  /etc/pam.conf的語法為每行5項(在Linux-PAM的手冊頁pam(8)中有更詳細的描
述):
service type control module-path module-arguments
  Service是服務的名字,比如login,su等。注意,/etc/pam.d目錄下面有許多
配置文件,分別對應某項系統服務,文件名即等於service,因此每行只有4項。
  Type為account,auth,password,session之一,即要使用的認證模塊。每個
應用可以使用多個認證模塊,或者說可以將模塊「堆疊」使用,但是每一行只能定
義一個,因此一項服務可以有多行配置。
  Control規定了如何處理模塊認證失敗或成功,可以是requisite、required、
sufficient或optional。
  Module-path是PAM庫文件的文件名。缺省路徑是/lib/security/。
  Module-arguments是可以傳給模塊的參數。
5.5.4 other
  特別需要指出的是,有一個特殊的服務名字——other。如果沒有明確指明應用
於某項服務的規則,就用other的定義來處理。因此,我們可以想到,系統中PAM的
最簡配置為,只有/etc/pam.d/other這一個配置文件,即可處理所有的認證請求。
下面是我們用過的一個other配置文件的例子:
[xmdong@lips pam.d]$ cat other
#%PAM-1.0
auth required /lib/security/pam_unix.so
account required /lib/security/pam_unix.so
password required /lib/security/pam_unix.so
session required /lib/security/pam_unix.so
  當然,這樣處理對系統的安全性來說是不利的,最好還是給每項服務定義單獨
的配置文件。這不過是一種簡化問題的臨時方案。

5.6 再論initrd
  在前面的5.3節中,對initrd機制已經有了比較詳細的討論。準確的說,該部分
內容來自linux-2.4/Documentation/initrd.txt 文件。但是在實踐中,我們發現其
中描述的有些方法並不適用。是新版本內核的變化造成的(內核實現與文檔不同步
),還是2.4版內核的bug,不得而知。在我查證的過程中,看到網上有不少相關的
問題和討論。遺憾的是至今我還不能確認到底是什麼原因。
  後來我又專門讀了2.2版內核中所附帶的 initrd.txt 文件。我感覺實際的情況
似乎更接近於這個老文檔的描述。我還看到一個有關的patch文件,從該文件中可以
明確看到新的initrd.txt文檔的改變。下面是該文件的開始部分(行首的-表示老文
檔有而新文檔中已經刪除,+表示新文檔中增加的內容)。
  Using the initial RAM disk (initrd)
   ===================================
  
  -Written 1996 by Werner Almesberger and
  - Hans Lermen
  +Written 1996,2000 by Werner Almesberger > and
  + Hans Lermen
  
  
  -initrd adds the capability to load a RAM disk by the boot loader. T
his
  -RAM disk can then be mounted as the root file system and programs c
an be
  -run from it. Afterwards, a new root file system can be mounted from
a
  -different device. The previous root (from initrd) is then either mo
ved
  -to the directory /initrd or it is unmounted.
  +initrd provides the capability to load a RAM disk by the boot loade
r.
  +This RAM disk can then be mounted as the root file system and progr
ams
  +can be run from it. Afterwards, a new root file system can be mount
ed
  +from a different device. The previous root (from initrd) is then mo
ved
  +to a directory and can be subsequently unmounted.
  下面我試圖將我遇到的問題和能夠確認的東西記錄一下。(後面我們分別稱新
、老文檔為initrd.txt-2000和initrd.txt-1996)
5.6.1 根到底在哪裡
  在配置使用initrd之前,首先你要清楚,系統正常運行時,根文件系統掛載在
什麼設備上(也就是說,root device是什麼——root在哪裡?)。
  我們知道,使用initrd機制的話,系統啟動時先以RAM Disk(/dev/ram0)作為
根,然後通過某種方法將根轉換到「真實的根(real-root-dev)」(之所以說rea
l,是與前面的RAM裡臨時的根比較而言)。一種常見的情形是啟動時用initrd,然
後切換到一個硬盤分區,比如/dev/hda1。
  事實上,這個根轉換不是必須的。我們完全可以就把/dev/ram0作為我們真實的
根設備。這時,系統啟動之後所有的操作都在RAM Disk中進行。當然這樣做也有一
個明顯的缺點,即無法保存數據。比如對系統配置進行的修改(象IP地址),重新
啟動之後就丟掉了。如果要保存數據,就要想別的辦法。
  LiPS目前的做法就是這一種(沒有根轉換,initrd就是真實的根)。為了在重
新啟動之後保持配置文件的修改,我們將目錄/etc鏈接到了其他非易失存儲器(例
如,一個硬盤分區,或者USB盤的分區)。
  指定根設備是通過內核參數「root=」來完成的。以GRUB引導器的配置為例:
kernel /boot/bzImage ro ramdisk_size=65536 root=/dev/ram0
initrd /boot/initrd.img
  其中 ramdisk_size=65536 說明初始RAM盤的大小為64MB,root=/dev/ram0 說
明根的位置。下面第二個例子來自一台在hda1安裝了Redhat 9的機子:
kernel /boot/vmlinuz-2.4.20-8 ro root=/dev/hda1
initrd /boot/initrd-2.4.20-8.img
  很明顯,這裡 root=/dev/hda1 指定了真實的根,其啟動過程包含根的轉換。
但是這裡沒有指定 ramdisk_size,因為initrd的缺省大小是4MB,而initrd-2.4.2
0-8.img比較小,所以用缺省值即可。
  (我們多次提到root, root filesystem, root device, 自己體會吧。)
5.6.2 linuxrc
  在initrd機制的設計中,初始RAM盤只是作為一個過渡性質的根設備,由/linu
xrc來完成操作環境準備(比如加載一些不常用的、沒有編譯進內核的驅動程序模塊
)和根轉換工作。
  Linuxrc的執行是自動的,即內核掛載initrd盤作為根,如果根下面有這個文件
(也就是/linuxrc),就執行它。(如果沒有呢?當然什麼也不做。所以linuxrc也
並不是必不可少的。)
  接下來說說linuxrc的內容。下面的例子是從initrd-2.4.20-8.img中釋放出來
的:
[root@lips initrd]# cat linuxrc
#!/bin/nash

echo "Loading jbd.o module"
insmod /lib/jbd.o
echo "Loading ext3.o module"
insmod /lib/ext3.o
echo Mounting /proc filesystem
mount -t proc /proc /proc
echo Creating block devices
mkdevices /dev
echo Creating root device
mkrootdev /dev/root
echo 0x0100 > /proc/sys/kernel/real-root-dev
echo Mounting root filesystem
mount -o defaults --ro -t ext3 /dev/root /sysroot
pivot_root /sysroot /sysroot/initrd
umount /initrd/proc
  該腳本中首先加載了支持ext3文件系統所需的模塊,然後掛載真實的根文件系
統,並進行轉換。特別需要注意的是,linuxrc腳本一般是用nash解釋執行的,而不
是通常的bash。有關nash的詳情請看手冊頁nash(8)。簡單說,nash內置實現了多數
在執行linuxrc這個階段可能用到的命令,比如mount, pivot_root, umount;而如
果使用bash,象mount等都是「外部命令」,就需要複製/bin/mount到initrd映像文
件中。實際上,在initrd-2.4.20-8.img的/bin中只有insmod和nash兩個程序(mod
probe符號鏈接到insmod):
[root@lips initrd]# ls bin/
insmod modprobe nash
  當我按照5.3.4節描述的方法測試linuxrc的時候發現,我的腳本頭兩句執行就
報錯。
mount –o ro /dev/hda11 /sysroot
cd /sysroot
  這裡我的真實的根設備是/dev/hda11,/sysroot是initrd映像中存在的一個目
錄。這兩句完全是按照該文檔的要求寫的。後來經過多次試驗才發現問題之所在。
第一,nash實現的mount命令語法與我們常用的/bin/mount並不完全兼容;第二,n
ash根本沒有實現cd命令。
  因此,可以推斷initrd.txt-2000中講linuxrc時所舉例子不是用的nash。實際
上在該文檔中根本沒有指明用什麼shell。再回頭仔細看才發現,所有例句都是在r
oot的shell命令提示符「#」後面的,那麼它用的是bash之類了。但是令人迷惑的是
,同樣在該小節中稍後出現如下例句: # exec chroot . what-follows /console >dev/console 2>&1
  為什麼用exec執行chroot呢?chroot可以在命令行直接用啊。文檔中講到,wh
at-follows可以是/sbin/init。我用nash試了下面這個句子(nash中用exec執行外
部命令):
exec chroot . /sbin/init dev/console 2>&1
  還是不行。錯誤信息:
Usage: init 0123456SsQqAaBbCcUu
  開始我還以為後面那一串是個「magic number」,後來想以Usage開頭應該是講
使用這個命令的語法。看init(8)手冊頁,果然要求給一個參數,0~6當然是運行級
別啦,試了一個init 3也還是不行。尤其搞不明白後面那些個console什麼意思。
5.6.3 根轉換機制:新的?舊的?
  前面我們多次提到了根的轉換。在initrd.txt的兩個版本中,分別描述了兩種
根轉換機制,其中2000版中稱1996版的內容已經「過時」,不推薦使用。然而事實
上要麻煩的多,事情並不總是按照預期(如文檔所述)運行。
  為了弄清楚這個問題,我進行了一系列測試。環境是這樣的:
O 使用initrd機制,已經準備好了根文件系統映像文件initrd.img,準備好了內核
bzImage;
O initrd.img的所有內容釋放到一個硬盤分區/dev/hda11,ext2文件系統;
O 在/dev/hda11上面增加一個/boot目錄,存放bzImage和initrd.img文件;
O 以/dev/ram0作為根啟動,然後以某種機制轉換到「真實的根」/dev/hda11。
  系統的引導器是GRUB,安裝在硬盤MBR,grub.conf位於/dev/hda1(也就是做測
試的實際的根文件系統)。按照上述環境配置,在grub.conf中增加如下內容:
title lips (testing ......)
root (hd0,10)
kernel /boot/bzImage ro root=/dev/hda11 ramdisk_size=65536
initrd /boot/initrd.img
  下面我們分別使用不同的/linuxrc進行了測試,以確認到底哪種機制是可行的

  第一,如果沒有/linuxrc會怎麼樣呢?
  結果是系統能夠成功啟動到以/dev/hda11作為根,並且把initrd(也就是舊根
文件系統)的內容移到了/initrd目錄。這是符合initrd.txt-1996文檔中第一段的
描述的。所以只要你使用了initrd,指定了新的根,並且準備好了/initrd目錄(已
經在/dev/hda11創建了/initrd),內核可以自動完成根的轉換工作。終端上面有如
下輸出信息:
Trying to move old root to /initrd ... okay
  這裡有個小問題,即最後/initrd沒有卸載,這意味著initrd所分配內存也沒有
釋放。因此umount /initrd不是內核自動完成的,而應該在/linuxrc中的某個位置
進行。如果linuxrc僅包含卸載/initrd的命令,如下:
#!/sbin/nash
umount /initrd
  則執行情況是這樣的:umount命令報錯(返回錯誤碼22),然後出現前面所示
Trying…的信息。結果跟前面是一樣的。因為linuxrc執行在先,當時舊根還沒有被
轉移到/initrd中來。
  如果沒有/initrd目錄會怎樣?我們把/dev/hda11上面的/initrd目錄刪除,重
新啟動(沒有/linuxrc),結果是可以啟動到以/dev/hda11為根,且看不到原來的
initrd。該過程中出現如下信息:
Trying to move old root to /initrd ... failed
Unmouting old root
Trying to free ramdisk memory ... okey
  
  第二,pivot_root可以用,但是chroot不能用。
  pivot_root是在initrd.txt-2000文檔中引入的新機制。在測試pivot_root的過
程中,除了在nash中不能用cd命令造成的困惑(這個問題前面已經說明)之外,使
用pivot_root基本上是成功的。/linuxrc腳本的主要內容如下:
#!/sbin/nash
mount -o defaults --ro -t ext2 /dev/hda11 /sysroot
pivot_root /sysroot /sysroot/initrd
  但是,用這個腳本不能啟動,造成系統掛起:
VFS: Cannot open root device 「hda11」 or 03:0b
Please append a correct 「root=」 boot option
Kernel panic: VFS: Unable to mount root fs on 03:0b
  如果按照initrd.txt-2000的指導,pivot_root之後應該執行chroot,但是我始
終沒有辦法使chroot成功執行(有關情況前面已經說明)。不過可以肯定的是,pi
vot_root執行成功之後,當前目錄就是新的根目錄。
  第三,/proc/sys/kernel/real-root-dev
  initrd.txt的新版本中最後一節專門指出,向/proc/sys/kernel/real-root-d
ev文件中echo數字的方法(稱為change_root機制)是過時的。然而令人迷惑的是,
Redhat 9的缺省安裝產生的initrd-2.4.20-8.img中(前面已經列出了其/linuxrc文
件內容),同時使用了pivot_root和change_root機制。
  測試下列/linuxrc腳本,系統可以啟動到/dev/hda11,但是/initrd沒有卸載。
如果在腳本末尾umount /initrd,會返回錯誤碼16。
#!/sbin/nash
mount -t proc /proc /proc
mkrootdev /dev/root
echo 0x0100 > /proc/sys/kernel/real-root-dev
#echo 0x030b > /proc/sys/kernel/real-root-dev
mount -o defaults --ro -t ext2 /dev/hda11 /sysroot
pivot_root /sysroot /sysroot/initrd
umount /initrd/proc
  雖然這樣可以啟動,但是有關real-root-dev還有幾個沒有弄清楚的問題:
  real-root-dev的值到底是什麼?
  目前我還沒有看到解釋real-root-dev的值是什麼東西的正式文檔,根據情況判
斷的話,我認為應該是該設備的「major-minor」(主、次設備號)。
  為什麼用0100而不是030b?
  如果上述判斷準確的話,那麼寫入0100就表示/dev/ram0。這就奇怪了,「真實
的根設備」應該是/dev/hda11呀,那麼是不是應該寫030b呢?但是測試發現用030b
同樣會導致不能啟動。
Kernel panic: VFS: Unable to mount root fs on 03:0b
  
5.7 提示
5.7.1 文件系統目錄層次結構
  根文件系統的目錄結構最好符合「Filesystem Hierarchy Standard(文件系統
層次標準)」[7],而不能自己隨意創建。
  順便說一下,像這種情況:/bin, /sbin, /usr/bin, /usr/sbin 這4個目錄都
可以放應用程序,具體放在哪個目錄,則要根據該應用程序在系統中的作用來確定
。一般地,系統的關鍵應用程序放在/bin,只能給超級用戶root訪問的關鍵應用程
序放在/sbin,相比之下比較次要的應用程序和root應用程序分別放在/usr/bin和/
usr/sbin。
5.7.2 mklips.sh(製作LiPS的腳本)
  複製文件的工作全部可以手工進行,但是做一個shell腳本來完成所有工作顯然
是一個更好的辦法。
  在我們的項目中,製作LiPS(也就是完成裁減Linux)的工作,除了編譯內核之
外,都可以通過mklips.sh腳本完成。
5.7.3 lips.conf(LiPS配置文件)
  lips.conf是LiPS的配置文件,由mklips.sh腳本使用,主要用來控制所製作的
LiPS系統包括哪些可選的模塊,例如:
INCLUDE_APACHE=no
INCLUDE_IPTABLES=no
INCLUDE_PROFTPD=yes
INCLUDE_NFSD=no
INCLUDE_SAMBA=yes
  通過一系列的INCLUDE_?=yes或者no,可以實現LIPS的模塊化。在mklips.sh腳
本中,判斷每個INCLUDE的值,來確定是否複製某個模塊相關的文件。
  配置文件中還可以包括其他可配置的信息。
5.7.4 cp –dpR
  複製文件請使用「cp –dpR」命令,可以保留文件的屬性(特別是對於設備節
點和符號連接等特殊文件),還可以複製整個目錄。
5.7.5 如何判斷一個程序依賴哪些文件
  除了庫文件外,關鍵是找出相關的配置文件。man手冊頁是判斷應用程序配置文
件的重要依據。我們以安裝Apache Server為例來說明判斷複製哪些文件的過程。
  首先確定其可執行文件是/usr/sbin/httpd。然後看httpd的手冊頁,即
[root@lips lips]# man httpd
httpd(8)
httpd(8)
NAME
httpd - Apache hypertext transfer protocol server
…………(略)
FILES
/etc/httpd/conf/httpd.conf
/etc/mime.types
/etc/httpd/conf/magic
/var/log/httpd/error_log
/var/log/httpd/access_log
/var/run/httpd.pid
February 1997
httpd(8)
(END)
  這時關鍵看最後一段FILES,列出了有關的配置文件、日誌文件和進程文件,那
麼我們就知道了httpd要在目標系統中運行,這幾個配置文件是必不可少的。
  把httpd和用ldd找出的庫文件以及上述配置文件複製到目標系統,運行httpd試
一下,看看是否正常。一般情況下應該沒有問題。但是httpd比較特殊,除了ldd找
出的庫文件外,它還需要很多可加載的模塊(庫)。怎麼發現呢?重要的一點是看
出錯信息(有時候還要查看日誌中的信息,/var/log/messages或者應用程序日誌)
,看httpd報告缺少什麼;還可以看看相關的配置文件httpd.conf,也能找到有用的
信息。然後我們發現需要/usr/lib/httpd這個目錄下的庫,把它也複製過去即可。

5.7.6 帶庫文件複製——lcp()
  在複製可執行文件(軟件)的過程中,如果沒有正確複製相關的庫文件,該軟
件肯定不能在目標系統中正常運行。而通過ldd命令手工確定每個軟件的庫文件,是
一個繁瑣且費時的任務。另一個隱含的缺陷是,當你不再需要某個軟件時,刪掉可
執行文件之後,相應的庫文件是否需要刪除呢?如果刪除了,而該庫文件是其他軟
件也需要的,會導致其他軟件不能用;如果不刪除,就有可能留一些垃圾庫文件在
目標根文件系統中。
  因此,最好是能夠保證每次複製可執行文件的同時自動複製相關聯的庫文件。
我寫了一個腳本函數 lcp() 來解決這個問題。語法和主要代碼如下(以#開頭的行
為註釋):
# lcp BIN BINPATH LIBPATH
# BIN:可執行文件路徑
# BINPATH:可執行文件的目標路徑(複製到哪裡)
# LIBPATH:相關庫文件的目標路徑
lcp()
# run()是另一個函數,執行它後面的shell命令,並在遇到錯誤時報錯、寫錯
誤日誌
# 首先複製BIN到BINPATH
run "$CP $BIN $BINPATH"
# 使用ldd找出與BIN相關的庫文件,把ldd的輸出送給LDDSTR
LDDSTR=`ldd $BIN`
# 循環檢查LDDSTR字符串的每一項
for STR in $LDDSTR; do
# 判斷出庫文件路徑
LIB=`echo $STR | grep "/lib/" `
if [ -z "$LIB" ]; then
continue
fi
# 複製LIB到LIBPATH,除非要複製的庫文件在目標路徑中已經存在
LIBNAME=`basename $LIB`
if [ ! -f "$LIBPATH/$LIBNAME" ]; then
run "$CP $LIB $LIBPATH"
run "cp $LIB $LIBPATH"
else
log "Warning: File "$LIBPATH/$LIBNAME" exis
t."
fi
done
}
5.7.7 庫文件的命名
  (參考資料[9]之6.2節)
  我們這裡所說的「庫」都是指的GNU C Library,也就是glibc。
  在/lib下面可以看到很多庫文件,主要分為4類:
O 實際的共享庫(Actual shared libraries)
文件名格式為 libLIBRARY_NAME-GLIBC_VERSION.so,其中LIBRARY_NAME是庫的真正
名稱,GLIBC_VERSION是glibc包的版本號。比如glibc 2.2.3版math(數學)庫的文
件名為libm-2.2.3.so。
O 主修訂版本符號鏈接(Major revision version symbolic links)
庫的主修訂版本號與glibc版本號不同。比如,glibc 2.2.3的C共享庫libc-2.2.3的
主修訂版本號為6,libdl-2.2.3為2。主修訂版本符號鏈接的命名格式為 :libLIB
RARY_NAME.so.MAJOR_REVISION_VERSION,那麼C共享庫的符號鏈接即 libc.so.6。
一個程序連接到一個庫之後,它在運行時訪問的就是這個符號鏈接。
O 版本無關的符號鏈接(Version-independent symbolic links to the major re
vision version symbolic links)
這些符號鏈接的作用是為用到某個庫的所有程序提供一個統一的入口,而不管實際
上glibc的版本或者該庫的主修訂版本。其命名格式為 libLIBRARY_NAME.so。比如
,libm.so鏈接到libm.so.6,libm.so.6又鏈接到libm-2.2.3.so。唯一的例外是li
bc.so,是個腳本。連接一個程序時用的是這個符號鏈接。
O 靜態庫文件(Static library archives)
這些庫是應用程序靜態連接用的。格式為 libLIBRARY_NAME.a.
  
  


6 引導

6.1 引導過程概述
6.2 幾種引導方式
  幾種引導方式的粗略比較如下表所示。
優點
缺點
DOC
DOM
FLOPPY
HARDDISK
NETWORK
USB-HDD
容量大,讀寫可靠
  
6.3 grub引導器
  有了前面生成的Linux內核和根文件系統映像文件後,製作引導盤非常簡單。在
動手製作引導盤之前,最好先瞭解一下grub引導器。
  Grub是一個通用的多引導加載軟件,與較早期多數Linux發行版本提供的另一個
引導器lilo相比,grub的功能更強大、設置更方便、更靈活。因此本項目選用grub
作為引導器軟件。
  本文檔不是grub的教學文檔,所以有關grub的詳細用法,請參考其他有關文檔
。這裡僅強調幾點:
O 引導盤的文件系統可以是ext2,ext3,msdos (FAT),vfat (FAT32),等等;
O grub表示硬盤、分區的方式與Linux的方式不同。Linux系統的IDE硬盤表示為/de
v/hd{a,b,c,d},SCSI設備表示為/dev/sd{a,b,c,d,…},分區從1開始編號,比如P
rimary Master IDE硬盤的第二個分區是/dev/hda2;而grub的硬盤(包括IDE和SCS
I)統一從0開始編號,分區也是從0開始編號,比如系統中的第一個硬盤是(hd0),
其第一個分區是(hd0,0)。
O 在grub的提示符下面輸入命令和參數時,按TAB鍵可以自動補全。
6.4 USB引導
  使用USB引導盤有很多好處,比如說,容量大、讀寫可靠,不佔用IDE接口,攜
帶方便等等。
6.4.1 製作步驟
6.4.1.1 創建文件系統
  首先,必須在USB盤上面創建文件系統(也就是格式化)。你幾乎可以使用gru
b支持的所有文件系統,包括常見的各種文件系統,比如ext2,ext3,FAT,FAT32等
。但是根據我的經驗,需要注意的是:
O 最好不要使用FAT,即msdos,因為FAT的文件名有「8.3」的限制,所以象「grub
.conf」這種文件名就被截斷成了「GRUB.CON」。
O FAT和FAT32都不能表示符號鏈接文件,雖然有變通的方法,即將文件再複製一份

  順便說一下在Linux下面怎麼訪問USB盤。
  如果系統中沒有其他的SCSI設備,那麼插在USB 1接口上面的USB盤的設備名為
/dev/sda,其分區為/dev/sda1。依此類推。一般插入USB盤後,窗口中會出現驅動
程序輸出的一些信息,其中有sd?的字眼。接下來就跟訪問普通的硬盤分區沒有什麼
兩樣了。
#mke2fs /dev/sda1
#mount –t ext2 /dev/sda1 /mnt
  注意:Redhat 7.3不支持Intel 845系列芯片組的主板。
6.4.1.2 複製文件
  按照下面的列表,複製文件(包括目錄結構)到USB引導盤:
備註
/boot/
bzImage
或者vmlinuz
initrd.img
/grub/
grub.conf
menu.lst
符號鏈接
stage1
stage2
6.4.1.3 安裝grub
  安裝grub到USB盤的引導扇區。假設系統有一塊IDE硬盤,這時USB盤是grub看到
的第二塊「硬盤」,所以表示為(hd1)。
#grub
grub> root (hd1,0)
grub> setup (hd1)
  root命令告訴grub,內核文件所在的位置。Setup命令安裝grub到hd1的引導扇
區,如果是setup (hd1,0),則安裝到第一個分區(即/dev/sda1)。
  上述命令序列也可以通過執行腳本完成。
6.4.1.4 用USB盤引導系統
  在用新製作的USB引導盤引導之前,還需要確認BIOS的一個設置,即第一個啟動
設備應該設置為「USB-HDD」。
  OK,插上USB盤,試一試。
6.5 提示
6.5.1 版本問題?
  我們的項目開始的時候用Redhat 7.3,但是後來做USB引導盤時發現,我們的環
境不支持USB盤。我想Redhat 7.3應該是支持USB盤的,因為我以前在7.1下面就用過
。那麼有可能是主板的問題,i845的芯片組比Redhat 7.3要新,也許是沒有該芯片
組的正確驅動。
  後來在Redhat 7.3下更新了內核,使用2.4.20版本的Linux內核即可正常支持U
SB盤。
  然而還有一個問題,Redhat 7.3的GRUB版本是0.91,在使用中發現,製作USB引
導盤沒有問題,但是一旦你改變USB盤的文件(比如複製一個新的文件上去),本來
可以引導的USB盤就不行了。
  而Redhat 9.0使用的是GRUB 0.93,就沒有上述問題,並且使用USB盤也沒有問
題。也就是說,使用Redhat 9就可以了。不過Redhat 9集成的其他很多軟件也有變
化,比如Apache升級到了2.0版本,以前的httpd.conf配置文件要修改過之後才能正
常使用;另外quota接口也有變化。
  因此改變版本需要一定的代價,究竟使用什麼版本應該綜合考慮,最好在項目
開始時就做出正確的選擇,並保持穩定。
  
  


7 遠程串口控制台

7.1 概述
  
7.2 配置方法
7.3 提示
7.4 Linux 遠程串口控制台指南
  (這是我以前寫的一份簡單的文檔,曾經貼到網上,附在這裡供參考)
  Linux 遠程串口控制台指南
  
  dot
  Dec 27, 2002
  
  2002年聖誕節期間,我在 Redhat Linux 7.0 (kernel 2.2.16-22) 平台上配置
了遠程串口終端,整個過程基本順利,但是也經歷了一些意想不到的波折,幸好最
終是成功了的。乘著記憶還比較清晰的時候,寫下這篇文檔,以供自己和他人參考

  
  首先參考 "Linux-Remote-Serial-Console-HOWTO",該文檔已經足夠詳盡,按
要求一步步地做即可。該文檔描述的是 Redhat 7.2 平台,個別地方跟 7.0 有些差
異,不過問題不大。
  
  要注意的問題主要是:
  
  * 串口直連電纜
  
  開始我並沒有在意這個問題,我手頭上有一根以前做的直連電纜,是只用了3根
線的那種(2、3交叉,5對接),因此 HOWTO 文檔中講電纜製作的章節我就跳過去
了,沒有仔細看,以為我這根電纜就可以了。事實也給人以這種假相:當我按照文
檔的說明完成了配置文件的修改,重新引導 Linux 機子,這時在 Windows 的超級
終端中確實顯示了所有該顯示的信息,看起來沒問題。然而接下來配置 getty 時就
不行了,應該出現在超級終端中的 login: 提示符死活不肯出現。以為是 getty 軟
件的問題,先後測試了 getty 和 mgetty,都不行。後來在 quickmouce 的提醒下
,又仔細看文檔,按照 11.3 節的圖 11-1 重新製作了串口直連電纜,才解決問題

  
  * getty 軟件
  
  HOWTO 文檔中已經指出,mingetty 不支持串口終端,所以這個軟件要首先排除
(mingetty 的手冊頁中也有相關說明)。而 Redhat 缺省安裝的就是這個軟件,所
以要重新下載安裝其他的 getty 類軟件。文檔中也已經列出了幾種常用的 getty
的變種。
  
  來說說 mgetty 先。為什麼我先使用了這個軟件呢,一是因為 Redhat 7.0 的
安裝盤上面有它的 RPM 包,直接拿來裝很方便,另外是因為 mingetty 的手冊頁中
推薦使用 mgetty 。結果是 mgetty 運行後在日誌文件中報告大量錯誤,莫名其妙
。我想可能是這個光盤上的版本老了,於是上網下載了比較新的版本 mgetty-1.1.
25-5.i386.rpm ,運行之後情況好多了,似乎要成功的樣子。在沒有使用新的串口
線之前,login: 出不來,但是在超級終端中敲的字符 mgetty 可以收到(從日誌中
看的出來);換了新製作的串口線之後,第一次!成功了,一切都像預期的那樣,
我可以從超級終端登錄。可是當我退出想再登錄一次,就不行了,甚至我把兩台機
子全部重啟也不行啦。我又試用 Linux 的 minicom 終端來連接,也是只成功了一
次,就再也不行了。真是怪哉,腦袋都快想破了,也不知道是為什麼。後來終於懷
疑 mgetty 有問題,換了其他的,天哪,終於解脫了。不知道後面更新的版本是否
可以,我是沒有勁去試了。
  
  再來說說 agetty 。其實沒有什麼好說的,因為我根本沒有用過這個。我本來
想試一下的,但是從網上下載安裝太麻煩了。下載了 agetty-2.11w-2.i386.rpm ,
安裝時 RPM 說要先安裝 login 包,然後又要求什麼 pam 包,然後又需要 awk ,
真是 faint 了,太麻煩了,所以最終我也沒有安裝它。
  
  最後說 getty 啦。也就是 HOWTO 文檔中所謂的 「傳統」 getty 。我下載的
RPM 包的名字叫 getty_ps-2.0.7j-9.i386.rpm 。當我正在為 mgetty 的問題頭疼
的時候,換成它之後就一切 OK 了。
  
  * 終端軟件
  
  Windows 下面可以用超級終端、NetTerm,Linux 下面有 Minicom 。都比較好
用,注意參數配置與目標機的串口一致。
  
  * 修改過的配置文件列表
  
  /etc/lilo.conf
  /etc/inittab
  /etc/gettydefs
  /etc/securetty
  /etc/makedev.d/linux-2.2.x
  /etc/security/console.perms
  /etc/sysconfig/init
  /etc/sysconfig/kudzu
  
  * 再談串口直連電纜
  
  這次調試在串口直連電纜上面花費了不少力氣,對它們的瞭解也增加了不少。
以前以為直連電纜就是接 3 根線,其實不然。只用了 2、3、5 引腳的直連電纜不
能提供握手信號,因此如果軟件需要使用 CTS/RTS 或者 DTR/DSR 流控,就需要連
接更多的引腳。
  
PC DB9 DB9
-------------------- -----------------------
RxD Receive Data 2 <----- 3 TxD Transmit Data
TxD Transmit Data 3 -----> 2 RxD Receive Data
|--> 6 DSR Data Set Ready
DTR Data Terminal Ready 4 --|--> 1 DCD Carrier Detect
GND Signal Ground 5 ------ 5 GND Signal Ground
DCD Carrier Detect 1 <--|
DSR Data Set Ready 6 <--|-- 4 DTR Data Terminal Ready
RTS Request To Send 7 -----> 8 CTS Clear To Send
CTS Clear To Send 8 <----- 7 RTS Request To Send
RI Ring Indicator 9 (not used)
  
  上面是兩端都是 DB9 接頭的標準 NULL MODEM 電纜的接線圖,可以提供全部握
手信號。這也是 Remote-Serial-Console-HOWTO 中要求的直連電纜做法。我做通串
口控制台使用的就是這種電纜。
  
  如果你打算自己製作電纜,就會發現一些問題。我們一般利用網線(雙絞線)
來做,這種雙絞線是 8 芯的,而按照圖示的連接方法則需要 9 根線。因此最簡單
的方法是用那種很多芯的排線來做,需要多少根割多少根(最好是彩色的,不容易
弄混)。後來我想,我們用到的其實就是 CTS/RTS 流控信號,到 2000 年為止 Li
nux 還不支持 DTR/DSR 流控,應該用不了這麼多線。於是我就用網線做了根不完整
的直連電纜:2、3 交叉,5 對接,7、8 交叉,還空 3 根線,就把 1、4 也交叉連
上了,結果是用了 7 根線,還空 1 根,與上面比只是少了 4、6 交叉,也就是沒
有 DTR/DSR 信號。事實證明這樣也是通的。我猜想 1、4 交叉不要應該也是通的,
只是沒有試過,已經焊上去懶得再弄了。
  
  關於串口方面的更多內容可以參考 "Linux-Text-Terminal-HOWTO" 和 "Linux
-Serial-HOWTO" 文檔。
  
  * 為什麼要用串口終端(控制台)?
  
  為什麼費勁做這個 Serial Console 呢?最容易想到的理由是省錢,呵呵,省
掉了顯卡、顯示器、鍵盤,只剩下一個 "Box",多好玩。
  
  說正經的,這種做法在嵌入式系統的開發中也是很有價值的。現在很多人都在
利用 X86 平台做嵌入式系統開發,甚至做產品。我曾經測試過清華某某做的 foob
ar 服務器,鏡像光盤用的,賣給你的就是一個主機,我自己給接上顯示器、鍵盤,
開機就是 Linux ,還可以進入單用戶模式,兩分鐘就把 root 口令改了,你說這樣
的服務器有什麼安全性可言?如果能夠屏蔽本地控制台,配置串口終端,不是更「
象」一個產品嗎?
  (完)




8 系統安裝光盤

8.1 概述
  本節介紹一種系統安裝光盤的製作方法。安裝光盤用於產品階段的生產安裝。
因此該安裝光盤必須是可引導的、簡單好用,並且一般不包含源代碼。
  製作可引導光盤的方法有很多種,我們用了一種最簡單的方法,就是拿來一個
可引導光盤的ISO映像,然後做必要的修改以滿足我們的要求。
  請準備Redhat 9的第一張安裝光盤,我們將要用到的文件是 /images/boot.is
o。(其他發行版本應該也可以,只要原理是一樣的。)
  另外如果你的工作平台是Windows,請準備WinISO 5.3軟件,用來編輯光盤ISO
映像文件。
  當然如果你要燒盤測試的話,還要準備刻錄機和CD-RW或者CD-R光盤。
8.2 boot.iso光盤的文件結構分析
  用WinISO打開boot.iso即可看到該光盤的文件(其實Redhat 9第一張安裝光盤
的/isolinux目錄就是boot.iso解開後的內容)。下面是文件列表:
[xmdong@lips isolinux]$ ls
boot.cat initrd.img options.msg snake.msg vmlinuz
boot.msg isolinux.bin param.msg splash.lss
general.msg isolinux.cfg rescue.msg TRANS.TBL
  其中關鍵的文件是boot.cat,initrd.img,isolinux.bin,isolinux.cfg和vm
linuz;isolinux.cfg是如何引導的配置文件,我們主要修改這個文件即可;initr
d.img和vmlinuz分別是初始化RAM盤和內核,其作用在前面章節中已經詳細描述過;
另外兩個文件是光盤引導需要的,不動它。
  其餘的*.msg文件是一些引導過程中可能會顯示的文本信息,可以不管;splas
h.lss是引導時顯示的一個圖片,也可以不管。
  下面來看看isolinux.cfg的內容。
default linux
prompt 1
timeout 600
display boot.msg
F1 boot.msg
F2 options.msg
F3 general.msg
F4 param.msg
F5 rescue.msg
F7 snake.msg
label linux
kernel vmlinuz
append initrd=initrd.img
label text
kernel vmlinuz
append initrd=initrd.img text
label expert
kernel vmlinuz
append expert initrd=initrd.img
label ks
kernel vmlinuz
append ks initrd=initrd.img
label lowres
kernel vmlinuz
append initrd=initrd.img lowres
  這個配置文件的語法結構跟其他引導器的配置文件,比如grub.conf或者lilo.
conf,非常類似,比較好懂。如果再對照光盤引導安裝Redhat的實際過程看一下,
基本上不需要什麼解釋就可以理解。其中以label開頭的每個小節是一種引導配置,
缺省(或者timeout後)以label linux引導。每個配置的第一句,kernel指定引導
所用的內核,第二句append指定內核引導參數(主要說明initrd文件的位置,以及
其他參數)。
8.3 製作步驟
1) 複製boot.iso,用WinISO打開;
2) 解放出isolinux.cfg文件,並從光盤映像中刪除之;
3) 修改配置文件isolinux.cfg;
4) 製作bzImage和initrd.img,這兩個文件用於光盤引導至一個比較正常的Linux系
統下,包括常用的工具軟件和服務,我們要在這個環境下進行產品的安裝;
5) 將修改後的isolinux.cfg以及initrd.img,bzImage加入光盤;
6) 準備一個setup目錄,將產品安裝需要的文件和腳本放在這個位置,然後將setu
p目錄加入光盤;
7) 刪除沒有用到的文件,也可以不管,除非加入文件時遇到衝突,必須先把原來光
盤上的文件刪除或者改名;
8) 存盤退出,刻錄光盤。
  下面是一個修改後的isolinux.cfg配置文件的例子,很簡單:
default linux
prompt 1
timeout 600
label linux
kernel bzImage
append initrd=initrd.img ramdisk_size=65536 root=/dev/ram0
  
  
9 源代碼(配置文件和腳本)
9.1 lips.conf
9.2 mklips.sh

Linux 系統裁減指南(LiPS) (繁體中文版) --(一)

Linux 系統裁減指南(LiPS)
Reference: http://grid.tsinghua.edu.cn/home/liulk/publish/computer/LinuxReduce.html


目 錄
1 引言 6
1.1 編寫目的 6
1.2 背景 6
1.3 定義 6
1.4 參考資料 6
2 總體描述 8
2.1 硬件環境 8
2.2 軟件環境 8
2.3 需求規定和約束 8
3 總體設計 9
3.1 基本設計概念 9
3.2 軟件結構 9
4 內核 10
4.1 創建內核的方法 10
4.2 內核配置 10
4.2.1 概述 10
4.2.2 Loadable module support 11
4.2.3 Processor type and features 11
4.2.4 General setup 12
4.2.5 Plug and Play configuration 12
4.2.6 Block devices 12
4.2.7 Multi-device support (RAID and LVM) 13
4.2.8 Networking options 13
4.2.9 ATA/IDE/MFM/RLL support 14
4.2.10 SCSI support 15
4.2.11 Network device support 15
4.2.12 Character devices 16
4.2.13 File systems 17
4.2.14 Console drivers 18
4.2.15 USB support 18
4.3 提示 19
4.3.1 EXTRAVERSION 19
4.3.2 .config 19
5 根文件系統 21
5.1 根文件系統 21
5.2 文件系統的內容 21
5.2.1 應用程序(applications) 21
5.2.2 設備文件(device files) 21
5.2.3 腳本和配置文件(scripts and configuration files) 22
5.2.4 庫文件(libraries) 23
5.2.5 必要的目錄 24
5.3 初始化RAM盤(initrd) 24
5.3.1 操作步驟 24
5.3.2 引導選項 24
5.3.3 安裝 25
5.3.4 改變根目錄設備 26
5.3.5 使用場合 27
5.3.6 淘汰的根轉換機制(change_root) 27
5.4 系統初始化(init) 27
5.4.1 init的任務 28
5.4.2 SysVinit 28
5.4.3 兩種風格:Slackware vs. Debian 28
5.5 PAM 29
5.5.1 什麼是PAM 29
5.5.2 PAM的結構 29
5.5.3 配置文件 29
5.5.4 other 29
5.6 再論initrd 30
5.6.1 根到底在哪裡 31
5.6.2 linuxrc 31
5.6.3 根轉換機制:新的?舊的? 32
5.7 提示 34
5.7.1 文件系統目錄層次結構 34
5.7.2 mklips.sh(製作LiPS的腳本) 34
5.7.3 lips.conf(LiPS配置文件) 34
5.7.4 cp –dpR 35
5.7.5 如何判斷一個程序依賴哪些文件 35
5.7.6 帶庫文件複製——lcp() 35
5.7.7 庫文件的命名 36
6 引導 38
6.1 引導過程概述 38
6.2 幾種引導方式 38
6.3 grub引導器 38
6.4 USB引導 38
6.4.1 製作步驟 39
6.5 提示 40
6.5.1 版本問題? 40
7 遠程串口控制台 41
7.1 概述 41
7.2 配置方法 41
7.3 提示 41
7.4 Linux 遠程串口控制台指南 41
8 系統安裝光盤 44
8.1 概述 44
8.2 boot.iso光盤的文件結構分析 44
8.3 製作步驟 45
9 源代碼(配置文件和腳本) 46
9.1 lips.conf 46
9.2 mklips.sh 46


1 引言

1.1 編寫目的
  說明Linux系統裁減的過程及解決的主要技術問題。本文檔的編寫是為了說明L
iPS的詳細設計過程,也可以作為構造一個小型化Linux系統的指南。
  本文檔內容的組織如下所述:這一部分是引言,第2部分是對項目軟、硬件環境
和需求的總體描述,第3部分說明了裁減LINUX的相關基本概念。後面幾個部分是具
體實現方法的詳細說明,4~6分別詳細描述了創建內核、創建根文件系統和引導系
統的方法。最後的內容可以看作附錄,其中7說明了一般Linux系統安裝光盤的創建
方法,8列出了相關的配置文件和源代碼。
1.2 背景
  華中科技大學計算機存儲系統國家專業實驗室,NAS項目(2003.3——2003.8)

1.3 定義
O boot loader: 引導器
O kernel: 內核
O root filesystem: 根文件系統
O USB: 通用串行總線
O
1.4 參考資料
[1] DIY:自己動手做一個迷你 Linux 系統. IBM developerWorks 中國網站. htt
p://www-900.ibm.com/developerWorks/cn/linux/embed/diy/index.shtml
[2] Linux From Scratch. http://clfsbook.mylab.idv.tw/index.html
[3] Linux啟動過程綜述. http://www.linuxaid.com.cn/forum/showdoc.jsp?l=1&
i=15750
[4] The Linux Bootdisk HOWTO (中譯版). http://www.linux.org.tw/CLDP/gb/B
ootdisk-HOWTO.html
[5] Using the initial RAM disk (initrd). /usr/src/linux-2.4/Documentatio
n/initrd.txt. (譯文?a href="Ghttp://zope.slat.org/Project/3ybaby/discuss-area/c" target="_blank">Ghttp://zope.slat.org/Project/3ybaby/discuss-area/c
d-boot/cdboot_refer/initrd.htm)
[6] Quickmouse於2003.1發表於白雲黃鶴BBS (http://bbs.whnet.edu.cn Linux討
論區的帖子「裁減Linux」。
[7] Filesystem Hierarchy Standard. http://www.pathname.com/fhs/pub/fhs-2
.2.pdf
[8] LINUX ALLOCATED DEVICES. /usr/src/linux-2.4/Documentation/device.txt
. 或者最新的列表?a href="bhttp://www.kernel.org/pub/linux/docs/device-list/" target="_blank">bhttp://www.kernel.org/pub/linux/docs/device-list/
[9] Karim Yaghmour. Building Embedded Linux Systems. O'Reilly, April 200
3.
[10] Alessandro Rubini. Take Command: Init. http://www.linux.it/kerneldo
cs/init/ , November 1998.
[11] 深入 Linux PAM 體系結構. IBM developerWorks 中國網站. http://www-90
0.ibm.com/developerWorks/cn/linux/l-pam/index.shtml . 2003.7.
[12]
  



2 總體描述

2.1 硬件環境
  開發主機:
  Intel 845芯片組主板,P4賽揚1.8GHz CPU,256M內存,60G IDE硬盤,RTL813
9網卡。
  目標機:
  與主機同構。
2.2 軟件環境
  開發主機:
  Redhat Linux 7.3 (kernel 2.4.18-3),或者Redhat Linux 9 (kernel 2.4.2
0-8)。可以根據需要使用其他版本的內核,比如Redhat 7.3+kernel 2.4.20。
  目標機:
  LiPS,以及應用程序。
2.3 需求規定和約束
  我們目標系統LiPS,即Linux Powered Storage是一個嵌入式Linux操作系統,
主要著眼於提供各種文件服務,不包括X GUI;並且足夠小,可以裝入32M USB盤或
者DOC/DOM等常用設備引導。
  



3 總體設計

3.1 基本設計概念
  提起「裁減Linux」,最容易想到的方法是以一個已經安裝好的系統為基礎,刪
除掉不需要的文件,以減小整個系統的尺寸。而事實上這個方法幾乎是行不通的,
因為通過光盤安裝的一個Redhat 9 Linux系統,即便是只選擇了比較少的軟件包,
其所佔空間也可以輕鬆達到300~500MB,想在這個基礎上裁減到30MB左右是比較困
難的。更困難的是確定哪些東西是可以刪除的?如果刪除了系統必須的文件,可能
導致系統不能引導。
  另一個途徑是從零開始根據需要構建整個系統。「Linux From Scratch」採用
的就是這種方式,一個個安裝需要的軟件包。類似的,更簡單的方法是,安裝一個
完整的Linux系統,然後將必要的軟件(可執行程序)、配置文件、庫文件、內核等
複製出來構建一個小系統。我們採取後一種方式。
  
3.2 軟件結構
  LiPS包括3部分:Linux內核,根文件系統和引導器。
  內核(Kernel)提供了一個操作系統的基本功能,如內存管理、進程調度、文
件系統、網絡等,以及設備驅動程序。
  根文件系統(Root filesystem)是存放運行、維護系統所必須的各種工具軟件
、庫文件、腳本、配置文件和其他特殊文件(比如設備節點)的地方,也可以安裝
各種軟件包。通常根文件系統位於某個磁盤分區,而在LiPS中應用了initrd(初始
RAM盤)機制,將根文件系統放在RAM Disk中。
  引導器(Boot Loader)的任務是從引導設備裝載內核,引導系統運行。Linux
系統常見的引導器包括早期的LILO和近期的GRUB。LiPS用的是GRUB。
  



4 內核

4.1 創建內核的方法
  Linux提供了方便靈活的方法來定製內核,主要步驟包括:下載安裝內核源代碼
樹,配置內核,編譯內核。具體方法請參考相關文檔。關鍵指令如下:
cd /usr/src/linux-2.4
make menuconfig
make dep; make clean; make bzImage
  編譯成功的內核文件為arch/i386/boot/bzImage.
4.2 內核配置
4.2.1 概述
  make menuconfig之後可以看到類似如下的內容(編號是為了描述方便而加上的
)。根據內核版本的不同,列出的項目會有差異。而變化主要發生在發行版為標準
內核打的各種補丁上面,其實標準內核是比較穩定的。
  如下所示,我們配置的內核版本為2.4.20-8,這個「-8」就是Redhat所打的補
丁版本號。補丁一般是對標準內核錯誤的修正和新增的功能。與2.4.20內核配置選
項比較會發現,[10,25,30]都屬於Redhat的補丁。
  一般地,這些補丁選項都不是必須的,因此我們的LiPS內核中都沒有包括這些
選項。其實,完全可以通過直接配置一個標準的內核版本(比如2.4.20)來產生我
們所需要的內核。
Linux Kernel v2.4.20-8-R2Lips Configuration
[1] Code maturity level options --->
[2] Loadable module support --->
[3] Processor type and features --->
[4] General setup --->
[5] Memory Technology Devices (MTD) --->
[6] Parallel port support --->
[7] Plug and Play configuration --->
[8] Block devices --->
[9] Multi-device support (RAID and LVM) --->
[10] Cryptography support (CryptoAPI) --->
[11] Networking options --->
[12] Telephony Support --->
[13] ATA/IDE/MFM/RLL support --->
[14] SCSI support --->
[15] Fusion MPT device support --->
[16] I2O device support --->
[17] Network device support --->
[18] Amateur Radio support --->
[19] IrDA (infrared) support --->
[20] ISDN subsystem --->
[21] Old CD-ROM drivers (not SCSI, not IDE) --->
[22] Input core support --->
[23] Character devices --->
[24] Multimedia devices --->
[25] Crypto Hardware support --->
[26] File systems --->
[27] Console drivers --->
[28] Sound --->
[29] USB support --->
[30] Additional device driver support --->
[31] Bluetooth support --->
[32] Kernel hacking --->
[33] Library routines --->
Load an Alternate Configuration File
Save Configuration to an Alternate File

  下面我們以2.4.20內核為例,來詳細說明內核的配置,也就是選哪些東西、不
選哪些東西。沒有說明的選項,比如「Code maturity level options」,表示不選

4.2.2 Loadable module support
Enable loadable module support
[ ] Set version information on all module symbols
Kernel module loader
  可加載模塊支持。雖然目前所選項目全部編譯進內核,但是內核是支持模塊的
。可以考慮將一些硬件設備的驅動程序編譯為模塊,從而減小內核尺寸,同時增加
適應不同硬件平台的靈活性。
4.2.3 Processor type and features
(Pentium-III/Celeron(Coppermine)) Processor family
Machine Check Exception
< > Toshiba Laptop support
< > Dell laptop support
< > /dev/cpu/microcode - Intel IA32 CPU microcode support
< > /dev/cpu/*/msr - Model-specific register support
< > /dev/cpu/*/cpuid - CPU information support
(off) High Memory Support
[ ] Math emulation
[ ] MTRR (Memory Type Range Register) support
[ ] Symmetric multi-processing support
[ ] Local APIC support on uniprocessors
[ ] Unsynced TSC support
  處理器特性。選擇一下Processor family,其餘基本上都沒有選。High Memor
y Support也可以打開,不清楚有什麼用。
4.2.4 General setup
Networking support
PCI support
(Any) PCI access mode
ISA bus support
PCI device name database
[ ] EISA support
[ ] MCA support
[ ] Support for hot-pluggable devices
System V IPC
BSD Process Accounting
Sysctl support
(ELF) Kernel core (/proc/kcore) format
< > Kernel support for a.out binaries
<*> Kernel support for ELF binaries
< > Kernel support for MISC binaries
Power Management support
< > Kernel support for MISC binaries
Power Management support
<*> Advanced Power Management BIOS support
Ignore USER SUSPEND
Enable PM at boot time
Make CPU Idle calls when idle
Enable console blanking using APM
RTC stores time in GMT
Allow interrupts during APM BIOS calls
Use real mode APM BIOS call to power off
  總體設置。這一部分選項比較重要,包括網絡、總線、進程、二進制文件格式
、電源管理等。其中APM相關的選項比較搞不清楚,有時候halt –p命令不能關閉系
統電源跟這裡有關係。
4.2.5 Plug and Play configuration
<*> Plug and Play support
< > ISA Plug and Play support
  即插即用設置。
4.2.6 Block devices
<*> Normal floppy disk support
< > XT hard disk support
< > Compaq SMART2 support
< > Compaq Smart Array 5xxx support
< > Mylex DAC960/DAC1100 PCI RAID Controller support
<*> Loopback device support
< > Network block device support
<*> RAM disk support
(4096) Default RAM disk size
Initial RAM disk (initrd) support
Per partition statistics in /proc/partitions
  塊設備。軟驅也可以不選。這裡的關鍵選項是Loopback device,RAM disk和i
nitrd,一定要選中。Default RAM disk size多少都沒有關係。
4.2.7 Multi-device support (RAID and LVM)
Multiple devices driver support (RAID and LVM)
<*> RAID support
<*> Linear (append) mode
<*> RAID-0 (striping) mode
<*> RAID-1 (mirroring) mode
<*> RAID-4/RAID-5 mode
<*> Multipath I/O support
<*> Logical volume manager (LVM) support
  MD支持。軟RAID和LVM的支持在這裡選擇,如果不使用,也可以不選。
4.2.8 Networking options
<*> Packet socket
Packet socket: mmapped IO
< > Netlink device emulation
Network packet filtering (replaces ipchains)
[ ] Network packet filtering debugging
Socket Filtering
<*> Unix domain sockets
TCP/IP networking
IP: multicasting
IP: advanced router
[ ] IP: policy routing
[ ] IP: equal cost multipath
[ ] IP: use TOS value as routing key
[ ] IP: verbose route monitoring
[ ] IP: large routing tables
IP: kernel level autoconfiguration
IP: DHCP support
IP: BOOTP support
IP: RARP support
<*> IP: tunneling
< > IP: GRE tunnels over IP
[ ] IP: multicast routing
[ ] IP: TCP Explicit Congestion Notification support
[ ] IP: TCP syncookie support (disabled per default)
IP: Netfilter Configuration --->
< > 802.1Q VLAN Support
---
< > The IPX protocol
< > Appletalk protocol support
Appletalk devices --->
< > DECnet Support
< > 802.1d Ethernet Bridging
QoS and/or fair queueing --->
Network testing --->
  網絡選項。這裡選項也比較多,如果沒有什麼特殊要求,又不是十分理解這些
選項的意義,基本上可以用缺省設置。注意DHCP選項,如果要用到的話要記得選中
這個。
  IP: Netfilter Configuration(跟iptables有關)等幾個子選項都沒有選。
4.2.9 ATA/IDE/MFM/RLL support
<*> ATA/IDE/MFM/RLL support
IDE, ATA and ATAPI Block devices --->
<*> Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support
--- Please see Documentation/ide.txt for help/info on IDE drives
[ ] Use old disk-only driver on primary interface
<*> Include IDE/ATA-2 DISK support
Use multi-mode by default
Auto-Geometry Resizing support
<*> Include IDE/ATAPI CDROM support
< > Include IDE/ATAPI TAPE support
< > Include IDE/ATAPI FLOPPY support
<*> SCSI emulation support
[ ] IDE Taskfile Access
--- IDE chipset support/bugfixes
[ ] CMD640 chipset bugfix/support
[ ] RZ1000 chipset bugfix/support
Generic PCI IDE chipset support
Sharing PCI IDE interrupts support
Generic PCI bus-master DMA support
[ ] Boot off-board chipsets first support
[ ] Force enable legacy 2.0.X HOSTS to use DMA
Use PCI DMA by default when available
[ ] Enable DMA only for disks
[ ] AEC62XX chipset support
[ ] ALI M15x3 chipset support
[ ] AMD Viper support
[ ] CMD64X and CMD680 chipset support
[ ] CY82C693 chipset support
[ ] Cyrix CS5530 MediaGX chipset support
[ ] HPT34X chipset support
[ ] HPT366/368/370 chipset support
Intel PIIXn chipsets support
PIIXn Tuning support
[ ] PROMISE PDC202{46|62|65|67|68|69|70} support
[ ] ServerWorks OSB4/CSB5 chipsets support
[ ] SiS5513 chipset support
[ ] SLC90E66 chipset support
[ ] VIA82CXXX chipset support
[ ] Other IDE chipset support
[ ] IGNORE word93 Validation BITS
  IDE設備支持。要用IDE硬盤,當然要選中。CDROM選項看情況也可以不要。SCS
I emulation似乎對使用USB盤有影響。剩下的很多都是跟IDE chipset有關的。
  最好是用dmesg命令找出目標系統主板芯片組,然後選中對應的芯片組支持,這
樣相當於安裝了IDE芯片組的驅動程序。如果沒有指定應該也可以,只是性能可能會
受到一些影響。
4.2.10 SCSI support
<*> SCSI support
--- SCSI support type (disk, tape, CD-ROM)
<*> SCSI disk support
(40) Maximum number of SCSI disks that can be loaded as modules
< > SCSI tape support
< > SCSI OnStream SC-x0 tape support
< > SCSI CD-ROM support
<*> SCSI generic support
--- Some SCSI devices (e.g. CD jukebox) support multiple LUNs
[ ] Enable extra checks in new queueing code
[ ] Probe all LUNs on each SCSI device
[ ] Verbose SCSI error reporting (kernel size +=12K)
[ ] SCSI logging facility
SCSI low-level drivers --->
  SCSI支持。如果要用到SCSI硬盤等SCSI設備,這裡當然要選。目前我們的目標
系統其實沒有SCSI硬盤,但是為了使用USB盤,也要選中SCSI支持。
  SCSI low-level drivers子選項中是一些SCSI卡,都不用選。
4.2.11 Network device support
Network device support
ARCnet devices --->
< > Dummy net driver support
< > Bonding driver support
< > EQL (serial line load balancing) support
< > Universal TUN/TAP device driver support
Ethernet (10 or 100Mbit) --->
Ethernet (10 or 100Mbit)
EISA, VLB, PCI and on board controllers
<*> EtherExpressPro/100 support (eepro100, original Becker driv
er
<*> RealTek RTL-8139 PCI Fast Ethernet Adapter support
Ethernet (1000 Mbit) --->
[ ] FDDI driver support
< > PPP (point-to-point protocol) support
< > SLIP (serial line) support
Wireless LAN (non-hamradio) --->
Token Ring devices --->
[ ] Fibre Channel driver support
Wan interfaces --->
  網絡設備支持。主要選擇網卡類型,Ethernet (10 or 100Mbit)子選項中列出
了內核可以支持的10/100M以太網卡,這裡僅列出了我們選中的2種。其他子選項都
沒有選。
4.2.12 Character devices
Virtual terminal
Support for console on virtual terminal
<*> Standard/generic (8250/16550 and compatible UARTs) serial suppo
rt
Support for console on serial port
[ ] Extended dumb serial driver options
[ ] Non-standard serial port support
[ ] Unix98 PTY support
I2C support --->
Mice --->
Joysticks --->
< > QIC-02 tape support
Watchdog Cards --->
< > AMD 768 Random Number Generator support
< > Intel i8x0 Random Number Generator support
< > AMD 76x native power management (Experimental)
< > /dev/nvram support
< > Enhanced Real Time Clock Support
< > Double Talk PC internal speech card support
< > Siemens R3964 line discipline
< > Applicom intelligent fieldbus card support
Ftape, the floppy tape device driver --->
< > /dev/agpgart (AGP Support)
[ ] Direct Rendering Manager (XFree86 DRI support)
< > ACP Modem (Mwave) support
  字符設備。這裡主要就是選擇了最前面4個跟終端和串口有關的選項,以支持虛
擬終端(遠程登錄要用到),支持標準串口,支持串口控制台。
4.2.13 File systems
Quota support
< > Kernel automounter support
<*> Kernel automounter version 4 support (also supports v3)
<*> Reiserfs support
[ ] Enable reiserfs debug mode
Stats in /proc/fs/reiserfs
<*> Ext3 journalling file system support
[ ] JBD (ext3) debugging support
<*> DOS FAT fs support
<*> MSDOS fs support
< > UMSDOS: Unix-like file system on top of standard MSDOS fs
<*> VFAT (Windows-95) fs support
< > Compressed ROM file system support
Virtual memory file system support (former shm fs)
<*> ISO 9660 CDROM file system support
Microsoft Joliet CDROM extensions
[ ] Transparent decompression extension
< > JFS filesystem support
< > Minix fs support
< > FreeVxFS file system support (VERITAS VxFS(TM) compatible)
< > NTFS file system support (read only)
< > OS/2 HPFS file system support
/proc file system support
< > QNX4 file system support (read only)
< > ROM file system support
<*> Second extended fs support
< > System V/Xenix/V7/Coherent file system support
< > UDF file system support (read only)
< > UFS file system support (read only)
Network File Systems --->
< > Coda file system support (advanced network fs)
<*> NFS file system support
Provide NFSv3 client support
[ ] Root file system on NFS
<*> NFS server support
Provide NFSv3 server support
<*> SMB file system support (to mount Windows shares etc.)
[ ] Use a default NLS
< > NCP file system support (to mount NetWare volumes)
Partition Types --->
Native Language Support --->
Default NLS Option: "iso8859-1"
<*> Codepage 437 (United States, Canada)
<*> Simplified Chinese charset (CP936, GB2312)
<*> Traditional Chinese charset (Big5)
  文件系統。這部分內容比較多,也很重要。首先是Quota,如果目標系統支持這
個功能,這裡就要選中。然後是選擇要支持的文件系統,常用的有Reiserfs,Ext3
,FAT,ISO9660,JFS等等,可以根據情況選擇。/proc和ext2一定要選中。
  還有Network File Systems子選項,可以選擇是否支持NFS和SMB。Native Lan
guage Support子選項跟所支持的語言有關,這裡沒有全部列出來,我們選中了英語
和簡體、繁體中文字符集。
4.2.14 Console drivers
VGA text console
[ ] Video mode selection support
  控制台驅動。調試的時候可以給目標系統接顯示器看一下,實際系統應該可以
不選。
4.2.15 USB support
<*> Support for USB
[ ] USB verbose debug messages
--- Miscellaneous USB options
Preliminary USB device filesystem
[ ] Long timeout for slow-responding devices (some MGE Ellipse UP
Se
--- USB Host Controller Drivers
<*> UHCI Alternate Driver (JE) support
<*> OHCI (Compaq, iMacs, OPTi, SiS, ALi, ...) support
--- USB Device Class drivers
< > USB MIDI support
<*> USB Mass Storage support
USB Mass Storage verbose debug
[ ] Freecom USB/ATAPI Bridge support
[ ] ISD-200 USB/ATA Bridge support
[ ] Microtech CompactFlash/SmartMedia support
< > USB Modem (CDC ACM) support
< > USB Printer support
--- USB Human Interface Devices (HID)
<*> USB Human Interface Device (full HID) support
--- Input core support is needed for USB HID input layer or HID
BP
[ ] /dev/hiddev raw HID device support
--- USB Imaging devices
< > USB Kodak DC-2xx Camera support
< > USB Scanner support
< > Microtek X6USB scanner support
--- USB Multimedia devices
--- Video4Linux support is needed for USB Multimedia device suppo
rt
--- USB Network adaptors
--- USB port drivers
USB Serial Converter support --->
--- USB Miscellaneous drivers
< > Texas Instruments Graph Link USB (aka SilverLink) cable suppo
rt
< > USB LCD device support
  USB支持。如果沒有使用USB設備,這部分可以不選。要使用USB盤,一定要選中
USB Mass Storage support。其餘很多選項我也不清楚是干什麼用的。
4.3 提示
4.3.1 EXTRAVERSION
  在系統中使用uname可以獲得系統版本信息。比如Redhat 9:
[root@lips root]# uname -r
2.4.20-8
[root@lips root]#
  返回結果表示了Redhat修訂後的內核版本號。前面我們提到過,這個「-8」就
是Redhat附加在標準內核版本號後面的一個信息。
  在一個運行LiPS的系統中,我們也需要確定當前使用的內核版本,通過版本信
息來知道這個內核的配置,也可以通過在標準內核版本後面附加特定的編碼來實現

  /usr/src/linux-2.4/Makefile中的變量EXTRAVERSION可以幫助我們達到這個目
標。下面是Makefile文件的最前面幾行內容:
VERSION = 2
PATCHLEVEL = 4
SUBLEVEL = 20
EXTRAVERSION = -8
KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
  現在KERNELRELEASE的值就是2.4.20-8。這個信息會被編譯到內核中,uname工
具會從內核文件中提取出版本號。如果將Makefile做一些修改,比如,
EXTRAVERSION = -8-R2Lips
  那麼我們可以得到內核版本號2.4.20-8-R2Lips,表示為了創建LiPS而編譯的一
個特定配置的內核,這個內核是以2.4.20-8為基礎,R2Lips(Release 2 Lips)即
第二個版本。
  對Makefile的修改要在編譯內核之前完成。
4.3.2 .config
  內核配置(make menuconfig)完成之後,會詢問:
Do you wish to save your new kernel configuration?
< Yes > < No >
  回答Yes,配置信息會保存在/usr/src/linux-2.4/.config文件中。注意以「.
」開頭的文件是個隱藏文件,要用ls –a才看的到。.config是個文本文件,內容類
似下面:
#
# Loadable module support
#
CONFIG_MODULES=y
# CONFIG_MODVERSIONS is not set
CONFIG_KMOD=y
  所以可以把這個文件保存起來,並且給文件名帶上版本號,方便管理、使用。

cp .config ~/config-2.4.20-8-R2Lips