第 9 章 系統技巧

目录

9.1. screen 程式
9.1.1. screen(1) 的使用場景
9.1.2. screen 命令的鍵繫結
9.2. 資料記錄和展示
9.2.1. 日誌後臺守護程序(daemon)
9.2.2. 日誌分析
9.2.3. 清晰的記錄 shell 活動
9.2.4. 定製文字資料的顯示
9.2.5. 定製時間和日期的顯示
9.2.6. shell 中 echo 的顏色
9.2.7. 有顏色輸出的命令
9.2.8. 記錄編輯器複雜的重複操作動作
9.2.9. 記錄 X 應用程式的圖形
9.2.10. 記錄配置檔案的變更
9.3. 監控、控制和啟動程式活動
9.3.1. 程序耗時
9.3.2. 排程優先順序
9.3.3. ps 命令
9.3.4. top 命令
9.3.5. 列出被一個程序開啟的檔案
9.3.6. 跟蹤程式活動
9.3.7. 識別使用檔案和套接字的程序
9.3.8. 使用固定間隔重複一個命令
9.3.9. 使用檔案迴圈來重複一個命令
9.3.10. 從 GUI 啟動一個程式
9.3.11. 自定義被啟動的程式
9.3.12. 殺死一個程序
9.3.13. 單次任務時間安排
9.3.14. 定時任務安排
9.3.15. Alt-SysRq 鍵
9.4. 系統維護技巧
9.4.1. 誰在系統裡?
9.4.2. 警告所有人
9.4.3. 硬體識別
9.4.4. 硬體配置
9.4.5. 系統時間和硬體時間
9.4.6. 終端配置
9.4.7. 聲音基礎設施
9.4.8. 關閉螢幕保護
9.4.9. 關閉蜂鳴聲
9.4.10. 記憶體使用
9.4.11. 系統安全性和完整性檢查
9.5. 資料儲存技巧
9.5.1. 硬碟空間使用情況
9.5.2. 硬碟分割槽配置
9.5.3. 使用 UUID 訪問分割槽
9.5.4. LVM2
9.5.5. 檔案系統配置
9.5.6. 檔案系統建立和完整性檢查
9.5.7. 通過掛載選項優化檔案系統
9.5.8. 通過超級塊(superblock)優化檔案系統
9.5.9. 硬碟優化
9.5.10. 固態硬碟優化
9.5.11. 使用 SMART 預測硬碟故障
9.5.12. 通過 $TMPDIR 指定臨時儲存目錄
9.5.13. 通過 LVM 擴充套件可用儲存空間
9.5.14. 通過掛載另一個分割槽來擴充套件可用儲存空間
9.5.15. 通過 “mount --bind” 掛載另一個目錄來擴充套件可用儲存空間
9.5.16. 使用符號連結擴充套件可用儲存空間
9.5.17. 使用 overlayfs 擴充套件可用儲存空間
9.6. 磁碟映像
9.6.1. 製作磁碟映像檔案
9.6.2. 直接寫入硬碟
9.6.3. 掛載磁碟映像檔案
9.6.4. 清理磁碟映像檔案
9.6.5. 製作空的磁碟映像檔案
9.6.6. 製作 ISO9660 映象檔案
9.6.7. 直接寫入檔案到 CD/DVD-R/RW
9.6.8. 掛載 ISO9660 映象檔案
9.7. 二進位制資料
9.7.1. 檢視和編輯二進位制資料
9.7.2. 不掛載磁碟操作檔案
9.7.3. 資料冗餘
9.7.4. 資料檔案恢復和診斷分析
9.7.5. 把大檔案分成多個小檔案
9.7.6. 清空檔案內容
9.7.7. 樣子文件
9.7.8. 擦除整塊硬碟
9.7.9. 擦除硬碟上的未使用的區域
9.7.10. 恢復已經刪除但仍然被開啟的檔案
9.7.11. 查詢所有硬連結
9.7.12. 不可見磁碟空間消耗
9.8. 資料加密提示
9.8.1. 使用 dm-crypt/LUKS 加密移動磁碟
9.8.2. 用dm-crypt加密的交換分割槽
9.8.3. 使用dm-crypt/LUKS掛載加密的磁碟
9.8.4. 用eCryptfs自動加密檔案
9.8.5. 自動掛載 eCryptfs
9.9. 核心
9.9.1. Linux 核心 2.6/3.x
9.9.2. 核心引數
9.9.3. 核心標頭檔案
9.9.4. 編譯核心和相關模組
9.9.5. 編譯核心原始碼:Debian 核心團隊推薦
9.9.6. 硬體驅動和韌體
9.10. 虛擬化系統
9.10.1. 虛擬化工具
9.10.2. 虛擬化工作流
9.10.3. 掛載虛擬磁碟映像檔案
9.10.4. Chroot 系統
9.10.5. 多桌面系統

這裡,描述配置和管理系統的基本技巧,大部分在控制檯操作。

對通過不可靠或斷斷續續的連線訪問遠端主機的人們而言,screen(1) 是一個非常有用的工具,因為它支援可中斷的網路連線。


簡單地使用 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
[提示] 提示

gnome-terminal 之類的x-terminal-emulator 也能夠記錄。你也許需要增加行緩衝來用滾動條檢視。

[提示] 提示

你可以使用 screen(1) 和 "^A H" (參見 第 9.1.2 节 “screen 命令的鍵繫結”)來進行控制檯記錄。

[提示] 提示

你可以使用 emacs(1) 和 "M-x shell", "M-x eshell", 或 "M-x term" 來進行控制檯記錄。你稍後可以使用 "C-x C-w" 將緩衝寫到檔案。

儘管例如 more(1)less(1) 這樣的分頁程式(參見 第 1.4.5 节 “文件內容查看”)和用於高亮和格式的自定義工具(參見 第 11.1.8 节 “高亮並格式化純文字資料”)可以漂亮地顯示文字資料,但通用的編輯器 (參見 第 1.4.6 节 “文本編輯器”)是用途最廣的,且可定製性最高。

[提示] 提示

對於 vim(1) 和它的分頁模式別名 view(1),“:set hls” 可以啟用高亮搜尋。

大部分現代終端的 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}"

你能夠記錄編輯器複雜的重複操作動作。

對於 Vim,請按下面操作。

  • "qa": 開始記錄輸入字元到有名字的暫存器 "a".

  • … 編輯器操作

  • "q": 結束記錄輸入的字元。

  • "@a":執行暫存器 "a 的內容".

對於 Emacs, 請按下面操作。

  • "C-x (": 開始定義一個鍵盤巨集.

  • … 編輯器操作

  • "C-x )":結束定義一個鍵盤巨集.

  • "C-x e": 執行一個鍵盤巨集.

程式活動能夠使用特殊的工具監控和控制。


[提示] 提示

procps 包提供了非常基礎的監控、控制程式活動功能和啟動程式功能。你應當把他們全部學會。

通過匹配某些條件的檔案來迴圈重複一個命令,有幾種方法,例如,匹配全域性模式"*.ext".

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 選單項,需要在 $HOME/.local/share/applications/ 目錄中新增一個 *.desktop 檔案。

[提示] 提示

相似地,如果在這些基準目錄下的 autostart 目錄中建立了一個 *.desktop 檔案,則 *.desktop 檔案中指定的程式會在桌面環境啟動時自動執行。參見 Desktop Application Autostart Specification

[提示] 提示

相似地,如果在 $HOME/Desktop 目錄中建立了一個 *.desktop 檔案並且桌面環境被配置為支援桌面圖示啟動器功能,則點選圖示時指定的程式會被執行。請注意,$HOME/Desktop 目錄的實際名稱與語言環境有關。參見 xdg-user-dirs-update(1)

一些程式會被另一個程式自動啟動。下面是自定義該過程的方法。

[提示] 提示

update-mime(8) 會更新 "/etc/mailcap" 檔案,期間會用到 "/etc/mailcap.order" 檔案 (參見 mailcap.order(5)).

[提示] 提示

debianutils 軟體包提供 sensible-browser(1)sensible-editor(1)sensible-pager(1),它們可以分別對要呼叫的編輯器、分頁程式和網路瀏覽器作出明智的選擇。我建議你閱讀那些 shell 指令碼。

[提示] 提示

為了在 X 下執行例如 mutt 這樣的控制檯應用程式來作為你的首選應用程式,你應該像下面那樣建立一個 X 應用程式並設定 “/usr/local/bin/mutt-term” 為你想要啟動的首選應用程式。

# cat /usr/local/bin/mutt-term <<EOF
#!/bin/sh
gnome-terminal -e "mutt \$@"
EOF
chmod 755 /usr/local/bin/mutt-term

使用 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
[提示] 提示

對那些非連續執行的系統,安裝 anacron 軟體包來定時執行週期性的命令,命令在接近機器啟動的時間執行,並允許有特定的時間間隔。參見 anacron(8)anacrontab(5).

[提示] 提示

對於定時系統維護指令碼,你能夠以root 賬戶定時執行,把這類指令碼放入 "/etc/cron.hourly/", "/etc/cron.daily/", "/etc/cron.weekly/", 或 "/etc/cron.monthly/". 這些指令碼的執行時間,可以通過 "/etc/crontab" 和 "/etc/anacrontab" 來定製。

核心編譯選項 "Magic SysRq key" (SAK 鍵)提供預防系統故障的措施,該選項現在是 Debian 核心的預設值。按 Alt-SysRq 鍵,接著按下面鍵中的一個鍵,會做拯救系統的神奇事情。


[提示] 提示

閱讀 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 特性可能被認為是安全風險。在 "/etc/rc.local" 裡面放入"echo 0 >/proc/sys/kernel/sysrq" 或在 "/etc/sysctl.conf" 裡放入 "kernel.sysrq = 0"來禁用 Alt-SysRq 特性。

[提示] 提示

從 SSH 終端等,你能夠通過向 "/proc/sysrq-trigger" 寫入內容來使用 Alt-SysRq 特性。例如,從 root shell 提示符執行 "echo s > /proc/sysrq-trigger; echo u > /proc/sysrq-trigger" 來 syncs 和 umounts 所有已掛載的檔案系統。

下面設定系統的硬體時間為: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, ntpdatechrony 這類包提供的 NTP 服務。

[提示] 提示

systemd 下,是使用 systemd-timesyncd 來替代進行網路時間同步。參見 systemd-timesyncd(8).

看下面。

[提示] 提示

ntp 包裡面的 ntptrace(8) 能夠跟蹤 NTP 服務鏈至原始源。

用於現在的 Linux 的音效卡裝置驅動程式由 高階 Linux 聲音體系(Advanced Linux Sound Architecture,ALSA) 提供。ALSA 提供了相容之前的 開放聲音系統(Open Sound System,OSS)的模擬模式。

[提示] 提示

使用 “cat /dev/urandom > /dev/audio” 或 speaker-test(1) 來測試揚聲器(^C 停止)。

[提示] 提示

如果你無法聽到聲音,那你的揚聲器可能連線到了一個靜音輸出。現代的聲音系統有許多輸出。alsa-utils 軟體包中的 alsamixer(1) 可以很好地配置聲音和靜音設定。

應用軟體可被配置為不僅直接訪問聲音裝置,也可以通過一些標準化聲音伺服器系統來訪問它們。


每個流行的桌面環境通常都有一個通用的聲音引擎。每個被應用程式使用的聲音引擎都可以選擇連線到不同的聲音伺服器。

糟糕的系統維護可能會暴露你的系統,導致它被外部非法使用。

對於系統安全性和完整性的檢查,你需要從下面這些方面開始。


下面是一個簡單的指令碼,用來檢測典型的所有人可寫的錯誤檔案許可權。

# find / -perm 777 -a \! -type s -a \! -type l -a \! \( -type d -a -perm 1777 \)
[小心] 小心

由於 debsums 軟體包使用本地儲存的 MD5 校驗碼,因此面對惡意攻擊,也不能完全相信系統安全性檢測工具。

使用 live CDdebian-installer CD 以救援模式啟動你的系統,可以讓你簡單地重新配置你的啟動裝置的資料儲存。

對於硬碟分割槽配置,儘管 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) 替代了它。


[小心] 小心

儘管 parted(8) 聲稱也能用來建立和調整檔案系統,但使用維護最好的專門工具來做這些事會更為安全,例如 mkfs(8)mkfs.msdos(8)mkfs.ext2(8)mkfs.ext3(8)mkfs.ext4(8)……)和 resize2fs(8)

[注意] 注意

為了在 GPTMBR 之間切換,你需要直接刪除開頭的幾個塊中的內容(參見 第 9.7.6 节 “清空檔案內容”)並使用 “parted /dev/sdx mklabel gpt” 或 “parted /dev/sdx mklabel msdos” 來設定它。請注意,這裡使用的 “msdos” 是用於 MBR

儘管重新配置你的分割槽或可移動儲存介質的啟用順序可能會給分割槽產生不同的名字,但你可以使用同一個 UUID 來訪問它們。如果你有多個硬碟並且你的 BIOS 沒有給它們一致的裝置名的話,使用 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.ext4(8) 建立新的 ext4 檔案系統

  • fsck.ext4(8) 檢查和修復現有 ext4 檔案系統

  • tune2fs(8) 配置 ext4 檔案系統的超級塊

  • debugfs(8) 互動式的除錯 ext4 檔案系統. (它有 undel 命令來恢復已經刪除的檔案.)

mkfs(8)fsck(8) 命令是由 e2fsprogs 包提供的,是各種檔案系統相關程式的前端。(mkfs.fstypefsck.fstype). 對於 ext4 檔案系統,它們是 mkfs.ext4(8)fsck.ext4(8) (它們被符號連結到 mke2fs(8)e2fsck(8)).

Linux 支援的每一個檔案系統,有相似的命令。


[提示] 提示

Ext4 檔案系統是 Linux 系統上預設的檔案系統,強烈推薦使用這個檔案系統,除非你有特殊的理由不使用。

[提示] 提示

Btrfs 檔案系統在 Linux 核心 3.2(Debian wheezy)上存在。它被期望作為 ext4 檔案系統之後的下一個預設檔案系統。

[警告] 警告

在得到當前核心空間的 fsck(8) 特徵和引導管理器支援前,你的關鍵資料不應當使用 Btrfs 檔案系統。

[提示] 提示

一些工具可以在沒有 Linux 核心支援的情況下訪問檔案系統(參見 第 9.7.2 节 “不掛載磁碟操作檔案”).

/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 訪問分割槽”)可以替代一般的塊裝置名稱(例如 “/dev/sda1”、“/dev/sda2”……)來識別一個塊裝置。

一個檔案系統的效能和特性可以通過所用的掛載選項來進行優化(參見 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 节 “第二階段:引載加載程序”),比如說 "rootflags=data=journal"。對於 lenny 版本,預設的日誌模式是 "rootflags=data=ordered".對於 squeeze 版本,是"rootflags=data=writeback".

固態硬碟(solid state drive,SSD)的效能和硬碟磨損可以通過下列方式優化。

  • 使用最新的 Linux 核心。(>= 3.2)

  • 減少讀取硬碟訪問的硬碟寫入。

    • /etc/fstab 中設定 “noatime” 或 “relatime” 掛載選項。

  • 啟用 TRIM 命令。

    • /etc/fstab 中為 ext4 檔案系統、swap 分割槽、Btrfs 等設定 discard 掛載選項。參見 fstab(5)

    • /etc/lvm/lvm.conf 中為 LVM 設定 “discard” 選項。參見 lvm.conf(5)

    • /etc/crypttab 中為 dm-crypt 設定 “discard” 選項。參見 crypttab(5)

  • 啟用 SSD 硬碟空間分配優化方案。

    • /etc/fstab 中為 Brtfs 設定 “ssd” 掛載選項。

  • 對於膝上型電腦,使系統每 10 分鐘重新整理資料到硬碟。

    • /etc/fstab 中設定 “commit=600” 掛載選項。參見 fstab(5)

    • 設定 pm-utils 使用筆記本模式,即使在 AC 電源供電下。參見 Debian BTS #659260.

[警告] 警告

將重新整理間隔從一般的 5 秒改為 10 分鐘會導致遇到電源故障時資料容易丟失。

你可以使用相容 SMARTsmartd(8) 後臺守護程序(daemon)來監控和記錄你的硬碟。

  1. BIOS 中啟用 SMART 功能。

  2. 安裝 smartmontools 軟體包。

  3. 通過 df(1) 列出硬碟驅動並識別它們。

    • 讓我們假設要監控的硬碟為 “/dev/hda”。

  4. 檢查 “smartctl -a /dev/hda” 的輸出,看 SMART 功能是否已啟用。

    • 如果沒有,通過 “smartctl -s on -a /dev/hda” 啟用它。

  5. 通過下列方式執行 smartd(8) 後臺守護程序(daemon)。

    • 消除 /etc/default/smartmontools” 檔案中 “start_smartd=yes” 的註釋。

    • 通過 “sudo /etc/init.d/smartmontools restart” 重新啟動 smartd(8) 後臺守護程序(daemon)。

[提示] 提示

smartd(8) 後臺守護程序(daemon)可以使用 /etc/smartd.conf 檔案進行自定義,檔案中包含了相關的警告。

在安裝時建立在 Logical Volume Manager 邏輯卷管理(LVM) (Linux 特性) 上的分割槽,它們可以容易的通過合併擴充套件或刪除擴充套件的方式改變大小,而不需要在多個儲存裝置上進行大量的重新配置。

我們在這裡討論磁碟影響的操作。

一個未掛載裝置(例如,第二個 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”。

可以使用迴圈裝置通過下列方式掛載和解除安裝包含單個分割槽映像的磁碟映像 “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
[注意] 注意

你也可以使用迴圈裝置利用偏移量來跳過 MBR 等,來掛載此類磁碟映像的單個分割槽。但這更加容易出錯。

按下面的方式使用 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。

這裡,我們討論直接操作儲存介質上的二進位制資料。

有硬連結的檔案,能夠使用 "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-crypteCryptfs通過 Linux 核心模組與很少的使用者操作實現本地自動資料加密。


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。

[注意] 注意

如果您對資料的安全性要求很高,您可能需要重寫多次(在上述示例中的"badblocks"命令)。雖然這個操作非常耗費時間。

讓我們假設你原先的"/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

您可以用eCryptfsecryptfs-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/”目錄。

[提示] 提示

因為 eCryptfs 只是選擇性的加密敏感資料,它的花費比使用 dm-crypt 在 root 或 "/home" 裝置加密的花費少的多。它不需要任何特殊的磁碟上的儲存分配,但是其不能保證檔案系統所有元資料的祕密性。

如果您使用您的登入密碼為環繞加密金鑰,您可以通過 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

這相當方便。

[警告] 警告

PAM的配置錯誤可能會把您鎖在自己的系統外。請參閱 第 4 章 認證

[小心] 小心

如果你使用你自己的登入密碼作為環繞加密金鑰,加密的資料和使用者登入密碼的安全性一樣 (參見第 4.3 节 “好密碼”)。除非你已認真設定了一個強密碼,否則你的資料仍然處在危險中,當別人偷了筆記本以後,然後執行密碼破解 軟體 (參見第 4.7.4 节 “root 密碼安全”)。

對於支援的架構,Debian 使用軟體包來分發模組化的 Linux核心.

相對於 2.4 版來說,Linux 核心的 2.6/3.x 版有一些值得注意的特徵。

Linux 版本從 2.6.39 跳到 3.0,不僅僅是一個主要的技術改變,也是第 20 個週年紀念日。

許多 Linux 特性可以按下面的方式,通過核心引數來配置。

參見 "kernel-parameters.txt(.gz)" 和 linux-doc-3.* 軟體包提供的其它相關文件 ("/usr/share/doc/linux-doc-3.*/Documentation/filesystems/*")。

Debian 有它自己的方式來編譯核心和相關模組。


如果你在 第 3.1.2 节 “第二階段:引載加載程序” 使用 initrd , 請一定閱讀 initramfs-tools(8), update-initramfs(8), mkinitramfs(8)initramfs.conf(5) 裡的相關資訊。

[警告] 警告

在編譯 Linux 核心原始碼時,請不要放置從"/usr/include/linux" 和 "/usr/include/asm" 到原始碼樹(比如:"/usr/src/linux*") 裡目錄的符號連結。(一些過期的文件建議這樣做.)

[注意] 注意

當在 Debian stable 版裡編譯最新的 Linux 核心時, 可能需要使用一些從Debian unstable 版裡 backported 向後移植的最新版本的工具。

[注意] 注意

dynamic kernel module support (DKMS)動態核心模組支援 是一個新的分散式獨立框架,被設計用來允許單個的核心模組在不改變整個核心的情況下升級。這可以用於維護核心程式碼樹外部的模組。這也使你升級核心時,重新編譯模組變得非常簡單。

硬體驅動是執行在目標系統上的程式碼。大部分硬體驅動現在是自由軟體,已經包含在普通的 Debian 核心軟體包裡,放在 main 區域。

  • GPU 驅動

    • Intel GPU 驅動 (main)

    • AMD/ATI GPU 驅動 (main)和/

    • NVIDIA GPU 驅動 (nouveau 驅動放在 main , 由廠家支援的二進位制驅動,放在 non-free.)

  • Softmodem 驅動

    • martian-modem 和 sl-modem-dkms 軟體包 (non-free)

韌體是載入在裝置上的程式碼(比如說,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-freecontrib 的軟體包不是 Debian 系統的一部分。啟用和禁用 non-freecontrib 區域的配置,在 第 2.1.4 节 “Debian 檔案庫基礎” 裡描述。你應當注意到 第 2.1.5 节 “Debian 是100% 的自由軟體” 裡的描述,使用 non-freecontrib 軟體包會有負面影響。

通過使用虛擬系統,我們能在單個機器上同時執行多個系統。

除了簡單的 chroot 工具外,Debian上還有一些有關係統虛擬化模擬的軟體包。這些軟體包能夠幫你建立虛擬系統。

表 9.26. 虛擬化工具列表

軟件包 流行度 大小 說明
schroot V:7, I:10 2659 在 chroot 下執行 Debian 二進位制包的特異工具
sbuild V:1, I:4 283 從 Debian 原始碼構建 Debian 二進位制包的工具
pbuilder V:2, I:17 954 Debian 軟體包的打包軟體
debootstrap V:7, I:65 259 搭建一個基本的 Debian 系統 (用 sh 寫的)
cdebootstrap V:0, I:3 112 搭建一個 Debian 系統 (用 C 寫的)
virt-manager V:7, I:32 7732 虛擬機器管理器: 用於管理虛擬機器的桌面應用
libvirt-clients V:25, I:47 1907 libvirt 的庫程式
bochs V:0, I:1 4086 Bochs: IA-32 PC 模擬器
qemu I:39 518 QEMU: 快速的通用處理器模擬器
qemu-system I:41 91 QEMU: 全功能系統的模擬二進位制
qemu-user V:3, I:40 70368 QEMU: 使用者模式的模擬二進位制
qemu-utils V:10, I:94 6638 QEMU: 工具集
qemu-kvm V:18, I:68 100 KVM: x86 硬體上有 硬體輔助虛擬化的全虛擬化
virtualbox V:37, I:47 72073 VirtualBox:i386 和 amd64 上 x86 的虛擬化解決方案
xen-tools V:0, I:6 666 用於管理 debian XEN 虛擬伺服器的工具
wine V:23, I:102 181 Wine: Windows 應用程式程式設計介面實現(標準套件)
dosbox V:3, I:20 2755 DOSBox:有 Tandy/Herc/CGA/EGA/VGA/SVGA 顯示卡,聲音和 DOS 的 x86 模擬器
dosemu V:0, I:4 4891 DOSEMU: Linux DOS 模擬器
vzctl V:2, I:3 1069 OpenVZ 伺服器虛擬化解決方案 - 控制工具
vzquota V:2, I:4 221 OpenVZ 伺服器虛擬化解決方案 - 份額工具
lxc V:8, I:13 2047 Linux 容器 使用者層工具

參見維基百科 Comparison of platform virtual machines 來獲得不同平臺的虛擬化解決方案的詳細比較資訊。

[注意] 注意

這裡所描述的功能只在 squeeze 或以後的版本中是可用的。

[注意] 注意

自從 lenny 之後,預設的 Debian 核心就是支援 KVM 的。

典型的虛擬化工作流涉及以下幾個步驟。

對於原始磁碟映像檔案,參見 第 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) 使用 "-P 1" 選項來匯出"disk.img"的第一個分割槽.

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 是如何按下面的方式建立的。

  1. 拷貝本地配置 ("/etc/hosts", "/etc/hostname", "/etc/resolv.conf")

  2. 掛載 "/proc" 檔案系統

  3. 掛載 "/dev/pts" 檔案系統

  4. 建立 "/usr/sbin/policy-rc.d" 的過程,總是 101 退出

  5. 執行 "chroot /sid-root bin/bash -c 'exec -a -bash bin/bash'"

[注意] 注意

一些在 chroot 下的程式,需要訪問比根源系統上的 pbuilder 能夠提供的檔案之外更多的檔案.例如,"/sys", "/etc/passwd", "/etc/group", "/var/run/utmp", "/var/log/wtmp"等等.也許需要使用 bind-mounted 或拷貝.

[注意] 注意

"/usr/sbin/policy-rc.d" 檔案阻止在 Debian 系統上自動啟動後臺守護程式。參見 "/usr/share/doc/sysv-rc/README.policy-rc.d.gz".

[提示] 提示

專用的 chroot 軟體包 pbuilder 的原始用途,是構建一個 chroot 系統,並在 chroot 裡面打包軟體包。它是一個理想的系統,可以用來檢查軟體包的安裝依賴性是否正確,確保不需要的和錯誤的安裝依賴在最終的軟體包中不存在。

[提示] 提示

類似的 schroot 軟體包可以給你一個這樣的主意,在 amd64 根源系統上執行 i386 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) 中檢視。

[提示] 提示

虛擬化下執行 UbuntuFedora 之類的其它 GNU/Linux 發行版,是一個不錯的學習其配置技巧的方法。其它專有作業系統也可以在這個 GNU/Linux 虛擬化下很好的執行。