目录
這裡,描述配置和管理系統的基本技巧,大部分在控制檯操作。
對通過不可靠或斷斷續續的連線訪問遠端主機的人們而言,screen(1) 是一個非常有用的工具,因為它支援可中斷的網路連線。
表 9.1. 支援可中斷網路連線的程式列表
軟件包 | 流行度 | 大小 | 說明 |
---|---|---|---|
screen
|
V:185, I:284 | 987 | VT100/ANSI 終端模擬器混合複用的終端 |
tmux
|
V:29, I:107 | 659 | terminal multiplexer alternative (Use "Control-B" instead) |
screen(1) 不但允許一個終端視窗執行多個程序,還允許遠端 shell 程序支援中斷的連線.這裡是一個典型的 screen(1) 使用場景.
登入到一個遠端機器。
在單個控制檯上啟動 screen
。
使用 ^A c
("Control-A" 接著 "c")在 screen
中建立的視窗執行多個程式.
按 ^A n
("Control-A" 接著"n")來在多個 screen
視窗間轉換.
突然,你需要離開你的終端,但你不想丟掉正在做的工作,而這些工作需要連線來保持。
你可以通過任何方式分離 screen
會話。
殘忍地拔掉你的網路連線
輸入 ^A d
("Control-A" 接著 "d") 並手工從遠端連線退出登入
輸入 ^A DD
("Control-A" 接著 "DD") 分離
screen
並退出登入
你重新登入到同一個遠處主機(即使從不同的終端)。
使用 "screen -r
" 啟動 screen
.
screen
魔術般的重新附上先前所有的
screen
視窗和所有在活動執行的程式.
![]() |
提示 |
---|---|
對於撥號或者按包計費的網路連線,你可以通過 |
在 screen
會話裡,除了命令按鍵外的所有鍵盤輸入都會被髮送到當前視窗。
screen
所有命令按鍵是通過 ^A
("Control-A")
加單個鍵[加任何引數] 來輸入.這裡有一些重要的命令按鍵需要記住。
表 9.2. screen 鍵繫結列表
鍵綁定功能 | 說明 |
---|---|
^A ?
|
顯示幫助螢幕(顯示鍵繫結) |
^A c
|
建立一個新的視窗並切換到該視窗 |
^A n
|
到下一個視窗 |
^A p
|
到前一個視窗 |
^A 0
|
到 0 號視窗 |
^A 1
|
到 1 號視窗 |
^A w
|
顯示視窗列表 |
^A a
|
作為鍵盤輸入傳送 Ctrl-A 到當前視窗 |
^A h
|
把當前視窗的硬拷貝寫到一個檔案 |
^A H
|
開始/結束 當前視窗到檔案的記錄 |
^A ^X
|
鎖定終端(密碼保護) |
^A d
|
從終端分離 screen 會話 |
^A DD
|
分離 screen 會話並退出登入 |
細節參見 screen(1).
許多程式在"/var/log/
" 目錄下記錄它們的活動.
系統日誌後臺守護程序(daemon): rsyslogd(8)
這裡是主要的日誌分析軟體 ("~Gsecurity::log-analyzer
" 在
aptitude(8)
中).
表 9.3. 系統日誌分析軟體列表
軟件包 | 流行度 | 大小 | 說明 |
---|---|---|---|
logwatch
|
V:18, I:20 | 2214 | 用 Perl 寫的日誌分析軟體,有好的輸出 |
fail2ban
|
V:97, I:108 | 1731 | 禁用造成多個認證錯誤的 IP |
analog
|
V:5, I:125 | 3529 | web 伺服器日誌分析 |
awstats
|
V:11, I:18 | 6799 | 強大和特性全面的 web 伺服器日誌分析 |
sarg
|
V:5, I:5 | 429 | 生成 squid 分析報告 |
pflogsumm
|
V:1, I:4 | 111 | Postfix 日誌條目概要 |
syslog-summary
|
V:1, I:4 | 30 | 總結 syslog 日誌檔案內容 |
fwlogwatch
|
V:0, I:0 | 474 | 防火牆日誌分析軟體 |
squidview
|
V:0, I:1 | 192 | 監控和分析 squid access.log 檔案 |
swatch
|
V:0, I:0 | 100 | 有正則表示式、高亮和曲線的日誌檔案檢視器 |
crm114
|
V:0, I:0 | 1099 | Controllable Regex Mutilator 和垃圾郵件過濾 (CRM114) |
icmpinfo
|
V:0, I:0 | 39 | 解釋 ICMP 資訊 |
![]() |
注意 |
---|---|
CRM114 提供語言架構來寫模糊 過濾器,使用了 TRE 正則表示式庫 。它主要在垃圾郵件過濾器中使用,但也能夠用於日誌分析。 |
簡單地使用 script(1) (參見 第 1.4.9 节 “記錄shell活動”)記錄 shell 活動會產生一個有控制字元的檔案。這些控制字元可以按下面的方式,使用 col(1) 去掉。
$ script Script started, file is typescript
做些操作……按 Ctrl-D
退出 script
.
$ col -bx <typescript >cleanedfile $ vim cleanedfile
如果你沒有 script
(例如:在 initramfs 裡的啟動過程中),你可以使用下面的方式代替。
$ sh -i 2>&1 | tee typescript
![]() |
提示 |
---|---|
像 |
![]() |
提示 |
---|---|
你可以使用
screen(1)
和 " |
![]() |
提示 |
---|---|
你可以使用
emacs(1)
和 " |
儘管例如 more(1) 和 less(1) 這樣的分頁程式(參見 第 1.4.5 节 “文件內容查看”)和用於高亮和格式的自定義工具(參見 第 11.1.8 节 “高亮並格式化純文字資料”)可以漂亮地顯示文字資料,但通用的編輯器 (參見 第 1.4.6 节 “文本編輯器”)是用途最廣的,且可定製性最高。
![]() |
提示 |
---|---|
對於
vim(1)
和它的分頁模式別名
view(1),“ |
“ls -l
” 命令預設的時間和日期顯示格式取決於語言環境(相關的值參見 第 1.2.6 节 “時間戳”)。“$LANG
” 變數將被首先考慮,但它會被
“$LC_TIME
” 變數覆蓋。
每個語言環境實際的預設顯示格式取決於所使用的 C 標準庫的版本(libc6
軟體包),也就是說,不同的
Debian 發行版有不同的預設情況。
如果你真的想自定義超出語言環境的時間和日期顯示格式,你應該通過
“--time-style
” 引數或 “$TIME_STYLE
”
的值來設定時間樣式值(參見ls(1)、date(1)、“info
coreutils 'ls invocation'
”)。
表 9.4. wheezy
中 “ls -l
” 命令時間和日期的顯示案例
時間樣式值 | 語言環境 | 時間和日期顯示 |
---|---|---|
iso
|
任何值 |
01-19 00:15
|
long-iso
|
任何值 |
2009-01-19 00:15
|
full-iso
|
任何值 |
2009-01-19 00:15:16.000000000 +0900
|
locale
|
C
|
Jan 19 00:15
|
locale
|
en_US.UTF-8
|
Jan 19 00:15
|
locale
|
es_ES.UTF-8
|
ene 19 00:15
|
+%d.%m.%y %H:%M
|
任何值 |
19.01.09 00:15
|
+%d.%b.%y %H:%M
|
C or en_US.UTF-8
|
19.Jan.09 00:15
|
+%d.%b.%y %H:%M
|
es_ES.UTF-8
|
19.ene.09 00:15
|
![]() |
提示 |
---|---|
你可以使用命令別名以避免在命令列中輸入長的選項,例如 “ |
![]() |
提示 |
---|---|
ISO 8601 遵循這些 iso 格式。 |
大部分現代終端的 shell 中 echo 能夠使用 ANSI
轉義字元來顯示顏色(參見
“/usr/share/doc/xterm/ctlseqs.txt.gz
”)。
嘗試下列例子
$ RED=$(printf "\x1b[31m") $ NORMAL=$(printf "\x1b[0m") $ REVERSE=$(printf "\x1b[7m") $ echo "${RED}RED-TEXT${NORMAL} ${REVERSE}REVERSE-TEXT${NORMAL}"
在互動式的環境下,命令的輸出帶顏色,能夠給檢查命令的輸出帶來便利。
我在我的"~/.bashrc
"里加入了下面內容.
if [ "$TERM" != "dumb" ]; then eval "`dircolors -b`" alias ls='ls --color=always' alias ll='ls --color=always -l' alias la='ls --color=always -A' alias less='less -R' alias ls='ls --color=always' alias grep='grep --color=always' alias egrep='egrep --color=always' alias fgrep='fgrep --color=always' alias zgrep='zgrep --color=always' else alias ll='ls -l' alias la='ls -A' fi
在互動式命令中,使用別名來限制顏色的影響範圍。匯出環境變數 "export
GREP_OPTIONS='--color=auto'
" 也有好處,這樣能夠讓
less(1)
之類的頁面程式看到顏色。當使用管道到其它命令時,你想去掉顏色,上面列子 "~/.bashrc
" 中的內容,可以使用
"--color=auto
" 代替.
![]() |
提示 |
---|---|
在互動式的環境中,通過" |
你能夠記錄編輯器複雜的重複操作動作。
對於 Vim,請按下面操作。
"qa
": 開始記錄輸入字元到有名字的暫存器 "a
".
… 編輯器操作
"q
": 結束記錄輸入的字元。
"@a
":執行暫存器 "a
的內容".
對於 Emacs, 請按下面操作。
"C-x (
": 開始定義一個鍵盤巨集.
… 編輯器操作
"C-x )
":結束定義一個鍵盤巨集.
"C-x e
": 執行一個鍵盤巨集.
有少量方法可以記錄 X 應用程式的影象,包括xterm
顯示。
表 9.5. 圖形影象處理工具列表
軟件包 | 流行度 | 大小 | 命令 |
---|---|---|---|
xbase-clients
|
I:49 | 46 | xwd(1) |
gimp
|
V:84, I:506 | 16413 | GUI 選單 |
imagemagick
|
V:64, I:560 | 205 | import(1) |
scrot
|
V:9, I:92 | 50 | scrot(1) |
有特定的工具可以通過 DVCS 系統的幫助來記錄配置檔案的變更。
表 9.6. 在 VCS 中記錄配置歷史的軟體包
軟件包 | 流行度 | 大小 | 說明 |
---|---|---|---|
etckeeper
|
V:25, I:29 | 153 | 使用 Git(預設)、Mercurial 或 Bazaar(新)來儲存配置檔案和它們的元資料 |
changetrack
|
V:0, I:0 | 62 | 使用 RCS(舊)儲存配置檔案 |
我建議使用帶有
git(1)
的 etckeeper
軟體包,它將整個 “/etc
” 置於 VCS
控制之下。它的安裝指南和教程參見 “/usr/share/doc/etckeeper/README.gz
”。
從本質上講,執行 “sudo etckeeper init
” 來為
“/etc
” 初始化 git 倉庫,與 第 10.6.5 节 “記錄配置歷史的 Git” 中所解釋的過程相似,但需要特殊的 hook
指令碼來進行更全面的設定。
當你改變你的配置時,你可以使用 git(1) 來正常地記錄它們。你每次執行軟體包管理命令時,它也會自動記錄變更。
![]() |
提示 |
---|---|
你可以通過執行 “ |
程式活動能夠使用特殊的工具監控和控制。
表 9.7. 監控和控制程式活動工具列表
軟件包 | 流行度 | 大小 | 說明 |
---|---|---|---|
coreutils
|
V:878, I:999 | 15016 | nice(1): 用指定的排程優先權執行一個程式 |
bsdutils
|
V:851, I:999 | 256 | renice(1): 調整一個目前在執行的程序的排程優先權值 |
procps
|
V:813, I:999 | 695 |
"/proc " 檔案系統工具:
ps(1),
top(1),
kill(1),
watch(1),
…
|
psmisc
|
V:383, I:946 | 526 |
"/proc " 檔案系統工具:
killall(1),
fuser(1),
peekfd(1),
pstree(1)
|
time
|
V:28, I:563 | 82 | time(1):執行一個程式,並從時間消耗方面來報告系統資源的使用 |
sysstat
|
V:126, I:146 | 1454 | sar(1), iostat(1), mpstat(1), …: linux 系統性能工具 |
isag
|
V:0, I:4 | 109 | sysstat 的互動式的系統活動圖 |
lsof
|
V:193, I:947 | 440 | lsof(8):
使用 "-p " 選項列出被一個系統程序開啟的檔案
|
strace
|
V:19, I:159 | 1399 | strace(1):跟蹤系統呼叫和訊號 |
ltrace
|
V:1, I:21 | 360 | ltrace(1): 跟蹤庫呼叫 |
xtrace
|
V:0, I:1 | 333 | xtrace(1):跟蹤 X11 客戶端和伺服器端之間的通訊 |
powertop
|
V:6, I:236 | 612 | powertop(1):系統能耗使用資訊 |
cron
|
V:875, I:997 | 251 | 根據 cron(8) 後臺守護程序(daemon)的排程執行一個程序 |
anacron
|
V:453, I:539 | 106 | 用於非整天 24 小時執行系統的命令計劃,類 cron |
at
|
V:333, I:579 | 149 | at(1) 或 batch(1): 在一個特定的時間執行任務或在某一系統負載下執行 |
![]() |
提示 |
---|---|
|
顯示 命令呼叫程序的時間消耗。
# time some_command >/dev/null real 0m0.035s # 執行時間 (佔用的真實時間) user 0m0.000s # 使用者模式時間 sys 0m0.020s # 核心模式時間
程序的排程優先順序是被一個程序優先順序值控制。
# nice -19 top # 非常優先 # nice --20 wodim -v -eject speed=2 dev=0,0 disk.img # 非常快
在某些情況下,極端的程序優先順序值會對系統造成傷害。小心使用這個命令。
在 Debian 系統上的 ps(1) 命令同時支援 BSD 和 SystemV 特徵,有助於識別靜態的程序活動。
對於殭屍(死了的)子程序,你能夠通過 "PPID
" 欄位的父程序 ID 來殺死它們。
pstree(1) 命令顯示程序樹。
Debian 系統上的 top(1) 擁有豐富的特徵,有助於識別程序有趣的動態行為。
It is an interactive full screen program. You can get its usage help press by pressing the "h"-key and terminate it by pressing the "q"-key.
你能夠通過一個程序 ID(PID)來列出該程序所有開啟的檔案,例如,PID 為 1 的程序,使用下面的方式。
$ sudo lsof -p 1
PID=1 通常用於 init
程式.
你能夠跟蹤程式活動,使用strace(1), ltrace(1), xtrace(1) 來跟蹤系統呼叫和訊號、庫呼叫、X11 客戶端和伺服器端之間的通訊。
跟蹤 ls
命令的系統呼叫。
$ sudo strace ls
你可以通過
fuser(1)
來識別出使用檔案的程序,例如,用下面的方式識別出 "/var/log/mail.log
" 由哪個程序開啟。
$ sudo fuser -v /var/log/mail.log USER PID ACCESS COMMAND /var/log/mail.log: root 2946 F.... rsyslogd
你可以看到 "/var/log/mail.log
" 是由
rsyslogd(8)
命令開啟並寫入。
你可以通過
fuser(1)
來識別出使用套接字的程序,例如,用下面的方式識別出 "smtp/tcp
" 由哪個程序開啟。
$ sudo fuser -v smtp/tcp USER PID ACCESS COMMAND smtp/tcp: Debian-exim 3379 F.... exim4
通過匹配某些條件的檔案來迴圈重複一個命令,有幾種方法,例如,匹配全域性模式"*.ext
".
Shell 迴圈方式(參見 第 12.1.4 节 “shell 迴圈”):
for x in *.ext; do if [ -f "$x"]; then command "$x" ; fi; done
find(1) 和 xargs(1) 聯合:
find . -type f -maxdepth 1 -name '*.ext' -print0 | xargs -0 -n 1 command
find(1)
使用 "-exec
" 選項並執行命令:
find . -type f -maxdepth 1 -name '*.ext' -exec command '{}' \;
find(1)
使用 "-exec
" 選項並執行一個短的 shell 指令碼:
find . -type f -maxdepth 1 -name '*.ext' -exec sh -c "command '{}' && echo 'successful'" \;
上面的列子確保適當處理怪異的檔名(如包含空格)。 find(1) 更多高階的用法,參見 第 10.1.5 节 “查詢檔案的語法”.
對於 命令列介面(command-line
interface,CLI),$PATH
環境變數所指定的目錄中第一個匹配相應名稱的程式會被執行。參見 第 1.5.3 节 “"$PATH
" 變數”。
對於遵從 freedesktop.org 標準的 圖形使用者介面(graphical user
interface,GUI),/usr/share/applications/
目錄中的
*.desktop
檔案給每個程式的 GUI 選單顯示提供了必要的屬性。參見 第 7.2.2 节 “Freedesktop.org 選單”。
舉個例子,chromium.desktop
檔案中為 “Chromium 網路瀏覽器” 定義了相關屬性,例如程式名
“Name”,程式執行路徑和引數 “Exec”,所使用的圖示 “Icon” 等等(參見 桌面配置項規範)。檔案內容如下:
[Desktop Entry] Version=1.0 Name=Chromium Web Browser GenericName=Web Browser Comment=Access the Internet Comment[fr]=Explorer le Web Exec=/usr/bin/chromium %U Terminal=false X-MultipleArgs=false Type=Application Icon=chromium Categories=Network;WebBrowser; MimeType=text/html;text/xml;application/xhtml_xml;x-scheme-handler/http;x-scheme-handler/https; StartupWMClass=Chromium StartupNotify=true
這是一個較為簡單的說明。*.desktop
檔案像下面那樣被搜尋。
桌面環境設定 $XDG_DATA_HOME
和 $XDG_DATA_DIR
環境變數。舉個例子,在 GNOME 3 中:
未設定 $XDG_DATA_HOME
。(將使用預設值
$HOME/.local/share
。)
$XDG_DATA_DIRS
被設定為
/usr/share/gnome:/usr/local/share/:/usr/share/
。
基準目錄(參見 XDG Base Directory
Specification)和應用程式
目錄如下所示。
$HOME/.local/share/
→
$HOME/.local/share/applications/
/usr/share/gnome/
→
/usr/share/gnome/applications/
/usr/local/share/
→
/usr/local/share/applications/
/usr/share/
→ /usr/share/applications/
*.desktop
檔案將按照這個順序在這些 applications
目錄中進行搜尋。
![]() |
提示 |
---|---|
要建立一個使用者自定義的 GUI 選單項,需要在 |
![]() |
提示 |
---|---|
相似地,如果在這些基準目錄下的 |
![]() |
提示 |
---|---|
相似地,如果在 |
一些程式會被另一個程式自動啟動。下面是自定義該過程的方法。
應用程式配置選單:
GNOME3 桌面:“設定” → “系統” → “詳細資訊” → “預設應用程式”
KDE 桌面: "K" → "Control Center 控制中心" → "KDE Components 元件" → "Component Chooser 元件選擇器"
Iceweasel 瀏覽器:“編輯” → “首選項” → “應用程式”
mc(1):“/etc/mc/mc.ext
”
例如
“$BROWSER
”、“$EDITOR
”、“$VISUAL
”
和 “$PAGER
” 這樣的環境變數(參見
eviron(7))
用於例如
“editor
”、“view
”、“x-www-browser
”、“gnome-www-browser
”
和 “www-browser
” 這樣的程式的
update-alternatives(1)
系統(參見 第 1.4.7 节 “設置默認文本編輯器”)
“~/.mailcap
” 和 “/etc/mailcap
”
檔案的內容關聯了程式的 MIME 型別(參見
mailcap(5))
“~/.mime.types
” 和 “/etc/mime.types
”
檔案的內容關聯了 MIME 型別的副檔名(參見
run-mailcap(1))
![]() |
提示 |
---|---|
update-mime(8)
會更新 " |
![]() |
提示 |
---|---|
|
![]() |
提示 |
---|---|
為了在 X 下執行例如 |
# cat /usr/local/bin/mutt-term <<EOF #!/bin/sh gnome-terminal -e "mutt \$@" EOF chmod 755 /usr/local/bin/mutt-term
使用 kill(1) 通過程序 ID 來殺死(傳送一個訊號)一個程序。
使用 killall(1) 或 pkill(1) 通過程序命令的名字或其它屬性來做同樣的事情。
使用 cron(8) 來進行定時任務安排。參見 crontab(1) 和 crontab(5).
你能夠作為一個普通使用者定時執行一個程序,比如, foo
使用 "crontab
-e
" 命令建立一個
crontab(5)
的檔案 "/var/spool/cron/crontabs/foo
"。
這裡是一個 crontab(5) 檔案的列子。
# 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
![]() |
提示 |
---|---|
對那些非連續執行的系統,安裝 |
![]() |
提示 |
---|---|
對於定時系統維護指令碼,你能夠以root 賬戶定時執行,把這類指令碼放入 " |
核心編譯選項 "Magic SysRq key" (SAK 鍵)提供預防系統故障的措施,該選項現在是 Debian 核心的預設值。按 Alt-SysRq 鍵,接著按下面鍵中的一個鍵,會做拯救系統的神奇事情。
表 9.11. SAK命令鍵列表
Alt-SysRq 之後的鍵 | 行為描述 |
---|---|
r
|
在 X 崩潰後,從 raw 模式恢復鍵盤 |
0
|
把控制檯日誌級別改變到 0 來減少錯誤資訊 |
k
|
kill 在當前虛擬控制檯上的所有程序 |
e
|
傳送 SIGTERM 到所有程序,除開 init(8) |
i
|
傳送 SIGKILL 到所有程序,除開 init(8) |
s
|
sync 所有已經掛載的檔案系統來避免資料損壞 |
u
|
重新以只讀方式掛載所有已掛載的檔案系統 (umount) |
b
|
reboot 系統,不同步或解除安裝 |
![]() |
提示 |
---|---|
閱讀 signal(7), kill(1) 和 sync(1) 手冊頁來理解上面的描述。 |
"Alt-SysRq s", "Alt-SysRq u" 和 "Alt-SysRq r" 組合,有助於跳出真正壞的情形,並可以在不停止系統的情況下獲得可用的鍵盤。
參見
"/usr/share/doc/linux-doc-3.*/Documentation/sysrq.txt.gz
".
![]() |
小心 |
---|---|
由於允許使用者訪問 root 許可權的功能,Alt-SysRq 特性可能被認為是安全風險。在
" |
![]() |
提示 |
---|---|
從 SSH 終端等,你能夠通過向 " |
你可以通過下面的方法檢查誰登入在系統裡。
who(1) 顯示誰登入在系統裡面。
w(1) 顯示誰登入在系統裡面,他們在做什麼。
last(1) 顯示使用者最後登入的列表。
lastb(1) 顯示使用者最後錯誤登入的列表。
![]() |
提示 |
---|---|
" |
對於 PCI 類裝置(AGP, PCI-Express, CardBus, ExpressCard 等), 一開始就使用
lspci(8)
(也許加上 "-nn
" 選項) 進行硬體識別比較好。
此外,你可以通過閱讀 "/proc/bus/pci/devices
"
裡面的內容或瀏覽"/sys/bus/pci
" 下面的目錄樹來進行硬體識別(參見 第 1.2.12 节 “procfs 和 sysfs”).
表 9.12. 硬體識別工具列表
軟件包 | 流行度 | 大小 | 說明 |
---|---|---|---|
pciutils
|
V:175, I:993 | 1220 | Linux PCI 工具: lspci(8) |
usbutils
|
V:103, I:866 | 721 | Linux USB 工具: lsusb(8) |
pcmciautils
|
V:21, I:40 | 94 | Linux PCMCIA 工具: pccardctl(8) |
scsitools
|
V:0, I:4 | 365 | SCSI 硬體管理工具集: lsscsi(8) |
procinfo
|
V:1, I:15 | 122 |
從 "/proc ":
lsdev(8)
獲得系統資訊
|
lshw
|
V:9, I:86 | 671 | 硬體配置資訊: lshw(1) |
discover
|
V:39, I:938 | 90 | 硬體識別系統: discover(8) |
像 GNOME 和 KDE 這類現代圖形桌面系統,雖然大部分硬體的配置都能夠通過相應的圖形配置工具來管理,但知道一些配置它們的基礎方式,也是一個好的主意。
表 9.13. 硬體配置工具列表
軟件包 | 流行度 | 大小 | 說明 |
---|---|---|---|
console-setup
|
V:330, I:945 | 438 | Linux 控制檯字型和鍵盤表工具 |
x11-xserver-utils
|
V:361, I:589 | 516 | X 服務端工具: xset(1), xmodmap(1) |
acpid
|
V:346, I:628 | 143 | 管理高階可配置和電源介面(ACPI)事件分發的後臺守護程序(daemon) |
acpi
|
V:28, I:603 | 45 | 顯示 ACPI 裝置資訊的工具 |
apmd
|
V:0, I:7 | 132 | 管理高階電源管理(APM)事件分發的後臺守護程序(daemon) |
sleepd
|
V:0, I:0 | 79 | 在筆記本空閒時,使其進入休眠狀態的後臺守護程序(daemon) |
hdparm
|
V:345, I:567 | 246 | 硬碟訪問優化 (參見 第 9.5.9 节 “硬碟優化”) |
smartmontools
|
V:120, I:191 | 1716 | 使用 S.M.A.R.T. 控制和監控儲存系統 |
setserial
|
V:5, I:11 | 113 | 串列埠管理工具集 |
memtest86+
|
V:1, I:34 | 2391 | 記憶體硬體管理工具集 |
scsitools
|
V:0, I:4 | 365 | SCSI 硬體管理工具集 |
setcd
|
V:0, I:1 | 35 | 光碟機訪問優化 |
big-cursor
|
I:0 | 27 | X 系統的大滑鼠游標 |
![]() |
提示 |
---|---|
現代系統的 CPU 頻率調整功能,是由核心模組 |
下面設定系統的硬體時間為:MM/DD hh:mm, CCYY.
# date MMDDhhmmCCYY # hwclock --utc --systohc # hwclock --show
Debian 系統的時間通常顯示為本地時間,但硬體時間通常使用 UTC(GMT) 時間。
如果硬體(BIOS)時間設定為 UTC
時間,請在“/etc/default/rcS
”裡面設定“UTC=yes
”。
下面是重新配置 Debian 系統使用的時區。
# dpkg-reconfigure tzdata
如果你希望通過網路來更新系統時間,考慮使用 ntp
, ntpdate
和
chrony
這類包提供的 NTP 服務。
![]() |
提示 |
---|---|
在 systemd 下,是使用
|
看下面。
ntp-doc
包
![]() |
提示 |
---|---|
在 |
有幾個元件可以用來配置字元控制檯和 ncurses(3) 系統功能。
“/etc/terminfo/*/*
”
檔案(terminfo(5))
“$TERM
”
環境變數(term(7))
setterm(1)、stty(1)、tic(1) 和 toe(1)
如果 xterm
的 terminfo
對非 Debian 的
xterm
不起作用,則當你從遠端登陸到 Debian 系統時,你需要改變你的終端型別
“$TERM
”,從 “xterm
” 更改為功能受限的版本(例如
“xterm-r6
”)。更多內容參見
“/usr/share/doc/libncurses5/FAQ
”。“dumb
”
是 “$TERM
” 中最通用的。
用於現在的 Linux 的音效卡裝置驅動程式由 高階 Linux 聲音體系(Advanced Linux Sound Architecture,ALSA) 提供。ALSA 提供了相容之前的 開放聲音系統(Open Sound System,OSS)的模擬模式。
![]() |
提示 |
---|---|
使用 “ |
![]() |
提示 |
---|---|
如果你無法聽到聲音,那你的揚聲器可能連線到了一個靜音輸出。現代的聲音系統有許多輸出。 |
應用軟體可被配置為不僅直接訪問聲音裝置,也可以通過一些標準化聲音伺服器系統來訪問它們。
表 9.14. 聲音軟體包
軟件包 | 流行度 | 大小 | 說明 |
---|---|---|---|
alsa-utils
|
V:389, I:535 | 2103 | 配置和使用 ALSA 的工具 |
oss-compat
|
V:3, I:40 | 7 |
在 ALSA 下相容 OSS,預防 “/dev/dsp not found ” 錯誤
|
jackd
|
V:4, I:28 | 32 | JACK Audio Connection Kit. (JACK) 伺服器(低延遲) |
libjack0
|
V:0, I:16 | 337 | JACK Audio Connection Kit. (JACK) 庫(低延遲) |
nas
|
V:0, I:0 | 239 | 網路音訊系統(Network Audio System,NAS)伺服器 |
libaudio2
|
V:43, I:559 | 161 | 網路音訊系統(Network Audio System,NAS)庫 |
pulseaudio
|
V:372, I:512 | 6105 | PulseAudio 伺服器,替代 ESD |
libpulse0
|
V:269, I:656 | 989 | PulseAudio 客戶端庫,替代 ESD |
libgstreamer1.0-0
|
V:249, I:529 | 4860 | GStreamer:GNOME 聲音引擎 |
libphonon4
|
I:211 | 672 | Phonon:KDE 聲音引擎 |
每個流行的桌面環境通常都有一個通用的聲音引擎。每個被應用程式使用的聲音引擎都可以選擇連線到不同的聲音伺服器。
關閉螢幕保護,使用下面的命令。
表 9.15. 關閉螢幕保護命令列表
環境 | 命令 |
---|---|
Linux 控制檯 |
setterm -powersave off
|
X 視窗(關閉螢幕保護) |
xset s off
|
X 視窗(關閉 dpms) |
xset -dpms
|
X 視窗(螢幕保護 GUI 配置) |
xscreensaver-command -prefs
|
可以把電腦的揚聲器拔掉來關閉蜂鳴聲。把 pcspkr
核心模組刪除,也可以做到這點。
bash(1) 用到的 readline(3) 程式,當遇到告警字元(ASCII=7)時,將會發生。下面的操作將阻止發生。
$ echo "set bell-style none">> ~/.inputrc
對你來說,這裡有兩種可用的方法來得到記憶體的使用情況。
“/var/log/dmesg
” 中的核心啟動資訊包含了可用記憶體的精確總大小。
free(1) 和 top(1) 顯示正在執行的系統中記憶體資源的相關資訊。
下面是一個例子。
# grep '\] Memory' /var/log/dmesg [ 0.004000] Memory: 990528k/1016784k available (1975k kernel code, 25868k reserved, 931k data, 296k init) $ free -k total used free shared buffers cached Mem: 997184 976928 20256 0 129592 171932 -/+ buffers/cache: 675404 321780 Swap: 4545576 4 4545572
你可能會覺得奇怪:“dmesg 告訴你 free 為 990 MB,而 free -k 告訴你 free 為 320 MB。這丟失了超過 600 MB ……”。
別擔心 “Mem:
” 這行中 “used
” 較大的值以及
“free
” 較小的值,放輕鬆,你需要檢視的是下面的那個(在上面的例子中它們是 675404 和 321780)。
對於我的 MacBook,有 1GB=1048576k 記憶體(顯示卡系統用掉一些),我看到的如下。
表 9.16. 報告的記憶體大小
報告 | 大小 |
---|---|
dmesg 中 total 的大小 | 1016784k = 1GB - 31792k |
dmesg 中的 free | 990528k |
shell 下的 total | 997184k |
shell 下的 free | 20256k(但有效的為 321780k) |
糟糕的系統維護可能會暴露你的系統,導致它被外部非法使用。
對於系統安全性和完整性的檢查,你需要從下面這些方面開始。
debsums
軟體包,參見
debsums(1)
和 第 2.5.2 节 “頂層“Release”檔案及真實性”。
chkrootkit
軟體包,參見
chkrootkit(1)。
clamav
軟體包家族,參見
clamscan(1)
和
freshclam(1)。
表 9.17. 用於系統安全性和完整性檢查的工具
軟件包 | 流行度 | 大小 | 說明 |
---|---|---|---|
logcheck
|
V:11, I:13 | 152 | 後臺守護程序(daemon),將系統日誌檔案中的異常通過郵件傳送給管理員 |
debsums
|
V:6, I:38 | 120 | 實用程式,使用 MD5 校驗碼對已安裝軟體包的檔案進行校驗 |
chkrootkit
|
V:7, I:27 | 954 | rootkit 檢測軟體 |
clamav
|
V:15, I:67 | 893 | Unix 的反病毒實用程式 —— 命令列介面 |
tiger
|
V:3, I:3 | 2485 | 報告系統安全漏洞 |
tripwire
|
V:3, I:4 | 11480 | 檔案和目錄完整性檢測軟體 |
john
|
V:2, I:14 | 449 | 先進的密碼破解工具 |
aide
|
V:2, I:2 | 2038 | 高階入侵環境檢測 —— 靜態二進位制 |
integrit
|
V:0, I:0 | 313 | 檔案完整性驗證程式 |
crack
|
V:0, I:0 | 128 | 密碼猜測程式 |
下面是一個簡單的指令碼,用來檢測典型的所有人可寫的錯誤檔案許可權。
# find / -perm 777 -a \! -type s -a \! -type l -a \! \( -type d -a -perm 1777 \)
![]() |
小心 |
---|---|
由於 |
使用 live CD 或 debian-installer CD 以救援模式啟動你的系統,可以讓你簡單地重新配置你的啟動裝置的資料儲存。
硬碟空間的使用情況可以通過 mount
、coreutils
和
xdu
軟體包提供的程式來評估:
mount(8) 顯示所有掛載的檔案系統(= 磁碟).
df(1) 報告檔案系統使用的硬碟空間。
du(1) 報告目錄樹使用的硬碟空間。
![]() |
提示 |
---|---|
你可以將
du(8)
的輸出傳輸給
xdu(1x),來使用它的圖形互動式演示,例如
“ |
對於硬碟分割槽配置,儘管 fdisk(8) 被認為是標準的配置,但是 parted(8) 工具還是值得注意的。
大多數 PC 使用經典的主引導記錄(Master Boot Record,MBR)方案,將硬碟分割槽資料儲存在第一個扇區,即 LBA 扇區 0(512 位元組)。
![]() |
注意 |
---|---|
一些帶有可擴充套件韌體介面(Extensible Firmware Interface,EFI)的新 PC,包括基於 Intel 的 Mac,使用 全域性唯一標識分割槽表(GUID Partition Table,GPT)方案,硬碟分割槽資料不儲存在第一個扇區。 |
儘管 fdisk(8) 一直是硬碟分割槽的標準工具,但現在 parted(8) 替代了它。
表 9.18. 硬碟分割槽管理軟體包
軟件包 | 流行度 | 大小 | GPT | 說明 |
---|---|---|---|---|
util-linux
|
V:877, I:999 | 3328 | 不支持 | 多種系統工具,包含 fdisk(8) 和 cfdisk(8) |
parted
|
V:368, I:572 | 278 | 支持 | GNU Parted,硬碟分割槽調整程式 |
gparted
|
V:25, I:146 | 7231 | 支持 |
基於 libparted 的 GNOME 分割槽編輯程式
|
gdisk
|
V:60, I:506 | 779 | 支持 | 用於 GPT 硬碟的分割槽編輯程式 |
kpartx
|
V:14, I:27 | 84 | 支持 | 為分割槽建立裝置對映的程式 |
![]() |
小心 |
---|---|
儘管 parted(8) 聲稱也能用來建立和調整檔案系統,但使用維護最好的專門工具來做這些事會更為安全,例如 mkfs(8)(mkfs.msdos(8)、mkfs.ext2(8)、mkfs.ext3(8)、mkfs.ext4(8)……)和 resize2fs(8)。 |
![]() |
注意 |
---|---|
為了在 GPT 和 MBR
之間切換,你需要直接刪除開頭的幾個塊中的內容(參見 第 9.7.6 节 “清空檔案內容”)並使用
“ |
儘管重新配置你的分割槽或可移動儲存介質的啟用順序可能會給分割槽產生不同的名字,但你可以使用同一個 UUID 來訪問它們。如果你有多個硬碟並且你的 BIOS 沒有給它們一致的裝置名的話,使用 UUID 是不錯的選擇。
mount(8)
命令帶有 “-U
” 選項可以使用UUID
來掛載一個塊裝置,而不必使用他的檔名稱,例如 “/dev/sda3
”。
“/etc/fstab
”(參見
fstab(5))可以使用
UUID。
引載載入程式(第 3.1.2 节 “第二階段:引載加載程序”)也可以使用 UUID。
![]() |
提示 |
---|---|
你可以使用 blkid(8) 來檢視一個特定塊裝置的 UUID。 |
![]() |
提示 |
---|---|
如果需要的話,裝置(例如可移動儲存介質)的裝置節點可以通過 udev 規則 使其變為靜態。參見 第 3.3 节 “udev 系統”。 |
LVM2 是一個用於 Linux 核心的邏輯卷管理器。使用 LVM2 的話,硬碟分割槽可以建立在邏輯捲上來替代物理硬碟。
LVM 有下列需求。
Linux 核心中的裝置對映支援(Debian 核心預設支援)
使用者自定義裝置對映支援庫(libdevmapper*
軟體包)
使用者自定義 LVM2 工具(lvm2
軟體包)
請從下面的 man 手冊開始瞭解 LVM2。
lvm(8):LVM2 機制的基礎知識(列出了所有 LVM2 命令)
lvm.conf(5):LVM2 的配置檔案
lvs(8):報告邏輯卷的相關資訊
vgs(8):報告卷組的相關資訊
pvs(8):報告物理卷的相關資訊
對於 ext4 檔案系統, e2fsprogs
包提供下面的工具。
mkfs(8)
和
fsck(8)
命令是由 e2fsprogs
包提供的,是各種檔案系統相關程式的前端。(mkfs.fstype
和
fsck.fstype
). 對於 ext4
檔案系統,它們是
mkfs.ext4(8)
和
fsck.ext4(8)
(它們被符號連結到
mke2fs(8)
和
e2fsck(8)).
Linux 支援的每一個檔案系統,有相似的命令。
表 9.19. 檔案系統管理包列表
軟件包 | 流行度 | 大小 | 說明 |
---|---|---|---|
e2fsprogs
|
V:535, I:999 | 1224 | ext2/ext3/ext4 檔案系統工具 |
reiserfsprogs
|
V:10, I:25 | 891 | Reiserfs 檔案系統工具 |
dosfstools
|
V:102, I:570 | 235 | FAT 檔案系統工具. (Microsoft: MS-DOS, Windows) |
xfsprogs
|
V:18, I:88 | 4664 | XFS 檔案系統工具. (SGI: IRIX) |
ntfs-3g
|
V:218, I:563 | 1355 | NTFS 檔案系統工具. (Microsoft: Windows NT, …) |
jfsutils
|
V:1, I:13 | 1533 | JFS 檔案系統工具. (IBM: AIX, OS/2) |
reiser4progs
|
V:0, I:5 | 1325 | Reiser4 檔案系統工具 |
hfsprogs
|
V:0, I:9 | 303 | HFS 和 HFS Plus 檔案系統工具. (Apple: Mac OS) |
btrfs-tools
|
V:3, I:35 | 29 | Btrfs 檔案系統工具 |
zerofree
|
V:2, I:65 | 25 | 把 ext2/3/4 檔案系統上空閒塊設定為零的程式 |
![]() |
提示 |
---|---|
Ext4 檔案系統是 Linux 系統上預設的檔案系統,強烈推薦使用這個檔案系統,除非你有特殊的理由不使用。 |
![]() |
提示 |
---|---|
Btrfs 檔案系統在 Linux 核心 3.2(Debian
|
![]() |
警告 |
---|---|
在得到當前核心空間的 fsck(8) 特徵和引導管理器支援前,你的關鍵資料不應當使用 Btrfs 檔案系統。 |
![]() |
提示 |
---|---|
一些工具可以在沒有 Linux 核心支援的情況下訪問檔案系統(參見 第 9.7.2 节 “不掛載磁碟操作檔案”). |
mkfs(8) 在 Linux 系統上建立檔案系統。fsck(8) 命令在 Linux系統上提供檔案系統完整性檢查和修復功能。
在檔案系統建立後,Debian 現在預設不周期性的執行 fsck
。
![]() |
小心 |
---|---|
在已經掛載的檔案系統上執行 |
![]() |
提示 |
---|---|
在 " |
![]() |
提示 |
---|---|
從啟動腳本里面執行的
fsck(8)
命令結果,可以在 " |
“/etc/fstab
” 中包含了基礎的靜態檔案系統配置。例如,
# <file system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 UUID=709cbe4c-80c1-56db-8ab1-dbce3146d2f7 / ext4 noatime,errors=remount-ro 0 1 UUID=817bae6b-45d2-5aca-4d2a-1267ab46ac23 none swap sw 0 0 /dev/scd0 /media/cdrom0 udf,iso9660 user,noauto 0 0
![]() |
提示 |
---|---|
UUID(參見 第 9.5.3 节 “使用 UUID 訪問分割槽”)可以替代一般的塊裝置名稱(例如
“ |
一個檔案系統的效能和特性可以通過所用的掛載選項來進行優化(參見 fstab(5) 和 mount(8))。值得注意的有以下幾點。
“defaults
”
選項隱含的預設選項為:“rw,suid,dev,exec,auto,nouser,async
”。(通常)
“noatime
” 或 “relatime
”
選項對於加速讀取訪問非常有效。(通常)
“user
” 選項允許一個普通使用者掛載檔案系統。這個選項是
“noexec,nosuid,nodev
” 選項的組合。(通常,用於 CD 或 usb 儲存裝置)
“noexec,nodev,nosuid
” 選項組合被用來增強安全性。(通常)
"noauto
" 選項限制掛載,只有明確進行掛載操作才進行掛載(通常)
用於 ext3fs 的 “data=journal
” 選項可以增強電源故障時資料的完整性,但會損失一些寫入速度。
![]() |
提示 |
---|---|
配置 root 檔案系統非預設的日誌模式,你需要向核心提供啟動引數(參見 第 3.1.2 节 “第二階段:引載加載程序”),比如說
" |
一個檔案系統的特性可以使用 tune2fs(8) 命令通過超級塊來優化。
執行 “sudo tune2fs -l /dev/hda1
” 可以顯示
“/dev/hda1
” 上的檔案系統超級塊內容。
執行"sudo tune2fs -c 50 /dev/hda1
" 改變
"/dev/hda1
" 檔案系統的檢查(在啟動時執行 fsck
)頻率為每
50 次啟動.
執行 “sudo tune2fs -j /dev/hda1
” 會給檔案系統新增日誌功能,即
“/dev/hda1
” 的檔案系統從 ext2 轉換為
ext3。(對未掛載的檔案系統這麼做。)
執行 “sudo tune2fs -O extents,uninit_bg,dir_index /dev/hda1
&& fsck -pf /dev/hda1
” 在 “/dev/hda1
”
上將它從 ext3 轉換為 ext4。(對未掛載的系統這麼做。)
![]() |
警告 |
---|---|
在你折騰硬碟配置之前,請檢查你的硬體並閱讀 hdparam(8) 的 man 手冊頁,因為這可能會對資料完整性造成相當大的危害。 |
你可以通過 “hdparm -tT /dev/hda
” 來測試
“/dev/hda
” 硬碟的訪問速度。對於一些使用 (E)IDE 連線的硬碟,你可以使用
“hdparm -q -c3 -d1 -u1 -m16 /dev/hda
” 來啟用 “(E)IDE 32
位支援”、啟用 “using_dma flag”、設定 “interrupt-unmask flag” 並設定 “multiple 16 sector
I/O”(危險!),從而加速硬碟訪問速度。
你可以通過 “hdparm -W /dev/sda
” 來測試
“/dev/sda
” 硬碟的寫入快取功能。你可以使用 “hdparm -W 0
/dev/sda
” 關閉寫入快取功能。
現代高速 CD-ROM 光碟機,你可以使用 "setcd -x 2
" 降低速度,來讀取不當壓縮的 CDROM
光碟。
固態硬碟(solid state drive,SSD)的效能和硬碟磨損可以通過下列方式優化。
使用最新的 Linux 核心。(>= 3.2)
減少讀取硬碟訪問的硬碟寫入。
在 /etc/fstab
中設定 “noatime
” 或
“relatime
” 掛載選項。
啟用 TRIM 命令。
啟用 SSD 硬碟空間分配優化方案。
在 /etc/fstab
中為 Brtfs 設定 “ssd
” 掛載選項。
對於膝上型電腦,使系統每 10 分鐘重新整理資料到硬碟。
在 /etc/fstab
中設定 “commit=600
” 掛載選項。參見
fstab(5)。
設定 pm-utils 使用筆記本模式,即使在 AC 電源供電下。參見 Debian BTS #659260.
![]() |
警告 |
---|---|
將重新整理間隔從一般的 5 秒改為 10 分鐘會導致遇到電源故障時資料容易丟失。 |
你可以使用相容 SMART 的 smartd(8) 後臺守護程序(daemon)來監控和記錄你的硬碟。
安裝 smartmontools
軟體包。
通過 df(1) 列出硬碟驅動並識別它們。
讓我們假設要監控的硬碟為 “/dev/hda
”。
檢查 “smartctl -a /dev/hda
” 的輸出,看 SMART 功能是否已啟用。
如果沒有,通過 “smartctl -s on -a /dev/hda
” 啟用它。
通過下列方式執行 smartd(8) 後臺守護程序(daemon)。
消除 /etc/default/smartmontools
” 檔案中
“start_smartd=yes
” 的註釋。
通過 “sudo /etc/init.d/smartmontools restart
” 重新啟動
smartd(8)
後臺守護程序(daemon)。
![]() |
提示 |
---|---|
smartd(8)
後臺守護程序(daemon)可以使用 |
應用程式一般在臨時儲存目錄 “/tmp
” 下建立臨時檔案。如果 “/tmp
”
沒有足夠的空間,你可以通過 $TMPDIR
變數來為程式指定臨時儲存目錄。
在安裝時建立在 Logical Volume Manager 邏輯卷管理(LVM) (Linux 特性) 上的分割槽,它們可以容易的通過合併擴充套件或刪除擴充套件的方式改變大小,而不需要在多個儲存裝置上進行大量的重新配置。
如果你有一個空的分割槽(例如 “/dev/sdx
”),你可以使用
mkfs.ext4(1)
將它格式化,並使用
mount(8)
將它掛載到你需要更多空間的目錄。(你需要複製原始資料內容。)
$ sudo mv work-dir old-dir $ sudo mkfs.ext4 /dev/sdx $ sudo mount -t ext4 /dev/sdx work-dir $ sudo cp -a old-dir/* work-dir $ sudo rm -rf old-dir
![]() |
提示 |
---|---|
你也可以選擇掛載一個空硬碟映像檔案(參見 第 9.6.5 节 “製作空的磁碟映像檔案”)作為一個迴圈裝置(參見 第 9.6.3 节 “掛載磁碟映像檔案”)。實際的硬碟使用量會隨著實際儲存資料的增加而增加。 |
如果你在另一個分割槽裡有一個帶有可用空間的空目錄(例如 “/path/to/emp-dir
”),你可以通過帶有
“--bind
” 選項的 mount(8),將它掛載到一個你需要更多空間的目錄(例如
“work-dir
”)。
$ sudo mount --bind /path/to/emp-dir work-dir
If you have usable space in another partition (e.g.,
"/path/to/empty
" and "/path/to/work
"),
you can create a directory in it and stack that on to an old directory
(e.g., "/path/to/old
") where you need space using the
OverlayFS for Linux kernel 3.18 or newer
(Debian Stretch 9.0 or newer).
$ sudo mount -t overlay overlay \ -olowerdir=/path/to/old-dir,upperdir=/path/to/empty,workdir=/path/to/work
“/path/to/empty
” 和 “/path/to/work
”
應該位於可讀寫的分割槽,從而能夠寫入 “/path/to/old
”。
![]() |
小心 |
---|---|
This is a deprecated method. Some software may not function well with "symlink to a directory". Instead, use the "mounting" approaches described in the above. |
如果你在另一個分割槽裡有一個帶有可用空間的空目錄(例如 “/path/to/emp-dir
”),你可以使用
ln(8)
建立目錄的一個符號連結。
$ sudo mv work-dir old-dir $ sudo mkdir -p /path/to/emp-dir $ sudo ln -sf /path/to/emp-dir work-dir $ sudo cp -a old-dir/* work-dir $ sudo rm -rf old-dir
![]() |
警告 |
---|---|
別對由系統管理的目錄(例如 “ |
我們在這裡討論磁碟影響的操作。
一個未掛載裝置(例如,第二個 SCSI 或 序列 ATA 裝置 “/dev/sdb
”)的磁碟映像檔案
“disk.img
” 可以使用
cp(1)
或
dd(1)
通過下列方式建立。
# cp /dev/sdb disk.img # dd if=/dev/sdb of=disk.img
傳統 PC 中位於主 IDE 硬碟第一扇區的主引導記錄(MBR)(參見 第 9.5.2 节 “硬碟分割槽配置”)的磁碟映像可以使用 dd(1) 通過下列方式建立。
# dd if=/dev/hda of=mbr.img bs=512 count=1 # dd if=/dev/hda of=mbr-nopart.img bs=446 count=1 # dd if=/dev/hda of=mbr-part.img skip=446 bs=1 count=66
“mbr.img
”:帶有分割槽表的 MBR
“mbr-nopart.img
”:不帶分割槽表的 MBR
“mbr-part.img
”:僅 MBR 的分割槽表
如果你使用 SCSI 或 序列 ATA 裝置作為啟動硬碟,你需要使用 “/dev/sda
” 替代
“/dev/hda
”。
如果你要建立原始硬碟的一個硬碟分割槽的映像,你需要使用 “/dev/hda1
” 等替代
“/dev/hda
”。
磁碟映像檔案 “disk.img
” 可以通過下列方式寫入到一個匹配大小的未掛載裝置(例如,第二個 SCSI 裝置
“/dev/sdb
”。
# dd if=disk.img of=/dev/sdb
相似地,硬碟分割槽映像檔案 “partition.img
”
可以通過下列方式寫入到匹配大小的未掛載分割槽(例如,第二個 SCSI 裝置的第一個分割槽
“/dev/sdb1
”)。
# dd if=partition.img of=/dev/sdb1
可以使用迴圈裝置通過下列方式掛載和解除安裝包含單個分割槽映像的磁碟映像
“partition.img
”。
# losetup -v -f partition.img Loop device is /dev/loop0 # mkdir -p /mnt/loop0 # mount -t auto /dev/loop0 /mnt/loop0 ...hack...hack...hack # umount /dev/loop0 # losetup -d /dev/loop0
可以簡化為如下步驟。
# mkdir -p /mnt/loop0 # mount -t auto -o loop partition.img /mnt/loop0 ...hack...hack...hack # umount partition.img
可以使用 迴圈裝置 掛載包含多個分割槽的磁碟映像
“disk.img
” 的每個分割槽。因為迴圈裝置預設不管理分割槽,因此我們需要通過下列方式重新設定它。
# modinfo -p loop # verify kernel capability max_part:Maximum number of partitions per loop device max_loop:Maximum number of loop devices # losetup -a # verify nothing using the loop device # rmmod loop # modprobe loop max_part=16
現在迴圈裝置可以管理多達 16 個分割槽。
# losetup -v -f disk.img Loop device is /dev/loop0 # fdisk -l /dev/loop0 Disk /dev/loop0: 5368 MB, 5368709120 bytes 255 heads, 63 sectors/track, 652 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk identifier: 0x452b6464 Device Boot Start End Blocks Id System /dev/loop0p1 1 600 4819468+ 83 Linux /dev/loop0p2 601 652 417690 83 Linux # mkdir -p /mnt/loop0p1 # mount -t ext4 /dev/loop0p1 /mnt/loop0p1 # mkdir -p /mnt/loop0p2 # mount -t ext4 /dev/loop0p2 /mnt/loop0p2 ...hack...hack...hack # umount /dev/loop0p1 # umount /dev/loop0p2 # losetup -d /dev/loop0
或者,你也可以使用 kpartx
軟體包中的
kpartx(8)
建立 裝置對映裝置來達到相同的效果。
# kpartx -a -v disk.img ... # mkdir -p /mnt/loop0p2 # mount -t ext4 /dev/mapper/loop0p2 /mnt/loop0p2 ... ...hack...hack...hack # umount /dev/mapper/loop0p2 ... # kpartx -d /mnt/loop0
使用下面的方式,一個磁碟映像檔案 "disk.img
" 能夠清理掉所有已經刪除的檔案,成為一個乾淨的稀疏映像
"new.img
"。
# mkdir old; mkdir new # mount -t auto -o loop disk.img old # dd bs=1 count=0 if=/dev/zero of=new.img seek=5G # mount -t auto -o loop new.img new # cd old # cp -a --sparse=always ./ ../new/ # cd .. # umount new.img # umount disk.img
如果 “disk.img
” 位於 ext2、ext3 或 ext4,你也可以像下面那樣使用
zerofree
軟體包中的
zerofree(8)。
# losetup -f -v disk.img Loop device is /dev/loop3 # zerofree /dev/loop3 # cp --sparse=always disk.img new.img
按下面的方式使用 dd(1) ,可以製作一個大小為 5GiB 的空磁碟映像檔案。
$ dd bs=1 count=0 if=/dev/zero of=disk.img seek=5G
按下面的方式使用環回裝置,你能夠在這個磁碟映像"disk.img
"上建立
ext4 檔案系統。
# losetup -f -v disk.img Loop device is /dev/loop1 # mkfs.ext4 /dev/loop1 ...hack...hack...hack # losetup -d /dev/loop1 $ du --apparent-size -h disk.img 5.0G disk.img $ du -h disk.img 83M disk.img
對於 "disk.img
",它的檔案大小是5.0 GiB,而它實際磁碟使用僅僅是 83MiB.這個差距可能是由於
ext4 裡面有稀疏檔案.
![]() |
提示 |
---|---|
稀疏檔案的實際磁碟使用會隨著資料的寫入而增加。 |
迴環裝置 或 裝置對映 裝置上使用類似的操作,在這些裝置按 第 9.6.3 节 “掛載磁碟映像檔案” 掛載後, 你能夠使用
parted(8)
或
fdisk(8)對這個磁碟映像"disk.img
"進行分割槽,能夠使用
mkfs.ext4(8),
mkswap(8)在上面建立檔案系統等.
"源目錄
"下的目錄樹可以通過如下所示的 cdrkit
提供的
genisoimage(1)
命令來製作 ISO9660
映象檔案,"cd.iso
"。
# genisoimage -r -J -T -V volume_id -o cd.iso source_directory
類似的,可引導的 ISO9660 映象檔案,"cdboot.iso
", 能夠從
debian-installer
類似目錄樹
"source_directory
" 製作,方式如下。
# genisoimage -r -o cdboot.iso -V volume_id \ -b isolinux/isolinux.bin -c isolinux/boot.cat \ -no-emul-boot -boot-load-size 4 -boot-info-table source_directory
這裡的 Isolinux boot loader (參見 第 3.1.2 节 “第二階段:引載加載程序”) 是用於啟動的.
按下面的方式,你可以直接從光碟機裝置計算 md5sum 值,並製作 ISO9660 映象。
$ isoinfo -d -i /dev/cdrom CD-ROM is in ISO 9660 format ... Logical block size is: 2048 Volume size is: 23150592 ... # dd if=/dev/cdrom bs=2048 count=23150592 conv=notrunc,noerror | md5sum # dd if=/dev/cdrom bs=2048 count=23150592 conv=notrunc,noerror > cd.iso
![]() |
警告 |
---|---|
為了得到正確結果,你必須小心避免 Linux ISO9600 檔案系統預讀 bug。 |
![]() |
提示 |
---|---|
對於由 cdrkit 提供的 wodim(1) 來講,DVD 僅僅是一個大的 CD。 |
你能夠通過如下所示的命令找到可用的裝置。
# wodim --devices
然後將空的 CD-R 插入 CD 驅動器並且把 ISO9660 映象檔案,"cd.iso
"
寫入到裝置中,例如用如下所示的
wodim(1)
將資料寫入到 "/dev/hda
" 裝置。
# wodim -v -eject dev=/dev/hda cd.iso
如果用 CD-RW 代替 CD-R,用如下所示的命令來替代。
# wodim -v -eject blank=fast dev=/dev/hda cd.iso
![]() |
提示 |
---|---|
如果你的桌面系統自動掛載 CDs,在使用
wodim(1)
之前在終端裡面用 " |
如果 "cd.iso
" 包含一個 ISO9660 映象, 下面的命令手工掛載這個檔案到
"/cdrom
".
# mount -t iso9660 -o ro,loop cd.iso /cdrom
![]() |
提示 |
---|---|
現代桌面系統能夠自動掛載可移動介質,如按 ISO9660 格式化的 CD(參見 第 10.1.7 节 “可移動儲存裝置”). |
這裡,我們討論直接操作儲存介質上的二進位制資料。
最基礎的檢視二進位制資料的方法是使用 "od -t x1
" 命令。
表 9.20. 檢視和修改二進位制資料的軟體包列表
軟件包 | 流行度 | 大小 | 說明 |
---|---|---|---|
coreutils
|
V:878, I:999 | 15016 | 基礎軟體包,有 od(1) 來匯出檔案(HEX, ASCII, OCTAL, …) |
bsdmainutils
|
V:854, I:998 | 586 | 工具軟體包,有 hd(1) 來匯出檔案(HEX, ASCII, OCTAL, …) |
hexedit
|
V:1, I:11 | 62 | 二進位制瀏覽和編輯器(HEX, ASCII) |
bless
|
V:0, I:5 | 973 | 全功能的十六進位制編輯器(GNOME) |
okteta
|
V:1, I:20 | 1344 | 全功能的十六進位制編輯器(KDE4) |
ncurses-hexedit
|
V:0, I:2 | 128 | 二進位制瀏覽和編輯器(HEX, ASCII, EBCDIC) |
beav
|
V:0, I:1 | 133 | 二進位制瀏覽和編輯器(HEX, ASCII, EBCDIC, OCTAL, ...) |
![]() |
提示 |
---|---|
HEX 是十六進位制英文hexadecimal首字母縮略詞,基數 radix 是 16。OCTAL 是八進位制英文octal 首字母縮略詞,基數 radix是 8。ASCII是美國資訊交換標準程式碼 American Standard Code for Information Interchange 的英文縮寫,即正常的英語文字程式碼。EBCDIC是擴充套件二進位制編碼十進位制交換碼 Extended Binary Coded Decimal Interchange Code 的英文縮寫,在 IBM 大型機 作業系統上使用。 |
Linux 核心所提供的RAID軟體系統提供核心檔案系統級別的資料冗餘來實現高水平的儲存可靠性。
有在應用程式級別增加資料冗餘來實現高水平儲存可靠性的工具。
有用於資料檔案恢復和診斷分析的工具。
表 9.23. 資料檔案恢復和診斷分析軟體包列表
軟件包 | 流行度 | 大小 | 說明 |
---|---|---|---|
testdisk
|
V:3, I:39 | 1315 | 分割槽掃描和磁碟恢復的實用程式 |
magicrescue
|
V:0, I:3 | 224 | 通過查詢幻數 magic 位元組來恢復檔案的工具(譯註:請 man file 來了解幻數) |
scalpel
|
V:0, I:4 | 82 | 簡潔、高效能的檔案提取 |
myrescue
|
V:0, I:3 | 38 | 恢復損壞硬碟中的資料 |
extundelete
|
V:1, I:11 | 148 | 恢復刪除 ext3/4 檔案系統上的檔案的實用程式 |
ext4magic
|
V:0, I:3 | 232 | 恢復刪除 ext3/4 檔案系統上的檔案的實用程式 |
ext3grep
|
V:0, I:3 | 278 | 幫助恢復 ext3 檔案系統上刪除的檔案的工具 |
scrounge-ntfs
|
V:0, I:3 | 45 | NTFS 檔案系統的資料恢復程式 |
gzrt
|
V:0, I:0 | 57 | gzip 恢復工具包 |
sleuthkit
|
V:2, I:15 | 1113 | 診斷分析工具(Sleuthkit) |
autopsy
|
V:0, I:2 | 1021 | SleuthKit 的圖形化介面 |
foremost
|
V:0, I:7 | 123 | 恢復資料的診斷程式 |
guymager
|
V:0, I:1 | 1044 | 基於 Qt 的診斷影象工具 |
dcfldd
|
V:0, I:5 | 94 |
增強版的 dd ,用於診斷和安全
|
![]() |
提示 |
---|---|
在 |
當一個檔案太大而不能備份的時候,你應該在備份之前先把它分割為多個小於 2000MiB 的小檔案,稍後再把這些小檔案合併為初始的檔案。
$ split -b 2000m large_file $ cat x* >large_file
![]() |
小心 |
---|---|
為了防止檔名衝突,請確保沒有任何以 " |
為了清除諸如日誌檔案之類的檔案的內容,不要用 rm(1) 命令去刪除檔案然後建立新的空檔案,因為這個檔案可能在命令執行的期間還在被使用。以下是清除檔案內容的正確方法。
$ :>file_to_be_cleared
下面的命令創建樣子文件或空文件。
$ dd if=/dev/zero of=5kb.file bs=1k count=5 $ dd if=/dev/urandom of=7mb.file bs=1M count=7 $ touch zero.file $ : > alwayszero.file
你將發現下列文件。
"5kb.file
" 是 5KB 零。
"7mb.file
" 是 7MB 隨機數據。
"zero.file
" 也許是一個 0 字節的文件。如果這個文件之前就存在,則它的
mtime
會被更新,而它的內容和長度保持不變。
"alwayszero.file
" 一定是一個 0 字節文件。如果這個文件之前存在,則它的
mtime
會被更新,而它的內容會被清零。
有幾種方法來完全擦除裝置上整個硬碟上資料,比如說,在 "/dev/sda
" 上的 USB 記憶體盤。
![]() |
小心 |
---|---|
在執行這裡的命令之前,你應該用
mount(8)
命令來檢視 USB 記憶棒的掛載位置。" |
如下所示是通過資料歸 0 的方式來擦除硬碟上所有資料的。
# dd if=/dev/zero of=/dev/sda
如下是用隨機資料重寫的方式來擦除所有資料的。
# dd if=/dev/urandom of=/dev/sda
如下是用隨機資料重寫的方式來高效擦除所有資料。
# shred -v -n 1 /dev/sda
因為
dd(1)
命令在許多可引導的 Linux CDs (例如 Debian 安裝光碟) 上的 shell 環境下都是可用的,你能夠在裝有系統的硬碟上,例如
"/dev/hda
", "/dev/sda
"
等等裝置上執行擦除命令來完全清除已經安裝的系統。
硬碟(或 USB
記憶棒)上未使用的區域,例如“/dev/sdb1
”可能仍然包含可被擦除的資料,因為他們本身只是解除了從檔案系統的連結,這些可以通過重寫來清除。
# mount -t auto /dev/sdb1 /mnt/foo # cd /mnt/foo # dd if=/dev/zero of=junk dd: writing to `junk': No space left on device ... # sync # umount /dev/sdb1
![]() |
警告 |
---|---|
這對您的USB 記憶棒來說通常已經足夠好了,但這還不完美。大部分已擦除的檔名和它們的屬性可能隱藏並留在檔案系統中。 |
即使你不小心刪除了某個檔案,只要這個檔案仍然被一些應用程式所使用(讀或者寫),恢復此檔案是可能的。
嘗試下列例子
$ echo foo > bar $ less bar $ ps aux | grep 'less[ ]' bozo 4775 0.0 0.0 92200 884 pts/8 S+ 00:18 0:00 less bar $ rm bar $ ls -l /proc/4775/fd | grep bar lr-x------ 1 bozo bozo 64 2008-05-09 00:19 4 -> 2 /home/bozo/bar (deleted) $ cat /proc/4775/fd/4 > 3bar $ ls -l -rw-r--r-- 1 bozo bozo 4 2008-05-09 00:25 bar $ cat bar foo
當你安裝了 lsof
軟體包的時候,在另外一個終端執行如下命令。
$ ls -li bar 2228329 -rw-r--r-- 1 bozo bozo 4 2008-05-11 11:02 bar $ lsof |grep bar|grep less less 4775 bozo 4r REG 8,3 4 2228329 /home/bozo/bar $ rm bar $ lsof |grep bar|grep less less 4775 bozo 4r REG 8,3 4 2228329 /home/bozo/bar (deleted) $ cat /proc/4775/fd/4 > bar $ ls -li bar 2228302 -rw-r--r-- 1 bozo bozo 4 2008-05-11 11:05 bar $ cat bar foo
有硬連結的檔案,能夠使用 "ls -li
" 確認。
$ ls -li total 0 2738405 -rw-r--r-- 1 root root 0 2008-09-15 20:21 bar 2738404 -rw-r--r-- 2 root root 0 2008-09-15 20:21 baz 2738404 -rw-r--r-- 2 root root 0 2008-09-15 20:21 foo
"baz
" 和 "foo
" 的連結數為 "2"
(>1),表示他們有硬連結。它們的 inode
號都是"2738404".這表示它們是同樣的硬連結檔案。如果你不想偶然碰巧發現硬連結檔案,你可以通過 inode 號來查詢它。比如說, 按下面的方式查詢 "2738404" 。
# find /path/to/mount/point -xdev -inum 2738404
在可以物理訪問您的 PC的情況下,任何人都可以輕易獲得 root 許可權,訪問您的 PC 上的所有檔案 (見 第 4.7.4 节 “root 密碼安全”)。 這意味著登入密碼系統在您的PC被偷盜時並不能保證您私人和敏感資料的安全。您必須部署資料加密技術來實現。儘管 GNU 隱私守護 (見 第 10.3 节 “資料安全基礎”) 可以對檔案進行加密,但它需要一些使用者端的工作。
dm-crypt 和 eCryptfs通過 Linux 核心模組與很少的使用者操作實現本地自動資料加密。
表 9.24. 資料加密工具列表
軟件包 | 流行度 | 大小 | 說明 |
---|---|---|---|
cryptsetup
|
V:34, I:79 | 376 | 可用於加密的塊裝置 的實用程式(dm-crypt / 3LUKS) |
cryptmount
|
V:3, I:4 | 225 | 可用於加密的塊裝置著重於正常使用者掛載/解除安裝的實用程式( dm-crypt / LUKS) |
ecryptfs-utils
|
V:6, I:9 | 396 | 可用於堆疊加密檔案系統的實用程式( eCryptfs) |
Dm-crypt 是一個使用 device-mapper 加密的檔案系統. Device-mapper 對映一個塊裝置到另外一個。
eCryptfs 是另外一個加密檔案系統,使用了堆疊檔案系統。堆疊檔案系統把它自己堆疊在已掛載檔案系統的一個已有目錄之上。
![]() |
小心 |
---|---|
資料加密會消耗 CPU 時間等資源,請權衡其利弊。 |
![]() |
注意 |
---|---|
通過 debian-installer (lenny 或更新版),整個 Debian 系統能夠被安裝到一個加密的磁碟上,使用 dm-crypt/LUKS 和 initramfs. |
![]() |
提示 |
---|---|
請參閱 第 10.3 节 “資料安全基礎” 使用者空間加密實用程式: GNU Privacy Guard。 |
您可以用dm-crypt/LUKS加密大容量可移動裝置上資料,例如掛載在“/dev/sdx
”上的USB
記憶棒。你只需按如下步驟簡單地把它格式化。
# badblocks -c 1024 -s -w -t random -v /dev/sdx # fdisk /dev/sdx ... "n" "p" "1" "return" "return" "w" # cryptsetup luksFormat /dev/sdx1 ... # cryptsetup open --type luks /dev/sdx1 sdx1 ... # ls -l /dev/mapper/ total 0 crw-rw---- 1 root root 10, 60 2008-10-04 18:44 control brw-rw---- 1 root disk 254, 0 2008-10-04 23:55 sdx1 # mkfs.vfat /dev/mapper/sdx1 ... # cryptsetup luksClose sdx1
然後,它就可以正常的在現代桌面環境下,例如 GNOME 桌面可以使用
gnome-mount(1),掛載到
"/media/<disk_label
"。只不過它會要求輸入密碼 (參見第 10.1.7 节 “可移動儲存裝置”)。不同的是寫入的資料都是加密的。你可以把它格式化成其他格式的檔案系統,例如用
"mkfs.ext4 /dev/mapper/sdx1
" 把它格式化為 ext4。
![]() |
注意 |
---|---|
如果您對資料的安全性要求很高,您可能需要重寫多次(在上述示例中的" |
讓我們假設你原先的"/etc/fstab
"包含以下內容。
/dev/sda7 swap sw 0 0
您可以使用 dm-crypt 通過如下步驟啟用加密的交換分割槽。
# aptitude install cryptsetup # swapoff -a # echo "cswap /dev/sda7 /dev/urandom swap" >> /etc/crypttab # perl -i -p -e "s/\/dev\/sda7/\/dev\/mapper\/cswap/" /etc/fstab # /etc/init.d/cryptdisks restart ... # swapon -a
用dm-crypt/LUKS在"/dev/sdc5
"
上建立的加密磁碟可以用如下步驟掛載到"/mnt
":
$ sudo cryptsetup open /dev/sdc5 ninja --type luks Enter passphrase for /dev/sdc5: **** $ sudo lvm lvm> lvscan inactive '/dev/ninja-vg/root' [13.52 GiB] inherit inactive '/dev/ninja-vg/swap_1' [640.00 MiB] inherit ACTIVE '/dev/goofy/root' [180.00 GiB] inherit ACTIVE '/dev/goofy/swap' [9.70 GiB] inherit lvm> lvchange -a y /dev/ninja-vg/root lvm> exit Exiting. $ sudo mount /dev/ninja-vg/root /mnt
您可以用eCryptfs和ecryptfs-utils
包對~/Private/
下的建立的檔案自動加密。
根據下面的提示執行ecryptfs-setup-private(1)並設定~/Private/
。
通過執行ecryptfs-mount-private(1)啟用“~/Private/
”。
將敏感資料檔案移動到"~/Private/
"並根據要求建立符號連結。
候選:"~/.fetchmailrc
"、"~/.ssh/identity
","~/.ssh/id_rsa
","~/.ssh/id_dsa
"和"go-rwx
"的其他檔案
將敏感資料目錄移動到"~/Private/
"的子目錄中並按要求建立符號連結。
候選:"~/.gnupg
"和"go-rwx
的其他目錄
建立從“~/Desktop/Private/
”到“~/Private/
的符號連結,實現更方便的桌面操作。
通過執行 ecryptfs-umount-private(1) 停用"~/Private/
"。
在你需要加密檔案時,使用“ecryptfs-mount-private
”命令啟用“~/Private/
”目錄。
如果您使用您的登入密碼為環繞加密金鑰,您可以通過 PAM (可插拔身份驗證模組)自動化安裝 eCryptfs。
在"/etc/pam.d/common-auth
"檔案中的
"pam_permit.so
"前插入下面的行。
auth required pam_ecryptfs.so unwrap
在"/etc/pam.d/common-session
"檔案中插入下面的行作為最後一行。
session optional pam_ecryptfs.so unwrap
在"/etc/pam.d/common-password
"中的第一個活動行插入下面的行。
password required pam_ecryptfs.so
這相當方便。
![]() |
小心 |
---|---|
如果你使用你自己的登入密碼作為環繞加密金鑰,加密的資料和使用者登入密碼的安全性一樣 (參見第 4.3 节 “好密碼”)。除非你已認真設定了一個強密碼,否則你的資料仍然處在危險中,當別人偷了筆記本以後,然後執行密碼破解 軟體 (參見第 4.7.4 节 “root 密碼安全”)。 |
對於支援的架構,Debian 使用軟體包來分發模組化的 Linux核心.
相對於 2.4 版來說,Linux 核心的 2.6/3.x 版有一些值得注意的特徵。
裝置由 udev 系統建立(參見 第 3.3 节 “udev 系統”).
讀寫訪問 IDE CD/DVD 裝置,不再使用 ide-scsi
模組.
網路包過濾功能使用 iptables
核心模組.
Linux 版本從 2.6.39 跳到 3.0,不僅僅是一個主要的技術改變,也是第 20 個週年紀念日。
許多 Linux 特性可以按下面的方式,通過核心引數來配置。
核心引數通過 bootloader 初始化(參見 第 3.1.2 节 “第二階段:引載加載程序”)
對通過 sysfs 訪問的核心引數,在執行時通過 sysctl(8) 修改(參見 第 1.2.12 节 “procfs 和 sysfs”)
當一個模組被啟用時,通過 modprobe(8) 引數來設定模組引數。(參見 第 9.6.3 节 “掛載磁碟映像檔案”)
參見 "kernel-parameters.txt(.gz)
" 和
linux-doc-3.*
軟體包提供的其它相關文件
("/usr/share/doc/linux-doc-3.*/Documentation/filesystems/*
")。
大部分普通程式編譯時不需要核心標頭檔案,如果你直接使用它們來編譯,甚至會導致編譯中斷。在 Debian
系統上,普通程式編譯依賴 libc6-dev
軟體包 (由 glibc
原始碼包建立)提供的,在"/usr/include/linux
" 和
"/usr/include/asm
" 裡的標頭檔案。
![]() |
注意 |
---|---|
對於編譯一些核心相關的程式,比如說從外部原始碼編譯的核心模組和 automounter
後臺守護(daemon)程式( |
Debian 有它自己的方式來編譯核心和相關模組。
表 9.25. Debian 系統核心編譯需要安裝的主要軟體包列表
軟件包 | 流行度 | 大小 | 說明 |
---|---|---|---|
build-essential
|
I:445 | 20 |
建立 Debian 軟體包所必須的軟體包: make , gcc , …
|
bzip2
|
V:196, I:946 | 184 | bz2 檔案壓縮和解壓縮工具 |
libncurses5-dev
|
V:15, I:147 | 993 | ncurses 開發者庫和文件 |
git
|
V:279, I:436 | 33191 | git:Linux 核心使用的分散式版本控制系統 |
fakeroot
|
V:32, I:495 | 215 | 為非 root 使用者建立軟體包提供一個偽造的 root 環境 |
initramfs-tools
|
V:256, I:991 | 105 | 建立 initramfs 的工具(Debian 規範) |
dkms
|
V:97, I:207 | 282 | 動態核心模組支援 dynamic kernel module support (DKMS) (通用) |
devscripts
|
V:9, I:64 | 2175 | Debian Package maintainer Debian 包維護者的幫助指令碼(Debian 規範) |
如果你在 第 3.1.2 节 “第二階段:引載加載程序” 使用 initrd
, 請一定閱讀
initramfs-tools(8),
update-initramfs(8),
mkinitramfs(8)
和initramfs.conf(5)
裡的相關資訊。
![]() |
警告 |
---|---|
在編譯 Linux 核心原始碼時,請不要放置從" |
![]() |
注意 |
---|---|
當在 Debian |
![]() |
注意 |
---|---|
dynamic kernel module support (DKMS)動態核心模組支援 是一個新的分散式獨立框架,被設計用來允許單個的核心模組在不改變整個核心的情況下升級。這可以用於維護核心程式碼樹外部的模組。這也使你升級核心時,重新編譯模組變得非常簡單。 |
從上游核心原始碼編譯個性化的核心二進位制包,你應當使用由它提供的 "deb-pkg
" 物件。
$ sudo apt-get build-dep linux $ cd /usr/src $ wget http://www.kernel.org/pub/linux/kernel/v3.11/linux-<version>.tar.bz2 $ tar -xjvf linux-<version>.tar.bz2 $ cd linux-<version> $ cp /boot/config-<version> .config $ make menuconfig ... $ make deb-pkg
![]() |
提示 |
---|---|
linux-source-<version> 軟體包使用
" |
從 Debian 核心原始碼軟體包編譯特定的二進位制包,你應當使用 "debian/rules.gen
" 裡的
"binary-arch_<architecture>_<featureset>_<flavour>
"
物件。
$ sudo apt-get build-dep linux $ apt-get source linux $ cd linux-3.* $ fakeroot make -f debian/rules.gen binary-arch_i386_none_686
進階資訊參見:
Debian Wiki: KernelFAQ
Debian Wiki: DebianKernel
Debian Linux Kernel Handbook: https://kernel-handbook.debian.net
硬體驅動是執行在目標系統上的程式碼。大部分硬體驅動現在是自由軟體,已經包含在普通的 Debian 核心軟體包裡,放在
main
區域。
韌體是載入在裝置上的程式碼(比如說,CPU microcode, GPU 執行的渲染程式碼, 或 FPGA / CPLD 資料……)部分韌體包是作為自由軟體存在,但是很多韌體包由於包含有沒有原始碼的資料,二進位制不是作為自由軟體存在。
firmware-linux-free (main
)
firmware-linux-nonfree (non-free
)
firmware-linux-* (non-free
)
*-firmware (non-free
)
intel-microcode (non-free
)
amd64-microcode (non-free
)
請注意 non-free
和 contrib
的軟體包不是 Debian
系統的一部分。啟用和禁用 non-free
和 contrib
區域的配置,在 第 2.1.4 节 “Debian 檔案庫基礎” 裡描述。你應當注意到 第 2.1.5 节 “Debian 是100% 的自由軟體” 裡的描述,使用 non-free
和 contrib
軟體包會有負面影響。
通過使用虛擬系統,我們能在單個機器上同時執行多個系統。
除了簡單的 chroot 工具外,Debian上還有一些有關係統虛擬化及模擬的軟體包。這些軟體包能夠幫你建立虛擬系統。
表 9.26. 虛擬化工具列表
參見維基百科 Comparison of platform virtual machines 來獲得不同平臺的虛擬化解決方案的詳細比較資訊。
![]() |
注意 |
---|---|
這裡所描述的功能只在 |
![]() |
注意 |
---|---|
自從 |
典型的虛擬化工作流涉及以下幾個步驟。
建立空檔案系統 (目錄樹或磁碟映像)。
目錄樹可以通過 "mkdir -p /path/to/chroot
" 建立。
原始的磁碟映像檔案能夠使用 dd(1) 建立 (參見 第 9.6.1 节 “製作磁碟映像檔案” 和 第 9.6.5 节 “製作空的磁碟映像檔案”).
qemu-img(1) 能夠建立和轉化 QEMU 支援的磁碟映像檔案.
原始的格式和 VMDK 檔案格式,能夠作為虛擬化工具的通用格式.
使用 mount(8) 掛載磁碟映像到檔案系統 (可選).
對於原始磁碟映像檔案,把它作為迴環裝置 或 裝置對映 裝置掛載. (參見 第 9.6.3 节 “掛載磁碟映像檔案”).
對於 QEMU 支援的磁碟映像,把它們作為 network block device 網路塊裝置掛載 (參見 第 9.10.3 节 “掛載虛擬磁碟映像檔案”).
在目標檔案系統上部署需要的系統資料。
使用 debootstrap
和 cdebootstrap
之類的程式來協助處理這個過程(參見 第 9.10.4 节 “Chroot 系統”).
在全功能系統模擬器下使用作業系統安裝器。
在虛擬化環境下執行一個程式。
chroot 提供基本的虛擬化環境,足夠能在裡面編譯程式,執行控制檯應用,執行後臺守護程式 daemon.
QEMU 提供跨平臺的 CPU 模擬器.
QEMU 和 KVM 通過 hardware-assisted virtualization硬體輔助虛擬化來提供全功能系統的模擬.
VirtualBox 可以在 i386 和 amd64 上,使用或者不使用 hardware-assisted virtualization硬體輔助虛擬化來提供全功能系統模擬.
對於原始磁碟映像檔案,參見 第 9.6 节 “磁碟映像”.
對於其它虛擬磁碟映像檔案,你能夠用使用 network block
device網路塊裝置 協議的
qemu-nbd(8)
來匯出他們,並使用核心模組 nbd
來掛載它們.
qemu-nbd(8) 支援 QEMU 所支援的磁碟格式: QEMU 支援下列磁碟格式: raw, qcow2, qcow, vmdk, vdi, bochs, cow (user-mode Linux copy-on-write), parallels, dmg, cloop, vpc, vvfat (virtual VFAT)和主機裝置.
網路塊裝置 能夠用和迴環裝置一樣的方式支援分割槽 (參見 第 9.6.3 节 “掛載磁碟映像檔案”). 你能夠按下面的方式掛載
"disk.img
" 的第一個分割槽.
# modprobe nbd max_part=16 # qemu-nbd -v -c /dev/nbd0 disk.img ... # mkdir /mnt/part1 # mount /dev/nbd0p1 /mnt/part1
![]() |
提示 |
---|---|
你可以給
qemu-nbd(8)
使用 " |
chroot(8) 提供最基本的方式來執行一個不同的 GNU/Linux 系統例項,並且不需要重啟原有的系統。
![]() |
小心 |
---|---|
下面的列子假設根源系統和 chroot 系統都共享相同的 CPU 架構。 |
你可以按下面的方式學會怎樣建立和使用 chroot(8),通過在 script(1) 下執行 pbuilder(8) 程式。
$ sudo mkdir /sid-root $ sudo pbuilder --create --no-targz --debug --buildplace /sid-root
你能夠看到
debootstrap(8)
或
cdebootstrap(1)
是如何在 "/sid-root
" 下部署 sid
環境的系統資料.
![]() |
提示 |
---|---|
這些 debootstrap(8) 或 cdebootstrap(1) 是 Debian 安裝器用來安裝 Debian 的.這些也可以用來在不使用 Debian 安裝盤的情況下,給一個系統安裝 Debian,也可以替代安裝其它 GNU/Linux 發行版。 |
$ sudo pbuilder --login --no-targz --debug --buildplace /sid-root
你可以看到一個 sid
環境的系統 shell 是如何按下面的方式建立的。
拷貝本地配置 ("/etc/hosts
", "/etc/hostname
",
"/etc/resolv.conf
")
掛載 "/proc
" 檔案系統
掛載 "/dev/pts
" 檔案系統
建立 "/usr/sbin/policy-rc.d
" 的過程,總是 101 退出
執行 "chroot /sid-root bin/bash -c 'exec -a -bash
bin/bash'
"
![]() |
注意 |
---|---|
一些在 chroot 下的程式,需要訪問比根源系統上的 |
![]() |
注意 |
---|---|
" |
![]() |
提示 |
---|---|
專用的 chroot 軟體包 |
![]() |
提示 |
---|---|
類似的 |
我建議在 Debian 穩定版
上使用 QEMU 或者
VirtualBox,這些軟體應用虛擬化技術安全的執行多桌面系統。這能讓你執行 Debian
不穩定版
和測試版
上的桌面應用並且沒有與之相關的通常意義上的風險。
因為單純的 QEMU 工具是非常慢的,當主機系統支援 KVM 的時候,建議使用它來加速。
按下面的方法,能夠建立一個可以用於QEMU 的包含有 Debian 系統的虛擬磁碟映像
"virtdisk.qcow2
",這個 Debian 系統使用 debian 安裝器:小 CD安裝。
$ wget http://cdimage.debian.org/debian-cd/5.0.3/amd64/iso-cd/debian-503-amd64-netinst.iso $ qemu-img create -f qcow2 virtdisk.qcow2 5G $ qemu -hda virtdisk.qcow2 -cdrom debian-503-amd64-netinst.iso -boot d -m 256 ...
在 Debian wiki: QEWU 可以檢視更多資訊。
VirtualBox 自帶的 Qt 圖形介面工具是相當直觀的。關於它的圖形介面和命令列工具的解釋可以在 VisualBox 使用者手冊 和 VirtualBox 使用者手冊(PDF) 中檢視。