20 12
發新話題

[分享] Linux簡介

第五章 Boot,Initialization,Shutdown,and Runlevels
一. Linux開機流程:
1. 當我們將電腦電源打開時,BIOS會先載入相關硬體資訊,BIOS內記載著開機順序、晶片組狀態、PnP開啟與否、cpu相關訊息 (cpu及系統溫度、風扇rpm等)、IDE HDD AUTO DETECTION (如PRI Master、PRI Slave、SEC Master…)、硬碟大小、記憶體大小、主機板相關訊息等。所以開機後,系統會先去讀取BIOS的資料。

2. 接著依BIOS設定的開機順序 (如 cdrom → floppy → HD) 依序讀取,若主機上沒放光碟片及磁碟片的話,就會從硬碟開機,這裡就假設從硬碟開機,所以接著下來便會先去讀取硬碟的第一個磁區,即是MBR。MBR所佔用的磁區空間為512 bytes,而磁區內分兩部分,第一部份放開機程式碼,空間大小約446 bytes,第二部分放partition table,空間大小約66 bytes。

3. 此時若將lilo置MBR,lilo就會被執行,接著就會有lilo的選單畫面出現,看您選擇要開啟哪個作業系統,若選擇linux,便載入linux核心,若選擇windows,就載入windows的核心。但若當初lilo不是放MBR,而是放super block,那這時候就會由MBR上面的開機程式碼去尋找哪個分割區設定為啟動 (Active),如果是linux分割區設定啟動的話,就會出現lilo的選單畫面。

4. LILO (LInux LOader):linux的開機程式兼具boot manager。LILO工作為載入linux核心或其它OS。
一般人習慣將kernel loader置MBR上,這樣在系統讀取BIOS的相關訊息後,就可直接讀取這裡的開機資訊 (如lilo、grub、spfdisk)。
(1) 將LILO置Linux分割區的第一磁區:
此時可搭配其它Boot Manager,如spfdisk、Boot Magic來製作啟動選單,另可將Linux OS設為Active,而由LILO擔任Boot Manager工作。(partition須為primary partition)
(2) 將LILO置MBR:
若Linux分割區 ( /boot ) 置Extended 時,由於MBR不支援Extended,所以會無法開啟linux OS,解決之道便是將LILO放置於MBR。
註:欲清除MBR內容可於DOS下執行fdisk /MBR。
(3) 將LILO置磁片:可從磁片開機。
<note>Linux核心位於 /boot內。


註: 製作開機片
    redhat:
# mkbootdisk --device /dev/fd0 `uname –r`
openlinux:
X-WINDOW下:
      K → preference → system → startup → Rescue Disc
文字介面下:
# dd if=/boot/vmlinuz-2.4.13 of=/dev/fd0
# rdev /dev/fd0 /dev/hda3 → boot partition

˙Linux的開機程式分LILO.GRUB(Grand Unified Boot loader)
其相關設定檔為 /etc/lilo.conf /boot/grub/menu.lst (或grub.conf)
若將LILO或GRUB放MBR,則其除具本身的開機啟動程式外,亦可做Boot Manager功能。

<補充> 安裝Windows及linux共存一顆硬碟。
(1)先安裝Windows OS
(2)再安裝linux:
安裝Linux最少須有兩個partition,即 / 及swap,一般習慣將 /boot也獨立一partition。
此時將 /boot置主分割區上並設定啟動(Active),reboot後便可看到開機選單,此時選DOS便載入windows的核心,選linux便載入linux核心 (位於 /boot 下)。
(3)若您使用其它Boot Manager,如spfdisk,就要注意LILO須安裝於分割區 (如 /boot partation)上,而非MBR上。
(4)OS loader(開機載入核心的程式)一般放MBR上,若先放Windows loader再放Linux loader,則MBR的loader便是LILO(MBR上,每次只能放一個loader)。若先放linux再放Windows,則loader為Windows的,此時便無開機選單可選,因Windows loader只能開啟Windows的OS,其並不認得linux的檔案系統,所以自然也就無法載入linux核心。
(5) /boot分割區不要超過1024 cylinder,因LILO無法載入此範圍外的核心(無論lilo放MBR或 /boot上皆同),不過話雖如此,還是有解決之道,首先,要確定硬碟有使用LBA ( Logical Block Address )模式,再來就是你的BIOS需支援LBA模式。不過若您使用的是較新版的lilo或grub,就比較不需擔心這類的問題了。
   註:LBA是一種硬碟設備的定址技術,也就是將原本磁柱、磁頭、磁區編號定義成邏輯區塊位址,當硬碟容量超過8.4G以後,就會轉為以LBA方式表示。

二. Linux開機執行步驟(硬碟開機)
1. 由LILO載入Linux Kernel。

2.Kernel載入後,執行的第一支程式為 /sbin/init (initial),此即為系統的第一個行程,其PID為1。

3.接著init會去讀取 /etc/inittab,在這個檔案裡,可看到幾個系統啟動的執行等級(run level):
0- halt (Do not set initdefault to this) 關機。
   1- Single user mode單人模式(系統出問題時,便可進入單人維護模式)。
2- Multiuser,without NFS(networking)多人使用,無網路。
   3- Full multiuser mode文字界面,多人使用,有網路。
   4- unused 系統保留不使用。
   5- X11 圖形界面,多人使用,有網路。
6- reboot重新開機。

再來針對內容中的各欄位作說明:
/etc/inittab內,每一列有四個欄位,用:隔開。
id:run level:action:process
第一欄位為每個項目的識別碼id,1或2個字元(有的版本1-4字元)。系統設定的識別碼,不要更改。
第二欄位為run level,0~6,若空白,表所有run level皆適用(0除外)。
第三欄位為action,此欄告之init程式要如何處理此項目。
valid actions:
˙respawn:程序終止後,會重新啟動程序。若無此項設定,使用者
      登出又登入時,便無法執行。
˙wait:一旦指定run level後,程序將被執行,且init會等待至程序停止。
˙boot:在系統開機期間,程序被執行 (忽略run level欄)。
˙bootwait:接上,且init程式會等待至程序停止 (忽略run level欄)。
˙initdefault:指定系統開機後,預設的run level (忽略process欄位)。
˙once:一旦指定runlevel後,程序將被執行。
˙sysinit:程序在系統開機期間執行,且其執行是在boot及bootwait紀錄之前(忽略runlevel欄)。
˙ctrlaltdel:user按下ctrl+alt+del後便reboot,故建議此功能勿開放(可將此行註解起來)。
由上可知boot、bootwait、sysinit的runlevel欄為空白的,即run level 1~6皆適用。
第四欄位為process:要執行的程式及參數。

4. init讀取 /etc/inittab內的順序 (redhat)
(1) id:3:initdefault:
→ 系統預設開機時執行runlevel 3,即以文字介面登入,若想以圖形介面登入,可將3改5即可。
(2) si::sysinit:/etc/rc.d/rc.sysinit
→ rc.sysinit為系統執行的第一個script,其執行的工作如啟動swap、執行fsck、mount fs、load modules…等。
若想要讓一般使用者無法進入單人維修模式,可於該行後補上:
pw:S:wait:/sbin/sulogin
→ pw為自訂的id,只要不跟系統id重複即可,如此設定完後,任何人在進入單人模式時,都需輸入root密碼,如此設定的好處是可防止有心人士利用進入單人模式來滲入系統,但身為管理者的你,就千萬不能忘記root密碼了。
此項設定,不論對硬碟或磁片開機都有效,但對使用光碟開機進入rescue模式來說,就無法生效了。
      
(3) 10:0:wait:/etc/rc.d/rc 0
11:1:wait:/etc/rc.d/rc 1
12:2:wait:/etc/rc.d/rc 2
13:3:wait:/etc/rc.d/rc 3
14:4:wait:/etc/rc.d/rc 4
15:5:wait:/etc/rc.d/rc 5
16:6:wait:/etc/rc.d/rc 6
→因系統預設runlevel 3,所以會去執行13:3:wait: /etc/rc.d/rc 3這一行,並由rc程式執行 /etc/rc.d/rc3.d內相關檔案。
我們仔細看rc3.d目錄,發覺其下都是連結檔,並連結至 /etc/rc.d/init.d目錄下的服務程式,這些服務程式都是script file。
如:S55 named→../init.d/named
K25squid →.. /init.d/squid
S (Startup.Source):指系統在啟動時,會執行S開頭的link file所指向的scripts,其後所接數字大小表執行先後順序,小的先,而這些數字勿任意更動,因script間會有相依關係。
K (Kill):指系統於結束時會執行的相關檔案。而開機時,以K開頭的scripts將不會被執行。
我們若切換至rc0.d目錄,可看出其下除halt、killall為S開頭,餘皆K開頭。
另外 /etc/rc.d/init.d目錄內的shell scripts都可提供相關命令參數來指定、得知相關狀態。如以下:
        start 啟動
      stop 停止
        restart 重新啟動
        status 顯示目前狀態
        舉例: # /etc/rc.d/init.d/named stop
# /etc/rc.d/init.d/httpd status
# /etc/rc.d/init.d/network restart

(4) /etc/rc.d/rc.local此為系統最後執行的script file,在系統完成大部份的開機程序後,接著便執行您個人化的系統設定,例如您想在開機時執行一些工作,便可將命令行(或寫成script)寫在這個檔案內,最常用者為模組額外掛載及防火牆。
<note>以上設定勿放rc.sysinit,避免upgrade後,造成資料遺失。

5. 當init工作執行告一段落後,就交棒由login程式執行,這時候就等您輸入使用者帳號密碼來讓系統做確認的動作。

6. # runlevel =>可看出系統預設runlevel為何,又如您想於命令列上變換執行runlevel,可輸入:
# init 0 或 # telinit 0
: :
# init 6 或 # telinit6

註:openlinux在init讀取 /etc/inittab的順序:
     ˙執行預設runlevel。
     ˙執行相關scripts:/etc/rc.d : rc.modules、rc.serial、rc.boot、rc.local。
        其主要執行項目與上面所提及的rc.sysinit差不多。
˙/etc/rc.d/rc 開始啟動相關服務,以runlevel 5為例,rc 程式會執行/etc/rc.d/rc5.d相關連結檔,啟動 /etc/rc.d/init.d/ 下的scripts,而這些scripts最後再根據 /etc/sysconfig/daemons來決定啟動哪些服務。

三. 開機故障排除:
1. 當系統因斷電、不正常關機造成資料損壞時,系統於開機過程會嘗試修復,若無法自動修復時便要實施手動修復。
假設您損壞區塊為 /dev/hda3 ( 非 / ),此時開機中途,screen會顯示press root password,您就照做,以便進行單人維護工作,接著輸入 fsck /dev/hda3,screen會顯示開始修復訊息,若有找到錯誤,會詢問clear〔Y/N〕,此時輸入Y,等都完成後,便可reboot。

2. 進入單人模式修復:
在LILO開機選單中,按下ctrl+x時便可看見boot: 提示號,此時輸入boot:linux 1或linux single或linux –s就可進入單人模式。
若於開機選單中,按下ctrl+x後,再按下tab鍵,系統會將可開啟的os名稱列出 (redhat)。
˙當root密碼忘記時,可先進入單人模式後再執行:
# passwd root
<註>當LILO載入核心時,核心會將開機訊息寫入 /var/log/messages內,亦可用 # dmesg ∣less來看這些訊息。

四. 關機:shutdown.init.halt.reboot(ctrl+alt+del)
1. shutdown:其後若沒接參數,預設會reboot至單人模式。
# shutdown 2
→系統2分鐘後,將reboot至單人模式,也可寫成下式:
# shutdown +2

# shutdown –r 5
→系統5分鐘後reboot。在等待期間若按ctrl+c可取消。

# shutdown -h 3 」note」
→系統3分鐘後關機,screen並顯示note字樣。

# shutdown –Fr now =>reboot時,force fs check。
# shutdown –h 18:30 」system will halt at 18:30」

2. 其它關機或重開機指令:
# halt (# init 0)
# reboot (# init 6)
以上指令雖簡單,但不建議使用,因其不似shutdown指令,能透過廣播通知正在使用系統的user,諸如系統即將關機或重開機的訊息。

補充:在 /etc/inittab的後面還有以下敘述:
1:2345:respawn: /sbin/mingetty tty1
↓     ↓
6:2345:respawn: /sbin/mingetty tty6
以上乃意謂著有6個終端機可供切換,可按下ctrl+alt+(F1~F6)來選擇使用哪個終端機,若只想提供1~4 (F1~F4),可於5.6行前面加註#,再執行
# init q 或
# telinit q 以便重讀inittab,使其改變立即生效。
telinit為一soft link file,link至init。
而respawn用意,在於當使用者登出後,要再登入 (或其它user login) 時, /sbin/mingetty可重新執行,以便能順利登入終端機,否則會造成登入失敗。

TOP

第六章 Linux Installation and Package Management
一. linux檔案系統目錄結構:
1. linux 檔案系統內的目錄,是一個樹狀結構,最上層目錄稱為根目錄(root directory),以 」/」 表示,注意,勿與系統管理員或稱超級使用者(super user) root弄混。
2. 樹狀目錄結構:
/ 目錄下分為:
boot:核心所在位置及其相關檔案。
etc:系統設定檔。<note>修改設定檔前,記得back up。
home:使用者家目錄,即使用者登入後,預設的使用者目錄位置。
dev:device,存放與裝置相關的檔案,且大多為字元裝置與區塊裝置,在linux下,皆把device當成檔案看待。
例: /dev/fd0、 /dev/cdrom、 /dev/hda1 …。
tmp:讓一般使用者暫存檔案處。
bin:存放一般使用者常用的執行檔。
sbin:一般為root常使用的程式。
usr/bin:與 /bin比較,其程式較屬於使用者導向。
sbin:存放root的程式。
src:存放核心原始碼的位置,所以當我們要編譯核心時,亦須至此目錄下。
share/doc:系統套件說明處。
man:manual page,存放程式或檔案說明處。
有的版本是放在 /usr/doc /usr/man。
      若是下載tarball回來安裝,則有可能在 /usr/local/doc /usr/local/man。
var:variable,系統記錄檔存放處。
mnt:檔案系統掛載點。一般習慣將其放置於此。
例: /mnt/floppy /mnt/cdrom /mnt/hda1
proc:存放系統程序及系統相關訊息,其不佔硬碟空間,而是存在於記憶體內。
lib:library,函式庫,執行程式或編繹核心時會用到。
lost+found:當執行fsck時,會將遺失資料置此。

二. Design a Hard Disk Layout
1. 在做linux硬碟分割時,須考慮以下因素:
(1) 硬碟空間大小。
(2) 系統資料多寡 (視安裝時所選套件數而定) 。
(3) 系統用途:例如當我們架Mail Server、Web Server時,其預設路徑
( /var/spool/mail、/var/www/html ) 都位於 /var目錄下,因此這個時候 /var可能要切割大一些。
(4) 在哪個partition做backup行為,例如使用者須要於自己家目錄下做複製動作或做備份時,那麼 /home也須切割大一些。

2. 假設安裝linux OS時,劃分partition為 /boot、 /、 /usr、 /var、/home、 swap,安裝完成後,用 #du -b 個別檢視每個目錄實際佔用區塊空間,發現八成以上的空間都被 /usr占掉,由此可知OS大多被安裝於此。

3. swap space:安裝linux OS,最少須2個partition,即 / 及swap,swap partition為一虛擬記憶的分割區,其功用為暫存主記憶體的程式資料,例如當很多程序在執行時,可能造成記憶體不足,於是允許將一些不是經常使用的程式資料暫存於swap內,等程序執行ok了再放回來。一般我們在劃分swap大小時,習慣與主記憶體相同,或2倍或3倍不等,視您系統使用情形而定,沒有絕對的限制。

4. linux partition size分配要點:
(1) /boot分配於1024cylinder之前,較不易有問題(16-50MB)。
(2) / 可劃分小些,這樣可以讓出其它空間給須較大空間的partition。
不過如此做法的前題是 / 及 /usr 需分別獨立。
(3) /var須分割足以掌握記錄檔及循環檔。
(4) /usr須能容納系統程式、套件訊息、核心編繹等。
(5) /home視使用者多寡而定,若架SAMBA,還須讓使用者有足夠的空間放置他們自己的資料。

三. Install a Boot Manager:linux boot loader分lilo及grub。
lilo設定檔為 /etc/lilo.conf,grub設定檔為/etc/grub.conf或/boot/grub/grub.conf
1. 開啟linux OS,不外乎兩個基本步驟:
(1) 從開機磁碟(硬碟或軟碟)執行lilo,lilo找到核心並將其載入記憶體,lilo至此工作已完成。
(2) 在lilo載入核心後,其階段性任務便已結束,接著就由核心起始相關程序的執行。

2. /etc/lilo.conf→LILO預設的設定檔內容如下
prompt
→此參數會顯示選單畫面,若無prompt設定,就看不到選單畫面,此時lilo會直接開啟default os,除非按ctrl+x。
timeout=50
→啟動選單畫面出來後,若5秒內沒做選擇,便會開啟預設的作業系統。
default=linux
→預設開啟的作業系統 (如5秒內無動作)。
boot= /dev/hda2
→表示lilo存放位置在 /dev/hda2的super block,若boot= /dev/hda,則表示lilo是放在MBR。
map=/boot/map
→主要紀錄kernel檔名、位置…等訊息。
install= /boot/boot.b
→指定boot.b 檔案安裝在新的啟動磁區,至於檔案內容是描述開機區的一些訊息。
message= /boot/message
→執行lilo時顯示的訊息。
linear
→大容量硬碟使用,在SCSI較常見。
image= /boot/vmlinuz -2.4.7-10
→核心所在位置
label=linux 為核心提供一OS名稱。<note>與default須相同。
root= /dev/hda3 根目錄所在partition。
append=」hdc=ide-scsi」 允許將額外的參數傳給kernel,以此為例,就是讓kernel認識hdc是cdrom裝置。
other= /dev/hda1
→other是代表一個非linux核心的作業系統。
label=DOS
另外像lba32與linear都是在 /boot>1024時會使用到(BIOS須支援)。還有read-only是開機過程根目錄mount狀態,等開機完後會回到read-write。
另外若想設定lilo密碼,可加上參數password=xxxxx,這樣當lilo在載入核心前,就會先要求您輸入這裡所指定的lilo密碼,但是若您使用開機
片時就不受此限制了,因開機片內有lilo及核心之故。另外像用光碟開機來進入救援模式也是無效。

當修改完lilo.conf後須執行:
# lilo 或 # lilo –v –v 或 # lilo –v –v –v
-v愈多,顯示執行過程的訊息愈多。
執行此命令主要是讓修改後的結果寫入mbr 或super block中。

3. 解決錯誤問題:
(1)開機時出現LI便停住 (或LIL-)(或loading…又跳回選單)
<1>LILO載入核心後,便完成其任務,而此情況是尚未載入核心便出問題,故可拿開機磁碟片開啟OS後,修改lilo.conf,將linear取消,但若無linear,就加入lilo.conf中,OK後=>
# lilo –v –v
逕會將所做修改寫入MBR或 /boot開機磁區,視您lilo安裝位置而定。
<2>將BIOS中,硬碟設定Mode改成LBA試試。
(2)開機時出現0101…,無法進入Linux時:
<1>有可能硬碟出問題,可用fsck修正root partition。
<2>進入BIOS,將硬碟的mode改成LBA試試。
<3>也有可能硬碟磁區改變,卻沒重新安裝lilo,此時可於單人模式下修改lilo.conf即可。

4. grub: grub是linux另一種loader,比lilo還新,lilo做得到的,grub也能做到,甚至它可以讓您在grub的選單上編輯開機設定。底下就開始跟大家約略介紹一下。
(1) grub的主設定檔 ( /etc/grub.conf或 /boot/grub/menu.lst 或/boot/grub/grub.conf)
default=0
逕 預設開啟的作業系統,0代表底下出現的第一個title其後所接的OS,同樣道理,1就代表第二個title後所接的OS,依此類推。
timeout=10
逕 10秒內未做選擇,就開啟預設的作業系統。
title Red Hat Linux (2.4.18-14)
root (hd0,1)
kernel /vmlinuz-2.4.18-14 ro root=LABLE=/
逕 hd0代表hda,hd1代表hdb,依此類推,後面所接數字,0代表第一個分割區,1代表第二個分割區…,所以 (hd0,1)就是hda2,至於root (hd0,1),表示要grub掛載hda2,也就是 /boot所在的分割區,因為核心就在這個分割區內。另外root (hd0,1)已把核心所在位置
/boot定義為根目錄,所以下面那一行 kernel /vmlinuz-2.4.18-14的實際路徑就會變成 kernel /boot/vmlinuz-2.4.18-14,當然您要這樣寫也是可以的。要是當初安裝0S時,沒把 /boot分割出來,那麼該行要寫成 kernel /boot/vmlinuz-2.4.18-14。至於最後面的敘述是告訴核心實際根目錄位置,並將其掛載成唯讀。
title DOS
rootnoverify (hd0,0)
chainloader +1
逕 第一行是指示grub不要掛載hda1的分割區,只要知道待會是要啟動此分割區上的作業系統即可。
     第二行是指定hda1的第一個磁區做啟動磁區。
     後面兩行已亦可合併成chainloader (hd0,0) +1

(2) 安裝grub在super block方式:
# grub
grub> root (hd0,1) <== 核心所在的分割區
grub> setup (hd0,1) <== 將grub安裝在hda2
grub> quit

(3) 安裝grub在MBR方式:
# grub
grub> root (hd0,1)
grub> setup (hd0)
grub> quit

(4) 安裝grub還可用以下方式:
安裝在superblock: # grub-install /dev/hda2
安裝在mbr: # grub-install /dev/hda

四. 壓縮及解壓縮檔案的指令
gzip.bzip2.compress→對單一檔案個別壓縮。
tar→將很多檔案打包成單一檔案(archive),另加-z參數可打包兼壓縮。
1.gzip:(GUN zip)
$ cp /etc/passwd /etc/termcap .
→將檔案複製至家目錄下。
$ gzip passwd termcap
→原檔案沒了,變成*.gz的檔案。
$ ls –l /etc/passwd /etc/termcap passwd.gz termcap.gz
→比較壓縮前與壓縮後檔案的大小。
$ gzip –d passwd.gz termcap.gz
→解壓完後,*.gz 檔案不見了。
= gunzip passwd.gz termcap.gz
$ gzip –l passwd.gz
→顯示壓縮前後大小、壓縮比及壓縮前檔名。
$ gzip –cd passwd.gz
→顯示壓縮檔案解開後的內容(檔案實際未解開)。
=zcat passwd.gz

2.bzip2:
$ bzip2 passwd termcap
→原檔案沒了,變成*.bz2壓縮檔。
$ bzip2 –d passwd.bz2 termcap.bz2
=bunzip2 passwd.bz2 termcap.bz2
$ bzip2 –cd passwd.bz2 termcap.bz2
→顯示解開後的內容。
註:*.bz2壓縮檔不能用zcat看檔案內容。

3.compress:
$ compress passwd termcap
→壓縮成*.Z的檔案。
$ compress –cd passwd.Z
→顯示壓縮檔內容。
=zcat passwd.Z
$ compress –d passwd.Z termcap.Z 解壓縮
=uncompress passwd.Z termcap.Z
<note>˙壓縮比率:bzip2>gzip>compress
˙zcat只能用於*.gz及*.Z及*.tar.gz(*.tgz)的壓縮檔。
˙bzip2及gzip可用-1~ -9(最大壓縮)來定其壓縮大小。
bzip2預設為-9,gzip為-6。
˙*.gz、*.bz2、*.Z附檔名皆自動產生。

4.tar:將很多檔案及目錄打包起來成單一檔案(archive)-tarfile,其附檔名不會自動產生,一般指定為*.tar。
參數:-c→creat -v→verbose -f→filename
-t→list -z→gzip壓縮 -j或-I→bzip2
-x→extract -r→append files to the end of archive
--delete –f→delete files in an archive.
 若加上-z參數,其附檔名為 .tar.gz或 .tgz,亦即一般所謂的tarball,須與archive做區分。
# tar cvf tarfile.tar /var/spool/mail /etc/named.conf
# tar tf tarfile.tar =>顯示tarfile內的清單。
# tar xvf tarfile.tar =>解開tarfile。
# ls =>可看到var、etc、tarfile.tar
# tar rf tarfile.tar /var/log/messages /var/log/maillog /home
=>將2個檔案及一個目錄附加至tarfile後面。
# tar tf tarfile.tar 確定附加檔案目錄有進去。
# tar --delete –f tarfile.tar var/log/maillog=>從tarfile中移除此檔案。
# tar xvf tarfile.tar var/log/messages =>只解一檔案出來。
# tar zcvf tarball.tar.gz /var/named /etc/fstab /etc/passwd
=>打包兼壓縮。
# tar ztf tarball.tar.gz =>顯示tarball清單。
# gzip -cd tarball.tar.gz =>顯示tarball內檔案的內容。
= zcat tarball.tar.gz
# tar zxvf tarball.tar.gz etc/passwd
=>只將 passwd 檔案解開。
# tar zxvf tarball.tar.gz =>將tarball解壓縮。
= gzip –cd tarball.tar.gz | tar xf -
 注: tarball內不能附加檔案進去,亦不能刪除某一檔案。

補充: 安裝tarball:設已於網路上download proftpd-1.2.7rcl.tar.gz
root # tar zxvf proftpd -1.2.7rcl.tar.gz
# cd proftpd -1.2.7rcl
接著打開其下的INSTALL 檔案,看其安裝步驟來安裝。
# ./configure --prefix= /usr --sysconfdir= /etc \
--with –modules=mod_readme:mod_ldap
逕 此步驟主要是先找尋有無待會編譯時需用到的程式,如gcc等,並會產生一makefile檔案,此檔主要是規劃等一下編譯的過程。
# make
逕根據makefile的規劃執行編譯。
# make install
逕將編譯完後的檔案放置在指定的目錄下。
 此一步驟必須要root來執行。

TOP

五. RPM(RedHat Package Manage)and Debian Package Manage
1. RPM: 由RedHat公司所發展,RPM主要是將欲安裝套件事先包裝好,並依此套件內的資料記載,而有了套件相依性的存在,所以當您在安裝RPM時,有時系統會告知您此套件的相依套件訊息,亦即須先安裝相依套件,才能再安裝此套件。
SRPM: 套件裡包含了打包之前的原始碼,所以須先經過編譯打包的動作,才能開始安裝,亦即先將xx.src.rpm編譯打包後,才產生xx.i386.rpm xx.i586.rpm此類binary RPM或xx.noarch.rpm此類不分平台的noarch RPM。
Note: i386逕與intel相容的CPU,其CPU等級為386,而此xx.i386.rpm套件檔案幾乎可適用於所有x86平台。
noarch逕此類套件檔案是不分平台的。

˙ apache-1.3.14-3.i386.rpm => package file
apache: package name
1.3.14: version
3: release,第幾次修改,即打包幾次,若為1,表沒修改過。

RPM指令:
(1) 查詢:一般套件訊息的相關目錄都在 /usr/share/doc下。
$ cd /usr/share/doc
$ rpm –q apache => apache -1.3.14
查詢套件說明的目錄,等於以下:
$ rpm --query apache
$ rpm -qa =>列出已安裝的所有套件名稱。等於以下:
$ rpm –q --all
$ rpm -ql apache =>列出套件內的檔案目錄清單。等於以下:
$ rpm –q --list apache
$ rpm –qf /etc/passwd =>反查檔案是屬於哪個套件。等於以下:
$ rpm -q --file /etc/passwd
$ rpm -qi apache =>查套件訊息。等於以下:
$ rpm –q --info apache
$ rpm -qc apache =>查套件內的設定檔及script file。等於以下:
$ rpm –q --configfiles apache
$ rpm -qd apache =>查套件的相關文件存放位置(doc、man)。等於以下:
$ rpm –q --docfiles apache
$ rpm -qip apache-1.3.14-3.i386.rpm
→ 當套件不在本地端,而在遠端,例如download回來尚未安裝或套件在CD-ROM上或套件在其它網站時,須加-p參數,且後面須接套件檔案。等於以下:
$ rpm –q --info --package apache-1.3.14-3.i386.rpm

(2) 安裝、升級:
# rpm –ivh sendmail-8.11.6-3.i386.rpm (-i等於--install)
i→install v→verbose h→hash(#字號)
# rpm –ivh --nodeps sendmail-8.11.6-3.i386.rpm
→安裝時忽略套件相依性的檢查。
# rpm –ivh --force sendmail-8.11.6-3.i386.rpm
→強迫安裝,其使用時機有2:
˙同一套件已安裝過。
˙與系統檔案有衝突時。
註:--force same as using --replacepkgs、--replacefiles、--oldpackage。
# rpm –Uvh sendmail-8.11.6-3.i386.rpm(-U=--upgrade)
→升級時,若無較早版本的套件存在,會當成一般安裝,但若升級的套件版本與現已存在的套件版本一樣,則會顯示套件已安裝的訊息。
# rpm –Uvh --nodeps --force sendmail-8.11.6-3.i386.rpm
# rpm –Fvh *.rpm (-F=--freshen)
→僅更新原系統存在較早版本的套件,若遇版本相同會跳過,若無較早版本存在則不安裝。
運用此方式來將所安裝過的套件進行升級非常方便。

(3) 移除:
# rpm -e --nodeps sendmail (預設一次只移一個)
→ -e等於 --erase
# rpm -e --allmatches sendmail
→將系統內套件名稱為sendmail的所有版本移除。
移除時,若遇有修改過的檔案將不會移除,例如 /etc/xinetd.d內的wu-ftpd檔案有修改過,則刪ftp套件時,wu-ftpd檔名會變成wu-ftpd.rpmsave。

(4) 確認:verify
# rpm -V sendmail 查詢套件內被修改過的檔案,可用man rpm
→ /--verify去查詢修改的代號意義為何。-V=--verify
  S: file size differs
M: Mode deffers ( includes permissions and file type )
5: MD5 sum differs
D: Device major/minor number mis-match
U: User ownership differs
G: Group ownership differs
T: mTime differs

(5) 編譯打包:--rebuild
訪客無法瀏覽此圖片或連結,請先 註冊登入會員
download proftpd -1.2.6-1.src.rpm做範例
一般download下來的xx.src.rpm習慣放 /usr/src/redhat/SPRMS內。
# rpm --rebuild proftpd -1.2.6-1.src.rpm
編譯打包完成後,會產生一binary rpm於 /usr/src/redhat/RPMS/i386/proftpd -1.2.6-1.i386.rpm,此時再進行安裝便大功告成。
i386# rpm –ivh proftpd -1.2.6-1.i386.rpm
download rpm package web site訪客無法瀏覽此圖片或連結,請先 註冊登入會員

2. Debian package management:指令dpkg.apt-get.alien.dselect
(1) # dpkg -i xx.deb (same as --install) 安裝
# dpkg -r package-name (same as --remove)
→ 設定檔不移除外,其餘皆移除。
# dpkg --purge package-name
→ 包括設定檔在內,全部都移除。
# dpkg -L package-name (same as --listfiles) 列套件清單
# dpkg -l pattern (same as --list)
→ 將含有pattern的package-name列出來(dpkg -l表示列出所有套件)
# dpkg -s package-name (same as --status) 列套件訊息
# dpkg -S search-pattern (same as --search)
→搜尋符合search-pattern的filename。
(2) apt-get dist-upgrade 自動升級Debian至新版
apt-get install package-name
apt-get remove package-name
apt-get update
(3) alien: ˙安裝非Debian套件在Debian系統上。
˙做套件間轉換,支援類型→Red Hat(xx.rpm)、Stampede(xx.slp)
  Slackware(xx.tgz)
# alien -i xx.rpm
# alien --to –slp xx.tgz
# alien --to –deb xx.rpm
(4) dselect:利用交談模式,讓您選擇安裝、移除及設定哪些套件後,再呼叫dpkg完成工作,故其比dpkg高階。

六. 動態連結資料庫(Dynamic Link Library):DLL
1. 任何程式執行時,都須有一些DLL供其使用,否則此程式便無法執行,這就是所謂程式的相依性。
2. 動態連結資料庫DLL一般置 /lib或 /usr/lib下(預設未含 /usr/local/lib),而 /etc/ld.so.conf即是定義DLL目錄位置。
3. 指令ldconfig會去讀取 /etc/ld.so.conf,同時連結ld.so,由ld.so於目錄內搜尋一些與執行程式有關的DLL,並將其記錄於 /etc/ld.so.cache。
4. 現若新增一些DLL位於 /usr/local/lib內,其做法有2:
(1) 將 /usr/local/lib加入 /etc/ld.so.conf,接著執行ldconfig,讓其重讀/etc/ld.so.conf內的資料,如此方能更新 /etc/ld.so.cache。
(2) 將目錄 /usr/local/lib加入LD_LIBRARY_PATH變數中,如此可讓ld.so執行變數中的目錄,此法會override於(1)之上,但若使用者設定不正確,便容易出錯。記得變數設定好後執行=># ldconfig
5. 增加、減少、刪除部份DLL或DLL目錄有異動,就須執行ldconfig。
6. 系統於開機時,預設會執行ldconfig。
7. 查詢程式用到哪些DLL,可下指令ldd。
Ex:# ldd /bin/cat


Documentation
manual page (man page):線上說明文件
指令:man <options><section>command或file
section1→user commands:可執行檔及shell內建命令。
2→system calls:由核心提供的系統呼叫。
3→libc calls:涵式庫裡的涵式呼叫。
4→devices: /dev裡的特殊檔案,一般位於 /dev/*。
5→file formats:特殊檔案格式,如 /etc/passwd.、/etc/fstab、 /etc/inittab…。
6→games:遊戲。
7→micro package:聚集套件協定。
8→system administration:系統管理者的使用指令。
section相關說明可參考:
/user/share/doc/man-pages-1.39/man-pages-1.39.Announce或
# man 1 intro 一直到 #man 8 intro

options:-a→預設(man1~man8)
-k→$ man –k passwd =$ apropos passwd
查詢含有passwd字串的相關man page section及簡易描述。
-f→man –f passwd =whatis passwd
查詢passwd的man page section及簡易描述。
-w→man –w passwd (inittab.fstab)
顯示指令或檔案說明檔 /usr/share/man/man1/passwd.l.gz
man1~man8目錄底下,都是*.gz的壓縮檔,欲看其內容可執行:
$ gzip –cd /usr/share/man/man1/passwd.l.gz
man指令section未指定,則其一般查詢順序為1→8→2→3→4→5→6→7,且以先查詢到為主。
Ex:man passwd =>passwd(1)
man 5 passwd =>passwd(5)
我們較常使用到者為man1、man8及man5。
man1:一般常用指令都在此,另包含shell內建命令如以下:
alias、bg、cd、exit、export、jobs、history…。
man8:root使用的指令說明,如以下:
init、shutdown、lilo、mount、fsck、edquota…。
man5:特殊檔案格式說明,如以下:
inittab、lilo.conf、named.conf、fstab、smb.conf、passwd、syslog.conf、shadow…。
man指令的操作
例:$ man inittab
space bar = pagedown =>往下翻一頁。
B = pageup =>往上翻一頁。
/boot =>找檔案中從前面算起的第一個boot字串。
:n =>下一個boot字串位置。
:N=>回上一boot自串。
? boot=>找檔案中最後面一個boot字串(於最後一頁時)。

* /usr/share/doc或 /usr/doc(視版本而定)
  存放套件相關說明的文件。
*當我們用man做查詢時,系統是到 /etc/man.config去搜尋路徑,故若有一新套件,其man pages放 /usr/local/newpacket內,我們便可將其加入man.config中,如此man才可查詢得到。

TOP

第七章  Scheduling jobs、backup and system log files
一. 排程:
1. crontab:定期性、週期性(periodic)的執行特定工作。
套件→crontabs
文件說明:man 1 crontab
man 5 crontab
man 8 crond (cron)
常駐程式:/usr/sbin/crond (/usr/sbin/cron)
cron程式在執行時會讀取 /etc/crontab、/etc/cron.d 及 /var/spool/cron。
     cron程式系統預設每分鐘會執行一次。
指令:crontab
使用參數: -e : edit -l : list -r : remove
$ crontab –e ( -l , -r)
→編輯使用者自己的排程 ( 列出排程、刪除排程 )。
# crontab –u barry –e
→編輯使用者barry的排程,root方有權指定user。
編輯內容格式如下:
30 16-18 20 12 * cat /etc/passwd
→此六欄位分別為分、時、日、月、星期、執行的排程工作。
其意義是說在十二月二十日下午4、5、6點三十分執行後面的程式,並將結果儲存至/var/spool/mail/barry 的檔案內。
 另可用重導方式寫成 cat /etc/passwd>/home/barry/cronfile ,這樣就可以將排程執行的結果放到cronfile內,若cronfile原已有內容存在,則可將 > 改成 >> ,以避免覆蓋掉原來的內容。
   若上式寫成 cat /etc/passwd>cronfile,則cronfile會自動產生於/home/barry底下。

  5 10,18 8 * * 程式
  →每個月八號早上十點五分及下午六點五分執行排程。

  10-30/2 8 * * 5 程式
  →每週五早上8點10分、12分、14分、…、30分執行程式。
第五欄位為星期,0和7代表星期日。

  # crontab –u barry –l
→列出使用者barry的排程。
# crontab –u barry –r
→刪除使用者barry的排程。
# crontab –e
→編輯root自己的排程。
  排程相關檔案:
(1) /var/spool/cron←權限為drwx------
cron目錄下為有編排程的user 的檔案,檔案內容為排程而非排程執行結果。當使用者執行crontab指令設定排程時,就會將排程寫入
/var/spool/cron底下的檔案中。

(2) /etc/crontab 系統排程設定檔
以redhat來說,crontab檔案內有/etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly等目錄,每個目錄下都是一些scripts檔。所以系統管理者可將欲執行的工作寫成scripts,然後放到這些目錄下,等時間一到,系統就會自動執行。
至於openlinux每天、每週…的排程則是設定在 /etc/cron.d下,包括Daily、Weekly、Monthly等,可自行參考。
設定檔內容範例:
0 23 * * 5 root cp –a /var/lib/mysql>/test/mysql
→其中root代表此排程的執行者。另外當設定完成存檔離開後,不需重新啟動crond,因系統預設每分鐘會自動執行。

(3) /etc/cron.allow /etc/cron.deny
→兩個檔案預設都不存在,此也表示所有人可執行crontab排程工作。
# touch /etc/cron.allow
→若檔案內空白,表所有人(含root)都不能執行crontab。若只希望管理者能使用crontab,其他人不能使用時,只需將root加入此檔即可。
# touch /etc/cron.deny
→將拒絕使用crontab的使用者加入此檔中。
當兩個檔案同時存在時,會先執行cron.allow再執行cron.deny。

(4) /var/log/cron 已執行的排程都會紀錄到這個檔案內。
Openlinux預設此檔不存在,可於 /etc/syslog.conf內設定,後面章節會說明。
    
2. at : 於特定時間 (particular time)執行排程一次
(1) at 的時間格式
˙at 4:30pm 也等於 at 16:30
˙at now +3minutes (weeks、days、hours、…)
˙at 18:20 10/20/02 也等於 at 18:20 20.10.02
˙at 4pm +5days
˙at 15:15 tomorrow

(2) $ at 10:30pm
at>ls –ld /dev > /home/barry/atfile
設定好後按ctrl + d 離開。設定內容若無重導,則與crontab一樣,會將結果放置個人信箱中。
$ at –l → list 等於 $ atq → queue
$ at –d 排程編號 → delete 等於 $ atrm 排程編號
$ at –f /tmp/file 16:30 → file 內容為所設定的排程內容。
note:# atq → 可看所有人排程
$ atq → 只能看user 本身的排程

(3) /etc/at.deny /etc/at.allow
/etc/at.deny 預設存在,/etc/at.allow 預設不存在,系統是預設所有人可執行at 排程。
若想拒絕特定使用者使用at指令,可將這些使用者寫入at.deny中。
# rm –f /etc/at.deny
→將at.deny刪除後,只有root可執行at排程。
若兩個空白檔案都存在,也只有root可執行at排程,因系統會先執行allow再執行deny。所以想讓特定使用者執行at指令時,可將其寫入at.allow中。

3.batch:在系統平均負載較低時執行排程。
$ batch

二. data backup stategy (策略):
1. cpio: copy files to and from archives
-o: creat a new archive.經常配合find 指令。
-i: extract from a archive.
-t: print contents.
-F: archive file.
Ex: 假設 /home/barry下有隱藏檔及file1.file2.dir等,現就對其執行備份工作:
# find /home/barry | cpio –oF /tmp/file.cpio 或
# find /home/barry | cpio –o > /tmp/file.cpio
# cpio –tF /tmp/file.cpio
→檢視file.cpio內的清單
註:若備份容量較大時,可考慮使用磁帶機。
       /dev/st0 (scsi tape 磁帶機),/dev/ht0為ide type。
       練習時也可拿floppy試試-- /dev/fd0。
備份完後,將barry目錄刪除:
home# rm –rf barry
最後在任意一個目錄下實施備份還原:
# cpio –iF /tmp/file.cpio 也可如下:
# cpio –i < /tmp/file.cpio
檢視看看資料是否有還原:
barry# ls –a

註: find後面若以絕對路徑表示,則以cpio執行備份還原時,會還原至原來路徑,像剛剛您備份了/home/barry在/tmp/file.cpio中,現在把barry刪除,然後用root身份在 /etc目錄下作備份還原時,會自動將barry還原至/home/barry目錄下,而tar就無法辦到。
     另外cpio經常配合另一顆硬碟或磁帶機作備份。

2. tar:
# tar zcvf /dev/fd0 /etc/fstab /var/named
# tar zxvf /dev/fd0

3. dd:
# dd if=/dev/fd0 of=files bs=512
→以 /dev/fd0代替std input,以files代替std output,其輸入輸出的block size 為512 bytes。
     # dd if=/etc/passwd of=/tmp/testfile bs=1024
# tar zcvf /dev/fd0 /etc/passwd /var/named 再執行
     # dd if=/dev/fd0 of=/tmp/tarball bs=512
此時若要看此tarball file的清單,需執行:
   # tar ztf /tmp/tarball

4. linux在備份時需注意事項:
(1) 瞭解欲備份哪些檔案,如/home./var/spool/mail./var/www 等等。
(2) 備份媒介為何?例如備份至另一顆硬碟、同硬碟不同分割區、CD-ROM、MO(磁光碟機)、磁帶機(ATAPI.SCSI)。
(3) 備份方式: 完全備份還是部分備份。
(4) 備份工具: tar.cpio.dd.…。
(5) 備份頻率。
     一般系統需備份檔案有:
/etc /home /var/spool/mail /boot /root /usr/local
而最需經常備份的目錄為 /etc,不需備份者 /dev /proc /mnt /tmp

三. System log files
1. /etc/syslog.conf 是syslogd執行程式所執行的主要設定檔,定義著系統的訊息類別所相對應的紀錄檔位置及名稱。
2. syslog.conf內容分三部份
(1) 訊息類別(message type):
authpriv (authentication private): client連server時,需經身份認證的訊息。
mail: 紀錄郵件訊息。
kern: 紀錄核心訊息。
cron: 執行排程的訊息。
local7: 開機訊息。
* : 泛指所有訊息類別。
uucp: unix to unix copy protocol.
(2) 訊息優先等級(message level):
由高至低順序為:
emerg→alert→crit→err or error→warn or warning→notice→info→debug
* : 代表所有訊息等級 。
(3) 紀錄檔位置及名稱 (log file location and name):
以下寫法,訊息類別及訊息優先等級間用」.」隔開,而兩訊息類別間用「;」區隔。
例. authpriv.* /var/log/secure
將client連線server時,需經身份認證的client端連線訊息,紀錄於/var/log/secure紀錄檔中。

*.emerg *
將所有緊急訊息類別通知每一個人。

local7.* /var/log/boot.log
將開機過程的所有訊息紀錄在 /var/log/boot.log

cron.* /var/log/cron
將排程執行紀錄於 /var/log/cron。

kern.info;kern.!err /var/adm/kernel-info
將核心訊息其優先等級在info(含)以上者,紀錄在kernel-info檔案,但不包括err(含)以上訊息等級,即info~warn。

mail.*;mail.!=info /var/log/maillog
除優先訊息等級為info外,其餘郵件訊息紀錄在/var/log/maillog。

*.info;mail.none;authpriv.none;cron.none /var/log/messages
不包括郵件訊息、連接server訊息、排程訊息,其餘所有訊息其優先等級在info(含)以上者,都紀錄在/var/log/messages。
   syslog.conf修改完後記得執行 /etc/rc.d/init.d/syslog restart,比如您在openlinux下多增加 /var/log/cron的紀錄檔後就要執行restart,接著要執行# /etc/rc.d/init.d/cron restart,因cron是新增的檔案,所以要讓cron認識他。

3. 紀錄檔對管理者而言非常的重要,由紀錄檔內,可找到系統發生錯誤的原因。另外像一些網路服務出問題時,也可由此找到答案。最後我們還可由此得知登入系統的相關資訊,藉此瞭解登入者的資訊。

四. logrotate: 
主程式 /usr/sbin/logrotate
在我們瞭解紀錄檔的重要性後,不知大家有沒有想過一個問題,系統的紀錄檔每天記載那麼多資訊,會不會哪天把整顆硬碟給塞爆了呢? 答案是否的,因系統會使用logrotate將紀錄檔進行輪替的工作,我們以 /var/log/cron來說,若系統設定最多只能保留四個輪替的檔案,即cron.1~cron.4,則在執行第五次輪替時,cron.4的內容會被擠掉,而不會讓紀錄內容一直累積下去。

1. /etc/logrotate.conf 內容:
weekly → 每星期進行一次rotate。
rotate 4 → 最多保留四個輪替檔。
create → 執行rotate後,建立一個新的空檔案。
compress → 輪替後的檔案是否被壓縮。
include /etc/logrotate.d →包含在logrotate.d目錄下的檔案,會主動被讀入logrotate.conf中。
/var/log/wtmp {
monthly
creat 0664 root utmp
rotate 1
}
→ /var/log/wtmp為一經編碼過的檔案,需使用last指令來顯示其內容。
{}內意思是說系統對登入檔wtmp每個月進行輪替一次,輪替完後會製造一新的空檔,其權限為0644,檔案擁有者為root,擁有群組為utmp,且輪替檔案只保留前一個月的備份。

2. 系統已自動將logrotate加入排程中(redhat):
/etc/cron.daily/logrotate 內容如下:
/usr/sbin/logrotate /etc/logrotate.conf
所以系統每天都會執行logrotate。
Openlinux:/etc/cron.d/Daily/40logrotate,而40logrotate為一soft link,
連結至 /etc/cron.d/scripts.d/logrotate,這個logrotate的內容如下:
exec /usr/sbin/logrotate /etc/config.d/logrotate

3. /etc/logrotate.d其下的檔案內容設定若與logrotate.conf有衝突,需以logrotate.d為主,logrotate.d沒寫到的部分才以logrotate.conf為主。

五. 登入的監控
這裡有三個檔案要介紹,他們都是經過編碼,需使用指令去讀取這些檔案的內容。
1. /var/log/lastlog (指令lastlog): 顯示使用者最後登入的時間,同時也將passwd檔案中的user列出,以瞭解從未登入的user名單。
2. /var/log/utmp或 /var/run/utmp (指令w,who): 顯示目前已經登入的使用者。
3. /var/log/wtmp(指令last): 顯示使用者登入、登出及登入至登出的存續時間。
˙當使用者登入時,login程式會去讀取lastlog的資料,將這次登入的時間地點寫進去。接著開啟utmp,把登入資料寫入其中,直到使用者登出後,才將資料從utmp中移除。最後開啟wtmp,把使用者在utmp中的資料寫入,而當使用者登出時會再寫一次,只不過這次會把使用者從登入到登出的存續時間寫入。

TOP

第八章 Modules And Kernel
一. Modules:
1. 前言:當我們在電腦上新增硬體時,必須要有此硬體的driver(驅動程式),才能讓此硬體於系統上正常運作。而在linux以前較不普及時,硬體廠商所提供的drivers for linux比起drivers for windows真是少得可憐,但隨著linux的漸受重視,這些硬體廠商現大都會附上drivers for linux。
一般較為普及的硬體周邊裝置,OS本身已包含了這些drivers。

2. linux系統內的周邊裝置,於 /dev下都有其代表裝置的檔案,例如:
軟碟機(Floppy Disk)→ /dev/fd0 /dev/fd1
IDE硬碟與CD-ROM→ /dev/hda ~ /dev/hdd
<note>若fstab內為 /dev/cdrom,mount時不能mount /dev/hdx,除非
# mount -t iso9660 /dev/hdd munt/cdrom才OK。
序列埠 (serial),如Modem→ /dev/ttyS0 (com1) /dev/ttyS1(com2)
平行埠 (parallel)如printer→ /dev/lp0 (LPT1) /dev/lp1 (LPT2)
SCSI HD→sda . sdb.…。
SCSI CD-ROM→scd0 . scd1。

3. linux的核心是以modules的方式來載入drivers及支援其它功能,其最大好處是當未使用到該功能時,核心不會主動載入,需要時才將其載入,如此可節省許多系統資源。

4. 模組設定檔: /etc/modules.conf 或 /etc/conf.modules ,視版本而定。
若有新的驅動程式想於開機時被核心載入,就可設定在這裡。
例:alias eth0 8139too=>alias告訴系統eth0 須8139too模組。此檔案內還可包括dma、ioport、IRQ訊息(options)。

5. /lib/modules/2.4.18-3 /
這個目錄下需留意的是kernel目錄及modules.dep檔案:
(1)kernel:此目錄下所列者為核心可使用的模組,其下目錄有drivers、fs、net等,請自行參考。
<note>模組檔案是以 」.o」 結尾,而在modules.conf內的modules不須要 」.o」,也就是寫模組名稱 (modules-name) 即可。
另外2.4.18-3 可用`uname –r`代替。
(2)modules.dep:顯示模組相依性的訊息。

6.模組相關指令
(1)lsmod:顯示核心目前有載入的模組,此指令與 /proc/modules的內容相同。
(2)insmod:載入模組,但不會載入相依模組。
-p僅測試模組能否載入,而不會真正載入。
例: # insmod –p fat
# insmod vfat
逕 會顯示錯誤訊息,因模組有相依性的關係,此時應先載入
        fat,然後vfat才能被成功載入。最後用lsmod作確定動作。

(3)rmmod:移除模組。# rmmod modules–name
(4)modprobe:載入模組及其相依模組,載入流程是先載入modules.dep內與此模組相依的模組後,再載入主要模組。
-l 列出系統可使用的模組,即列出位於 /lib/modules/2.4.18-3/kernel下的子目錄。
-c 列出系統有載入的模組,較lsmod詳細。
-r 移除多模組。
例:# modprobe vfat
# modprobe -l;modprobe -c
# modprobe -r fat msdos
     
(5)modinfo:顯示模組訊息。
例:# modinfo 81390too 顯示模組的作者、用途描述、路徑…。
# modinfo –d 8139too 只顯示用途的描述。
模組訊息中,有一行敘述為:
license GPL
逕 GPL 為General Public License (通用公共許可)的簡寫,它是一種軟體的版權模式,像linux就是以GPL版權模式對外發行的,也就是說任何人都可從網路上下載原始碼回來作修改,但修改完後,有義務將修改結果放置網路上讓人使用,這就是GPL的自由精神。
軟體雖經你修改,但版權並不屬於你的,而是要遵循原作者GPL的版權模式繼續沿用下去。

(6)depmod -a:當有改變模組相依性時,就要執行一次,以更新modules.dep。系統預設在開機時會自動執行。
補充:新增硬體時,若此硬體driver已編入核心或模組(外掛模組),則開機時,kudzu此硬體偵測程式會偵測到,並將此硬體modules自動載入(一般情況下)。

二. Kernel:
1. 核心是Linux作業系統的靈魂所在,其最主要工作為控制周邊硬體設備,如cpu、記憶體、硬碟、網路卡、音效卡…、還有像行程的管理、網路功能的支援等等,進而使這些硬體設備及相關服務能發揮其功能。
我們現在一般所謂的Linux distribution,即是在核心以外,另外包含了套件的整合、套件管理工具等,如此便成了Linux的Distribution。較著名的Linux Distribution如RedHat、Debian、SuSE、OpenLinux、Mandrake等等,但無論是哪種Distribution(套裝版本)皆使用相同的Linux核心。

2. 編譯核心的理由:
(1)當您使用的周邊裝置或須要的功能(如NTFS),預設的核心既沒將其編入核心,亦沒編成modules,此時便須重新編譯核心。
(2)若硬體設備只有新核心才支援時,便要下載新版的核心,進行升級編譯的動作。
(3)對於預設核心編譯太多用不到的功能,欲將此多餘功能取消時,就可重編核心,不過不建議如此作,因其對整體效能並無多大助益。
(4)特殊環境需求,例如一些商業套裝軟體系統。

3. 在未編譯核心前,可先瞭解一下預設核心的編譯狀況,若當初在安裝OS時,采全選安裝或手動安裝有勾選發展工具選項時,以redhat來說,在 /usr/src/linux.2.4.18-3/configs目錄下便有預設核心的概況,但若未勾選發展工具,也可在 /boot/config-2.4.18-3找到預設值,不過在 /usr/src下便找不到linux的字眼,此時可采光碟安裝(第二片),套件名稱為kernel-source。
以Openlinux來說,預設核心的編譯狀況是在 : /usr/src/linux/arch/i386/defconfig

4. # uname -r =>2.4.18-3
2→ 主版本
4→次版本
18→修訂版本
3→附版本
這裡只須留意第二個數字 (次版本),如其為奇數(如2.3、2.5)表為測試階段的版本,若為偶數,表經多次測試OK的穩定版本(如2.2、2.4)。
<note>在核心升級過程,切勿從2.2升級至2.4,因兩版本間已有所差異,函式庫亦有所不同,但若同為次版本升級則是可行,例如2.4.18升級至2.4.19。

5.最新核心訊息網站:
訪客無法瀏覽此圖片或連結,請先 註冊登入會員
訪客無法瀏覽此圖片或連結,請先 註冊登入會員 中山大學
訪客無法瀏覽此圖片或連結,請先 註冊登入會員

6.編譯核心:
假設系統原來核心版本為2.4.18-3,打算升級至2.4.19時
(1) root # wget訪客無法瀏覽此圖片或連結,請先 註冊登入會員
Enter後便可於root目錄下找到此核心的tarball。
(2) root # cd /usr/src 切換目錄至src下。
(3) src # tar zxvf /root/linux-2.4.19.tar.gz
→將tarball解開到src下,此時可發現有兩目錄,一為linux-2.4.18-3 (此即為當初安裝OS時,采全選安裝或手動安裝有勾選發展工具選項時,才有此目錄存在),一為linux.2.4.19。
(4) src # ln -s linux-2.4.19 linux
→建立連結,因編譯過程在linux目錄下編譯較不會有問題。
<note>若原先已有linux目錄存在,須用mv將其改名。
(5) src # cd linux =>切換至linux目錄下,準備進行編譯步驟。
(6) linux # make menuconfig =>進入編輯畫面(主選單)。
˙畫面底部有Select、Exit、Help三按鈕,可用tab鍵移動。
Select+Enter→進入子選單。
Exit+Enter→退至上一層。
Help+Enter→該選項的說明。
<note>在主選單(Main Menu)畫面時,選Exit+Enter後,系統會問您是否保存以上設定,選擇yes,則會於 /usr/src/linux下,產生一隱藏檔.config。
˙選項右邊有向右箭頭,表示其下尚有子選單。
˙選項右邊無箭頭時,左邊應有〔〕或<>,此時可搭配space或M.N.Y使用,以便將此項目括弧內設定成 」*」(編入核心)、M(編成外掛模組)或空白 (既不編入核心也不編成外掛模組)。
〔〕→其內不是空白就是*。
<>→其內可*、M、空白。
主選單的最下面有兩個選項:
(1) Load an Alternate Configuration File:
輸入替代檔名稱,例如可將別人編好的已解壓的核心檔案,download回來後附上檔名,並於此輸入。
(2) Save Configuration to an Alternate File:
您可在任何時候選此項 (預防不小心未存檔就退出),不過一般都在編譯完成才將以上設定保存在指定檔案(如 /tmp/barry),將來要是重新安裝OS時(設 /tmp/barry有備份起來),或設定核心選項後未保存就退出時,都可用(1)的Load選項,來套用當初的設定值。

˙編譯核心選項時,能編模組就編模組,以防編入核心項目太多,而使的將來無法製作開機片。除非是特殊效能,如網路功能等,或須此項目但無M可選時,才編成*。
˙編譯完成後,記得保存退出=>產生 /usr/src/linux-2.4.19/.config

設定核心選項時,須瞭解自己的硬體設備及所須功能譯,否則在reboot後會有錯誤訊息產生。
(7) linux # make dep
→建立相依關係。在編譯核心前需先建立起待會編譯核心時所需用到的相依函式庫。
(8) linux # make clean
→去除舊有資料設定。
(9) linux # make bzImage
→編譯 ( 建立 ) 核心,完成後可於 /usr/src/linux/arch/i386/boot下產生bzImage 檔案,這個檔案就是我們剛建立起來的新核心。
(10)linux # make modules
→編譯模組,如drivers、net、fs、kernel…。至於編譯時間端賴剛剛在設定核心時選擇模組數量多寡來決定。
(11)linux # make modules_install
→將編好模組安裝在 /lib/modules/2.4.19目錄下。
(7)~(11)完成後,可進行測試:
linux # make bzdisk
→將編好的核心放磁片內進行測試,完成後reboot,從軟碟開機,若一切正常,再進行以下步驟。
(12)linux # make install →將核心放硬碟 /boot內。此步驟等於以下組合:
cp /usr/src/linux/arch/i386/boot/ bzImage /boot/vmlinuz-2.4.19
ln -s /boot/vmlinuz-2.4.19 /boot/vmlinuz
cp /usr/src/linux/System.map /boot/System.map-2.4.19
ln -s /boot/System.map-2.4.19 /boot/System.map
最後再修改 /etc/lilo.conf或 /boot/grub/menu.lst,底下分別說明:

˙# vi /etc/lilo.conf
prompt
timeout=50
default=redhat
boot= /dev/hda
map= /boot/map
install= /boot/boot.b
message= /boot/message
lba32
image= /boot/vmlinuz-2.4.18-3
label=redhat
initrd= /boot/initrd-2.4.18-3.img
read-only
root= /dev/hda3
image= /boot/vmlinuz-2.4.19
label=redhat.new
initrd=/boot/initrd-2.4.19.img
read-only
root= /dev/hda3
other= /dev/hda1
lable=windows 2000
修改完存檔離開後,記得執行 # lilo -v –v

˙# vi /boot/grub/menu.lst
default=0
timeout=10
title redhat
root=(hd0,1)
kernel=/boot/vmlinuz-2.4.18-3 root=/dev/hda3
initrd=/boot/initrd-2.4.18-3.img
title redhat-new
root=(hd0,1)
kernel=/boot/vmlinuz-2.4.19 root=/dev/hda3
initrd=/boot/initrd-2.4.19.img
title windows
rootnoverify=(hd0,0)
chainloader +1
存檔離開後,下次重新開機時就可看到三個選單供您選擇。

TOP

7.編譯過程如有問題,大都卡在make bzImage、make modules,如遇Error結尾就要小心。
若碰到warning:kernel is too big for standalone boot from Floppy,表所編核心過大,裝不進磁片內,亦即無法製作開機片,故要刪除一些編入核心選項 」*」或將其改成M。
遇Unresolved symbol…錯誤訊息時,可能舊模組還在 /lib/modules下,故應將其改名,再執行make modules_install,也可試試在編譯選項時,Loadable module support內Set version information on all module symbols的 」*」取消。

8.當我們安裝好作業系統後,發覺系統預設沒把ntfs編進去,這時候可能就需重編核心了。我們以redhat 7.3為例來作說明:
# cd /usr/src
# cp –a linux-2.4.18-3 newlinux
# ln –s newlinux linux
# cd linux
# make menuconfig 逕將ntfs編進去,然後存檔離開。
# make dep
# make clean
# make bzImage
# make modules
# make modules_install 逕會產生2.4.18-3custom於 /lib/modules/ 之下。
# cd /lib/modules
# cp –a 2.4.18-3custom 2.4.18-3 直接用mv改名亦可。
這樣就算完成了,不必再執行make install,因我們目的只是要那個模組而已。
  
補充:1. kernel可編譯方式除make menuconfig外,尚有:
make config→逐行輸入設定項目,但無法往前修改。
make xconfig→在X-Window下的設定方式。
2.製作開機片:
# mkbootdisk --device /dev/fd0 2.4.19
→可用`uname –r`代替2.4.19。
開機片內有執行檔:boot.msg、intrd.img、ldlinux.sys、syslinux.cfg、vmlinuz。
3. # free→顯示記憶體訊息。

TOP

第九章  Shell Scripts
一. 何謂scripts :
將我們想要執行的一些內容,藉由程式的組合寫入一個檔案中,此檔案就稱之為scripts file。
藉由執行此scripts file,便可得到一連串執行的結果。
Scripts最基本的用法是將命令列上所輸入的連續指令統合於scripts中,只要執行此scripts就等於執行一連串的指令敘述。

二. 編寫scripts時的習慣做法
1. #!/bin/bash => 宣告使用的shell為bash,此為scripts的第一行敘述。
2. 註明此scripts的用途、簡易描述、作者、建檔日期等等。
3. 最後才開始編寫scripts。
4. 完成後記得將此scripts改成可執行:
# chmod 755 scripts 或 # chmod +x scripts,然後才可執行該scripts。
# ./scripts 亦可執行如下: # sh scripts
例. barry$ vi scriptfile
#!/bin/bash
# scriptfile : test
# author : barry
# date : 2002.3.10
echo 「Hello,everybody.」
echo –n 「my linux version is : 「
uname –r
→ 編輯好後,存檔離開。然後修改此scriptfile為可執行。
$ chmod +x scriptfile 修改完後就可執行試試。
$ ./scriptfile
Hello,everybody.
My linux version is : 2.4.18-3

Note : 執行scripts時,會由上至下,由左至右依序執行,但要是遇到迴圈或函式時,則為例外。
     if [ … ] 內,一般只能有一條件判斷式,而[…]與[…]間可用 || 或 && ( or.and ) 做複合式判斷。

三. 判斷式 :
1. 判斷檔案或目錄的運算式
-d 逕 dir -f 逕 file -r 逕 read -w 逕 write
-x 逕 execute -e 逕 exist -s 逕 size (檔案大小不等於0)
-u 逕 SUID -g 逕 SGID -k 逕 sticky bit
例. if [ -f /etc/passwd ];then
→ 如果passwd是檔案為真,然後就執行…。

2. 判斷數值的運算式 :
-eq 逕 等於 -ne 逕 不等於 -gt 逕 大於
-ge 逕 大於等於 -lt 逕 小於 -le 逕 小於等於
-a 逕 and -o 逕 or
例. $a = 3 –a $b = 5

3. 判斷字串的運算式 :
假設A.B為字串
A = B A != B
-z A 逕 如果A是空字串為真,…
-n B 逕 如果B非空字串為真,…
-a.-o同數值判斷式。


四. if 判斷式 : if…then…elif…then…else…fi
例. a=3
  b=5
if [ 「$a」 –gt 6 –o 「$b」 –le 3 ];then
echo 「it』s good.」
else
echo 「it』s bad.」
fi
→ 如果3>6或5≦3為真,則output screen: it』s good.
否則output screen: it』s bad.

例. a=mother
b=father
if [ 「$a = mother –a 「$b」 !=father ];then
echo 「the description is true.」;else
echo 「the description is false.」
fi

例. if [ -f /etc/passwd ];then
cp /etc/passwd .
echo 「copy /etc/passwd to here.」;else
echo 「the file does not exist.」
fi

五. while…do…done 當條件成立時執行迴圈,直到條件不成立為止。
例. x=0
while [ 「$x」 –le 10 ]
do
echo 「current value of x is : $x」
x=$(expr $x + 1)
sleep 2
done
說明 : # expr 6 逕 6
# expr 5 + 10 逕 15
# a=3
# b=$(expr $a + 5)
逕 上式可寫成 b=`expr $a + 5`
# echo $b 逕 8
# c=$(($a+$b))
逕 上式可寫成 c=$(expr $a + $b)=`expr $a + $b`
# echo $c 逕 11
sleep 2 為讓程式暫停兩秒再執行。
Note: until…do…done 是與while相反的語法,在此就不說明。

六. for…in…do…done :
for 變數名稱 in 變數值1 變數值2 … do…done
in後面接幾個變數值,迴圈便執行幾次。
例. for x in 5 15 20
do
if [ 「$x」 –lt 18 ];then
echo 「the value of x = $x」;else
echo 「the value of x is too big.」
fi
sleep 3
done

七. read 變數名稱:
執行scripts時若遇到read,會出現交談模式,等待您從鍵盤輸入,而所輸入
的內容,便是此變數名稱的變數值。
例. echo –n 「Enter your name : 「
read name
if [ -z 「$name」 ];then
echo 「you do not tell me your name.」
else
echo 「Hello!$name,how are you ?」
fi

八. case $變數名稱 in
變數值等於in後面所列選項中的其中一個時,便執行那一個選項的敘述,
一般常用來與read作搭配。
例. echo 「How old are you ?」
echo 「1. 15~20 years old」
echo 「2. 21~30 years old」
echo 「3. 31~50 years old」
echo –n 「Enter your choice : 「
read choice
case $choice in
1) echo 「you are too young.」;;
2) echo 「your experience is not enough.」;;
3) echo 「you have earned much money.」;;
*) echo 「see you next time.」;;
esac
說明: 選項中」 * 「表示您所輸入資料未包含在以上選項中,或者您根本未輸入您的選擇。
   另外要記得句子結尾加上」;;」,以作為該行的結束。

九. 函式:函式一般都是程式呼叫後才會執行。
例: user()
{
echo 「preparing to add a new user」
sleep 1
useradd
}
echo 「1. add user」
echo 「2. exit」
echo –n 「Enter your choice : 「
read choice
case $choice in
1) user;;
2) exit;;
*) echo 「you do not choose.」
esac

十. echo $# 逕 表示在命令列上輸入scripts名稱後,scripts後面共接幾個引數。
echo $* 逕 顯示scripts後所接的引數名稱。
  echo $1 逕 表示scripts後面所接的第一個引數名稱。可以到 $9。
  echo $0 逕 主程式名稱。
  echo $$ 逕 當前shell的pid。
echo $? 逕 返回狀態,也就是表示最後一個程式的狀態,若顯示為0,一般表示沒有錯誤,若顯示為其他數字表示此執行程式有問題。
       至於會顯示什麼數字,就要看如何設計scripts了。

例. if [ 「$# -ne 1 ];then
echo 「usage: $0」;else
echo 「the argument is $1」
fi

十一. 例: x=5
y=10
if [ 「$x –eq 5 ]&&[ 「$y」 –eq 10 ];then
echo 「both condition is true.」;else
echo 「the conditions are not true.」
fi

補:# CMD1 && CMD2 逕 CMD2 is executed when CMD1 is true.
# CMD1 || CMD2 逕 CMD2 is executed when CMD1 is false.
# CMD1&CMD2&CMD3
→CMD1及CMD2為背景執行,只有CMD3為前景執行。
# CMD1;CMD2;CMD3
→CMD1執行完執行CMD2,CMD2執行完執行CMD3,不論程式有無存在,都會依序執行。

TOP

第十章 Networking Fundamentals
一. IP (Internet Protocol:網際網路通訊協定)簡介
1. IP位址:即經常用以連線上網的一串數字碼,這串數字碼可讓電腦在internet中相互辨識,以達訊息資料傳送的目的,此數字碼便是IP位址。
目前IP位址有些不同版本,現大家所使用的為第四版的IP位址,即所謂的IPv4,至今已使用30多年了,另有資料顯示IPv4可能在2005~2010年用完,故IPv6應運而生。
IPv4位址由32bits(位元)所構成,可組成2(32)(注2的32次方)個位址,並以八位元為單位,將32位元分4部份,以十進位表示,而形成如61.219.18.224這類的表示法,若將其用二進位表示 :
00111101.11011011.00010010.11100000
此二進位數字即是網路上實際傳輸的數字串。
至於IPv6則由32bits→128bits,可提供未來數十年的IP位址需求。

2. IP位址分配由NIC (Network Information Center)美國網路資訊中心負責,再由各處中心細分下去。
IP位址分兩部份:Network bits(網路位元)、Host bits(主機位元),網路位元是用來區分是否位於同網段或不同網段,主機位元則用來識別網路段內的電腦主機。

3. IPv4將IP位址分A、B、C、D、E五個類型 (classA ~ classE),左邊第一個bit為0者→classA,為10者→classB,為110者→classC,為1110者→classD,為1111者→classE。
classA→ 8 Network bits+24 Host bits
classB→16 Network bits+16 Host bits
classC→24 Network bits+ 8 Host bits
classD及classE分別作多點群播 (Multicast一對多資料傳送:class D) 及提供實驗網路使用(classE)。

classA:0XXXXXXX.XXXXXXXX.XXXXXXXX.XXXXXXXX
Network bits Host bits
Network bits共有27=128種組合,即128個網路段(網域),換算成十進位=>0~127,扣除0 (用來簡化IP必須處理的路徑資訊)及127兩個特殊用途外,真正可用為1~126。
Host bits共224種組合,即能提供224-2個主機IP。
在Host bits皆為0時,代表該網段位址(網域位址),皆為1時,代表廣播位址(發送廣播封包時使用),所以可提供的主機IP為224-2。

classB:10XXXXXX.XXXXXXXX.XXXXXXXX.XXXXXXXX
Network bits Host bits
可提供214個網路段,每網段可提供216-2個主機IP。
classC:110XXXXX.XXXXXXXX.XXXXXXXX.XXXXXXXX
Network bits Host bits
可提供221網路段,每網路段提供28-2個主機IP。
127.0.0.1是保留做Loop Back Test(回路測試),即自己將訊息送回本身電腦(Local),以瞭解TCP/IP是否設定OK。
例:$ ping 127.0.0.1
Private IP (私有IP、虛擬IP)
10.0.0.0 ~ 10.255.255.255
172.16.0.0 ~ 172.31.255.255
192.168.0.0 ~ 192.168.255.255
以上這些IP是提供做企業內部網路架構之IP設定範圍,可不與外界連線,亦可透過具NAT功能的Router或主機來與internet連線溝通。

4. 網路遮罩 (Network Mask)
用來確認不同的IP位址是否屬於同網段的辨識方法,即是由Network Mask來達成。
將IP位址中的Network bits設為1,Host bits設為0,而能得到網路遮罩,例如classA為255.0.0.0,classB為255.255.0.0,classC為255.255.255.0。

5. 子網路規劃:
如前所述,classA每一網段(網域)擁有224-2個IP位址,classB每一網段擁有216-2個IP位址,如此多的IP位址若無善加規劃,便易形成IP位址浪費與通訊不佳的情形,子網路 (subnet)規劃的需求便於此時應運而生。
所謂子網路切割即是將一個網路段(網域)底下再切割出子網路段,並藉由向Host bits借位元的方式來達成,如此使IP位址區分成網路位元、子網路位元及主機位元三部份。其中網路位元由NIC分配,子網路位元及主機位元則由該網段的擁有者逕行分配。
向Host bits借位元數愈多,所能區分的子網數也愈多。
如:172.16.x.x網段,向Host bits借三位元:
10101100.00010000.XXX XXXXX.XXXXXXXX
網路位元 子網位元 主機位元
網路位元向主機位元借位後,可切成23=8個子網段,每個子網段可用的IP位址為213-2 (Host bits為0及1扣除)。
其Sub-net Mask (子網遮罩):11111111.11111111.11100000.00000000
換算成十進位就等於255.255.224.0。
第一段:10101100.00010000.00000000.00000001

10101100.00010000.00011111.11111110
可分配IP位址為172.16.0.1~172.16.31.254/19
子網段:172.16.0.0 廣播:172.16.31.255

第二段:10101100.00010000.00100000.00000001

10101100.00010000.00111111.11111110
可分配IP位址為:172.16.32.1~172.16.63.254
子網段:172.16.32.0 廣播:172.16.63.255

第三段:172.16.64.1~172.16.95.254
子網段:172.16.64.0 廣播:172.16.95.255


第八段:172.16.224.1~172.16.255.254
子網段:172.16.224.0 廣播:172.16.255.255
此八個子網段中,由於class對子網規劃的限制,使其最前段與最後段不能使用,故實際只有6個子網段,不過現在好像已解除這種限制了。

6. CIDR(Classless Inter-Domain Routing):不分級的網域尋徑(在CIDR機制下,子網規劃時的所有子網路段均可使用)
目前可取得的IP位址都屬於C class,但一個class C的網路段只能提供254個IP位址,萬一哪天覺得不夠使用時,須再申請數個class C網路段,同時須添購許多路由器 (此路由器須支援CIDR),如此作法可能因網段過多而影向路由器的執行效率,為了解決此一問題,網路工程策進會便提出了CIDR架構,簡單說,CIDR就是將幾個小網路段進行整合工作。
例:將classC,net mask 255.255.255.0的幾個網段進行CIDR整合:
210.10.36.x=>11010010.00001010.00100100.XXXXXXXX
210.10.37.x=>11010010.00001010.00100101.XXXXXXXX
210.10.38.x=>11010010.00001010.00100110.XXXXXXXX
210.10.39.x=>11010010.00001010.00100111.XXXXXXXX
合併之後,有10個位元屬於變動位元,因此歸類為主機位元,其他22個位元就屬於網路位元,所以 Net Mask 255.255.252.0。同樣道理,將
主機位元設為0,就可得到網域位址→210.10.36.0,我們可用下式來表
式: 210.10.36.0/22。

二. 網路設定檔:
1. /etc/sysconfig/network-scripts
這個目錄大都是與網路介面有關係的設定,我們以其下的一個檔案為例:
# vi ifcfg-eth0
DEVICE=eth0 逕 指定第一張網卡的網路介面。
BOOTPROTO=static 逕 靜態設定ip位址,若使用動態ip則設dhcp。
IPADDR=192.168.2.1 逕 ip位址。
NETMASK=255.255.255.0 逕 網路遮罩。
BROADCAST=192.168.2.255 逕 廣播位址。
NETWORK=192.168.2.0 逕 網路位址。
ONBOOT=yes 逕 開機時啟動介面。

另外像ifup及ifdown是兩支很好用的script,透過它們,可輕易的啟動或關閉網路介面,例如:
# ifdown eth0
# ifup eth1
逕 記得使用這兩個script時,於network-scripts目錄下需存在相關檔案
如ifcfg-eth0、ifcfg-eth1才行,否則只能使用ifconfig eth0 down及
ifconfig eth1 up。

2. /etc/sysconfig/network
這是一個檔案,主要是設定啟動網路功能及主機名稱的地方。其內容大致如下:
NETWORKING=yes 逕 啟動網路功能。
HOSTNAME=redhat73 逕 設定主機名稱。
FORWARD_IPV4=yes 逕 啟動路由功能。
GATEWAY=192.168.2.254 逕 default gateway的位址。
GATEWAYDEV=eth0 逕 連接default gateway的網路介面。
在redhat 7.3 中,FORWARD_IPV4更改過後,不能發揮功用,所以要是想啟動路由,可從以下幾個地方著手:
˙# echo 「1」 > /proc/sys/net/ipv4/ip_forward
˙# vi /etc/sysctl.conf
net.ipv4.ip_forward=1
˙利用linuxconf或netconfig工具,將enable routing 打上」*」。
Note:在Openlinux下,gateway需設定在 /etc/sysconfig/network-scripts
的ifcfg-eth0里面,若設在network內會無效。
      而redhat要是兩者都設,會以network-scripts為主。

TOP

三. 在文字介面下的基本網路偵測指令:
1. ping:當傳送端下ping指令ping對方IP位址或FQDN時,事實上就是送出一個Echo Request訊息給目的端,而在目的端收到訊息後,會送出Echo Reply給傳送端,但若傳送端ping不到對方主機,則路由器會送出一個Destination Unreachable給傳送端。
註:ICMP (Internet Control Message Protocol)共有10餘種訊息類別,Echo Request屬於type8,Echo Reply屬於type0,而Destination Unreachable為type3。
例:# ping tw.yahoo.com
# ping 168.95.1.1
# ping -c 5 168.95.1.1

2. ifconfig:查看網路界面的資料訊息及設定網路界面。
例:# ifconfig =>顯示已啟動界面的資料訊息。
# ifconfig -a =>未啟動界面也顯示。
# ifconfig eth0 192.168.1.1 netmask 255.255.255.0 broadcast \ 192.168.1.255
=>設定eth0的IP位址、網路遮罩及廣播位址。此臨時性的設定,在reboot後會失效。
# ifconfig eth1
=>檢視eth1界面。
# ifconfig eth0 down
=>關閉eth0界面。
# ifconfig eth0 up
=>啟動eth0界面。
上式可用ifup及ifdown代替,如 # ifup eth0
再來我們看看如何在一網路卡(界面)上設定多IP位址 :
例:# ifconfig eth0:0 192.168.1.2 netmask 255.255.255.0
# ifconfig eth0:1 192.168.2.2 netmask 255.255.255.0
說明: 使用ifup.ifdown時,網卡界面的關聯性檔案須存在才能使用此兩個指令,比如現在要使用ifdown來關閉eth1,則於 /etc/sysconfig/network-scripts目錄下,須存在ifcfg-eth1的設定檔才行,所以像eth0:0或eth0:1在此目錄下找不到,故不適用於ifup及ifdown。

3. route:顯示或異動routing table。
在命令列下執行 # route可顯示routing table如下:
Destination Gateway Genmask Flags Iface
61.219.18.0 * 255.255.255.0 U eth0
192.168.1.0 * 255.255.255.0 U eth1
127.0.0.1 * 255.0.0.0 U lo
default 61-219-18-254.H 0.0.0.0 UG eth0
說明: Destination:要到達的目的網段或目的主機。
例如要到內部192.168.1.10主機時,就可適用192.168.1.0那一行的定義。而Gateway為」*」,表示不會使用到gateway。假使現在我們要到達的目的端,在Destination下找不到時,就會使用default那一行的定義,比如在連internet上的網站時,都是使用default。
Flags:U→up,代表路由已啟動。
H→host,代表Destination是主機。
G→gateway,代表default gateway。
# route –n
→ 以IP位址顯示routing table內容。
# route add –net 192.168.4.0 netmask 255.255.255.0 gw 192.168.1.254 \
dev eth0
→ 對網路界面eth0增加一網路段的路由資訊。
# route add –host 192.168.1.11 dev eth0
→ 新增主機方式。若於 /etc/hosts內設定192.168.1.11 redhat後,用# route可看到於Destination下多一個redhat,此時改用# route –n此redhat變成192.168.1.11,而default變成0.0.0.0。
# route add default gw 192.168.1.254 dev eth0
→ 設定DG,當找不到路徑時,會使用此預設閘道器。
用# route看時,會列在default那一行。

範例:
環境: 以linux做router,其上有兩網卡,
eth0逕192.168.1.254,連接client for windows (192.168.1.10)
eth1逕192.168.100.254,連接client for linux (192.168.100.10)
要如何設定才能讓兩台電腦彼此能夠溝通?
說明: ˙首先Router要啟動路由功能,其方式有二:
法一: echo 」1」 > /proc/sys/net/ipv4/ip_forward
法二: # linuxconf
逕 選擇Routing and gateways,然後進入set defaults,並設定啟動。
˙client for linux:
# route add –net 192.168.1.0 netmask 255.255.255.0 \
gw 192.168.100.254 dev eth0
˙client for windows:
於預設閘道處設定:192.168.1.254
   以上都設定完成後,client端彼此互ping看看能否成功。

4. traceroute (windows為tracert):
顯示從來源端至目的端所經節點。
例:# traceroute 168.95.1.1
# traceroute 訪客無法瀏覽此圖片或連結,請先 註冊登入會員

5. netstat:此指令功能非常強大,可顯示routing table、網路界面訊息及監控網路狀態。
以下所列為指令常用參數:
-a:顯示所有網路狀態,不論socket是否listen。
-n:預設是以主機名稱為服務名稱顯示於內容上,用-n後,會以IP位址及port number來代替。
-r:顯示routing table。
-i:顯示界面訊息。
-l:只顯示目前在listen的socket。
-p:顯示PID及程式名稱。
-t:只顯示tcp相關socket。
-u:只顯示udp相關socket。
例:# netstat -a
# netstat -an
# netstat -r (-i)
# netstat -tl
# netstat -anp∣less

TOP

第十一章 Inetd Super Server
一. Daemon:常駐程式
在Linux 系統上,所提供的各種網路服務,都是以daemon的方式進行。
舉個例子:若現在有一client想瀏覽架設在Server上的網站,於是輸入網址,此時Server上的daemon ( /usr/sbin/httpd ) 監聽 ( listen ) 到其所負責的80 port有需求進來了,就馬上去執行相關服務,以回應client的需求。
所以當系統提供網路服務時,是讓某個daemon常駐在系統內聆聽某個port,一旦聆聽到有需求進來時,便可馬上提供服務。現問題就來了,若是每個服務,daemon都須常駐系統的話,會吃掉很多記憶體的資源,增加系統負載,那要怎麼辦呢 ? 還好有一super daemon叫做inetd,可解決此一難題。

二. super daemon-inetd ( Internet daemon)
inetd是負責幫那些平常不太用得到的服務做listen,如telnet、wu-ftpd、finger、talk、rsh、…等等,我們可於 /etc/xinetd.d ( openlinux為 /etc/inet.d ) 目錄下找到相關資訊。而這些平常不常使用的服務是呈現休息狀態,其完全依賴super daemon幫它們做listen,只有當client有需求時,inetd才會去呼叫它們。所以inetd的工作就是listen系統平時較不常使用服務的相關port,當需求進來時才適時呼叫某個程式進行相關服務。

一般系統啟動相關網路服務方式有兩種:
一種為standalone,就是常駐在記憶體內listen的程式,平時無論有無需求處理,都會佔用一定的系統資源。
另一種就是inetd,當inetd發現有需求進來時,會先檢查tcp wrapper的設定檔 /etc/hosts.allow及 /etc/hosts.deny ( 由 /usr/sbin/tcpd執行 ),通過後才開始呼叫相關主程式。
standalone較適合一些經常使用的服務,如Web Server、mail Server、DHCP、DNS Server等。
inetd較適合一些不常使用的服務,如ftp Server、telnet、ssh、talk等。

三. 相關設定檔:
1. /etc/services:將系統所提供的服務名稱及其相對應的port列出,一般較常看到的有ftp:20.21,ssh:22,telnet:23,smtp:25,domain:53(DNS),http:80,pop3:110,imap:143,…。
事實上,這個檔案內的port number是可以被修改的,例如可將telnet由23改成2300,但因23是內定值,改成2300後,若是client要telnet你的主機時,便要指定port為2300。
這裡有一點要注意,只有root能使用低於1024的port number,至於client連線至Server所使用的port,一般都是系統隨機使用1024~65535的port number。

2. /etc/xinetd.conf ( openlinux: /etc/inetd.conf ) 定義所有經由inetd super
daemon來提供服務的設定:
defaults

instances = 60
log_type = SYSLOG authpriv
log_on_success = HOST PID
log_on_failure = HOST
cps = 25 30

說明 :
instances:設定單一服務在同一時間所能提供最大連線數60,若設定UNLIMITED則無連線數限制。
      這裡的設定,主要是用來防止dos之類的中斷攻擊。
log_type:表示透過syslogd的執行來做記錄,而authpriv在第七章已介紹過,代表與認證相關的訊息類別。
log_on_success:若client能成功連上server,就會記錄client主機位址及行程PID。
log_on_failure:若連線失敗則只記錄client主機位址。
cps:第一個數字25表示每秒能掌控的連線數,若超過25則連線暫停。第二個數字30表示從連線暫停到重新啟動服務的時間為30秒。
檔案最後尚有一行敘述:
includedir /etc/xinetd.d
代表所有使用inetd daemon的服務,其所在的目錄位置。
補充: inetd是舊版本所使用的名稱,RedHat 7以後皆以xinetd來取代inetd,故xinetd為一加強型的inetd daemon程式,並內建有tcp wrapper功能。

3. /etc/xinetd.d (其下檔案的格式 #man xinetd.conf) (redhat)
我們以telnet做例子:
# vi /etc/xinetd.d/telnet
service telnet  服務名稱為telnet,須與 /etc/services內的名稱一致。

disables = yes 欲接受連線時,要將yes改no。
socket_ type = stream 連線類型。TCP為stream,UDP為datagram。
wait = no 不須等待上一個請求結束,就可執行。
一般stream選擇使用no。
user = root 啟動服務程式的身份。
server = /usr/sbin/in.telnetd  執行主程式。
log_on_failure += USERID   在原先設定基礎上再加上UID。
}
修改完後,記得執行:
# service xinetd restart 或
# /etc/rc.d/init.d/xinetd restart 或
# kill –HUP `cat /var/run/xinetd.pid`
# kill –HUP `pidof xinetd`

/etc/inet.d (openlinux)
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
→ 服務名稱 (service)為telnet,使用tcp協定的連線類型為stream,並選用nowait。執行程式時的身份為root。採用Tcp Wrapper機制,即 先交由 /usr/sbin/tcpd檢視 /etc/hosts.allow、/etc/hosts.deny,確定通過後才呼叫後面的程式執行相關服務。
修改完後,執行以下任何一個皆可:
# /etc/rc.d/init.d/inet restart
# kill –HUP `cat /var/run/inetd.pid`
# kill –HUP `pidof inetd`

4. Tcp Wrapper:
主設定檔: /etc/hosts.allow及 /etc/hosts.deny。
在inetd時代,tcp wrapper與inetd整合方式是先由 /usr/sbin/tcpd程式檢查hosts.allow及hosts.deny,通過後才呼叫其後所指定的程式執行。
例:finger stream tcp nowait root /usr/sbin/tcpd in.fingerd而到了xinetd時 ( 加強型inetd ),內定就已具備tcp wrapper功能。

tcpd執行順序會先檢查hosts.allow再來才是hosts.deny,只要有符合設定的要求,便不會再往下檢查,所以一般我們習慣做法是將那些要提供的服務及允許的連線寫入hosts.allow,而在hosts.deny內則設定:
ALL:ALL
「:」左邊為服務程式名稱,須與xinetd設定檔所指定的server名稱一致。
「:」右邊為允許client連線的設定,型態可以是FQDN、IP位址、小數點後加domain name、 IP後加小數點 (如.domain.com.tw及61.221.37.)也可用61.221.37.0/255.255.255.0但不能用61.221.37.0/24。
其它:LOCAL:不含小數點的主機名稱(本地端主機)。
UNKNOWN:查詢不到的user、IP、hostname。
KNOWN:查詢得到的user、IP、hostname。
PARANOID:正反解不一致的連線端主機,即主機名稱與IP位址不符。
範例:
# vi /etc/hosts.allow
in.telnetd,ipop3d: LOCAL,.domain.com.tw
=>in.telnetd及ipop3d的服務,只開放給本地端不含小數點的主機及以.domain.com.tw做結尾的主機使用。
以上設定中的」,」可用空白鍵代替 → LOCAL .domain.com.tw

範例:
# vi /etc/hosts.allow
ALL EXCEPT in.telnetd: 192.168.2. .domain.com.tw
=>除in.telnetd外,所有由inetd所啟動的服務,允許192.168.2做開頭及 .bemost.com.tw做結尾的主機連線 (改完即刻生效)。

Note: tcp wrapper過濾機制,主要是使用 /etc/hosts.allow、/etc/hosts.deny這兩個檔案的設定,所以只能對透過inetd啟動的程式有效。

結論:以telnet為例,當client端有telnet需求進來時,會由負責23 port的inetd出面接洽,接著由 /etc/services中找出23 port 所對應的服務稱為何,再到 /etc/xinetd.d中尋找與此服務名稱相同者,找到後便執行該行敘述。最後在通過tcp wrapper機制後,才開始呼叫後面的服務程式執行相關的服務。

實作:在不更改telnet的port number下,如何替telnet多設定一個port number為2000呢?
1. /etc/services 做相關設定。
2. /etc/xinetd.d ( /etc/inet.d )目錄下建立一檔案,檔名自取。
3. 修改該檔案內容。
4. 重新執行inetd ( xinetd )。

TOP

 20 12
發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。