软件包账号通

账号通  时间:2021-04-12  阅读:()

Debian参考手册iDebian参考手册OsamuAoki(青木修)Debian参考手册ii版权2013-2021青木修Debian参考手册(版本2.
77)(2021-01-1006:32:51UTC)旨在作为一份Debian系统安装后的用户指南,为Debian系统的使用与管理提供广泛的概览.
它通过为非开发者编写的shell命令示例来涵盖系统管理的方方面面.
Debian参考手册iiiCOLLABORATORSTITLE:Debian参考手册ACTIONNAMEDATESIGNATUREWRITTENBYOsamuAoki(青木修)April10,2021REVISIONHISTORYNUMBERDATEDESCRIPTIONNAMEDebian参考手册ivContents1GNU/Linux教程11.
1控制台基础11.
1.
1shell提示符11.
1.
2X下的shell提示符21.
1.
3root账户21.
1.
4rootshell提示符21.
1.
5GUI系统管理工具31.
1.
6虚拟控制台31.
1.
7怎样退出命令行提示符31.
1.
8怎样关闭系统31.
1.
9恢复一个正常的控制台41.
1.
10建议新手安装的额外软件包41.
1.
11额外用户账号41.
1.
12sudo配置51.
1.
13动手时间61.
2类Unix文件系统61.
2.
1Unix文件基础61.
2.
2文件系统深入解析71.
2.
3文件系统权限71.
2.
4控制新建文件的权限:umask101.
2.
5一组用户的权限(组)101.
2.
6时间戳111.
2.
7链接121.
2.
8命名管道(先进先出)131.
2.
9套接字131.
2.
10设备文件131.
2.
11特殊设备文件141.
2.
12procfs和sysfs151.
2.
13tmpfs151.
3MidnightCommander(MC)15Debian参考手册v1.
3.
1自定义MC161.
3.
2启动MC161.
3.
3MC文件管理161.
3.
4MC命令行技巧161.
3.
5MC内部编辑器171.
3.
6MC内部查看器171.
3.
7自动启动MC171.
3.
8MC中的FTP虚拟文件系统181.
4类Unix工作环境基础181.
4.
1登录shell181.
4.
2定制bash181.
4.
3特殊按键191.
4.
4Unix类型的鼠标操作201.
4.
5分页程序201.
4.
6文本编辑器201.
4.
7设置默认文本编辑器201.
4.
8定制vim211.
4.
9记录shell活动211.
4.
10基本的Unix命令211.
5简单shell命令231.
5.
1命令执行和环境变量241.
5.
2"$LANG"变量241.
5.
3"$PATH"变量251.
5.
4"$HOME"变量251.
5.
5命令行选项261.
5.
6Shell通配符261.
5.
7命令的返回值271.
5.
8典型的顺序命令和shell重定向271.
5.
9命令别名281.
6类Unix的文本处理291.
6.
1Unix文本工具291.
6.
2正则表达式301.
6.
3替换表达式301.
6.
4正则表达式的全局替换321.
6.
5从文本文件的表格中提取数据331.
6.
6用于管道命令的小片段脚本34Debian参考手册vi2Debian软件包管理362.
1Debian软件包管理的前提362.
1.
1软件包配置362.
1.
2基本的注意事项372.
1.
3持续升级的生活382.
1.
4Debian档案库基础382.
1.
5Debian是100%的自由软件412.
1.
6软件包依赖关系422.
1.
7包管理的事件流432.
1.
8对包管理问题的第一个回应442.
2基础软件包管理操作442.
2.
1aptvs.
apt-get/apt-cachevs.
aptitude452.
2.
2命令行中的基础软件包管理操作472.
2.
3aptitude的交互式使用472.
2.
4aptitude的按键绑定482.
2.
5aptitude软件包视图482.
2.
6aptitude搜索方式选项492.
2.
7aptitude正则表达式502.
2.
8aptitude的依赖解决502.
2.
9软件包活动日志502.
3aptitude操作范例522.
3.
1通过正则表达式匹配软件包名称来列出软件包522.
3.
2使用正则表达式匹配浏览522.
3.
3完整地清理已删除软件包522.
3.
4调整自动/手动安装状态522.
3.
5全面的系统升级532.
4高级软件包管理操作542.
4.
1命令行中的高级软件包管理操作542.
4.
2验证安装的软件包文件562.
4.
3预防软件包故障562.
4.
4搜索软件包元数据562.
5Debian软件包内部管理562.
5.
1档案库元数据562.
5.
2顶层"Release"文件及真实性572.
5.
3档案库层的"Release"文件582.
5.
4获取用于软件包的元数据582.
5.
5APT的软件包状态592.
5.
6aptitude的软件包状态592.
5.
7获取的软件包的本地副本59Debian参考手册vii2.
5.
8Debian软件包文件名称592.
5.
9dpkg命令602.
5.
10update-alternatives命令612.
5.
11dpkg-statoverride命令612.
5.
12dpkg-divert命令612.
6从损坏的系统中恢复612.
6.
1不兼容旧的用户配置622.
6.
2具有相同文件的不同软件包622.
6.
3修复损坏的软件包脚本622.
6.
4使用dpkg命令进行救援632.
6.
5恢复软件包选择数据632.
7软件包管理技巧642.
7.
1如何挑选Debian软件包642.
7.
2混合源档案库中的软件包642.
7.
3调整候选版本652.
7.
4更新和向后移植672.
7.
5阻止推荐的软件包的安装672.
7.
6使用带有unstable软件包的testing版本682.
7.
7使用带有experimental软件包的unstable版本692.
7.
8自动下载和升级软件包692.
7.
9限制APT的下载带宽692.
7.
10紧急降级702.
7.
11上传软件包的是谁702.
7.
12equivs软件包702.
7.
13移植一个软件包到stable系统712.
7.
14用于APT的代理服务器712.
7.
15小型公共软件包档案库722.
7.
16记录和复制系统配置742.
7.
17转换或安装一个外来的二进制软件包742.
7.
18不使用dpkg解压软件包742.
7.
19更多关于软件包管理的文档753系统初始化763.
1启动过程概述763.
1.
1第一阶段:BIOS773.
1.
2第二阶段:引载加载程序773.
1.
3第三阶段:迷你Debian系统793.
1.
4第四阶段:常规Debian系统793.
2Systemd初始化80Debian参考手册viii3.
2.
1主机名813.
2.
2文件系统813.
2.
3网络接口初始化813.
2.
4内核消息823.
2.
5系统消息823.
2.
6systemd下的系统管理823.
2.
7定制systemd843.
3udev系统843.
3.
1内核模块初始化854认证864.
1一般的Unix认证864.
2管理账号和密码信息884.
3好密码884.
4设立加密的密码894.
5PAM和NSS894.
5.
1PAM和NSS访问的配置文件904.
5.
2现代的集中式系统管理904.
5.
3"为什么GNUsu不支持wheel组"914.
5.
4严格的密码规则914.
6其它的访问控制914.
6.
1sudo924.
6.
2PolicyKit924.
6.
3SELinux924.
6.
4限制访问某些服务端的服务924.
7安全认证934.
7.
1确保互联网上的的密码安全934.
7.
2安全Shell934.
7.
3互联网额外的安全方式934.
7.
4root密码安全945网络设置955.
1基本网络架构955.
1.
1主机名解析975.
1.
2网络接口名称985.
1.
3局域网网络地址范围985.
1.
4网络设备支持985.
2现代的桌面网络配置985.
2.
1图形界面的网络配置工具99Debian参考手册ix5.
3没有图像界面的现代网络配置1005.
4传统的网络连接和配置1005.
5网络连接方式(传统)1015.
5.
1以太网DHCP连接1025.
5.
2以太网静态IP连接1025.
5.
3使用pppconfig的PPP连接1025.
5.
4使用wvdialconf的另一种可选的PPP连接1035.
5.
5使用pppoeconf的PPPoE以太网连接1035.
6使用ifupdown进行基本网络配置(旧)1045.
6.
1简单的命令语法1045.
6.
2"/etc/network/interfaces"基本语法1055.
6.
3回环网络接口1055.
6.
4使用DHCP的网络接口1055.
6.
5使用静态IP地址的网络接口1065.
6.
6无线局域网接口基础1065.
6.
7使用WPA/WPA2的无线局域网接口1075.
6.
8使用WEP的无线局域网接口1075.
6.
9PPP连接1075.
6.
10另一种PPP连接1085.
6.
11PPPoE连接1085.
6.
12ifupdown网络配置状态1085.
6.
13网络重新配置基础1085.
6.
14ifupdown-extra包1095.
7使用ifupdown的高级网络配置(旧)1095.
7.
1ifplugd软件包1095.
7.
2ifmetric软件包1105.
7.
3虚拟接口1105.
7.
4高级命令语法1115.
7.
5映射节mappingstanza1115.
7.
6手动的可切换网络配置1125.
7.
7ifupdown系统的脚本1135.
7.
8guessnetMapping映射1145.
8底层网络配置1155.
8.
1Iproute2命令1155.
8.
2安全的底层网络操作1155.
9网络优化1165.
9.
1找出最佳MTU1165.
9.
2设置MTU1175.
9.
3WANTCP优化1175.
10Netfilter网络过滤框架117Debian参考手册x6网络应用1196.
1网页浏览器1196.
1.
1浏览器配置1196.
2邮件系统1206.
2.
1电子邮件基础1216.
2.
2现代邮件服务基础1216.
2.
3工作站的邮件配置策略1226.
3邮件传输代理(MTA)1226.
3.
1exim4的配置1226.
3.
2带有SASL的postfix配置1246.
3.
3邮件地址配置1256.
3.
4基础MTA操作1266.
4邮件用户代理(MUA)1276.
4.
1基础MUA—Mutt1276.
4.
2高级MUA—Mutt+msmtp1286.
5远程邮件检索和转发实用工具1296.
5.
1getmail配置1296.
5.
2fetchmail配置1316.
6带有过滤器的邮件投递代理(MDA)1316.
6.
1maildrop配置1316.
6.
2procmail配置1336.
6.
3重新投递mbox内容1336.
7POP3/IMAP4服务器1346.
8打印服务和工具1346.
9服务器远程访问和工具(SSH)1346.
9.
1SSH基础1356.
9.
2SMTP/POP3隧道的端口转发1376.
9.
3免密码远程连接1376.
9.
4处理其它SSH客户端1376.
9.
5建立ssh代理1386.
9.
6怎样通过SSH关闭远程系统1386.
9.
7SSH故障排查1386.
10其它网络应用服务1386.
11其它网络应用客户端1396.
12系统后台守护进程(daemon)诊断139Debian参考手册xi7X窗口系统1417.
1关键软件包1417.
2设置桌面环境1427.
2.
1Debian菜单1427.
2.
2Freedesktop.
org菜单1427.
2.
3从Freedesktop.
org菜单到Debian菜单1427.
3服务器/客户端关系1427.
4X服务器1437.
4.
1X服务器的(重新)配置1437.
4.
2连接到X服务器的方式1437.
5启动X窗口系统1447.
5.
1使用gdm3启动X会话1447.
5.
2自定义X会话(经典方式)1457.
5.
3自定义X会话(新方式)1457.
5.
4通过SSH连接一个远程X客户端1457.
5.
5连接互联网的安全X终端1457.
6X窗口中的字体1467.
6.
1基础字体1467.
6.
2其它字体1477.
6.
3CJK字体1487.
7X应用1497.
7.
1X办公应用1497.
7.
2X实用应用1497.
8X琐事1507.
8.
1剪贴板1507.
8.
2X中的键盘和鼠标按钮映射1507.
8.
3典型的X客户端1517.
8.
4X终端模拟器——xterm1517.
8.
5以root运行X客户端1518国际化和本地化1528.
1键盘输入1528.
1.
1IBus支持的输入法1538.
1.
2一个日语的例子1538.
1.
3禁用输入法1548.
2显示输出1548.
3东亚环境下宽度有歧义的字符1548.
4语言环境1548.
4.
1编码的基础知识154Debian参考手册xii8.
4.
2UTF-8语言环境的基本原理1558.
4.
3语言环境的重新配置1558.
4.
4"$LANG"环境变量的值1568.
4.
5只用于X窗口的特定语言环境1568.
4.
6文件名编码1578.
4.
7本地化信息和翻译文档1578.
4.
8语言环境的影响1579系统技巧1589.
1screen程序1589.
1.
1screen(1)的使用场景1589.
1.
2screen命令的键绑定1599.
2数据记录和展示1599.
2.
1日志后台守护进程(daemon)1599.
2.
2日志分析1599.
2.
3清晰的记录shell活动1609.
2.
4定制文本数据的显示1609.
2.
5定制时间和日期的显示1619.
2.
6shell中echo的颜色1619.
2.
7有颜色输出的命令1619.
2.
8记录编辑器复杂的重复操作动作1629.
2.
9记录X应用程序的图形1629.
2.
10记录配置文件的变更1639.
3监控、控制和启动程序活动1639.
3.
1进程耗时1649.
3.
2调度优先级1649.
3.
3ps命令1649.
3.
4top命令1649.
3.
5列出被一个进程打开的文件1649.
3.
6跟踪程序活动1659.
3.
7识别使用文件和套接字的进程1659.
3.
8使用固定间隔重复一个命令1659.
3.
9使用文件循环来重复一个命令1659.
3.
10从GUI启动一个程序1669.
3.
11自定义被启动的程序1679.
3.
12杀死一个进程1679.
3.
13单次任务时间安排1689.
3.
14定时任务安排1689.
3.
15Alt-SysRq键168Debian参考手册xiii9.
4系统维护技巧1699.
4.
1谁在系统里1699.
4.
2警告所有人1699.
4.
3硬件识别1709.
4.
4硬件配置1709.
4.
5系统时间和硬件时间1709.
4.
6终端配置1719.
4.
7声音基础设施1719.
4.
8关闭屏幕保护1729.
4.
9关闭蜂鸣声1729.
4.
10内存使用1729.
4.
11系统安全性和完整性检查1739.
5数据存储技巧1749.
5.
1硬盘空间使用情况1749.
5.
2硬盘分区配置1749.
5.
3使用UUID访问分区1759.
5.
4LVM21759.
5.
5文件系统配置1769.
5.
6文件系统创建和完整性检查1769.
5.
7通过挂载选项优化文件系统1779.
5.
8通过超级块(superblock)优化文件系统1789.
5.
9硬盘优化1789.
5.
10固态硬盘优化1789.
5.
11使用SMART预测硬盘故障1799.
5.
12通过$TMPDIR指定临时存储目录1799.
5.
13通过LVM扩展可用存储空间1799.
5.
14通过挂载另一个分区来扩展可用存储空间1809.
5.
15通过"mount--bind"挂载另一个目录来扩展可用存储空间1809.
5.
16通过overlay挂载(overlay-mounting)另一个目录来扩展可用存储空间1809.
5.
17使用符号链接扩展可用存储空间1809.
6磁盘映像1819.
6.
1制作磁盘映像文件1819.
6.
2直接写入硬盘1819.
6.
3挂载磁盘映像文件1819.
6.
4清理磁盘映像文件1829.
6.
5制作空的磁盘映像文件1839.
6.
6制作ISO9660镜像文件1839.
6.
7直接写入文件到CD/DVD-R/RW1849.
6.
8挂载ISO9660镜像文件184Debian参考手册xiv9.
7二进制数据1859.
7.
1查看和编辑二进制数据1859.
7.
2不挂载磁盘操作文件1859.
7.
3数据冗余1859.
7.
4数据文件恢复和诊断分析1859.
7.
5把大文件分成多个小文件1869.
7.
6清空文件内容1869.
7.
7样子文件1869.
7.
8擦除整块硬盘1879.
7.
9擦除硬盘上的未使用的区域1879.
7.
10恢复已经删除但仍然被打开的文件1889.
7.
11查找所有硬链接1889.
7.
12不可见磁盘空间消耗1889.
8数据加密提示1899.
8.
1使用dm-crypt/LUKS加密移动磁盘1899.
8.
2用dm-crypt加密的交换分区1909.
8.
3使用dm-crypt/LUKS挂载加密的磁盘1909.
8.
4用eCryptfs自动加密文件1909.
8.
5自动挂载eCryptfs1919.
9内核1919.
9.
1Linux内核2.
6/3.
x1919.
9.
2内核参数1929.
9.
3内核头文件1929.
9.
4编译内核和相关模块1929.
9.
5编译内核源代码:Debian内核团队推荐1939.
9.
6硬件驱动和固件1939.
10虚拟化系统1949.
10.
1虚拟化工具1949.
10.
2虚拟化工作流1949.
10.
3挂载虚拟磁盘映像文件1969.
10.
4Chroot系统1969.
10.
5多桌面系统19710数据管理19810.
1共享,拷贝和存档19810.
1.
1存档和压缩工具19910.
1.
2复制和同步工具20010.
1.
3归档语法20010.
1.
4复制语法201Debian参考手册xv10.
1.
5查找文件的语法20210.
1.
6归档媒体20310.
1.
7可移动存储设备20310.
1.
8选择用于分享数据的文件系统20410.
1.
9网络上的数据分享20610.
2备份和恢复20610.
2.
1实用备份套件20710.
2.
2一个系统备份的脚本例子20810.
2.
3用于备份数据的复制脚本20910.
3数据安全基础21010.
3.
1GnuPG密钥管理21010.
3.
2在文件上使用GnuPG21210.
3.
3在Mutt中使用GnuPG21210.
3.
4在Vim中使用GnuPG21310.
3.
5MD5校验和21310.
4源代码合并工具21310.
4.
1从源代码文件导出差异21310.
4.
2源代码文件移植更新21310.
4.
3通过三方移植进行更新21310.
5版本控制系统21510.
5.
1VCS命令的比较21610.
6Git21710.
6.
1配置Git客户端21710.
6.
2Git参考21710.
6.
3Git命令21810.
6.
4用于Subversion仓库的Git21810.
6.
5记录配置历史的Git21910.
7CVS21910.
7.
1CVS存储库的配置22010.
7.
2本地访问CVS22010.
7.
3使用pserver远程访问CVS22010.
7.
4使用ssh远程访问CVS22010.
7.
5往CVS导入新的源22110.
7.
6CVS存储库中的文件权限22110.
7.
7CVS工作流22110.
7.
8CVS中最新的文件22310.
7.
9CVS的管理22410.
7.
10用于CVS签出时的可执行位22410.
8Subversion224Debian参考手册xvi10.
8.
1Subversion存储库的配置22410.
8.
2通过Apache2服务器访问Subversion22510.
8.
3按组本地访问Subversion22510.
8.
4通过SSH远程访问Subversion22510.
8.
5Subversion目录结构22510.
8.
6往Subversion里导入一个新的源22610.
8.
7Subversion工作流22611数据转换23011.
1文本数据转换工具23011.
1.
1用iconv命令来转换文本文件23011.
1.
2用iconv检查文件是不是UTF-8编码23111.
1.
3使用iconv转换文件名23211.
1.
4换行符转换23211.
1.
5TAB转换23311.
1.
6带有自动转换功能的编辑器23311.
1.
7提取纯文本23311.
1.
8高亮并格式化纯文本数据23511.
2XML数据23511.
2.
1XML的基本提示23511.
2.
2XML处理23611.
2.
3XML数据提取23711.
3排版23711.
3.
1roff排版23711.
3.
2TeX/LaTeX23811.
3.
3漂亮的打印手册页23911.
3.
4创建手册页23911.
4可印刷的数据23911.
4.
1Ghostscript23911.
4.
2合并两个PS或PDF文件24011.
4.
3处理可印刷数据的工具24011.
4.
4用CUPS打印24011.
5邮件数据转换24111.
5.
1邮件数据基础24111.
6图形数据工具24211.
7不同种类的数据转换工具242Debian参考手册xvii12编程24512.
1Shell脚本24612.
1.
1POSIXshell兼容性24612.
1.
2Shell参数24712.
1.
3Shell条件语句24712.
1.
4shell循环24812.
1.
5shell命令行的处理顺序24912.
1.
6用于shell脚本的应用程序25012.
1.
7shell脚本对话框25012.
1.
8zenity的shell脚本案例25112.
2make25212.
3C25212.
3.
1简单的C程序(gcc)25312.
4调试25312.
4.
1基本的gdb使用命令25312.
4.
2调试Debian软件包25412.
4.
3获得栈帧25412.
4.
4高级gdb命令25512.
4.
5调试与X相关的错误25512.
4.
6检查库依赖性25512.
4.
7内存泄漏检测工具25512.
4.
8静态代码分析工具25612.
4.
9反汇编二进制程序25612.
5Flex—一个更好的Lex25612.
6Bison—一个更好的Yacc25712.
7Autoconf25712.
7.
1编译并安装程序25712.
7.
2卸载程序25712.
8Perl短脚本的疯狂25812.
9Web25812.
10源代码转换25912.
11制作Debian包259A附录260A.
1Debian迷宫260A.
2版权历史260A.
3文档格式261A.
4简体中文翻译261Debian参考手册xviiiListofTables1.
1有趣的文本模式程序包列表41.
2软件包信息文档列表51.
3重要目录的用途列表71.
4"ls-l"输出的第一个字符列表81.
5chmod(1)命令文件权限的数字模式91.
6umask值举例101.
7关于文件访问的由系统提供的著名组列表111.
8著名的由系统提供用于特定命令运行的组列表111.
9时间戳类型列表111.
10特殊设备文件列表141.
11MC快捷键绑定161.
12MC中对回车键的响应171.
13shell程序列表181.
14bash的按键绑定列表191.
15Unix样式的鼠标操作列表201.
16基本的Unix命令列表221.
17语言环境值的3个部分241.
18语言环境推荐列表251.
19"$HOME"变量值列表261.
20Shellglob模式261.
21命令的退出代码271.
22Shell命令常见用法281.
23预定义的文件描述符281.
24BRE和ERE中的元字符311.
25替换表达式311.
26管道命令的小片段脚本列表342.
1Debian软件包管理工具列表372.
2Debian档案库站点列表392.
3Debian归档区域(area)列表40Debian参考手册xix2.
4套件和代号的关系402.
5解决特定软件包问题的主要网站442.
6使用apt(8),aptitude(8)和apt-get(8)/apt-cache(8)的命令行基本软件包管理操作462.
7aptitude(8)中重要的命令选项472.
8aptitude的按键绑定482.
9aptitude视图492.
10标准软件包视图的分类492.
11aptitude正则表达式512.
12软件包活动日志文件512.
13高级软件包管理操作552.
14Debian档案库元数据的内容572.
15Debian软件包的名称结构592.
16Debian软件包名称中每一个组件可以使用的字符602.
17dpkg创建的重要文件602.
18用于apt-pinning技术的值得注意的Pin-Priority值列表.
662.
19Debian档案库的专用代理工具713.
1引导加载程序列表783.
2GRUB参数的含义783.
3Debian系统启动工具列表803.
4内核错误级别表823.
5典型的systemd管理命令片段列表834.
1pam_unix(8)使用的3个重要配置文件864.
2"/etc/passwd"第二项的内容874.
3管理账号信息的命令884.
4生成密码的工具894.
5PAM和NSS系统中重要的软件包894.
6PAM和NSS访问的配置文件904.
7安全和不安全的服务端口列表934.
8提供额外安全方式的工具列表945.
1网络配置工具一览表965.
2网络地址范围列表985.
3网络连接方式和连接路径列表1015.
4网络连接配置列表1015.
5网络连接缩略语列表1025.
6使用pppconfig的PPP连接配置文件列表1035.
7使用wvdialconf的PPP连接配置文件列表1035.
8使用pppoeconf的PPPoE连接配置文件列表104Debian参考手册xx5.
9使用ifupdown进行基本网络配置的命令列表1045.
10"/etc/network/interfaces"里面的节列表1055.
11WLAN缩写词列表1075.
12网络设备术语列表1115.
13ifupdown高级网络配置命令列表1115.
14ifupdown系统传递的环境变量1145.
15从旧的net-tools命令集到新的iproute2命令集转换表1155.
16底层网络命令列表1155.
17网络优化工具列表1165.
18最佳MTU值的基本指引方法1165.
19防火墙工具列表1186.
1网页浏览器列表1196.
2浏览器插件软件包列表1206.
3用于工作站的基础的邮件传输代理相关的软件包列表1226.
4Debian档案库中可供选择的邮件传输代理(MTA)软件包的列表1236.
5重要的postfix手册页列表1256.
6与邮件地址相关的配置文件列表1256.
7基础MTA操作列表1266.
8邮件用户代理列表(MUA)1276.
9远程邮件检索和转发实用程序列表1296.
10有过滤器的MDA列表1316.
11POP3/IMAP4服务器列表1346.
12打印服务和工具列表1346.
13服务器远程访问和工具列表1356.
14SSH认证协议和方式列表1356.
15SSH配置文件列表1366.
16SSH客户端启动例子列表1366.
17其它平台上免费SSH客户端列表1386.
18其它网络应用服务列表1396.
19网络应用客户端列表1406.
20常用RFC列表1407.
1X窗口的关键(元)软件包列表1417.
2服务器/客户端术语表1427.
3连接到X服务器的方式1437.
4支持X窗口字体系统的软件包1467.
5相应的PostScriptType1字体1477.
6对应的TrueType字体148Debian参考手册xxi7.
7CJK字体名称中所使用的暗示字体类型的关键词1487.
8基础的X办公应用1497.
9基础的实用应用1507.
10基础的X选择程序1508.
1IBus支持的输入法1539.
1支持可中断网络连接的程序列表1589.
2screen键绑定列表1599.
3系统日志分析软件列表1609.
4wheezy中"ls-l"命令时间和日期的显示案例1619.
5图形图像处理工具列表1629.
6在VCS中记录配置历史的软件包1639.
7监控和控制程序活动工具列表1639.
8调度优先级值列表1649.
9ps命令样式列表1649.
10kill命令常用信号列表1679.
11SAK命令键列表1699.
12硬件识别工具列表1709.
13硬件配置工具列表1709.
14声音软件包1729.
15关闭屏幕保护命令列表1729.
16报告的内存大小1739.
17用于系统安全性和完整性检查的工具1739.
18硬盘分区管理软件包1749.
19文件系统管理包列表1769.
20查看和修改二进制数据的软件包列表1859.
21不挂载磁盘操作文件的软件包列表1859.
22向文件添加数据冗余的工具列表1869.
23数据文件恢复和诊断分析软件包列表1869.
24数据加密工具列表1899.
25Debian系统内核编译需要安装的主要软件包列表1929.
26虚拟化工具列表19510.
1存档和压缩工具列表19910.
2复制和同步工具列表20010.
3典型使用场景下可移动存储设备可选择的文件系统列表20510.
4典型使用场景下可选择的网络服务列表20610.
5实用备份程序套件列表20810.
6数据安全基础工具列表211Debian参考手册xxii10.
7GNU隐私卫士密钥管理命令的列表21110.
8信任码含义列表21110.
9在文件上使用的GNU隐私卫士的命令列表21210.
10源代码合并工具列表21410.
11版本控制系统工具列表21510.
12本地VCS命令比较21610.
13git相关包和命令列表21810.
14值得注意的CVS命令选项(用作cvs(1)的第一个选项)22310.
15值得注意的Subversion命令选项(使用时作为svn(1)的第一个参数)22911.
1文本数据转化工具列表23011.
2编码值和用法的列表23111.
3不同平台的换行符样式列表23211.
4bsdmainutils和coreutils包中的用于转换TAB的命令列表23311.
5用于提取纯文本数据的工具列表23411.
6高亮纯文本数据的工具列表23411.
7XML预定义实体列表23511.
8XML工具列表23611.
9DSSSL工具列表23611.
10XML数据提取工具列表23711.
11XML美化打印工具列表23711.
12排版工具的列表23711.
13创建手册页的工具列表23911.
14GhostscriptPostScript解释器列表23911.
15处理可印刷数据的工具列表24011.
16有助于邮件数据转换的软件包列表24111.
17图形数据工具列表24311.
18不同种类的数据转换工具列表24412.
1帮助编程的软件包清单24512.
2典型bashism语法列表24612.
3shell参数列表24712.
4shell参数展开列表24712.
5重要的shell参数替换列表24812.
6在条件表达式中进行文件比较24812.
7在条件表达式中进行字符串比较24912.
8包含用于shell脚本的小型应用程序的软件包25012.
9用户界面程序列表25112.
10自动变量的列表252Debian参考手册xxiii12.
11变量扩展的列表25212.
12高级gdb命令列表25512.
13内存泄漏检测工具的列表25612.
14静态代码分析工具的列表25612.
15兼容Yacc的LALR解析器生成器列表25712.
16源代码转换工具列表259Abstract这本书是自由的;你可以在与Debian自由软件指导方针(DFSG)兼容的任意版本的GNU通用公共许可证的条款下重新分发和修改本书.
Debian参考手册xxv序言Debian参考手册(版本2.
77)(2021-01-1006:32:51UTC)旨在为作为一份安装后用户指南,为Debian系统的使用与管理提供宽泛的概览.
本书的目标读者:愿意学习shell脚本,但是不准备为了理解GNU/Linux系统是如何运作的而阅读其所有C语言源代码的人.
如需系统安装指导信息,请见:DebianGNU/Linux当前稳定版安装手册DebianGNU/Linux当前测试版安装手册免责声明所有担保条款具有免责效力.
所有商标均为其各自商标所有者的财产.
Debian系统本身是一个变化的事物.
这导致其文档难于及时更新并且正确.
虽然是以Debian系统当前的不稳定版本作为写作该文档的基础,但当你阅读本文的时候,部分内容仍然可能已经过时.
请把本文档作为第二参考.
本文档不能够代替任何官方指导手册.
文档作者和文档贡献者对在本文档中的错误、遗漏或歧义,不承担责任后果.
什么是DebianDebian项目是一个由个人组成的团体,该团体的成员均把创建一个自由操作系统作为共同事业.
Debian的发布具有下列特征:承诺软件自由:Debian社群契约和Debian自由软件指导方针(DFSG)基于因特网上无酬劳的志愿者的工作发布:https://www.
debian.
org大量预编译的高质量软件包专注于稳定性和安全性,同时易于获取安全更新在unstable和testing仓库中注重软件包最新版本的平滑升级支持大量硬件架构Debian系统中的自由软件来自GNU,Linux,BSD,X,ISC,Apache,Ghostscript,CommonUnixPrintingSystem,Samba,GNOME,KDE,Mozilla,LibreOffice,Vim,TeX,LaTeX,DocBook,Perl,Python,Tcl,Java,Ruby,PHP,BerkeleyDB,MariaDB,PostgreSQL,SQLite,Exim,Postfix,Mutt,FreeBSD,OpenBSD,Plan9以及许多更加独立的自由软件项目.
Debian将上述各种各样的自由软件集成到一个系统里面.
Debian参考手册xxvi关于本文档指导原则写作本文档时,遵循下列指导原则.
仅提供概览,而忽略边界情况.
(BigPicture原则)保持文字简短紧凑.
(KISS原则)不重复造轮子.
(使用链接指向已有参考)专注于使用非图形的工具和控制台.
(使用shell例子)保持客观.
(使用popcon等等.
)提示我试图阐明操作系统底层和体系结构的各方面内容.
预备知识警告阅读本文档,你需要通过自己的努力去查找本文档未提及的问题答案.
本文档仅仅提供有效的起点.
你必须自己从以下原始材料查找解决方案.
Debian管理员手册Debian网站(https://www.
debian.
org)上的通用信息"/usr/share/doc/"目录下的文档Unix风格的manpage:"dpkg-L|grep'/man/man.
*/'"GNU风格的infopage:"dpkg-L|grep'/info/'"错误报告:http://bugs.
debian.
org/DebianWiki(https://wiki.
debian.
org/)用于变化和特定的话题Linux文档项目(TLDP,http://tldp.
org/)的HOWTO国际开放标准组织的UNIX系统主页(http://www.
unix.
org/)上的单一UNIX规范自由的百科全书:维基百科(https://www.
wikipedia.
org/)注意软件包的详细文档,你需要安装软件包名用"-doc"作为后缀名的相应文档包来得到.
Debian参考手册xxvii排版约定本文通过如下使用bash(1)shell命令例子的简要方式来提供信息.
#$这些shell提示符区分了所使用的帐户.
为了可读性,在本手册中shell提示符相关的环境变量被设置为"PS1='\$'"和"PS2=''.
这与实际安装的系统所使用的shell提示符很有可能会不同.
注意参见在bash(1)中对环境变量"$PS1"和"$PS2"的解释.
要求系统管理员执行的操作,须用祈使句描述,如"在shell中输入命令字符串后,键入Enter键.
"这些描述列或类似信息在表格有一个名词短语,后面会紧跟软件包短描述,这些短语会省略掉前面的"a"和"the".
它们也可以包含一个不定式短语作名词短语,在联机帮助的短命令描述约定后面不带"to".
有些人可能觉得这看起来有点可笑,这里故意保留这种风格是为了让文档看起来尽可能的简单.
这些名词短语在短命令描述约定里并不会采用首字母大写的方式.
注意无论专有名词和命令名位于何处,保持其英文字母大小写不变.
在文本段落中引用的命令片断由双引号括起来的打印机字体进行标记,就像"aptitudesafe-upgrade".
在文本段落中引用的来自配置文件的文本数据由双引号括起来的打印机字体进行标记,就像"deb-src".
命令和置于其后的圆括号内的手册页章节数(可选),由打字机字体进行标记,就像bash(1).
我们鼓励您这样通过输入以下命令来获得信息.
$man1bashmanpage会在打字机字体后面括号中显示manpage页章节号,如sources.
list(5).
建议你通过键入以下命令来获取帮助信息.
$man5sources.
listinfopage页是由双引号之间的打字机字体来标注,如infomake.
建议你通过键入以下的命令来获取帮助信息.
$infomake文件名将由双引号括起来的打印机字体进行标记,就像"/etc/passwd".
对于配置文件,你可以输入下列的命令来获取它的信息.
$sensible-pager"/etc/passwd"目录名将由双引号括起来的打印机字体进行标记,就像"/etc/apt".
你可以输入下列的命令来浏览目录的内容.
$mc"/etc/apt/"软件包名称将由打印机字体进行标记,就像vim.
你可以输入下列的命令来获取它的信息.
$dpkg-Lvim$apt-cacheshowvim$aptitudeshowvimDebian参考手册xxviii一个文档可能通过文件名来指示它的位置,文件名将由双引号括起来的打印机字体进行标记,就像"/usr/share/doc/base-和"/usr/share/doc/base-passwd/users-and-groups.
html",或通过它的URL,就像https://www.
debian.
org.
你可以通过输入下列命令来阅读文档.
$zcat"/usr/share/doc/base-passwd/users-and-groups.
txt.
gz"|sensible-pager$sensible-browser"/usr/share/doc/base-passwd/users-and-groups.
html"$sensible-browser"https://www.
debian.
org"环境变量将由双引号括起来的打印机字体进行标记,并带有"$"前缀,就像"$TERM".
你可以输入下列命令来获取它的当前值.
$echo"$TERM"popcon流行度popcon数据被用来客观地衡量每个包的流行度.
它的下载时间为2021-01-1006:32:17UTC,包含了超过178828个二进制软件包和26个架构的全部197967份提交.
注意请注意amd64不稳定(unstable)版的软件仓库中只包含当前62716软件包.
popcon数据包含许多旧系统安装报告.
以"V:"开头表示"votes"的popcon数值计算方式为"1000*(当前运行在PC上的包的popcon提交)/(总的popcon提交)".
以"I:"开头表示"安装数"的popcon数值计算方式为"1000*(当前安装在PC上的包的popcon提交)/(总的popcon提交)".
注意流行度评比popcon数据不应视为对包的重要性的绝对度量.
有许多因素可以影响统计数据.
例如,参与流行度评比的某些系统可能有像"/bin"的目录,挂载的时候带"noatime"选项以提升系统性能,这样的系统有效的禁用了"投票(vote)"功能.
软件包大小软件包的大小数据同样表明了对每个包的客观衡量.
它基于"apt-cacheshow"或"aptitudeshow"命令(目前在amd64架构的不稳定版)报告的"安装大小".
报告的大小单位是KiB(Kibibyte=表示1024Bytes的单位).
注意包大小是一个小数值的包可能显示了这个在"不稳定"版的包是一个虚拟包,它包含关于依赖关系的重要内容,会安装其他的包.
虚拟包使能平稳过度或分割一个包.
注意包大小后面跟着"(*)"表明这个软件包在不稳定版本中是缺失的同时使用了实验性版本中的软件包大小来替代.
给本文档报告Bug如果你发现本文档有任何问题,请使用reportbug(1)向debian-reference软件包报告bug.
对纯文件版本或源代码的改进建议,请使用"diff-u"包含在bug报告里面.
Debian参考手册xxix一些对新使用者的提醒这里给出对新用户的一些提醒信息:备份你的数据妥善保存你的密码和安全信息KISS(保持简单而傻瓜式)–不要在系统中过度设计(overengineering)阅读你的日志文件–第一条错误信息才是最重要的RTFM(阅读手册与指导)在问问题前,先在互联网上搜索当不是必须要使用root的时候,就不要使用root不要胡乱折腾软件包管理系统不要输入任何你不理解的命令(在完全地检查过安全问题之前)不要随意修改文件权限在测试过你所做的修改之前不要关闭rootshell总是准备好备用启动介质(USB启动盘、启动光盘等)一些对新使用者的引导从Debian邮件列表来的一些有趣引文,说不定可以帮助新使用者启蒙.
"这是Unix.
它给你足够的绳索来吊死你自己.
"---MiquelvanSmoorenburg"Unix是用户友好的……它仅仅选择谁是它的朋友.
"---TollefFogHeen维基百科文章"Unix哲学"列出了一些有趣的指导.
Debian参考手册1/262Chapter1GNU/Linux教程我认为学习一个计算机系统,就像学习一门新的外语.
虽然教程和文档是有帮助的,但你必须自己练习.
为了帮助你平滑起步,我详细说明一些基本要点.
DebianGNU/Linux中最强大的设计来自Unix操作系统,一个多用户多任务的操作系统.
你必须学会利用这些特性以及Unix和GNU/Linux的相似性.
别回避面向Unix的文档,不要只是依赖于GNU/Linux文档,这样做会剥夺你了解许多有用的信息.
注意如果你在任何类Unix系统中使用过一段时间的命令行工具,你可能已经掌握了这份文档中的内容.
那请把它当做一个实战检验和回顾.
1.
1控制台基础1.
1.
1shell提示符启动系统之后,如果你没有安装X窗口系统和显示管理器(例如gdm3),那么你就会看对字符登录界面.
假设你的主机名为foo,那么登录提示符将如下所示.
foologin:如果你安装了一个GUI环境,例如GNOME或KDE,那么你能够用Ctrl-Alt-F1进入登录提示符,同时你可以通过Alt-F7回到GUI环境(更多详情请参阅下文第1.
1.
6节).
在登录提示符下,你输入你的用户名,例如penguin,然后按回车键,接下来输入你的密码并再次按回车键.
注意遵循Unix传统,Debian系统下的用户名和密码是大小写敏感的.
用户名通常由小写字母组成.
第一个用户账号通常在安装期间进行创建.
额外的用户账号由root用户用adduser(8)创建.
系统以保存在"/etc/motd"中的欢迎信息(MessageOfTheDay)来开始,同时显示一个命令提示符.
DebianGNU/Linuxjessie/sidfootty1foologin:penguinPassword:Lastlogin:MonSep2319:36:44JST2013ontty3Linuxsnoopy3.
11-1-amd64#1SMPDebian3.
11.
6-2(2013-11-01)x86_64Debian参考手册2/262TheprogramsincludedwiththeDebianGNU/Linuxsystemarefreesoftware;theexactdistributiontermsforeachprogramaredescribedintheindividualfilesin/usr/share/doc/*/copyright.
DebianGNU/LinuxcomeswithABSOLUTELYNOWARRANTY,totheextentpermittedbyapplicablelaw.
foo:~$现在,你就在shell下.
shell解析你的命令.
1.
1.
2X下的shell提示符如果你安装了带有显示管理器的XWindowSystem,例如通过在安装Debian时选择"桌面环境"所安装GNOME的gdm3,那么你在启动系统后将使用图形登录界面.
输入你的用户名和密码可以登录到非特权用户帐号.
使用Tab键(跳格键)可以在用户名和密码之间移动,也可以使用鼠标左击.
要在X窗口下获得shell提示符,你必须启动一个x终端模拟器程序,例如gnome-terminal(1)、rxvt(1)或xterm(1).
在GNOME桌面环境下,你可以点击"应用程序"→""→"终端"来打开终端.
你还可以看下下面的第1.
1.
6节章节.
在其它一些桌面系统(如fluxbox)下面,可能没有明显的开始菜单入口.
如果是这种情况,试下右击桌面屏幕并希望能有弹出菜单.
1.
1.
3root账户root账户也被称作超级用户或特权用户.
用这个账户,你能够履行下面的系统管理任务.
读、写和删除系统上的任何文件,不顾它们的文件权限设置系统上任何文件的所有者和权限设置系统上任何非特权用户的密码免用户密码登录任何帐户无限权力的root账户,要求你慎重和负责任的使用.
警告千万不要和其他人共享root密码.
注意一个文件(包括硬件设备,如CD-ROM等,这些对Debian系统来说都只是一个文件)的权限可能会导致非root用户无法使用或访问它.
虽然在这种情况下,使用root帐户是一个快速的方法,但正确的解决方法应该是对文件权限和用户组的成员进行合适的设置(参见第1.
2.
3节).
1.
1.
4rootshell提示符这里有一些基本的方法可以让你在输入root密码后获得root的shell提示符.
在字符界面的登录提示符,键入root作为用户名登录.
Debian参考手册3/262在GNOME桌面环境下点击"应用程序"→""→"Root终端".
在任意用户的shell提示符下输入"su-l".
–这不会保存当前用户的环境设定.
在任意用户的shell提示符下输入"su".
–这会保存当前用户的一些环境设定.
1.
1.
5GUI系统管理工具如果你的桌面菜单没有适当的权限启动系统管理工具,你可以在X终端模拟器(例如gnome-terminal(1)、rxvt(1)或xterm(1))中root的shell提示符下启动它.
参见第1.
1.
4节和第7.
8.
5节.
警告永远不要在显示管理器(例如gdm3(1))的提示符下输入root来使用root账户启动X显示/会话管理器.
警告永远不要在显示关键信息的XWindow下运行不受信任的远程GUI程序,因为它可能会监听你的X屏幕.
1.
1.
6虚拟控制台在默认的Debian系统中,有6个可切换的类VT100字符控制台,可以直接在Linux主机上启动shell.
除非你处于GUI环境下,否则你可以同时按下左Alt键和F1—F6之一的键在虚拟控制台间切换.
每一个字符控制台都允许独立登陆账户并提供多用户环境.
这个多用户环境是伟大的Unix的特性,很容易上瘾.
如果你处于XWindow系统中,你可以通过Ctrl-Alt-F1键前往字符控制台1,也就是同时按下左Ctrl键、左Alt键和F1键.
你可以按下Alt-F7回到XWindowSystem,它一般运行在虚拟控制台7.
你也可以使用命令行切换到另一个虚拟控制台,例如切换到控制台1.
#chvt11.
1.
7怎样退出命令行提示符在命令行输入Ctrl-D,即同时按下左侧-Ctrl-键和d-键,即可关闭shell活动.
如果你正处于字符控制台,你将会返回到登录提示行.
尽管这些控制字符"controlD"使用了大写字母,你并不需要按住Shift-键.
Ctrl-D也可以简写为^D.
或者,你也可以键入"exit"退出命令行.
如果你位于x终端模拟器(1)中,你可以使用这个关闭x终端模拟器窗口.
1.
1.
8怎样关闭系统就像任何其他的现代操作系统一样,Debian会通过内存中的缓存数据进行文件操作以提高性能,因此在电源被安全地关闭前需要适当的关机过程,通过将内存中的数据强制写入硬盘来维持文件的完整性.
如果软件的电源控制可用,那么关机过程中会自动关闭系统电源.
(否则,你可能需要在关机过程之后按电源键几秒钟.
)在普通多用户模式模式下,可以使用命令行关闭系统.
Debian参考手册4/262#shutdown-hnow在单用户模式下,可以使用命令行关闭系统.
#poweroff-i-f另外,如果在"/etc/inittab"中含有"ca:12345:ctrlaltdel:/sbin/shutdown-t1-a-hnow",那么你可以按下Ctrl-Alt-Delete(同时按下左Ctrl键、左Alt键和Delete)来关机.
参见inittab(5)获取更多细节.
参见第6.
9.
6节.
1.
1.
9恢复一个正常的控制台当做了一些滑稽的事(例如"cat")后,屏幕会发狂,你可以在命令行输入"reset".
你可能无法在屏幕上看到你输入的命令.
你也可以输入"clear"来清屏.
1.
1.
10建议新手安装的额外软件包尽管连无需任何桌面环境的Debian系统最小安装都提供了基本的Unix功能,但对新手而言,使用apt-get(8)安装一些基于字符终端的命令行和curses软件包(例如mc和vim)依旧是一个不错的主意.
#apt-getupdate.
.
.
#apt-getinstallmcvimsudo.
.
.
如果你已经安装了这些软件包,那么不会有新的软件包被安装.
软件包流行度大小说明mcV:59,I:2361482文本模式的全屏文件管理器sudoV:563,I:8064555给普通用户授予部分root权限的程序vimV:106,I:3983231Unix文本编辑器Vi的改进版,一个程序员的文本编辑器(标准版)vim-tinyV:62,I:9701553Unix文本编辑器Vi的改进版,一个程序员的文本编辑器(精简版)emacs-noxV:4,I:1718364GNU项目的Emacs,基于Lisp的扩展文本编辑器w3mV:31,I:2842289文本模式的万维网浏览器gpmV:11,I:17530Unix风格的文本控制台复制粘贴工具(守护进程)Table1.
1:有趣的文本模式程序包列表您也可以考虑阅读一些其他的信息文档.
你可以用下面的命令安装这些包.
#apt-getinstallpackage_name1.
1.
11额外用户账号如果你不想用你自己的主用户账户来进行下面的练习操作,你可以使用下面的方式创建一个练习用户账户,比如说,创建一个用户名为fish的账号.
#adduserfishDebian参考手册5/262软件包流行度大小说明doc-debianI:854166Debian项目文档,(Debian常见问题)和其它文档debian-policyI:364306Debian策略手册和相关文档developers-referenceI:61917Debian开发者指导方针和信息maint-guideI:4987Debian新维护者手册debian-historyI:14285Debian项目历史debian-faqI:849817Debian常见问题Table1.
2:软件包信息文档列表回答所有问题.
这将创建一个名为fish的新账号.
在你练习完成后,你可以使用下面的命令删除这个用户账号和它的用户主目录.
#deluser--remove-homefish1.
1.
12sudo配置对于典型的单用户工作站,例如运行在笔记本电脑上的桌面Debian系统,通常简单地配置sudo(8)来使为非特权用户(例如用户penguin)只需输入用户密码而非root密码就能获得管理员权限.
#echo"penguinALL=(ALL)ALL">>/etc/sudoers另外,可以使用下列命令使非特权用户(例如用户penguin)无需密码就获得管理员权限.
#echo"penguinALL=(ALL)NOPASSWD:ALL">>/etc/sudoers这些技巧只对你管理的单用户工作站中那个唯一的用户有用.
警告在多用户工作站中不要建立这样的普通用户账户,因为它会导致非常严重的系统安全问题.
小心在上述例子中,用户penguin的密码及账号要有和root账号密码同样多的保护.
小心在这种情况下,管理员权限被赋予那些有权对工作站进行系统管理任务的人.
永远不要让你的公司行政管理部门或你的老板进行管理(例如给予他们权限),除非他们获得了授权并有这样的能力.
注意为了对受限的设备和文件提供访问权限,你应该考虑使用组来提供受限访问,而不是通过sudo(8)来使用root权限.
注意随着越来越细致周密的配置,sudo(8)可以授予一个共享系统上的其它用户有限的管理权限而不共享root密码.
这可以帮助对有多个管理员的主机进行责任追究,你可以了解到是谁做什么.
另一方面,你可能不想任何人有这样的权限.
Debian参考手册6/2621.
1.
13动手时间现在你已经准备好在Debian系统上开工了,只要你使用非特权用户账号就不会有风险.
这是因为Debian系统(即使是默认安装)会设置适当的文件权限来防止非特权用户对系统造成破坏.
当然,可能仍然有一些漏洞可以利用,但关心这些问题的人不应该阅读这一节,而应该去阅读Debian安全手册.
我们使用下面的方式,把Debian系统当作一个类Unix系统来学习.
第1.
2节(基本概念)第1.
3节(生存方式)第1.
4节(基本方式)第1.
5节(shell机制)第1.
6节(文本处理方式)1.
2类Unix文件系统在GNU/Linux和其他类Unix操作系统中,文件被组织到目录中.
所有的文件和目录排放在以"/"为根的巨大的树里.
叫它树是因为如果你画出文件系统,它看起来就像一棵树,但是它是颠倒过来的.
这些文件和目录可以分散在多个设备中.
mount(8)用于把某个设备上找到的文件系统附着到巨大的文件树上.
相反的,umount(8)把它再次分离.
在最近的Linux内核里,mount(8)带某些参数时可以把文件树的一部分绑定到另外的地方,或者可以把文件系统挂载为共享的、私有的、从设备、或不可绑定的.
对每个文件系统支持的挂载选项可以在/usr/share/doc/linux-doc-*/Documentation/filesystems/找到.
Unix系统上叫做目录,某些其他系统上叫做文件夹.
请同样留意,在任何Unix系统上,没有的驱动器的概念,例如"A:".
这只有一个文件系统,并且所有东西都包含在内.
这相对于Windows来说是一个巨大的优点.
1.
2.
1Unix文件基础下面是一些Unix文件基础.
文件名是区分大小写的.
也就是说,"MYFILE"和"MyFile"是不同的文件.
根目录意味着文件系统的根,简单的称为"/",不要把它跟root用户的家目录"/root"混淆了.
每个目录都有一个名字,它可以包含任意字母或除了/"以外的符号.
根目录是个特例.
它的名字是"/"(称作"斜线"或"根目录"),并且它不能被重命名.
每个文件或目录都被指定一个全限定文件名,绝对文件名,或路径,按顺序给出必须经过的目录从而到达相应目录.
这三个术语是同义的.
所有的全限定文件名以"/"目录开始,并且在每个目录或文件名之间有一个"/".
第一个"/"是最顶层目录,其他的"/"用于分隔跟着的子目录.
直到到达最后的入口,即实际文件的名称.
这些话可能会令人困惑.
用下面这个全限定文件名作为例子:"/usr/share/keytables/us.
map.
gz".
不过,人们也把它的基名"us.
map.
gz"单独作为文件名.
根目录有很多分支,例如"/etc/"和"/usr/".
这些子目录依次分出更多的子目录,例如"/etc/init.
d/"和"/usr/local/".
这整体叫做"目录树".
你可以把一个绝对文件名想象成从"/"这棵树的基到某个分支(一个文件)的结尾的一条路径.
你也听到人们谈论目录树,就好像它是一个包含所有直系后代的"家庭"树的一个图,这个图叫做根目录("/"):因此子目录有父目录,并且一条路径显示了一个文件完整的祖先.
也有相对路径从其他地方开始,而不是从根目录.
你应该还记得目录".
.
/"指向父目录.
这个术语也适用于其他类似目录的结构,如分层数据结构.
Debian参考手册7/262对于一个物理设备,是没有一个特定的目录路径名来对应的组成部分.
这不同于RT-11,CP/M,OpenVMS,MS-DOS,AmigaOS,以及微软的Windows,这些系统存在一个路径包含了一个设备名字,比如"C:\".
(尽管如此,路径条目确实存在引用了物理设备作为正常的文件系统的一部分.
参考第1.
2.
2节.
)注意虽然你可以在文件名中使用任意的字幕或者符号,但是在实际情况下这样做是一个坏主意.
最好避免使用一些在命令行里面含有特殊意义的字符,比如空格,制表符,换行符,和其它的特殊字符:如果你想有一个区分度良好的命名,比较好的选择是利用时期,连字符和下划线.
你也可以每个单词的首字母大写,这叫大驼峰命名法,比如这样"LikeThis".
经验丰富的Linux用户会趋向于在文件名中不使用空格.
注意这个"root"可能既表示"超级用户root"又表示"根目录"(/root).
应该根据上下文确定它的用法.
注意单词path不仅表示包含全限定文件名,也可能表示命令搜索的路径.
通常路径真实的意思是需要通过上下文来明确.
关于文件层次的最佳详细实践在文件系统层次标准("/usr/share/doc/debian-policy/fhs/fhs-2.
3.
txt.
gz"和hier(7)).
你应该记住以下的一些标准作为开始学习的步骤.
目录目录用途/根目录/etc/系统范围的配置文件/var/log/系统日志文件/home/所有非特权用户的用户目录Table1.
3:重要目录的用途列表1.
2.
2文件系统深入解析按照UNIX系统的传统,DebianGNU/Linux的文件系统是在物理数据存储设备诸如磁盘或其他存储设备上,与硬件设备的交互,如控制台和远程串口终端都是以统一的方式呈现在"/dev/"下面.
每个文件、目录、命名管道(一种两个程序间共享数据的方法)或DebianGNU/Linux系统上的物理设备都有一个叫做inode的数据结构,描述了其相关属性,例如拥有它的用户(所有者),它属于的组,最后一次访问时间,等等.
把所有东西都表示在文件系统中的想法是来源于Unix,现代的Linux内核则将这个思路进行了扩展.
现在,甚至有关计算机上正在运行的进程的信息都可以在文件系统中找到.
这个对物理实体和内部进程的统一和抽象是非常强大的,因为这允许我们用同样的命令对许多完全不同的设备进行同样的操作.
甚至可以通过向链接到运行进程的特殊文件写入数据来改变内核的运行方式.
提示如果您需要识别文件树和物理实体之间的对应关系,请尝试不带参数运行mount(8).
1.
2.
3文件系统权限类Unix系统的文件系统权限被定义给三类受影响的用户.
Debian参考手册8/262拥有这个文件的用户(u)这个文件所属组的其他用户(g)所有其余的用户(o),同样称为"世界"和"所有人"对文件来说,每个对应权限允许下列动作.
可读(r)权限允许所有者检查文件的内容.
可写(w)权限允许所有者修改文件内容.
可执行(x)权限允许所有者把文件当做一个命令运行.
对于目录来说,每个对应权限允许下列动作.
可读(r)权限允许所有者列出目录内的内容.
可写(w)权限允许所有者添加或删除目录里面的文件.
可执行(x)权限允许所有者访问目录里的文件.
在这里,一个目录的可执行权限意味着不仅允许读目录里的文件,还允许显示他们的属性,例如大小和修改时间.
ls(1)用于显示文件和目录的权限信息(更多).
当运行时带有"-l"选项,它将按给定顺序显示下列信息.
文件类型(第一个字母)文件的访问权限(9个字符,三个字符组成一组按照用户、组、其他的顺序表示)链接到文件的硬链接数文件所有者的用户名这个文件所属的组名以字符(字节)为单位的文件大小文件的日期和时间(mtime)文件的名字字符说明-普通文件d目录l符号链接c字符设备节点b块设备节点p命名管道s套接字Table1.
4:"ls-l"输出的第一个字符列表chown(1)用于root账户修改文件的所有者.
chgrp(1)用于文件的所有者或root账户修改文件所属的组.
chmod(1)用于文件的所有者或root账户修改文件和文件夹的访问权限.
操作一个foo文件的基本语法如下.
#chownfoo#chgrpfoo#chmod[ugoa][+-=][rwxXst][,.
.
.
]foo例如,你可以按照下面使一个目录树被用户foo所有,并共享给组bar.
Debian参考手册9/262#cd/some/location/#chown-Rfoo:bar.
#chmod-Rug+rwX,o=rX.
有三个更加特殊的权限位.
Set-User-ID(SUID)位(s或S替换用户的x)Set-Group-ID(SGID)位(s或S替换组的x)粘滞位(t或T替代其他用户的x)如果"ls-l"对这些位的输出是大写字母,则表示这些输出下面的执行位未设置.
给一个可执行文件设置Set-User-ID位将允许一个用户以他自己的ID运行这个可执行文件(例如root用户).
类似的,给一个可执行文件设置了Set-Group-ID位将允许一个用户以文件所属组的ID运行该文件.
(例如root组).
由于这些设置可能导致安全风险,设置它们为可用的时候需要格外留意.
在一个目录上设置"Set-Group-ID"将打开类BSD的文件创建计划,所有在目录里面创建的文件将属于目录所属的组.
给一个目录设置"粘滞位"将保护该目录内的文件不被其所有者之外的一个用户删除.
为了保护一个在像"/tmp"这样所有人可写或同组可写的目录下文件内容的安全,不仅要去除可写权限,还要给其所在目录设置粘滞位.
否则,该文件可以被任意对其所在目录有写权限的用户删除并创建一个同名的新文件.
这里有一点有趣的文件权限例子.
$ls-l/etc/passwd/etc/shadow/dev/ppp/usr/sbin/exim4crw------T1rootroot108,0Oct1620:57/dev/ppp-rw-r--r--1rootroot2761Aug3010:38/etc/passwd-rw-r-----1rootshadow1695Aug3010:38/etc/shadow-rwsr-xr-x1rootroot973824Sep2320:04/usr/sbin/exim4$ls-ld/tmp/var/tmp/usr/local/var/mail/usr/srcdrwxrwxrwt14rootroot20480Oct1621:25/tmpdrwxrwsr-x10rootstaff4096Sep2922:50/usr/localdrwxr-xr-x10rootroot4096Oct1100:28/usr/srcdrwxrwsr-x2rootmail4096Oct1521:40/var/maildrwxrwxrwt3rootroot4096Oct1621:20/var/tmpchmod(1)有另一种数值模式来描述文件权限.
这种数字模式使用3到4位八进制(底为8)数.
数字说明第一个可选数字Set-User-ID(=4),Set-Group-ID(=2)和粘滞位(=1)之和第二个数字用户的可读(=4),可写(=2)和可执行(=1)权限之和第三个数字组权限同上第四个数字位其他用户权限同上Table1.
5:chmod(1)命令文件权限的数字模式这听起来很复杂实际上相当简单.
如果你把"ls-l"命令输出的前几列(2-10),看成以二进制(底为2)表示文件的权限("-"看成0,"rwx"看成1),你应该可以理解用数字模式值的最后3位数字对文件权限的八进制表示.
尝试下列例子$touchfoobar$chmodu=rw,go=rfoo$chmod644bar$ls-lfoobar-rw-r--r--1penguinpenguin0Oct1621:39bar-rw-r--r--1penguinpenguin0Oct1621:35fooDebian参考手册10/262提示如果你需要在shell脚本中访问"ls-l"显示的信息,你需要使用相关命令,如test(1),stat(1)和readlink(1).
shell内置命令,如"["或"test",可能也会用到.
1.
2.
4控制新建文件的权限:umask什么权限将应用到新建文件受shell内置命令umask的限制.
参见dash(1),bash(1),和内建命令(7).
(b''文b''b''件b''b''权b''b''限b'')=(b''请b''b''求b''b''的b''b''文b''b''件b''b''权b''b''限b'')&~(umaskb''值b'')umask值创建的文件权限创建的目录权限用法0022-rw-r--r---rwxr-xr-x仅所属用户可写0002-rw-rw-r---rwxrwxr-x仅所属组可写Table1.
6:umask值举例Debian默认使用用户私人组(UPG).
每当一个新用户添加到系统的时候都会创建一个UPG.
UPG的名字和创建它的用户相同,这个用户是这个UPG的唯一成员.
自从每个用户都有自己的私人组之后,把umask设置成0002变得更安全了.
(在某些Unix变体中,把所有普通用户设置到一个叫users的组是非常常见的做法,在这种情况下,出于安全考虑把umask设为0022是一个好主意)提示通过把"umask002"写入~/.
bashrc文件打开UPG.
1.
2.
5一组用户的权限(组)为了使组权限应用到一个特定用户,这个用户需要通过使用"sudovigr"编辑/etc/group以及使用"sudovigr-s"编辑/etc/gshadow成为该组的成员.
你需要注销之后重新登录(或运行"execnewgrp")以启用新的组配置.
注意或者,你可以通过添加一行"authoptionalpam_group.
so"到"/etc/pam.
d/common-auth"以及配置"/etc/security/group.
conf",使得在身份验证过程动态添加用户到组.
(参见第4章.
)在Debian系统中,硬件设备是另一种文件.
如果你从一个用户账户访问某些设备出现问题,例如CD-ROM和USB记忆棒,你需要使这个用户成为相关组的成员.
一些著名的由系统提供的组允许其成员不需要root权限访问某些特定的文件和设备.
提示你需要属于dialout组才能重配置调制解调器、拨号到任意地方,等等.
但如果root用户在"/etc/ppp/peers/"为受信任点创建了预定义配置文件的话,你只需要属于dip组,就可以创建拨号IP来连接到那些受信任的点上,需使用的命令行工具包括pppd(8)、pon(1)以及poff(1).
某些著名的由系统提供的组允许它们的成员不带root权限运行特定的命令.
由系统提供的用户和组的完整列表,参见由base-passwd包提供的"/usr/share/doc/base-passwd/users-and-grou中,当前版本的"用户和组".
用户和组系统的管理命令,参见passwd(5),group(5),shadow(5),newgrp(1),vipw(8),vigr(8),以及pam_group(8).
Debian参考手册11/262组可访问文件和设备的描述dialout完全及直接的访问串口端口("/dev/ttyS[0-3]")dip有限的访问串口,创建到信任点的拨号IP连接cdromCD-ROM,DVD+/-RW驱动器audio音频设备video视频设备scanner扫描仪adm系统监控日志staff一些用于初级管理工作的目录:"/usr/local","/home"Table1.
7:关于文件访问的由系统提供的著名组列表组可访问命令sudo不带它们的密码运行sudolpadmin执行命令以从打印机数据库添加、修改、移除打印机Table1.
8:著名的由系统提供用于特定命令运行的组列表1.
2.
6时间戳GNU/Linux文件有三种类型的时间戳.
类型含义(历史上Unix的定义)mtime文件修改时间(ls-1)ctime文件状态修改时间(ls-lc)atime文件最后被访问的时间(ls-lu)Table1.
9:时间戳类型列表注意ctime不是文件创建时间.
注意atime在GNU/Linux系统上的真实值可能和历史上Unix的定义有所不同.
覆盖一个文件,将会改变该文件所有的mtime,ctime,和atime属性.
改变文件的所有者或者权限,将改变文件的ctime和atime属性.
在历史上的Unix系统中,读取一个文件将改变文件的atime属性.
读一个文件,将改变文件的atime属性;在GNU/Linux系统上,这仅发生在其文件系统使用"strictatime"参数挂载的情况下.
如果GNU/Linux系统的文件系统使用"relatime"选项挂载,第一次读文件,或者随后读文件,将改变该文件的atime属性.
(从Linux2.
6.
30开始的默认行为)如果GNU/Linux系统的文件系统使用"noatime"挂载,则读一个文件,不会改变这个文件的atime属性.
注意为了在正常的使用场景中能够提升文件系统的读取效率,新增了"noatime"和"relatime"这两个加载选项.
如使用了"strictatime"选项,即使简单的文件读操作都伴随着更新atime属性这个耗时的写操作.
但是atime属性除了mbox(5)文件以外却很少用到.
详情请看mount(8).
Debian参考手册12/262使用touch(1)命令修改已存在文件的时间戳.
对于时间戳,ls命令输出字段在非英语区域("fr_FR.
UTF-8")与旧的区域("C")不同.
$LANG=fr_FR.
UTF-8ls-lfoo-rw-rw-r--1penguinpenguin0oct.
1621:35foo$LANG=Cls-lfoo-rw-rw-r--1penguinpenguin0Oct1621:35foo提示参考第9.
2.
5节自定义"ls-l"输出.
1.
2.
7链接有两种方法把一个文件"foo"链接到一个不同的文件名"bar".
硬链接–对现有文件重复名称–"lnfoobar"符号链接或symlink–通过名字指向另一个文件的特殊文件–"ln-sfoobar"请参阅下面的示例,rm命令结果中链接数的变化和细微的差别.
$umask002$echo"OriginalContent">1foo$ls-lifoo1449840-rw-rw-r--1penguinpenguin17Oct1621:42foo$lnfoobar#b''硬b''b''链b''b''接b''$ln-sfoobaz#b''符b''b''号b''b''链b''b''接b''$ls-lifoobarbaz1449840-rw-rw-r--2penguinpenguin17Oct1621:42bar1450180lrwxrwxrwx1penguinpenguin3Oct1621:47baz->2foo1449840-rw-rw-r--2penguinpenguin17Oct1621:42foo$rmfoo$echo"NewContent">3foo$ls-lifoobarbaz1449840-rw-rw-r--1penguinpenguin17Oct1621:42bar1450180lrwxrwxrwx1penguinpenguin3Oct1621:47baz->4foo1450183-rw-rw-r--1penguinpenguin12Oct1621:48foo$catbarOriginalContent$catbazNewContent硬链接可以在同一个文件系统内创建,并共用同一个inode号,由ls(1)带"-i"选项显示的.
符号链接总是名义上具有"rwxrwxrwx"的文件访问权限,如上面例子所示,实际的有效访问权限由它所指向的文件确定.
小心除非你有非常好的理由,否则不要创建一个复杂的符号链接或硬链接通常是个好主意.
符号链接的逻辑组合可能导致文件系统噩梦般的无限循环.
Debian参考手册13/262注意通常使用符号链接比使用硬链接更合适,除非你有一个好理由使用硬链接.
".
"目录链接到它所在的目录,因此任何新建目录的链接数从2开始.
".
.
"目录链接到父目录,因此目录的链接数随着新的子目录的创建而增加.
如果你刚从Windows迁移到Linux,你很快将清楚Unix的文件名链接相较于Windows最相近的"快捷方式"是多么精心设计的.
由于它是在文件系统中实现的,应用无法看到链接文件跟原始文件之间的区别.
在硬链接这种情况,这真的是毫无差别.
1.
2.
8命名管道(先进先出)命名管道是一个像管道一样的文件.
你把内容放进了文件,它从另一端出来.
因此,它被称为FIFO,即先进先出:你从管道这端先放进去的东西会从另一端先出来.
如果对一个命名管道进行写入操作,写入的过程不会被终止,直到写入的信息从管道中被读取出来.
读取过程将会持续到没有信息可以读取为止.
管道的大小始终是零,它不存储数据,它只是连接两个过程,像shell提供的"1|2"语法功能一样.
然而,一旦管道有了名称,这两个进程就可以不必在同一个命令行,甚至由同一个用户运行.
管道是UNIX的一个非常有影响力的创新.
尝试下列例子$cd;mkfifomypipe$echo"hello">mypipe&#b''放b''b''到b''b''后b''b''台b''b''运b''b''行b''[1]8022$ls-lmypipeprw-rw-r--1penguinpenguin0Oct1621:49mypipe$catmypipehello[1]+Doneecho"hello">mypipe$lsmypipemypipe$rmmypipe1.
2.
9套接字套接字被广泛应用于所有的互联网通信,数据库和操作系统本身.
它类似于命名管道(FIFO)并且允许进程之间甚至不同计算机之间进行信息交换.
对于套接字,这些进程不需要在同一时间运行,也不需要是同一个父进程的子进程.
它是进程间通信(IPC)的一个节点.
信息的交换可能会通过网络发生在不同主机之间.
最常见的两种是互联网套接字和UNIX域套接字.
提示通过"netstat-an"命令可以很方便的查看系统已经打开了哪些套接字.
1.
2.
10设备文件设备文件包括系统的物理设备和虚拟设备,如硬盘、显卡、显示屏、键盘.
虚拟设备的一个例子是控制台,用"/dev/console"来描述.
设备文件有两种类型.
字符设备–每次访问一个字符Debian参考手册14/262–一个字符等于一个字节–如键盘、串口…块设备–通过更大的单元–块,进行访问–一个块>一个字节–如硬盘等…你可以读写块设备文件,尽管该文件可能包含二进制数据,读取后显示出无法理解的乱码.
向文件写入数据,有时可以帮助定位硬件连接故障.
比如,你可以将文本文件导入打印机设备"/dev/lp0",或者将调制解调命令发送到合适的串口"/dev/ttyS0".
但是,除非这些操作都小心完成,否则可能会导致一场大灾难.
所以要特别小心.
注意常规访问打印机,使用lp(1).
设备的节点数可以通过执行ls(1)得到,如下所示.
$ls-l/dev/sda/dev/sr0/dev/ttyS0/dev/zerobrw-rw---T1rootdisk8,0Oct1620:57/dev/sdabrw-rw---T+1rootcdrom11,0Oct1621:53/dev/sr0crw-rw---T1rootdialout4,64Oct1620:57/dev/ttyS0crw-rw-rw-1rootroot1,5Oct1620:57/dev/zero"/dev/sda"的主设备号是8,次设备号是0.
它可以被disk群组的用户读写.
"/dev/sr0"的主设备号是11,次设备号是0.
它可以被cdrom群组的用户读写.
"/dev/ttyS0"的主设备号是4,次设备号是64.
它可以被dailout群组的用户读写.
"/dev/zero"的主设备号是1,次设备号是5.
它可以被任意用户读写.
在现代Linux系统中,处在"/dev"之下的文件系统会自动被udev()机制填充.
1.
2.
11特殊设备文件还有一些特殊的设备文件.
设备文件操作响应描述/dev/null读取返回"文件结尾字符(EOF)"/dev/null写入无返回(一个无底的数据转存深渊)/dev/zero读取返回"\0空字符"(与ASCII中的数字0不同)/dev/random读取从真随机数产生器返回一个随机字符,供应真熵(缓慢)/dev/urandom读取从能够安全加密的伪随机数产生器返回一个随机字符/dev/full写入返回磁盘已满(ENOSPC)错误Table1.
10:特殊设备文件列表这些特别设备文件经常和shell数据重定向联合使用(参考第1.
5.
8节).
Debian参考手册15/2621.
2.
12procfs和sysfsprocfs和sysfs两个伪文件系统,分别加载于"/proc"和"/sys"之上,将内核中的数据结构暴露给用户空间.
或者说,这些条目是虚拟的,他们打开了深入了解操作系统运行的方便之门.
目录"/proc"为每个正在运行的进程提供了一个子目录,目录的名字就是进程标识符(PID).
需要读取进程信息的系统工具,如ps(),可以从这个目录结构获得信息.
"/proc/sys"之下的目录,包含了可以更改某些内核运行参数的接口.
(你也可以使用专门的sysctl()命令修改,或者使用其预加载/配置文件"/etc/sysctl.
conf".
)当人们看到这个特别大的文件"/proc/kcore"时,常常会惊慌失措.
这个文件于你的的电脑内存大小相差不多.
它被用来调试内核.
它是一个虚拟文件,指向系统内存,所以不必担心它的大小.
"/sys"以下的目录包含了内核输出的数据结构,它们的属性,以及它们之间的链接.
它同时也包含了改变某些内核运行时参数的接口.
参考"proc.
txt(.
gz)","sysfs.
txt(.
gz)",以及其他相关的Linux内核文档("/usr/share/doc/linux-doc-*/Docu这些文件由linux-doc-*软件包提供.
1.
2.
13tmpfstmpfs是一个临时文件系统,它的文件都保存在虚拟内存中.
必要时,位于内存页缓存的tmpfs数据可能被交换到硬盘中的交换分区.
系统启动早期阶段,"/run"目录挂载为tmpfs.
这样即使"/"挂载为只读,它也是可以被写入的.
它为过渡态文件提供了新的存储空间,同时也替代了FilesystemHierarchyStandar2.
3版中说明的目录位置:"/var/run"→"/run""/var/lock"→"/run/lock""/dev/shm"→"/run/shm"参考"tmpfs.
txt(.
gz)",文件位于Linux内核文档("/usr/share/doc/linux-doc-*/Documentation/filesystem目录之下,由软件包linux-doc-*提供.
1.
3MidnightCommander(MC)MidnightCommander(MC)是一个Linux终端或其它终端环境下的GNU版"瑞士军刀".
它为新手们提供了一个菜单式样的终端使用体验,这更易于学习运用标准的Unix命令.
你可能需要按照下面的命令来安装标题为"mc"的MidnightCommander包.
$sudoapt-getinstallmc使用mc(1)命令那个来浏览Debian系统.
这是最好的学习方式.
请使用光标键和回车键来翻看一些感兴趣的内容.
"/etc"及其子目录"/var/log"及其子目录"/usr/share/doc"及其子目录"/sbin"和"/bin"Debian参考手册16/2621.
3.
1自定义MC为了在退出MC的时候更改目录并cd到其它目录,我建议修改"~/.
bashrc"包含一个由mc包提供的脚本.
.
/usr/lib/mc/mc.
sh查看mc(1)(在"-P"选项里)的原因.
(如果你不能理解我这里说所讲的,你可以稍后回头再看)1.
3.
2启动MCMC可以这样启动起来.
$mcMC通过菜单覆盖了所有的文件操作,因此而让用户更省心省力.
只需要按F1就可以跳转到帮助界面.
你只需要按光标键和功能键就可以使用MC.
注意某些终端比如gnome-terminal(1),功能键的按键触发消息可能会被终端程序截取.
在gnome-terminal里可以通过"Edit"→"KeyboardShortcuts"选项设置来禁止这类消息.
如果你遇到字符编码问题,显示出来都是乱码,通过添加"-a"到MC命令行或许有助于避免此类问题.
如果这样不能解决MC中的显示问题,可以参考第9.
4.
6节.
1.
3.
3MC文件管理默认的两个目录面板里包含了文件列表.
另一个有用的模式是设置右边窗口为"信息"来读取文件访问权限信息.
接下来是一些必要的快捷键.
守护进程gpm(8)运行的时候,你也可以在字符命令行里用鼠标来操作.
(在MC里进行复制和粘贴操作的时候一定要按住shift键.
)快捷键键绑定功能F1帮助菜单F3内部文件查看器F4内部编辑器F9激活下拉菜单F10退出MidnightCommanderTab在两个窗口间移动Insert或Ctrl-T用于多文件操作的标记文件,如副本Del删除文件(注意---设置MC为安全删除模式)光标键自我解释Table1.
11:MC快捷键绑定1.
3.
4MC命令行技巧cd命令在选中的屏幕中改变目录.
Ctrl-EnterorAlt-Enter拷贝文件名到命令行.
使用cp(1)和mv(1)两个命令来进行处理.
Alt-Tab显示文件名自动补全提示.
通过添加MC命令参数可以指定开始目录;例如,"mc/etc/root".
Debian参考手册17/262Esc+n-key→Fn(i.
e.
,Esc+1→F1,etc.
;Esc+0→F10)先按Esc键和同时按Alt是一样;例如,输入Esc+c和同时Alt-C是一样的.
Esc被称为meta键,有时候也称之为"M-".
1.
3.
5MC内部编辑器这个内置编辑器有一个有意思的粘贴方案.
摁F3开始选择起始点,再摁F3选择终点并高亮选择区.
此刻你可以移动你的光标,使用F6将选区移动到当前光标下,F5则将选区复制到当前光标下.
F2保存文件.
F10退出.
多数光标键以直观的方式工作.
MC编辑器可以直接以下面的命令方式启动.
$mc-efilename_to_edit$mceditfilename_to_edit这不是一个多窗口编辑器,但是能通过复用终端来达到同样的效果.
在两个窗口间复制,需要用到Alt-F来切换虚拟终端并使用"File→Insertfile"或者"File→Copytofile"来移动文本.
内部编辑器可以被外部编辑器替代.
同样,许多程序使用环境变量$EDITOR或$VISUAL来决定编辑器的使用.
如果你准备使用vim(1)或者nano(1)来开始,你或许需要将下面的代码加入"~/.
bashrc"来对mcedit进行设置.
exportEDITOR=mceditexportVISUAL=mcedit如果可能的话我推荐用"vim".
如果你使用vim(1)并不顺手,你可以在大部分系统中继续使用mcedit(1)来进行工作.
1.
3.
6MC内部查看器MC是一个非常智能的查看器.
这是一个在文档中搜索文本的好工具.
我经常使用它在/usr/share/doc目录中查找文件.
这是浏览大量Linux信息的最快方式.
这个查看器可以通过下列命令中的任何一个来直接启动.
$mc-vpath/to/filename_to_view$mcviewpath/to/filename_to_view1.
3.
7自动启动MC在文件中输入回车,用适当的程序来处理文件的内容(查看第9.
3.
11节).
这是MC一个非常方便的用法.
文件类型对回车键的响应可执行文件执行命令帮助文档管道内容查看器软件html文件管道内容网页浏览器"*.
tar.
gz"和"*.
deb"文件浏览其内容就像查看子目录一样Table1.
12:MC中对回车键的响应为让这些查看器和虚拟文件特征生效,可查看的文件不能够被设置为可执行.
使用chmod(1)或通过MC文件菜单改变他们的状态.
Debian参考手册18/2621.
3.
8MC中的FTP虚拟文件系统MC能够使用FTP跨因特网访问文件.
在菜单按F9,然后输入"p"来激活FTP虚拟文件系统.
按"username:passwd@hostnam的形式输入URL,就会像本地目录一样来检索远程目录.
试着打开"[deb.
debian.
org/debian]"来浏览Debian的文件组织结构.
1.
4类Unix工作环境基础虽然MC差不多可以让你做任何事情,但学会从shell提示下使用命令行工具也是非常重要的,可以让你变得熟悉类Unix工作环境.
1.
4.
1登录shell你可以通过chsh(1)选择你的登录shell.
软件包流行度大小POSIXshell说明bashV:791,I:9996469YesBash:GNUBourneAgainSHell(事实上的标准)tcshV:9,I:291316NoTENEXCShell:一个Berkeleycsh的增强版本dashV:907,I:992221YesDebianAlmquistShell,擅长shell脚本zshV:37,I:732442YesZshell:有许多增强的标准shellmkshV:4,I:121469YesKornshell的一个版本cshV:2,I:8343NoOpenBSDCShell,Berkeleycsh的一个版本sashV:0,I:61054Yes有内置命令的Stand-aloneshell(并不意味着标准的"/bin/sh")kshV:3,I:163284YesKornshell的真正的AT&T版本rcV:0,I:2169NoAT&TPlan9rcshell的一个实现poshV:0,I:0190YesPolicy-compliantOrdinarySHell策略兼容的普通shell(pdksh派生)Table1.
13:shell程序列表提示虽然类POSIX共享基本语法,但他们在shell变量和全局扩展等基本事情上,行为可以不同.
细节请查阅他们的文档.
在本教程中,交互式的shell总是指bash.
1.
4.
2定制bash你可以通过"~/.
bashrc"来定制bash(1)的行为.
尝试下列例子.
#enablebash-completionif!
shopt-oqposix;thenif[-f/usr/share/bash-completion/bash_completion];then.
/usr/share/bash-completion/bash_completionelif[-f/etc/bash_completion];then.
/etc/bash_completionfifiDebian参考手册19/262#CDuponexitingMC.
/usr/lib/mc/mc.
sh#setCDPATHtoagoodoneCDPATH=.
:/usr/share/doc:~:~/Desktop:~exportCDPATHPATH="${PATH+$PATH:}/usr/sbin:/sbin"#setPATHsoitincludesuser'sprivatebinifitexistsif[-d~/bin];thenPATH="~/bin${PATH+:$PATH}"fiexportPATHEDITOR=vimexportEDITOR提示你可以在第9章中的第9.
2.
7节找到更多关于bash的定制技巧.
提示bash-completion软件包能够让bash进行命令补全.
1.
4.
3特殊按键在类Unix环境,有一些具有特殊含义的按键.
请注意,普通的Linux字符控制台,只有左手边的Ctrl和Alt键可以正常工作.
其中有几个值得记住的按键.
快捷键描述Ctrl-U删除光标前到行首的字符Ctrl-H删除光标前的一个字符Ctrl-D终止输入(如果你在使用shell,则退出shell)Ctrl-C终止一个正在运行的程序Ctrl-Z通过将程序移动到后台来暂停程序Ctrl-S停止屏幕输出Ctrl-Q激活屏幕输出Ctrl-Alt-Del重启/关闭系统,参见inittab(5)Left-Alt-key(或Windows-key)Emacs和相似UI的元键(meta-key)Up-arrow开始在bash中的命令历史搜索Ctrl-R开始在bash中的增量命令历史搜索Tab在bash命令行中补全文件名Ctrl-VTab在bash命令行中输出Tab而不是进行补全Table1.
14:bash的按键绑定列表提示Ctrl-S的终端功能可能被stty(1)禁用.
Debian参考手册20/2621.
4.
4Unix类型的鼠标操作Unix类型的鼠标操作基于3键的鼠标系统.
操作响应左击并拖动鼠标选择并复制到剪贴板单击左键选择开头单击右键选择末尾并拷贝到剪贴板单击中键粘贴剪切板的内容到光标处Table1.
15:Unix样式的鼠标操作列表在现代滚轮鼠标上的中央滚轮,被认为是中间键,并可以被当做中间键使用.
在2键鼠标系统的情况下,同时按左键和右键就相当于按中间键.
为了在Linux字符控制台使用鼠标,你需要把gpm(8)作为后台守护进程(daemon)运行.
1.
4.
5分页程序less(1)命令是一个增强版的分页程序(文件内容查看器).
它按照指定的命令参数或标准输出来读取文件.
在用less命令查看的时候如果需要帮助可以按"h".
它的功能比more(1)命令更丰富,通过在脚本的开头执行"eval$(lesspipe)"或"eval$(lessfile)"它的功能还能变得更加强大.
详细请参考"/usr/share/doc/less/LESSOPEN".
"-R"选项可以实现原始的字符输出还可以启用ANSI颜色转义序列.
详细请参考less(1).
1.
4.
6文本编辑器在使用类Unix系统过程中,各种类似于Vim或Emacs的工具,你应该精通其中的一个.
我认为习惯于使用Vim命令是一个明智的选择,因为Linux/Unix系统里一般都附带了Vi编辑器.
(实际上最初的vi以及后来的nvi这类工具程序很常见.
因为在Vim里提供了F1帮助键,在同类工具中它的功能更强大,所以我选择Vim而不是其它新出的一些工具.
)假设你不是用Emacs就是用XEmacs作为你的编辑器,其实还有更好的选择,尤其是在编程的时候.
Emacs还有很多其他的特点,包括新手导读,目录编辑器,邮件客户端等等.
当编写脚本或程序的时候,它能自动识别当前工作模式所对应的格式,让使用更加便利.
一些人甚至坚持认为Linux系统里最需要配备的就是Emacs.
花十分钟来学习Emacs可以为后面的工作剩下更多时间.
在此强烈推荐学习使用Emacs时候直接使用GNUEmacs参考手册.
在实践应用中所有这些程序都会有一个教程,输入"vim"和F1键就可以启动Vim.
建议你最好阅读一下前面的35行.
移动光标到"|tutor|"并按Ctrl-]就可以看到在线培训教程.
注意好的编辑器,像Vim和Emacs,可以处理UTF-8及其它不常用编码格式的文本.
有个建议就是在X环境下使用UTF-8编码,并安装要求的程序和字体.
编辑器里可以选择独立于X环境的编码格式.
关于多字节文本可以查阅参考文档.
1.
4.
7设置默认文本编辑器Debian有许多不同的编辑器.
我们建议安装上面提到的vim软件包.
Debian通过命令"/usr/bin/editor"提供了对系统默认编辑器的统一访问,因此其它程序(例如reportbug(1))可以调用它.
你可以通过下列命令改变它.
$sudoupdate-alternatives--configeditor对于新手,我建议使用"/usr/bin/vim.
basic"代替"/usr/bin/vim.
tiny",因为它支持格式高亮.
Debian参考手册21/262提示许多程序使用环境变量"$EDITOR"或"$VISUAL"来决定使用那个编辑器(参见第1.
3.
5节和第9.
3.
11节).
出于Debian系统的一致性考虑,它们被设置到"/usr/bin/editor".
(在历史上,"$EDITOR"是"ed","$VISUAL"是"vi".
)1.
4.
8定制vim你可以通过"~/.
vimrc"来定制vim(1)的行为.
尝试下列例子"Localconfiguration"setnocompatiblesetnopastesetpastetoggle=synonif$USER=="root"setnomodelinesetnoswapfileelsesetmodelinesetswapfileendif"fillertoavoidthelineabovebeingrecognizedasamodeline"filler"filler1.
4.
9记录shell活动shell命令的输出有可能滚动出了屏幕,并可能导致你无法再查看到它.
将shell活动记录到文件中再来回顾它是个不错的主意.
当你执行任何系统管理任务时,这种记录是必不可少的.
记录shell活动的基本方法是在script(1)下运行shell.
尝试下列例子$scriptScriptstarted,fileistypescript在script下使用任何shell命令.
按Ctrl-D来退出script.
$vimtypescript参见第9.
2.
3节.
1.
4.
10基本的Unix命令让我们来学习基本的Unix命令.
在这里,我指的是一般意义上的"UNIX".
任何UNIX克隆系统通常都会提供等价的命令.
Debian系统也不例外.
如果有一些命令不像你想的那样起作用,请不要担心.
如果shell中使用了别名,其对应的命令输出会不同.
这些例子并不意味着要以这个顺序来执行.
尝试使用非特权用户账号来使用下列的命令.
Debian参考手册22/262命令说明pwd显示当前/工作目录的名称whoami显示当前的用户名id显示当前用户的身份(名称、uid、gid和相关组)file显示""文件的文件类型type-p显示""命令的文件所处位置which同上type显示""命令的相关信息apropos查找与""有关的命令man-k同上whatis用一行解释""命令man-a显示""命令的解释(Unix风格)info显示""命令相当长的解释(GNU风格)ls显示目录内容(不包含以.
点号开头的文件和目录)ls-a显示目录内容(包含所有文件和目录)ls-A显示目录内容(包含几乎所有文件和目录,除了".
.
"和".
")ls-la显示所有的目录内容,并包含详细的信息ls-lai显示所有的目录内容,并包含inode和详细的信息ls-d显示当前目录下的所有目录tree使用树状图显示目录内容lsof列出处于打开状态的文件""lsof-p列出被某进程打开的文件:""mkdir在当前目录中建立新目录""rmdir删除当前目录中的""目录cd切换到当前目录下或变量"$CDPATH"中的""目录cd/切换到根目录cd切换到当前用户的家目录cd/切换到绝对路径为"/"的目录cd.
.
切换到上一级目录cd~切换到用户""的家目录cd-切换到之前的目录建立一个空文件""cp将一个现有文件""复制到一个新文件""rm删除文件""mv将一个现有文件""重命名成""(""必须不存在)mv将一个现有文件""移动到新的位置"/"(必须存在""目录)mv/移动一个现有文件""到新位置并重命名为"/"(必须存在"bar"目录,且不存在"bar>/文件")chmod600使其他人无法读写现有文件""(并且所有人都无法执行该文件)chmod644使其他人对现有文件""可读但不可写(并且所有人都无法执行该文件)chmod755使其他人对""可读而不可写(并且所有人都能执行该文件)find.
-name使用shell""查找匹配的文件名(速度较慢)locate-d.
使用shell""查找匹配的文件名(速度较快,使用定期生成的数据库)grep-e""*.
html在当前目录下以".
html"结尾的所有文件中,查找匹配""的文件并显示top全屏显示进程信息,输入"q"退出psaux|pager显示所有正在运行的进程的信息(BSD风格)ps-ef|pager显示所有正在运行的进程的信息(Unixsystem-V风格)psaux|grep-e"[e]xim4*"显示所有正在运行"exim"和"exim4"的进程psaxf|pager显示所有正在运行的进程的信息(ASCII风格)kill杀死ID为""的进程gzip使用Lempel-Ziv编码(LZ77)将""压缩为".
gz"gunzip.
gz将".
gz"解压为""bzip2使用Burrows-Wheeter块排序压缩算法和Huffman编码将""压缩为".
bz2"(压缩效果比gzip更好)Debian参考手册23/262注意Unix有一个惯例,以".
"开头的文件将被隐藏.
它们一般为包含了配置信息和用户首选项的文件.
注意对于cd命令,参见builtins(7).
注意基本的Debian系统的默认分页程序是more(1),它无法往回滚动.
通过命令"apt-getinstallless"安装less软件包后,less(1)会成为默认的分页程序,它可以通过方向键往回滚动.
注意"["和"]"在正则表达式"psaux|grep-e"[e]xim4*""命令中,可以避免grep在结果中排除它自己,正则表达式中的"4*"意思是空或字符"4",这样可以让grep既找到"exim"也找到"exim4".
虽然"*"可以用于命令名称匹配和正则表达式中,但是它们的含义是不一样的.
欲详细了解正则表达式可以参考grep(1).
作为训练,请使用上述的命令来遍历目录并探究系统.
如果你有任何有关控制台命令的问题,请务必阅读手册.
尝试下列例子$manman$manbash$manbuiltins$mangrep$manls手册的风格可能让人有点难以习惯,因为它们都相当简洁,尤其是比较老旧、非常传统的那些手册.
但是,一旦你习惯了它,你来欣赏它们的简洁.
请注意,许多类Unix命令(包含来自GNU和BSD的)都可以显示简短的帮助信息,你可以使用下列的其中一种方式来查看它(有时不带任何参数也可以).
$--help$-h1.
5简单shell命令现在,你对如何使用Debian系统已经有一些感觉了.
让我们更深入了解Debian系统的命令执行机制.
在这里,我将为新手做一般的讲解.
精确的解释参见bash(1).
一般的命令由有序的组件构成.
1.
设置变量值(可选)2.
命令名3.
参数(可选)4.
重定向(可选:等等)5.
控制操作(可选:换行符Debian参考手册24/2621.
5.
1命令执行和环境变量一些环境变量的值会改变部分Unix命令的行为.
环境变量的默认值由PAM系统初始化,其中一些会被某些应用程序重新设定.
显示管理器(例如gdm3)会重新设定环境变量.
Shell脚本启动的时候会重置"~/.
bash_profile"和"~/.
bashrc"中的环境变量.
1.
5.
2"$LANG"变量"$LANG"变量的完整的语言环境值由3部分组成:"xx_YY.
ZZZZ".
语言环境值说明xxISO639语言代码(小写)例如"en"YYISO3166国家代码(大写)例如"US"ZZZZ编码,总是设置为"UTF-8"Table1.
17:语言环境值的3个部分对于语言代码和国家代码,参见"infogettext"中的相关描述.
对于现代Debian系统中的编码,你应该总是设定为UTF-8,除非你有足够的理由和背景知识并且特别想使用过时的编码.
对于语言环境配置的细节,参见第8.
4节.
注意在Debian系统中,请确认安装locales-all软件包来使用所有的语言环境.
注意"LANG=en_US"既不是"LANG=C"也不是"LANG=en_US.
UTF-8".
它是"LANG=en_US.
ISO-8859-1"(参见第8.
4.
1节).
使用shell命令行按顺序执行下列典型的命令.
$dateSunJun310:27:39CST2007$LANG=fr_FR.
UTF-8datedimanche3juin2007,10:27:33(UTC+0800)这里,date(1)程序执行时使用了与环境变量"$LANG"不同的值.
第一个命令,"$LANG"设置为系统的默认语言环境值"en_US.
UTF-8".
第二个命令,"$LANG"设置为法语的UTF-8语言环境值"fr_FR.
UTF-8".
大多数的命令在执行时并没有预先定义环境变量.
对于上面的例子,你也可以选择如下的方式.
$LANG=fr_FR.
UTF-8$datedimanche3juin2007,10:27:33(UTC+0900)Debian参考手册25/262语言环境推荐语言(地区)en_US.
UTF-8英语(美国)en_GB.
UTF-8英语(大不列颠)fr_FR.
UTF-8法语(法国)de_DE.
UTF-8德语(德国)it_IT.
UTF-8意大利语(意大利)es_ES.
UTF-8西班牙语(西班牙)ca_ES.
UTF-8加泰隆语(西班牙)sv_SE.
UTF-8瑞典语(瑞典)pt_BR.
UTF-8葡萄牙语(巴西)ru_RU.
UTF-8俄语(俄国)zh_CN.
UTF-8汉语(中华人民共和国)zh_TW.
UTF-8汉语(中国台湾)ja_JP.
UTF-8日语(日本)ko_KR.
UTF-8韩语(韩国)vi_VN.
UTF-8越南语(越南)Table1.
18:语言环境推荐列表正如你所看到的,命令的输出受环境变量的影响,上面产生的是法语输出.
如果你想这个环境变量能在子进程中被继承的话(例如执行shell脚本时),你需要使用下面的命令导出(export)它.
$exportLANG注意在使用常规的控制台终端的时候,环境变量"$LANG"通常会被桌面环境变量通过exported方式重置.
如果要测试export带来的影响,这个可能不是一个很好的例子.
提示提交一个BUG报告的时候,如果使用的是非英语的环境,在"LANG=en_US.
UTF-8"环境下对命令进行运行和检查会更好一些.
可以通过命令locale(5)和locale(7)来查看"$LANG"及相关的环境变量.
注意建议最好用变量"$LANG"来配置系统环境变量,只有在逼不得已的情况下才用$LC_*"开头的变量.
1.
5.
3"$PATH"变量当你在Shell里输入命令的时候,Shell会在"$PATH"变量所包含的目录列表里进行搜索,"$PATH"变量的值也叫作Shell的搜索路径.
在默认的Debian安装过程中,所使用的用户账号的"$PATH"环境变量可能不包括"/sbin"和"/usr/sbin"目录.
例如,ifconfig命令就需要指定完整的路径"/sbin/ifconfig".
(类似地,ip命令是在"/bin"目录下)可以在Bash脚本文件"~/.
bash_profile"或"~/.
bashrc"中改变"$PATH"环境变量的值.
1.
5.
4"$HOME"变量很多命令在用户目录中都存放了用户指定的配置,然后通过配置的内容来改变它的执行方式,用户目录通常用"$HOME"变量来指定.
Debian参考手册26/262"$HOME"变量的值程序运行环境/初始进程执行的程序(守护进程)/rootroot用户权限Shell执行的程序/home/普通用户权限Shell执行的程序/home/普通用户GUI桌面菜单执行的程序/home/用root用户权限来执行程序"sudoprogram"/root用root用户权限执行程序"sudo-Hprogram"Table1.
19:"$HOME"变量值列表提示Shell扩展"~/"为转入当前用户的主目录,也就是"$HOME/".
Shell扩展"~foo/"为foo的目录,也就是"/home/foo/".
1.
5.
5命令行选项一些命令附带参数.
这些参数以"-"或"--"开头,通常称之为选项,用来控制命令的执行方式.
$dateMonOct2723:02:09CET2003$date-RMon,27Oct200323:02:40+0100这里的命令参数"-R"改变date(1)命令输出为RFC2822标准的日期字符格式.
1.
5.
6Shell通配符经常有这种情况你期望命令成串自动执行而不需要挨个输入,将文件名扩展为glob,(有时候被称为通配符),以此来满足这方面的需求.
shellglob模式匹配规则描述*不以".
"开头的文件名(段).
*以".
"开头的文件名(段)精确字符[…]包含在括号中的任意字符都可以作为精确字符[a-z]"a"到"z"之间的任意一个字符都可以作为精确字符[^…]除了包含在括号中的任意字符("1^2"除外),其它字符都可以作为精确字符Table1.
20:Shellglob模式尝试下列例子$mkdirjunk;cdjunk;touch1.
txt2.
txt3.
c4.
h.
5.
txt.
.
6.
txt$echo*.
txt1.
txt2.
txt$echo*1.
txt2.
txt3.
c4.
h$echo*.
[hc]3.
c4.
h$echo.
*.
.
.
.
5.
txt.
.
6.
txt$echo.
*[^.
]*Debian参考手册27/262.
5.
txt.
.
6.
txt$echo[^1-3]*4.
h$cd.
.
;rm-rfjunk参见glob(7).
注意与shell通用的文件名匹配方式不同,使用"-name"选项的find(1),其shell模式"*",匹配以".
"开始的文件名.
(新POSIX的特性)注意BASH可以使用内置的shopt选项如"dotglob","noglob","nocaseglob","nullglob","extglob"定制全局行为,使用bash(1)查看详细说明.
1.
5.
7命令的返回值每个命令都会返回它的退出状态(变量:"$")作为返回值.
命令的退出状态数字返回值逻辑返回值successzero,0TRUEerrornon-zero,-1FALSETable1.
21:命令的退出代码尝试下列例子.
$[1=1];echo$0$[1=2];echo$1注意请注意,success是逻辑TRUE,0(zero)则是它的值.
这有些不直观,需要在这里提一下.
1.
5.
8典型的顺序命令和shell重定向让我们试着记住下面Shell命令里部分命令行所使用的命令习语.
Debian系统是一个多任务的操作系统.
后台任务让用户能够在一个shell中执行多个程序.
后台进程的管理涉及shell的内建命令:jobs、fg、bg和kill.
请阅读bash(1)中的章节:"SIGNALS"、"JOBCONTROL"和"builtins(1)".
尝试下列例子$&1|command2通过管道将command1的标准输出和标准错误作为command2的标准输入(并行执行)command1;command2按顺序执行command1和command2command1&&command2执行command1;如果成功,按顺序执行command2(如果command1和command2都执行成功了,返回success)command1||command2执行command1;如果不成功,按顺序执行command2(如果command1或command2执行成功,返回success)command>foo将command的标准输出重定向到文件foo(覆盖)command2>foo将command的标准错误重定向到文件foo(覆盖)command>>foo将command的标准输出重定向到文件foo(附加)command2>>foo将command的标准错误重定向到文件foo(附加)command>foo2>&1将command的标准输出和标准错误重定向到文件foocommandfoo$exec3bar#b''打b''b''开b''b''文b''b''件b''$cat&4#b''标b''b''准b''b''输b''b''入b''b''重b''b''定b''b''向b''b''到b''b''3b'',b''标b''b''准b''b''输b''b''出b''b''重b''b''定b''b''向b''b''到b''4$exec3&-#b''关b''b''闭b''b''文b''b''件b''$catbarHello预定义的文件描述符0-2.
设备说明文件描述符stdin标准输入0stdout标准输出1stderr标准错误2Table1.
23:预定义的文件描述符1.
5.
9命令别名你可以为经常使用的命令设置一个别名.
尝试下列例子$aliasla='ls-la'Debian参考手册29/262现在,"la"是"ls-al"的简写形式,并同样会以长列表形式列出所有的文件.
你可以使用alias来列出所有的别名(参见bash(1)中的"SHELLBUILTINCOMMANDS").
$alias.
.
.
aliasla='ls-la'你可以使用type来确认命令的准确路径或类型(参见bash(1)中的"SHELLBUILTINCOMMANDS").
尝试下列例子$typelslsishashed(/bin/ls)$typelalaisaliasedtols-la$typeechoechoisashellbuiltin$typefilefileis/usr/bin/filels在最近被使用过,而"file"没有,因此"ls"标记为"hashed"(被录入哈希表),即shell有一个内部的记录用来快速访问"ls"所处的位置.
提示参见第9.
2.
7节.
1.
6类Unix的文本处理在类Unix的工作环境中,文本处理是通过使用管道组成的标准文本处理工具链完成的.
这是另一个重要的Unix创新.
1.
6.
1Unix文本工具这里有一些在类Unix系统中经常使用到的标准文本处理工具.
没有使用正则表达式:–cat(1)连接文件并输出全部的内容.
–tac(1)连接文件并反向输出.
–cut(1)选择行的一部分并输出.
–head(1)输出文件的开头.
–tail(1)输出文件的末尾.
–sort(1)对文本文件的行进行排序.
–uniq(1)从已排序的文件中移除相同的行.
–tr(1)转换或删除字符.
–diff(1)对文件的行进行对比.
使用基础的正则表达式(BRE):–grep(1)匹配满足pattern的文本.
–ed(1)是一个原始行编辑器.
–sed(1)是一个流编辑器.
Debian参考手册30/262–vim(1)是一个屏幕编辑器.
–emacs(1)是一个屏幕编辑器.
(有些扩展的BRE)使用扩展的正则表达式(ERE):–egrep(1)匹配满足多个pattern的文本.
–awk(1)进行简单的文本处理.
–tcl(3tcl)可以进行任何你想得到的文本处理:参见re_syntax(3).
经常与tk(3tk)一起使用.
–perl(1)可以进行任何你想得到的文本处理.
参见perlre(1).
–pcregrep软件包中的pcregrep(1)可以匹配满足Perl兼容正则表达式(PCRE)模式的文本.
–带有re模块的python(1)可以进行任何你想得到的文本处理.
参见"/usr/share/doc/python/html/index.
html".
如果你不确定这些命令究竟做了什么,请使用"mancommand"来自己把它搞清楚吧.
注意排序的顺序和表达式的范围取决于语言环境.
如果你想要获得一个命令的传统行为,可以在命令之前使用"LANG=C"让C语言环境代替UTF-8(参见第1.
5.
2节和第8.
4节).
注意Perl正则表达式(perlre(1))、Perl兼容正则表达式(PCRE)和Python的re模块提供的正则表达式与一般的ERE相比多了许多通用的扩展.
1.
6.
2正则表达式正则表达式被使用在许多文本处理工具中.
它们类似shell的通配符,但更加复杂和强大.
正则表达式描述要匹配的模式,它是由文本字符和元字符构成的.
元字符仅仅是带有特殊含义的字符.
它们有两种主要的形式,BRE和ERE,使用哪种取决于上述的文本工具.
emacs中的正则表达式基本上是BRE但含有ERE中的元字符"+"和"".
因此,在emacs中没必要使用"\"来转义它们.
grep(1)可以使用正则表达式来进行文本搜索.
尝试下列例子$egrep'GNU.
*LICENSE|Yoyodyne'/usr/share/common-licenses/GPLGNUGENERALPUBLICLICENSEGNUGENERALPUBLICLICENSEYoyodyne,Inc.
,herebydisclaimsallcopyrightinterestintheprogram提示参见第9.
2.
7节.
1.
6.
3替换表达式对于替换表达式,一些字符有特殊的含义.
对Perl替换字符串来说,应使用"$&"而非"&",应使用"$n"而非"\n".
尝试下列例子Debian参考手册31/262BREERE正则表达式的描述通用的元字符BRE独有的"\"转义元字符ERE独有的不需要"\"转义的元字符cc匹配非元字符"c"\c\c匹配一个字面意义上的字符"c",即使"c"本身是元字符.
.
匹配任意字符,包括换行符^^字符串的开始位置$$字符串的结束位置\\>单词的结束位置[abc…][abc…]匹配在"abc.
.
.
"中的任意字符[^abc…][^abc…]匹配除了"abc.
.
.
"中的任意字符r*r*匹配零个或多个"r"r\+r+匹配一个或多个"r"r\r匹配零个或一个"r"r1\|r2r1|r2匹配一个"r1"或"r2"\(r1\|r2\)(r1|r2)匹配一个"r1"或"r2",并作为括号内的正则表达式Table1.
24:BRE和ERE中的元字符替换表达式替换表达式替换的文本&正则表达式所匹配的内容(在emacs中使用\&)\n前n个括号的正则表达式匹配的内容("n"是数字)Table1.
25:替换表达式Debian参考手册32/262$echozzz1abc2efg3hij4|\sed-e's/\(1[a-z]*\)[0-9]zzz=1abc2efg3hij4=$echozzz1abc2efg3hij4|\sed-e's/\(1[a-z]*\)[0-9]2===\1/'zzzefg3hij4===1abc$echozzz1abc2efg3hij4|\perl-pe's/(1[a-z]*)[0-9]2===$1/'zzzefg3hij4===1abc$echozzz1abc2efg3hij4|\perl-pe's/(1[a-z]*)[0-9]zzz=1abc2efg3hij4=请特别注意这些括号正则表达式的格式,以及这些被匹配的文本在不同的工具中是如何被替换的.
这些正则表达式在一些编辑器中也可以用来移动光标和替换文本.
在shell命令行行末的反斜杠"\"会跳脱一个换行符(作为空白符),并将光标移动到下一行的行首.
请阅读所有相关手册来学习这些命令.
1.
6.
4正则表达式的全局替换ed(1)命令可以在"file"中将所有的"FROM_REGEX"替换成"TO_TEXT".
$edfile、和.
请谨慎使用shell的IFS技巧.
当shell将脚本的一部分解释为对它的输入时,会发生一些奇怪的事.
$IFS=":,"#use":"and","asIFS$echoIFS=$IFS,IFS="$IFS"#echoisaBashbuiltinIFS=,IFS=:,$date-R#justacommandoutputSat,23Aug200308:30:15+0200$echo$(date-R)#subshell-->inputtomainshellSat23Aug2003083036+0200$unsetIFS#resetIFStothedefault$echo$(date-R)Sat,23Aug200308:30:50+02001.
6.
6用于管道命令的小片段脚本下面的脚本作为管道的一部分,可以做一些细致的事情.
脚本片段(在一行内输入)命令效果find/usr-print找出"/usr"下的所有文件seq1100显示1到100|xargs-n1把从管道过来的每一项作为参数,重复执行命令|xargs-n1echo把从管道过来的,用空格隔开的项,分隔成多行|xargsecho把从管道过来的所有行合并为一行|grep-e从管道过来,包含有的行,提取出来|grep-v-e把从管道过来,不包含有的行,提取出来|cut-d:-f3-把从管道过来,用":"分隔的第三列提取出来(passwd文件等.
)|awk'{print$3}'把用空格隔开的第三列提取出来|awk-F'\t''{print$3}'把用tab键隔开的第三列提取出来|col-bx删除退格键,扩展tab键为空格键|expand-扩展tab键到空格键|sort|uniq排序并删除重复行|tr'A-Z''a-z'将大小字母转换为小写字母|tr-d'\n'将多行连接为一行|tr-d'\r'删除换行回车符|sed's/^/#/'在每行行首增加一个"#"符|sed's/\.
ext//g'删除".
ext"|sed-n-e2p显示第二行|head-n2-显示最前面两行|tail-n2-显示最后两行Table1.
26:管道命令的小片段脚本列表Debian参考手册35/262使用find(1)和xargs(1),单行shell脚本能够在多个文件上循环使用,可以执行相当复杂的任务.
参见第10.
1.
5节和第9.
3.
9节.
当使用shell交互模式变得太麻烦的时候,请考虑写一个shell脚本(参见第12.
1节).
Debian参考手册36/262Chapter2Debian软件包管理注意这一章假定最新的稳定版的代号为:bullseye.
Debian是一个志愿者组织,它建立一致的自由软件的预编译二进制包并从档案库中分发它们.
许多远程镜像站提供了HTTP和FTP的方式来访问Debian档案库.
也可以使用CD-ROM/DVD.
Debian软件包管理系统,当使用适当时,可以让用户从档案库安装统一设置的二进制软件包到系统中.
现在,有62716个可用于amd64架构的软件包.
Debian软件包管理系统有丰富的历史,有许多可供选择的前端用户程序和后端访问方式.
现在,我们推荐下列的这些.
apt(8)用于所有的交互式命令行操作,包含软件包的安装、移除和升级.
自DebianJessie(Debian8)起可用.
apt-get(8)用于从脚本中调用Debian软件包管理系统.
它在apt不可用时也可作为一个备选选项(常见于较旧的Debian系统).
aptitude(8)使用一个交互式的文本界面来管理已安装的软件包和搜索可用的软件包.
2.
1Debian软件包管理的前提2.
1.
1软件包配置下面是Debian系统软件包配置的一些要点.
Debian尊重系统管理员的手动配置.
换句话说,软件包配置系统不会为了方便而去更改那些配置.
每个软件包都带有自己的配置脚本,它使用标准用户接口debconf(7)来帮助软件包初始化安装过程.
Debian开发者通过软件包配置脚本,尽力使你能有一个完美的升级体验.
系统管理员可以使用软件包工具的全部功能.
但在默认的安装中会禁用那些具有安全风险的.
如果你手动激活了一些具有安全隐患的服务,你有责任遏制风险.
高深的配置可以由系统管理员手动启用.
这可能会对用于系统配置的通用流行帮助程序造成干扰.
Debian参考手册37/262软件包流行度大小说明aptV:868,I:9994299高级软件包工具(APT),dpkg的前端,提供了"http"、"ftp"和"file"的档案库访问方式(包含apt、apt-get和apt-cache命令)aptitudeV:80,I:4314249aptitude(8),基于终端的交互式软件包管理工具taskselV:36,I:975393Debian系统上对安装进行选择的工具(APT的前端)unattended-upgradesV:324,I:447325用于APT的增强软件包,会自动安装安全更新dselectV:3,I:322591基于终端的软件包管理工具(之前的标准,APT的前端和其它老的访问方式)dpkgV:925,I:9996856用于Debian的软件包管理系统synapticV:47,I:3207873图形化的软件包管理工具(GNOME的APT前端)apt-utilsV:339,I:9961162APT实用程序:apt-extracttemplates(1)、apt-ftparchive(1)和apt-sortpkgs(1)apt-listchangesV:369,I:851421软件包历史更改提醒工具apt-listbugsV:7,I:12465在每次APT安装前列出严重的bugapt-fileV:18,I:7890APT软件包搜索工具——命令行界面apt-rdependsV:0,I:640递归列出软件包依赖Table2.
1:Debian软件包管理工具列表2.
1.
2基本的注意事项警告不要从任何的混合套件中安装软件包.
它可能会打破软件包的一致性,这需要你要深厚的系统管理知识,例如ABI编译器、库版本和解释器特性等等.
Debian系统管理员中的新手应该保持在只进行安全更新的stable版本.
我的意思是,最好避免下列的一些行为作为一项预防措施,直到你十分了解Debian系统.
下面有一些提醒.
在"/etc/apt/sources.
list"中不要包含testing或unstable.
在"/etc/apt/sources.
list"里不要在标准的Debian中混合使用其它非Debian的档案库,例如Ubuntu.
不要建立"/etc/apt/preferences".
不了解会造成的全部影响,就不要通过配置文件改变软件包管理工具的默认行为.
不要使用"dpkg-i"安装任何软件包.
绝不使用"dpkg--force-all-i"安装任何软件包.
不要删除或修改"/var/lib/dpkg/"中的文件.
不要让从源码直接安装的程序覆盖系统文件.
–如果需要的话,将它们安装到"/usr/local"或"/opt"中.
上述对Debian软件包管理系统做的行为所导致的不兼容影响可能会使你的系统无法使用.
负责有关键任务的服务器的严谨的Debian系统系统管理员,应该使用额外的预防措施.
没有在安全的条件下使用你特定的配置进行彻底地测试,就不要从Debian安装任何软件包(包含安全更新).
–你作为系统管理员要对你的系统负责到底.
–Debian系统长久的稳定史并无法保证什么.
Debian参考手册38/2622.
1.
3持续升级的生活尽管我在上面进行了警告,我知道许多阅读这份文档的人还是想要使用Debian的testing或unstable套件来作为他们自行管理的桌面环境的主系统.
这是因为这些套件运行得很好,更新频繁,并提供了最新的特性.
小心对于你的生产服务器,建议使用带有安全更新的stable套件.
对于你只进行有限管理的桌面PC也是同样如此.
你只需要在"/etc/apt/sources.
list"中简单地将发行版字符串设置为套件名:"testing"或"unstable";或者代号:"bookworm"或"sid".
这会使你享受持续升级的生活.
使用testing或unstable是很有乐趣的,但会带来一些风险.
尽管Debian系统的unstable套件在大多数时候看起来都非常稳定,但在Debian系统的testing和unstable套件中存在一些软件包问题,并且它们中的一部分是不容易解决的.
这对你来说可能会很痛苦.
有时候,你可能会有一个损坏的软件包或缺少某些功能几个星期.
这里有一些方法,可以使你简单快速地从Debian软件包的bug中恢复.
通过将Debian系统的stable套件安装到另一个分区,可以使系统能够进行双启动制作安装CD便于用于救援启动考虑安装apt-listbugs,这可以在升级之前检查DebianBug跟踪系统(BTS)的信息对软件包系统的基础设施有足够的了解来解决问题建立一个chroot或类似的环境来提前运行最新的系统(参见第9.
10节)(如果你无法做到这些预防措施中的任何一个,那你可能还没做好使用testing和unstable套件的准备.
)菩萨使用下面的内容拯救一个人,使他从挣扎于持续升级地狱的因果报应中脱困,并让他达到Debian的极乐世界.
2.
1.
4Debian档案库基础让我们从系统用户的角度来看看Debian档案库.
提示Debian档案库官方政策的定义参见Debian政策文档,第2章——Debian档案库.
对于典型的HTTP访问,档案库在"/etc/apt/sources.
list"文件中像下面那样指定,例如,现在stable=bullseye系统.
debhttp://deb.
debian.
org/debian/bullseyemaincontribnon-freedeb-srchttp://deb.
debian.
org/debian/bullseyemaincontribnon-freedebhttp://security.
debian.
org/bullseye/updatesmaincontribdeb-srchttp://security.
debian.
org/bullseye/updatesmaincontrib这里,我倾向于使用代号"bullseye"来代替套件名"stable",以避免下一个stable版本发布时出现意外.
"/etc/apt/sources.
list"的含义在sources.
list(5)中进行了描述,下面是一些要点.
"deb"的那行定义了二进制软件包.
"deb-src"的那行定义了源代码软件包.
Debian参考手册39/262第一个参数是Debian档案库的根URL.
第二个参数是发行版名称:可以使用套件名或代号.
第三个和之后的参数是Debian档案库的有效档案库范围名称.
如果只是用aptitude(它不访问源代码相关的元数据),"deb-src"那行可以安全地删掉(或者在文件开头添加"#"来将它注释掉).
这可以加速档案库元数据的更新.
URL可以是"http://"、"ftp://"、"file://"……提示如果在上述的例子中,使用了"sid"代替"bullseye",那么"/etc/apt/sources.
list"中的"deb:http://security.
debian.
org/…"这行就不需要了.
因为没有用于"sid"(unstable)的安全更新的档案库.
下面是配置文件所使用的Debian档案库站点的URL和套件名或代号的列表.
档案库URL套件名(代号)目的http://deb.
debian.
org/debian/stable(bullseye)stable(bullseye)release版本http://deb.
debian.
org/debian/testing(bookworm)testing(bookworm)release版本http://deb.
debian.
org/debian/unstable(sid)unstable(sid)release版本http://deb.
debian.
org/debian/experimentalexperimentalpre-release版本(可选,只适用于开发者)http://deb.
debian.
org/debian/stable-proposed-updates用于下一个稳定版本的更新(可选)http://security.
debian.
org/stable/updates用于stablerelease版本的安全更新(重要)http://security.
debian.
org/testing/updates用于testingrelease版本的安全更新(重要)http://deb.
debian.
org/debian/bullseye-updates用于bullseye的垃圾邮件过滤器、IM客户端等的兼容更新http://deb.
debian.
org/debian/bullseye-backports用于bullseye的较新的backported软件包(可选)Table2.
2:Debian档案库站点列表小心只有带有安全更新的纯净的stablerelease版本可以提供最佳的稳定性.
运行大多数stablerelease版本的软件包之中混合一些来自testing或unstablerelease版本的软件包会比运行纯净的unstablerelease版本冒更大的风险,这是因为库版本的不匹配导致的.
如果在stablerelease版本下你真的需要一些程序的最新版本,请使用来自bullseye-updates和http://backports.
debian.
org(参见第2.
7.
4节)的软件包.
使用这些软件包时必须额外小心.
小心在"deb"行中,你只需列出stable,testing或者unstable套件中的一个即可,如果你在"deb"行中混合了stable,testing和unstable套件,APT程序的执行速度将会变慢并且只有最新的档案库是有用的.
只有在"/etc/apt/preferences"文件带有明确目标的时候,混合的列表才是有意义的.
(查看第2.
7.
3节).
提示对于使用stable和testing套件的Debian系统而言,在"/etc/apt/sources.
list"中包含带有"http://security.
debian.
org/"的一行是不错的主意.
它会启用安全更新.
Debian参考手册40/262注意Debian安全团体将会修正stable档案库的安全缺陷.
这些行为是十分严格可靠的.
testing档案库中的缺陷,不一定会被Debian测试安全团体修正.
由于一些原因,这些行为相对stable档案库没有那么严格,您可能需要等待已修正的unstable软件包移植到testing.
unstable档案库的缺陷,交由各个维护者修改.
经常维护的unstable软件包通常处于相当好的状况,因为它利用了上流最新的安全修正.
有关Debian怎样处理安全缺陷,请参见Debian安全常问问题.
区域软件包数量软件包组件标准main61595遵从Debian自由软件指导方针(DFSG),并且不依赖于non-freecontrib349遵从Debian自由软件指导方针(DFSG),但依赖于non-freenon-free772不遵从Debian自由软件指导方针(DFSG)Table2.
3:Debian归档区域(area)列表上述软件包的数量是amd64架构的.
main区域提供Debian系统(参见第2.
1.
5节).
通过把你的浏览器指向档案库URL,这些URL在dists或pool之后是各不相同的,Debian档案库能够被有规划的组织.
发行版可以用套件或代号来指定.
发行版在许多文档中也被当做是套件的同义词.
套件和代号的关系总结如下.
时间suite=stablesuite=testingsuite=unstable在bullseye发布后codename=bullseyecodename=bookwormcodename=sid在bookworm发布后codename=bookwormcodename=trixiecodename=sidTable2.
4:套件和代号的关系代号的历史参见DebianFAQ:6.
2.
1以前用过哪些代号名在较严格的Debian档案术语,"部分section"这一词特指按应用领域来分类的软件包类别.
(但是,主要部分("mainsection")这一词有时会用来描述Debian档案区中,名为"main主要"的区域.
)Debian开发者(DD)每次上传软件包到unstable档案库(通过incoming处理),都必须确保上传的软件包与最新的unstable档案库中的最新软件包兼容.
如果DD故意打破重要的库升级等的这种兼容性,这通常会在Debian开发者邮件列表等进行公告.
在Debian档案库维护脚本将软件包从unstable档案库移动到testing档案库前,档案库维护脚本不仅检查时间(约10天)和软件包的RCbug报告的状态,还尝试确保它们可以和最新的testing档案库中的软件兼容.
这个过程使得testing档案库非常正确可用.
通过由发布团队领导的逐步冻结档案库的过程,并进行一些手动干预,使testing档案库完全一致,无缺陷.
然后,将旧的testing档案库的代码名称分配给新的stable档案库,并为新的testing档案库创建新的代码名称.
新的testing档案库最初的内容和新发布的stable档案库的内容完全相同.
unstable和testing档案库都可能会遭受由以下几个因素导致的临时的小故障.
损坏的软件包被上传到档案库(多见于unstable)延迟接受新的软件包到档案库(多见于unstable)档案库时间同步问题(testing和unstable)手动干预档案库,例如移除软件包(多见于testing)等.
因此,如果你决定使用这些档案库,你应该能够修复或忍受这些类型的小故障.
Debian参考手册41/262小心在新的stable版本发布后的几个月,大多数桌面用户应该使用带有安全更新的stable档案库,即使他们通常使用unstable或testing档案库.
在这个过渡期中,unstable和testing档案库不适合大多数人.
你使用unstable档案库的系统是很难保持良好的工作状态的,因为它会遭受核心软件包的大量升级狂潮.
testing档案库不大有用,因为它包含有和没有安全支持的stable档案库相同的内容(Debiantesting安全公告2008-12).
一个月左右的时间后,如果你仔细点的话,unstable档案库或许可以使用.
提示跟踪testing档案库时,由一个已移除的软件包引起的问题通常可以安装unstable档案库中相同的软件包(已修复bug)来解决.
档案库的定义参见Debian政策文档.
部分"优先级""基本系统""极重要的软件包"2.
1.
5Debian是100%的自由软件Debian是100%的自由软件,因为:Debian默认只安装自由软件,这尊重了用户的自由.
Debian在main中只提供自由软件.
Debian建议只运行来自main的自由软件.
在main中的软件包没有依赖于在non-free或contrib中的软件包.
有人想知道下列的两个事实是否互相矛盾.
"Debian将始终是100%的自由软件".
(Debian社群契约中的第一条)Debian服务器上有一些non-free和contrib软件包.
因为下列原因,这并不矛盾.
Debian系统具有100%的自由,并且它的软件包位于Debian服务器的main区域.
Debian系统之外的软件包位于Debian服务器的non-free和contrib区域.
在Debian社群契约的第4条和第5条对这进行了明确的解释:我们将优先考虑我们的用户及自由软件–我们由我们的用户及自由软件社群的需要所导向.
我们将优先考虑他们的利益.
我们将在多种计算环境中支持我们的用户的操作需要.
我们不反对在Debian系统上使用非自由软件,我们也不会尝试向创建和使用这部分软件的用户索取费用.
我们允许他人,在没有我们的资金的参与下,制造包括Debian以及商业软件的增值套件.
为了达成这些目标,我们将提供集成的、高质量的、100%自由的软件,而不附加任何可能阻止在这些方面使用的法律限制.
Debian参考手册42/262哪些作品不符合我们的自由软件规范–我们明了,某些我们的用户需要使用不符合Debian自由软件指导方针的作品.
我们为这些作品,在我们的档案库中留出了"contrib"以及"non-free"目录.
在这些目录下的软件包,并不属于Debian系统尽管它们已被配置成可以在Debian下使用.
我们鼓励光盘制造商阅读这些目录下的软件的许可证,以判断他们是否可以在光盘中发行这些软件.
所以,尽管非自由软件并非Debian系统的一部分,我们仍支持它们的使用,并且我们为非自由软件提供了公共资源(诸如我们的缺陷跟踪系统以及邮件列表).
用户应该了解使用non-free和contrib中的软件包所需要冒的风险:使用类似的软件包会失去自由失去Debian对软件包的支持(这些软件包无法访问源代码,Debian不能进行完全的支持.
)污染你100%自由的Debian系统Debian自由软件指导方针为Debian设立了自由软件标准.
Debian对软件包中的软件做了最广泛的解释,包含文档、固件、图标和图形数据.
这使得Debian的自由软件标准非常严格.
为了满足main严格的自由软件标准,Debian曾经提供了去掉Mozilla商标的软件包(例如Firefox、Thunderbird和Seamonkey),它们移除了logo和一些图形数据;并将它们分别用Iceweasel、Icedove和Iceape替代.
在这些问题被解决后,这些软件包随着DebianStretch(Debian9)的发布恢复了其原本的名称.
典型的non-free和contrib软件包包含了下列类型的自由分发的软件包:在GNUFreeDocumentationLicense下的文档包,包含不变的部分,比如GCC和Make的.
(大多数都可以在non-free/doc找到.
)包含没有源代码的二进制数据的固件软件包,例如在第9.
9.
6节中列出的non-free软件包.
(多见于non-free/kernel部分.
)游戏和字体软件包,对商业使用和/或内容修改进行了限制.
请注意,non-free和contrib软件包的数量少于main软件包的2%.
允许访问non-free和contrib并不会模糊软件包的来源.
使用aptitude(8)的全屏交互式界面可以提供完全的可见性和完全的控制,可以让你决定安装来自某个部分的软件包,来使你的系统保持自由.
2.
1.
6软件包依赖关系Debian系统通过其控制文件字段中的版本化二进制依赖声明机制来提供一致的二进制软件包集合.
下面有一些它们的简单定义.
"依赖"–绝对的依赖,所有在这里列出的软件包都必须同时或提前安装.
"预依赖"–类似于Depends,但列出的软件包必须提前完成安装.
"推荐"–这里表示一个强,但不是绝对的依赖关系.
大多数用户不会想要这个包,除非在这里列出的所有包都已经安装.
"建议"–较弱的依赖.
这个软件包的大多数用户可能会从安装所列的软件包中受益,但没有它们也可以有适当的功能.
"增强"Debian参考手册43/262–这里表明一个像推荐的弱依赖关系,不装也没关系.
"破损"–表明一个软件包不兼容一些版本规范.
一般的解决方法就是升级列出的所有软件包.
"冲突"–这表明了绝对的不兼容.
为了安装这个软件包必须移除所有列出的软件包.
"替代"–这表明这个文件安装的文件会替代所列的软件包的文件.
"提供"–表明这个软件包会提供所列的软件包所有的文件和功能.
注意请注意,同时将"Provides"、"Conflicts"和"Replaces"定义到一个虚拟的软件包是一个明智的配置.
这确保了在任何一个时间只能安装一个提供该虚拟包的真正软件包.
包含源代码依赖关系的官方定义位于thePolicyManual:Chapter7-Declaringrelationshipsbetweenpackages.
2.
1.
7包管理的事件流这是APT提供的软件包管理的简单事件流摘要.
更新("aptupdate"、"aptitudeupdate"或"apt-getupdate"):1.
从远程档案库获取档案库元数据2.
重建和更新APT使用的本地元数据升级("aptupgrade"和"aptfull-upgrade",或"aptitudesafe-upgrade"和"aptitudefull-upgrade",或"apt-getupgrade"和"apt-getdist-upgrade"):1.
选择候选版本,它所安装的软件包通常都是最新的可用版本(例外参见第2.
7.
3节)2.
解决软件包依赖关系3.
如果候选版本与已安装的版本不同,会从远程档案库获取所选择的二进制软件包4.
解包所获取的二进制软件包5.
运行preinst脚本6.
安装二进制文件7.
运行postinst脚本安装("aptinstall.
.
.
"、"aptitudeinstall.
.
.
"或者"apt-getinstall…"):1.
选择命令行中列出的包2.
解决软件包依赖关系3.
从远程服务器获取已选二进制包4.
解包所获取的二进制软件包5.
运行preinst脚本6.
安装二进制文件Debian参考手册44/2627.
运行postinst脚本移除("aptremove…","aptituderemove…"或"apt-getremove…"):1.
选择命令行中列出的包2.
解决软件包依赖关系3.
运行prerm脚本4.
移除已安装的文件,除了配置文件5.
运行postrm脚本清除("aptpurge","aptitudepurge…"或"apt-getpurge…"):1.
选择命令行中列出的包2.
解决软件包依赖关系3.
运行prerm脚本4.
移除已安装的文件,包含配置文件5.
运行postrm脚本这里,为了大局,我特意省略了技术细节.
2.
1.
8对包管理问题的第一个回应你应该阅读优良的官方文档.
第一个阅读的文档是Debian特定的"/usr/share/doc//README.
Debian"同时也应该查询"/usr/share/doc//"中的其它文档.
如果你设置shell为第1.
4.
2节,输入下列命令.
$cd$pagerREADME.
Debian$mc你可能需要安装以"-doc"后缀命名的对应文档软件包来获取详细的信息.
如果你在使用一个特定的软件包时出现了问题,一定要首先检查Debianbug跟踪系统(BTS)网站.
网站命令Debianbug跟踪系统(BTS)的主页sensible-browser"http://bugs.
debian.
org/"软件包名称已知的bug报告sensible-browser"http://bugs.
debian.
org/"bug编号已知的bug报告sensible-browser"http://bugs.
debian.
org/"Table2.
5:解决特定软件包问题的主要网站使用Google搜索,在关键字中包含"site:debian.
org","site:wiki.
debian.
org","site:lists.
debian.
org"等等.
当你要发送一份bug报告时,请使用reportbug(1)命令.
2.
2基础软件包管理操作在Debian系统中有许多基于APT的软件包管理工具可以在Debian系统上进行基于仓库的软件包管理操作.
在这里,我们将介绍3种基本的软件包管理工具:apt,apt-get/apt-cache和aptitude.
对于涉及软件包安装或更新软件包元数据的软件包管理操作,你必须有root权限.
Debian参考手册45/2622.
2.
1aptvs.
apt-get/apt-cachevs.
aptitude尽管aptitude是作者主要使用的一个非常好的可互动工具,但你应该知道下列警示:不建议在新版本发布后在stableDebian系统上使用aptitude命令来进行跨版本的系统升级.
–建议使用"aptfull-upgrade"或"apt-getdist-upgrade"来进行这个操作.
参见Bug#411280.
aptitude命令有时候会为了testing或unstableDebian系统升级清除大量软件包.
–这个情况吓坏了许多的系统管理员.
请不要惊慌.
–这似乎大多数是由元软件包的依赖或推荐的软件包版本偏差造成的,例如gnome-core.
–要解决这个问题,可以在aptitude命令菜单中选择"取消待执行的动作",退出aptitude,并使用"aptfull-upgrade".
apt-get和apt-cache是最基础的基于APT的软件包管理工具.
apt-get和apt-cache只提供命令行用户界面.
apt-get是进行跨版本的主系统升级等操作的最合适工具.
apt-get提供了一个强大的软件包依赖解析器.
apt-get对硬件资源的要求不高.
它消耗更少的内存并且运行速度更快.
apt-cache提供了一个标准的正则表达式来搜索软件包名称和描述.
apt-get和apt-cache可以使用/etc/apt/preferences来管理软件包的多个版本,但这非常繁琐.
apt命令是一个用于软件包管理的高级命令行界面.
它基本上是apt-get、apt-cache和类似命令的一个封装,被设计为针对终端用户交互的界面,它默认启用了某些适合交互式使用的选项.
apt工具在用户使用aptinstall安装软件包时提供了一个友好的进度条.
在成功安装下载的软件包后,apt将默认删除缓存的.
deb软件包.
提示建议用户使用新的apt(8)命令用于交互式的使用场景,而在shell脚本中使用apt-get(8)和apt-cache(8)命令.
aptitude命令是最通用的基于APT的软件包管理工具.
aptitude提供了一个全屏的交互式文本用户界面.
aptitude同样也提供了一个命令用户界面.
aptitude是用于日常软件包管理(例如检查已安装的软件包和搜索可用的软件包)的最合适工具.
aptitude对硬件资源的要求更高.
它消耗更多的内存并且运行速度更慢.
aptitude提供一个增强的正则表达式来搜索所有的软件包元数据.
aptitude可以管理软件包的多个版本,并且不使用/etc/apt/preferences,这会十分直观.
Debian参考手册46/262apt语法aptitude语法apt-get/apt-cache语法说明aptupdateaptitudeupdateapt-getupdate更新软件包档案库元数据aptinstallfooaptitudeinstallfooapt-getinstallfoo安装"foo"软件包的候选版本以及它的依赖aptupgradeaptitudesafe-upgradeapt-getupgrade安装已安装的软件包的候选版本并且不移除任何其它的软件包aptfull-upgradeaptitudefull-upgradeapt-getdist-upgrade安装已安装的软件包的候选版本,并且需要的话会移除其它的软件包aptremovefooaptituderemovefooapt-getremovefoo移除"foo"软件包,但留下配置文件aptautoremoveN/Aapt-getautoremove移除不再需要的自动安装的软件包aptpurgefooaptitudepurgefooapt-getpurgefoo清除"foo"软件包的配置文件aptcleanaptitudecleanapt-getclean完全清除本地仓库的软件包检索文件aptautocleanaptitudeautocleanapt-getautoclean清除本地仓库中过时软件包的软件包检索文件aptshowfooaptitudeshowfooapt-cacheshowfoo显示"foo"软件包的详细信息aptsearchaptitudesearchapt-cachesearch搜索匹配的软件包N/AaptitudewhyN/A解释匹配的软件包必须被安装的原因N/Aaptitudewhy-notN/A解释匹配的软件包不必安装的原因N/Aaptitudesearch'~i!
~M'apt-markshowmanual列出手动安装的软件包Table2.
6:使用apt(8),aptitude(8)和apt-get(8)/apt-cache(8)的命令行基本软件包管理操作Debian参考手册47/2622.
2.
2命令行中的基础软件包管理操作下面是使用apt(8),aptitude(8)和apt-get(8)/apt-cache(8)的命令行基本软件包管理操作.
注意虽然aptitude命令提供了丰富的功能,例如增强的软件包解析器,但它的复杂程度导致了(或可能导致)一些退步,例如Bug#411123、Bug#514930及Bug#570377.
如有疑问,请使用apt,apt-get和apt-cache命令来替代aptitude命令.
注意因为在lenny版本之后的Debian系统中,apt、apt-get和aptitude会共享自动安装的软件包的状态(参见第2.
5.
5节),因此你可以混合使用这些工具而不会出现严重的麻烦(参见Bug#594490).
"aptitudewhy"可以通过"aptitude-vwhy"列出更多的信息.
类似的信息可以通过"aptrdepends"或"apt-cacherdepends"获取.
当aptitude命令在命令行模式下启动后遇到了一些问题(例如软件包冲突),你可以在之后的提示中按下"e"键切换到全屏的交互模式.
你可以在"aptitude"后面使用的命令选项.
命令选项说明-s模拟命令的结果-d仅下载,不进行安装/更新-D在自动安装和删除前,显示简要的说明Table2.
7:aptitude(8)中重要的命令选项更多内容参见aptitude(8)和位于"/usr/share/doc/aptitude/README"的"aptitude用户手册".
提示dselect软件包依旧可用,并且曾是之前发布的版本中首选的全屏交互式软件包管理工具.
2.
2.
3aptitude的交互式使用要使用交互式的软件包管理,你可以像下面那样以交互模式启动aptitude.
$sudoaptitude-uPassword:这将更新档案库信息的本地副本,并以菜单的形式全屏显示软件包列表.
aptitude将它的配置放在"~/.
aptitude/config".
提示如果你想用root的配置而非使用者的,可以在上面的例子中使用"sudo-Haptitude…"代替"sudoaptitude…".
提示当aptitude以交互模式启动时,会自动设置待执行的动作.
如果您不喜欢,您可以通过菜单:"动作"→"取消待执行的动作"来取消它.
Debian参考手册48/2622.
2.
4aptitude的按键绑定在全屏模式下浏览软件包状态和设置动作的按键如下.
快捷键键绑定功能F10或Ctrl-t菜单显示按键帮助(更加完整的清单)F10→帮助→用户手册显示用户手册u更新软件包档案库信息+标记该软件包以便升级或安装-标记该软件包以便移除(保留配置文件)_标记该软件包以便清除(移除配置文件)=将软件包设为保持状态U标记所有可升级包(动作如同full-upgrade)g开始下载并安装所选择包q退出该界面并保存变更x退出该界面并清除变更Enter查看软件包的信息C查看软件包的变更记录l变更软件包的显示限制/搜寻匹配的第一个软件包\重复上一个搜索Table2.
8:aptitude的按键绑定可以通过命令行指定文件名称,也可以通过按"l"或"/"之后在菜单提示下输入下列所述的aptitude正则表达式.
aptitude正则表达式可以使用"~n"开头后接软件包名称的字符串来精确匹配软件包名称.
提示你需要在可视化界面中按下"U"键让所有的已安装软件包升级到可用版本.
否则只有选中的软件包和一些与之有依赖关系的软件包才能被升级到可用版本.
2.
2.
5aptitude软件包视图aptitude(8)全屏交互模式下,软件包列表里的软件包会像下面的例子那样显示.
idAlibsmbclient-2220kB3.
0.
25a-13.
0.
25a-2该行的从左到右的含义如下.
"状态"标签(第一个字母)"动作"标签(第二个字母)"自动"标签(第三个字母)软件包名称该"动作"对磁盘空间的变化软件包当前版本软件包可用版本Debian参考手册49/262提示您可以在帮助菜单中找到完整的标签列表,按""即可在帮助菜单底部显示.
可用版本的选择是依据当前的本地首选项(参见apt_preferences(5)和第2.
7.
3节).
软件包视图的几种类型都可以在"视图"菜单下找到.
视图状态视图描述软件包视图良好参见表2.
10(默认)检查推荐结果良好列出推荐安装但还没有安装的软件包平面软件包列表良好不分类地列出软件包(用于正则表达式)Debtags浏览器非常有用列出由debtags进行分类的软件包分类浏览器已弃用列出按照类别分类的软件包(用Debtags浏览器替代)Table2.
9:aptitude视图注意请帮助我们改进用debtags标记的软件包!
标准"软件包视图"分类软件包的方法与带有一些额外功能的dselect有点像.
分类视图描述可升级软件包按照section→area→软件包的顺序显示列出软件包新软件包同上已安装软件包同上未安装软件包同上过期的和在本地创建的软件包同上虚拟软件包列出同样功能的软件包软件集列出一个特定任务所需的不同功能的软件包Table2.
10:标准软件包视图的分类提示软件集视图可以用来为你的任务选出最佳的软件包.
2.
2.
6aptitude搜索方式选项aptitude提供了几个可以使用正则表达式来搜索软件包的选项.
shell命令行:–"aptitudesearch''"列出安装状态、软件包名称和匹配软件包的剪短描述–"aptitudeshow''"列出软件包的详细描述全屏交互模式:–"l"可以限制匹配软件包的视图–"/"搜索匹配的软件包Debian参考手册50/262–"\"向后搜索匹配的软件包–"n"查找下一个–"N"查找上一个提示字符串被看作软件包名称的精确字符串匹配,除非它是以"~"开头的正则表达式.
2.
2.
7aptitude正则表达式aptitude正则表达式是类mutt的拓展ERE(参见第1.
6.
2节),aptitude具体的特殊匹配规则扩展如下.
正则表达式使用的是ERE,就跟egrep(1)、awk(1)和perl(1)这些典型的类Unix文本工具中所使用的"^"、".
*"、"$"等是相同的.
依赖关系是一种特定的软件包相互关系(depends、predepends、recommends、suggests、conflicts、replaces、provides).
默认的依赖关系是"depends".
提示当为空字符串时,请立即在命令后面添加"~T".
下面是一些快捷方式.
"~P"=="~Dprovides:""~C"=="~Dconflicts:""…~Wterm"term)"用户熟悉mutt的快速选择,因为mutt的灵感来源于表达式语法.
参见"用户手册""/usr/share/doc/aptitude/README"中的"SEARCHING,LIMITING,ANDEXPRESSIONS".
注意lenny版本的aptitude(8)中,新的长格式语法,例如"broken",在正则表达式中可以用来等效为它旧的短格式"~b".
现在空格字符""被认为是除了波浪字符"~"外的另一个正则表达式终止字符.
新的长格式语法参见"用户手册".
2.
2.
8aptitude的依赖解决如果通过菜单"F10→选项→首选项→正在处理依赖关系"进行相应的设置,则在aptitude中选择一个软件包时,不仅会将其"Depends:"列表中的软件包选上,"Recommends:"列表中的软件包也会被选上.
在aptitude下,这些自动安装的软件包在不再需要时会自动移除.
aptitude命令中控制"自动安装"行为的标签也可以通过apt软件包中的apt-mark(8)命令来设置.
2.
2.
9软件包活动日志你可以在日志文件里查询到软件包活动历史.
事实上,很难从这些日志上快速获得有用的信息.
较简便的方法参见第9.
2.
10节.
Debian参考手册51/262扩展匹配规则描述正则表达式匹配软件包名称~n匹配描述~d匹配软件集名称~t匹配debtag~G匹配维护者~m匹配软件包的section~s匹配软件包版本~V匹配档案库~A{bullseye,bookworm,sid}匹配来源~O{debian,…}匹配优先级~p{extra,important,optional,required,standard}匹配必要的软件包~E匹配虚拟软件包~v匹配新的软件包~N匹配待执行的动作~a{install,upgrade,downgrade,remove,purge,hold,keep}匹配已安装软件包~i匹配带有A标签的已安装软件包(自动安装的软件包)~M匹配不带有A标签的已安装软件包(管理员选择的软件包)~i!
~M匹配已安装并且是可升级的软件包~U匹配已删除但未清除的软件包~c匹配已移除,已清除或可移除的软件包~g匹配破坏依赖关系的软件包~b匹配破坏依赖关系的软件包~B匹配软件包的依赖关系~D[:]匹配软件包破坏的依赖关系~DB[:]匹配依赖于软件包的依赖的软件包~R[:]匹配依赖于软件包破坏的依赖的软件包~RB[:]匹配其它已安装软件包所依赖的软件包~R~i匹配没有被其它已安装软件包所依赖的软件包!
~R~i匹配其它已安装软件包所依赖或建议安装的软件包~R~i|~R推荐:~i匹配过滤版本之后的软件包~S过滤匹配所有软件包(真)~T不匹配软件包(假)~FTable2.
11:aptitude正则表达式文件内容/var/log/dpkg.
logdpkg级的软件包活动日志/var/log/apt/term.
log通用APT活动日志/var/log/aptitudeaptitude命令活动日志Table2.
12:软件包活动日志文件Debian参考手册52/2622.
3aptitude操作范例下面是一些aptitude(8)的操作范例.
2.
3.
1通过正则表达式匹配软件包名称来列出软件包下面的命令列出了通过正则表达式匹配软件包名称来列出软件包.
$aptitudesearch'~n(pam|nss).
*ldap'plibnss-ldap-b''使b''b''用b''LDAPb''作b''b''为b''b''名b''b''称b''b''服b''b''务b''b''的b''NSSb''模b''b''块b''plibpam-ldap-b''允b''b''许b''LDAPb''接b''b''口b''b''的b''b''插b''b''入b''b''式b''b''验b''b''证b''b''模b''b''块b''这种方式查找精确的软件包名称很方便.
2.
3.
2使用正则表达式匹配浏览在"新扁平软件包列表"中使用"l"提示查看,正则表达式"~dipv6"可以限制性地匹配软件描述,并交互式地展示信息.
2.
3.
3完整地清理已删除软件包您能清除所有已移除软件包的剩余配置文件.
检查以下命令的结果.
#aptitudesearch'~c'如果您确认所列出的软件包应当被完整删除,请运行以下命令.
#aptitudepurge'~c'您可能想要在交互模式中做类似的操作进行细粒度的控制.
在"新软件包视图"使用"l"提示并输入正则匹配式"~c",这将仅匹配软件包,比如,"移除但不清空配置".
所有符合匹配的软件包可以在顶层标题上使用"["显示.
当您在顶层标题如"未安装的包"中输入"_",当前标题下的软件包只有匹配正则式才会被清除.
您还可以使用"="来交互式地排除软件包以避免删除它们.
这种技术方便易用且适用于许多其他的命令键.
2.
3.
4调整自动/手动安装状态下面是调整软件包的自动/手动安装状态的方法(在使用非aptitude软件包管理器之后).
1.
用root以交互模式运行aptitude.
2.
用"u"命令更新可用的软件包列表,"U"命令标记所有可升级的软件包以执行升级,"f"命令清除新软件包列表,"g"命令执行所有可升级的软件包以执行升级.
3.
按下"l",并输入"~i(~R~i|~Rrecommends:~i)"来限制软件包的显示,按下"M"将"已安装软件包"的状态改为自动安装.
4.
按下"l",并输入"~prequired|~pimportant|~pstandard|~E"来限制软件包的显示,按下"m"将"已安装软件包"的状态改为手动安装.
Debian参考手册53/2625.
按下"l",并输入"~i!
~M"来限制软件包的显示,在"已安装软件包"上按下"["来陈列无用的软件包,按下"-"将它们移除.
6.
按下"l",并输入"~i"来限制软件包的显示,之后在"软件集"上按下"m"将那些软件包标记为手动安装.
7.
退出aptitude.
8.
用root用户执行"apt-get-sautoremove|less"命令,来查看有那些软件包是不再需要的.
9.
在交互模式下重启aptitude程序,用"m"命令标记所需要的软件包.
10.
用root用户重新执行"apt-get-sautoremove|less"这个命令来复查移除的包中是不是只含有自己所希望移除的软件包.
11.
用root用户执行"apt-getautoremove|less"命令来自动移除不再需要的软件包.
在你所需要执行的"Tasks"上,运行"m"命令是一个可选的操作,目的就是为了防止大量软件包被卸载的情况出现.
2.
3.
5全面的系统升级注意当你迁移到新的发行版的时候,虽然正如下面所描述的那样,Debian是可升级的,但是你还是应该考虑纯净的安装新的系统.
这给了你机会去移除废弃的软件包同时还可以接触到最新软件包的完美集合体.
当然,在做迁移之前,你也应该对你的系统做完整的备份,并把它移到安全的地方去(查看第10.
2节).
"我"也建议用不同的分区做另外一个启动项,来实现平稳的升级.
你可以通过改变"/etc/apt/sources.
list"的内容使之指向新的发行版所在地址的方法来进行系统的全面升级,然后运行"aptupdate;aptdist-upgrade"命令.
从stable升级到testing或者unstable,你应该用"bookworm"或者"sid"替换"/etc/apt/sources.
list"文件里的"bullseye",参考第2.
1.
4节.
事实上,由于一些软件包版本变迁的问题,你可能会遇到一些困难,主要是由于软件包的依赖问题.
升级之后的差异越大,你越有可能遇到麻烦.
在新版本发行后,系统从旧的stable过渡到新的stable,你可以查看ReleaseNotes然后按照里面的步骤去做,来尽可能的减少麻烦.
在它正式发布之前,你决定要从先前的stable迁移到将要发布的testing,这里没有ReleaseNotes可以帮到你.
在前一个stable发布以后,stable发行版跟将要发布的testing发行版之间的差异可能变得相当大同时也使得升级系统变得更加的复杂.
在全面升级系统的时候,你应该谨慎的操作,同时你也应该从邮件列表中获取最新的资料然后根据你的常识作出正确的判断.
1.
查看先前的"发行说明".
2.
备份整个系统(尤其是数据和配置信息).
3.
当bootloader坏了的时候,手边应该有可以引导电脑启动的存储介质.
4.
事先通知系统上的用户.
5.
用script(1)记录升级的过程.
6.
用"unmarkauto"命令来保留你想要的软件包,例如"aptitudeunmarkautovim"这个命令是用来防止移除vim这个软件的.
7.
为了减少软件包之间可能会发生的冲突,应该尽量减少要安装的软件包的数目,例如,移除桌面环境这个软件包.
8.
移除"/etc/apt/preferences"文件(禁用apt-pinning).
Debian参考手册54/2629.
试着一步步的升级:oldstable→stable→testing→unstable.
10.
升级"/etc/apt/sources.
list"文件,使其指向新的档案库然后运行"aptitudeupdate"命令.
11.
可选的安装选项,首先是新的corepackages,例如"aptitudeinstallperl".
12.
运行"apt-get-sdist-upgrade"命令来评估升级造成的影响.
13.
最后运行"apt-getdist-upgrade"命令.
小心在stable版本升级的时候,跳过主要的Debian发行版是不明智的.
小心在先前的"发行手册"里,GCC,LinuxKernel,initrd-tools,Glibc,Perl,APTtoolchain等等,有一些关于系统全面升级的重要注意事项.
关于unstable版本的日常升级,查看第2.
4.
3节.
2.
4高级软件包管理操作2.
4.
1命令行中的高级软件包管理操作下面列出了一些其它的软件包管理操作,这些操作对于aptitude过于高级或缺失所需的功能.
注意对于一个支持多架构的软件包,你可能需要为一些命令指定架构名称.
例如,使用"dpkg-Llibglib2.
0-0:amd64"来列出amd64架构的libglib2.
0-0软件包的内容.
小心系统管理员应该小心使用低级的软件包工具(例如"dpkg-i…"和"debi…"),它们不会自动处理所需的软件包依赖.
dpkg的命令行选项"--force-all"和类似的选项(参见dpkg(1))只适用于高手.
没有完全理解它们的效果却使用它们会破坏你的整个系统.
请注意以下几点.
所有的系统配置和安装命令都需要以root运行.
不同于使用正则表达式的aptitude(参见第1.
6.
2节),其它的软件包管理命令使用类似于shellglob的通配符(参见第1.
5.
6节).
apt-file(1)由apt-file软件包提供,并且需要先运行"apt-fileupdate".
configure-debian(8)由configure-debian软件包提供,它运行dpkg-reconfigure(8)作为后端.
dpkg-reconfigure(8)使用debconf(1)作为后端来运行软件包脚本.
"apt-getbuild-dep"、"apt-getsource"和"apt-cacheshowsrc"命令需要"/etc/apt/sources.
list"中存在"deb-src"条目.
Debian参考手册55/262命令操作COLUMNS=120dpkg-l列出已安装软件包的列表用于错误报告dpkg-L显示一个已安装软件包的内容dpkg-L|egrep'/usr/share/man/man.
*/.
+'列出一个已安装软件包的man手册页dpkg-S列出匹配文件名的已安装软件包apt-filesearch列出档案库中匹配文件名的软件包apt-filelist列出档案库中匹配的软件包的内容dpkg-reconfigure重新配置软件包dpkg-reconfigure-p=low通过最详细的方式来重新配置软件包configure-debian以全屏菜单的形式重新配置软件包dpkg--audit部分安装软件包的审计系统dpkg--configure-a配置所有部分安装的软件包apt-cachepolicy显示一个二进制软件包的可用版本、优先级和档案库信息apt-cachemadison显示一个软件包的可用版本和档案库信息apt-cacheshowsrc显示一个二进制软件包的源代码软件包信息apt-getbuild-dep安装构建软件包所需要的软件包aptitudebuild-dep安装构建软件包所需要的软件包apt-getsource(从标准档案库)下载源代码dget(从其它档案库)下载源代码软件包dpkg-source-x_-.
dsc从源代码软件包集合("*.
orig.
tar.
gz"和"*.
debian.
tar.
gz"/"*.
diff.
gz")中构建代码树debuildbinary从本地的源代码树中构建软件包make-kpkgkernel_image从内核源代码树中构建一个内核软件包make-kpkg--initrdkernel_image从启用了initramfs的内核代码树中构建一个内核软件包dpkg-i_-_.
deb安装一个本地的软件包到系统中aptinstall/path/to/.
deb安装本地软件包到系统中,同时尝试自动解决依赖debi_-_.
dsc安装本地软件包到系统中dpkg--get-selections'*'>selection.
txt保存dpkg级别的软件包选择状态信息dpkg--set-selectionshold|dpkg--set-selections使用dpkg将一个软件包的包选择状态设置为hold(相当于"aptitudehold")Table2.
13:高级软件包管理操作Debian参考手册56/262dget(1)、debuild(1)和debi(1)需要devscripts软件包.
参见第2.
7.
13节里使用"apt-getsource"的打包(重打包)过程.
make-kpkg命令需要kernel-package软件包(参见第9.
9节).
通用打包参见第12.
11节.
2.
4.
2验证安装的软件包文件已经安装debsums软件包的,能使用debsums(1)命令通过"/var/lib/dpkg/info/*.
md5sums"文件中的MD5sum值,验证已安装的文件.
参见第10.
3.
5节来获得MD5sum是怎样工作的信息.
注意因为MD5sum数据库可能被侵入者篡改,debsums(1)作为安全工具使用有限.
这种工具用于校验管理者造成的本地修改或媒体错误造成的损坏是很不错的.
2.
4.
3预防软件包故障许多用户更想使用unstable,因为它有新的功能和软件包.
但这会使得系统更容易遇到严重的软件包bug.
安装软件包apt-listbugs可以避免您的系统遭遇严重bugs,在通过APT系统升级时,它会自动检查DebianBTS里的严重bug.
安装apt-listchanges软件包,在使用APT系统升级时它会在"NEWS.
Debian"中提供重要新闻.
2.
4.
4搜索软件包元数据尽管近来浏览Debian网站https://packages.
debian.
org/是搜索软件包元数据更加简单的方法,但我们依旧来看看更传统的方法.
grep-dctrl(1)、grep-status(1)和grep-available(1)命令被用来搜索具有Debian软件包控制文件格式的任何文件.
"dpkg-S"被用来搜索由dpkg安装的软件包中包含匹配文件的.
但它会忽略维护者的脚本创建的文件.
如果你需要对dpkg元数据进行更复杂的搜索,你需要在"/var/lib/dpkg/info/"目录下运行"grep-eregex_pattern*"命令.
这会使你在软件包脚本和安装查询文本中搜索提及的单词.
如果你想递归查找软件包依赖,你应该使用apt-rdepends(8).
2.
5Debian软件包内部管理让我们来学习Debian软件包管理的内部工作原理.
这应该能够帮助你独立解决一些软件包问题.
2.
5.
1档案库元数据每个发行版的元数据文件都保存在Debian镜像站的"dist/"下面,例如"http://deb.
debian.
org/debian/档案库的结构可以通过网络浏览器来浏览.
其中有6种关键的元数据.
为了减少网络流量,在最近的档案库中,这些元数据存储为压缩了的差分文件.
Debian参考手册57/262文件位置内容Release发行版的顶层档案库描述和完整性信息Release.
gpg发行版的顶层"Release"文件的签名文件,使用档案库密钥签名Contents-发行版的顶层列出在相关架构中所有软件包的全部文件Release每个发行版/区域/架构组合的顶部归档描述使用apt_preferences(5)的规则Packages每个发行版/区域/二进制架构组合的顶部连接debian/control获得二进制包Sources每个发行版/区域/源代码组合的顶部连接debian/control获取源代码包Table2.
14:Debian档案库元数据的内容2.
5.
2顶层"Release"文件及真实性提示顶层"Release"文件用于签署secureAPT系统下的归档文件.
每个Debian档案库的网址都有一个这样的"Release"文件,例如"http://deb.
debian.
org/debian/dists/unstable内容如下.
Origin:DebianLabel:DebianSuite:unstableCodename:sidDate:Sat,14May201108:20:50UTCValid-Until:Sat,21May201108:20:50UTCArchitectures:alphaamd64armelhppahurd-i386i386ia64kfreebsd-amd64kfreebsd-i386mips←mipselpowerpcs390sparcComponents:maincontribnon-freeDescription:Debianx.
yUnstable-NotReleasedMD5Sum:bdc8fa4b3f5e4a715dd0d56d176fc78918876880Contents-alpha.
gz9469a03c94b85e010d116aeeab9614c019441880Contents-amd64.
gz3d68e206d7faa3aded660dc0996054fe19203165Contents-armel.
gz.
.
.
注意在第2.
1.
4节里,你能够发现我使用"suite"和"codename"的逻辑.
"发行版"被用来同时谈及"suite"和"codename".
所有由档案库提供的归档"area"名,会被列在"Components"下.
顶层文件"Release"的完整性,是由叫secureapt的加密架构来验证.
加密签名文件"Release.
gpg"是由顶层授权文件"Release"和加密的Debian档案库公钥创建.
公开的Debian档案库公钥能够被植入"/etc/apt/trusted.
gpg";–这样的操作可以由安装最新的base-files软件包的方式完成,或者–手动使用gpg或者apt-key工具获取发布在ftp-master.
debian.
org上最新的档案库公钥.
secureAPT系统验证下载的顶层文件"Release"的完整性.
加密验证过程用到了"Release.
gpg"文件和在"/etc/apt/tr里的Debian档案库公钥.
Debian参考手册58/262所有"Packages"和"Sources"文件的完整性是由在顶层"Release"文件里的MD5sum值来验证.
所有软件包文件的完整性由"Packages"和"Sources"文件里的MD5sum值来验证.
参见debsums(1)和第2.
4.
2节.
因加密签名验证比计算MD5sum值消耗更多的CPU,使用MD5sum值来验证每一个软件包,使用加密签名来验证顶层的"Release"文件,这种方式提供较好安全性的同时,也有比较好的性能(参见第10.
3节).
2.
5.
3档案库层的"Release"文件提示档案库层的"Release"文件将用作apt_preferences(5)的规则.
归档层次的"Release"文件,其全部归档位置在"/etc/apt/sources.
list"中的"deb"行中指定,如以下的"http://deb或"http://deb.
debian.
org/debian/dists/sid/main/binary-amd64/Release".
Archive:unstableOrigin:DebianLabel:DebianComponent:mainArchitecture:amd64小心对于"Archive:"章节,系列名称("stable","testing","unstable",…)用于Debianarchive,而代号("trusty","xenial","artful",…)用于Ubuntuarchive.
对于部分档案库,比如说experimental和bullseye-backports,它们包含的软件包不会被自动安装,这是因为有额外的行,例如在"http://deb.
debian.
org/debian/dists/experimental/main/binary-amd64/Release"里面有如下额外的一行.
Archive:experimentalOrigin:DebianLabel:DebianNotAutomatic:yesComponent:mainArchitecture:amd64请注意,普通的档案库没有"NotAutomatic:yes",默认的Pin-Priority值是500,而对于有"NotAutomatic:yes"的特殊档案库,默认的Pin-Priority值是1(参见apt_preferences(5)和第2.
7.
3节).
2.
5.
4获取用于软件包的元数据当使用APT工具时,如aptitude,apt-get,synaptic,apt-file,auto-apt,我们需要更新包含Debian档案库信息元数据的本地拷贝.
这些本地拷贝的文件名称,和在"/etc/apt/sources.
list"文件里面的distribution,area,architecture相应名称一致.
(参见第2.
1.
4节).
"/var/lib/apt/lists/deb.
debian.
org_debian_dists__Release""/var/lib/apt/lists/deb.
debian.
org_debian_dists__Release.
gpg""/var/lib/apt/lists/deb.
debian.
org_debian_dists___binary-__source_Sources"Debian参考手册59/262"/var/cache/apt/apt-file/deb.
debian.
org_debian_dists__Contents-"元数据的本地拷贝,能够被"apt-fileupdate"更新,它的位置和其它4个不同.
参见apt-file(1).
(auto-apt的"Contents-.
gz"文件的本地拷贝默认也使用不同的位置.
)2.
5.
5APT的软件包状态除了远程获取元数据,lenny之后的APT工具还会将它在本地产生的安装状态信息保存在"/var/lib/apt/extended_sta中,APT会使用它们来追踪自动安装的所有软件包.
2.
5.
6aptitude的软件包状态除了远程获取元数据,aptitude命令还会将它在本地产生的安装状态信息保存在"/var/lib/aptitude/pkgstates"中,这些信息只能被aptitude使用.
2.
5.
7获取的软件包的本地副本所有通过APT机制远程获取的软件包都被保存在"/var/cache/apt/archives"中,直到它们被清除.
aptitude的这个缓存文件清理策略,能够在"Options"→"Preferences"下设置,也可以通过它的菜单,"Actions"下的"Cleanpackagecache"或"Cleanobsoletefiles"来执行强制清理.
2.
5.
8Debian软件包文件名称Debian软件包文件有特定的名称结构.
软件包类型名称结构二进制软件包(亦称deb)_-__-__-.
orig1.
0源代码软件包(Debian改变)_-.
diff3.
0(quilt补丁管理工具)源代码软件包(Debian改变)_-.
debi源代码软件包(说明)_-.
dscTable2.
15:Debian软件包的名称结构提示这里仅叙述了基本的源码包格式.
更多内容请参考dpkg-source(1).
Debian参考手册60/262名称组件可用的字符(正则表达式)存在状态[a-z,A-Z,0-9,必需:[0-9]+:可选[a-z,A-Z,0-9,必需[a-z,A-Z,0-9,可选Table2.
16:Debian软件包名称中每一个组件可以使用的字符注意你可以用dpkg(1)提供的命令检查软件包版本,例如.
,"dpkg--compare-versions7.
0gt7.
~pre1;echo$".
注意debian-installer(d-i)使用udeb作为它的二进制软件包的文件扩展名,而非普通的deb.
一个udeb软件包是从deb软件包中剥离了一些不必要的内容(例如文档),从而节省空间同时也放宽软件包政策的要求.
deb和udeb软件包会共享相同的软件包结构.
"u"表示微小.
2.
5.
9dpkg命令dpkg(1)是Debian软件包管理中最底层的工具.
它非常强大,必须小心使用.
当安装名为""的软件包时,dpkg会按照下列的顺序处理它.
1.
解包deb文件(等同于"ar-x")2.
使用debconf(1)执行".
preinst"3.
将软件包安装到系统中(等同于"tar-x")4.
使用debconf(1)执行".
postinst"debconf系统提供带有I18N和L10N(第8章)支持的标准化用户交互.
文件内容说明/var/lib/dpkg/info/.
conffiles列出配置文件.
(使用者可修改的)/var/lib/dpkg/info/.
list列出软件包安装的所有文件和目录/var/lib/dpkg/info/.
md5sums列出软件包安装的文件的MD5哈希值/var/lib/dpkg/info/.
preinst软件包安装之前运行的软件包脚本/var/lib/dpkg/info/.
postinst软件包安装之后运行的软件包脚本/var/lib/dpkg/info/.
prerm软件包移除之前运行的软件包脚本/var/lib/dpkg/info/.
postrm软件包移除之后运行的软件包脚本/var/lib/dpkg/info/.
config用于debconf系统的软件包脚本/var/lib/dpkg/alternatives/update-alternatives命令使用的替代信息/var/lib/dpkg/available所有软件包的可用性信息/var/lib/dpkg/diversionsdpkg(1)使用的文件移动信息,由dpkg-divert(8)设置/var/lib/dpkg/statoverridedpkg(1)使用的文件状态改变信息,由dpkg-statoverride(8)设置/var/lib/dpkg/status所有软件包的状态信息/var/lib/dpkg/status-old"var/lib/dpkg/status"文件的第一代备份/var/backups/dpkg.
status*第二代备份,以及"var/lib/dpkg/status"文件更旧的备份Table2.
17:dpkg创建的重要文件"status"文件也被例如dpkg(1)、"dselectupdate"和"apt-get-udselect-upgrade"等工具使用.
专门的搜索命令grep-dctrl(1)可以搜索"status"和"available"元数据的本地副本.
Debian参考手册61/262提示在debian安装器环境下,udpkg命令用于打开udeb软件包,udpkg命令是dpkg命令的一个精简版本.
2.
5.
10update-alternatives命令Debian系统使用update-alternatives(1)让用户可以不受干扰地安装多种重叠的程序.
例如,如果同时安装了vim和nvi软件包,你可以使vi命令选择运行vim.
$ls-l$(type-pvi)lrwxrwxrwx1rootroot202007-03-2419:05/usr/bin/vi->/etc/alternatives/vi$sudoupdate-alternatives--displayvi.
.
.
$sudoupdate-alternatives--configviSelectionCommand1/usr/bin/vim*+2/usr/bin/nviEntertokeepthedefault[*],ortypeselectionnumber:1Debian选择系统在"/etc/alternatives/"目录里通过符号链接来维持它的选择.
选择进程使用"/var/lib/dpkg/alter目录里面的相应文件.
2.
5.
11dpkg-statoverride命令当安装一个软件包时,由dpkg-statoverride(8)命令提供的状态修改,是告诉dpkg(1)对文件使用不同的属主或权限的一个方法.
如果使用了"--update"选项,并且文件存在,则该文件会被立即设置为新的属主和模式.
小心系统管理员使用chmod或chown命令直接修改某个软件包文件的属主或权限,将会在下次软件包升级时,被重置.
注意本人在此使用了文件一词,但事实上也可用于dpkg所处理的任何文件系统对象,包括目录,设备等.
2.
5.
12dpkg-divert命令dpkg-divert(8)命令提供的文件转移,是迫使dpkg(1)将文件不安装到其默认位置,而是安装到转移的位置.
dpkg-divert是软件包维护脚本.
不建议系统管理员使用这个命令.
2.
6从损坏的系统中恢复当运行unstable系统,系统管理员会遇到从错误的软件包管理进行恢复的情形.
小心下面的一些方法具有很高的风险.
在此先对你进行警告!
Debian参考手册62/2622.
6.
1不兼容旧的用户配置如果一个桌面GUI程序在重要的上游版本升级后变得不稳定,你应该怀疑这是旧的本地配置文件(由它创建的)所导致的.
如果它在新建的用户账号下运行稳定,那么这个假设就得到了证实.
(这是一个打包的bug并且打包者通常会避免它.
)为了恢复稳定,你应该移除相应的本地配置文件并重新启动GUI程序.
你可能需要阅读旧的配置文件内容以便之后恢复配置信息.
(别将它们删得太快了.
)2.
6.
2具有相同文件的不同软件包文档级的软件包管理系统,比如说aptitude(8)或apt-get(1),使用软件包依赖,当出现相同文件时,不会尝试去安装软件包.
(参见第2.
1.
6节).
软件包维护者的错误,或者系统管理员配置了不一致的档案库混合源,(参见第2.
7.
2节),都会出现不正确的软件包依赖情况.
如果在出现相同文件的情况下,你通过aptitude(8)或apt-get(1)安装软件包,dpkg(1)在对软件包解包时,确定会给调用程序返回错误,并不会覆盖已经存在的文件.
小心使用第三方软件包会导致重大的系统风险,因为其通过使用root权限运行维护者脚本能够对你的系统做任何事.
dpkg(1)命令只防止解包时的覆盖行为.
可以先通过删除旧的令人讨厌的软件包,,来解决这类错误的安装问题.
$sudodpkg-P2.
6.
3修复损坏的软件包脚本当软件包脚本中的一个命令由于某些原因返回错误,脚本也将由于错误而退出,软件包管理系统忽略它们的行为,并导致部分安装的软件包.
当一个软件包在它的删除脚本中有错误时,该软件包将会成为不可能删除的软件包,处理这些问题,都会变得相当棘手.
对于""的软件包脚本问题,你应该查看下列的软件包脚本.
"/var/lib/dpkg/info/.
preinst""/var/lib/dpkg/info/.
postinst""/var/lib/dpkg/info/.
prerm""/var/lib/dpkg/info/.
postrm"使用下列的方法,以root编辑损坏的软件包脚本.
在行首添加"#"可以禁用出错的行在出错行的行尾添加"||true"可以强制返回成功使用下列命令来配置所有部分安装的软件包.
#dpkg--configure-aDebian参考手册63/2622.
6.
4使用dpkg命令进行救援因为dpkg是非常底层的软件包工具,它可以在很糟糕的情况下进行工作,例如无法启动系统且没有网络连接.
让我们假定foo软件包损坏了,并且需要更换.
你可以在软件包缓存目录:"/var/cache/apt/archives/"中找到旧的foo软件包的无bug版本.
(如果找不到,你可以从档案库https://snapshot.
debian.
org/中下载它,或从具有软件包缓存功能的机器中拷贝它.
)如果你能够启动系统,你可以通过下列命令来安装它.
#dpkg-i/path/to/foo__.
deb提示如果你系统损坏较小,你也可以使用更高层的APT系统来降级整个系统,就像第2.
7.
10节中做的那样.
如果你的系统无法从硬盘启动,你应该寻找其它方式来启动它.
1.
使用Debian安装光盘以救援模式启动系统.
2.
将硬盘上无法启动的系统挂载到"/target".
3.
通过下列命令安装旧版本的foo软件包.
#dpkg--root/target-i/path/to/foo__.
deb即使位于硬盘上的dpkg命令已损坏,该命令依旧可以执行.
提示任何由硬盘、liveGNU/LinuxCD、可启动的USB驱动或网络启动上的另一系统启动的GNU/Linux系统到可以类似地用来救援损坏的系统.
如果由于依赖问题,无法用这种方式安装软件包,并且你真的必须真么做,你可以使用dpkg的"--ignore-depends"、"--for和其它选项来无视依赖.
如果你这么做了,之后你必须认真努力地修复依赖关系.
更多细节参见dpkg(8).
注意如果你的系统严重损坏了,你应该将系统完整备份到一个安全的地方(参见第10.
2节)并进行一次全新的安装.
这是耗时较少且效果较好的办法.
2.
6.
5恢复软件包选择数据如果"/var/lib/dpkg/status"因为某种原因出现错误,Debian系统会丢失软件包选择数据并受到严重影响.
寻找位于"/var/lib/dpkg/status-old"或"/var/backups/dpkg.
status.
*"中旧的"/var/lib/dpkg/status"文件.
给"/var/backups/"分配一个单独的分区是一个好习惯,因为这个目录包含了许多重要的系统数据.
对于严重的损坏,我建议备份系统后重新安装.
即使失去"/var/"中的所有数据,你依旧可以从"/usr/share/doc/"目录恢复一些信息来引导你进行新的安装.
重新安装最小(桌面)系统.
#mkdir-p/path/to/old/system将旧系统挂载到"/path/to/old/system/".
Debian参考手册64/262#cd/path/to/old/system/usr/share/doc#ls-1>~/ls1.
txt#cd/usr/share/doc#ls-1>>~/ls1.
txt#cd#sortls1.
txt|uniq|less然后你就可以根据软件包名称来进行安装了.
(可能会有一些非软件包名称,例如"texmf".
)2.
7软件包管理技巧2.
7.
1如何挑选Debian软件包你可以根据aptitude这个包管理工具中的软件包描述或者是任务面板下的列表信息,来查找你所需要的软件包.
当遇到2个以上的类似的软件包时,先前没有经过反复的尝试,你不知道安装哪一个的时候,应该用常识来判断.
我认为以下几点是首选的软件包应该具有的特征.
重要性:是>否类型:main>contrib>non-free优先级:需要>重要>标准>可选>额外任务:在任务下有软件包的列表信息,例如"桌面环境"软件包是被与之有依赖关系的软件包所选择的(例如python2.
4依赖python)流行度:在投票或者安装指数上有着更高的分数更新日志:维护者经常的更新BTS(缺陷跟踪系统):没有RC级别的缺陷(没有危险、重大严重的缺陷)BTS(缺陷跟踪系统):有维护者对缺陷报告反馈BTS(缺陷跟踪系统):有着更多的近期修复的bug数目BTS(缺陷跟踪系统):遗留的非严重(non-wishlist)缺陷数量较少Debian是一个使用分布式开发模式的志愿项目,它的档案库包含了许多不同关注点和不同质量的软件包.
你必须做出自己的选择.
2.
7.
2混合源档案库中的软件包小心从混合源档案库中安装软件包是不被Debian官方发行版所支持的,除了官方支持的档案库的特殊组合以外,例如stable的securityupdates和bullseye-updates.
这里有一个列子,在原有只跟踪testing的场景,操作包含在unstable里发现的新的上游软件包版本.
1.
临时更改"/etc/apt/sources.
list"文件,使之指向单一的"unstable"发行版路径.
2.
运行"aptitudeupdate"命令.
Debian参考手册65/2623.
运行"aptitudeinstall"命令.
4.
恢复到原始"/etc/apt/sources.
list"文件,使之指向testing路径.
5.
运行"aptitudeupdate"命令.
使用这个手工方法,你不需要创建"/etc/apt/preferences"文件,也不需要担心apt-pinning.
但这个方法仍然是非常麻烦的.
小心当使用混合档案源的时候,因为Debian不会确保软件之间的兼容性,所以你必须自己去解决兼容性问题.
如果软件之间存在不兼容性,系统可能会损坏.
你必须能够判断这些操作所需的技术要求.
使用任意混合的档案源是完全可选的操作,我并不鼓励你去使用它.
从不同的档案库中安装软件包的一般规则如下.
非二进制软件包("Architecture:all")的安装是更保险的.
–文档软件包:没有特别的要求–解释程序的软件包:兼容的解释器必须是可用的二进制软件包(non"Architecture:all")通常会面临很多障碍,它的安装不保险的.
–库文件版本的兼容性(包括"libc")–与之相关的有用的程序版本的兼容性–内核ABI的兼容性–C++ABI的兼容性–…注意为了使软件包的安装变得更保险,一些商业的非自由的二进制程序包可能会提供完整的静态链接库.
你还是应该检查ABI的兼容性问题等等.
注意为避免短期出现坏的软件包,从非官方支持的档案库安装二进制软件包通常是一个坏注意.
即使你在使用apt-pinning情况下,也是这样的.
(参见第2.
7.
3节).
你应当考虑使用chroot或类似技术(参见第9.
10节)来运行不同档案库的程序.
2.
7.
3调整候选版本没有"/etc/apt/preferences"文件,APT系统使用版本字符串来选择最新的可用版本作为候选版本.
这是通常的状态,也是APT系统最推荐的使用方法.
所有官方支持的档案库集合,并不要求"/etc/apt/preferences"文件,因此,一些不应当被作为自动更新源的软件包,被标记为NotAutomatic,并被适当处理.
提示版本字符串的比较规则可以被验证,例子如下,"dpkg--compare-versionsver1.
1gtver1.
1~1;echo$"(参见dpkg(1)).
Debian参考手册66/262如果经常从混合源档案库中安装软件包(参见第2.
7.
2节),你可以通过创建"/etc/apt/preferences"文件并且在其中写入关于调整候选版本的软件包选取规则的合适条目(如apt_preferences(5)中所示)来自动化这些复杂的操作.
这被称为apt-pinning.
警告新手用apt-pinning命令会造成比较大的问题.
你必须避免使用这个命令除非确实需要它.
小心当使用apt-pinning命令时,因为Debian不会确保软件之间的兼容性,所以你必须自己确认其兼容性.
apt-pinning是完全可选的操作,我并不建议去使用它.
小心档案库层级的Release文件(参见第2.
5.
3节)使用apt_preferences(5)的规则.
对于Debian通用档案库和Debian安全档案库,apt-pinning只在"suite"名下工作.
(这点和Ubuntu档案库不同.
)例如,你在"/etc/apt/preferences"文件里面,可以使用"Pin:releasea=unstable",但不能使用"Pin:releasea=sid".
小心当使用非Debian的档案库作为apt-pinning的一部分时,你应该检查它们的用途和可信度.
例如,Ubuntu和Debian是不能混在一起的.
注意即使不创建"/etc/apt/preferences"文件,在不用apt-pinning命令的情况下,你也可以进行相当复杂的系统工作(参见第2.
6.
4节和第2.
7.
2节).
如下是关于apt-pinning技术的简化说明.
可用的软件包源在"/etc/apt/sources.
list"文件里面定义,APT系统从可用的软件包源里面选择Pin-Priority值最大的,作为升级软件包的候选版本.
如果一个软件包的Pin-Priority大于1000,这个版本限制为只能升级,关闭了软件包降级功能(参见第2.
7.
10节).
每个软件包的Pin-Priority值是在"/etc/apt/preferences"文件中的"Pin-Priority"条目中定义或者是使用它的默认值.
Pin-Priorityapt-pinning对软件包的影响1001安装该软件包,即使是一个降级软件包的指令990用作目标发行版档案库的默认值500用作常规档案库的默认值100用于NotAutomatic和ButAutomaticUpgrades档案库的默认值100用于已安装软件包1用于NotAutomatic档案库的默认值-1即使被推荐,也绝不安装这个软件包Table2.
18:用于apt-pinning技术的值得注意的Pin-Priority值列表.
目标发行版档案库可以通过以下几种方法来设置.
Debian参考手册67/262"/etc/apt/apt.
conf"配置文件中写入"APT::Default-Release"stable";"命令行选项,例如:"apt-getinstall-ttestingsome-package"NotAutomatic和ButAutomaticUpgrades的档案是由档案库服务器上档案层级的Release文件来设置,(参见第2.
5.
3节),同时包含"NotAutomatic:yes"和"ButAutomaticUpgrades:yes".
而NotAutomatic档案也是由档案库服务器上的档案层级的Release文件来设置,但只包含"NotAutomatic:yes".
来自众多档案源的的apt-pinning情况可以通过"apt-cachepolicy"命令显示.
"Packagepin:"开头的行,列出了软件包版本的pin,如果相关的pin已经定义,例如,"Packagepin:0.
190".
没有"Packagepin:"的行存在,如果没有相关的定义.
与相关的Pin-Priority值列在所有版本字符串的右边,比如,"0.
181700".
"0"是列在所有版本字符串的右边,如果没有相关的定义.
例如,"0.
1810".
档案库(在"/etc/apt/preferences"文件作为"Package:*"定义)的Pin-Priority值,列在所有档案库路径的左边,例如,"100http://deb.
debian.
org/debian/bullseye-backports/mainPackages".
2.
7.
4更新和向后移植bullseye-updates和backports.
debian.
org档案库提供了stable(bullseye)发行版的更新软件包.
为了去使用这些档案库,你需要在"/etc/apt/sources.
list"文件里写入如下所示的档案库列表.
debhttp://deb.
debian.
org/debian/bullseyemaincontribnon-freedebhttp://security.
debian.
org/bullseye/updatesmaincontribdebhttp://deb.
debian.
org/debian/bullseye-updatesmaincontribnon-freedebhttp://deb.
debian.
org/debian/bullseye-backportsmaincontribnon-free并不需要在"/etc/apt/preferences"文件中显式设置Pin-Priority值.
当新的包可用时,默认配置提供了更合理的更新(请见第2.
5.
3节).
所有已安装的旧软件包都可以通过bullseye-updates档案库升级到新软件包.
只有从bullseye-backports档案库中手动安装的旧软件包才会通过bullseye-backports档案库升级到新软件包.
当你想要从bullseye-backports档案库中手动的安装一个名叫""的软件及其依赖包的时候,你应该在目标档案库之前加一个"-t"参数.
$sudoapt-getinstall-tbullseye-backports2.
7.
5阻止推荐的软件包的安装如果不想要引入推荐的特定软件包,你必须创建"/etc/apt/preferences"文件并且像如下所示的那样在文件的顶部明确列出这些软件包.
Package:Pin:version*Pin-Priority:-1Package:Pin:version*Pin-Priority:-1Debian参考手册68/2622.
7.
6使用带有unstable软件包的testing版本如下是一个关于apt-pinning技术的例子,当使用testing的时候,实现unstable中的特定的较新的上游版本软件包的日常升级.
你应该按如下所示的在"/etc/apt/sources.
list"文件中列出所有需要的档案库.
debhttp://deb.
debian.
org/debian/testingmaincontribnon-freedebhttp://deb.
debian.
org/debian/unstablemaincontribnon-freedebhttp://security.
debian.
org/testing/updatesmaincontrib按如下所示的设置"/etc/apt/preferences"文件.
Package:*Pin:releasea=unstablePin-Priority:100当想要在此配置下从unstable档案库中安装""软件及它的依赖包时,你执行带有"-t"选项(unstable的Pin-Priority值变为990)的转换目标发行版的命令.
$sudoapt-getinstall-tunstable在此配置下,执行"apt-getupdate"和"apt-getdist-upgrade"(或者"aptitudesafe-upgrade"和"aptitudefull-upgrade")命令,会从testing档案库升级那些从testing档案库安装的软件包并且从unstable档案库升级那些从unstable档案库中安装的软件包.
小心小心不要去移除"/etc/apt/sources.
list"文件中的"testing"档案库.
如果文件中没有"testing",APT系统会使用更加新的unstable档案库升级软件包.
提示我通常会在上述操作后,马上注释掉"/etc/apt/sources.
list"文件中的"unstable"档案库记录.
这避免了因为处理"/etc/apt/sources.
list"文件中的众多记录而造成的升级缓慢虽然同时也阻止了那些从unstable档案库中安装的软件包通过unstable升级.
提示如果"/etc/apt/preferences"文件中"Pin-Priority:1"替代了"Pin-Priority:100",即使"/etc/apt/sources.
list"文件中的"testing"记录被删除了,Pin-Priority值为100的已安装软件包也不会通过unstable档案库升级.
如果你希望自动跟踪unstable里某些特殊的软件包,而在安装时不再使用初始化选项"-tunstable",你必须创建"/etc/apt/preferences"文件,并在该文件顶部按下面的方式清晰的列出所有那些软件包.
Package:Pin:releasea=unstablePin-Priority:700Package:Pin:releasea=unstablePin-Priority:700如下是为每个特定的软件包设置Pin-Priority值.
例如,为了使用最新的unstable的英文版"DebianReference",你应该在"/etc/apt/preferences"文件中写入以下条目.
Debian参考手册69/262Package:debian-reference-enPin:releasea=unstablePin-Priority:700Package:debian-reference-commonPin:releasea=unstablePin-Priority:700提示即使你使用的是stable档案库,apt-pinning技术仍然是有效的.
根据我以前的经验,从unstable档案库安装的文档包一直是安全的.
2.
7.
7使用带有experimental软件包的unstable版本这是使用apt-pinning的另一个示例,该示例主要使用unstable源,但包含了experimental源,该源可用于安装上游更新的软件包.
需要包含在"/etc/apt/sources.
list"文件中的列表如下:debhttp://deb.
debian.
org/debian/unstablemaincontribnon-freedebhttp://deb.
debian.
org/debian/experimentalmaincontribnon-freedebhttp://security.
debian.
org/testing/updatesmaincontrib由于experimental源是非自动(NotAutomatic)的源(参见第2.
5.
3节),其默认的Pin-Priority值被设置为1(_.
deb"命令(参见第2.
6.
4节).
搜索"/etc/apt/sources.
list"文件中像下面那样使用unstable的行.
debhttp://deb.
debian.
org/debian/sidmaincontribnon-free使用下面的行替换它,从而改为使用testing.
debhttp://deb.
debian.
org/debian/bookwormmaincontribnon-free按如下所示的设置"/etc/apt/preferences"文件.
Package:*Pin:releasea=testingPin-Priority:1010运行"apt-getupdate;apt-getdist-upgrade"使整个系统的软件包强制降级.
在紧急降级后,移除"/etc/apt/preferences"这个特殊的文件.
提示这是一个好方法,移除(不是清除!
)尽可能多地软件包,来减少依赖问题.
你可能需要手动移除和安装一些软件包来使系统降级.
需要特别注意Linux内核、引导程序、udev、PAM、APT和网络相关的软件包以及它们的配置文件.
2.
7.
11上传软件包的是谁尽管"/var/lib/dpkg/available"和"/usr/share/doc/package_name/changelog"中列出的维护者姓名提供了关于"软件包运作的幕后者是谁"这一问题的一些信息,但软件包的实际上传者依旧不明.
devscripts软件包中的who-uploads(1)可以识别Debian源软件包的实际上传者.
2.
7.
12equivs软件包如果你从源代码编译了一个程序来代替Debian软件包,最好将它做成一个真正的本地Debian软件包(*.
deb)并使用私人档案库.
如果你选择从源代码编译一个程序并将它安装到"/usr/local",你可能需要使用equivs作为最后步骤来满足缺失的软件包依赖.
Package:equivsPriority:optionalSection:adminDescription:CircumventingDebianpackagedependenciesThispackageprovidesatooltocreatetrivialDebianpackages.
Typicallythesepackagescontainonlydependencyinformation,buttheycanalsoincludenormalinstalledfileslikeotherpackagesdo.
Debian参考手册71/262.
Oneuseforthisistocreateametapackage:apackagewhosesolepurposeistodeclaredependenciesandconflictsonotherpackagessothatthesewillbeautomaticallyinstalled,upgraded,orremoved.
.
Anotheruseistocircumventdependencychecking:bylettingdpkgthinkaparticularpackagenameandversionisinstalledwhenitisn't,youcanworkaroundbugsinotherpackages'dependencies.
(Pleasedostillfilesuchbugs,though.
)2.
7.
13移植一个软件包到stable系统对于部分升级的stable系统,使用源软件包在运行环境中重新构建一个软件包是不错的选择.
这可以避免因为依赖关系导致大量软件包升级.
在stable系统的"/etc/apt/sources.
list"文件中添加下列条目.
deb-srchttp://deb.
debian.
org/debianunstablemaincontribnon-free如下安装编译所需的软件包并下载源软件包.
#apt-getupdate#apt-getdist-upgrade#apt-getinstallfakerootdevscriptsbuild-essential#apt-getbuild-depfoo$apt-getsourcefoo$cdfoo*如果需要向后移植,可以从backport的软件包中更新一些工具链软件包,例如dpkg和debhelper.
执行下列命令.
$dch-i更新软件包版本,例如在"debian/changelog"中附加一个"+bp1"像下面那样构建软件包并将它们安装到系统中.
$debuild$cd.
.
#debifoo*.
changes2.
7.
14用于APT的代理服务器因为镜像整个Debian档案库的子区会浪费硬盘和网络带宽,当你管理许多LAN上的系统时,为APT部署一个本地代理服务器是个好主意.
APT可以通过配置来使用通用web(http)代理服务器,例如squid(参见第6.
10节),细节参见apt.
conf(5)和"/usr/share/doc/apt/examples/configure-index.
gz".
环境变量"$http_proxy会覆盖"/etc/apt/apt.
conf"文件中设置的代理服务器.
这里有一些Debian档案库的专用代理工具.
你应该在使用它们之前检查BTS.
软件包流行度大小说明approxV:0,I:06317缓存Debian档案库文件的代理服务器(已编译的OCaml程序)apt-cacherV:0,I:0289为Debian软件包和源代码文件进行缓存代理(Perl程序)apt-cacher-ngV:5,I:51488分发软件包的缓存代理(C++编译的程序)Table2.
19:Debian档案库的专用代理工具Debian参考手册72/262小心当Debian重构它的档案库结构时,这些专用的代理工具往往需要软件包维护者重写代码,并可能在一段时间内无法使用.
另一方面,通用web(http)代理服务器更强健并且更容易应对这种改变.
2.
7.
15小型公共软件包档案库提示手动建立软件仓库是极其复杂的.
有数个软件仓库管理工具可供用户选用.
网上有一个详尽的列表可供参阅.
下面是一个建立小型公共软件包档案库的示例,兼容了secureAPT系统(参见第2.
5.
2节).
让我们进行一些假定.
账号名:"foo"主机名:"www.
example.
com"所需软件包:apt-utils、gnupg和其它软件包URL:"http://www.
example.
com/~foo/home/foo/public_html/index.
html")软件包架构:"amd64"在该服务器上使用如下方式为Foo创建一个APT源钥匙对.
$sshfoo@www.
example.
com$gpg--gen-key.
.
.
$gpg-K.
.
.
sec1024D/3A3CB5A62008-08-14uidFoo(ARCHIVEKEY)ssb2048g/6856F4A72008-08-14$gpg--export-a3A3CB5A6>foo.
public.
key公布"foo.
public.
key"文件,即公钥ID为"3A3CB5A6"的源公钥文件,该文件可用于Foo源的发布使用如下方式创建一个名为"Origin:Foo"的源目录树.
$umask022$mkdir-p~/public_html/debian/pool/main$mkdir-p~/public_html/debian/dists/unstable/main/binary-amd64$mkdir-p~/public_html/debian/dists/unstable/main/source$cd~/public_html/debian$cat>dists/unstable/main/binary-amd64/Releasedists/unstable/main/source/Releaseaptftp.
confaptgenerate.
conf"www.
example.
com",method=>"scpb",incoming=>"/home/foo/public_html/debian/pool/main",#Thedinstallonftp-mastersendsemailsitselfdinstall_runs=>1,};$cfg{'foo'}{postupload}{'changes'}="echo'cdpublic_html/debian;apt-ftparchivegenerate-c=aptftp.
confaptgenerate.
conf;apt-ftparchiverelease-c=aptftp.
confdists/unstable>dists/unstable/Release;rm-fdists/unstable/Release.
gpg;gpg-u3A3CB5A6-baodists/unstable/Release.
gpgdists/unstable/Release'|sshfoo@www.
example.
com2>/dev/null;echo'Packagearchivecreated!
'";dupload(1)触发postupload钩子脚本,该脚本为每次上传创建软件包文件.
你可以通过下面的方法将这个小型公共档案库添加到你客户端系统的apt源中.
$sudobash#echo"debhttp://www.
example.
com/~foo/debian/unstablemain"\>>/etc/apt/sources.
listDebian参考手册74/262#apt-keyaddfoo.
public.
key提示如果档案库位于本地文件系统中,你可以使用"debfile:///home/foo/debian/…".
2.
7.
16记录和复制系统配置你可以通过下面命令建立软件包和debconf选择状态的本地副本.
#dpkg--get-selections'*'>selection.
dpkg#debconf-get-selections>selection.
debconf这里,"*"使"selection.
dpkg"也包含"purge"的软件包.
你可以将这两个文件移动到另一个电脑,并通过下列命令安装它们.
#dselectupdate#debconf-set-selections_.
deb#lstotal24-rw-r--r--1bozobozo13202007-05-0700:11control.
tar.
gz-rw-r--r--1bozobozo128372007-05-0700:11data.
tar.
gz-rw-r--r--1bozobozo42007-05-0700:11debian-binary#mkdircontrol#mkdirdata#tarxvzfcontrol.
tar.
gz-Ccontrol#tarxvzfdata.
tar.
gz-Cdata其它"*.
deb"软件包的内容,可以使用dpkg-deb(1)命令解压来获得,和上面例子中获取"dpkg*.
deb"软件包内容的方法类似;或像上面那样使用标准的ar(1)命令和新版的GNU命令tar(1),该tar(1)命令支持xz(1)解压功能,和上面的解压类似.
你也可以使用mc命令来浏览软件包内容.
Debian参考手册75/2622.
7.
19更多关于软件包管理的文档你可以从下面的文档中了解软件包管理的更多信息.
软件包管理的主要文档:–aptitude(8)、dpkg(1)、tasksel(8)、apt(8)、apt-get(8)、apt-config(8)、apt-key(8)、sources.
list(5)、apt.
conf(5)和apt_preferences(5);–来自apt-doc软件包的"/usr/share/doc/apt-doc/guide.
html/index.
html"和"/usr/share/doc/apt-doc–来自aptitude-doc-en软件包的"/usr/share/doc/aptitude/html/en/index.
html".
Debian档案库的官方详细文档:–"DebianPolicyManualChapter2-TheDebianArchive",–"DebianDeveloper'sReference,Chapter4-ResourcesforDebianDevelopers4.
6TheDebianarchive",–"TheDebianGNU/LinuxFAQ,Chapter6-TheDebianFTParchives".
为Debian用户构建一个Debian软件包的教程:–"Debian新维护人员手册"(已过时).
–"Debian维护者指南".
Debian参考手册76/262Chapter3系统初始化作为系统管理员,粗略地了解Debian系统的启动和配置方式是明智的.
尽管准确的细节在安装的软件包及对应的文档中,但这些知识对我们大多数人来说都是必须掌握的.
笔者基于自己和其他人的过往及现在的知识,尽己所能地提供关于Debian系统的知识要点及其配置的快速概览作为读者的参考.
由于Debian系统在不断地更新中,系统的状况可能已经有所变化.
在对系统做任何修改之前,请参考各个软件包的最新文档.
提示bootup(7)介绍了基于systemd的系统启动流程.
(近期的Debian)提示boot(7)介绍了基于UNIXSystemVRelease4的系统启动流程.
(旧版的Debian)3.
1启动过程概述计算机系统从上电事件到能为用户提供完整的操作系统(OS)功能为止,需要经历几个阶段的启动过程.
为简便起见,笔者将讨论范围限定在具有默认安装的典型PC平台上.
典型的启动过程像是一个四级的火箭.
每一级火箭将系统控制权交给下一级.
第3.
1.
1节第3.
1.
2节第3.
1.
3节第3.
1.
4节当然,这些阶段可以有不同的配置.
比如,你编译了自己的内核,则可能会跳过迷你Debian系统的步骤.
因此,在读者亲自确认之前,请勿假定自己系统的情况也是如此.
注意对于SUN或Macintosh系统等非传统PC平台来说,ROM上的BIOS及磁盘上的分区可能大不相同(第9.
5.
2节).
对于这种情况,请另寻对应平台相关的文档.
Debian参考手册77/2623.
1.
1第一阶段:BIOSBIOS是启动过程的第一阶段,在上电事件后开始.
CPU的程序计数器在上电事件后被初始化为一个特定的内存地址,驻留在只读存储器(ROM)中的BIOS就是从这个特定的内存地址开始执行.
BIOS执行硬件的基本初始化(POST:上电自检)并将系统控制权交给你指定的下一步骤.
BIOS通常和硬件一同提供.
BIOS启动屏幕通常指示了进入BIOS配置界面所需的按键.
流行的按键是F1、F2、F10、Esc、Ins和Del键.
假如你的启动屏幕被一个漂亮的图形界面隐藏,你可以按下某些按键(比如ESC)取消隐藏.
这些按键高度依赖于硬件.
硬件位置和BIOS启动的代码的优先级可以在BIOS配置界面中选择.
通常,在已选择的设备(硬盘、软件、CD-ROM……)中,最先找到的设备的最开始的几个扇区将被加载到内存,并执行其中的初始化代码.
初始化代码可以是以下任意一种.
引导加载代码类似FreeDOS这样的过滤型操作系统的内核代码能够加载到如此小的空间中的目标操作系统的内核代码通常,系统从主硬件的特定分区中引导.
传统PC硬盘的最开始两个扇区中包含了主引导记录(MBR).
在MBR的末尾记录了磁盘分区信息及引导选择.
BIOS中执行的首段引导加载代码占据了MBR的其余部分.
3.
1.
2第二阶段:引载加载程序引导加载程序是启动过程的第二阶段,由BIOS启动.
引导加载程序将系统内核映像和initrd映像加载到内存并将控制权交给它们.
initrd映像是根文件系统映像,其支持程度依赖于所使用的引导加载程序.
Debian系统通常使用Linux内核作为其默认的系统内核.
当前2.
6/3.
x版本Linux内核的initrd镜像从技术上说是initramfs(初始化RAM文件系统)镜像.
基本的initrd镜像是root文件系统中各个文件使用cpio压缩得到的.
内核可以在启动流程中非常早的阶段,在加载基本的initrd镜像之前即更新微码.
以未压缩cpio格式存储微码二进制文件的initrd镜像和基本initrd镜像两部分可以联合组成一个initrd镜像,从而帮助实现上述功能.
提示您可以使用lsinitramfs(8)和unmkinitramfs(8)这两个工具检查initrd镜像文件的内容,它们由initramfs-tools-core软件包提供.
另见https://wiki.
debian.
org/initramfs以了解更多信息.
Debian系统默认将PC平台的GRUB引导加载程序的第一阶段代码安装在MBR中.
可用的引导加载程序和配置选项如下.
警告假如没有从grub-rescue-pc软件包中的映像制作出来的可引导修复盘(U盘、CD或软盘),请勿玩弄引导加载程序.
即使硬盘上没有可正常工作的引导加载程序,可引导修复盘也能引导你的系统.
传统GRUB的菜单配置文件位于/boot/grub/menu.
lst.
例如,文件中有如下的配置条目.
titleDebianGNU/Linuxroot(hd0,2)kernel/vmlinuzroot=/dev/hda3roinitrd/initrd.
imgGRUB第2版的菜单配置文件位于/boot/grub/grub.
cfg.
此文件由/usr/sbin/update-grub根据"/etc/grub.
d/*"中的模板及"/etc/default/grub"中的设置自动生成.
例如,文件中有如下的配置条目.
Debian参考手册78/262软件包流行度大小initrd引导加载程序说明grub-legacyV:0,I:2735支持传统GRUB可智能识别磁盘分区和文件系统(例如vfat、ext3…).
grub-pcV:28,I:774533支持GRUB第2版可智能识别磁盘分区和文件系统(例如vfat、ext4…).
(默认安装)grub-rescue-pcV:0,I:16367支持GRUB第2版此为GRUB第2版的可引导修复映像(CD和软盘)(PC/BIOS版本)liloV:0,I:2697支持Lilo依赖于数据在硬盘上的扇区位置.
(较老)syslinuxV:4,I:48343支持Isolinux可识别ISO9660文件系统.
引导CD使用此项.
syslinuxV:4,I:48343支持Syslinux可识别MSDOS文件系统(FAT).
引导软盘使用此项.
loadlinV:0,I:190支持Loadlin新系统从FreeDOS或MSDOS中启动.
mbrV:0,I:750不支持NeilTurton的MBR此为取代MSDOSMBR的自由软件.
只可识别硬盘分区.
Table3.
1:引导加载程序列表menuentry"DebianGNU/Linux"{setroot=(hd0,3)linux/vmlinuzroot=/dev/hda3initrd/initrd.
img}这些示例中,GRUB参数的含义如下.
GRUB参数说明root使用主磁盘的第3个分区,在传统GRUB中将此参数设置为"(hd0,2)",在GRUB第2版中将此参数设置为"(hd0,3)"kernel使用位于"/vmlinuz"的内核,同时将"root=/dev/hda3ro"作为参数传递给内核initrd使用位于"/initrd.
img"的initrd/initramfs映像Table3.
2:GRUB参数的含义注意传统GRUB使用的分区号为Linux内核及各种实用工具使用的分区号减1.
GRUB第2版修复了这个问题.
提示在标识一个块设备时,可能需要使用UUID(参见第9.
5.
3节)而不是类似"/dev/hda3"这样的文件名,例如"root=UUID=81b289d5-4341-4003-9602-e254a17ac232ro".
提示如果使用了GRUB,内核的启动参数可以在/boot/grub/grub.
cfg里面设置.
在Debian系统里,你不应该直接编辑/boot/grub/grub.
cfg.
你可以通过编辑/etc/default/grub文件中GRUB_CMDLINE_LINUX_DEFAULT的值并运行update-grub(8)来更新/boot/grub/grub.
cfg.
Debian参考手册79/262提示通过使用链式引导技术,你可以在一个引导装载程序中启动另一个引导装载程序.
参见"infogrub"及grub-install(8).
3.
1.
3第三阶段:迷你Debian系统迷你Debian系统是启动流程的第三阶段,由引导加载程序启动.
它会在内存中运行系统内核和根文件系统.
这是启动流程的一个可选准备阶段.
注意"迷你Debian系统"是笔者自创的术语,用于在本文档中描述启动流程的第三个阶段.
这个系统通常被称为initrd或initramfs系统.
内存中类似的系统在Debian安装程序中使用.
/init程序是内存中的根文件系统上执行的第一个程序.
这个程序在用户空间把内核初始化,并把控制权交给下一阶段.
迷你Debian系统能够在主引导流程之前添加内核模块或以加密形式挂载根文件系统,使引导流程更加灵活.
如果initramfs是由initramfs-tools创建,则"/init"程序是一个shell脚本程序.
–通过给内核添加"break=init"等启动参数,你可以中断这部分启动流程以获取rootshell.
更多中断条件请参见"/init"脚本.
这个shell环境已足够成熟,你可通过它很好地检查机器的硬件.
–迷你Debian系统中可用的命令是精简过的,且主要由一个称为busybox(1)的GNU工具提供.
如果initramfs是由dracut创建,则"/init"程序是一个二进制systemd程序.
–迷你Debian系统中可用的命令是一个精简过的systemd(1)环境.
小心当在一个只读的根文件系统上时,使用mount命令需要添加-n选项.
3.
1.
4第四阶段:常规Debian系统常规Debian系统是启动流程的第四阶段,由迷你Debian系统启动.
迷你Debian系统的内核在此环境下继续运行.
根文件系统将由内存切换到实际的硬盘文件系统上.
init程序是系统执行的第一个程序(PID=1),它启动其它各种程序以完成主引导流程.
init程序的默认路径是"/sbin/init",但可通过内核启动参数修改,例如"init=/path/to/init_program".
默认的init程序一直在变化中:squeeze之前的Debian,使用简单的SysV风格的init.
wheezy版本的Debian对SysV风格的init做了改进:使用LSB头将启动步骤排序,同时并行执行启动脚本.
jessie版本的Debian将默认init切换成systemd,以使用事件驱动和并行初始化.
提示你的系统中实际使用的init命令可以使用"ps--pid1-f"命令确认.
Debian参考手册80/262软件包流行度大小说明systemdV:810,I:91615998基于事件且支持并发的init(8)守护进程(可替代sysvinit)systemd-sysvV:802,I:914138systemd需用的用以代替sysvinit的手册页和符号链接systemd-cronV:1,I:1143提供cron后台守护进程(daemon)和anacron功能的systemd单元init-system-helpersV:675,I:930131在sysvinit和systemd之间进行转换的帮助工具initscriptsV:91,I:323176用于初始化和关闭系统的脚本sysvinit-coreV:7,I:9276类SystemV的init(8)工具sysv-rcV:183,I:33581类SystemV的运行级别修改机制sysvinit-utilsV:494,I:99979类SystemV的实用工具(startpar(8),bootlogd(8),……)lsb-baseV:881,I:99949Linux标准规范3.
2版的init脚本功能insservV:210,I:330150利用LSBinit.
d脚本依赖性来组织启动步骤的工具uswsuspV:3,I:8714使用Linux提供的用户态软件suspend的工具kexec-toolsV:1,I:8278用于kexec(8)重启(热启动)的kexec工具systemd-bootchartV:0,I:1128启动流程性能分析器bootchart2V:0,I:094启动流程性能分析器pybootchartguiV:0,I:0177启动流程性能分析器(可视化)mingettyV:0,I:338仅包含控制台的getty(8)mgettyV:0,I:1315可智能调制解调的getty(8)替代品Table3.
3:Debian系统启动工具列表提示在Debianjessie版本后,"/sbin/init"是一个到"/lib/systemd/systemd"的符号链接.
提示有关启动流程加速的最新信息,请参见Debian维基:启动流程加速词条.
3.
2Systemd初始化本节描述系统是怎样通过PID=1的systemd(1)程序来启动(即初始化进程).
systemd初始化进程基于单元配置文件(参见systemd.
unit(5))来并行派生进程,这些单元配置文件使用声明样式来书写,代替之前的类SysV的过程样式.
这些单元配置文件从下面的一系列路径来加载(参见systemd-system.
conf(5)):"/lib/systemd/system":OS默认配置文件"/etc/systemd/system":系统管理员的配置文件,它将忽略操作系统默认的配置文件"/run/systemd/system":运行时产生的配置文件,它将忽略安装的配置文件他们的相互依赖关系通过"Wants=","Requires=","Before=","After=",…等指示来配置,(参见systemd.
unit(5)里的"MAPPINGOFUNITPROPERTIESTOTHEIRINVERSES").
资源控制也是被定义(参见systemd.
resource-control(5)).
根据单元配置文件的后缀来区分它们的类型:*.
service描述由systemd控制和监管的进程.
参见systemd.
service(5).
*.
device描述在sysfs(5)里面作为udev(7)设备树展示的设备.
参见systemd.
device(5).
Debian参考手册81/262*.
mount描述由systemd控制和监管的文件系统挂载点.
参见systemd.
mount(5).
*.
automount描述由systemd控制和监管的文件系统自动挂载点.
参见systemd.
automount(5).
*.
swap描述由systemd控制和监管的swap文件或设备.
参见systemd.
swap(5).
*.
path描述被systemd监控的路径,用于基于路径的活动.
参见systemd.
path(5).
*.
socket描述被systemd控制和监管的套接字,用于基于套接字的活动.
参见systemd.
socket(5).
*.
timer描述被systemd控制和监管的计时器,用于基于时间的活动.
参见systemd.
timer(5).
*.
slice管理cgroups(7)的资源.
参见systemd.
slice(5).
*.
scope使用systemd的总线接口来程序化的创建,用以管理一系列系统进程.
参见systemd.
scope(5).
*.
target把其它单元配置文件分组,在启动的时候,来创建同步点.
参见systemd.
target(5).
系统启动时(即,init),systemd进程会尝试启动"/lib/systemd/system/default.
target(通常是到"graphical.
ta的符号链接).
首先,一些特殊的target单元(参见systemd.
special(7)),比如"local-fs.
target"、"swap.
target"和"cryptsetup.
target"会被引入以挂载文件系统.
之后,其它target单元也会根据单元依赖关系而被引入.
详细情况,请阅读bootup(7).
systemd提供向后兼容的功能.
在"/etc/init.
d/rc[0123456S].
d/[KS]"里面的SysV风格的启动脚本仍然会被分析;telinit(8)会被转换为systemd的单元活动请求.
小心模拟的运行级别2到4全部被符号链接到了相同的"multi-user.
target".
3.
2.
1主机名内核维护系统主机名.
在启动的时候,通过systemd-hostnamed.
service启动的系统单位设置系统的主机名,此主机名保存在"/etc/hostname".
这个文件应该只包含系统主机名,而不是全称域名.
不带参数运行hostname(1)命令可以打印出当前的主机名.
3.
2.
2文件系统硬盘和网络文件系统的挂载选项可以在"/etc/fstab"中设置,参见fstab(5)和第9.
5.
7节.
加密文件系统的配置设置在"/etc/crypttab"中.
参见crypttab(5)软RAID的配置mdadm(8)设置在"/etc/mdadm/mdadm.
conf".
参见mdadm.
conf(5).
警告每次启动的时候,在挂载了所有文件系统以后,"/tmp","/var/lock",和"/var/run"中的临时文件会被清空.
3.
2.
3网络接口初始化对于使用systemd的现代Debian桌面系统,网络接口通常由两个服务进行初始化:lo接口通常在"networking.
service"处理,而其它接口则由"NetworkManager.
service"处理.
参见第5章来获取怎样来配置它们的信息.
Debian参考手册82/2623.
2.
4内核消息在控制台上显示的内核错误信息,能够通过设置他们的阈值水平来配置.
#dmesg-n3错误级别值错误级别名称说明0KERN_EMERG系统不可用1KERN_ALERT行为必须被立即采取2KERN_CRIT危险条件3KERN_ERR错误条件4KERN_WARNING警告条件5KERN_NOTICE普通但重要的条件6KERN_INFO信息提示7KERN_DEBUGdebug级别的信息Table3.
4:内核错误级别表3.
2.
5系统消息在systemd下,内核和系统的信息都通过日志服务systemd-journald.
service(又名journald)来记录,放在"/var/log/journal"下的不变的二进制数据,或放在"/run/log/journal/"下的变化的二进制数据.
这些二进制日志数据,可以通过journalctl(1)命令来访问.
在systemd下,系统日志工具rsyslogd(8)改变它的行为来读取变化的二进制数据(代替systemd之前的默认的"/dev/log"),并能够创建传统的不变的ASCII系统日志数据.
"/etc/default/rsyslog"和"/etc/rsyslog.
conf"能够自定义系统消息的日志文件和屏幕显示.
参见rsys-logd(8)和rsyslog.
conf(5),也可以参见第9.
2.
2节.
3.
2.
6systemd下的系统管理systemd不仅仅提供系统初始化,还提供通用的系统管理功能.
比如说日志记录,登录管理,时间管理,网络管理等等.
systemd(1)通过几个命令来管理:systemctl(1)命令控制systemd的系统和服务管理器(命令行),systemsdm(1)命令控制systemd的系统和服务管理器(图形界面),journalctl(1)命令查询systemd日志,loginctl(1)命令控制systemd登录管理器,systemd-analyze(1)分析系统启动性能.
这里有一个典型的systemd管理命令片段列表.
确切含义,请阅读相关man手册页.
这里,上面例子中的"$unit",可以是一个单元名(后缀.
service和.
target是可选的),或者,在很多情况下,也可以是匹配的多个单元(shell式样的全局通配符"通过使用fnmatch(3),来匹配目前在内存中的所有单元的基本名称).
上面列子的系统状态改变命令,通常是通过"sudo"来处理,用以获得需要的系统管理权限.
"systemctlstatus$unit|$PID|$device"的输出使用有颜色的点("")来概述单元状态,让人看一眼就知道.
白色的""表示一个"不活动"或"变为不活动中"的状态.
红色的""表示"失败"或者"错误"状态.
绿色""表示"活动"、"重新加载中"或"激活中"状态.
Debian参考手册83/262操作类型命令片段用于服务管理的图形界面图形界面"systemadm"(systemd-ui软件包)列出所有target单元配置单元"systemctllist-units--type=target"列出所有service单元配置单元"systemctllist-units--type=service"列出所有单元配置类型单元"systemctllist-units--type=help"列出内存中所有socket单元单元"systemctllist-sockets"列出内存中所有timer单元单元"systemctllist-timers"启动"$unit"单元"systemctlstart$unit"停止"$unit"单元"systemctlstop$unit"重新加载服务相关的配置单元"systemctlreload$unit"停止和启动所有"$unit"单元"systemctlrestart$unit"启动"$unit"并停止所有其它的单元"systemctlisolate$unit"转换到"图形"(图形界面系统)单元"systemctlisolategraphical"转换到"多用户"(命令行系统)单元"systemctlisolatemulti-user"转换到"应急模式"(单用户命令行系统)单元"systemctlisolaterescue"向"$unit"发送杀死信号单元"systemctlkill$unit"检查"$unit"服务是否是活动的单元"systemctlis-active$unit"检查"$unit"服务是否是失败的单元"systemctlis-failed$unit"检查"$unit|$PID|device"的状态单元"systemctlstatus$unit|$PID|$device"显示"$unit|$job"的属性单元"systemctlshow$unit|$job"重设失败的"$unit"单元"systemctlreset-failed$unit"列出所有单元服务的依赖性单元"systemctllist-dependencies--all"列出安装在系统上的单元文件单元文件"systemctllist-unit-files"启用"$unit"(增加符号链接)单元文件"systemctlenable$unit"禁用"$unit"(删除符号链接)单元文件"systemctldisable$unit"取消遮掩"$unit"(删除到"/dev/null"的符号链接)单元文件"systemctlunmask$unit"遮掩"$unit"(增加到"/dev/null"的符号链接)单元文件"systemctlmask$unit"获取默认的target设置单元文件"systemctlget-default"设置默认target为"graphical"(图形系统)单元文件"systemctlset-defaultgraphical"设置默认的target为"multi-user"(命令行系统)单元文件"systemctlset-defaultmulti-user"显示工作环境变量环境变量"systemctlshow-environment"设置环境变量"variable"的值为"value"环境变量"systemctlset-environmentvariable=value"取消环境变量"variable"的设置环境变量"systemctlunset-environmentvariable"重新加载所有单元文件和后台守护进程(daemon)生命周期"systemctldaemon-reload"关闭系统系统"systemctlpoweroff"关闭和重启系统系统"systemctlreboot"挂起系统系统"systemctlsuspend"休眠系统系统"systemctlhibernate"查看"$unit"的工作日志日志"journalctl-u$unit"查看"$unit"的工作日志("tail-f"式样)日志"journalctl-u$unit-f"显示每一个初始化步骤所消耗的时间分析"systemd-analyzetime"列出所有单元的初始化时间分析"systemd-analyzeblame"加载"$unit"文件并检测错误分析"systemd-analyzeverify$unit"跟踪cgroups(7)的启动过程Cgroup"systemd-cgls"跟踪cgroups(7)的启动过程Cgroup"psxawf-eoDebian参考手册84/2623.
2.
7定制systemd使用默认安装,通过systemd启动的过程中,在network.
target启动后,很多网络服务(参见第6章)作为后台守护进程(daemon)启动.
"sshd"也不列外.
让我们修改为按需启动"sshd"作为一个定制化的例子.
首先,禁用系统安装的服务单元.
$sudosystemctlstopsshd.
service$sudosystemctlmasksshd.
service传统Unix服务的按需套接字激活(on-demandsocketactivation)系统由indetd超级服务来提供.
在systemd下,相同功能能够通过增加*.
socket和*.
service单元配置文件来启用.
sshd.
socket用来定义一个监听的套接字[Unit]Description=SSHSocketforPer-ConnectionServers[Socket]ListenStream=22Accept=yes[Install]WantedBy=sockets.
targetsshd@.
service作为sshd.
socket匹配的服务文件[Unit]Description=SSHPer-ConnectionServer[Service]ExecStart=-/usr/sbin/sshd-iStandardInput=socket然后重新加载.
$sudosystemctldaemon-reload3.
3udev系统对于Linux内核2.
6版和更新版本,udev系统提供了自动硬件发现和初始化机制.
(参见udev(7)).
在内核发现每个设备的基础上,udev系统使用从sysfs文件系统(参见第1.
2.
12节)的信息启动一个用户进程,使用modprobe(8)程序(参见第3.
3.
1节)加载支持它所要求的内核模块,创建相应的设备节点.
提示如果由于某些理由,"/lib/modules//modules.
dep"没有被depmod(8)正常生成,模块可能不会被udev系统按期望的方式加载.
执行"depmod-a"来修复它.
设备节点的名字,可以通过"/etc/udev/rules.
d/"里的udev文件来配置.
当前默认的规则倾向创建动态生成的名字,除了光驱和网络设备外,会生成非静态的设备名.
通过添加和光驱、网络设备类似的个性化规则,你也可以为USB盘之类的其它设备,生成静态设备名.
参见"Writingudevrules"或"/usr/share/doc/udev/writing_udev_rules/index.
h由于udev系统是一个正在变化的事物,我在其它文档进行了详细描述,在这里只提供了最少的信息.
提示"/etc/fstab"里面的挂载规则,设备节点不必需是静态的.
你能够使用UUID来挂载设备,来代替"/dev/sda"之类的设备名.
参见第9.
5.
3节.
Debian参考手册85/2623.
3.
1内核模块初始化通过modprobe(8)程序添加和删除内核模块,使我们能够从用户进程来配置正在运行的Linux内核.
udev系统(参见第3.
3节)自动化它的调用来帮助内核模块初始化.
下面的非硬件模块和特殊的硬件驱动模块,需要被预先加载,把它们在"/etc/modules"文件里列出(参见modules(5)).
TUN/TAP模块提供虚拟的Point-to-Point网络设备(TUN)和虚拟的Ethernet以太网网络设备(TAP),netfilter模块提供netfilter防火墙能力(iptables(8),第5.
10节),watchdogtimer驱动模块.
modprobe(8)程序的配置文件是按modprobe.
conf(5)的说明放在"/etc/modprobes.
d/"目录下,(如果你想避免自动加载某些内核模块,考虑把它们作为黑名单放在"/etc/modprobes.
d/blacklist"文件里.
)"/lib/modules//modules.
dep"文件由depmod(8)程序生成,它描述了modprobe(8)程序使用的模块依赖性.
注意如果你在启动时出现模块加载问题,或者modprobe(8)时出现模块加载问题,"depmod-a"可以通过重构"modules.
dep"来解决这些问题.
modinfo(8)程序显示Linux内核模块信息.
lsmod(8)程序以好看的格式展示"/proc/modules"的内容,显示当前内核加载了哪些模块.
提示你能够精确识别你系统上的硬件.
参见第9.
4.
3节.
提示你可以在启动时配置硬件来激活期望的硬件特征.
参见第9.
4.
4节.
提示你可以重新编译内核来增加你的特殊设备的支持.
参见第9.
9节.
Debian参考手册86/262Chapter4认证当用户(或程序)需要访问系统时,需要进行认证,确认身份是受信任.
警告PAM的配置错误可能会锁住你的系统.
你必须有一个准备好的救援CD,或者设立一个替代的boot分区.
为了恢复系统,你需要使用它们启动系统并纠正错误.
警告本章是基于2013年发布的Debian7.
0(Wheezy)编写的,所以其内容正在变得过时.
4.
1一般的Unix认证一般的Unix认证由PAM(PluggableAuthenticationModules,即可插入的验证模块)下的pam_unix(8)模块提供.
它的3个重要文件如下,其内的条目使用":"分隔.
文件权限用户组说明/etc/passwd-rw-r--r--rootroot(明文的)用户账号信息/etc/shadow-rw-r-----rootshadow安全加密的用户账号信息/etc/group-rw-r--r--rootroot组信息Table4.
1:pam_unix(8)使用的3个重要配置文件"/etc/passwd"包含下列内容.
.
.
.
user1:x:1000:1000:User1Name,,,:/home/user1:/bin/bashuser2:x:1001:1001:User2Name,,,:/home/user2:/bin/bash.
.
.
如passwd(5)中所述,这个文件中被":"分隔的每项含义如下.
登录名密码形式说明Debian参考手册87/262数字形式的用户ID数字形式的组ID用户名或注释字段用户家目录可选的用户命令解释器"/etc/passwd"的第二项曾经被用来保存加密后的密码.
在引入了"/etc/shadow"后,该项被用来说明密码形式.
内容说明(空)无需密码的账号x加密后的密码保存在"/etc/shadow"*无法登陆的账号!
无法登陆的账号Table4.
2:"/etc/passwd"第二项的内容"/etc/shadow"包含下列内容.
.
.
.
user1:$1$Xop0FYH9$IfxyQwBe9b8tiyIkt2P4F/:13262:0:99999:7:::user2:$1$vXGZLVbS$ElyErNf/agUDsm1DehJMS/:13261:0:99999:7:::.
.
.
如shadow(5)中所述,这个文件中被":"分隔的每项含义如下.
登录名加密后的密码(开头的"$1$"表示使用MD5加密.
"*"表示无法登陆.
)最后一次修改密码的时间,其表示从1970年1月1日起的天数允许用户再次修改密码的天数间隔用户必须修改密码的天数间隔密码失效前的天数,在此期间用户会被警告密码失效后的天数,在次期间密码依旧会被接受账号失效的时间,其表示从1970年1月1日起的天数…"/etc/group"包含下列内容.
group1:x:20:user1,user2如group(5)中所述,这个文件中被":"分隔的每项含义如下.
组名称加密后的密码(不会被真正使用)数字形式的组ID使用","分隔的用户名列表Debian参考手册88/262注意"/etc/gshadow"为"/etc/group"提供了与"/etc/shadow"相似的功能,但没有被真正地使用.
注意如果"authoptionalpam_group.
so"这行添加到了"/etc/pam.
d/common-auth",并且在"/etc/security/group.
conf"里进行了设置,一个用户的实际组就可以被动态添加.
参见pam_group(8).
注意base-passwd软件包包含了一份用户和组的官方文档:"/usr/share/doc/base-passwd/users-and-groups.
html4.
2管理账号和密码信息下面是一些管理账号信息的重要命令.
命令功能getentpasswd浏览""的账号信息getentshadow浏览用户""隐藏的账户信息getentgroup浏览""的组信息passwd管理账号密码passwd-e为激活的账号设置一次性的密码chage管理密码有效期信息Table4.
3:管理账号信息的命令其中的一些功能只能被root使用.
密码和数据的加密参见crypt(3).
注意在设置了PAM和NSS的系统上(例如Debiansalsa机器),本地的"/etc/passwd"、"/etc/group"和"/etc/shadow"可能不会被系统激活使用.
上述的命令即使处于这种环境下依旧是有效的.
4.
3好密码在系统安装时建立一个账号或使用passwd(1)命令时,你应该选择一个好密码,它应该由6到8个字符组成,其中包含下列根据passwd(1)设定的每个组合中的一个或多个字符.
小写字母数字0到9标点符号警告密码中不要使用可以猜到的词.
账号名、身份证号码、电话号码、地址、生日、家庭成员或宠物的名字、字典单词、简单的字符序列(例如"12345"或"qwerty")等都是糟糕的选择.
Debian参考手册89/2624.
4设立加密的密码下面是一些用于生成加盐的加密密码的独立工具.
软件包流行度大小命令功能whoisV:35,I:393364mkpasswd具备crypt(3)库所有特性的前端opensslV:794,I:9931465opensslpasswd计算密码哈希(OpenSSL).
passwd(1ssl)Table4.
4:生成密码的工具4.
5PAM和NSS现代的类Unix系统(例如Debian系统)提供PAM(PluggableAuthenticationModules,插入式验证模块)和NSS(NameServiceSwitch,名称服务切换)机制给本地系统管理员,使他们能够配置自己的系统.
它们的功能可以概括为以下几点.
PAM给应用软件提供了一个灵活的认证机制,因此涉及到了密码数据的交换.
NSS提供了一个灵活的名称服务机制,它经常被C标准库使用,使例如ls(1)和id(1)这样的程序获得用户和组名称.
PAM和NSS系统必须保持配置一致.
PAM和NSS系统中重要的软件包如下.
软件包流行度大小说明libpam-modulesV:807,I:9991032插入式验证模块(基础服务)libpam-ldapI:12249允许LDAP接口的插入式验证模块libpam-cracklibI:16115启用cracklib支持的插入式验证模块libpam-systemdV:474,I:853573用于logind注册用户会话的插入式验证模块(PAM)libpam-docI:11044插入式验证模块(html和文本文档)libc6V:935,I:99912771GNUC库:同样提供"名称服务切换"服务的共享库glibc-docI:113161GNUC库:帮助页面glibc-doc-referenceI:512740GNUC库:参考手册,有info、pdf和html格式(non-free)libnss-mdnsI:526150用于解析组播DNS名称的NSS模块libnss-ldapI:11265NSS模块,用于使用LDAP作为一个名称服务的libnss-ldapdI:14153NSS模块,用于使用LDAP作为一个名称服务的(libnss-ldap的新fork)Table4.
5:PAM和NSS系统中重要的软件包libpam-doc中"TheLinux-PAMSystemAdministrators'Guide"是了解PAM配置的必要文档.
glibc-doc-reference中的"SystemDatabasesandNameServiceSwitch"是了解NSS配置的重要文档.
注意你可以使用"aptitudesearch'libpam-|libnss-'"命令查看更多的相关软件包.
NSS缩写也可能意味着"NetworkSecurityService,网络安全服务",它不同于"NameServiceSwitch,名称服务切换".
Debian参考手册90/262注意PAM是为每个程序初始化环境变量为系统默认值的最基础方法.
在systemd下,libpam-systemd软件包被安装用来管理用户登录,通过在systemd控制组层,为logind注册用户会话来实现.
参见systemd-logind(8),logind.
conf(5),和pam_systemd(8).
4.
5.
1PAM和NSS访问的配置文件下面是一些PAM和NSS访问的重要配置文件.
配置文件功能/etc/pam.
d/为""程序设置PAM配置;参加pam(7)和pam.
d(5)/etc/nsswitch.
conf为每个服务条目设置NSS配置.
参见nsswitch.
conf(5)/etc/nologin通过pam_nologin(8)模块限制用户登陆/etc/securetty通过pam_securetty(8)模块限制root访问tty/etc/security/access.
conf通过pam_access(8)模块设置访问限制/etc/security/group.
conf通过pam_group(8)模块设置基于组的限制/etc/security/pam_env.
conf通过pam_env(8)模块设置环境变量/etc/environment通过带有"readenv=1"参数的pam_env(8)模块设置额外的环境变量/etc/default/locale通过带有"readenv=1envfile=/etc/default/locale"参数的pam_env(8)模块设置语言环境值(在Debian系统中)/etc/security/limits.
conf通过pam_linits(8)模块设置资源限制(ulimit、core等等)/etc/security/time.
conf通过pam_time(8)模块设置时间限制/etc/systemd/logind.
conf设置systemd的登录管理器配置(参见logind.
conf(5)和systemd-logind.
service(8))Table4.
6:PAM和NSS访问的配置文件密码选择的限制是通过PAM模块pam_unix(8)和pam_cracklib(8)来实现的.
它们可以通过各自的参数进行配置.
提示PAM模块在文件名中使用后缀".
so".
4.
5.
2现代的集中式系统管理现代的集中式系统管理可以使用集中式的轻量目录访问协议(LDAP)服务器进行部署,从而通过网络管理许多类Unix和非类Unix系统.
轻量目录访问协议的开源实现是OpenLDAP软件.
LDAP服务器使用带有PAM和NSS的libpam-ldap和libnss-ldap软件包为Debian系统提供账号信息.
需要一些动作来启用LDAP(我没有使用过这个设置,并且下面的信息纯粹是第二手的信息.
请在这种前提下阅读下列内容.
).
你通过运行一个程序,例如独立的LDAP守护进程slapd(8),来建立集中式的LDAP服务器.
你在"/etc/pam.
d/"目录中的PAM配置文件里,使用"pam_ldap.
so"替代默认值"pam_unix.
so".
–Debian使用"/etc/pam_ldap.
conf"作为libpam-ldap的配置文件,"/etc/pam_ldap.
secret"作为保存root密码的文件.
你在"/etc/nsswitch.
conf"文件中改变NSS配置,使用"ldap"替代默认值("compat"或"file").
Debian参考手册91/262–Debian使用"/etc/libnss-ldap.
conf"作为libnss-ldap的配置文件.
为了密码的安全,你必须让libpam-ldap使用SLL(或TLS)连接.
为了确保LDAP网络开销数据的完整性,你必须让libpam-ldap使用SLL(或TLS)连接.
为了减少LDAP网络流量,你应该在本地运行nscd(8)来缓存任何LDAP搜索结果.
参见由libpam-doc软件包提供的pam_ldap.
conf(5)中的文档和"/usr/share/doc/libpam-doc/html/",以及glibc-doc软件包提供的"infolibc'NameServiceSwitch'".
类似地,你可以使用其它方法来设置另一种集中式的系统.
同Windows系统集成用户和组.
–通过winbind和libpam_winbind软件包访问Windowsdomain服务.
–参见winbindd(8)和IntegratingMSWindowsNetworkswithSamba.
同古老的类Unix系统集成用户和组.
–通过nis软件包访问NIS(之前叫YP)或NIS+.
–参见TheLinuxNIS(YP)/NYS/NIS+HOWTO.
4.
5.
3"为什么GNUsu不支持wheel组"这是在旧的"infosu"底部RichardM.
Stallman所说的一句名言.
别担心:Debian系统中当前的su命令使用了PAM,这样当在"/etc/pam.
d/su"中启用了带有"pam_wheel.
so"的行后,就能够限制非wheel组的用户su到root组的能力.
4.
5.
4严格的密码规则安装libpam-cracklib软件包你能够强制使用严格的密码规则,例如,通过在"/etc/pam.
d/common-password"中添加下列行.
对于squeeze发行版:passwordrequiredpam_cracklib.
soretry=3minlen=9difok=3password[success=1default=ignore]pam_unix.
souse_authtoknullokmd5passwordrequisitepam_deny.
sopasswordrequiredpam_permit.
so4.
6其它的访问控制注意参见第9.
3.
15节来限制内核的安全警告密钥(SAK)功能.
Debian参考手册92/2624.
6.
1sudosudo(8)程序是为了使一个系统管理员可以给用户受限的root权限并记录root活动而设计的.
sudo只需要一个普通用户的密码.
安装sudo软件包并通过设置"/etc/sudoers"中的选项来使用它.
参见"/usr/share/doc/sudo/examples/sud和第1.
1.
12节中的配置示例.
我将sudo用于单用户系统(参见第1.
1.
12节)是为了防止自己可能做出的愚蠢行为.
就我个人而言,我认为使用sudo会比使用root账号操作系统来得好.
例如,下列命令将""的拥有者改变为"".
$sudochown当然如果你知道root密码(比如自行安装Debian的用户所做的),任何用户账号都可以使用"su-c"让任何命令以root运行.
4.
6.
2PolicyKitPolicyKit是在类Unix操作系统中控制整个系统权限的一个操作系统组件.
较新的GUI图形界面程序设计时便考虑到了不作为特权进程来运行.
它们通过PolicyKit来和特权进程通信,从而执行管理操作.
在Debian系统中,PolicyKit限制了属于sudo组的用户账号的这种操作.
参见polkit(8).
4.
6.
3SELinuxSecurity-EnhancedLinux(SELinux)是一个收紧权限模块的框架,它比普通的类Unix安全模块mandatoryaccesscontrol(MAC)策略更严格.
root权限在某些条件下被限制.
4.
6.
4限制访问某些服务端的服务对系统安全而言,尽可能的禁用服务程序,是一个好的主意.
网络服务是危险的.
有不使用的服务,不管是直接由后台守护进程(daemon)激活,还是通过super-server程序激活,都被认为是安全风险.
许多程序,比如说sshd(8),使用基于PAM的访问控制.
也还有许多方式来限制访问一些服务端的程序.
配置文件:"/etc/default/"后台守护进程(daemon)的服务单元配置PAM(PluggableAuthenticationModules)super-server使用"/etc/inetd.
conf"TCPwrapper使用"/etc/hosts.
deny"和"/etc/hosts.
allow",tcpd(8)SunRPC"使用/etc/rpc.
conf"atd(8)使用"/etc/at.
allow"和"/etc/at.
deny"crontab(1)使用"/etc/cron.
allow"和"/etc/cron.
deny"Networkfirewall或netfilter框架参见第3.
2.
6节,第4.
5.
1节,和第5.
10节.
提示NFS和其它基于RPC的程序,需要激活SunRPC服务.
Debian参考手册93/262提示如果你远程访问最新的Debian系统有问题,看下在"/etc/hosts.
deny"里是否存在"ALL:PARANOID"这样讨厌的配置,请把它注释掉.
(但是你必须注意这种行为所带来的安全风险.
)4.
7安全认证注意这里的信息也许不能完全满足你的安全需求,但这里应当是一个好的起点.
4.
7.
1确保互联网上的的密码安全许多流行的传输层服务都使用纯文本来传输包括密码验证信息在内的各类消息.
使用纯文本在公网上传输密码是很糟糕的做法,因为这样传输的密码很容易在网上被他人截获.
为了确保整个沟通过程,包括密码信息在内都使用加密传输来确保安全,您可以在"传输层安全(TransportLayerSecurity,TLS)"协议或者其前身,"安全套接字层(SecureSocketsLayer,SSL)"协议之上运行这些服务.
不安全的服务名端口安全的服务名端口www(http)80https443smtp(邮件)25ssmtp(smtps)465ftp-data20ftps-data989ftp21ftps990telnet23telnets992imap2143imaps993pop3110pop3s995ldap389ldaps636Table4.
7:安全和不安全的服务端口列表加密消耗CPU时间.
作为对CPU有益的替代方案,你可以保持使用纯文本通讯,仅仅使用安全认证协议加密密码,比如说:POP使用"AuthenticatedPostOfficeProtocol"(APOP),SMTP和IMAP使用"Challenge-ResponseAuthenticationMechanismMD5"(CRAM-MD5).
(你的邮件客户端通过互联网上你的邮件服务器发送邮件时,最近流行使用新的递交端口587来代替传统的SMTP端口25,这样可以避免在使用CRAM-MD5认证自己时,网络提供商阻塞25端口.
)4.
7.
2安全Shell安全Shell(SSH)程序使用安全认证来提供不安全网络上两个不可信任主机之间的安全加密通讯.
它由OpenSSH客户端,ssh(1),和OpenSSH后台守护进程(daemon),sshd(8)组成.
SSH使用端口转发特性,可以给POP和X之类的不安全的协议通讯建立隧道,使其可以在互联网上安全传输.
客户端可以使用如下方式来认证自己:基于主机的认证、公钥认证、质疑应答认证、密码认证.
使用公钥认证,可以实现远程免密码登录.
参见第6.
9节.
4.
7.
3互联网额外的安全方式即使你运行SecureShell(SSH)和Point-to-pointtunnelingprotocol(PPTP)这样的安全服务,在互联网上,仍然有机会使用野蛮暴力猜测密码攻击进入.
使用防火墙策略(参见第5.
10节),并和下面的安全工具一起,可以提升安全形势.
Debian参考手册94/262软件包流行度大小说明knockdV:0,I:3102小的port-knock后台守护进程(daemon)knockd(1)和客户端konck(1)fail2banV:112,I:1232092禁用造成多个认证错误的IPlibpam-shieldV:0,I:0115把尝试猜测密码的远程攻击者关在外面Table4.
8:提供额外安全方式的工具列表4.
7.
4root密码安全为阻止人们使用root权限访问你的机器,你需要做下面的操作.
阻止对硬盘的物理访问锁住BIOS来阻止从可移动介质启动为GRUB交互式会话设置密码锁住GRUB菜单,禁止编辑如果可以物理访问硬盘,则可以使用下面的步骤,相对简单的重置密码.
1.
将硬盘拿到一个可以设置BIOS从CD启动的电脑.
2.
使用紧急介质启动系统(Debian启动磁盘,KnoppixCD,GRUBCD,…).
3.
用读写访问挂载根分区.
4.
编辑根分区的"/etc/passwd"文件,使root账户条目的第二段为空.
对于grub-rescue-pc,即使用紧急介质启动的电脑,如果有编辑GRUB菜单条目(参见第3.
1.
2节)的权限,在启动时,使用下面的步骤更加简单.
1.
使用内核参数启动系统来修改一些事情,比如说,"root=/dev/hda6rwinit=/bin/sh".
2.
编辑"/etc/passwd"文件,使root账户条目的第二段为空.
3.
重启系统.
系统的rootshell现在可以无密码访问了.
注意一旦某人拥有rootshell访问权限,他能够访问任何内容,并可以重设系统上的任何密码.
此外,他可以使用john和crack等软件包的暴力破解工具来比较所有用户的密码(参见第9.
4.
11节).
被破解的密码,可以用来和其它系统进行比较.
为避免这些相关问题,仅有的理论上的软件解决方案是使用dm-crypt和initramfs(参见第9.
8节)加密root分区(或"/etc"分区).
这样的话,你总是需要密码来启动系统.
Debian参考手册95/262Chapter5网络设置提示关于GNU/Linux网络的通用手册,请查看Linux网络管理员手册.
提示关于Debian专属的网络手册,请查看Debian管理员手册—网络配置.
警告为代替使用传统的网络接口名称的方案("eth0","eth1","wlan0",…),新的systemd使用"enp0s25"之类的"可预测网络接口名称".
警告本章是基于2013年发布的Debian7.
0(Wheezy)编写的,所以其内容正在变得过时.
提示尽管本手册仍用旧的ifconfig(8)命令和IPv4协议当作网络配置的例子,Debian在wheezy发行版后转向使用ip(8)命令和IPv4+IPv6协议.
欢迎大家提供补丁,更新这个手册.
提示systemd环境下,可以用networkd来配置网络.
请参考systemd-networkd(8).
5.
1基本网络架构让我们来回顾一下现代Debian操作系统中的基本网络架构.
Debian参考手册96/262软件包流行度大小类型说明ifupdownV:587,I:991217配置::ifupdown用来启动/关闭网络的标准工具(Debian特有)ifplugdV:3,I:18217同上自动管理有线网络ifupdown-extraV:0,I:1106同上网络测试脚本,加强"ifupdown"软件包的功能ifmetricV:0,I:137同上设置网络接口的路由度量guessnetV:0,I:0422同上脚本文件,利用"/etc/network/interfaces"文件来加强"ifupdown"的功能ifschemeV:0,I:059同上映射脚本文件,增强"ifupdown"软件包的功能network-managerV:358,I:44014957配置::NMNetworkManager(守卫进程):自动管理网络network-manager-gnomeV:132,I:3725540同上NetworkManager(GNOME前端)wicdI:2436(*)配置::wicd有线和无线网络管理器(元软件包)wicd-cliV:0,I:160(*)同上有线和无线网络管理器(命令行客户端)wicd-cursesV:0,I:3176(*)同上有线和无线网络管理器(文本界面客户端)wicd-daemonV:19,I:26992(*)同上有线和无线网络管理器(守护进程)wicd-gtkV:15,I:25576(*)同上有线和无线网络管理器(GTK+客户端)iptablesV:300,I:9932520配置::Netfilter封包过滤和网络地址转换管理工具(Netfilter)iproute2V:672,I:9262867配置::iproute2iproute2,IPv6和其他高级网络配置:ip(8),tc(8)等等ifrenameV:0,I:3125同上根据不同的静态标准来重命名网络接口:ifrename(8)ethtoolV:102,I:261597同上显示或更改以太网设备的设定iputils-pingV:234,I:997113测试::iproute2测试能否连接远程主机,通过主机名或IP地址(iproute2)iputils-arpingV:8,I:12755同上测试能否连接远程主机,通过ARP地址iputils-tracepathV:4,I:6072同上跟踪访问远程主机的路径net-toolsV:234,I:634991配置::net-toolsNET-3网络工具箱(net-tools,IPv4网络配置):ifconfig(8)等等.
inetutils-pingV:0,I:1359测试::net-tools测试能否连接远程主机,通过hostname或IP地址(传统方式,GNU)arpingV:2,I:2977同上测试能否连接远程主机,通过ARP地址(传统方法)tracerouteV:63,I:936159同上跟踪连接远程主机的路径(传统方法,控制台)isc-dhcp-clientV:231,I:979686配置::底层DHCP客户端wpasupplicantV:332,I:5073436同上WPA和WPA2客户端支持(IEEE802.
11i)wpaguiV:0,I:2781同上wpa_supplicantQt图形界面客户端wireless-toolsV:188,I:254297同上操控Linux无线扩展的工具pppV:206,I:4741054同上使用chat连接PPP/PPPoEpppoeconfV:0,I:8192配置::辅助配置助手,以便于使用PPPoE连接pppconfigV:1,I:2801同上配置助手,以便于使用chat连接PPPwvdialV:0,I:5249同上配置助手,以便于使用wvdial和ppp连接PPPmtr-tinyV:6,I:54161测试::底层追踪连接远程主机的路径(文本界面)mtrV:4,I:43214同上追踪连接远程主机的路径(文本界面和GTK+界面)gnome-nettoolV:2,I:452105同上获取常见网络信息的工具(GNOME)nmapV:31,I:2534452同上网络映射/端口扫描(Nmap,控制台)zenmapV:2,I:92939同上网络映射/端口扫描(GTK+)tcpdumpV:19,I:2041329同上网络流量分析(Tcpdump,控制台)wiresharkI:5564同上网络流量分析(Wireshark,GTK+)tsharkV:3,I:34407同上网络流量分析(控制台)tcptraceV:0,I:3401同上根据tcpdump的输出生成的连接数据统计snortV:0,I:12206同上灵活的网络入侵侦测系统(Snort)ntopngV:1,I:2969同上在网页浏览器中展示网络流量dnsutilsV:64,I:517256同上BIND软件包提供的网络客户端程序:nslookup(8),nsupdate(8),dig(8)dlintV:0,I:753同上利用域名服务器查询来查看DNS域信息Debian参考手册97/2625.
1.
1主机名解析主机名解析,目前也是由NSS(名字服务转换NameServiceSwitch)机制来支持.
这个解析的流程如下.
1.
"/etc/nsswitch.
conf"文件里的"hosts:filesdns"这段规定主机名解析顺序.
(代替"/etc/host.
conf"文件里的"order"这段原有的功能.
)2.
files方式首先被调用.
如果主机名在"/etc/hosts"文件里面发现,则返回所有有效地址并退出.
("/etc/host.
conf文件包含"multion".
)3.
dns方式被调用.
如果主机名通过查询"/etc/resolv.
conf"文件里面写的互联网域名系统DomainNameSystem(DNS)来找到,则返回所有有效地址并退出.
例如,"/etc/hosts"看起来如下.
127.
0.
0.
1localhost127.
0.
1.
1#ThefollowinglinesaredesirableforIPv6capablehosts::1ip6-localhostip6-loopbackfe00::0ip6-localnetff00::0ip6-mcastprefixff02::1ip6-allnodesff02::2ip6-allroutersff02::3ip6-allhosts每一行由IP地址开始,接下来是相关联的主机名.
在这个例子的第二行127.
0.
1.
1IP地址也许不会在其它类Unix系统发现.
DebianInstaller为没有永久IP地址的系统创建这个条目,作为某些软件(如GNOME)的一个变通方法,见文档bug#719621.
匹配在"/etc/hostname"里定义的主机名.
对于有永久IP地址的系统,这个永久IP地址应当代替这里的127.
0.
1.
1.
对于有永久IP地址和有域名系统DomainNameSystem(DNS)提供完全资格域名fullyqualifieddomainname(FQDN)的系统,规范名.
应当被用来代替.
如果resolvconf软件包没有安装,"/etc/resolv.
conf"是一个静态文件.
如果安装了,它是一个符号链接.
此外,它包含有解析策略的初始化信息.
如DNS是IP="192.
168.
11.
1",则包含如下.
nameserver192.
168.
11.
1resolvconf软件包使这个"/etc/resolv.
conf"文件成为一个符号链接,并通过钩子脚本自动管理其内容.
对于典型adhoc局域网环境下的PC工作站,除了基本的files和dns方式之外,主机名还能够通过组播DNS(mDNS,零配置网络Zeroconf)进行解析.
Avahi提供Debian下的组播DNS发现框架.
它和AppleBonjour/AppleRendezvous相当.
libnss-mdns插件包提供mDNS的主机名解析,GNUC库(glibc)的GNU名字服务转换NameServiceSwitch(NSS)功能支持mDNS.
"/etc/nsswitch.
conf"文件应当有像"hosts:filesmdns4_minimal[NOTFOUND=return]dnsmdns4"这样的一段.
".
local"结尾的主机名,使用pseudo-top-leveldomain(TLD)来解析.
mDNSIPv4本地连接组播地址"224.
0.
0.
251"或它相应的IPv6地址"FF02::FB"被用来作为".
local"结尾名字的DNS查询.
Debian参考手册98/262较老的Windows系统安装winbind软件包来提供旧的NETBiosoverTCP/IP主机名解析.
为启用这个功能,"/etc/nsswitch.
文件应当有这样的一段:"hosts:filesmdns4_minimal[NOTFOUND=return]dnsmdns4wins".
(现代Windows系统通常使用dns方式来进行主机名解析.
)注意域名系统DomainNameSystem中的扩展通用顶级域名expansionofgenericTop-LevelDomains(gTLD)还在进行中.
在局域网内,选择一个域名时,请提防名字冲突namecollision.
5.
1.
2网络接口名称网络接口名称,比如说eth0,是在Linux内核里分配给每一个硬件的,当这个硬件被内核发现的时候,通过用户层的配置机制udev(参见第3.
3节)来分配.
网卡接口名称也就是ifup(8)和interfaces(5)里的physicalinterface.
为了保证每个网络接口名称在每次重启后一致,会用到MAC地址等,有一个规则文件"/etc/udev/rules.
d/70-persiste这个文件是由"/lib/udev/write_net_rules"程序自动生成,是由"persistent-net-generator.
rules"规则文件来运行.
你可以修改该文件来改变命名规则.
小心当编辑"/etc/udev/rules.
d/70-persistent-net.
rules"规则文件时,你必须保持每条规则在单独的一行中,并且MAC地址要小写.
比如说,如果你发现"FireWiredevice"和"PCIdevice"在这个文件中,你也许想命名"PCIdevice"作为eth0,并配置它为首要网络接口.
5.
1.
3局域网网络地址范围让我们重新提醒下在rfc1918里规定的局域网localareanetworks(LANs)IPv432位地址在各类地址的保留范围.
这些地址保证不会与因特网上专有的地址冲突.
类别网络地址子网掩码子网掩码/位数#子网数A10.
x.
x.
x255.
0.
0.
0/81B172.
16.
x.
x—172.
31.
x.
x255.
255.
0.
0/1616C192.
168.
0.
x—192.
168.
255.
x255.
255.
255.
0/24256Table5.
2:网络地址范围列表注意如果这些地址分配到一个主机,那么这个主机一定不能够直接访问互联网,必须通过一个作为网关的代理服务或通过网络地址转换NetworkAddressTranslation(NAT).
消费局域网环境,宽带路由器通常使用NAT.
5.
1.
4网络设备支持尽管Debian系统支持大多数硬件设备,但依旧有一些网络设备需要DFSGnon-free固件来支持它们.
参见第9.
9.
6节.
5.
2现代的桌面网络配置对于使用systemd的现代Debian桌面系统,网络接口通常由两个服务进行初始化:lo接口通常在"networking.
service"处理,而其它接口则由"NetworkManager.
service"处理.
Debian参考手册99/262Debiansqueeze和新的发行版都可以通过后台守护进程(daemon)管理软件来管理网络连接,例如NetworkManager(NM)(network-manager和相关软件包)或Wicd(wicd和相关软件包).
它们有自己的GUI和命令行程序来作为用户界面.
它们有自己的后台守护进程(daemon)作为它们的系统后端.
它们使你可以简单地将系统连接到网络.
它们使你可以简单地管理有线和无线网络的配置.
它们允许你配置网络而不依赖传统的ifupdown软件包.
注意不要在服务器上使用这些自动网络配置工具.
它们主要针对于笔记本电脑上的移动桌面用户.
这些现代的网络配置工具需要进行适当的配置,以避免与传统ifupdown软件包发生冲突,它的配置文件位于"/etc/network/interfaces".
注意这些自动网络配置工具的一些功能可能会带来令人烦扰的问题.
它们不像传统的ifupdown软件包那样健壮.
检查network-manager的BTS和wicd的BTS,来查看当前的问题和限制.
5.
2.
1图形界面的网络配置工具Debian系统NM和Wicd的官方文档分别位于"/usr/share/doc/network-manager/README.
Debian"和"/usr/share/doc/wicd/README.
Debian".
本质上,如下操作即可完成桌面的网络配置.
1.
通过下列命令使桌面用户foo归属"netdev"组(另外,例如GNOME和KDE这样的现代桌面环境会通过D-bus自动完成该操作).
$sudoadduserfoonetdev2.
使"/etc/network/interfaces"的配置保持下面那样简洁.
autoloifaceloinetloopback3.
通过下列命令重新启动NM或Wicd.
$sudo/etc/init.
d/network-managerrestart$sudo/etc/init.
d/wicdrestart4.
通过图形界面配置网络.
注意只有不列在"/etc/network/interfaces"中的接口会被NM或Wicd管理,以避免与ifupdown的冲突.
Debian参考手册100/262提示如果你想扩展NM的网络配置功能,请寻找适当的插件模块和补充软件包,例如network-manager-openconnect、network-manager-openvpn-gnome、network-manager-pptp-gnome、mobile-broadband-provider-info、gnome-bluetooth等等.
这同样适用于Wicd.
小心这些自动网络配置工具可能无法兼容"/etc/network/interfaces"中传统的ifupdown的深奥配置,例如第5.
6节和第5.
7节中的那些配置.
检查network-manager的BTS和wicd的BTS来查看当前的问题和限制.
5.
3没有图像界面的现代网络配置使用systemd的系统中,可以在/etc/systemd/network/里配置网络.
参见systemd-resolved(8)、resolved.
conf(5)和systemd-networkd(8).
这个允许在没有图像界面的情况下配置现代网络.
DHCP客户端的配置可以通过创建"/etc/systemd/network/dhcp.
network"文件来进行设置.
例如:[Match]Name=en*[Network]DHCP=yes一个静态网络配置能够通过创建"/etc/systemd/network/static.
network"来设置.
比如:[Match]Name=en*[Network]Address=192.
168.
0.
15/24Gateway=192.
168.
0.
15.
4传统的网络连接和配置如果第5.
2节中描述的方法无法满足你的需要,那你应该使用结合了许多普通工具的传统网络连接和配置方法.
传统网络连接的每个方法都是特定的(参见第5.
5节).
用于Linux底层网络配置的程序有两种类型(参见第5.
8.
1节).
来自LinuxNET-3网络系统的旧net-tools程序(ifconfig(8)……).
它们中的大多数都已经过时了.
来自现在的Linux网络系统的新Linuxiproute2程序(ip(8)……).
尽管底层程序十分强大,但它们使用繁琐.
因此创建了高层网络配置系统.
ifupdown软件包是Debian中这种高层网络配置系统的实际标准.
它让你可以简单地通过例如"ifupeth0"这样的命令来打开网络.
它的配置文件位于"/etc/network/interfaces"中并且其典型内容如下.
Debian参考手册101/262autoloifaceloinetloopbackautoeth0ifaceeth0inetdhcpresolvconf软件包是为了使ifupdown系统支持自动重写解析器配置文件"/etc/resolv.
conf"来使网络地址解析平滑地重新配置.
现在,大多数Debian网络配置软件包都使用了resolvconf软件包(参见"/usr/share/doc/resolvcoifupdown软件包的辅助脚本,例如ifplugd、guessnet、ifscheme等,是为了进行网络环境的自动动态配置,例如位于有线局域网中的移动电脑.
这些相对来说比较难使用,但在当前的ifupdown系统下工作良好.
详细的案例参见第5.
6节和第5.
7节.
5.
5网络连接方式(传统)小心在这节描述的连接测试方式仅仅用于测试目的.
不应当直接用于日常的网络连接.
建议你使用NM,Wicd,或ifupdown包代替.
(参见第5.
2节和第5.
6节).
一台电脑典型的网络连接方式和连接路径,能够使用下面的内容概述.
PC连接方式连接路径串口(ppp0)PPPmodemPOTS拨号接入点ISP以太网口(eth0)PPPoE/DHCP/Static宽带-modem宽带链路宽带接入点ISP以太网口(eth0)DHCP/StaticLAN网络地址转换(NAT)的宽带路由器(宽带-modem…)Table5.
3:网络连接方式和连接路径列表每种连接方式配置脚本汇总.
连接方式配置后端包PPPpppconfig创建固定的chatpppconfig,pppPPP(选用)wvdialconf创建启发式的chatppp,wvdialPPPoEpppoeconf创建固定的chatpppoeconf,pppDHCP在"/etc/dhcp/dhclient.
conf"里描述isc-dhcp-client静态IP(IPv4)在"/etc/network/interfaces"里描述iproute或net-tools(旧)静态IP(IPv6)在"/etc/network/interfaces"里描述iprouteTable5.
4:网络连接配置列表网络连接缩略语意义如下.
注意通过电视线缆的广域网服务,通常使用DHCP或PPPoE.
ADSL和FTTP通常使用PPPoE.
你需要咨询你的互联网服务提供商来获得广域网连接使用的精确配置.
Debian参考手册102/262缩略语说明POTS普通老式电话服务BB宽带BB-service比如说,数字用户线路(DSL),电视线缆,光纤到户(FTTP)BB-modem比如说,DSLmodem,线缆modem,或光纤网络终端(ONT)LAN局域网WAN广域网DHCP动态主机配置协议PPP点到点协议PPPoE以太网上的点到点协议ISP互联网服务提供商Table5.
5:网络连接缩略语列表注意当宽带路由器用来搭建家庭局域网环境时,局域网上的电脑需要使用宽带路由器上的网络地址转换(NAT),来连接到广域网.
在这样的情况下,局域网上的电脑网络接口需使用静态IP或者宽带路由器提供的DHCP服务.
宽带路由器必须按ISP的指引来配置连接到广域网.
5.
5.
1以太网DHCP连接典型的现代家庭和小的商业网络,也就是局域网,使用一些消费等级的宽带路由器连接到广域网(因特网).
路由器后面的局域网通常使用路由器上运行的动态主机配置协议(DHCP)服务端提供的服务.
仅仅需要安装isc-dhcp-client包为以太网提供动态主机配置协议(DHCP)服务.
参见dhclient.
conf(5).
5.
5.
2以太网静态IP连接静态IP以太网不需要特别的配置动作.
5.
5.
3使用pppconfig的PPP连接配置脚本pppconfig配置PPP连接,仅需要交互式的选择下面内容.
电话号码ISP用户名ISP密码端口速率modem通信端口认证方式小心""是"互联网服务提供商",假设pon和poff命令调用时,没有参数.
Debian参考手册103/262文件功能/etc/ppp/peers/pppconfig生成针对的pppd配置文件/etc/chatscripts/pppconfig生成针对的chat配置文件/etc/ppp/optionspppd常用的执行参数/etc/ppp/pap-secretPAP的鉴权认证数据(有安全风险)/etc/ppp/chap-secretCHAP的鉴权认证数据(更安全)Table5.
6:使用pppconfig的PPP连接配置文件列表你可以使用下面的底层网络配置工具测试配置.
$sudopon.
.
.
$sudopoff参见"/usr/share/doc/ppp/README.
Debian.
gz".
5.
5.
4使用wvdialconf的另一种可选的PPP连接一个不同的使用pppd(8)方案是使用来自wvdial包的wvdial(1).
代替pppd运行chat(8)来拨号和协商连接,wvdial进行拨号和初始化协商,然后启动pppd进行余下操作.
配置脚本wvdialconf配置PPP连接,仅需要交互式的选择下面内容.
电话号码ISP用户名ISP密码在大部分情况下,wvdial能够成功建立连接并自动维护认证鉴权数据.
文件功能/etc/ppp/peers/wvdialwvdialconf生成针对wvdial的pppd配置文件/etc/wvdial.
confwvdialconf生成配置文件/etc/ppp/optionspppd常用的执行参数/etc/ppp/pap-secretPAP的鉴权认证数据(有安全风险)/etc/ppp/chap-secretCHAP的鉴权认证数据(更安全)Table5.
7:使用wvdialconf的PPP连接配置文件列表你可以使用下面的底层网络配置工具测试配置.
$sudowvdial.
.
.
$sudokillallwvdial参见wvdial(1)和wvdial.
conf(5).
5.
5.
5使用pppoeconf的PPPoE以太网连接当你的互联网提供商提供PPPoE连接,并且你决定把电脑直接连接到广域网,那你的电脑网络必须使用PPPoE来配置.
PPPoE表示以太网上的PPP.
配置脚本pppoeconf交互式的配置PPPoE连接.
配置文件在下面.
你可以使用下面的底层网络配置工具测试配置.
Debian参考手册104/262文件功能/etc/ppp/peers/dsl-providerpppoeconf生成针对pppoe的pppd配置文件/etc/ppp/optionspppd常用的执行参数/etc/ppp/pap-secretPAP的鉴权认证数据(有安全风险)/etc/ppp/chap-secretCHAP的鉴权认证数据(更安全)Table5.
8:使用pppoeconf的PPPoE连接配置文件列表$sudo/sbin/ifconfigeth0up$sudopondsl-provider.
.
.
$sudopoffdsl-provider$sudo/sbin/ifconfigeth0down参见"/usr/share/doc/pppoeconf/README.
Debian".
5.
6使用ifupdown进行基本网络配置(旧)Debian系统上的传统TCP/IP网络搭建,ifupdown软件包是作为一个上层工具来使用.
有两个典型场景.
像移动电脑上的动态IP系统,你可以使用resolvconf包搭建TCP/IP网络,它能够使你快速切换你的网络配置(参见第5.
6.
4节).
像服务器上的静态IP系统,你不需要resolvconf包来搭建你的TCP/IP网络,并保持你的系统简单(参见第5.
6.
5节).
如果你想设置高级配置,这些传统的设置方法,是相当有用的.
在下面的内容中发现细节.
ifupdown包提供Debian系统中标准的高层网络配置框架.
在本节中,我们通过ifupdown的简单介绍和许多典型列子来学习基本的网络配置.
5.
6.
1简单的命令语法ifupdown包包含有两个命令:ifup(8)和ifdown(8).
它们提供专注于"/etc/network/interfaces"配置文件的上层网络配置.
命令操作ifupeth0如果"ifaceeth0"节存在,使用eth0的配置来启动网络接口eth0ifdowneth0如果"ifaceeth0"节存在,使用eth0的配置来关闭网络接口eth0Table5.
9:使用ifupdown进行基本网络配置的命令列表警告请不要使用ifconfig(8)和ip(8)这类的底层网络配置工具命令来配置一个up状态的接口.
注意并没有一个叫ifupdown的命令.
Debian参考手册105/2625.
6.
2"/etc/network/interfaces"基本语法在interfaces(5)里解释的"/etc/network/interfaces"关键语法,能够用下面的表格概括.
节说明"auto"当系统启动时,启动接口"allow-auto"同上"allow-hotplug"当内核从接口检测到一个热拔插事件时,启动接口"iface…"开头的行定义的网络配置"mapping"开头的行定义的映射值来匹配"#"号开始的行像注释一样忽略(行尾注释不被支持)"\"反斜杠结尾的行扩展配置到下一行Table5.
10:"/etc/network/interfaces"里面的节列表以iface开头行的节,有下面的语法.
iface.
.
.
对于基本配置,mapping节没有被使用,你可以使用网络接口名作为网络配置名.
(参见第5.
7.
5节).
警告在"/etc/network/interfaces"里,不要为一个网络接口重复定义"iface"节.
5.
6.
3回环网络接口在启动系统的时候,"/etc/network/interfaces"文件里下面的配置条目启动了回环网络接口lo.
(通过auto节).
autoloifaceloinetloopback这节内容在"/etc/network/interfaces"文件里面一直存在.
5.
6.
4使用DHCP的网络接口按第5.
5.
1节准备系统后,在"/etc/network/interfaces"里面,按下面的内容创建配置条目后,网络接口的DHCP便配置好了.
allow-hotplugeth0ifaceeth0inetdhcp当Linux内核检测到物理接口eth0,allow-hotplug节促使ifup启动接口,iface促使ifup使用DHCP来配置接口.
Debian参考手册106/2625.
6.
5使用静态IP地址的网络接口在"/etc/network/interfaces"文件里面创建配置条目,来配置静态IP网络接口.
如下所示.
allow-hotplugeth0ifaceeth0inetstaticaddress192.
168.
11.
100netmask255.
255.
255.
0gateway192.
168.
11.
1dns-domainexample.
comdns-nameservers192.
168.
11.
1当Linux内核检测到eth0,allow-hotplug节促使ifup启动接口,iface节促使ifup使用静态IP来配置接口.
这里,我假设下面的配置.
局域网的IP地址范围:192.
168.
11.
0-192.
168.
11.
255网关的IP地址:192.
168.
11.
1电脑的IP地址:192.
168.
11.
100resolvconf包:已安装域名:"example.
com"DNS服务器的IP地址:192.
168.
11.
1当resolvconf包没有安装时,DNS相关的配置,需要按下面的方式手工编辑"/etc/resolv.
conf".
nameserver192.
168.
11.
1domainexample.
com小心用在上面例子里的IP地址,不意味着照抄.
你应当按你实际网络配置调整IP地址.
5.
6.
6无线局域网接口基础无线LAN(简称WLAN)提供快速的无线连接,使用基于IEEE802.
11标准集的非授权无线宽带扩频通信技术.
无线接口跟以太网接口非常像,但在初始化时,要求提供一些网络ID和密钥数据.
他们的上层网络工具差不多和以太网接口一样,除开接口名有一点点不同,按使用的不同内核驱动,像eth1,wlan0,ath0,wifi0……提示wmaster0设备是主设备,它仅仅只是新的mac80211LinuxAPI里,SoftMAC使用的一个内部设备.
这里有一些需要记住的WLAN关键词.
实际选择使用的协议是由你配置的无线路由器所限制.
Debian参考手册107/262缩略语全称说明NWIDNetworkID802.
11之前WaveLAN网络使用的16位网络号(强烈不赞成使用)(E)SSID(Extended)ServiceSetIdentifier无线接入点(APs)的网络名称,互连形成一个完整的802.
11无线局域网,域名IDWEP,(WEP2)WiredEquivalentPrivacy使用40位密钥的第一代64位(128位)无线加密标准(不赞成使用)WPAWi-FiProtectedAccess第二代无线加密标准(实现大部分802.
11i),和WEP兼容WPA2Wi-FiProtectedAccess2第三代无线加密标准(完全的802.
11i),与WEP不兼容Table5.
11:WLAN缩写词列表5.
6.
7使用WPA/WPA2的无线局域网接口你需要安装wpasupplicant包来支持WLAN使用新的WPA/WPA2.
使用DHCP的无线局域网连接,"/etc/network/interfaces"文件的条目需要按下面的内容设置.
allow-hotplugath0ifaceath0inetdhcpwpa-ssidhomezone#hexadecimalpskisencodedfromaplaintextpassphrasewpa-psk000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f参见"/usr/share/doc/wpasupplicant/README.
modes.
gz".
5.
6.
8使用WEP的无线局域网接口你需要安装wireless-tools包来支撑老的WEP无线局域网.
(你的消费等级的路由器可能仍然使用不安全的架构,但这总比没有好.
)小心请注意:WEP无线局域网上的网络流量,可以被其他人监听.
使用DHCP的无线局域网连接,"/etc/network/interfaces"文件的条目需要按下面的内容设置.
allow-hotplugeth0ifaceeth0inetdhcpwireless-essidHomewireless-key10123-4567-89ab-cdefwireless-key212345678wireless-key3s:passwordwireless-defaultkey2wireless-keymodeopen参见"/usr/share/doc/wireless-tools/README.
Debian".
5.
6.
9PPP连接你需要按之前的描述配置PPP连接(参见第5.
5.
3节).
然后,按下面的方式给第一个PPP设备ppp0增加"/etc/network/int文件里的条目.
Debian参考手册108/262ifaceppp0inetpppprovider5.
6.
10另一种PPP连接你需要按之前的描述先配置好使用wvdial的另外一种PPP连接(参见第5.
5.
4节).
然后,按下面的方式给第一个PPP设备ppp0增加"/etc/network/interfaces"文件里的条目.
ifaceppp0inetwvdial5.
6.
11PPPoE连接使用PPPoE直接连接到广域网的电脑,你需要按之前的描述用PPPoE连接配置系统(参见第5.
5.
5节).
然后,按下面的方式给第一个PPPoE设备eth0增加"/etc/network/interfaces"文件里的条目.
allow-hotplugeth0ifaceeth0inetmanualpre-up/sbin/ifconfigeth0upupifupppp0=dsldownifdownppp0=dslpost-down/sbin/ifconfigeth0down#Thefollowingisusedinternallyonlyifacedslinetpppproviderdsl-provider5.
6.
12ifupdown网络配置状态"/etc/network/run/ifstate"文件保存了由ifupdown软件包管理的当前所有的活动网络接口的期望状态.
但不幸的是,即使ifupdown系统没有按期望的启动某个网络接口,"/etc/network/run/ifstate"文件仍然会把它列为激活状态.
如果对一个网络接口的ifconfig(8)命令输出没有如下列子中的一行,那它就不能够作为IPV4网络的一部分使用.
inetaddr:192.
168.
11.
2Bcast:192.
168.
11.
255Mask:255.
255.
255.
0注意对于连接到PPPoE的以太网设备,ifconfig(8)命令的输出看起来像上面的列子.
5.
6.
13网络重新配置基础当你试图重新配置接口,如eth0时,你必须首先用"sudoifdowneth0"命令关闭它.
这将从"/etc/network/run/ifsta文件里面移除eth0条目.
(如果eth0之前没有被适当配置,或没有激活,这个命令将导致出现一些错误信息.
迄今为止,对于简单的单用户工作站,在任何时间执行这个操作,看起来都是安全的.
)你现在可以按需要重新配置网络接口eth0,重写"/etc/network/interfaces"文件的内容.
然后,你可以使用"sudoifupeth0"命令,重新激活eth0.
提示你可以简单的执行"sudoifdowneth0;sudoifupeth0"来初始化或重新初始化网络接口.
Debian参考手册109/2625.
6.
14ifupdown-extra包ifupdown-extra包提供简易的网络连接测试,和ifupdown包一道使用.
network-test(1)命令能够在shell里使用.
自动脚本将运行每一个ifup执行的命令.
network-test命令把你从麻烦的执行分析网络问题的底层命令中解放出来.
自动脚本安装在"/etc/network/*/"并执行下面的操作.
检查网络线缆连接检查重复IP地址使用按"/etc/network/routes"的定义,建立系统静态路由检查网络的网关是否可以到达在"/var/log/syslog"文件里面记录结果系统日志记录对管理远程系统的网络问题非常有用.
提示ifupdown-extra包的自动化行为是由"/etc/default/network-test"来配置.
部分自动化检查,会减慢一点系统启动速度,因为这些脚本需要一些时间来监听ARP答复.
5.
7使用ifupdown的高级网络配置(旧)ifupdown软件包,使用其高级用法,其功能就能够超出在第5.
6节所描述的内容.
描述在这里的这些功能是完全可选的.
我,由于懒惰和极简主义,几乎不使用这些令人烦扰的东西.
小心如果你不能够通过第5.
6节里的信息建立网络连接,使用下面的信息,你就会使你的情形变得比较糟糕.
5.
7.
1ifplugd软件包ifplugd软件包是一个老的自动网络配置工具,它仅能够管理以太网连接.
解决了移动PC等拔插以太网线缆的问题.
如果你有安装NetworkManager或Wicd(参见第5.
2节),就不需要这个软件包.
这个软件包运行一个后台守护进程(daemon)来代替auto或allow-hotplug的功能(参见表5.
10),并启动网络连接上的接口.
以太网端口怎样使用ifplugd软件包,比如eth0,请看下面.
1.
删除"/etc/network/interfaces"里面的节:"autoeth0"或"allow-hotplugeth0".
2.
保留"/etc/network/interfaces"里的节:"ifaceeth0inet…"和"mapping…".
3.
安装ifplugd软件包.
4.
运行"sudodpkg-reconfigureifplugd".
Debian参考手册110/2625.
把eth0作为"由ifplugd监控的静态网卡".
现在,网络按你希望的方式重新配置了.
在打开电源或发现硬件的时候启动,接口不会自己启动自己.
–快速启动过程,没有长的DHCP等待时间.
–没有适当IPv4地址的接口不会被滑稽的激活(参见第5.
6.
12节).
发现以太网线缆时,启动接口.
在拔掉以太网线缆后启动一段时间,然后接口自动关闭.
在插入另外的以太网线缆时,接口在新的网络环境下启动.
提示ifplugd(8)命令的参数能够设置其行为,比如说重新配置接口的延时.
5.
7.
2ifmetric软件包ifmetric软件包使我们能够根据经验来维护路由度量值,即使是DHCP的路由度量值.
下面设置eth0接口的值,让其在有wlan0接口的情况下,更加适当.
1.
安装ifmetric软件包.
2.
在"/etc/network/interfaces"里,增加一行"metric0",紧挨着放在"ifaceeth0inetdhcp"这行下面.
3.
在"/etc/network/interfaces"里,增加一行"metric1",紧挨着放在"ifacewlan0inetdhcp"这行下面.
metric0意味着最高路由优先级,是默认值.
大的metric值意味着较低的路由优先级.
具有最低metric值的活动的接口IP地址,成为原始路由.
参见ifmetric(8).
5.
7.
3虚拟接口单个物理以太网接口能够配置为使用不同的IP地址的多个虚拟接口.
这样做的目的,通常是把接口连接到几个IP子网.
比如说,只有一个网卡的基于IP地址的虚拟web主机,就是这样一个应用.
举个例子,让我们假设下面的情况.
你主机上的单个以太网接口连接到以太网集线器(不是宽带路由器).
以太网集线器同时连接到互联网和本地局域网.
局域网使用子网192.
168.
0.
x/24.
你主机的物理接口eth0使用DHCP提供的IP地址来连接互联网.
你的主机使用192.
168.
0.
1作为局域网的虚拟接口eth0:0的地址.
"/etc/network/interfaces"里下面的节配置你的网络.
Debian参考手册111/262ifaceeth0inetdhcpmetric0ifaceeth0:0inetstaticaddress192.
168.
0.
1netmask255.
255.
255.
0network192.
168.
0.
0metric1小心虽然这个配置列子,并使用netfilter/iptables(参见第5.
10节)的网络地址转换(NAT),能够给只有单个网络接口的局域网提供廉价的路由器,但这样设置,没有真正的防火墙能力.
你应当使用2块物理网卡的NAT来使本地网络更安全,隔离不安全的互联网.
5.
7.
4高级命令语法ifupdown软件包提供高级网络配置,使用网络配置名和网络接口名.
我使用的术语和ifup(8)以及interfaces(5)有少量不同.
man手册页术语本文术语下面文本的列子说明物理接口名网络接口名lo,eth0,Linux内核给出的名字(使用udev机制)逻辑接口名网络配置名config1,config2,在"/etc/network/interfaces"里紧跟着iface的名字Table5.
12:网络设备术语列表在第5.
6.
1节里的基本网络配置命令,需要网络配置名来标识匹配"/etc/network/interfaces"里iface节的网络接口名.
高级网络配置命令能够按下面的方式区分"/etc/network/interfaces"里的网络配置名和网络接口名.
命令操作ifupeth0=config1使用配置config1启动网络接口eth0ifdowneth0=config1使用配置config1关闭网络接口eth0ifupeth0使用mapping节选择的eth0配置启动网络接口ifdowneth0使用mapping节选择的eth0配置关闭网络接口Table5.
13:ifupdown高级网络配置命令列表5.
7.
5映射节mappingstanza为了避免复杂,我们在第5.
6.
2节里省略了解释"/etc/network/interfaces"里的mapping节.
mappingscriptmapmapmap.
.
.
Debian参考手册112/262这给/etc/network/interfaces文件提供了一个高级特征,可以自动选择映射脚本定义的配置.
让我们来跟随下面的执行.
$sudoifupeth0当""匹配"eth0",这个执行过程执行下面的命令来自动配置eth0.
$sudoifupeth0=$(echo-e'\n\n.
.
.
'|eth0←)这里,"map"脚本输入行是可选和可以重复的.
注意mapping节工作的匹配模式,类似于shell文件名匹配.
(参见第1.
5.
6节).
5.
7.
6手动的可切换网络配置以下是如何在几个网络配置中进行手动切换,而无需像第5.
6.
13节中那样重写"/etc/network/interfaces"文件.
对于你需要访问的所有网络配置,你需要在"/etc/network/interfaces"文件中像下面那样创建一个单独的节.
autoloifaceloinetloopbackifaceconfig1inetdhcpifaceconfig2inetstaticaddress192.
168.
11.
100netmask255.
255.
255.
0gateway192.
168.
11.
1dns-domainexample.
comdns-nameservers192.
168.
11.
1ifacepppoeinetmanualpre-up/sbin/ifconfigeth0upupifupppp0=dsldownifdownppp0=dslpost-down/sbin/ifconfigeth0down#Thefollowingisusedinternallyonlyifacedslinetpppproviderdsl-providerifacepotsinetpppproviderprovider请注意,iface后面标识的网络配置名称不用于标识网络接口名称.
另外,也没有auto或allow-hotplug节来根据事件自动启动网络接口eth0.
现在,你可以切换网络配置了.
让我们通过DHCP将你的PC移动到局域网.
你可以通过下列命令开启由网络配置名称(逻辑接口名称)config1指定的网络接口(物理接口)eth0.
$sudoifupeth0=config1Password:.
.
.
Debian参考手册113/262eth0接口已开启,由DHCP配置并连接到了局域网.
$sudoifdowneth0=config1.
.
.
eth0接口已关闭并断开局域网连接.
让我们通过静态IP使你的PC移动到局域网.
你可以通过下列命令开启由网络配置名称config2指定的网络接口eth0.
$sudoifupeth0=config2.
.
.
开启eth0接口,使用静态IP配置并连接到局域网.
像dns-*这样的额外参数会配置"/etc/resolv.
conf"的内容.
如果安装了resolvconf,"/etc/resolv.
conf"会更容易管理.
$sudoifdowneth0=config2.
.
.
eth0接口再次关闭并断开局域网连接.
让我们将你的PC移动到PPPoE服务器的BB-modem上的一个端口.
你可以通过下列命令开启由网络配置名称pppoe指定的网络接口eth0.
$sudoifupeth0=pppoe.
.
.
eth0接口已开启,由PPPoE配置直接连接到ISP.
$sudoifdowneth0=pppoe.
.
.
eth0接口再次关闭并断开连接.
让我们将你的PC移动到使用POTS和modem的位置,而非局域网或BB-modem.
你可以通过下列命令开启由网络配置名称ppp0指定的网络接口eth0.
$sudoifupppp0=pots.
.
.
开启ppp0接口,并使用PPP连接到互联网.
$sudoifdownppp0=pots.
.
.
关闭ppp0接口并断开网络.
你应该检查"/etc/network/run/ifstate"文件,查看ifupdown系统当前网络配置的状态.
警告如果你有多个网络接口,你可能需要调整eth*、ppp*等的末尾数字.
5.
7.
7ifupdown系统的脚本ifupdown系统会自动运行安装在"/etc/network/*/"中的脚本,而且会传递环境变量给脚本.
这里,每一个环境变量,"$IF_",是在相应的选项名字和前增加"$IF_"来创建,把字母转换为大写字母,将中划线替换为下划线,忽略非字母数字的字符.
Debian参考手册114/262环境变量传递值"$IFACE"处理中的接口的物理名称(接口名称)"$LOGICAL"处理中的接口的逻辑名称(配置名称)"$ADDRFAM"接口的"$METHOD"接口的(例如"static")"$MODE"如果是ifup运行的,则值为"start";如果是ifdown运行的,则值为"stop""$PHASE"根据"$MODE",但有更细致的区分,共分为pre-up、post-up、pre-down和post-down阶段"$VERBOSITY"指示是否使用了"--verbose";是为1,否为0"$PATH"命令搜索路径:"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/s"$IF_"位于iface这节的相应选项值Table5.
14:ifupdown系统传递的环境变量提示,,和的说明,请参见第5.
6.
2节.
ifupdown-extra软件包(参见第5.
6.
14节)使用这些环境变量来扩展ifupdown软件包的功能.
ifmetric软件包(参见第5.
7.
2节)安装"/etc/network/if-up.
d/ifmetric"脚本,这个脚本通过"$IF_METRIC"变量来设置metric路由度量值.
guessnet软件包(参见第5.
7.
8节),提供简单和功能强大的框架,用于通过mapping映射机制自动选择网络配置,这个软件包也使用了这些环境变量.
注意使用这些环境变量进行个性化网络配置的列子,你可以查看"/usr/share/doc/ifupdown/examples/*"里的列子脚本,以及ifscheme和ifupdown-scripts-zg2软件包使用的脚本.
这些额外的脚本有部分功能和ifupdown-extra与guessnet软件包的基本功能重叠.
如果你安装了这些额外脚本,你应当个性化这些脚本来避免互相影响.
5.
7.
8guessnetMapping映射为了替代在第5.
7.
6节描述的手工选择配置,你可以使用在第5.
7.
5节描述的映射机制,自动选择个性化脚本来进行配置网络.
guessnet软件包提供的guessnet-ifupdown(8)命令,是被设计作为映射脚本,并提供强力框架来增强ifupdown系统.
在iface节下的每一个网络配置,列出测试条件作为guessnet选项的值.
映射机制选择第一个没有错误结果的iface作为网络配置.
guessnet-ifupdown使用的映射脚本和ifupdown的原始网络配置架构,这两种对"/etc/network/interfaces"文件的用法,不会造成负面的影响,因为guessnet选项仅仅只导出额外的环境变量到ifupdown系统运行的脚本.
细节参见guessnet-ifupdown(8).
注意当多个guessnet选项行需要在"/etc/network/interfaces"里出现时,选项行使用guessnet1,guessnet2,这类的开头,因为ifupdown软件包不允许选项行开头字符串重复.
Debian参考手册115/2625.
8底层网络配置5.
8.
1Iproute2命令Iproute2命令集提供完整的底层网络配置能力.
有个从旧的net-tools命令集到新的iproute2命令集的转换表.
旧的net-tools新的iproute2操作ifconfig(8)ipaddr一个设备上的协议(IP或IPv6)地址route(8)iproute路由表条目arp(8)ipneighARP或NDISC缓存条目ipmaddripmaddr多播地址iptunneliptunnelIP隧道nameif(8)ifrename(8)基于MAC地址的网络接口名mii-tool(8)ethtool(8)以太网设备设置Table5.
15:从旧的net-tools命令集到新的iproute2命令集转换表参见ip(8)和IPROUTE2工具套件Howto.
5.
8.
2安全的底层网络操作你可以按下面的方式安全的使用底层网络命令,这些命令不会改变网络配置.
命令说明ifconfig显示活动的网络接口连接和地址状态ipaddrshow显示活动的网络接口连接和地址状态route-n用数字地址显示全部路由表iprouteshow用数字地址显示全部路由表arp显示当前ARP缓存表的内容ipneigh显示当前ARP缓存表的内容plog显示ppp后台守护进程(daemon)日志pingyahoo.
com检查到"yahoo.
com"的因特网连接whoisyahoo.
com在域名数据库里面检查谁注册了"yahoo.
com"tracerouteyahoo.
com跟踪到"yahoo.
com"的因特网连接tracepathyahoo.
com跟踪到"yahoo.
com"的因特网连接mtryahoo.
com跟踪到"yahoo.
com"的因特网连接(重复的)dig[@dns-server.
com]example.
com[{a|mx|any}]查询由"dns-server.
com"提供服务的"example.
com"域名的DNS记录:"a","mx"或"any"记录iptables-L-n查看包过滤netstat-a找出所有打开的端口netstat-l--inet找出监听端口netstat-ln--tcp找出TCP监听端口(数字的)dlintexample.
com查询"example.
com"的DNSzone信息Table5.
16:底层网络命令列表提示部分底层网络配置工具放在"/sbin/"目录.
你可以像"/sbin/ifconfig"这样使用完整命令路径,或把"/sbin"加到"~/.
bashrc"文件列出的"$PATH"环境变量里.
Debian参考手册116/2625.
9网络优化通用的网络优化超出了本文的范围.
我提及消费等级连接相关的主题.
软件包流行度大小说明iftopV:7,I:11597显示一个网络接口上的带宽使用信息iperfV:4,I:55263互联网协议带宽测量工具ifstatV:0,I:860接口统计监控bmonV:1,I:17146便携式带宽监视器和网速估计工具ethstatusV:0,I:540快速测量网络设备吞吐的脚本bingV:0,I:180实验性的随机带宽测试器bwm-ngV:2,I:1790小巧简单的控制台带宽监测器ethstatsV:0,I:023基于控制台的以太网统计监视器ipfmV:0,I:078带宽分析工具Table5.
17:网络优化工具列表5.
9.
1找出最佳MTU最大传输单元MaximumTransmissionUnit(MTU)的值能够通过加"-Mdo"选项的ping(8)实验来确定,它发送从1500字节(对于IP+ICMP包头,有28字节的偏移)大小开始的ICMP包,来找出IP不分片的最大包大小.
尝试下列例子$ping-c1-s$((1500-28))-Mdowww.
debian.
orgPINGwww.
debian.
org(194.
109.
137.
218)1472(1500)bytesofdata.
From192.
168.
11.
2icmp_seq=1FragneededandDFset(mtu=1454)---www.
debian.
orgpingstatistics---0packetstransmitted,0received,+1errors尝试1454代替1500你看到用1454ping(8)成功了.
这个过程是路径MTU(PMTU)发现(RFC1191),tracepath(8)命令能够自动完成这个.
提示上面的列子,PMTU的值是1454,这是我先前的光纤到户提供商,使用了异步传输模式AsynchronousTransferMode(ATM)作为他们的骨干网络,并使用PPPoE作为客户端.
实际PMTU值依赖于你的环境,比如说,我新的光纤到户提供商是1500.
网络环境MTU基本原理拨号连接(IP:PPP)576标准的以太网连接(IP:DHCP或固定)1500默认标准值以太网连接(IP:PPPoE)1492(=1500-8)PPP头部2字节和PPPOE头部6字节以太网连接(ISP骨干网:ATM,IP:DHCP或固定IP)1462(=48*31-18-8)作者推断:18字节的以太网头,8字节SAR尾(译注:SAR为ATM技术名词)以太网连接(ISP骨干:ATM,IP:PPPoE)1454(=48*31-8-18-8)参见"OptimalMTUconfigurationforPPPoEADSLConnections"来了解基本原理Table5.
18:最佳MTU值的基本指引方法除了这些基本的指引方法外,你还应当知道下面的信息.
Debian参考手册117/262使用任何隧道方式(VPN等.
)的最佳MTU需要进一步减去它们上面的头部.
MTU值不应当超过通过实验验证的PMTU值.
当遇到其它限制的时候,较大的MTU值通常比较好.
5.
9.
2设置MTU这里示例设置MTU值,从默认的1500设置到1454.
对于DHCP(参见第5.
6.
4节),你能够使用下面的方式替换"/etc/network/interfaces"文件里iface节相关的行.
ifaceeth0inetdhcppre-up/sbin/ifconfig$IFACEmtu1454对于静态IP(参见第5.
6.
5节),你能够使用下面的方式替换"/etc/network/interfaces"文件里iface节相关的行.
ifaceeth0inetstaticaddress192.
168.
11.
100netmask255.
255.
255.
0gateway192.
168.
11.
1mtu1454dns-domainexample.
comdns-nameservers192.
168.
11.
1对于直接PPPoE(参见第5.
5.
5节),你能够使用下面的方式替换"/etc/ppp/peers/dsl-provider"里"mtu"相关的行.
mtu1454最大分片大小(MSS)是另外一种衡量包大小的方法.
MSS和MTU的关系如下.
对于IPv4,MSS=MTU-40对于IPv6,MSS=MTU-60注意基于iptables(8)(参见第5.
10节)的优化,能够通过MSS来压缩包大小,路由器会用到MMS.
参见iptables(8)中的"TCPMSS".
5.
9.
3WANTCP优化TCP吞吐量能够通过调整TCP缓冲大小的参数来最大化,对现代大带宽和高延时的WAN,在"TCPTuningGuide"和"TCPtuning"里有描述.
到目前为止,当前Debian默认设置能够很好的服务好我的1Gbps光纤到户LAN连接.
5.
10Netfilter网络过滤框架Netfilter使用Linux内核模块(参见第3.
3.
1节)提供状态防火墙和网络地址转换(NAT)框架.
netfilter主要的用户层程序是iptables(8).
你能从shell手工交付式的配置netfilter,使用iptables-save(8)保存当前状态,当系统重启时,通过init脚本调用iptables-restore(8)来恢复.
像shorewall这样的配置帮助脚本能够使这个过程变得更简单.
参见http://www.
netfilter.
org/documentation/上的文档(或在"/usr/share/doc/iptables/html/"里面的文档).
Debian参考手册118/262软件包流行度大小说明iptablesV:300,I:9932520netfilter管理工具(iptables(8)用于IPv4,ip6tables(8)用于IPv6)arptablesV:0,I:296netfilter管理工具(arptables(8)用于ARP)ebtablesV:15,I:39265netfilter管理工具(ebtables(8)用于以太网桥)iptstateV:0,I:3116持续性监控netfilter状态(和top(1)相似)shorewall-initV:0,I:068Shoreline防火墙初始化shorewallV:5,I:132458Shoreline防火墙,netfilter配置文件生成器shorewall-liteV:0,I:065Shoreline防火墙,netfilter配置文件生成器(精简版)shorewall6V:1,I:2779Shoreline防火墙,netfilter配置文件生成器(IPv6版本)shorewall6-liteV:0,I:064Shoreline防火墙,netfilter配置文件生成器(IPv6,精简版)Table5.
19:防火墙工具列表LinuxNetworking-conceptsHOWTOLinux2.
4PacketFilteringHOWTOLinux2.
4NATHOWTO提示虽然这些是为Linux2.
4写的,iptables(8)命令和netfilter内核功能都能够在Linux2.
6和3.
x内核系列实现.
Debian参考手册119/262Chapter6网络应用建立网络连接后(参加第5章),你可以运行各种网络应用.
提示对于现代的Debian网络基础设施的具体说明,阅读Debian管理员手册——网络基础设施.
提示在某些ISP下,如果你启用"两步验证",你可能需要获取一个应用密码以从你的程序访问POP和SMTP服务.
你也可能需要事先允许你的主机IP进行访问.
6.
1网页浏览器有许多网页浏览器软件包,使用超文本传输协议(HTTP)访问远程内容.
软件包流行度大小类型网络浏览器说明chromiumV:51,I:141180040XChromium,(来自Google的开源浏览器)firefoxV:13,I:20205631同上Firefox,(来自Mozilla的开源浏览器,仅在DebianUnstable中可用)firefox-esrV:217,I:437198436同上FirefoxESR(Firefox延长支持版本)epiphany-browserV:4,I:243730同上GNOME,兼容HIG,EpiphanykonquerorV:18,I:10020763同上KDE,KonquerordilloV:1,I:71536同上Dillo,(基于FLTK的轻量级浏览器)w3mV:31,I:2842289文本w3mlynxV:13,I:981948同上LynxelinksV:6,I:281767同上ELinkslinksV:6,I:392249同上Links(纯文本)links2V:1,I:155417图像Links(没有X的控制台图像)Table6.
1:网页浏览器列表6.
1.
1浏览器配置在某些浏览器中,你可以使用下列特殊的URL来确认它们的设置.
Debian参考手册120/262"about:""about:config""about:plugins"Debian提供了在main档案库中提供了许多自由的浏览器插件软件包,不仅可以处理Java(软件平台)和Flash,也可以处理MPEG、MPEG2、MPEG4、DivX、WindowsMediaVideo(.
wmv)、QuickTime(.
mov)、MP3(.
mp3)、Ogg/Vorbis文件、DVD、VCD等等.
Debian也提供相关辅助程序,可以用来安装来自contrib或non-free的non-free浏览器插件软件包.
软件包流行度大小区域说明pepperflashplugin-nonfreeV:1,I:2129contribPepperFlashPlayer(胡椒Flash播放器)——浏览器插件browser-plugin-freshplayer-pepperflashI:91135contribPPAPI-hostNPAPI-plugin,pepperflash的适配器Table6.
2:浏览器插件软件包列表提示尽管使用上述的Debian软件包会更容易,但你依旧可以手动启用插件,你需要将"*.
so"文件安装到插件目录中(例如"/usr/lib/iceweasel/plugins/")并重启浏览器.
有些网站拒绝基于你所使用浏览器的用户代理字符串的连接.
你可以通过伪装用户代理字符串来解决这个问题.
例如,你可以添加下面这行到用户配置文件中(例如"~/.
gnome2/epiphany/mozilla/epiphany/user.
js"或"~/.
mozilla/firefox/*.
default/user.
js").
user_pref{"general.
useragent.
override","Mozilla/4.
0(compatible;MSIE7.
0;WindowsNT6.
0)←"};或者,你也可以通过输入"about:config"到URL,并右击它所显示的内容,来添加并重置这个变量.
小心伪装的用户代理字符串可以会导致来自Java的不良副作用.
6.
2邮件系统小心如果你想设置邮件服务器来直接通过互联网交换邮件,你应该最好阅读一下这个基本文档.
邮件系统涉及到运行在多个主机上的许多服务器程序和客户端程序.
从功能来说,有3种类型的邮件代理程序:邮件传输代理(MTA,参见第6.
3节),是不同主机之间传送邮件的程序.
邮件投递代理(MDA,参见第6.
6节),是传递信息到一台主机内的用户邮箱的程序.
邮件用户代理(MUA,也被称为电子邮件客户端,参见第6.
4节),是生成信息和访问传递的信息的程序.
注意对于那些消费者级网络连接的典型移动工作站,以下的配置例子是有效的.
Debian参考手册121/2626.
2.
1电子邮件基础电子邮件由三个部分组成,消息的信封,邮件标头及邮件正文.
SMTP用电子邮件信封上的"To"和"From"信息来投递邮件.
(信封上的"From"信息也被叫做退回地址,例如From_等等).
电子邮件头的"To"和"From"信息,显示在电子邮件客户端上.
(在大部分情况下,这些信息是跟电子邮件信封一致,但并不全是这样.
)为了处理正文数据类型及其编码,电子邮件客户端(MUA)需要用多用途互联网邮件扩展(MIME)来解释邮件标头和邮件正文.
6.
2.
2现代邮件服务基础为了尽可能减少垃圾邮件(不想要的和未经请求的电子邮件)的问题,许多提供消费者级互联网连接的ISP服务商正在采取应对措施.
智能主机服务于ISP的客户,使用rfc4409里面规定的(587)端口发送邮件,并使用在rfc4954里面规定的密码(SMTP认证服务).
内部的网络主机(除了ISP自己的发送邮件服务器)连接到互联网的SMTP25端口已经被封锁了.
从一些可疑的外部网络主机到ISP接收邮件服务器SMTP25端口的连接会被阻隔.
(连接来自用于拨号和其它消费等级互联网连接的动态IP地址范围,首先被阻隔.
)像域名密钥识别邮件(DKIM)、发信者策略框架(SPF)和基于域名的消息认证、报告和反应(DMARC)这样的反垃圾邮件技术广泛用于电子邮件过滤.
域名密钥识别邮件服务可能会用于你的通过smarthost的电子邮件发送.
智能主机可以在上面重写源电子邮件地址为你的邮件账户.
当配置电子邮件系统或解决邮递问题时,你必须考虑这些新的限制.
小心在消费者级的网络上运行SMTP服务器来直接发送邮件到远端可信赖主机是不现实的.
小心期望单个智能主机可靠的发送不相关的源邮件地址到远程主机,这是不现实的.
小心一个邮件能够被任何主机静悄悄的拒绝,即使路由到了目的地.
发送一个邮件到远程主机的可靠方法,就是使你的邮件尽可能的看起来是经过认证的.
鉴于这些不利的互联网情况和限制,像Yahoo.
com和Gmail.
com这样的独立互联网邮件ISP提供了安全的邮件服务,使用传输层安全协议(TLS)和它的前身,安全套接层协议(SSL)就可以在任何地方通过网络连接到这些邮件服务.
智能主机上的465端口服务,是过时的在SSL上的SMTP(SMTPS协议).
智能主机上的587端口服务使用STARTTLS协议.
TLS/POP3端口(995)是用POP3协议来接受邮件的.
为了简便起见,在接下来的文本中,我假定smarthost是"smtp.
hostname.
dom",需要SMTP认证并且使用带有STARTTLS协议的信息发送端口(587).
Debian参考手册122/2626.
2.
3工作站的邮件配置策略最简单的电子邮件配置是使用MUA发送邮件到ISP的smarthost,然后从ISP的POP3服务器接收邮件(参见第6.
4节).
这种类型的配置流行使用全功能的基于GUI的MUA,例如icedove(1),evolution(1)等等.
如果需要通过邮件的类型来过滤它们,你应该使用MUA的过滤功能.
对于这种情况,本地MTA(参见第6.
3节)只需在本地投递(当发送者和接收者在同一主机上).
请注意Debian是多用户系统.
即使你是唯一的用户,这里仍然有许多以root用户运行的程序并且它们会给你发送电子邮件.
另外可选的邮件配置是通过本地MTA发送邮件到ISP的smarthost,通过邮件检索(参见第6.
5节)从ISP的POP3服务器接受邮件,并把邮件保存到本地邮箱.
如果需要通过邮件的类型来过滤它们,你应该使用MDA的过滤功能(参见第6.
6节)来过滤邮件到单独的邮箱.
这种类型的配置流行使用基于终端的简单MUA,例如mutt(1),mew(1)等等,尽管使用任何MUA都是可以的(参见第6.
4节).
对于这种情况,本地MTA(参见第6.
3节)需要做smarthost投递和本地投递.
因为移动工作站没有有效的FQDN,你必须配置本地MTA来隐藏和伪装外发邮件中的真实本地邮件名称,来避免邮件投递错误(参见第6.
3.
3节).
提示你可能想要配置MUA/MDA来使用Maildir,以便存储邮件到你用户目录的某个位置.
6.
3邮件传输代理(MTA)对于一般的工作站而言,邮件传输代理(MTA)的主流选择是exim4-*或者postfix软件包,这由你决定.
软件包流行度大小说明exim4-daemon-lightV:342,I:3671493Exim4邮件传输代理(MTA:Debian默认的)exim4-baseV:349,I:3771704Exim4文档(文本)和通用文件exim4-doc-htmlI:13662Exim4文档(html)exim4-doc-infoI:1624Exim4文档(info)postfixV:145,I:1604182Postfix邮件传输代理(MTA:替代品)postfix-docI:94444Postfix文档(html+text)sasl2-binV:5,I:19428CyrusSASLAPI实现(实现postfixSMTP认证)cyrus-sasl2-docI:1575CyrusSASL-文档Table6.
3:用于工作站的基础的邮件传输代理相关的软件包列表尽管在流行度投票数上,exim4-*某些时候看起来要比postfix流行,但这并不意味着postfix在Debian开发者中不流行.
Debian服务器系统使用exim4和postfix.
著名的Debian开发者发到邮件列表的帖子的邮件标头分析的结果也表明这两种MTA一样受欢迎.
exim4-*软件包最为人所知的是,有着非常小的内存消耗和非常灵活的配置.
postfix软件包最为人所知的是,它的简洁、快速、简单和安全的特性.
这两种工具都带有充足的文档,在质量和许可证上都同样是不错的.
在Debian档案库里,有许多不同性能和不同关注点的邮件传输代理(MTA)软件包可供选择.
6.
3.
1exim4的配置小心配置exim4来发送互联网邮件,多个源电子邮件地址使用多个相应的智能主机,这是不寻常的.
对于popcon和cron这样的系统程序,配置exim4仅仅只使用一个电子邮件地址;对于mutt这样的用户程序,配置msmtp来使用多个源电子邮件地址.
Debian参考手册123/262软件包流行度大小性能和关注点exim4-daemon-lightV:342,I:3671493全功能postfixV:145,I:1604182全功能(安全)exim4-daemon-heavyV:7,I:81643全功能(灵活)sendmail-binV:14,I:151854全功能(如果你已经对它熟悉)nullmailerV:7,I:10479部分功能,没有本地邮件ssmtpV:8,I:112部分功能,没有本地邮件courier-mtaV:0,I:02416非常全功能(web接口等.
)masqmailV:0,I:0337轻量esmtpV:0,I:0128轻量esmtp-runV:0,I:032轻量(sendmail兼容扩展到esmtp)msmtpV:5,I:10547轻量msmtp-mtaV:3,I:486轻量(sendmail兼容扩展到msmtp)Table6.
4:Debian档案库中可供选择的邮件传输代理(MTA)软件包的列表对于那些通过smarthost的网络邮件,你应该按如下所示的(重新)配置exim4-*软件包.
$sudo/etc/init.
d/exim4stop$sudodpkg-reconfigureexim4-config配置"Generaltypeofmailconfiguration"时,选择"mailsentbysmarthost;receivedviaSMTPorfetchmail".
设置"Systemmailname:"为默认的FQDN(参见第5.
1.
1节).
设置"IP-addressestolistenonforincomingSMTPconnections:"为默认的"127.
0.
0.
1;::1".
"Otherdestinationsforwhichmailisaccepted:"选项留空.
"Machinestorelaymailfor:"选项留空.
设置"IPaddressorhostnameoftheoutgoingsmarthost:"为"smtp.
hostname.
dom:587".
设置"Hidelocalmailnameinoutgoingmail"选项为"".
(或者像第6.
3.
3节描述的那样使用/etc/email-addresses"代替)选择如下所示的其中一个来回答"KeepnumberofDNS-queriesminimal(Dial-on-Demand)".
"No"如果启动的时候,系统就连上了互联网.
"Yes"如果启动的时候,系统没有连上互联网.
设置"Deliverymethodforlocalmail:"选项为"mboxformatin/var/mail/".
"Splitconfigurationintosmallfiles:"选项设为"".
通过修改"/etc/exim4/passwd.
client"文件,来创建用于smarthost的密码条目.
$sudovim/etc/exim4/passwd.
client.
.
.
$cat/etc/exim4/passwd.
client^smtp.
*\.
hostname\.
dom:username@hostname.
dom:password通过如下所示的启动exim4.
$sudo/etc/init.
d/exim4start"/etc/exim4/passwd.
client"文件中的主机名不应该是别名,你应该按如下所示的检查真正的主机名.
Debian参考手册124/262$hostsmtp.
hostname.
domsmtp.
hostname.
domisanaliasforsmtp99.
hostname.
dom.
smtp99.
hostname.
domhasaddress123.
234.
123.
89我在"/etc/exim4/passwd.
client"文件中使用正则表达式来绕过别名问题.
即使ISP更改了别名所指向的主机名,SMTPAUTH还是可能工作的.
你能够通过如下所示的手动更新exim4配置:更新"/etc/exim4/"目录下的exim4配置文件.
–创建"/etc/exim4/exim4.
conf.
localmacros"来设置宏命令和修改"/etc/exim4/exim4.
conf.
template"文件.
(没有分割的配置)–在"/etc/exim4/exim4.
conf.
d"子目录中创建新文件或编辑已存在的文件.
(分割的配置)运行"invoke-rc.
dexim4reload"命令.
请阅读"/usr/share/doc/exim4-base/README.
Debian.
gz"官方指导和update-exim4.
conf(8).
小心如果debconf询问"KeepnumberofDNS-queriesminimal(Dial-on-Demand)"这个问题时,选择了"No"(默认值),那么启动exim4会花很长时间并且系统在启动的时候不会连接到互联网.
警告虽然你的ISP允许,但是使用没有加密的明文密码是不安全的.
提示尽管推荐在587端口上使用STARTTLS的SMTP协议,但是有些ISP仍然使用废弃的SMTPS协议(在465端口上的SSL).
4.
77版本以后的Exim4支持在客户端和服务器上的废弃SMTPS协议.
提示如果你正在为笔记本电脑寻找一个遵守"/etc/aliases"规则的轻量MTA,你应该考虑配置exim4(8),在"/etc/default/exim4"文件中写入"QUEUERUNNER='queueonly'","QUEUERUNNER='nodaemon'"等等.
6.
3.
2带有SASL的postfix配置对于通过smarthost的网络邮件,你应该首先阅读postfix文档和关键的手册页.
你应该按如下所示的(重新)配置postfix和sasl2-bin软件包.
$sudo/etc/init.
d/postfixstop$sudodpkg-reconfigurepostfix选择"Internetwithsmarthost".
设置"SMTPrelayhost(blankfornone):"为"[smtp.
hostname.
dom]:587"并按如下所示配置.
Debian参考手册125/262命令功能postfix(1)Postfix控制程序postconf(1)Postfix配置工具postconf(5)Postfix配置参数postmap(1)Postfix查找表维护postalias(1)Postfix别名数据库维护Table6.
5:重要的postfix手册页列表$sudopostconf-e'smtp_sender_dependent_authentication=yes'$sudopostconf-e'smtp_sasl_auth_enable=yes'$sudopostconf-e'smtp_sasl_password_maps=hash:/etc/postfix/sasl_passwd'$sudopostconf-e'smtp_sasl_type=cyrus'$sudovim/etc/postfix/sasl_passwd为smarthost创建密码条目.
$cat/etc/postfix/sasl_passwd[smtp.
hostname.
dom]:587username:password$sudopostmaphush:/etc/postfix/sasl_passwd通过如下所示的启动postfix.
$sudo/etc/init.
d/postfixstartdpkg-reconfigure会话中使用的"["和"]"和"/etc/postfix/sasl_passwd"确保不去检查MX记录而是直接使用指定的明确主机名.
参见"/usr/share/doc/postfix/html/SASL_README.
html"里面的"EnablingSASLauthenticationinthePostfixSMTPclient"条目.
6.
3.
3邮件地址配置这里有一些用于邮件传输、投递和用户代理的邮件地址配置文件.
文件功能应用/etc/mailname用于(外发)邮件的默认主机名Debian专用的,mailname(5)/etc/email-addresses用于外发邮件的主机名伪装exim(8)专用的,exim4-config_files(5)/etc/postfix/generic用于外发邮件的主机名伪装postfix(1)专用的,postmap(1)命令执行后激活.
/etc/aliases用于接收邮件的账户别名通用的,newaliases(1)命令执行后激活.
Table6.
6:与邮件地址相关的配置文件列表"/etc/mailname"文件中的mailname通常是全称域名(FQDN),这个全程域名将会被解析成主机的IP地址.
对于没有可解析成IP地址的主机名的移动工作站,设置mailname为"hostname-f"的值.
(这对于exim4-*和postfix都是安全有效的选择.
)提示"/etc/mailname"中的内容被许多非MTA程序用作它们的默认行为.
对于mutt,在~/muttrc文件中设置"hostname"和"from"变量来覆盖mailname值.
对于devscripts软件包的程序,例如bts(1)和dch(1),导出环境变量"$DEBFULLNAME"和"$DEBEMAIL"的值来覆盖它.
Debian参考手册126/262提示popularity-contest软件包一般以FQDN形式的root账户发送邮件.
你需要像/usr/share/popularity-contest/default.
conf文件中描述的那样去设置/etc/popularity-contest.
conf文件中的MAILFROM值.
否则,你的邮件会被smarthostSMTP服务器拒绝.
尽管这些过程很乏味,这种方法比为所有通过MTA并且是以root用户发送的邮件重写源地址更安全.
这也可以被其他守护进程或者是cron脚本使用.
当设置mailname为"hostname-f"的值时,通过MTA的源邮件地址的伪装可以通过如下所示的来实现.
用于exim4(8)的"/etc/email-addresses"文件,exim4-config_files(5)手册页中有关于它的解释用于postfix(1)的"/etc/postfix/generic"文件,generic(5)手册页中有关于它的解释对于postfix,接下来的额外步骤需要执行.
#postmaphash:/etc/postfix/generic#postconf-e'smtp_generic_maps=hash:/etc/postfix/generic'#postfixreload你能够通过如下所示的来测试邮件地址配置.
exim(8)用-brw,-bf,-bF,-bV,.
.
.
选项postmap(1)用-q选项.
提示Exim带有一些有用的程序,例如exiqgrep(8)和exipick(8).
参见"dpkg-Lexim4-base|grepman8/"来获得可用的命令.
6.
3.
4基础MTA操作这里有一些基础的MTA操作.
有一些可能会通过sendmail(1)的兼容性接口来实现.
exim命令postfix命令说明sendmailsendmail从标准输入读取邮件并且安排投递(-bm)mailqmailq列出带有状态和队列ID的邮件队列(-bq)newaliasesnewaliases初始化别名数据库(-I)exim4-qpostqueue-f刷新等待邮件(-q)exim4-qfpostsuper-rALLdeferred;postqueue-f刷新所有邮件exim4-qffpostsuper-rALL;postqueue-f刷新甚至已经冻结的邮件exim4-Mgqueue_idpostsuper-hqueue_id通过邮件的队列ID来冻结它exim4-Mrmqueue_idpostsuper-dqueue_id通过邮件的队列ID来移除它N/Apostsuper-dALL移除所有邮件Table6.
7:基础MTA操作列表提示往"/etc/ppp/ip-up.
d/*"里写一个刷新所有邮件的脚本会是个不错的主意.
Debian参考手册127/2626.
4邮件用户代理(MUA)如果你订阅了Debian相关的邮件列表,使用像mutt和mew这样的MUA会是个不错主意,同时对用户来说,它们也是事实上的标准并且可以像预期的那样工作良好.
软件包流行度大小类型evolutionV:31,I:229475XGUI程序(GNOME3,groupware套件)thunderbirdV:57,I:138165180XGUI程序(GNOME2,无品牌的MozillaThunderbird)kmailV:34,I:8818011XGUI程序(KDE)muttV:37,I:3137056很有可能与vim一起使用的字符终端程序mewV:0,I:02325(x)emacs下的字符终端程序Table6.
8:邮件用户代理列表(MUA)6.
4.
1基础MUA—Mutt按如下所示的自定义"~/.
muttrc",与vim结合使用邮件用户代理(MUA)软件mutt.
##Userconfigurationfiletooverride/etc/Muttrc##spoofsourcemailaddresssetuse_fromsethostname=example.
domsetfrom="NameSurname"setsignature="~/.
signature"#vim:"gq"toreformatquotesseteditor="vim-c'settw=72etft=mail'"#"mutt"goestoInbox,while"mutt-y"listsmailboxessetmbox_type=Maildir#useqmailMaildirformatforcreatingmboxsetmbox=~/Mail#keepallmailboxesin$HOME/Mail/setspoolfile=+Inbox#maildeliveredto$HOME/Mail/Inboxsetrecord=+Outbox#savefccmailto$HOME/Mail/Outboxsetpostponed=+Postponed#keeppostponedin$HOME/Mail/postponedsetmove=no#donotmoveInboxitemstomboxsetquit=ask-yes#donotquitby"q"onlysetdelete=yes#alwaysdeletew/oaskingwhileexitingsetfcc_clear#storefccasnonencrypted#MailboxesinMaildir(automaticupdate)mailboxes'cd~/Mail;/bin/ls-1|sed-e's/tr"\n"""'unmailboxesMaillog*.
ev-summary##Default#setindex_format="%4C%Z%{%b%d}%-15.
15L(%4l)%s"##Threadindexwithsenders(collapse)setindex_format="%4C%Z%{%b%d}%-15.
15n%M(#%03M)&(%4l)%s"##Default#setfolder_format="%2C%t%N%F%2l%-8.
8u%-8.
8g%8s%d%f"##justfoldernamessetfolder_format="%2C%t%N%f"增加下面的内容到"/etc/mailcap"或"~/.
mailcap"来内镶显示HTML邮件和微软Word.
Debian参考手册128/262text/html;lynx-force_html%s;needsterminal;application/msword;/usr/bin/antiword'%s';copiousoutput;description="MicrosoftWordText←";nametemplate=%s.
doc提示Mutt能够作为IMAP客户端和mailbox格式转换器.
你可以使用"t","T"等标识邮件.
这些标识的邮件能够使用";C"在不同的邮箱之间拷贝,并可以使用";d"来一次性删除.
6.
4.
2高级MUA—Mutt+msmtpMutt能够使用msmtp来配置多个源电子邮件地址使用多个相应的智能主机.
提示Msmtp是一个sendmail模拟器,它允许和其它提供/usr/sbin/sendmail命令的sendmail模拟器一起安装.
所以你可以保留你系统上的邮件系统为exim4或postfix.
让我们考虑支持3个电子邮件地址作为例子:"MyName1""MyName2""MyName3"一个定制的~/.
muttrc例子,支持3个智能主机用于3个不同的源电子邮件地址.
setuse_fromsetfrom="MyName3"setreverse_namealternatesmyaccount1@gmail\.
com|myaccount1@gmail\.
com|myaccount3@example\.
org#.
.
.
#MACROmacrocompose"1""^UMyName1\\n"macrocompose"2""^UMyName2\\n"macrocompose"3""^UMyName3\\n"send2-hook'~fmyaccount1@gmail.
com'"setsendmail='/usr/bin/msmtp--read-envelope-from'"send2-hook'~fmyaccount2@gmail.
com'"setsendmail='/usr/bin/msmtp--read-envelope-from'"send2-hook'~fmyaccount3@example.
org'"setsendmail='/usr/bin/msmtp--read-envelope-from←'"#.
.
.
让我们来安装msmtp-gnome并按下面的方式设置~/.
msmtprc.
defaultslogfile~/.
msmtp.
logdomainmyhostname.
example.
orgtlsontls_starttlsontls_certcheckontls_trust_file/etc/ssl/certs/ca-certificates.
crtDebian参考手册129/262authonport587auto_fromaccountmyaccount1@gmail.
comhostsmtp.
gmail.
comfrommyaccount1@gmail.
comusermyaccount1@gmail.
comaccountmyaccount2@gmail.
comhostsmtp.
gmail.
comfrommyaccount2@gmail.
comusermyaccount2@gmail.
comaccountmyaccount3@example.
orghostmail.
example.
orgfrommyaccount3@example.
orgusermyaccount3@example.
orgaccountdefault:myaccount3@example.
org然后,增加密码数据到Gnome钥匙环.
例如:$secret-toolstore--label=msmtp\hostsmtp.
gmail.
com\servicesmtp\usermyaccount1@gmail.
com.
.
.
提示如果你不想使用Gnome钥匙环,你可以通过安装msmtp软件包来代替,在~/.
msmtprc文件里面,给每一个账号增加一个类似"passwordsecret123"的条目.
更多信息请参见memtp文档.
6.
5远程邮件检索和转发实用工具而不是手动运行MUA去访问远程邮件并去处理它们,你可能希望自动化这些过程,然后把所有邮件都投递到本地.
远程邮件检索和转发实用工具很适合你使用.
尽管fetchmail(1)已经成为GNU/Linux用于远程邮件检索的事实上的标准,作者现在还是喜欢getmail(1).
如果你想要在下载邮件之前拒绝邮件来达到节省带宽的目的,mailfilter或mpop工具可能是很有用的.
不管使用哪种邮件检索实用程序,配置系统使之能够投递已检索的邮件到MDA会是个不错的主意,例如通过管道的maildrop.
软件包流行度大小说明fetchmailV:5,I:17814邮件检索(POP3,APOP,IMAP)(旧的)getmailV:1,I:630邮件检索(POP3,IMAP4和SDPS)(简单、安全和可靠)mailfilterV:0,I:0291有正则表达式过滤功能的邮件检索(POP3)mpopV:0,I:0400邮件检索(POP3)和带有过滤功能的MDATable6.
9:远程邮件检索和转发实用程序列表6.
5.
1getmail配置getmail(1)的配置在getmaildocumentation里描述.
这里是我作为用户搭建访问多个POP3帐号.
按如下所示的创建"/usr/local/bin/getmails".
Debian参考手册130/262#!
/bin/shset-eif[-f$HOME/.
getmail/running];thenecho"getmailisalreadyrunning.
.
.
(ifnot,remove$HOME/.
getmail/running)">&2pgrep-l"getmai[l]"exit1elseecho"getmailhasnotbeenrunning.
.
.
">&2fiif[-f$HOME/.
getmail/stop];thenecho"donotrungetmail.
.
.
(ifnot,remove$HOME/.
getmail/stop)">&2exitfiif["x$1"="x-l"];thenexitfircfiles="/usr/bin/getmail"forfilein$HOME/.
getmail/config/*;dorcfiles="$rcfiles--rcfile$file"donedate-u>$HOME/.
getmail/runningeval"$rcfiles$@"rm$HOME/.
getmail/running按如下所示的配置它.
$sudochmod755/usr/local/bin/getmails$mkdir-m0700$HOME/.
getmail$mkdir-m0700$HOME/.
getmail/config$mkdir-m0700$HOME/.
getmail/log按如下所示的为每个POP3账户创建"$HOME/.
getmail/config/pop3_name"配置文件.
[retriever]type=SimplePOP3SSLRetrieverserver=pop.
example.
comusername=pop3_name@example.
compassword=[destination]type=MDA_externalpath=/usr/bin/maildropunixfrom=True[options]verbose=0delete=Truedelivered_to=Falsemessage_log=~/.
getmail/log/pop3_name.
log按如下所示的配置它.
$chmod0600$HOME/.
getmail/config/*计划使用cron(8)每15分钟运行一次"/usr/local/bin/getmails",通过执行"sudocrontab-e-u"并把如下所示的命令添加到用户的cron条目中.
5,20,35,50usr/local/bin/getmails--quietDebian参考手册131/262提示POP3访问的问题可能并不来自于getmail.
一些主流的免费POP3服务可能违反了POP3协议并且它们的垃圾邮件过滤机制可能不是非常完美.
例如,它们可能在刚刚接收到RETR命令并且没有接收到DELE命令就可能删除了邮件并且可能隔离邮件到垃圾邮件信箱.
你应该尽可能的减少损害,通过配置它们使之成为可访问的归档文件并且不要删除它们.
参见"Somemailwasnotdownloaded".
6.
5.
2fetchmail配置"/etc/default/fetchmail","/etc/fetchmailrc"和"$HOME/.
fetchmailrc"可以配置fetchmail(1).
参见"/usr/sh配置例子.
6.
6带有过滤器的邮件投递代理(MDA)大多数MTA程序,例如postfix和exim4,兼任MDA(邮件投递代理).
这里有专门的带有过滤功能的MDA.
尽管procmail(1)已经成为GUN/Linux上关于带有过滤器的MDA的事实标准,作者现在还是喜欢maildrop(1).
不管使用哪种过滤程序,配置系统使之能投递已过滤的邮件到qmail风格的Maildir都是一个好主意.
软件包流行度大小说明procmailV:40,I:277300有过滤器的MDA(旧的)mailagentV:0,I:51356带有Perl过滤器的MDAmaildropV:0,I:21141有结构化过滤语言的MDATable6.
10:有过滤器的MDA列表6.
6.
1maildrop配置maildrop(1)配置在maildropfilterdocumentation中有说明.
这里有一个关于"$HOME/.
mailfilter文件的配置例子.
#LocalconfigurationMAILROOT="$HOME/Mail"#setthisto/etc/mailnamecontentsMAILHOST="example.
dom"logfile$HOME/.
maildroplog#rulesaremadetooverridetheearliervaluebythelaterone.
#mailinglistmailsif(/^Precedence:.
*list/:h||/^Precedence:.
*bulk/:h){#rulesformailinglistmails#defaultmailboxformailsfrommailinglistMAILBOX="Inbox-list"#defaultmailboxformailsfromdebian.
orgif(/^(Sender|Resent-From|Resent-Sender):.
*debian.
org/:h){MAILBOX="service.
debian.
org"}#defaultmailboxformailsfrombugs.
debian.
org(BTS)if(/^(Sender|Resent-From|Resent-sender):.
*@bugs.
debian.
org/:h){MAILBOX="bugs.
debian.
org"}Debian参考手册132/262#mailboxforeachproperlymaintainedmailinglistwith"List-Id:foo"or"List-Id:←.
.
.
"if(/^List-Id:h){MAILBOX="$MATCH2"}}else{#rulesfornon-mailinglistmails#defaultincomingboxMAILBOX="Inbox-unusual"#localmailsif(/Envelope-to:.
*@$MAILHOST/:h){MAILBOX="Inbox-local"}#htmlmails(99%spams)if(/DOCTYPEhtml/:b||\/^Content-Type:text\/html/){MAILBOX="Inbox-html"}#blacklistruleforspamsif(/^X-Advertisement/:h||\/^Subject:.
*BUSINESSPROPOSAL/:h||\/^Subject:.
*URGENT.
*ASISSTANCE/:h||\/^Subject:*INEEDYOURASSISTANCE/:h){MAILBOX="Inbox-trash"}#whitelistrulefornormalmailsif(/^From:.
*@debian.
org/:h||\/^(Sender|Resent-From|Resent-Sender):.
*debian.
org/:h||\/^Subject:.
*(debian|bug|PATCH)/:h){MAILBOX="Inbox"}#whiltelistruleforBTSrelatedmailsif(/^Subject:.
*Bug#.
*/:h||\/^(To|Cc):.
*@bugs.
debian.
org/:h){MAILBOX="bugs.
debian.
org"}#whitelistruleforgetmailscronmailsif(/^Subject:Cron.
*getmails/:h){MAILBOX="Inbox-getmails"}}#checkexistanceof$MAILBOX'test-d$MAILROOT/$MAILBOX'if($RETURNCODE==1){#createmaildirmailboxfor$MAILBOX'maildirmake$MAILROOT/$MAILBOX'}#delivertomaildir$MAILBOXto"$MAILROOT/$MAILBOX/"exitDebian参考手册133/262警告不像procmail,maildrop不会自动创建不存在的maildir目录.
你必须提前使用maildirmake(1)手动创建它们,正如"$HOME/.
mailfilter"例子里的那样.
6.
6.
2procmail配置这里有一个procmail(1)的"$HOME/.
procmailrc"文件的类似配置例子.
MAILDIR=$HOME/MaildirDEFAULT=$MAILDIR/Inbox/LOGFILE=$MAILDIR/Maillog#clearlybadlookingmails:dropthemintoX-trashandexit:0*1^0^X-Advertisement*1^0^Subject:.
*BUSINESSPROPOSAL*1^0^Subject:.
*URGENT.
*ASISSTANCE*1^0^Subject:*INEEDYOURASSISTANCEX-trash/#Deliveringmailinglistmessages:0*1^0^Precedence:.
*list*1^0^Precedence:.
*bulk*1^0^List-*1^0^X-Distribution:.
*bulk{:0*1^0^Return-path:.
*debian-devel-admin@debian.
or.
jpjp-debian-devel/:0*^Resent-Sender.
*debian-user-request@lists.
debian.
orgdebian-user/:0*^Resent-Sender.
*debian-devel-request@lists.
debian.
orgdebian-devel/:0*^Resent-Sender.
*debian-announce-request@lists.
debian.
orgdebian-announce:0mailing-list/}:0Inbox/6.
6.
3重新投递mbox内容如果你的家目录已经满了并且procmail(1)失败了,你需要从"/var/mail/"目录手动投递邮件到家目录下的已分类好的邮箱中.
家目录有空闲空间以后,运行如下命令.
#/etc/init.
d/${MAILDAEMON}stop#formail-sprocmail#/etc/init.
d/${MAILDAEMON}startDebian参考手册134/2626.
7POP3/IMAP4服务器如果将要在局域网上运行一个私有服务器,你应该考虑运行POP3/IMAP4服务器,用来投递邮件到局域网客户端.
软件包流行度大小类型说明courier-popV:2,I:2308POP3Courier邮件服务器-POP3服务器(只有maildir格式)cyrus-pop3dV:0,I:0160POP3Cyrus邮件系统(支持POP3)courier-imapV:3,I:4589IMAPCourier邮件服务器-IMAP服务器(只支持maildir格式)cyrus-imapdV:1,I:1484IMAPCyrus邮件系统(支持IMAP)Table6.
11:POP3/IMAP4服务器列表6.
8打印服务和工具在老的类Unix系统中,BSDLineprinterdaemon(lpd)行打印机后台守护曾经是标准.
传统的自由软件的标准打印输出格式是PostScript(PS).
为了能够打印到非PostScript打印机,需要将一些过滤器系统和Ghostscript一道使用.
参见第11.
4.
1节.
在现代的Debian系统中,CommonUNIXPrintingSystem通用UNIX打印系统是事实上的标准.
现代自由软件的标准打印输出格式是PortableDocumentFormat(PDF)可移植文件格式.
CUPS使用InternetPrintingProtocol互联网打印协议(IPP).
IPP现在已经被其它操作系统,如WindowsXP和MacOSX支持.
它已经变成新的具备双向通信能力的跨平台远程打印的事实标准.
幸亏有CUPS系统的文件格式依赖自动转化特征,简单的发送任何数据到lpr命令,都将产生期望的打印输出.
(在CUPS里,lpr能够通过安装cups-bsd软件包来获取.
)Debian系统有一些不错的软件包用于打印服务和作为打印工具.
软件包流行度大小端口说明lprV:3,I:4362printer(515)BSDlpr/lpd(线性打印机后台守护进程daemon)lprngV:1,I:13064同上,,(增强)cupsV:140,I:3951141IPP(631)互联网打印CUPS服务器cups-clientV:56,I:454493同上用于CUPS的SystemV打印机命令:lp(1),lpstat(1),lpoptions(1),cancel(1),lpmove(8),lpinfo(8),lpadmin(8),…cups-bsdV:36,I:385122同上用于CUPS的BSD打印机命令:lpr(1),lpq(1),lprm(1),lpc(8)printer-driver-gutenprintV:100,I:372937没有使用CUPS打印机驱动Table6.
12:打印服务和工具列表提示你可以让你的web浏览器访问"http://localhost:631/"来配置CUPS系统.
6.
9服务器远程访问和工具(SSH)SecureSHell(SSH)是因特网上的安全连接方式.
在Debian里面,有一个叫OpenSSH的免费SSH版本,在openssh-client和openssh-server包里.
Debian参考手册135/262软件包流行度大小工具说明openssh-clientV:803,I:9964298ssh(1)SSH客户端openssh-serverV:690,I:8341567sshd(8)SSH服务端ssh-askpass-fullscreenV:0,I:042ssh-askpass-fullscreen(1)请求用户输入密码的ssh-add(GNOME2)ssh-askpassV:3,I:34106ssh-askpass(1)请求用户输入密码的ssh-add(plainX)Table6.
13:服务器远程访问和工具列表小心如果你的SSH是从因特网来访问,参见第4.
7.
3节.
提示请使用screen(1)程序来让远程shell在中断的连接上存活(参见第9.
1节).
6.
9.
1SSH基础警告如果想要运行OpenSSH服务,"/etc/ssh/sshd_not_to_be_run"必须不存在.
SSH有两个认证协议.
SSH协议SSH方式说明SSH-1"RSAAuthentication"基于RSA身份秘钥的用户认证同上"RhostsAuthentication"".
rhosts"基于主机的认证(不安全,禁用)同上"RhostsRSAAuthentication"".
rhosts"使用RSA主机秘钥的主机认证(禁用)同上"ChallengeResponseAuthentication"RSA质疑-应答认证同上"PasswordAuthentication"基于密码的认证SSH-2"PubkeyAuthentication"基于公钥的用户认证同上"HostbasedAuthentication""~/.
rhosts"or"/etc/hosts.
equiv"使用客户端主机公钥的主机认证(禁用)同上"ChallengeResponseAuthentication"质疑-应答认证同上"PasswordAuthentication"基于密码的认证Table6.
14:SSH认证协议和方式列表小心如果你使用一个非Debian的系统,请小心注意这些不同.
Debian参考手册136/262配置文件配置文件描述/etc/ssh/ssh_configSSH客户端默认,参见ssh_config(5)/etc/ssh/sshd_configSSH服务端默认,参见sshd_config(5)~/.
ssh/authorized_keys该账户连接到这个服务器上的客户端使用的默认SSH公钥~/.
ssh/identity用户的SSH-1RSA私钥~/.
ssh/id_rsa用户的SSH-2RSA私钥~/.
ssh/id_dsa用户的SSH-2DSA私钥Table6.
15:SSH配置文件列表细节参见"/usr/share/doc/ssh/README.
Debian.
gz",ssh(1),sshd(8),ssh-agent(1),andssh-keygen(1).
下面是秘钥配置文件.
提示参见ssh-keygen(1),ssh-add(1)和ssh-agent(1)来了解怎样使用SSH公钥和私钥.
提示一定要通过连接测试来确认设置.
有任何问题的连接,使用"ssh-v".
提示稍后可以使用"ssh-keygen-p"改变密码来加密本地SSH私钥.
提示你可以在"~/.
ssh/authorized_keys"里给条目增加选项来限制主机和运行特定的命令.
细节请参见sshd(8).
从客户端启动一个ssh(1)连接.
命令说明sshusername@hostname.
domain.
ext使用默认模式连接ssh-vusername@hostname.
domain.
ext有详细信息的默认连接模式ssh-1username@hostname.
domain.
ext强制使用SSH1版本连接ssh-1-oRSAAuthentication=no-lusernamehostname.
domain.
extSSH1版本,强制使用密码ssh-oPreferredAuthentications=password-lusernamehostname.
domain.
extSSH2版本,强制使用密码Table6.
16:SSH客户端启动例子列表如果本地和远程主机,使用同样的用户名,你可以省略输入"username@".
即使在本地和远程主机使用不同的用户名,你可以使用"~/.
ssh/config"来省略输入用户名.
对于DebianSalsa服务器,使用账户名"foo-guest",你可以设置"~/.
ssh/config"包含下面的内容.
Hostsalsa.
debian.
orgpeople.
debian.
orgUserfoo-guest对于用户来讲,ssh(1)功能比telnet(1)更加智能和安全.
不像telnet命令,ssh命令不会在遇到telnet的退出字符(初始默认是CTRL-])时停止.
Debian参考手册137/2626.
9.
2SMTP/POP3隧道的端口转发通过ssh建立一个这样的管道连接,从localhost的4025端口到remote-server的25端口,并从localhost的4110端口到remote-server的110端口,请在本机执行如下命令.
#ssh-q-L4025:remote-server:254110:remote-server:110username@remote-server这是跨越因特网建立SMTP/POP3服务连接的安全方法.
在远程主机"/etc/ssh/sshd_config"里设置"AllowTcpForward条目为"yes".
6.
9.
3免密码远程连接使用"RSAAuthentication"(SSH-1协议)或"PubkeyAuthentication"(SSH-2协议),人们可以避免记住远程系统的密码.
在远程系统的"/etc/ssh/sshd_config"里,设置相应的条目,"RSAAuthenticationyes"或"PubkeyAuthenticatioyes".
在本地生成授权秘钥对,并安装公钥到远程系统.
"RSAAuthentication":SSH-1的RSAkey(不建议使用,因为已被废弃.
)$ssh-keygen$cat.
ssh/identity.
pub|sshuser1@remote"cat->>.
ssh/authorized_keys""PubkeyAuthentication":SSH-2的RSAkey$ssh-keygen-trsa$cat.
ssh/id_rsa.
pub|sshuser1@remote"cat->>.
ssh/authorized_keys""PubkeyAuthentication":SSH-2的DSAkey(不建议,因为慢.
)$ssh-keygen-tdsa$cat.
ssh/id_dsa.
pub|sshuser1@remote"cat->>.
ssh/authorized_keys"提示使用SSH-2的DSAkey是不建议的,应为key较小并且慢.
由于RSA专利已经过期,没有理由使用DSA来作为规避RSA专利的临时措施.
DSA表示DigitalSignatureAlgorithm,速度慢.
同时参见DSA-1571-1.
注意为了让"HostbasedAuthentication"在SSH-2下运行,你必须同时调整服务端主机"/etc/ssh/sshd_config"和客户机"/etc/ssh/ssh_config"或"~/.
ssh/config"的"HostbasedAuthentication"配置为"yes".
6.
9.
4处理其它SSH客户端其它平台上有一些免费的SSH客户端.
Debian参考手册138/262环境免费SSH程序WindowspuTTY(http://www.
chiark.
greenend.
org.
uk/~sgtatham/putty/)(GPL)Windows(cygwin)cygwin里的SSH(http://www.
cygwin.
com/)(GPL)Macintosh类macSSH(http://www.
macssh.
com/)(GPL)MacOSXOpenSSH;在终端应用中使用ssh(GPL)Table6.
17:其它平台上免费SSH客户端列表6.
9.
5建立ssh代理用密码来保护你的SSH认证私钥是安全的.
如果密码没有设置,使用"ssh-keygen-p"来设置.
把你的公钥(比如:"~/.
ssh/id_rsa.
pub")放到远程主机的"~/.
ssh/authorized_keys",这个远程主机使用上面描述的基于密码的连接方式.
$ssh-agentbash$ssh-add~/.
ssh/id_rsaEnterpassphrasefor/home//.
ssh/id_rsa:Identityadded:/home//.
ssh/id_rsa(/home//.
ssh/id_rsa)从这里执行接下来的命令,就不再需要密码.
$scpfoo@remote.
host:foo按^D来终结ssh代理会话.
对于X服务端,通常的Debian启动脚本会作为父进程执行ssh-agent.
所以你只需要执行一次ssh-add.
进一步的信息,请阅读ssh-agent(1)和ssh-add(1).
6.
9.
6怎样通过SSH关闭远程系统你可以使用at(1)命令(参见第9.
3.
13节)来从SSH终端里保护"shutdown-hnow"(参见第1.
1.
8节)操作过程.
#echo"shutdown-hnow"|atnow在screen(1)(参见第9.
1节)会话里运行"shutdown-hnow",是另外一个方法来做这同样的事情.
6.
9.
7SSH故障排查如果你遇到问题,检查配置文件的权限并用"-v"选项运行ssh.
如果你是root账户,并有使用防火墙,使用"-p"选项;这可以避免使用1—1023之间的服务端口.
如果ssh连接到远程站点突然停止工作,这也许是系统管理员胡乱操作的结果,可能是在系统维护时改变了"host_key".
在确认这个情况后,并且没有人试图用聪明的黑客技术来篡改远程主机,你可以在本机"~/.
ssh/known_hos里删除"host_key"条目来重新获得连接.
6.
10其它网络应用服务这里是其它网络应用服务.
通用互联网文件系统协议(CIFS)和服务消息块(SMB)协议一样,被微软Windows广泛应用.
提示参见第4.
5.
2节服务系统集成.
Debian参考手册139/262软件包流行度大小协议说明telnetdV:1,I:3115TELNETTELNET服务telnetd-sslV:0,I:0170同上TELNET服务(支持SSL)nfs-kernel-serverV:38,I:79342NFSUnix文件共享sambaV:102,I:15916629SMBWindows文件和打印共享netatalkV:2,I:32077ATPApple/Mac文件和打印共享(AppleTalk)proftpd-basicV:24,I:32488FTP通用文件下载apache2V:246,I:315610HTTP通用web服务器squidV:13,I:158385同上通用web代理服务器squid3V:4,I:10240同上同上bind9V:52,I:651063DNS其它主机的IP地址isc-dhcp-serverV:18,I:541471DHCP客户端自身的IP地址Table6.
18:其它网络应用服务列表提示主机名解析通常由DNS服务提供.
对于由DHCP动态分配的主机IP地址,动态DNS能够使用bind9和isc-dhcp-server建立主机名解析,Debianwiki的DDNS页有说明.
提示使用squid之类的代理服务器,和使用Debian文档库的完全本地镜像服务器相比,能够大量节省带宽.
6.
11其它网络应用客户端这里是其它网络应用客户端.
6.
12系统后台守护进程(daemon)诊断telnet程序能够手工连接到系统后台守护进程(daemon),并进行诊断.
测试纯POP3服务,尝试用下面的操作$telnetmail.
ispname.
netpop3部分ISP提供TLS/SSL加密的POP3服务,为了测试它,你需要用到telnet-ssl包里支持TLS/SSL的telnet客户端,或openssl软件包.
$telnet-zsslpop.
gmail.
com995$openssls_client-connectpop.
gmail.
com:995下面的RFCs提供每一个系统后台守护进程(daemon)所需要的知识.
在"/etc/services"里,描述了端口用途.
Debian参考手册140/262软件包流行度大小协议说明netcatI:4116TCP/IPTCP/IP瑞士军刀opensslV:794,I:9931465SSL安全套接字层(SSL)二进制和相关的加密工具stunnel4V:5,I:17507同上通用SSL封装telnetV:65,I:904163TELNETTELNET客户端telnet-sslV:0,I:3210同上TELNET服务(支持SSL)nfs-commonV:181,I:343768NFSUnix文件共享smbclientV:16,I:1742016SMB微软Windows文件和打印共享客户端cifs-utilsV:32,I:123299同上远程微软Windows文件系统挂载和卸载命令ftpV:18,I:282137FTPFTP客户端lftpV:6,I:392255同上同上ncftpV:3,I:221339同上全屏FTP客户端wgetV:288,I:9883477HTTP和FTPweb下载工具curlV:151,I:548426同上同上axelV:0,I:4216同上下载加速器aria2V:2,I:191854同上BitTorrent和Metalink支持的下载加速器bind9-hostV:382,I:948365DNS来自bind9的host(1),"Priority:standard"dnsutilsV:64,I:517256同上来自bind的dig(1),"Priority:standard"isc-dhcp-clientV:231,I:979686DHCP获得IP地址ldap-utilsV:14,I:75718LDAP从LDAP服务获取数据Table6.
19:网络应用客户端列表RFC说明rfc1939和rfc2449POP3服务rfc3501IMAP4服务rfc2821(rfc821)SMTP服务rfc2822(rfc822)邮件文件格式rfc2045多用途互联网邮件扩展(MIME)rfc819DNS服务rfc2616HTTP服务rfc2396URI定义Table6.
20:常用RFC列表Debian参考手册141/262Chapter7X窗口系统警告本章是基于2013年发布的Debian7.
0(Wheezy)编写的,所以其内容正在变得过时.
Debian上的X窗口系统基于X.
Org的源代码.
7.
1关键软件包这里有一些用于简易安装的(元)软件包.
(元)软件包流行度大小说明xorgI:45752X库、一个X服务器、一系列字体以及一组基础的X客户端和工具(元软件包)xserver-xorgV:66,I:492238X服务器的全部套件及其配置xbase-clientsI:2646各种X客户端(元软件包)x11-commonV:372,I:755308X窗口系统的文件系统的基础设施xorg-docsI:62036X.
Org软件套件的各种文档menuV:54,I:1971509为理解菜单的应用生成Debian菜单menu-xdgV:31,I:10927将Debian菜单结构转换为freedesktop.
orgxdg菜单结构xdg-utilsV:229,I:521327freedesktop.
org提供的集成桌面环境的工具task-gnome-desktopI:1759标准GNOME桌面环境(元软件包)task-kde-desktopI:666核心KDE桌面环境(元软件包)task-xfce-desktopI:1069Xfce轻量级桌面环境(元软件包)task-lxde-desktopI:359LXDE轻量级桌面环境(元软件包)fluxboxV:2,I:93860Fluxbox:可配置度高且资源耗费低的X窗口管理器Table7.
1:X窗口的关键(元)软件包列表关于X基础知识,请参考X(7)和theLDPXWindow-User-HOWTO.
Debian参考手册142/2627.
2设置桌面环境一个桌面环境通常是一个X窗口管理器、一个文件管理器和一套兼容的实用程序组合而成.
你能够在aptitude的任务菜单下安装全部的桌面环境,例如GNOME,KDE,Xfce或者LXDE.
提示在Debianunstable/testing下,任务菜单可能与最新的软件包过渡状态不同步.
在这种情况下,您需要取消选择aptitude(8)任务菜单下列出的一些(元)包.
当取消选择(元)软件包时,您必须选择那些提供依赖项手动操作的软件包,避免它们被自动删除.
你也可以手动只建立一个X窗口管理器,例如Fluxbox.
关于X窗口管理器和桌面环境的介绍,参见WindowManagersforX.
7.
2.
1Debian菜单Debian菜单系统从menu软件包中为带有update-menus(1)的文本和X程序提供了一个通用接口.
每个软件包都会将它的菜单数据安装到"/usr/share/menu/"目录.
参见"/usr/share/menu/README".
7.
2.
2Freedesktop.
org菜单每个遵从Freedesktop.
orgxdg菜单的软件包都会将由"*.
desktop"提供的菜单数据安装到"/usr/share/applications/"下.
符合Freedesktop.
org标准的现代桌面环境会利用它们的数据使用xdg-utils软件包生成菜单.
参见"/usr/share/doc/x7.
2.
3从Freedesktop.
org菜单到Debian菜单为了从遵从Freedesktop.
org菜单的窗口管理器环境(例如GNOME和KDE)访问传统的Debian菜单,你必须安装menu-xdg软件包.
7.
3服务器/客户端关系XWindow系统作为服务和客户端程序的组合被启动.
在这里,server和client的意义需要和local和remote区分开来.
类型说明X服务器一个运行在本地主机上的程序,连接了使用者的显示和输入设备.
X客户端一个运行在远程主机上的程序,它会与X服务器进行数据的处理和传输.
应用程序服务器一个运行在远程主机上的程序,会与应用程序客户端进行数据处理和传输.
应用程序客户端一个运行在本地主机上的程序,连接了使用者的显示和输入设备.
Table7.
2:服务器/客户端术语表现代X服务器具有MIT共享内存扩展,他们和本地X客户端通过本地共享内存进行通讯.
这就绕过了网络透明的Xlib进程间通讯通道,提升了大型图像的处理性能.
Debian参考手册143/2627.
4X服务器关于X服务器的信息,参见xorg(1).
7.
4.
1X服务器的(重新)配置使用下面命令(重新)配置一个X服务器.
#dpkg-reconfigure--priority=lowx11-common注意新的Linux内核使用DRM、KMS和udev,对图形和输入设备进行了良好的支持.
X服务器被重写以使用它们.
因此"/etc/X11/xorg.
conf"通常不存在于你的系统中.
这些参数由内核进行配置.
参见Linux内核文档中的"fb/modedb.
txt".
对于高分辨率的CRT大显示器,最好将将刷新率设置为显示器支持的最高值(85Hz不错,75Hz也行)以减少闪烁.
对于LCD显示器,较慢的标准刷新率(60Hz)就可以了,因为它的反应较慢.
注意当心,别使用过高的刷新率,这可能会导致你的显示器系统发生重大的硬件故障.
7.
4.
2连接到X服务器的方式这里有一些方式,可以使"X服务器"(显示端)接受来自"X客户端"(应用端)的连接.
软件包流行度大小用户加密方式相关使用xbase-clientsI:2646不检查无xhost命令弃用xbase-clientsI:2646检查无xauth命令通过管道进行本地连接openssh-clientV:803,I:9964298检查有ssh-X命令远程网络连接gdm3V:165,I:2295101检查无(XDMCP)GNOME显示管理器通过管道进行本地连接sddmV:53,I:951742检查无(XDMCP)KDE显示管理器通过管道进行本地连接xdmV:3,I:6686检查无(XDMCP)X显示管理器通过管道进行本地连接wdmV:31,I:2842289检查无(XDMCP)WindowMaker显示管理器通过管道进行本地连接ldmV:0,I:0436检查有LTSP显示管理器远程SSH网络连接(瘦客户端)Table7.
3:连接到X服务器的方式警告不要在不安全的网络中使用远程TCP/IP进行X连接,除非你有非常好的理由,例如使用了加密.
未加密的远程TCP/IPsocket连接容易遭到窃听攻击并且Debian系统默认禁用了它.
请使用"ssh-X".
Debian参考手册144/262警告也不要在不安全的网络中使用XDMCP连接.
它通过未加密的UDP/IP传输数据,很容易遭到窃听攻击.
提示LTSP代表Linux终端服务器项目(LinuxTerminalServerProject).
7.
5启动X窗口系统X窗口系统通常是作为X会话启动的,X会话是由X服务器和连接客户端组成的.
对于常规的桌面系统,它们两个都是在一个工作站上运行的.
X会话由以下方式之一启动.
从命令行用startx命令启动基于"graphical.
target"的依赖关系,一个X图形显示管理器的后台守护程序*dm通过systemd启动.
提示显示管理器后台守护进程(daemon)的启动脚本在实际执行它们自己时会检查"/etc/X11/default-display-manager"文件的内容.
这可以确保只有一个X显示管理器后台守护进程(daemon)程序被激活.
提示关于X显示管理器的初始环境变量,参见第8.
4.
5节.
本质上,所有的这些程序都是执行"/etc/X11/Xsession"脚本.
之后"/etc/X11/Xsession"脚本通过run-parts(8)执行"/etc/X11/Xsession.
d/"目录中的脚本.
这本质上是通过内建的exec命令执行按下面顺序第一个被找到的程序.
1.
X显示管理器调用"/etc/X11/Xsession"的参数中指定的脚本,如果他被定义了.
2.
"~/.
xsession"或"~/.
Xsession"脚本,如果它被定义.
3.
"/usr/bin/x-session-manager"命令,如果它被定义.
4.
"/usr/bin/x-window-manager"命令,如果它被定义.
5.
"/usr/bin/x-terminal-emulator"命令,如果它被定义.
这个过程会受"/etc/X11/Xsession.
options"的影响.
"/usr/bin/x-*"命令所指向的准确程序,是由Debian选择系统决定的,并且可以通过"update-alternatives--configx-session-manager"修改.
细节参见Xsession(5).
7.
5.
1使用gdm3启动X会话gdm3(1)让你从它的菜单中选择会话类型(或桌面环境:第7.
2节),还有X会话的语言(或语言环境:第8.
4节).
它在"~/.
dmrc"中像下面那样设定选择的默认值.
[Desktop]Session=defaultLanguage=ja_JP.
UTF-8Debian参考手册145/2627.
5.
2自定义X会话(经典方式)系统中的"/etc/X11/Xsession.
options"包含没有前置"#"字符的"allow-user-xsession"行,则定义了"~/.
xsession"或"~/.
Xsession"的任何用户都能够通过完全覆盖系统代码来自定义"/etc/X11/Xsession"的动作.
在"~/.
xsession"文件中的最后一个命令应该使用"execsome-window/session-manager"这样的形式来启动你最喜欢的X窗口/会话管理器.
如果使用了这个特性,系统实用程序选择的显示(或登录)管理器(DM),会话管理器或者窗口管理器(WM)会被忽略.
7.
5.
3自定义X会话(新方式)以下是自定义X会话的新方式,它不会像上面那样完全覆盖系统代码.
显示管理器gdm3可以选择一个特定的会话并将它设置为"/etc/X11/Xsession"的参数.
–"/etc/profile","~/.
profile","/etc/xprofile",和"~/.
xprofile"文件会被作为gdm3启动进程的一部分来执行.
"~/.
xsessionrc"文件作为启动进程的一部分被执行.
(独立桌面)–"/etc/X11/Xsession.
options"中的"#allow-user-xsession"不会限制"~/.
xsessionrc"文件的执行.
"~/.
gnomerc"文件作为启动进程的一部分被执行.
(仅GNOME桌面)系统实用程序选择的显示(或登录)管理器(DM),会话管理器或者窗口管理器(WM)是相当不错的.
在这些配置文件里面,不应当有"exec…"或"exit".
7.
5.
4通过SSH连接一个远程X客户端使用"ssh-X"可以启用一个来自本地X服务器到远程应用程序服务器的安全连接.
如果你想避免命令行选项"-X",你需要将远程主机的"/etc/ssh/sshd_config"文件中的"X11Forwarding"设置为"yes".
在本地主机上启动X服务器.
在本地主机中打开一个xterm.
通过下列命令,运行ssh(1)建立与远程站点的连接.
localname@localhost$ssh-q-Xloginname@remotehost.
domainPassword:通过下列命令,在远程站点运行一个X应用程序,例如"gimp".
loginname@remotehost$gimp&这个方法可以显示来自远程X客户端的输出,相当于它是通过一个本地UNIX域名socket进行本地的连接.
7.
5.
5连接互联网的安全X终端连接互联网的X安全终端,并且会显示在远程运行的整个X桌面环境,这可以通过使用特定软件包(例如ldm)轻松地做到.
通过SSH,你的本地机器会变成连接到远程应用程序服务器的一个安全瘦客户端.
Debian参考手册146/2627.
6X窗口中的字体在2002年,人们创建了发行版独立的库Fontconfig2.
0用于配置和定制字体访问.
squeeze以后的Debian使用Fontconfig2.
0进行字体配置.
X窗口系统中的字体支持可以概括如下.
传统的X服务器端的字体支持系统–原始的核心X11字体系统为旧版本的X客户端应用提供了向后兼容.
–原始的核心X11字体被安装到了X服务器上.
现代X客户端的字体支持系统–现代X系统支持下列带有高级功能(例如抗锯齿)的所有字体(第7.
6.
1节,第7.
6.
2节和第7.
6.
3节).
–Xft2.
0连接现代X应用,例如来自GNOME、KDE和带有FreeType2.
0库的LibreOffice的应用.
–FreeType2.
0提供字体栅格化的库.
–Fontconfig为Xft2.
0解决了字体规范的问题.
配置参见fonts.
conf(5).
–所有使用Xft2.
0的现代X应用都可以与使用X渲染扩展的现代X服务器进行交流.
–X渲染扩展将字体访问和glyph图像生成从X服务器移动到了X客户端.
软件包流行度大小说明xfonts-utilsV:66,I:542415X窗口系统字体实用程序libxft2V:143,I:662122Xft的,一个库,连接到了带有FreeType字体栅格化库的X应用libfreetype6V:426,I:994896FreeType2.
0字体栅格化库fontconfigV:354,I:776583Fontconfig的,一个通用的字体配置库——支持二进制fontconfig-configV:367,I:871442Fontconfig的,一个通用的字体配置库——配置数据Table7.
4:支持X窗口字体系统的软件包你可以通过下列方法查看字体配置信息.
使用"xsetq"查看核心X11字体路径使用"fc-match"查看fontconfig的字体默认使用"fc-list"查看所有可用的fontconfig字体提示"ThePenguinandUnicode"很好地概述了现代的X窗口系统.
在http://unifont.
org/中的其它文档提供了关于Unicode字体、支持Unicode的软件以及国际化的相关信息,还有免费/自由/开源(free/libre/opensource,FLOSS)操作系统中的Unicode可用性问题.
7.
6.
1基础字体计算机字体有两种主要的类型.
点阵字体(低分辨率栅格化下表现良好)轮廓/笔画字体(高分辨率栅格化下表现良好)Debian参考手册147/262缩放点阵字体会导致图像产生锯齿,而缩放轮廓/笔画字体则生成平滑的图像.
Debian系统中的点阵字体通常由压缩的X11pcf点阵字体文件提供,它带有".
pcf.
gz"文件后缀名.
Debian系统中的轮廓字体由以下提供.
PostScriptType1字体文件,它带有".
pfb"(二进制字体文件)和".
afm"(字体规格文件)文件后缀名.
TrueType(或OpenType)字体文件,通常带有".
ttf文件后缀名.
提示OpenType是为了取代TrueType和PostScriptType1.
字体软件包流行度大小无衬线字体衬线字体等宽字体字体来源PostScriptN/AN/AHelveticaTimesCourierAdobegsfontsI:5994439NimbusSansLNimbusRomanNo9LNimbusMonoLURW(Adobe兼容的大小)gsfonts-x11I:8295NimbusSansLNimbusRomanNo9LNimbusMonoLPostScriptType1字体支持的X字体.
t1-cyrillicI:194878FreeHelvetianFreeTimesFreeCourierURW扩展(Adobe兼容的大小)lmodernV:13,I:11333270LMSans*LMRoman*LMTypewriter*基于现代计算机的可缩放PostScript和OpenType字体(来自Tex)Table7.
5:相应的PostScriptType1字体提示DejaVu字体基于BitstreamVera字体,并对其进行了扩充.
7.
6.
2其它字体aptitude(8)可以帮你轻松找到其它的字体.
简单的软件包列表位于"软件集"→"本地化"平面软件包列表可以使用debtag正则表达式来过滤字体数据:"~Gmade-of::data:font"在软件包名称里采用下面的正则表达式来过滤得到BDF(位图)字体包列表:"~nxfonts-"在软件包名称里采用下面的正则表达式来得到TrueType字体包列表:"~nttf-|~nfonts-"因为自由字体有时会受限,因此对于Debian用户而言,可以选择安装或分享一些商业的TrueType字体.
为了简化该过程,建立一些方便的软件包.
mathematica-fontsfonts-mscorefonts-installer当你付出使用非自由字体污染你自由系统的代价后,你会得到一些相当不错的trueType字体.
Debian参考手册148/262字体软件包流行度大小无衬线字体衬线字体等宽字体字体来源ttf-mscorefonts-installerV:1,I:6492ArialTimesNewRomanCourierNew微软(Adobe兼容的大小)(这会安装non-free数据)fonts-liberationI:4692093LiberationSansLiberationSerifLiberationMonoLiberation字体项目(微软兼容的大小)fonts-freefont-ttfV:50,I:2766656FreeSansFreeSerifFreeMonoGNU自由字体(微软兼容的大小)fonts-dejavuI:47839DejaVuSansDejaVuSerifDejaVuSansMono覆盖了Unicode的DejaVu、BitstreamVerafonts-dejavu-coreV:220,I:8092954DejaVuSansDejaVuSerifDejaVuSansMono覆盖了Unicode的DejaVu、BitstreamVera(sans、sans-bold、serif、serif-bold、mono、mono-bold)fonts-dejavu-extraI:5167493N/AN/AN/A覆盖了Unicode的DejaVu、BitstreamVera(oblique、italic、bold-oblique、bold-italic、condensed)ttf-unifontI:2121N/AN/AunifontGNUUnifont,带有Unicode5.
1基本多文种平面(BMP)中所有的可打印字符Table7.
6:对应的TrueType字体7.
6.
3CJK字体下面是一些主要关注CJK字符的字体.
字体类型日文字体名称中文字体名称韩文字体名称无衬线gothic、ゴチックhei、gothicdodum、gulim、gothic衬线mincho、明朝song、mingbatangTable7.
7:CJK字体名称中所使用的暗示字体类型的关键词像"VLPGothic"这样带有"P"的字体名称是对应的"VLGothic"字体修改宽度后的比例字体.
举个例子,Shift_JIS的码表包含了7070个字符.
它们可以像下面那样分类.
JISX0201单字节字符(191个字符,又名半角字符)JISX0208双字节字符(6879个字符,又名全角字符)使用修复宽度的CJK字体的双字节字符占用控制台终端的双倍宽度.
为了应对这种情况,带有".
hbf"文件后缀名的汉字点阵字体(HanziBitmapFont,HBF)文件被设计为包含了单字节和双字节字符的字体.
为了节省TrueType字体文件的空间,可以使用带有".
ttc"文件后缀名的TrueType字体集合文件.
为了覆盖复杂的编码字体空间,CID采用"%!
PS-Adobe-3.
0Resource-CMap"开头的CMap文件作为PostScript类型1字体的关键字.
这个几乎很少用在普通的X显示上,更多用于PDF等格式的文件渲染上.
(参考第7.
7.
2节).
Debian参考手册149/262提示对于Hanunification,一些Unicode编码点阵期望能够有多样化的glyphs.
其中最令人讨厌的在中日韩三个国家"U+3001顿号"和"U+3002表意的句号"的字符位置各不相同.
配置日文中心字体的优先级,中文用的是"7~/.
fonts.
conf8"能够让日本感到有所平衡.
7.
7X应用7.
7.
1X办公应用下面是一些基础的办公应用(LO是LibreOffice).
软件包流行度软件包大小类型说明libreoffice-writerV:188,I:44139333LO文字处理软件libreoffice-calcV:188,I:43632973LO电子表格libreoffice-impressV:176,I:4339934LO演示文稿libreoffice-baseV:145,I:3257473LO数据库管理libreoffice-drawV:177,I:43414600LO矢量图形编辑器(绘图)libreoffice-mathV:174,I:4371963LO数学方程/公式编辑器abiwordV:1,I:125141GNOME文字处理软件gnumericV:6,I:219933GNOME电子表格gimpV:68,I:34122313GTK位图图形编辑器(绘图)inkscapeV:55,I:20984823GNOME矢量图形编辑器(绘图)diaV:5,I:313727GTK流程图和示意图编辑器plannerV:0,I:51146GNOME项目管理calligrawordsV:0,I:75717KDE文字处理软件calligrasheetsV:0,I:610890KDE电子表格calligrastageV:0,I:55102KDE演示文稿calligraplanV:0,I:215342KDE项目管理kexiV:0,I:27576KDE数据库管理karbonV:0,I:73473KDE矢量图形编辑器(绘图)Table7.
8:基础的X办公应用7.
7.
2X实用应用下面是一些引起我注意的基础实用应用.
小心为了让evince和okular使用Cmap数据(第7.
6.
3节)来显示CJKPDF文档,必须要安装poppler-data软件包(之前为non-free,参见第11.
4.
1节).
Debian参考手册150/262软件包流行度软件包大小类型说明evinceV:116,I:329954GNOME文档(pdf)阅读器okularV:46,I:11814646KDE文档(pdf)阅读器calibreV:9,I:3654876KDE电子书转换器和库管理fbreaderV:2,I:153074GTK电子书阅读器evolutionV:31,I:229475GNOME个人信息管理(群组软体和电子邮件)kontactV:1,I:162152KDE个人信息管理(群组软体和电子邮件)scribusV:2,I:2330375KDE桌面页面布局编辑器glabelsV:0,I:41326GNOME标签编辑器gnucashV:3,I:1232304GNOME个人会计homebankV:0,I:31044GTK个人会计kmymoneyV:0,I:212036KDE个人会计shotwellV:19,I:2236451GTK数码照片管理器xsaneV:17,I:1732346GTK扫描仪前段Table7.
9:基础的实用应用注意如果在GNOME桌面环境中没有相应功能的软件,那么安装例如scribus(KDE)这样的软件包是完全可以接受的.
但别安装过多功能重复的软件包,这会使你的菜单凌乱.
7.
8X琐事7.
8.
1剪贴板使用鼠标的3个按键来进行X选择是X原生的剪贴板(参见第1.
4.
4节).
提示Shift-Insert等同于单击鼠标中键.
软件包流行度软件包大小类型说明xselV:10,I:4459XX选择的命令行接口xclipV:9,I:4964XX选择的命令行接口Table7.
10:基础的X选择程序现代的桌面环境(GNOME、KDE……)提供了不同的剪贴板系统用于剪切、复制和粘贴,它们使用鼠标左键和关键键(CTRL-X、CRTL-C和CTRL-V).
7.
8.
2X中的键盘和鼠标按钮映射xmodmap(1)是X窗口系统中用来修改键盘和鼠标按钮映射的工具.
为了获得keycode,你需要在X中运行xev(1)并按下对应按键.
为了获得keysym的含义,你需要查看"/usr/include/X11/keysymdef.
h"文件(x11proto-core-dev软件包)中MACRO的定义.
文件中所有的"#define"语句后面都是以"XK_"开头,后接keysym名称.
Debian参考手册151/2627.
8.
3典型的X客户端大多数传统的X客户端程序,例如xterm(1),可以用一组标准的命令行选项来启动,从而指定大小、字体和显示.
它们还使用X资源数据库来配置它们的外观.
系统默认的X资源保存在"/etc/X11/Xresources/*"中,应用默认的X资源保存在"/etc/X11/app-defaults/*"中.
使用这些设置作为起点.
"~/.
Xresources"文件被用来保存用户资源设定.
这个文件在登陆时会自动合并到默认的X资源.
要更改这些设置并使其立即生效,使用下列命令将它们合并到数据库中.
$xrdb-merge~/.
Xresources参见x(7)和xrdb(1).
7.
8.
4X终端模拟器——xterm在http://dickey.
his.
com/xterm/xterm.
faq.
html可以了解到关于xterm(1)的一切信息.
7.
8.
5以root运行X客户端警告不要通过在显示管理器(例如gdm3)的提示符后输入root来以root身份启动X显示/会话管理器,因为这是不安全的,即使你打算进行管理员操作.
以root运行整个X架构被认为是不安全的.
你必须总是使用尽可能低权限的账号,例如普通的用户账号.
运行一个特殊的X客户端(例如使"foo"取得root权限)的简单方法是像下面那样使用sudo(8)等.
$sudofoo&$sudo-s#foo&$ssh-Xroot@localhost#foo&小心为了该目的像上面那样使用ssh(1)会浪费资源.
为了使X客户端链接到X服务器,请注意以下几点.
旧用户"$XAUTHORITY"和"$DISPLAY"环境变量的值必须复制给新用户.
"$XAUTHORITY"环境变量的值所指向的文件必须对新用户可读.
Debian参考手册152/262Chapter8国际化和本地化一个应用软件的多语言化(M17N)或本地语言支持,通过2个步骤完成.
国际化(I18N):使一个软件能够处理多个语言环境.
本地化(L10N):使一个软件处理一个特定的语言环境.
提示在multilingualization(多语言化)、internationalization(国际化)和localization(本地化)中,有17,18,或10个字母在"m"和"n","i"和"n",或"l"和"n"中间,它们相应表示为M17N,I18N和L10N.
GNOME和KDE等现代软件是多语言的.
他们通过处理UTF-8数据来实现国际化,并通过gettext(1)架构提供翻译信息来本地化.
翻译信息可以由独立的本地化软件包来提供.
翻译信息易于选择使用,通过给相关的环境变量设置适当的语言环境即可.
最简单的文本数据表示方法是ASCII,使用少于127个字符(用7位表示),这对英语足够了.
为了支持用于国际化的更多字符,人们发明了许多字符编码系统.
现代知名的编码系统是UTF-8,它可以处理人类所知的几乎所有字符(参见第8.
4.
1节).
细节请参见i18n介绍.
有本地化硬件配置数据便能支持国际化硬件.
警告本章是基于2013年发布的Debian7.
0(Wheezy)编写的,所以其内容正在变得过时.
8.
1键盘输入Debian系统可以使用keyboard-configuration和console-setup软件包配置多个国际化键盘布局.
#dpkg-reconfigurekeyboard-configuration#dpkg-reconfigureconsole-setup这将配置Linux控制台和X窗口的键盘,并更新"/etc/default/keyboard"和"/etc/default/console-setup"中的配置参数.
这也可以用来配置Linux控制台的字体.
许多非ASCII字符,包括许多欧洲语言使用的重音字符,可以使用死键、AltGr键和组合键来输入它们.
对于亚洲语言,你需要更复杂的输入法支持,例如下面将要讨论的IBus.
Debian参考手册153/2628.
1.
1IBus支持的输入法输入多种语言到应用程序的处理流程如下:b''键b''b''盘b''b''应b''b''用b''b''程b''b''序b''|^||+->Linuxb''内b''b''核b''->b''输b''b''入b''b''法b''->Gtkb''、b''Qtb''、b''b''或b''X通过im-config使用IBus家族的软件包可以简单地为Debian系统建立多语种的输入.
下面列出了一些IBus软件包.
软件包流行度大小支持的语言环境ibusV:70,I:871581使用dbus的输入方式框架ibus-mozcV:1,I:2999日文ibus-anthyV:0,I:18723同上ibus-kkcV:0,I:0214同上ibus-skkV:0,I:0244同上ibus-pinyinV:0,I:11434中文(zh_CN)ibus-chewingV:0,I:0415中文(zh_TW)ibus-hangulV:0,I:1288韩文ibus-tableV:0,I:11801IBus表引擎ibus-table-thaiI:047泰文ibus-unikeyV:0,I:0318越南语ibus-m17nV:0,I:1187多语言:印度语、阿拉伯语和其它Table8.
1:IBus支持的输入法kinput2方式和其它本地独立的亚洲经典输入法依旧存在,但不推荐在现代的UTF-8X环境中使用.
SCIM和uim工具链是用于现代的UTF-8X环境下的国际化输入法的较旧的方法.
8.
1.
2一个日语的例子我发现在英语环境("en_US.
UTF-8")下启动日文输入法非常有用.
下面是在GNOME3下使用IBus的做法:1.
安装日文输入法软件包ibus-anthy,以及im-config等推荐的软件包.
2.
从用户Shell中执行"im-config",然后选择"ibus"作为输入法.
3.
选择"Settings"→"Keyboard"→"InputSources"→在"InputSources"中单击"+"→"Japanese"→"Japanese(anthy)",然后单击"Add".
4.
选择"日语"并"添加"到支持日语键盘,就不需要字符转换.
(你可能会选择更多的输入源)5.
重新登录用户账户.
6.
使用"im-config"验证设置.
7.
右键单击GUI工具条图标,设置输入源.
8.
使用SUPER-SPACE在安装的输入法之间进行切换.
(SUPER键通常是Windows键.
)请注意以下几点.
im-config(8)如果命令是从root账户执行的表现会有所不同.
im-config(8)让最佳的输入法作为系统默认而不需要用户干预.
用户界面菜单入口im-config(8)默认会被禁用,以免造成混乱.
Debian参考手册154/2628.
1.
3禁用输入法如果你不想通过XIM(X所使用的机制)来进行输入,你可以在启动程序时将"$XMODIFIERS"的值设置为"none".
这可能会是这种情况,你想在emacs(1)中使用日文输入基础设施egg同时禁用ibus.
你可以从shell中执行如下命令.
$XMODIFIERS=noneemacs为了调整Debian菜单执行的命令,请根据"/usr/share/doc/menu/html"中描述的方法定制"/etc/menu/"中的配置.
8.
2显示输出Linux控制台只能显示有限的字符.
(你需要使用特殊的终端程序,例如jfbterm(1),从而在非X控制台中显示非欧洲语言.
)只要需要的字库数据存在X窗口可以通过UTF-8编码显示任意字符.
(X窗口系统能够维护好原始字体数据编码,这对用户来说是透明的)8.
3东亚环境下宽度有歧义的字符在东亚语言环境下,方框绘制、希腊字符和西里尔字符可能会显示得比你预期的样子更宽,这样会导致终端输出排列不再整齐(参见Unicode标准附录#11).
您可以绕过这个问题:gnome-terminal:编辑→首选项→配置文件→编辑→兼容性→宽度有歧义的字符→窄ncurses:设置环境变量exportNCURSES_NO_UTF8_ACS=0.
8.
4语言环境下面重点介绍在从gdm3(1)启动的X窗口环境下运行的应用程序的语言设置.
8.
4.
1编码的基础知识环境变量"LANG=xx_YY.
ZZZZ"将语言环境设置为语言代码"xx"、国家代码"YY"和编码"ZZZZ"(参见第1.
5.
2节).
现在的Debian系统一般将语言环境设置为"LANG=xx_YY.
UTF-8".
这将会使用带有Unicode字符集的UTF-8编码.
UTF-8编码系统是多字节的代码系统并且码点的使用更加智能.
ASCII数据(只包含了7位二进制代码)总是合法的UTF-8数据(每个字符使用1个字节).
之前的Debian系统曾经将语言环境设置为"LANG=C"或"LANG=xx_YY"(没有".
UTF-8").
"LANG=C"或"LANG=POSIX"使用ASCII字符集.
"LANG=xx_YY"使用Unix的传统编码系统.
"LANG=xx_YY"所使用的确切传统编码系统可以通过"/usr/share/i18n/SUPPORTED"来确认.
例如,"en_US"使用"ISO-8859-1"编码,"fr_FR@euro"使用"ISO-8859-15"编码.
提示编码值的含义,参见表11.
2.
Debian参考手册155/2628.
4.
2UTF-8语言环境的基本原理Unicode字符集可以用从0到10FFFF(十六进制)范围的码点来显示几乎所有人类已知的字符.
它的存储至少需要21位.
文本编码系统UTF-8将Unicode码点适配到一个合理的8位数据流,并兼容ASCII数据处理系统.
UTF表示Unicode转换格式(UnicodeTransformationFormat).
我建议在你的桌面使用UTF-8语言环境,例如"LANG=zh_CN.
UTF-8".
语言环境的第一部分决定了应用程序中显示的信息.
例如,"LANG=fr_FR.
UTF-8"语言环境下的gedit(1)(GNOME桌面的文本编辑器),菜单是用法语显示的,但只要安装所需的字体和输入法就可以显示和编辑中文字符文本数据.
我还建议只使用"$LANG"环境变量来设置语言环境.
我没有看到在UTF-8语言环境下设置复杂的"LC_*"变量组合有什么好处(参见locale(1)).
即使纯英文文本也可能包含非ASCII字符,例如微微卷曲的左右引号在ASCII中是不可用的.
b''"b''b''双b''b''引b''b''号b''b''的b''b''文b''b''本b''b''"b''b''并b''b''非b''b''"b''b''双b''b''引b''b''号b''b''的b''ASCIIb''"b''b'''b''b''单b''b''引b''b''号b''b''的b''b''文b''b''本b''b'''b''b''并b''b''非b''b'''b''b''单b''b''引b''b''号b''b''的b''ASCIIb'''b''当纯ASCII文本数据转换为UTF-8后,它会具有与原本完全相同的内容和大小.
因此使用UTF-8语言环境并不会使你损失什么.
一些程序在支持I8N后会消耗更多的内存.
这是因为它们为了速度优化,而在内部使用UTF-32(UCS4)来支持Unicode,并且每个独立于语言环境所选的ASCII字符数据都会消耗4个字节.
再一次地,使用UTF-8语言环境并不会使你损失什么.
供应商指定的旧的非UTF-8编码系统在一些字符上往往有较小但恼人的不同,例如许多国家使用的字形.
而使用了UTF-8系统的现代操作系统基本上能解决这行编码冲突问题.
8.
4.
3语言环境的重新配置为了使系统访问特定的语言环境,必须从语言环境数据库编译相应语言环境数据.
(Debian系统不带有所有提前编译的可用语言环境,除非你安装locales-all软件包.
)所支持的可编译语言环境的完整列表位于"/usr/share/i18n/SUPPORTED",它列出了所有准确的语言环境名称.
下列命令列出已编译成二进制形式的所有可用的UTF-8语言环境.
$locale-a|greputf8下列的命令会重新配置locales软件包.
#dpkg-reconfigurelocales该过程包含3个步骤.
1.
更新可用的语言环境列表2.
将它们编译为二进制形式3.
在"/etc/default/locale"设置系统默认的语言环境值给PAM使用(参见第4.
5节)可用的语言环境列表应该包含"en_US.
UTF-8"和所有你感兴趣的带有"UTF-8"的语言.
对于美式英语,推荐默认的语言环境为"en_US.
UTF-8".
对于其它语言,请确保所选的语言环境带有"UTF-8".
这些设置中的任何一个都能够处理任何国际字符.
注意虽然将语言环境设置为"C"会使用美式英语,但它只处理ASCII字符.
Debian参考手册156/2628.
4.
4"$LANG"环境变量的值"$LANG"环境变量的值由许多应用程序设置和改变.
login(1)的PAM机制为本地Linux控制台程序进行了最初的设置显示管理器的PAM机制为所有的X程序进行了最初的设置ssh(1)的PAM机制为远程控制台程序进行了最初的设置一些显示管理器,例如gdm3(1)会为所有X程序改变设置通过"~/.
xsessionrc",X会话启动码会为所有X程序改变设置shell启动码,例如"~/.
bashrc",会为所有控制台程序改变设置提示将系统默认语言环境设置为"en_US.
UTF-8"能够获得最大的兼容性.
8.
4.
5只用于X窗口的特定语言环境你可以像下面那样选择只用于X窗口的特定语言环境,而不管你的系统使用PAM定制(参见第4.
5节)的默认语言环境.
这个环境能够给你提供最好的桌面体验,并保持稳定.
即使X窗口系统不工作,你也可以访问带有可读信息的多功能字符终端.
这对于使用非罗马字符(如中文,日语和韩语)的语言来说是必不可少的.
注意改善X会话管理软件包可能会使另一种可用的方法,但请阅读下面的内容作为设置语言环境的通用和基础的方法.
对于gdm3(1),我们知道你能够通过它的菜单来选择X会话的语言环境.
在PAM配置文件中的下面这行定义了语言环境的文件位置,例如"/etc/pam.
d/gdm3".
authrequiredpam_env.
soread_env=1envfile=/etc/default/locale将这行改成下面那样.
authrequiredpam_env.
soread_env=1envfile=/etc/default/locale-x对于中文,建立一个带有"-rw-r--r--1rootroot"权限的"/etc/default/locale-x"文件,并包含下面这行.
LANG="zh_CN.
UTF-8"保持用于其它程序的默认"/etc/default/locale"文件有下面这行.
LANG="en_US.
UTF-8"这是定制语言环境最通用的技术,并且会使gdm3(1)本身的菜单选择对话框被本地化.
对于该情况的另一种解决方法是使用"~/.
xsessionrc"文件来改变语言环境.
Debian参考手册157/2628.
4.
6文件名编码对于跨平台的数据交换(参见第10.
1.
7节),你需要使用特殊的编码挂载文件系统.
举个例子,不使用选项时,mount(8)假设vfat文件系统使用CP437.
你需要给文件名提供明确的挂载选项来使用UTF-8或CP932.
注意在GNOME这类的现代桌面环境下,当自动挂载一个热拔插U盘时,你可以提供这样的挂载选项.
右击桌面上的图标,点击"Drive","Setting",输入"utf8"到"Mountoptions:".
当这个U盘下次挂载时,UTF-8就可以了.
注意如果你在升级一个系统,或者从老的非UTF-8系统迁移磁盘,非ASCII字符的文件名也许是使用老旧的ISO-8859-1或eucJP来编码.
请寻求文本转换工具把他们转换到UTF-8.
参见第11.
1节.
在默认情况下,Samba对新的客户端(WindowsNT,200x,XP)使用Unicode,但对老的客户端(DOS和Windows9x/Me)使用CP850.
可以在"/etc/samba/smb.
conf"文件里面,使用"doscharset"来改变老客户端的这个默认编码.
比如说,CP932表示为日语.
8.
4.
7本地化信息和翻译文档在Debian系统中显示的许多文档和文本信息有翻译存在,比如错误信息、标准程序输出、菜单和手册页.
GNUgettext(1)命令工具链是大部分翻译活动的后端工具.
aptitude(8)里,"Tasks"→"Localization"提供一个有用的二进制包扩展列表,给应用程序增加本地化信息和提供翻译文档.
举个例子,你可以安装manpages-包来获得本地化man手册页信息.
从"/usr/share/man/it/"来读取意大利语的man手册页,执行下面的操作.
LANG=it_IT.
UTF-8man8.
4.
8语言环境的影响sort(1)的字符排序,受语言环境的影响.
西班牙语和英语语言环境排序是不一样的.
ls(1)的日期格式受语言环境影响.
"LANG=Cls-l"和"LANG=en_US.
UTF-8"的日期格式是不一样的(参见第9.
2.
5节).
不同语言环境的数字标点不一样.
比如说,英语语言环境中,一千点一显示为"1,000.
1",而在德语语言环境中,它显示为"1.
000,1".
你可以在电子表格程序里面看到这个不同.
Debian参考手册158/262Chapter9系统技巧这里,描述配置和管理系统的基本技巧,大部分在控制台操作.
9.
1screen程序对通过不可靠或断断续续的连接访问远程主机的人们而言,screen(1)是一个非常有用的工具,因为它支持可中断的网络连接.
软件包流行度大小说明screenV:127,I:2811013VT100/ANSI终端模拟器混合复用的终端tmuxV:34,I:136830终端复用的备选方案(使用"Control-B"代替)Table9.
1:支持可中断网络连接的程序列表9.
1.
1screen(1)的使用场景screen(1)不但允许一个终端窗口运行多个进程,还允许远程shell进程支持中断的连接.
这里是一个典型的screen(1)使用场景.
1.
登录到一个远程机器.
2.
在单个控制台上启动screen.
3.
使用^Ac("Control-A"接着"c")在screen中创建的窗口执行多个程序.
4.
按^An("Control-A"接着"n")来在多个screen窗口间转换.
5.
突然,你需要离开你的终端,但你不想丢掉正在做的工作,而这些工作需要连接来保持.
6.
你可以通过任何方式分离screen会话.
残忍地拔掉你的网络连接输入^Ad("Control-A"接着"d")并手工从远程连接退出登录输入^ADD("Control-A"接着"DD")分离screen并退出登录7.
你重新登录到同一个远处主机(即使从不同的终端).
8.
使用"screen-r"启动screen.
Debian参考手册159/2629.
screen魔术般的重新附上先前所有的screen窗口和所有在活动运行的程序.
提示对于拨号或者按包计费的网络连接,你可以通过screen节省连接费用,应为你可以在断开连接时让一个进程继续运行,当你稍后再次连接时重新附上它.
9.
1.
2screen命令的键绑定在screen会话里,除了命令按键外的所有键盘输入都会被发送到当前窗口.
screen所有命令按键是通过^A("Control-A")加单个键[加任何参数]来输入.
这里有一些重要的命令按键需要记住.
键绑定功能说明^A显示帮助屏幕(显示键绑定)^Ac创建一个新的窗口并切换到该窗口^An到下一个窗口^Ap到前一个窗口^A0到0号窗口^A1到1号窗口^Aw显示窗口列表^Aa作为键盘输入发送Ctrl-A到当前窗口^Ah把当前窗口的硬拷贝写到一个文件^AH开始/结束当前窗口到文件的记录^A^X锁定终端(密码保护)^Ad从终端分离screen会话^ADD分离screen会话并退出登录Table9.
2:screen键绑定列表细节参见screen(1).
9.
2数据记录和展示9.
2.
1日志后台守护进程(daemon)许多程序在"/var/log/"目录下记录它们的活动.
系统日志后台守护进程(daemon):rsyslogd(8)参见第3.
2.
5节和第3.
2.
4节.
9.
2.
2日志分析这里是主要的日志分析软件("~Gsecurity::log-analyzer"在aptitude(8)中).
注意CRM114提供语言架构来写模糊过滤器,使用了TRE正则表达式库.
它主要在垃圾邮件过滤器中使用,但也能够用于日志分析.
Debian参考手册160/262软件包流行度大小说明logwatchV:16,I:182265用Perl写的日志分析软件,有好的输出fail2banV:112,I:1232092禁用造成多个认证错误的IPanalogV:4,I:1093534web服务器日志分析awstatsV:9,I:156910强大和特性全面的web服务器日志分析sargV:3,I:3843生成squid分析报告pflogsummV:1,I:4111Postfix日志条目概要syslog-summaryV:0,I:230总结syslog日志文件内容fwlogwatchV:0,I:0479防火墙日志分析软件squidviewV:0,I:1189监控和分析squidaccess.
log文件swatchV:0,I:0101有正则表达式、高亮和曲线的日志文件查看器crm114V:0,I:01119ControllableRegexMutilator和垃圾邮件过滤(CRM114)icmpinfoV:0,I:044解释ICMP信息Table9.
3:系统日志分析软件列表9.
2.
3清晰的记录shell活动简单地使用script(1)(参见第1.
4.
9节)记录shell活动会产生一个有控制字符的文件.
这些控制字符可以按下面的方式,使用col(1)去掉.
$scriptScriptstarted,fileistypescript做些操作……按Ctrl-D退出script.
$col-bxcleanedfile$vimcleanedfile如果你没有script(例如:在initramfs里的启动过程中),你可以使用下面的方式代替.
$sh-i2>&1|teetypescript提示像gnome-terminal之类的x-terminal-emulator也能够记录.
你也许需要增加行缓冲来用滚动条查看.
提示你可以使用screen(1)和"^AH"(参见第9.
1.
2节)来进行控制台记录.
提示你可以使用emacs(1)和"M-xshell","M-xeshell",或"M-xterm"来进行控制台记录.
你稍后可以使用"C-xC-w"将缓冲写到文件.
9.
2.
4定制文本数据的显示尽管例如more(1)和less(1)这样的分页程序(参见第1.
4.
5节)和用于高亮和格式的自定义工具(参见第11.
1.
8节)可以漂亮地显示文本数据,但通用的编辑器(参见第1.
4.
6节)是用途最广的,且可定制性最高.
提示对于vim(1)和它的分页模式别名view(1),":sethls"可以启用高亮搜索.
Debian参考手册161/2629.
2.
5定制时间和日期的显示"ls-l"命令默认的时间和日期显示格式取决于语言环境(相关的值参见第1.
2.
6节).
"$LANG"变量将被首先考虑,但它会被"$LC_TIME"变量覆盖.
每个语言环境实际的默认显示格式取决于所使用的C标准库的版本(libc6软件包),也就是说,不同的Debian发行版有不同的默认情况.
如果你真的想自定义超出语言环境的时间和日期显示格式,你应该通过"--time-style"参数或"$TIME_STYLE"的值来设置时间样式值(参见ls(1)、date(1)、"infocoreutils'lsinvocation'").
时间样式值语言环境时间和日期显示iso任何值01-1900:15long-iso任何值2009-01-1900:15full-iso任何值2009-01-1900:15:16.
000000000+0900语言环境CJan1900:15语言环境en_US.
UTF-8Jan1900:15语言环境es_ES.
UTF-8ene1900:15+%d.
%m.
%y%H:%M任何值19.
01.
0900:15+%d.
%b.
%y%H:%MC或en_US.
UTF-819.
Jan.
0900:15+%d.
%b.
%y%H:%Mes_ES.
UTF-819.
ene.
0900:15Table9.
4:wheezy中"ls-l"命令时间和日期的显示案例提示你可以使用命令别名以避免在命令行中输入长的选项,例如"aliasls='ls--time-style=+%d.
%m.
%y\%H:%M'"(参见第1.
5.
9节).
提示ISO8601遵循这些iso格式.
9.
2.
6shell中echo的颜色大部分现代终端的shell中echo能够使用ANSI转义字符来显示颜色(参见"/usr/share/doc/xterm/ctlseqs.
txt.
gz")尝试下列例子$RED=$(printf"\x1b[31m")$NORMAL=$(printf"\x1b[0m")$REVERSE=$(printf"\x1b[7m")$echo"${RED}RED-TEXT${NORMAL}${REVERSE}REVERSE-TEXT${NORMAL}"9.
2.
7有颜色输出的命令在交互式的环境下,命令的输出带颜色,能够给检查命令的输出带来便利.
我在我的"~/.
bashrc"里加入了下面内容.
if["$TERM"!
="dumb"];theneval"'dircolors-b'"aliasls='ls--color=always'aliasll='ls--color=always-l'aliasla='ls--color=always-A'Debian参考手册162/262aliasless='less-R'aliasls='ls--color=always'aliasgrep='grep--color=always'aliasegrep='egrep--color=always'aliasfgrep='fgrep--color=always'aliaszgrep='zgrep--color=always'elsealiasll='ls-l'aliasla='ls-A'fi在交互式命令中,使用别名来限制颜色的影响范围.
导出环境变量"exportGREP_OPTIONS='--color=auto'"也有好处,这样能够让less(1)之类的页面程序看到颜色.
当使用管道到其它命令时,你想去掉颜色,上面列子"~/.
bashrc"中的内容,可以使用"--color=auto"代替.
提示在交互式的环境中,通过"TERM=dumbbash"调用shell,你能够关闭这些颜色别名.
9.
2.
8记录编辑器复杂的重复操作动作你能够记录编辑器复杂的重复操作动作.
对于Vim,请按下面操作.
"qa":开始记录输入字符到有名字的寄存器"a".
…编辑器操作"q":结束记录输入的字符.
"@a":执行寄存器"a的内容".
对于Emacs,请按下面操作.
"C-x(":开始定义一个键盘宏.
…编辑器操作"C-x)":结束定义一个键盘宏.
"C-xe":执行一个键盘宏.
9.
2.
9记录X应用程序的图形有少量方法可以记录X应用程序的图像,包括xterm显示.
软件包流行度大小命令xbase-clientsI:2646xwd(1)gimpV:68,I:34122313GUI菜单imagemagickI:400218import(1)scrotV:8,I:8070scrot(1)Table9.
5:图形图像处理工具列表Debian参考手册163/262软件包流行度大小说明etckeeperV:27,I:32162使用Git(默认)、Mercurial或Bazaar(新)来保存配置文件和它们的元数据changetrackV:0,I:071使用RCS(旧)保存配置文件Table9.
6:在VCS中记录配置历史的软件包9.
2.
10记录配置文件的变更有特定的工具可以通过DVCS系统的帮助来记录配置文件的变更.
我建议使用带有git(1)的etckeeper软件包,它将整个"/etc"置于VCS控制之下.
它的安装指南和教程参见"/usr/share/doc/etckeeper/README.
gz".
从本质上讲,运行"sudoetckeeperinit"来为"/etc"初始化git仓库,与第10.
6.
5节中所解释的过程相似,但需要特殊的hook脚本来进行更全面的设置.
当你改变你的配置时,你可以使用git(1)来正常地记录它们.
你每次运行软件包管理命令时,它也会自动记录变更.
提示你可以通过执行"sudoGIT_DIR=/etc/.
gitgitk"来浏览"/etc"的变更记录,你可以清晰地看到新的已安装软件包、已移除软件包和软件包版本的变更.
9.
3监控、控制和启动程序活动程序活动能够使用特殊的工具监控和控制.
软件包流行度大小说明coreutilsV:891,I:99917478nice(1):用指定的调度优先权运行一个程序bsdutilsV:673,I:999393renice(1):调整一个目前在运行的进程的调度优先权值procpsV:739,I:999792"/proc"文件系统工具:ps(1),top(1),kill(1),watch(1),…psmiscV:427,I:845679"/proc"文件系统工具:killall(1),fuser(1),peekfd(1),pstree(1)timeV:15,I:27982time(1):运行一个程序,并从时间消耗方面来报告系统资源的使用sysstatV:161,I:1831918sar(1),iostat(1),mpstat(1),…:linux系统性能工具isagV:0,I:3116sysstat的交互式的系统活动图lsofV:391,I:946451lsof(8):使用"-p"选项列出被一个系统进程打开的文件straceV:16,I:1532367strace(1):跟踪系统调用和信号ltraceV:1,I:21363ltrace(1):跟踪库调用xtraceV:0,I:0353xtrace(1):跟踪X11客户端和服务器端之间的通信powertopV:9,I:217662powertop(1):系统能耗使用信息cronV:805,I:997263根据cron(8)后台守护进程(daemon)的调度运行一个进程anacronV:409,I:48299用于非整天24小时运行系统的命令计划,类cronatV:162,I:310161at(1)或batch(1):在一个特定的时间运行任务或在某一系统负载下运行Table9.
7:监控和控制程序活动工具列表提示procps包提供了非常基础的监控、控制程序活动功能和启动程序功能.
你应当把他们全部学会.
Debian参考手册164/2629.
3.
1进程耗时显示命令调用进程的时间消耗.
#timesome_command>/dev/nullreal0m0.
035s#b''执b''b''行b''b''时b''b''间b''(b''占b''b''用b''b''的b''b''真b''b''实b''b''时b''b''间b'')user0m0.
000s#b''用b''b''户b''b''模b''b''式b''b''时b''b''间b''sys0m0.
020s#b''内b''b''核b''b''模b''b''式b''b''时b''b''间b''9.
3.
2调度优先级进程的调度优先级是被一个进程优先级值控制.
进程优先级值调度优先级19最低优先级进程0非常高的普通用户优先级进程-20root用户非常高的优先级进程Table9.
8:调度优先级值列表#nice-19top#b''非b''b''常b''b''优b''b''先b''#nice--20wodim-v-ejectspeed=2dev=0,0disk.
img#b''非b''b''常b''b''快b''在某些情况下,极端的进程优先级值会对系统造成伤害.
小心使用这个命令.
9.
3.
3ps命令在Debian系统上的ps(1)命令同时支持BSD和SystemV特征,有助于识别静态的进程活动.
样式典型的命令特征BSDpsaux显示%CPU%MEMSystemVps-efH显示PPIDTable9.
9:ps命令样式列表对于僵尸(死了的)子进程,你能够通过"PPID"字段的父进程ID来杀死它们.
pstree(1)命令显示进程树.
9.
3.
4top命令Debian系统上的top(1)拥有丰富的特征,有助于识别进程有趣的动态行为.
它是一个交互式的全屏程序.
你可以通过按"h"键来得到它的使用帮助,按"q"键来终止该程序.
9.
3.
5列出被一个进程打开的文件你能够通过一个进程ID(PID)来列出该进程所有打开的文件,例如,PID为1的进程,使用下面的方式.
$sudolsof-p1PID=1通常用于init程序.
Debian参考手册165/2629.
3.
6跟踪程序活动你能够跟踪程序活动,使用strace(1),ltrace(1),xtrace(1)来跟踪系统调用和信号、库调用、X11客户端和服务器端之间的通信.
跟踪ls命令的系统调用.
$sudostracels9.
3.
7识别使用文件和套接字的进程你可以通过fuser(1)来识别出使用文件的进程,例如,用下面的方式识别出"/var/log/mail.
log"由哪个进程打开.
$sudofuser-v/var/log/mail.
logUSERPIDACCESSCOMMAND/var/log/mail.
log:root2946F.
.
.
.
rsyslogd你可以看到"/var/log/mail.
log"是由rsyslogd(8)命令打开并写入.
你可以通过fuser(1)来识别出使用套接字的进程,例如,用下面的方式识别出"smtp/tcp"由哪个进程打开.
$sudofuser-vsmtp/tcpUSERPIDACCESSCOMMANDsmtp/tcp:Debian-exim3379F.
.
.
.
exim4现在你知道你的系统运行exim4(8)来处理连接到SMTP端口(25)的TCP连接.
9.
3.
8使用固定间隔重复一个命令watch(1)使用固定间隔重新执行一个命令,并全屏显示输出.
$watchw显示哪些人登录到系统,每2秒钟更新一次.
9.
3.
9使用文件循环来重复一个命令通过匹配某些条件的文件来循环重复一个命令,有几种方法,例如,匹配全局模式"*.
ext".
Shell循环方式(参见第12.
1.
4节):forxin*.
ext;doif[-f"$x"];thencommand"$x";fi;donefind(1)和xargs(1)联合:find.
-typef-maxdepth1-name'*.
ext'-print0|xargs-0-n1commandfind(1)使用"-exec"选项并执行命令:find.
-typef-maxdepth1-name'*.
ext'-execcommand'{}'\;find(1)使用"-exec"选项并执行一个短的shell脚本:find.
-typef-maxdepth1-name'*.
ext'-execsh-c"command'{}'&&echo'successful'"\;上面的列子确保适当处理怪异的文件名(如包含空格).
find(1)更多高级的用法,参见第10.
1.
5节.
Debian参考手册166/2629.
3.
10从GUI启动一个程序对于命令行界面(command-lineinterface,CLI),$PATH环境变量所指定的目录中第一个匹配相应名称的程序会被执行.
参见第1.
5.
3节.
对于遵从freedesktop.
org标准的图形用户界面(graphicaluserinterface,GUI),/usr/share/applications/目录中的*.
desktop文件给每个程序的GUI菜单显示提供了必要的属性.
参见第7.
2.
2节.
举个例子,chromium.
desktop文件中为"Chromium网络浏览器"定义了相关属性,例如程序名"Name",程序执行路径和参数"Exec",所使用的图标"Icon"等等(参见桌面配置项规范).
文件内容如下:[DesktopEntry]Version=1.
0Name=ChromiumWebBrowserGenericName=WebBrowserComment=AccesstheInternetComment[fr]=ExplorerleWebExec=/usr/bin/chromium%UTerminal=falseX-MultipleArgs=falseType=ApplicationIcon=chromiumCategories=Network;WebBrowser;MimeType=text/html;text/xml;application/xhtml_xml;x-scheme-handler/http;x-scheme-handler/←https;StartupWMClass=ChromiumStartupNotify=true这是一个较为简单的说明.
*.
desktop文件像下面那样被搜寻.
桌面环境设置$XDG_DATA_HOME和$XDG_DATA_DIR环境变量.
举个例子,在GNOME3中:未设置$XDG_DATA_HOME.
(将使用默认值$HOME/.
local/share.
)$XDG_DATA_DIRS被设置为/usr/share/gnome:/usr/local/share/:/usr/share/.
基准目录(参见XDGBaseDirectorySpecification)和应用程序目录如下所示.
$HOME/.
local/share/→$HOME/.
local/share/applications//usr/share/gnome/→/usr/share/gnome/applications//usr/local/share/→/usr/local/share/applications//usr/share/→/usr/share/applications/*.
desktop文件将按照这个顺序在这些applications目录中进行搜寻.
提示要建立一个用户自定义的GUI菜单项,需要在$HOME/.
local/share/applications/目录中添加一个*.
desktop文件.
提示相似地,如果在这些基准目录下的autostart目录中建立了一个*.
desktop文件,则*.
desktop文件中指定的程序会在桌面环境启动时自动执行.
参见DesktopApplicationAutostartSpecification.
提示相似地,如果在$HOME/Desktop目录中建立了一个*.
desktop文件并且桌面环境被配置为支持桌面图标启动器功能,则点击图标时指定的程序会被执行.
请注意,$HOME/Desktop目录的实际名称与语言环境有关.
参见xdg-user-dirs-update(1).
Debian参考手册167/2629.
3.
11自定义被启动的程序一些程序会被另一个程序自动启动.
下面是自定义该过程的方法.
应用程序配置菜单:–GNOME3桌面:"设置"→"系统"→"详细信息"→"默认应用程序"–KDE桌面:"K"→"ControlCenter控制中心"→"KDEComponents组件"→"ComponentChooser组件选择器"–Iceweasel浏览器:"编辑"→"首选项"→"应用程序"–mc(1):"/etc/mc/mc.
ext"例如"$BROWSER"、"$EDITOR"、"$VISUAL"和"$PAGER"这样的环境变量(参见eviron(7))用于例如"editor"、"view"、"x-www-browser"、"gnome-www-browser"和"www-browser"这样的程序的update-alternatives(1)系统(参见第1.
4.
7节)"~/.
mailcap"和"/etc/mailcap"文件的内容关联了程序的MIME类型(参见mailcap(5))"~/.
mime.
types"和"/etc/mime.
types"文件的内容关联了MIME类型的文件扩展名(参见run-mailcap(1))提示update-mime(8)会更新"/etc/mailcap"文件,期间会用到"/etc/mailcap.
order"文件(参见mailcap.
order(5)).
提示debianutils软件包提供sensible-browser(1)、sensible-editor(1)和sensible-pager(1),它们可以分别对要调用的编辑器、分页程序和网络浏览器作出明智的选择.
我建议你阅读那些shell脚本.
提示为了在X下运行例如mutt这样的控制台应用程序来作为你的首选应用程序,你应该像下面那样建立一个X应用程序并设置"/usr/local/bin/mutt-term"为你想要启动的首选应用程序.
#cat/usr/local/bin/mutt-term>$HOME/tmp/out2>&1#runat14:15onthefirstofeverymonth--outputmailedtopaul15141**$HOME/bin/monthly#runat22:00onweekdays(1-5),annoyJoe.
%fornewline,last%forcc:022**1-5mail-s"It's10pm"joe%Joe,%%Whereareyourkids%.
%%23*/212*echo"run23minutesafter0am,2am,4am.
.
.
,onFeb1"54**sunecho"runat04:05everySunday"#runat03:40onthefirstMondayofeachmonth4031-7date+%a)"=="Mon"]&&command-args提示对那些非连续运行的系统,安装anacron软件包来定时执行周期性的命令,命令在接近机器启动的时间运行,并允许有特定的时间间隔.
参见anacron(8)和anacrontab(5).
提示对于定时系统维护脚本,你能够以root账户定时运行,把这类脚本放入"/etc/cron.
hourly/","/etc/cron.
daily/","/etc/cron.
weekly/",或"/etc/cron.
monthly/".
这些脚本的执行时间,可以通过"/etc/crontab"和"/etc/anacrontab"来定制.
9.
3.
15Alt-SysRq键内核编译选项"MagicSysRqkey"(SAK键)提供预防系统故障的措施,该选项现在是Debian内核的默认值.
按Alt-SysRq键,接着按下面键中的一个键,会做拯救系统的神奇事情.
提示阅读signal(7),kill(1)和sync(1)手册页来理解上面的描述.
"Alt-SysRqs","Alt-SysRqu"和"Alt-SysRqr"组合,有助于跳出真正坏的情形,并可以在不停止系统的情况下获得可用的键盘.
参见"/usr/share/doc/linux-doc-3.
*/Documentation/sysrq.
txt.
gz".
Debian参考手册169/262Alt-SysRq之后的键行为描述r在X崩溃后,从raw模式恢复键盘0把控制台日志级别改变到0来减少错误信息kkill在当前虚拟控制台上的所有进程e发送SIGTERM到所有进程,除开init(8)i发送SIGKILL到所有进程,除开init(8)ssync所有已经挂载的文件系统来避免数据损坏u重新以只读方式挂载所有已挂载的文件系统(umount)breboot系统,不同步或卸载Table9.
11:SAK命令键列表小心由于允许用户访问root权限的功能,Alt-SysRq特性可能被认为是安全风险.
在"/etc/rc.
local"里面放入"echo0>/proc/sys/kernel/sysrq"或在"/etc/sysctl.
conf"里放入"kernel.
sysrq=0"来禁用Alt-SysRq特性.
提示从SSH终端等,你能够通过向"/proc/sysrq-trigger"写入内容来使用Alt-SysRq特性.
例如,从rootshell提示符运行"echos>/proc/sysrq-trigger;echou>/proc/sysrq-trigger"来syncs和umounts所有已挂载的文件系统.
9.
4系统维护技巧9.
4.
1谁在系统里你可以通过下面的方法检查谁登录在系统里.
who(1)显示谁登录在系统里面.
w(1)显示谁登录在系统里面,他们在做什么.
last(1)显示用户最后登录的列表.
lastb(1)显示用户最后错误登录的列表.
提示"/var/run/utmp"和"/var/log/wtmp"存储这样的用户信息.
参见login(1)和utmp(5).
9.
4.
2警告所有人你可以通过下面的方式使用wall(1)给登录系统的每一个人发送信息.
$echo"Weareshuttingdownin1hour"|wallDebian参考手册170/2629.
4.
3硬件识别对于PCI类设备(AGP,PCI-Express,CardBus,ExpressCard等),一开始就使用lspci(8)(也许加上"-nn"选项)进行硬件识别比较好.
此外,你可以通过阅读"/proc/bus/pci/devices"里面的内容或浏览"/sys/bus/pci"下面的目录树来进行硬件识别(参见第1.
2.
12节).
软件包流行度大小说明pciutilsV:195,I:992196LinuxPCI工具:lspci(8)usbutilsV:84,I:862324LinuxUSB工具:lsusb(8)pcmciautilsV:13,I:2197LinuxPCMCIA工具:pccardctl(8)scsitoolsV:0,I:3390SCSI硬件管理工具集:lsscsi(8)procinfoV:0,I:13135从"/proc":lsdev(8)获得系统信息lshwV:12,I:94842硬件配置信息:lshw(1)discoverV:41,I:94790硬件识别系统:discover(8)Table9.
12:硬件识别工具列表9.
4.
4硬件配置像GNOME和KDE这类现代图形桌面系统,虽然大部分硬件的配置都能够通过相应的图形配置工具来管理,但知道一些配置它们的基础方式,也是一个好的主意.
软件包流行度大小说明console-setupV:137,I:959411Linux控制台字体和键盘表工具x11-xserver-utilsV:282,I:534511X服务端工具:xset(1),xmodmap(1)acpidV:145,I:318176管理高级可配置和电源接口(ACPI)事件分发的后台守护进程(daemon)acpiV:17,I:30245显示ACPI设备信息的工具sleepdV:0,I:086在笔记本空闲时,使其进入休眠状态的后台守护进程(daemon)hdparmV:408,I:718256硬盘访问优化(参见第9.
5.
9节)smartmontoolsV:134,I:1972117使用S.
M.
A.
R.
T.
控制和监控存储系统setserialV:5,I:9117串口管理工具集memtest86+V:1,I:292391内存硬件管理工具集scsitoolsV:0,I:3390SCSI硬件管理工具集setcdV:0,I:135光驱访问优化big-cursorI:127X系统的大鼠标光标Table9.
13:硬件配置工具列表这里,ACPI是一个比APM新的电源管理系统框架.
提示现代系统的CPU频率调整功能,是由内核模块acpi_cpufreq管理的.
9.
4.
5系统时间和硬件时间下面设置系统的硬件时间为:MM/DDhh:mm,CCYY.
Debian参考手册171/262#dateMMDDhhmmCCYY#hwclock--utc--systohc#hwclock--showDebian系统的时间通常显示为本地时间,但硬件时间通常使用UTC(GMT)时间.
如果硬件(BIOS)时间设置为UTC时间,请在"/etc/default/rcS"里面设置"UTC=yes".
下面是重新配置Debian系统使用的时区.
#dpkg-reconfiguretzdata如果你希望通过网络来更新系统时间,考虑使用ntp,ntpdate和chrony这类包提供的NTP服务.
提示在systemd下,是使用systemd-timesyncd来替代进行网络时间同步.
参见systemd-timesyncd(8).
参见下面内容.
精确时间和日期管理HOWTONTP公共服务项目ntp-doc包提示在ntp包里面的ntptrace(8)能够跟踪NTP服务链至原始源.
9.
4.
6终端配置有几个组件可以用来配置字符控制台和ncurses(3)系统功能.
"/etc/terminfo/*/*"文件(terminfo(5))"$TERM"环境变量(term(7))setterm(1)、stty(1)、tic(1)和toe(1)如果xterm的terminfo对非Debian的xterm不起作用,则当你从远程登陆到Debian系统时,你需要改变你的终端类型"$TERM",从"xterm"更改为功能受限的版本(例如"xterm-r6").
更多内容参见"/usr/share/doc/libncurses5/F是"$TERM"中最通用的.
9.
4.
7声音基础设施用于现在的Linux的声卡设备驱动程序由高级Linux声音体系(AdvancedLinuxSoundArchitecture,ALSA)提供.
ALSA提供了兼容之前的开放声音系统(OpenSoundSystem,OSS)的模拟模式.
提示使用"cat/dev/urandom>/dev/audio"或speaker-test(1)来测试扬声器(^C停止).
Debian参考手册172/262软件包流行度大小说明alsa-utilsV:341,I:4762283配置和使用ALSA的工具oss-compatV:2,I:2920在ALSA下兼容OSS,预防"/dev/dspnotfound"错误jackdV:4,I:279JACKAudioConnectionKit.
(JACK)服务器(低延迟)libjack0V:1,I:13338JACKAudioConnectionKit.
(JACK)库(低延迟)nasV:0,I:0243网络音频系统(NetworkAudioSystem,NAS)服务器libaudio2V:60,I:488165网络音频系统(NetworkAudioSystem,NAS)库pulseaudioV:350,I:4716398PulseAudio服务器,替代ESDlibpulse0V:289,I:604969PulseAudio客户端库,替代ESDlibgstreamer1.
0-0V:372,I:5745280GStreamer:GNOME声音引擎libphonon4I:121680Phonon:KDE声音引擎Table9.
14:声音软件包提示如果你无法听到声音,那你的扬声器可能连接到了一个静音输出.
现代的声音系统有许多输出.
alsa-utils软件包中的alsamixer(1)可以很好地配置声音和静音设置.
应用软件可被配置为不仅直接访问声音设备,也可以通过一些标准化声音服务器系统来访问它们.
每个流行的桌面环境通常都有一个通用的声音引擎.
每个被应用程序使用的声音引擎都可以选择连接到不同的声音服务器.
9.
4.
8关闭屏幕保护关闭屏幕保护,使用下面的命令.
环境命令Linux控制台setterm-powersaveoffX窗口(关闭屏幕保护)xsetsoffX窗口(关闭dpms)xset-dpmsX窗口(屏幕保护GUI配置)xscreensaver-command-prefsTable9.
15:关闭屏幕保护命令列表9.
4.
9关闭蜂鸣声可以把电脑的扬声器拔掉来关闭蜂鸣声.
把pcspkr内核模块删除,也可以做到这点.
bash(1)用到的readline(3)程序,当遇到告警字符(ASCII=7)时,将会发生.
下面的操作将阻止发生.
$echo"setbell-stylenone">>~/.
inputrc9.
4.
10内存使用对你来说,这里有两种可用的方法来得到内存的使用情况.
"/var/log/dmesg"中的内核启动信息包含了可用内存的精确总大小.
free(1)和top(1)显示正在运行的系统中内存资源的相关信息.
Debian参考手册173/262下面是一个例子.
#grep'\]Memory'/var/log/dmesg[0.
004000]Memory:990528k/1016784kavailable(1975kkernelcode,25868kreserved,931k←data,296kinit)$free-ktotalusedfreesharedbufferscachedMem:997184976928202560129592171932-/+buffers/cache:675404321780Swap:454557644545572你可能会觉得奇怪:"dmesg告诉你free为990MB,而free-k告诉你free为320MB.
这丢失了超过600MB……".
别担心"Mem:"这行中"used"较大的值以及"free"较小的值,放轻松,你需要查看的是下面的那个(在上面的例子中它们是675404和321780).
对于我的MacBook,有1GB=1048576k内存(显卡系统用掉一些),我看到的如下.
报告大小dmesg中total的大小1016784k=1GB-31792kdmesg中的free990528kshell下的total997184kshell下的free20256k(但有效的为321780k)Table9.
16:报告的内存大小9.
4.
11系统安全性和完整性检查糟糕的系统维护可能会暴露你的系统,导致它被外部非法使用.
对于系统安全性和完整性的检查,你需要从下面这些方面开始.
debsums软件包,参见debsums(1)和第2.
5.
2节.
chkrootkit软件包,参见chkrootkit(1).
clamav软件包家族,参见clamscan(1)和freshclam(1).
DebiansecurityFAQ.
SecuringDebianManual.
软件包流行度大小说明logcheckV:8,I:10102后台守护进程(daemon),将系统日志文件中的异常通过邮件发送给管理员debsumsV:5,I:42107实用程序,使用MD5校验码对已安装软件包的文件进行校验chkrootkitV:5,I:24970rootkit检测软件clamavV:13,I:58774Unix的反病毒实用程序——命令行界面tigerV:2,I:37822报告系统安全漏洞tripwireV:2,I:311521文件和目录完整性检测软件johnV:2,I:12452先进的密码破解工具aideV:1,I:22063高级入侵环境检测——静态二进制integritV:0,I:0329文件完整性验证程序crackV:0,I:1149密码猜测程序Table9.
17:用于系统安全性和完整性检查的工具下面是一个简单的脚本,用来检测典型的所有人可写的错误文件权限.
Debian参考手册174/262#find/-perm777-a\!
-types-a\!
-typel-a\!
\(-typed-a-perm1777\)小心由于debsums软件包使用本地存储的MD5校验码,因此面对恶意攻击,也不能完全相信系统安全性检测工具.
9.
5数据存储技巧使用liveCD或debian-installerCD以救援模式启动你的系统,可以让你简单地重新配置你的启动设备的数据存储.
9.
5.
1硬盘空间使用情况硬盘空间的使用情况可以通过mount、coreutils和xdu软件包提供的程序来评估:mount(8)显示所有挂载的文件系统(=磁盘).
df(1)报告文件系统使用的硬盘空间.
du(1)报告目录树使用的硬盘空间.
提示你可以将du(8)的输出传输给xdu(1x),来使用它的图形交互式演示,例如"du-k.
|xdu"、"sudodu-k-x/|xdu"等等.
9.
5.
2硬盘分区配置对于硬盘分区配置,尽管fdisk(8)被认为是标准的配置,但是parted(8)工具还是值得注意的.
大多数PC使用经典的主引导记录(MasterBootRecord,MBR)方案,将硬盘分区数据保存在第一个扇区,即LBA扇区0(512字节).
注意一些带有可扩展固件接口(ExtensibleFirmwareInterface,EFI)的新PC,包括基于Intel的Mac,使用全局唯一标识分区表(GUIDPartitionTable,GPT)方案,硬盘分区数据不保存在第一个扇区.
尽管fdisk(8)一直是硬盘分区的标准工具,但现在parted(8)替代了它.
软件包流行度大小GPT说明util-linuxV:891,I:9994598不支持多种系统工具,包含fdisk(8)和cfdisk(8)partedV:363,I:561304支持GNUParted,硬盘分区调整程序gpartedV:19,I:1322046支持基于libparted的GNOME分区编辑程序gdiskV:278,I:513852支持用于GPT硬盘的分区编辑程序kpartxV:16,I:2987支持为分区建立设备映射的程序Table9.
18:硬盘分区管理软件包Debian参考手册175/262小心尽管parted(8)声称也能用来创建和调整文件系统,但使用维护最好的专门工具来做这些事会更为安全,例如mkfs(8)(mkfs.
msdos(8)、mkfs.
ext2(8)、mkfs.
ext3(8)、mkfs.
ext4(8)……)和resize2fs(8).

wordpress专业外贸建站主题 WordPress专业外贸企业网站搭建模版

WordPress专业外贸企业网站搭建模版,特色专业外贸企业风格 + 自适应网站开发设计 通用流行的外贸企业网站模块 + 更好的SEO搜索优化和收录 自定义多模块的产品展示功能 + 高效实用的后台自定义模块设置!采用标准的HTML5+CSS3语言开发,兼容当下的各种主流浏览器: IE 6+(以及类似360、遨游等基于IE内核的)、Firefox、Google Chrome、Safari、Opera...

sharktech:洛杉矶/丹佛/荷兰高防服务器;1G独享$70/10G共享$240/10G独享$800

sharktech怎么样?sharktech (鲨鱼机房)是一家成立于 2003 年的知名美国老牌主机商,又称鲨鱼机房或者SK 机房,一直主打高防系列产品,提供独立服务器租用业务和 VPS 主机,自营机房在美国洛杉矶、丹佛、芝加哥和荷兰阿姆斯特丹,所有产品均提供 DDoS 防护。不知道大家是否注意到sharktech的所有服务器的带宽价格全部跳楼跳水,降幅简直不忍直视了,还没有见过这么便宜的独立服...

819云(240元)香港CN2 日本CN2 物理机 E5 16G 1T 20M 3IP

819云是我们的老熟人了,服务器一直都是稳定为主,老板人也很好,这次给大家带来了新活动,十分给力 香港CN2 日本CN2 物理机 E5 16G 1T 20M 3IP 240元0官方网站:https://www.819yun.com/ 特惠专员Q:442379204套餐介绍套餐CPU内存硬盘带宽IP价格香港CN2 (特价)E5 随机分配16G1T 机械20M3IP240元/月日本CN2 (...

账号通为你推荐
googlepr值如何提高Google PR值?本公司www阅读http35邮箱邮箱地址怎么写温州都市报招聘劳务市场找工作可靠吗免费代理加盟免费加盟代销怎么回事,能具体介绍下么网站后台密码破解网站后台管理密码忘记了怎么破解啊高手进来.discuz教程Discuz怎样使用?localsettingss盘什么里的Local Settings这个文件是什么帝国cms帝国CMS能做出网站后台么?
万网免费域名 已备案域名出售 香港服务器99idc rackspace isatap 香港托管 紫田 nerd 英语简历模板word 回程路由 2017年黑色星期五 patcha 合肥鹏博士 促正网秒杀 国外代理服务器软件 gtt 绍兴电信 电信主机 电信托管 ca187 更多