2007年12月23日 星期日

檔案權限

存取控制 文章可知,stat 指令可知道檔案的相關資訊,在存取的部分,你可以看到一行如 Access: (0644/-rw-r--r--) 的資訊,其中 -rw-r--r-- 在 存取控制 中就說明了,而 0644 呢?就是本篇的主角之一。

位元模式

在 Linux 中以 chmod 工具來修改檔案權限。但是使用 chmod 時需要一套簡單的表示法來描述檔案權限,而能表示檔案權限的表示法有兩種,分別為位元模式與存取模式。
-rw-r--r-- 用後九個符號來表示檔案存取,而事實上位元模式的位元有 12 個(其中 3個為特殊權限),若直接用二進位來表達過於冗長且容易搞錯。最理想的方式為八進位,因為每三個八位元的數字剛好能表示 12-bits 位元模式分成 4 組不同意義的組合,而下表即各個進位轉換的對照表:

符號 二進位 八進位
--- 000 0
--x 001 1
-w- 010 2
-wx
011
3
r--
100
4
r-x
101
5
rw-
110
6
rwx
111
7
範例:
rw-r--r--
110100100
644

rwxrwxr-x
111111101
775
字串模式

以八進位表示雖然簡潔,但不容易解讀。因此許多工具會以字串模式來表事檔案權限,如之前常提的 ls -l 的輸出訊息,但 ls -l 只顯示 r、w、x 、特殊權限等符號,不包括身分 (u、g、o) 與操作 (-、+,=) 符號,下表即說明字串模式的各個符號:


符號 說明
身分 u
擁有者 (user)

g 群組

o 其他人

a
所有人
操作
-
移除
r-x
+
添加
rw-
=
設定
權限
r
讀取

w
寫入

x
執行

s
SUID 或 SGID (s 代表同擁有 x 權限,S 則無)

t
Sticky 權限 (t 代表同擁有 x 權限,T 則無)

範例
u+x 讓使用者有執行權限
go-w 移除群組與其他人的寫入權限
o+t 將其他人設定 Sticky 權限
a=rw 所有人都為讀取與寫入權限
我們會用 chmod 來調整檔案或目錄的存取模式,就會大量的用到字串模式的表示法,以下為範例:
範例一:用字串模式將檔案存取權限設定為 rw-r--r--,並顯示操作結果。
bang@linuxdiary:~$ chmod -v u=rw,go=r chmod_test1
mode of `chmod_test1' retained as 0644 (rw-r--r--)
範例二:讓其它使用者無法存取整個 Desktop 目錄,並顯示操作結果。
bang@linuxdiary:~$ chmod -vR o-rwx Desktop
mode of `Desktop' retained as 0750 (rwxr-x---)
mode of `Desktop/abc.txt' changed to 0640 (rw-r-----)
範例三:將 Desktop 目錄設定 SGID,並顯示操作結果。
bang@linuxdiary:~$ chmod -v g+s Desktop
mode of `Desktop' changed to 2750 (rwxr-s---)
範例四:將 Desktop 目錄設定 Stickey 權限,並顯示操作結果。
bang@linuxdiary:~$ chmod -v +t Desktop
mode of `Desktop' changed to 3750 (rwxr-s--T)

預設存取模式

當使用者新增一個檔案或目錄時,系統會根據 umask 設定值,來決定這個檔案或目錄的存取權限,而甚麼是 umask 設定值呢?這是一個設定預設存取權限的命令 umask ,以下為範例

查詢目前的
bang@linuxdiary:~$ umask
0022
新增一個檔案,並檢查預設存取權限
bang@linuxdiary:~$ touch umask_test1
bang@linuxdiary:~$ ls -l umask_test1
-rw-r--r-- 1 bang bang 0 Dec 24 00:18 umask_test1
更改目前的預設權限
bang@linuxdiary:~$ umask 002
bang@linuxdiary:~$ touch umask_test2
bang@linuxdiary:~$ ls -l umask_test
-rw-r--r-- 1 bang bang 0 Dec 24 00:18 umask_test1
-rw-rw-r-- 1 bang bang 0 Dec 24 23:46 umask_test2
我們可以發現 umask 前後,新增檔案的存取權限是相異的。
注意
  • 通常系統預設的 umask 設定,會在 /etc 目錄下的 profile (debian)或 bashrc (red hat)中。這點好像不太重要,因為可以放的地方還蠻多的,FHS 也沒硬性規定一定要放哪,只是喚起對這兩個 shell 設定檔的記憶。
  • 在 red hat 中,一般用戶的 umask 為 0002,而 root 為 0022;debian 皆為 0022,故這邊的範例是以 debian 為例喔,我是用一般用戶 touch 一個檔案。

2007年12月17日 星期一

GRUB 的安裝與設定

GRUB (Grand Unified Bootloader) 是一個多段式開機管理程式,由它的名稱 GR,就可猜想,它支援多種檔案系統和作業系統,幾乎可以啟動任何核心。

GRUB 的裝置命名方式

之前曾經提過 Linux 裝置的命名方式 文章,而本文主要是在探討 GRUB 在用的命名方式。

GRUB 的命名方式: ( xdn[,m] )

其中 xd 代表磁碟類型,n 是『BIOS 的磁碟編號順序』從 0 開始,m 是第幾個分割區,從 0 開始。
範例:
(fd0) :第一台軟碟機。
(hd0):第一顆硬碟。
(hd0,1):第一顆硬碟上的第二個分割區。
注意:
  • 在 GRUB 之中,hd 即代表各種硬碟,無規格區分,IDE ,SATA,SCSI 硬碟都以 hd 表示。
  • GRUB 的分割區編號由 0 開始,而一般裝命名由 1 開始,如第二顆硬碟的第二個分割區 GRUB 為 (hd1,1),一般為 hdb2
GRUB 裝置檔的設定

裝置檔位置
redhat:/etc/grub.conf,/boot/grub/menu.lst,/boot/grub/grub.conf (真實檔案位置)
debian: /boot/grub/menu.lst

舉以下例子 (fedora 3) 說明:

default=1 #預設以哪一個選項開機,起始為 0
timeout=5 #暫停時間 (單位:秒)
splashimage=(hd0,0)/grub/splash.xpm.gz #背景圖片
hiddenmenu #是否隱藏選單
#以下為開機選項
title Fedora Core (2.6.12-1.1381_FC3) #標題
root (hd0,0) #開機目錄所在位置
kernel /vmlinuz-2.6.12-1.1381_FC3 ro root=/dev/VolGroup00/LogVol00 rhgb quiet #核心映像檔
initrd /initrd-2.6.12-1.1381_FC3.img #initrd 映像檔
title Fedora Core (2.6.12-1.1381_FC3smp)
root (hd0,0)
kernel /vmlinuz-2.6.12-1.1381_FC3smp ro root=/dev/VolGroup00/LogVol00 rhgb quiet
initrd /initrd-2.6.12-1.1381_FC3smp.img

2007年12月12日 星期三

存取控制

「存取控制」的作用就是,讓適當身分的人獲得適當的存取權。
何謂身分?在 Linux/Unix 系統中,定義以下三種關係。
  • Owner 擁有者:檔案的擁有者,通常是產生檔案的那個人。
  • Group 群組:檔案所屬的群組。通常是擁有者所屬的群組。
  • Other 其他人:既非擁有者,也不是群組成員的其他人。
所謂的「存取權」,是指使用者可以對檔案進行何種動作。在 Linux/Unix 系統中,定義以下
三種動作:讀 (read),寫 (write),執行 (execute)。對於目錄,同樣也有三種動作:列出檔案,新增檔案,進入目錄。以下為權限列表:

權限 符號 檔案權限說明 目錄權限說明
讀取 (Read)
r 檢視檔案內容 列出目錄內容
寫入 (Write) w 寫入(或變更)檔案 建立,移除目錄下的檔案
執行 (Execute) x 將檔案當成程式執行 進入 (cd ) 到目錄

我們可以用 ls -l 或 stat FileName | Directory 來顯示目錄或檔案的權限資訊,以下為例子
bang@linuxdiary:~$ ls -l
drwxr-xr-x 2 bang bang 4096 2007-05-20 13:51 Desktop
bang@linuxdiary:~$ stat Desktop/
File: `Desktop/'
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 301h/769d Inode: 10666042 Links: 2
Access: (0755/drwxr-xr-x) Uid: ( 1000/ bang) Gid: ( 1000/ bang)
Access: 2007-12-23 07:35:21.000000000 +0800
Modify: 2007-05-20 13:51:01.000000000 +0800
Change: 2007-05-20 13:51:01.000000000 +0800

目錄內容 文章中,即簡介了 rwxr-xr-x 的意義,但在這邊要注意的是 Desktop 在此為目錄,以身分為其他人為例 r-x 的意義為,其他使用者 對於 Desktop 可用 ls 列出目錄,不能新增刪除檔案,可以 cd 進入目錄。

2007年12月10日 星期一

Cron Job 排程工作

設定系統的工作排程,主要是修改 /etc/crontab,當我們檢視 /etc/crontab 時,我們可以看到以下程式碼
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 1 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
由這段程式碼我們可窺見程式碼中每個數字的意義
crontab 檔案的格式為一行中有5個數字,以空白鍵或tab鍵分開。這五個數字指定命令執行的時間:

01 * * * * root run-parts /etc/cron.hourly
角色 排程工作

代表意義 分鐘 小時 日期 月份
數字範圍 0-59 0-23 1-31 1-12 0-7
0,7皆可代表週日

範例:
  • 01 * * * * => 每個鐘頭的 01 分
  • 02 4 * * * => 每天的 4 點 02 分
  • 22 1 * * 0 => 每個週日的 1 點 22 分
  • 42 4 1 * * => 每月 1 號的 4 點 42 分
進階寫法
  • 0 3,6 * * * => 每天 3 點與 6 點
  • 20 8-12 * * * => 每天 8 點到 12 點之間的每個小時的 20 分
  • */5 * * * * =>每五分鐘進行一次,用 * 與 /n 來搭配代表每隔 n 單位間隔
排程工作的指令
crontab 可讓使用者建立自己的排程工作,而 root 也可利用 crontab 管理修改其他用戶的排程。
crontab -e:建立,編輯使用者的工作排程。
crontab -l:列出使用者的工作排程。
crontab -r:清空使用者的工作排程。
注意事項:
  • crontab -e 命令會在/var/spool/cron/crontabs目錄下建立一個與您的使用者名稱同名的檔案。
    此檔案中的命令會在特定時間間隔於用戶的起始目錄中執行。
  • 當crontab 命令錯誤時,會發一封郵件給管理者,可藉由編輯 /etc/crontab 中的 MAILTO,來指定寄件信箱。

2007年12月1日 星期六

忘記 root 密碼怎麼辦

root 密碼若忘記,該台主機幾乎無法再做任何重大變動,這種情形容易發生在 MIS 交接的時候,如果真的發生怎麼辦呢?在系統啟動文章有提到 GRUB 在啟動顯示開機選單時,可修改核心命令,那時我們可以將系統啟動為 runlevel 1 的狀態,即單用戶模式,此時 root 的登入是不需要密碼的,再用 passwd 修改 root 密碼。

以下用 Fedora 8 為例示範整個流程:
1.首先開機後進入 GRUB 選單,在你欲開機的核心上點擊按鍵 e

2.在核心命令列上點擊按鍵 e


3.在該行命列最後加上 1 或 s 或 S,修改完後按 Enter


4.點擊按鍵 b,立即開機。

5.以下即為 runlevel 1 時的畫面,可用 passwd 修改 root 密碼。

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 中。

2007年10月30日 星期二

把命令放到背景執行

Linux 允許把命令放到背景中執行,僅僅需要在命令的最後加上一個 &,就可以利用 Linux 的多工特性執行多個背景程式,如以下:
bang@linuxdiary:~$ sleep 300 &
[1] 8521
bang@linuxdiary:~$ sleep 500 &
[2]8522
  • [1] 代表指定給該工作的序號

  • 8521 代表 PID (process ID)
若想查詢當前的背景工作可使用 jobs 指令,
bang@linuxdiary:~$ jobs
[1] - Running sleep 300 &
[2]+ Running sleep 500 &
bang@linuxdiary:~$ jobs -l
[1] - 8521 Running sleep 300 &
[2]+ 8522 Running sleep 500 &

但如果後悔把命令放入背景時怎麼辦?你可以利用 fg 命令把工作帶回前景 (foreground);如果背景中堆積了好幾個命令,可用行程識別碼或工作序號來挑選他們。
bang@linuxdiary:~$ fg %1
sleep 300

bang@linuxdiary:~$ fg 8521
sleep 300

正在前景中執行的 sleep 300 是否困擾著你,可以不要等待嗎? 是的~ 可以
此時你可以點擊鍵盤上的組合鍵 Ctrl + Z ( 暫停程序,並將程序放置背景 )
bang@linuxdiary:~$ fg %1
sleep 300 => Ctrl + Z

[1]+ Stopped sleep 300
但此時的工作是暫停的,若希望它能繼續在背景中執行,可利用 bg 命令恢復在背景(background) 中暫停的工作。
bang@linuxdiary:~$ bg %1
[1]+ sleep 300 &
bang@linuxdiary:~$ jobs
[1] - Running sleep 300 &
[2]+ Running sleep 500 &
如果想要刪除在背景的工作可用 kill 來完成
bang@linuxdiary:~$ kill %2
[2]+ Terminated sleep 500
最後介紹的指令,將對常用 ssh 遠端登入的使用者很有幫助,nohup (no hang up,不要掛斷)。當使用者利用 ssh 等指令或軟體登入主機後,想要執行某個指令,但一旦登出或關掉 ssh 軟體,那個在背景執行的工作會跟著消失,主要原因是它的父行程被關閉了,也就是使用者剛剛關閉的 bash,那怎麼辦?nohup 可以為您強制保存背景工作,即便父行程被關閉,以下為示範
bang@linuxdiary:~$ nohup sleep 500 &
[1] 8544
bang@linuxdiary:~$ nohup: appending output to `nohup.out'

bang@linuxdiary:~$ ps -fC sleep (用 ps 查詢正在用 sleep 命令執行的行程)
UID PID PPID C STIME TTY TIME CMD
root 8544 8014 0 16:41 pts/1 00:00:00 sleep 500
此時關閉 shell,重新登入
bang@linuxdiary:~$ ps -fC sleep
UID PID PPID C STIME TTY TIME CMD
root 8544 1 0 16:42 pts/1 00:00:00 sleep 500

會發現它還存在著,但 PPID 變為 1,亦即父行程被指派為 init,這個背景工作不會再受父行程關閉而關閉影響,因為如果想關閉 init,那就關機吧。

2007年10月28日 星期日

行程 (process) 的意義

Linux 整個運作建立在「行程」的觀念上,對核心而言,於系統上運作的每一個「程式」( program ),無論是命令 (command),應用程式 (application),程序稿 (script),全都是行程的組合。

舉例而言,在你登入系統之前,終端機是由 getty 行程所監控,登入之後,gtty 會自我中斷,並將終端機的掌控權交給 shell 接管 ( shell 是另一個行程 ),而你在 shell 中所見入的每個命令,都會觸發一個或多個行程,某些行程還會衍生新的行程,稱為子行程。
shell 的內建命令,如 cd,echo,jobs... 等,並不會被啟動成子行程,因為他們原本就是 shell 行程的一部分。

如果要知道有哪些行程正在執行,可參考 ps 命令。
bang@linuxdiary:~$ ps
PID TTY TIME CMD
7773 pts/0 00:00:00 bash
7789 pts/0 00:00:00 ps
  • PID (Process ID,行程識別碼):當行程被啟動,會被賦予一個 ID 為識別碼,每個行程都有自己所屬的 ID,管理者可 PID 來傳送信號給這些行程。
  • TTY 控制終端機:在何種終端機上面運作,若與終端機無關,則顯示 ?。tty1-tty6 是本機上面的登入者程序 (Ctrl + Alt + Fn),若為 pts/0 等等的,則表示為由網路連接進主機的程序,若為 ? 則代表背景執行程式。
  • TIME:目前為止所占用 CPU 的時間,使用者於命令列觸發的行程 (如 ls),他們的「生命期」多半相當短暫。但是對於提供公共服務的行程 (如 Apache web server),他們的生命期就相當長,甚至是在系統啟動之後就開始,直到關機或管理者給予結束才終止。
  • STAT (狀態):常見的狀態有
    • R (running):目前正在運作,或者在佇列中等待運作。
    • S (sleep):睡眠狀態,等待某些事件的完成,可被某些訊號 (signal) 喚醒。
    • T (terminable):停止了或該程序被其工作控制著。
    • Z (zombie):僵屍程序,應該已終止,但是其父程序卻無法正常的終止他。
    • <:高優先權的程序
    • N:低優先權的程序
    • +:在前景程序群組的程序 (如正在前景執行的程序)。
    • s:本程序為 session leader
  • CMD:命令名稱

2007年10月21日 星期日

shell 的設定檔

shell 的設定檔

在 bash shell 中,在系統登入的期間,會執行 4 個 shell 設定檔案,以下為他們執行順序
  1. /etc/profile
  2. /etc/bashrc
  3. ~/.bash_profile (red hat 3 與 4 相反)
  4. ~/.bashrc
在此說明各個設定檔

檔案

說明

/etc/profile

這是一個在登入時才執行的系統初始化設定檔,它通常包含一些環境變數,包括最初的 PATH 變數,和一些啟動程式。

/etc/bashrc

這是另一個系統端初始化檔案,當一個 bash shell 被啟動時,/etc/bashrc 通常會被 ~/.bashrc 呼叫執行,它通常包含一些 functions 和 aliases 。

~/.bash_profile

如果此檔案存在,它會在登入 Shell 期間,自動執行於 /etc/profile 之後。

~/.bash_login

如果 ~/.bash_profile 檔案不存在,此檔案會在登入 Shell 期間自動執行。

~/.profile

如果 .bash_profile.bash_login 皆不存在,此檔案會在登入 Shell 期間自動執行。此檔案是 Bourne shell 原始的設定檔。

~/.bashrc

此檔案會在啟動 Shell 時自動執行(包含xterm 和一般 Shell),通常包含一些環境變數與 aliases。

~/.bash_logout

此檔案會在 Shell 登出時自動執行。

~/.inputrc

此檔包含一些敲擊鍵盤的反應, Bash 預設反應設定與 Emacs 相同。

~/.bashrc 與 ~/.bash_profile 的差異
.bash_profile 只有在登入的時候才會啟用,原本設計的目的是為了讓你可以將交談方式操作的 shell 程式與非交談程式的(背景程式)shell 程式區分開來。但在目前的 X 視窗系統卻沒多大作用,主要原因為執行 xterm 視窗時,只有 .bashrc 會執行而 ~/.bash_profile 並不執行,因為 xterm 不需登入即可啟動。

如何變更 shell

如何變更 shell

先查看系統上目前可使用的 shell 有哪些。
bang@linuxdiary:~$ cat /etc/shells
# /etc/shells: valid login shells
/bin/csh
/usr/bin/es
/usr/bin/ksh
/bin/ksh
...略
改變自己的 shell 為 tcsh (要登出後再登入才會生效 )。
bang@linuxdiary:~$ chsh
Changing the login shell for root
Enter the new value, or press ENTER for the default
Login Shell [/bin/bash]:tcsh
登出後再登入,顯示目前所使用的 shell。 bang@linuxdiary:~$ echo $SHELL
/bin/tcsh

2007年10月10日 星期三

Shell 的變數

在 bash 運作期間,會維護一組變數,這類的變數含有 bash 運作時所需的重要的資訊。大多的變數,在 bash 啟動時就會設定好,但是使用者可隨時手動改變這些變數,藉此改變 shell 的一些行為。
bang@linuxdiary:~$ echo $PS1
${debian_chroot:+($debian_chroot)}\u@\h:\w\$

以變數 PS1 (Prompt String 1)為例,其值為一個代表命令提示字元的字串。由上例可知使用 echo 命令可顯是變數內容,方法是變數前加一個 $ 號。
在 $PS1 中 u,h,w 都是普通的字元,因為前面的「\」(meta chatacter) 她的意義為
  • \ u:username,使用者名稱
  • \h:hostname,主機名稱
  • \w:working directory 目前工作目錄
環境變數 (environment variables)
專屬某個 shell 的一組變數,使該行程能得知使用者喜好與系統組態。所有 sub-sheel,指令稿和程式可自動繼承這些變數。

shell 變數
只能在目前的 shell 或 script 中存取。

常用的變數的指令

  • env:顯示所有環境變數
  • export:設定環境變數
  • set:顯示所有變數
  • unset:取消變數
常用的變數(每個 distribution 會略有不同)
  • PATH:搜尋執行檔的路徑
  • SHELL:目前所使用的shell
  • HOSTNAME:主機名稱
  • USERNAME:使用者名稱
  • LOGNAME:登入的帳戶名稱
  • HOME:使用者家目錄
  • LANG:系統預設語系
  • HISTSIZE:指令歷程容量大小
  • MAIL:使用者存放郵件的目錄

2007年10月7日 星期日

指令歷程

現今的 bash 與 tcsh 對指令紀錄的已有大幅的進步,它讓你用相當簡單的方式調出先前曾經輸入的指令,當你與 bash 互動時,你所下達的每個命令,會先被 shell 記錄在自己的歷程表(history list),然後才開始進行解讀或執行。
歷程表的容量由變數 HISTSIZE 控制
bang@linuxdiary:~$ echo $HISTSIZE
500
預設值為 500,可視情況修改。
當你登出系統時,歷程表的內容會被寫進你的個人目錄之中的 .bash_history 之中 (環境變數 HISTFILE 所指定的檔案) ,當你下次登入系統時,即可使用 history 指令調出之前輸入的指令。
history
語法
history [option] [files]
列出指令歷程
常用選項
  • n :數字,意思是『要列出最近的 n 筆命令列表』的意思!
  • -c :將目前的 shell 中的所有 history 內容全部消除
  • -a :將目前新增的 history 指令新增入 histfiles 中,若沒有加 histfiles , 則預設寫入 ~/.bash_history
  • -r :將 histfiles 的內容讀到目前這個 shell 的 history 記憶中;
  • -w :將目前的 history 記憶內容寫入 histfiles 中!
bang@linuxdiary:~$ history 3
125 history
126 history 5
127 history 3
history expansion 歷程擴展
所謂的歷程擴展,就是在命列重新執行歷程表中的舊命令,以下列出歷程擴展的語法
語法 說明
!! 歷程最後一道命令,同按上後 Enter。
!n 歷程第 n 個命令。
!-n 執行前 n 個命令。
!string 歷程表中最後一筆開頭為 string 的命令。
!?string 歷程表中最後一筆含有為 string 的命令。
^string1^string2 重複最後一筆命令,但命令中 string1 置換為 string2
!$ 前一個命令的最後一個元素
!:n-1 前一個命令的第 n 個元素

2007年9月25日 星期二

Linux 裝置的命名方式

硬碟分割區簡單說明:

Linux中,硬碟分割區(Partition)包含
  • Primary 主要分割區 (編號1-4)
  • Extended 延伸分割區
    • Logical 分割區 (編號5-15)
  • swap 分割區 (交換空間)
限制
  • 主要分割區+延伸分割區的數目小於等於四 (P+E<=4)
  • 延伸分割區的數目小於等於一 (意即最多一個)
  • 分割至少存在一個主要分割區或延伸分割區
  • 最多可用分割區 3(主要)+11(邏輯)=14 (個)

Linux 中的裝置

在 Linux 中,裝置可被表現成裝置檔案,這些虛造的檔案被放置於 /dev 中,以下有些範例:
root@linuxdiary:/dev# ls -al
brw-rw---- 1 root disk 3, 0 2007-09-25 22:23 hda
brw-rw---- 1 root disk 8, 0 2007-09-25 22:23 sda
crw------- 1 root tty 4, 64 2007-09-25 22:23 ttyS0
之前文章可知 c 為 Character Device 字元裝置,b 為 Block Device 區塊裝置,在 Linux
中所有硬碟都以區塊裝置表示。

裝置檔案的命名規則

以下來到了正題,hda 是怎麼來的。命名規則:
以一般狀況來說,IDE 驅動控制的名稱通常為 /dev/hda 至 /dev/hdd,(如:硬碟A /dev/hda
代表第一顆磁碟,硬碟C /dev/hdc 代表第三顆磁碟),詳細說明如下表

磁碟名稱磁碟控制磁碟順序
/dev/hdaIDE0Master
/dev/hdbIDE0Slave
/dev/hdcIDE1
Master
/dev/hddIDE1
Slave

以一般的個人電腦而言,一個IDE 控制器可裝設兩顆磁碟,舉例來說 /dev/hda 即為第一個磁碟
裝在第一個 IDE 控制器,/dev/hdd 代表第二個磁碟裝在第二個 IDE 控制器。
那分割區呢?通常,一旦硬碟被分割,分割區會以數字的方式附加在磁碟名稱後面,舉例來說,
第二個磁碟的第二個分割區會命名為 /dev/hdb2,詳細如下:

磁碟名稱磁碟控制磁碟順序
分割區形式分割區號碼
/dev/hda1IDE0Masterprimary1
/dev/hda2IDE0Masterprimary2
/dev/hda3IDE0Masterprimary3
/dev/hda4IDE0MasterswapNA
/dev/hdb1IDE0Slaveprimary1
/dev/hdb2IDE0Slaveprimary2
/dev/hdb3IDE0Slaveprimary3
/dev/hdb4IDE0Slaveprimary4

磁碟分割表預留4個位置(hda1~4)給主要分割區與延伸分割區,第五個之後
為邏輯分割區(hda5~...)

SCSI的命名規則


SCSI (Small Cumpter System Interface)介面的磁碟也遵循之前所述的命名規則,只是以 sd
代替 hd。但對 Linux 而言, sd 不是單只 SCSI 磁碟,凡是支援熱插拔 (Hot Swap)的硬體,
皆屬於 sd 系列,如 USB 隨身碟,SATA 硬碟等等都以 sd 命名,以下上列表:

磁碟名稱磁碟控制磁碟順序分割區形式分割區號碼
/dev/sda116primary1
/dev/sda216primary2
/dev/sda316primary3

(磁碟控制,磁碟順序的號碼是任意填上的,不必也不要跟著這樣設定)

2007年9月19日 星期三

Linux 目錄內容

要查出目錄中的內容,可以使用 ls 指令:
root@dhcppc3:~# ls -al
total 124
drwxr-xr-x 19 root root 4096 Jun 3 09:11 .
drwxr-xr-x 22 root root 4096 Sep 17 01:00 ..
-rw------- 1 root root 485 May 21 23:02 .ICEauthority
drwx------ 2 root root 4096 May 20 22:27 .Trash
-略-

drwxr-xr-x 第一個字母代表檔案類型,意義分別如下:
  1. -:File 檔案
  2. d:Directory 目錄
  3. l:Symbolic Link 象徵連結
  4. c:Character Device 字元裝置(如鍵盤)
  5. b:Block Device 區塊裝置(如硬碟)
  6. s:Socket 插槽(本機提供呼叫的服務程式)

drwxr-xr-x 後九個字母代表檔案權限,意義分別如下:
  1. [ r ]代表可讀(read)、[ w ]代表可寫(write)、[ x ]代表可執行(execute)
  2. 以三個字母為一組,第一組說明所有者的權限
  3. 第二組說明群組的權限
  4. 第三組代表其他人的權限
以下圖片說明各區塊意義

  1. 檔案類型
  2. 檔案權限
  3. 檔案:此檔案的硬式連結數目;目錄:該目錄下有多少目錄(註一)。
  4. 擁有者
  5. 擁有者群組
  6. 檔案大小,以位元組表示。若想以其他單位表示,可在旗標中加上 -h (human),會表是為 xxx K bytes 或 xxx M bytes。若是目錄,則表示儲存目錄資訊所佔的空間,最小值為4096 bytes。
  7. 最後修改時間
  8. 檔案名稱
註一:在此以範例說明第三個欄位的意義
在 /tmp 底下發現一目錄,且 ls -l 時,第三個欄位的數字為 3
bang@linuxdiary:/tmp$ ls -l
drwxr-xr-x 3 ikujyh ikujyh 4096 2008-01-01 02:04 ls_test
bang@linuxdiary:/tmp$ cd ls_test
bang@linuxdiary:/ls_test$ ls -la
total 12
drwxr-xr-x 3 ikujyh ikujyh 4096 Jan 1 02:08 .
drwxrwxrwt 5 root root 4096 Jan 1 02:04 ..
drwxr-xr-x 2 ikujyh ikujyh 4096 Jan 1 02:08 dir_demo
-rw-r--r-- 1 ikujyh ikujyh 0 Jan 1 02:08 file_demo
當我們在 ls_test 目錄底下,以 ls -la 列出所有檔案內容時,發現共有三個目錄 (包含上一層目錄,工作目錄),對目錄而言,第三個欄位的數字代表目錄下包含多少目錄。
那檔案呢?檔案的這個數字刺甚麼意思,來試試用 ln 來製作硬式連結:
bang@linuxdiary:/ls_test$ ln file_demo hard_link1
bang@linuxdiary:/ls_test$ ls -l
total 4
drwxr-xr-x 2 ikujyh ikujyh 4096 Jan 1 02:08 dir_demo
-rw-r--r-- 2 ikujyh ikujyh 0 Jan 1 02:08 file_demo
-rw-r--r-- 2 ikujyh ikujyh 0 Jan 1 02:08 hard_link1
bang@linuxdiary:/ls_test$ ln file_demo hard_link2
bang@linuxdiary:/ls_test$ ls -l
total 4
drwxr-xr-x 2 ikujyh ikujyh 4096 Jan 1 02:08 dir_demo
-rw-r--r-- 3 ikujyh ikujyh 0 Jan 1 02:08 file_demo
-rw-r--r-- 3 ikujyh ikujyh 0 Jan 1 02:08 hard_link1
-rw-r--r-- 3 ikujyh ikujyh 0 Jan 1 02:08 hard_link2


對檔案而言,這個數字即代表硬式連結的數目,故此數字是檢視檔案是否有硬式連結的重要方式。

2007年9月17日 星期一

Linux 指令 - 一般格式

通常執行命令時會在一個叫做 shell 的視窗中:
>ls -la /tmp
  • >:command prompt 命令提示字元,系統會以一個符號讓使用者知道,系統已準備好接受命令,通常以 $ 或 # 等表示方法,並可能包含其他資訊,如主機名稱,使用者身分等。
  • ls :command 一個有效的命令。(shell 的內建命令,存放在 PASH 所列目錄中的程式或程序稿,或是包含完整路徑的命令。)
  • -la :flags 旗標
  • /tmp :arguments 參數

注意:
  • Shell 是一種解釋命令意義的程式,Linux 中預設的 shell 是 GNU 參考 sh 所寫出的版本,稱為 bash (Bourne-Again Shell)。
  • Linux 的命令列是有大小寫之分的 (case-sensitive)。


Flags (旗標)的說明:
Shell 只要在命令列上遇到 - (dash)號,會自動判斷為旗標,不管 - 出現的位置,但事實 - 有兩種格式,如以下:
  1. Short Format: - ,一個字元,一個 Flag
  2. Long Format : -- ,一個單字
警告:
  • 通常短格式 - 後,不可能不會遇到如 ls -directory /tmp。因為一個字元,代表一個 Flag。
  • 由於有減號的關係,ls 認出 -l 是一個旗標而非檔名。然而並非所有命令都強調,旗標前都要有減號,最著名的例子為 tar 和 ps。
  • 以上說的是通則,可幫助學會命令的語法,但許多特殊命令不可一慨而論。