歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> Linux文化

Linux開機程序之研討


CCCA 資工86

各位是否曾經對電腦整個開機的流程感到好奇呢 ? 這一次 , 我們所要討論的
主題 , 就是 Linux 從開機的一瞬間到 login 為止 , 到底發生了什麽事情 ?
想必各位都知道 , 在剛開機時 , 由於 80x86 的特性 , CS ( Code Segment )
這個暫存器中全部都放著 1 , 而 IP ( Instruction Pointer ) 這個暫存器
中全部都放著 0 , 換句話說 , CS=FFFF 而 IP=0000 , 此時 , CPU 就依據
CS 及 IP 的值 , 到 FFFF0H 去執行那個地方所放的指令 . 這時候 , 由於
FFFF0H 已經到了高位址的頂端 , 所以 , FFFF0H 這個地方 , 總是會放一個
JMP 指令 , 跳到比較低的位址 . 接著 , ROM BIOS 就會作一些檢查的動作
像記憶體 , 鍵盤 等...... 並在我們俗稱的 UMB ( Upper Memory Block )
之中掃描 , 看看是否有合法的 ROM 存在 ( 比如 SCSI 卡上的 ROM ) .
假如有 , 就到裡面去執行一些東西 , 執行完之後再繼續剛才的行程 . 到了
最後 , 讀取磁碟機上的第一個 sector . 在這裡 , 我假設各位由硬碟啟動
因此 , 就硬碟的構造而言 , 它的第一個 sector 稱為 MBR ( Master Boot
Record ) . 因為一個 sector 是 512 bytes , 而 MBR 這 512 bytes 可分
為兩個部份 , 第一個部份為 Pre-Boot 區 , 占了 446 bytes ; 第二部份
是 Partition Table , 占了 66 bytes . Pre-Boot 區的作用之一 , 就是
去看看那個 Partition 被標成 Active , 然後去讀那個 Partition 的 Boot
區 .
在 Linux 的啟動方面 , 一般人最常把 LILO 放在 MBR 或 Superblock
假如你把 LILO 放在 MBR , 那很明顯的 , 當讀取到 MBR 的時候 , LILO
就被執行 , 此時 , 你的螢幕上會出現 boot: 接著 , 就進行 Load Kernel
的動作 . 在另一方面來說 , 假如你把 LILO 安裝在 Superblock , 通常你
還會有一個管理開機的程式 , 也許是住在 MBR ( 像 OSBS ) 或者是放在一
個單獨的 Partition ( 像 OS/2 的 Boot Manager ) . 再由這個管理開機
的程式去讀取 LILO , 進而做 Load Kernel 的動作 .
好了 , 到了目前為止 , 我們已經講到 Load Kernel 的動作 . Kernel 被
load 到 memory 中之後 , 接著進行一連串 probe 周邊的動作 , 像串聯埠
並聯埠 , 軟碟 , 音效卡 , 硬碟 , 光碟機 等 ...... 接著 mount root
partition . 在這之後 , kernel 會起動 init 這個 process . init 這
個 process 的 PID 為 1 , 它是所有 process 的祖先 .
接下來呢 ? 系統就開始執行 /rc.d/rc.S , 在這裡 , 我們暫時打住 ,
先對大概的 initialization script 執行的順序作一個浏覽 , 請看下面
的流程 :
init[1]
rc.S begin > 制造一個檔案 , 並用 rm -f 這個檔案來測試 root partition
## 是不是 read-only 或者是可讀寫
READWRITE=no
if echo -n >> "Testing filesystem status"; then
rm -f "Testing filesystem status"
READWRITE=yes
fi

## 假如 root partition 是 read-only 就作 fsck 的動作 , 假如不是 read-only
## 而是 read-write 的話 , 就做下面 else 之後的動作
if [ ! $READWRITE = yes ]; then
## 利用 fsck 做檢查及修復檔案系統的工作 , 後面接的兩個參數 -A , -a .
## -A 的意思是 : fsck 會依據 /etc/fstab 中的記錄 , 去檢查所有的檔案
## 系統 ; 而 -a 就是 auto 的意思 , 當 fsck 有修復的動作時 , 它不會問
## 你問題 , 而直接修復 .
/sbin/fsck -A -a

## 假如 fsck 有 error , [ $? -gt 1 ] 括號裡面的意思是 : 若上個命令的
## 傳回值大於 1 , 而上個命令就是 fsck . 讓我們看看 fsck 的傳回值 :
## 0 - No errors
## 1 - File system errors corrected
## 2 - File system errors corrected, system should
## be rebooted if file system was mounted
## 4 - File system errors left uncorrected
## 8 - Operational error
## 16 - Usage or syntax error
## 128 - Shared library error
## 很明顯的 , 若有任何錯誤產生的話 , 那 fsck 的傳回值都大於 1 . 其實
## 就我的觀點認為 , 應該寫成 if [ $? -ge 1 ] 比較好 . 既然有錯呢 , 系統
## 應該就要跳至單人模式 , 在單人模式中主要就是 /etc/rc.d/rc.K
## 中的兩件事 : 關掉 swap 及 卸下所有的檔案系統 , 而最後重新 login .
## 一般正常的情況下 , if 下面這一大段是不會執行的 , 而會跳至下面
## 標有 ************************* Normal 1 ************************* 處
if [ $? -gt 1 ] ; then
echo
echo
echo "**************************************"
echo "fsck returned error code - REBOOT NOW!"
echo "**************************************"
echo
echo
/bin/login
fi
## ****************************** Normal 1 **************************
## 當 fsck 檢查沒有錯誤之後 , 就把 root partition 重新 mount 上來
## 下面指令的參數有三個 , -w 代表mount 成可讀寫 , -n 代表把一個 file-
## system mount 上來 , 但不會把記錄寫到 /etc/mtab 中 , 在上次對 /etc/mtab
## 介紹時有提到 , 當我們使用 mount 這個指令把一個 filesystem mount 上來
## 的時候 , /etc/mtab 就會記錄 ! 利用 -n 這個 option 可使得做 mount 的動
## 作 , 卻不會記錄 . -o 後面可以接許多的選項 , 在這裡 , 我們給它的選項是
## remount . remount 的意思是 : 重新 mount 一個已經被 mount 的 filesystem
## 這個選項通常被用來改變該 filesystem 的讀寫旗號 ,尤其是把 filesystem
## 從 read-only 的狀態 , 改變成 read-write 的狀態 .
echo "Remounting root device with read-write enabled."
/sbin/mount -w -n -o remount /

## 在前面的情況中 , 都是 root partition 為 read-only 的狀態下 , 所做的一些
## 工作 , 到了最後一個指令 /sbin/mount -w -n -o remount / , 才把 root
## partition mount 成 read-write . 各位有沒有看到前面那行 :
## if [ ! $READWRITE = yes ]; then ..... 下面這個 else 就是與這個 if 對應
## 也就是說 , 前面那個 if 的區塊中 , 所作的工作都是在 root partition 為
## read-only 的條件成立下所作的事 , 那很明顯的 , 下面這個 else 就是 root
## partition 為 read-write 的條件下所作的工作 . 假如你的 root partition
## 為 read-writeable 的話 , 那麽系統就會顯示下面的訊息 . cat /dev/null , 當你使用這個指令之後會
## 發生什麽事呢 ? 什麽也沒發生 , 而且 ls 的輸出就好像被丟到黑洞裡 , 無
## 影無蹤了 . 那也許你會想 : 那這有什麽用 ? 我的回答是 : 的確沒有什麽
## 很大的用處 , 但當你想抑制輸出的訊息時 , 你就會用得到了 .
cat /dev/null >> /etc/utmp

## 依據 fstab ( filesystem table ) 中的描述 , 自動的掛上檔案系統
## 但此時因為 TCP/IP 還沒有設定 , 故不用 NFS
echo 'Mount Filesystem !!!'
/sbin/mount -avt nonfs

## 設定系統的時鐘 . 下面這幾行所做的事就是 : 看看 /sbin/clock 這個檔案是
## 不是可執行的 , 假如可以執行 , 就把 CMOS 中的時間設定為系統的時間 .
if [ -x /sbin/clock ]; then
echo 'Set System Clock'
/sbin/clock -s
fi

## 下面的四行若沒有 mark , 則每次開機 issue 及 motd 都會被改變 , 這應該
## 可算是 FAQ 級的問題了 ...... 因為我有自己設計的 issue 及 motd , 所以
## 下面的四行前面都有 # , 被當成注解 .
## 假如你要有自己的設定 , 下面一定都要 mark 起來
#echo > /etc/issue
#echo Welcome to Linux /bin/uname -a | /bin/cut -d\ -f3. >> /etc/issue
#echo >> /etc/issue
#echo "/bin/uname -a | /bin/cut -d\ -f1,3. (Posix)." > /etc/motd

## 接下來 , 將執行 rc.serial , 顧名思義 , rc.serial 是作串連埠設定的工作
## 在 rc.serial 中 , 內容雖然也是很簡單 , 但並不像 rc.S 那樣直接 . 換句話
## 說 , 讀者至少要 " 稍微 " 懂一點 shell programming , 所以說呢 , 假如
## 還不會 shell programming 的讀者呢 , 都應該趕快去找一本書來看一下 , 在
## 這篇文章的結尾 , 我會提出一些書單 , 各位可以去找找這幾本書 ......
/bin/sh /etc/rc.d/rc.serial
echo '================= rc.S is finish NOW !!! ========================='


到了這裡 , rc.S 的最後一步 , 是去執行 rc.serial . 大家可以看一看
/rc.d/rc.serial . 好像很長的樣子 , 但實際上呢 , 各位必然發現到了 , 這個
shell script 大部份指令的前面都有一個 '#' 號 , 這代表著 , 這些指令完全
不會被執行 . 所以呢 , 真正有用的只不過寥寥十幾行吧 ! 在另一方面來說 ,
假如你是用網路卡連上網路 , 那 rc.serial 對你並沒有什麽大用處 .

**************************** rc.serial ******************************
#!/bin/sh
#
# /etc/rc.serial
# Initializes the serial ports on your system
#
# Version 2.01
echo '======================= rc.serial is begin !!! ====================='
cd /dev
## 下面三行中的前兩行是設定一些變數 , 由於在這個 shell script 中 , 須要
## 用到 /bin/setserial -b 這個指令 , 或是須要用到所有以 cua 開頭的 node
## 的次數太多了 , 因此 , 把它們設定為一個變數 , 是一個不錯的方法 . 尤其
## PORTS=`echo cua? cua??` 這是一個聰明的寫法 , 那為什麽不寫成 PORT=
## `echo cua*` 呢 ? 各位可以在 /dev 下分別使用這兩個指令 , 觀察輸出到底
## 有什麽不同 ......
SETSERIAL="/bin/setserial -b"
PORTS=`echo cua? cua??`
echo -n "Configuring serial ports...."

## 下面這行 , 沒有學過 shell programming 的人很可能會看不懂 , 不過沒有
## 關系 , 這行中的 ${SETSERIAL} 會被換成 /bin/setserial -b , 而 ${PORTS}
## 會被換成 cua0 cua1 cua2 ....... cua31 , 所以整句翻譯就是 :
## /bin/setserial -b -W cua0 cua1 cua2 cua3 cua4 cua5 cua6 ...... cua31
## 那這行指令到底在做什麽呢 ? 其實只是在做中斷偵測的工作 .
${SETSERIAL} -W ${PORTS}

## 各位看到下面原來的注解了吧 . 當你有一些特殊的卡時 , 你可以把相對應部
## 份前面的 '#' 去掉 , 以便能做自動設定的工作 . 其實呢 , 這種情況實在
## 不多 , 大部份人的設備都差不了多少 , 說到關於串連埠 , 差異就更少了 .
#
# AUTOMATIC CONFIGURATION
#
# Uncomment the appropriate lines below to enable auto-configuration
# of a particular board. Or comment them out to disable them....
#

## 好了 , 這下我們又多了一個變數 : AUTO_IRQ , 這在下面會用到 .
AUTO_IRQ=auto_irq

## 下面幾行非常整齊 , 它們可以分別被換成 :
## /bin/setserial -b /dev/cua? auto_irq skip_test autoconfig
## setserial 說穿了也沒什麽 , 這個指令可以讓你對 serial port 做設定及回報
## 的動作 , 像 IRQ , I/O port 啦等等的事情 . 一般的情況下 , 大家的電腦中
## 通常只有 COM1-COM4 , 但假如你想增加新的 port , 那 setserial 就派上用
## 場了 .
# These are the standard COM1 through COM4 devices
#
# If you have an internal modeme with a Rockwell Chipset, add a "skip_test"
# to the /dev/cua3 line below. (It's not added by default because it will
# screw up people with 8514 displays).
#
${SETSERIAL} /dev/cua0 ${AUTO_IRQ} skip_test autoconfig
${SETSERIAL} /dev/cua1 ${AUTO_IRQ} skip_test autoconfig
${SETSERIAL} /dev/cua2 ${AUTO_IRQ} skip_test autoconfig
${SETSERIAL} /dev/cua3 ${AUTO_IRQ} autoconfig
# These are for the first AST Fourport board (base address 0x1A0)
#
${SETSERIAL} /dev/cua4 ${AUTO_IRQ} autoconfig
${SETSERIAL} /dev/cua5 ${AUTO_IRQ} autoconfig
${SETSERIAL} /dev/cua6 ${AUTO_IRQ} autoconfig
${SETSERIAL} /dev/cua7 ${AUTO_IRQ} autoconfig
# These are for the second AST Fourport board (base address 0x2A0)
#
${SETSERIAL} /dev/cua8 ${AUTO_IRQ} autoconfig
${SETSERIAL} /dev/cua9 ${AUTO_IRQ} autoconfig
${SETSERIAL} /dev/cua10 ${AUTO_IRQ} autoconfig
${SETSERIAL} /dev/cua11 ${AUTO_IRQ} autoconfig

## 從這裡以下 , 我省略了一大段 , 因為這一大段都是支援特殊的卡
# These are the 3rd and 4th ports on the Accent Async board.
#
#${SETSERIAL} /dev/cua12 ${AUTO_IRQ} autoconfig
#${SETSERIAL} /dev/cua13 ${AUTO_IRQ} autoconfig
#

.
.
.
.
.
.
.

## 好了 , 我們跳掉了一大段 , 直到這裡 . 各位看到下面的注解了 .
## 假如你想用手動的方法指定 IRQ , I/O port , 及指定 chip 的型別
## 那你可以拿掉下面對應那行前面的 '#' 並作適當的修改 , 比如說
## 你用的是比較新的 16550 或 16550A , 而不是 16450 , 那你就可以
## 在下面用手動的方法指定 . 實際上 , 用 autoconfig 及 autoirq
## 的選項就可以了 , 沒有必要用手動的方式 . 除非偵測不到 .
###############################################################
#
# MANUAL CONFIGURATION
#
# If you want to do manual configuration of one or more of your
# serial ports, uncomment and modify the relevant lines.
#
###############################################################
# These are the standard COM1 through COM4 devices
#
#${SETSERIAL} /dev/cua0 uart 16450 port 0x3F8 irq 4
#${SETSERIAL} /dev/cua1 uart 16450 port 0x2F8 irq 3
#${SETSERIAL} /dev/cua2 uart 16450 port 0x3E8 irq 4
#${SETSERIAL} /dev/cua3 uart 16450 port 0x2E8 irq 3
.
.
.
.
.
.
.
.
## Ok , 到此 , rc.S 及 rc.serial 已經結束 , 因為截稿時間的關系 , rc.M
## rc.inet1 , rc.inet2 , rc.font , rc.local 將在以後為各位介紹 .
echo "done."
${SETSERIAL} -bg ${PORTS}
echo ' ====================== rc.serial is complete !!! ==================='


* 關於 Shell Programming 的書單 :
Title: The Unix C Shell Field Guide
Authors: Gail Anderson and Paul Anderson
Publisher: Prentice Hall
Edition: 1986
ISBN: 0-13-937468-X
這本是 C-Shell 的 Bible , 想學 C-Shell 的人 , 可以去看這本書 .

Title: Unix Shell Programming
Authors: Stephen Kochan and Patrick Wood
Publisher: Hayden
Edition: 1990
ISBN: 0-672-48448-X
喔 ! 這本書以 Bourne Shell 為主 , 內容深入淺出 , 讀者很容易就可以了解
這本書的內容 , 進而掌握 Bourne Shell 的精髓 . 此外 , 這本書也有提到
Korn Shell , 大體上來說 , 是一本值得看的好書 .

*如何連絡作者 :
E-Mail Address : [email protected]
[email protected]
Dormitory : 交通大學十捨 317R
..


Linux 開機程序之研討
CCCA 資工86 許景華
在上次的介紹中 , 我們已經看完了 rc.S 及 rc.serial 這兩個 shell script .
現在 , 我們將把剩下的 shell script 再作一個介紹 .
首先還是看看全部的流程 :

init[1]
rc.S begin
rc.serial begin
rc.serial end
rc.S end login --> shell --> logout --
^ |
|------------------------------------------
即使在 getty 結束之後 , 它也會重新被啟動 .
ctrlaltdel : 想必有人會以鍵盤上的 Ctrl , Alt , 及 Del 這三個
鍵來達到使系統 shutdown 的目的 , 現在我們果然在
/etc/inittab 中看到了這一列 :
ca::ctrlaltdel:/sbin/shutdown -t3 -rf now
所以說 , 當我們按下這三個鍵的時候 , init 會收到
SIGINT 這個 signal , 接著就執行 shutdown 的動作
不過 , 我們最好不要養成按 Ctrl-Alt-Del 來使系統
shutdown 的習慣 , 尤其在單人多工的作業系統 , 像
OS/2 , 甚至 Windows 95 , shutdown 幾乎都是標准
的關機程序了 , 更何況是多人多工的 LINUX , 所以 ,
shutdown 這個指令是一定要熟悉的 .
除了上面的幾個 action 之外 , 另外還有一些合法的 action , 但這
些 action 並不需要太注意 , 要用的時候再利用 man init 去查詢就
可以了 .
process : 這一欄中可以是 shell script 或是可執行的程式 .
好了 , 當我們了解 /etc/inittab 中每一欄的意義之後 , 要看懂 /etc/inittab
就是一件輕松愉快的工作了 . 在 /etc/inittab 檔中 , 我們可以看到下面這一段
c1:12345:respawn:/sbin/agetty 38400 tty1
c2:12345:respawn:/sbin/agetty 38400 tty2
c3:45:respawn:/sbin/agetty 38400 tty3
c4:45:respawn:/sbin/agetty 38400 tty4
c5:45:respawn:/sbin/agetty 38400 tty5
c6:456:respawn:/sbin/agetty 38400 tty6
簡單來說 , 系統在起動之後會制造出六個虛擬的 console . 我想大家應該有試過
用 Ctrl-Alt + F1 - F6 可在這六個 console 之間切換 ; 若你使用 XWindows 時
想暫時回到 console 下時 , 可用 Ctrl-Alt + F1 - F6 這三個鍵來選擇 , 若想
回到 XWindows 下時 , 只要以 Ctrl-Alt-F7 就可以回到 XWindows 下了 . 基本
上 , 對於 memory 比較少的人 , 可以不要開那麽多的虛擬 console , 那麽就可
以去掉上面的幾列 . 還有 , 在前面我們也提過 , 可以把預設的 runlevel 從 5
改成 6 , 對於 beginner 來說 , 系統一啟動完就直接進入 XWindows 也許是一個
不錯的設定方法 ......
介紹完 /etc/inittab 之後 , 我們接著看 rc.M ! 由前面的流程當中 , 我們看到
rc.M 中又包含了四個 shell script , 其中 rc.inet1 及 rc.inet2 是有關於網路
的設定 ; rc.font 是作字型的設定 , 而 rc.local 中可以放一些想要起動的
daemon .
我們現在就來看看 rc.M , 依照往例 , 前面有兩個 "#" 的為加上去的注解 .
只有一個 "#" 的為原來的注解 :
#!/bin/sh
#
# rc.M This file is executed by init(8) when the system is being
# initialized for one of the "multi user" run levels (i.e.
# levels 1 through 6). It usually does mounting of file
# systems et al.
#
# Version: @(#)/etc/rc.d/rc.M 2.02 02/26/93
#
# Author: Fred N. van Kempen,
# Heavily modified by Patrick Volkerding
#
## 顯示進入多人模式
echo "Going multiuser..."

## 下面一列的意思是 : 假如你在文字模式的 console 下 , 在15分鐘內都沒有動作
## 的話 , 螢幕就會自動暗下來 , 簡單的說 , 就是 screen saver 的功能 .
/bin/setterm -blank 15

## 執行 crond 這個 daemon . 不用說 , crond 在系統中扮演了很重要的角色 ,
## 它負責每過一段時間後 , 就去看看 /var/spool/cron/crontabs 中有那些 file
## 要 run , 這些 file 往往有一個固定的時間 , 比如說 : 每個月的 1 號 , 每
## 天凌晨等 ...... 我們可以用平常的編輯器編好一個檔案 , 裡面的格式如下 :
##
## 分 時 日 月 星期 命令
##
## 舉例來說 , 59 23 31 12 * /etc/wall happy_new_year
## 在每年的 12 月 31 號晚上 11 點 59 分 會對每個系統上的 user 送出
## happy_new_year 中的內容
##
## 接著我們可以利用 crontab 這個指令來把此檔案放到
## /var/spool/cron/crontabs中□. 我們可以看看 /var/spool/cron/crontab 下
## 有一個 root 的檔案 , 看看裡面的內容 :
##
## 0,5,10,15,20,25,30,35,40,45,50,55 * * * * /usr/lib/atrun
##
## 所以各位看到了 , 在前兩期提到的 at 命令是五分鐘才被 run 一次的
##
## 再舉一個簡單的例子好了 : 我們先用一般的文書編輯器造出一個名為 crontest
## 的檔案 , 內容如下 :
##
## 5 * * * * ls -la ~/ >> ~/hehehaha
##
## 接著 , 我們鍵入下面的命令 : crontab crontest
## 此時 , 從內容得知 , 每五分鐘 crond 就會執行 ls -la , 把你 home directory
## 的內容加入 hehehaha 這個檔案中 .
##
## 當然啦 ! 這個例子簡直是毫無意義可言 :) 但是 , 大家既然知道了基本原理 ,
## 利用 crontab , at 這些指令 , 就可以簡化一些系統管理的動作 , 同時在執行
## 一些工作時 , 也會比較有彈性 .
/usr/sbin/crond -l10 >>/var/adm/cron 2>&1

## 假如 /etc/HOSTNAME 不能讀取的話 , 就把 darkstar.frop.org 當成 HOSTNAME
## 中的內容 . 老實說 , 下面這三列去掉也不打緊 ......
if [ ! -r /etc/HOSTNAME ]; then
echo "darkstar.frop.org" > /etc/HOSTNAME
fi

## 下面從 if 到 fi 夾起來的部份 , 主要就是在執行 rc.inet1 , rc.inet2 . 這
## 些都是網路設定的工作 , 尤其是 rc.inet2 , 啟動了一大堆 daemon , 這部份
## 要牽扯到的東西太多了 . 像 subnet 與 netmask 等 ...... 類似這種觀念 ,
## 都不是三言兩語就可以玩完的 , 所以就留待以後再說 .
if [ -x /etc/rc.d/rc.inet1 ];
then
/bin/hostname `cat /etc/HOSTNAME | cut -f1 -d .`
/bin/sh /etc/rc.d/rc.inet1
/bin/sh /etc/rc.d/rc.inet2
else
/sbin/hostname_notcp `cat /etc/HOSTNAME | cut -f1 -d .`
/usr/sbin/syslogd
/usr/sbin/klogd
/usr/sbin/lpd
fi

## 在某些資源獨占的情況下 , 一些應用程式往往會制造出 lock 檔 . 假如這些
## lock 檔在重新開機以後還是存在的話 , 那就很不好了 . 所以 , 下面就是在
## 作這些刪除 lock 檔的動作 , 並把一些輸出的訊息丟到 /dev/null 去 .
## 在上一期的內容中 , 我們就有提到 /dev/null 了 , 也有提到抑制訊息輸出的
## 方法 . 現在我們果然看到了一個實例 ......
/bin/rm -f /var/spool/locks/* /var/spool/uucp/LCK..* /tmp/.X*lock 1> /dev/null 2> /dev/null

## 假如你有玩 hunt 這個 game 的話 , 那在 /tmp 下會有一個 socket 型態的檔案
## 我們要把它刪除之後才能開始另一個 game ......
if [ -r /tmp/hunt -o -r /tmp/hunt.stats ]; then
echo "Removing your stale hunt sockets from /tmp..."
/bin/rm -f /tmp/hunt*
fi

## 設定 share library 的 link 及 cache . 這個指令只有 Superuser 才能使用
## 的 , 它也相當的重要 . 萬一你的 /etc/ld.so.cache 很不幸的 corrupt 了 ,
## 那我們也可以利用這個指令來讓它重新 link , 先刪除 /etc/ld.so.cache ,
## 再以 ldconfig -v 重新制造就可以了 .
/sbin/ldconfig

## 起動 sendmail daemon , 並且讓它 15 分鐘就去看一看 spool , 處理收發信件
if [ -x /usr/sbin/sendmail ]; then
echo "Starting sendmail daemon (/usr/sbin/sendmail -bd -q 15m)..."
/usr/sbin/sendmail -bd -q 15m
fi

## 假如 /etc/rc.d/rc.font 是可讀的話 , 就執行 rc.font 這個 shell script ,
## 而這個 shell script 主要是設定 text mode 下螢幕的字型
if [ -r /etc/rc.d/rc.font ]; then
/etc/rc.d/rc.font
fi

## 在系統管理中 , 我們常常把一些 local 的東西另外放在一個地方 , 這樣才不
## 會與原來的東西混淆 . 同時 , 因為 local 的東西更新版本的速度總是也比較
## 快 , 在這種情況下 , 常常會變動的東西也可以放在 local 的區域中 , 這樣
## 管理起來比較方便 . 也許各位也注意到了 : 為什麽會有 /usr/bin 及
## /usr/local/bin 之分 . 就個人認為 , 像自己 compile 出來的東西 , 假如
## 覺得還不錯 , 就可以把它放在 /usr/local/bin , 因為它是新增的 , 所以我
## 把它放在 /usr/local/bin . 當然啦 , 這只是個人喜好罷了 , 你要放那裡
## 都是可以的 , 只要找得到 , 易於使用及管理就好 .
## 同樣的 , 若我們要起動一些新增的 daemon 或 shell script , 那放在
## 是不錯的選擇 .
## 下面一列就是去執行 rc.local 中的設定 , 通常是一些 daemon 或是 shell
## script
/etc/rc.d/rc.local

# All done.

到這裡 , rc.M 已經結束了 , 我們來看看從 rc.M 之中執行的 rc.font 及
rc.local ......
下面是 rc.font 的內容 :
#!/bin/sh
#
# This selects your default screen font from among the ones in
# /usr/lib/kbd/consolefonts.
#
## 我想下面這一列的命令非常明顯了 , 就是設定 console 中的字型 , 你可以
## 改成自己喜歡的字 . 或者你也可以利用 fontconfig 這個指令來改變 .
setfont /usr/lib/kbd/consolefonts/default8x16


看完了 rc.font 後 , 我們來看看 rc.local 的內容 . 我所要說的是 : rc.local
畢竟是自己設定的區域 , 所以每個人的可能都不一樣 , 就我而言 , 因為我多 run
了一些 daemon , 所以與大家的可能不太相同 . 所以 , rc.local 作參考就可以了.
下面是我的 rc.local :
#! /bin/sh
# Put any local setup commands in here
# Running selection

## lpd 是控制印表機的 daemon , 要想在 LINUX 下用印表機 , 這個 daemon 必需
## 要被起動 , 此外還要修改 /etc/printcap . 詳細的情況要去看 PRINT-HOWTO
echo -n "lpd"
/etc/lpd

## httpd 就是 WWW server 的 daemon . 想必大家都用過 Mosaic , Netscape 等
## 的浏覽器 . 但假如我們想建立自己的 WWW server , httpd 必須要執行 .
echo -n " httpd"
/usr/local/etc/httpd/src/httpd

## 在 WWW 的時代還沒來臨以前 , gopher 可說是具有最方便的資料索引功能 , 即使
## 到了現在 , gopher 仍然占有一席之地 , 在這裡 , 因為我有建立自己的 gopher
## server , 所以 gopherd 必需被起動 .
echo -n " gopherd"
/usr/local/sbin/gopherd -u nobody

## 下面這個指令是 mouse 在 console 下做 cut & paste
echo -n "Running selection..."
selection -t ms &
echo '


Copyright © Linux教程網 All Rights Reserved