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 dummy package which can be used to create Debian packages, which only contain dependency information. 6.5.3. 自选命令 --------------- 想用`vi'命令启动`vim',可使用`update-alternatives'来定义: # update-alternatives --display vi ... # update-alternatives --config vi Selection Command ----------------------------------------------- 1 /usr/bin/elvis-tiny 2 /usr/bin/vim *+ 3 /usr/bin/nvi Enter to keep the default[*], or type selection number: 2 Debian自选命令设定系统中的这些项目,都是`/etc/alternatives'下的链接文件。 想设置你喜爱的X window环境,执行`update-alternatives'来指定`/usr/bin/x-session-manager'和`/usr/bin/x-window-manager'。详情参阅节 9.4.5.1, `自定义X会话'。 `/bin/sh'是指向`/bin/bash'或`/bin/dash'的链接。想兼容旧的Bash脚本,使用`/bin/bash'比较保险,但更好还是使用`/bin/dash',因为它更符合POSIX标准。升级到2.4版Linux内核,系统一般将它设置为`/bin/dash'。 6.5.4. System-V `init'文件和运行级别 ------------------------------------ 可在`/etc/inittab'中设定系统启动的默认运行级别(runlevel)。 不同于其它的发行版,Debian将运行级别的管理职责完全赋予系统管理员。Debian更倾向于使用`update-rc.d'脚本来管理它那System-V风格的`init'。 下面的命令表示,按优先级数字20(normal)所指定的次序,分别在runlevel 1、2、3中启动`/etc/init.d/',在runlevel 4、5中停止它们: # update-rc.d start 20 1 2 3 . stop 20 4 5 . 要删除`init.d'脚本中存在的符号链接可执行: # update-rc.d -f remove 要编辑运行级别,我通常在`mc'中用`Alt-Enter'拷贝链接名,然后在shell提示符下使用`mv'命令手工编辑,例如: # mv S99xdm K99xdm # 禁用xdm (X display manager) 有时为了进行临时调试,我甚至在`init.d'脚本的开头加入`exit 0'来禁用一个daemon,反正它们都在`conffiles'登记过。 6.5.5. 停止daemon服务 --------------------- Debian发行版非常注重系统安全,并期望系统管理员能担此重任。它将系统的易用性放在了第二位,许多daemon服务都定位在最高安全级别,因而,默认安装状态下系统只启动最少的(甚至没有)可用的服务。 如果拿不定把握(有关Exim、DHCP...),可执行`ps aux'或检查`/etc/init.d/*'和`/etc/inetd.conf'下的内容,还可以使用节 9.2.1, `通过PAM和login实现访问权限管理'中提到的方法检查`/etc/hosts.deny'。`pidof'命令也很有用(参阅pidof(8)) 在新版的Debian中,默认状态下X11不允许TCP/IP(远程)连接。参阅节 9.4.6, `X的TCP/IP连接',使用SSH进行X传送也是禁用的,参阅节 9.4.8, `X远程联接:`ssh''。 ------------------------------------------------------------------------------- 7. Debian下的Linux内核 ---------------------- Debian运用自己的方式来编译内核及相关模块。参阅节 2.7, `Debian和系统内核'。 7.1. 内核编译 ------------- Debian unstable发行版中的`gcc'、`binutils'和`modutils'可用来编译最新的Linux内核。这方面的官方信息,参阅`/usr/share/doc/kernel-package/README.gz'文件的后半部分。 内核编译是个很困难的议题,由于目标在不断的变化,即使是最受人尊敬的开发者也会有不同的见解: Manoj Srivastava写到: `--initrd'需要Debian专用cramfs补丁。 Herbert Xu写到: 不,它不需要,想使用除CRAMFS以外的文件系统只需在`/etc/mkinitrd/mkinitrd.conf'中设置MKIMAGE。 按照Manoj和Kent撰写的`/usr/share/doc/kernel-package/README.gz'的指导小心行事,如果要编译最新版本的内核请确认安装了最新unstable版`kernel-package'软件包。 对于单机内核编译,`initrd'不是必须的。我用它是希望我新编译的内核与相应的内核镜像一模一样。如果使用`initrd',请先阅读一下mkinitrd(8)和mkinitrd.conf(5)。亦可参阅http://bugs.debian.org/149236。 7.1.1. Debian标准方式 --------------------- 关心一下有关`kernel-package'、`gcc'、`binutils'和`modutils'的错误报告。请按有关要求使用较新的版本。 在Debian系统中用源码编译自定义内核要特别小心。用`make-kpkg'的`--append_to_version'选项来创建多重内核镜像比较安全。 # apt-get install debhelper modutils kernel-package libncurses5-dev # apt-get install kernel-source-<2.4.18> # 使用最新版本 # apt-get install fakeroot # vi /etc/kernel-pkg.conf # 输入我的名字和email $ cd /usr/src # 创建目录 $ tar --bzip2 -xvf kernel-source-<2.4.18>.tar.bz2 $ cd kernel-source-<2.4.18> # 如果这是你的内核源码 $ cp /boot/config-<2.4.18-386> .config # 将当前配置设定为默认配置 $ make menuconfig # 按自己的喜好来定制 $ make-kpkg clean # 必须执行这步(per: man make-kpkg) $ fakeroot make-kpkg --append_to_version -<486> --initrd \ --revision= kernel_image \ modules_image # modules_image可以是pcmcia-cs*等。 $ cd .. # dpkg -i kernel-image*.deb pcmcia-cs*.deb # 安装 `make-kpkg kernel_image'实际上执行了`make oldconfig'和`make dep'。如果没使用initrd就不要使用`--initrd'选项。 如果想加载pcmcia-cs模块或没有pcmcia,应该在`make menuconfig'后选“General setup --->”进入“PCMCIA/CardBus support --->”,配置“< > PCMCIA/CardBus support”选项(例如,取消复选项)。 对于SMP机器,参照kernel-pkg.conf(5)的说明设置CONCURRENCY_LEVEL。 7.1.2. 经典方式 --------------- 从下列地址获得干净的源代码: * Linux: http://www.kernel.org/ * pcmcia-cs: http://pcmcia-cs.sourceforge.net/ 或使用Debian所附的等价的源代码: # cd /usr/src # tar xfvz linux-.tar.gz # rm -rf linux # ln -s linux- linux # tar xfvz pcmcia-cs-.tar.gz # ln -s pcmcia-cs- pcmcia # cd linux # make menuconfig ... 配置内核选项 ... # make dep # make bzImage ... 编辑lilo/grub ... ... 移动/usr/src/linux/arch/i386/boot/bzImage到boot ... ... /sbin/lilo or whatever you do for grub # make modules; make modules_install # cd ../pcmcia # make config # make all # make install ... 添加需要的模块名称到/etc/modules # shutdown -r now ... 启动到新内核 ... 7.1.3. 内核头文件 ----------------- 绝大多数“普通”程序不需要内核头文件,事实上如果直接引用它们会出错。这些程序应该引用那些_编译`glibc'_所用的头文件,它们位于Debian系统的`/usr/include/linux'和`/usr/include/asm'目录下。 故不要在`/usr/src/linux'目录中创建指向`/usr/include/linux'和`/usr/include/asm'的链接,一些过时的文档曾建议创建它们。 如果某些内核类应用程序_需要_特定的内核头文件,可修改`Makefile'(s),使其包含指向“`<特定内核头文件目录>/include/linux'”和“`<特定内核头文件目录>/include/asm'”的路径。 7.2. 模块化的2.4内核 -------------------- kerntl-mage-2.4.提供了新版的Debian 2.4内核,该版内核模块化程度极高。你必须激活相关的模块才能获得想要的内核功能。 尽管在接下来的部分中提供了许多通过配置`/etc/modules'来解决问题的样例,但据说,在`/etc/modutils/'中用一个文件来提供所有的设备别名,就可解决这类有关模块问题,当前的内核有足够多的别名供你使用。 参阅Linux内核源码目录中的`Documentation/*.txt'获取详细信息。 7.2.1. PCMCIA ------------- 要使用PCMCIA,需在`/etc/modules'中包含下列内容: # ISA PnP driver isa-pnp # Low level PCMCIA driver # yenta_socket # 我的机器上似乎不需要 剩下的工作就由PCMCIA脚本(来自`pcmcia-cs'软件包)、`depmod'和`kmod'负责了。我需要`isa-pnp'因为我的笔记本电脑使用的是旧ISA-PCMCIA。较新的笔记本电脑使用CardBus/PCMCIA,不再需要它。 慷慨的Miquel van Smoorenburg 说: “我将笔记中所有有关pcmcia的东西包括cardmgr等一鼓脑全删了,只装了支持cardbus的2.4版内核和woody中新的`hotplug'软件包。 只要你使用的是32-bit卡,你就不需要pcmcia软件包;2.4内置了cardservices。标准的tulip驱动亦可在dlink卡上正常工作。 ---Mike。” 7.2.2. SCSI ----------- [没有测试过] 想要SCSI工作,请在`/etc/modules'中包含如下内容: # SCSI core scsi_mod # SCSI generic driver sg # SCSI disk sd_mod # All other needed HW modules ... 可用`depmod'来操作上述某些模块。 7.2.3. 网络功能 --------------- `/etc/modules'中需要包含如下内容以扩充网络功能: # net/ipv-4 ip_gre ipip # net/ipv-4/netfilter # iptable (in order) ip_tables ip_conntrack ip_conntrack_ftp iptable_nat iptable_filter iptable_mangle # ip_nat_ftp ip_queue # ipt_LOG ipt_MARK ipt_MASQUERADE ipt_MIRROR ipt_REDIRECT ipt_REJECT ipt_TCPMSS ipt_TOS ipt_limit ipt_mac ipt_mark ipt_multiport ipt_owner ipt_state ipt_tcpmss ipt_tos ipt_unclean # #ipchains #ipfwadm 上述内容并没有进行优化。可用`depmod'来操作上述某些模块。 7.2.4. EXT3文件系统(> 2.4.17) ------------------------------- 对预编译内核镜像包(> 2.4.17)执行下述操作可激活EXT3日志文件系统。 # cd /etc; mv fstab fstab.old # sed 's/ext2/ext3,ext2/g' fstab # vi /etc/fstab ... 将root文件系统类型设置成“auto”而非“ext3,ext2” # cd /etc/mkinitrd # echo jbd >>modules # echo ext3 >>modules # echo ext2 >>modules # cd / # apt-get update; apt-get install kernel-image-<2.4.17-686-smp> ... 安装最新内核并配置boot(lilo从这儿运行) # tune2fs -j -i 0 # tune2fs -j -i 0 ... 将所有EXT2 FS转化成EXT3 # shutdown -r now 现在就可使用EXT3日志文件系统了。在`fstab'的“type”中使用`ex3、ext2'的是为了保险起见,如果内核不支持非root分区采用EXT3还可退回到EXT2。 如果你已安装了2.4版内核并且不想再次重装,执行上述步骤中`apt-get'命令之前的步骤就行了。接着: # mkinitrd -o /boot/initrd.img-<2.4.17-686-smp> /lib/modules/<2.4.17-686-smp> # lilo # tune2fs -j -i 0 # tune2fs -j -i 0 ... 将所有EXT2 FS转化成EXT3 # shutdown -r now 现在EXT3日志文件系统已生效。 如果没有设置`/etc/mkinitrd/modules'就`mkinitrd'运行,最好在系统启动时加载一些模块: ... 当initrd提示获取shell时(5秒钟),输入RETURN # insmod jbd # insmod ext3 # modprobe ext3会负责一切 # insmod ext2 # ^D ... 继续启动 在系统启动屏幕(`dmesg')中,会出现“cramfs: wrong magic”,别担心这没有什么害处。在Sarge(2002/10)中已解决了这个问题。参阅http://bugs.debian.org/135537和EXT3 File System mini-HOWTO (http://www.zip.com.au/~akpm/linux/ext3/ext3-usage.html),或者是`/usr/share/doc/HOWTO/en-txt/mini/extra/ext3-mini-HOWTO.gz'获得有关详情。 激活EXT3功能会造成某些系统发生严重内核死锁的情况,不过我没遇到过这种问题(我的内核是2.4.17)。 7.2.5. 2.4版内核对Realtek RTL-8139的支持 ---------------------------------------- 不知何故,RTL-8139支持模块已不再叫rtl8139,现在它叫8139too。从2.2版内核升级到2.4版时,请记得在`/etc/modules'中做相应修改。 7.2.6. 并行端口支持 ------------------- 对于`kernel-image-2.4.*',并行端口支持已被模块化,要激活可执行: # modprobe lp # echo lp >> /etc/modules 参阅Linux内核源码目录中的`Documentation/parport.txt'。 7.3. 通过proc文件系统调整内核 ----------------------------- 通过proc文件系统,可在运行状态下进行调整Linux内核行为。 在关在`/proc'文件系统下修改内核参数的基础知识,可参阅Linux源码包中的`Documentation/sysctl/*'文件。 调整内核参数的例子,可参考`/etc/init.d/networking'和节 3.7.5, `无法访问某此站点的怪问题'。 7.3.1. 打开了太多文件 --------------------- Linux内核有时会报告“Too many open files”,起因是`file-max'默认值(8096)太小。要解决这个问题,可以root身份执行下列命令(或将它们加入`/etc/rcS.d/*'下的init脚本。) # echo "65536" > /proc/sys/fs/file-max # 适用于2.2和2.4版内核 # echo "131072" > /proc/sys/fs/inode-max # 仅适用于2.2版内核 7.3.2. 磁盘缓存清除时间(Disk flush intervals) ----------------------------------------------- 可通过proc文件系统来修改磁盘缓存清除时间。下面的操作将默认的5秒时间间隔缩短到1秒。 # echo "40 0 0 0 100 30000 60 0 0" > /proc/sys/vm/bdflush 这可能对文件I/O性能产生一点儿负面影响。但它能保证文件内容是最近1秒的,比默认的5秒更短。对日志文件系统来说更是如此。 7.3.3. 迟缓的小内存旧机器 ------------------------- 对某些小内存的旧机器来说,在proc文件系统中打开内存的over-commit功能会很有效果: # echo 1 > /proc/sys/vm/overcommit_memory ------------------------------------------------------------------------------- 8. Debian技巧 ------------- 8.1. 启动系统 ------------- 参阅LDP BootPrompt-HOWTO (http://www.tldp.org/HOWTO/BootPrompt-HOWTO.html)获得有关系统提示的详细信息。 8.1.1. “我忘了root密码!”(1) ------------------------------ 只要能访问控制台键盘,不需要root密码就可以启动系统登录到root帐号。(假设BIOS或`lilo'之类的启动引导器在启动时不需要密码。) 整个过程不需要另外的启动盘或对BIOS设置进行修改。在此,“Linux”仅是一个标签,它代表启动Debian默认安装的Linux内核。 在`lilo'启动屏幕中,一但出现`boot:'(对某些系统而言,必须按下shift键以阻止自动启动),就输入: boot: Linux init=/bin/sh 它会指示系统启动内核后运行`/bin/sh'而不是`init'。现在你已获得root特权和root shell。由于当前`/'是以只读方式挂载,而其它的硬盘分区均未挂载,故你必须完成下列步骤才能获得一个有适当功能的系统。 init-2.03# mount -n -o remount,rw / init-2.03# mount -avt nonfs,noproc,nosmbfs init-2.03# cd /etc init-2.03# vi passwd init-2.03# vi shadow (如果在`/etc/passwd'文件中所有用户的第二个域的数据为“x”,就表明系统使用了影子密码,必须编辑`/etc/shadow'。)要删除root密码,请编辑密码文件中第二个数据域,将它设置为空白。重启系统不用密码就能登录到root。当系统启动进入runlevel 1时,Debian(至少是Potato以后的版本)需要密码,一些较老的版本则不需要。 在`/bin'下装一个小编辑器是个好习惯,因为有时`/usr'是无法访问的(参阅节 11.2, `应急的编辑器')。 如果安装`sash'软件包,当系统无法启动时,还可执行: boot: Linux init=/bin/sash 当`/bin/sh'不可用时,`sash'可作为`sh'的交互式替代品,它是静态链接,内建了许多标准工具(在系统提示符下输入“help”可获得参考列表)。 8.1.2. “我忘了root密码!”(2) ------------------------------ 从急救盘启动系统。假设`'是原始root分区,可用下面的方法编辑密码文件,与上述方法一样容易。 # mkdir # mount # cd /etc # vi shadow # vi passwd 与上面的方法相比,该方法的好处在于不需要知道`lilo'密码(如果有的话)。但如果系统没有预先设置为从软盘或CD启动,就需要访问BIOS的权限。 8.1.3. 无法启动系统 ------------------- 没在安装过程中制作启动盘?没关系。如果`lilo'损坏了,从Debian安装套件中拿出启动盘,用它来启动系统。假设你的root分区在`',你想进入runlevel 3,在启动提示符后输入: boot: rescue root= 3 接下来,系统使用软盘上的内核启动,你可登录到一个几乎拥有全部功能的系统了。(可能有少量特性或模块不可用。) 如果系统崩溃,亦可参阅节 6.3.6, `为无法启动的系统安装软件包'。 如果想做张自定义启动盘,参阅急救盘中的`readme.txt'文档。 8.1.4. “我不想直接启动到X!” ------------------------------ 玩`unstable/sid'很有趣,但在启动进程中执行不稳定的`xdm'、`gdm'、`kdm'和`wdm'会让你焦头烂额。 首先,在启动提示符后输入如下指令获得root shell: boot: vga=normal s 其中,代表你要启动的内核镜像,“vga=normal”告诉lilo在普通VGA屏幕下运行,“s”(或“S”)是传给`init'的参数,告诉它进入单用户模式。在提示符后输入root密码。 有多种方法禁用X启动deaemons: * run `update-rc.d dm stop 99 1 2 3 4 5 6 .' * insert "exit 0" at the start of all `/etc/init.d/dm' files. * rename all `/etc/rc<2>.d/S99dm' files to `/etc/rc2.d/K99dm'. * remove all `/etc/rc<2>.d/S99dm' files. * run `:>/etc/X11/default-display-manager' 其中,`rc<2>.d'必须与`/etc/inittab'中指定的runlevel一致。`dm'表示所有的`xdm'、`gdm'、`kdm'和`wdm'。 在Debian下只有第一种方法“最正确”。最后一种方法比较简单但只适用于Debian,而且还需要使用`dpkg-reconfigure'重新设置一次。其它方法都是通用的中止daemons的方法。 你仍可在任何控制台shell中输入`startx'启动X。 8.1.5. 其它用于启动提示符的技巧 ------------------------------- 使用`lilo'启动提示符,可指定系统启动到特定的runlevel和配置。详情参阅BootPrompt-HOWTO (http://www.tldp.org/HOWTO/BootPrompt-HOWTO.html) (LDP)。 如果希望系统启动到runlevel 4,可以`lilo'启动提示符后输入: boot: Linux 4 如果希望系统启动到正常功能的单用户模式,而且你知道root密码,可在`lilo'启动提示符后输入下列任一参数。 boot: Linux S boot: Linux 1 boot: Linux -s 如果希望系统以少于实际内存数的内存启动(也就是说机器有64MB内存,只分配48MB给系统使用),在`lilo'启动提示符后输入: boot: Linux mem=48M 注意,不要指定大于实际内存数的内存,否则内核会崩溃。如果你有多于64MB的内存,如128MB,应在系统启动时执行`mem=128M'或在`/etc/lilo.conf'中添加类似的命令行,否则旧内核或使用旧BIOS的主板将无法使用大于64MB的内存。 8.1.6. 如何设置启动参数(GRUB) ------------------------------- GRUB是Hurd项目开发的新型启动管理器,比Lilo更灵活,不过启动参数也与之稍有不同。 grub> find /vmlinuz grub> root (hd0,0) grub> kernel /vmlinuz root=/dev/hda1 grub> initrd /initrd grub> boot 请注意Hurd中的设备名: HURD/GRUB Linux MSDOS/Windows (fd0) /dev/fd0 A: (hd0,0) /dev/hda1 C: (usually) (hd0,3) /dev/hda4 F: (usually) (hd1,3) /dev/hdb4 ? 详情参阅`/usr/share/doc/grub/README.Debian'和`/usr/share/doc/grub-doc/html/'。 8.2. 活动记录 ------------- 8.2.1. 记录shell活动 -------------------- 比起普通的个人电脑环境,Unix环境的系统管理包含了更多细致的任务。必须掌握所有基本的配置方法以便进行系统故障恢复。基于X的GUI配置工具看上去又好又方便,但不适用于紧急状况。 记录shell活动是个好习惯,特别是root用户。 Emacs:使用`M-x shell'在缓冲区中开始记录,使用`C-x C-w'将缓冲区中的记录写入文件。 Shell:使用`screen'命令和“^A H”,参阅节 8.6.26, `用`screen'来定制控制台'或`script'命令: $ script Script started, file is typescript ... do whatever ... Control-D $ col -bx savefile $ vi savefile 还可使用下面的方法: $ bash -i 2>&1 | tee typescript 8.2.2. 记录X活动 ---------------- 如果需要X应用程序的活动记录图,包括xterm屏显,可使用`gimp'(GUI)。它可以对每个窗口或整个屏幕进行拍照。还可以使用`xwd'(`xbase-clients')、`import'(`imagemagick')或`scrot'(`scrot')。 8.3. 拷贝及创建子目录 --------------------- 8.3.1. 拷贝整个子目录的基本命令 ------------------------------- 如果想重新整理文件组织结构,可使用下面的方法移动文件及文件链接: 标准方法: # cp -a /source/directory /dest/directory # requires GNU cp # (cd /source/directory && tar cf - . ) | \ (cd /dest/directory && tar xvfp - ) 如果包含硬链接,则需要更严谨的方法: # cd /path/to/old/directory # find . -depth -print0 | afio -p -xv -0a /mount/point/of/new/directory 如果是远程操作: # (cd /source/directory && tar cf - . ) | \ ssh user@host.dom (cd /dest/directory && tar xvfp - ) 如果没有链接文件: # scp -pr user1@host1.dom:/source/directory \ user2@host2.dom:/dest/directory 其中,`scp' <==> `rcp',`ssh' <==> `rsh'。 下面的有关拷贝整个子目录的信息由Manoj Srivastava 发表于debian-user@lists.debian.org。 8.3.2. `cp' ----------- 传统上,`cp'并不能真正完成这个任务,因为它既没对符号链接进行区别对待,又不能保存硬链接。另一件需要注意的事就是稀疏文件(有洞的文件)。 GNU `cp'克服了这缺陷,然而对于非GNU系统,`cp'仍存在问题。而且使用`cp'无法生成小巧轻便的文档包。 % cp -a . newdir 8.3.3. `tar' ------------ Tar克服了`cp'在处理符号链接时出现的问题,然而,`cpio'可以处理特殊文件,传统的`tar'却不行。 对于某个有多重硬链接的文件,`tar'的处理方法是只将其中一个链接拷贝到磁带上,所以日后你只能找回拷贝中所保留那个的链接所指的文件;`cpio'会为每个链接做一个拷贝,日后你可以找回任意一个链接所指的文件。 在Potato和Woody中,操作`.bz2'文件的`tar'命令参数有所变化,所以请在脚本中使用`--bzip2'而不要简写为`-I'(Potato)或`-j'(Woody)。 8.3.4. `pax' ------------ 全新的,符合POSIX(IEEE Std 1003.2-1992, pages 380--388 (section 4.48) and pages 936--940 (section E.4.48))标准的,众望所归的,轻便的文档包交互工具。`pax'可以读、写以及列出文档包的成员,并能拷贝文件目录层次。`pax'的操作独立于特定的文档包格式,支持各种各样不同的文档包格式。 `pax'工具刚刚成形,还很新。 # apt-get install pax $ pax -rw -p e . newdir or $ find . -depth | pax -rw -p e newdir 8.3.5. `cpio' ------------- `cpio'从`cpio'或`tar'文档包提取/放入文件。该文档包可以是硬盘上的另一个文件,也可以是磁带或管道。 $ find . -depth -print0 | cpio --null --sparse -pvd new-dir 8.3.6. `afio' ------------- `afio'更善于处理`cpio'格式的文档包。通常它比cpio要快,且提供了更多磁带选项,并且能更友好的处理有讹误的输入数据。它支持交互式处理多卷文档包。用`afio'制作压缩文档包比压缩`tar'或`cpio'文档包更安全。在备份处理脚本中`afio'是更佳的“文档处理引擎”。 $ find . -depth -print0 | afio -px -0a new-dir 对所有的磁带备份我都使用`afio'。 8.4. 差异备份与数据同步 ----------------------- 要进行差异备份和数据同步可使用下列几种方法: * `rcs':备份并进行历史记录,只支持文本。 * `rdiff-backup':备份并进行历史记录。支持链接。 * `pdumpfs':对文件系统进行备份和历史记录。支持链接。 * `rsync':单路同步。 * `unison':双路同步。 * `cvs':多路同步服务器备份并进行历史记录,只支持文本,技术成熟。参阅节 12.1, `CVS'。 * `arch':多路同步服务器备份并进行历史记录,但包括“处于工作中的目录”。 * `subversion':多路同步服务器备份并进行历史记录,专用于Apache。 有关将这些方法与文档包操作结合应用的讨论参阅节 8.3, `拷贝及创建子目录',有关自动进行备份的讨论参阅节 8.6.25, `日程安排(`cron',`at')'。 我只讲解三个较容易使用的工具。 8.4.1. 使用rdiff进行差异备份 ---------------------------- `Rdiff-backup'提供了简单好用的方法对任何文件包括链接进行历史差异备份。例如要对`~/'目录下的所有文件备份到`/mnt/backup': $ rdiff-backup --include ~/tmp/keep --exclude ~/tmp ~/ /mnt/backup 从该文档包中取出3天前的旧数据恢复到`~/old'目录: $ rdiff-backup -r 3D /mnt/backup ~/old 参阅rdiff-backup(1)。 8.4.2. 使用`pdumpfs'进行每日备份 -------------------------------- `pdumpfs'是一种简单的每日备份系统,与Plan9的`dumpfs'一样,它每天都保存系统快照。任何时候都可以用它来恢复到某天的系统状态。请使用`pdumpfs'和`cron'来备份你的home目录。 在目标目录中,`pdumpfs'以`YYYY/MM/DD'的方式来组织系统快照。第一次运行时,它将所有源文件拷贝到快照目录。从每二次运行起,`pdumpfs'仅拷贝更新的或新建的文件,对于没有改变的文件用硬链接方式指向前一天的系统快照,以此来节省硬盘空间。 $ pdumpfs [] See pdumpfs(8). 8.4.3. 使用RCS进行定期差异备份 ------------------------------ `Changetrack'会定期对RCS文档包中基于文本格式的配置文件的变化进行记录。参阅changetrack(1)。 # apt-get install changetrack # vi changetrack.conf 8.5. 系统冻结恢复 ----------------- 8.5.1. 中止一个进程 ------------------- 运行`top'看看什么进程的活动有异常。按“P”以cpu使用率排序,“M”以内存使用率排序,“k”可以中止一个进程。还有一种方法,使用BSD风格的`ps aux | less'或System V风格的`ps -efH | less'。System V风格的排列会显示父进程ID `PPID',这对中止出错的(死掉的)子进程十分有用。 知道了进程的ID,就可使用`kill'中止(或发信号给)某个进程,`killall'的作用正如其名一样。经常使用的信号有: 1: HUP,重启daemon 15: TERM,普通中止 9: KILL,强令中止 8.5.2. ALT-SysRq ---------------- 内核编译选项“Magic SysRq key”提供系统强心针。在i386机器上按下`ALT-SysRq'组合键后,试试按下列各键`r 0 k e i s u b',奇迹产生了: Un'r'aw让键盘从X崩溃中重生。将控制台loglevel改为'0'以减少错误信息。sa'k'(system attention key)中止当前虚拟控制台的所有进程。t'e'rminate中止当前终端除init外的所有进程。k'i'll中止除init外的所有进程。 'S'ync,'u'mount和re'b'oot帮你逃离真正的险境。 本文写作之时,Debian默认安装的内核并未将该选项编译进去,需要重新编译内核激活该功能。详情参阅`/usr/share/doc/kernel-doc-version/Documentation/sysrq.txt.gz'或`/usr/src//Documentation/sysrq.txt.gz'。 8.6. 记住这些可爱的小命令 ------------------------- 8.6.1. Pager ------------ `less'就是pager(文件内容浏览器)。按“h”可获得帮助。它比`more'更有用。在shell启动脚本中运行`eval $(lesspipe)'或`eval $(lessfile)'可以让`less'活力四射。详情参阅`/usr/share/doc/lessf/LESSOPEN'。使用`-R'选项可输出生癖字符and enables ANSI color escape sequences.参阅less(1)。 对于某些编码系统(EUC)`w3m'可能是更好的选择。 8.6.2. 释放内存 --------------- `free'和`top'能让你了解内存资源的许多有用信息。别担心“Mem:”行中“used”的大小,看看它下面的数字(本例的数字是38792)。 $ free -k # for 256MB machine total used free shared buffers cached Mem: 257136 230456 26680 45736 116136 75528 -/+ buffers/cache: 38792 218344 Swap: 264996 0 264996 物理内存的准确大小可通过`grep '^Memory' /var/log/dmesg'得到,本例将显示“Memory: 256984k/262144k available (1652k kernel code, 412k reserved, 2944k data, 152k init)”。 Total = 262144k = 256M (1k=1024, 1M=1024k) Free to dmesg = 256984k = Total - kernel - reserved - data - init Free to shell = 257136k = Total - kernel - reserved - data 约有5MB内存系统不能使用,因为内核需要它。 8.6.3. 设定时间(BIOS) ----------------------- # date MMDDhhmmCCYY # hwclock --utc --systohc # hwclock --show 设定系统时间和硬件时间为MM/DD hh:mm, CCYY。显示时间为本地时间而硬件时间使用UTC。 8.6.4. 设定时间(NTP) ---------------------- 参考:Managing Accurate Date and Time HOWTO (http://www.tldp.org/HOWTO/TimePrecision-HOWTO/index.html)。 8.6.4.1. 拥有永久Internet连接的系统设置时间 ------------------------------------------- 设置系统时钟通过远程服务器自动对时: # ntpdate 如果你的系统拥有永久的Internet连接,应该将该命令加入`/etc/cron.daily'。 8.6.4.2. 偶尔进行Internet连接的系统设置时间 ------------------------------------------- 使用`chrony'软件包。 8.6.5. 如何禁用屏幕保护程序 --------------------------- 对于Linux控制台: # setterm -powersave off 启动kon2(kanji)控制台可执行: # kon -SaveTime 0 运行X可执行: # xset s off 或 # xset -dpms 或 # xscreensaver-command -prefs 参阅相关的帮助页面。 8.6.6. 搜索系统管理数据库 ------------------------- Glibc提供了getent(1)搜索管理数据库的各类项目。例如passwd、group、hosts、services、protocols、networks。 getent database [key ...] 8.6.7. 禁用声音(响铃) ----------------------- 最直接的方法是拔掉PC喇叭;-),对于Bash shell可执行: echo "set bell-style none">> ~/.inputrc 8.6.8. 控制台上的错误信息 ------------------------- 不想看屏幕显示的错误信息,首选的方法是检查`/etc/init.d/klogd',在该脚本中设置`KLOGD="-c <3>"'然后运行`/etc/init.d/klogd restart'。另一种方法是执行`dmesg -n<3>'。 这儿是各种错误级别的含义: * 0: KERN_EMERG, 系统不可用 * 1: KERN_ALERT, 必须立即执行 * 2: KERN_CRIT, 紧急状态 * 3: KERN_ERR, 错误状态 * 4: KERN_WARNING, 警告状态 * 5: KERN_NOTICE, 正常状态且十分重要 * 6: KERN_INFO, 报告 * 7: KERN_DEBUG, debug-level信息 如果你很厌恶详细而无用的错误信息,可以试试这个小补丁`shutup-abit-bp6'(位于样例脚本子目录 (http://www.debian.org/doc/manuals/debian-reference/examples/))。 另一个该看看的地方是`/etc/syslog.conf';,检查一下是否有信息记录被发送到了控制台设备。 8.6.9. 正确设置控制台类型 ------------------------- 在类Unix系统中,访问控制台屏幕通常要调用库例程,这就为用户提供了一种独立于终端的方式来优化字符的屏幕更新过程。参阅ncurses(3X)和terminfo(5)。 在Debian系统中,有大量预定义项目: $ toe | less # 所有项目 $ toe /etc/terminfo/ | less # 用户可再配置的项目 你的选择可导出到环境变量`TERM'。 当登录到远程Debian系统时,如果xterm的terminfo项目在非Debian的xterm中失效,请将终端类型改为支持较少特性的版本如“xterm-r6”。 参阅`/usr/share/doc/libncurses5/FAQ'。“dumb”是terminfo的最小公分母。 8.6.10. 恢复控制台的健壮性 -------------------------- 如果执行`$ cat '后屏幕一片混乱(命令的返回值与你的输入大相径庭): $ reset 8.6.11. 将DOS下的文本文件转换为Unix类型 --------------------------------------- 将DOS文本文件(行尾=^M^J)转换成Unix文本文件(行尾=^J)。 # apt-get install sysutils $ dos2unix 8.6.12. 正规表达式的置换 ------------------------ 将所有文件 ...中的所有字段替换成字段。 $ perl -i -p -e 's///g;' ... `-i'表示“就地编辑”,`-p'表示“在...各文件中循环”。如果置换很复杂,应使用参数`-i.bak'而非`-i',这有助于出错恢复;它会将每个原始文件保存为以`.bak'为后缀的备份文件。 8.6.13. 使用脚本来编辑文件 -------------------------- 下面的脚本将删除5-10行以及16-20行。 #!/bin/bash ed $1 <: $ diff -u > $ diff -u > diff文件(也称补丁文件)通常用于发送程序更新。收到的补丁文件可使用下面的方法更新另一个<文件>: $ patch -p0 < $ patch -p1 < 如果有3个版本的源代码,使用`diff3'来合并效率更高: $ diff3 -m > 8.6.15. 分割大文件 ------------------ $ split -b 650m # 将大文件分块成多个650MB的小文件 $ cat x* > # 将所有小文件合并成一个大文件 8.6.16. 从文本格式的表格中抽取数据 ---------------------------------- 假设有一个文本文件名为`DPL',其中存放着所有前Debian项目领导人的名字和他们的上台日期,表格格式是以空格做为分隔的。 Ian Murdock August 1993 Bruce Perens April 1996 Ian Jackson January 1998 Wichert Akkerman January 1999 Ben Collins April 2001 Bdale Garbee April 2002 Martin Michlmayr March 2003 AWK经常用于从这类数据中提取数据。 $ awk '{ print $3 }' # run command for all items from stdin xargs -n 1 echo | # split white-space-separated items into lines xargs echo | # merge all lines into a line grep -e | # extract lines containing cut -d: -f3 -| # extract third field separated by : (passwd file etc.) awk '{ print $3 }' | # extract third field separated by whitespaces awk -F'\t' '{ print $3 }' | # extract third field separated by tab col -bx | # remove backspace and expand tabs to spaces expand -| # expand tabs sort -u| # sort and remove duplicates tr '\n' ' '| # concatenate lines into one line tr '\r' ''| # remove CR tr 'A-Z' 'a-z'| # convert uppercase to lowercase sed 's/^/# /'| # make each line a comment sed 's/\<.ext>//g'| # remove <.ext> sed -n -e 2p| # print the second line head -n 2 -| # print the first 2 lines tail -n 2 -| # print the last 2 lines 8.6.18. 短小的Perl脚本 ---------------------- 任何Awk脚本均可使用Perl重写,例如 awk '($2=="1957") { print $3 }' | 可以使用下列任意一行实现: perl -ne '@f=split; if ($f[1] eq "1957") { print "$f[2]\n"}' | perl -ne 'if ((@f=split)[1] eq "1957") { print "$f[2]\n"}' | perl -ne '@f=split; print $f[2] if ( $f[1]==1957 )' | perl -lane 'print $F[2] if $F[1] eq "1957"' | 其实上面各行中所有perl参数中的空格均可去掉,这得益于Perl的数字字符串自动转换功能。 perl -lane 'print$F[2]if$F[1]eq+1957' | 有关命令行参数的信息可参阅perlrun(1),在http://perlgolf.sourceforge.net有更多令人着魔的Perl脚本,你会感兴趣的。 8.6.19. 从网页上获取文本或邮件列表文档 -------------------------------------- 下面的操作将网页转化为文本文件。从网上拷贝配置文件时十分有用。 $ lynx -dump http:// > `links'和`w3m'也可以这么用,只是生成的文本样式可能略有不同。 如果是邮件列表文档,可使用`munpack'从文本获得mime内容。 8.6.20. 打印网页 ---------------- 下面的操作将网页内容打印成PostScript文件或发送到打印机。 $ apt-get install html2ps $ html2ps | lpr 参阅节 3.6.1, ``lpr'/`lpd''。还可使用`a2ps'和`mpage'软件包生成PostScript文件。 8.6.21. 打印帮助页面 -------------------- 下面的操作将帮助页面打印成PostScript文件或发送到打印机。 $ man -Tps | lpr $ man -Tps | mpage -2 | lpr 8.6.22. 合并两个Postscript或PDF文件 ----------------------------------- 可以将两个Postscript文件或PDF文件合并。 $ gs -q -dNOPAUSE -dBATCH -sDEVICE=pswrite \ -sOutputFile= -f $ gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite \ -sOutputFile= -f 8.6.23. 命令耗时 ---------------- 显示某进程的耗时 # time >/dev/null real 0m0.035s # time on wall clock (elapsed real time) user 0m0.000s # time in user mode sys 0m0.020s # time in kernel mode 8.6.24. `nice'命令 ------------------ 使用`nice'(来自GNU `shellutils'软件包)可设置命令启动时的nice值。`renice'(`bsdutils')或`top'可以重设进程的nice值。nice值为19代表最慢的(优先级最低的)进程;负值就“not-nice”,如-20代表非常快的(优先级高的)进程。只有超级用户可以设定负nice值。 # nice -19 # very nice # nice --20 # very fast 有时极端的nice值对系统弊大于利,所以使用该命令要小心。 8.6.25. 日程安排(`cron',`at') -------------------------------- 在Linux下使用`cron'和`at'进行任务日程安排。参阅at(1)、crontab(5)、crontab(8)。 执行命令`crontab -e'创建或编辑crontab文件,为规律事务(按周期循环的事务)安排日程。下面的一个crontab文件样例: # use /bin/sh to run commands, no matter what /etc/passwd says SHELL=/bin/sh # mail any output to `paul', no matter whose crontab this is MAILTO=paul # Min Hour DayOfMonth Month DayOfWeek command (Day... are OR'ed) # run at 00:05, every day 5 0 * * * $HOME/bin/daily.job >> $HOME/tmp/out 2>&1 # run at 14:15 on the first of every month -- output mailed to paul 15 14 1 * * $HOME/bin/monthly # run at 22:00 on weekdays(1-5), annoy Joe. % for newline, last % for cc: 0 22 * * 1-5 mail -s "It's 10pm" joe%Joe,%%Where are your kids?%.%% 23 */2 1 2 * echo "run 23 minutes after 0am, 2am, 4am ..., on Feb 1" 5 4 * * sun echo "run at 04:05 every sunday" # run at 03:40 on the first Monday of each month 40 3 1-7 * * [ "$(date +%a)" == "Mon" ] && command -args 执行`at'命令为偶然任务(只执行一次的任务)安排日程: $ echo ''| at 3:40 monday 8.6.26. 用`screen'来定制控制台 ------------------------------ The `screen'程序允许在_单一_的物理终端或终端模拟窗口运行_多个_伪终端,每个伪终端都拥有自己的交互式shell。即便可以使用Linux伪终端或多个xterm窗口,研究一下如何设置`screen'_丰富的特性_仍很有益,这些特性包括: * 回溯历史显示, * 拷贝和粘贴, * 输出到日志, * 图形入口, * 将终端与整个`screen'会话_分离_,稍后再连接。 8.6.26.1. 远程访问方案 ---------------------- If you frequently log on to a Linux machine 如果你经常从远程终端登录到Linux机器或使用VT100终端程序,`screen'的_detach_(分离)特性将简化你的生活。 1. 通过拔号连接登录,运行了一个非常复杂的`screen'会谈,打开了好几个窗口,有编辑器和其它一些程序。 2. 突然你需要离开终端一下,但你并不想挂断连接中止工作。 3. 输入`^A d'_离开_会话,然后登出系统。(或者更简单些,输入`^A DD'离开会话并自动登出系统) 4. 当你回来时,需要再次登录,可输入命令`screen -r',`screen'会如魔法般地重新连接上所有打开的窗口。 8.6.26.2. 典型的`screen'命令 ---------------------------- 一但打开了`screen'程序,除了命令按键(默认为`^A')所有的键盘输入都被送到当前窗口,所有的`screen'命令均按特定方式输入:`^A'加一个单键命令[加一些参数]的。常用的命令有: ^A ? 显示帮助屏幕(显示命令集) ^A c 创建并切换到新窗口 ^A n 跳到下一个窗口 ^A p 跳到上一个窗口 ^A <0> 跳到<0>号窗口 ^A w 显示窗口列表 ^A a 将Ctrl-A做为键盘输入发送到当前窗口 ^A h 对当前窗口做硬拷贝写入到文件 ^A H 开始/中止将当前窗口事件记录到文件 ^A ^X 锁定终端(密码保护) ^A d 从终端分离屏幕会话 ^A DD 分离屏幕会话并退出登录 以上只是`screen'命令的一个很小的子集。只要是你认为`screen'能干的事,没准它真就可以!详情参阅screen(1)。 8.6.26.3. `screen'会话中的退格键和Ctrl-H ---------------------------------------- 在运行`screen'时,如果发现退格键和/或Ctrl-H无法正常工作,可编辑`/etc/screenrc',找到这行: bindkey -k kb stuff "\177" 将这注释掉(例如在句首添加“#”)。 8.6.26.4. X下与`screen'等价的程序 --------------------------------- 找找`xmove'。参阅xmove(1)。 8.6.27. 网络测试基础 -------------------- 安装`netkit-ping'、`traceroute'、`dnsutils'、`ipchains'(适用于2.2版内核)、`iptables'(适用于2.4版内核)和`net-tools'软件包,然后执行: $ ping # 检查Internet连接 $ traceroute # 跟踪IP数据包 $ ifconfig # 检查主机设置 $ route -n # 检查路由设置 $ dig <[@dns-server.com] host.dom [{a|mx|any}]> |less # 检查 DNS记录 # 查找<{mx|any}>记录 $ ipchains -L -n |less # 检查包过滤(2.2 kernel) $ iptables -L -n |less # 检查包过滤(2.4 kernel) $ netstat -a # 查找系统上所有打开的端口 $ netstat -l --inet # 查找系统监听的端口 $ netstat -ln --tcp # 查找系统监听的TCP端口(端口数字) 8.6.28. 从本地缓冲池中清空(flush)邮件 --------------------------------------- 从本地缓冲池中清空邮件: # exim -q # 清空待读邮件 # exim -qf # 清空所有邮件 # exim -qff # 清空冻结邮件 `-qff'选项用在`/etc/ppp/ip-up.d/exim'脚本中效果更好。 8.6.29. 删除本地缓冲池中的冻结邮件 ---------------------------------- 删除本地缓冲池中的冻结邮件并返回出错信息: # exim -Mg `mailq | grep frozen | awk '{ print $3 }'` 8.6.30. 再分发mbox中的信件 -------------------------- 如果home目录没有空间继续处理邮件,就需要对磁盘空间进行扩容,扩容完成后需要手工分发`/var/mail/'目录中的邮件到home目录中的分类邮箱,执行: # /etc/init.d/exim stop # formail -s procmail # /etc/init.d/exim start 8.6.31. 清空文件内容 -------------------- 要清空某些文件如日志文件的内容,千万不要使用`rm'删除文件然后再创建一个新的空文件,因为在两次操作的间隔,系统可能需要访问该文件。下面是清空文件内容的安全方法: $ :> 8.6.32. 空文件 -------------- 下面的命令可以创建空文件: $ dd if=/dev/zero of= bs=1k count=5 # 5KB of zero content $ dd if=/dev/urandom of= bs=1m count=7 # 7MB of random content $ touch # create 0B file (if file exists, updates mtime) 例如,最实用的用法是从Debian启动软盘的shell中执行下列命令将硬盘`/dev/hda'的内容完全清空。 # dd if=/dev/urandom of=/dev/hda ; dd if=/dev/zero of=/dev/hda 8.6.33. `chroot' ---------------- `chroot'程序,chroot(8),不需要重启系统,就可以在单独的系统上同时运行多个不同的GNU/Linux环境。 还可以在较快主机的chroot下运行某些需耗大量系统资源内存的程序如`apt-get'和`dselect',并将较慢子机的硬盘通过NFS方式挂载到主机,开放读/写权限,在主机上以chroot方式操作子机。 8.6.33.1. 用`chroot'来运行不同版本的Debian ------------------------------------------ 在Woody中使用`debootstrap'命令很容易构造chroot Debian体系。例如,在一台拥有快速Internet连接的机器的下创建一个Sid chroot: main # cd / ; mkdir main # debootstrap sid ... watch it download the whole system main # echo "proc-sid /proc proc none 0 0" >> /etc/fstab main # mount proc-sid /proc -t proc main # cp /etc/hosts /etc/hosts main # chroot /bin/bash chroot # apt-setup # set-up /etc/apt/sources.list chroot # vi /etc/apt/sources.list # point the source to unstable chroot # dselect # you may use aptitude, install mc and vim :-) 现在你就拥有了一个全功能Debian子系统,可以尽情享受而不必担心主Debian受到不利影响。 该`debootstrap'应用技巧还可以实现在没有Debian安装盘的情况下,从另一个GNU/Linux发行版下安装Debian。参阅http://www.debian.org/releases/stable/i386/ch-preparing#s-linux-upgrade。 8.6.33.2. 设置`chroot'登录 -------------------------- 输入`chroot /bin/bash'非常简单,但这将沿用当前的所有环境变量,你可能并不希望这样并且有时还会出问题。更好的方法是,在别的虚拟终端上执行另一个登录进程,登录到chroot目录。 在Debian系统中默认从`tty1'到`tty6'运行Linux控制台,`tty7'运行X Window系统,在本例中,我们将`tty8'设置成chroot控制台。按照节 8.6.33.1, `用`chroot'来运行不同版本的Debian'中的描述创建好chroot系统后,就可以在主系统的root shell中输入: main # echo "8:23:respawn:/usr/sbin/chroot "\ "/sbin/getty 38400 tty8" >> /etc/inittab main # init q # reload init 8.6.33.3. 配置`chroot'下的X --------------------------- 想在chroot下安全地运行最新版的X和GNOME吗?完全可以!下面的例子将实现在虚拟终端`vt9'下运行GDM。 首先,按照节 8.6.33.1, `用`chroot'来运行不同版本的Debian'中描述的方法安装好chroot系统,从主系统的root下拷贝关键配置文件到chroot系统。 main # cp /etc/X11/XF86Config-4 /etc/X11/XF86Config-4 main # chroot # or use chroot console chroot # apt-get install gdm gnome x-window-system chroot # vi /etc/gdm/gdm.conf # do s/vt7/vt9/ in [servers] section chroot # /etc/init.d/gdm start 在此,编辑`/etc/gdm/gdm.conf',使其在`vt7'到`vt9'上创建虚拟终端。 现在可以很容易地能过切换Linux虚拟终端来实现在主系统的X环境和chroot系统的X环境之间转换,例如使用Ctrl-Alt-F7和Ctrl-Alt-F9。酷吧! [FIXME] 在chroot系统下gdm的init脚本中添加一条注释和一条链接。 8.6.33.4. 使用`chroot'来运行其它发行版 -------------------------------------- 很容易创建一个包含其它发行版的chroot环境。使用其它发行版的安装程序将它们安装到单独的硬盘分区中。例如root分区位于`'。 main # cd / ; mkdir main # mount -t ext3 main # chroot /bin/bash 接下来的工作与节 8.6.33.1, `用`chroot'来运行不同版本的Debian'、节 8.6.33.2, `设置`chroot'登录'和节 8.6.33.3, `配置`chroot'下的X'中描述的内容基本相似。 8.6.33.5. 使用`chroot'来编译软件包 ---------------------------------- 这儿有一个很特殊的chroot软件包`pbuilder',它构造一个chroot系统并在其中编译软件包。该体系可用于检查软件包编译时关联关系是否正确,并确保编译生成的软件包中没有不必要的或错误的关联关系。 8.6.34. 怎样检查硬链接 ---------------------- 检查两个文件是否是指向同一个文件的两个硬链接: $ ls -li 8.6.35. `mount'硬盘上的镜像文件 ------------------------------- 如果`'文件是硬盘内容的镜像文件,而且原始硬盘的配置参数为 = (bytes/sector) * (sectors/cylinder),那么,下面的命令将其挂载到`/mnt': # mount -o loop,offset= /mnt 注意绝大部分的硬盘都是512 bytes/sector。 8.6.36. Samba ------------- 获取Windows文件的基本方法: # mount -t smbfs -o \ # mount Windows files to Linux # smbmount \ -o "" # smbclient -L <192.168.1.2> # list the shares on a computer 可从Linux检查Samba网上邻居: # smbclient -N -L | less # nmblookup -T "*" 8.6.37. 外来文件系统的操作工具 ------------------------------ Linux内核支持多种外来文件系统,想访问它们只需将其挂载到合适的文件系统下就行了。对某些文件系统,还提供专门工具不需要挂载,只依靠用户空间的程序,不需要内核提供文件系统支持,就能完成访问。 * `mtools': for MSDOS filesystem (MS-DOS, Windows) * `cpmtools': for CP-M filesystem * `hfsutils': for HFS filesystem (native Macintosh) * `hfsplus': for HFS+ filesystem (modern Macintosh) 对于创建和检查MS-DOS FAT文件系统`dosfstools'非常有用。 ------------------------------------------------------------------------------- 9. Debian系统微调 ----------------- 本章讲述了基本的基于文本界面的系统配置方法。在学习本章前请先阅读章 3, `Debian系统安装提示'. 如是你很关心安全方面的信息,强烈推荐你阅读Securing Debian Manual (http://www.debian.org/doc/manuals/securing-debian-howto/),它位于`harden-doc'软件包。 9.1. 系统初始化提示 ------------------- 参阅节 2.4.1, ``init'程序'了解有关Debian init脚本的基础知识。 9.1.1. 自定义init脚本 --------------------- Debian使用sys-V init脚本系统。尽管`/etc/init.d/*'下所有的init脚本均被登记为conffile,系统管理员可以自由地修改它们,但编辑`/etc/default/*'下的文件却是创建自定义init脚本的更好的方法。 例如,`/etc/init.d/rcS'可用来定制`motd'、`sulogin'等为默认启动。 9.1.2. 自定义系统日志 --------------------- 可通过`/etc/syslog.conf'配置系统日志记录方式。如果想为日志文件上色可安装`colorize'软件包。参阅syslogd(8)和syslog.conf(5)。 9.1.3. 硬件存取优化 ------------------- 有一部分硬件优化的配置工作Debian留给了系统管理员来掌握。 * `hdparm' * 硬盘存取优化。成效显著。 * 危险。务必先阅读hdparm(8)。 * `hdparm -tT ' 测试硬盘存取速度。 * `hdparm -q -c3 -d1 -u1 -m16 ' 加速新型IDE系统。(有一定风险。) * `setcd' * 压缩磁盘存取优化。 * `setcd -x <2>'减速至<2>x speed。 * 参阅setcd(1)。 * `setserial' * 串行接口管理工具集。 * `scsitools' * SCSI硬件管理工具集。 * `memtest86' * 内存硬件管理工具集。 * `hwtools' * 低级硬件管理工具集。 * irqtune:修改设备的IRQ优先级,使那些需要高优先级和快速服务的硬件(例如,串行接口、调制解调器)获得它所要的资源。对串口/调制解调器加速后获得原来3倍的吞吐量。 * scanport:扫描I/O空间的0x100至0x3ff地址段,查找已安装的ISA设备。 * inb:一个小巧的黑客工具,用来阅读I/O端口信息并将其值转换成十六进制和二进制。 * `schedutils' * Linux日程安排工具包。 * 包括`taskset'、`irqset'、`lsrt'和`rt'。 * 再加上`nice'和`renice'(不包括在工具包内),就可对进程的日程安排进行全面的管理。 使用noatime选项挂载文件系统可有效提高文件的读取速度。参阅fstab(5)和mount(8)。 通过proc文件系统,Linux内核可直接调节某些硬件参数。参阅节 7.3, `通过proc文件系统调整内核'。 Debian中有许多专门的硬件配置工具包。它们中有不少是针对笔记本电脑的。这儿有一些有趣的软件包: * `tpconfig' - 一个配置触摸屏设备的程序 * `apmd' - 高级电源管理(APM)工具 * `acpi' - 显示ACPI设备信息 * `acpid' - ACPI使用工具 * `lphdisk' - 识别Phoenix NoteBIOS下的隐藏分区。 * `sleepd' - 笔记本电脑处于非工作状态时进入休眠 * `noflushd' - 让空闲硬盘进入减速状态 * `big-cursor' - X下的巨型鼠标指针 * `acme' - 激活笔记本电脑上的“多媒体按钮” * `tpctl' - IBM ThinkPad硬件配置工具 * `mwavem' - Mwave/ACP modem支持 * `toshset' - 访问大部分Toshiba笔记本电脑的硬件接口 * `toshutils' - Toshiba笔记本电脑工具集 * `sjog' - 激活Sony Vaio笔记本电脑上“Jog Dial”功能的程序 * `spicctrl' - Sony Vaio控制器程序可增亮LCD背光 在此,ACPI是一种比APM更新式的电源管理系统。 某些软件包需要专门的内核模块。它们已经包含在许多最新的内核源码中。如果遇以问题,则需要手动打上最新的内核补丁。 9.2. 访问权限控制 ----------------- 9.2.1. 通过PAM和login实现访问权限管理 ------------------------------------- PAM(Pluggable Authentication Modules 可嵌入认证模块)提供了登录管理。 /etc/pam.d/* # PAM管理文件 /etc/pam.d/login # PAM登录管理文件 /etc/security/* # PAM模块参数 /etc/securetty # 管理通过控制台进行的root登录(login) /etc/login.defs # 管理登录行为(login) 如果想在控制台终端不用密码直接登录系统,可按下面的方法修改`/etc/pam.d/login'文件的内容,风险自负。 #auth required pam_unix.so nullok auth required pam_permit.so 该方法亦可用于`xdm'、`gdm',实现无密码X控制台。 相反,如果你希望强化密码政策,可安装`cracklib2'并按下面的方法修改`/etc/pam.d/passwd': password required pam_cracklib.so retry=3 minlen=6 difok=3 使用一次性登录密码激活帐户也很有用,要实现该功能,在passwd命令后加上`-e'参数,参阅passwd(1)。 要设置系统最大进程数,可在Bash shell中设定`ulimit -u 1000'或设置PAM的`/etc/security/limits.conf'文件。其它参数如`core'等的设置方法与之类似。`PATH'的初始值可在`/etc/login.defs'中先于shell启动脚本设置。 PAM的文档位于`libpam-doc'软件包内。其中《The Linux-PAM System Administrator's Guide 》一文涵盖了PAM配置、可用模块等内容,文档中还包含《The Linux-PAM Application Developers' Guide》和《The Linux-PAM Module Writers' Guide》。 9.2.2. “为什么GNU `su'命令不支持`wheel' group” ------------------------------------------------ 这是Richard M. Stallman的一句名言,位于旧版`info su'页面末尾。别担心:在Debian中,当前版本的`su'使用PAM,因此你可以用`/etc/pam.d/su'下的`pam_wheel.so'来限制任何用户组使用`su'的能力。下面的操作将在Debian系统中赋予`adm'用户等同于BSD `wheel'用户组的权限,而且该组成员不需要密码就能使用`su'命令。 # anti-RMS configuration in /etc/pam.d/su auth required pam_wheel.so group=adm # Wheel members to be able to su without a password auth sufficient pam_wheel.so trust group=adm 9.2.3. 各种用户组的含义 ----------------------- 一些有趣的用户组: * 如果`pam_wheel.so'不带任何`group='参数,`root' group就是`su'默认的wheel group。 * `adm' group可以阅读日志文件。 * `cdrom' group可在本地赋予一组用户访问CD-ROM驱动器的权限。 * `floppy' group可在本地赋予一组用户访问软盘驱动器的权限。 * `audio' group可在本地赋予一组用户访问声音设备的权限。 * `src' group拥有源代码以及`/usr/src'目录下的文件。它可以在本地赋予某个用户管理系统源代码的权限。 * 对于管理桌面或低级别的系统管理员,可设置他们为`staff'成员,该类成员可以在`/usr/local'下工作并且可以在`/home'下创建目录。 完整列表参阅Securing Debian Manual (http://www.debian.org/doc/manuals/securing-debian-howto/)的“FAQ”章节,亦见于Woody中的`harden-doc'软件包。新的`base-passwd' (>3.4.6)软件包亦包含了权威列表:`/usr/share/doc/base-passwd/users-and-groups.html'。 9.2.4. `sudo' --一个安全的工作环境 ---------------------------------- 使用`sudo'最主要的目的是保护自己少做蠢事,我认为使用系统时使用`sudo'比使用root帐号更好。YMMV 安装`sudo'然后编辑/etc/sudoers (http://www.debian.org/doc/manuals/debian-reference/examples/)中有关选项激活它。还可在`/usr/share/doc/sudo/OPTIONS'中查看`sudo'的用户组特性。 样例中的配置,设定“staff”用户组成员可通过`sudo'执行任何root权限的命令而“src”用户组成员只可执行规定的一部分root权限的命令。 使用`sudo'的好处在于只需一个普通用户密码登录,并且所有的活动都受到监控。用它为低级别的系统管理员赋权是个好主意。例如: $ sudo chown -R : . 当然,如果你知道root密码(绝大部分在家安装系统的用户都会知道),就可以在普通用户下执行任何root命令: $ su -c "shutdown -h now" Password: (我想我该严格限制admin帐号的`sudo'特权,但对于家中的服务器,就不用考虑那么多了。) 想了解其它允许普通用户执行root权限命令的程序,可以看看`super'软件包。 9.2.5. daemon程序的访问权限控制 ------------------------------- 对于Internet_超级服务器_,`inetd'会在系统启动时通过`/etc/rc2.d/S20inetd'(for RUNLEVEL=2)加载,S20inetd是一个指向`/etc/init.d/inetd'的符号链接。本质上,`inetd'允许一个daemon调用其它多个daemon,以减轻系统的负载。 当某个服务请求到达,系统会查询`/etc/protocols'和`/etc/services'中的数据库,确定该请求所指定的相关协议和服务,接着`inetd'会在`/etc/inetd.conf'数据库中查找普通Internet服务或`/etc/rpc.conf'中查找基于Sun-RPC的服务。 为了系统安全,请在`/etc/inetd.conf'中关闭所有不用的服务。涉及到NFS和其它基于RPC的程序时需要激活Sun-RPC服务。 有时,`inetd'并不直接打开请求的服务,而是在`/etc/inetd.conf'中将该服务名作为的参数,打开`tcpd' TCP/IP daemon包装程序,这时,`tcpd'首先登记请求并使用`/etc/hosts.deny'和`/etc/hosts.allow'进行附加的检查,然后再运行相应的服务程序。 如果新版的Debian系统进行远程访问时出现问题,可以`/etc/hosts.deny'中注释掉“ALL: PARANOID”,如果有该行的话。 更多信息参阅inetd(8)、inetd.conf(5)、protocols(5)、services(5)、tcpd(8)、hosts_access(5)和hosts_options(5)。 有关Sun-RPC的更多信息参阅rpcinfo(8)、portmap(8)和`/usr/share/doc/portmap/portmapper.txt.gz'。 9.2.6. 轻便目录访问控制协议(LDAP) ----------------------------------- 参阅: * OpenLDAP (http://www.openldap.org/) * OpenLDAP Admin Guide in the `openldap-guide' package * LDP: LDAP Linux HOWTO (http://www.tldp.org/HOWTO/LDAP-HOWTO/index.html) * LDP: LDAP Implementation HOWTO (http://www.tldp.org/HOWTO/LDAP-Implementation-HOWTO/index.html) * OpenLDAP, extensive use reports (http://portal.aphroland.org/~aphro/ldap-docs/ldap.html) * Open LDAP with Courier IMAP and Postfix (http://alinux.washcoll.edu/docs/plc/postfix-courier-howto.html) 9.3. 刻录机 ----------- ATAPI/IDE接口的刻录机是时下非常流行的配件,它是极好的系统备份工具,特别是对于那些单个文件容量一般< 640 MB的家庭用户。更多权威的信息,请参阅LDP CD-Writing-HOWTO (http://www.tldp.org/HOWTO/CD-Writing-HOWTO.html)。 9.3.1. 概述 ----------- 首先需要说明的是,在向刻录机发送数据过程中,任何数据中断都会对光盘造成无法挽回的损坏。所以应选购缓冲区尽可能大的刻录机。如果资金充裕,就别再考虑ATAPI/IDE型的,买台SCSI型的没错。如果可以连接IDE接口,就使用PCI总线(例如,在主板上)而别用ISA总线(SB16声卡就使用它)。 当刻录机连接到IDE,驱动它的通常是IDE-SCSI驱动而非旧式的IDE CD驱动,所以,需要激活SCSI通用驱动。有两种方法激活它,假设系统使用的是较新版本的内核(如2001年三月的版本)。 9.3.2. 方法一:modules + `lilo' ------------------------------- 如果使用的是Debian原装内核,将下面的内容添加到`/etc/lilo.conf',如果有多个选项,列出时要将它们用空格分隔开: append="hdx=ide-scsi ignore=hdx" 在此,刻录机使用ide-scsi驱动访问,`hdx'就代表它,其中_x_的含义如下: hda 接第一个IDE接口作主盘 hdb 接第一个IDE接口作从盘 hdc 接第二个IDE接口作主盘 hdd 接第二个IDE接口作从盘 hde ... hdh 接扩展IDE接口或ATA66/100 IDE接口 完成上述配置工作后以root身份运行下列命令激活设备 # lilo # shutdown -h now 9.3.3. 方法二:重编译内核 ------------------------- Debian用`make-kpkg'创建新内核,使用make-kpkg时加上新的`--append_to_version'参数可创建多重内核镜像。参阅章 7, `Debian下的Linux内核'。 `make menuconfig'后执行下列步骤: * bzImage * 包含IDE CD driver(不是必须的,但这样更简单) * 将ide-scsi和sg编译进内核,或编译成模块 9.3.4. 配置步骤 --------------- 下列步骤可让系统在启动时激活内核对刻录机的支持: # echo ide-scsi >>/etc/modules # echo sg >>/etc/modules # cd /dev; ln -sf scd0 cdrom 手工激活可以这样做: # modprobe ide-scsi # modprobe sg 重启以后,用下列方法检查安装情况: $ dmesg|less # apt-get install cdrecord # cdrecord -scanbus [Per Warren Dodge]如果机器上同时有CD-ROM和CD-R/RW,这时`ide-scsi'和`ide-cd'可能会产生冲突,请试试在`/etc/modutils/aliases'中加上下面的内容,然后运行`update-modules'并重启系统。 pre-install ide-scsi modprobe ide-cd 上述指令指示系统在加载`ide-scsi'前先加载IDE驱动。IDE驱动`ide-cd'接管所有ATAPI CD-ROM——对指明_忽略的_设备除外。剩下的设备才由`ide-scsi'来管理。 9.3.5. 光盘镜像文件(可引导光盘) --------------------------------- 将`target-directory/'下的文件,制作成光盘镜像文件`cd-image.raw'(可引导系统、Joliet TRANS.TBL-enabled格式的光盘;如果不需要引导系统功能,可去掉`-b'和`-c'选项),在第一个软驱中插入启动软盘然后执行: # dd if= # mkisofs -r -V -b -c -J -T \ -o 一个有趣的黑客尝试是制作一盘DOS引导光盘。如果上述的`'文件中包含了通用DOS引导软盘镜像,光盘就可以象插在软驱(A:)中的DOS软盘一样引导DOS系统。如果再加上freeDOS就更有趣。 想检查该光盘镜像文件,可以在回送设备(loop device)上加载它。 # mount -t iso9660 -o ro,loop /cdrom # cd /cdrom # mc # umount /cdrom 9.3.6. 刻录光盘(R,R/W) ------------------------- 首先进行设备测试(假设是双倍数刻录) # nice --10 cdrecord -dummy speed=2 dev=0,0 如果测试通过,执行下面的命令刻录CD-R # nice --10 cdrecord -v -eject speed=2 dev=0,0 或执行下面命令刻录CD-RW # nice --10 cdrecord -v -eject blank=fast speed=2 dev=0,0 某些型号的CD-RW刻录机用下面的命令更好 # nice --10 cdrecord -v blank=all speed=2 dev=0,0 接下来执行 # nice --10 cdrecord -v -eject speed=2 dev=0,0 分两步做是必要,这可以防止在刻录时遇到数据空白产生SCSI超时错误。`nice'参数可时也要做一些调整。 9.3.7. 制作光盘镜像文件 ----------------------- 某些CD-R和商业光盘在数据末尾追加了空白扇区(junk sectors),使用`dd'无法拷贝这些光盘(Windows98 CD就是其中之一)。`cdrecord'软件包中有一个`readcd'命令,用它可以将任何光盘内容拷贝成镜像文件。对于数据盘,先挂载,运行`df'查看它的实际大小,再将显示的数字(in blocks, = 1024 bytes)除以2得到实际光盘扇区数(2048 bytes),带参数运行`readcd'用该硬盘镜像文件烧制CD-R/RW。 # readcd dev=,, # select function 11 其中,大部分情况下命令行中3个参数都为0。有时`readcd'给出的扇区数会偏多!此时使用前面用挂载镜像的方法得出的大小值来对上述参数赋值效果更好。 It should be noted that the use of `dd' has few problems if used on CD-ROM. The first run of `dd' command may cause error message and may yield a shorter disk image with the lost tail-end. The second run of `dd' command may yield a larger disk image with garbage data attached at the end on some systems if the data size is not specified. Only the second run of `dd' command with the correct data size specified without ejecting CD after error message seems to avoid these problems. If the image size displayed by `df' is `46301184' blocks , use the following command twice to get right image (this is my empirical information): # dd if=/dev/cdrom of=cd.img bs=2048 count=$((46301184/2)) 9.3.8. Debian安装盘镜像 ----------------------- 有关Debian CDs的最新信息,请浏览Debian CD site (http://www.debian.org/CD/)。 如果有较快的Internet连接,可考虑用下面的引导方法从网络安装系统: * 一些软盘镜像 (http://www.debian.org/distrib/floppyinst)。 * 一个迷你型可引导光镜像 (http://www.debian.org/CD/netinst/)。 如果没有较快的Internet连接,可考虑从光盘出售商 (http://www.debian.org/CD/vendors/)处购买安装光盘。 请不要浪费带宽来下载标准光盘镜像(即使是使用新的jigdo方式),除非你是光盘镜像测试员。 有一个很有名的光盘镜像KNOPPIX - Live Linux Filesystem On CD (http://www.knopper.net/knoppix/index-en.html)。该光盘可以启动一个全功能的Debian系统而且不需要在硬盘上安装。 9.3.9. 将系统备份到CD-R ----------------------- 想要将重要的配置文件和数据备份到CD-R,可使用backup (http://www.debian.org/doc/manuals/debian-reference/examples/)中的“backup”脚本。亦可参阅节 8.4, `差异备份与数据同步'。 9.3.10. 将音乐CD刻录到CD-R -------------------------- 我没测试过: # apt-get install cdrecord cdparanoia # cdparanoia -s -B # cdrecord dev=0,0,0 speed=2 -v -dao -eject defpregap=1 -audio *.wav 或 # apt-get install cdrdao #disk at once # cdrdao read-cd --device /dev/cdrom --paranoia-mode 3 my_cd # read cd # cdrdao write --device /dev/cdrom --speed 8 my_cd # write a new CD `cdrdao'与拷贝不同(如没有数据间隙,等...) 9.4. X程序 ---------- X环境由Xfree86 (http://www.xfree86.org/)提供。Debian系统中X服务器有两个主要版本:Xfree86 Version 3.3 (XF3)和XFree86 Version 4.x series (XF4),它们都是基于X.ORG (http://www.x.org/)制定X11R6标准的。 想了解X的基础知识,可参阅X(7),LDP XWindow-User-HOWTO (http://www.tldp.org/HOWTO/XWindow-User-HOWTO.html)和Remote X Apps mini-HOWTO (http://www.tldp.org/HOWTO/mini/Remote-X-Apps.html)。对Debian 用户专门的指南,可阅读`xfree86-common'软件包中提供的`/usr/share/doc/xfree86-common/FAQ.gz',其中Branden Robinson有一些有趣并且权威的对key binding的讨论。 节 9.4.3, `X服务器' 该程序存在于那些需要在用户显示器(CRT,LCD)上显示X窗口和桌面并接收键盘和鼠标输入的本地主机上。 节 9.4.4, `X客户端' 该程序存在于那些需要运行与X环境兼容的应用程序的(本地或远程)主机上。 这正好将常规的“服务器”和“客户机”关系倒转过来。 有几种途径让“X server”(显示端)接收远程“X client”(应用端)的连接请求: * `xhost'方式 * t主机列表机制(很不安全)。 * 协议不加密(易受到网络监听攻击) * 尽量不要使用该方式。 * 参阅节 9.4.7, `X远程联接:`xhost''和xhost(1x)。 * _`xauth'_方式 * MIT magic cookie机制(不安全但比`xhost'强点)。 * 协议不加密(易受到网络监听攻击) * 仅用于本地连接,它所需的CPU消耗比`ssh -X'低。 * 参阅节 9.4.11, `X下获取root权限'和xauth(1x)。 * `xdm', `wdm', `gdm', `kdm', ... methods * MIT magic cookie机制(和`xauth'一样不安全) * 参阅xdm(1x)和Xsecurity(7)获得更多有关X显示访问控制的基础知识 * 参阅wdm(1x)、gdm(8)和kdm.options(5)获得更多信息,当然先得装上它们。 * 参阅节 6.5.4, `System-V `init'文件和运行级别'了解如何在不删除`xdm'包的情况下禁用它,使系统启动到控制台。 * _`ssh -X'_方式 * 基于安全shell的端口发送机制(_安全_)。 * 加密协议(在本地使用很耗系统资源)。 * 使用它进行远程连接。 * 参阅节 9.4.8, `X远程联接:`ssh''。 除了`ssh',所有的远程连接方式,都需要X服务器开启TCP/IP连接。参阅节 9.4.6, `X的TCP/IP连接'。 9.4.1. X系统软件包 ------------------ 在Woody中提供了下列几个软件包来简化X系统的安装。 `x-window-system-core' 该综合包提供一些基本组件,用于在单一工作站上运行X Window系统,其中包括X函数库、一个X服务器:`xserver-xfree86'、一套字体、一组基本的X客户端及工具。 `x-window-system' 该综合包提供XFree86项目开发的所有X Window系统的组件,以及一套经久不衰的辅助程序。(注意,它包含了`x-window-system-core'、`twm'和`xdm'等组件,故安装了它就不用再安装`x-window-system-core'了。) `xserver-common-v3' XFree86 3.x X服务器(X3)相关的程序和工具。 `xserver-*' X3服务器软件包的补充包,包含了对那些新的X4服务器不支持的硬件的支持。如X4不支持某些老式的ATI mach64卡,某些视频卡在Woody版的X4中无法工作等等。(要获得可用软件包,可执行`apt-cache search xserver-|less'。所有这些X3服务器均是基于`xserver-common-v3'的。) 大多数情况下,应该安装`x-window-system'(如果要通过控制台登录,需禁用`xdm',具体方法参阅节 8.1.4, `“我不想直接启动到X!”'。) 9.4.2. X服务器的硬件侦测包 -------------------------- 在安装X系统之前安装下列软件包,就能在X配置阶段实现硬件侦测: * `discover' --- 硬件识别系统。 * `mdetect' --- 鼠标自动侦测工具。 * `read-edid' --- VESA PnP监视器硬件信息收集工具。 9.4.3. X服务器 -------------- 有关X服务器的信息,参阅XFree86(1x)。 从本地控制台调用X服务器: $ startx -- : e.g.: $ startx -- :1 vt8 -bpp 16 ... start on vt8 connected to localhost:1 with 16 bpp mode `--'后面的参数用于设置X服务器。 注意,在使用`~/.xserverrc'脚本定制X服务器启动进程时,请确保`exec'调用的是真正的X服务器。如果没这么做会导致X服务器启动缓慢及退出。例如: #!/bin/sh exec /usr/bin/X11/X -dpi 100 -nolisten tcp 9.4.3.1. 配置XF4服务器 ---------------------- (重新)配置XF4服务器, # dpkg-reconfigure --priority=low xserver-common # dpkg-reconfigure --priority=low xserver-xfree86 该命令会生成`/etc/X11/XF86Config-4'文件并调用`dexconf'脚本来配置X。 9.4.3.2. 配置XF3服务器 ---------------------- (重新)配置XF3服务器, # dpkg-reconfigure --priority=low xserver-common-v3 # dpkg-reconfigure --priority=low xserver-mach64 该命令会生成`/etc/X11/XF86Config'文件并调用`xf86config-v3'脚本来配置X。 9.4.3.3. 手工配置X服务器 ------------------------ 添加用户自定义内容时,_不要在配置文件的定义段落中进行编辑_(对于XF4而言): ### BEGIN DEBCONF SECTION [snip] ### END DEBCONF SECTION _正确是做法是将用户定义内容加在定义段落之前_。例如,要添加自定义视频卡,可在文件_开头_添加类似下面的内容: Section "Device" Identifier "Custom Device" Driver "ati" Option "NoAccel" EndSection Section "Screen" Identifier "Custom Screen" Device "Custom Device" Monitor "Generic Monitor" DefaultDepth 24 Subsection "Display" Depth 8 Modes "1280x960" "1152x864" "1024x768" "800x600" "640x480" EndSubsection Subsection "Display" Depth 16 Modes "1280x960" "1152x864" "1024x768" "800x600" "640x480" EndSubsection Subsection "Display" Depth 24 Modes "1280x960" "1152x864" "1024x768" "800x600" "640x480" EndSubsection EndSection Section "ServerLayout" Identifier "Custom" Screen "Custom Screen" InputDevice "Generic Keyboard" "CoreKeyboard" InputDevice "Configured Mouse" "CorePointer" EndSection 9.4.4. X客户端 -------------- 绝大多数X客户端程序都可以用类似下面的命令启动: client $ xterm -geometry 80x24+30+200 -fn 6x10 -display :0 & 命令行中各参数的含义如下: * `-geometry x++':窗口初始尺寸和位置。 * `-fn ':显示文本的字体。`'的赋值有如下几个: * a14: 普通字体 * a24: 大号字体 * ... (使用`xlsfont'检查可用字体。) * `-display ':X服务器名称。 `'的赋值有如下几个: * `:'表示在名为`'的主机的显示器`'上显示的屏幕`';工作于该显示器的X服务器监听TCP端口6000+D。 * `/unix:'表示在`'主机的显示器上显示的屏幕`';工作于该显示器的X服务器监听UNIX domain socket `/tmp/.X11-unix/XD'(故只能从主机访问它)。 * `<:D.S>'等价于`/unix:',其中`'代表本地主机名。 默认的X客户端程序(应用端)的`'可通过DISPLAY环境变量来设置。例如:在运行某X客户端程序之前,执行下列命令之一就可以完成设置工作: $ export DISPLAY=:0 # 默认情况下,本地机器使用第一个X屏幕 $ export DISPLAY=:0.2 $ export DISPLAY=localhost:0 程序启动方式可以在`~/.xinitrc'中进行自定义。例如: xrdb -load $HOME/.Xresources xsetroot -solid gray & xclock -g 50x50-0+0 -bw 0 & xload -g 50x50-50+0 -bw 0 & xterm -g 80x24+0+0 & xterm -g 80x24+0-0 & twm 正如节 9.4.5.1, `自定义X会话'中所描述的,当使用`startx'启动X时,该脚本将重载Xsession所做的所有常规操作,通常使用`~/.xsession'而该方法仅作为最后的手段使用。 9.4.5. X会话 ------------ X会话(X服务器+X客户机)可使用下列方法启动: * `startx':`initx'的脚本化命令(wrapper script command),负责从Linux字符型控制台启动X服务器和客户机。如果`~/.xinitrc'文件不存在,`/etc/X11/xinit/xinitrc'会调用并执行`/etc/X11/Xsession'。 * `xdm'、`gdm'、`kdm'或`wdm':X显示管理器守护进程,负责启动X服务器和客户机,并管理来自GUI屏幕的登录行为。直接执行`/etc/X11/Xsession'。 想使用控制台参阅节 8.1.4, `“我不想直接启动到X!”'。 9.4.5.1. 自定义X会话 -------------------- 默认的启动脚本`/etc/X11/Xsession'是`/etc/X11/Xsession.d/50xfree86-common_determine-startup'和`/etc/X11/Xsession.d/99xfree86-common_start'的高效的结合体。 `/etc/X11/Xsession'的执行会受`/etc/X11/Xsession.options'的影响,从本质上讲,它使用`exec'命令执行系统中按下面的次序排序,排在第一位的程序: 1. `~/.xsession' or `~/.Xsession',如果它被定义。 2. `/usr/bin/x-session-manager',如果它被定义。 3. `/usr/bin/x-window-manager',如果它被定义。 4. `/usr/bin/x-terminal-emulator',如果它被定义。 Debian选择系统(Debian alternative system )对这些命令的确切定义进行了描述,参阅节 6.5.3, `自选命令'。例如: # update-alternatives --config x-session-manager ... 或 # update-alternatives --config x-window-manager 如果想定义某X窗口管理器为默认窗口管理器,同时保留已安装的GNOME和KDE会话管理器,可用http://bugs.debian.org/168347中第二个错误报告所附的文件替换`/etc/X11/Xsession.d/50xfree86-common_determine-startup'文件(我希望它能早日加到发行版中),然后按下面的方法编辑`/etc/X11/Xsession.options'来禁用X会话管理器: # /etc/X11/Xsession.options # # configuration options for /etc/X11/Xsession # See Xsession.options(5) for an explanation of the available options. # Default enabled allow-failsafe allow-user-resources allow-user-xsession use-ssh-agent # Default disabled (enable them by uncommenting) do-not-use-x-session-manager #do-not-use-x-window-manager 如果不想按上述方法修改系统,由于`gnome-session'和`kdebase'软件包包含了那些X会话管理器,所以删除它们,X窗口管理器就成了默认窗口管理器了。(废话,还更好的主意吗?) 对于那些`/etc/X11/Xsession.options'中仅包含一行`allow-user-xsession'的系统,任何定义了`~/.xsession'或`~/.Xsession'的用户,均可以自定义`/etc/X11/Xsession'的行为。 `~/.xsession'文件中排在最后的命令,其格式应该为`exec ',用来启动你喜欢的X窗口/会话管理器。 `/usr/share/doc/xfree86-common/examples/xsession.gz'给出了一个不错的`~/.xsession'脚本样例。 我使用它来为每个用户设置窗口管理器、屏幕访问和语言支持。参阅节 9.4.5.2, `启动特定的X会话/窗口管理器'、节 9.4.11, `X下获取root权限'、节 9.7.8, `双语系统的例子(日本语EUCT和ISO-8859-1)'。 用户自己添加的X资源保存在`~/.Xresources',而系统级的X资源保存于`/etc/X11/Xresources/*'。参阅xrdb(1x)。 用户可以在`~/.xmodmaprc'中自定义键盘布局和鼠标按键布局,参阅xmodmap(1x)。 9.4.5.2. 启动特定的X会话/窗口管理器 ----------------------------------- 遵循节 9.4.5.1, `自定义X会话'中描述的原则,要激活用户特定的X会话/窗口管理器,需要安装相应的软件包并在`~/.xsession'文件末尾添加如下内容(我爱用`blackbox'/`fluxbox',它简单快捷。): * 默认X会话管理器 * 参阅节 6.5.3, `自选命令'. * `exec /usr/bin/x-session-manager' * 默认X窗口管理器 * 参阅节 6.5.3, `自选命令'. * `exec /usr/bin/x-window-manager' * GNOME会话管理器(loaded) * 需安装软件包:`gnome-session' * `exec /usr/bin/gnome-session' * KDE会话管理器(loaded) * 需安装软件包:`kdebase' (or `kdebase3' for KDE3) * `exec /usr/bin/kde2' * Blackbox窗口管理器(lightweight, slick). * 需安装软件包:`blackbox' * `exec /usr/bin/blackbox' * Fluxbox窗口管理器(lightweight, new blackbox). * 需安装软件包:`fluxbox' * `exec /usr/bin/fluxbox' * Xfce窗口管理器(Mac OS-X, SUN CDE like). * 需安装软件包:`xfce' * `exec /usr/bin/xfwm' * IceWM窗口管理器(lightweight, GNOME alternative) * 需安装软件包:`icewm' * `exec /usr/bin/X11/icewm' * FVWM2虚拟窗口管理器(lightweight, Win95 like) * 需安装软件包:`fvwm' * `exec /usr/bin/fvwm2' * Windowmaker窗口管理器(somewhat NexT like) * 需安装软件包:`wmaker' * `exec /usr/bin/wmaker' * Enlightenment窗口管理器(loaded). * 需安装软件包:`enlightenment' * `exec /usr/bin/enlightenment' 参阅Window Managers for X (http://www.xwinman.org). 9.4.5.3. 配置KDE/GNOME环境 -------------------------- 要配置完整的KDE/GNOME环境,下列的综合包很有用: * KDE:安装`kde'软件包 * GNOME:安装`gnome'软件包 请使用能操作`recommends'类软件包的安装工具安装这些软件包,如`dselect'和`aptitude',比起`apt-get'它们能提供更丰富的软件供你选择。 如果想从控制台登录,必须禁用X显示管理器,例如`kdm'、`gdm'和`wdm'这会牵扯到一些关联问题,有关信息参阅节 8.1.4, `“我不想直接启动到X!”'。 如果想将系统的默认环境由KDE换成GNOME,请用节 6.5.3, `自选命令'中所述的方法配置`x-session-manager'。 9.4.6. X的TCP/IP连接 -------------------- 由于不加密的远程TCP/IP套接字连接易受到窃听攻击,新版的Debian安装X时默认是禁用TCP/IP套接字口的。建议使用`ssh'进行远程X连接(参阅节 9.4.8, `X远程联接:`ssh'')。 通常不推荐使用本节所述的方法,除非系统处于防火墙之后且所处网络中全是绝对可信任的用户。使用下面的命令检查当前X服务器的TCP/IP套接字口的设置: # find /etc/X11 -type f -print0 | xargs -0 grep nolisten /etc/X11/xinit/xserverrc:exec /usr/bin/X11/X -dpi 100 -nolisten tcp 删除`-nolisten'就可以恢复X服务器对TCP/IP的监听。 9.4.7. X远程联接:`xhost' ------------------------- `xhost'允许通过主机名访问。该方式极不安全。下面的方法将关闭主机验证功能,只要TCP/IP套接字连接功能是打开的(参阅节 9.4.6, `X的TCP/IP连接')本机就会接收来自任何地方的连接请求。 $ xhost + 要重新打开主机验证功能可执行: $ xhost - `xhost'无法区分远程主机上不同的用户,而且远程连接的主机名(实际上是地址)也可以是伪造的。 如果处于一个不可信的网络环境(例如通过PPP拔号连接到Internet),即使在网络中成为主机受到一定标准的限制,也应尽量避免使用该连接方式。参阅xhost(1x)。 9.4.8. X远程联接:`ssh' ----------------------- 使用`ssh'可以在本地主机和远程应用服务器之间建立一个安全的连接通道。 * 如果不想每次执行相同的命令行选项,可在远程主机的`/etc/ssh/sshd_config'文件中,打开`X11Forwarding'和`AllowTcpForwarding'选项。 * 启动本地主机的X服务器。 * 在本地主机上开一个`xterm'进程。 * 运行`ssh'建立与远程站点的连接。 localname @ localhost $ ssh -q -X -l loginname remotehost.domain Password: ..... * 在远程站点上运行X应用程序命令。 loginname @ remotehost $ gimp & 该连接方式使得远程X客户机上的屏幕输出,看上去就好象是通过本地UNIX域套接字的方式连接到服务器的客户机输出。 9.4.9. `xterm' -------------- 学习`xterm'可以去http://dickey.his.com/xterm/xterm.faq.html。 9.4.10. X资源数据库 ------------------- 许多老式的X程序,如xterm,使用X资源数据库配置它们的外观。`~/.Xresources'文件用于保存用户资源定义。登录后该文件自动合并到默认的X资源中。 这儿是一些有用的设置,可加到`~/.Xresources'文件中: ! Set the font to a more readable 9x15 XTerm*font: 9x15 ! Display a scrollbar XTerm*scrollBar: true ! Set the size of the buffer to 1000 lines XTerm*saveLines: 1000 要使上述设置立即生效,可用下面的命令将它们合并到数据库: xrdb -merge ~/.Xresources 9.4.11. X下获取root权限 ----------------------- 如果运行GUI程序时需要root权限,请用下面的步骤在用户的X服务器上显示程序输出。_千万不要直接使用root帐号启动X服务器_以避免承担不必要的安全风险。 以普通用户身份启动X服务器,开一个`xterm'控制台窗口,执行: $ XAUTHORITY=$HOME/.Xauthority $ export XAUTHORITY $ su root Password:***** # printtool & 非root用户以`su'方式运用该技巧时,要确保该非root用户所在用户组对`~/.Xauthority'文件有读权限。 想要系统自动执行该命令序列,请在用户帐号下创建`~/.xsession'文件,编辑文件如下: # This makes X work when I su to the root account. if [ -z "$XAUTHORITY" ]; then XAUTHORITY=$HOME/.Xauthority export XAUTHORITY fi unset XSTARTUP # If particular window/session manager is desired, uncomment following # and edit it to fit your needs. #XSTARTUP=/usr/bin/blackbox # This start x-window/session-manager program if [ -z "$XSTARTUP" ]; then if [ -x /usr/bin/x-session-manager ]; then XSTARTUP=x-session-manager elif [ -x /usr/bin/x-window-manager ]; then XSTARTUP=x-window-manager elif [ -x /usr/bin/x-terminal-emulator ]; then XSTARTUP=x-terminal-emulator fi fi # execute auto selected X window/session manager exec $XSTARTUP 接着在用户的`xterm'窗口中运行`su'(不是`su -')。现在从该`xterm'启动的GUI程序就可以在该用户的X window环境中显示以root权限运行的程序输出。只要执行了默认的`/etc/X11/Xsession',就可以使用该方法。如果用户使用`~/.xinit'或`~/.xsession'来配置自定义环境,需要将上面提到的环境变量`XAUTHORITY'加到这些脚本中去。 还有一种方法,`sudo'可用于自动执行上面的命令序列: $ sudo xterm ... 或 $ sudo -H -s 这时`/root/.bashrc'中应包含: if [ $SUDO_USER ]; then sudo -H -u $SUDO_USER xauth extract - $DISPLAY | xauth merge - fi 即使对那些home目录位于NFS上的用户,它也能正常工作。因为root不用读`.Xauthority'文件。 还有一些用于该目的的专用软件包:`kdesu'、`gksu'、`gksudo'、`gnome-sudo'和`xsu'。其它方法也可以达到同样的目的:如在`/root/.Xauthority'和相应用户文件之间创建一个符号链接;使用sux (http://fgouget.free.fr/sux/sux-readme.shtml)脚本;或对root初始化脚本执行“`xauth merge ~/.Xauthority'”。 更多方法参阅debian-devel mailing list (http://lists.debian.org/debian-devel/2002/debian-devel-200207/msg00259.html)。 9.4.12. X下的TrueType字体 ------------------------- XFree86-4中标准的`xfs'能完美地驱动TrueType字体,如果你使用的是XFree86-3,就得安装第三方字体服务器如`xfs-xtt'。 不论什么应用程序,如果要使用TrueType字体,就要与libXft或libfreetype建立链接(如果你使用的是已编译好的.deb包,就不用在这方面操心了)。 要记得安装所需的字体文件并生成`fonts.{scale,dir}'文件,这样字体才能被检索使用。 由于供_自由_使用的字体有时很有限,Debian用户也可以安装或共享某些商业TrueType字体。为了简化安装这类字体的工序,于是产生了一些方便的软件包: * `ttf-commercial' * `msttcorefonts (>1.1.0)' (Woody中的软件包,因为Microsoft网站中的一些变故,2002年8月就不再使用了。) 请慎重选择TT字体,以免_自由_系统受到不自由字体的污染。 9.4.13. 网页浏览器(图形化) ---------------------------- Woody发布版中包含了下面这些拥有图形处理能力的网页浏览器: * `mozilla' The Mozilla browser (new) * `galeon' Mozilla-based browser with a Gnome UI (new) * `konqueror' KDE browser * `dillo' GTK browser * `amaya-gtk' W3C reference browser * `amaya-lesstif' W3C reference browser * `netscape-...' (many, old) * `communicator-...' (many, old) * ... galeon需要有与其版本相匹配的特定版本的`mozilla'才能运行。虽然它们的UI不同,但都使用的是同一个HTML解释引擎Gecko。 安装诸如`mozilla'、`galeon'浏览器的plug-ins,可手工将“`*.so'”装到plug-in目录下,然后重启浏览器。 Plug-in资源: * Java plug-in: install binary "J2SE" from http://java.sun.com. * Flash plug-in: install binary "Macromedia Flash Player 5" from http://www.macromedia.com/software/flashplayer/. * `freewrl': VRML browser and Netscape plugin * ... 9.5. SSH -------- SSH(Secure SHell)是在Internet中建立连接的安全途径。OpenSSH是一个自由的SSH实现软件,它包含在Debian的ssh软件包中。 9.5.1. 基础 ----------- 首次安装OpenSSH服务器和客户机。 # apt-get update && apt-get install ssh 安装时需要打开`/etc/apt/source.list'中的non-US链接。要运行OpenSSH服务器,还得屏蔽掉`/etc/ssh/sshd_not_to_be_run'。 SSH有两个验证协议: * SSH协议 第1版: * Potato发布版仅支持该版协议 * 可用的验证方法: * RSA验证:基于RSA密匙的用户验证 * Rhosts验证:基于.rhosts的主机验证(不安全,有缺陷) * RhostsRSA验证:.rhosts验证与RSA主机密匙相结合(有缺陷) * ChallengeResponse验证:RSA Challenge-response验证 * Password验证:基于password的验证 * SSH协议 第2版 * Woody后继版本将以该版协议为主 * 可用的验证方式: * Pubkey验证:基于公共密匙的用户验证 * Hostbase验证:`.rhosts'或`/etc/hosts.equiv'验证与公共密匙客户端主机验证相结合(有缺陷) * ChallengeResponse验证:challenge-response验证 * Password验证:基于password的验证 如果系统正迁移到Woody或使用非Debian系统,请注意版本差异。 更多信息请参阅`/usr/share/doc/ssh/README.Debian.gz'、ssh(1)、sshd(8)、ssh-agent(1)和ssh-keygen(1)。 下面是一些关键的配置文件: * `/etc/ssh/ssh_config':默认的SSH客户机。参阅ssh(1)。其中重要的项目有: * `Host':作用于所有与该关键字后所列出的主机相匹配的主机,它们须遵守下面(处于本host关键字之后下一个host关键字之前的内容)所列的各项条款。 * `Protocol':规定所使用的SSH协议的版本。默认为“2,1”。 * `PreferredAuthentications':规定SSH2客户端验证方式。默认为“hostbased,publickey,keyboard-interactive,password”。 * `PasswordAuthentication':如果想使用密码登录,须确认该选项没有设置成`no'。 * `ForwardX11':默认为关闭状态。可使用命令行选项“`-X'”重载它。 * `/etc/ssh/sshd_config':默认的SSH服务器。参阅ssshd(8)。其中重要的项目有: * `ListenAddress':规定`sshd'监听的本地地址。允许多重指定。 * `AllowTcpForwarding':默认为关闭状态。 * `X11Forwarding':默认为关闭状态。 * `$HOME/.ssh/authorized_keys':默认公共密匙列表,客户机可使用这些密匙连接本主机的该用户帐号。参阅ssh-keygen(1)。 * `$HOME/.ssh/identity':参阅ssh-add(1)和ssh-agent(1)。 下面的操作将从客户机建立一个`ssh'连接。 $ ssh username@hostname.domain.ext $ ssh -1 username@hostname.domain.ext # Force SSH version 1 $ ssh -1 -o RSAAuthentication=no -l username foo.host # force password on SSH1 $ ssh -o PreferredAuthentications=password -l username foo.host # force password on SSH2 在用户眼里,`ssh'的功能相当于一个更灵巧更安全的`telnet'(will not bomb with ^])。 9.5.2. 发送端口--SMTP/POP3微调 ------------------------------ 在本地机器上执行下面的命令,可以建立一个连接本地主机4025端口和<远程服务器>25端口的管道,以及一个连接本地主机4110端口和<远程服务器>110端口的`ssh'连接。 # ssh -q -L 4025:remote-server:25 4110:remote-server:110 \ username@remote-server 在Internet上可使用该方法建立与SMTP/POP3服务器的安全连接。记得在远程主机的`/etc/ssh/sshd_config'中设置`AllowTcpForwarding'值为`yes'。 9.5.3. 用更少的密码建立连接 --------------------------- 使用RSAAuthentication(SSH1协议)或PubkeyAuthentication(SSH2协议)可不必记住每个远程系统的连接密码。 在远程系统上,在`/etc/ssh/sshd_config'中分别设置“RSAAuthentication yes”或“PubkeyAuthentication yes”。 然后在本地生成验证密匙,在远程系统上安装公共密匙: $ ssh-keygen # RSAAuthentication: RSA1 key for SSH1 $ cat .ssh/identity.pub | ssh user1@remote \ "cat - >>.ssh/authorized_keys" ... $ ssh-keygen -t rsa # PubkeyAuthentication: RSA key for SSH2 $ cat .ssh/id_rsa.pub | ssh user1@remote \ "cat - >>.ssh/authorized_keys" ... $ ssh-keygen -t dsa # PubkeyAuthentication: DSA key for SSH2 $ cat .ssh/id_dsa.pub | ssh user1@remote \ "cat - >>.ssh/authorized_keys" 今后可用“`ssh-keygen -p'”来改密码。最后记得检查一下设置,可做个连接测试,如遇问题,执行“`ssh -v'”。 你可以通过在`authorized_keys'里添加选项来限制主机及运行指定的命令。详情参阅sshd(8)。 注意SSH2有`HostbasedAuthentication',要使它工作,必须同时在服务器端的`/etc/ssh/sshd_config'文件中和客户机端的`/etc/ssh/ssh_config'或`$HOME/.ssh/config'文件中设置`HostbasedAuthentication'为`yes'。 9.5.4. 其它平台的SSH客户端 -------------------------- 下面是其它一些非类Unix平台的免费SSH客户端。 Windows puTTY (http://www.chiark.greenend.org.uk/~sgtatham/putty/) (GPL) Windows (cygwin) SSH in cygwin (http://www.cygwin.com/) (GPL) Macintosh Classic macSSH (http://www.macssh.com/) (GPL) [注意Mac OS X包含OpenSSH;在终端应用程序中使用`ssh'] 参阅SourceForge.net的站点文档 (http://www.sourceforge.net/docman/?group_id=1),“6. CVS Instructions”。 9.5.5. SSH代理 -------------- 使用passphrase来保护SSH认证密匙会更安全,如果还没有设置,可使用`ssh-keygen -p'来设置。 节 9.5.3, `用更少的密码建立连接'中描述了如何使用一个基于密码的远程主机连接,将公共密匙(例如`~/.ssh/id_rsa.pub')放入远程主机的`~/.ssh/authorized_keys'。 $ ssh-agent bash # or run zsh/tcsh/pdksh program instead. $ ssh-add ~/.ssh/id_rsa Enter passphrase for /home/osamu/.ssh/id_rsa: Identity added: /home/osamu/.ssh/id_rsa (/home/osamu/.ssh/id_rsa) $ scp ... no passphrase needed from here on :-) $^D ... terminating ssh-agent session 对于X服务器,普通Debian启动脚本会将`ssh-agent'作为一个父进程执行。所以只需执行一次`ssh-add'即可。 详情参阅ssh-agent(1)和ssh-add(1)。 9.5.6. 问题解决 --------------- 如果遇到问题,检查一下配置文件的访问权限,并使用“`-v'”选项运行`ssh'。 如果是root身份,遇到连接防火墙出错的情况,可使用“`-P'”选项;它规定ssh使用服务器的1--1023以外的端口。 如果与远程站点的`ssh'连接突然停止工作,很可能是因为系统管理员修补系统造成的,`host_key'在系统维护过程中被更改。在查明了事情真象并确定并不是有人试图冒充远程主机非法入侵之后,从本地机器的`$HOME/.ssh/known_hosts'中删除`host_key'项目就可以恢复连接了。 9.6. 邮件程序 ------------- 邮件系统配置分为三类: * 邮件传输代理(MTA):`exim', `postfix', `sendmail', `qmail', `ssmtp', `nullmailer', ... * 邮件工具:`procmail', `fetchmail', `mailx', ... * 邮件用户代理(MUA):`mutt', `emacs'+`gnus', 9.6.1. 邮件传输代理(Mail transport agent) ------------------------------------------- 想对MTA有一个全面的了解,请使用`exim'。参阅: * `exim-doc'和`exim-doc-html'软件包 * http://www.exim.org/ 如果你对安全性有高要求的话,唯一一个可替代的MTA是`postfix'。Debian软件包还提供了`sendmail'和`qmail',但并不推荐你使用它们。 有时并不需要MTA的所有功能,如在一个卫星系统中的一台笔记本电脑,可以考虑下列几种轻量级软件包: * `ssmtp':需要SMTP连接并支持别名功能,或者 * `nullmailer':可以存信但不支持别名。 此刻,我发现`exim'对于我作为个人工作站的笔记本电脑再合适不过了。 如果要安装这些软件包必须先删除`exim',它们有冲突: # dpkg -P --force-depends exim # apt-get install nullmailer # or ssmtp 9.6.1.1. 配置Exim的基础知识 --------------------------- 为了将`exim'作为MTA,可按下列步骤进行配置: /etc/exim/exim.conf 使用“eximconfig”创建及编辑 /etc/inetd.conf 注释掉smtp,将exim作为daemon运行 /etc/email-addresses 添加伪来源地址列表 检查邮件过滤器可使用exim -brw, -bf, -bF, -bV, ... 等等 9.6.1.2. 一个收集不存在的邮件地址的容器(Exim) --------------------------------------------- 在`/etc/exim/exim.conf'文件(Woody或后继版本)的DIRECTORS部分的末尾(localuser:director之后)添加一个catch-all director,将所有前面的director无法解析的地址收集到一起(per Miquel van Smoorenburg): catchall: driver = smartuser new_address = webmaster@mydomain.com 如果要为每个虚拟域指定更精细的处理方法或其它什么的,可在`/etc/exim/exim.conf'末尾添加(我没仔细测试过): *@yourdomain.com ${lookup{$1}lsearch*{/etc/email-addresses} \ {$value}fail} T 接着在`/etc/email-addresses'中加上一行“*”。 9.6.1.3. 为发出的邮件指定发件人地址(Exim) ------------------------------------------- 可用`exim'为发出的邮件指定特定的“From:”信头,在`/etc/exim/exim.conf'文件的末尾编辑: *@host1.something.dyndns.org \ "${if eq {${lookup{$1}lsearch{/etc/passwd}{1}{0}}} {1} \ {$0}{$1@somethig.dyndns.org}}" frFs 该语句将作用于所有符合`*@host1.something.dyndns.org'的邮件。 1. 在`/etc/password'中搜索,以确定local part($1)是否为本地用户。 2. 如果是本地用户,它将用第一个域($0)中的内容重写地址 3. 如果不是本地用户,重写域部分。 9.6.1.4. 在Exim中设置SMTP认证 ----------------------------- 某些SMTP服务如yahoo.com需要SMTP认证。可用下面的方法配置`/etc/exim/exim.conf': remote_smtp: driver = smtp authenticate_hosts = smtp.mail.yahoo.com ... smarthost: driver = domainlist transport = remote_smtp route_list = "* smtp.mail.yahoo.com bydns_a" ... plain: driver = plaintext public_name = PLAIN client_send = "^cmatheson3^this_is_my_password" 别忘了最后一行的双引号。 9.6.2. 邮件工具(Fetchmail) ---------------------------- `fetchmail'以daemon方式运行,用ISP提供的POP3帐号将邮件收到本地邮件系统。配置: /etc/init.d/fetchmail /etc/rc?.d/???fetchmail run update-rc.d fetchmail default priority 30 /etc/fetchmailrc configuration file (chown 600, owned by fetchmail) 在Potato中,有关如何在init.d脚本中配置fetchmail以daemon方式运行的信息,十分混乱,Woody解决了这个问题。参阅example scripts (http://www.debian.org/doc/manuals/debian-reference/examples/)中`/etc/init.d/fetchmail'和`/etc/fetchmailrc'样例文件。 如果你的邮件信头被ISP的邮件工具以^M污染,可在`$HOME/.fetchmailrc'中添加“stripcr”选项: options fetchall no keep stripcr 9.6.3. 邮件工具(Procmail) --------------------------- `procmail'是一个本地邮件分发过滤程序。使用时,需要为每个使用它的用户创建`$HOME/.procmailrc',样例:_procmailrc (http://www.debian.org/doc/manuals/debian-reference/examples/)。 9.6.4. 邮件用户代理(Mutt) --------------------------- 用`mutt'做用户邮件代理(MUA)与`vim'结合使用。使用`~/.muttrc'进行自定义;例如: # use visual mode and "gq" to reformat quotes set editor="vim -c 'set tw=72 et ft=mail'" # # header weeding taken from the manual (Sven's Draconian header weeding) # ignore * unignore from: date subject to cc unignore user-agent x-mailer hdr_order from subject to cc date user-agent x-mailer auto_view application/msword .... 在`/etc/mailcap'或`$HOME/.mailcap'中添加下列内容,就能显示HTML邮件和内嵌的MS Word附件: text/html; lynx -force_html %s; needsterminal; application/msword; /usr/bin/antiword '%s'; copiousoutput; description="Microsoft Word Text"; nametemplate=%s.doc 9.7. 本地化(localization)及国家语言支持 ----------------------------------------- Debian是国际化的操作系统,它所支持的语言和地区惯例的数目正在不断增加。接下来的部分列出了当前Debian对各种差异形式的支持,接着再讨论_本地化_,该过程负责定制你的工作环境,根据你所选的语言确定当前系统的输入输出方式,并按照你所在地区的惯例转化日期、数字、货币格式以及系统中其它相关方面。 9.7.1. 定制基础 --------------- 定制系统的本地化和国家语言支持包括以下几个方面。 9.7.1.1. 键盘 ------------- Debian发布版中包含了二十多种键盘布局方案。在Woody中重新配置键盘可使用: * `dpkg-reconfigure --priority=low console-data # console' * `dpkg-reconfigure --priority=low xserver-xfree86 # XF4' * `dpkg-reconfigure --priority=low xserver-common-v3 # XF3' 9.7.1.2. 日期 ------------- 绝大多数Debian软件包都能使用non-US-ASCII字符,它们通过glibc中的_locale_技术,用LC_CTYPE环境变量来操作这些字符。 * 纯8-bit字符:应用于所有程序中 * 其它拉丁字符集(例如:ISO-8859-1或ISO-8859-2):应用于绝大多数程序中 * 多字节语言如中文、日文或韩文:应用于较新的应用程序中 9.7.1.3. 显示 ------------- X可以显示包括UTF-8在内的许多编码并支持所有的字体。列表中包含了所有的8-bit字体和16-bit字体诸如中文、日文或韩文。XIM机制支持多字节输入法。参阅节 9.7.8, `双语系统的例子(日本语EUCT和ISO-8859-1)'。 `kon2'软件包可实现在(S)VGA图形化控制台中显示日文EUC编码。另一个替代品是`jfbterm',它也使用FB控制台。在控制台环境里,必须由应用程序来提供对日文输入的支持。所以要为Emacs加装`egg'软件包,可使用日文化的`jvim'软件包作为Vim环境。 9.7.1.4. 翻译 ------------- 许多在Debian系统中显示的文本信息和文档被翻译成了各种译本,如出错信息、标准程序输出、菜单以及帮助页面。当前Debian支持德语、西班牙语、芬兰语、法语、匈牙利语、意大利语、日语、韩语、波兰语、葡萄牙语、汉语以及俄语帮助页面,可通过安装`manpages-'软件包实现这些支持(此处代表双位的ISO国家代码。使用`apt-cache search manpages-|less'获得可用的unix帮助页面列表。) 要访问NLS帮助页面,用户必须将环境变量LC_MESSAGES设置成相应的字串。例如,要访问意大利语的帮助页面,需要将LC_MESSAGES设置成`it',这时`man'程序会在`/usr/share/man/it/'目录下搜索帮助页面。 9.7.2. Locales -------------- Debian支持_locale_技术。locale机制允许程序按照该地区惯例来提供输出和其它特殊功能如字符集、日期时间显示格式,货币符号等等。该机制使用环境变量来确定其相关的行为。例如,假设你同时在系统上安装了美式英语和法语locales,许多程序的出错信息都以双语显示: $ LANG="en_US" cat foo cat: foo: No such file or directory $ LANG="de_DE" cat foo cat: foo: Datei oder Verzeichnis nicht gefunden Glibc以函数库的形式向程序提供该功能的支持。参阅locale(7)。 9.7.3. 激活地区支持能力 ----------------------- Debian并_不_在系统中编译所有可用的locales,检查`/usr/lib/locale'确定哪个locales(除了默认的“C”)已在系统上编译安装。如果所需的locale并不在其中,有两个解决办法: * 编辑`/etc/locale.gen'添加需要的locale,然后以root身份运行`locale-gen'编译它。参阅locale-gen(8)以及该帮助页面中“SEE ALSO”一节所列的命令。 * 运行`dpkg-reconfigure locales'可以重新配置`locales'软件包。如果还没有安装locales,locales安装程序会调出debconf界面让你选择所需的locales并编译相关数据库。 9.7.4. 激活特定locale --------------------- 相关的环境变量按如下次序将特定locale值赋给程序: 1. LANGUAGE:该环境变量由一个用冒号分隔、以优先级排序的地区名称列表组成。仅当POSIX地区值与“C”地区值相异时才使用到它[在Woody中;在Potato版本中通常其优先级高于POSIX locale]。(GNU扩展名) 2. LC_ALL:如果为非空值,其值将作用于所有locale项目。(POSIX.1)通常为“”(空值)。 3. LC_*:如果为非空值,其值将作用于相应的locale项目。(POSIX.1)通常为“C”。 LC_*变量有: * LC_CTYPE:字符分类和环境转换 * LC_COLLATE:校正命令 * LC_TIME:时间显示格式 * LC_NUMERIC:非货币型数字格式 * LC_MONETARY:货币符号 * LC_MESSAGES:常规信息、诊断消息和交互响应信息的格式 * LC_PAPER:纸张尺寸 * LC_NAME:姓名格式 * LC_ADDRESS:地址格式和地区信息 * LC_TELEPHONE:电话号码格式 * LC_MEASUREMENT:度量单位(公制或其它) * LC_IDENTIFICATION:有关地区信息的元数据 16. LANG:如果为非空值且LC_ALL也没有定义,则该值作用于所有没有定义的LC_*地区项目。(POSIX.1)通常为“C”。 注意,有些应用程序(例如Netscape 4)忽略LC_*设置。 The `locale'程序可显示当前激活的地区设置和可用的locale;参阅locale(1)。(注意:`locale -a'将列出系统已知的所有的locales;这并_不_代表它们都已在系统中编译了!参阅节 9.7.3, `激活地区支持能力'。) 9.7.5. ISO 8601日期格式 ----------------------- 名为en_DK(_丹麦英语_)的locale提供了对国际标准日期格式`yyyy-mm-dd'(ISO 8601日期格式)的支持(听起来有点搞笑:-))。它仅工作于`ls'的控制台屏幕。 9.7.6. US(ISO-8859-1)例子 --------------------------- 将下列语句添加到`~/.bash_profile': LC_CTYPE=en_US.ISO-8859-1 export LC_CTYPE 9.7.7. 带euro符号的France(ISO-8859-15)的例子 ---------------------------------------------- 将下列语句添加到`~/.bash_profile': LANG=fr_FR@euro export LANG LC_CTYPE=fr_FR@euro export LC_CTYPE 按节 9.7.1.1, `键盘'中描述的方法,将键盘设置成French "AZERTY"。安装`manpages-fr'包添加法语帮助页面。US中的Right-Alt键在Europe中称为Alt-Gr,它与其它键组成的组合键可用于输出大量特殊字符,例如Alt-Gr+E可以输出欧元符号。 可使用类似的方法配置绝大多数西欧语言环境。 参阅Debian Euro HOWTO (http://www.debian.org/doc/manuals/debian-euro-support/)了解有关对新欧洲货币方面的支持,有关对法语环境的支持请参阅Utiliser et configurer Debian pour le francais (http://www.debian.org/doc/manuals/fr/debian-fr-howto/)。 9.7.8. 双语系统的例子(日本语EUCT和ISO-8859-1) ----------------------------------------------- 让我们来创建一个双语系统:在X环境里使用ja_JP.eucJP (Japanese EUC,传统的Unix日语环境)它具有英文消息和ISO类型的日期,在Linux控制台环境使用en_US.ISO-8859-1(almost ASCII with accented character support)。 in Linux console. * 使用节 9.7, `本地化(localization)及国家语言支持'中描述的方法添加对日文ja_JP.eucJP locale的支持。 * 安装Kana-to-Kanji转换系统和字典: * `canna' --- Local server (free bear license),或 * `freewnn-jserver' --- Network-extensible server (Public Domain) * 安装日文输入系统: * `kinput2-canna' --- for X, or * `kinput2-canna-wnn' --- for X, and * `egg' --- directly works with Emacsen even in console (optional) * 日文兼容终端机: * `kterm' --- X (classic), * `mlterm' --- X (very neat, variable font size), and * 添加全部日文字库包。 * 按节 9.4.5.1, `自定义X会话'中的方法进行设置。该方法允许用户指定X环境,而不用考虑X的启动方式(`startx'、`xdm' ...) * 创建`~/.xsession',用户可通过配置它来指定X环境: #!/bin/sh # This makes X work when I su to root. if [ -z "$XAUTHORITY" ]; then XAUTHORITY=$HOME/.Xauthority export XAUTHORITY fi # Japanese locale as default, C locale as backup # export LANG=ja_JP.eucJP # make sure to over write en_US.ISO-8859-1 used in console #export LC_CTYPE=ja_JP.eucJP # I want menu message to be English in ASCII :-) export LC_MESSAGES=C # activate input method kinput2 & XMODIFIERS=@im=kinput2 export XMODIFIERS # How about blackbox window manager (lightweight) exec /usr/bin/blackbox * 在`~/.bashrc'中添加如下几行: # Change language environment depending on the console program # X-shells only execute .bashrc (They are not login shell) # General environment for X is set by .xsession if [ $TERM = kterm ] || [ $TERM = mlterm ]; then unset LC_ALL export LANG=C #export LANG=ja_JP.eucJP # For ISO yyyy-mm-dd date display, more natural for Japanese :-) export LC_TIME=en_DK.ISO-8859-1 export LC_MESSAGES=C export LANGUAGE=ja_JP.eucJP:en_US.ISO-8859-1:C export LC_CTYPE=ja_JP.eucJP else unset LC_ALL export LANG=C export LC_TIME=en_DK.ISO-8859-1 export LANGUAGE=en_US.ISO-8859-1:C export LC_CTYPE=en_US.ISO-8859-1 fi * 在`~/.muttrc'中添加如下几行: # UTF-8 support is not popular in popular Japanese EMACS environment # 7 bit encoding of iso-2022-jp is easier for everyone # default encoding order = us-ascii --> iso-8859-1 --> utf-8 #set send_charset="us-ascii:iso-8859-1:utf-8" #set allow_8bit=yes set send_charset="us-ascii:iso-8859-1:iso-2022-jp" set allow_8bit=no * 激活XIM `kinput2' for X应用程序 * 在X资源文件`~/.Xresources'(不知何故,看上去Debian好象在自动配置它)添加`*inputMethod: kinput2'。 * 某些应用程序(如`mlterm')也允许设置`*inputMethod:'和其它运行时的动态信息(在`mlterm'中按下_Ctrl-MouseButton-3_)。 * 用`startx'或任何显示管理器(xdm、gdm、kdm、wdm...)启动X * 打开日文兼容应用程序:VIM6、(x)emacs21、mc-4.5、mutt-1.4...(通常Emacs是最流行的平台,尽管我不怎么用它。) * 按“_Shift+Space_”可切换日文输入法。 亦可参阅SuSE pages for CJK (http://www.suse.de/~mfabian/suse-cjk/suse-cjk.html)。 9.7.9. X下UTF-8的例子 --------------------- 将来每个人都要用到它。参阅The Unicode HOWTO (http://www.tldp.org/HOWTO/Unicode-HOWTO.html)。 9.7.10. FB控制台下UTF-8的例子 ----------------------------- 在`debian-installer'中`bterm'提供了在FB控制台对UTF-8的支持。 9.7.11. 超越locale ------------------ 当你第一次在系统上安装“_国家语言环境_”(national language environment)时,请注意使用`tasksel'或`aptitude'查看一下,在选择相关语言环境任务项时都有哪些软件包被选上了,这些选择信息非常有用特别是进行多语言设置时。如果遇到某些关联包与运行良好的系统上的某些软件发生冲突,就不要安装那些引起冲突的包。由于新装的软件比原来的软件具有更高的优先级,所以必须用`update-alternative'结合有关命令让系统恢复到原来状态。 大部分较新的使用glibc2.2的程序都已支持国际化了。所以不必再为诸如基于VIM的`jvim'等程序指定loclae,因为X下的`vim' 6.0版已提供了该功能。事实上,比起另一个版本它显得有点粗糙,`jvim'有个版本直接将日文IM(`canna')支持编译进去了,而且还集成了大量成熟的日文特性,很值得你期待:-) 有时为了获得更好的工作环境,仅通过`locale'来配置程序是不够的。`language-env'软件包和`set-language-env'命令可以大大简化你的工作。 亦可参阅有关国际化的文档Introduction to i18n (http://www.debian.org/doc/manuals/intro-i18n/),虽然其目标读者为开发人员但对系统管理员也十分有用。 ------------------------------------------------------------------------------- 10. 使用Debian系统架设网关 -------------------------- 用Debian可以架设一个全能的网关,它可以承担NAT、mail、DHCP、DNS cache、HTTP proxy cache、CVS、NFS的工作以及提供面向家庭LAN系统的Samba services。有关这方面网络配置的讨论可参阅Netfilter (http://www.netfilter.org/)。 10.1. 网络配置 -------------- 10.1.1. 网关的主机设置 ---------------------- LAN按下面方法分段使用IP地址以避免Internet上的IP地址冲突。 Class A: 10.0.0.0 with mask 255.0.0.0 Class B: 172.16.0.0 - 172.31.0.0 with mask 255.255.0.0 Class C: 192.168.0.0 - 192.168.255.0 with mask 255.255.255.0 在Debian中`/etc/network/interfaces'文件用于IP设置。 举个例子,假如某台机器的`eth0'使用DHCP动态IP地址连接Internet,`eth1'连接LAN,则其`/etc/network/interfaces'的设置如下(适用于Woody及后继版本) auto lo iface lo inet loopback auto eth0 iface eth0 inet dhcp auto eth1 iface eth1 inet static address 192.168.1.1 network 192.168.1.0 netmask 255.255.255.0 broadcast 192.168.1.255 修改了`/etc/network/interfaces'后,可执行下面的命令使其生效: # /etc/init.d/networking restart 注意:在Woody及其后继版本中的`/etc/network/interfaces'文件不适用于Potato。(同样的差异会出现在Sarte和Woody之间。) 如果系统使用PCMCIA NIC,则在Potato系统中需要设置`/etc/pcmcia/network.opts'而不是interfaces,在Woody就不必了,系统已解决了这个问题。 想检查设置结果可查看下列命令输出: # ifconfig # cat /proc/pci # cat /proc/interrupts # dmesg | more 有时,DSL(PPPoE)连接存在MTU问题,参阅DSL-HOWTO (http://www.tldp.org/HOWTO/DSL-HOWTO/)。如果存在无法访问某些站点的问题,参阅节 3.7.5, `无法访问某此站点的怪问题'。 10.1.2. 网络设置检查 -------------------- 典型的软件集合: # apt-get install nfs samba dhcpd dhcp-client bind squid procmail fetchmail # apt-get install ssh cvs 检查下列文件: /etc/init.d/dhcpd (edit to serve only LAN = eth1) /etc/host.allow (ALL: 192.168.0.0/16 127.0.0.0/8) for NFS /etc/exports (Need this for NFS) /etc/bind/db.192.168.1 (add) /etc/bind/db.lan (add) /etc/bind/named.conf (edit) /etc/resolv.conf (edit) /etc/hosts /etc/dhcpd.conf (edit for LAN = eth1) /etc/dhclient.conf (edit to force local DNS) /etc/samba/smb.conf /etc/exim/exim.conf /etc/mailname /etc/aliases /etc/squid.conf (add all LAN host IPs as allowed) `bind'创建一个本地的cache DNS server并且changes DNS to localhost。检查`/etc/resolv.conf': nameserver 127.0.0.1 search lan.aokiconsulting.com 10.2. Netfilter设置 ------------------- 在Linux 2.4及其后继版本中加入了netfilter/iptables项目,作为一个防火墙子系统。参阅Netfilter (http://www.netfilter.org/),那儿有许多有关其配置的讨论和解释。 10.2.1. netfilter基础 --------------------- Netfilter内建了5条链路来处理数据包,它们分别是:PREROUTING、INPUT、FORWARD、OUTPUT和POSTROUTING: routing decision IN ------> PRE ---> ------> FORWARD -----> ----> POST -----> OUT interface ROUTING \ filter / ROUTING interface DNAT | tracking ^ SNAT REDIRECT | | MASQUERADE v | INPUT OUTPUT | filter ^ filter,DNAT v | \--> Local Process --/ user-space programs 10.2.2. 过滤表(Netfilter table) --------------------------------- 数据包在每条内建的链路中传输时按如下过滤表中的规则进行处理。 * filter(数据包过滤器,链路中默认的过滤器) * INPUT(作用于进入本机的数据包) * FORWARD(作用于路由到本机的数据包) * OUTPUT(作用于本地产生的数据包) * nat(网络地址翻译) * PREROUTING(作用于刚进入的待转换数据包) * OUTPUT(作用于在路由之前待转换的本地产生的数据包) * POSTROUTING(作用于待发出的已转换的数据包) * mangle (network address mangling, good only after 2.4.18) * 适用于所有5条链路。 10.2.3. 过滤目标(Netfilter target) ------------------------------------ Firewall rules have several targets: * 4个基本目标: * ACCEPT 允许数据包通过。 * DROP 阻拦数据包。 * QUEUE 允许数据包进入用户空间(userspace)(如果内核支持的话)。 * RETURN means stop traversing this chain and resume at the next rule in the previous (calling) chain. * 扩展目标: * LOG 打开内核日志。 * REJECT 回送错误数据包并阻拦该数据包。 * SNAT 修改数据包源地址,仅作用于POSTROUTING链路。(仅适用于nat过滤表) --to-source ipaddr[-ipaddr][:port-port] * MASQUERADE 作用和SNAT一样,但面向使用动态IP请求建立的连接(拔号连接)。(仅适用于nat过滤表) --to-ports port[-port] * DNAT 修改数据包目的地址,仅作用于PREROUTING、OUTPUT链路以及由它们调用的用户自定义链路。(仅适用于nat过滤表) --to-destination ipaddr[-ipaddr][:port-port] * REDIRECT 修改数据包目标地址使其发送给本机。 --to-ports port[-port] 10.2.4. 网络过滤器命令 ---------------------- `iptables'的基本命令有: iptables -N # create a iptables -A \ # add rule to -t \ # use
(filter, nat, mangle) -p \ # tcp, udp, icmp, or all, -s \ --sport \ # source port if -p is tcp or udp -d \ --dport \ # dest. port if -p is tcp or udp -j \ # what to do if match -i \ # for INPUT, FORWARD, PREROUTING -o # for FORWARD, OUTPUT, POSTROUTING 10.2.5. IP伪装(IP-masquerade) ------------------------------- 一个运用IP伪装(NAT)的网关可实现LAN内的机器通过共享一个单独的可访问外网的IP地址来访问Internet资源。 # apt-get install ipmasq 执行样例规则来加强`ipmasq'的保护机制。 参阅`/usr/share/doc/ipmasq/examples/stronger/README'。对于使用2.4版内核镜像的Debian,请确认加载了相应的模块。有关的必要设置参阅节 7.2.3, `网络功能'。 对于使用2.2版内核镜像的Debian,可按下面的方法编辑`/etc/masq/rules'中的`Z92timeouts.rul'文件,以保证可长时间连接远程站点(如发送大容量的email,等): # tcp, tcp-fin, udp # 2hr, 10 sec, 160 sec - default # 1 day, 10 min, 10 min - longer example $IPCHAINS -M -S 86400 600 600 同样,如果是通过PCMCIA NIC访问网络,`ipmasq'需要从`/etc/pcmcia/network.opts'启动。参阅`/usr/share/doc/ipmasq/ipmasq.txt.gz'. 10.2.6. 重定向SMTP联接(2.4版内核) ----------------------------------- 假设你将一台笔记本电脑重新配置成可连入其它的LAN环境,而你不想再重新配置用户邮件代理,即:想直接用原来的配置收发邮件。 使用`iptables'命令向网关机器中加入下面的规则,就可以实现重定向与网关机器的SMTP连接。 # iptables -t nat -A PREROUTING -s 192.168.1.0/24 -j REDIRECT \ -p tcp --dport smtp --to-port 25 # smtp=25, INPUT is open 想使用更完备的重定向规则集,建议安装`ipmasq'软件包,并在`/etc/ipmasq/rules/'目录中添加`M30redirect.def (http://www.debian.org/doc/manuals/debian-reference/examples/)'文件。 10.3. 管理多重网络联接 ---------------------- [FIXME] 路由策略(by Phil Brutsche ): 详情参阅iproute manual (http://lartc.org/)。Traffic control (tc) 也很有趣。 Environment: eth0: 192.168.1.2/24; gateway 192.168.1.1 eth1: 10.0.0.2/24; gateway 10.0.0.1 No masquerading on this machine. Special magic: 1. ip rule add from 192.168.1.2 lookup 1 2. ip rule add from 10.0.0.2 lookup 2 3. ip route add to default via 10.0.0.1 metric 0 4. ip route add to default via 192.168.1.1 metric 1 5. ip route add table 1 to 192.168.1.0/24 via eth0 6. ip route add table 1 to 10.0.0.2/24 via eth1 7. ip route add table 1 to default via 192.168.1.1 8. ip route add table 2 to 192.168.1.0/24 via eth0 9. ip route add table 2 to 10.0.0.2/24 via eth1 10. ip route add table 2 to default via 10.0.0.2 [FIXME] 我没亲自做过。如何利用自动拔号特性使拔号连接保持高速?如果你知道请发补丁我:) ------------------------------------------------------------------------------- 11. 编辑器 ---------- 11.1. 流行的编辑器 ------------------ Linux下有众多运行于控制台环境的文本编辑器任你选用,它们包括: * `vim': 强大而轻便的BSD传统编辑器。VI iMproved. * `emacs': 重量级GNU传统编辑器。RMS (Richard M. Stallman)原创。 * `xemacs': Emacs的下一代,由Lucid原创。 * `mcedit': 新型GNU编辑器。也就是`mc'内置编辑器。参阅节 4.3.5, `编辑器'. * `ae': 默认的小型编辑器(Potato)。通常不用它。 * `nano': 默认的小型GNU编辑器(Woody)。类似`pico'。 * `joe': 用于旧式的WordStar或TurboPascal。 * `jed': 快速、多功能、菜单式编辑器,兼容Emacs键盘操作方式。 * `jove': 微型编辑器,兼容Emacs键盘操作方式。 * `nvi': 新版vi。Bug-for-bug compatible with the original vi. 使用`update-alternatives --config editor'命令可设置默认的编辑器。许多程序也使用环境变量`EDITOR'或`VISUAL'来调用编辑器。参阅节 4.3.5, `编辑器'. 还有一些运行于X环境的编辑器也值得一提: * `gvim': Vim with GUI (`vim' and `vim-gtk' package) * `emacs': The One True Emacs (auto-detect X). * `xemacs': Next generation Emacs (auto-detect X). 这些X客户端的命令使用标准选项如`-fn ',这对象我这样的老家伙来说就再好不过了:)参阅节 9.4.4, `X客户端'。 11.2. 应急的编辑器 ------------------ 有些编辑器安装在`/bin'下,这类编辑器至少应该安装一个,以免当`/usr'不能访问时,无法编辑文件。 * `elvis-tiny': 最小的vi编辑器(用`vi'命令开打) * `nano-tiny': 最小的非vi编辑器(用`nano-tiny'命令打开) * `ed': 最小的编辑器(常驻系统但使用起来极不方便) 11.3. Emacs和Vim ---------------- 11.3.1. Vim提示 --------------- 程序运行时可按下阅读“VIM - main help file”文档。 帮助 返回到正常模式 V Visual模式 i Insert模式 : 命令行命令 :set tw=72 设置文本宽为72 Insert (paste) 模式 :r! date -R Insert RFC-822 数据 q 将键盘操作记录到注册表 q 停止键盘操作记录 @ 播放注册表中记录的键盘操作 :edit 载入并编辑另一个文件 :wnext 写入当前文件然后编辑下一个文件 `q'和`@'可用来记录简单的键盘宏然后回放它们。例如,想创建一个宏为光标所在处的单词加上HTML斜体字标签,可以输入`qii^[ea^[q'(此处`^['表示按ESC键)。然后,在单词前输入`@i',编辑器就会自动为它加上。 亦可参阅节 14.4.2, `在Vim中使用GnuPG'. 11.3.2. Emacs提示 ----------------- 帮助 菜单 C-u M-! date -R 插入RFC-822数据 11.3.3. 打开编辑器 ------------------ 打开编辑器: emacs filename vim filename 以vi兼容方式打开: vim -C 以vi不兼容方式打开: vim -N 默认编译方式打开: emacs -q vim -N -u NONE 11.3.4. 编辑器命令总汇(Emacs,Vim) ------------------------------------ exit: C-x C-c :qa /:wq /:xa /:q! Get back/command mode: C-g Backward(left): C-b h Forward(right): C-f l Next(down): C-n j Previous(up): C-p k stArt of line(^): C-a 0 End of line($): C-e $ mUltiple commands: C-u nnn cmd nnn cmd Multiple commands: M-digitkey cmd save File: C-x C-s :w file beginning of buffer: M-< 1G end of buffer: M-> G scroll forward 1 screen: C-v ^F scroll forward 1/2 screen: ^D scroll forward 1 line: ^E scroll backward 1 screen: M-v ^B scroll backward 1/2 screen: ^U scroll backward 1 line: ^Y scroll the other window: M-C-v delete under cursor: C-d x delete from cursor to eol: C-k D iSearch forward: C-s isearch Reverse: C-r Search forward: C-s enter / search Reverse: C-r enter ? isearch regexp: M-C-s isearch backward regexp: M-C-r search regexp: M-C-s enter / search backward regexp: M-C-r enter ? Help: C-h C-h :help Help Apropos: C-h a Help key Bindings: C-h b :help [key] Help Info: C-h i Help Major mode: C-h m Help tutorial: C-h t :help howto Undo: C-_ u Redo: C-f ^R Mark cursor position: C-@ m{a-zA-Z} eXchange Mark and position: C-x C-x goto mark in current file: '{a-z} goto mark in any file: '{A-Z} copy region: M-w {visual}y kill region: C-w {visual}d Yank and keep buffer: C-y Yank from kill buffer: M-y p convert region to Upper: C-x C-u {visual}U convert region to Lower: C-x C-l {visual}u Insert special char: C-q octalnum/keystroke ^V decimal/keystroke replace: M-x replace-string :%s/aaa/bbb/g replace regexp: M-x replace-regexp :%s/aaa/bbb/g query replace: M-% :%s/aaa/bbb/gc query replace: M-x query-replace query replace regexp: M-x query-replace-regexp Open file: C-x C-f :r file Save file: C-x C-s :w Save all buffers: C-x s :wa Save as: C-x C-w file :w file Prompt for buffer: C-x b List buffers: C-x C-b :buffers Toggle read-only: C-x C-q :set ro Prompt and kill buffer: C-x k Split vertical: C-x 2 :split Split horizontal: C-x 3 :vsplit (ver. 6) Move to other window: C-x o ^Wp Delete this window: C-x 0 :q Delete other window(s): C-x 1 ^Wo run shell in bg: M-x compile kill shell run in bg: M-x kill-compilation run make: :make Makefile check error message: C-x` :echo errmsg run shell and record: M-x shell :!script -a tmp ...clean BS, ... :!col -b record ...save/recall shell record: C-x C-w record :r record run shell: M-! sh :sh run command: M-! cmd :!cmd run command and insert: C-u M-! cmd :r!cmd run filter: M-| file {visual}:w file run filter and insert: C-u M-| filter {visual}:!filter show option :se[t] {option}? reset option to default :se[t] {option}& reset boolean option :se[t] no{option} toggle boolean option :se[t] inv{option} wrap text at column 72 :se tw=72 do not wrap :se tw=0 autoindent :se ai expand tab :se et specify comment (mail) :se comments=n:>,n:\| run GDB M-x gdb describe GDB mode C-h m step one line M-s next line M-n step one instruction (stepi) M-i finish current stack frame C-c C-f continue M-c up arg frames M-u down arg frames M-d copy number from point, insert at the end C-x & set break point C-x SPC 11.3.5. Vim设置 --------------- 要使用Vim的全部功能和关键字高亮显示,请在`~/.vimrc'或`/etc/vimrc'中添加如下内容: set nocompatible set nopaste set pastetoggle= syn on 粘贴模式能避免自动缩进功能影响在控制台终端下的剪切-粘贴操作,它更象是“:set noai”。 有关GnuPG整合的信息参阅节 14.4.2, `在Vim中使用GnuPG'。 11.3.6. Ctags ------------- 执行`apt-get install exuberant-ctags',接着就可以在源代码文件中运行ctags了。在Vim中输入`:tag '可直接跳到function_name的开始行。它适用于C、C++、Java、Python、和其它许多编辑语言。 Emacs有相同的ctags功能。 11.3.7. 将高亮显示的屏显内容转化为HTML文件 ------------------------------------------ 在Vim命令模式下输入`so \$VIMRUNTIME/syntax/2html.vim'可以将屏幕上高亮显示的文本转化为HTML代码,然后`:w file.html'存盘,`:q'退出。对C等源代码特别适用。 11.3.8. 用`vim'分割屏显 ----------------------- `vim'可以在多分割窗口(multi-split-screen )环境下编辑多个文件。想了解有关详情可输入`:help usr_08.txt'。 要分割屏幕显示多个不同文件,在vi命令提示符后输入: :split :vsplit 或者在shell提示符后输入: $ vi -o file1.txt file2.txt # 水平分割 $ vi -O file1.txt file2.txt # 垂直分割 就可以打开多窗口vi。 $ vimdiff file.txt~ file.txt # 检查file.txt最近的修改情况 $ vimdiff file.en.sgml file.fr.sgml # 检查翻译情况 $ gvimdiff file.txt~ file.txt # 在X下 上述操作可以明确地显示源始文件与备份文件的差别。对SGML文件,它进行标签匹配检查,所以用它来检查翻译结果十分有效。 用CTRL-W命令指定光标移动: CTRL-W + 扩大窗口 CTRL-W - 缩小窗口 CTRL-W h 移动到窗口左边 CTRL-W j 移动到窗口下边 CTRL-W k 移动到窗口上边 CTRL-W l 移动到窗口右边 ... 下列命令用于滚屏控制: :set scrollbind :set noscrollbind ------------------------------------------------------------------------------- 12. 系统版本控制 ---------------- 12.1. CVS --------- 有关的详细信息可使用`lynx'查阅`/usr/share/doc/cvs/html-cvsclient',`/usr/share/doc/cvs/html-info',`/usr/share/doc/cvsbook'或执行`info cvs'及`man cvs'。 12.1.1. 安装CVS服务器 --------------------- 以下步骤配置的服务器,仅允许“src”用户组的成员访问CVS容器,并且仅“staff”用户组的成员才可管理CVS,这样做可以降低管理者不小心犯错的机率。 # cd /var/lib; umask 002 ; sudo mkdir cvs # [Woody] FSH # apt-get install cvs cvs-doc cvsbook # export CVSROOT= # cd $CVSROOT # chown root:src . # 设置为"staff"可加强对新建项目行为的限制 # chmod 3775 . # 如果上面的赋值为"staff",则使用2775 # cvs -d init # 在此明确地指定-d更安全 # cd CVSROOT # chown -R root:staff . # chmod 2775 . # touch val-tags # chmod 664 history val-tags # chown root:src history val-tags 12.1.2. CVS会话例子 ------------------- 下面我们来设置shell环境以便访问CVS容器。 12.1.2.1. 匿名CVS(仅用于下载) ------------------------------- 只读远程访问: $ export CVSROOT=:pserver: $ cvs login $ cvs -z3 co 12.1.2.2. 使用本地CVS服务器 --------------------------- 通过同一台机器上的shell进行本地访问: $ export CVSROOT= 12.1.2.3. 使用远程CVS pserver ----------------------------- 非SSH(在`cvs'中使用RSH协议)远程访问: $ export CVSROOT=:pserver: $ cvs login 易受窍听攻击。 12.1.2.4. 通过`ssh'使用远程CVS ------------------------------ 通过SSH进行远程访问: $ export CVSROOT=:ext: 或连接Sourceforge: $ export CVSROOT=:ext: 亦可使用RSA认证(节 9.5.3, `用更少的密码建立连接'),它不需要密码提示。 12.1.2.5. 新建CVS档案 --------------------- 要建立如下的档案, ITEM VALUE MEANING source tree: ~/ All source codes Project name: Name for this project Vendor Tag: Tag for the entire branch Release Tag: Tag for a specific release 则, $ cd ~/ # 进源码目录 ... 创建源码树 ... $ cvs import -m <"Start project-x" project-x Main-branch Release-initial> $ cd ..; rm -R ~/ 12.1.2.6. 使用CVS ----------------- 使用本地CVS容器来为工作: $ cd # 转到工作域 $ cvs co # 从CVS下载源码到本地 $ cd ... 修改源码内容 ... $ cvs diff -u # 相当于diff -u repository/ local/ $ cvs up -C # 撤消对文件地修改 $ cvs ci -m "" # 保存本地源码到CVS $ vi $ cvs add $ cvs ci -m "" $ cvs up # 从CVS合并最新版本 ... watch out for lines starting with "C " ... unmodified code is moved to `.#.version'. ... Search "<<<<<<<" and ">>>>>>>" in . $ cvs tag # 添加release tag ... edit further ... $ cvs tag -d # 移除release tag $ cvs ci -m "" $ cvs tag # 重新添加release tag $ cd # 返回工作域 $ cvs co -r -d ... get original version to directory $ cd old $ cvs tag -b # 创建branch (-b) tag ... Now you can work on the old version (Tag=sticky) $ cvs update ... Source tree now has sticky tag "Release-initial-bugfixes" ... Work on this branch $ cvs up # sync with files modified by others on this branch $ cvs ci -m "" $ cvs update -kk -A ... Remove sticky tag and forget contents ... Update from main trunk without keyword expansion $ cvs update -kk -j ... Merge from branch into the main ... trunk without keyword expansion. Fix conflicts with editor. $ cvs ci -m "" $ cd $ tar -cvzf # make archive, -j for bz2 $ cvs release -d # 删除本地源码(可选) 应该记住的几个选项(用作`cvs'命令行的第一个参数): -n dry run, no effect -t display messages showing steps of cvs activity 12.1.2.7. 从CVS取文件 --------------------- 要从CVS获得最新版本,用“tomorrow”: $ cvs ex -D tomorrow 12.1.2.8. 管理CVS ----------------- 为项目添加别名(本地服务器): $ su - admin # staff用户组成员 $ export CVSROOT= $ cvs co CVSROOT/modules $ cd CVSROOT $ echo " -a " >>modules $ cvs ci -m "" $ cvs release -d . $ exit # 按control-D从su返回 $ cvs co -d ... check out (alias:) from CVS to directory project $ cd project ... make changes to the content ... 12.1.3. CVS常见问题及解决方法 ----------------------------- 12.1.3.1. 容器中的文件权限 -------------------------- CVS不会覆盖当前容器中的文件,而是用另一个文件替换它。因此,_对容器目录的写权限_是很危险的权限。所以在新建容器时,请运行下面的命令,确保权限合适。 # cd # chown -R root:src # chmod -R ug+rwX # chmod 2775 # if needed, this and subdirectory 12.1.3.2. 执行标记(execution bit) ----------------------------------- 当文件被别人取走后会保留执行标记,任何时候你遇到外出文件存在执行权限问题,可用下面的命令在CVS容器中修改文件权限。 # chmod ugo-x 12.1.4. CVS命令 --------------- 这儿是一些CVS命令的用法简介。 {add|ad|new} [-k kflag] [-m 'message'] files... {admin|adm|rcs} [rcs-options] files... {annotate|ann} [options] [files...] {checkout|co|get} [options] modules... {commit|ci|com} [-lnR] [-m 'log_message' | -f file] \ [-r revision] [files...] {diff|di|dif} [-kl] [rcsdiff_options] [[-r rev1 | -D date1] \ [-r rev2 | -D date2]] [files...] {export|ex|exp} [-flNn] -r rev|-D date [-d dir] [-k kflag] module... {history|hi|his} [-report] [-flags] [-options args] [files...] {import|im|imp} [-options] repository vendortag releasetag... {login|logon|lgn} {log|lo|rlog} [-l] rlog-options [files...] {rdiff|patch|pa} [-flags] [-V vn] [-r t|-D d [-r t2|-D d2]] modules... {release|re|rel} [-d] directories... {remove|rm|delete} [-lR] [files...] {rtag|rt|rfreeze} [-falnR] [-b] [-d] [-r tag | -D date] \ symbolic_tag modules... {status|st|stat} [-lR] [-v] [files...] {tag|ta|freeze} [-lR] [-F] [-b] [-d] [-r tag | -D date] [-f] \ symbolic_tag [files...] {update|up|upd} [-AdflPpR] [-d] [-r tag|-D date] files... 12.2. Subversion ---------------- Subversion是下一代版本控制系统,它将替代CVS。当前开发者称它还处于“alpha”阶段,但对大多数用户而言它已足够稳定了。到本文档写作之时,Subversion仅在Debian unstable版中可用。 12.2.1. 安装Subversion服务器 ---------------------------- The `subversion-server' meta-package依赖一些关联包(`libapache2-dav-svn'和`subversion-tools')来配置服务器。 12.2.1.1. 创建容器 ------------------ 当前,`subversion'软件包无法创建容器,所以用户需要手工创建它们。通常可在`/var/local/repos'下创建容器。 创建目录: # mkdir -p /var/local/repos 创建容器数据库: # svnadmin create /var/local/repos 将容器的写权限赋给www server: # chown -R www-data:www-data /var/local/repos 12.2.1.2. 配置Apache2 --------------------- 通过用户认证授权访问容器,添加(或去掉注释符)下列内容到`/etc/apache2/mods-available/dav_svn.conf': DAV svn SVNPath /var/local/repos AuthType Basic AuthName "Subversion repository" AuthUserFile /etc/subversion/passwd Require valid-user 接着,使用下面的命令创建用户认证文件: htpasswd2 -c /etc/subversion/passwd some-username 重启Apache2,就可以使用URLhttp:///repos来访问新的subversion容器了。 12.2.2. 将CVS容器迁移到Subversion --------------------------------- 12.2.3. Subversion用法样例 -------------------------- 下面的小节将教你如何在subversion下使用各种命令。 12.2.3.1. 创建新的Subversion档案 -------------------------------- 创建新的subversion档案,输入下面的命令: $ cd ~/ # 进你的源码目录 $ svn import http://localhost/repos \ -m "initial project import" 这将在你的subversion容器下创建一个名为的目录,用来存放你的项目文件。查看http://localhost/repos/它是否在那儿? 12.2.3.2. 使用subversion ------------------------ 用subversion来管理: $ cd # 转到工作域 $ svn co http://localhost/repos/ # 提取源码 $ cd ... 完成一些工作 ... $ svn diff # 相当于diff -u repository/ local/ $ svn revert # 撤消对文件所做的修改 $ svn ci -m "" # 将你做的修改保存到容器中 $ vi $ svn add $ svn add # 将所有的文件嵌套式地加到new_dir $ svn add -N # 非嵌套式地添加目录 $ svn ci -m "Added , , " $ svn up # 从容器中合并最新的版本 $ svn log # 显示所有修改记录 $ svn copy http://localhost/repos/ \ http://localhost/repos/ \ -m "creating my branch of " # branching $ svn copy http://localhost/repos/ \ http://localhost/repos/ \ -m " 1.0 release" # added release tag ... note that branching and tagging are the same. The only difference ... is that branches get committed whereas tags do not. ... make changes to branch ... $ # merge branched copy back to main copy $ svn merge http://localhost/repos/ \ http://localhost/repos/ $ svn co -r 4 http://localhost/repos/ # get revision 4 ------------------------------------------------------------------------------- 13. 编程 -------- 不要用“test”命名可执行的测试文件。`test'是一个shell的内建命令。 13.1. 从哪儿开始 ---------------- 参考资源: * `/usr/share/doc/'下的文档和样例 * Unix / Programming Information (http://arioch.unomaha.edu/~jclark/#info) * _Linux Programming Bible_ (John Goerzen/IDG books) 更详细的文档可以从GNU (http://www.gnu.org/)获得打印版本。 接下来的四个小节中包含了用不同的编程语言编写的脚本样例,该脚本创建一个包含用户帐户信息的文本文件,调用一组进程如newusers程序,将这些信息加入到`/etc/passwd'。每个脚本均需要一个输入文件,该文件应包含格式如`first_name last_name password'的行。(这些脚本并不创建真正的用户目录。) 13.2. Shell ----------- 理解类Unix系统如何工作的_最好_方法就是阅读shell脚本。在此,我们就shell编程做个简单的介绍。 13.2.1. Bash -- _GNU_标准交互式shell ------------------------------------ Bash参考资源: * bash(1) * `info bash' * the LDP BASH Programming - Introduction HOWTO (http://www.tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html) as starter information. * `mc /usr/share/doc/bash/examples/ /usr/share/doc/bash/' (安装`bash-doc'软件包阅读样例文件。) * _Learning the bash Shell_, 2nd edition (O'Reilly) 一个简短的程序样例(从标准输入端创建帐户信息供`newusers'使用): #!/bin/bash # (C) Osamu Aoki Sun Aug 26 16:53:55 UTC 2001 Public Domain pid=1000; while read n1 n2 n3 ; do if [ ${n1:0:1} != "#" ]; then let pid=$pid+1 echo ${n1}_${n2}:password:${pid}:${pid}:,,,/home/${n1}_${n2}:/bin/bash fi done 13.2.2. POSIX shells -------------------- Debian中有几个软件包提供了POSIX shell: * `dash' (Sarge) * Priority: optional * Installed-Size: 176 * Smallest and much fastest --- best for initial boot * `ash' (Woody) * Priority: optional * Installed-Size: 180 * Smaller and much faster --- good for initial boot * `bash' * Essential: yes * Priority: required * Installed-Size: 580 * Larger and featureful --- many extensions implemented * `pdksh' * Priority: optional * Installed-Size: 408 * Complete AT&T ksh look-alike 如果你想编写具有通用性的shell脚本,最好写POSIX shell脚本。可将`/bin/sh'链接到`ash'或(`dash')来测试脚本的POSIX兼容性。避免用_bash化_或_zsh化_(它看起来与csh语法很相似)的思维去编写脚本。例如,应避免: * `if [ == ] ; then ...' * `diff -u .c{.orig,}' * `mkdir {,}' 13.2.3. Shell参数 ----------------- Several _special parameters_ to remember: $0 = shell名称或shel脚本名称 $1 = 第一个(1)shell参数 ... $9 = 第九个(9)shell参数 $# = 位置参数的个数 "$*" = "$1 $2 $3 $4 ... $" "$@" = "$1" "$2" "$3" "$4" ... "$" $? = 最近执行的命令的退出状态 $$ = 当前shell脚本的PID $! = 最近启动的后台作业的PID 需要记住的基本_扩展参数_: Form If is set If is not set ${:-} $ ${:+} null ${:=} $ (并且执行=) ${:?} $ (返回然后退出) 在此,冒号“:”在所有运算表达式中事实上均是可选的。 * 有“:” = 运算表达式测试“存在”和“非空”。 * 没有“:” = 运算表达式仅测试“存在”。 需要记住的_替换参数_: Form Result ${%} 删除位于var结尾的最小匹配模式 ${%%} 删除位于var结尾的最大匹配模式 ${#} 删除位于var开头的最小匹配模式 ${##} 删除位于var开头的最大匹配模式 13.2.4. Shell重定向 ------------------- 需要记住的基本_重定向_(redirection)运算符(在此[]表示可选参数): []> 重定向标准输出(或 )到。 []>> 重定向标准输出(或 )到。 []< 重定向到标准输入(或 )。 []>& 重定向标准输出(或 )到。 > >&2 重定向标准输出和错误输出到。 | 将标准输出通过管道传递给。 >&2 | 将标准输出或错误输出通过管道传递给。 13.2.5. Shell条件表达式 ----------------------- 每条命令均可返回一个_退出状态_,这个状态值可用于条件表达式: * 成功:0 (True) * 错误:1--255 (False) 注意该用法,返回值0用来表示“true”与计算机其它领域中常见的转换是不同的。另外`['等阶于使用`test'命令进行参数赋值`]'相当于一个条件表达式。 需要记住的常用基本_条件表达式_: && || if [ ]; then else fi 在条件表达式中使用的_文件_比较运算符有: -e 存在则返回True。 -d 存在且是一个目录则返回True。 -f 如果存在且是一个普通文件则返回True。 -w 如果存在且可写则返回True。 -x 如果存在且可执行则返回True。 -nt 如果新则返回True。(指修改日期) -ot 如果旧则返回True。(指修改日期) -ef 如果两者是相同的设备和具有相同的结点(inode)数则返回True。 条件表达式中使用的_字符串_比较运算符有: -z 如果长度为零则返回True。 -n 如果长度为非零则返回True。 == 如果字符串相等则返回True。 = 如果字符串相等则返回True。 (使用"=="代替"="符合严格意义上的POSIX兼容) != 如果字符串不相等则返回True。 < 如果排在之前则返回True(与当前位置有关)。 > 如果排在之后则返回True(与当前位置有关)。 条件表达式中的_算术_整数比较运算符有`-eq'、`-ne'、`-lt'、`-le'、`-gt'和`-ge'。 13.2.6. 命令行处理 ------------------ shell按如下的方式处理脚本: * 用这些字符将其分割成_tokens_:SPACE, TAB, NEWLINE, ;, (, ), <, >, |, & * 如果不在"..."或'...'内就检查_keyword_(循环检查) * 如果不在"..."或'...'内就扩展_alias_(循环检查) * 如果不在"..."或'...'内就扩展_brace_,`a{1,2}' -> `a1 a2' * 如果不在"..."或'...'内就扩展_tilde_, ~ -> 's home directory * 如果不在'...'内就扩展_parameter_, $ * 如果不在'...'内就扩展_command substitution_, $() * 如果不在"..."或'...'内就用$IFS分割成_words_ * 如果不在"..."或'...'内就扩展_pathname_ *?[] * 查找_command_ * function * built-in * file in $PATH * 循环 在双单号内单引号将失效。 13.3. Awk --------- Awk的参考资源: * _Effective awk Programming_, 3rd edition (O'Reilly) * _Sed & awk_, 2nd edition (O'Reilly) * mawk(1) and gawk(1) * `info gawk' 简短的程序样例(创建`newusers'命令输入): #!/usr/bin/awk -f # Script to create a file suitable for use in the 'newusers' command, # from a file consisting of user IDs and passwords in the form: # first_name last_name password # Copyright (c) KMSelf Sat Aug 25 20:47:38 PDT 2001 # Distributed under GNU GPL v 2, or at your option, any later version. # This program is distributed WITHOUT ANY WARRANTY. BEGIN { # Assign starting UID, GID if ( ARGC > 2 ) { startuid = ARGV[1] delete ARGV[1] } else { printf( "Usage: newusers startUID file\n" \ " where:\n" \ " startUID is the starting userid to add, and\n" \ " file is an input file in form:\n" \ " first_name last_name password\n" \ ) exit } infile = ARGV[1] printf( "Starting UID: %s\n\n", startuid ) } /^#/ { next } { ++record first = $1 last = $2 passwd = $3 user= substr( tolower( first ), 1, 1 ) tolower( last ) uid = startuid + record - 1 gid = uid printf( "%s:%s:%d:%d:%s %s,,/home/%s:/bin/bash\n", \ user, passwd, uid, gid, first, last, user \ ) } Debian中有两个软件包提供了POSIX `awk': * `mawk' * Priority: required * Installed-Size: 228 * Smaller and much faster --- good for default install * Compile-time limits exist * NF = 32767 * sprintf buffer = 1020 * `gawk' * Priority: optional * Installed-Size: 1708 * Larger and featureful --- many extensions implemented * System V Release 4 version of UNIX * Bell Labs awk * GNU-specific 13.4. Perl ---------- 运行于类Unix系统上的_解释器_。 Perl参考资源: * perl(1) * _Programming Perl_, 3rd edition (O'Reilly) 简短的程序样例(创建`newusers'命令输入): #!/usr/bin/perl # (C) Osamu Aoki Sun Aug 26 16:53:55 UTC 2001 Public Domain $pid=1000; while () { if (/^#/) { next;} chop; $pid++; ($n1, $n2, $n3) = split / /; print $n1,"_",$n2,":", $n3, ":",$pid, ":",$pid,",,,/home/",$n1,"_",$n2,":/bin/bash\n" } 安装Perl模块: # perl -MCPAN -e 'install ' 13.5. Python ------------ 一个不错的面向对象的解释器。 Python参考资源: * python(1) * _Learning Python_ (O'Reilly). 简短的程序样例(创建`newusers'命令输入): #! /usr/bin/env python import sys, string # (C) Osamu Aoki Sun Aug 26 16:53:55 UTC 2001 Public Domain # Ported from awk script by KMSelf Sat Aug 25 20:47:38 PDT 2001 # This program is distributed WITHOUT ANY WARRANTY. def usages(): print \ "Usage: ", sys.argv[0], " start_UID [filename]\n" \ "\tstartUID is the starting userid to add.\n" \ "\tfilename is input file name. If not specified, standard input.\n\n" \ "Input file format:\n"\ "\tfirst_name last_name password\n" return 1 def parsefile(startuid): # # main filtering # uid = startuid while 1: line = infile.readline() if not line: break if line[0] == '#': continue (first, last, passwd) = string.split(string.lower(line)) # above crashes with wrong # of parameters :-) user = first[0] + last gid = uid lineout = "%s:%s:%d:%d:%s %s,,/home/%s:/bin/bash\n" % \ (user, passwd, uid, gid, first, last, user) sys.stdout.write(lineout) +uid if __name__ == '__main__': if len(sys.argv) == 1: usages() else: uid = int(sys.argv[1]) #print "# UID start from: %d\n" % uid if len(sys.argv) > 1: infilename = string.join(sys.argv[2:]) infile = open(infilename, 'r') #print "# Read file from: %s\n\n" % infilename else: infile = sys.stdin parsefile(uid) 13.6. Make ---------- Make参考资源: * `info make' * make(1) * _Managing Projects with make_, 2nd edition (O'Reilly) 简单自动变量: 语法规则: : [ ... ] [TAB] [TAB] - # ignore errors [TAB] @ # suppress echoing 在此`[TAB]'代表一个TAB符。完成变量代换后shell将逐行进行解释。在行尾使用`\'可以续行。使用`$$'可将`$'加入到shell脚本的环境变量中。 适用于的隐含的等价规则: %: %.c header.h or, %.o: %.c header.h 在此,包含了`%'字符(确切地说是其中之一),`%'可匹配实际的target文件名中任何非空子串。同样也使用`%'来显示它们的名字是如何关联到实际的target文件名的。 用_Suffix rules_方法来定义`make'的隐含规则(implicit rules)已经_过时_。GNU `make'因为兼容性的考虑仍支持它,但只要有可能就应该使用与之等价的模版规则(pattern rules): old suffix rule --> new pattern rule .c: --> % : %.c .c.o: --> %.o: %.c 上述规则所使用的自动变量: foo.o: new1.c new2.c old1.c new3.c $@ == foo.o (target) $< == new1.c (first one) $? == new1.c new2.c new3.c (newer ones) $^ == new1.c new2.c old1.c new3.c (all) $* == `%' matched stem in the target pattern. 变量参考: foo1 := bar # One-time expansion foo2 = bar # Recursive expansion foo3 += bar # Append SRCS := $(wildcard *.c) OBJS := $(foo:c=o) OBJS := $(foo:%.c=%.o) OBJS := $(patsubst %.c,%.o,$(foo)) DIRS = $(dir directory/filename.ext) # Extracts "directory" $(notdir NAMES...), $(basename NAMES...), $(suffix NAMES...) ... 执行`make -p -f/dev/null'可查看内部自动规则。 13.7. C ------- 准备工作: # apt-get install glibc-doc manpages-dev libc6-dev gcc C参考资源: * `info libc' (C library function reference) * gcc(1) * each_C_library_function_name(3) * Kernighan & Ritchie, _The C Programming Language_, 2nd edition (Prentice Hall). 13.7.1. 简单C编程(`gcc') ------------------------ 一个简单的例子,将`example.c'和库函数`libm'编译成可执行文件`run_example': A simple example to compile `example.c' with a library `libm' into an executable `run_example': $ cat > example.c << EOF #include #include #include int main(int argc, char **argv, char **envp){ double x; char y[11]; x=sqrt(argc+7.5); strncpy(y, argv[0], 10); /* prevent buffer overflow */ y[10] = '\0'; /* fill to make sure string ends with '\0' */ printf("%5i, %5.3f, %10s, %10s\n", argc, x, y, argv[1]); return 0; } EOF $ gcc -Wall -g -o run_example example.c -lm $ ./run_example 1, 2.915, ./run_exam, (null) $ ./run_example 1234567890qwerty 2, 3.082, ./run_exam, 1234567890qwerty 在此,sqrt()链接库函数`lib_m_'需要`-l_m_'选项。真正的库函数是位于`/lib'下的`libm.so.6',它是`libm-2.1.3.so'的一个符号链接。 看看输出文本中最后的参数,尽管指定了`%10s',它还是多于10个字符。 使用不带边界检查的指针内存操作函数如`sprintf'和`strcpy'会妨碍缓冲区溢出侦测,故使用`snprintf'和`strncpy'。 13.7.2. 调试 ------------ 13.7.2.1. 使用`gdb'进行调试 --------------------------- 准备工作: # apt-get install gdb `gdb'参考资源: * `info gdb' (tutorial) * gdb(1) * http://www.unknownroad.com/rtfm/gdbtut/gdbtoc.html 使用`-g'选项编译程序就可使用`gdb'进行调试。许多命令都可以缩写。Tab扩展功能和在shell中的一样。 $ gdb program (gdb) b 1 # 在line 1设置断点 (gdb) run # 运行程序 (gdb) next # 下一行 ... (gdb) step # 前进一步 ... (gdb) p parm # 打印parm ... (gdb) p parm=12 # 设置其值为12 在Emacs环境下调试程序,参阅节 11.3.4, `编辑器命令总汇(Emacs,Vim)'。 13.7.2.2. 检查库函数关联关系 ---------------------------- 使用`ldd'可查看程序与库函数的关联关系: $ ldd /bin/ls librt.so.1 => /lib/librt.so.1 (0x4001e000) libc.so.6 => /lib/libc.so.6 (0x40030000) libpthread.so.0 => /lib/libpthread.so.0 (0x40153000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) 可在chrooted环境下使用`ls'检查上述库函数在你的`chroot'环境中是否可见。 下面的命令也很有用: * `strace': 跟踪系统调用和消息 * `ltrace': 跟踪库函数调用 13.7.2.3. 使用内存查漏工具进行调试 ---------------------------------- Debian中有几个内存查漏工具。 * `njamd' * `valgrind' * `dmalloc' * `electric-fence' * `memprof' * `memwatch' (not packaged, get this from memwatch (http://directory.fsf.org/devel/debug/memwatch.html).) * `mpatrol' * `leaktracer' * `libgc6' * `Insure++' from Parasoft (http://www.parasoft.com). (non-free, commercial for fee) 亦可查阅Debugging Tools for Dynamic Storage Allocation and Memory Management (http://www.cs.colorado.edu/homes/zorn/public_html/MallocDebug.html). 13.7.3. Flex -- 更好的Lex ------------------------- `flex'是一个快速的词法分析机生成器。 `flex'参考资源: * `info flex' (tutorial) * flex(1) 需要提供你自己的`main()'或`yywrap()',或者你的`program.l'象这样不带library编译(`yywrap'是一个宏;`%option main'隐含地打开了`%option noyywrap'): %option main %% .|\n ECHO ; %% 另外,还可以在`cc'命令行末尾加上-`lfl'链接选项进行编译(象AT&T-Lex使用`-ll'一样),此时就不需要`%option'了。 13.7.4. Bison -- 更好的Yacc --------------------------- Debian中有几个软件包提供了与Yacc兼容的LALR词法生成器: * `bison': GNU LALR parser generator * `byacc': The Berkeley LALR parser generator * `byyacc': Backtracking parser generator based on `byacc' `bison'参考资源: * `info bison' (tutorial) * bison(1) 需要提供自己的`main()'和`yyerror()'。`main()'调用`yyparse()',而`yyparse()'调用`yylex()',通常由FleX创建。 %% %% 13.7.5. Autoconf ---------------- `autoconf'一个shell脚本生成工具,由它生成的脚本能自动配置软件源码包,以适用于各种使用全套GNU build系统的类UNIX系统。 `autoconf'会生成配置脚本`configure'。`configure'使用`Makefile.in'模版自动创建自定义`Makefile'。 13.7.5.1. 编译并安装程序 ------------------------ Debian不会改动`/usr/local'下的文件(参阅节 2.5, `多样性支持')。所以如果是从源码编译程序,并将其安装到`/usr/local'下,是不会影响到Debian的。 $ cd src $ ./configure --prefix=/usr/local $ make $ make install # this puts the files in the system 13.7.5.2. 卸载程序 ------------------ 如果仍保存有源码,对其使用了`autoconf'/`automake',并且记得是如何进行配置的: $ ./configure # make uninstall 另一种方法是,如果可以确定安装过程将文件都放在了`/usr/local',并且该目录下没有什么别的重要文件,可用下面的命令将其全部删除: # find /usr/local -type f -print0 | xargs -0 rm -f 如果不能确定文件安装到什么位置,最好使用`checkinstall',该命令可提供明确的卸载路径。 13.8. 准备文档 -------------- 13.8.1. `roff'排版 ------------------ 传统上,`roff'是主要的Unix文字处理系统。 参阅roff(7)、groff(7)、groff(1)、grotty(1)、troff(1)、groff_mdoc(7)、groff_man(7)、groff_ms(7)、groff_me(7)、groff_mm(7)以及`info groff'。 `-me'宏提供了一个不错了说明文档。如果使用的是groff(1.18或更新的版本),找到`/usr/share/doc/groff/meintro.me.gz'并执行下面的命令: $ zcat /usr/share/doc/groff/meintro.me.gz | \ groff -Tascii -me - | less -R 下面的命令将生成一个完整的纯文本文件: $ zcat /usr/share/doc/groff/meintro.me.gz | \ GROFF_NO_SGR=1 groff -Tascii -me - | col -b -x > 如果想打印出来,可使用PostScript输出: $ groff -Tps | lpr $ groff -Tps | mpage -2 | lpr 13.8.2. SGML ------------ 准备工作: # apt-get install debiandoc-sgml debiandoc-sgml-doc `debiandoc-sgml'参考资源: * `/usr/share/doc/debiandoc-sgml-doc' * debiandoc-sgml(1) * _DocBook: The Definitive Guide_, by Walsh and Muellner (O'Reilly) SGML能管理多重格式的文档。更简单的SGML系统是Debiandoc,本文档就使用到它完成的。只需对原始的文本文件的下列字符进行少许转换: * "<" --> `<' * ">" --> `>' * " " --> ` ' (non-breakable space) * "&" --> `&' * "%" --> `%' * "(C)" --> `©' * "--" --> `–' * "---" --> `—' 设置章节为非打印注释,输入: 设置章节为可控注释,输入: 在SGML中,仅条目的_首次声明_(first definition)有效。例如: ]]> ¶m; 最终结果是“Data 1”。如果第一行使用“IGNORE”而非“INCLUDE”,则最终结果为“Data 2”(第二行是一个候选声明)。同样,重复出现的短语可分别提前在文档中定义。 "my"> Hello &; friend. This is &; book. 该定义的结果如下: Hello my friend. This is my book. 可参阅examples (http://www.debian.org/doc/manuals/debian-reference/examples/)目录中简短的SGML样例文件`sample.sgml'。 当SGML文档不断增大后,TeX偶尔会出错。可通过修改`/etc/texmf/texmf.cnf',增加缓冲池的容量来解决这个问题(更好的方法是编辑`/etc/texmf/texmf.d/95NonPath'然后运行`update-texmf')。 13.9. 打包 ---------- 准备工作: # apt-get install debian-policy developers-reference \ maint-guide dh-make debhelper # apt-get install packaging-manual # if Potato 有关打包的参考资源: * 节 2.2, `Debian软件包管理系统' (basics) * Debian New Maintainers' Guide (tutorial) * dh-make(1) * Debian Developer's Reference (best practice) * Debian Policy Manual (authoritative) * Packaging Manual (Potato) 13.9.1. 单个二进制文件打包 -------------------------- Joey Hess的快速粗糙的打包法:生成一个单独的二进制包 # mkdir -p mypkg/usr/bin mypkg/DEBIAN # cp binary mypkg/usr/bin # cat > mypkg/DEBIAN/control Package: mypackage Version: 1 Architecture: i386 Maintainer: Joey Hess Description: my little package Don't expect much. ^D # dpkg-deb -b mypkg 13.9.2. 使用工具打包 -------------------- 使用`dh_make'软件包中的`dh-make'工具创建一个基线包,接着按照dh-make(1)中描述的方法打包。会用到`debian/rules'中的`debhelper'。 一个较老的方法是使用`debmake'软件包中的`deb-make'。不需要`debhelper'脚本,仅需要shell环境。 有关多重源码包的例子,参阅“mc”(`dpkg-source -x mc_4.5.54.dsc'),其中用到Adam Heath()的“sys-build.mk”以及“glibc”(`dpkg-source -x glibc_2.2.4-1.dsc')它由已故的Joel Klecker()所写的另一个系统打包。 ------------------------------------------------------------------------------- 14. GnuPG --------- 参考资源: * gpg(1). * `/usr/share/doc/gnupg/README.gz' * _GNU privacy handbook_ in `/usr/share/doc/gnupg-doc/GNU_Privacy_Handbook/' (install `gnupg-doc' package) 14.1. 安装GnuPG --------------- # gpg --gen-key # 生成新key # gpg --gen-revoke # generate revoke key for # host -l pgp.net | grep www|less # 查找pgp keyservers 目前,好的keyservers有: keyserver wwwkeys.eu.pgp.net keyserver wwwkeys.pgp.net 必须注意_不能创建2个以上的sub-keys_,如果这样做了,pgp.net上的keyservers会_废除_(corrupt)你的key。使用新版的`gnupg'(>1.2.1-2)来处理这些废subkeys。参阅http://fortytwo.ch/gpg/subkeys。 同样,在`$HOME/.gnupg/options'中只能指定一个keyserver。 所以下面的配置将无法工作: keyserver search.keyserver.net keyserver pgp.ai.mit.edu 14.2. 使用GnuPG --------------- 文件处理: $ gpg [options] $ gpg {--armor|-a} {--sign|-s} # sign file into a text .asc $ gpg --clearsign # clear-sign message $ gpg --clearsign --not-dash-escaped # clear-sign patchfile $ gpg --verify # verify clear-signed $ gpg -o {-b|--detach-sig} # create detached signature $ gpg --verify # verify with $ gpg -o {--recipient|-r} {--encrypt|-e} # public-key encryption intended for name $ gpg -o {--symmetric|-c} # 对称加密 $ gpg -o --decrypt crypt_file # 解密 14.3. 管理GnuPG --------------- Key管理: $ gpg --edit-key # "help"获得帮助,交互式 $ gpg -o --exports # 将所有keys导出到 $ gpg --imports # 从导出所有keys $ gpg --send-keys # 将发送给keyserver $ gpg --recv-keys # 从keyserver接收的key $ gpg --list-keys # 列出的key $ gpg --list-sigs # 列出的sig. $ gpg --check-sigs # 检查的sig. $ gpg --fingerprint # 检查的fingerprint $ gpg --list-sigs | grep '^sig' | grep '[User id not found]' \ | awk '{print $2}' | sort -u | xargs gpg --recv-keys # get unknown keys # 更新所有未知sigs. Trust代码: - 没指定任何ownertrust/还没进行计算。 e Trust计算失败。 q 没有足够的信息进行计算。 n 该key不可信。 m 最低限度的可信。 f 完全可信。 u 绝对可信。 下面的操作将我的key“”上载到多路keyserver: $ for xx in us es cz de dk uk ch net.uk earth.net.uk; \ $ do gpg --keyserver wwwkeys.$xx.pgp.net --send-keys ; done 14.4. 在应用程序中使用GnuPG --------------------------- 14.4.1. 在Mutt中使用GnuPG ------------------------- 在`~/.muttrc'中加入下列内容,将会自动启动一个低速的GnuPG,在index菜单输入``S''即可使用它。 macro index S ":toggle pgp_verify_sig\n" set pgp_verify_sig=no 14.4.2. 在Vim中使用GnuPG ------------------------ 将examples subdirectory (http://www.debian.org/doc/manuals/debian-reference/examples/)下的`_vimrc'文件的内容加入到`~/.vimrc'就可以运行GnuPG了。 ------------------------------------------------------------------------------- 15. Debian技术支持 ------------------ 下列资源提供了与Debian相关的帮助、建议和支持。在邮件列表里大呼救命之前,务必先好好使用这些资源自助。:) 注意,系统中存在大量的文档,可使用WWW浏览器访问,或通过`dwww'或`dhelp'命令在相关的目录中找到它们。 15.1. 参考资料 -------------- 下列资源适用于Debian和通用Linux。如果它们的内容出现相互冲突,应该相信首要(primary)来源而不是第二来源(secondary)如本文档。 * 安装手册(primary) * 在安装和升级前阅读。 * Web: http://www.debian.org/releases/stable/installmanual * Web: http://www.debian.org/releases/testing/installmanual(写作中,有时不可用) * Package: `Not available in install-doc: Bug#155374' * File: `Debian CD under /doc/' * 发布笔记(primary) * 安装和升级前必读文档,即使你已是经验丰富。 * Web: http://www.debian.org/releases/stable/releasenotes * Web: http://www.debian.org/releases/testing/releasenotes(写作中,有时不可用) * Package: `Not available in install-doc: Bug#155374' * File: `Debian CD under /doc/' * FAQ (secondary) * 常见问题 * Web: http://www.debian.org/doc/manuals/debian-faq/ * Package: `doc-debian' * File: `/usr/share/doc/debian/FAQ/index.html' * Debian参考手册 (secondary) * 最全面的用户使用手册 * Web: http://www.debian.org/doc/manuals/debian-reference/ * Package: `debian-reference-zh-cn' * File: `/usr/share/doc/Debian/reference/' * APT HOWTO (secondary) * Debian软件包管理系统的详细用户指面。(woody) * Web: http://www.debian.org/doc/manuals/apt-howto/ * Package: `apt-howto' * File: `/usr/share/doc/Debian/apt-howto/' * Debian安全手册(secondary) * 有关如何强化默认安装下Debian系统安全的详细用户指南。(woody) * Web: http://www.debian.org/doc/manuals/securing-debian-howto/ * Package: `harden-doc' * File: `/usr/share/doc/harden-doc/html/securing-debian-howto/' * `dselect'初学者文档(secondary) * `dselect'使用教程 * Web: http://www.debian.org/releases/woody/i386/dselect-beginner * Package: `Not available in install-doc: Bug#155374' * File: `Debian CD under /doc/' * Debian Policy Manual (primary) * Debian的基本技术架构。 * Web: http://www.debian.org/doc/debian-policy/ * Package: `debian-policy' * File: `/usr/share/doc/debian-policy/' * Debian Developer's Reference (primary) * 开发者需了解的基础知识。 * 我们中的一部分人也需要读一遍。 * Web: http://www.debian.org/doc/manuals/developers-reference/ * Package: `developers-reference' * File: `/usr/share/doc/developers-reference/' * Debian New Maintainers' Guide (primary) * 开发人员实用指南。 * 我们中的一部分需要阅读其中的打包教程。 * Web: http://www.debian.org/doc/manuals/maint-guide/ * Package: `maint-guide' * File: `/usr/share/doc/maint-guide/' * Packaging Manual (potato) * potato中的`packaging-manual' package。(已移到_Developer's Reference_的附录中) * Unix-style manual pages (primary) * `man ' * GNU-style info pages (primary) * `info ' * Package specific documents (primary) * `/usr/share/doc/'下可找到它们 * LDP: Linux Documentation Project (secondary) * 通用Linux HOWTOs和mini-HOWTOs * Web: http://www.tldp.org/ * Package: `doc-linux-text' * File: `/usr/share/doc/HOWTO/' * DDP: Debian Documentation Project (secondary) * Debian-specific manuals * Web: http://www.debian.org/doc/ * Debian Developers' Corner (secondary) * Key information for Debian developers * Insightful for end users * Web: http://www.debian.org/devel/ * 源代码(absolutely primary) * 没人会对此表示反对:-) * 按照节 2.1.15, `源代码'的方法下载源代码 下列是Unix通用的参考资源。注意各种Unix系统之间存在着稍许不同。设备名称和初始化方式需要格外注意。 * _The UNIX Programming Environment_ * 阅读本书了解UNIX如何运行。 * By B. W. Kernighan and R. Pike, * Published by Princeton Hall Software Series * _The C Programming Language_ (second edition) * 阅读本书学习ANSI C。 * By B. W. Kernighan and D. M. Ritchie * Published by Princeton Hall Software Series * _UNIX Power Tools_ * 阅读本书学习Unix使用技巧。 * By Jerry Peek, Tim O'Reilly and Mike Loukides * Published by O'Reilly and Associates * _Essential System Administration_ (second edition) * 阅读本书学习如何对各种风格的Unix进行系统管理。 * By Aeleen Frisch * Published by O'Reilly and Associates * Bell Labs: Computing Sciences Research * 有关Unix历史的翔实文献 * Main: http://cm.bell-labs.com/cm/cs/ * 技术报告精选: http://cm.bell-labs.com/cm/cs/cstr.html * 一些论文: http://cm.bell-labs.com/cm/cs/papers.html * On-line Linux general support resources * Debian Planet (http://www.debianplanet.org/) * debianHELP (http://www.debianhelp.org/) * Linux.com (http://linux.com/) * The Linux Home Page at Linux Online (http://www.linux.org/) * Red Hat (commercial Linux vender) (http://www.redhat.com/) (RPM, Sys-V init) * SuSE, Inc. (commercial Linux vender) (http://www.suse.de/) (RPM, Sys-V init) * Slackware (http://www.slackware.com/) (TGZ, BSD-style init) * On-line general Unix guide resources * A UNIX Introductory Course from Ohio State University (http://www-wks.acs.ohio-state.edu/unix_course/unix.html) * UNIXhelp from The University of Edinburgh (http://unixhelp.ed.ac.uk/) * Unix / Programming Information (http://arioch.unomaha.edu/~jclark/#info) * comp.unix.questions FAQ (http://www.faqs.org/faqs/unix-faq/faq/) * comp.unix.user-friendly FAQ (http://www.camelcity.com/~noel/usenet/cuuf-FAQ.htm) * FreeBSD Documentation (http://www.freebsd.org/docs.html) * The FreeBSD Handbook (http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/index.html) * UNIX GUIDE (http://ieee.uow.edu.au/documents/) * Free software project home pages * GNU Project (http://www.gnu.org/) * The Linux Documentation Project (http://www.tldp.org/) * The Linux Kernel Archives (http://www.linux.org/) * The XFree86 Project, Inc (http://www.xfree86.org/) * GNOME (http://www.gnome.org/) * K Desktop Environment (http://www.kde.org/) * GNU software at Red Hat (http://sources.redhat.com/) * Mozilla (http://www.mozilla.org) * FreeBSD (http://www.freebsd.org/) * OpenBSD (http://www.openbsd.org/) * NetBSD (http://www.netbsd.org/) 15.2. 查词意 ------------ Debian中使用了大量术语和缩写,下面的命令将会回答你的疑问。 $ dict 15.3. 查找流行的Debian软件包 ---------------------------- Debian中有许多软件包,有时很难决定该装哪一个。参阅Debian Popularity Contest Results (http://www.debian.org/~apenwarr/popcon/)可了解别人都在用什么软件。亦可安装`popularity-contest'软件包参加投票。 15.4. Debian错误跟踪系统 ------------------------ Debian发行版有一个bug tracking system (BTS) (http://bugs.debian.org/),它将来自用户和开发人员的错误报告的详细内容进行归档,每个错误都有一个编号,错误报告将一直存在于数据库中,直到获得错误已更正的标记。 在发送错误报告之前请先检查一下别人是否以提交了相同的错误报告。World Wide Web (http://bugs.debian.org/)或其它地方elsewhere (http://www.debian.org/Bugs/Access)均可找到当前未更正错误列表。参阅节 6.3.1, `检测程序错误寻求帮助'。 许多严重错误的报告标记为_FTBFS_。意思是“Fails To Build From Source”。 http://www.debian.org/Bugs/Reporting中描述了错误报告方法。 15.5. 邮件列表 -------------- 阅读最新的“debian-devel-announce”(英文,只读、畅通)与Debian保持同步。 邮件列表“debian-user”(英文,开放、拥挤)和“debian-user-”(需向其它语言的用户)中有Debian用户最兴趣的内容。 想了解这些邮件列表的详细信息以及如何订阅,参阅http://lists.debian.org/。发问前请先搜索答案并注意遵守列表有关礼仪和规则。 15.6. Internet Relay Chat (IRC) ------------------------------- IRC (Internet Relay Chat) 可让你与世界各地的人进行实时聊天。在freenode (http://www.freenode.info/)上可找到与Debian相关的IRC频道。连接它们需要一个IRC客户端,最流行的客户端有XChat、BitchX、ircII、irssi、epic4以及KSirc,任何一个都能在Debian软件包中找到。安装好客户端后,需要告诉程序连接到服务器,对于绝大多数客户端,可输入: /server irc.debian.org 一但连接上服务器,可输入下面的命令加入#debian频道 /join #debian 注意:类似XChat的客户端它们用于连接服务器/频道的图形用户界面会稍有不同。 15.7. 搜索引擎 -------------- 许多搜索引擎提供有关Debian的文档: * Debian WWW search site (http://search.debian.org/). * Google (http://www.google.com/): 将“site:debian.org”包含于搜索字段。 * Google Groups (http://groups.google.com/): 新闻组搜索引擎。将“group:linux.debian.*”包含于搜索字段。 * AltaVista (http://www.altavista.com/) 例如,搜索字符串“cgi-perl”会得到更多有关该软件包的详细说明而非其control文件中的简要描述。参阅节 6.3.1, `检测程序错误寻求帮助'获得相关建议。 15.8. 网站 ---------- 下列是我收集的一些特别专题讨论的零散URL。 * Adrian Bunk's packages to run kernel 2.4.x on potato (http://www.fs.tum.de/~bunk/) * Linux on Laptops (http://www.linux-laptop.net/) * Xterm FAQ (http://dickey.his.com/xterm/xterm.faq.html) * EXT3 File System mini-HOWTO (http://www.zip.com.au/~akpm/linux/ext3/ext3-usage.html) * Large File Support in Linux (http://www.suse.de/~aj/linux_lfs.html) * Window Managers for X (http://www.xwinman.org) * Linux USB Project (http://www.linux-usb.org/) * SuSE pages for CJK (http://www.suse.de/~mfabian/suse-cjk/suse-cjk.html) * LNX-BBC (Business-card-sized boot CD project) (http://www.lnx-bbc.org/) * Linux info by Karsten Self (partitioning, backup, browsers...) (http://kmself.home.netcom.com/Linux/index.html) * Backup info HOWTO by Alvin Oga (http://www.Linux-Backup.net/) * Security info HOWTO by Alvin Oga (http://www.Linux-Sec.net/) * Various UNOFFICIAL sources for APT (http://www.apt-get.org/) * Laptop Ethernet Configuration (http://www.orthogony.com/gjw/lap/lap-ether-intro.html) ------------------------------------------------------------------------------- A. 附录 ------- A.1. 作者 --------- Debian 参考手册由Osamu Aoki 发起,最初是一部个人的系统安装备忘录,而最终称之为“Quick Reference ...”。许多内容来自于“debian-user”邮件列表中的存档,同时也参考了《Debian --- Installation Manual》和《Debian --- Release Notes》。 由Debian Documentation Project (http://www.debian.org/doc/ddp)(DDP)的积极参与者、也是目前《The Debian FAQ》的主要维护者的Josip Rodin提议,将本文档更名为“Debian 参考手册”并将《The Debian FAQ》中一些类似参考形式的章节内容合并过来。后来摘录出一部分内容形成了《Debian 快速参考手册》。 本文档的编辑、翻译、扩充工作由下列QRFF组员参与: * 英文版初稿及《Quick Reference...》的初稿 * Osamu Aoki (leader: all contents) * 英文版校对和修订 * David Sewell (leader: en style) * Thomas Hood (network related) * Brian Nelson (especially X related) * Jan Michael C Alonzo * Daniel Webb * Feedback from all translators * 法文版翻译 * Guillaume Erbs (leader: fr) * Renald Casagraude * Jean-Pierre Delange * Daniel Desages * 意大利文版翻译 * Davide Di Lazzaro (leader: it) * 葡萄牙文版翻译 * Paulo Rogerio Ormenese (leader: pt-br) * Andre Luis Lopes * Marcio Roberto Teixeira * Rildo Taveira de Oliveira * Raphael Bittencourt Simoes Costa * Gustavo Noronha Silva (coordinator) * 西班牙文版翻译 * Walter Echarri (leader: es) * Jose Carreiro * 德文版翻译 * Jens Seidel (leader: de) * Willi Dyck * Stefan Schroeder * Agon S. Buchholz * Polish translation---the following members of PDDP (http://debian.linux.org.pl): * Marcin Andruszkiewicz * Mariusz Centka * Bartosz Fenski (leader: pl) * Radoslaw Grzanka * Bartosz 'Xebord' Janowski * Jacek Lachowicz * Rafal Michaluk * Leonard Milcin, Jr. * Tomasz Z. Napierala * Oskar Ostafin * Tomasz Piekos * Jacek Politowski * Mateusz Prichacz * Marcin Rogowski * Pawel Rozanski * Mariusz Strzelecki * Krzysztof Scierski * Przemyslaw Adam Smiejek * Mateusz Tryka * Cezary Uchto * Krzysztof Witkowski * Bartosz Zapalowski * 中文版翻译 * 刘浩(LYOO) (leader: zh-cn) * Ming Hua * Chinese (traditional) translation * Asho Yeh (leader: zh-tw) * Tang Wei Ching (ex-leader: zh-tw) * Japanese translation * Shinichi Tsunoda (leader: ja) * Osamu Aoki QREF是文档原始标题的缩写,“Quick Reference...”也是在qref.sourceforge.net上的项目名称。 Most of the contents of 章 2, `Debian基础'中的所有内容来源于《The Debian FAQ》(2002年三月): * 5. The Debian FTP archives: `ftparchives.sgml' (entire chapter) * 6. Basics of the Debian Package Management System: `pkg_basics.sgml' (entire chapter) * 7. The Debian Package Management Tools: `pkgtools.sgml' (entire chapter) * 8. Keeping Your Debian System Up To Date: `uptodate.sgml' (entire chapter) * 9. Debian and the kernel: `kernel.sgml' (entire chapter) * 10. Customizing your installation of Debian GNU/Linux: `customizing.sgml' (part of chapter) 在本文档中某些来源于《The Debian FAQ》的段落进行了较大的重组,以反映Debian系统的变化。故本文档的内容更新。 最初《Debian FAQ》由J.H.M. Dassen (Ray)和Chuck Stickelman创建和维护。《Debian FAQ》的修订版作者是Susan G. Kleinmann和Sven Rudolph。在他们之后,《The Debian FAQ》由Santiago Vila来维护。当前的维护者是Josip Rodin。 有关《The Debian FAQ》的信息部分来源于: * The Debian-1.1 release announcement, by Bruce Perens (http://www.perens.com/). * The Linux FAQ, by Ian Jackson (http://www.chiark.greenend.org.uk/~ijackson/). * Debian Mailing List Archives (http://lists.debian.org/), * the dpkg programmers' manual and the Debian Policy manual (see 节 15.1, `参考资料') * 众多开发人员、自愿者、beta版测试人员 * 以及其作者的片断记忆。 :-) 作者在此感谢所有在文档写作过程中曾给予帮助的人。 A.2. 保证 --------- 因为我不是个专家,所以不敢说对Debian或Linux了如指掌。文中有关系统安全的考虑仅适用于家庭使用。 本文档不能替代任何权威指南。 本文档不承诺任何保证。所有的商标均归属于其各自的拥有者。 A.3. 反馈 --------- 欢迎对本文档提出意见和建议。请发邮件至`debian-reference'软件包或相关翻译包下的Debian BTS system (http://bugs.debian.org/),使用`reportbug'来发送错误报告会更方便。 请将英文邮件发给Osamu Aoki (http://people.debian.org/~osamu/)他的邮箱是,其它语言的邮件可发送给相应的翻译者。 尽管我生活在美国,但并不是一名地道的英语使用者。欢迎任何有关语法方面的指正。 最好的反馈莫过于一个SGML版的diff,不过text版的diff也很欢迎。参阅节 1.1, `官方文档'了解官方文档站点。 本文档原始的SGML文件位于CVS: `:pserver:anonymous@cvs.sf.net/cvsroot/qref' 或http://qref.sourceforge.net/Debian/qref.tar.gz。 A.4. 文档格式 ------------- 本文档使用DebianDoc SGML DTD(由LinuxDoc SGML改进而来)写作。DebianDoc SGML系统允许一个源文件输出多种格式的文档,例如,本文档可以使用HTML、纯文本、TeX DVI、PostScript、PDF或GNU info方式阅读。 DebianDoc SGML的转换工具位于`debiandoc-sgml'软件包中。 A.5. Debian迷宫 --------------- Linux系统是一个面向网络计算机的功能强大的计算平台。然而,学习使用它的全部功能并非易事。配置打印机就是个好例子。 有一张完整而详尽的地图叫做“SOURCE CODE”,它非常准确但极难理解。还有一些参考书叫HOWTO和mini-HOWTO,它们易于理解,但给出了太多细节反而让人忘记了大方向。为了使用某个命令,我有时得在长长的HOWTO中找上半天。 为了在Linux系统配置的迷宫里找到出路,我开始用text格式写下简单的备忘录。当这些备忘录越积越多的时候我学会了debaindoc。于是就有了_Debian 参考手册_。 A.6. Debian引言 --------------- 这儿有一些来自于Debian邮件列表的有趣引言。 * "This is Unix. It gives you enough rope to hang yourself." --- Miquel van Smoorenburg * "Unix _IS_ user friendly... It's just selective about who its friends are." --- Tollef Fog Heen ------------------------------------------------------------------------------- Debian 参考手册 Osamu Aoki Translator: Hao "Lyoo" Liu 节 A.1, `作者' CVS, 星期一 一月 3 16:10:19 UTC 2005