2007年11月26日 星期一

指令別名

指令在之前就提到過了,當時沒記錄 alias ,是覺得還蠻簡單的,會想重提 alias,是後來學到/etc/aliases 與 newaliases 的指令,覺得兩者易搞混,故決定記錄一下兩者的差別。

Command alias 指令別名

指令別名主要用意是希望用簡單的指令別名代替原本較長加上複雜參數的指令,最常見的莫過於 ll (常用於 red hat),它其實是 ls 的指令別明,而其原本的寫法為 ls -l --color=tty,以下為查詢指令別名的方法:
bang@linuxdiary:~$ alias
alias ls='ls --color=auto'
alias 與 unalias 分別為設定與解除指令別名的指令,以下為範例:

設定 l. 為顯示所有隱藏檔的指令別名
bang@linuxdiary:~$ alias l.='ls -d .* --color=tty'
bang@linuxdiary:~$ l.
. .chewing .gaim .gnome2 .lesshst .profile .thumbnails .Xauthority
.. .config .gconf .gnome2_private .metacity .recently-used .Trash .xsession-errors
略...
取消 l. 的設定
bang@linuxdiary:~$ unalias l.

但以上指定的別名在登出 Shell 後,即失去作用。如果想讓系統維持別名的設定,必須在 Shell 的設定擋 .bashrc 設定想要常駐的別名,以下節錄 Ubuntu 的 ~/.bashrc 檔案
# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

#if [ -f ~/.bash_aliases ]; then
# . ~/.bash_aliases (使用者也可使用 .bash_aliases 來替代在 .bashrc 編寫別名)
#fi

# enable color support of ls and also add handy aliases
if [ "$TERM" != "dumb" ]; then
eval "`dircolors -b`"
alias ls='ls --color=auto' (Ubuntu 預設中唯一的別名...)
#alias dir='ls --color=auto --format=vertical'
#alias vdir='ls --color=auto --format=long'
fi

# some more ls aliases (red hat 常見的 ls 別名,在 Ubuntu 都註解掉了)
#alias ll='ls -l'
#alias la='ls -A'
#alias l='ls -CF'

2007年11月25日 星期日

執行層級 runlevel

Linux 與許多 Unix 系統都有 執行層級 runlevel 的觀念,意即藉由控制實際啟動的服務組合,而改變系統用途。舉例而言,一台網頁伺服器,我們會希望他在開機時,自動啟動 Apache Server。每一個不同的執行層級會執行對應的各個 script 檔,而每一執行層級的 script 檔備存放在 /etc/rc.d/rc[x].d 目錄,其中 [x] 即為 runlevel。以下說明各個層級的意義:

層級目錄描述
0 /etc/rc.d/rc0.d
Halt ,關機,切斷系統的電源。這是過渡性的運作層級,不能設為預設的執行層級,否則會造成一開機即關機。
1 /etc/rc.d/rc1.d
Single-user mode,單用戶模式。此模式通常只含基本運作,而不妨礙維修的基礎服務。
2/etc/rc.d/rc2.d Red Hat:Multiuser, without NFS,不提供 NFS 檔案共享服務的多人模式。
Debian:Full multi-user mode,多人模式。
3/etc/rc.d/rc3.d Red Hat:Full multi-user mode (no GUI interface) ,多用戶模式,無圖形界面。
Debian:預設不使用。
4 /etc/rc.d/rc4.d
Not used (user-definable) ,未使用,用戶定義。
5 /etc/rc.d/rc5.d
Red Hat:Full multiuser mode (with GUI interface),多用戶模式,圖形界面。
Debian:預設不使用。
本層級相當層級 3 外加 X11 在加上 GUI 登入服務,一般桌面系統都以此為預設層級。
6 /etc/rc.d/rc6.d
Reboot ,重新開機,這是過渡性的運作層級,不能設為預設的執行層級,否則會造成不斷重新開機。


如何設定預設執行層級 runlevel?

編輯 /etc/inittab,範例如下
# Level to run in
# 定義預設執行層級,在此 runlevel 為 2
id:2:initdefault:

# System initialization before anything else.
# 系統初始化
si::sysinit:/etc/rc.d/bcheckrc

# Runlevel 0,6 is halt and reboot, 1 is maintenance mode.
# 個別運作層級的處始化
l0:0:wait:/etc/rc.d/rc.halt
l1:1:wait:/etc/rc.d/rc.single
l2:2345:wait:/etc/rc.d/rc.multi
l6:6:wait:/etc/rc.d/rc.reboot
開機時,即會根據 runlevel ,執行 /etc/rc.d/rc[x].d 目錄下的 script。

如何改變執行層級 runlevel?

當想進行系統維護需要進入單人模式,或是要從文字登入畫面改成 GUI 登入畫面,或是想要關閉系統或重新開機,改變系統當時的執行層級,是眾多的做法之一。
但在運作之前,可能會需要了解一下目前的 runlevel,而使用的指令即為 runlevel
bang@linuxdiary:~$ runlevel
N 2
第一個字代表前次的執行層級,第二個數字代表現在的執行層級。N 代表前次與現在一樣沒有變過。
知道了目前的執行層級後,可利用 init 或 telinit 命令來改變執行層級,telinit 通常是 init 的硬連結或軟連結,兩者使用方法完全相同,以下為範例:
讓系統立刻關機
root@linuxdiary:~# init 0
讓系統立刻重新開機
root@linuxdiary:~# init 6
讓系統立刻進入單人模式
root@linuxdiary:~# init 1


root@linuxdiary:~# init s

2007年11月18日 星期日

系統啟動

一開始先了解,從進入 BIOS 畫面到,出現命令提字元,系統做了哪些事。

順序 名稱
1 載入 BIOS ,硬體裝置的初始化
2 讀取第一個開機裝置的 MBR 的 boot Loader (亦即是 lilo, grub, spfdisk 等等) 的開機資訊
3 載入 Kernel 作業系統核心資訊, Kernel 開始解壓縮,並且嘗試驅動所有硬體裝置
4 Kernel 執行 init 程式 (/etc/inittab)
5 init 執行 /etc/rc.d/rc.sysinit 檔案 (red hat)
6 init 執行 run-level 的各個批次檔( Scripts )
7 init 執行 /etc/rc.d/rc.local 檔案
8 執行 /bin/login 程式,並等待使用者登入
9 登入之後開始以 Shell 控管主機

1~2
當 BIOS 完成硬體初始化後接手的系統軟體是 boot loader。Linux 系統常用的 boot loader 為 LILO 與 GRUB,他們不僅能將 Linux 核心映像檔載入記憶體,還可以傳遞核心參數 (kernel parameter)給 Linux 核心,就像 shell 啟動程式時,指定命令列選項那樣。
GRUB 可以讓你在啟動 Linux 之前,編輯要傳給核心的參數。你只要在 GRUB 顯示開機選單時,先選定所要啟動的核心,然後按下 e 鍵 ( edit ) 來編輯該核心的命令,最後按下 b 鍵 ( boot ) 來開機。
3
這是將核心載入記憶體的一個過程,當核心載入記憶體後,會顯示一些訊息至主控台 (system console) 上,如核心版本,核心是在哪種機器上,以何種編譯器所編譯等,並開始逐一驅動硬體。
在核心載入同時,initrd (initial Ram Disk) 也會被載入,即 /boot 分割區中的 initrd.img-2.6.20-16-generic 檔案,由於此時尚未掛載任何檔案系統,無法取得硬碟中的驅動程式,而此檔包含開機所需的驅動程式,在此時與核心映像檔一起載入記憶體。
4~5
/sbin/init 是開機初始化程式,能幫助使用者調整開機程序的配置與環境的設定。當它一旦啟動,自動會變成系統中所有行程 (Process) 的父行程或祖父行程,故它的 PID 為 1。
在初始化設定周邊後裝置後,核心就會執行 /sbin/init 程式,其所做的任何事都由 /etc/inittab 所控制,其中包含執行層級 (runlevel) 。
在 red hat 中,/sbin/init 的第一個動作通常是執行 /etc/rc.d/rc.sysinit ,這​個 script 能設​定​環​境​路​徑​、starts swap、​檢​測​檔​案​系​統​,並​執​行​其​它​所​有​系​統​初始化所​需​的​步​驟​。舉例來說每個​系​統​都擁有一個​​​時間,rc.sysinit 能​讀​取 /etc/sysconfig/clock 設​定​檔​並​啟​始​硬​體​時間​。
6-7
runlevel 是一個用來指定目前系統狀態的數字或字母。例如,當系統的 runlevel 變成 3 時,所有在 /etc/inittab 中,runlevel 欄位包含 3 的項目都會被執行。在 red hat 中每一層級的 Script 檔都被存放在 /etc/rc.d/rc[x].d/ 中,其中 [x] 即為runlevel,目錄中可以看見很多檔案,多以 Snnxxxx 或 Knnxxx 命名,其中 nn 為 00 至 99 的數字,數字較小的 Script 會先執行,你會發現一個 S99rc.local 的檔案,沒錯它就是最後一個被執行的 Script,也就是第 7 個步驟。
8-9
登入

如何回顧開機訊息

開機期間顯示的訊息往往捲動過快難以閱讀,當管理者需要回頭檢閱這些訊息時該怎麼辦只要使用 dmesg 命令變可重現最近一次的開機訊息,而 /var/log/dmesg 也會記錄這筆訊息。

bang@linuxdiary:~$ dmesg | less
[ 0.000000] Linux version 2.6.20-16-generic (root@king) (gcc version 4.1.2 (Ubuntu 4.1.2-0ubuntu4)) #2 SMP Thu Aug 30 23:16:15 UTC 2007 (Ubuntu 2.6.20-16.31-generic)
[ 0.000000] Command line: root=UUID=404fb0f7-4a3d-4124-9b0f-c28dd9325da7 ro quiet splash
[ 0.000000] BIOS-provided physical RAM map:
[ 0.000000] BIOS-e820: 0000000000000000 - 000000000009f800 (usable)
[ 0.000000] BIOS-e820: 000000000009f800 - 00000000000a0000 (reserved)
[ 0.000000] BIOS-e820: 00000000000f0000 - 0000000000100000 (reserved)
[ 0.000000] BIOS-e820: 0000000000100000 - 000000003fff0000 (usable)
[ 0.000000] BIOS-e820: 000000003fff0000 - 000000003fff3000 (ACPI NVS)
[ 0.000000] BIOS-e820: 000000003fff3000 - 0000000040000000 (ACPI data)
[ 0.000000] BIOS-e820: 00000000e0000000 - 00000000f0000000 (reserved)
[ 0.000000] BIOS-e820: 00000000fec00000 - 0000000100000000 (reserved)
略...

bang@linuxdiary:~$ less /var/log/dmesg
[ 0.000000] Linux version 2.6.20-16-generic (root@king) (gcc version 4.1.2 (Ubuntu 4.1.2-0ubuntu4)) #2 SMP Thu Aug 30 23:16:15 UTC 2007 (Ubuntu 2.6.20-16.31-generic)
略...

注意:
ubuntu 預設不使用 /etc/inittab 來做開機管理,而是使用 upstart,而 debian 也實驗性的引進 upstart,目前還在研究他的使用方式。

2007年11月5日 星期一

系統日誌 messages 與 syslog.conf

在 Linux 中,有多種日誌檔案,包含各個 Server 的日誌檔,清楚的理解各個日誌檔的功能及作用是很有必要的,但眾多日誌檔中,最重要的莫過於系統的日誌檔,messages (red hat 系列),它記錄著系統的各種運行日誌,包含安全,認證,郵件,新聞等等。而 syslog.conf 檔則控制著 messages 記載行為。
以下擷取 messages 片段,來說明 messages 記錄方式
時間           主機名稱   程序名稱       事件描述
Nov 4 05:10:44 linuxdiary syslogd 1.4.1: restart.
以下擷取 syslog.conf 片段,來說明 syslog.conf 使用的語法
Facility(工具).Priority(優先等級)          Action(日誌檔)
cron.* /var/log/cron
uucp,news.crit /var/log/spooler
Facility 是指系統常用的工具,可以逗號來增加多個 Facility,已知的 Facility 可由下表得知。
名稱 說明
user 由使用者程序產生的訊息,此訊息是程式預設的,故在檔案中,不包含於 facilities 的設定中。
kern 由 kernel 產生的訊息。
mail 郵件系統的訊息。
daemon 系統 daemon 所產生的訊息,但大部分的 daemon 有自己的日誌。
auth,authpriv 認證系統的訊息,login,su,getty 等。
news 指的是 USENET 新聞群組系統。
uucp 指的是UUCP(UNIX 間複製協議) 系統,已經很少再用 syslog 機制。
cron 指的是由 cron 與 at 兩支程式所產生的訊息。
local0-7
使用者自訂類型,通常為遠端伺服器,網路裝置。

Priority 是指每個工具發生何種事件時要記錄的優先等級。
優先等級 名稱 說明
0 emerg ( emergencies ) 系統損毀無法使用
1 alerts 必須立刻採取應對行動
2 crit ( critical ) 危急狀態
3 err ( errors ) 錯誤狀態
4 warn ( warnings ) 注意狀態
5 notice ( notifications ) 一般但重要的狀態
6 info ( informational ) 一般訊息
7 debug ( debugging ) 除錯訊息

Action 是指要記錄的地方或動作,以下是常見的寫法
Action說明
/var/log/message 記錄在 message 中
root傳訊息給該用戶
*所有用戶
@www.abc.com遠端主機
@192.168.101.1遠端主機

範例說明:
1.
*.info;mail.none;authpriv.none;cron.none        /var/log/messages  
這是 RedHat 與 Fedora 中常見的寫法,他們習慣將多種日誌放置於 /var/log/message 中,在範例中,*.info 表示去收集了所有已知且優先等級為 info 以上(即包含 notice,warn...等) 的 facility日誌 。要注意的是分號將幾個 facility 分開,且以 none 表明,不收集 mail、authpriv、cron 等程式產生的訊息。
2.
*.debug                                          /var/log/messages
如果想讓範例1 顯示的紀錄的方式更敏感,可使用範例2 的寫法,因為它將紀錄所有 Facility debug 以上各個優先等級的事件,等同於使用 (*.*),將更適合系統問題排除。
3.
 *.=debug;\
auth,authpriv.none;\
news.none;mail.none -/var/log/debug
範例3 中提供更進階的寫法,如要用多行表示時,接續行的結尾必須加入斜線,表示下行的敘述是與本行連接的。=debug 其中 「= 」表示僅針對 debug 等級的訊息紀錄,而不是該等級以上的訊息都記錄;「-」減號代表訊息暫存於記憶體中,等到一定的量再回存於檔案中,可提高 syslog 的執行效率。
4.
 kern.info;kern.!err /var/adm/kernel
範例4 中出現 !,表示將 kern 中,優先等級高於或等於「info」,但「error」除外的訊息記錄至檔案 /var/adm/kernel 中。