[ 上一頁 ] [ 目錄 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ A ] [ 下一頁 ]


Debian 參考手冊
第 8 章 - Debian技巧


8.1 啟動系統

參閱 LDP BootPrompt-HOWTO獲得有關系統提示的詳細資訊。


8.1.1 「我忘了root密碼!」(1)

只要能存取控制台 (console) 鍵盤,不需要 root 密碼就可以啟動系統登入到 root 帳號。(假設 BIOS 或 lilo 之類的啟動引導器在啟動時不需要密碼。)

整個過程不需要另外的開機軟碟或對 BIOS 設定進行修改。在此,「Linux」只有是一個標簽,它代表啟動 Debian 預設值安裝的 Linux 核心。

lilo 啟動螢幕中,一但出現boot:(對某些系統而言,必須按下shift鍵以阻止自動啟動以及當 lilo 使用 framebuffer 時,您必須按下 "TAB" 來查詢所輸入的參數),就輸入:

     boot: Linux init=/bin/sh

它會指示系統啟動核心後執行 /bin/sh 而不是 init。現在你已獲得 root 特權和 root shell。由於目前的/是以唯讀方式掛載,而其它的硬碟分區均未掛載,故你必須完成下列步驟才能獲得一個有適當功\能的系統。

     init-2.03# mount -n -o remount,rw /
     init-2.03# mount -avt nonfs,noproc,nosmbfs
     init-2.03# cd /etc
     init-2.03# vi passwd
     init-2.03# vi shadow

(如果在 /etc/passwd 檔案中所有使用者的第二個網域的資料為「x」,就表明系統使用了影子密碼,必隅虓編輯/etc/shadow。)要刪除root密碼,請編輯密碼檔案中第二個資料網域,將它設定為空白。重啟系統不用密碼就能登入到 root。當系統啟動進入 runlevel 1 時,Debian(至少是Potato以後的版本)需要密碼,一些較老的版本則不需要。

/bin/ 下裝一個小編輯器是個好習慣,因為有時 /usr 是無法存取的(參閱應急的編輯器, 第 11.2 節)。

如果安裝 sash 套服軟體,當系統無法啟動時,還可執行:

     boot: Linux init=/bin/sash

/bin/sh 無法使用時,sash 可作為 sh 的交談式替代品,它是靜態連結,內建了許多標準工具(在系統提示符下輸入「help」可獲得參考清單)。


8.1.2 「我忘了root密碼!」(2)

從急救 boot/root 磁碟啟動系統。假設 /dev/hda3 是原始 root 分區,可用下面的方法編輯密碼檔案,與上述方法一樣容易。

     # mkdir fixit
     # mount /dev/hda3 fixit
     # cd fixit/etc
     # vi shadow
     # vi passwd

與上面的方法相比,該方法的好處在於不需要知道 lilo 密碼(如果有的話)。但如果系統沒有預先設定為從軟式磁碟機或 CD 啟動,就需要存取 BIOS 的權限。


8.1.3 無法啟動系統

沒在安裝過程中製作開機軟碟?沒關係。如果 lilo 損壞了,從 Debian 安裝套件中拿出開機軟碟,用它來啟動系統。假設你的 root 分割區在 /dev/hda12,你想進入runlevel 3,在啟動提示符後輸入:

     boot: rescue root=/dev/hda12 3

接下來,系統使用軟式磁碟機上的核心啟動,你可登入到一個幾乎擁有全部功\能的系統了。 (可能有少量特性或模組無法使用。)

如果系統已經崩潰,亦可參閱把套件安裝到一個無法開機的系統, 第 6.3.6 節

如果想做張自訂開機軟碟,參閱急救磁碟 (rescue disk) 中的 readme.txt 文件。


8.1.4 「我不想直接啟動到 X!」

unstable/sid 很有趣,但在啟動進程中執行不穩定的xdmgdmkdmwdm會讓你焦頭爛額。

首先,在啟動提示符後輸入如下指令獲得 root shell:

     boot: Linux vga=normal s

其中,Linux代表你要啟動的核心對映,「vga=normal」告訴lilo在普通VGA螢幕下執行,「s」(或「S」)是傳給init的參數,告訴它進入單使用者模式。在提示符後輸入root密碼。

有多種方法禁用X啟動deaemons:

其中,rc2.d 的檔案的編號必須與/etc/inittab中指定的runlevel一致。?dm表示您需要多次執行這些命令來選擇xdmgdmkdmwdm

在Debian下只有第一種方法「最正確」。最後一種方法比較簡單但只適用於Debian,而且還需要使用dpkg-reconfigure重新設定 display manager。其它方法都是通用的中止daemons的方法。

你仍可在任何控制台 (console) shell中輸入startx啟動 X。


8.1.5 其它用於啟動提示的技巧

使用 lilo 啟動提示,可指定系統啟動到特定的 runlevel 和組態。 詳情參閱BootPrompt-HOWTO (LDP)。

如果希望系統啟動到runlevel 4,可以lilo啟動提示後輸入:

     boot: Linux 4

如果希望系統啟動到正常功\能的單使用者模式,而且你知道 root 密碼,可在 lilo啟動提示後輸入下列任一參數。

     boot: Linux S
     boot: Linux 1
     boot: Linux -s

如果希望系統以少於實際記憶體數的記憶體啟動(也就是說機器有 64MB 記憶體,只分配 48MB 給系統使用),在lilo啟動提示符後輸入:

     boot: Linux mem=48M

注意,不要指定大於實際記憶體數的記憶體,否則核心會崩潰。如果你有多於 64MB 的記憶體,如 128MB ,應在系統啟動時執行 mem=128M 或在 /etc/lilo.conf 中添加類似的指令行,否則舊核心或使用舊 BIOS 的主板將無法使用大於64MB的記憶體。


8.1.6 設定 GRUB 啟動參數

GRUB 是 Hurd 計畫開發的新型啟動管理器,比 Lilo 更靈活,不過啟動參數也與之稍有不同。

     grub> find /vmlinuz
     grub> root (hd0,0)
     grub> kernel /vmlinuz root=/dev/hda1
     grub> initrd /initrd
     grub> boot

請注意 Hurd 中的裝置名稱:

     HURD/GRUB           Linux               MS-DOS/Windows
      (fd0)               /dev/fd0            A:
      (hd0,0)             /dev/hda1           C: (usually)
      (hd0,3)             /dev/hda4           F: (usually)
      (hd1,3)             /dev/hdb4           ?

詳情參閱 /usr/share/doc/grub/README.Debian.gz/usr/share/doc/grub-doc/html/


8.2 活動記錄


8.2.1 記錄shell活動

比起普通的個人電腦環境,Unix環境的系統管理包括了更多細致的工作。必須掌握所有基本的群組態方法以便進行系統故障恢復。基於X11的GUI群組態工具看上去又好又方便,但不適用於緊急狀況。

記錄 shell 活動是個好習慣,特別是 root 使用者。

Emacs:使用M-x shell在快取區中開始記錄,使用C-x C-w將快取區中的記錄寫入檔案。

Shell:使用screen指令和「^A H」,參閱screen來切換 console, 第 8.6.28 節或使用script指令:

     $ script
     Script started, file is typescript
      ... do whatever ...
      Ctrl-D
     $ col -bx <typescript >savefile
     $ vi savefile

還可使用下面的方法:

     $ bash -i 2>&1 | tee typescript

8.2.2 記錄 X 操作

如果需要 X 套用程式的操作記錄圖,內含 xterm ,可使用gimp(GUI)。它可以對每個視窗或整個螢幕拍攝快照。還可以使用 xwdxbase-clients)、importimagemagick)和 scrotscrot)。


8.3 拷貝及建立子目錄

這些複製和存檔指令提供了備份整個系統和檔案的基礎。the example scriptsbackup 指令為一個簡單的備份 scripit 範例。


8.3.1 拷貝整個子目錄的基本指令

如果想重新整理檔案群組織結構,可使用下面的方法移動檔案及檔案連結:

     標準方法:
     # cp -a /source/directory /dest/directory # requires GNU cp
     # (cd /source/directory && tar cf - . ) | \
             (cd /dest/directory && tar xvfp - )
     如果包括硬連結,則需要更嚴謹的方法:
     # cd /path/to/old/directory
     # find . -depth -print0 | afio -p -xv -0a /mount/point/of/new/directory
     如果是遠端操作:
     # (cd /source/directory && tar cf - . ) | \
             ssh user@host.dom (cd /dest/directory && tar xvfp - )
     如果沒有連結檔案:
     # scp -pr user1@host1.dom:/source/directory \
               user2@host2.dom:/dest/directory

下面的有關拷貝整個子目錄的訊息由 Manoj Srivastavasrivasta@debian.org <srivasta@debian.org>發表於debian-user@lists.debian.org。


8.3.2 cp

傳統上,cp並不能真正完成這個工作,因為它既沒對符號連結進行區別對待,又不能儲存硬連結。另一件需要注意的事就是稀疏檔案(有洞的檔案)。

GNU cp克服了這缺陷,然而對於非 GNU 系統,cp仍存在問題。而且使用cp無法生成小巧輕便的文文件案包。

     % cp -a . newdir

8.3.3 tar

Tar 克服了cp在處理符號連結時出現的問題,然而,cpio可以處理特殊檔案,傳統的tar卻不行。

對於某個有多重硬連結的檔案,tar的處理方法是只將其中一個連結拷貝到磁帶上,所以日後你只能找回拷貝中所保留那個的連結所指的檔案;cpio會為每個連結做一個拷貝,日後你可以找回任意一個連結所指的檔案。

在 Potato 和 Woody 中,操作.bz2檔案的tar指令參數有所變化,所以請在script中使用--bzip2而不要簡寫為-I(Potato)或-j(Woody)。


8.3.4 pax

全新的,符合POSIX(IEEE Std 1003.2-1992, pages 380–388 (section 4.48) and pages 936–940 (section E.4.48))標準的,眾望所歸的,輕便的文文件案包交互工具。pax可以讀、寫以及列出文文件案包的成員,並能拷貝檔案目錄層次。pax的操作獨立於特定的文文件案包格式,支援各種各樣不同的文文件案包格式。

pax工具剛剛成形,還很新。

     # apt-get install pax
     $ pax -rw -p e . newdir
      or
     $ find . -depth  | pax -rw -p e  newdir

8.3.5 cpio

cpiocpiotar文文件案包提取/放入檔案。該文文件案包可以是硬碟上的另一個檔案,也可以是磁帶或管道。

     $ find . -depth -print0 | cpio --null --sparse -pvd new-dir

8.3.6 afio

afio更善於處理cpio格式的文文件案包。通常它比cpio要快,且提供了更多磁帶選項,並且能更友好的處理有訛誤的輸入資料。它支援交談式處理多卷文文件案包。用afio製作壓縮文文件案包比壓縮tarcpio文文件案包更安全。在備份處理script中afio是更佳的「文文件案處理引擎」。

     $ find . -depth -print0 | afio -px -0a new-dir

對所有的磁帶備份我都使用afio


8.4 差異備份與資料同步

要進行差異備份和資料同步可使用下列幾種方法:

有關將這些方法與文文件案包操作結合套用的討論參閱拷貝及建立子目錄, 第 8.3 節,有關自動進行備份的討論參閱日程安排(cronat), 第 8.6.27 節

我只講解三個較容易使用的工具。


8.4.1 使用rdiff進行差異備份

rdiff-backup提供了簡單好用的方法對任何檔案內含連結進行歷史差異備份。例如要對~/目錄下的所有檔案備份到/mnt/backup

     $ rdiff-backup --include ~/tmp/keep --exclude ~/tmp  ~/ /mnt/backup

從該文文件案包中取出三天前的舊資料恢復到~/old目錄:

     $ rdiff-backup -r 3D /mnt/backup ~/old

參閱rdiff-backup(1)


8.4.2 使用pdumpfs進行每日備份

pdumpfs是一種簡單的每日備份系統,與Plan9的dumpfs一樣,它每天都儲存系統快照。任何時候都可以用它來恢復到某天的系統狀態。請使用pdumpfscron來備份你的home目錄。

在目的地目錄中,pdumpfsYYYY/MM/DD的方式建立系統快照。第一次執行時,它將所有來來源檔案拷貝到快照目錄。從每二次執行起,pdumpfs只有拷貝更新的或開新檔案的檔案,對於沒有改變的檔案用硬連結方式指向前一天的系統快照,以此來節省硬碟空間。

     $ pdumpfs src-dir dest-dir [dest-basename]

See pdumpfs(8).


8.4.3 使用 RCS 進行定期差異備份

Changetrack會定期對 RCS 文文件案包中基於文本格式的群組態檔案的變化進行記錄。參閱changetrack(1)

     # apt-get install changetrack
     # vi changetrack.conf

8.5 系統凍結恢復


8.5.1 中止一個進程

執行top看看什麼進程的活動有異常。按「P」以CPU使用率排序,「M」以記憶體使用率排序,「k」可以中止一個進程。還有一種方法,使用 BSD 風格的ps aux | less或 System-V 風格的ps -efH | less。System V 風格的排列會顯示父進程 ID PPID,這對中止發生錯誤的(死掉的)子進程十分有用。

知道了進程的 ID ,就可使用kill中止(或發信號給)某個進程,killall的作用正如其名一樣。經常使用的信號有:

      1: HUP,重啟daemon
     15: TERM,普通中止
      9: KILL,強令中止

8.5.2 Alt-SysRq

核心編譯選項「Magic SysRq key」提供系統強心針。在i386機器上按下 Alt-SysRq 群組合鍵後,試試按下列各鍵r 0 k e i s u b,奇跡產生了:

Un'r'aw讓鍵盤從 X 崩潰中重生。將控制台 (console) loglevel改為'0'以減少錯誤訊息。sa'k'(system attention key)中止目前的虛擬控制台 (console) 的所有進程。t'e'rminate中止目前的終端設備除init外的所有進程。k'i'll中止除 init 外的所有進程。

'S'ync,'u'mount和re'b'oot幫你逃離真正的險境。

本文寫作之時,Debian 預設值安裝的核心並未將這個選項編譯進去,需要重新編譯核心激活該功\能。詳情參閱/usr/share/doc/kernel-doc-version/Documentation/sysrq.txt.gz/usr/src/kernel-version/Documentation/sysrq.txt.gz


8.6 記住這些可愛的小指令


8.6.1 Pager

less就是預設的 pager(檔案內容瀏覽器)。按「h」可獲得幫助。它比more更有用。在shell啟動script中執行eval $(lesspipe)eval $(lessfile)可以讓less活力四射。詳情參閱/usr/share/doc/lessf/LESSOPEN。使用-R選項可輸出生癖字元and enables ANSI color escape sequences.參閱less(1)

對於某些編碼系統(EUC)w3m可能是更好的選擇。


8.6.2 釋放記憶體

freetop能讓你了解記憶體資來源的許多有用訊息。別擔心「Mem:」行中「used」的大小,看看它下面的數字(本例的數字是38792)。

     $ free -k # for 256MB machine
                  total       used       free     shared    buffers cached
     Mem:        257136     230456      26680      45736     116136 75528
     -/+ buffers/cache:      38792     218344
     Swap:       264996          0     264996

實體記憶體的準確大小可通過grep '^Memory' /var/log/dmesg得到,本例將顯示「Memory: 256984k/262144k available (1652k kernel code, 412k reserved, 2944k data, 152k init)」。

     Total         = 262144k = 256M (1k=1024, 1M=1024k)
     Free to dmesg = 256984k = Total - kernel - reserved - data - init
     Free to shell = 257136k = Total - kernel - reserved - data

約有5MB記憶體系統不能使用,因為核心需要它。


8.6.3 設定時間(BIOS)

     # date MMDDhhmmCCYY
     # hwclock --utc --systohc
     # hwclock --show

設定系統時間和硬體時間為MM/DD hh:mm, CCYY。顯示時間為本地端時間而硬體時間使用的格式為 UTC。

如果硬體(BIOS)時間設定程 GMT,請修改 /etc/default/rcS 中的設定成UTC=yes


8.6.4 設定時間(NTP)

參考:Managing Accurate Date and Time HOWTO


8.6.4.1 擁有永久Internet連接的系統設定時間

設定系統小時鐘通過遠端伺服器自動對時:

     # ntpdate server

如果你的系統擁有永久的 Internet 連接,應該將該指令加入/etc/cron.daily/


8.6.4.2 偶爾進行 Internet 連接的系統設定時間

使用 chrony 套件軟體。


8.6.5 如何控制 console 的特色,例如螢幕保護程式

執行下列指令來取消螢幕保護程式:

對於 Linux console:

     # setterm -powersave off

啟動 kon2(kanji)console 執行:

     # kon -SaveTime 0

執行 X 可執行:

     # xset s off
      或
     # xset -dpms
      或
     # xscreensaver-command -prefs

參閱相關的幫助頁面來管理其餘的 console 功能。請參閱 stty(1) 來改變終端機顯示的行數。


8.6.6 查詢系統管理資料程式庫

Glibc提供了getent(1)查詢管理資料程式庫的各類項目。例如passwd、group、hosts、services、protocols、networks。

     getent database [key ...]

8.6.7 禁用聲音(響鈴)

最直接的方法是拔掉 PC 喇叭 ;-),對於Bash shell可執行:

     echo "set bell-style none">> ~/.inputrc

8.6.8 控制台 (console) 上的錯誤訊息

不想看螢幕顯示的錯誤訊息,喜好設定的方法是檢查/etc/init.d/klogd,在該script中設定KLOGD="-c 3"然後執行/etc/init.d/klogd restart。另一種方法是執行dmesg -n3

這兒是各種錯誤層級的含義:

如果你很厭惡詳細而無用的錯誤訊息,可以試試這個小補丁shutup-abit-bp6(位元於樣例script子目錄)。

另一個該看看的地方是/etc/syslog.conf;,檢查一下是否有訊息記錄被送出到了控制台 (console) 設備。


8.6.9 正確設定控制台 (console) 檔案類型

在類Unix系統中,console 螢幕通常要呼叫程式庫例程,這就為使用者提供了一種獨立於終端設備的方式來更新螢幕上的文字,這是合理化的最佳選擇。參閱ncurses(3X)terminfo(5)

在Debian系統中,有大量預定義項目:

     $ toe | less                  # 所有項目
     $ toe /etc/terminfo/ | less   # 使用者可再群組態的項目

選擇好之後請設定 TERM 這個環境變數。

當登入到遠端 Debian 系統時,如果 xterm 的 terminfo 項目在非 Debian 的 xterm 中失效,請將終端設備檔案類型改為支援較少特性的版本如「xterm-r6」。 參閱/usr/share/doc/libncurses5/FAQ。「dumb」是terminfo的最小公分母。


8.6.10 恢復 console 到穩定狀態

如果執行cat some-binary-file後螢幕一片混亂(指令的返回值與你的輸入大相徑庭):

     $ reset

8.6.11 將 DOS 下的文字檔案轉換為Unix檔案類型

將 DOS 文字檔案(行尾=^M^J)轉換成Unix文字檔案(行尾=^J)。

     # apt-get install sysutils
     $ dos2unix dosfile

8.6.12 利用 recode 來轉換文字檔

底下示範轉換文字檔在 DOS,Mac和Unix底下斷行的方法:

     $ recode /cl../cr <dos.txt >mac.txt
     $ recode /cr.. <mac.txt >unix.txt
     $ recode ../cl <unix.txt >dos.txt

recode依據不同字元集和介面來轉換檔案:

     $ recode charset1/surface1..charset2/surface2 \
       <input.txt >output.txt

一般常使用的字元集轉換(請參閱locales 簡介, 第 9.7.3 節) [37] :

一般常用的介面為 [38] :

相關的資訊請參閱info recode

也有一些特別的轉換工具:


8.6.13 Regular-expression substitution

將所有檔案FILES ...中的所有FROM_REGEX字段取代成TO_TEXT字段。

     $ perl -i -p -e 's/FROM_REGEX/TO_TEXT/g;' FILES ...

-i表示「就地編輯」,-p表示「在FILES...各檔案中循環」。如果置換很復雜,應使用參數-i.bak而非-i,這有助於發生錯誤恢復;它會將每個原始檔案儲存為以.bak為後綴的備份檔案。


8.6.14 使用 script 來編輯檔案

下面的script將刪除 5–10 行以及 16–20 行。

     #!/bin/bash
     ed $1 <<EOF
     16,20d
     5,10d
     w
     q
     EOF

在此,ed指令與vi指令模式下的是一樣的,從外部編輯檔案的方式使它易於script化。


8.6.15 提取來源檔案修改部分合併到更新包

下面的操作將根據檔案位元置,提取來源檔案的修改部分並建立統一的 diff 檔案 file.patch0file.patch1

     $ diff -u file.old file.new > file.patch0
     $ diff -u old/file new/file > file.patch1

diff 檔案(也稱修正檔案)通常用於送出程式更新。收到的修正檔案可使用下面的方法更新另一個檔案

     $ patch -p0 file < file.patch0
     $ patch -p1 file < file.patch1

如果有三個版本的來源代碼,使用diff3來合併效率更高:

     $ diff3 -m file.mine file.old file.yours > file

8.6.16 分割大檔案

     $ split -b 650m file   # 將大檔案分塊成多個650MB的小檔案
     $ cat x* >largefile    # 將所有小檔案合併成一個大檔案

8.6.17 從文字檔格式的表格中抽取資料

假設有一個文字檔案名為DPL,其中存放著所有前 Debian 計畫領導人的名字和他們的上臺日期,表格格式是以空格做為分隔的。

     Ian     Murdock   August  1993
     Bruce   Perens    April   1996
     Ian     Jackson   January 1998
     Wichert Akkerman  January 1999
     Ben     Collins   April   2001
     Bdale   Garbee    April   2002
     Martin  Michlmayr March   2003

AWK經常用於從這類檔案中提取資料。

     $ awk '{ print $3 }' <DPL                   # month started
     August
     April
     January
     January
     April
     April
     March
     $ awk '($1=="Ian") { print }' <DPL          # DPL called Ian
     Ian     Murdock   August  1993
     Ian     Jackson   January 1998
     $ awk '($2=="Perens") { print $3,$4 }' <DPL # When Perens started
     April 1996

Shells 像是 Bash 也可以用來分析這類型的檔案:

     $ while read first last month year; do 
         echo $month
       done <DPL
     ... same output as the first Awk example

這裡, read 內建的指令使用 $IFS (internal field separators) 裡的字元來將行拆成多個文字。

如果你改變 IFS 成 ":",你就能使用 shell 來分析 /etc/passwd

     $ oldIFS="$IFS"   # save old value
     $ IFS=":"
     $ while read user password uid gid rest_of_line; do
         if [ "$user" = "osamu" ]; then 
           echo "$user's ID is $uid"
         fi
       done < /etc/passwd
     osamu's ID is 1001
     $ IFS="$oldIFS"   # restore old value

(在 Awk 中,使用 FS=":"就能達成相同的功能。)

IFS也能用來拆解參數的展開、指令交換、算數運算。這些功能如果夾在單引號或雙引號之內的話,將會失效。預設的 IFS 是 <space>, <tab>, and <newline> 的組合。

請小心這個 IFS 陷阱。尤其當 shell 轉譯讀入的script時,可能會出現奇怪的問題。

     $ IFS=":,"                        # use ":" and "," as IFS
     $ echo IFS=$IFS,   IFS="$IFS"     # echo is a Bash built-in
     IFS=  , IFS=:,
     $ date -R                         # just a command output
     Sat, 23 Aug 2003 08:30:15 +0200
     $ echo $(date -R)                 # sub shell --> input to main shell
     Sat  23 Aug 2003 08 30 36 +0200
     $ unset IFS                       # reset IFS to the default
     $ echo $(date -R)
     Sat, 23 Aug 2003 08:30:50 +0200

8.6.18 精巧的管道指令輔助script

下列script做為管道的一部分十分有用。

     find /usr | egrep -v "/usr/var|/usr/tmp|/usr/local"
                          # find all files in /usr excluding some files
     xargs -n 1 command   # run command for all items from stdin
     xargs -n 1 echo |    # split white-space-separated items into lines
     xargs echo      |    # merge all lines into a line
     grep -e pattern|     # extract lines containing pattern
     cut -d: -f3 -|
             # extract third field separated by : (passwd file etc.)
     awk '{ print $3 }' | # extract third field separated by whitespaces
     awk -F'\t' '{ print $3 }' |
             # extract third field separated by tab
     col -bx |            # remove backspace and expand tabs to spaces
     expand -|            # expand tabs
     sort -u|             # sort and remove duplicates
     
     tr '\n' ' '|         # concatenate lines into one line
     tr '\r' ''|          # remove CR
     tr 'A-Z' 'a-z'|      # convert uppercase to lowercase
     sed 's/^/# /'|       # make each line a comment
     sed 's/\.ext//g'|    # remove .ext
     sed  -n -e 2p|       # print the second line 
     head -n 2 -|         # print the first 2 lines
     tail -n 2 -|         # print the last 2 lines

8.6.19 查看每個檔案的輕巧 script

The following ways of looping over each file matching *.ext ensures proper handling of funny file names such as ones with spaces and performs equivalent process:


8.6.20 輕巧的 Perl Script

雖然 Awk scripts 透過a2p(1)就能自動轉換成 Perl,對於只有一行的 Awk Script 到 Perl Script,直接手動修改是最方便的了。例如:

     awk '($2=="1957") { print $3 }' |

同等於下列任意一行:

     perl -ne '@f=split; if ($f[1] eq "1957") { print "$f[2]\n"}' |
     perl -ne 'if ((@f=split)[1] eq "1957") { print "$f[2]\n"}' |
     perl -ne '@f=split; print $f[2] if ( $f[1]==1957 )' |
     perl -lane 'print $F[2] if $F[1] eq "1957"' |

其實上面各行中所有perl參數中的空格均可去掉,這得益於Perl的數字字串自動轉換功能。

     perl -lane 'print$F[2]if$F[1]eq+1957' |

有關指令行參數的訊息可參閱perlrun(1),在http://perlgolf.sourceforge.net有更多令人著魔的Perl script,你會感興趣的。


8.6.21 從網頁上取得文件或通信清單(mailing list)

下面的操作將網頁轉化為文字檔案。從網上拷貝設定檔案時十分有用。

     $ lynx -dump http://www.remote-site.com/help-info.html >textfile

linksw3m也可以這麼用,只是生成的文本樣式可能略有不同。

如果是信件清單文文件案,可使用munpack從文本獲得mime內容。


8.6.22 列印網頁

下面的操作將網頁內容列印成PostScript檔案或送出到印表機。

     $ apt-get install html2ps
     $ html2ps URL | lpr

參閱lpr/lpd, 第 3.6.1 節。還可使用a2psmpage套服軟體生成PostScript檔案。


8.6.23 列印幫助頁面

下面的操作將幫助頁面列印成PostScript檔案或送出到印表機。

     $ man -Tps some-manpage | lpr
     $ man -Tps some-manpage | mpage -2 | lpr

8.6.24 合併兩個Postscript或PDF檔案

可以將兩個Postscript檔案或PDF檔案合併。

     $ gs -q -dNOPAUSE -dBATCH -sDEVICE=pswrite \
       -sOutputFile=bla.ps -f foo1.ps foo2.ps
     $ gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite \
       -sOutputFile=bla.pdf -f foo1.pdf foo2.pdf

8.6.25 指令耗時

顯示某進程的耗時

     # time some-command >/dev/null
     real    0m0.035s       # time on wall clock (elapsed real time)
     user    0m0.000s       # time in user mode
     sys     0m0.020s       # time in kernel mode

8.6.26 nice指令

使用nice(來自GNU shellutils套服軟體)可設定指令啟動時的nice值。renicebsdutils)和top可以重設進程的nice值。nice值為19代表最慢的(優先等級最低的)進程;負值就「not-nice」,如-20代表非常快的(優先等級高的)進程。只有Supervisor可以設定負nice值。

     # nice  -19 top                                         # very nice
     # nice --20 cdrecord -v -eject speed=2 dev=0,0 disk.img # very fast

有時過度的nice值對系統弊大於利,所以使用該指令要小心。


8.6.27 日程安排(cronat

在Linux下使用cronat進行工作日程安排。參閱at(1)crontab(5)crontab(8)

執行指令crontab -e建立或編輯crontab檔案,為規律事務(按周期循環的事務)安排日程。下面的一個crontab檔案樣例:

     # use /bin/sh to run commands, no matter what /etc/passwd says
     SHELL=/bin/sh
     # mail any output to `paul', no matter whose crontab this is
     MAILTO=paul
     # Min Hour DayOfMonth Month DayOfWeek command (Day... are OR'ed)
     # run at 00:05, every day
     5  0  *  * *   $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
     # run at 14:15 on the first of every month -- output mailed to paul
     15 14 1  * *   $HOME/bin/monthly
     # run at 22:00 on weekdays(1-5), annoy Joe. % for newline, last % for cc:
     0 22 *   * 1-5 mail -s "It's 10pm" joe%Joe,%%Where are your kids?%.%%
     23 */2 1 2 *   echo "run 23 minutes after 0am, 2am, 4am ..., on Feb 1"
     5  4 *   * sun echo "run at 04:05 every sunday"
     # run at 03:40 on the first Monday of each month
     40 3 1-7 * *   [ "$(date +%a)" == "Mon" ] && command -args

執行at指令為偶然工作(只執行一次的工作)安排日程:

     $ echo 'command -args'| at 3:40 monday

8.6.28 用screen來切換 console

The screen程式容許在單一的物理終端設備或終端設備類比視窗執行多個偽終端設備,每個偽終端設備都擁有自己的交談式shell。即便可以使用Linux偽終端設備或多個xterm視窗,研究一下如何設定screen豐富的特性仍很有益,這些特性內含:


8.6.28.1 遠端存取作業方式

If you frequently log on to a Linux machine 如果你經常從遠端終端設備登入到Linux機器或使用VT100終端設備程式,screendetach(分離)特性將簡化你的生活。

  • 通過拔號連接登入,執行了一個非常復雜的screen會談,開啟舊檔了好幾個視窗,有編輯器和其它一些程式。

  • 突然你需要離開終端設備一下,但你並不想掛斷連線中止工作。

  • 輸入^A d離開階段作業,然後登出系統。(或是更簡單些,輸入^A DD離開階段作業並自動登出系統)

  • 當你回來時,需要再次登入,可輸入指令screen -rscreen會如魔法般地重新連線上所有開啟舊檔的視窗。


  • 8.6.28.2 典型的screen指令

    一但開啟舊檔了screen程式,除了指令按鍵(預設值為^A)所有的鍵盤輸入都被送到目前的視窗,所有的screen指令均按特定方式輸入:^A加一個單鍵指令[加一些參數]的。常用的指令有:

         ^A ?     顯示說明螢幕(顯示指令集)
         ^A c     建立並切換到新增視窗
         ^A n     跳到下一個視窗
         ^A p     跳到上一個視窗
         ^A 0     跳到0號視窗
         ^A w     顯示視窗清單
         ^A a     將Ctrl-A做為鍵盤輸入送出到目前的視窗
         ^A h     對目前的視窗做硬拷貝寫入到檔案
         ^A H     開始/中止將目前的視窗vぁ饇O錄到檔案
         ^A ^X    鎖定終端設備(密碼保護)
         ^A d     從終端設備分離螢幕階段作業
         ^A DD    分離螢幕階段作業並結束登入
    

    以上只是screen指令的一個很小的子集。只要是你認為screen能幹的事,沒準它真就可以!詳情參閱screen(1)


    8.6.28.3 screen階段作業中的退格鍵和Ctrl-H

    在執行screen時,如果發現退格鍵和/或Ctrl-H無法正常工作,可編輯/etc/screenrc,找到這行:

         bindkey -k kb stuff "\177"
    

    將這注釋掉(例如在句首添加「#」)。


    8.6.28.4 X下與screen等價的程式

    找找xmove。參閱xmove(1)


    8.6.29 網路測試基礎

    安裝netkit-pingtraceroutednsutilsipchains(適用於2.2版核心)、iptables(適用於2.4版核心)和net-tools套服軟體,然後執行:

         $ ping yahoo.com            # 檢查Internet連接
         $ traceroute yahoo.com      # 追蹤IP封包
         $ ifconfig                  # 檢查主電腦設定
         $ route -n                  # 檢查路由設定
         $ dig [@dns-server.com] host.dom [{a|mx|any}] |less
               # 檢查dns-server.comhost.dom DNS記錄
               # 尋找{a|mx|any}記錄
         $ ipchains -L -n |less     # 檢查包過濾(2.2 kernel)
         $ iptables -L -n |less      # 檢查包過濾(2.4 kernel)
         $ netstat -a                # 尋找系統上所有開啟舊檔的連接埠
         $ netstat -l --inet         # 尋找系統監聽的連接埠
         $ netstat -ln --tcp         # 尋找系統監聽的TCP連接埠(連接埠數字)
    

    8.6.30 清理(flush)本地端的 Mail 佇列

    想要:清理(flush)本地端的 Mail 佇列

         # exim4 -q    # 清理待讀信件
         # exim4 -qf   # 清理所有信件
         # exim4 -qff  # 清理凍結信件
    

    -qff選項用在/etc/ppp/ip-up.d/eximscript中效果更好。在 Woody 和更舊的版本中,改用exim來取代exim4


    8.6.31 刪除已凍結的信件

    刪除本地端凍結信件並返回發生錯誤訊息:

         # exim4 -Mg `mailq | grep frozen | awk '{ print $3 }'`
    

    在 Woody 和更舊的版本中,改用exim來取代exim4


    8.6.32 重新寄送mbox中的信件

    如果home目錄沒有空間造成procmail不能處理信件,就需要對磁碟空間進行擴容,擴容完成後需要手動分發/var/mail/username目錄中的信件到home目錄中的分類信箱,執行:

         # /etc/init.d/exim4 stop
         # formail -s procmail </var/mail/username
         # /etc/init.d/exim4 start
    

    在 Woody 和更舊的版本中,改用exim來取代exim4


    8.6.33 清理檔案內容

    要清理某些檔案如日誌檔案的內容,千萬不要使用rm刪除檔案然後再建立一個新的空檔案,因為在兩次操作的間隔,系統可能需要存取該檔案。下面是清理檔案內容的安全方法:

         $ :>file-to-be-cleared
    

    8.6.34 空檔案

    下面的指令可以建立空檔案:

         $ dd if=/dev/zero    of=filename bs=1k count=5 # 5KB of zero content
         $ dd if=/dev/urandom of=filename bs=1M count=7 # 7MB of random content
         $ touch filename #  create 0B file (if file exists, updates mtime)
    

    例如,最實用的使用方式是從Debian啟動軟式磁碟機的shell中執行下列指令將硬碟/dev/hda的內容完全清理。

         # dd if=/dev/urandom of=/dev/hda; dd if=/dev/zero of=/dev/hda
    

    8.6.35 chroot

    chroot程式,chroot(8),不需要重啟系統,就可以在單獨的系統上同時執行多個不同的GNU/Linux環境。

    還可以在較快主電腦的chroot下執行某些需耗大量系統資來源記憶體的程式如apt-getdselect,並將較慢子機的硬碟通過NFS方式掛載到主電腦,開放讀/寫權限,在主電腦上以chroot方式操作子機。


    8.6.35.1 用chroot來執行不同版本的Debian

    在Sarge中使用debootstrap指令很容易建構chroot Debian環境。在Sarge後續版本,你可改用cdebootstrap和適當參數來替代。例如,在一臺擁有快速Internet連接的機器的/sid-root下建立一個Sid chroot:

         main # cd /; mkdir /sid-root
         main # debootstrap sid /sid-root http://ftp.debian.org/debian/
         ... watch it download the whole system
         main # echo "proc /sid-root/proc proc none 0 0" >> /etc/fstab
         main # mount /sid-root/proc
         main # mount /dev/ /sid-root/dev -o bind
         main # cp /etc/hosts /sid-root/etc/hosts
         main # chroot /sid-root /bin/bash
         chroot # cd /dev; /sbin/MAKEDEV generic; cd -
         chroot # apt-setup # set-up /etc/apt/sources.list
         chroot # vi /etc/apt/sources.list # point the source to unstable
         chroot # dselect  # you may use aptitude, install mc and vim :-)
    

    現在你就擁有了一個全功能Debian子系統,可以盡情測試而不必擔心主Debian受到不利影響。

    debootstrap套用技巧還可以實現在沒有Debian安裝盤的情況下,從另一個GNU/Linux發行版下安裝Debian。參閱http://www.debian.org/releases/stable/i386/apcs04


    8.6.35.2 設定chroot登入

    輸入chroot /sid-root /bin/bash非常簡單,但這將沿用目前的的所有環境變量,你可能並不希望這樣並且有時還會出問題。更好的方法是,在別的虛擬終端設備上執行另一個登入進程,登入到chroot目錄。

    在Debian系統中預設值從tty1tty6執行Linux console,tty7執行 X Window系統,在本例中,我們將tty8設定成chroot console。按照chroot來執行不同版本的Debian, 第 8.6.35.1 節中的描述建立好chroot系統後,就可以在主系統的root shell中輸入:

         main # echo "8:23:respawn:/usr/sbin/chroot /sid-root "\
                "/sbin/getty 38400 tty8" >> /etc/inittab
         main # init q    # reload init
    

    8.6.35.3 群組態chroot下的X

    想在 chroot 下安全地執行最新版的 X 和 GNOME 嗎?完全可以!下面的例子將實現在虛擬終端設備vt9下執行 GDM。

    首先,按照chroot來執行不同版本的Debian, 第 8.6.35.1 節中描述的方法安裝好chroot系統,從主系統的root下拷貝關鍵群組態檔案到chroot系統。

         main # cp /etc/X11/XF86Config-4 /sid-root/etc/X11/XF86Config-4
         main # chroot /sid-root # or use chroot console
         chroot # cd /dev; /sbin/MAKEDEV generic; cd -
         chroot # apt-get install gdm gnome x-window-system
         chroot # vi /etc/gdm/gdm.conf # do s/vt7/vt9/ in [servers] section
         chroot # /etc/init.d/gdm start
    

    在此,編輯/etc/gdm/gdm.conf來改變第一個虛擬終端裝置,使其在vt7vt9上建立虛擬終端設備。

    現在可以很容易地能過切換Linux虛擬終端設備來實現在主系統的X環境和chroot系統的X環境之間轉換,例如使用Ctrl-Alt-F7和Ctrl-Alt-F9。酷吧!

    [FIXME] 在chroot系統下gdm的initscript中添加一條注釋和一條連結。


    8.6.35.4 使用chroot來執行其它發行版

    很容易建立一個其它發行版的 chroot 環境。使用其它發行版的安裝程式將它們安裝到單獨的硬碟分區中。例如root分區位元於/dev/hda9

         main # cd /; mkdir /other-dist
         main # mount -t ext3 /dev/hda9 /other-dist
         main # chroot /other-dist /bin/bash
    

    然後,執行chroot來執行不同版本的Debian, 第 8.6.35.1 節設定chroot登入, 第 8.6.35.2 節群組態chroot下的X, 第 8.6.35.3 節中描述的內容。


    8.6.35.5 使用chroot來編譯軟體

    這兒有一個很特殊的chroot套服軟體pbuilder,它構造一個chroot系統並在其中編譯套服軟體。該體系可用於檢查套服軟體編譯時關聯關係是否正確,並確保編譯生成的套服軟體中沒有不必要的或錯誤的關聯關係。


    8.6.36 怎樣檢查 hard links

    檢查兩個檔案是否是指向同一個檔案的兩個硬連結:

          
         $ ls -li file1 file2
    

    8.6.37 mount硬碟上的映象檔案

    如果 file.img 檔案是硬碟內容的對映檔案,而且原始硬碟的群組態參數為 xxxx = (bytes/sector) * (sectors/cylinder),那麼,下面的指令將其掛載到/mnt

         # mount -o loop,offset=xxxx file.img /mnt
    

    注意絕大部分的硬碟都是 512 bytes/sector。


    8.6.38 Samba

    取得 Windows 檔案的基本方法:

         # mount -t smbfs -o username=myname,uid=my_uid,gid=my_gid \
                 //server/share /mnt/smb  # mount Windows files to Linux
         # smbmount //server/share /mnt/smb \
                 -o "username=myname,uid=my_uid,gid=my_gid"
         # smbclient -L 192.168.1.2 # list the shares on a computer
    

    可從 Linux 檢查 Samba 網路上的芳鄰:

         # smbclient -N -L ip_address_of_your_PC | less
         # nmblookup -T "*"
    

    8.6.39 外來檔案系統的操作工具

    Linux 核心支援多種外來檔案系統,想存取它們只需將其掛載到合適的檔案系統下就行了。 對某些檔案系統,還提供專門工具不需要掛載,只依靠使用者空間的程式,不需要核心提供檔案系統支援,就能完整存取。

    對於建立和檢查 MS-DOS FAT 檔案系統 dosfstools 非常有用。


    8.7 打錯字的情況

    這裡示範幾個危險的動作。當使用特權帳號:root時,負面影響的程度是相當嚴重。


    8.7.1 rm -rf .*

    在命令列操作萬用檔名(*號)如"rm -rf .*"可能會造成嚴重的錯誤,因為".*"會參考到"." 和 ".."。幸運地,在Debian上的"rm"版本會很聰明地檢查檔名並取消移除"." and ".."。但這並非永遠如此。試試看底下的例子來了解萬用檔名的用法。


    8.7.2 rm /etc/passwd

    由於您愚蠢地移除掉 /etc/passwd 是會造成相當嚴重的損失。Debian系統會慣例性地備份重要檔案到/var/backups/。當你回存這些檔案時,請記得更改適當的權限。

         # cp /var/backups/passwd /etc/passwd
         # chmod 644 /etc/passwd
    

    請參閱 回復套件的選取狀態的資料, 第 6.3.4 節


    [ 上一頁 ] [ 目錄 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ A ] [ 下一頁 ]


    Debian 參考手冊

    CVS, 週四 一月 18 11:53:38 UTC 2007

    Osamu Aoki osamu#at#debian.org
    Asho Yeh asho#at#debian.org.tw
    作者, 第 A.1 節