Debian 參考手冊 --------------- Osamu Aoki Asho Yeh 第 A.1 節, `作者' CVS, 週一 六月 16 21:20:48 UTC 2008 ------------------------------------------------------------------------------- 摘要 ---- Debian 參考手冊 (http://qref.sourceforge.net/) 的目標在為 Debian 的使用者提供全面性的指導,就如同一本_安裝之後的使用手冊_。本文中以大量的 _shell 指令_範例來涵蓋系統管理的各個面向。包括的主題有: Debian 系統的基本概念、系統安裝提示、 Debian 套件管理、 Debian 中的 Linux 核心、系統微調、 gateway 建立、文字編輯器、 CVS 、程式設計、並為_非開發者_說明 GnuPG 等,每個主題都包括基礎指南、實用技巧和其它相關的資訊。 版權聲明 -------- Copyright (c) 2001--2005 by Osamu Aoki . Copyright (Chapter 2) (c) 1996--2001 by Software in the Public Interest. This document may be used under the terms of the GNU General Public License version 2 or higher. (http://www.gnu.org/copyleft/gpl.html) Permission is granted to make and distribute verbatim copies of this document provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this document under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this document into another language, under the above conditions for modified versions, except that this permission notice may be included in translations approved by the Free Software Foundation instead of in the original English. ------------------------------------------------------------------------------- 目錄 ---- 1. 序言 1.1. 官方文件 1.2. 文件慣例 1.3. scripts 範例 1.4. 基本設定 1.5. Debian distributions 的基本概念 2. Debian 基礎 2.1. Debian archives 2.1.1. 目錄結構 2.1.2. Debian distributions 2.1.3. `stable' 發行版本 2.1.4. The `testing' distribution 2.1.5. The `unstable' distribution 2.1.6. The `frozen' distribution 2.1.7. Debian distribution 開發代號 (codenames) 2.1.8. 已用過的開發代號 2.1.9. 開發代號的來源 2.1.10. `pool' 目錄 2.1.11. sid 的歷史記錄 2.1.12. 在 `incoming' 中的上傳套件 2.1.13. 找回舊套件 2.1.14. Architecture sections 2.1.15. 源碼 2.2. Debian 套件管理系統 2.2.1. Debian 套件概觀 2.2.2. Debian 套件格式 2.2.3. Debian 套件檔名的命名 2.2.4. 保留本機設定檔 2.2.5. Debian maintenance scripts 2.2.6. 套件的優先等級 2.2.7. 虛擬套件 2.2.8. 套件相依性 2.2.9. 何為“pre-depends” 2.2.10. 套件狀態 2.2.11. 阻止套件升級 2.2.12. 原始碼套件 2.2.13. 編譯原始碼套件 2.2.14. 新建Debian套件 2.3. Debian系統升級 2.3.1. `dpkg' 2.3.2. APT 2.3.3. `dselect' 2.3.4. 在運行中的系統升級 2.3.5. 下載和快取`.deb'檔案 2.3.6. 升級記錄 2.4. Debian 開機程序 2.4.1. `init' 程式 2.4.2. Runlevels 2.4.3. 自訂 RunLevel 2.5. 多樣性支援 2.6. 國際化 2.7. Debian和系統核心 2.7.1. 編譯非 Debian 核心的原碼 2.7.2. 自定核心建立工具 2.7.3. 模組處理措施 2.7.4. 移除舊版核心套件 3. Debian 系統安裝提示 3.1. 一般Linux安裝提示 3.1.1. 硬體相容性 3.1.2. 確定 PC 硬體和晶片組 3.1.3. 在 Debian 下確定 PC 硬體 3.1.4. 在其它 OS 下確定 PC 硬體 3.1.5. Lilo 迷思 3.1.6. GRUB 3.1.7. 選擇開機軟碟 3.1.8. 安裝系統 3.1.9. 網路所需的主機名和IP地址 3.1.10. 使用者帳號 3.1.11. 建立檔案系統 3.1.12. DRAM記憶體指導 3.1.13. Swap空間 3.2. Bash 設定 3.3. 滑鼠設定 3.3.1. PS/2滑鼠 3.3.2. USB 滑鼠 3.3.3. 觸控版(Touchpad) 3.4. NFS設定 3.5. Samba設定 3.6. 印表機設定 3.6.1. `lpr'/`lpd' 3.6.2. CUPS(TM) 3.7. 桌上型電腦使用CRON 3.8. 其它主機安裝提示 3.8.1. 初始化安裝完成後再裝些什麼 3.8.2. 模組 3.8.3. CD-RW基本步驟 3.8.4. 大記憶體和關機自動斷電 3.8.5. 無法存取某此站台的怪問題 3.8.6. PPP 撥號設定 3.8.7. `/etc/'中的其它設定文件 4. Debian指南 4.1. 準備開始 4.1.1. 用 root 登入 shell 提示符號 4.1.2. 針對新手設定的最精簡環境 4.1.3. 增加帳號 4.1.4. 切換虛擬主控台 4.1.5. 如何關機 4.1.6. 把玩時間 4.2. Midnight Commander (MC) 4.2.1. 加強您的 MC 4.2.2. 啟動 MC 4.2.3. MC 的檔案管理功能 4.2.4. MC 的命令列技巧 4.2.5. MC 的編輯器 4.2.6. MC 的檢視器 4.2.7. MC 自動啟動特性 4.2.8. MC 的FTP虛擬檔案系統 4.3. Unix-like 工作環境 4.3.1. 特殊的組合鍵 4.3.2. 基本的 Unix 指令 4.3.3. The command execution 4.3.4. 簡單的命令 4.3.5. 指令執行和環境變數 4.3.6. 指令收尋路徑 4.3.7. 命令列參數 4.3.8. Shell wildcards 4.3.9. 指令的傳回值 4.3.10. 標準的指令順序 4.3.11. 指令別名 4.4. Unix-like 文字處理 4.4.1. 正規表示法 4.4.2. 置換表示法 4.5. Unix-like 檔案系統 4.5.1. Unix 檔案基礎 4.5.2. Debian 的檔案系統 4.5.3. 檔案和目錄的存取權限 4.5.4. 時間戳記 4.5.5. 連結 4.5.6. Named pipes (FIFOs) 4.5.7. Sockets 4.5.8. Device files 4.5.9. `/proc' 檔案系統 4.6. X Window 系統 4.6.1. 啟動 X Window System 4.6.2. X Window 系統的選單功能 4.6.3. X Window 系統的鍵盤順序 4.7. 後續的學習指南 5. 將 distribution 升級至 `stable', `testing' 或 `unstable' 5.1. 從 Potato 到 Woody 5.2. 升級前的準備 5.3. 升級 5.3.1. 使用 `dselect' 5.3.2. 使用 `apt-get' 6. Debian 套件管理系統 6.1. 介紹 6.1.1. 主要的套件管理工具 6.1.2. 方便的工具 6.2. 體驗 Debian 套件管理 6.2.1. 設定 APT 6.2.2. tasks 安裝 6.2.3. `aptitude' 6.2.4. `dselect' 6.2.5. 使用 APT 來維持 Debian 發行版本 6.2.6. `aptitude',`apt-get'和`apt-cache' 命令 6.3. Debian 生存指令 6.3.1. 檢查 Debian 中的 bugs 並尋求幫助 6.3.2. APT 升級的錯誤排除方法 6.3.3. 使用 `dpkg' 來救援 6.3.4. 回復套件的選取狀態的資料 6.3.5. 在 `/var' 崩潰後救援系統 6.3.6. 把套件安裝到一個無法開機的系統 6.3.7. 如果 `dpkg' 指令壞了怎麼辦 6.4. Debian 神技之指令 6.4.1. 檔案中的資訊 6.4.2. 套件的資訊 6.4.3. Unattended installation with APT 6.4.4. 重新設定已安裝的套件 6.4.5. 移除和清除套件 6.4.6. 維持舊的套件 6.4.7. `stable'/`testing'/`unstable' 混合系統 6.4.8. 刪除暫存的套件檔 6.4.9. 記錄/複製系統設定 6.4.10. 把套件引入 `stable' 系統 6.4.11. 本地端的套件 archive 6.4.12. 轉換或安裝外來的二進位套件 6.4.13. Automatically install command 6.4.14. 驗證已安裝的套件檔 6.4.15. `sources.list' 最佳化 6.5. Debian 其它特別之處 6.5.1. `dpkg-divert' 指令 6.5.2. `equivs' 套件 6.5.3. Alternative 指令 6.5.4. Runlevel 6.5.5. 停止 daemon 服務程式 7. Debian下的Linux核心 7.1. 核心(重新)編譯 7.1.1. 核心標頭檔 7.2. 透過 proc 檔案系統調整核心 7.2.1. 開啟太多檔案 7.2.2. 清除磁碟緩衝區時間 7.2.3. 慢速且記憶體小的機器 7.3. 核心 2.6 和 udev 8. Debian技巧 8.1. 啟動系統 8.1.1. 「我忘了root密碼!」(1) 8.1.2. 「我忘了root密碼!」(2) 8.1.3. 無法啟動系統 8.1.4. 「我不想直接啟動到 X!」 8.1.5. 其它用於啟動提示的技巧 8.1.6. 設定 GRUB 啟動參數 8.2. 活動記錄 8.2.1. 記錄shell活動 8.2.2. 記錄 X 操作 8.3. 拷貝及建立子目錄 8.3.1. 拷貝整個子目錄的基本指令 8.3.2. `cp' 8.3.3. `tar' 8.3.4. `pax' 8.3.5. `cpio' 8.3.6. `afio' 8.4. 差異備份與資料同步 8.4.1. 使用rdiff進行差異備份 8.4.2. 使用`pdumpfs'進行每日備份 8.4.3. 使用 RCS 進行定期差異備份 8.5. 系統凍結恢復 8.5.1. 中止一個進程 8.5.2. Alt-SysRq 8.6. 記住這些可愛的小指令 8.6.1. Pager 8.6.2. 釋放記憶體 8.6.3. 設定時間(BIOS) 8.6.4. 設定時間(NTP) 8.6.5. 如何控制 console 的特色,例如螢幕保護程式 8.6.6. 查詢系統管理資料程式庫 8.6.7. 禁用聲音(響鈴) 8.6.8. 控制台 (console) 上的錯誤訊息 8.6.9. 正確設定控制台 (console) 檔案類型 8.6.10. 恢復 console 到穩定狀態 8.6.11. 將 DOS 下的文字檔案轉換為Unix檔案類型 8.6.12. 利用 `recode' 來轉換文字檔 8.6.13. Regular-expression substitution 8.6.14. 使用 script 來編輯檔案 8.6.15. 提取來源檔案修改部分合併到更新包 8.6.16. 分割大檔案 8.6.17. 從文字檔格式的表格中抽取資料 8.6.18. 精巧的管道指令輔助script 8.6.19. 查看每個檔案的輕巧 script 8.6.20. 輕巧的 Perl Script 8.6.21. 從網頁上取得文件或通信清單(mailing list) 8.6.22. 列印網頁 8.6.23. 列印幫助頁面 8.6.24. 合併兩個Postscript或PDF檔案 8.6.25. 指令耗時 8.6.26. `nice'指令 8.6.27. 日程安排(`cron',`at') 8.6.28. 用`screen'來切換 console 8.6.29. 網路測試基礎 8.6.30. 清理(flush)本地端的 Mail 佇列 8.6.31. 刪除已凍結的信件 8.6.32. 重新寄送`mbox'中的信件 8.6.33. 清理檔案內容 8.6.34. 空檔案 8.6.35. `chroot' 8.6.36. 怎樣檢查 hard links 8.6.37. `mount'硬碟上的映象檔案 8.6.38. Samba 8.6.39. 外來檔案系統的操作工具 8.7. 打錯字的情況 8.7.1. `rm -rf .*' 8.7.2. `rm /etc/passwd' 9. Debian 系統調整 9.1. 初始化系統的提示 9.1.1. 自定 init 命令稿 9.1.2. 設定系統登入日誌( system logging ) 9.1.3. 硬體最佳化(Optimizing hardware) 9.2. 存取限制 ( Restricting access ) 9.2.1. 利用 PAM 來控制登入程序 9.2.2. "為何 GNU `su' 不支援 `wheel' 群組" 9.2.3. Purposes of standard groups 9.2.4. 更安全的工作環境 -- `sudo' 9.2.5. 服務的存取限制 9.2.6. 集中式的認證功能 -- LDAP 9.3. 燒錄器 9.3.1. 簡介 9.3.2. 方法一:modules + `lilo' 9.3.3. 方法二:recompile the kernel 9.3.4. 設定步驟 9.3.5. 光碟映像檔 (可開機) 9.3.6. 寫錄到燒錄機上(R, RW): 9.3.7. 產生一個光碟映像檔 9.3.8. Debian 光碟映像檔 9.3.9. 備份您的資料到 CD-R 9.3.10. 拷貝音樂光碟 9.3.11. 燒錄 DVD-R,DVD-RW 和 DVD+RW 9.4. X 9.4.1. X 套件 9.4.2. X 的硬體偵測 9.4.3. X 伺服器 9.4.4. X clients 9.4.5. X sessions 9.4.6. 在TCP/IP的環境中使用X Window 9.4.7. 連接到遠端的X server -- `xhost' 9.4.8. 連線到遠端的 X server -- `ssh' 9.4.9. X 終端機模擬器 -- `xterm' 9.4.10. X 資源 9.4.11. X 的按鍵和指標按鈕對應 9.4.12. 在 X 裡取得 root 9.4.13. 在 X 的 TrueType 字型 9.4.14. 在 X 中的網頁瀏覽器 9.5. SSH 9.5.1. SSH 的基礎 9.5.2. Port forwarding for SMTP/POP3 tunneling 9.5.3. 以少許密碼連線 -- RSA 9.5.4. 與不同的 SSH 用戶端程式溝通 9.5.5. 設定 `ssh-agent' 9.5.6. SSH 錯誤解決 9.6. Mail 9.6.1. 郵件傳送代理 (MTAs) 9.6.2. 擷取信件l -- Fetchmail 9.6.3. 處理郵件 -- Procmail 9.6.4. 使用 `crm114' 來處理垃圾郵件 9.6.5. 閱讀郵件 -- Mutt 9.7. Localization (l10n) 9.7.1. localization 的基礎 9.7.2. Locales 9.7.3. locales 簡介 9.7.4. 啟動 locale 支援 9.7.5. 啟動特定的 locale 9.7.6. ISO 8601 日期格式 locale 9.7.7. US (ISO-8859-1) 的範例 9.7.8. France with Euro sign (ISO-8859-15) 9.7.9. 多語系的 X 視窗系統範例 9.7.10. 其他的 X 輸入法 9.7.11. X 終端機 9.7.12. 支援 UTF-8 的 X 終端機 9.7.13. 支援 UTF-8 的 framebuffer 主控台 9.7.14. locales 之外 9.8. Multilingualization (m17n) 10. 網路設定 10.1. IP 網路基礎 10.2. 低階網路設定 10.2.1. 低階網路設定 -- 使用 `ifconfig' 和 `route' 10.2.2. 低階網路設定 -- `ip' 10.2.3. 設定 Wi-Fi 裝置 10.2.4. 設定 PPP 裝置 10.3. 對主機命名 10.3.1. 主機名稱 10.3.2. 郵件名稱 10.4. 網域名稱服務 (DNS) 10.4.1. resolver 10.4.2. 管理名稱伺服器的資訊 -- `resolvconf' 10.4.3. 快取已查閱的名稱 -- `nscd', `dnsmasq', `pdnsd', `bind9' 10.4.4. 提供網路名稱服務 -- `bind' 10.5. 安裝網路界面使用 DHCP 10.6. Debian 的高階網路設定 10.6.1. 高階網路設定--使用`ifupdown' 10.6.2. 高階網路設定--`ifupdow'邏輯裝置定義 10.6.3. 神奇的網路設定方式 10.6.4. 利用 `laptop-net' 自動設定網路 10.6.5. 利用`network-manager'自動設定網路 10.7. 處理核心的非一致性裝置命名規則 10.8. 觸發(Triggering)網路設定 10.8.1. 在開機時觸發(trigging)網路設定 10.8.2. 觸發網路設定 -- 使用`hotplug' 10.8.3. 觸發網路設定 -- 使用`ifplugd' 10.8.4. 觸發網路設定 -- 使用 `waproamd' 10.8.5. 網路設定和 PCMCIA 10.9. 多階段(Multi-stage)對應 10.10. 網路服務設定 10.11. 解決網路問題 10.12. 建立通訊閘路由器 10.12.1. Netfilter 設定 10.12.2. 管理多重的網路連線 11. 編輯器 11.1. 流行的編輯器 11.2. 應急的編輯器 11.3. Emacs 和 Vim 11.3.1. Vim 指示 11.3.2. Emacs 提示 11.3.3. 啟動編輯器 11.3.4. Editor 指令摘要 (Emacs , Vim) 11.3.5. Vim 設定 11.3.6. Ctags 11.3.7. 將高亮度顯示的螢幕內容轉為 HTML 文件 11.3.8. 用 `vim' 分割螢幕 12. 版本控制系統 12.1. Concurrent Versions System (CVS) 12.1.1. 安裝 CVS 伺服器 12.1.2. CVS session 範例 12.1.3. CVS 常見問題解決方法 12.1.4. CVS 命令 12.2. Subversion 12.2.1. 安裝 Subversion 伺服器 12.2.2. 將 CVS 檔案庫轉移到 Subversion 12.2.3. Subversion 使用範例 13. 程式設計 13.1. 從哪兒開始 13.2. Shell 13.2.1. Bash -- _GNU_ 標準互動式 shell 13.2.2. POSIX shells 13.2.3. Shell 參數 13.2.4. Shell 重導 (redirection) 13.2.5. Shell 條件式 13.2.6. 命令列操作 13.3. Awk 13.4. Perl 13.5. Python 13.6. Make 13.7. C 13.7.1. 簡單的 C 程式 (`gcc') 13.7.2. 除錯 13.7.3. Flex -- 更好的 Lex 13.7.4. Bison -- 更好的 Yacc 13.7.5. Autoconf 13.8. Web 13.9. 文件準備 13.9.1. `roff' 排版 13.9.2. SGML 13.9.3. TeX/LaTeX 13.9.4. 文學編程 13.10. 包裝套件 13.10.1. 包裝一個單一二進位套件 13.10.2. 使用工具來進行包裝工作 14. GnuPG 14.1. 安裝 GnuPG 14.2. 使用 GnuPG 14.3. 管理 GnuPG 14.4. 在應用程式中使用 GnuPG 14.4.1. 在 Mutt 中使用 GnuPG 14.4.2. 在 Vim 中使用 GnuPG 15. Debian 的技術支援 15.1. 參考資料 15.2. 查詞意 15.3. 查找流行的 Debian 套件 15.4. Debian 錯誤追蹤系統 15.5. 郵件列表 15.6. Internet Relay Chat (IRC) 15.7. 搜尋引擎 15.8. 網站 A. 附錄 A.1. 作者 A.2. 保證 A.3. 回饋 A.4. 文件格式 A.5. Debian 迷宮 A.6. Debian 諺語 ------------------------------------------------------------------------------- 1. 序言 ------- Debian 參考手冊 (http://qref.sourceforge.net/) 的目標在為 Debian 的使用者提供全面性的指導,就如同一本安裝之後的使用手冊。本文假設讀者願意閱讀 shell scripts ,並且在閱讀本文件前已具有 Unix-like 系統操作的基礎技能。 我並_不打算_在文中解釋所有的細節,因為你可以在 manual 頁面、 info 頁面或 HOWTO 文件中獲得詳細的說明。我希望為讀者提供更直接實用的資訊,但非全面性的說明。這些資訊包含了在文中列出實際的指令順序,或是在 http://www.debian.org/doc/manuals/debian-reference/examples/ 下的 script 範例。在執行命令之前必須先了解這些範例的內容。這些指令的順序可能需要做些調整以符合你的系統。 文中大部分的技巧提示均引述自權威參考文獻,在 第 15.1 節, `參考資料' 中列出這些參考書目。 該文件的主旨為 "quick reference" 但內容已經擴充許多。 儘管如此, _Keep it short and simple_ (KISS) 是本文寫作的主導原則。 如果你在尋找系統緊急救援方面的幫助,請立刻閱讀 第 6.3 節, `Debian 生存指令' 。 1.1. 官方文件 ------------- 本文件最新官方文件是放在 Debian archives 中名為 `debian-reference-zh-tw' 的套件裡,你也可在 http://www.debian.org/doc/manuals/debian-reference/ 取得。 本文件最新開發版本位於 http://qref.sourceforge.net/Debian/ 。該計畫是位於 http://qref.sourceforge.net/ ,在那兒可以下載本文件的純文字格式, HTML 格式、 PDF 格式、 SGML 格式和 PostScript 格式。 1.2. 文件慣例 ------------- "Debian 參考手冊" 透過簡短的 `bash' 命令提供許多資訊。 以下是其文件慣例: # root 身分所下的命令 $ 一般帳號身分所下命令 ... 命令動作描述 這些 shell 指令的範例使用 `PS2=" "'。 和 `bash' 相關資訊請參閱 第 13.2.1 節, `Bash -- _GNU_ 標準互動式 shell' 。 參考: * bash(1) 表示 _Unix manual_ 頁面資訊。 * `info libc' 表示 _GNU TEXINFO_ 頁面資訊。 * _The C Programming Language_ 表示_書名_。 * http://www.debian.org/doc/manuals/debian-reference/ 表示 _URL_ 。 * `file:///usr/share/doc/Debian/reference/' 表示系統中的_檔案_。 本文中使用下列的縮寫: * _LDP_: Linux Documentation Project (http://www.tldp.org/) * _DDP_: Debian Documentation Project (http://www.debian.org/doc/) 其他的縮寫在使用前就已經定義在文件內了。 本文中只提供了 LDP 文件的 URL。然而 Debian; 已經包裝了 LDP 的套件,安裝好套件後,可以在 `file:///usr/share/doc/HOWTO/' 取得這些檔案。 參閱 第 15.1 節, `參考資料' 。 1.3. scripts 範例 ----------------- 伴隨著本文(`debian-reference-zh-tw')中的 Example scripts (http://www.debian.org/doc/manuals/debian-reference/examples/) 的範例可以在`file:///usr/share/doc/Debian/reference/examples/'套件中取得。 隱藏檔開頭的 "." 被轉換成底線 "_"。 如果有幾個可選擇的範例的話,會加上附加的延伸檔名 1.4. 基本設定 ------------- 如果你的系統是最小安裝且希望能善用本文的話,建議執行下面的命令以安裝一些有幫助的文件。 # aptitude install mc less ssh vim kernel-package \ manpages-dev doc-debian doc-linux-text \ debian-policy developers-reference maint-guide \ apt-howto harden-doc debian-reference \ libpam-doc glibc-doc samba-doc exim4-doc-html 1.5. Debian distributions 的基本概念 ------------------------------------ Debian 同時維護三個不同的發行版本: 這些版本是: * `stable':--- 適用於架設產品化伺服器,該版本只會更新安全性修正的套件。 參閱 第 2.1.3 節, ``stable' 發行版本' 。 * `testing':--- 工作站的首選,該版本包含了較新版本的桌面軟體以及測試。 參閱 第 2.1.4 節, `The `testing' distribution' 。 * `unstable': --- Cutting edge。Debian 開發者的選擇。 參閱 第 2.1.5 節, `The `unstable' distribution' 。 當`unstable'的軟體在第一個禮拜或更久沒有 release-critical(RC)的臭蟲時,便會自動移動到`testing'。 請參閱 第 2.1.7 節, `Debian distribution 開發代號 (codenames)' 來了解 Debian 發行版本的代號。 在Sarge發行(2005六月)之前,三個版本的的代號為Woody(stable), Sarge(testing), Sid(unstable)。當 Sarge 發行後,三個版本代號為 Sarge, Etch 和 Sid。當 Etch 發行後,`stable'和`unstable'版本將變成Etch和Sid;一個新的`testing'版本(從`stable'版本複製)將會產生並賦予一個新代號。 訂閱`debian-devel-announce@lists.debian.org'這個 mailing list 來取得 Debian 的重大公告。 請參閱 第 2.1 節, `Debian archives'。 如果您想要使用的軟體版本比目前發行版本提供的還新,那麼您可以跟著第 5 章, `將 distribution 升級至 `stable', `testing' 或 `unstable''這一節來升級系統的版本,或者您可只升級該軟體。如果升級該軟體不是那麼方便或造成更多問題,您可以考慮 第 6.4.10 節, `把套件引入 `stable' 系統' 這一節所提的 backport 套件。 `testing'版本會有延誤安裝安全性修正軟體的副作用。這樣的軟體是因為上傳到`unstable'並移植到`testing'的這段期間所造成的延誤。 如果您混用不同的發行版本,例如 `testing' 和 `stable' 或 `unstable' 和 `stable',您終究會安裝到`testing'或`unstable'版本的核心軟體,例如`libc6',而這樣的行為無法保證系統無臭蟲存在。您必須特別小心。 使用`testing' 或 `unstable'的版本會提高遇到嚴重錯誤或臭蟲的機會。這些危險可以利用配置雙系統(另一個系統為較穩定的 Debian)或者採用第 8.6.35 節, ``chroot''這一節的`chroot'技巧來避免。接下來的章節會介紹如何在不同的控制台同時執行不同的 Debian 版本。 在 第 2 章, `Debian 基礎' 中我們將講解有關 Debian distribution 的一些基本概念之後,您會學到一些基礎知識來幫助您與最新的軟體快樂相處,並從 `testing' 和 `unstable' distributions 中獲益。心急的讀者可以直接翻到 第 6.3 節, `Debian 生存指令' 。祝你升級愉快! ------------------------------------------------------------------------------- 2. Debian 基礎 -------------- 這一章節是針對非開發者說明 Debian 系統的原理。想要了解更細微詳盡的訊息,請參閱: * Debian Policy Manual * Debian Developer's Reference * Debian New Maintainers' Guide 以上文件均列在 第 15.1 節, `參考資料'。 如果您在尋找比較淺顯易懂的 "how-to",請直接跳到 第 6 章, `Debian 套件管理系統' 或其他相關的章節。 本節的寫作是基於 "Debian FAQ" 改寫,適合當作一般 Debian 系統管理者的起步文件。 2.1. Debian archives -------------------- 2.1.1. 目錄結構 --------------- 每個被包裝好的 Debian 套件可以從其中一個 Debian mirror site (http://www.debian.org/mirror/) 映射站台透過 FTP 或 HTTP 取得。 以下的目錄皆可在 Debian 映射站台中的 `debian' 目錄找到: `dists/': 該目錄存放 "distributions",主要是用來取得不同發行版本的套件。有些舊套件和`Contents-*.gz' 和 `Packages.gz' 仍然存放在這裡。 `pool/': 所有 Debian releases 及 pre-releases 的套件的新的實體位址。 `tools/': 建立開機片,分割硬碟,解/壓縮檔案,啟動 Linux 的 DOS 工具程式 `doc/': 問與答,臭蟲回報等基本 Debian 文件。 `indices/': Maintainers file 和 override 檔案。 `project/': 大多為開發者的資源,例如: `project/experimental/': 該目錄存放的套件都是開發中且為 alpha 測試階段。使用者不應抓取這裡的套件,因為這些套件是危險且會對系統造成傷害。 `project/orphaned/': 維護者不再維護且從發行版本移除的"孤兒"軟體放在該目錄。 2.1.2. Debian distributions --------------------------- `stable' distribution 套件的入口,Debian Etch (4.0),被登記到 `stable' (符號鏈接指向 `etch/' 目錄): 2.1.3. `stable' 發行版本 ------------------------ `stable'版本(Debian Etch (4.0))的`stable'(連結到`etch/')目錄下紀錄了不同的套件總件: * `stable/main/': 該目錄包含了最近發行的 Debian 系統的套件版本。 這些套件均遵循 Debian Free Software Guidelines (DFSG) (http://www.debian.org/social_contract#guidelines) (它位於 `file:///usr/share/doc/debian/social-contract.txt' 需安裝 `debian-doc'),它們均可以自由使用和散布。 * `stable/non-free/': 經過 DFSG 的驗證而無法稱為 free 的套件皆放在該目錄下。 例如,有些套件的許可證條款 (licenses) 禁止其用於商業的 distribution。有些雖可以再散布,但本身是共享套件而非自由套件。 * `stable/contrib/':這部份的軟體本身是 DFSG-free 但由於某些原因使得必須依賴_非_ DFSG-free 的軟體才能安裝使用。 除了上述的目錄外,目前的實體套件存在的路徑為 `pool' 目錄(第 2.1.10 節, ``pool' 目錄')。 現階段 `stable' 版本的臭蟲報告均列在 Stable Problems (http://ftp-master.debian.org/testing/stable_probs.html) 網頁上。 2.1.4. The `testing' distribution --------------------------------- `testing' distribution 的套件入口,Debian Lenny,在 `unstable' 中通過某種程度的測試後會登記到 `testing' (符號鏈接指向 `lenny/') 目錄。目前的實體套件存在的路徑為 `pool' 目錄 (第 2.1.10 節, ``pool' 目錄')。在 `testing/' 下同樣有 `main' , `contrib' ,和 `non-free' 子目錄,它們的作用與 `stable/' 中的一樣。 這些套件必須可以同時運行於所有架構並且能正常安裝。比起在 `unstable' 中的對應版本,它們必需有更少的 release-critical 錯誤。這個種方式,我們將 `testing' 視為更接近發行的候選版本。有關 testing 機制的更多資訊請參閱 http://www.debian.org/devel/testing。 `testing' distribution 的最新消息發佈在下列站台: * update excuses (http://ftp-master.debian.org/testing/update_excuses.html) * testing problems (http://ftp-master.debian.org/testing/testing_probs.html) * release-critical bugs (http://bugs.debian.org/release-critical/) * base system bugs (http://bugs.qa.debian.org/cgi-bin/base.cgi) * bugs in standard and task packages (http://bugs.qa.debian.org/cgi-bin/standard.cgi) * other bugs and bug-squashing party notes (http://bugs.qa.debian.org/) 2.1.5. The `unstable' distribution ---------------------------------- `unstable' distribution 的套件入口,總是被命名為 "Sid",被登記到 `unstable' (符號鏈接指向 `sid/') 目錄,上傳至 Debian archive 的套件在被移至 `testing/' 前就一直放在這兒。目前的實體套件存在的路徑為 `pool' 目錄 (第 2.1.10 節, ``pool' 目錄')。在 `unstable/' 下同樣有 `main' , `contrib' 和 `non-free' 子目錄, 它們的作用與 `stable/' 中相同。 `unstable' distribution 反映了系統最新的開發進展。歡迎廣大用戶使用並測試這些套件,同時也提醒你們這些套件還不完善。使用 `unstable' distribution 的好處就是你可以獲得 Debian 軟體專案 --- 的最新更新,不過新東西也會出新問題,你得好壞兼收 :-) `unstable' distribution 的最新臭蟲報告見於 Unstable Problems (http://ftp-master.debian.org/testing/unstable_probs.html) 網頁上。 2.1.6. The `frozen' distribution -------------------------------- 當 `testing' distribution 足夠成熟了,它便成為 frozen,表示這個版本不再加入新程式,只進行除錯工作。如果需要的話, `dists' 目錄中會建立新的 testing 目錄樹,並給予新的開發代號。 frozen distribution 再經過幾個月的測試、更新、再凍結也稱之為“循環測試” 我們將 frozen distribution 中可能延遲套件或整個版本發佈的錯誤都記錄在案,一但錯誤總數低於可接受的最大值,frozen distribution 就晉升成 `stable',而新版本發布了,前一個 stable distribution 成為過期版 (obsolete) (並被移至相對應的目錄)。 2.1.7. Debian distribution 開發代號 (codenames) ----------------------------------------------- 存在於 `dists' 目錄下的實體目錄名稱,例如 `etch/' 和 `lenny/' ,就是 "開發代號 (codenames)"。當某個 Debian distribution 處於開發階段,它並沒有版本號碼,取而代之的是開發代號。使用開發代號的目的在於簡化建立 Debian distributions 映射站台的工作(例如 `unstable'的實體目錄突然改名為 `stable/' ,許多文件都沒必要再次下載)。 現在,`stable' 是一個指向 `Etch' 的符號鏈接,`testing' 是指向 `Lenny' 的符號鏈接。也就是說 `Etch' 是當前的 stable distribution, `Lenny' 是當前的 testing distribution。 `unstable/' distribution 是指向 `sid/' 的永久符號鏈接,即 unstable distribution 總是稱為 Sid 。 2.1.8. 已用過的開發代號 ----------------------- 已使用過的開發代號有: "Buzz" 用在 release 1.1 , "Rex" 用在 release 1.2 , "Bo" 用在releases 1.3.x , "Hamm" 用在 release 2.0 , "Slink" 用在 release 2.1 , "Potato" 用在 release 2.2 , "Woody" 用在 release 3.0 和 "Sarge" 用在 release 3.1 。 2.1.9. 開發代號的來源 --------------------- 到目前為止它們均出自 Pixar 的電影 _玩具總動員 (Toy Story)_ 。 * _Buzz_ (Buzz Lightyear) 是個太空人, * _Rex_ 是隻暴龍, * _Bo_ (Bo Peep) 是個放羊的女孩, * _Hamm_ 是個小豬撲滿, * _Slink_ (Slinky Dog) 是隻玩具狗, * _Potato_ 當然就是 Potato Head 先生, * _Woody_ 是個牛仔, * _Sarge_ 是綠色塑膠玩具士兵的首領, * _Etch_ (Etch-a-Sketch) 是玩具黑板, * _Sid_ 是隔壁的男孩,那個玩具終結者。 2.1.10. `pool' 目錄 ------------------- 過去,套件均放在 `dists' 目錄下相應的 distribution 子目錄中。這種做法產生了許多問題,例如映射站台進行新版本發佈時大量頻寬被消耗。 現在套件均依原本的套件名稱分類放進一個巨大的池子 "pool"。為了方便管理, pool 目錄下按屬性再分類 (`main' , `contrib' ,和 `non-free'),分類下面再按原本的套件名稱的英文字首字母歸檔。這些目錄包含的文件有:運行於各種系統架構的二進位套件,和生成這些二進制套件的源碼套件。 你可以執行命令 `apt-cache showsrc ' ,查看 "Directory:" 行獲知每個套件的存放位置。例如:`apache' 套件存放在 `pool/main/a/apache/' 。因為 `lib*' 的套件數量龐大,它們以特殊的方式歸檔:例如,`libpaper' 套件存放在 `pool/main/libp/libpaper/'。 諸如 `apt' 等命令訪問的索引文件仍位於 `dists' 目錄中。 通常,你大可不必注意這些事情,新版的 `apt' 和舊版 `dpkg-ftp' 會自動處理它們。想了解更多資訊,參閱 RFC: implementation of package pools (http://lists.debian.org/debian-devel-announce/2000/debian-devel-announce-200010/msg00007.html)。 2.1.11. sid 的歷史記錄 ---------------------- 過去 Sid 並不存在, Debian archive 組織有一個主要的工作流程:它假設當前 `unstable' 中建立了某個軟體開發項目,它會在整個 distribution 形成一個新的 `stable/' 時發佈。但是因為很多軟體不是用這個方式在開發,所以一但軟體要發佈時,就必需把整個目錄都搬移到 stable 下。因為在搬移目錄時會用掉大量的頻寬,所以這個流程就顯得很不切實際。 經過幾年的研究摸索,archive 管理員提出一個方案,將未發佈的二進位檔放在一個名為 `sid' 的特定目錄。當它們首次發布時,將會建立一個從目前 `stable' 指向 `sid' 的鏈接,從現在起,他們會建立在`unstable/'的目錄下。這個方案的確會使用者覺得困惑。 有了套件 pool 的幫助(參閱 第 2.1.10 節, ``pool' 目錄'),在 `woody' distribution 開發過程中,二進位套件均按一定規範存放於 pool 目錄,而與 distribution 無關,當發佈新版本時,就不會再出現大量頻寬被消耗的問題。(不過,開發過程還是會用掉大量頻寬)。 2.1.12. 在 `incoming' 中的上傳套件 ---------------------------------- 上載的套件在經確認它們是由 Debian 開發者上載的後,會先存放於 http://incoming.debian.org/ (對於那些無維護者上載(Non-Maintainer Upload (NMU))的套件則放入 `DELAYED' 子目錄)。會有一天,它們將從 `incoming/' 移入 `unstable/'。 在緊急情況下,你可能會等不及它們移入 `unstable/' 而直接從 `incoming.' 中下載安裝。 2.1.13. 找回舊套件 ------------------ 最新的 Debian distribution 存放在任何一個 Debian mirror site (http://www.debian.org/mirror/) 的 `debian' 目錄下。舊版本的 Debian 如 Slink 存放在 http://archive.debian.org/ 或 Debian 映射站台的 `debian-archive' 目錄下。 舊的 `testing' 和 `unstable' 套件存放在 http://snapshot.debian.net/。 2.1.14. Architecture sections ----------------------------- 在每個主要目錄樹下(`dists/stable/main' 、 `dists/stable/contrib' 、 `dists/stable/non-free' 、 `dists/unstable/main' 等)按晶片架構又分了子目錄,每個子目錄中存放著在該晶片架構下編譯的二進位套件。 * `binary-all/',存放與架構無關的套件,如 Perl script、純文件等。 * `binary-/',存放運行於該平台的二進制套件。 請注意,二進位套件不再存放在這些目錄中,而是放在最上層 `pool' 目錄中。但為了向下相容,所以在目錄中仍保留有索引文件(`Packages' 和 `Packages.gz')。 要獲得實際上的二進制架構技術支持,請參閱各發行版的發佈記錄(Release Notes)。它們放發佈記錄站台 stable (http://www.debian.org/releases/stable/releasenotes) 和 testing (http://www.debian.org/releases/testing/releasenotes)。 2.1.15. 源碼 ------------ Debian 系統中包含了所有東西的源碼,不僅如此,許可證條款規定系統中所有的程式_必須_和其源碼一起發行,或提供源碼。 通常源碼發佈在 `source' 目錄,該目錄同時處於所有特定平台的目錄中,或是把更新的源碼放在 `pool' 目錄中(參閱 第 2.1.10 節, ``pool' 目錄')。對於不太熟悉 Debian archive 目錄結構的用戶,想獲得源碼可以試試 `apt-get source ' 命令。 有些套件,如著名的 `pine',由於許可證限制,只提供源碼套件。(最近,`pine-tracker' 套件提供了一個簡易的安裝方式。)參閱 第 6.4.10 節, `把套件引入 `stable' 系統' 和 第 13.10 節, `包裝套件' 教你如何手動編建一個套件。 `contrib' 和 `non-free' 目錄中的套件可能不提供源碼,因為它們不算正式 Debian 系統的一部分。 2.2. Debian 套件管理系統 ------------------------ 2.2.1. Debian 套件概觀 ---------------------- 套件通常包含了實現一系列相關命令或特性的所有必需的檔案。Debian 套件有兩種類型: * _Binary packages_(二進位套件),它包含可執行檔、設定檔、 man/info 頁面、版權聲明和其它文件。這些套件以 Debian 特定的格式散佈(參閱 第 2.2.2 節, `Debian 套件格式');它們通常使用 `.deb' 的延伸檔名來散佈。這種二進位套件可使用 Debian 工具 `dpkg' 解開,詳情見相關的 manual 頁面。 * _Source packages_(源碼套件),其中包含一個 `.dsc' 檔用於描述源碼套件(包括下列檔案的名稱),一個 `.orig.tar.gz' 格式的檔案包含了原本未經修改的源碼,以及一個 `.diff.gz' 文件包含了該套件為了符合 Debian 格式對源碼所做的修改。`dpkg-source' 工具可用於包裝和解開 Debian 源碼套件,詳情可參閱相關 manual 頁面。 使用套件管理系統來安裝套件時會用到由套件維護者建立的"相依資訊"。這些相依資訊記錄在每個套件的 `control' 文件中。例如,包含 GNU C 編譯器 (`gcc') 的套件"相依"於包含連結器 (linker) 和組譯器 (assembler) 的 `binutils'套件。如果用戶試圖在沒有安裝 `binutils' 的情況下安裝 `gcc',套件管理系統(dpkg)就會顯示錯誤信息,告訴你需要安裝 `binutils',並停止安裝 `gcc' 。(不過,倔強的用戶可以對這個信息視而不見,參閱 dpkg(8) )。)更多資訊請參閱下面的 第 2.2.8 節, `套件相依性' 。 Debian 套件管理工具可用來: * 操作和管理套件或套件的局部內容, * 分割套件以助於那些使用有限容量的儲存工具如軟碟傳輸的用戶, * 幫助開發者打包套件, * 幫助用戶從遠端 Debian archive 站台安裝套件。 2.2.2. Debian 套件格式 ---------------------- Debian 的"套件",或是 Debian 保存壓縮檔 (archive) 包含了與特定程式或一組相關的程式有關的可執行檔,函式庫,和文件。通常,Debian 保存壓縮檔是以 `.deb' 做為結尾。 [1] Debian 二進制套件的格式說明請參閱 deb(5) 的說明文件。由於 deb 的內容是可變的(不同於各個主要 Debian 版本),所以請使用 dpkg-deb(1) 來控管 `.deb' 檔案。 至少從 Sarge 開始,所有的 Debian 套件檔皆可以透過傳統的 Unix 指令 `ar' 和 `tar' 來控制,即使是 `dpkg' 不存在也沒關係。 [1] `debian-installer' 專案介紹了一種副檔名為 `.udeb' 的套件格式。簡單來說,它是一種簡化型`.deb',因為不用遵循 Debian policy。沒有納入文件且只使用在 `debian-installer',Debian installer一開始是針對 Sarge 發行而設計的。`.deb' 與 `.udeb' 檔案格式是相同的。`udpkg' 是用來處理 `.udeb' 套件,但功能上比 `dpkg' 要來的少且支援較少的相依資訊。兩者的差別在於 Debian 檔案維護者並不喜歡這些檔案庫裡的 `.deb's 不遵循套件政策,所以才選擇不一樣的副檔名以免使用者不經意地安裝這些套件到系統上。`.udeb's 是用在安裝系統時建立的限制型 Debian 的初始 ramdisk。 `.udeb's are used in an initial ramdisk during the base install only to create a very restricted Debian system. 2.2.3. Debian 套件檔名的命名 ---------------------------- Debian 套件檔案名稱是採用以下的規則來命名的: _-_.deb 通常, 是套件名稱, 是原作釋出的版本 (the upstream version number), 是 Debian 釋出的版本,以及 是目的硬體架構。 檔案是很容易更改,這是當然的喔。 您可以執行以下指令來查詢該套件<檔案名稱>的資訊: dpkg --info Debian 釋出版本是由 Debian 開發者決定或製作該套件的人。 釋出版本的改變就表示套件有些許的變化。 2.2.4. 保留本機設定檔 --------------------- 能被系統管理者修改的檔案都放在 `/etc/' 目錄下。 再升級套件時,Debian 政策控制了所有的本機設定檔更新動作。 如果預設的設定檔是套件本身所有,則該檔案稱為 "conffile"。 從套件安裝後,如果 conffiles 曾被系統管理者修改過,則套件管理系統將不會更新這些 conffiles,除非系統管理者願意。換句話說,如果 conffile 都未曾修改,則在升級套件的同時也會一併更新 conffile。 對大部份的情況來說,這是值得期許的,因為方便降低 conffiles 的變更程度。 要列出套件的 conffiles,請執行下述的指令: dpkg --status 檔案清單則列在 "Conffiles:" 這一行。 您可以閱讀 Debian Policy Manual 中的 "Configuration files" 部份來取得更多資訊。(參閱 第 15.1 節, `參考資料') 2.2.5. Debian maintenance scripts --------------------------------- Debian maintenance scripts 是一些在安裝前後自動執行的 scripts。連同 `control' 檔案,這些檔案是一個 Debian 檔案中的 "control" 段落的部份之一。 各個檔案說明: preinst 該 script 在 Debian 壓縮檔 (`.deb') 被解開前才被執行。許多的 "preinst" scripts 將會停止服務直到套件升級或安裝完成 (完成之後,接下來就是 "postinst" script)。 postinst 該 script 用在 Debian 壓縮檔 (`.deb') 被解開後完成設定套件的手續。"postinst" 通常用來等待使用者輸入或提醒使用者,假如他接受預設的設定值,記得重新設定套件。許多的 "postinst" scripts 負責在套件安裝或升級後重新啟動服務。 prerm 該 script 負責停止與套件關聯的daemon服務。它在刪除套件關聯的文件之前執行。 postrm 該 script 負責修改套件連結或文件關聯或刪除由它建立的檔案。(參閱 第 2.2.7 節, `虛擬套件')。 目前所有的 control 檔案可以在 `/var/lib/dpkg/info' 目錄下找到。這些檔案關聯於套件 `foo' 開頭名稱為 "foo" 以及擁有 "preinst", "postinst"...等延伸檔案。該目錄下的 `foo.list' 紀錄了套件 `foo' 安裝到系統上的所有檔案。(要注意的是這些檔案的位置是 `dpkg' 內部運作之一且易被改變的。) 2.2.6. 套件的優先等級 --------------------- 每個Debian套件均被維護者指定了一個_優先等級_,作為套件管理系統的一個輔助參數,優先等級有: * _Required_該級別套件是保証系統正常運作所必須的。 包含所有必要的系統修護工具。不要刪除這些套件,否則整個系統將受到損壞,甚至無法使用`dpkg'恢復。只安裝 Required 級別套件的系統不一定能滿足所有的用途,但它可以正常開機,讓系統管理者安裝想要的軟體。 * _Important_ 在任何 Unix-like 系統上均安裝有該級別套件。 系統若缺少這類套件,將會運行困難或不好操作。該級別套件並_不_包括Emacs或X11或TeX或其它大型應用程式,它們只是一些實現系統底層功能的程式。 * _Standard_ 該級別套件是任何Linux系統的標準,它們組成一個小而精的文字模式的系統。 系統預設安裝就包括了它們。"Standard" 級別套件不包括許多大型應用程式,但它包括 Emacs(它比其它應用程式更低階)和Tex及LaTeX的精巧版(不支援X)。 * _Optional_ 該級別套件包括那些你可能想安裝的套件,即使對它們並不熟悉或沒有特定的需求。 它們包括X11,TeX完整發布版和許多應用程式。 * _Extra_ 該級別套件可能與其它較高級別套件衝突,僅當你知道其用途時才會使用它們,或者它們有特定的需求,這些都使它們不適合定為 "Optional" 級別。 請注意套件描述中的 "Priority: required", "Section: base" and "Essential: yes" 這幾個的差異性。"Section: base" 是指該套件在建立新系統時一定要安裝的。大部份這類型的套件皆有 "required" 級別(Priority: required)或至少 "important" 級別(Priority: import)。且多數被標示成 "Essential: yes"。"Essential: yes" 是指套件管理系統在處理該套件時,必需加入額外的 "暴力" 參數,例如使用 `dpkg' 來移除這類型的套件。舉個例子,`libc6', `mawk' 和 `makedev' 皆為 "Priority: required" 和 "Section: base" 但並非 "Essential: yes"。 2.2.7. 虛擬套件 --------------- 虛擬套件是一個統稱,指的一組具有相近功能的套件。舉個例子,`tin' 和 `trn' 都是新聞閱讀軟體,當系統中某個程式需要使用新聞閱讀器工作時就會產會一個關聯關係,它們必須滿足這個關聯,我們也稱之為它們提供了一個叫做 `news-reader' 的 "虛擬套件"。 又像是,`exim', `sendmail' 和 `postfix'都提供郵件傳輸代理的功能。也可稱之為提供 `mail-transport-agent' 虛擬套件。如果安裝了其中之一,那麼任何與 mail-transport-agent 有關聯的程式會因為這個虛擬套件的存在而滿足相依性。 Debian 有個類似的機制,如果系統中提供相同的虛擬套件,系統管理員可以指定一個為首選軟體。相關的指令是 `update-alternatives',更詳細的描述參閱 第 6.5.3 節, `Alternative 指令'。 2.2.8. 套件相依性 ----------------- Debian套件管理系統有一套套件“依賴性”定義(用一個標誌)用來描述套件需要安裝其他的軟體才能正常工作或作的更好。 * 套件 A_依賴_(depends)套件 B:要運行A必須安裝B。在有些情況下,A不僅依賴B,還要求B的特定版本。版本依賴通常有最低版限制,A更依賴於B的最新版而非某個特定版本。 * 套件 A_推薦_(recommends)套件B:套件維護者認為所有用戶都不會喜歡缺少某些功能的A,而這些功能需要B來提供。 * 套件 A_建議_(suggests)套件B:B中某些檔案與A的功能相關或_加強_A的功能。 * 套件A與套件B_衝突_(conflicts):如果系統中安裝了B那麼A無法運行。“Conflicts”常和“replaces”同時出現。 * 套件A_替換_(replaces)套件B:B安裝的文件被A中的文件移除和覆蓋了。 * 套件A_提供_(provides)套件B:A中包含了B中的所有文件和功能。 各個保留字使用方法的更詳細的訊息請參閱Packaging Manual和the Policy Manual。 注意,`aptitude'和`dselect'可以對_recommends_和_suggests_類套件進行更細部的控制,`apt-get'只會簡單的下載安裝_depends_類套件而不管_recommends_和_suggests_>類套件。這兩個程式均正式使用APT作為後端程式。 2.2.9. 何為“pre-depends” -------------------------- “pre-depends”是一種特殊關聯關系。對於一個普通套件,不管系統中是否存在它的相依套件,`dpkg'都會將它解包。(解包主要指`dpkg'從套件中取出安裝文件並放到正確的位置)。如果套件 _Pre-Depends_ 到其他套件,則這些被 Pre-Depends 的套件會要安裝比的套件先被解包和設定。 [1] 這個相依性的用途是為了提供最小風險的升級。 [1] Debina提供這種機制是為了支援系統從`a.out'格式向ELF格式安全升級,在該過程中套件的解包_順序_攸關重要。對於某些重大升級這種機制也很有用。 2.2.10. 套件狀態 ---------------- 套件有各種狀態:“unknown”,“install”,“remove”,“purge”和“hold”。這些“希望” 標記描述了用戶打算如何操作這些套件(既可以使用`dselect'的 "Select",也可以直接使用`dpkg')。 它們的意思是: * _unknown_ - 用戶並沒描述他想對套件進行什麼操作。 * _install_ - 用戶希望對套件進行安裝或升級。 * _remove_ - 用戶希望刪除套件,但不想刪除任何設定檔。 * _purge_ - 用戶希望完全刪除套件,包括設定檔。 * _hold_ - 用戶希望套件保持現狀,例如,用戶希望保持當前的版本,當前的狀態,當前的一切。 2.2.11. 阻止套件升級 -------------------- 有兩種方法阻止套件升級,使用`dpkg',或者在Woody中使用APT。 使用`dpkg',首先導出套件選擇列表: dpkg --get-selections \* > 接著編輯文件`',修改想要保留的軟體所在的行,例如`libc6',則將: libc6 install 改成: libc6 hold 儲存設定,將它裝入`dpkg'資料庫: dpkg --set-selections < 或者,如果你知道要保留的套件名稱,執行: echo libc6 hold | dpkg --set-selections 這個命令將在每個套件安裝過程中保持該套件不變。 使用`dselect'也可以達到同樣的效果。進入[S]elect畫面,找到想阻止其升級的套件,按“=”鍵(或者“H”)。更改在你退出[S]elect畫面後立即生效。 Woody中的APT系統有一個新機制來阻止套件升級,在下載升級檔進程中使用`Pin-Priority'。參閱幫助頁面apt_preferences(5),或閱讀http://www.debian.org/doc/manuals/apt-howto/或`apt-howto'套件。 2.2.12. 原始碼套件 ------------------ 原始碼套件發布在`source'目錄中,既可以手動下載可以使用 apt-get source 來抓取它們(參閱apt-get(8)幫助頁面)。 2.2.13. 編譯原始碼套件 ---------------------- 對於`'套件,從原始碼編譯需要`.dsc'、`.tar.gz'和`.gz'檔案(注意,對於由Debian開發的套件,沒有`.diff.gz'檔案)。 當你得全了這些檔案,如果你這安裝了`dpkg-dev'套件,執行: $ dpkg-source -x .dsc 它將套件解壓到一個名為`'的目錄。 使用下列命令建立二進制套件: $ cd foo-version $ su -c "apt-get update ; apt-get install fakeroot" $ dpkg-buildpackage -rfakeroot -us -uc 然後: # su -c "dpkg -i ../.deb" 安裝新編譯的套件。參閱第 6.4.10 節, `把套件引入 `stable' 系統'。 2.2.14. 新建Debian套件 ---------------------- 建立新套件的詳細訊息,參閱New Maintainers' Guide,該文檔在`maint-guide'套件中,或瀏覽http://www.debian.org/doc/manuals/maint-guide/。 2.3. Debian系統升級 ------------------- Debian的設計目標之一就是提供一個一致的升級途徑和安全的升級過程,我們致力於舊版本的平順升級,套件在升級過程中會將重要訊息提醒管理者,並提供一個可能的解決方案。你也應該閱讀發布手記(Release Notes),該文檔描述了升級的詳細情況,它存在所有的Debian光碟中,也可以通過網站訪問http://www.debian.org/releases/stable/releasenotes或http://www.debian.org/releases/testing/releasenotes。 第 6 章, `Debian 套件管理系統'提供了升級的實用指南,本節只作基礎細節的介紹。 2.3.1. `dpkg' ------------- 它是操作套件檔案的主要工具;參閱dpkg(8)獲得完整訊息。 `dpkg'由幾個原始的輔助程式演化而來。 * dpkg-deb:控制`.deb'檔案。dpkg-deb(1) * dpkg-ftp:一個舊的套件取得命令。dpkg-ftp(1) * dpkg-mountable:一個舊的套件取得命令。dpkg-mountable(1) * dpkg-split:將大套件分割成小的檔案。dpkg-split(1) `dpkg-ftp'和`dpkg-mountable'已被新的APT系統取代。 2.3.2. APT ---------- APT(the Advanced Packaging Tool)是Debian套件管理系統的進階介面,由幾個名字以 "apt-" 開頭的程式組成。`apt-get'、`apt-cache'和`apt-cdrom'是處理套件的命令列工具,它們也是其它程式的後端程式,如`dselect'和`aptitude'。現在,`aptitude'是目前首選的系統管理工具。 更多訊息,可安裝`apt'和`aptitude'套件後閱讀aptitude(8)、 apt-get(8)、 apt-cache(8)、 apt-cdrom(8)、 apt.conf(5)、 sources.list(5)、 apt_preferences(5)。 另一個資源是APT HOWTO (http://www.debian.org/doc/manuals/apt-howto/),如果安裝了`apt-howto'包,可在`file:///usr/share/doc/Debian/apt-howto/'中找到它。 `apt-get upgrade'和`apt-get dist-upgrade'只抓取"Depends"類套件,它忽略"Recommend"和"Suggests"類套件,不想這樣的話,可使用`dselect'。 2.3.3. `dselect' ---------------- 這個程式是Debian套件管理系統中以選單驅動的用戶介面。特別適用於首次安裝和大幅度升級。參閱第 6.2.4 節, ``dselect''。 更多訊息,請參閱dselect Documentation for Beginners (http://www.debian.org/releases/woody/i386/dselect-beginner)。 2.3.4. 在運行中的系統升級 ------------------------- Debian系統的核心(文件系統)支持替換使用中文件。當升級新套件時如果該套件中包含daemon安裝,則會在該 RunLevel 設定好並重新啟動它們。Debian系統不需要切換到 single-user 模式就能升級運行中的系統了 2.3.5. 下載和快取`.deb'檔案 --------------------------- 如果你手動下載套件到磁碟(這完全沒有必要,請閱讀上面有關`dpkg-ftp'或APT的內容),當你完成套件安裝工作後,可以從系統中刪除`.deb'檔案。 如果是使用APT,這些文件會快取在`/var/cache/apt/archives/'目錄中。你可以在完成安裝後刪除它們(`apt-get clean')或者將它們拷貝到另一個機器的`/var/cache/apt/archives/'目錄中以備以後的安裝。 2.3.6. 升級記錄 --------------- `dpkg'會對套件的解開、配置、刪除、完全刪除進行記錄,但不能(目前是這樣)記錄在套件操作的過程中終端機發生的事情。 最簡單的解決方法是在執行`dpkg'、`dselect'、`apt-get'等工具的對話中加入script(1)程式。 2.4. Debian 開機程序 -------------------- 2.4.1. `init' 程式 ------------------ 如同所有的Unix一樣,Debian啟動要執行init程式。`init'的設定檔(`/etc/inittab')中指定的第一個執行 script 應該是`/etc/init.d/rcS'。 而接下來的程序就看 `sysv-rc' 或 `file-rc' 套件的安排。假設 `sysv-rc' 已安裝了(`file-rc'包含自己的 `/etc/init.d/rcS' script 並使用該檔案取代 rc 目錄下的軟連結來控制那一個 RunLevel 該啟動那一個服務。) `sysv-rc'套件中的 `/etc/init.d/rcS' 會執行 `/etc/rcS.d/' 所有的 script,為了進行初使化的動作,例如檢查和掛載檔案系統,載入模組,啟動網路服務,設定系統時間...等。然後,也會執行`/etc/rc.boot/'下的檔案(除了以 '.' 開頭的檔案)也確保相容性。後者的目錄通常是留給系統管理員使用的但並不是很贊成使用它。更多訊息參閱 Debian Policy 說明文件中的 第 9.1 節, `初始化系統的提示'和System run levels and init.d scripts (http://www.debian.org/doc/debian-policy/ch-opersys#s-sysvinit)。 Debian 不使用 BSD 風格的 `rc.local' 目錄。 2.4.2. Runlevels ---------------- 完成系統啟動進程後,`init'執行預設的 RunLevel。該 RunLevel 由`/etc/inittab'中的`id'指定。Debian 使用 `id=2'。 Debian 使用以下的 RunLevel: * 1(單人模式 single-user mode), * 2(各種多人模式 multi-user modes), * 0(關閉系統), * 6(重啟系統)。 RunLevel 7, 8 和 9 也可以使用,但當套件安裝時,對應他們的 rc 目錄並不會產生。 `telinit'可用來切換 RunLevel。 當切換 RunLevel 時,`/etc/rc.d/'目錄下的 script 都會被執行。這些 script 檔名的第一個字母決定該 script 執行的方式:script 以 `K' 開頭的會夾帶 `stop' 參數執行。script 以 `S' 開頭的會夾帶 `start' 參數執行;script 以字母順序來執行,所以 "stop" 會提早 "start" scripts 執行,而跟隨 `K' 或 `S' 後的兩個數字決定這些 script 執行順序。 實際上,任意目錄`/etc/rc.d/'中的script都是指向`/etc/init.d/'的軟連結。這些 scripts 都接受參數"restart" and "force-reload";後者是為了在系統開機後重新啟動服務或強迫他們重讀設定檔。 例如: # /etc/init.d/exim4 force-reload 2.4.3. 自訂 RunLevel -------------------- 自訂 RunLevel 是系統管理者工作。底下的建議適用大部份的服務。 Customizing runlevels is an advanced system administration task. The following advice holds for most services. 加入到 RunLevel 中的方法是建立`../init.d/'的軟連結在`/etc/rc.d/S'。數字必須該套件安裝時被指定的數字。 更改這個軟連結從開頭是`S'成`K'就能取消這個服務,而所填的數字是 100 減去 。 改用 RunLevel 編輯器 `sysv-rc-conf' 或 `ksysv'會是比較方便的辦法。 移除特定 RunLevel 目錄下的服務的 `S' 軟連結也是可行的辦法。這樣作並非取消該服務但卻變成一個"懸浮"狀態直到`sysv-rc'init 系統有關連到。更改 RunLevel 後,該服務並不會變成"啟動"或"關閉"的狀態,而是看它先前的設定來決定,不論現在是運行中或不是。注意,雖然該服務現在是 "懸浮" 狀態,但當它升級後就會啟動,不管在升級是否在運行或沒有。這是眾所皆知的 Debian 系統的缺點。注意,您也需要保留該服務的 RunLevel 0和6 的 `K'軟連結。 如果您刪除該服務所有的軟連結,再升級套件後會回復所有的軟連結到預設的狀態。 強烈建議不要更動`/etc/rcS.d/'中的任何軟連結。 2.5. 多樣性支援 --------------- Debian提供幾種途徑,在不破壞系統的前提下滿足系統管理員各種要求。 * `dpkg-divert',參閱第 6.5.1 節, ``dpkg-divert' 指令'。 * `equivs',參閱第 6.5.2 節, ``equivs' 套件'。 * `update-alternative',參閱第 6.5.3 節, `Alternative 指令'。 * `make-kpkg'可以支援多種啟動載入器。參閱make-kpkg(1)和第 7.1 節, `核心(重新)編譯'。 `/usr/local/'目錄下的所有檔案均屬於系統管理者,Debian不會更動它們。`/etc'下的大部分(或全部)檔案屬於`conffiles', Debian不會在升級後覆蓋它們,除非系統管理員明確要求覆蓋。 2.6. 國際化 ----------- Debian系統是國際化產品,不論是在主控台下還是在X下,它都提供多種語言的字元顯示和輸入支援。許多檔案、說明文件以及系統訊息都被翻譯成各種語言。在安裝過程中,Debian提示用戶選擇安裝語言(有時是當地語言的變異)。 如果你安裝的系統提供的語言特性支援不能滿足你的需要,或者你要改變當前語言或安裝別的鍵盤以適應你的語言,參閱第 9.7 節, `Localization (l10n)'。 2.7. Debian和系統核心 --------------------- 參閱 第 7 章, `Debian下的Linux核心'。 2.7.1. 編譯非 Debian 核心的原碼 ------------------------------- 首先你必須了解Debian policy並遵守標頭文件的規定。 Debian C libraries是依據_核心_標頭文件最新_stable_發布版建立的。 例如,Debian 1.2發布版使用版本號為5.4.13的頭文件。它基於所有Linux FTP檔案站點發布的Linux核心源碼包,這些源碼包使用了最新的標頭檔。跟隨核心源碼發布的核心標頭檔位於`/usr/include/linux/include/'。 如果你編譯某個程序所用的核心標頭檔案比`libc6-dev'提供的標頭檔案還新,在編譯時你必須在命令行中加上`-I/usr/src/linux/include/'。這些情況是存在的,例如,對於automounter daemon(`amd')套件而言,當新核心改變了對NFS的內部操作方式,`amd'需要知道這些改變。這時就需要引用新的核心標頭檔案。 2.7.2. 自定核心建立工具 ----------------------- 對於希望(或必須)使用自定核心的用戶,推薦下載`kernel-package'套件。該套件包含了建立核心套件的 script。有了它,新建Debian核心套件只需在核心源碼的根目錄執行 # make-kpkg kernel_image 在核心源碼所在目錄的頂層,執行下述命令可獲得相關幫助 # make-kpkg --help 或閱讀make-kpkg(1)幫助手冊以及第 7 章, `Debian下的Linux核心'。 如果所需的kernel-source-(version代表核心版本號)套件不存在,用戶就得從Linux檔案站點分別下載最新的(或需要的)核心源碼。Debian的`initrd'啟動 script 需要一個專門的核心修正才能正確呼叫`initrd';參閱http://bugs.debian.org/149236。 有關`kernel-package'套件的用法詳述見於`/usr/doc/kernel-package/README.gz'。 2.7.3. 模組處理措施 ------------------- Debian的`modconf'套件提供了一個shell script(`/usr/sbin/modconf'),它可以用來自定核心模組設定。該 script 使用選單界面,用戶透過它給出系統中可掛載設備驅動的有關細節,它再將這些細節訊息生成`/etc/modules.conf'檔案(其中列出了別名aliases和其它參數,用於連接各種模組),該設定檔案用來掛載`/etc/modutils/'目錄下和`/etc/modules'(其中列出了需要在系統啟動時掛載的模組)目錄的相關模組。 <<<<<<< system.sgml 新版的`Configure.help'提供建立自定核心的步驟和幫助,同樣,`modconf'套件中也有一系列幫助檔案(位於`/usr/share/modconf/'目錄下),告訴你如何對模組設定合適的參數。 ======= 新版的`Configure.help'提供建立自定核心的步驟和幫助,同樣,`modconf'套件中也有一系列幫助檔案(位於`/usr/share/modconf/'目錄下),告訴你如何對模組設定合適的參數。 >>>>>>> 1.19 2.7.4. 移除舊版核心套件 ----------------------- `kernel-image-.prerm'script 可用來檢查目前運行中的核心版本,以確定是否與你要移除的核心版本相同。因此你可以使用如下命令刪除不想要的核心套件: # dpkg --purge --force-remove-essential kernel-image- (當然,要將替換成你的核心版本和修訂版本。) ------------------------------------------------------------------------------- 3. Debian 系統安裝提示 ---------------------- 安裝 Debian 的官方文件位於 http://www.debian.org/releases/stable/ 和 http://www.debian.org/releases/stable/installmanual 。 文件的開發中版本位於 http://www.debian.org/releases/testing/ 和 http://www.debian.org/releases/testing/installmanual (處於寫作中,有時可能無法存取)。 雖然此章節是以 Potato 安裝程式開始寫起,但大部分的內容皆已更新到 Woody 安裝程式且兩者是非常類似的。由於 Sarge 將會使用一套完全新型的安裝程式,所以請將該文件當作 Sarge 安裝程式的另一個參考。 也請注意部份重要的套件已經更換檔名和安裝的優先等級。例如說,Sarge 已經將預設的 MTA `exim' 替換成 `exim4'以及 `coreutils' 也被其他軟體取代。您需要做些安裝上調整。 3.1. 一般Linux安裝提示 ---------------------- 如果您在尋找精簡的 Debian 安裝光碟,請別忘記檢查 http://www.debian.org/CD/netinst/。 使用 `testing' 或 `unstable' 版本會增加遇到嚴重軟體錯誤的風險。在機器上安裝一個穩定版本的 Debian ,然後使用多重開機方案可有效控制風險。或者使用更安全的 `chroot' 技巧,參閱 第 8.6.35 節, ``chroot'' 。後者可實現同時在不同的主控台 (console) 執行多種版本的 Debian 。 3.1.1. 硬體相容性 ----------------- Linux 相容絕大多數 PC 硬體,而且幾乎可以安裝在任何系統架構上。對我而言它的安裝過程和 Windwos 95/98/Me 一樣簡單。可相容的硬體清單也在不斷增加。 如果你有一部筆記型電腦,可以去 Linux on Laptops (http://www.linux-laptop.net/) 查找對應品牌和型號的安裝指導。 我建議的桌上型硬體通常「比較保守」: * 用於工作目的時最好選 SCSI 而不選 IDE , IDE/ATAPI HD 適於個人使用。 * IDE/ATAPI CD-ROM ( 或 CD-RW)。 * 最好選 PCI 而不選 ISA, 特別是網路卡 (NIC)。 * 選用便宜的 NIC 。 Tulip for PCI、NE2000 for ISA 都不錯。 * 初學 Linux 安裝時避免使用 PCMCIA (筆記型電腦)。 * 別使用 USB 鍵盤、滑鼠, ... 除非你想證明自己的實力。 如果你的機器特別慢,最好把硬碟插到另一個速度快些的機器上安裝。 3.1.2. 確定 PC 硬體和晶片組 --------------------------- 在安裝過程中,可能會要你確定電腦的硬體或晶片組等。有時了解這些資訊並非易事,這裡有個方法: 1. 打開機殼親自看看。 2. 記下顯示卡晶片、網路卡晶片、串列介面和 IDE 埠週圍的晶片上印的數字。 3. 記下印在 PCI 和 ISA 插卡背面的名稱。 3.1.3. 在 Debian 下確定 PC 硬體 ------------------------------- 在 Linux 系統中使用下列命令,可獲得機器當前使用的硬體及設定的相關資訊。 $ pager /proc/pci $ pager /proc/interrupts $ pager /proc/ioports $ pager /proc/bus/usb/devices 在安裝過程中按 Alt-F2 進入控制台,可執行這些命令獲得幫助。 完成第一次安裝之後,接著安裝額外的套件,例如 `pciutils',`usbutils'和`lshw',您就能取得更多系統的資訊。 $ lspci -v |pager $ lsusb -v |pager # lshw |pager 典型的中斷用途: * IRQ0: timer output (8254) * IRQ1: keyboard controller * IRQ2: cascade to IRQ8--IRQ15 on PC-AT * IRQ3: secondary serial port (io-port=0x2F8) (`/dev/ttyS1') * IRQ4: primary serial port (io-port=0x3F8) (`/dev/ttyS0') * IRQ5: free [sound card (SB16: io-port=0x220, DMA-low=1, DMA-high=5)] * IRQ6: floppy disk controller (io-port=0x3F0) (`/dev/fd0', `/dev/fd1') * IRQ7: parport (io-port=0x378) (`/dev/lp0') * IRQ8: rtc * IRQ9: software interrupt (int 0x0A), redirect to IRQ2 * IRQ10: free [network interface card (NE2000: io-port=0x300)] * IRQ11: free [(SB16-SCSI: io-port=0x340, SB16-IDE: io-port=0x1E8,0x3EE)] * IRQ12: PS/2 Mouse * IRQ13: free (was 80287 math coprocessor) * IRQ14: primary IDE controller (`/dev/hda', `/dev/hdb') * IRQ15: secondary IDE controller (`/dev/hdc', `/dev/hdd') 對於舊型的非 PnP ISA 介面卡可以從 BIOS 設定 IRQ5,IRQ10 和 IRQ11 為非 PnP 裝置。 對於 USB 設備,它們在 `/proc/bus/usb/devices' 中以 `Cls=' 的形式列出: * Cls=00 : Unused * Cls=01 : Audio (speaker etc.) * Cls=02 : Communication (MODEM, NIC, ...) * Cls=03 : HID (Human Interface Device: KB, mouse, joystick) * Cls=07 : Printer * Cls=08 : Mass storage (FDD, CD/DVD drive, HDD, Flash, ...) * Cls=09 : Hub (USB hub) * Cls=255 : Vendor specific 如果設備類別 (device class) 不是 255 ,則 Linux 可支援該設備。 3.1.4. 在其它 OS 下確定 PC 硬體 ------------------------------- 還可從其它作業系統中獲取硬體資訊: 安裝其它商業版 Linux。當前它們在硬體偵測方面做得比 Debian 好。(不過一但 Sarge 中加入了 `debian-installer' ,情況就會改變。) 安裝 Windows 。用滑鼠右鍵點“我的電腦”在選單中選屬性/設備管理,可獲得硬體設定資訊。記下所有的資源資訊如 IRQ 、 I/O 埠地址和 DMA 。有些舊的 ISA 卡可能要在 DOS 下設定。 3.1.5. Lilo 迷思 ---------------- "安裝 Lilo 受限於 1024 磁柱(cylinders)。"大錯特錯! Debian Potato 之後使用的新版`lilo'支援lba32。只要主機板的BIOS版本支援lba32,`lilo'就可以衝破 1024 磁柱的限制。 如果你使用的是舊版`lilo.conf',請確定在你的`lilo.conf'檔案開頭的某處加了一行命令指示系統讀取“lba32”。參閱`file:///usr/share/doc/lilo/Manual.txt.gz'。 3.1.6. GRUB ----------- GNU HURD 計畫提供的新的系統開機工具 `grub' 可使用於Debian Woody系統。 # apt-get update # apt-get install grub-doc # mc file:///usr/share/doc/grub-doc/html/ ... read contents # apt-get install grub # pager file:///usr/share/doc/grub/README.Debian.gz ... read it :) 要編輯 GRUB 選單,可編輯`/boot/grub/menu.lst'檔案。參閱第 8.1.6 節, `設定 GRUB 啟動參數'獲取有關啟動參數設定資訊,它和`lilo'的設定方法不太一樣。 3.1.7. 選擇開機軟碟 ------------------- Potato 時期,在進行普通桌上型電腦安裝時我喜歡用 IDEPCI 磁碟套件。到了 Woody ,我愛用 bf2.4 啟動磁碟套件。兩者都使用同一版本的 `boot-floppies' 來建立開機軟碟。 如果你有一張 PCMCIA 網路卡,你就得使用標準啟動磁碟套件(使用的軟碟數最多,但可用的驅動模組最全)並在PCMCIA設定中設定NIC;別在標準網路設定對話框中設定網路卡。 對於特殊系統,需要建立一張自制救援磁碟,可以用別的機器上編譯好的核心壓縮映射站台替換Debian救援磁碟中名為“linux”的核心映射站台。詳情參閱救援磁碟中的`readme.txt'檔案。救援磁碟使用 MS-DOS 檔案系統,所以你可以在任何系統下編輯它。這將為那些使用特殊網路卡的人造福。 到了 Sarge ,可用 `debian-installer' 或 `pgi' 來建立開機軟碟。 3.1.8. 安裝系統 --------------- 這方面的官方文件見於 http://www.debian.org/releases/stable/installmanual 或 http://www.debian.org/releases/testing/installmanual(處於寫作中,有時可能無法存取) 如果你是用`boot-floppies'安裝 testing 發行版本,你需要在安裝過程中按 Alt-F2 打開一個控制台,編輯 `/etc/apt/sources.list' 檔案,將套件下載入口從`stable'改為`testing'。 在安裝`/dev/hda'的`mbr'時,我喜歡將`lilo'裝在諸如`/dev/hda3'的位置,這樣做可以減小開機資訊被覆蓋的風險。 下面是我在安裝過程中所做的選擇。 * MD5 passwords "yes" * shadow passwords "yes" * Install "advanced" (dselect **) and select * 取消emacs (如果它被選中了)、nvi、tex、telnet、talk(d); * 選上mc、vim、nano-tiny或elvis-tiny任選一個。 參閱 第 6.2.4 節, ``dselect'' 。即使你是個 Emacs 迷也不要在安裝階段使用它, nano 可滿足你的需要。也不要安裝其它龐大的套件如 TeX(Potato曾在此階段設定它為預設安裝)。參閱第 11.2 節, `應急的編輯器'了解此時安裝nano-tiny或elvis-tiny的原因。 * 在每個套件安裝對話框中,回答所有的設定提問均=“y”(替換當前值) * `exim':選第2項,因為我使用ISP的SMTP伺服器發送郵件。 有關dselect的更多資訊,參閱第 6.2.4 節, ``dselect''。 3.1.9. 網路所需的主機名和IP地址 ------------------------------- LAN設定的例子(C subnet: 192.168.1.0/24): Internet | +--- 外部ISP提供POP服務(使用fetchmail存取) | Access point ISP提供DHCP服務和SMTP中繼服務 | : Cable modem (Dialup) | : LAN網關外部埠: eth0 (IP由ISP的DHCP提供) 使用老式筆記型電腦(IBM Thinkpad, 486 DX2 50MHz, 20MB RAM) 執行Linux 2.4核心,提供ext3檔案系統支援 執行"ipmasq"套件(加入更好的修正,NAT 和 firewall ) 執行"dhcp-client"套件設定eth0 (覆蓋DNS的設定) 執行"dhcp"套件設定eth1 執行"exim"作為smarthost (mode 2) 執行"fetchmail"設一個較長的時間值(fallback) 執行"bind" 作為暫存名稱伺服(cache nameserver)器,在從LAN連入 Internet 時 作為認證網域名稱伺服器(authoritative nameserver),在從LAN中連入網中某個域時 執行 "ssh" 使用埠 22 和 8080 (從任何地點連接) 執行 "squid" 作為代理伺服器來快取 Debian 檔案庫(APT需要連接它) LAN通訊閘內部埠: eth1 (IP = 192.168.1.1, 固定) | +--- LAN Switch (100base T) ---+ | | LAN中一些固定IP客戶端 LAN中一些DHCP客戶端 (IP = 192.168.1.2-127, 固定) (IP = 192.168.1.128-200, 動態) 參閱第 10 章, `網路設定'了解更多網路設定方面的資訊。參閱 第 10.12 節, `建立通訊閘路由器' 了解更多區域網路通訊閘設定方面的資訊。 3.1.10. 使用者帳號 ------------------ 為了讓機器存取起來有一致的感覺,我的系統中開頭幾個帳號通常是不變的。 我首先建立的使用者帳號名稱是“admin”(uid=100)。我透過該帳號轉發所有的 root email。該帳號加入到`adm'使用者組(參閱第 9.2.2 節, `"為何 GNU `su' 不支援 `wheel' 群組"'),這個使用者組為成員提供大量root特權的命令,透過`su'或`sudo'命令就能使用PAM。詳情參閱第 4.1.3 節, `增加帳號'。 3.1.11. 建立檔案系統 -------------------- 3.1.11.1. 硬碟分區 ------------------ 我更喜歡將不同的目錄樹分別裝在不同的分區下,這樣可以將系統崩潰造成的損失減到最小。例如: / == (/ + /boot + /bin + /sbin) == 50MB+ /tmp == 100MB+ /var == 100MB+ /home == 100MB+ /usr == 700MB+ with X /usr/local == 100MB `/usr'目錄的大小主要取決於 X Window 應用程式和文件的數目。如果只執行控制台終端`/usr/'可以小到300MB,但如果你裝了大量Gnome應用程序2GB-3GB也很正常。當`/usr/'增加得太大,將`/usr/share/'移到別的分區是最有效的解救方法。對新的Linux2.4核心包,`/'目錄的大小可能要超過200MB。 例如,當前我的 Internet 通訊閘(gateway)伺服器的硬碟使用情況如下(由`df -h'命令輸出): Filesystem Size Used Avail Use% Mounted on /dev/hda3 300M 106M 179M 38% / /dev/hda7 100M 12M 82M 13% /home /dev/hda8 596M 53M 513M 10% /var /dev/hda6 100M 834k 94M 1% /var/lib/cvs /dev/hda9 596M 222M 343M 40% /usr /dev/hda10 596M 130M 436M 23% /var/cache/apt/archives /dev/hda11 1.5G 204M 1.2G 14% /var/spool/squid (有塊大空間留給`/var/spool/squid'作為下載套件時代理伺服器的緩衝區) 下面的`fdisk -l'輸出提供了一個分區分配方案: # fdisk -l /dev/hda # comment /dev/hda1 1 41 309928+ 6 FAT16 # DOS /dev/hda2 42 84 325080 83 Linux # (not used) /dev/hda3 * 85 126 317520 83 Linux # Main /dev/hda4 127 629 3802680 5 Extended /dev/hda5 127 143 128488+ 82 Linux swap /dev/hda6 144 157 105808+ 83 Linux /dev/hda7 158 171 105808+ 83 Linux /dev/hda8 172 253 619888+ 83 Linux /dev/hda9 254 335 619888+ 83 Linux /dev/hda10 336 417 619888+ 83 Linux /dev/hda11 418 629 1602688+ 83 Linux 裡面有一個未使用的分區。留作安裝第二個Linux或為增長的目錄樹提供擴充餘地。 3.1.11.2. 掛載檔案系統 ---------------------- 下面的`/etc/fstab'文件可完成上述分區的掛載工作: # /etc/fstab: static filesystem information. # # filesystem mount point type options dump pass /dev/hda3 / ext2 defaults,errors=remount-ro 0 1 /dev/hda5 none swap sw 0 0 proc /proc proc defaults 0 0 /dev/fd0 /floppy auto defaults,user,noauto 0 0 /dev/cdrom /cdrom iso9660 defaults,ro,user,noauto 0 0 # # keep partitions separate /dev/hda7 /home ext2 defaults 0 2 /dev/hda8 /var ext2 defaults 0 2 /dev/hda6 /var/lib/cvs ext2 defaults 0 2 # noatime will speed up file access for read access /dev/hda9 /usr ext2 defaults,noatime 0 2 /dev/hda10 /var/cache/apt/archives ext2 defaults 0 2 # very big partition for proxy cache /dev/hda11 /var/spool/squid ext2 rw 0 2 # backup bootable DOS /dev/hda1 /mnt/dos vfat rw,noauto 0 0 # backup bootable Linux system (not done) /dev/hda2 /mnt/linux ext2 rw,noauto 0 0 # # nfs mounts mickey:/ /mnt/mickey nfs ro,noauto,intr 0 0 goofy:/ /mnt/goofy nfs ro,noauto,intr 0 0 # minnie:/ /mnt/minnie smbfs ro,soft,intr,credentials={filename} 0 2 對於NFS,我使用`noauto、intr'以及預設的`hard'項。如果有死連接,掛載進程可能會死掉,可以使用 Ctrl-C 恢復。 對於使用Samba連接的Windows機器(smbfs),`rw,auto,soft,intr'是個好方案,參閱第 3.5 節, `Samba設定'。 對於軟驅,使用`noauto,rw,sync,user,exec'可以防止因退盤前未執行卸載命令而造成文件損壞,但它會降低寫盤速度。 3.1.11.3. 自動掛載 ------------------ 自動掛載的要點: * 加載`vfat'模組,從而`/etc/auto.misc'可使用`-fstype=auto'參數: # modprobe vfat # prior to the floppy access attempt ... or to automate this settings, # echo "vfat" >> /etc/modules ... 重啟系統。 * 設定`/etc/auto.misc'如下: floppy -fstype=auto,sync,nodev,nosuid,gid=100,umask=000 :/dev/fd0 ... 此處gid=100表示“users”。 * 在 `/home/'中建立連結檔案`cdrom'和`floppy',分別指向`/var/autofs/misc/cdrom'和`/var/autofs/misc/floppy'。 * 將加入“users”使用者組。 3.1.11.4. 掛載NFS ----------------- 外部Linux NFS伺服器(goofy)處於防火牆(gateway)之後。在我的LAN內部,安全策略非常寬鬆,因為只有我自己一個使用者。為了存取NFS,NFS伺服器端要按如下方式加上`/etc/exports': # /etc/exports: the access control list for filesystems which may be # exported to NFS clients. See exports(5). / (rw,no_root_squash) 除安裝和啟動NFS伺服器及客戶端的套件之外,這一步對啟動NFS伺服器也是必要的。 我通常建立一個單獨的2GB分區,有時想玩玩別的Linux系統,就可以裝在這兒。兩個系統可共享swap和`/tmp'分區。多分區方案很難滿足這種需求。如果只想裝一個執行簡單控制台模式的系統,分區留500MB就綽綽有餘了。 3.1.12. DRAM記憶體指導 ---------------------- 下列是有關DRAM的簡單指導。 4MB: Linux核心執行的最低設定。 16MB: 控制台系統執行的最低設定。 32MB: 簡單X系統執行的最低設定。 64MB: GNOME/KDE系統執行最低設定。 128MB: 流暢執行GNOME/KDE。 256MB(或更多): 如果您預算充足,何不增加呢?DRAM 很便宜了。 使用啟動選項`mem=4m'(或lilo `append="mem=4m"')可以看看只用4MB記憶體時系統如何執行。如果機器的BIOS比較舊且記憶體數大於64MB啟動時就得加lilo啟動參數。 3.1.13. Swap空間 ---------------- 我按下面的指導原則來劃分 swap 空間: * 每個 swap 分割區均<128MB(使用舊版2.0核心),<2GB(使用最新核心) * 總容量 =(機器記憶體大小的1到2倍)或(128MB到2GB之間) * 將它們分散於不同的硬碟,在`/etc/fstab'中可使用`sw,pri=1'選項掛載它們。這樣可確保核心以RAID方式使用swap分區,最大限度地發揮swap的性能。 * 如果可能,使用硬碟中間的磁區。 盡管你不一定真的需要,但為系統設定多一些 swap 空間(128MB)總要好點,至少執行有記憶體漏洞的壞程序,系統會先慢下來而不是馬上死當。 3.2. Bash 設定 -------------- 我按自己的喜好修改shell啟動 script: /etc/bash.bashrc 換成你的喜好 /etc/profile 保持發布版設定 ( \w -> \W) /etc/skel/.bashrc 換成你的喜好 /etc/skel/.profile 換成你的喜好 /etc/skel/.bash_profile 換成你的喜好 ~/.bashrc 換成你的喜好,會改變所有使用者的設定 ~/.profile 換成你的喜好,會改變所有使用者的設定 ~/.bash_profile 換成你的喜好,會改變所有使用者的設定 可以參考我提供的 script 範例 (http://www.debian.org/doc/manuals/debian-reference/examples/)。我喜歡系統看起來清清楚楚,所以將`umask'設為002或022。 `PATH'依次由以下設定文件設定: /etc/login.defs - 在shell之前設定PATH /etc/profile (會呼叫/etc/bash.bashrc) ~/.bash_profile (會呼叫~/.bashrc) 3.3. 滑鼠設定 ------------- 3.3.1. PS/2滑鼠 --------------- 對於ATX主機板上使用PS/2介面的滑鼠,信號通路如下: mouse -> /dev/psaux -> gpm -> /dev/gpmdata = /dev/mouse -> X 這裡,建立指向`/dev/gpmdata'的符號鏈接(symlink)`/dev/mouse',有助於簡化設定操作。(例如,如果你決定不再使用 `gpm'服務,只需在移除`gpm' 服務,將符號鏈接`/dev/mouse'指向`/dev/psaux'。) 信號通路使得對鍵盤和滑鼠插拔操作,只要重啟`gpm'就可以生效,不必重啟X! 處於`gpm'輸出與X輸入之間的信號通路協定有兩種執行方式,“ms3”(使用Microsoft 3-button serial mouse協定)和“raw”(對於已連接的滑鼠使用相同的協定),此處選擇的協定將決定X設定中使用的協定。 下面我將示範一下如何設定Logitech 3-button(傳統Unix風格的滑鼠)PS/2滑鼠: 如果新版X4不支援你的顯卡則需要使用舊版X3(如某些ATI 64位卡),請設定`/etc/X11/XF86Config'而不是`/etc/X11/XF86Config-4',下面的示例中使用的是X4: 3.3.1.1. 使用ms3協定方式 ------------------------ /etc/gpm.conf | /etc/X11/XF86Config-4 =========================+====================================== device=/dev/psaux | Section "InputDevice" responsiveness= | Identifier "Configured Mouse" repeat_type=ms3 | Driver "mouse" type=autops2 | Option "CorePointer" append="" | Option "Device" "/dev/mouse" sample_rate= | Option "Protocol" "IntelliMouse" | EndSection 如果使用這種方式,設定滑鼠類型只需編輯`gpm.conf',X的設定將保持不變。參閱我的 script 範例 (http://www.debian.org/doc/manuals/debian-reference/examples/)。 3.3.1.2. 使用raw協定方式 ------------------------ /etc/gpm.conf | /etc/X11/XF86Config-4 =========================+====================================== device=/dev/psaux | Section "InputDevice" responsiveness= | Identifier "Configured Mouse" repeat_type=raw | Driver "mouse" type=autops2 | Option "CorePointer" append="" | Option "Device" "/dev/mouse" sample_rate= | Option "Protocol" "MouseManPlusPS/2" | EndSection 如果使用這種方式,設定滑鼠類型可編輯`gpm.conf',同時也會改變X的設定。 3.3.1.3. 如何設定不同的滑鼠 --------------------------- `gpm'的設備類型`autops2'可以自動偵測出市面上大多數 PS/2 滑鼠。不幸的是它也不是萬能的,而且Woody之前的發布版中並不包括它,這時可在`gpm.conf'中試試`ps2'或者`imps2'。想看看`gpm'支援哪些類型的滑鼠可輸入:`gpm -t help'。參閱gpm(8)。 如果使用的是 2 鍵 PS/2 滑鼠,可選上 X 協定的`Emulate3Buttons'項。協定中 2 鍵滑鼠和3鍵滑鼠的區別在於每次按下中間鍵時,是自動偵測還是自動模擬信號傳給`gpm'。 對於在X協定第 3.3.1.2 節, `使用raw協定方式'或不使用`gpm',可使用下面的設定: * `IntelliMouse': 串列埠滑鼠(`gpm'轉換器使用"ms3") * `PS/2': PS/2滑鼠(通常首先試試這項) * `IMPS/2': 任何PS/2滑鼠(2鍵、3鍵或滾軸滑鼠) * `MouseManPlusPS/2': Logitech PS/2滑鼠 * `...' 更多資訊可瀏覽Mouse Support in XFree86 (http://www.xfree86.org/current/mouse.html)。 典型的 Microsoft 滾軸滑鼠,有報導說這樣設定最好: /etc/gpm.conf | /etc/X11/XF86Config-4 =========================+====================================== device=/dev/psaux | Section "InputDevice" responsiveness= | Identifier "Configured Mouse" repeat_type=raw | Driver "mouse" type=autops2 | Option "CorePointer" append="" | Option "Device" "/dev/mouse" sample_rate= | Option "Protocol" "IMPS/2" | Option "Buttons" "5" | Option "ZAxisMapping" "4 5" | EndSection 對於某些最新的 Toshiba 超薄筆記型電腦,在 System-V init 腳本中設定`gpm'先於PCMCIA啟動可防止系統鎖死。聽起來古怪不過是真的。 3.3.2. USB 滑鼠 --------------- 請確定你設定了所有必需的 Kernel 選項,並在編譯核心時編入核心或模組: * 在 "Input core support" 選單下: * "Input core support" (CONFIG_INPUT, `input.o'), * "Mouse support" (CONFIG_INPUT_MOUSEDEV, `mousedev.o'), * 在 "USB support" 選單下: * "Support for USB" (CONFIG_USB, `usbcore.o'), * "Preliminary USB device filesystem" (CONFIG_USB_DEVICEFS), * "UHCI" or "OHCI" (CONFIG_USB_UHCI || CONFIG_USB_UHCI_ALT || CONFIG_USB_OHCI, `usb-uhci.o' || `uhci.o' || `usb-ohci.o'), * "USB Human Interface Device (full HID) support" (CONFIG_USB_HID, `hid.o'), and * "HID input layer support" (CONFIG_USB_HIDINPUT) 這邊的小寫字串為模組名稱。 如果你沒使用devfs,則需按下面的方法建立一個設備節點`/dev/input/mice': # cd /dev # mkdir input # mknod input/mice c 13 63 對於典型的滾軸_USB_滑鼠,設定如下: /etc/gpm.conf | /etc/X11/XF86Config-4 =========================+====================================== device=/dev/input/mice | Section "InputDevice" responsiveness= | Identifier "Generic Mouse" repeat_type=raw | Driver "mouse" type=autops2 | Option "SendCoreEvents" "true" append="" | Option "Device" "/dev/input/mice" sample_rate= | Option "Protocol" "IMPS/2" | Option "Buttons" "5" | Option "ZAxisMapping" "4 5" | EndSection 更多資訊可瀏覽the Linux USB Project (http://www.linux-usb.org/)。 3.3.3. 觸控版(Touchpad) ------------------------- 盡管觸控版在筆記型電腦上預設是模擬 2 鍵 PS/2 滑鼠行為,仍可從`tpconfig'套件獲得對這類設備的完全操控。例如在`/etc/default/tpconfig'中設定`OPTIONS="--tapmode=0"'可取消討厭的“click by tap”行為。按如下方法設定`/etc/gpm.conf'可以控制台下使用觸控版和 USB 外接滑鼠。 device=/dev/psaux responsiveness= repeat_type=ms3 type=autops2 append="-M -m /dev/input/mice -t autops2" sample_rate= 3.4. NFS設定 ------------ 安裝NFS要設定`/etc/exports'。 # apt-get install nfs-kernel-server # echo "/ *.domainname-for-lan-hosts(rw,no_root_squash,nohide)" \ >> /etc/exports 詳情見我的 script 範例 (http://www.debian.org/doc/manuals/debian-reference/examples/). 3.5. Samba設定 -------------- 參考資料: * http://www.samba.org/ * `samba-doc' package 以“share”方式安裝 Samba 比較容易,因為安裝過程會建立WfW-type共享驅動器。但最好使用“user”模式來設定它。 可以用`debconf'或`vi'來設定Samba: # dpkg-reconfigure --priority= samba # in Woody # vi /etc/samba/smb.conf 詳情參閱\我的 script 範例 (http://www.debian.org/doc/manuals/debian-reference/examples/). 可透過`smbpasswd'向 `smbpasswd' 檔案新增一個新使用者: $ su -c "smbpasswd -a username" 確保使用的加密密碼有恰當的相容性。 按下表中相應的值設定`os level'(數字越大,伺服器的優先級越高): 0: Samba with a loose attitude (will never become a master browser) 1: WfW 3.1, Win95, Win98, Win/Me? 16: Win NT WS 3.51 17: Win NT WS 4.0 32: Win NT SVR 3.51 33: Win NT SVR 4.0 255: Samba with mighty power 確認使用者是目錄所屬組的成員,並且對目錄賦予了執行權限。 3.6. 印表機設定 --------------- 傳統列印方法是`lpr'/`lpd'。新的 CUPS 系統(Common UNIX Pinting System)提供了另一方法PDQ,詳情參閱Linux Printing HOWTO (http://www.tldp.org/HOWTO/Printing-HOWTO.html)。 3.6.1. `lpr'/`lpd' ------------------ For the `lpr'/`lpd'的列印緩衝池(type spoolers)(`lpr'、`lprng'和`gnulpr'),如果它們連接的是PostScript或text-only印表機(最基本的印表機)可按如下方式設定`/etc/printcap': |:\ :sd=/var/spool/lpd/:\ :mx#0:\ :sh:\ :lp=/dev/lp0: 上述各行的意思是: * Head line: -- spool名稱, = alias * mx#0 -- 不限最大文件尺寸 * sh -- 不列印頁眉 * lp=/dev/lp0 -- 本地機印機,或port@host遠程印表機 如果連接的是台PostScript印表機,上述設定就夠用了。如果是Windows機器透過Samba列印,上述設定也適用於任何Windows支援的印表機(不支援雙向通信)。你必須在Windows環境中對印表機做相應的設定。 如果你沒有PostScript印表機,就得用`gs'安裝過濾系統。有很多自動設定工具可用於設定`/etc/printcap',可選擇下列任何一組: * `gnulpr'、(`lpr-ppd')和`printtool'--- 我就是用這種 * `lpr'和`apsfilter' * `lpr'和`magicfilter' * `lprng'和`lprngtool' * `lprng'和`apsfilter' * `lprng'和`magicfilter' 想執行GUI設定工具如`printtool',需要 root 權限,參閱第 9.4.12 節, `在 X 裡取得 root'。`printtool'可建立列印緩衝池,它使用`gs'模擬PostScript印表機,所以要使用PostScript列印驅動來存取它們。在Windows端,“Apple LaserWriter”是標準件。 3.6.2. CUPS(TM) --------------- 安裝 Common UNIX Printing System (or CUPS(TM)) 所有的套件,請開啟 `aptitude' 並選擇: "Tasks" -> "Servers" -> "Print Server". (Sarge) 為了最好的結果,您必須設定 `aptitude' 如下: "F10" -> "Options" -> "Dependency handling" -> "[X] Install Recommended packages automatically". KDE 和 Gnome 桌面系統提供了簡易的印表機設定。如果有安裝 `swat',您也能使用瀏覽器來設定: $ http://localhost:631 舉個例子,將你的印表機連接到可存取印表機清單中: * 在主頁面上點擊“Printers”,然後點“Add Printer”, * 輸入使用者名和密碼,進入“root”, * 按提示新增印表機, * 返回“Printers”頁面,點選“Configure Printer”, * 設定列印紙尺寸、解析度和其它參數。 更多資訊可瀏覽http://localhost:631/documentation.html和http://www.cups.org/cups-help.html。 3.7. 桌上型電腦使用CRON ----------------------- Vixie`cron'預設會自動安裝,它可用來排定工作。 如果你的電腦不是24/7開機的話,並無多大的用處。 對桌上型來說,你或許會安裝`anacron'來取代`cron'以解決這樣的問題。 `fcron'也是另一套值得推薦的軟體 參閱第 8.6.27 節, `日程安排(`cron',`at')'的說明來設定 CRON 工作。 3.8. 其它主機安裝提示 --------------------- 3.8.1. 初始化安裝完成後再裝些什麼 --------------------------------- 到現在,你已經擁有一個小巧但功能頗強的Debian。接下來,可以安裝那些較大的套件了。 在此,你最想做的事就是選擇鐘愛的編輯器和`aptitude'需要的程序。你可以同時安裝Emacs的多個變種。參閱第 11.1 節, `流行的編輯器'。 然後,再次執行`aptitude',選擇(幾乎)所有在"Tasks" --> "End-user"下的套件以取得完整的使用者導向的系統。 我通常會編輯`/etc/inittab'簡化關機步驟。 ... # What to do when CTRL-ALT-DEL is pressed. ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -h now ... 3.8.2. 模組 ----------- 在初始安裝期間可進行設備驅動模組設定。以後還可使用`modconf'進行設定,它是基於選單介面的工具,可用來設定那些在初始安裝時未曾設定的模組或完成新核心安裝後的設定工作。 所有預加載(preloading)模組的名稱要加入到`/etc/modules'清單。也可以使用`lsmod'和`depmod'進行手工操控。 如果你沒打開IP偽裝(FTP等),別忘了在`/etc/modules'中加上幾行。 3.8.3. CD-RW基本步驟 -------------------- 使用 IDE CD-RW 和 kernel 2.4 的話,請編輯下列文件: /etc/lilo.conf (新增append="hdc=ide-scsi ignore=hdc", 執行 lilo 啟動) /dev/cdrom (建立鏈接 # cd /dev; ln -sf scd0 cdrom ) /etc/modules (add "ide-scsi"和"sg"。如果需要可再加上"sr"。) 詳情參閱第 9.3 節, `燒錄器'。 3.8.4. 大記憶體和關機自動斷電 ----------------------------- 編輯`/etc/lilo.conf',設定啟動提示參數如下,實現識別大記憶體(適用於2.2版核心)和關機自動斷電(適用於APM): append="mem=128M apm=on apm=power-off noapic" 執行`lilo'完成上述設定。對稱多處理器核心(SMP-kernel)需要`apm=power-off'和`noapic'才能避免我那堆糟糕的 SMP 硬體出問題。系統啟動時,在啟動提示符後直接輸入這些參數效果也一樣。參閱第 8.1.5 節, `其它用於啟動提示的技巧'。 在 Debian 的2.4版核心中 APM 是作為模組編譯的,對於這種情況,可在系統啟動後執行`# insmod apm power_off=1'或設定`/etc/modules': # echo "apm power_off=1" >>/etc/modules 還可以這樣:編譯新版核心時加入 ACPI 支援可達到同樣的效果,而且這種方式更適合SMP(只有較新的主機板才支援ACPI)。對於較新的主機板2.4版核心可以直接檢測到大記憶體。 CONFIG_PM=y CONFIG_ACPI=y ... CONFIG_ACPI_BUSMGR=m CONFIG_ACPI_SYS=m 在`/etc/modules'中按如下順序新增參數: ospm_busmgr ospm_system 或者重新編譯核心,在設定時將上述核心選項均設為“y”。總之,有了ACPI支援就不再需要任何啟動提示參數。 3.8.5. 無法存取某此站台的怪問題 ------------------------------- 新的Linux核心預設開啟ECN,對於某些使用劣質路由器的站台,會出現無法存取的問題。檢查ECN狀態可使用: # cat /proc/sys/net/ipv4/tcp_ecn ... 或 # sysctl net.ipv4.tcp_ecn 將它關閉: # echo "0" > /proc/sys/net/ipv4/tcp_ecn ... 或 # sysctl -w net.ipv4.tcp_ecn=0 每次啟動時禁止TCP ECN,可編輯`/etc/sysctl.conf',加上: net.ipv4.tcp_ecn = 0 3.8.6. PPP 撥號設定 ------------------- 安裝`pppconfig'套件,設定 PPP 撥號存取。 # apt-get install pppconfig # pppconfig ... 依照提示設定 PPP 撥號 # adduser dip ... 允許進行 PPP 撥號存取 使用者()進行 PPP 撥號存取: $ pon # 開始 PPP 存取,接通你的ISP ... enjoy the Internet $ poff # 停止 PPP 存取, 可選 詳情參閱 第 10.2.4 節, `設定 PPP 裝置'。 3.8.7. `/etc/'中的其它設定文件 ------------------------------ Debian 標準安裝不包含 `/etc/cron.deny' 文件,想新增可拷貝 `/etc/at.deny'。 ------------------------------------------------------------------------------- 4. Debian指南 ------------- 本章為那些初涉 Debian 世界的新手指出了基本方向。如果你接觸 Unix-like 系統已有一段時間,就能了解我底下說明的部份。請將此文件當成實戰測試吧。 4.1. 準備開始 ------------- 從安裝 Debian 到電腦之後,您需要學會一些技巧才能活用它。讓我們給您一些簡單的練習。 4.1.1. 用 root 登入 shell 提示符號 ---------------------------------- 在開機的過程中,您會看到圖形或文字介面的登入畫面(基於安裝的套件)。為了簡化說明,如果您看到的是圖形登入介面,請按下 Ctrl-Alt-F1 [1] 切換到文字介面的登入模式。 假設您的主機名稱為 `',那麼登入提示符號則類似: login: 輸入 `root',按下 Enter 後並輸入安裝過程設定的密碼。Debian 系統跟 Unix 一樣,密碼是分辨大小寫的。接下來系統會出現一個問候訊息並留下 root 提示符號等您輸入指令。 [2] login: root Password: Last login: Sun Oct 26 19:04:09 2003 on tty3 Linux 2.4.22-1-686 #6 Sat Oct 4 14:09:08 EST 2003 i686 GNU/Linux Most of the programs included with the Debian GNU/Linux system are freely redistributable; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. root@:root# 透過 root 命令提示符號,您就準備進行系統管理了。root 帳號稱為超級使用者(superuser)或特權使用者(privileged user)。使用 root 帳號,您可以達成: * 讀、寫和移除任何系統上的檔案而不需考慮權限 * 能夠設定系統上任何檔案的擁有者和權限 * 設定任何系統非特權使用者的密碼 * 登入到任何帳號而無需輸入密碼 分享 root 密碼來取得 root 帳號是非常不好的方法。請使用如 sudo(8) 的軟體就是一個較好的方式來分享管理者權限。 先登入非特權帳號再進行管理動作是值得學習的 Unix 習慣。等需要 root 權限時再使用 `sudo',`super'或`su -c'來取得特定的功能。請參閱 第 9.2.4 節, `更安全的工作環境 -- `sudo''。 [3] [1] 同時按下鍵盤左邊的 Ctrl, Alt 以及 F1。 [2] 如果您編輯 `/etc/motd',則問候訊息就會不同。 [3] 我必須說明我常常使用超級使用者帳號,只因為它是很容易且我比較不拘小節。 4.1.2. 針對新手設定的最精簡環境 ------------------------------- 我認為學習電腦系統就像是學習一套外國語言。雖然學習指南很有幫助,但您需要去練習並使用這些工具。這個情況下,我建議額外安裝一些套件來輔助,例如 `mc', `vim', `lynx', `doc-linux-text' 和 `debian-policy'。 [1] # apt-get update ... # apt-get install mc vim lynx doc-linux-text debian-policy ... 如果您已經安裝這些套件,則執行上述指令就不會重新安裝。 [1] 安裝 `gpm', `emacs21' 和 `doc-linux-html' 也是不錯的選擇喔,請參閱 第 3.3 節, `滑鼠設定' and 第 11 章, `編輯器'。 4.1.3. 增加帳號 --------------- 系統安裝完畢,通常會添加一個普通用戶帳號,而該帳號會收到寄給 root 的信件。 [1] 如果您不想使用這個特殊帳號來練習以下的指令則必須建立一個新的使用者帳號。 如果新的帳號為 `',請輸入: root@:root# adduser ... 回答完所有的問題 就會建立該帳號了。 [2] 在進行下面的步驟前,我們先學習一些基礎。 [1] 我傾向將此帳號命名為 `admin',當然也可以是任何有權威性的名字。 [2] 您可以將 `' 加入到 `adm' 群組中以便讀取 `/var/log/' 中的紀錄檔。請參閱 passwd(5), group(5), shadow(5), group(5), vipw(8) 和 vigr(8)。對於使用者帳號和群組的官方定義,請參考最近的 Users and Groups (file:///usr/share/doc/base-passwd/users-and-groups.html)。 4.1.4. 切換虛擬主控台 --------------------- 在未調整過的 Debian 系統中,總共有六個獨立的虛擬終端機。也就是說您可以在文字介面的主控台中使用六個可切換的 VT-100 終端機。按下左邊的 Alt 加上 F1--F6 可以切換到另外一個終端機。每一個虛擬終端機允許不同的帳號登入且不受其他終端機影響。多人環境是 Unix 偉大的設計且容易讓人上癮。 如果您不小心在執行 X 視窗系統的機器按下 Alt-F7,則主控台螢幕會切換到視窗介面,按下 Ctrl-Alt-F1 就能回到文字主控台。試著練習切換不同的主控台並跳回到原來這一個來習慣這些特性。 4.1.5. 如何關機 --------------- 和其他現代的作業系統一樣,系統檔案會快取到記憶體中,在切斷電源之前 Debian 系統需要完成特定的關機程序才能維持檔案的完整性。使用 root 提示命令列來執行以下的關機指令: # shutdown -h now 這是多用戶模式下的關機命令。如果是單一使用者模式,請執行以下的命令: # poweroff -i -f 您也能按下 Ctrl-Alt-Delete 來關機。 [1] 等待螢幕上顯示 "System halted" 之後切斷電源。如果在BIOS和Linux中開啟了 APM 或 ACPI ,系統會自動切斷電源。詳情參閱第 3.8.4 節, `大記憶體和關機自動斷電'。 [1] 請在主控台同時按下 Ctrl,Alt(位在鍵盤的左邊) 以及 Delete 鍵。預設的情況是會重新開機。如同 第 3.8 節, `其它主機安裝提示' 說明的,編輯 `/etc/inittab' 檔案中的 `shutdown'並加入 `-h' 就能關機。 4.1.6. 把玩時間 --------------- 現在您可以大膽地使用 Debian 系統而不用擔心任何危險,因為您使用的是非特權帳號:`'。 [1] 我們來試著登入 `',如果您在 root 命令提示列,請按下 Ctrl-D [2] 結束 root 的動作回到登入提示符號。現在請輸入新建立的帳號 `' 及密碼。 [3] 您就會顯示以下的提示命令列。 @:$ 從現在開始,底下的範皆使用簡化的命令提示列來說明。我將會使用 * `#' : root 命令提示列 * `$' : 非特權帳號的命令提示列 我們將以最簡單的方式 第 4.2 節, `Midnight Commander (MC)' 和適當的方法 第 4.3 節, `Unix-like 工作環境' 來學習 Debian 系統。 [1] Debian 系統會這樣做的原因是因為在安裝系統後,良好的檔案權限可以防止非特權用戶破壞系統。當然,依然有許多存在的漏洞被發現,但這些問題應該是留給適合 Securing Debian Manual (http://www.debian.org/doc/manuals/securing-debian-howto/) 的使用者而非閱讀此章節的人。 [2] 同時按下左Ctrl鍵和D。不需要按 Shift 即使是控制字元被標示成大寫的 "control D"。 [3] 如果您將 `' 換成 `root' 登入,就會取得 `root' 權限。如果您要重新取得 `root' 權限請執行這個動作。 4.2. Midnight Commander (MC) ---------------------------- Midnight Commander (MC)是 Linux 主控台和其它終端環境中的 GNU "瑞士軍刀"。對於新手來說,選單式的控制會比傳統 Unix 指令好上手多了。 使用這個指令來流覽 Debian 系統。這是最好的方式來學習。請使用方向鍵和 Enter 鍵來流覽主要的檔案系統。 * `/etc' 以及子目錄。 * `/var/log' 以及子目錄。 * `/usr/share/doc' 以及子目錄。 * `/sbin' 和 `/bin' 4.2.1. 加強您的 MC ------------------ 為了使 MC 在離開時改變工作目錄,您需要修改 `~/.bashrc' (或 `/etc/bash.bashrc', 由 `.bashrc' 呼叫),使用 `-P' 選項,就像在說明頁面 mc(1) 中的敘述。 [1] [1] 如果您不清楚我說明的,可以先跳過。 4.2.2. 啟動 MC -------------- $ mc 在 MC 中可使用選單來完成所有的檔案操作,只需要使用者小小的嚐試一下就行了。按下 F1 顯示說明視窗。您可以搭配方向鍵和功能鍵來使用 MC。 [1] [1] 如果是在像 `kon' 和 `Kterm' for Japanese 等使用某些圖形特性的終端的話,則在命令列中加上 `-a' 可以預防 MC 出現一些問題。 4.2.3. MC 的檔案管理功能 ------------------------ 預設狀態是兩個目錄面板列出檔案列表。另一種好用的模式是將右邊視窗設定為 "information" ,以查看檔案存取權限等資訊。下面是一些基本的按鍵。如果 `gpm' daemon 在運作的話,你還可以使用滑鼠。 (在 MC 中進行剪下和貼上操作時別忘了按下 shift 鍵。) * F1: 說明選單 * F3: 內建的檔案檢視器 * F4: 內建的編輯器 * F9: 啟動下拉選單 * F10: 離開 Midnight Commander * Tab: 在兩個視窗間移動 * Insert: 標記檔案以方便多檔案的操作,如複製 * Del: 刪除檔案 (小心---以 MC 設定為安全刪除模式。) * 方向鍵:就是方向鍵 4.2.4. MC 的命令列技巧 ---------------------- * 任何 `cd' 命令會改變所選畫面的目錄。 * Ctrl-Enter 或 Alt-Enter 會將檔案名稱複製到命令列上。配合 `cp' 或 `mv' 命令使用來做命令列的編輯。 * Alt-Tab 會顯示出 shell 的檔名擴展以供選擇。 * 可指定 MC 兩個目錄視窗的起始目錄;例如 `mc /etc /root' 。 * Esc + <數字鍵> == F (也就是說, Esc + `1' = F1 等等。 Esc + `0' = F10) * Esc 鍵 == Alt 鍵 (= Meta , M-) ;也就是說,輸入 Esc + `c' 就等於 Alt-c 4.2.5. MC 的編輯器 ------------------ 內建編輯器的剪下-貼上方式很有意思。按 F3 標記起始點,再次按 F3 標記終止點,而中間的選取部分會高亮度顯示。然後你可以移動游標到某處按下 F6 ,被選取部分就會移到該處。如果你按下的是 F5 ,選中部分就會複製到該處。 F2 會儲存檔案, F10 是退出,所有方向鍵的作用則和它們的名字一樣直觀。 可用編輯器直接打開某個檔案: $ mc -e filename_to_edit $ mcedit filename_to_edit 雖然它不是多視窗編輯器,但你可利用多個 Linux 主控台來達成相同的效果。要在視窗間進行複製動作,可使用 Alt-F 來切換虛擬主控台,然後使用 "File->Insert file" 或 "File->Copy to file" 將一個檔案中的內容複製到另一個檔案。 可指定任何外部編輯器來取代內建的編輯器。 許多程式使用環境變數 `EDITOR' 或 `VISUAL' 來決定使用哪個編輯器。如果你用不慣 `vim',可在 `~/.bashrc' 中加上幾行來指定使用 `mcedit' : ... export EDITOR=mcedit export VISUAL=mcedit ... 我推薦設定為 `vim' 。習慣 vi(m) 是件好事,因為在 Linux/Unix 世界裡你總找得到它們。 [1] [1] 事實上,`vi' 或 `nvi' 是您在那都能取得的。我推薦新手使用 `vim' 是因為按下 F1 就能看到說明文件且類似於前者並提供更強大的功能。 如果您不熟悉 `vim' 或不喜歡用,那麼您可繼續使用 `mcedit' 來處理大部份系統維護的工作。自從 `mcedit'是以 8-bit 編碼且傻瓜(指不理會檔案編碼),用它來修改未知編碼的檔案是比較方便的。`mcedit'無法正確顯示 UTF-8 的檔案。 4.2.6. MC 的檢視器 ------------------ 非常聰明的檢視器。它是在文件中搜索詞句的利器。我總是用它在 `/usr/share/doc' 目錄下找檔案,用它來瀏覽大量的 Linux 資料是最快的方法。檢視器可以像這樣直接啟動: $ mc -v filename_to_view 4.2.7. MC 自動啟動特性 ---------------------- 在檔案上按 Enter,會啟動相關的程式來處理該檔案。這是 MC 的一個極方便的特性。 executable: 執行命令 man, html file: 將檔案內容導向 (Pipe) 至檢視軟體 tar, gz, rpm file: 像子目錄般的瀏覽其內容 為了使這些文件特性生效,不要將可閱讀的檔案設成可執行檔。可使用 MC 的檔案選單或使用 `chmod' 來改變檔案屬性。 4.2.8. MC 的FTP虛擬檔案系統 --------------------------- MC 可通過 FTP 來存取網路上的檔案。按 F9 轉到選單列,輸入 `p' 啟動 FTP 虛擬檔案系統。以 `username:passwd@hostname.domainname' 格式輸入 URL ,遠端的目錄就會像本地端目錄一樣顯示出來。 試著流覽 `http.us.debian.org/debian' 中的 Debian 檔案。請參閱 第 2.1 節, `Debian archives' 了解這些是如何組織起來的。 4.3. Unix-like 工作環境 ----------------------- 雖然 MC 能幫助你完成許多事情,但是學會如何從 shell 命令列執行指令並熟習 Unix-like 環境是非常重要的。 [1] [1] 在本章節中,shell 指的是 `bash'。想要伸入了解各個 shell 的差異,請參閱 第 13.2 節, `Shell'。 4.3.1. 特殊的組合鍵 ------------------- 在 Unix-like 環境中,有許多組合鍵有特別的意義。 [1] * Ctrl-U: 清除一行中游標之前的文字。 * Ctrl-H: 移除游標前的一個字元。 * Ctrl-D: 結束輸入。(如果您在 shell 下,就會跳出該 shell) * Ctrl-C: 終止正在執行的程式。 * Ctrl-Z: 暫時停止程式。 (將該工作放到背景,參閱 第 4.3.10.1 節, ``command &'') * Ctrl-S: 停止輸出到畫面上。(類似 Scorll Lock) [2] * Ctrl-Q: 回復輸出到畫面上。 預設的 shell 是 `bash' ,它能記住使用過的命令 (history-editing) 和命令列擴展 (tab-completion) 的功能來輔助互動式的使用。 * up-arrow: 開始收尋過去的命令。 * Ctrl-R: 開始漸進示收尋過去的命令。 * TAB: 擴展要輸入的檔案到命令列上。 * Ctrl-V TAB: 輸入 TAB,而不是命令列擴展 其他重要的組合鍵: * Ctrl-Alt-Del: 重新啟動/關閉系統,參閱 第 3.8 節, `其它主機安裝提示'。 * Left-click-and-drag mouse: 選取並拷貝至剪貼簿。 * Click middle mouse button: 將剪貼簿內容貼至游標處。 * Meta-key (只針對 Emacs) 是設定在左邊的 Alt。有些系統會使用 Windows-key 當 Meta-key。 為了在 Linux 文字主控台中使用滑鼠,您必須使用 `gpm' 服務。 [3] 參閱 第 3.3 節, `滑鼠設定'。 [1] 在正常的 Linux 文字主控台下,只有左邊的 Ctrl 和 Alt 是有用的。 [2] 您可以利用 stty(1) 來關閉這個終端機功能。 [3] 在 X 系統環境下,滑鼠的功能跟 Xterm 軟體一樣。 In the X Window environment, the mouse functions in the same way with the Xterm program. 4.3.2. 基本的 Unix 指令 ----------------------- 我們來學一些基本的 Unix 指令吧。 [1] 試著由非特權帳號`'來執行下列的指令: * `pwd' * 顯示目前的工作目錄。 * `whoami' * 顯示目前的使用者 * `file ' * 顯示檔案的型別。 * `type -p ' * 顯示執行檔`'的檔案路徑。 * `which ' 也是相同功能。 [2] * `type ' * 顯示執行檔 `' 的資訊。 * `apropos ' * 找出與 `' 有關的說明文件。 * `man -k ' 也具有相同功能。 * `whatis ' * 顯示指令`'的單行敘述。 * `man -a ' * 顯示指令 `'的說明 (Unix 風格) * `info ' * 顯示指令 `' 較豐富的說明 (GNU 風格) * `ls' * 列出目錄的內容。 (非點開頭的檔案和目錄) [3] * `ls -a' * 列出目錄的內容。 (所有的檔案和目錄) * `ls -A' * 列出目錄的內容。 (幾乎所有的檔案和目錄,也就是略過 "`..'" 和 "`.'") * `ls -la' * 列出目錄下所有的檔案和細節資訊。參閱 第 4.5.2 節, `Debian 的檔案系統'。 * `ls -d' * 列出目前目錄下所有的目錄。 * `lsof ' * 列出以開檔的 `' 狀態。 * `mkdir ' * 在目前的目錄下產生新目錄: `'。 * `rmdir ' * 在目前的目錄下移除目錄: `'。 * `cd ' * 切換目錄到目前目錄下的 `' 或是`CDPATH'變數所定義的目錄下的目錄。參閱文件builtins(7) 中的 `cd'。 * `cd /' * 切換到根目錄。 * `cd' * 切換到使用者的家目錄。 * `cd /' * 切換到絕對路徑為`/'的目錄。 * `cd ..' * 切換到上一層目錄。 * `cd ~' * 切換到家目錄中的 `' 目錄。 * `cd -' * 切換到先前的目錄。 * `''。 [4] * `touch ' * 建立一個空檔案:`'。 * `cp ' * 複製一已存在的檔案:`' 並命名成:`'。 * `rm ' * 移除 `' 檔案。 * `mv ' * 更名一已存在的 `' 檔案成 `' 檔名。 * `mv ' * 移動一已存在的 `' 檔案到新的位置且更名成 `'。`' 目錄必須存在。 * `chmod 600 ' * 設定一已存在的檔案:`' 的權限為其他帳號皆不可讀和寫。(任何人皆不可執行) * `chmod 644 ' * 設定一已存在的檔案:`' 的權限為其他帳號皆可讀但不可寫入。(任何人皆不可執行) * `chmod 755 ' * 定一已存在的檔案:`' 的權限為其他帳號皆可讀但不可寫入。(任何人皆可執行) * `top' * 全螢幕顯示程序的資料。輸入 "q" 終止。 * `ps aux | pager' * 使用 BSD 風格顯示全程序的資料。參閱 第 4.3.10.2 節, ``command1 | command2''。 * `ps -ef | pager' * 使用 Unix system-V 風格顯示全程序的資料。 * `ps aux | grep -e "[e]xim4*"' * 顯示全部 `exim' 或 `exim4' 程序。執行 `man grep' 來閱讀 grep(1) 學習正規式表示法。 [5] * `ps axf | pager' * 使用 ASCII art 輸出顯示全程序的資料。 * `kill <1234>' * 砍掉 pid 為 <1234> 的程序。參閱 第 8.5.1 節, `中止一個進程'。 * `grep -e "" *.html' * 收尋並顯示目錄下所有副檔名為 `.html' 的 "<原型>"。 * `gzip ' * 使用 Lempel-Ziv coding (LZ77) 壓縮 `' 成 `.gz'。 * `gunzip .gz' * 解壓縮 `.gz' 產生 `'。 * `bzip2 ' * 使用 Burrows-Wheeler block sorting text compression algorithm 和 Huffman coding (比 `gzip' 壓縮率更高) 來壓縮 `' 成 `.bz2' * `bunzip2 .bz2' * 解壓縮 `.bz2' 產生 `'。 * `tar -xvvf ' * 解開 `.tar' 保存檔。 * `tar -xvvzf .tar.gz' * 解開 gzip 壓縮檔:`.tar.gz'。 * `tar -xvvf --bzip2 ' * 解開 bzip2 壓縮檔:`.tar.bz2'。 [6] * `tar -cvvf .tar /' * 打包目錄 `/' 成 `.tar' 保存檔。 * `tar -cvvzf .tar.gz /' * 壓縮和打包目錄 `/' 到 `.tar.gz' 保存檔。 * `tar -cvvf --bzip2 .tar.bz2 /' * 壓縮和打包目錄 `/' 到 `.tar.bz2' 保存檔。 [7] * `zcat README.gz | pager' * 使用預設的 pager 來顯示壓縮檔 `README.gz' 的內容。 * `zcat README.gz > foo' * 建立 `foo' 檔案而內容為已解壓縮的 `README.gz'。 * `zcat README.gz >> foo' * 附加已解壓縮的 `README.gz'的內容到 `foo' 檔案。(如果該檔案不存在,請先建立。) * `find . -name ' * 使用 shell `<原型>' 收尋相符的檔名。(速度較慢) * `locate -d . ' * 使用 shell `<原型>' 收尋相符的檔名。(使用定期產生的資料庫,較快) 請先使用上述的指令當作測試來探勘系統目錄。如果您有任何指令上的問題,請閱讀說明文件。比如說,這些指令是好的出發點: $ man man $ man bash $ man ls 現在使用 `vim' 的好機會,請按下 F1。您應該會看到至少前 35 行。然後實作線上測驗,將游標移至 `|tutor|' 並按下 Ctrl-]。參閱 第 11 章, `編輯器' 了解更多編輯器。 請注意,許多從 GNU 和 BSD 來的 Unix-like 指令皆有簡潔的說明,您可以使用以下其一的方法叫出來(有些情況是不用加任何參數): $ --help $ -h 也順便練習一下第 8 章, `Debian技巧'的範例來練功吧。 [1] 我在這邊使用 "Unix" 當作通解。任何的 Unix 系列的作業系統通常有提供一樣的指令。Debian 也不例外。別擔心,如果有些指令不能運作,這些範例將不會在這邊出現。 [2] 如果在 shell 使用 `alias',則輸出的結果就不相同。 [3] Unix 有個傳統是將檔案名稱以 "`.'" 開頭為隱藏檔。這些檔案通常是紀錄設定資訊和使用者偏好設定。 [4] 全新精簡的 Debian 系統預設的 pager 為 `more',但不能上下捲動。執行 `apt-get install less' 來安裝 `less' 就會變成預設的 pager 且您可以使用方向鍵來捲動上下頁。 [5] 正規式表示法中的 `[' 和 `]' 可使 `grep' 避免收尋到自己。至於表示法中的 `4*' 代表符合四個字元的次數大於零來使`grep'匹配`exim'和`exim4'。雖然 `*'皆可用在 shell filename wild card 和正規表示法,但兩者的意義是不同的。 [6] 在這裡用 `--bzip2' 來替代較短的 `-j' 來保證 Potato 中舊版的 `tar' 能正常工作。 [7] 同樣地,`--bzip2'是確保相同性。 4.3.3. The command execution ---------------------------- 相信您現在比較清楚如何使用 Debian 系統了。我們來探勘 Debian 中更進階的指令技巧。 [1] [1] 在這裡,我省略了一些東西,這對於新手比較好入手。詳細說明請參閱 See bash(1)。 4.3.4. 簡單的命令 ----------------- 一個簡單的指令是以下的排列 1. 變數宣告 (額外的) 2. 指令名稱 3. 參數 (額外的) 4. 導向 (額外的:`>' , `>>' ,`<' , `<<' ...等) 5. 控制運算子 (額外的:`&&' , `||' ; , `;' , `&' , `(' , `)') 對於置換和引用,參閱 第 13.2.6 節, `命令列操作'。 4.3.5. 指令執行和環境變數 ------------------------- 典型的指令執行是使用下述的 shell 指令列: [1] $ date Sun Oct 26 08:17:20 CET 2003 $ LC_ALL=fr_FR date dim oct 26 08:17:39 CET 2003 在這裡,`date'是前景工作。至於環境變數 `LC_ALL' 是指: * 第一個指令未設定 (系統預設是跟 `C' 一樣) `LC_ALL' * 第二個指令將 `LC_ALL' 設成 `fr_FR' (French locale) 大部份的指令在執行時不會比環境變數更早執行。對於上面的範例來說,你也可以這樣做: $ LC_ALL=fr_FR $ date dim oct 26 08:17:39 CET 2003 當你看到這裡時,輸出的結果是受到環境變數的影響而產生 French 的文字。如果您想要環境變數也影響到子程序(舉例來說,當使用 shell script),您必須 "export" 它: $ export LC_ALL [1] 要完成下列的輸出,您必須安裝 French locale,參閱 第 9.7.2 節, `Locales'。這並不是該指南的基本。這只是為了說明它另一個結果。 4.3.6. 指令收尋路徑 ------------------- 當您在 shell 輸入指令時,shell 會 `PATH' 這個環境變數中列舉的目錄來找指令。`PATH' 同時也是 shell 的收尋路徑。 在預設安裝的 Debian 下,使用者的`PATH' 不會包含`/sbin/'。所以當您需要從 `/sbin/' 執行一些像 `ifconfig'的指令時,您必須修改 `PATH' 的值並包含該路徑。`PATH'通常是設定在 `~/.bash_profile' 之中,參閱 第 3.2 節, `Bash 設定'。 4.3.7. 命令列參數 ----------------- 部份的指令需要額外的參數才能執行,這些參數通常是以 `-' 或 `--' 開頭並透過指令來呼叫。 $ date Mon Oct 27 23:02:09 CET 2003 $ date -R Mon, 27 Oct 2003 23:02:40 +0100 這裡的參數 `-R' 會改變 `date' 的輸出結果而變成 RFC-2822 相容的字串。 4.3.8. Shell wildcards ---------------------- 有時候您希望能同時處理相同類別的檔案但不想一個一個輸入時,shell _wildcards_的 "檔名原型擴展" 就能解決這樣的問題。 * `*' * 符合任何 0 個或更多個的字元。 * 這不符合檔名以 "`.'" 開頭的檔案。 * `?' * 只符合一個字元。 * `[...]' * 只符合括號中的一個字元。 * `[a-z]' * 只符合`a' 和 `z' 中的一個字元。 * `[^...]' * 符合括號中沒有列舉的一個字元("^"並不包含)。 舉例來說,思考一下底下的範例: $ mkdir junk; cd junk; touch 1.txt 2.txt 3.c 4.h .5.txt $ echo *.txt 1.txt 2.txt $ echo * 1.txt 2.txt 3.c 4.h $ echo *.[hc] 3.c 4.h $ echo .* . .. .5.txt $ echo .[^.]* .5.txt $ echo [^1-3]* 4.h $ cd ..; rm -rf junk 4.3.9. 指令的傳回值 ------------------- 每個指令會回傳 exit 狀態當成回傳值。 * 如果指令成功執行完成的話,則回傳值 = 0。 * 如果指令因錯誤終止,則回傳值不為 0。 執行後的回傳值可經由 `$?' 環境變數來存取。 $ [ 1 = 1 ] ; echo $? 0 $ [ 1 = 2 ] ; echo $? 1 請注意,shell 使用邏輯計算回傳值時,_success_的話就當成邏輯 _TRUE_。這並不是那麼直覺,因為_success_有代表 _zero_ 的意思。 參閱 第 13.2.5 節, `Shell 條件式'。 4.3.10. 標準的指令順序 ---------------------- 我們試著記憶底下的 shell 指令用法。閱讀過這些用法後也請參考 第 13.2.3 節, `Shell 參數', 第 13.2.4 節, `Shell 重導 (redirection)', 第 13.2.5 節, `Shell 條件式' 和 第 13.2.6 節, `命令列操作'。 4.3.10.1. `command &' --------------------- 該 `command' 指令是在 _背景_中的子 shell 執行。背景的工作允許使用者在一個 shell 中執行多個程式。 背景程序的管理包含了 shell 本身的 `jobs', `fg', `bg' 和 `kill'。請閱讀 bash(1) 中的 "SIGNALS", "JOB CONTROL" 和 "SHELL BUILTIN COMMANDS"。 [1] [1] Debian 系統是多工的系統。 4.3.10.2. `command1 | command2' ------------------------------- `command1' 的 standard output 是餵給 `command2' 的stand input。兩個指令可以_同時_執行。這就叫作 _pipeline_。 4.3.10.3. `command1 ; command2' ------------------------------- `command1' 和 `command2' 是按照順序地執行。 4.3.10.4. `command1 && command2' -------------------------------- `command1' 先被執行。如果成功的話,則`command2'也會_依序_的執行。`command1' _和_`command2'皆成功執行,則傳回 success。 4.3.10.5. `command1 || command2' -------------------------------- `command1' 先被執行。如果不成功的話,則`command2'還是會_依序_的執行。`command1' _或_`command2'其一成功執行的話,則傳回 success。 4.3.10.6. `command > ' --------------------------- 將`command'的結果重導到`'檔案。(會覆寫) 4.3.10.7. `command >> ' ---------------------------- 將`command'的結果重導到`'檔案。(會附加) 4.3.10.8. `command > 2>&1' -------------------------------- 將`command'的 standard output 和 standard error 重導到`'檔案。 4.3.10.9. `command < ' --------------------------- 將`command'的 standard input 導到`'檔案。試試看以下的例子: $ ' * 符合文字的結尾。 * `[abc...]' * 這個字元列表符合 "`abc...'" 中任何一個字元。 * `[^abc...]' * 這個字元列表符合非 "`abc...'" 中任何一個字元。 * `r*' * 符合 "`r'" 這個敘述 0 次以上的文字。 * `r+' * 符合 "`r'" 這個敘述 1 次以上的文字。 * `r?' * 符合 "`r'" 這個敘述 0 或 1 次的文字。 * `r1|r2' * 符合"`r1'" 或 "`r2'" 敘述之一的文字。 * `(r1|r2)' * 符合"`r1'" 或 "`r2'" 敘述之一的文字並以 _bracketed_ 表示法處理。 在 BREs 裡,_metacharacters_:"`+ ? ( ) { } |'" 是無作用的,取而代之的是倒斜線的 "`\+ \? \( \) \{ \} \|'"。所以說,使用 BREs 時,`(r1|r2)' 必須像 `\(r1|r2\)' 用倒斜線隔開。雖然 `emacs' 也支援 BRE,但改用 "`+ ?'" 來當作_metacharacters_。所以不需要使用雙引號來隔開。參閱 第 4.4.2 節, `置換表示法' 了解這些_metacharacters_組合怎麼使用。 舉例來說,`grep' 可以使用正規表示法來收尋文字: $ egrep 'GNU.*LICENSE|Yoyodyne' /usr/share/common-licenses/GPL GNU GENERAL PUBLIC LICENSE GNU GENERAL PUBLIC LICENSE Yoyodyne, Inc., hereby disclaims all copyright interest in the program 4.4.2. 置換表示法 ----------------- 在置換表示法中,底下的字元有特別的意義: * `&' * 顯示符合正規表示法的字串。(`emacs'下請用 `\&') * `\' * 顯示第 n 個符合正規表示法的字串。 如要使用 Perl 置換字串,請改用 `$' 代替`\'和`&'。因為後兩各在 Perl 中是無意義的。 舉例說明: $ echo zzz1abc2efg3hij4 | \ sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/=&=/' zzz=1abc2efg3hij4= $ echo zzz1abc2efg3hij4 | \ sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/\2===\1/' zzzefg3hij4===1abc $ echo zzz1abc2efg3hij4 | \ perl -pe 's/(1[a-z]*)[0-9]*(.*)$/$2===$1/' zzzefg3hij4===1abc $ echo zzz1abc2efg3hij4 | \ perl -pe 's/(1[a-z]*)[0-9]*(.*)$/=&=/' zzz=&= 請特別注意各處理工具在置換時所使用的_分隔_符號,以及軟體如何用正規表示法比對這些文字的方式。 在編輯器中使用這些表示法也可以用來移動游標和置換文字。 請閱讀以上這些指令相關的說明文件。 4.5. Unix-like 檔案系統 ----------------------- 在 GNU/Linux 和其他 Unix-like 的系統上,_檔案_是有組織地放置在_目錄_下。 [1] 全部的_檔案_和_目錄_被整理放在一個階乘和樹狀的`根目錄'(/)。 這些檔案和目錄可以放在不同的硬體裝置上。mount(8) 指令能掛載硬體裝置並加入到這巨大的檔案樹系統上。反過來說,umount(8)則可以卸載這些裝置。 [1] 在某些系統上,_目錄_(diretory) 也被稱為 _資料夾_(folder)。 4.5.1. Unix 檔案基礎 -------------------- 以下是一些基礎觀念: * 檔案是大小寫相異。也就是說 `MYFILE' 和 `MyFile'是_不同_的檔案 * 根目錄以 `/' 表示。可別把 "root" 跟 root 帳號搞混了喔。參閱 第 4.1.1 節, `用 root 登入 shell 提示符號'。 * 每個目錄皆可用字母或符號來命名,但就是不能用 `/'。 [1] 根目錄是一個例外,它的檔名:`/'(叫做 "斜線" 或 "根目錄")且不能更名。 * 每個檔案或目錄皆設計成 _fully-qualified filename_, _absolute filename_或_path_,必須有順序地輸入路徑才能切換到最後的目錄。以上三者是同等的意思。全部的絕對路徑以 `/' 開頭且每個檔案或目錄的路徑都包含 `/' 符號。第一個 `/'是目錄的名稱,其餘的皆為分隔符號以便區分檔名的每個部份。 以上的說明容易造成混淆。請看一下底下的範例: /usr/share/keytables/us.map.gz 這是一個完整的檔案名稱,有些人也稱作 _path_。但大部分都只用 `us.map.gz' 來當作檔名。 [2] * root 目錄有幾個分支,例如 `/etc/' and `/usr/'。這些子目錄底下有更多的子目錄,例如 `/etc/init.d/' 和 `/usr/local/'。總括來說,這就叫做 _目錄樹_(directory tree)。 您可以想像一個絕對路徑是從該樹的根(`/')延伸到最後的分支(檔案)。您也曾聽過別人稱為_家族_樹,所以每個子目錄都有其_父母或祖先_,而路徑就是檔案完整的起源。 至於相對路徑並不是以 root(/) 目錄開頭。您必須牢記 `../' 代表上一層的目錄。 * 至於硬體裝置是沒有任何目錄對應的。這跟 CP/M, DOS, 和 Windows 中的所有檔案是以硬體裝置(例如,`C:\')開頭的檔名不同。請參閱第 4.5.2 節, `Debian 的檔案系統'。 有興趣的話可以參閱Filesystem Hierarchy Standard (file:///usr/share/doc/debian-policy/fhs/fhs.txt.gz),該文件詳細說明了階層式檔案系統的細節。您要記住的是底下這些目錄的用途: * `/' * `/' 代表 root 目錄。 * `/etc/' * 所有的系統設定檔案皆放在該目錄下。 * `/var/log/' * 所有的系統日誌檔皆放在該目錄下。 * `/home/' * 該目錄包含了非特權帳號的所有家目錄。 [1] 您_可以_用任意的字母或符號來命名檔案,但實際上這不是好的命名方式。最好能避免使用一些特殊意義的字元,比如 spaces, tabs, newlines 和其他特殊意義的字元:`{ } ( ) [ ] ' ` " \ / > < | ; ! # & ^ * % @ $'。 如果您想要分隔檔名中的字串,逗號(,),連字符號(-)和底線(_)是比較推薦的。您也可以用大寫,像是這樣:`LikeThis'。 [2] 關於 _path_ 也有不同的用法。參閱 第 4.3.6 節, `指令收尋路徑'。透過上述的解釋應該就可了解。 4.5.2. Debian 的檔案系統 ------------------------ 同於 Unix,Debian 系統提供了一個檔案系統,能夠統一化所有硬碟,儲存媒體,主控台或透過串列埠遠端存取硬體的動作。 Debian 系統中每個檔案,目錄,named pipe 或硬體裝置都有一個_inode_ 的資料結構,記載該檔案的相關屬性,例如:使用者所擁有 (擁有者),屬於那一個群組,最後存取的時間等。參閱 /usr/include/linux/fs.h 了解 Debian GNU/Linux 系統中的 `inode'結構的意義。 將硬體統一化成檔案的表示法是非常有用的,這允許我們可以使用相同的方法來存取完全不同的硬體。 全部的檔案可以存放在一個硬碟,或者 20 個硬碟,有些硬碟甚至是分散在網路上不同的電腦。您無法想像在查詢檔案或目錄時,所有的指令都能正常運作且不用理會真正的檔案是放在哪一個實體裝置上。 4.5.3. 檔案和目錄的存取權限 --------------------------- 檔案和目錄的存取權限對下面三種使用者分別定義: * 檔案擁有者 _user_ (u) , * 檔案所屬群組的使用者 _group_ (g) 和 * 所有使用者 _other_ (o) 。 對檔案來說,每個權限分別對應到一些可做的動作: * 讀取_read_ (r):查看檔案的內容 * 寫入_write_ (w):對檔案作修改 * 執行_execute_ (x):把檔案當作指令來執行 對目錄來說,每個權限分別對應到一些可做的動作: * 讀取_read_ (r):列出目錄的內容 * 寫入_write_ (w):在目錄中加入或刪除檔案 * 執行_execute_ (x):存取目錄中的檔案 在這裡, 目錄的_執行_權限不只代表允許讀取目錄內的檔案,也代表允許看到它們的屬性,像是檔案大小和更動時間等。 使用 `ls' 來顯示檔案和目錄的權限資訊 (和更多其他的資訊). 請參閱 ls(1) 。當使用 `ls' 的 `-l' 選項,則會依下列順序來顯示相關資訊: * _檔案型態_ (第一字元) * `-': 一般檔案 * `d': 目錄 * `l': 符號連結 * `c': 字元狀置節點 * `b': 區塊狀置節點 * `p': 命名的管線 * `s': 通訊端 * 檔案的存取_權限_ (之後九個字元,依序是擁有者,群組,其他,各三個字元) * 檔案的_硬連結個數_ * 檔案_擁有者_名稱 * 檔案所屬_群組_名稱 * 檔案_大小_ (以 bytes 為單位) * 檔案的_目期和時間_ (mtime) * 檔案的_名稱_。 在 root 帳號下可使用 `chown' 改變檔案的擁有者。要改變檔案的所屬群組,可以用檔案擁有者或 root 的身份來執行 `chgrp'。要改變目錄的存取權限,可以用檔案擁有者或 root 的身份來執行 `chmod'。控制`foo'檔案的語法是: # chown foo # chgrp foo # chmod [ugoa][+-=][rwx][,...] foo 請參閱 chown(1), chgrp(1) 和 chmod(1) 以取得更多資訊。 舉例來說,如果要改變目錄的擁有者為 以及群組為 ,請用 root 帳號執行以下指令: # cd /some/location/ # chown -R : . # chmod -R ug+rwX,o=rX . 有 3 個更特殊的權限位元: * _set user ID_ (s 或 S 取代擁有者的 x), * _set group ID_ (s 或 S 取代群組的 x) 和 * _sticky bit_ (t 或 T 取代其他使用者的 x) 。 在這裡,如果設定這些特殊權限設定後蓋住了原本顯示的執行權限的話,則 `ls -l' 的輸出就會用大寫來表示。 在可執行檔上設定 _set user ID_ 的話,會以這個檔案擁有者的身份 (如 _root_) 來執行這個可執行檔。同樣地,在可執行檔上設定 _set group ID_ 的話,會以這個檔案的群組身份 (如 _root_) 來執行這個可執行檔。因為這些設定會導致安全性上的問題,要打開它們的話要格外小心。 在目錄上設定 _set group ID_ 的話,會使用類似 BSD 的檔案建立規則,也就是在此目錄中建立的檔案都會屬於此目錄的_群組_。 在目錄上設定e _sticky bit_ 可以防止非檔案擁有者來刪除此目錄中的檔案。在一些大家可以寫入的目錄,如 `/tmp' 或是在允許群組寫入的目錄下,為了要保持檔案內容的安全,不只要關上檔案的_寫入_權限,還要在目錄上設定 _sticky bit_ 。不然的話,任何擁有目錄寫入權限的人都可以刪除檔案,並且建立一個新的同名檔案。 這裡有些關於檔案權限的有趣例子。 $ ls -l /etc/passwd /etc/shadow /dev/ppp /usr/sbin/pppd crw-rw---- 1 root dip 108, 0 Jan 18 13:32 /dev/ppp -rw-r--r-- 1 root root 1051 Jan 26 08:29 /etc/passwd -rw-r----- 1 root shadow 746 Jan 26 08:29 /etc/shadow -rwsr-xr-- 1 root dip 234504 Nov 24 03:58 /usr/sbin/pppd $ ls -ld /tmp /var/tmp /usr/local /var/mail /usr/src drwxrwxrwt 4 root root 4096 Feb 9 16:35 /tmp drwxrwsr-x 10 root staff 4096 Jan 18 13:31 /usr/local drwxrwsr-x 3 root src 4096 Jan 19 08:36 /usr/src drwxrwsr-x 2 root mail 4096 Feb 2 22:19 /var/mail drwxrwxrwt 3 root root 4096 Jan 25 02:48 /var/tmp 另外的辦法是使用數字並搭配 chmod(1) 來設定檔案權限。數字模式使用 3 到 4 數字寬的八進制數字。每個數字皆有其代表意義: * 第一個選擇性數字:_set user ID_ (=4), _set group ID_ (=2) 和 _sticky bit_ (=1) 的總合。 * 第二個數字:針對 _user_ 的 _read_ (=4), _write_ (=2) 和 _execute_ (=1) 權限的總合。 * 第三個數字:同上,但針對於 _group_。 * 第四個數字:同上,但針對 _other_。 這聽起來很複雜,但其實是相當簡單的。如果您觀察`ls -l'的結果就能發現前面幾行(2-10)是代表檔案權限(請用二進制,"-"表示 "0","rwx"表示"1")。這些數字如果用八進制來代表檔案權限的話,相信您一定能夠了解。 [1] 舉個例子,比如: $ touch $ chmod u=rw,go=r $ chmod 644 $ ls -l -rw-r--r-- 1 penguin penguin 0 Nov 3 23:30 -rw-r--r-- 1 penguin penguin 0 Nov 3 23:30 預設的檔案權限遮罩可使用 shell 內建的 `umask' 來設定。參閱builtins(7)。 [1] 當然,這各方法只適用於 3 個數字寬的表示法。 4.5.4. 時間戳記 --------------- 在 GNU/Linux 檔案中,有三個時間戳記: * _mtime_:修改時間 (`ls -l') , * _ctime_:狀態改變時間 (`ls -lc') 和 * _atime_:最後存取時間 (`ls -lu') 。 注意, _ctime_ 並不是檔案建立時間。 * 覆寫檔案會改變檔案的 _mtime_ , _ctime_ 和 _atime_ 全部的時間戳記。 * 改變檔案權限或擁有者的話,會改變檔案的 _ctime_ 和 _atime_ 時間戳記。 * 讀取檔案會改變檔案的 _atime_ 時間戳記。 要注意的是,在 GNU/Linux 系統中,即使只是簡單的讀取檔案,通常也會為了要更新 _inode_ 中的 _atime_ 而導致寫入的動作。如果以 `noatime' 選項來掛上檔案系統的話,就可以略過這個動作而使讀取的動作加快。請參閱 mount(8) 。 使用 touch(1) 中的指令來改變檔案的時間戳記。 4.5.5. 連結 ----------- 有兩種方法可以把一個叫 的檔案關連到另一個檔名 。 * _硬式連結 (hard link)_ 是現存檔案的一個別名 (`ln ') , * _符號連結 (symbolic link)_ ,或是 "symlink" ,是一個特殊的檔案,它指向另一個檔案的名稱 (`ln -s ') 。 下面的例子顯示了在使用 `rm' 指令後,連結數的改變和一些微妙的差異。 $ echo "Original Content" > $ ls -l -rw-r--r-- 1 osamu osamu 4 Feb 9 22:26 $ ln # 硬式連結 $ ln -s # 符號連結 $ ls -l -rw-r--r-- 2 osamu osamu 4 Feb 9 22:26 lrwxrwxrwx 1 osamu osamu 3 Feb 9 22:28 -> -rw-r--r-- 2 osamu osamu 4 Feb 9 22:26 $ rm $ echo "New Content" > $ cat Original Content $ cat New Content 就像上面的例子所顯示的,符號連結的一般檔案存取權限為 "rwxrwxrwx" ,而實際的存取權限均由它們所指向的檔案來決定。 `.' 目錄是連結到其所出現的目錄,所以任何新目錄的連結數都是由 2 起跳的。而 `..' 目錄是連結到其所上層目錄,所以目錄的連結數會隨著子目錄數目而增加。 4.5.6. Named pipes (FIFOs) -------------------------- named pipe 是類似管線的檔案。您可以輸入資料到這個檔案,然後他會輸出到別的地方。因此他也就作 FIFO(First-In-First-Out):第一個送入管線的資料也是第一個送出管線的資料。 如果寫入 named pipe 時,寫入的程序並不會中斷直到該管線讀入為止。如果讀取 named pipe,讀取的程序會一直等待直到資料讀取完畢才停止。管線的大小永遠是零,因為它並不儲存資料,它主要是連結兩個程序,就像 shell 的 `|'。但是,自從管線被命名之後,兩個程序不需要在同一行執行或同一個使用者執行。 試著執行以下的例子: $ cd; mkfifo mypipe $ echo "hello" >mypipe & # put into background [1] <5952> $ ls -l mypipe prw-r--r-- 1 penguin penguin 0 2003-11-06 23:18 mypipe $ cat mypipe hello [1]+ Done echo hello >mypipe $ ls mypipe prw-r--r-- 1 penguin penguin 0 2003-11-06 23:20 mypipe $ rm mypipe 4.5.7. Sockets -------------- socket 有點類似 named pipe (FIFO) 且允許程序與程序之間可以交換資料。針對 socket 來說,這些程序不需要在同一個時間執行或者同一個父程序產生的子程序。這是 inter process communication 的 ENDPOINT。網路上不同的主機透過 socket 也能夠互換資料。 4.5.8. Device files ------------------- 任何的硬體或虛擬裝置,例如硬碟,顯示卡,螢幕或鍵盤等,皆視為裝置檔案。`/dev/console',主控台是最常見的虛擬裝置。 裝置有兩種型別: * _character device_ * 一次存取一個字元。就是說存取該裝置最小的資料單位元是字元(byte)。 * _block 裝置_ * 一次存取較大單位的裝置稱為 block。硬碟就是一個 block 裝置。 您可以讀寫裝置檔案,即使是這些檔案可能採用二進制而讓人難以理解。直接寫入資料到這些檔案有時候是測試硬體是否已經連線的好方法。例如,您可以列印文字檔到印表機裝置:`/dev/lp0'或送指令到連接數據機的串列埠上:`/dev/ttyS0'。但請小心操作,也許會造成重大的損壞。所以要特別小心。 4.5.8.1. `/dev/null' 類別 ------------------------- `/dev/null' 是一個特別的裝置檔案,它會捨棄所有寫入的資料。如果您不需要某些資料,直接丟到 `/dev/null'。它基本上就是個黑洞。如果您讀取`/dev/null',您會馬上得到 end-of-file (EOF) 字元。 `/dev/zer