Debian 参考手册 --------------- Osamu Aoki Translator: Hao "Lyoo" Liu 节 A.1, `作者' CVS, 星期一 一月 3 16:10:19 UTC 2005 ------------------------------------------------------------------------------- 摘要 ---- Debian 参考手册 (http://qref.sourceforge.net/)旨在为_运行Debian的用户_提供全面的指导。书中提供了大量_shell-command_实例,它们涵盖系统管理的方方面面,包括的主题有:Debian的基本概念、系统安装提示、Debian软件包管理、Debian中的Linux内核、系统微调、建立网关、文本编辑器、CVS、程序设计、面向_非开发者_的GnuPG等,每个主题都包括基础指南、实用技巧和其它相关信息。 版权声明 -------- Copyright (C) 2001--2005 by Osamu Aoki . Copyright (Chapter 2) (C) 1996--2001 by Software in the Public Interest. 本文档版权适用于GNU General Public License version 2 或更高版本的相关条款。 (http://www.gnu.org/copyleft/gpl.html) 在遵守并包含本文档版权声明的前提下,制作和发布本文档的完整拷贝是允许的。并且,所有这些拷贝均受到本许可声明的保护。 在遵守上述完整拷贝版本有关版权声明的前提下,拷贝和发布基于本文档完整拷贝的修改版本是允许的,并且,发布所有通过修改本文档而得到的工作成果,须使用与本文档的许可声明一致的许可声明。 在遵守上述修改版本版权声明的前提下,拷贝和发布本文档其它语言的翻译版本是允许的,如果本许可声明有经自由软件基金会(Free Software Foundation)核准的当地化译本,则遵循当地化译本。 ------------------------------------------------------------------------------- 目录 ---- 1. 序言 1.1. 官方文档 1.2. 文档约定 1.3. 脚本样例 1.4. 基本设置 1.5. Debian发行版(distributions)基本概念 2. Debian基础 2.1. Debian文件 2.1.1. 目录结构 2.1.2. Debian发行版 2.1.3. `stable'发行版 2.1.4. `testing'发行版 2.1.5. `unstable'发行版 2.1.6. `frozen'发行版 2.1.7. Debian发布版代号 2.1.8. 已用过的发布版代号 2.1.9. 发布版代号来源 2.1.10. `pool'目录 2.1.11. `sid'诞生记 2.1.12. 上载到`incoming'中的软件包 2.1.13. 找回旧软件包 2.1.14. 发布源目录结构 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维护脚本 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. 系统升级方法 2.3.2. 软件包管理工具概述 2.3.3. `dpkg' 2.3.4. APT 2.3.5. `dselect' 2.3.6. 不停机系统升级 2.3.7. 下载和缓存`.deb'文件 2.3.8. 升级记录 2.4. Debian系统引导进程 2.4.1. `init'程序 2.4.2. 运行级别 2.4.3. 自定义系统引导进程 2.5. 多样性支持 2.6. 国际化 2.7. Debian和系统内核 2.7.1. 编译非Debian源码包内核代码 2.7.2. 自定义内核创建工具 2.7.3. 多系统引导器 2.7.4. 制做引导软盘 2.7.5. 模块加载规定 2.7.6. 卸载旧内核 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. 触摸屏(touch pad) 3.4. NFS设置 3.5. Samba设置 3.6. 打印机设置 3.6.1. `lpr'/`lpd' 3.6.2. CUPS(TM) 3.7. 其它主机安装提示 3.7.1. 初始化安装完成后再装些什么 3.7.2. 模块 3.7.3. CD-RW基本步骤 3.7.4. 多内存和关机自动断电 3.7.5. 无法访问某此站点的怪问题 3.7.6. PPP拔号设置 3.7.7. `/etc'中的其它配置文件 4. Debian指南 4.1. 信息资源 4.2. Linux控制台 4.2.1. 登录 4.2.2. 添加用户 4.2.3. 如何关机 4.2.4. 命令行编辑 4.2.5. 执行命令 4.2.6. 需要牢记的基本命令 4.2.7. X Window系统 4.2.8. 重要键盘命令 4.3. Midnight Commander (MC) 4.3.1. 安装MC 4.3.2. 启动MC 4.3.3. 文件管理器 4.3.4. 命令行技巧 4.3.5. 编辑器 4.3.6. 阅读器 4.3.7. 自动启动特性 4.3.8. FTP虚拟文件系统 4.4. GNU/Linux文件系统基础知识 4.4.1. 文件和目录的访问权限 4.4.2. 时间戳 4.4.3. 链接 4.5. 进一步学习 5. 发行版升级 5.1. 将APT升级到Woody版本 5.2. 迁移准备工作(从“stable”到“testing”) 5.3. 升级Debian系统 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. 使用`tasksel'或`aptitude'进行_task_安装 6.2.2. 设置APT系统 6.2.3. `dselect' 6.2.4. `aptitude' 6.2.5. `apt-cache'和`apt-get'命令 6.2.6. 跟踪某Debian发行版 6.2.7. 将所有软件包降级到`stable' 6.2.8. `/etc/apt/preferences'概述 6.3. Debian生存工具 6.3.1. 检测程序错误寻求帮助 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. 使用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. 本地软件包文件 6.4.12. 转化或安装外来二进制软件包 6.4.13. 校验已安装软件包 6.4.14. 优化`sources.list' 6.5. 其它Debian特性 6.5.1. `dpkg-divert'命令 6.5.2. `equivs'软件包 6.5.3. 自选命令 6.5.4. System-V `init'文件和运行级别 6.5.5. 停止daemon服务 7. Debian下的Linux内核 7.1. 内核编译 7.1.1. Debian标准方式 7.1.2. 经典方式 7.1.3. 内核头文件 7.2. 模块化的2.4内核 7.2.1. PCMCIA 7.2.2. SCSI 7.2.3. 网络功能 7.2.4. EXT3文件系统(> 2.4.17) 7.2.5. 2.4版内核对Realtek RTL-8139的支持 7.2.6. 并行端口支持 7.3. 通过proc文件系统调整内核 7.3.1. 打开了太多文件 7.3.2. 磁盘缓存清除时间(Disk flush intervals) 7.3.3. 迟缓的小内存旧机器 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. 如何禁用屏幕保护程序 8.6.6. 搜索系统管理数据库 8.6.7. 禁用声音(响铃) 8.6.8. 控制台上的错误信息 8.6.9. 正确设置控制台类型 8.6.10. 恢复控制台的健壮性 8.6.11. 将DOS下的文本文件转换为Unix类型 8.6.12. 正规表达式的置换 8.6.13. 使用脚本来编辑文件 8.6.14. 提取源文件修改部分合并到更新包 8.6.15. 分割大文件 8.6.16. 从文本格式的表格中抽取数据 8.6.17. 精巧的管道命令辅助脚本 8.6.18. 短小的Perl脚本 8.6.19. 从网页上获取文本或邮件列表文档 8.6.20. 打印网页 8.6.21. 打印帮助页面 8.6.22. 合并两个Postscript或PDF文件 8.6.23. 命令耗时 8.6.24. `nice'命令 8.6.25. 日程安排(`cron',`at') 8.6.26. 用`screen'来定制控制台 8.6.27. 网络测试基础 8.6.28. 从本地缓冲池中清空(flush)邮件 8.6.29. 删除本地缓冲池中的冻结邮件 8.6.30. 再分发mbox中的信件 8.6.31. 清空文件内容 8.6.32. 空文件 8.6.33. `chroot' 8.6.34. 怎样检查硬链接 8.6.35. `mount'硬盘上的镜像文件 8.6.36. Samba 8.6.37. 外来文件系统的操作工具 9. Debian系统微调 9.1. 系统初始化提示 9.1.1. 自定义init脚本 9.1.2. 自定义系统日志 9.1.3. 硬件存取优化 9.2. 访问权限控制 9.2.1. 通过PAM和login实现访问权限管理 9.2.2. “为什么GNU `su'命令不支持`wheel' group” 9.2.3. 各种用户组的含义 9.2.4. `sudo' --一个安全的工作环境 9.2.5. daemon程序的访问权限控制 9.2.6. 轻便目录访问控制协议(LDAP) 9.3. 刻录机 9.3.1. 概述 9.3.2. 方法一:modules + `lilo' 9.3.3. 方法二:重编译内核 9.3.4. 配置步骤 9.3.5. 光盘镜像文件(可引导光盘) 9.3.6. 刻录光盘(R,R/W) 9.3.7. 制作光盘镜像文件 9.3.8. Debian安装盘镜像 9.3.9. 将系统备份到CD-R 9.3.10. 将音乐CD刻录到CD-R 9.4. X程序 9.4.1. X系统软件包 9.4.2. X服务器的硬件侦测包 9.4.3. X服务器 9.4.4. X客户端 9.4.5. X会话 9.4.6. X的TCP/IP连接 9.4.7. X远程联接:`xhost' 9.4.8. X远程联接:`ssh' 9.4.9. `xterm' 9.4.10. X资源数据库 9.4.11. X下获取root权限 9.4.12. X下的TrueType字体 9.4.13. 网页浏览器(图形化) 9.5. SSH 9.5.1. 基础 9.5.2. 发送端口--SMTP/POP3微调 9.5.3. 用更少的密码建立连接 9.5.4. 其它平台的SSH客户端 9.5.5. SSH代理 9.5.6. 问题解决 9.6. 邮件程序 9.6.1. 邮件传输代理(Mail transport agent) 9.6.2. 邮件工具(Fetchmail) 9.6.3. 邮件工具(Procmail) 9.6.4. 邮件用户代理(Mutt) 9.7. 本地化(localization)及国家语言支持 9.7.1. 定制基础 9.7.2. Locales 9.7.3. 激活地区支持能力 9.7.4. 激活特定locale 9.7.5. ISO 8601日期格式 9.7.6. US(ISO-8859-1)例子 9.7.7. 带euro符号的France(ISO-8859-15)的例子 9.7.8. 双语系统的例子(日本语EUCT和ISO-8859-1) 9.7.9. X下UTF-8的例子 9.7.10. FB控制台下UTF-8的例子 9.7.11. 超越locale 10. 使用Debian系统架设网关 10.1. 网络配置 10.1.1. 网关的主机设置 10.1.2. 网络设置检查 10.2. Netfilter设置 10.2.1. netfilter基础 10.2.2. 过滤表(Netfilter table) 10.2.3. 过滤目标(Netfilter target) 10.2.4. 网络过滤器命令 10.2.5. IP伪装(IP-masquerade) 10.2.6. 重定向SMTP联接(2.4版内核) 10.3. 管理多重网络联接 11. 编辑器 11.1. 流行的编辑器 11.2. 应急的编辑器 11.3. Emacs和Vim 11.3.1. Vim提示 11.3.2. Emacs提示 11.3.3. 打开编辑器 11.3.4. 编辑器命令总汇(Emacs,Vim) 11.3.5. Vim设置 11.3.6. Ctags 11.3.7. 将高亮显示的屏显内容转化为HTML文件 11.3.8. 用`vim'分割屏显 12. 系统版本控制 12.1. CVS 12.1.1. 安装CVS服务器 12.1.2. CVS会话例子 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重定向 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. 准备文档 13.8.1. `roff'排版 13.8.2. SGML 13.9. 打包 13.9.1. 单个二进制文件打包 13.9.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 系统的基本操作技能。 我决定_不_在本书中解释所有的细节,因为你可以在 _manual 页_,_info 页_,或 _HOWTO 文档_中获得这些信息。我希望能给读者提供实用的信息,而非全面的解释。因此我会给在正文中出_实际的命令序列_,或是在 http://www.debian.org/doc/manuals/debian-reference/examples/ 给出_脚本示例_作为参考。在按照这些示例下达命令之前,你必须要先理解其内容的含义。实际的命令序列可能会依你的系统的具体情况而有细微的差别。 书中的很多信息实际上是对在节 15.1, `参考资料'中列出的众多权威参考文献的引用和提示。其部分原因是由于本书最初是作为一本“_快速参考手册_”来写的。 _保持文字简短紧凑_(keep it short and simple, KISS)是我的指导思想。 如果你是在寻找紧急情况下系统维护方面的帮助,请直接阅读节 6.3, `Debian生存工具'。 1.1. 官方文档 ------------- 本书的最新官方版本存于 Debian 包含在名为`debian-reference-zh-cn'的软件包中,你也可在http://www.debian.org/doc/manuals/debian-reference/上访问到它。 本文档最新开发版本位于http://qref.sourceforge.net/Debian/。该文档项目位于http://qref.sourceforge.net/,在那可以下载本文档的纯文本格式,HTML格式、PDF格式、SGML格式和PostScript格式。 简体中文译本的读者请注意:这个译本已经相当长一段时间没有更新了。虽然大部分的内容仍然很有用,但是英文版本中有不少新内容,特别是《使用 Debian 系统架设网关》一章。因此,推荐能够阅读英文的读者把英文版作为参考。 1.2. 文档约定 ------------- 文中许多信息通过简短的Bash shell命令给出,以下是其排版格式约定: Here are the conventions used: # command in root account root用户命令 $ command in user account 普通用户命令 ... description of action 命令动作描述 更多信息参见节 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_。 * `/usr/share/doc/Debian/reference/'表示_文件_。 文中用到了下列缩写: * _LDP_: Linux Documentation Project (http://www.tldp.org/) * _DDP_: Debian Documentation Project (http://www.debian.org/doc/) 文中只提供了LDP文档的URLs,这些文档还可以以软件包的形式获得,它们安装在`/usr/share/doc/HOWTO/'。参阅节 15.1, `参考资料'。 1.3. 脚本样例 ------------- 脚本样例可以examples subdirectory (http://www.debian.org/doc/manuals/debian-reference/examples/)下找到;其中隐藏文件文件名前的“.”转化为下划线“_”,可选脚本样例给出了扩展名。 1.4. 基本设置 ------------- 如果你的系统是最小安装,请执行下面的命令安装必需的软件包和关键文档。 # apt-get install info man-db doc-base dhelp apt apt-utils auto-apt \ dpkg less mc ssh nano-tiny elvis-tiny vim sash \ kernel-package \ manpages manpages-dev doc-debian doc-linux-text \ debian-policy developers-reference maint-guide \ apt-howto harden-doc install-doc \ libpam-doc glibc-doc samba-doc exim-doc cvsbook \ gnupg-doc # apt-get install debian-reference # for Sarge, do this too :) 1.5. Debian发行版(distributions)基本概念 ------------------------------------------ Debian发行版有3种“风格”: * stable:适用于架设产品化服务器,不适用于工作站用户(workstation 缩写WS)。参阅节 2.1.3, ``stable'发行版'. * testing:适用于工作站用户。参阅节 2.1.4, ``testing'发行版'. * unstable:千万别盲目使用。参阅节 2.1.5, ``unstable'发行版'. 有关Debian的版本更新情况请阅读最新的相关邮件列表`debian-devel-announce@lists.debian.org'。 在2002年3月时,这三个发行版对应为`potato'(产品化品质),`woody'(beta-test,非常稳定即将发布),和`sid'(alpha-test)。到2002年8月,也就是`woody'刚刚发布,三个发行版对应为`woody'(产品化品质),`sarge'(beta-test,有时运行不够稳定),和`sid'(总处于alpha-test)。如果`unstable'发行版中的软件包不再出现Release Critical(RC)错误,一周后将自动升级到`testing'发行版。 参阅节 2.1, `Debian文件'。 获得运行软件的最新版本的有两种方法。 * 章 5, `发行版升级'(主要用于工作站) * 节 6.4.10, `向`stable'系统引入软件包'(主要用于服务器) 请注意,升级Debian到`testing'有一个负面影响,安全补丁更新将会非常缓慢。 请注意,如果使用混合型Debian,例如在`stable'中加入`testing'或是在`stable'中加入`unstable',会一不留神从`testing'或`unstable'中下载许多关键包,这会引起不少麻烦。 运行`testing'或`unstable'版本的Debian意味着可能会遇到严重软件错误。包含一个稳定版Debian的多启动方案可有效控制风险,另一个技巧是使用`chroot',详情参阅节 8.6.33, ``chroot''。后者可以实际在不同的终端同时运行不同版本的Debian。 在章 2, `Debian基础'中我们将讲解有关Debian发行版的一些基本概念,之后,我将向你介绍一些基本信息以帮助你与最新软件快乐相处,并从`testing'和`unstable'发布版中获益。心急的读者可以直接翻到节 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文件 --------------- 2.1.1. 目录结构 --------------- Debian软件包位于Debian镜像站点 (http://www.debian.org/mirror/)的目录树中,可通过FTP或HTTP访问它们。 下列目录存在于任何Debian镜像站点的`/debian/'目录下: `/dists/': 本目录包含“发行版”(distributions),此处是获得Debian发布版本(releases)和已发布版本(pre-releases)的软件包的正规途径。有些旧软件包及 `Contens-*.gz' `Packages.gz' 文件仍在其中。 `/pool/': 所有Debian发布版及已发布版的软件包的新的物理地址。 `/tools/': 一些DOS下的小工具,用于创建启动盘、硬盘分区、压缩/解压缩和启动Linux。 `/doc/': Debian的基本文档,如FAQ、错误报告系统使用说明等。 `/indices/': 维护人员文件和重载文件。 `/project/': 大部分为开发人员的资源,如: `project/experimental/': 本目录包含了处于开发中的软件包和工具,它们均处于alpha测试阶段。用户不应使用这些软件,因为即使是经验丰富的用户也会被搞得一团糟。 `project/orphaned/': 已不再有人维护的软件包,它们已从发行版中孤立出来。 2.1.2. Debian发行版 ------------------- 通常在`dists'目录下有三个Debian发行版。它们是“stable”发行版,“testing”发行版,和“unstable”发行版。有时还有一个“frozen”发行版。每个发行版均定义成一个符号链接指向该目录相应的代号目录。 2.1.3. `stable'发行版 --------------------- `stable'发行版软件包入口,Debian Sarge (3.1r0)被登记到`stable'目录(符号链接指向`Sarge'目录): * `stable/main/':本目录包含的软件包均是最新Debian系统发布版的正式组成部分。 这些软件包均遵循Debian Free Software Guidelines (http://www.debian.org/social_contract#guidelines)(它位于`/usr/share/doc/debian/social-contract.txt',须安装`debian-doc'),它们均可以自由使用和再发行。 * `stable/non-free/':本目录包含的软件包受到一定限制,发行者需遵循特殊版权要求。 例如,有些软件包的许可证禁止其用于商业发行的。有些虽可以再发行,但本身是共享软件而非自由软件。以任何方式再发行这些软件包时(例如写入光盘)必须认真阅读有关的许可证或与所有者协商。 * `stable/contrib/':本目录包含的软件包均遵循DFSG-free原则,本身也是_自由发布_的,但这些软件包的关联包_不具有_自由发行的属性,它们位于non-free目录。 除了上述的目录,新上载的软件包的物理存储位置为`pool'目录(节 2.1.10, ``pool'目录')。 现阶段`stable'发行版错误报告位于Stable Problems (http://ftp-master.debian.org/testing/stable_probs.html)页面。 2.1.4. `testing'发行版 ---------------------- `testing'发行版软件包入口,处于`unstable'版本的Debian Etch通过级别测试后登记到`testing'目录(符号链接指向`Etch'目录)。现在,除了上述目录,新上载的软件包的物理存储位置为`pool'目录(节 2.1.10, ``pool'目录')。在testing下同样有`main'、`contrib'和`non-free'子目录,它们的作用与`stable'中的一样。 这些软件包必须可同时运行于所有架构,并且没有关联性问题影响到其安装。比起在`unstable'中的相应版本,它们有更少的release-critical错误。我们将`testing'作为更佳发布候选版本。有关testing版本的更多信息见于http://www.debian.org/devel/testing。 `testing'发行版的最新消息发布在下列站点: * 更新理由 (http://ftp-master.debian.org/testing/update_excuses.html) * 问题测试 (http://ftp-master.debian.org/testing/testing_probs.html) * 阻碍发布的错误 (http://bugs.debian.org/release-critical/) * 基本系统错误 (http://bugs.qa.debian.org/cgi-bin/base.cgi) * 标准软件包和任务包错误 (http://bugs.qa.debian.org/cgi-bin/standard.cgi) * 其它错误记录 (http://bugs.qa.debian.org/) 2.1.5. `unstable'发行版 ----------------------- `unstable'发行版软件包入口,sid被登记到`unstable'目录(符号链接指向`sid'),上载的软件包在被移至`testing'目录前一直呆在这儿。新上载的软件包的物理存储位置为`pool'目录(节 2.1.10, ``pool'目录')。在testing下同样有`main'、`contrib'和`non-free'子目录,它们的作用与`stable'中的一样。 `unstable'发行版反映了系统的最新开发进展。欢迎广大用户使用并测试这些软件包,同时也提醒你们这些软件包还不完善。使用`unstable'发行版的好处就是你可以获得Debian项目的最新更新---不过新东西也会出新问题,你得好坏兼收:-) `unstable'发行版的最新错误报告见于Unstable Problems (http://ftp-master.debian.org/testing/unstable_probs.html)页面。 2.1.6. `frozen'发行版 --------------------- 当`testing'发行版足够成熟了,它成为frozen发行版,表示这个版本不再加入新代码,只进行除错工作。同时,`dists'目录中会建立新的testing发行版目录树,并命名新的版本代号。frozen发行版再经过几个月的测试、更新、再冻结也称之为“循环测试”。(新近的`woody'发布进程没有创建`frozen'符号链接,所以`frozen'并不算发行版,仅仅是`testing'发行版的一个开发阶段。) 我们将frozen发行版中可能延迟软件包或整个版本发布的错误都记录在案,一但错误总数低于可接受的最大值,frozen发行版就晋升成stable,新版本发布了,先前发布的版本成为过期版(obsolete)(并被移于相应的目录)。 2.1.7. Debian发布版代号 ----------------------- 存在于`dists'目录下的物理目录名,例如`Sarge'和`Etch',就是“版本代号(codenames)”。当某个Debian发行版处于开发阶段,它并没有版本号,取而代之的是版本代号。使用版本代号的目的在于简化建立Debian发行版镜像的工作(如果真实目录例如`unstable'突然改名为`stable',许多文件都没必要再次下载)。 当前,`stable'是一个指向`Sarge'的符号链接,`testing'是指向`Etch'的符号链接。也就是说`Sarge'是当前的stable发行版,`Etch'是当前的testing发行版。 `unstable'发行版是指向`sid'的永久符号链接,即unstable发行版总称为`sid'。 2.1.8. 已用过的发布版代号 ------------------------- 已使用过的发行版代号有: `buzz' for release 1.1, `rex' for release 1.2, `bo' for releases 1.3.x, `hamm' for release 2.0, `slink' for release 2.1, `potato' for release 2.2, `woody' for release 3.0,和 `sarge' for release 3.1。 2.1.9. 发布版代号来源 --------------------- 到目前为止它们均出自Pixar的电影“_Toy Story_(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'目录下相应发行版的子目录中。这种做法产生了许多问题,当镜像站点进行新版本发布时大量带宽被消耗。 现在软件包均放进一个巨大的“池子(pool)”,按照源码包名称分类存放。为了方便管理,pool目录下按属性再分类(`main'、`contrib'和`non-free'),分类下面再按源码包名称的首字母归档。这些目录包含的文件有:运行于各种系统架构的二进制软件包,生成这些二进制软件包的源码包。 你可以执行命令`apt-cache showsrc ',查看“Directory:”行获知每个软件包的存放位置。例如:`apache'软件包存放在`pool/main/a/apache/'软件包存放在`lib*'软件包数量巨大,它们以特殊的方式归档:例如,`libpaper'软件包存放在`pool/main/libp/libpaper/'。 诸如`apt'等命令访问的索引文件仍位于`dists'目录中,直到本文写作之时,旧发行版的软件包还没转到pool目录,所以你将看到路径的“Filename”域中包含有发行版名称如`potato'或`woody'。 通常,你大可不必注意这些,新版的`apt'和旧版`dpkg-ftp'(参阅节 2.3.1, `系统升级方法')会自动处理它们。想了解更多信息,参阅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文件组织只有一个主要的工作流程:假设当前`unstable'发行版中创建了某个软件开发项目,当它成为新的`stable'版之时,便是它的发布之日。由于软件包一但发布就需要移动到新的stable目录,当众多软件开发项目移动目录时大量带宽会被吞噬掉,这个流程就显得很不切实际,因而许多软件开发项目并没有按这个方法行事。 经过几年的研究摸索,文档管理员提出一个方案,将未获准发布的二进制文档存入名为`sid'的特定目录。由于这些软件尚未发布,从那时起,它们就被加入到`unstable'目录树。当它们首次发布时,将会建立一个从当前`stable'指向`sid'的链接。这个方案用户听起来的确有些晕头。 有了软件包储藏池的帮助(参阅节 2.1.10, ``pool'目录'),在`woody'发行版开发过程中,二进制软件包均按一定规范存放于pool目录,而与发行版无直接关系,当发布新版本时,就不会再出现大量带宽被消耗的问题。(不过,大量带宽还是被开发进程消耗了)。 2.1.12. 上载到`incoming'中的软件包 ---------------------------------- 上载的软件包首先存放于http://incoming.debian.org/经过检收,确定它们是由Debian开发者上载的(对于那些属于无维护者上载(Non-Maintainer Upload 缩写 NMU)的软件包则放入`DELAYED'子目录)。会有一天,它们将从`incoming'移入`unstable'。 在紧急情况下,你可能会等不及它们移入`unstable'而直接从`incoming'中下载安装。 2.1.13. 找回旧软件包 -------------------- 最新的Debian发行版存放在任何一个Debian镜像站点 (http://www.debian.org/mirror/)的`debian'目录下。旧版本的Debian如Slink存放在http://archive.debian.org/或Debian镜像站点的`debian-archive'目录下。 旧的`testing'和`unstable'软件包存放在http://snapshot.debian.net/。 2.1.14. 发布源目录结构 ---------------------- 在每个主目录树下(`dists/stable/main'、`dists/stable/contrib'、`dists/stable/non-free'、`dists/unstable/main/',等)按芯片架构又分了子目录,每个子目录中存放着在该芯片架构下编译的二进制软件包。 * `binary-all/',存放与芯片架构无关的软件包,如Perl脚本、纯文档等。 * `binary-/',存放运行于该平台的二进制软件包。 请注意,`testing'和`unstable'发行版的二进制软件包不再存放在这些目录中,它们存放在上一级`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归档目录结构的用户想获得源代码可以试试`apt-get source '命令。 有些软件包,如著名的`pine',由于许可证限制,只提供源码包。(最近,`pine-tracker'软件包提供了一个简易的安装版)安装源码包的方法可参阅节 6.4.10, `向`stable'系统引入软件包',节 13.9, `打包'教你如何手工创建一个软件包。 `contrib'和`non-free'目录中的软件包可能不提供源代码,因为它们没有正式加入Debian系统。 2.2. Debian软件包管理系统 ------------------------- 2.2.1. Debian软件包概述 ----------------------- 软件包通常包含了实现一系列相关命令或特性所必须的所有的文件。有两种类型的Debian软件包: * _Binary packages_(二进制软件包),它包含可执行文件、配置文件、man/info页面、版权声明和其它文档。这些软件包以Debian特定的格式发布(参阅节 2.2.2, `Debian软件包格式');它们通常使用`.deb'的扩展名以示区别。这种二进制软件包可使用Debian工具`dpkg'解包,详情见有关帮助页面。 * _Source packages_(源码包),包含一个`.dsc'文件它用于描述源码包(包括下列文件的名称),一个`.orig.tar.gz'文件它是未经修改的原始源代码压缩文件,以及一个`.diff.gz'文件它包含了该软件包Debian化时所做的修改。`dpkg-source'工具可用于打包/解包Debian源码包,详情可参阅有关帮助页面。 软件包管理系统安装的软件包时需要读取那些由软件包维护者精心设计的关联信息,这些关联信息记录在每个软件包的`control'文件中。例如,包含GNU C编译器(gcc)的软件包依赖于包含链接器和汇编器的`binutils'软件包。如果用户试图在没有安装`binutils'的情况下安装`gcc',软件包管理系统(dpkg)就会发送一条错误信息,告诉你需要安装`binutils',并停止安装`gcc'。(不过,倔强的用户可以对这个信息视而不见,参阅dpkg(8))。)更多信息,参阅下面的章节节 2.2.8, `软件包关联性'。 Debian软件包管理工具可用于: * 操作和管理软件包或软件包的局部内容, * 帮助那些使用有限容量载体如软盘传输的用户分割软件包, * 帮助开发者将开发文件打包成软件包, * 帮助用户从远程Debian文档站点安装软件包。 Debian archive site. 2.2.2. Debian软件包格式 ----------------------- Debian“软件包”,或称之为Debian包文件(Debian archive file),包含了可执行文件、库文件、和相关程序的文档。通常Debian文件的文件名以`.deb'结尾。 Debian二进制软件包内部格式描述见deb(5)帮助页面。由于这种内部格式会改变的(特别对于Debian的新旧发布版),所以要操作`.deb'文件请参阅dpkg-deb(8)。 即便在Woody发行版中,如果有Debian文件使用dpkg命令操作无效,还可用标准的Unix命令`ar'和`tar'来操作。 2.2.3. Debian软件包命名约定 --------------------------- Debian软件包命名遵循下列约定: _-.deb 其中代表软件包名称。确定某个特定Debian包文件(`.deb' file)的软件包名称有两种方法: * 在Debian包文件站点的软件包存放目录下查看“Packages”文件。该文件有一个段落包含了各个软件包的描述内容;其中第一个域列出了软件包正式名称。 * 使用命令`dpkg --info .deb'(其中 and 分别表示该软件包的版本号和修订版号)。屏幕上会显示该软件包解包后的软件包名称。 字段代表该软件开发者制定的版本号。由于没有统一的版本号标准,所以它们的格式会各不相同例如“19990531”和“1.3.8pre1”。 字段代表Debian修订版本号,它是由Debian开发者(或个人用户,假如他选择自己创建软件包的话)制定的。该版本号按照Debian软件包修订标准来制定;一个新的修订版通常表示对下列文件做了修改:Debian makefile(`debian/rules's),Debian管理文件(`debian/control'),安装或卸载脚本(`debian/p*'),或软件包配置文件。 2.2.4. 保存本地设置 ------------------- Debian的“conffiles”机制,可保存用户配置文件。用户的配置文件(通常位于`/etc')由Debian软件包管理系统登记到`conffiles'。当软件包升级后,软件包管理系统确保这些文件不被覆盖。 如果不需修改各种软件包配置文件就能完成系统配置,那就别去修改它们,即使它们已登记到conffiles。这样做能保证快速平滑的升级操作。 想准确了解哪些文件在升级过程中受到保护,运行: dpkg --status 看看“Conffiles”下的文件名列表。 有关Debian `conffiles'文件的详细内容,可参阅Debian Policy Manual的11.7节(参阅see 节 15.1, `参考资料')。 2.2.5. Debian维护脚本 --------------------- Debian维护脚本是一种可执行脚本,它在软件包安装之前或之后自动运行。它和一个名叫`control'的文件一起组成Debian包文件的“管理”部分。 这些文件是: preinst 在Debian包文件解包之前,运行这个脚本。许多“preinst”脚本的任务是停止作用于待升级软件包的服务,直到软件包安装或升级完成。 postinst 该脚本的任务是完成Debian包文件解包文件的配置工作。通常,“postinst”脚本等待用户输入,或提醒用户,如果他接受当前默认值,要记得软件包安装完后返回重新配置。许多“postinst”脚本负责执行有关命令为新安装或升级的软件重启服务。 prerm 该脚本负责停止与软件包关联的daemon服务。它在删除软件包关联文件之前执行。 postrm 该脚本负责修改软件包链接或文件关联,或删除由它创建的文件。(参阅节 2.2.7, `虚拟软件包')。 当前,所有的管理文件都存放在`/var/lib/dpkg/info'目录。与`foo'软件包相关的文件,名字以“foo”打头,以“preinst”、“postinst”等为扩展名。目录中的`foo.list'文件列出了`foo'软件包安装的所有文件。(注意这些文件的位置在由dpkg来确定,可能会因Debina版本而异) 2.2.6. 软件包优先级 ------------------- 每个Debian软件包均被发布者指点了一个_优先级_,作为软件包管理系统 的一个辅助参数,优先级的值有: * _Required_ 该级别软件包是保证系统正常运行必须的。 包含所有必要的系统修补工具。不要删除这些软件包,否则整个系统将受到损坏,甚至无法使用`dpkg'恢复。只安装Required级软件包的系统不可能满足所有的用途,但它可以启动起来,让系统管理员安装想要的软件。 * _Important_ 在任何类Unix系统上均安装有该级别软件包。 系统若缺少这类软件,会运行困难或不好操作。该级别软件包并_不_包括Emacs或X11或TeX或其它大型应用程序,它们只是一些实现系统底层功能的程序。 * _Standard_ 该级别软件包是任何Linux系统的标准件,它们组成一个小而精的字符模式的系统。 系统的默认安装就包括了它们。“Standard”级软件包不包括许多大型应用程序,但它包括Emacs(它比其它应用程序更底层)和Tex及LaTeX的精巧版(不支持X)。 * _Optional_ 该级别软件包包括那些你可能想安装的软件,即使对它们并不熟悉。and if you don't have specialized requirements. 它们包括X11,TeX完整发布版和许多应用程序。 * _Extra_ 该级别软件包可能与其它高级别软件包冲突,仅当你知道其用途时才会使用它们,或者有运行它们有专门要求,这些都使它们不适合定为“Optional”级。 2.2.7. 虚拟软件包 ----------------- 虚拟软件包是一个统称,用来指一组具有相近功能的软件包。举个例子,`tin'和`trn'都是新闻组阅读软件,当系统中某个程序需要调用新闻阅读器工作时就会产会一个关联关系,它们必须满足这个关联,我们也称之为它们提供了一个叫做`news-reader'的“虚拟软件包”。 又如,`exim'和`sendmail'都提供邮件传输代理的功能。也可称之为提供“邮件传输代理”虚拟包,如果安装了两者之一,那么任何与`mail-transport-agent'有关联关系的程序发出调用命令时,都会通过这个虚拟包实现调用。 Debian有个机制,如果系统中提供同种虚拟包的软件包安装了多个,系统管理员可以指定一个为首选软件。相关的命令是`update-alternatives',更详细的描述参阅节 6.5.3, `自选命令'。 2.2.8. 软件包关联性 ------------------- Debian软件包管理系统有一套软件包“依赖性”定义(用一个标志)用来描述独立运行程序A与现存系统中程序B的存在之间的关系疏密程度: * 软件包A_依赖_(depends)软件包B:要运行A必须安装B。在有些情况下,A不仅依赖B,还要求B的特定版本。版本依赖通常有最低版限制,A更依赖于B的最新版而非某个特定版本。 * 软件包A_推荐_(recommends)软件包B:软件包维护者认为所有用户都不会喜欢缺少某些功能的A,而这些功能需要B来提供。 * 软件包A_建议_(suggests)软件包B:B中某些文件与A的功能相关(通常能增强其功能)。 * 软件包A与软件包B_冲突_(conflicts):如果系统中安装了B那么A无法运行。多数情况下,冲突是由于A中包含了B中文件的改进版。“Conflicts”常和“replaces”同时出现。 * 软件包A_替换_(replaces)软件包B:B安装的文件被A中的文件移除和覆盖了。 * 软件包A_提供_(provides)软件包B:A中包含了B中的所有文件和功能。这种机制为那些受限于磁盘空间的用户提供了一个途径,只安装A中他们直正需要的部分。 上述术语使用方法的更详细的信息参阅Packaging Manual和the Policy Manual。 注意,`dselect'可以对_recommends_和_suggests_类软件包进行细操作,`apt-get'只会简单的下载安装_depends_类软件包而不管_recommends_和_suggests_类软件包。这两个程序均正式使用APT作为其后台。 2.2.9. 何为“pre-depends” -------------------------- “pre-depends”是一种特殊关联关系。对于一个普通软件包,不管系统中是否存在它的关联文件,`dpkg'都会将它解包。解包主要指`dpkg'从软件包中取出安装文件。如果系统中不存在这些软件包_依赖_的软件包,`dpkg'会拒绝完成安装(通过执行它的“configure”动作)直至安装完所需的软件包。 然而,对有些软件包,`dpkg'会拒绝解包,除非关联问题被解决。这种软件包就称为“pre-depend”于其它软件包。Debina提供这种机制是为了支持系统从`a.out'格式向ELF格式安全升级,在该过程中软件包的解包_顺序_至关重要。对于某些重大升级这种机制也很有用,例如对那些“required”级并有libc关联的软件包。 再次,更多详细信息参阅Packaging Manual。 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. 系统升级方法 ------------------- 你可以简单的执行匿名FTP或用`wget'查找想安装的Debian包文件,然后下载,用`dpkg'装上。(注意`dpkg'随时随地都能安装升级文件,甚至是正在运行的系统上)然而,有时安装修订包需要先安装其它软件包的新版本,这时安装就会停止,直到所需的软件包被安装好。 许多人觉得这种手工安装太费时,加上Debian软件包升级是那样频繁---通常,每周会上载十几个新软件包。在新版本发布前期更新量更是加倍。为了跟上更新速度,许多用户更乐意使用自动化升级工具。基于此目的出现了几种专门的软件包管理工具。 2.3.2. 软件包管理工具概述 ------------------------- Debian软件包管理系统有两个设计目标:实现对软件包文件和包中文件的操作。APT和`dselect'完成前者,`dpkg'完成后者。 2.3.3. `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.4. APT ---------- APT(the Advanced Packaging Tool)是Debian软件包管理系统的高级界面,由几个名字以“apt-”打头的程序组成。`apt-get'、`apt-cache'和`apt-cdrom'是处理软件包的命令行工具,它们也是其它用户前台程序的后端,如`dselect'和`aptitude'。 更多信息,可安装`apt'软件包后阅读apt-get(8)、apt-cache(8)、apt-cdrom(8)、apt.conf(5)、sources.list(5)、apt_preferences(5)(woody)以及`/usr/share/doc/apt/guide.html/index.html'。 另一个资源是APT HOWTO (http://www.debian.org/doc/manuals/apt-howto/),如果安装了`apt-howto'包,可在`/usr/share/doc/Debian/apt-howto/'中找到它。 `apt-get upgrade'和`apt-get dist-upgrade'只获取“Depends”类软件包,它忽略“Recommend”和“Suggests”类软件包,不想这样的话,可使用`dselect'。 2.3.5. `dselect' ---------------- 这个程序是Debian软件包管理系统中菜单驱动的用户界面。特别适用于首次安装和大面积升级。参阅节 6.2.3, ``dselect''。 更多信息,可安装`install-doc'包后阅读`/usr/share/doc/install-doc/dselect-beginner.en.html'或dselect Documentation for Beginners (http://www.debian.org/releases/woody/i386/dselect-beginner)。 2.3.6. 不停机系统升级 --------------------- Debian系统的内核(文件系统)支持替换使用中文件。 我们还提供了一个程序`start-stop-daemon'用来在系统启动时开启daemons或内核运行级别(runlevel)改变时停止daemons(例如:从multi-user级转到single-user级或关机)。当安装新软件包时如果该软件包中包含daemon安装,安装脚本会调用这个程序,停止运行中的daemons,然后在合适的时候重启它们。 注意,Debian系统不要求用户在single-user模式下进行不停机升级。 2.3.7. 下载和缓存`.deb'文件 --------------------------- 如果你手工下载包文件到硬盘(这完全没有必要,请阅读上面有关`dpkg-ftp'或APT的内容),当你完成软件包安装工作后,可以从系统中删除`.deb'文件。 如果是使用APT,这些文件会缓存在`/var/cache/apt/archives/'目录中。你可以在完成安装后删除它们(`apt-get clean')或者将它们拷贝到另一个机器的`/var/cache/apt/archives/'目录中以备以后的安装。 2.3.8. 升级记录 --------------- `dpkg'会对软件包的解包、配置、删除、完全删除进行记录,但不能(目前是这样)记录在包操作的过程中活跃终端的行为。 最简单的解决方法是在运行`dpkg'、`dselect'、`apt-get'等工具的会话中加入script(1)程序。 2.4. Debian系统引导进程 ----------------------- 2.4.1. `init'程序 ----------------- 同所有的Unix一样,Debian启动要执行init程序。`init'的配置文件(`/etc/inittab')中指定的第一个执行脚本应该是`/etc/init.d/rcS'。该脚本跟据`/etc/rcS.d/'目录中各脚本的扩展名回溯或分流子进程完成诸如检查并挂载文件系统、装载内核模块、启动网络服务、设定时钟等系统初始化工作。接着,为了兼容性考虑,它运行`/etc/rc.boot/'目录下的文件(除了那些文件名中包含“.”的文件),目录中的脚本通常是供系统管理员使用的,用于有兼容性问题的软件包。更多信息参见节 9.1, `系统初始化提示'。 2.4.2. 运行级别 --------------- 完成系统启动进程后,`init'执行默认运行级别(该运行级别由`/etc/inittab'中的`id'给出)指定的所有的启动脚本。同所有System V兼容Unix一样,Linux有7个运行级别: * 0(关闭系统), * 1(单用户模式 single-user mode), * 2(各种多用户模式 multi-user modes), * 6(重启系统)。 Debian系统运行`id=2',它表示进入多用户模式时默认运行级别为2,所以将运行`/etc/rc2.d/'中的脚本。 实际上,任意目录`/etc/rc.d/'中的脚本都是指向`/etc/init.d/'的符号链接。然而,每个`/etc/rc.d/'目录中文件的_名称_用来指定`/etc/init.d/'相应脚本的运行_方式_。特别是,在进入任何运行级别之前,所有名称以“K”打头的脚本均被运行,这些脚本的工作是中止进程。然后,所有名称以“S”打头的脚本被运行,这些脚本的工作是启动进程。名称中跟在“K”或“S”后的两位数规定了脚本运行的先后次序,数字小的脚本先运行。 采用这种工作方式是因为`/etc/init.d/'中的脚本均有一个参数规定脚本“start”、“stop”、“reload”、“restart”或“force-reload”,脚本按各自参数的赋值执行任务。这些脚本甚至可以在系统启动后用来控制多进程。 例如,使用带“reload”参数的命令 # /etc/init.d/exim4 reload 发给exim4 daemon进程一个信号,要它重读配置文件。 2.4.3. 自定义系统引导进程 ------------------------- Debian没有使用BSD风格的BSD-style `rc.local'目录来自定义系统引导进程;它提供自己的自定义机制。 假设系统要在启动时运行foo脚本,或进入指定的(System V)运行级别。那系统管理员可以这样: 1. 将`foo'脚本加入`/etc/init.d/'目录。 2. 使用合适的参数运行Debian命令`update-rc.d',这样就在(命令行指定的)`rc.d'目录和`/etc/init.d/foo'之间建立了链接,这里是0到6中的一个数字,对应于System V的各个运行级别。 3. 重启系统。 `update-rc.d'命令会在`rc.d'目录中文件与`/etc/init.d/'目录中的脚本之间目录建立链接,每个链接名会以“S”或“K”打头,接下来是一个数字,再就是脚本名。当系统进入某个运行级别时,`/etc/rc.d/'中以“K”打头的脚本执行`停止'(stop)指令,接下来以“S”打头的脚本执行`开始'(start)指令。 还可以这样来做,将脚本放在`/etc/init.d/'下然后使用`update-rc.d foo defaults 19'建立链接,让`foo'脚本在系统启动期间执行。参数`defaults'指默认运行级别,它可以是2到5中某个值。参数`19'确保`foo'在其它参数大于20的脚本之前执行。 2.5. 多样性支持 --------------- Debian提供几种途径,在不破坏系统的前提下满足系统管理员各种要求。 * `dpkg-divert',参阅节 6.5.1, ``dpkg-divert'命令'。 * `equivs',参阅节 6.5.2, ``equivs'软件包'。 * `update-alternative',参阅节 6.5.3, `自选命令'。 * `make-kpkg'可以支持多启动引导。参阅make-kpkg(1)和节 7.1.1, `Debian标准方式'。 Any files under `/usr/local/'目录下的所有文件均属于系统管理员,Debian不会改动它们。`/etc'下的大部分(或全部)文件属于`conffiles',Debian不会在升级后覆盖它们,除非系统管理员明确要求覆盖。 2.6. 国际化 ----------- Debian系统是国际化产品,不论是在控制台下还是在X下,它都提供多种语言的字符显示和输入支持。许多文档、帮助页面以及系统消息都被翻译成各种语言。在安装过程中,Debian提示用户选择安装语言(有时是当地语言变量)。 如果你安装的系统提供的语言特性支持不能满足你的需要,或者你要改变当前语言或安装别的键盘方案以适应你的语言,参阅节 9.7, `本地化(localization)及国家语言支持'。 2.7. Debian和系统内核 --------------------- See 章 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'软件包。该软件包包含了创建内核包的脚本。有了它,新建Debian内核镜像包只需在内核源码目录的一级目录运行 # make-kpkg kernel_image 在内核源码所在目录的顶层,执行下述命令可获得有关帮助 # make-kpkg --help 或阅读make-kpkg(8)帮助页面以及章 7, `Debian下的Linux内核'。 如果所需的kernel-source-(version代表内核版本号)包不存在,用户就得从Linux文件站点分别下载最新的(或需要的)内核源码。Debian的`initrd'启动脚本需要一个专门的内核路径调用`initrd';参阅http://bugs.debian.org/149236。 有关`kernel-package'包的用法详述见于`/usr/doc/kernel-package/README'。 2.7.3. 多系统引导器 ------------------- 要使用多系统引导器如`grub'或`loadlin',请将编译好的Linux内核`bzimage'拷贝到相应的地方(例如`/boot/grub'或MS-DOS分区)。 2.7.4. 制做引导软盘 ------------------- Debian的`boot-floppies'软件包可以帮你制作一张自定义启动软盘,该软件包通常位于Debian FTP包文件站点的`admin'分类。软件包中的Shell脚本按`syslinux'格式制作启动软盘。对于那些使用MS-DOS格式化的软盘,其主引导扇区的记录将被修改为直接引导Linux(或是其它在盘中`syslinux.cfg'文件里的操作系统)。该软件包中的其它脚本可制作急救盘甚至重建基本系统。 安装该软件包后,阅读`/usr/doc/boot-floppies/README'文件可获得更多信息。 2.7.5. 模块加载规定 ------------------- Debian的`modconf'软件包提供了一个shell脚本(`/usr/sbin/modconf'),它可以用来自定义内核模块配置。该脚本使用菜单界面,用户通过它给出系统中可挂载设备驱动的有关细节,它再将这些细节信息生成`/etc/modules.conf'文件(其中列出了别名aliases和其它参数,用于连接各种模块),该配置文件用来加载`/etc/modutils/'目录下和`/etc/modules'(其中列出了需要在系统启动时加载的模块)目录的相关模块。 新版的配置帮助文件可为构造自定义内核提供帮助,同样,`modconf'软件包中也有一系列帮助文件(位于`/usr/share/modconf/'目录下),告诉你如何对模块设定合适的参数。参阅节 7.2, `模块化的2.4内核'中的例子。 2.7.6. 卸载旧内核 ----------------- `kernel-image-.prerm'脚本可用来检查当前运行的内核版本,以确定是否与你打算卸载的内核版本相同。因此你可以使用如下命令删除不想要的内核镜像包: # 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(处于写作中,有时可能无法访问)。 尽管“Debian 参考手册”写于Potato发布期间,但其中的绝大部分内部均更新至Debian Sarge (3.1r0)和Debian Etch。 3.1. 常规Linux安装提示 ---------------------- 使用`testing'或`unstable'版Debian会增加遇到严重软件错误的风险,在机器上安装一个稳定版本的Debian,然后使用多重启动方案可有效控制风险。或者使用更安全的`chroot'技巧,参阅节 8.6.33, ``chroot''。后者可实现同时在不同的控制台运行多种版本的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系统中使用下列命令,可获得机器当前使用的硬件及配置的相关信息。 $ lspci -v |pager $ pager /proc/pci $ pager /proc/interrupts $ pager /proc/ioports $ pager /proc/bus/usb/devices 在安装过程中按ALT-F2进入控制台,可运行这些命令获得帮助。 对于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, joy stick) * 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柱面。---错! Debian Potato之后使用的新版`lilo'支持lba32。只要主板的BIOS版本支持lba32,`lilo'就可以冲破1024柱面的限制。 如果你使用的是旧版`lilo.conf',请确定在你的`lilo.conf'文件开头的某处加了一行命令指示系统读取“lba32”。参阅`/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 /usr/share/doc/grub-doc/html/ ... read contents # apt-get install grub # pager /usr/share/doc/grub/README.Debian ... 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(处于写作中,有时可能无法访问) 如果你是用引导软盘安装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.3, ``dselect''。即使你是个Emacs迷也不要在安装阶段使用它,nano可满足你的需要。也不要安装其它庞大的软件包如TEX(Potato曾在此阶段设置它为默认安装)。参阅节 11.2, `应急的编辑器'了解此时安装nano-tiny或elvis-tiny的原因。 * 在每个软件包安装对话框中,回答所有的配置提问均=“y”(替换当前值) * `exim':选第2项,因为我使用ISP的SMTP服务器发送邮件。 有关dselect的更多信息,参阅节 6.2.3, ``dselect''。 3.1.9. 网络所需的主机名和IP地址 ------------------------------- LAN配置的例子(C subnet: 192.168.1.0/24): Internet | +--- 外部ISP提供POP服务(使用fetchmail访问) | Access point ISP提供DHCP服务和SMTP中继服务 | : Cable modem (Dial-up) | : LAN网关外部端口: eth0 (IP由ISP的DHCP提供) 使用老式笔记本电脑(IBM Thinkpad, 486 DX2 50 MHz, 20 MB RAM) 运行Linux 2.4内核,提供ext3文件系统支持 运行"ipmasq"软件包(安装它的NAT和firewall加强包) 运行"dhcp-client"软件包配置eth0 (覆盖DNS的设定) 运行"dhcp"软件包配置eth1 运行"exim"作为smarthost (mode 2) 运行"fetchmail"设一个较长的时间值(fallback) 运行"bind" 作为高速域名服务器,在从LAN连入Internet时 作为认证域名服务器,在从LAN中连入网中某个域时 运行"ssh"使用端口22和8080(从任何地点连接) 运行"squid"作为缓存服务器连接Debian包文档服务器(APT需要连接它) LAN网关内部端口: eth1 (IP = 192.168.1.1, 固定) | +--- LAN Switch (10 base T) ---+ | | LAN中一些固定IP客户端 LAN中一些DHCP客户端 (IP = 192.168.1.2-127, 固定) (IP = 192.168.1.128-200, 动态) 参阅章 10, `使用Debian系统架设网关'了解更多LAN网关服务器设置方面的信息。 3.1.10. 用户帐号 ---------------- 为了让机器访问起来有一致的感觉,我的系统中开头几个帐号通常是不变的。 我首先创建的用户帐号名是“admin”(uid=100)。我通过该帐号转发所有的root email。该帐号加入到`adm'用户组(参阅节 9.2.2, `“为什么GNU `su'命令不支持`wheel' group”'),这个用户组为成员提供大量root特权的命令,通过`su'或`sudo'命令就能使用PAM。详情参阅节 4.2.2, `添加用户'。 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网关服务器的硬盘使用情况如下(由`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 file system information. # # file system 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 partition 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'项。如果有死连接,挂载进程可能会死掉,可以使用Control-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 file systems 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的简单指导。 4 MB: Linux内核运行的最低配置。 16 MB: 控制台系统运行的最低配置。 32 MB: 简单X系统运行的最低配置。 64 MB: GNOME/KDE系统运行最低配置。 128 MB: 流畅运行GNOME/KDE。 256+MB: 如果你银子充裕干嘛不呢?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启动脚本: /etc/bash.bashrc 换成你的喜好 /etc/profile 保持发布版设定 ( \w -> \W) /etc/skel/.bashrc 换成你的喜好 /etc/skel/.profile 换成你的喜好 /etc/skel/.bash_profile 换成你的喜好 ~/.bashrc 换成你的喜好,会改变所有用户的设置 ~/.profile 换成你的喜好,会改变所有用户的设置 ~/.bash_profile 换成你的喜好,会改变所有用户的设置 可以参考我提供的脚本样例 (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'的符号链接`/dev/mouse',有助于简化配置操作。(例如,如果你决定不再使用gpm daemon,只需在删掉`gpm' daemon后,将符号链接`/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/X86Config'而不是`/etc/X11/X86Config-4',下面的示例中使用的是X4: 3.3.1.1. 使用ms3协议方式 ------------------------ /etc/gpm.conf | /etc/X11/X86Config-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的设置将保持不变。参阅我的样例脚本 (http://www.debian.org/doc/manuals/debian-reference/examples/)。 3.3.1.2. 使用raw协议方式 ------------------------ /etc/gpm.conf | /etc/X11/X86Config-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/X86Config-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鼠标 -------------- 请确定你完成了: * 在内核中打开了“Input Core Support”和“Input Core Support/Mouse Support”或作为模块加载。 * 在内核中打开了“Support for USB”、“Preliminary USB device filesystem”、“UHCI or OHCI”和“USB HID Support”或作为模块加载。 * 安装了`hotplug'软件包并在`/etc/default/hotplug.usb'中激活了`X11_USBMICE_HACK=true'。 如果你没使用devfs,则需按下面的方法创建一个设备节点`/dev/input/mice': # cd /dev # mkdir input # mknod input/mice c 13 63 对于典型的滚轴_USB_鼠标,配置如下: /etc/gpm.conf | /etc/X11/X86Config-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 更多信息可浏览Linux USB Project (http://www.linux-usb.org/)。 3.3.3. 触摸屏(touch pad) -------------------------- 尽管触摸屏在笔记本电脑上默认是模拟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'。 # echo "/ *.domainname-for-lan-hosts(rw,no_root_squash,nohide)" \ >> /etc/exports 详情见我的样例脚本 (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 详情参阅我的脚本样例 (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.11, `X下获取root权限'。`printtool'可创建打印缓冲池,它使用`gs'模拟PostScript打印机,所以要使用PostScript打印驱动来访问它们。在Windows端,“Apple LaserWriter”是标准件。 3.6.2. CUPS(TM) --------------- 首先安装Common UNIX Printing System(或CUPS(TM)): # apt-get install cupsys cupsys-bsd cupsys-client cupsys-driver-gimpprint # apt-get install foomatic-db-engine foomatic-db-hpijs # apt-get install foomatic-filters-ppds foomatic-gui 接着用浏览器来配置系统: $ http://localhost:631 举个例子,将你的打印机联接到可访问打印机列表中: * 在主页面上点击“Printers”,然后点“Add Printer”, * 输入用户名和密码,进入“root”, * 按提示添加打印机, * 返回“Printers”页面,点“Configure Printer”, * 设定打印纸尺寸、分辨率和其它参数。 更多信息可浏览http://localhost:631/documentation.html和http://www.cups.org/cups-help.html。 对于2.4内核,参见节 7.2.6, `并行端口支持'。 3.7. 其它主机安装提示 --------------------- 3.7.1. 初始化安装完成后再装些什么 --------------------------------- 到现在,你已经拥有一个小巧但功能颇强的Debian。接下来,可以安装那些较大的软件包了。 * 运行`tasksel'。参阅节 6.2.1, `使用`tasksel'或`aptitude'进行_task_安装'。 可按需选择: * End-user --- X window system * Development --- C and C++ * Development --- Python * Development --- Tcl/Tk * Miscellaneous --- TeX/LaTeX environment * For others ---我把t`tasksel'作为安装指导,查看了解有关任务的安装列表 然后用`dselect'来选择安装。 * 运行`dselect'。 在此,你最想做的事就是选择钟爱的编辑器和其它需要的程序。你可以同时安装Emacs的多个变种。参阅节 6.2.3, ``dselect''和节 11.1, `流行的编辑器'。 你也可以将某些默认的软件包替换成特定版本。 * lynx-ssh (而不是lynx) * ... * ... 我通常会编辑`/etc/inittab'简化关机步骤。 ... # What to do when CTRL-ALT-DEL is pressed. ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -h now ... 3.7.2. 模块 ----------- 在初始安装期间可进行设备驱动模块配置。以后还可使用`modconf'进行配置,它是基于菜单界面的工具,可用来配置那些在初始安装时未曾配置的模块或完成新内核安装后的配置工作。 所有预加载(preloading)模块的名称要加入到`/etc/modules'列表。也可以使用`lsmod'和`depmod'进行手工操控。 对于2.4版内核别忘了在`/etc/modules'中加上几行来处理IP伪装(ftp等)。参阅节 7.2, `模块化的2.4内核',特别是节 7.2.3, `网络功能'。 3.7.3. CD-RW基本步骤 -------------------- 编辑下列文件: /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.7.4. 多内存和关机自动断电 --------------------------- 编辑`/etc/lilo.conf',设置启动提示参数如下,实现识别大内存(适用于2.2版内核)和关机自动断电(适用于APM): append="mem=128M apm=on apm=power-off noapic" 执行`lilo'完成上述设置。对称多处理器内核(SMP-kernel)需要`apm=power-off',而对我那堆糟糕的SMP硬件而言`noapic'几乎没什么用处。系统启动时,在启动提示符后直接输入这些参数效果也一样。参阅节 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.7.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.7.6. PPP拔号设置 ------------------ 安装`pppconfig'软件包,设置PPP拨号访问。 # apt-get install pppconfig # pppconfig ... 按提示配置PPP拨号 # adduser dip ... 允许进行PPP拨号访问 用户()进行PPP拨号访问: $ pon # 开始PPP访问,接通你的ISP ... enjoy the Internet $ poff # 停止PPP访问, 可选 详情参阅`/usr/share/doc/ppp/README.Debian.gz'。 另外,`wvdial'软件包可以用来设置PPP拨号访问。 3.7.7. `/etc'中的其它配置文件 ----------------------------- Debian标准安装不包含`/etc/cron.deny'文件,想添加可拷贝`/etc/at.deny'。 ------------------------------------------------------------------------------- 4. Debian指南 ------------- 本章为那些初涉Linux世界的新手指出了基本方向。如果你接触Linux已有一段时间,可以当成是一次实战测验。 4.1. 信息资源 ------------- 到Debian Documentation Project (DDP) (http://www.debian.org/doc/)看看,那儿有最权威的Debian参考资料。其中的许多文档都安装在`/usr/share/doc/'下。还可以到`/usr/share/doc-base/'看看,那儿有这些文档的打印文件。在`~/.bash_profile'中添加`export CDPATH=.:/usr/share/doc:/usr/src/local',这样更容易访问这些文档目录。 到Linux Documentation Project (LDP) (http://www.tldp.org/)看看,那儿有最权威的通用Linux参考资料。LDP资料通常安装在`/usr/share/doc/HOWTO/'目录下。 浏览本地或远程FTP站点的文档,可在Midnight Commander中按下`F9'(参阅节 4.3, `Midnight Commander (MC)')。 4.2. Linux控制台 ---------------- 4.2.1. 登录 ----------- 在普通Linux系统中,有6个独立的伪终端(pseudo-terminals)。同时按下`Left-Alt'键和`F1'--`F6'键可在这些伪终端间切换。每个伪终端均需单独登录。多用户环境是Unix最鲜明的特征,而且一用就上瘾。 使用普通用户帐号工作是个很好的Unix习惯。不得不承认,我过去常仅仅为图方便而滥用超级用户帐号(root)。 现在,我通常使用一个普通用户帐号,使用`sudo'、`super'或`su -c'来获得有限的root访问权限。 4.2.2. 添加用户 --------------- 系统安装完毕,我通常会添加一个普通用户帐号,如果用户名为“penguin”, # adduser penguin 就会创建一个这样帐号。 使用`vigr'命令编辑`/etc/group': adm:x:4:admin src:x:40:admin, debian, ... ... 在系统默认安装状态下,`adm'用户组成果对`/var/log'下的许多日志文件具有读权限,并可使用`xconsole'。`staff'用户组拥有`/home',适用于进行用户帐号维护工作的用户,而src用户组拥有`/usr/src',用来存放那些完成内核编译等工作的用户。有关用户及用户组的规范描述可参阅最新的users-and-groups (/usr/share/doc/base-passwd/users-and-groups.html)。 我个人使用`adm'用户组存放那些具有管理员职责和单独`su'特权的用户(参阅节 9.2.2, `“为什么GNU `su'命令不支持`wheel' group”'),而将CVS用户放在`src'用户组(参阅节 12.1, `CVS')。 用`adduser',`addgroup',`vipw',`vipw -s',`vigr',以及`vigr -s'检查一下用户及用户组是否配置得当。 4.2.3. 如何关机 --------------- 和其它现代操作系统一样,系统的工作文件均缓存于内存,所以在切断电源之前Linux需要完成特别的关机程序。下面就是多用户模式下使用的关机命令: # shutdown -h now 这是单用户模式下使用的关机命令: # poweroff -i -f 等待屏幕上显示“System halted”字样之后切断电源。如果在BIOS和Linux中开启了apm,系统会自动切断电源。详情参阅节 3.7.4, `多内存和关机自动断电'。 4.2.4. 命令行编辑 ----------------- `bash'是默认shell,它能记住使用过的命令。只需按up-arrow键就能进入记忆模式,使用上下箭头找你想输入的命令。其它需要牢记的重要击键有: Ctrl-U: 删除行首到光标间的内容 Ctrl-D: 中止输入 Lt-click-and-drag-mouse: 选择并拷贝到剪贴板(gpm) Ctrl-click-mouse: 将剪贴板内容粘贴到光标处(gpm) 对于常规Linux系统控制台,上述命令中通常指的是左边的`Ctrl'和`Alt'键。 4.2.5. 执行命令 --------------- 典型的命令执行方法是使用如下shell命令行序列: $ LC_ALL=fr ls -la 在此,`ls'程序在前台执行环境变量`LC_ALL'设置为`fr' Here, program `ls' is executed in the foreground job with the environment variable `LC_ALL' set to `fr' for French and the command line argument set to `-la' for listing everything in detail. If the command line is post-fixed by `&' sign then the command is executed in the background job. The background job allows user to run multiple programs in a single shell. The execution of the command can be managed by following key strokes. Ctrl-C: 中止程序 Ctrl-Z: 暂停程序 Ctrl-S: 停止屏幕输出 Ctrl-Q: 恢复屏幕输出 Ctrl-Alt-Del: 重启/关闭系统(参阅/etc/inittab) 有关如何管理程序运行,可参阅bash(1)中的`jobs'、`fg'、`bg'和`kill'。 4.2.6. 需要牢记的基本命令 ------------------------- 下列是最基本的Unix命令: ls, ls -al, ls -d, pwd, cd, cd ~user, cd -, cat /etc/passwd, less, bg, fg, kill, killall, uname -a, type , sync, netstat, ping, traceroute, top, vi, ps aux, tar, zcat, grep, ifconfig, ... 在命令提示符后输入`man'或`info'加相关命令名,可查看该命令的意思。许多Linux命令可使用下列调用获得简要帮助信息: $ commandname --help $ commandname -h `whatis _commandname_'可以显示任何命令的单行概述,这些内容来自于相关帮助文件的开头。 4.2.7. X Window系统 ------------------- 从控制台启动X Window系统: # exec startx 右键点击root窗口可以唤出选择菜单。 4.2.8. 重要键盘命令 ------------------- 可在Linux控制台中使用的重要击键(`plus'、`minus'指数字键盘上的按键): Alt-F1 thru F6: 切换到其它伪终端 Ctrl-Alt-F1 thru F6: 切换到其它伪终端 (在X-window、DOSEMU等运行环境中) Alt-F7: 切换回X-window Ctrl-Alt-minus: 降低X-window的显示分辩率 Ctrl-Alt-plus: 提高X-window的显示分辩率 Ctrl-Alt-Backspace: 中止X-windows Alt-X, Alt-C, Alt-V: 通用的Windows/Mac剪切、拷贝、粘贴键 在某些程序如Netscape Composer中,组合键中的Ctrl键换成了Alt键 4.3. Midnight Commander (MC) ---------------------------- Midnight Commander (MC)是Linux控制台和其它终端环境中的GNU“瑞士军刀”。 4.3.1. 安装MC ------------- # apt-get install mc 接着按照其手册页面mc(1)中描述的方法修改`~/.bashrc'(或`/etc/bash.bashrc', `.bashrc'会调用它),打开`-P'选项,这使得MC不必退出就能更改其工作目录。 如果处于`kon'或`Kterm' for Japanese等使用某些图形特性的终端,MC运行会出一些问题,可在MC命令行中加上`-a'加以预防。 4.3.2. 启动MC ------------- $ mc 在MC中用户可轻而易举使用菜单完成所有的文件操作。 4.3.3. 文件管理器 ----------------- 默认状态下,所有文件列于两个目录面板。一种实用的方式是将右边窗口设定为“information”,用来查看文件访问权限等信息。下面是一些基本的击键。如果`gpm' daemon在运行,你还可以使用鼠标。(在MC中进行剪切和粘贴操作时另忘了按下shift键。) * `F1': 帮助菜单 * `F3': 内置文件阅读器 * `F4': 内置编辑器 * `F9': 激活折叠菜单 * `F10': 退出Midnight Commander * `Tab': 在两个窗口间移动 * `Insert': 为多文件操作生成文件如拷贝 * `Del': 删除文件(小心---请设置MC为安装删除模式) * Cursor keys: 与各自的名字一致 4.3.4. 命令行技巧 ----------------- * `cd'命令可改变焦点屏幕中的目录位置。 * `Control-Enter'或`Alt-Enter'可以将文件名拷贝到命令行。在编辑命令行时可与`cp'或`mv'命令结合使用。 * `Alt-Tab'显示焦点文件所属文件或目录的文件名 * 可指定MC两个目录窗口的起始目录;例如`mc /etc /root'。 * `Esc' + == `F' (例如`Esc' + `1' = `F1', etc.; `Esc' + `0' = `F10') * `Esc' key == `Alt' key (= `Meta', `M-'); 例如`Esc' + `c'等价于`Alt-c' 4.3.5. 编辑器 ------------- 内置编辑器的剪切-粘贴方式很有意思。按`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'。在Linux/Unix世界里就该使用vi(m)命令。 4.3.6. 阅读器 ------------- 非常精巧的阅读器。它是在文档中搜索单词的利器。在`/usr/share/doc'目录下我总是用它,面对大量的Linux资料用它浏览是最快的方法。阅读器可以直接找开文件: $ mc -v filename_to_view (注意,有些不规范的软件包仍将它们的文档放在`/usr/doc'目录下。) 4.3.7. 自动启动特性 ------------------- 在文件上按`Enter',会激活相关的程序操作该文件。这是MC的一个极方便的特点。 executable: 执行命令 man, html file: 将文件内容传入阅读器程序 tar, gz, rpm file: 象浏览子目录一要浏览它的内容 为了使这些文件特性生效,不要将可阅读文件设成可执行文件。可在MC文件菜单中改变文件属性或使用`chmod'命令。 4.3.8. FTP虚拟文件系统 ---------------------- MC可通过FTP访问文件。按`F9'转到菜单栏,输入`p'激活FTP虚拟文件系统。按`username:passwd@hostname.domainname'格式输入URL,远程文件目录就会以本地目录的方式显示出来。 4.4. GNU/Linux文件系统基础知识 ------------------------------ 在GNU/Linux系统中每个文件和目录都与其拥有者(主人)和拥有组相关联。所有的文件信息都保存在一个称为_inode_的数据结构中。 4.4.1. 文件和目录的访问权限 --------------------------- 文件和目录的访问权限对如下3类用户进行了分别定义: * 文件_拥有者_(u), * 文件拥有者所在_用户组_中的其它成员(g),和 * 所有_其它_用户(o)。 每个文件均拥有下列三种权限: * _read_ (r): 查看文件内容 * _write_ (w): 修改文件 * _execute_ (x): 如同命令一样执行文件 每个目录均拥有下列三种权限: * _read_ (r): 列出目录内容 * _write_ (w): 在目录中增删文件 * _execute_ (x): 访问目录中的文件 在此,对目录的_execute_权限,不仅意味着允许查看目录下文件的内容,还允许获文件的其它信息如文件大小、修改时间。 `ls'可用来获取目录和文件的这些信息。参阅ls(1)。使用`ls'的`-l'选项,就会按如下顺序显示下列信息: * _文件类型_(第1个字符) * -: 普通文件 * d: 目录 * l: 符号链接 * c: 字符型设备节点 * b: 块设备节点 * 文件访问_权限_(接下来的9个字符,每3个一组依次代表user、group和other)。 * 文件的_硬链接数_ 。 * 文件拥有_user_的用户名。 * 文件所属_group_的用户组名。 * 文件的字符数_size_ (bytes)。 * 文件的_date and time_ (mtime)。 * 文件的_name_。 在root账号下可使用`chown'改变文件的拥有者,参阅chown(1)。要改变文件的所属组,可以文件拥有者或root的身份运行`chgrp',参阅chgrp(1)。要改变目录的访问权限,可以文件拥有者或root的身份运行`chmod',参阅chmod(1)。 例如,可以root帐号下创建一个目录树,并使其拥有者为,所属组为: # cd /some/location/ # chown -R : . # chmod -R ug+rwX,o=rX . 下面是3个更特殊的权限: * _set user ID_ (s 或 S 而非 user's x), * _set group ID_ (s 或 S 而非 group's x), and * _sticky bit_ (t 或 T 而非 other's x). 在此,如果未设置输出时屏蔽执行权限标识位,则`ls -l'的输出中这些标识位将使用大写字母。 为可执行文件设置_set user ID_位将允许用户以该文件拥有者的ID来执行该文件(例如以_root_身份)。同样,为可执行文件设置_set group ID_将允许用户以该文件所属组的ID来执行该文件(例如以_root_身份)。这将引起安全风险所以使用这些特性时要格外小心。 为目录设置_set group ID_,则该目录会使用BSD-like文件创建方案,即目录中所有新创建的文件均属于该目录所属的_group_。 为目录设置_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 4.4.2. 时间戳 ------------- GNU/Linux的文件有3种类型的时间戳: * _mtime_: 修改时间 (`ls -l'), * _ctime_: 状态改变时间 (`ls -lc'),以及 * _atime_: 最近访问时间 (`ls -lu'). 注意_ctime_并非文件创建时间。 * 覆盖一个文件会改变所有三类时间_mtime_、_ctime_和_atime_所有三类时间。 * 改变文件的访问权限或拥有者会改变文件的_ctime_和_atime_。 * 读文件会改变文件的_atime_。 注意,在GNU/Linux系统中,即便是简单的读文件通常会引起文件的写操作,从而更新_inode_上的_atime_信息。使用`noatime'选项来挂载文件系统,可使用系统忽略该操作,从而加速文件的访问和读取。参阅mount(8)。 4.4.3. 链接 ----------- 在2种方法将文件关联到不同的文件名。 * _hardlink_(硬链接)相当于现存文件的另一个名字。(`ln '), * _symlink_(符号链接)指向一个不同的文件。(`ln -s ')。 下面的例子显示了链接数的改变和使用`rm'命令时产生的微妙差异。 $ echo "Original Content" > $ ls -l -rw-r--r-- 1 osamu osamu 4 Feb 9 22:26 $ ln # hardlink $ ln -s # symlink $ 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. 进一步学习 --------------- 许多Unix入门级参考书出自在O'Reilly,在计算机的各个领域,想买到优秀的指导书,O'Reilly不会让你失望。LDP的文档Tips-HOWTO (http://www.tldp.org/HOWTO/Tips-HOWTO.html)是另一个极好的资源。更多资源参阅章 15, `Debian技术支持'。 ------------------------------------------------------------------------------- 5. 发行版升级 ------------- 升级的官方发布通知位于 http://www.debian.org/releases/stable/releasenotes 和 http://www.debian.org/releases/testing/releasenotes(不断更新中)。 将系统升级到`testing/unstable'的过程如下: * 如果使用的系统是Potato请将APT版本升级到Woody,因为Potato版中的APT不具备Woody版中apt_preferences(5)所描述的某些特性。 * 修改`/etc/apt/sources.list'和`/etc/apt/preferences'文件,加入所使用的安装服务器上与“testing”相关下载目录,如果有兴趣,亦可加入“unstable”相关下载目录。 * 更新软件包列表,安装可以升级的软件包。 5.1. 将APT升级到Woody版本 ------------------------- 如果运行的是Potato,可在`/etc/apt/sources.list'中加入`stable'镜像源,然后使用下列步骤将APT系统以及一些核心包在线升级到Woody版本。 # apt-get update # apt-get install libc6 perl libdb2 debconf # apt-get install apt apt-utils dselect dpkg 5.2. 迁移准备工作(从“stable”到“testing”) ---------------------------------------------- 请注意,升级到`testing'有一个负面影响,安全补丁更新将会非常缓慢。 下面的操作可实现通过网络升级到“testing”(亦可执行样例目录中的go-woody (http://www.debian.org/doc/manuals/debian-reference/examples/)脚本): 清空现存的`sources.list'文件 # cd /etc/apt # cp -f sources.list sources.old # :>sources.list 为“stable”系统生成一张干净的下载目录列表 # cd / # apt-setup noprobe ... 通过http或ftp,选择下载目录 在这张新列表文件中添加“testing”版本下载目录,将`deb-src'行注释掉。 # cd /etc/apt # grep -e "^deb " sources.list >sources.deb # grep -e "^deb-" sources.list >sources.src # sed -e "s/stable/testing/" sources.deb \ >>sources.list # sed -e "s/stable/testing/" sources.src | \ sed -e "s/^deb-/#deb-/" >>sources.list # apt-get update # apt-get install apt apt-utils # cat >preferences <>sources.list # sed -e "s/stable/unstable/" sources.src | \ sed -e "s/^deb-/#deb-/" >>sources.list See 节 6.2, `Debian软件包管理基础' for the art of tuning `/etc/apt/sources.list' and `/etc/apt/preferences'. 现在就可以下一节所讲的任意一种方法更新和升级系统了。 5.3. 升级Debian系统 ------------------- 正确的设置好`/etc/apt/sources.list'和`/etc/apt/preferences'文件后,系统即可升级到`testing'了。基础知识可参阅章 6, `Debian软件包管理',如果遇到问题可参阅节 6.3.2, `APT升级错误及解决方法'。 5.3.1. 最好使用`dselect'升级 ---------------------------- 如果系统在许多软件包都包含了`-dev'等软件包,推荐使用下面的`dselect'操作方法进行软件包细操作(fine-grained package control)。 # dselect update # 升级前请先完成这步 # dselect select # 选择附加软件包 运行`dselect'时当前所有软件包均被选中,`dselect'会提示你基于`depends',`suggests'和`recommends'的附加软件包,如果不想添加任何软件包,只需输入`Q'退出`dselect'。 # dselect install 在安装过程中,必须回答一些有关软件包配置的问题,准备好你的笔记本花点时间处理它们。参阅节 6.2.3, ``dselect''。 使用`dselect'。_它能干得不赖 :)_ 5.3.2. 最好别用`apt-get'升级 ---------------------------- _下面描述了`apt-get'下面描述了apt-get非常广泛的用途,但建议_不要_用它来进行系统升级。_ 如果你不想用`dselect'对Woody进行升级,请考虑`aptitude'或其它工具。 如果系统中的软件包不多,或Debian包文件没有进行重大修改,下述操作就能胜任(有时是这样)。 # apt-get update # 升级前请先完成这步 ... 升级系统包括“depends”类软件包: # apt-get upgrade # 升级前请先完成这步 ... 升级整个系统包括“depends”类软件包: # apt-get -u dist-upgrade ... 或按当前dselect的设置进行升级(new, better): # apt-get -u dselect-upgrade # 使用dselect进行后期处理 使用`apt-get'方式升级将无法对_recommends_和_suggests_类软件包进行操控。参阅节 2.2.8, `软件包关联性'。 ------------------------------------------------------------------------------- 6. Debian软件包管理 ------------------- 使用ATP下载软件包时,请确保使用了`squid'设置本地HTTP代理,如果有可能,请设置`http_proxy'环境变量或在`/etc/apt/apt.conf'`http'值,这样可极大的改善网络升级的性能,特别是在局域网中多台Debian机器同时升级时。 尽管apt_preferences(5)的pin功能十分强大,但它并不能解决所有关联问题,因为关联需求总倾向于更新其它基础程序包。 节 8.6.33, ``chroot''中所描述的使用方法非常适于 将系统的稳定性和可使用大量新版软件两个优点结合在一起。 本章基于Woody系统撰写的,但大部分信息均适用于Potato系统(除了apt_preferences(5)和`/etc/apt/preferences'的相关主题)。 6.1. 概述 --------- 如果你没精力阅读所有的开发文档,那么先看看本章的内容,开始体验Debian `testing'/`unstable'的威力吧 :-) 6.1.1. 主要工具 --------------- dselect --- 使用菜单界面的软件包管理工具(最上层的包管理工具) dpkg --- 安装软件包(管理软件包中的文件) apt-get --- 安装软件包(管理软件包,CLI APT) tasksel --- 安装任务套件(管理面向某方面任务的一套软件包) aptitude --- 安装软件包(管理软件包和任务套件,ncurses APT) deity --- 另一种ncurses APT synaptic, gsynaptic --- 另一种GUI APT 它们不是同级的工具。`dselect'运行于APT(命令行命令是`apt-get')和`dpkg'之上。 APT使用`/var/lib/apt/lists/*'来跟踪可用的软件包,而`dpkg'使用的是`/var/lib/dpkg/available'。如果直接用`apt-get'或同类工具如`aptitude'等来安装软件包,千万别忘了更新`/var/lib/dpkg/available'文件,可以使用dselect的`[U]pdate'选项或在运行`dselect update'、`tasksel'或`dpkg -l'前执行shell命令行“`dselect update'”。 在处理关联软件包的方式上,`apt-get'会自动搜索下载_depends_类软件包,但不会理睬_recommends_和_suggests_类软件包,而`dselect'在软件包的选择方面采用菜单方式操作,对_depends_、_recommends_和_suggests_三类相关软件包均给出提示。`aptitude'则提供了选项下载安装所有_depends_、_recommends_和_suggests_类软件包。 参阅节 2.2.8, `软件包关联性'。 6.1.2. 方便的工具 ----------------- apt-cache - 在本地缓冲区检查包文件 dpkg-reconfigure - 重新配置已安装的软件包(如果它是使用debconf进行配置的) dpkg-source - 管理源码包 dpkg-buildpackage - 自动生成包文件 ... 6.2. Debian软件包管理基础 ------------------------- 成套地安装软件包称之为_task_,还可以使用软件包管理工具逐个地安装软件包或升级系统。 亦可参阅章 3, `Debian系统安装提示'、章 5, `发行版升级'和节 11.2, `应急的编辑器'。 6.2.1. 使用`tasksel'或`aptitude'进行_task_安装 ---------------------------------------------- `tasksel'是_Debian的任务安装器_,系统安装过程中它为用户提供了一种`简易'软件包选择方式。 如果你希望完装的某项常规功能包含了许多软件包,最好的办法就是使用它来安装。运行如下命令: # dselect update # tasksel `aptitude'亦可访问_task_。用它不仅可以选择_tasks_还可以对_task_选项菜单中的软件包进行逐个取舍。 6.2.2. 设置APT系统 ------------------ 使用`testing'发布版的用户,有时需要对系统进行有选择性地升级,这时可按节 5.1, `将APT升级到Woody版本'中描述的方法设置APT系统(>Woody),使用其apt_preferences(5)功能。 首先,在`/etc/apt/sources.list'中添加`stable'、`testing'和`unstable'镜像源,接着编辑`/etc/apt/preferences',设置合适的Pin-Priority。 [1] Package: * Pin: release a=stable Pin-Priority: 500 Package: * Pin: release a=testing Pin-Priority: 600 Package: * Pin: release a=unstable Pin-Priority: 50 [1] I kept the description around here as is to maintain consistency with other parts. If you are really tracking `testing' or `unstable', you should actually remove references to `stable' in `/etc/apt/sources.list' and `/etc/apt/preferences'. This is because `testing' starts as a copy of `stable'. 6.2.3. `dselect' ---------------- 启动程序,`dselect'会自动选上所有“Required”、“Important”和“Standard”类软件包,在Potato系统中,某些大型应用程序如TeX和Emacs处于这些分类中,在初次安装系统时最好手工取消对它们的选择(输入“_”)。在Woody中,这些大型应用程序被移入“Optional”类软件包。 `dselect'的用户界面有点怪。有4个相似命令(注意是大写字母!): Key-stroke Action Q 退出。确认当前的选择然后退出。 (override dependencies) R 恢复!我放弃我做出的选择 D 不管它!我不管dselect有什么建议,照我说的做! U 照系统的建议做 使用`D'和`Q'可以选择有冲突的选项,你要自负风险,所以使用这些命令要小心。当前`dselect'是一款成熟的菜单驱动式工具,在对_suggests_和_recommends_类软件包的选择控制方面,它提供相当棒的微操作能力。 在`/etc/dpkg/dselect.cfg'中加上一行包含“expert”选项以减少干扰。对于速度慢的机器,请在其它速度快的机器上运行`dselect'选好软件包,然后用`apt-get install'安装它们。 对于没有定义Pin-Priority的软件包,`dselect'不会访问它们。 6.2.4. `aptitude' ----------------- `aptitude'是一款新的菜单驱动式软件包安装工具,与`dselect'很相似。它亦可作为命令行工具`apt-get'的替代品。参阅aptitude(1)。 `aptitude'可接受单字符命令,通常是小写字母。 Key-stroke Action F10 菜单 ? 键盘命令帮助 u 更新软件包信息 g 下载并安装选定的软件包 q 保存修改并退出当前屏幕 x 放弃修改并退出当前屏幕 Enter 浏览某软件包的相关信息 `aptitude'提供了选项可自动选取所有_depends_、_recommends_和_suggests_类软件包。可在`F10 -> Options -> Dependency handling'菜单中设置它。 通过`aptitude'可访问某软件包的所有版本。 6.2.5. `apt-cache'和`apt-get'命令 --------------------------------- 还是以上面使用`testing'发布版的用户为例,可使用下列命令管理系统: * `apt-get -u upgrade' 跟踪`testing'发布版的更新情况,对系统上所有软件包进行升级并从`testing'处安装关联软件包。 * `apt-get -u dist-upgrade' 跟踪`testing'发布版的更新情况,对系统上所有软件包进行升级并从`testing'处重新分析关联关系并安装关联包。 * `apt-get -u dselect-upgrade' 跟踪`testing'发布版的更新情况,对系统上所有在`dselect'中选定了的软件包进行升级。 * `apt-get -u install ' 从`testing'处安装及其关联包。 * `apt-get -u install /unstable' 从`unstable'处安装并从`testing'处安装关联包。 * `apt-get -u install -t unstable ' 从`unstable'处安装及其关联包。注意须设置`unstable'的Pin-Priority为990。 * `apt-cache policy ' 检查软件包的状态。 * `apt-cache show | less' 查看软件包的有关信息。 * `apt-get install ' 安装软件包的特定版本<2.2.4-1>。 * `apt-get -u install ' 安装软件包并删除软件包。 * `apt-get remove ' 删除软件包,但保留其配置文件。 * `apt-get remove --purge ' 删除软件包及其配置文件。 在上面的例子中使用`-u'选项的作用是在实际升级之前将所有将要升级的软件包列出,并提示用户确认。下面的操作可将`-u'设置为默认行为: $ cat >> /etc/apt/apt.conf << . // Always show packages to be upgraded (-u) APT::Get::Show-Upgraded "true"; . 使用`-s'可进行模拟升级,并不进行真正的升级行为。 6.2.6. 跟踪某Debian发行版 ------------------------- 根据个人的喜好,选择要跟踪的Debian发行版,然后修改节 6.2.2, `设置APT系统'的样例文件`/etc/apt/preferences': track stable: 将testing的Pin-Priority改为50 track testing: 保持上面的设置不变 track testing(unstable): 将unstable的Pin-Priority改为500 track unstable(testing): 将unstable的Pin-Priority改为800 有关如何选定Pin-Priority的说明:在上表中,从上而下代表了某个版本 从上个版本刚刚发布之后到下一版进入冻结期之前这段时间经历的各个阶段。 请注意,跟踪`testing'发行版的Debian有一个负面影响,安全补丁的更新很慢。 请注意,如果将Debian各版本混合,例如将`testing'混入`stable'或将`unstable'混入`stable',这会造成众多关键软件包不自觉地从`testing'处或`unstable'处获得,结果引起许多麻烦。 如何对`/etc/apt/preferences'进行设置,将某些关键包锁定在成熟版本,而让其它非关键包跟踪不太成熟的新版本,可参考样例目录 (http://www.debian.org/doc/manuals/debian-reference/examples/)中的`preferences.testing'和`preferences.unstable'文件。另一方面,`preferences.stable'强制所有软件包降级到“stable”。 6.2.7. 将所有软件包降级到`stable' --------------------------------- 要将所有软件包降级到`stable',可按下面的方法编辑`/etc/apt/preferences': Package: * Pin: release a=stable Pin-Priority: 1001 然后运行“`apt-get upgrade'”,由于Pin-priority > 1000而引起强制降级。注意,该操作可能会在关联性方面发生一点问题。 6.2.8. `/etc/apt/preferences'概述 --------------------------------- 节 6.2.2, `设置APT系统'中展示的`/etc/apt/preferences'样例文件里,首行`Package: *'表示该段落指令作用于所有软件包。可以通过指定软件包名称来为某个特定的软件包设置指定的Pin-Priority。 接下来的一行是`Pin: release a=stable'表示`apt-get'从包含`Archive: stable'节的`Release'文件所在的目录获得`Packages.gz'文件。 最后一行`Pin-Priority: 500'指定Pin-Priority为500。 如果多个软件包同名,系统通常会安装拥有最高Pin-Priority的软件包。 在此,Pin-Priority表示: * 1001及以上:可降级优先级。 Pin-Priority处于该范围的软件包允许降级操作。 * 100到1000:标准优先级。 不允许降级。几个key Pin-Priority的值: * 990:由`--target-release'或apt-get(8)`-t'选项设置的优先级。 * 500:所有默认软件包文件的优先级。 * 100:当前安装软件包文件的优先级。 * 0到99:非自动优先级。(仅用于软件包没有安装或没有别的可用版本时。) * 小于0:决不选择该版本。 按下面的方法设置`/etc/apt/apt.conf'可获得与`--target-release'一样的效果: # echo 'APT::Default-Release "testing";' >> /etc/apt/apt.conf 命令行选项`--target-release'和`/etc/apt/apt.conf'中的设置会顶替`/etc/apt/preferences'的设置。在玩`/etc/apt/preferences'的时候小心两者冲突。 6.3. Debian生存工具 ------------------- 掌握了这些知识,就能让你的系统“_青春永驻_”了:-) 6.3.1. 检测程序错误寻求帮助 --------------------------- 如你使用某个软件包出现问题,在寻求帮助或发送错误报告之前请确认查看过下列站点(`lynx'、`links'和`w3m'同样好用): $ lynx http://bugs.debian.org/ $ lynx http://bugs.debian.org/ # 如果你知道软件包名称 $ lynx http://bugs.debian.org/ # 如果你知道错误序号 在Google(www.google.com)中使用关键字“site:debian.org”搜索。 如有疑问,可阅读帮助文件。设置`CDPATH'如下: export CDPATH=.:/usr/local:/usr/share/doc 然后输入 $ cd $ pager README.Debian # if this exists $ mc 更多技术支持资源列在章 15, `Debian技术支持'。 6.3.2. APT升级错误及解决方法 ---------------------------- 从`unstable'/`testing'进行升级时可能出现节 5.3, `升级Debian系统'中提到的软件包关联问题。多数情况下,是因为升级的软件包所需的新增的关联包没有安装。可使用如下方法解决: # apt-get dist-upgrade 如果这招无效,可以重复下面的方法至到问题解决: # apt-get upgrade -f # continue upgrade even after error ... 或 # apt-get dist-upgrade -f # continue dist-upgrade even after error 一些的确存在问题的升级脚本会引起持续出错。最好的解决方法是检查该软件包的安装脚本`/var/lib/dpkg/info/packagename.<{post-,pre-}{install,removal}>'然后运行: # dpkg --configure -a # 配置所有未完成安装的软件包 如果脚本报告缺少配置文件,查看一下`/etc'中相关的配置文件。如果配置文件有`.new'扩展名(或其它类似的扩展名),去掉(`mv')它的扩展名。 从unstable/testing进行升级时可能出现软件包关联问题。可用这个方法智取: # apt-get install -f # 重载坏关联 还可以用`equivs'包来解决此类问题。参阅`/usr/share/doc/equivs/README.Debian' and 节 6.5.2, ``equivs'软件包'。 6.3.3. 使用`dpkg'救助 --------------------- 如果系统的`dselect'(APT)受损无法完成安装,可使用`dpkg'来恢复: # cd /var/cache/apt/archives # dpkg -i libc6* libdb2* perl* # dpkg -i apt* dpkg* debconf* # dpkg -i * # 直至不再出错 如果软件包丢失,用下述方法从镜像源 (http://www.debian.org/mirror/)下载: # mc # use "FTP link" pointing to Debian FTP server 现在,在HTTP/FTP服务器上,软件包的真正位置不再是传统的`/dist'目录而是新的`/pool'目录。(参阅节 2.1.10, ``pool'目录') 然后开始安装: # dpkg -i /var/cache/apt/archives/ 对于坏关联,可这样解决: # dpkg --ignore-depends=,... -i # dpkg --force-depends -i # dpkg --force-depends --purge # dpkg --force-confmiss -i # Install missing conffile 6.3.4. 恢复软件包选择状态的数据 ------------------------------- 如果`/var/lib/dpkg/status'因为某种原因坏掉了,Debian系统将会完全丢失软件包选择状态的数据。赶快到`/var/lib/dpkg/status-old'或`/var/backups/dpkg.status.*'下找找旧的`/var/lib/dpkg/status'文件。 将`/var/backups/'放在其它的分区是个好习惯,因为该目录包含了许多非常重要的系统数据。 如果旧的`/var/lib/dpkg/status'文件也坏了,仍可以从`/usr/share/doc/'下的目录进行恢复这些信息。 # ls /usr/share/doc | \ grep -v [A-Z] | \ grep -v '^texmf$' | \ grep -v '^debian$' | \ awk '{print $1 " install"}' | \ dpkg --set-selections # dselect --expert # reinstall system, de-select as needed 6.3.5. `/var'被删除后如何恢复系统 --------------------------------- `/var'目录包含着定时更新的数据如mail,它们很容易遭破坏。将目录放到别的分区可降低风险,如果最坏的事情发生了,可以通过重建`/var'目录来挽救Debian系统。 从相同或旧版本的最简Debian系统中取得`/var'目录的内容框架,例如var.tar.gz (http://people.debian.org/~osamu/pub/),然后它放入受损系统的root目录,接着 # cd / # mv var var-old # 如果剩有有用内容 # tar xvzf var.tar.gz # 使用Woody框架文件 # aptitude # 或用dselect 上述步骤可使系统恢复工作。使用节 6.3.4, `恢复软件包选择状态的数据'中描述的技术加速软件包选择数据的恢复。 ([FIXME]:该过程需要更多的实践来检验) 6.3.6. 为无法启动的系统安装软件包 --------------------------------- 使用Debian急救软盘/CD或从多启动Linux系统其它分区启动。 See 节 8.1, `启动系统'. 将无法启动的系统挂载到`/target'并使用`dpkg'的chroot安装模式。 # dpkg --root /target -i 接下来就可以着手配置并解决问题。 如是只是由于`lilo'损坏而造系统无法启动,可使用标准Debian急救盘启动。假设你的root分区位于`/dev/hda12'且想使用runlevel 3,在启动提示符输入: boot: rescue root=/dev/ 3 这样,你就可以使用软盘中内核启动系统,新系统的功能基本齐全。(可能丢失某些内核特性或模块) 6.3.7. 如果`dpkg'命令出错该怎么办 --------------------------------- 如果`dpkg'损坏就不能安装任何`.deb'文件。下面的操作可帮助你修复这种状况。(在第一行,你可将“links”替换成你喜欢的浏览器。) $ links http:///debian/pool/main/d/dpkg/ ... 下载完好的dpkg__.deb $ su password: ***** # ar x dpkg__.deb # mv data.tar.gz /data.tar.gz # cd / # tar xzfv data.tar.gz 对`i386',亦可用`http://packages.debian.org/dpkg'作为URL。 6.4. Debian必杀技 ----------------- 有了这些命令的_启迪_,你将会从无休止的升级冲突的地狱中解放出来,达到Debian_天堂_。 :-) 6.4.1. 文件信息 --------------- 查找特定文件所属的软件包: $ dpkg {-S|--search} pattern # search for pattern in installed packages $ wget http://ftp.us.debian.org/debian/dists// $ zgrep -e pattern # find filename-pattern of files in the debian archive 或使用专门的软件包命令: # apt-get install dlocate # conflicts with slocate (secure version of locate) $ dlocate # fast alternative to dpkg -L and dpkg -S ... # apt-get install auto-apt # on-demand package installation tool # auto-apt update # create db file for auto-apt $ auto-apt search # search for pattern in all packages, installed or not 6.4.2. 软件包信息 ----------------- 搜索并显示包文件的信息。编辑`/etc/apt/sources.list',让APT指向正确的包文件。如果想了解testing/unstable中的相应软件包与当前系统安装的软件包有何差别,使用`apt-cache policy'---更好。 # apt-get check # 更新缓冲区并检查损坏的软件包 $ apt-cache search # 按文本描述搜索软件包 $ apt-cache policy # 软件包的priority/dists信息 $ apt-cache show -a # 显示所有dists中软件包描述信息 $ apt-cache showsrc # 显示相应源码包的信息 $ apt-cache showpkg # 软件包调试信息 # dpkg --audit|-C # 搜索未完成安装的软件包 $ dpkg {-s|--status} ... # 已安装软件包描述 $ dpkg -l ... # 已安装软件包的状态(每个占一行) $ dpkg -L ... # 列出软件包安装的文件的名称 Woody发布版没有为`apt-cache showsrc'建档,但该命令可用:) 你也这可这样查看软件包信息(我用`mc'浏览): /var/lib/apt/lists/* /var/lib/dpkg/available 比较下面的文件可以确切了解最近的安装过程对系统造成了那些改变。 /var/lib/dpkg/status /var/backups/dpkg.status* 6.4.3. 使用APT进行全自动系统安装 -------------------------------- 进行全自动安装,要在`/etc/apt/apt.conf'中加上一行: Dpkg::Options {"--force-confold";} 另一种等阶的方法是运行`apt-get -q -y '。这种方法可能产生严重的负作用,所以使用起来要小心。参阅apt.conf(5)和dpkg(1)。 安装完毕以后,可以用节 6.4.4, `重新配置已安装软件包'中的方法配置特定的软件包。 6.4.4. 重新配置已安装软件包 --------------------------- 使用下列方法重新配置已安装软件包。 # dpkg-reconfigure --priority= [...] # dpkg-reconfigure --all # 重新配置所有的软件包 # dpkg-reconfigure locales # 生成别的locales # dpkg-reconfigure --p= xserver-xfree86 # 重新配置X服务器 如果你想永久改变`debconf'对话框模式,可这么做。 某些程序用于生成特殊的配置脚本。 apt-setup - 创建/etc/apt/sources.list install-mbr - 安装主引导(Master Boot Record)管理器 tzconfig - 设定本地时间 gpmconfig - 设置gpm鼠标daemon sambaconfig - 在Potato中配置Samba(Woody使用debconf来配置) eximconfig - 配置Exim (MTA) texconfig - 配置teTeX apacheconfig - 配置Apache (httpd) cvsconfig - 配置CVS sndconfig - 配置声音系统 ... update-alternatives - 设定默认启动命令,例如设定vi启动vim update-rc.d - System-V init脚本管理工具 update-menus - Debian菜单系统 ... 6.4.5. 删除软件包 ----------------- 删除软件包但保留其配置文件: # apt-get remove ... # dpkg --remove ... 删除软件包并删除配置文件: # apt-get remove --purge ... # dpkg --purge ... 6.4.6. 阻止旧软件包升级 ----------------------- 举个例子,要阻止`libc6'和`libc6-dev'通过`dselect'或使用`apt-get -u upgrade '命令升级,可执行: # echo -e "libc6 hold\nlibc6-dev hold" | dpkg --set-selections 这种方法不影响`apt-get -u install '命令操作。要阻止`apt-get -u upgrade '或`apt-get -u dist-upgrade'命令对软件包执行的强制自动降级行为,可在`/etc/apt/preferences'中加上: Package: libc6 Pin: release a=stable Pin-Priority: 2000 这里“`Package:'”后不能使用通配符如“`libc6*'”,如果要保持所有与`glibc'源码包相关的二进制包的版本同步,可以明确的列出它们。 该命令可以显示处于“阻止”状态的软件包: dpkg --get-selections "*"|grep -e "hold$" 6.4.7. stable/testing/unstable混合系统 -------------------------------------- `apt-show-versions'可以列出发行版中可用软件包的版本。 $ apt-show-versions | fgrep /testing | wc ... 你有多少testing软件包 $ apt-show-versions -u ... 列出可升级的软件包 $ apt-get install `apt-show-versions -u -b | fgrep /unstable` ... 将所有unstable软件包升级到最新版本 6.4.8. 删除缓存包文件 --------------------- 使用APT安装软件包会在`/var/cache/apt/archives'目录留下缓存文件,要清除这些文件可使用: # apt-get autoclean # removes only useless package files # apt-get clean # removes all cached package files 6.4.9. 记录/拷贝系统配置 ------------------------ 对软件包选择情况进行本地备份: $ dpkg --get-selections "*" > # or use \* `“*”'使`'包含那些被指定“完全删除(purge)”的文件。 你可将这个文件发送到另一台电脑并在那儿按文件中的选择进行软件包安装。 # dselect update # dpkg --set-selections < # apt-get -u dselect-upgrade # dselect install 6.4.10. 向`stable'系统引入软件包 -------------------------------- 对stable系统进行部分升级,在软件运行环境中重新编译源码的确是个诱人的想法,这样可以避免由于关联关系不得不对大量软件包升级。首先,将下列镜像源加入`/etc/apt/sources.list': deb-src http://http.us.debian.org/debian testing \ main contrib non-free deb-src http://non-us.debian.org/debian-non-US testing/non-US \ main contrib non-free deb-src http://http.us.debian.org/debian unstable \ main contrib non-free deb-src http://non-us.debian.org/debian-non-US unstable/non-US \ main contrib non-free 由于屏幕输出的限制,上述每条`deb-src'命令均分成了2行,实际上在`sources.list'中它们均为单行。 然后下载源码并在本地生成软件包: $ apt-get source $ dpkg-source -x $ cd ... 查找需要的软件包(编译所需的关联包列在.dsc文件中)并安装它们, 你还需要“fakerroot”软件包。 $ dpkg-buildpackage -rfakeroot ...or (no sig) $ dpkg-buildpackage -rfakeroot -us -uc # use "debsign" later if needed ...Then to install $ su -c "dpkg -i " 通常,需要安装一些带“-dev”后缀的软件包以满足关联关系。`debsign'在`devscripts'软件包中。`auto-apt'可以轻松解决这些关联问题。请使用`fakeroot',如是没有必要,就别使用root帐号。 在Woody中,这些关联问题已被简化。例如,编译`pine'源码包: # apt-get build-dep pine # apt-get source -b pine 6.4.11. 本地软件包文件 ---------------------- 为了创建与APT和dselect系统兼容的本地软件包文件,需要创建`Packages'(Packages),包中文件要放在特定的目录树中。 Debian官方包文件喜欢存放于本地deb仓库,下面就来创建仓库: # apt-get install dpkg-dev # cd # install -d # 软件包存放的物理地址 # install -d dists//
/binary- # ls -1 | sed 's/_.*$/
/' | uniq > # editor # adjust and
# dpkg-scanpackages / \ > dists//
/binary-/Packages # cat > dists//
/Release << EOF Archive: Version: <3.0> Component:
Origin: Label: Architecture: EOF # echo "deb file:
" \ >> /etc/apt/sources.list 还可以这样快速创建一个本地deb仓库: # apt-get install dpkg-dev # mkdir # mv # dpkg-scanpackages /dev/null | \ gzip - > /Packages.gz # echo "deb file: ./" >> /etc/apt/sources.list 在`/etc/apt/sources.list'中设置相应镜像源入口地址,就可以通过HTTP或FTP方式远程访问存放在其中的包文件了。 6.4.12. 转化或安装外来二进制软件包 ---------------------------------- `alien'可将其它格式的二进制软件包如Redhat的`rpm'、Stampede的`slp'、Slackware的`tgz'和Solaris的`pkg'等转化成Debian的`deb'格式软件包,如果你想在自己的系统上使用别的Linux发行版中的软件包,可使用`alien'将它转化成系统首选的软件包格式后安装。`alien'还支持LSB的软件包。 6.4.13. 校验已安装软件包 ------------------------ `debsums'可以校验已安装软件包的MD5编码,对某些软件包没有可用的MD5编码,系统管理员可使用一个临时的解决办法: # cat >>/etc/apt/apt.conf.d/90debsums DPkg::Post-Install-Pkgs {"xargs /usr/bin/debsums -sg";}; ^D per Joerg Wendland (untested). 6.4.14. 优化`sources.list' -------------------------- 简而言之,我尝试过用各种优化方法来创建`sources.list',但任何一种方法对我这个住在美国的人来说都没有明显的改善。最后我还是用`apt-setup'手工选择近一点的站点。 `apt-spy'会根据站点回应时间和带宽自动创建`sources.list'。`netselect-apt'会创建一个更完整的`sources.list'文件,但它使用更落后的方法来选择镜像站点(比较ping time)。 # apt-get install apt-spy # cd /etc/apt ; mv sources.list sources.list.org # apt-spy -d testing -l sources.apt 6.5. 其它Debian特性 ------------------- 6.5.1. `dpkg-divert'命令 ------------------------ 使用文件_转移_(diversions)的方法可以强令`dpkg'将文件安装到_转移_目录而非默认目录。对于某个引起冲突的文件,可以在Debian软件包脚本中使用_Diversions_将它安装到别的目录。系统管理员还可以使用diversion来重载软件包配置文件,或者用来保留某些旧配置文件(这些文件没有在_conffiles_中登记)当安装新版软件时这些文件会被覆盖。(参阅节 2.2.4, `保存本地设置')。 # dpkg-divert [--add] # add "diversion" # dpkg-divert --remove # remove "diversion" 记住,不到万不得已不要使用`dpkg-divert'。 6.5.2. `equivs'软件包 --------------------- 如果你从源码编译程序,最好将它做成本地Debian化软件包(`*.deb')。最新的方法是使用`equivs'。 Package: equivs Priority: extra Section: admin Description: Circumventing Debian package dependencies This is a