Sep 23, 2007

[轉錄] Embedded Linux 的系統管理...from jollen

本文出處: www.jollen.org
已取得原作者授權使用

(1) (2) (3) (4) (5)


轉貼方便自己閱讀



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


jollen 發表於 April 24, 2006 3:26 PM

 


 


學習 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 所制定的標準實作。

--jollen

Embedded Linux 的系統管理,#2: /etc/fstab 與 /etc/inittab


jollen 發表於 September 4, 2005 11:06 AM

 


 


介紹 2 個重要的系統設定檔,這 2 個設定檔是最小化 Linux 能順利啟動的關鍵。


作者/陳俊宏
www.jollen.org
/etc/fstab 的用途

/etc/fstab 是設定分割區與 mount 目錄關係的檔案,開機時會依這個檔案的內容 mount 檔案系統,mount 檔案系統的命令為:
linux# mount -av

會依 /etc/fstab 的內容 mount 進除了 root 以外的所有檔案系統。

root 是在開機時由核心所 mount 進來的。root 先由核心 mount 成 read-only,然後由使用者手動 remount 成 read-write。

/etc/fstab 設定格式

一個簡單的 /etc/fstab 設定範例如下:

#Device mount point filesystem type option
LABEL=/ / ext2 defaults 1 1
/dev/sda5 /home ext2 defaults 1 2
/dev/cdrom /mnt/cdrom iso9660 noauto,owner,ro 0 0
/dev/fd0 /mnt/floppy auto noauto,owner 0 0
LABEL=/usr /usr ext2 defaults 1 2
none /proc proc defaults 0 0
none /dev/pts devpts gid=5,mode=620 0 0
/dev/sda7 swap swap defaults 0 0


每個欄位所代表的義意為:

  • device 指定分割區

  • mount point 指定要 mount 目錄

  • filesystem type 指定檔案系統,比較常用的檔案系統有:


‧ msdos
‧ vfat
‧ nfs
‧ swap
‧ ext2

使用這些檔案系統前,請先確認核心是否支援,要知道目前核心的狀態支援那些檔案系統,可以查看 /proc/filesystems:

ext2
nodev proc

iso9660
nodev devpts
nodev usbdevfs


表示目前核心支援 ext2/proc/iso9660/devpts/usbdevfs 的檔案格式,其中proc、devpts 與 usbdevfs 前面有一個 nodev 關鍵字,表示這二個檔案系統其實是存在記憶體中的,並非真正存在於儲存裝置中。

  • option 設定參數,如果我們要 mount 的是硬碟的分割區,不管是什麼檔案系統,只要設定為 defaults 即可。

  • 第一個數字,0 或者空白表示不要 dump,1 表示要 dump,dump 是用來將系統備份到磁帶機的指令,備份時,如果想要略過這個分割區,在一欄填 0 即可,如困2這一欄是 1 的話, dump 時就會備份這個分割區。

  • 第 二個數字,是設定當系統有不正常關機情形時,要如何檢查這些檔案系統。首先 fsck 會依序檢查這一欄為 1 的檔案系統,然後同時檢查這一欄為 2 的檔案系統,0 或者空白的話表示不做檢查。一般而言,只會將 root 設定為 1,其它都設定為 0 或 2。一些特定的檔案系統,像是 swap、iso9660、nfs、proc 都設定為0。


proc 是比較特殊的檔案系統,/proc 其實是存在於記憶體中的,/proc 裡的檔案紀錄了目前系統的狀態,藉由觀察這裡面的檔案我們可以得知許多系統的資訊。

例如,要檢查目前 swap partition 的狀態可以查看 /proc/swaps:

Filename Type Size Used Priority
/dev/sda7 partition 136512 4648 -1


最後舉個例子,例如為電腦新增了一顆硬碟,然後切出了一個 /dev/sdb8 的 partition,並且想將這個 partition 做來做 ftp 的 home,這時就要在 /etc/fstab 裡加上一行:

/dev/sdb8 /home/ftp ext2 defaults 1 2


/etc/inittab 設定

init process

init 是在核心 mount 進 root 後,第一個執行的程式 (第一個 process),init 所負責的工作包括:

  • 執行 /etc/rc.d/rc?.d/ 裡的 scripts

  • 將系統由開機狀態 (boot-up state) 切換至多使用者狀態 (multiuser state)

  • 負責載入 tty (本地端) 的 login shell

  • 負責開機與關機的程序 (procedure)。


開 機完成後,init 仍會保持在背景執行,並同時監視與修改系統執行狀態。init 監視許多系統的動作,適時改變系統的狀態,這些動作定義在 /etc/inittab 檔案裡。系統狀態劃分成七個等級,稱之為 run level,/etc/inittab 即告訴 init,在不同的 run level 下所要執行的程式與命令,Linux 下的 run level 有共七個,分別為:

  • run level 0 關機

  • run level 1 單一使用者模式

  • run level 2 多使用者模式(沒有NFS)

  • run level 3 多使用者模式

  • run level 4 保留

  • run level 5 X11

  • run level 6 重開機


以 Red Hat Linux 的 /etc/inittab 為例

不正確的 /etc/inittab 設會使得系統不正常,而且無法登入,所以修改 /etc/inittab 前請先做好備分,/etc/inittab 的設定如下:

#
# inittab This file describes how the INIT process should set up
# the system in a certain run-level.

#
# Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
# Modified for RHS Linux by Marc Ewing and Donnie Barnes

#
# Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)

#

id:3:initdefault:

# System initialization.

si::sysinit:/etc/rc.d/rc.sysinit

l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

# Things to run in every runlevel.

ud::once:/sbin/update

# 處理 [ctrl]-[alt]-[del] 的按鍵
ca::ctrlaltdel:/sbin/shutdown -t3 -r now

# 如果我們有 UPS,這一行的設定會在斷電時通知我們,並在 2 分鍾後自動關機。
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

# 如果在關機前恢覆電力,則放棄關機。
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"

# 用來登入系統 (本地端)。
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

# gdm 程式。
x:5:respawn:/etc/X11/prefdm -nodaemon


每個欄位所代表的義意如下:

  • 第一個欄位,是 init 內部使用的名稱,用來辨認每一個項目,執行命令 "ps ax" 所看到的名稱。

  • 第二個欄位,表示這個項目的 run level。

  • 第 三個欄位,關鍵字欄位,其中 respawn 是一個重要的關鍵字。以 "5:2345:respawn:/sbin/mingetty tty5" 為例說明,init 會依據設定,在本地端開啟一個終端機,當這個終端機超過時間沒有人 login 或太久沒有按鍵時,這個終端機就會結束執行,respawn 即在告訴 init 再重新執行這個終端機,否則,在一段時間後,我們會發現這個終端機消失了,無法利用 [alt]-[f5] 切換終端機。

  • 第四個欄位:要執行的命令與參數


第一行的 "id:3:initdefault:" 是很重要的一行,用來告訴 init,預設的 run level,在這裡我們設定開機後的預設 run level 為 3,那麼下面設定的命令都會被執行:

l3:3:wait:/etc/rc.d/rc 3

ud::once:/sbin/update
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6


第二個如果是空白,則表示在所有的 run level 都會執行,例如:
ca::ctrlaltdel:/sbin/shutdown -t3 -r now

表示在按下 [ctrl]-[alt]-[del] 的事件發生時,在所有 run level 狀態下,都會去執行/sbin/shutdown -t3 -r now 的命令。這一欄也可以指定多個 run level,例如:
6:2345:respawn:/sbin/mingetty tty6

表示在進入 run level 2/3/4/5 時,都會執行 "/sbin/mingetty tty6"。

改變 run level

如果我們將預設 run level 改為 5:
id:3:initdefault:

那麼:
x:5:respawn:/etc/X11/prefdm -nodaemon

這一行便會生效,"/etc/X11/prefdm -nodaemon" 的命令就會被執行,也就是我們熟悉的gdm。

我們可藉由 telinit 指令來改變目前的 run level,例如在 run level 3 狀態下執行:
linux# telinit 5

就會馬上進入 run level 5,執行 gdm。在 gdm 下如果想回到 console 模式,可以按下[ctrl]-[alt]-[f1],後然再執行:
linux# telinit 3

即可。

--jollen

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


jollen 發表於 April 24, 2006 3:53 PM

 


 


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

--jollen

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


jollen 發表於 April 24, 2006 4:20 PM

 


 


課程專案中,我們會在載入網路卡驅動程式後,再手動設定網路組態。在 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 主機查詢。

--jollen

Embedded Linux 的系統管理,#5: './configure' 與 Software Stack


jollen 發表於 October 15, 2006 12:01 PM

 


 


'./configure' 的設定決定 root filesystem 的架構(architecture),即 software stack 的設計。以我們「Embedded Linux 的系統管理 (x86)」課程舉出的 Nano-X project 案例來說,我們可以規劃出 2 種架構:


1. 典型的 Desktop (PC) 使用的架構 - ffplay + SDL + x11。
2. 讓 ffplay 在 Nano-X 介面裡撥放影片 - ffplay + SDL + Nano-X。

其中第 2 點是最有趣的架構,可以讓同學練習 software stack 有關的 './configure' 設定。

首先,同學要先把 FFmpeg 在 x86 上編譯完成,然後我們透過不同的 SDL 管理觀念,讓 ffplay 能夠在 X11 與 Nano-X 的介面上撥放。

不管是在 X11 上撥放影片,或是在 Nano-X 上撥放,都不必動到 FFmpeg(ffplay)。(why?)

嵌入式 Linux 系統管理 - Software Stack 的設定

如果使用 Red Hat Linux 9 (or Fedora) 預設的 SDL,ffplay 的執行畫面如下圖。

ffplay_x11.jpg
圖一:在 X11 上執行的 ffplay

這時 SDL 的編譯設定 (configure) 應該是類似這樣的:
# ./configure --prefix=/usr --enable-video-x11 --disable-video-fbcon --disable-nano-direct-fb --disable-video-nanox --disable-nanox-share-memory --disable-alsatest --with-nanox-pixel-type=0888

我們修改 configure 參數如下:
# ./configure --prefix=/usr --disable-video-x11 --disable-video-fbcon --enable-nano-direct-fb --enable-video-nanox --enable-nanox-share-memory --disable-alsatest --with-nanox-pixel-type=0888

重新編譯並安裝 SDL 後,ffplay 就能在 Nano-X 的介面下撥放影片。如果 Nano-X 的設定是支援 X11 的話,執行後的結果會是下圖的畫面。

ffplay_nanox.jpg
圖二:在 Nano-X 上執行的 ffplay (Nano-X with X11)

我們怎麼讓 ffplay 可以在開機後,直接透過 VGA framebuffer 來撥放影片,而不用再進入 X11 呢?做法是:把 Nano-X 設定成支援 VGA framebuufer 即可(Nano-X with VGA FB),至於 SDL 的話,是不用再做任何調整的了!(why?) 當然 ffplay 也不用變動。所以,關於第 2 點的架構做法,可以再細分成:

2.1 ffplay + SDL + Nano-X + X11
2.2 ffplay + SDL + Nano-X + VGA fb

很值得用來練習編譯設定與觀念討論的例子。

Embedded Linux 的考量

「ffplay + SDL + Nano-X」這個架構是適合 Embedded Linux 使用的,只要讓 Nano-X 能完整支援 target device,並把 SDL 與 FFmpeg 移植到 target device,便能在 target device 上撥放影片檔。

--jollen

0 comments:

Post a Comment