參閱 LDP BootPrompt-HOWTO
獲得有關系統提示的詳細資訊。
只要能存取控制台 (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」可獲得參考清單)。
從急救 boot/root 磁碟啟動系統。假設 /dev/hda3
是原始
root 分區,可用下面的方法編輯密碼檔案,與上述方法一樣容易。
# mkdir fixit # mount /dev/hda3 fixit # cd fixit/etc # vi shadow # vi passwd
與上面的方法相比,該方法的好處在於不需要知道 lilo
密碼(如果有的話)。但如果系統沒有預先設定為從軟式磁碟機或 CD 啟動,就需要存取
BIOS 的權限。
沒在安裝過程中製作開機軟碟?沒關係。如果 lilo
損壞了,從 Debian
安裝套件中拿出開機軟碟,用它來啟動系統。假設你的 root 分割區在
/dev/hda12
,你想進入runlevel 3,在啟動提示符後輸入:
boot: rescue root=/dev/hda12 3
接下來,系統使用軟式磁碟機上的核心啟動,你可登入到一個幾乎擁有全部功\能的系統了。 (可能有少量特性或模組無法使用。)
如果系統已經崩潰,亦可參閱把套件安裝到一個無法開機的系統, 第 6.3.6 節。
如果想做張自訂開機軟碟,參閱急救磁碟 (rescue disk) 中的 readme.txt
文件。
玩 unstable/sid
很有趣,但在啟動進程中執行不穩定的xdm
、
gdm
、kdm
和wdm
會讓你焦頭爛額。
首先,在啟動提示符後輸入如下指令獲得 root shell:
boot: Linux vga=normal s
其中,Linux代表你要啟動的核心對映,「vga=normal」告訴lilo
在普通VGA螢幕下執行,「s」(或「S」)是傳給init
的參數,告訴它進入單使用者模式。在提示符後輸入root密碼。
有多種方法禁用X啟動deaemons:
/etc/init.d/?dm
files.
/etc/rc2.d/S99?dm
files to
/etc/rc2.d/K99?dm
.
/etc/rc2.d/S99?dm
files.
其中,rc2.d
的檔案的編號必須與/etc/inittab
中指定的runlevel一致。?dm
表示您需要多次執行這些命令來選擇xdm
、gdm
、kdm
和wdm
。
在Debian下只有第一種方法「最正確」。最後一種方法比較簡單但只適用於Debian,而且還需要使用dpkg-reconfigure
重新設定
display manager。其它方法都是通用的中止daemons的方法。
你仍可在任何控制台 (console) shell中輸入startx
啟動 X。
使用 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的記憶體。
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 MSDOS/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
和
/usr/share/doc/grub-doc/html/
。
比起普通的個人電腦環境,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
如果需要 X 套用程式的操作記錄圖,內含 xterm
,可使用gimp
(GUI)。它可以對每個視窗或整個螢幕拍攝快照。還可以使用
xwd
(xbase-clients
)、import
(imagemagick
)和
scrot
(scrot
)。
如果想重新整理檔案群組織結構,可使用下面的方法移動檔案及檔案連結:
標準方法: # 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
其中,scp
<==> rcp
,ssh
<==>
rsh
。
下面的有關拷貝整個子目錄的訊息由 Manoj Srivastavasrivasta@debian.org
<srivasta@debian.org>發表於debian-user@lists.debian.org。
cp
傳統上,cp
並不能真正完成這個工作,因為它既沒對符號連結進行區別對待,又不能儲存硬連結。另一件需要注意的事就是稀疏檔案(有洞的檔案)。
GNU cp
克服了這缺陷,然而對於非 GNU
系統,cp
仍存在問題。而且使用cp
無法生成小巧輕便的文文件案包。
% cp -a . newdir
tar
Tar
克服了cp
在處理符號連結時出現的問題,然而,cpio
可以處理特殊檔案,傳統的tar
卻不行。
對於某個有多重硬連結的檔案,tar
的處理方法是只將其中一個連結拷貝到磁帶上,所以日後你只能找回拷貝中所保留那個的連結所指的檔案;cpio
會為每個連結做一個拷貝,日後你可以找回任意一個連結所指的檔案。
在 Potato 和 Woody
中,操作.bz2
檔案的tar
指令參數有所變化,所以請在script中使用--bzip2而不要簡寫為-I(Potato)或-j(Woody)。
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
cpio
cpio
從cpio
或tar
文文件案包提取/放入檔案。該文文件案包可以是硬碟上的另一個檔案,也可以是磁帶或管道。
$ find . -depth -print0 | cpio --null --sparse -pvd new-dir
afio
afio
更善於處理cpio
格式的文文件案包。通常它比cpio
要快,且提供了更多磁帶選項,並且能更友好的處理有訛誤的輸入資料。它支援交談式處理多卷文文件案包。用afio
製作壓縮文文件案包比壓縮tar
或cpio
文文件案包更安全。在備份處理script中afio
是更佳的「文文件案處理引擎」。
$ find . -depth -print0 | afio -px -0a new-dir
對所有的磁帶備份我都使用afio
。
要進行差異備份和資料同步可使用下列幾種方法:
rcs
:備份並進行歷史記錄,只支援文本。
rdiff-backup
:備份並進行歷史記錄。支援連結。
pdumpfs
:對檔案系統進行備份和歷史記錄。支援連結。
rsync
:單路同步。
unison
:雙路同步。
cvs
:多路同步伺服器備份並進行歷史記錄,只支援文本,技術成熟。參閱Concurrent Versions System (CVS), 第 12.1
節。
arch
:多路同步伺服器備份並進行歷史記錄,但內含「處於工作中的目錄」。
subversion
:多路同步伺服器備份並進行歷史記錄,專用於Apache。
有關將這些方法與文文件案包操作結合套用的討論參閱拷貝及建立子目錄, 第 8.3
節,有關自動進行備份的討論參閱日程安排(cron
,at
), 第 8.6.27
節。
我只講解三個較容易使用的工具。
rdiff-backup
提供了簡單好用的方法對任何檔案內含連結進行歷史差異備份。例如要對~/
目錄下的所有檔案備份到/mnt/backup
:
$ rdiff-backup --include ~/tmp/keep --exclude ~/tmp ~/ /mnt/backup
從該文文件案包中取出三天前的舊資料恢復到~/old
目錄:
$ rdiff-backup -r 3D /mnt/backup ~/old
參閱rdiff-backup(1)
。
pdumpfs
進行每日備份
pdumpfs
是一種簡單的每日備份系統,與Plan9的dumpfs
一樣,它每天都儲存系統快照。任何時候都可以用它來恢復到某天的系統狀態。請使用pdumpfs
和cron
來備份你的home目錄。
在目的地目錄中,pdumpfs
以YYYY/MM/DD的方式建立系統快照。第一次執行時,它將所有來來源檔案拷貝到快照目錄。從每二次執行起,pdumpfs
只有拷貝更新的或開新檔案的檔案,對於沒有改變的檔案用硬連結方式指向前一天的系統快照,以此來節省硬碟空間。
$ pdumpfs src-dir dest-dir [dest-basename]
See pdumpfs(8)
.
Changetrack
會定期對 RCS
文文件案包中基於文本格式的群組態檔案的變化進行記錄。參閱changetrack(1)
。
# apt-get install changetrack # vi changetrack.conf
執行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,強令中止
核心編譯選項「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
。
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
可能是更好的選擇。
free
和top
能讓你了解記憶體資來源的許多有用訊息。別擔心「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記憶體系統不能使用,因為核心需要它。
# date MMDDhhmmCCYY # hwclock --utc --systohc # hwclock --show
設定系統時間和硬體時間為MM/DD hh:mm, CCYY。顯示時間為本地端時間而硬體時間使用的格式為 UTC。
如果硬體(BIOS)時間設定程 GMT,請修改 /etc/default/rcS
中的設定成UTC=yes。
參考:Managing
Accurate Date and Time HOWTO
。
設定系統小時鐘通過遠端伺服器自動對時:
# ntpdate server
如果你的系統擁有永久的 Internet
連接,應該將該指令加入/etc/cron.daily/
。
使用 chrony
套件軟體。
執行下列指令來取消螢幕保護程式:
對於 Linux console:
# setterm -powersave off
啟動 kon2(kanji)console 執行:
# kon -SaveTime 0
執行 X 可執行:
# xset s off 或 # xset -dpms 或 # xscreensaver-command -prefs
參閱相關的幫助頁面來管理其餘的 console 功能。請參閱 stty(1)
來改變終端機顯示的行數。
Glibc提供了getent(1)
查詢管理資料程式庫的各類項目。例如passwd、group、hosts、services、protocols、networks。
getent database [key ...]
最直接的方法是拔掉 PC 喇叭 ;-),對於Bash shell可執行:
echo "set bell-style none">> ~/.inputrc
不想看螢幕顯示的錯誤訊息,喜好設定的方法是檢查/etc/init.d/klogd
,在該script中設定KLOGD="-c
3"然後執行/etc/init.d/klogd
restart。另一種方法是執行dmesg -n3。
這兒是各種錯誤層級的含義:
如果你很厭惡詳細而無用的錯誤訊息,可以試試這個小補丁shutup-abit-bp6
(位元於樣例script子目錄
)。
另一個該看看的地方是/etc/syslog.conf
;,檢查一下是否有訊息記錄被送出到了控制台
(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的最小公分母。
如果執行cat some-binary-file後螢幕一片混亂(指令的返回值與你的輸入大相徑庭):
$ reset
將 DOS 文字檔案(行尾=^M^J)轉換成Unix文字檔案(行尾=^J)。
# apt-get install sysutils $ dos2unix dosfile
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
一般常使用的字元集轉換(請參閱Introduction to locales, 第 9.7.3 節) [37] :
一般常用的介面為 [38] :
相關的資訊請參閱info recode。
也有一些特別的轉換工具:
iconv
— locale encoding conversions
konwert
— fancy encoding conversions
uuencode
和 uudecode
— Unix 上有的。
mimencode
— 使用在 Mail。
將所有檔案FILES ...中的所有FROM_REGEX字段取代成TO_TEXT字段。
$ perl -i -p -e 's/FROM_REGEX/TO_TEXT/g;' FILES ...
-i表示「就地編輯」,-p表示「在FILES...各檔案中循環」。如果置換很復雜,應使用參數-i.bak而非-i,這有助於發生錯誤恢復;它會將每個原始檔案儲存為以.bak為後綴的備份檔案。
下面的script將刪除 5–10 行以及 16–20 行。
#!/bin/bash ed $1 <<EOF 16,20d 5,10d w q EOF
在此,ed
指令與vi
指令模式下的是一樣的,從外部編輯檔案的方式使它易於script化。
下面的操作將根據檔案位元置,提取來源檔案的修改部分並建立統一的 diff 檔案 file.patch0 或 file.patch1:
$ diff -u file.old file.new1 > file.patch0 $ diff -u old/file new1/file > file.patch1
diff 檔案(也稱修正檔案)通常用於送出程式更新。收到的修正檔案可使用下面的方法更新另一個檔案:
$ patch -p0 file < file.patch0 $ patch -p1 file < file.patch1
如果有三個版本的來源代碼,使用diff3
來合併效率更高:
$ diff3 -m file.mine file.old file.yours > file
$ split -b 650m file # 將大檔案分塊成多個650MB的小檔案 $ cat x* >largefile # 將所有小檔案合併成一個大檔案
假設有一個文字檔案名為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
下列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
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:
for x in *.ext; do if test -f "$x"; then command "$x" fi done
find
and xargs
combination:
find . -type f -maxdepth 1 -name '*.ext' -print0 | \ xargs -0 -n 1 command
find
with -exec option with a command:
find . -type f -maxdepth 1 -name '*.ext' \ -exec command '{}' \;
find
with -exec option with a short shell script:
find . -type f -maxdepth 1 -name '*.ext' \ -exec sh -c "command '{}' && echo 'successful'" \;
雖然 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,你會感興趣的。
下面的操作將網頁轉化為文字檔案。從網上拷貝設定檔案時十分有用。
$ lynx -dump http://www.remote-site.com/help-info.html >textfile
links
和w3m
也可以這麼用,只是生成的文本樣式可能略有不同。
如果是信件清單文文件案,可使用munpack
從文本獲得mime內容。
下面的操作將網頁內容列印成PostScript檔案或送出到印表機。
$ apt-get install html2ps $ html2ps URL | lpr
參閱lpr
/lpd
,
第 3.6.1
節。還可使用a2ps
和mpage
套服軟體生成PostScript檔案。
下面的操作將幫助頁面列印成PostScript檔案或送出到印表機。
$ man -Tps some-manpage | lpr $ man -Tps some-manpage | mpage -2 | lpr
可以將兩個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
顯示某進程的耗時
# 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
nice
指令
使用nice
(來自GNU
shellutils
套服軟體)可設定指令啟動時的nice值。renice
(bsdutils
)和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值對系統弊大於利,所以使用該指令要小心。
cron
,at
)
在Linux下使用cron
和at
進行工作日程安排。參閱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
screen
來切換 console
The
screen
程式容許在單一的物理終端設備或終端設備類比視窗執行多個偽終端設備,每個偽終端設備都擁有自己的交談式shell。即便可以使用Linux偽終端設備或多個xterm
視窗,研究一下如何設定screen
豐富的特性仍很有益,這些特性內含:
screen
階段作業分離,稍後再連接。
If you frequently log on to a Linux machine
如果你經常從遠端終端設備登入到Linux機器或使用VT100終端設備程式,screen
的detach(分離)特性將簡化你的生活。
screen
會談,開啟舊檔了好幾個視窗,有編輯器和其它一些程式。
screen
會如魔法般地重新連線上所有開啟舊檔的視窗。
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)
。
screen
階段作業中的退格鍵和Ctrl-H
在執行screen
時,如果發現退格鍵和/或Ctrl-H無法正常工作,可編輯/etc/screenrc
,找到這行:
bindkey -k kb stuff "\177"
將這注釋掉(例如在句首添加「#」)。
screen
等價的程式
找找xmove
。參閱xmove(1)
。
安裝netkit-ping
、traceroute
、dnsutils
、ipchains
(適用於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.com的host.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連接埠(連接埠數字)
想要:清理(flush)本地端的 Mail 佇列
# exim -q # 清理待讀信件 # exim -qf # 清理所有信件 # exim -qff # 清理凍結信件
-qff選項用在/etc/ppp/ip-up.d/exim
script中效果更好。在
Sarge 版本中,exim
已經被 exim4
替換了。
刪除本地端凍結信件並返回發生錯誤訊息:
# exim -Mg `mailq | grep frozen | awk '{ print $3 }'`
在 Sarge 版本中,exim
已經被 exim4
替換了。
mbox
中的信件
如果home目錄沒有空間造成procmail
不能處理信件,就需要對磁碟空間進行擴容,擴容完成後需要手動分發/var/mail/username
目錄中的信件到home目錄中的分類信箱,執行:
# /etc/init.d/exim stop # formail -s procmail </var/mail/username # /etc/init.d/exim start
在 Sarge 版本中,exim
已經被 exim4
替換了。
要清理某些檔案如日誌檔案的內容,千萬不要使用rm刪除檔案然後再建立一個新的空檔案,因為在兩次操作的間隔,系統可能需要存取該檔案。下面是清理檔案內容的安全方法:
$ :>file-to-be-cleared
下面的指令可以建立空檔案:
$ 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
chroot
chroot
程式,chroot(8)
,不需要重啟系統,就可以在單獨的系統上同時執行多個不同的GNU/Linux環境。
還可以在較快主電腦的chroot下執行某些需耗大量系統資來源記憶體的程式如apt-get
或dselect
,並將較慢子機的硬碟通過NFS方式掛載到主電腦,開放讀/寫權限,在主電腦上以chroot方式操作子機。
chroot
來執行不同版本的Debian
在Woody中使用debootstrap
指令很容易構造chroot
Debian體系。例如,在一臺擁有快速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 /sid-root/proc proc none 0 0" >> /etc/fstab main # mount proc-sid /sid-root/proc -t proc main # cp /etc/hosts /sid-root/etc/hosts main # chroot /sid-root /bin/bash 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/ch-preparing#s-linux-upgrade
。
chroot
登入輸入chroot /sid-root /bin/bash非常簡單,但這將沿用目前的的所有環境變量,你可能並不希望這樣並且有時還會出問題。更好的方法是,在別的虛擬終端設備上執行另一個登入進程,登入到chroot目錄。
在Debian系統中預設值從tty1到tty6執行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
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 # 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
來改變第一個虛擬終端裝置,使其在vt7到vt9上建立虛擬終端設備。
現在可以很容易地能過切換Linux虛擬終端設備來實現在主系統的X環境和chroot系統的X環境之間轉換,例如使用Ctrl-Alt-F7和Ctrl-Alt-F9。酷吧!
[FIXME] 在chroot系統下gdm
的initscript中添加一條注釋和一條連結。
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 節中描述的內容。
chroot
來編譯軟體
這兒有一個很特殊的chroot套服軟體pbuilder
,它構造一個chroot系統並在其中編譯套服軟體。該體系可用於檢查套服軟體編譯時關聯關係是否正確,並確保編譯生成的套服軟體中沒有不必要的或錯誤的關聯關係。
檢查兩個檔案是否是指向同一個檔案的兩個硬連結:
$ ls -li file1 file2
mount
硬碟上的映象檔案
如果 file.img
檔案是硬碟內容的對映檔案,而且原始硬碟的群組態參數為 xxxx =
(bytes/sector) *
(sectors/cylinder),那麼,下面的指令將其掛載到/mnt
:
# mount -o loop,offset=xxxx file.img /mnt
注意絕大部分的硬碟都是 512 bytes/sector。
取得 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 "*"
Linux 核心支援多種外來檔案系統,想存取它們只需將其掛載到合適的檔案系統下就行了。 對某些檔案系統,還提供專門工具不需要掛載,只依靠使用者空間的程式,不需要核心提供檔案系統支援,就能完整存取。
mtools
: for MSDOS filesystem (MS-DOS, Windows)
cpmtools
: for CP-M filesystem
hfsutils
: for HFS filesystem (native Macintosh)
hfsplus
: for HFS+ filesystem (modern Macintosh)
對於建立和檢查 MS-DOS FAT 檔案系統 dosfstools
非常有用。
這裡示範幾個危險的動作。當使用特權帳號:root時,負面影響的程度是相當嚴重。
在 "rm -rf .*" 這個例子中,".*" 表示包含 "." 和 "..",如果您有寫入上一層目錄的權限的話,那就會停止移除下一個目錄內的所有目錄。
由於您愚蠢地移除掉 /etc/passwd
是會造成相當嚴重的損失。Debian系統會慣例性地備份重要檔案到/var/backups/
。當你回存這些檔案時,請記得更改適當的權限。
# cp /var/backups/passwd /etc/passwd # chmod 644 /etc/passwd
Debian 參考手冊
CVS, 週一 四月 3 22:58:37 UTC 2005osamu@debian.org
asho@debian.org.tw