Email me: jollen # jollen.org

more: Jollen 的 Embedded Linux 教育訓練

« September 2005 | (回到Blog入口) | May 2006 »

April 2006 歸檔

April 24, 2006

Embedded Linux 的系統管理,#1: 重要設定檔

學習 Embedded Linux 需要一定的 Linux 系統管理能力,Jollen 所設計的「Embedded Linux / x86」便是在教授這樣的主題。本系列文章是要給來上Embedded Linux / x86 課程的學員在家先修的。

作者/陳俊宏
www.jollen.org

重要設定檔

為了能更了解 Linux 整個系統,學習 Linux 的第一步,必須先把幾個常用的設定檔研究一下。底下整理出幾個常用檔案。

系統管理相關設定檔

□ /etc/passwd

使用者帳號檔案。

□ /etc/shadow

儲存只有 root 才能讀取的帳號資訊,例如編碼過的密碼字串。

□ /etc/group

使用者群組檔案。

系統的定時裝置,可以讓系統在特定的時間或時間間隔執行指定的工作。

□ /etc/inittab (must have!)

設定開機時要啟動的 service 與 process。

□ /etc/fstab (must have!)

設定分割區與 mount 路徑的檔案。

□ /etc/termcap

各種不同終端機、印表機的字元定義。

網路相關設定檔

□ /etc/hosts

存放 IP 與host name 對應表。

□ /etc/hosts.allow

設定允許連線的 host。

□ /etc/hosts.deny

設定拒絕連線的 host。

□ /etc/resolv.conf

設定 DNS 主機。

□ /etc/inetd.conf

設定 inetd daemon 服務,也就是電腦所提供 TCP/IP 服務。Busybox 仍然提供舊式的 inetd 服務,Embedded Linux 較適合使用舊式的 inetd.conf 來實作。

Linux系統的檔案結構原則上應依照 Linux Standard Base 所制定的標準實作。

Embedded Linux 的系統管理,#3: initial scripts

initial scripts 是在開機時自動執行的 script,本文說明 Red Hat Linux 的 init script 概念,在我們的 Embedded Linux / x86 以及 Embedded Linux / ARM9 的課程中,同學會看到 /etc/inittab 配合 init script 的實作方法。

作者/陳俊宏
www.jollen.org

/etc/rc.d/ 概念

請同學參照 Red Hat Linux 的系統檔案來閱讀本文,我們的課程實作與 Red Hat Linux 的 init script 寫法頗有差異,但研讀 Red Hat Linux 的 init script 架構可以學習到完整的 init script 概念。同時,Red Hat Linux 的 init script 也是符合 LSB 標準的做法。

/etc/rc.d/ 裡的檔案在開機時,會由 init 來執行,因此,我們可以把一些設定編輯在裡面,在開機時自動做好設定,這些文字的執行檔,我們稱它為 script,又因為是開機時會執行的 script,所以也稱為 bootup scripts。

/etc/rc.d/rc?.d/ 裡的檔案都鍊結到 /etc/rc.d/init.d/ 裡,因此,我們只要針對/etc/rc.d/init.d/ 裡的檔案來做討論即可。

init 會根據 /etc/inittab 裡的預設 run level 來執行 /etc/rc.d/rc?.d/ 目錄裡的鍊結,例如我們在 /etc/inittab 預設 run level為 3:

id:3:initdefault:

則 init 會去執行 /etc/rc.d/rc3.d/ 目錄裡的檔案,指令 telinit 可以改變系統的 run-level,例如:

linux# telinit 5

表示將系統的 run level 改變成 5,則 init 在看到 run level 的改變時,就會去執行/etc/rc.d/rc5.d/ 裡的檔案。

/etc/rc.d/rc?.d 檔案格式

/etc/rc.d/rc?.d 裡的檔案格式都具有特殊義意,例如:

S17httpd
K18httpd

"S" 表示 start,"K" 表示 stop (kill),17 是優先序,數字低的先執行,httpd 則是表示這個檔案鍊結到 /etc/rc.d/init.d/httpd,因此 S17httpd 是「第 17 順位執行httpd」的意思,同理,K18httpd 則代表「第 18 順位關閉 httpd」,優先序是為了控制程式執行的順序,因為有一些程式會要求必須先載入一些特定程式才能執行,所以就利用優先序來控制,另外,優先序並不一定要是連續的數字,但執行時一定是由小而大執行,例如 S15httpd 執行完後,可能不會有 S16 的順序,所以就繼續往下執行。

/etc/rc.d/init.d 裡的 scripts 還提供一些參數,例如 Apache web server 的 script 為 /etc/rc.d/init.d/httpd,除了在開機時會自動被執行外,在命令模式下執行:

linux# /etc/rc.d/init.d/httpd stop

表示要終止 httpd (Apache web server) 的執行,Red Hat Linux 的 init script 實作可以讓使用者下達命令參數,此部份亦制定於 LSB 標準中。

例如,/etc/rc.d/init.d 裡的 script 提供了 6 種參數,但要注意的是,並不是所有的 script 都提供所有的參數,這 6 個參數為:

  • start
  • stop
  • restart
  • force-reload
  • reload
  • status

範例:

linux# /etc/rc.d/init.d/httpd restart
linux# /etc/rc.d/init.d/httpd start

這二個指令分別是重新啟動及啟動 httpd 的意思。當我們修改 Apache 的設定後,就可以下第一個命令來重新啟動 httpd,使新的設定生效。

再以一個例子說明,當我們想要關閉防火牆時,應該把 iptables 服務關閉,此時可以下達此命令:

linux# /etc/rc.d/init.d/iptables stop

Embedded Linux 的系統管理,#4: 網路設定

課程專案中,我們會在載入網路卡驅動程式後,再手動設定網路組態。在 Embedded Linux 系統中,我們會以命令列方式來設定網路的組態。

作者/陳俊宏
www.jollen.org

ifconfig 指令

ifconfig 指令是Linux網路組態設定的主要系統管理命令。以下我們說明如何手動設定這些網路組態:

  • IP
  • gateway
  • netmask
  • DNS
  • broadcast

設定 IP

例如,要將系統的 IP 設定為 59.120.22.215,則執行以下命令:

linux# ifconfig eth0 59.120.22.215

同時請將 loopback device 也加上去:

linux# ifconfig lo 127.0.0.1

直接執行 'ifconfig' 不加任何參數的話,可以看到目前的網路組態設定:

eth0 Link encap:Ethernet HWaddr 00:13:D4:C4:0D:ED
inet addr:59.120.22.215 Bcast:59.120.22.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1768542 errors:0 dropped:0 overruns:0 frame:0
TX packets:2411565 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:216276166 (206.2 Mb) TX bytes:2221236364 (2118.3 Mb)


lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:453762 errors:0 dropped:0 overruns:0 frame:0
TX packets:453762 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:959840798 (915.3 Mb) TX bytes:959840798 (915.3 Mb)

lo 是所謂的 loopback 界面,eth0 就是我們剛剛設定好的乙太網路界面,有了這層界面後,才能連上 Internet。這個動作必須在成功載入網路卡的驅動程式後才能執行。

別忘了,我們還沒替 eth0 界面設定好 gateway 與broadcast。gateway 是閘訊通,正確設定閘訊通才能連接外面的網路,否則只能連接區域網路內的主機,broadcast 是廣播位址,有了這個位址才能廣播封包到區域網路內的所有主機,例如要設定 gateway 與 broadcast 分別為 59.120.22.254 與 59.120.22.255。

設定 broadcast

執行:

linux# ifconfig eth0 broadcast 59.120.22.255

再執行 ifconfig 就可以發現 eth0 的 broadcast 位址已經被改變了。

設定 Netmask

例如,要將 eth0 的 netmask 設定成 255.255.255.0,則執行:

linxu# ifconfig eth0 netmask 255.255.255.0

其它組態的設定方法

設定 Gateway

修改 Gateway 設定:

linux# route del default
linux# route add default gw 59.120.22.254

我們先刪除 default 再加入新的 gateway 位址,不過這個刪除的動作也可以省略不做。

此時我們已經加入了一個預設的 gateway,直接執行 'route' 不加任何參數,便能看到目前的 gateway 設定:

linux# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
59.120.22.0 * 255.255.255.0 U 0 0 0 eth0
169.254.0.0 * 255.255.0.0 U 0 0 0 eth0
127.0.0.0 * 255.0.0.0 U 0 0 0 lo
default 59-120-22-254.H 0.0.0.0 UG 0 0 0 eth0

設定 DNS

最後要設定的是 DNS,DNS 負責 Domain Name與 IP 位址之間的轉換,例如我們打 embedded.jollen.org,經由查詢 DNS,得知其 IP 位址為 59.120.22.215,有了 IP 位址才得以和遠端的主機連線,因此正確設定一台可用的 DNS是很重要的。

設定 DNS 的方法很簡單,只要編輯 /etc/resolv.conf 即可,以下是一個範例:

search jollen.org 
nameserver 163.14.192.1 #第一個 nameserver 意同 primary DNS
nameserver 168.14.1.1 #第二個 nameserver 意同 secondary DNS

第一行是設定網域名稱搜尋,第二、三行則是設定 DNS server。search 通常用在區域網路,例如我們的主機位於 jollen.org 的網域,則設定 search jollen.org 的話,只要打主機名稱:

linux# telnet www

效果跟

linux# telnet www.jollen.org

是相同的。如果設定多個 domain 的話,則依序搜尋到一個合法的位址為止,例如:

search jollen.org xxx.com

若 telnet www 的話,會先找 www.jollen.org,如果失敗會接著找 www.xxx.com。

nameserver 是設定 DNS,這裡的 DNS 必須是 IP 位址,系統會依序向這些名稱伺服器做查詢,向第一個 DNS 做查詢若失敗,則往下向第二個 DNS 做查詢,依此類推。

/etc/hosts

我們可以把常用的 domain name 編輯到 /etc/hosts 裡,然後設定好 host.conf,如此一來當我們使用這些常用的 domain name 時就可以不必再經由 DNS 的查詢程序,進而提升速度,例如以 www.jollen.org 為例,只要在 /etc/hosts 加上:

59.120.22.215 www.jollen.org jollen

這樣一來執行 "telnet jollen" 就等於是 "telnet 59.120.22.215"。

/etc/hosts.conf

設定好 /etc/hosts 後還要檢查一下 /etc/hosts.conf 的設定,確定名稱查詢時會先查詢 /etc/hosts,請檢查 /etc/hosts.conf 是否有一行:

order hosts,bind

表示先查詢 /etc/hosts,失敗的話再向 DNS 主機查詢。

關於 April 2006

此頁面包含了在April 2006發表於Jollen's Blog的所有日記,它們從老到新列出。

前一個存檔 September 2005

後一個存檔 May 2006

更多信息可在 主索引 頁和 歸檔 頁看到。

Top | 授權條款 | Jollen's Forum: Blog 評論、討論與搜尋
Copyright(c) 2006 www.jollen.org