个人工具

“UbuntuManual”的版本间的差异

来自Ubuntu中文

跳转至: 导航, 搜索
第 1 章 - 序言
第1行: 第1行:
== Ubuntu 参考手册 ==
+
Ubuntu 参考手册
----
+
'''摘要'''
=== 摘要 ===
+
 
Ubuntu 参考手册 旨在为'''运行 Ubuntu 的用户'''提供全面的指导。书中提供了大量 '''shell-command''' 实例,它们涵盖系统管理的方方面面,包括的主题有:Ubuntu 的基本概念、系统安装提示、Ubuntu 软件包管理、Ubuntu 中的 Linux 内核、系统微调、建立网关、文本编辑器、CVS、程序设计、面向'''非开发者'''的 GnuPG 等,每个主题都包括基础指南、实用技巧和其它相关信息。
 
Ubuntu 参考手册 旨在为'''运行 Ubuntu 的用户'''提供全面的指导。书中提供了大量 '''shell-command''' 实例,它们涵盖系统管理的方方面面,包括的主题有:Ubuntu 的基本概念、系统安装提示、Ubuntu 软件包管理、Ubuntu 中的 Linux 内核、系统微调、建立网关、文本编辑器、CVS、程序设计、面向'''非开发者'''的 GnuPG 等,每个主题都包括基础指南、实用技巧和其它相关信息。
  
 
----
 
----
=== 版权声明 ===
+
'''版权声明'''
 
本参考手册主要修改来源为 [http://qref.sourceforge.net/quick/reference.zh-cn.html Debian 中文参考手册], 依照其版权声明,采用同样的版权。
 
本参考手册主要修改来源为 [http://qref.sourceforge.net/quick/reference.zh-cn.html Debian 中文参考手册], 依照其版权声明,采用同样的版权。
  
第614行: 第613行:
  
 
(当然,要将NNN替换成你的内核版本号和修订版号。)
 
(当然,要将NNN替换成你的内核版本号和修订版号。)
 +
 +
== 第 3 章 - Ubuntu 系统安装提示 ==
 +
----
 +
Ubuntu 的官方安装文档位于 http://doc.ubuntu.com/ubuntu/install/ ,里面包含了 amd64、hppa、i386、ia64、powerpc和sparc的安装文档。中文翻译在 http://wiki.ubuntu.org.cn/ubuntu/install/
 +
 +
----
 +
=== 3.1 常规 Linux 安装提示 ===
 +
如果你在寻找精简的 Ubuntu 安装光盘,请别忘记检查 http://archive.ubuntu.com/ubuntu/dists/{发行版}/main/installer-{架构}/current/images/netboot/。
 +
 +
使用最新的开发版的 Ubuntu 会增加遇到严重软件错误的风险。在机器上安装一个稳定版本的 Ubuntu 然后使用多重启动方案可有效控制风险。或者使用更安全的 chroot 技巧,参阅 [[UbuntuHelp:../ch-tips.zh-cn.html| chroot, 第 8.6.35 节]]。后者可实现同时在不同的控制台运行多种版本的 Ubuntu
 +
 +
----
 +
==== 3.1.1 硬件兼容性 ====
 +
Linux 兼容绝大多数 PC 硬件,而且几乎可以安装在任何系统架构上。对我而言它的安装过程和 Windwos 95/98/Me 一样简单。可兼容的硬件列表也在不断增加。
 +
 +
如果你有一部笔记本电脑,可以去 [http://www.linux-laptop.net/ Linux on Laptops] 查找对应品牌和型号的安装指导。
 +
 +
我推荐的台式机硬件通常“比较保守”:
 +
 +
*  用于工作目的时最好选 SCSI 而不是 IDE,IDE/ATAPI HD 适于个人使用。
 +
*  IDE/ATAPI CD-ROM(或 CD-RW)。
 +
*  最好选 PCI 而不是 ISA, 特别是网卡(NIC)。
 +
*  选用便宜的 NIC。Tulip for PCI、NE2000 for ISA 都不错。
 +
*  初学 Linux 安装时避免使用 PCMCIA (笔记本电脑)。
 +
*  别使用 USB 键盘、鼠标......除非你想证明自己的实力。
 +
 +
如果你的机器特别慢,最好把硬盘插到另一个速度快些的机器上安装。
 +
 +
----
 +
==== 3.1.2 确定 PC 硬件和芯片组 ====
 +
在安装过程中,可能会要你确定电脑的硬件或芯片组等。有时了解这些信息并非易事,这儿有个方法:
 +
 +
 +
* 打开机箱亲自看看。
 +
* 记下显卡芯片、网卡芯片、串口和 IDE 端口周围的芯片上印的数字。
 +
* 记下印在 PCI 和 ISA 插卡背面的名称。
 +
 +
----
 +
==== 3.1.3 在 Ubuntu 下确定 PC 硬件 ====
 +
在 Linux 系统中使用下列命令,可获得机器当前使用的硬件及配置的相关信息。
 +
 +
<pre><nowiki>
 +
$ pager /proc/pci     
 +
$ pager /proc/interrupts     
 +
$ pager /proc/ioports     
 +
$ pager /proc/bus/usb/devices </nowiki></pre>
 +
 +
在安装过程中按 Alt-F2 进入控制台,可运行这些命令获得帮助。
 +
 +
在最初的安装结束之后,通过安装可选的软件包,比如 pciutils、usbutils 和 lshw,你就可以获得更多的系统信息。
 +
 +
<pre><nowiki>
 +
$ lspci -v |pager     
 +
$ lsusb -v |pager     
 +
 +
典型的中断用途
 +
 +
*  IRQ0: timer output (8254)
 +
*  IRQ1: keyboard controller
 +
*  IRQ2: cascade to IRQ8–IRQ15 on PC-AT
 +
*  IRQ3: secondary serial port (io-port=0x2F8) (/dev/ttyS1)
 +
*  IRQ4: primary serial port (io-port=0x3F8) (/dev/ttyS0)
 +
*  IRQ5: free [sound card (SB16: io-port=0x220, DMA-low=1, DMA-high=5)]
 +
*  IRQ6: floppy disk controller (io-port=0x3F0) (/dev/fd0, /dev/fd1)
 +
*  IRQ7: parport (io-port=0x378) (/dev/lp0)
 +
*  IRQ8: rtc
 +
*  IRQ9: software interrupt (int 0x0A), redirect to IRQ2
 +
*  IRQ10: free [network interface card (NE2000: io-port=0x300)]
 +
*  IRQ11: free [(SB16-SCSI: io-port=0x340, SB16-IDE: io-port=0x1E8,0x3EE)]
 +
*  IRQ12: PS/2 Mouse
 +
*  IRQ13: free (was 80287 math coprocessor)
 +
*  IRQ14: primary IDE controller (/dev/hda, /dev/hdb)
 +
*  IRQ15: secondary IDE controller (/dev/hdc, /dev/hdd)
 +
 +
对于旧的非 PnP ISA 卡,你可能需要在 BIOS 中设定 IRQ5,IRQ10 和 IRQ11 为非 PnP 设备。
 +
 +
对于USB设备,它们在 /proc/bus/usb/devices 中以 Cls=nn 的形式列出:
 +
 +
*  Cls=00 : Unused
 +
*  Cls=01 : Audio (speaker etc.)
 +
*  Cls=02 : Communication (MODEM, NIC, ...)
 +
*  Cls=03 : HID (Human Interface Device: KB, mouse, joystick)
 +
*  Cls=07 : Printer
 +
*  Cls=08 : Mass storage (FDD, CD/DVD drive, HDD, Flash, ...)
 +
*  Cls=09 : Hub (USB hub)
 +
*  Cls=255 : Vendor specific
 +
 +
如果设备类别(device class)不是 255,则 Linux 可支持该设备。
 +
 +
----
 +
==== 3.1.4 在其它 OS 下确定 PC 硬件 ====
 +
还可从其它操作系统中获取硬件信息。
 +
 +
安装其它商业版 Linux,当前它们在硬件侦测方面做得比 Debian 好。
 +
 +
安装 Windows。用鼠标右键点“我的电脑”在菜单中选属性/设备管理,可获得硬件配置信息。记下所有的资源信息如 IRQ、I/O 端口地址和 DMA。有些旧的 ISA 卡可能要在 DOS 下配置。
 +
 +
----
 +
==== 3.1.5 Lilo 神话 ====
 +
"Lilo 受限于 1024 柱面。" 大错特错!
 +
 +
Ubuntu 之后使用的新版 lilo 支持 lba32。只要主板的 BIOS 版本支持 lba32,lilo 就可以突破 1024 柱面的限制。
 +
 +
如果你使用的是旧版 lilo.conf,请确定在你的 lilo.conf 文件开头的某处加了一行命令指示系统读取“lba32”。参阅 /usr/share/doc/lilo/Manual.txt.gz。
 +
 +
----
 +
==== 3.1.6 GRUB ====
 +
GNU Hurd 项目组提供的新的系统引导工具 grub 可使用于 Debian Woody 系统。
 +
 +
<pre><nowiki>
 +
 +
要编辑 GRUB 菜单,可编辑 /boot/grub/menu.lst 文件。参阅[[UbuntuHelp:../ch-tips.zh-cn.html| 设置 GRUB 启动参数, 第 8.1.6 节]]获取有关启动参数设置信息,它和 lilo 的设置方法不太一样。
 +
 +
----
 +
==== 3.1.7 选择引导软盘 ====
 +
你可以使用 bootcd 包,来制作一个可以启动的软盘,当然我们更推荐你直接使用LiveCD来作为维护系统的工具。对于最新的dapper版本,你可以直接使用Desktop CD从光盘启动来维护,或者安装系统。
 +
 +
----
 +
==== 3.1.8 安装系统 ====
 +
这方面的官方文档在  http://doc.ubuntu.com/ubuntu/install/i386 ,中文翻译在:http://wiki.ubuntu.org.cn/ubuntu/install/i386
 +
 +
在安装 /dev/hda 的 mbr 时,我喜欢将 lilo 装在诸如 /dev/hda3 的位置,这样做可以减小引导信息被覆盖的风险。
 +
 +
下面是我在安装过程中所做的选择。
 +
 +
*  MD5 passwords "yes"
 +
*  shadow passwords "yes"
 +
*  Install "advanced" (dselect **) and select
 +
**    取消 emacs (如果它被选中了)、nvi、tex、telnet、talk(d);
 +
**    选上 mc、vim,nano-tiny 和 elvis-tiny 任选一个。
 +
参阅 [[UbuntuHelp:../ch-package.zh-cn.html| dselect, 第 6.2.4 节]]。即使你是个 Emacs 迷也不要在安装阶段使用它,nano 可满足你的需要。也不要安装其它庞大的软件包如 Tex(Potato 曾在此阶段设置它为默认安装)。参阅[[UbuntuHelp:../ch-edit.zh-cn.html| 应急的编辑器, 第 11.2 节]]了解此时安装 nano-tiny 或 elvis-tiny 的原因。
 +
*  在每个软件包安装对话框中,回答所有的配置提问均=“y”(替换当前值)
 +
*  exim:选第2项,因为我使用 ISP 的 SMTP 服务器发送邮件。
 +
 +
有关 dselect 的更多信息,参阅[[UbuntuHelp:../ch-package.zh-cn.html| dselect, 第 6.2.4 节]]。
 +
 +
----
 +
==== 3.1.9 网络所需的主机名和 IP 地址 ====
 +
LAN 配置的例子(C subnet: 192.168.1.0/24):
 +
 +
<pre><nowiki>
 +
Internet
 +
|
 +
+--- 外部 ISP 提供 POP 服务(使用 fetchmail 访问)
 +
|
 +
Access point ISP 提供 DHCP 服务和 SMTP 中继服务
 +
|                    :
 +
Cable modem        (Dialup)
 +
|                    :
 +
LAN 网关外部端口: eth0(IP 由 ISP 的 DHCP 提供)
 +
使用老式笔记本电脑(IBM Thinkpad, 486 DX2 50 MHz, 20MB RAM)
 +
运行 Linux 2.4 内核,提供 ext3 文件系统支持
 +
运行“ipmasq”软件包(安装它的补丁、NAT 和 firewall)
 +
运行“dhcp-client”软件包配置 eth0(覆盖 DNS 的设定)
 +
运行“dhcp”软件包配置 eth1
 +
运行“exim”作为 smarthost(mode 2)
 +
运行“fetchmail”设一个较长的时间值(fallback)
 +
运行“bind”作为高速域名服务器,在从 LAN 连入 Internet 时
 +
作为认证域名服务器,在从 LAN 中连入网中某个域时
 +
运行“ssh”使用端口 22 和 8080(从任何地点连接)
 +
运行“squid”作为缓存服务器连接 Debian 包文档服务器(APT 需要连接它)
 +
LAN 网关内部端口:eth1 (IP = 192.168.1.1,固定)
 +
|
 +
+--- LAN Switch (100 base T) ---+
 +
|                              |
 +
LAN 中一些固定 IP 客户端            LAN 中一些 DHCP客户端
 +
(IP == 192.168.1.2-127, 固定)    (IP == 192.168.1.128-200, 动态) </nowiki></pre>
 +
 +
参阅 [[UbuntuHelp:../ch-gateway.zh-cn.html| 网络设置, 第 10 章]] 了解更多网络设置方面的信息。 参阅 [[UbuntuHelp:../ch-gateway.zh-cn.html| 建立路由网关, 第 10.12 节]] 了解更多 LAN 网关服务器设置方面的信息。
 +
 +
----
 +
==== 3.1.10 用户帐号 ====
 +
为了让机器访问起来有一致的感觉,我的系统中开头几个帐号通常是不变的。
 +
 +
我首先创建的用户帐号名是“admin”(uid=100)。我通过该帐号转发所有的 root email。该帐号加入到 adm 用户组(参阅[[UbuntuHelp:../ch-tune.zh-cn.html| “为什么 GNU su 命令不支持 wheel group”, 第 9.2.2 节]]),这个用户组为成员提供大量 root 特权的命令,通过 su 或 sudo 命令就能使用 PAM。详情参阅[[UbuntuHelp:../ch-tutorial.zh-cn.html| 添加一个用户, 第 4.1.3 节]]。
 +
 +
----
 +
==== 3.1.11 创建文件系统 ====
 +
----
 +
===== 3.1.11.1 硬盘分区 =====
 +
我更喜欢将不同的目录树分别装在不同的分区下,这样可以将系统崩溃造成的损失减到最小。例如:
 +
 +
<pre><nowiki>
 +
/          == (/ + /boot + /bin + /sbin)
 +
== 50MB+
 +
/tmp      == 100MB+
 +
/var      == 100MB+
 +
/home      == 100MB+
 +
/usr      == 700MB+ with X
 +
/usr/local == 100MB </nowiki></pre>
 +
 +
/usr 目录的大小很大程度上取决于 X window 应用程序和文档的数目。如果只运行控制台终端 /usr 可以小到 300MB,但如果你装了大量 Gnome 应用程序 2GB-3GB 也很正常。当 /usr/ 增长得太大,将 /usr/share/ 移到别的分区是最有效的解救方法。对新的 Linux2.4 内核包,/ 目录的大小可能要超过 200MB。
 +
 +
例如,当前我的 Internet 网关服务器的硬盘使用情况如下(由 df -h 命令输出):
 +
 +
<pre><nowiki>
 +
Filesystem            Size  Used Avail Use% Mounted on
 +
/dev/hda3            300M  106M  179M  38% /
 +
/dev/hda7            100M  12M  82M  13% /home
 +
/dev/hda8            596M  53M  513M  10% /var
 +
/dev/hda6            100M  834k  94M  1% /var/lib/cvs
 +
/dev/hda9            596M  222M  343M  40% /usr
 +
/dev/hda10            596M  130M  436M  23% /var/cache/apt/archives
 +
/dev/hda11            1.5G  204M  1.2G  14% /var/spool/squid </nowiki></pre>
 +
 +
(有块大空间留给 /var/spool/squid 作为下载软件包时代理服务器的缓冲区。)
 +
 +
下面的 fdisk -l 输出提供了一个分区分配方案:
 +
 +
<pre><nowiki>
 +
# fdisk -l /dev/hda # comment
 +
 +
/dev/hda1            1        41    309928+  6  FAT16 # DOS
 +
/dev/hda2            42        84    325080  83  Linux # (not used)
 +
/dev/hda3  *        85      126    317520  83  Linux # Main
 +
/dev/hda4          127      629  3802680    5  Extended
 +
/dev/hda5          127      143    128488+  82  Linux swap
 +
/dev/hda6          144      157    105808+  83  Linux
 +
/dev/hda7          158      171    105808+  83  Linux
 +
/dev/hda8          172      253    619888+  83  Linux
 +
/dev/hda9          254      335    619888+  83  Linux
 +
/dev/hda10          336      417    619888+  83  Linux
 +
/dev/hda11          418      629  1602688+  83  Linux </nowiki></pre>
 +
 +
里面有一个未使用的分区。留作安装第二个 Linux 或为增长的目录树提供扩充余地。
 +
 +
----
 +
===== 3.1.11.2 挂载文件系统 =====
 +
下面的 /etc/fstab 文件可完成上述分区的挂载工作:
 +
 +
<pre><nowiki>
 +
# /etc/fstab: 静态的文件系统信息。
 +
#
 +
# filesystem  mount point    type    options                dump pass
 +
/dev/hda3      /              ext2    defaults,errors=remount-ro 0 1
 +
/dev/hda5      none            swap    sw                      0 0
 +
proc            /proc          proc    defaults                0 0
 +
/dev/fd0        /floppy        auto    defaults,user,noauto    0 0
 +
/dev/cdrom      /cdrom          iso9660 defaults,ro,user,noauto 0 0
 +
#
 +
# 各分区保持独立
 +
/dev/hda7      /home          ext2    defaults                0 2
 +
/dev/hda8      /var            ext2    defaults                0 2
 +
/dev/hda6      /var/lib/cvs    ext2    defaults                0 2
 +
# noatime 会提高读取文件时的访问速度
 +
/dev/hda9      /usr            ext2    defaults,noatime        0 2
 +
/dev/hda10      /var/cache/apt/archives ext2    defaults        0 2
 +
 +
# 为代理缓存设置的大分区
 +
/dev/hda11      /var/spool/squid ext2  rw                      0 2
 +
 +
# 备份、可启动、DOS
 +
/dev/hda1      /mnt/dos        vfat    rw,noauto              0 0
 +
# 作为备份用的可启动的 Linux 系统(未设置)
 +
/dev/hda2      /mnt/linux      ext2    rw,noauto              0 0
 +
#
 +
# nfs 挂载点
 +
mickey:/        /mnt/mickey    nfs    ro,noauto,intr          0 0
 +
goofy:/        /mnt/goofy      nfs    ro,noauto,intr          0 0
 +
# minnie:/ /mnt/minnie smbfs ro,soft,intr,credentials={filename} 0 2</nowiki></pre>
 +
 +
对于 NFS,我使用 noauto、intr 以及默认的 hard 项。如果有死连接,挂载进程可能会死掉,可以使用 Ctrl-C 恢复。
 +
 +
对于使用 Samba 连接的 Windows 机器(smbfs),rw,auto,soft,intr 是个好方案,参阅 [[UbuntuHelp:../ch-install.zh-cn.html| Samba 设置, 第 3.5 节]]。
 +
 +
对于软驱,使用 noauto,rw,sync,user,exec 可以防止因退盘前未执行卸载命令而造成文件损坏,但它会降低写盘速度。
 +
 +
----
 +
===== 3.1.11.3 自动挂载 =====
 +
自动挂载的要点:
 +
 +
*  加载 vfat 模块,从而 /etc/auto.misc 可使用 -fstype=auto 参数:
 +
<pre><nowiki>
 +
# 在试图访问软驱之前
 +
# modprobe vfat        ... 或者使这个设置自动完成,
 +
# echo "vfat" >> /etc/modules      ... 重启系统。 </nowiki></pre>
 +
*  设置 /etc/auto.misc 如下:
 +
<pre><nowiki>
 +
floppy -fstype=auto,sync,nodev,nosuid,gid=100,umask=000 :/dev/fd0      ... 此处 gid=100 表示 “users”。 </nowiki></pre>
 +
*  在 /home/user 中创建链接文件 cdrom 和 floppy ,分别指向 /var/autofs/misc/cdrom 和 /var/autofs/misc/floppy。
 +
*  将 user 加入“users”用户组。
 +
 +
----
 +
===== 3.1.11.4 挂载 NFS =====
 +
外部 Linux NFS 服务器(goofy)处于防火墙(gateway)之后。在我的 LAN 内部,安全策略非常宽松,因为只有我自己一个用户。为了访问 NFS,NFS 服务器端要按如下方式加上 /etc/exports:
 +
 +
<pre><nowiki>
 +
# /etc/exports: the access control list for filesystems which may be
 +
#              exported to NFS clients.  See exports(5).      /      (rw,no_root_squash) </nowiki></pre>
 +
 +
除安装和激活 NFS 服务器及客户机的软件包外,这一步对激活 NFS 服务器也是必要的。
 +
 +
为了简洁明了,我通常创建一个单独的 2GB 分区,用它进行实验或玩玩别的 Linux 系统。我有选择的共享了两个系统的 swap 和 /tmp 分区。多分区方案很难满足这种要求。如果只想装一个运行简单控制台模式的系统,分区留 500MB 就绰绰有余了。
 +
 +
----
 +
==== 3.1.12 DRAM 内存指导 ====
 +
下列是有关 DRAM 的简单指导。
 +
 +
<pre><nowiki>
 +
4MB:  Linux 内核运行的最低配置。
 +
16MB:  控制台系统运行的最低配置。
 +
32MB:  简单 X 系统运行的最低配置。
 +
64MB:  GNOME/KDE 系统运行最低配置。
 +
128MB:  流畅运行 GNOME/KDE。
 +
256MB:  如果你银子充裕干嘛不呢?DRAM 很便宜了。 </nowiki></pre>
 +
 +
使用启动选项 mem=4m(或lilo append="mem=4m")可以看看只用 4MB 内存时系统如何运行。如果机器的 BIOS 比较旧且内存数大于 64MB 启动时就得加 lilo 启动参数。
 +
 +
----
 +
==== 3.1.13 Swap 空间 ====
 +
我按下面的指导原则来划分 swap 空间:
 +
 +
*  每个 swap 分区均 <128MB(使用旧版2.0内核),<2GB(使用最新内核)
 +
*  总容量 =(机器内存大小的 1 到 2 倍)或(128MB 到 2GB 之间)
 +
*  将它们分散于不同的硬盘,在 /etc/fstab 中可使用 sw,pri=1 选项挂载它们。这样可确保内核以 RAID 方式使用 swap 分区,最大限度地发挥 swap 的性能。
 +
*  如果可能,使用硬盘中间的扇区。
 +
 +
尽管你不一定真的需要,但为系统设置多一些 swap 空间(128MB)总要好点,至少运行有内存漏洞的坏程序,系统会先慢下来而不是马上死机。
 +
 +
----
 +
=== 3.2 Bash 设置 ===
 +
我按自己的喜好修改 shell 启动脚本:
 +
 +
<pre><nowiki>
 +
/etc/bash.bashrc        换成你的喜好
 +
/etc/profile            保持发布版设定 ( \w -> \W)
 +
/etc/skel/.bashrc      换成你的喜好
 +
/etc/skel/.profile      换成你的喜好
 +
/etc/skel/.bash_profile 换成你的喜好
 +
~/.bashrc              换成你的喜好,会改变所有用户的设置
 +
~/.profile              换成你的喜好,会改变所有用户的设置
 +
~/.bash_profile        换成你的喜好,会改变所有用户的设置 </nowiki></pre>
 +
 +
[[UbuntuHelp:../examples/| 可以参考我提供的脚本样例]]。我喜欢系统看起来清清楚楚,所以将 umask 设为 002 或 022。
 +
 +
PATH 依次由以下配置文件设定:
 +
 +
<pre><nowiki>
 +
/etc/login.defs  - 在 shell 之前设定 PATH
 +
/etc/profile    (会调用 /etc/bash.bashrc)
 +
~/.bash_profile  (会调用 ~/.bashrc) </nowiki></pre>
 +
 +
----
 +
=== 3.3 鼠标设置 ===
 +
----
 +
==== 3.3.1 PS/2 鼠标 ====
 +
对于 ATX 主板上使用 PS/2 接口的鼠标,信号通路如下:
 +
 +
<pre><nowiki>
 +
mouse -> /dev/psaux -> gpm -> /dev/gpmdata = /dev/mouse -> X </nowiki></pre>
 +
 +
这里,创建指向 /dev/gpmdata 的符号链接 /dev/mouse,有助于简化配置操作。(例如,如果你决定不再使用 gpm 服务,只需在删掉 gpm 服务后,将符号链接 /dev/mouse 指向 /dev/psaux。)
 +
 +
信号通路使得对键盘和鼠标插拔操作,只要重启 gpm 就可以生效,不必重启 X!
 +
 +
处于 gpm 输出与 X 输入之间的信号通路协议有两种执行方式,“ms3”(使用 Microsoft 3-button serial mouse 协议)和“raw”(对于已连接的鼠标使用相同的协议),此处选择的协议将决定 X 配置中使用的协议。
 +
 +
目前 dapper 发行版并没有默认安装 gpm ,如果需要使用它,手工安装如下:
 +
<pre><nowiki>
 +
sudo apt-get install gpm</nowiki></pre>
 +
 +
下面我将示范一下如何配置 Logitech 3-button(传统Unix 风格的鼠标)PS/2 鼠标:
 +
 +
----
 +
===== 3.3.1.1 使用 ms3 协议方式 =====
 +
<pre><nowiki>
 +
/etc/gpm.conf            | /etc/X11/xorg.conf
 +
=========================+======================================
 +
device=/dev/psaux        | Section "InputDevice"
 +
responsiveness=          |  Identifier "Configured Mouse"
 +
repeat_type=ms3          |  Driver    "mouse"
 +
type=autops2            |  Option    "CorePointer"
 +
append=""                |  Option    "Device"  "/dev/mouse"
 +
sample_rate=            |  Option    "Protocol" "IntelliMouse"
 +
| EndSection </nowiki></pre>
 +
 +
如果使用这种方式,设置鼠标类型只需编辑 gpm.conf ,X 的设置将保持不变。参阅[[UbuntuHelp:../examples/| 我的样例脚本]]。
 +
 +
----
 +
===== 3.3.1.2 使用 raw 协议方式 =====
 +
<pre><nowiki>
 +
/etc/gpm.conf            | /etc/X11/xorg.conf
 +
=========================+======================================
 +
device=/dev/psaux        | Section "InputDevice"
 +
responsiveness=          |  Identifier "Configured Mouse"
 +
repeat_type=raw          |  Driver    "mouse"
 +
type=autops2            |  Option    "CorePointer"
 +
append=""                |  Option    "Device"  "/dev/mouse"
 +
sample_rate=            |  Option    "Protocol" "MouseManPlusPS/2"
 +
| EndSection </nowiki></pre>
 +
 +
如果使用这种方式,设置鼠标类型可编辑 gpm.conf,同时也会改变 X 的设置。
 +
 +
----
 +
===== 3.3.1.3 如何设置不同的鼠标 =====
 +
gpm 的设备类型 autops2 可以自动检测出市面上大多数 PS/2 鼠标。不幸的是它也不是万能的,而且目前的发布版中并不包括它,这时可在 gpm.conf 中试试 ps2 或者 imps2。想看看 gpm 支持哪些类型的鼠标可输入:gpm -t help。参阅 gpm(8)。
 +
 +
如果使用的是 2 键 PS/2 鼠标,可选上 X 协议的 Emulate3Buttons 项。协议中 2 键鼠标和 3 键鼠标的区别在于每次按下中间键时,是自动检测还是自动模拟信号传给 gpm。
 +
 +
对于在 X 协议[[UbuntuHelp:../ch-install.zh-cn.html| 使用 raw 协议方式, 第 3.3.1.2 节]] 或不使用 gpm,可使用下面的设置:
 +
 +
*  IntelliMouse: 串口鼠标(gpm 转换器使用“ms3”)
 +
*  PS/2: PS/2 鼠标(通常首先试试这项)
 +
*  IMPS/2: 任何 PS/2 鼠标(2键、3键或滚轴鼠标)
 +
*  MouseManPlusPS/2: Logitech PS/2 鼠标
 +
*  ...
 +
 +
更多信息可浏览 [http://www.xfree86.org/current/mouse.html Mouse Support in XFree86]。
 +
 +
典型的 Microsoft 滚轴鼠标,有报导说这样设置最好:
 +
 +
<pre><nowiki>
 +
/etc/gpm.conf            | /etc/X11/XF86Config-4
 +
=========================+======================================
 +
device=/dev/psaux        | Section "InputDevice"
 +
responsiveness=          |  Identifier "Configured Mouse"
 +
repeat_type=raw          |  Driver    "mouse"
 +
type=autops2            |  Option    "CorePointer"
 +
append=""                |  Option    "Device"  "/dev/mouse"
 +
sample_rate=            |  Option    "Protocol" "IMPS/2"
 +
|  Option    "Buttons" "5"
 +
|  Option  "ZAxisMapping" "4 5"
 +
| EndSection </nowiki></pre>
 +
 +
对于某些最新的 Toshiba 超薄笔记本,在 System-V init 脚本中设置 gpm 先于 PCMCIA 激活可防止系统锁死。听起来古怪不过这是真的。
 +
 +
----
 +
==== 3.3.2 USB 鼠标 ====
 +
请确定你设置了所有必须的 kernel 选项,并在编译的时候编入内核或编成模块了:
 +
 +
*  在 “Input Core Support”选项下:
 +
**    "Input core support" (CONFIG_INPUT, input.o),
 +
**    "Mouse support" (CONFIG_INPUT_MOUSEDEV, mousedev.o),
 +
*  在 “USB support”选项下:
 +
**    "Support for USB" (CONFIG_USB, usbcore.o),
 +
**    "Preliminary USB device filesystem" (CONFIG_USB_DEVICEFS),
 +
**    "UHCI" or "OHCI" (CONFIG_USB_UHCI || CONFIG_USB_UHCI_ALT || CONFIG_USB_OHCI, usb-uhci.o || uhci.o || usb-ohci.o),
 +
**    "USB Human Interface Device (full HID) support" (CONFIG_USB_HID, hid.o), and
 +
**    "HID input layer support" (CONFIG_USB_HIDINPUT)
 +
 +
这儿,模块的名称为小写。
 +
 +
如果你没使用 devfs,则需按下面的方法创建一个设备节点 /dev/input/mice:
 +
 +
<pre><nowiki>
 +
# cd /dev
 +
# mkdir input
 +
# mknod input/mice c 13 63 </nowiki></pre>
 +
 +
对于典型的滚轴 '''USB''' 鼠标,配置如下:
 +
 +
<pre><nowiki>
 +
/etc/gpm.conf            | /etc/X11/XF86Config-4
 +
=========================+======================================
 +
device=/dev/input/mice  | Section "InputDevice"
 +
responsiveness=          |  Identifier "Generic Mouse"
 +
repeat_type=raw          |  Driver    "mouse"
 +
type=autops2            |  Option    "SendCoreEvents" "true"
 +
append=""                |  Option    "Device"  "/dev/input/mice"
 +
sample_rate=            |  Option    "Protocol" "IMPS/2"
 +
|  Option    "Buttons" "5"
 +
|  Option  "ZAxisMapping" "4 5"
 +
| EndSection </nowiki></pre>
 +
 +
更多信息可浏览 [http://www.linux-usb.org/ the Linux USB Project]。
 +
 +
----
 +
==== 3.3.3 触摸屏(Touchpad) ====
 +
尽管触摸屏在笔记本电脑上默认是模拟 2 键 PS/2 鼠标的行为,仍可从 tpconfig 软件包获得对这类设备的完全操控。例如在 /etc/default/tpconfig 中设置 OPTIONS="--tapmode=0" 可屏蔽讨厌的“click by tap”行为。按如下方法设置 /etc/gpm.conf 可以控制台下使用触摸屏和 USB 外接鼠标。
 +
 +
<pre><nowiki>
 +
device=/dev/psaux
 +
responsiveness=
 +
repeat_type=ms3
 +
type=autops2
 +
append="-M -m /dev/input/mice -t autops2"
 +
sample_rate= </nowiki></pre>
 +
 +
----
 +
=== 3.4 NFS 设置 ===
 +
安装 NFS 要设置/etc/exports。
 +
 +
<pre><nowiki>
 +
# apt-get install nfs-kernel-server
 +
# echo "/ *.domainname-for-lan-hosts(rw,no_root_squash,nohide)" \
 +
>> /etc/exports </nowiki></pre>
 +
 +
[[UbuntuHelp:../examples/| 详情见我的样例脚本]].
 +
 +
----
 +
=== 3.5 Samba 设置 ===
 +
参考资料:
 +
 +
*  http://www.samba.org/
 +
*  samba-doc package
 +
 +
以“share”方式安装 Samba 比较容易,因为安装过程会创建 WfW-type 共享驱动器。但最好使用“user”模式来配置它。
 +
 +
可以用 debconf 或 vi 来设置 Samba:
 +
 +
<pre><nowiki>
 +
# dpkg-reconfigure --priority=low samba
 +
# vi /etc/samba/smb.conf </nowiki></pre>
 +
 +
[[UbuntuHelp:../examples/| 详情参阅我的脚本样例]].
 +
 +
可通过 smbpasswd 向 smbpasswd 文件添加一个新用户:
 +
 +
<pre><nowiki>
 +
# smbpasswd -a username </nowiki></pre>
 +
 +
确保使用的加密密码有恰当的兼容性。
 +
 +
按下表中相应的值设定 os level(数字越大,服务器的优先级越高):
 +
 +
<pre><nowiki>
 +
0:      Samba with a loose attitude (will never become a master browser)
 +
1:      WfW 3.1, Win95, Win98, Win/Me?
 +
16:    Win NT WS 3.51
 +
17:    Win NT WS 4.0
 +
32:    Win NT SVR 3.51
 +
33:    Win NT SVR 4.0
 +
255:    Samba with mighty power </nowiki></pre>
 +
 +
确认用户是共享目录所属组的成员,并且对目录赋予了执行权限。
 +
 +
----
 +
=== 3.6 打印机设置 ===
 +
传统打印方法是 lpr/lpd。新的 CUPS 系统(Common UNIX Pinting System)提供了另一方法 PDQ,详情参阅 [http://www.tldp.org/HOWTO/Printing-HOWTO.html Linux Printing HOWTO]。
 +
 +
----
 +
==== 3.6.1 lpr/lpd ====
 +
对于 lpr/lpd 的打印缓冲池(type spoolers)(lpr、lprng 和 gnulpr),如果它们连接的是 PostScript 或 text-only 打印机(最基本的打印机)可按如下方式设置 /etc/printcap:
 +
 +
<pre><nowiki>
 +
lp|alias:\
 +
:sd=/var/spool/lpd/lp:\
 +
:mx#0:\
 +
:sh:\
 +
:lp=/dev/lp0: </nowiki></pre>
 +
 +
上述各行的意思是:
 +
 +
*  Head line: lp – spool 名称, alias = alias
 +
*  mx#0 – 不限最大文件尺寸
 +
*  sh – 不打印页眉
 +
*  lp=/dev/lp0 – 本地机印机,或 port@host 远程打印机
 +
 +
如果连接的是台 PostScript 打印机,上述设置就够用了。如果是 Windows 机器通过 Samba 打印,上述设置也适用于任何 Windows 支持的打印机(不支持双向通信)。你必须在 Windows 环境中对打印机做相应的配置。
 +
 +
如果你没有 PostScript 打印机,就得用 gs 安装过滤系统。有很多自动配置工具可用于配置 /etc/printcap,可选择下列任何一组:
 +
 +
*  gnulpr、(lpr-ppd)和 printtool— 我用这种
 +
*  lpr 和 apsfilter
 +
*  lpr 和 magicfilter
 +
*  lprng 和 lprngtool
 +
*  lprng 和 apsfilter
 +
*  lprng 和 magicfilter
 +
 +
想运行 GUI 配置工具如 printtool,需要 root 权限,参阅 [[UbuntuHelp:../ch-tune.zh-cn.html| X 下获取 root 权限, 第 9.4.12 节]]。printtool 可创建打印缓冲池,它使用 gs 模拟 PostScript 打印机,所以要使用 PostScript 打印驱动来访问它们。在 Windows 端,“Apple LaserWriter”是标准件。
 +
 +
----
 +
==== 3.6.2 CUPS™ ====
 +
使用 aptitude 安装 Common UNIX Printing System(或CUPS™)和所有位于 "Tasks" -> "Servers" -> "Print Server".  (Sarge) 下的软件包。 为了得到最佳的结果,你需要对 aptitude 进行如下的设置: "F10" -> "Options" -> "Dependency handling" -> "[X] Install Recommended packages automatically".
 +
 +
KDE 和 Gnome 桌面系统提供了简易的打印机设置。如果安装了 swat,你也可以用任何一种浏览器来设置。
 +
 +
<pre><nowiki>
 +
$ mybrowser http://localhost:631 </nowiki></pre>
 +
 +
举个例子,将你的打印机联接到可访问打印机列表中:
 +
 +
*  在主页面上点击“Printers”,然后点“Add Printer”,
 +
 +
*  输入用户名和密码,进入“root”,
 +
 +
*  按提示添加打印机,
 +
 +
*  返回“Printers”页面,点“Configure Printer”,
 +
 +
*  设定打印纸尺寸、分辨率和其它参数。
 +
 +
更多信息可浏览 http://localhost:631/documentation.html 和 http://www.cups.org/cups-help.html。
 +
 +
对于 2.4 内核,参见 [[UbuntuHelp:../ch-kernel.zh-cn.html| 并行端口支持, 第 7.2.6 节]]。
 +
 +
----
 +
=== 3.7 桌面 PC 的 CRON ===
 +
Vixie cron 是计划任务默认安装的软件。 除非系统是 7×24 小时连续运行,该软件并不能够很好的工作。 对于桌面 PC, 需要在安装 cron 软件包的基础上再安装 anacron 来解决这个问题。 fcron 软件包可以作为 anacron 软件包的一个替代。
 +
 +
参见 [[UbuntuHelp:../ch-tips.zh-cn.html| 日程安排(cron,at), 第 8.6.27 节]] 来配置 CRON。
 +
 +
----
 +
=== 3.8 其它主机安装提示 ===
 +
----
 +
==== 3.8.1 初始化安装完成后再安装其他软件包 ====
 +
到现在,你已经拥有一个小巧但功能颇强的Debian。接下来,可以安装那些较大的软件包了。
 +
 +
*  运行 tasksel。参阅[[UbuntuHelp:../ch-package.zh-cn.html| 安装 tasks, 第 6.2.2 节]]。
 +
可按需选择:
 +
**    End-user – X window system
 +
**    Development – C and C++
 +
**    Development – Python
 +
**    Development – Tcl/Tk
 +
**    Miscellaneous — TeX/LaTeX environment
 +
**    对于其他软件包,我喜欢把 tasksel 作为安装指导来用,查看 <Task Info> 了解有关任务的安装列表 然后用 dselect 来选择安装。
 +
 +
*  运行 dselect。
 +
在此,你最想做的事就是选择钟爱的编辑器和其它需要的程序。你可以同时安装 Emacs 的多个变种。参阅 [[UbuntuHelp:../ch-package.zh-cn.html| dselect, 第 6.2.4 节]] 和[[UbuntuHelp:../ch-edit.zh-cn.html| 流行的编辑器, 第 11.1 节]]。
 +
你也可以将某些默认的软件包替换成特定版本。
 +
**    lynx-ssh (而不是 lynx)
 +
**    ...
 +
 +
*  ...
 +
 +
我通常编辑 /etc/inittab 来简化关机步骤。
 +
 +
<pre><nowiki>
 +
...
 +
# What to do when CTRL-ALT-DEL is pressed.
 +
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -h now
 +
... </nowiki></pre>
 +
 +
----
 +
==== 3.8.2 模块 ====
 +
在初始安装期间可进行设备驱动模块配置。以后还可使用 modconf 进行配置,它是基于菜单界面的工具,可用来配置那些在初始安装时未曾配置的模块或完成新内核安装后的配置工作。
 +
 +
所有预加载(preloading)模块的名称要加入到 /etc/modules 列表。也可以使用 lsmod 和 depmod 进行手工控制。
 +
 +
对于 2.4 版内核别忘了在 /etc/modules 中加上几行来处理 IP 伪装(FTP 等)。参阅[[UbuntuHelp:../ch-kernel.zh-cn.html| 模块化的 2.4 内核, 第 7.2 节]],特别是[[UbuntuHelp:../ch-kernel.zh-cn.html| 网络功能, 第 7.2.3 节]]。
 +
 +
----
 +
==== 3.8.3 CD-RW 基本步骤 ====
 +
对于在 2.4 版内核中使用 IDE 接口的 CD-RW,编辑下列文件:
 +
 +
<pre><nowiki>
 +
/etc/lilo.conf  (添加 append="hdc=ide-scsi ignore=hdc",
 +
执行 lilo 激活)
 +
/dev/cdrom      (创建链接 # cd /dev; ln -sf scd0 cdrom)
 +
/etc/modules    (加入 "ide-scsi"和"sg"。如果需要可再加上"sr"。) </nowiki></pre>
 +
 +
详情参阅 [[UbuntuHelp:../quick/ch-tune.zh-cn.html| 刻录机, 第 9.3 节]]。
 +
 +
----
 +
==== 3.8.4 多内存和关机自动断电 ====
 +
编辑 /etc/lilo.conf,设置启动提示参数如下,实现识别大内存(适用于 2.2 版内核)和关机自动断电(适用于 APM):
 +
 +
<pre><nowiki>
 +
append="mem=128M apm=on apm=power-off noapic" </nowiki></pre>
 +
 +
执行 lilo 完成上述设置。对称多处理器内核(SMP-kernel)需要 apm=power-off,而对我那堆糟糕的 SMP 硬件而言 noapic 也是需要的。系统启动时,在启动提示符后直接输入这些参数效果也一样。参阅[[UbuntuHelp:../ch-tips.zh-cn.html| 其它用于启动提示符的技巧, 第 8.1.5 节]]。
 +
 +
在 2.4 版内核中,如果 APM 是作为模块编译的,可在系统启动后运行 # insmod apm power_off=1 或设置 /etc/modules:
 +
 +
<pre><nowiki>
 +
# echo "apm power_off=1" >>/etc/modules </nowiki></pre>
 +
 +
还可以这样:编译新版内核时加入 ACPI 支持可达到同样的效果,而且这种方式更适合 SMP(只有较新的主板才支持 ACPI)。对于较新的主板 2.4 版内核可以直接检测到大内存。
 +
 +
<pre><nowiki>
 +
CONFIG_PM=y
 +
CONFIG_ACPI=y
 +
...
 +
CONFIG_ACPI_BUSMGR=m
 +
CONFIG_ACPI_SYS=m </nowiki></pre>
 +
 +
在 /etc/modules 中按如下顺序添加参数:
 +
 +
<pre><nowiki>
 +
ospm_busmgr
 +
ospm_system </nowiki></pre>
 +
 +
或者重新编译内核,在配置时将上述内核选项均设为“y”。总之,有了 ACPI 支持就不再需要任何启动提示参数。
 +
 +
----
 +
==== 3.8.5 无法访问某些站点的怪问题 ====
 +
如果 内核开启 ECN,对于某些使用劣质路由器的站点,会出现无法访问的问题。新的 dapper 发行版默认关闭了 ECN,检查 ECN 状态可使用:
 +
 +
<pre><nowiki>
 +
# cat /proc/sys/net/ipv4/tcp_ecn
 +
... 或
 +
# sysctl net.ipv4.tcp_ecn </nowiki></pre>
 +
 +
将它关闭:
 +
 +
<pre><nowiki>
 +
# echo "0" > /proc/sys/net/ipv4/tcp_ecn
 +
... 或
 +
# sysctl -w net.ipv4.tcp_ecn=0 </nowiki></pre>
 +
 +
每次启动时禁止 TCP ECN,可编辑 /etc/sysctl.conf,加上:
 +
 +
<pre><nowiki>
 +
net.ipv4.tcp_ecn = 0 </nowiki></pre>
 +
 +
----
 +
==== 3.8.6 PPP 拔号设置 ====
 +
安装 pppconfig 软件包,设置 PPP 拨号访问。
 +
 +
<pre><nowiki>
 +
# apt-get install pppconfig
 +
# pppconfig
 +
... 按提示配置 PPP 拨号
 +
# adduser user_name dip
 +
... 允许 user_name 进行 PPP 拨号访问 </nowiki></pre>
 +
 +
用户(user_name)进行 PPP 拨号访问:
 +
 +
<pre><nowiki>
 +
$ pon ISP_name  # 开始 PPP 访问,接通你的 ISP
 +
... 享受 Internet
 +
$ poff ISP_name # 停止 PPP 访问,ISP_name 可选 </nowiki></pre>
 +
 +
详情参阅[[UbuntuHelp:../ch-gateway.zh-cn.html| 设置 PPP 接口, 第 10.2.4 节]]。
 +
 +
ADSL 用户使用 pppoeconf,来配置 PPPOE 拨号访问。
 +
<pre><nowiki>
 +
# apt-get install pppoeconf
 +
# pppoeconf
 +
... 按提示配置 PPPoe 拨号</nowiki></pre>
 +
 +
----
 +
==== 3.8.7 /etc/ 中的其它配置文件 ====
 +
Ubuntu 标准安装不包含 /etc/cron.deny 文件,想添加可拷贝 /etc/at.deny。
 +
 +
 +
== 第 4 章 - Ubuntu指南 ==
 +
----
 +
这一节为真正的新手提供一个熟悉的 Ubuntu 世界,如果您已经使用了一段时间的类unix操作系统,那么您应该已经了解我在这里所说的一切。那么请用这个来做一个实战检验。
 +
 +
----
 +
=== 4.1 开始了 ===
 +
在您的电脑上安装完 Ubuntu 系统以后,您需要学习一点东西以便使用它,让我们来给您做一个快速的培训。
 +
 +
----
 +
==== 4.1.1 用超级用户登录到命令提示符 ====
 +
在重新启动系统的时候,您处在一个图形的登录界面,或者字符界面的登录界面,这个取决于您初始安装时所选择的发行版本,简单的说,如果您现在处在图形登录界面, 那么按下 Ctrl-Alt-F1 [[[UbuntuHelp:../footnotes.zh-cn.html| 3]]] 来获得字符界面。
 +
 +
假设您的主机名是foo,那么登录提示符看起来是这样的:
 +
 +
<pre><nowiki>
 +
foo login:
 +
</nowiki></pre>
 +
 +
输入用户名也就是你安装时设置的用户名,我们假设用户名为 ubuntu,如果采用 oem 方式安装,则用户名为 oem ,然后按回车键,然后会提示输入密码,就是您在安装过程中所输入的密码。在 Ubuntu 系统中,按照 Unix 的习惯,密码是不可见的。然后系统就会输出欢迎 信息而且给出 $ 的命令提示符等待您的输入。 [[[UbuntuHelp:../footnotes.zh-cn.html| 4]]]
 +
 +
<pre><nowiki>
 +
foo login: ubuntu
 +
Password:
 +
Linux backup 2.6.15-25-686 #1 SMP PREEMPT Wed Jun 14 11:34:19 UTC 2006 i686 GNU/Linux
 +
 +
The programs included with the Ubuntu system are free software;
 +
the exact distribution terms for each program are described in the
 +
individual files in /usr/share/doc/*/copyright.
 +
 +
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
 +
applicable law.
 +
You have new mail.
 +
Last login: Tue Jul  4 13:24:05 2006 on tty3
 +
ubuntu@foo:~$
 +
</nowiki></pre>
 +
 +
现在输入 sudo -sH ,会再次输入密码,输入相同的登录密码后,回车,切换到 root 帐号:
 +
<pre><nowiki>
 +
ubuntu@foo:~$ sudo -sH
 +
sudo: please use single character options
 +
Password:
 +
root@@foo:~#
 +
</nowiki></pre>
 +
 +
您现在已经准备好通过root的命令提示符进行系统的管理。这个root帐户也被称为超级 用户或者特权用户。拥有这个帐户,您将可以做任何事情:
 +
 +
*  读,写和删除任何文件而不用去理会它们所要求的权限
 +
*  设置文件的归属,以及系统里面任何文件的访问权限
 +
*  登录到任何帐户而不需要他们的密码
 +
 +
通过和别人共享root用户的密码来共享root帐户是一个非常糟糕的想法。而使用程序比如 sudo(8)是共享管理权限的好方法。
 +
 +
请注意,优先使用非特权用户登录被认为是一个好的Unix习惯,哪怕是您要进行管理活动, 在必要的时候您也可以使用sudo, super,或者 su -c来 获得有限的root权限。 See [[UbuntuHelp:../ch-tune.zh-cn.html| 更安全地工作 – sudo, 第 9.2.4 节]].  [[[UbuntuHelp:../footnotes.zh-cn.html| 5]]]
 +
 +
----
 +
==== 4.1.2 设置最小的新手环境 ====
 +
我认为学习一个电脑系统就像学习一门新的外语。尽管书本指南是有帮助的,但是您需要 练习使用帮助工具。在这个情况下,我认为安装一些额外的软件包是一个好主意,比如 mc, vim, lynx, doc-linux-text, and debian-policy.  [[[UbuntuHelp:../footnotes.zh-cn.html| 6]]]
 +
 +
<pre><nowiki>
 +
# apt-get update
 +
...
 +
# apt-get install mc vim lynx doc-linux-text debian-policy
 +
...
 +
</nowiki></pre>
 +
 +
如果您已经安装了这些软件包,那么什么都不需要安装了。
 +
 +
----
 +
==== 4.1.3 添加一个用户 ====
 +
在安装过程中,您通常已经创建了一个非特权用户来接收发送给root帐户的e-mail。 [[[UbuntuHelp:../footnotes.zh-cn.html| 7]]] 因此您也不希望用这个特殊的帐户来进行下面的训练,那么您需要创建另外一个帐户。
 +
 +
假设您希望新帐户的名字叫penguin, 输入:
 +
 +
<pre><nowiki>
 +
root@foo:root# adduser penguin
 +
... 回答所有的问题
 +
</nowiki></pre>
 +
 +
这样就可以了。 [[[UbuntuHelp:../footnotes.zh-cn.html| 8]]] 在更进一步之前,我们先来学习一点东西
 +
 +
----
 +
==== 4.1.4 在不同的控制台之间切换 ====
 +
在默认的 Ubuntu 系统中,有6个独立的伪终端,比如,您可以把PC的VGA字符终端当作 6个可以选择的VT-100终端来使用。从一个切换终端到另外一个,你只需要同时按下左Alt键 和F1 –:F6键。任何一个伪终端都可以让不同的用户独立登录。多用户环境是 Unix 的 一个很优秀的、使人迷恋的特性。
 +
 +
如果你偶然的在装有X装口系统的系统上按下了Alt-F7,控制台就会切换到图形界面,然后 再按下Ctrl-Alt-F1可以重新回到字符界面。您可以尝试在在不同的控制台之间切换,然后 再换回到原来的那个,您慢慢就会习惯于这样做。
 +
 +
----
 +
==== 4.1.5 怎样关闭机器 ====
 +
就像任何其它现代的操作系统一样,任何文件操作都会在内存当中缓存数据,Ubuntu 操作系统也需要一个适当的过程,让电脑电源关闭之前保证这些文件的一致性,您可以在 root 命令提示符下使用下面的命令来关闭系统。
 +
 +
<pre><nowiki>
 +
# shutdown -h now
 +
</nowiki></pre>
 +
 +
上面是在正常的多用户模式下面的方法。如果您是处在单用户模式,您可以在root用户的命令提示符下使用下面的命令:
 +
 +
<pre><nowiki>
 +
# poweroff -i -f
 +
</nowiki></pre>
 +
 +
可选择的其它方式,比如您可以用Ctrl-Alt-Delete来关闭系统 [[[UbuntuHelp:../footnotes.zh-cn.html| 9]]]
 +
 +
默认系统会自动关闭电源,如果APM和ACPI选项在 BIOS和Linux内核里面都配置有问题的话,等待系统在屏幕上输出"System halted"之后您就可以关闭电源了。可以看[[UbuntuHelp:../ch-install.zh-cn.html| 多内存和关机自动断电, 第 3.8.4 节]]获得详细信息。
 +
 +
----
 +
==== 4.1.6 玩的时间 ====
 +
现在您已经准备好使用 Ubuntu 系统了,而不用担心有任何冒险,因为您使用的非特权用户 penguin。 [[[UbuntuHelp:/footnotes.zh-cn.html| 10]]]
 +
 +
让我们先登录到 penguin 用户。 如果您现在正在root用户的命令提示符下面,输入 exit [[[UbuntuHelp:../footnotes.zh-cn.html| 11]]] 在root用户提示符下面关闭root的shell以后我们就返回了 ubuntu 用户提示符,再次输入 exit ,返回登录提示符。输入您刚创建的新 用户名penguin和对应的密码。 [[[UbuntuHelp:../footnotes.zh-cn.html| 12]]] 您将会获得如下的命令提示符
 +
 +
<pre><nowiki>
 +
penguin@foo:penguin$
 +
</nowiki></pre>
 +
 +
从现在开始,为了简单起见我们将使用简化的命令提示符,我们将使用:
 +
 +
*  # : root的命令提示符
 +
*  $ : 非特权用户的命令提示符
 +
 +
我们将先用简单的方法[[UbuntuHelp:../ch-tutorial.zh-cn.html| Midnight Commander (MC), 第 4.2 节]]来学习 Ubuntu ,稍后使用较好的方法[[UbuntuHelp:../ch-tutorial.zh-cn.html| 类 Unix 工作环境, 第 4.3 节]]。
 +
 +
----
 +
=== 4.2 Midnight Commander (MC) ===
 +
Midnight Commander (MC)是Linux控制台和其它终端环境中的GNU“瑞士军刀”。这给予了新 受一个菜单驱动控制台的体验,它比Unix标准命令容易学的多。
 +
 +
用命令来研究 Ubuntu 系统。这个是最好的学习方法。请不使用键盘而只用鼠标和回车键来访问下面的地址:
 +
 +
*  /etc 和它的字目录。
 +
*  /var/log 和它的字目录。
 +
*  /usr/share/doc 和它的字目录。
 +
*  /sbin and /bin
 +
 +
----
 +
==== 4.2.1 提高 MC ====
 +
为了让MC在退出的时候改变工作目录,您需要修改 ~/.bashrc(或者/etc/bash.bashrc,查看.bashrc),使用-P选项在它的 手册里面可以获取更详细的信息mc(1).  [[[UbuntuHelp:../footnotes.zh-cn.html| 13]]]
 +
 +
----
 +
==== 4.2.2 启动MC ====
 +
<pre><nowiki>
 +
$ mc
 +
</nowiki></pre>
 +
 +
在MC中用户可轻而易举使用菜单完成所有的文件操作。可以按F1获得帮助,您可以只用鼠 标和功能键来操作MC [[[UbuntuHelp:../footnotes.zh-cn.html| 14]]]
 +
 +
----
 +
==== 4.2.3 MC 里的文件管理器 ====
 +
默认状态下,所有文件列于两个目录面板。一种实用的方式是将右边窗口设定为“information”,用来查看文件访问权限等信息。下面是一些基本的击键。如果gpm daemon在运行,你还可以使用鼠标。(在MC中进行剪切和粘贴操作时别忘了按下shift键。)
 +
 +
*  F1: 帮助菜单
 +
*  F3: 内置文件阅读器
 +
*  F4: 内置编辑器
 +
*  F9: 激活折叠菜单
 +
*  F10: 退出Midnight Commander
 +
*  Tab: 在两个窗口间移动
 +
*  Insert: 为多文件操作生成文件如拷贝
 +
*  Del: 删除文件(小心—请设置MC为安装删除模式)
 +
*  Cursor keys: 与各自的名字一致
 +
 +
----
 +
==== 4.2.4 MC里的命令行技巧 ====
 +
*  cd命令可改变焦点屏幕中的目录位置。
 +
*  Control-Enter或Alt-Enter可以将文件名拷贝到命令行。在编辑命令行时可与cp或mv命令结合使用。
 +
*  Alt-Tab显示焦点文件所属文件或目录的文件名
 +
*  可指定MC两个目录窗口的起始目录;例如mc /etc /root。
 +
*  Esc + numberkey ===== Fn(例如 Esc + '1' ===== F1, etc.; Esc + '0' ==== F10)
 +
*  Esc- key ==== Alt-key (== Meta, M-); 例如Esc + 'c'等价于Alt-c
 +
 +
----
 +
==== 4.2.5 MC 里面的编辑器 ====
 +
内置编辑器的剪切-粘贴方式很有意思。按F3在起始处做标记,再次按F3在终止处做标记,这时中间的选中部分会高亮显示。然后你可以移动光标到某处按下 F6,被选中部分就会移到该处。如果你按下的是F5,选中部分就会拷贝到该处。F2用来存盘,F10退出,所有方向键的作为和它们的名字一样直观。
 +
 +
该编辑器可直接打开某个文件:
 +
 +
<pre><nowiki>
 +
$ mc -e filename_to_edit
 +
$ mcedit filename_to_edit
 +
</nowiki></pre>
 +
 +
虽然它不是多窗口编辑器,但你可利用Linux多控制台的特性达到相同的效果。要在窗口间进行拷贝操作,可使用Alt-Fn切换虚拟控制台,然后使用“File->Insert file”或“File->Copy to file”将一个文件中的内容拷贝到另一个文件。
 +
 +
可指定任何外部编辑器作为内置编辑器。
 +
 +
许多程序使用环境变量EDITOR或VISUAL来决定使用哪个编辑器。如果你用不惯vim,可在~/.bashrc中加上几行来指定新的mcedit:
 +
 +
<pre><nowiki>
 +
...
 +
export EDITOR=mcedit
 +
export VISUAL=mcedit
 +
...
 +
</nowiki></pre>
 +
 +
我强烈推荐将它们设定为vim。在Linux/Unix世界里就该使用vi(m)命令。 [[[UbuntuHelp:../footnotes.zh-cn.html| 15]]]
 +
 +
----
 +
==== 4.2.6 MC 里的阅读器 ====
 +
非常精巧的阅读器。它是在文档中搜索单词的利器。在/usr/share/doc目录下我总是用它,面对大量的Linux资料用它浏览是最快的方法。阅读器可以直接找开文件:
 +
 +
<pre><nowiki>
 +
$ mc -v filename_to_view
 +
</nowiki></pre>
 +
 +
----
 +
==== 4.2.7 MC的自动启动特性 ====
 +
在文件上按Enter,会激活相关的程序操作该文件。这是MC的一个极方便的特点。
 +
 +
<pre><nowiki>
 +
executable file:        执行命令
 +
man, html file:    将文件内容传入阅读器程序
 +
tar, gz, deb file: 象浏览子目录一样浏览它的内容
 +
</nowiki></pre>
 +
 +
为了使这些阅读器和虚拟文件的属性能够被查看,不要将可阅读文件设成可执行文件。可在MC文件菜单中改变文件属性或使用chmod命令。
 +
 +
----
 +
==== 4.2.8 MC 里的FTP虚拟文件系统 ====
 +
MC可通过FTP访问文件。按F9转到菜单栏,输入’p’激活FTP虚拟文件系统。按username:[email protected]格式输入URL,远程文件目录就会以本地目录的方式显示出来。
 +
 +
在URL里试着用http.us.debian.org/debian来浏览Debian存档文件。看[[UbuntuHelp:../ch-system.zh-cn.html| Ubuntu 文件, 第 2.1 节]] 就知道这些是怎么被识别的了。
 +
 +
----
 +
=== 4.3 类 Unix 工作环境 ===
 +
尽管MC让您能够做绝大多数的事情,但是利用shell来学习命令行工具,和熟悉类Unix系统 的工作环境还是很重要的。 [[[UbuntuHelp:../footnotes.zh-cn.html| 16]]]
 +
 +
----
 +
==== 4.3.1 特殊的按键组合 ====
 +
在类Unix环境里,有一些按键有特殊的意思。 [[[UbuntuHelp:../footnotes.zh-cn.html| 17]]]
 +
 +
*  Ctrl-U: 擦除一行光标前面的部分。
 +
*  Ctrl-H: 擦除光标前面的一个字符。
 +
*  Ctrl-D: 终止输入。(退出shell,如果您正在使用shell的话)。
 +
*  Ctrl-C: 终止当前正在运行的程序。
 +
*  Ctrl-Z: 暂停程序。 (把它放到后台运行请看[[UbuntuHelp:../ch-tutorial.zh-cn.html| command &, 第 4.3.10.1 节]])
 +
*  Ctrl-S: 停止向屏幕输出。 [[[UbuntuHelp:../footnotes.zh-cn.html| 18]]]
 +
*  Ctrl-Q: 重新激活向屏幕输出。
 +
 +
默认的shell,bash, 有历史编辑和tab补齐功能。
 +
 +
*  up-arrow: 开始历史命令搜索。
 +
*  Ctrl-R: 开始增量历史命令搜索。
 +
*  TAB: 完整的把文件名输入到命令行。
 +
*  Ctrl-V TAB: 输入TAB而不是扩展命令行。
 +
 +
其他一些需要记住的按键组合。
 +
 +
*  Ctrl-Alt-Del:挂起或者重新启动系统 [[UbuntuHelp:../ch-install.zh-cn.html| 初始化安装完成后再安装其他软件包, 第 3.8.1 节]].
 +
*  Left-click-and-drag mouse: 选择并且拷贝到剪贴板。
 +
*  Click middle mouse button: 使用剪贴板的内容粘贴。
 +
*  Meta-key (Emacs terminology) 传统的是使用 Left-Alt-key.  但是有些系统使用 Windows-key实现 Meta-key.
 +
 +
这里,为了在Linux字符界面下使用鼠标,您需要使用gpm服务。 [[[UbuntuHelp:../footnotes.zh-cn.html| 19]]] 查看[[UbuntuHelp:../ch-install.zh-cn.html| 鼠标设置, 第 3.3 节]]。
 +
 +
----
 +
==== 4.3.2 基本 Unix 命令 ====
 +
让我们来学习基本的Unix命令。 [[[UbuntuHelp:../footnotes.zh-cn.html| 20]]] 使用非特权用来执行下面的所有的命令。 penguin :
 +
 +
*  pwd
 +
**    显示当前工作路径。
 +
*  whoami
 +
**    显示当前用户名。
 +
*  file foo
 +
**    显示foo文件的属性。
 +
*  type -p commandname
 +
**    显示命令commandname所的的地方。
 +
**    which commandname也可以用来做这个 .  [[[UbuntuHelp:../footnotes.zh-cn.html| 21]]]
 +
*  type commandname
 +
**    显示命令 commandname的信息。
 +
*  apropos key-word
 +
**    找到和 key-word相关的命令。
 +
**    man -k key-word也可以做到
 +
*  whatis commandname
 +
**    显示该命令的一句话帮助。 commandname.
 +
*  man -a commandname
 +
**    显示命令的解释信息。 commandname.  (Unix style)
 +
*  info commandname
 +
**    显示很长的命令解释 commandname.  (GNU style)
 +
ls
 +
**    列出目录内容 (非以.开始的文件和目录) [[[UbuntuHelp:../footnotes.zh-cn.html| 22]]]
 +
*  ls -a
 +
**    列出目录内容(所有的文件和目录)
 +
*  ls -A
 +
**    列出目录内容。(几乎所有的文件和目录,略去".." and ".")
 +
*  ls -la
 +
**    列出目录所有文件和目录的详细信息。查看[[UbuntuHelp:../ch-tutorial.zh-cn.html| Ubuntu 中的文件系统概念, 第 4.5.2 节]]。
 +
*  ls -d *
 +
**    列出当前目录下的目录名称,而不是目录下的内容。
 +
*  lsof foo
 +
**    显示文件foo的打开状态。
 +
*  mkdir foo
 +
**    在当前目录下创建一个新的目录foo。
 +
*  cd foo
 +
**    切换到当前目录下或者在变量CDPATH中列出来的目录foo。在builtins(7)查看命令cd。
 +
*  cd /
 +
**    切换到根目录。
 +
*  cd
 +
**    切换到用户主目录。
 +
*  cd /foo
 +
**    切换到绝对路径/foo所指定的目录。
 +
*  cd ..
 +
**    切换到上一级目录。
 +
*  cd ~foo
 +
**    切换到用户主目录下的foo目录去。
 +
*  cd -
 +
**    切换到上一次所去的目录。
 +
*  </etc/motd pager
 +
**    使用默认的分页程序查看文件/etc/motd的内容,参照[[UbuntuHelp:../ch-tutorial.zh-cn.html| command < foo, 第 4.3.10.9 节]]。 [[[UbuntuHelp:../footnotes.zh-cn.html#f23| 23]]]
 +
*  touch junkfile
 +
**    创建一个空文件junkfile。
 +
*  cp foo bar
 +
**    拷贝一个已有的文件foo到新文件bar。
 +
*  rm junkfile
 +
**    删除文件junkfile
 +
*  mv foo bar
 +
**    把已有的文件foo重命名为bar
 +
*  mv foo bar/baz
 +
**    把已有的文件foo移动到新位置并重命名为bar/baz。目录bar必须存在。
 +
*  chmod 600 foo
 +
**    让已经存在的文件foo其他人不能读写。(所有人都 不能执行)。
 +
*  chmod 644 foo
 +
**    使文件foo其他的人可以读,但是不能写。(所有人 都不能执行)
 +
*  chmod 755 foo
 +
**    使文件foo其他的人能读不能写。(所有人都可以执行)
 +
*  top
 +
**    全屏显示进程信息。输入”q”退出。
 +
*  ps aux | pager
 +
**    用BSD风格输出所有正在运行的进程的信息。参照 [[UbuntuHelp:../ch-tutorial.zh-cn.html#s-cmd-pipe| command1 | command2, 第 4.3.10.2 节]]。
 +
*  ps -ef | pager
 +
**    用system-V风格来输出所有正在运行的进程的信息。
 +
*  ps aux | grep -e "[e]xim4*"
 +
**    显示exim4进程,或者运行exim的进程。输入man grep可以从grep(1)的手册页学习正则表达式。 [[[UbuntuHelp:../footnotes.zh-cn.html#f24| 24]]]
 +
*  ps axf | pager
 +
**    用ASCCI艺术形式来显示运行所有进程信息。
 +
*  kill 1234
 +
**    杀死进程号为1234的进程。 查看[[UbuntuHelp:../ch-tips.zh-cn.html#s-kill| 中止一个进程, 第 8.5.1 节]]。
 +
*  grep -e "pattern" *.html
 +
**    找到当前目录下面所有以.html结尾的文件中含有"pattern"的行,并显示它们。
 +
*  gzip foo
 +
**    用Lempel-Ziv(LZ77)压缩算法压缩foo,生成foo.gz。
 +
*  gunzip foo.gz
 +
**    将文件foo.gz解压缩生成foo。
 +
*  bzip2 foo
 +
**    将文件foo.bz2解压缩生成foo。
 +
*  tar -xvvf foo.tar
 +
**    从打包文件foo.tar解出文件来。
 +
*  tar -xvvzf foo.tar.gz
 +
**    从打包压缩的文件foo.tar.gz中解开文件。
 +
*  tar -xvvf --bzip2 foo.tar.bz2
 +
**    从文件foo.tar.bz2解压缩文件。 [[[UbuntuHelp:../footnotes.zh-cn.html#f25| 25]]]
 +
*  tar -cvvf foo.tar bar/
 +
**    把目录bar/的内容打包存放到foo.tar存档中。
 +
*  tar -cvvzf foo.tar.gz bar/
 +
**    把目录bar/的内容打包并且压缩存放到foo.tar.gz存档中。
 +
*  tar -cvvf --bzip2 foo.tar.bz2 bar/
 +
**    把目录bar/中的内容打包存放到foo.tar.bz2存档里面。 [[[UbuntuHelp:../footnotes.zh-cn.html#f26| 26]]]
 +
*  zcat README.gz | pager
 +
**    实用默认的分页显示程序pager来显示压缩文件README.gz中的内容。
 +
*  zcat README.gz > foo
 +
**    使用文件README.gz解开后的内容创建一个文件foo。
 +
*  zcat README.gz >> foo
 +
**    把文件README.gz解开后的内容追加到文件foo的后面(如果文件不存在的话,就会创建一个)。
 +
*  find .  -name pattern
 +
**    用shell找到匹配pattern的文件名(慢一些)。
 +
*  locate -d .  pattern
 +
**    用shell找到匹配pattern的文件名(使用已有的规则的数据库,快一些)。
 +
 +
请用上面的这些命令来查看您的系统的目录和其他的信息,以此来熟练一些操作。如果您 对上面的这些控制台命令有任何不明白的地方,请首先阅读帮助手册,比如下面的命令就是 好的开始:
 +
 +
<pre><nowiki>
 +
$ man man
 +
$ man bash
 +
$ man ls
 +
</nowiki></pre>
 +
 +
现在也是时候启动vim然后按下F1键了。您最少也应该阅读开始的35行。然后把光标移动到|tutor|,再按下Ctrl-]就可以做在线测试了。查看[[UbuntuHelp:../ch-edit.zh-cn.html| 编辑器, 第 11 章]]可以学到更多关于编辑器的知识。
 +
 +
请注意许多来自于GNU和BSD的类Unix命令都会在您进行如下操作的时候(或者您没有给出任何参数)给出简单的帮助:
 +
 +
<pre><nowiki>
 +
$ commandname --help
 +
$ commandname -h
 +
</nowiki></pre>
 +
 +
您也可以参照[[UbuntuHelp:../ch-tips.zh-cn.html| Ubuntu 小技巧, 第 8 章]]里的例子来进行自我测试。
 +
 +
----
 +
==== 4.3.3 命令执行 ====
 +
现在您已经比较了解应该如何使用 Ubuntu 系统了。让我们来更深入的了解 Ubuntu 系统的命令执行结构。 [[[UbuntuHelp:../footnotes.zh-cn.html#f27| 27]]]
 +
 +
----
 +
==== 4.3.4 简单的命令 ====
 +
一个简单的命令是如下面的序列
 +
 +
 +
* 可变的声明 (可选)
 +
* 命令的名字
 +
 +
* 参数 (可选)
 +
 +
* 重定向 (可选: > , >> , < , << , 等等)
 +
 +
* 控制操作 (可选: && , || ; <换新行> , ; , & , ( , ) )
 +
 +
想了解更多复杂命令的解释和应用请查看[[UbuntuHelp:../ch-program.zh-cn.html#s-clprocess| 命令行处理, 第 13.2.6 节]]。
 +
 +
----
 +
==== 4.3.5 命令执行和环境变量 ====
 +
典型的使用shell来执行命令情况如下: [[[UbuntuHelp:../footnotes.zh-cn.html#f28| 28]]]
 +
 +
<pre><nowiki>
 +
$ date
 +
Sun Oct 26 08:17:20 CET 2003
 +
$ LC_ALL=fr_FR date
 +
dim oct 26 08:17:39 CET 2003
 +
</nowiki></pre>
 +
 +
这里date程序是在前台执行的。环境变量LC_ALL是:
 +
 +
*  取消设置 (系统默认的和 C)作为第一个命令
 +
*  设置为 fr_FR (French locale) 作为第二个命令。
 +
 +
绝大多数的命令并没有预先定义各种环境变量。像上面的例子选择如下方式:
 +
 +
<pre><nowiki>
 +
$ LC_ALL=fr_FR
 +
$ date
 +
dim oct 26 08:17:39 CET 2003
 +
</nowiki></pre>
 +
 +
正如您所看到的,命令的输出和环境变量设置有关,上面产生的是法语输出。如果您 想这个环境变量在子进程中也能够得到继承的话(e.g.,执行shell脚本的时候),您需要 使用下面的方式。
 +
 +
<pre><nowiki>
 +
$ export LC_ALL
 +
</nowiki></pre>
 +
 +
----
 +
==== 4.3.6 命令搜索路径 ====
 +
当您在shell提示符里面输入一个命令的时候,shell就会在PATH环境变量所列出的目录里面去查找。PATH环境变量的值也被叫做shell的查找目录。
 +
 +
在默认安装的 Debian中,用户的PATH环境变量里面也许没有包含/sbin/。因此如果您想运行一些命令比如/sbin/目录下的ifconfig,您就必须在PATH环境变量里面包含它。PATH环境变量一般是在初始化文件~/.bash_profile里面设置的,参看[[UbuntuHelp:../ch-install.zh-cn.html#s-bashconf| Bash 设置, 第 3.2 节]]。
 +
 +
----
 +
==== 4.3.7 命令行选项 ====
 +
一些命令带有参数,参数部分以-或者--开始的被称做选项。可以用来控制命令的行为。
 +
 +
<pre><nowiki>
 +
$ date
 +
Mon Oct 27 23:02:09 CET 2003
 +
$ date -R
 +
Mon, 27 Oct 2003 23:02:40 +0100
 +
</nowiki></pre>
 +
 +
这里命令行参数-R改变了命令date的表现以让它输出符合RFC-2822的日期字符串。
 +
 +
----
 +
==== 4.3.8 Shell 通配符 ====
 +
通常您需要用命令来处理一组文件,但是您又不想输出所有的文件名。shell'''通配符'''使得这个成为可能。
 +
 +
*  *
 +
**    这个匹配0个或者多个字符。
 +
**    它不会匹配以"."开始的文件名.
 +
*  ?
 +
**    这个仅匹配一个字符。
 +
*  [...]
 +
**    这个匹配[]里面的某个字符。
 +
*  [a-z]
 +
**    这个匹配字符a到z之间的某个字符。
 +
*  [^...]
 +
**    这个匹配任意不包含在[]里面的字符(不包含字符"^").
 +
 +
作为练习。请尝试着运行下面的命令并思考一下:
 +
 +
<pre><nowiki>
 +
$ mkdir junk; cd junk; touch 1.txt 2.txt 3.c 4.h .5.txt
 +
$ echo *.txt
 +
*****txt 2.txt
 +
$ echo *
 +
*****txt 2.txt 3.c 4.h
 +
$ echo *.[hc]
 +
*****c 4.h
 +
$ echo .*
 +
***** .. .5.txt
 +
$ echo .[^.]*
 +
.5.txt
 +
$ echo [^1-3]*
 +
*****h
 +
$ cd ..; rm -rf junk
 +
</nowiki></pre>
 +
 +
----
 +
==== 4.3.9 命令返回值 ====
 +
每个命令都返回一个值和它返回的状态。
 +
 +
*  返回0表示命令被正确执行
 +
*  返回非0的值表示命令没有正确执行。
 +
 +
返回值可以在命令执行后马上用shell用变量$?来访问。
 +
 +
<pre><nowiki>
 +
$ [ 1 === 1 ] ; echo $?
 +
0
 +
$ [ 1 === 2 ] ; echo $?
 +
1
 +
</nowiki></pre>
 +
 +
请注意,在shell中的逻辑上下文中使用这些返回值的时候'''success'''被看做逻辑值'''TRUE'''。这个多少有一点不直观,因为'''success'''等价于值'''zero'''。
 +
 +
参看[[UbuntuHelp:../ch-program.zh-cn.html#s-shell-cond| Shell条件表达式, 第 13.2.5 节]]。
 +
 +
----
 +
==== 4.3.10 典型的命令序列 ====
 +
在我们阅读了这些惯用的shell命令以后,让我们试者记住它们。参看[[UbuntuHelp:../ch-program.zh-cn.html#s-shell-param| Shell参数, 第 13.2.3 节]],[[UbuntuHelp:../ch-program.zh-cn.html#s-shell-redirect| Shell重定向, 第 13.2.4 节]],[[UbuntuHelp:../ch-program.zh-cn.html#s-shell-cond| Shell条件表达式, 第 13.2.5 节]],和[[UbuntuHelp:../ch-program.zh-cn.html#s-clprocess| 命令行处理, 第 13.2.6 节]]。
 +
 +
----
 +
===== 4.3.10.1 command & =====
 +
command在子shell的'''background'''运行。后台任务让多成程序能够运行在一个shell里面。
 +
 +
管理这些后台任务的请求需要shell内建的: jobs,fg, bg,和kill。请查看 bash(1)这一小节中的"SIGNALS","JOB CONTROL","SHELL BUILTIN COMMANDS".的相关内容。 [[[UbuntuHelp:../footnotes.zh-cn.html#f29| 29]]]
 +
 +
----
 +
===== 4.3.10.2 command1 | command2 =====
 +
command1的标准输出被直接输入到 command2 的标准输入。 两个命令都可能'''并行'''地运行。这个被称作'''pipeline'''。
 +
 +
----
 +
===== 4.3.10.3 command1 ; command2 =====
 +
command1command2被有序的执行。
 +
 +
----
 +
===== 4.3.10.4 command1 && command2 =====
 +
command1如果执行成功的话那么再执行command2。只有当command1'''并且'''command2都运行成功的话上面的命令序列才会成功返回。
 +
 +
----
 +
===== 4.3.10.5 command1 || command2 =====
 +
command1被执行以后,如果不成功的话,command2也会被执行。当command1 '''或者'''command2有一个执行成功的话,上面的序列就会返回真值。
 +
 +
----
 +
===== 4.3.10.6 command > foo =====
 +
把command的标准输出重定向到文件foo。(覆盖内容)
 +
 +
----
 +
===== 4.3.10.7 command >> foo =====
 +
把command的标准输出重定向到文件foo。(追加)
 +
 +
----
 +
===== 4.3.10.8 command > foo 2>&1 =====
 +
同时把command的标准输出和标准出错信息重定向到文件foo。
 +
 +
----
 +
===== 4.3.10.9 command < foo =====
 +
把command的标准输入重定向到一个文件foo。
 +
 +
<pre><nowiki>
 +
$ </etc/motd pager
 +
... (the greetings)
 +
$ pager </etc/motd
 +
... (the greetings)
 +
$ pager /etc/motd
 +
... (the greetings)
 +
$ cat /etc/motd | pager
 +
... (the greetings)
 +
</nowiki></pre>
 +
 +
尽管上面4个方法都显示同样的内容,但是最后一个多运行了cat命令。而且不必要的浪费了资源。
 +
 +
----
 +
==== 4.3.11 命令别名 ====
 +
您可以给一个命令序列起一个别名。比如:
 +
 +
<pre><nowiki>
 +
$ alias la='ls -la'
 +
</nowiki></pre>
 +
 +
现在, la就成了 ls -la命令的简写用来列出所有文件的详细信息。
 +
 +
您可以用type来显示命令的详细路径或者其他身份。比如:
 +
 +
<pre><nowiki>
 +
$ type ls
 +
ls is hashed (/bin/ls)
 +
$ type la
 +
la is aliased to `ls -la'
 +
$ type echo
 +
echo is a shell builtin
 +
$ type file
 +
file is /usr/bin/file
 +
</nowiki></pre>
 +
 +
这里ls在最近被查找过了,而file没有,因此ls被"hashed",i.e.,shell有一个内部的记录可以用来快速的找到ls的地址。
 +
 +
----
 +
=== 4.4 类 Unix 文本处理 ===
 +
在类 Unix 的系统中,有几个文本处理工具经常用到。
 +
 +
*  非正则表达式的方法有:
 +
**    head 显示文件的开始部分。
 +
**    tail 显示文件的结尾部分。
 +
**    sort 给文件中的每一行排序。
 +
**    uniq 删除文件中重复的行。
 +
**    tr 转换或者删除字符。
 +
**    diff 把文件中的内容一行一行的比较。
 +
*  基本的正则表达式Basic regular expression (BRE) :
 +
**    grep 按模式匹配文本。
 +
**    ed 一个原始的行编辑器。
 +
**    sed 一个流编辑器。
 +
**    vi 一个屏幕编辑器。
 +
**    emacs 一个屏幕编辑器。
 +
*  扩展的正则表达式Extended regular expression (ERE) is used:
 +
**    egrep 按模式匹配文本。
 +
**    awk 进行简单的文本处理。 查看[[UbuntuHelp:../ch-program.zh-cn.html#s-awk| Awk, 第 13.3 节]].
 +
**    perl做非常难以想像的文本处理。 查看[[UbuntuHelp:../ch-program.zh-cn.html#s-perl| Perl, 第 13.4 节]].
 +
 +
查看[[UbuntuHelp:../ch-tips.zh-cn.html#s-perl-i| 正规表达式的置换, 第 8.6.13 节]], [[UbuntuHelp:../ch-tips.zh-cn.html#s-scrp-snip| 精巧的管道命令辅助脚本, 第 8.6.18 节]], and [[UbuntuHelp:../ch-tips.zh-cn.html#s-perl-mad| 短小的Perl脚本, 第 8.6.20 节]] 可以找到一些脚本的例子。
 +
 +
----
 +
==== 4.4.1 正则表达式 ====
 +
正则表达式用在很多文本处理工具里面。它们和shell的通配符比较相似(查看[[UbuntuHelp:../ch-tutorial.zh-cn.html#s-cmd-wild| Shell 通配符, 第 4.3.8 节]]),但是它们更复杂也更强大。
 +
 +
正则表达式是由文本字符和'''元字符'''组成的,用来描述匹配模式。元字符是有特殊意义的字符。它们有两种主要的形式BRE和ERE,主要取决于[[UbuntuHelp:../ch-tutorial.zh-cn.html#s-text-process| 类 Unix 文本处理, 第 4.4 节]]里面是如何描述的。
 +
 +
在扩展的正则表达式(EREs)里面'''元字符'''包括"\ .  [ ] ^ $ * + ?  ( ) { } |"。正则表达式表示:
 +
 +
*  c
 +
**    这个用来匹配非元字符 "c".
 +
*  \c
 +
**    这个用来匹配原本的字符"c".
 +
*  .
 +
**    这个用来匹配任意字符包括换行符。
 +
*  ^
 +
**    这个用来匹配字符串的开始。
 +
*  $
 +
**    这个用来匹配字符串的结尾。
 +
*  \<
 +
**    这个用来匹配一个单词的开始。
 +
*  \>
 +
**    这个用来匹配一个单词的结尾。
 +
*  [abc...]
 +
**    这个字符序列用来匹配 "abc..."中的任意字符。
 +
*  [^abc...]
 +
**    这个否定的字符序列匹配所有的字符除了 "abc...".
 +
*  r*
 +
**    这个匹配以"r" 开始的后面有0个或者多个字符的字符串。
 +
*  r+
 +
**    这个匹配以"r" 开始的后面有一个或者多个字符的表达式。
 +
*  r?
 +
**    以"r" 开始后面有0个或者1个其他的字符。
 +
*  r1|r2
 +
**    匹配"r1"或者"r2"。
 +
*  (r1|r2)
 +
**    匹配"r1"或者 "r2"并且把它当作一个'''分类''' 正则表达式。
 +
 +
在BREs里面'''元字符'''"+ ?  ( ) { } |"不再具有它们特殊的含义,而是使用的有反斜杠的版本"\+ \? \( \) \{ \} \|"。因此分组(r1|r2)需要被表示成\(r1|r2\)。 因为emacs,虽然基本上是BRE,但是它把"+ ?"当作元字符。因此不需要特别表示它们。查看[[UbuntuHelp:../ch-tutorial.zh-cn.html#s-replaceex| 替换表达式, 第 4.4.2 节]]来了解构造分组是如何使用的。
 +
 +
举个例子,grep 可以用正则表达式来搜索文本:
 +
 +
<pre><nowiki>
 +
$ egrep 'GNU.*LICENSE|Yoyodyne' /usr/share/common-licenses/GPL
 +
GNU GENERAL PUBLIC LICENSE
 +
                    GNU GENERAL PUBLIC LICENSE
 +
        Yoyodyne, Inc., hereby disclaims all copyright interest in the program
 +
</nowiki></pre>
 +
 +
----
 +
==== 4.4.2 替换表达式 ====
 +
在替换表达式里面,下面的字符有特殊的含义:
 +
 +
*  &
 +
**    这个会替换正则表达式所匹配的部分。(在emacs里面用\&)
 +
 +
*  \n
 +
**    这个会替换n-th'''括号'''正则表达式所匹配的内容。
 +
 +
在Perl里面,$n替换了\n,&也没有特殊的含义。
 +
 +
举个例子:
 +
 +
<pre><nowiki>
 +
$ echo zzz1abc2efg3hij4 | \
 +
sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/=&=/'
 +
zzz=1abc2efg3hij4=
 +
$ echo zzz1abc2efg3hij4 | \
 +
sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/\2===\1/'
 +
zzzefg3hij4===1abc
 +
$ echo zzz1abc2efg3hij4 | \
 +
perl -pe 's/(1[a-z]*)[0-9]*(.*)$/$2===$1/'
 +
zzzefg3hij4===1abc
 +
$ echo zzz1abc2efg3hij4 | \
 +
perl -pe 's/(1[a-z]*)[0-9]*(.*)$/=&=/'
 +
zzz=&=
 +
</nowiki></pre>
 +
 +
请特别注意这些'''括号'''正则表达式的格式,以及这些被匹配的文本在文本处理工具里面是如何使用的。
 +
 +
这些正则表达式可以用来控制光标的运动和编辑器里面的文本替换。
 +
 +
请阅读所有相关手册来学习这些命令。
 +
 +
----
 +
=== 4.5 类 Unix 文件系统 ===
 +
在 GNU/Linux和其他的类Unix操作系统里面'''文件'''都被放在'''目录'''。 [[[UbuntuHelp:../footnotes.zh-cn.html#f30| 30]]] 所有的'''文件'''和'''目录'''都被排列在一棵很大的树里面, 即文件层次树,他的根是/。
 +
 +
这些文件和目录可以跨多个设备。mount(8)命令可以把一些设备挂载到文件系统树里面来。反之umount(8)可以把设备卸载。
 +
 +
----
 +
==== 4.5.1 Unix 文件基础 ====
 +
这里是一些最基础的:
 +
 +
*  文件名是区分大小写的,MYFILE和文件MyFile是'''不同'''的文件。
 +
*  跟目录指的是/不要把这个”root”和root用户相混淆了。参看[[UbuntuHelp:../ch-tutorial.zh-cn.html#s-login-root| 用超级用户登录到命令提示符, 第 4.1.1 节]]。
 +
*  任何目录都有一个可以由任意字母或者符号组成的名字,但是/是'''例外'''。 [[http://qref.sourceforge.net/quick/footnotes.zh-cn.html#f31 31]] 根目录是一个例外:它的名字是/(读做”slash"或者根目录)它不能被重命名。
 +
*  任何一个目录都是有下面几种形式给出的,'''完全限制的文件名''','''绝对文件名''',或者'''路径''',给出所有需要经过的目录序列。这三种形式是等价的。所有的绝对文件名都以/目录开始,在目录和目录或者目录和文件之间用/隔开。最开始的/是一个目录的名字,但是后面的仅仅是文件名的分隔符。
 +
上面的这些话看起来让人很费解。那么看看下面的例子吧:
 +
<pre><nowiki>
 +
/usr/share/keytables/us.map.gz
 +
</nowiki></pre>
 +
这就是一个完整限制的文件名;有些人把它叫做'''路径'''。然而人们经常 单独把us.map.gz 作为文件名。 [[[UbuntuHelp:../footnotes.zh-cn.html#f32| 32]]]
 +
*  根目录有很多分支,比如/etc/和/usr/。这些子目录 又分出很多子目录来,比如 /etc/init.d/和/usr/local/。 所有的加起来被称作'''目录树'''。
 +
您可以想像,一个绝对文件名就是从树的根基(/)到一个分支的末端(文件)的路由。您也会听到别人把目录树叫做'''家庭'''树:这样子目录就有 '''双亲''',路径就显示了所有文件完整的血缘关系。
 +
除此之外,还有相对路径,它从其它的地方开始而不是根目录。您可能还记得 ../指的是上一级目录。
 +
*  没有哪一个目录是和物理设备紧密关联的,比如您的磁盘。这个和DOS,CP/M,Windows系统不一样的,它们所有的路径都是以一个设备名开始的,比如C:\,参看[[UbuntuHelp:../ch-tutorial.zh-cn.html#s-file-system| Ubuntu 中的文件系统概念, 第 4.5.2 节]]。
 +
 +
关于文件层次的详细信息以及最好的操作练习可以在这里找到[http://qref.sourceforge.net/usr/share/doc/debian-policy/fhs/fhs.txt.gz Filesystem Hierarchy Standard]。作为一个初学者,您需要记住下面的事实:
 +
 +
*  /
 +
**    简单的一个/表示根目录。
 +
*  /etc/
 +
**    这个是大多数系统配置文件存放的地方。
 +
*  /var/log/
 +
**    这个是系统日志存放的地方。
 +
*  /home/
 +
**    这个目录是存放所有非特权用户的主目录的。
 +
 +
----
 +
==== 4.5.2 Ubuntu 中的文件系统概念 ====
 +
按照Unix的传统, Ubuntu为存放物理数据的磁盘或者其它存储设备,还有这些硬件设备之间的交互提供文件系统,比如控制台屏幕和远程串行终端就用联合的方式表示。
 +
 +
每个在Ubuntu系统上的文件,目录,命名管道,或者物理设备都有一个数据结构被称作 '''inode''',它被用来描述设备用用的属性,比如设备所有者,所属于的组, 上次访问时间等等。参看[http://qref.sourceforge.net/usr/include/linux/fs.h /usr/include/linux/fs.h]来获得struct inode在 Debian GNU/Linux系统中的详细信息。
 +
 +
这些表现出来的统一的物理入口是非常强大的,因为它们使得可以使用同样的命令和同样 的操作来访问完全不同的设备。
 +
 +
您所有的文件都可以在一个次方上面,----或者您有20个磁盘,有些是在网络上其它的计算机上面, 在GNU/Linux系统中每个文件和目录都与其拥有者(主人)和拥有组相关联。所有的文件信息都保存在一个称为'''inode'''的数据结构中。
 +
 +
----
 +
==== 4.5.3 文件和目录的访问权限 ====
 +
文件和目录的访问权限对如下3类用户进行了分别定义:
 +
 +
*  文件'''拥有者'''(u),
 +
*  文件拥有者所在'''用户组'''中的其它成员(g),和
 +
*  所有'''其它'''用户(o)。
 +
 +
每个文件均拥有下列三种权限:
 +
 +
*  '''read''' (r): 查看文件内容
 +
*  '''write''' (w): 修改文件
 +
*  '''execute''' (x): 如同命令一样执行文件
 +
 +
每个目录均拥有下列三种权限:
 +
 +
*  '''read''' (r): 列出目录内容
 +
*  '''write''' (w): 在目录中增删文件
 +
*  '''execute''' (x): 访问目录中的文件
 +
 +
在此,对目录的'''execute'''权限,不仅意味着允许查看目录下文件的内容,还允许查看文件的其它信息如文件大小、修改时间。
 +
 +
ls可用来显示目录和文件的这些信息。参阅 ls(1)。使用ls的-l选项,就会按如下顺序显示下列信息:
 +
 +
*  '''文件类型'''(第1个字符)
 +
**    -: 普通文件
 +
**    d: 目录
 +
**    l: 符号链接
 +
**    c: 字符型设备节点
 +
**    b: 块设备节点
 +
**    p: 命名管道
 +
**    s: 套接字
 +
*  文件访问'''权限'''(接下来的9个字符,每3个一组依次代表user、group和other)。
 +
*  文件的'''硬链接数'''
 +
*  文件拥有'''user'''的用户名
 +
*  文件所属'''group'''的用户组名
 +
*  文件的字符数'''大小''' (bytes)
 +
*  文件的'''时间和日期''' (mtime)
 +
*  文件的'''名称'''
 +
 +
在root账号下可使用chown改变文件的拥有者。要改变文件的所属组,可以文件拥有者或root的身份运行chgrp。要改变目录的访问权限,可以文件拥有者或root的身份运行chmod。
 +
 +
<pre><nowiki>
 +
# chown newowner foo
 +
# chgrp newgroup foo
 +
# chmod  [ugoa][+-=][rwx][,...] foo
 +
</nowiki></pre>
 +
 +
细节请参见 chown(1)、 chgrp(1) 和 chmod(1)。
 +
 +
例如,可以root帐号下创建一个目录树,并使其拥有者为foo,所属组为bar:
 +
 +
<pre><nowiki>
 +
# cd /some/location/
 +
# chown -R foo:bar .
 +
# chmod -R ug+rwX,o=rX .
 +
</nowiki></pre>
 +
 +
下面是3个更特殊的权限:
 +
 +
*  '''set user ID''' (s 或 S 代替 user's x),
 +
*  '''set group ID''' (s 或 S 代替 group's x),
 +
*  '''sticky bit''' (t 或 T 代替 other's x).
 +
 +
在此,如果隐藏在特殊权限后面的执行权限标位没有设置,则ls -l的输出中,这些标识位将使用大写字母。
 +
 +
为可执行文件设置'''set user ID'''位将允许用户以该文件拥有者的ID来执行该文件(例如以'''root'''身份)。同样,为可执行文件设置'''set group ID'''将允许用户以该文件所属组的ID来执行该文件(例如以'''root'''身份)。因为这些设置将引起安全风险,所以使用这些特性时要格外小心。
 +
 +
为目录设置'''set group ID''',则该目录会使用BSD-like文件创建方案,即目录中所有新创建的文件均属于该目录所属的'''group'''。
 +
 +
为目录设置'''sticky bit'''可防止非文件拥有者移动目录中的文件。为确保全局可写目录如/tmp或组可写目录中的文件内容不被修改,不仅要关闭文件的'''写'''权限,还应设置目录的'''sticky bit''',否则,任何对该目录有写权限的用户均可以将该文件移动到别处,然后在原地创建一个同名文件。
 +
 +
这儿有一些有关文件权限的有趣例子。
 +
 +
<pre><nowiki>
 +
$ ls -l /etc/passwd /etc/shadow /dev/ppp /usr/sbin/pppd
 +
crw-rw----    1 root    dip      108,  0 Jan 18 13:32 /dev/ppp
 +
-rw-r--r--    1 root    root        1051 Jan 26 08:29 /etc/passwd
 +
-rw-r-----    1 root    shadow        746 Jan 26 08:29 /etc/shadow
 +
-rwsr-xr--    1 root    dip        234504 Nov 24 03:58 /usr/sbin/pppd
 +
$ ls -ld /tmp /var/tmp /usr/local /var/mail /usr/src
 +
drwxrwxrwt    4 root    root        4096 Feb  9 16:35 /tmp
 +
drwxrwsr-x  10 root    staff        4096 Jan 18 13:31 /usr/local
 +
drwxrwsr-x    3 root    src          4096 Jan 19 08:36 /usr/src
 +
drwxrwsr-x    2 root    mail        4096 Feb  2 22:19 /var/mail
 +
drwxrwxrwt    3 root    root        4096 Jan 25 02:48 /var/tmp
 +
</nowiki></pre>
 +
 +
在 chmod(1) 命令里,有一种替代的数字模式来描述文件权限。这种数字模式使用 3 到 4 个八进制数字(以8为基)。 每个数字相应如下:
 +
 +
*  第一个可选数字: '''set user ID''' (=4)、 '''set group ID''' (=2) 和 '''sticky bit''' (=1)之和
 +
*  第二个数字: '''user''' 的 '''read''' (=4)、'''write''' (=2) 和 '''execute''' (=1) 权限之和
 +
*  第三个数字: 同上,用于 '''group'''
 +
*  第四个数字: 同上,用于 '''other'''
 +
 +
这听起来复杂,但实际上相当简单。 从 ls -l 命令的输出中,看第(2-10)列,把它们作为二进制(以2为基)文件权限(“-”表示“0”,“rwx” 表示“1”)的表示方式来读, 这种数字模式值将使你理解八进制(以8为基)的文件权限表示。 [[[UbuntuHelp:../footnotes.zh-cn.html#f33| 33]]] 例如,尝试:
 +
 +
<pre><nowiki>
 +
$ touch foo bar
 +
$ chmod u=rw,go=r foo
 +
$ chmod 644 bar
 +
$ ls -l foo bar
 +
-rw-r--r--    1 penguin  penguin  0 Nov  3 23:30  foo
 +
-rw-r--r--    1 penguin  penguin  0 Nov  3 23:30  bar </nowiki></pre>
 +
 +
默认的文件权限掩码使用 shell 内建命令 umask 设置。 参见 builtins(7)。
 +
 +
----
 +
==== 4.5.4 时间戳 ====
 +
GNU/Linux的文件有3种类型的时间戳:
 +
 +
*  '''mtime''': 修改时间 (ls -l),
 +
*  '''ctime''': 状态改变时间 (ls -lc),以及
 +
*  '''atime''': 最近访问时间 (ls -lu).
 +
 +
注意'''ctime'''并非文件创建时间。
 +
 +
*  覆盖一个文件会改变所有三类时间'''mtime'''、'''ctime'''和'''atime'''所有三类时间。
 +
*  改变文件的访问权限或拥有者会改变文件的'''ctime'''和'''atime'''。
 +
*  读文件会改变文件的'''atime'''。
 +
 +
注意,在 Debian 系统中,即便是简单的读文件通常会引起文件的写操作,从而更新'''inode'''上的'''atime'''信息。使用noatime选项来挂载文件系统,可使用系统忽略该操作,从而加速文件的访问和读取。参阅mount(8)。
 +
 +
使用 touch(1) 命令来改变存在文件的时间戳。
 +
 +
----
 +
==== 4.5.5 链接 ====
 +
在2种方法将文件foo关联到不同的文件名bar。
 +
 +
*  '''hardlink'''(硬链接)相当于现存文件的另一个名字。(ln foo bar),
 +
*  '''symbolic link'''(符号链接),或者“symlink”,是通过名字指向另外一个文件的特殊文件。(ln -s foo bar)。
 +
 +
下面的例子显示了链接数的改变和使用rm命令时产生的微妙差异。
 +
 +
<pre><nowiki>
 +
$ echo "Original Content" > foo
 +
$ ls -l foo
 +
-rw-r--r--    1 osamu    osamu          4 Feb  9 22:26 foo
 +
$ ln foo bar    # 硬链接
 +
$ ln -s foo baz  # 符号链接
 +
$ ls -l foo bar baz
 +
-rw-r--r--    2 osamu    osamu          4 Feb  9 22:26 bar
 +
lrwxrwxrwx    1 osamu    osamu          3 Feb  9 22:28 baz -> foo
 +
-rw-r--r--    2 osamu    osamu          4 Feb  9 22:26 foo
 +
$ rm foo
 +
$ echo "New Content" > foo
 +
$ cat bar
 +
Original Content
 +
$ cat baz
 +
New Content
 +
</nowiki></pre>
 +
 +
上例中符号链接均拥有名义上的文件访问权限“rwxrwxrwx”,它们的有效访问权限均由它们所指向的文件来定义。
 +
 +
* 链接到它所属的目录,因此任何新目录的链接数都从2开始计算。.. 链接到父目录,因些目录链接数会随新的子目录数的增长而增长。
 +
 +
----
 +
==== 4.5.6 命名管道(FIFOs) ====
 +
命名管道是一个行为象一个管道的文件。把某些东西放入命名管道文件,它从另外的一端出来。因此,它被称为 FIFO,或 First-In-First-Out:首先放入管道的东西将首先从另外一端出来。
 +
 +
如果写东西到一个命名管道,在写的东西在管道被读出之前,写的进程不会中止。如果从一个命名管道读,读的进程在中止之前,一直处于等待状态,直到有东西可以读为止。命名管道的大小始终为零 --- 它不储存数据,象 shell | 一样,它仅仅连接两个进程。然而, 这个管道有一个名字,两个进程没有必要在同一个命令行运行,或者由同一个用户运行。
 +
 +
做下面的操作来尝试:
 +
 +
<pre><nowiki>
 +
$ cd; mkfifo mypipe
 +
$ echo "hello" >mypipe & # 放入后台
 +
[1] 5952
 +
$ ls -l mypipe
 +
prw-r--r--    1 penguin penguin  0 2003-11-06 23:18 mypipe
 +
$ cat mypipe
 +
hello
 +
[1]+  Done                    echo hello >mypipe
 +
$ ls mypipe
 +
prw-r--r--    1 penguin penguin  0 2003-11-06 23:20 mypipe
 +
$ rm mypipe
 +
</nowiki></pre>
 +
 +
----
 +
==== 4.5.7 套接字 ====
 +
套接字类似于命名管道(FIFO),它允许进程交换信息。 对于套接字,那些进程不必要在同时运行,也没有必要是同一个祖先进程的子进程。 它是进程间通讯的端点。 信息交换可以通过网络发生在不同的主机之间。
 +
 +
----
 +
==== 4.5.8 设备文件 ====
 +
设备文件是系统上物理的或者虚拟的设备,比如说硬盘、显卡、显示器或者键盘。 一个虚拟设备的例子是控制台,由 /dev/console 表示。
 +
 +
有两种类型的设备:
 +
 +
*  '''字符设备'''
 +
**    一次能够访问一个字符,那就是说,从设备读或者写的最小的数据单元是一个字符(byte)。
 +
*  '''块设备'''
 +
**    一定是访问一个叫块的大单元,它含有许多字符。 硬盘是一个块设备。
 +
 +
设备文件可以被读写,尽管设备文件包含二进制数据,而这些二进制数据对人类来说是费解的乱码。 向设备文件直接写数据,有时侯对解决硬件连接故障有用。 比如说,将一个文本文件导出到打印机设备 /dev/lp0, 或者发送调制解调器命令到一个适当的串口 /dev/ttyS0。 但是,除非是慎重的操作,它有可能造成一个大的破坏。 所以请小心。
 +
 +
----
 +
===== 4.5.8.1 /dev/null 等等 =====
 +
/dev/null 是一个特殊的设备文件,它忽略写给它的任何东西。 如果不需要某些东西,把它扔到 /dev/null。 它本质上是一个无底洞。 如果从 /dev/null 读东西,将会立即得到文件结束符(EOF)。
 +
 +
/dev/zero 是类似的,只是从它读的话,将会得到 \0 字符(不与数字零的 ASCII 码相同)。 参阅 [[UbuntuHelp:../ch-tips.zh-cn.html#s-dummyfile| 空文件, 第 8.6.34 节]]。
 +
 +
----
 +
===== 4.5.8.2 设备号 =====
 +
按例子执行 ls,将显示设备号。
 +
 +
<pre><nowiki>
 +
$ ls -l /dev/hda /dev/ttyS0 /dev/zero
 +
brw-rw----    1 root    disk      3,  0 Mar 14  2002 /dev/hda
 +
crw-rw----    1 root    dialout    4,  64 Nov 15 09:51 /dev/ttyS0
 +
crw-rw-rw-    1 root    root      1,  5 Aug 31 03:03 /dev/zero
 +
</nowiki></pre>
 +
 +
在这里:
 +
 +
*  /dev/hda 主设备号为 3,次设备号为 0。 属于 disk 组的用户有读写访问权。
 +
*  /dev/ttyS0 主设备号为 4,次设备号为 64。 属于 dialout 组的用户有读写访问权。
 +
*  /dev/zero 主设备号为 1,次设备号为 5。 所有人都有读写访问权。
 +
 +
在老的系统中,安装过程使用 /sbin/MAKEDEV 命令来创建设备号。 参阅 MAKEDEV(8)。
 +
 +
在新的系统中, /dev 下的文件系统通过设备文件系统自动生成, 设备文件系统与 /proc 文件系统类似。
 +
 +
----
 +
==== 4.5.9 /proc 文件系统 ====
 +
/proc 文件系统是一个伪文件系统,它包含系统信息和正在运行的进程信息。
 +
 +
当注意到一个特殊的文件 /proc/kcore 时,人们经常恐慌,因为它通常很巨大。 该文件(或多或少)是计算机内存的一个拷贝。 它被用来调试内核, 实际上它并不存在,所以不必担心它的大小。
 +
 +
参阅 [[UbuntuHelp:../ch-kernel.zh-cn.html#s-proc-sys| 通过 proc 文件系统调整内核, 第 7.3 节]] 和 proc(5)。
 +
 +
----
 +
=== 4.6 X 窗口系统 ===
 +
参阅 [[UbuntuHelp:../ch-tune.zh-cn.html#s-x| X, 第 9.4 节]]。
 +
 +
----
 +
==== 4.6.1 启动 X 窗口系统 ====
 +
X 窗口系统能够使用类似 xdm 的图形登录守护启动,或者在控制台下输入如下的命令启动:
 +
 +
<pre><nowiki>
 +
$ exec startx
 +
</nowiki></pre>
 +
 +
----
 +
==== 4.6.2 X 窗口系统下的菜单 ====
 +
X 环境能够与许多窗口管理器协作,各个窗口管理器的用户界面有很大不同。 请记住,右击根窗口将显示一个选择菜单。这个功能总是存在。
 +
 +
*  得到 shell 命令提示符,从菜单启动 Xterm :
 +
**    "XShells" --> "XTerm".
 +
*  浏览有图形的网页,从菜单启动 Mozilla:
 +
**    "Apps" --> "Net" --> "Mozilla Navigator".
 +
*  浏览有图形的 PDF 文件,从菜单启动 Xpdf:
 +
**    "Apps" --> "Viewers" --> "Xpdf".
 +
 +
如果没有发现菜单条目,请安装适当的软件包。参阅 [[UbuntuHelp:../ch-package.zh-cn.html#s-apt-install| Ubuntu 软件包管理基础, 第 6.2 节]]。
 +
 +
----
 +
==== 4.6.3 X 窗口系统键盘序列 ====
 +
当运行 X 窗口系统时,下面是一些需要记住的重要键盘序列。
 +
 +
*  Ctrl-Alt-F1 到 F6: 切换到其它伪终端(从 X 系统、DOSEMU等。)
 +
*  Alt-F7: 切换回 X 窗口
 +
*  Ctrl-Alt-minus: 改变 X 窗口的屏幕解析度(减号为数字键盘的键)
 +
*  Ctrl-Alt-plus: 在 X 窗口内以相反的方向改变屏幕解析度(加号为数字键盘的键)
 +
*  Ctrl-Alt-Backspace: 中止 X 服务器程序
 +
*  Alt-X, Alt-C, Alt-V: 通常在 Windows/Mac 下与 Ctrl- 键联合的粘贴、拷贝和剪切键,在 Netscape Composer 等程序中,使用 Alt- 键代替。
 +
 +
----
 +
=== 4.7 进一步学习 ===
 +
目前,推荐阅读来自 [http://www.tldp.org/guides.html The Linux Documentation Project: Guides] 的关键用户手册。
 +
 +
*  "The Linux System Administrators' Guide",
 +
**    覆盖了系统运行、处理用户账号、备份和配置系统的各个方面的内容。
 +
**    软件包: sysadmin-guide
 +
**    文件: [http://qref.sourceforge.net/usr/share/doc/sysadmin-guide/html/index.html /usr/share/doc/sysadmin-guide/html/index.html]
 +
**    网址: http://www.tldp.org/LDP/sag/index.html
 +
*  "The Linux Network Administrator's Guide, Second Edition",
 +
**    在 Linux 环境下网络管理的简单参考
 +
**    软件包: (not available)
 +
**    文件:[http://qref.sourceforge.net/quick/(not%20applicable) (not applicable)]
 +
**    网址:http://www.tldp.org/LDP/nag2/index.html
 +
*  "Linux: Rute User's Tutorial and Exposition"
 +
**    覆盖 GNU/Linux 系统管理的精装书(有在线版)
 +
**    作者:Paul Sheer
 +
**    出版:Prentice Hall
 +
**    软件包:rutebook (从 non-free)
 +
**    文件: /usr/share/doc/rutebook/
 +
 +
更多资源参阅 [[UbuntuHelp:../ch-support.zh-cn.html| Ubuntu 技术支持, 第 15 章]]。
 +
 +
 +
 +
== 第 5 章 - 发行版升级到 Breezy、Dapper 或 Edgy ==
 +
----
 +
升级的官方发布通知位于 http://www.ubuntu.com/ubuntu/releases 和 http://www.ubuntu.com/news(不断更新中)。
 +
 +
将系统升级到 Breezy、Dapper 或 Edgy 需要几个步骤,而且必须按照下面的顺序:
 +
 +
*  升级到 Hoary (如果你的系统比 Hoary 要旧)
 +
 +
*  升级到 Breezy
 +
 +
*  升级到 Dapper
 +
 +
*  升级到 Edgy
 +
 +
Ubuntu 不支持省略中间发布的升级
 +
 +
----
 +
=== 5.1 升级到 Hoary ===
 +
 +
升级系统到 Hoary。
 +
 +
<pre><nowiki>
 +
# apt-get upgrade
 +
# apt-get dist-upgrade
 +
</nowiki></pre>
 +
 +
----
 +
=== 5.2 准备升级工作 ===
 +
你可以用通过网络获取软件包的方式来将一个版本升级到另外的一个版本。 这可以通过如下的方法来做。
 +
 +
生成一个干净的 stable 版存储列表:
 +
 +
<pre><nowiki>
 +
# cd /etc/apt
 +
# cp -f sources.list sources.list.old
 +
# :>sources.list 
 +
# apt-setup noprobe
 +
</nowiki></pre>
 +
 +
如果你想升级到 Breezy ,你需要增加 Breezy 版的存储源到这个新的列表。 如果你想升级到 Dapper ,你还需要增加 Dapper 版的存储源。
 +
 +
<pre><nowiki>
 +
# cd /etc/apt
 +
# grep -e "^deb " sources.list >srcs
 +
# :>sources.list
 +
# cp -f srcs sources.list
 +
# sed -e "s/breezy/dapper/" srcs >>sources.list
 +
# sed -e "s/breezy/dapper/" srcs >>sources.list
 +
# apt-get update
 +
# apt-get install apt apt-utils
 +
</nowiki></pre>
 +
 +
调整 /etc/apt/sources.list 和 /etc/apt/preferences 的艺术请参阅 [[UbuntuHelp:../ch-package.zh-cn.html#s-apt-install| Ubuntu 软件包管理基础, 第 6.2 节]] 。
 +
 +
----
 +
=== 5.3 升级 ===
 +
在按照描述的方法正确的设置 /etc/apt/sources.list 和 /etc/apt/preferences 文件后,你便可以开始升级了。
 +
 +
软件包的实质性信息请参见 [[UbuntuHelp:../ch-package.zh-cn.html| Ubuntu 软件包管理, 第 6 章]],如果你遇到问题,请查看 [[UbuntuHelp:../ch-package.zh-cn.html#s-apt-trouble| APT 升级错误以及解决方法, 第 6.3.2 节]]。
 +
 +
----
 +
==== 5.3.1 使用 dselect ====
 +
如果系统在许多软件包都包含了 -dev 等软件包,推荐使用下面的 dselect 操作方法进行控制软件包的细化操作。
 +
 +
<pre><nowiki>
 +
# dselect update  # 升级前请先完成这步
 +
# dselect select  # 选择附加软件包
 +
</nowiki></pre>
 +
 +
运行 dselect 时当前所有软件包均被选中,dselect 会提示你基于 Depends,Suggests 和 Recommends 的附加软件包,如果不想添加任何软件包,只需输入 Q 退出 dselect。
 +
 +
<pre><nowiki>
 +
# dselect install
 +
</nowiki></pre>
 +
 +
在安装过程中,必须回答一些有关软件包配置的问题,准备好你的笔记本花点时间处理它们。参阅 [[UbuntuHelp:../ch-package.zh-cn.html#s-dselect| dselect, 第 6.2.4 节]]。
 +
 +
使用 dselect。'''它能干得不赖 :)'''
 +
 +
----
 +
==== 5.3.2 使用 apt-get ====
 +
<pre><nowiki>
 +
# apt-get update
 +
# apt-get -t breezy upgrade
 +
# apt-get -t breezy dist-upgrade
 +
# apt-get -t dapper upgrade
 +
# apt-get -t dapper dist-upgrade
 +
# apt-get -t edgy upgrade
 +
# apt-get -t edgy dist-upgrade
 +
</nowiki></pre>
 +
 +
一旦你的系统到达 hoary ,使用 aptitude 代替 apt-get 是明智的。(aptitude 接受 apt-get 所接受的许多选项,包括上面列出的那些选项。)
 +
 +
升级到目前 dselect 的设置:
 +
 +
<pre><nowiki>
 +
# apt-get dselect-upgrade
 +
</nowiki></pre>
 +
 +
参阅 [[UbuntuHelp:../ch-system.zh-cn.html#s-depends| 软件包依赖关系, 第 2.2.8 节]]。
 +
 +
 +
== 第 6 章 - Ubuntu 软件包管理 ==
 +
----
 +
高级包管理工具 aptitude 是目前首选的字符界面的 APT 前端程序。 它会记住哪些包是你安装的,哪些是为了满足依赖关系而安装的;在不被已安装包需要的情况下aptitude 会自动卸载后者。它内建一套高级的包过滤器,但是比较难上手。
 +
 +
synaptic 是目前首选的基于 GTK 的图形化 APT 前端程序。它的包过滤器比 aptitude 的好用多了。它包含了对 [http://debtags.alioth.debian.org/ Debian Package Tags] 的实验性支持。
 +
 +
为了减少 Ubuntu 仓库的网络负担和加快你下载的速度,你应该从 Ubuntu 镜像下载。
 +
 +
如果你需要在你本地网络的许多台机器上安装相同的包。在使用 APT 下载包的时候,请考虑使用 squid 来设置本地 HTTP 代理。必要的话,可以设置环境变量 http_proxy 或者在 /etc/apt/apt.conf 里面设置 http 的值。
 +
 +
尽管 apt_preferences(5) 中描述的 APT 的 pinning 功能非常强大,但造成的影响是难以察觉和管理的。你应该把它作为一个高级功能来看待。
 +
 +
在 [[UbuntuHelp:../ch-tips.zh-cn.html#s-chroot| chroot, 第 8.6.35 节]] 中描述的使用方法非常适合于需要同时确保系统的稳定性和使用最新软件的情况。
 +
 +
 +
----
 +
=== 6.1 介绍 ===
 +
如果你没有精力阅读完所有的开发者文档,那么先看看本章的内容,然后开始体验 Ubuntu 的威力吧:-)
 +
 +
----
 +
==== 6.1.1 主要的包管理工具 ====
 +
<pre><nowiki>
 +
dpkg      – Debian 包安装工具
 +
apt-get  – APT 的命令行前端
 +
aptitude  – APT 的高级的字符和命令行前端
 +
synaptic  – 图形界面的 APT 前端
 +
dselect  – 使用菜单界面的包管理工具
 +
tasksel  – Task 安装工具
 +
</nowiki></pre>
 +
 +
这些工具不是用来取代对方的,比如 dselect 同时使用 APT 和 dpkg。
 +
 +
APT 使用 /var/lib/apt/lists/* 来跟踪可用的软件包,而 dpkg 使用的是 /var/lib/dpkg/available。如果你使用了 aptitude 或者其他 APT 前端来安装软件包,同时你希望使用 dselect 来安装软件包,请不要忘记使用 dselect 菜单上的 [U]pdate (或者运行"dselect update") 来更新 /var/lib/dpkg/available。
 +
 +
在处理依赖关系上 apt-get 会自动下载安装依赖的软件包,但是不会处理所安装软件推荐的或者建议的软件包。
 +
 +
相反 aptitude 可以设置成安装所安装软件推荐的或者建议的软件包。
 +
 +
dselect 给使用者列出所安装软件推荐或建议的软件包,可以进行单独选择。 参阅 [[UbuntuHelp:/ch-system.zh-cn.html#s-depends| 软件包依赖关系, 第 2.2.8 节]].
 +
 +
----
 +
==== 6.1.2 方便的工具 ====
 +
<pre><nowiki>
 +
dpkg-reconfigure  - 重新配置已安装的软件包
 +
                (如果它是使用 debconf 进行配置的)
 +
dpkg-source      - 管理源码包
 +
dpkg-buildpackage - 自动生成包文件
 +
apt-cache        - 在本地缓冲区检查包文件
 +
</nowiki></pre>
 +
 +
----
 +
=== 6.2 Ubuntu 软件包管理基础 ===
 +
----
 +
==== 6.2.1 设置 APT ====
 +
参考 [[UbuntuHelp:../ch-woody.zh-cn.html#s-testing-transition| 准备升级工作, 第 5.2 节]] 来设置 sources.list。 [[[UbuntuHelp:../footnotes.zh-cn.html#f34| 34]]] 请参考 [[UbuntuHelp:../ch-install.zh-cn.html| Ubuntu 系统安装提示, 第 3 章]], [[UbuntuHelp:../ch-woody.zh-cn.html| 发行版升级到 Breezy、Dapper 或 Edgy, 第 5 章]], 和 [[UbuntuHelp:../ch-edit.zh-cn.html#s-bin-editor| 应急的编辑器, 第 11.2 节]].
 +
 +
----
 +
==== 6.2.2 安装 tasks ====
 +
你可以安装一些软件包集合,这些集合是由使 Ubuntu 系统满足某些特定用途的典型软件包组成的。 这些集合被称为“tasks”。
 +
 +
在初始化安装中,安装 tasks 最简单的方法就是使用 tasksel。 注意在使用之前,你需要运行
 +
 +
<pre><nowiki>
 +
dselect update
 +
</nowiki></pre>
 +
 +
建议使用 aptitude 来安装 tasks。 它能让你在选择好 tasks 并准备安装之前,删除 tasks 中的某些软件包。
 +
 +
----
 +
==== 6.2.3 aptitude ====
 +
aptitude 是全新的可菜单操作的包安装工具,和 dselect 类似,但是是针对 APT 从头设计的。从大多数参数来讲,aptitude 完全可以作为 apt-get 的一个兼容的代替品。 参阅 aptitude(1) 和 /usr/share/doc/aptitude/README.
 +
 +
一旦开始使用 aptitude,你最好继续使用它,而不是选择其他替代工具。否则你将失去 aptitude 包存的软件安装清单,你就不能享受自动删除多余软件包的功能了。
 +
 +
全屏状态下 aptitude 接受单键的命令,大多数是小写的。主要的几个功能键如下:
 +
 +
<pre><nowiki>
 +
按键     动作
 +
F10        菜单
 +
?          按键命令帮助(完整的清单)
 +
u          更新软件包信息
 +
+          标记软件包为升级或者新安装
 +
-          标记软件包为删除(保留配置文件)
 +
_          标记软件包为完全删除(删除配置文件)
 +
===          保持软件包的当前版本,阻止其被升级
 +
U          标记所有可以升级的软件包为升级
 +
g          下载和安装选择的软件包
 +
q          退出当前屏幕,保存改变
 +
x          退出当前屏幕,忽略改变
 +
Enter      查看一个软件包的信息
 +
C          查看一个软件包的更新日志
 +
l          改变软件包树状显示限制
 +
/          搜索第一个匹配的软件包
 +
\          重复最后一次搜索
 +
</nowiki></pre>
 +
 +
和 apt-get 一样, aptitude 安装软件包的时候自动解决依赖问题。 aptitude 还能安装即将安装的软件包推荐或者建议的软件包。你通过 F10 -> 选项 -> 处理依赖关系 在菜单上更改这一默认设置。
 +
 +
aptitude 的其他特点如下:
 +
 +
*  aptitude 能访问所有版本的软件包。
 +
*  aptitude 的动作记录在 /var/log/aptitude。
 +
*  aptitude 能轻松的追踪陈旧的和本地建立的软件包,并在“过期的和在本地创建的软件包”上列出。
 +
*  aptitude 内建强大的包搜索和显示功能。熟悉 mutt 的用户很容易上手,因为这个显示方法的灵感来源于 mutt。 参阅 /usr/share/doc/aptitude/README 中的 “SEARCHING, LIMITING, AND EXPRESSIONS”
 +
*  aptitude 在全屏状态下有嵌入的 su 功能。普通用户都可以执行,直到安装或删除软件的时候再取得管理员权限。
 +
 +
----
 +
==== 6.2.4 dselect ====
 +
dselect 一直是主要的包维护工具。你可以考虑用 aptitude 代替。
 +
 +
当你启动程序的时候,dselect 会自动选择所有“Required”“Important”和“Standard”的包。
 +
 +
dselect 的用户界面是有些奇怪,但是大部分人已经习惯了。 它有四个主要命令: (指令都是大写的!):
 +
 +
<pre><nowiki>
 +
按键     动作
 +
Q          退出。确认当前的选择并退出。
 +
(忽略依赖关系)
 +
R          撤销! 我不是那个意思。
 +
D          不管他!我不管你 dselect 怎么想的,照做就好了!
 +
U          都照建议的来做
 +
</nowiki></pre>
 +
 +
使用 D 和 Q,你可以选择有冲突的选项。请小心使用这个命令。
 +
 +
在 /etc/dpkg/dselect.cfg 中加上一行“expert”来减少干扰。
 +
 +
如果你的机器运行 dselect 的速度很慢,你可以考虑在速度快一点的机器上运行 dselect,确定你要安装的软件包之后,在慢的机器上通过 apt-get 来安装它们。
 +
 +
----
 +
==== 6.2.5 使用 APT 来维护发行版本 ====
 +
请编辑 /etc/apt/preferences 并加入以下内容来维持系统为 dapper 版本:
 +
 +
<pre><nowiki>
 +
Package: *
 +
Pin: release a=edgy
 +
Pin-Priority: 800
 +
 +
Package: *
 +
Pin: release a=dapper
 +
Pin-Priority: 600
 +
</nowiki></pre>
 +
 +
更多复杂的例子请参考 apt_preferences(5),可以让您做更多的事情,例如安装 edgy 的软件包的同时还能把系统维持在 dapper。
 +
 +
关于限制特定软件在特定版本上,而其他软件随系统升级的设置在 [[UbuntuHelp:../examples/| examples subdirectory]] 找到,即 preferences.dapper 和 preferences.edgy。
 +
 +
如果你混用不同的发行版本,例如 dapper 和 breezy 或 edgy 和 dapper,你终究还是会安装上 dapper 或 edgy 版本的核心软件,例如 libc6,这样作无法确保系统中没有臭虫。你需要特别小心。
 +
 +
另外一个例子,preferences.breezy,会强制降级所有的软件到 breezy。
 +
 +
Ubuntu 不支持将某个'''软件包'''降级到先前的发行版本。然而在新的软件包出问题时,你会发现你不得不安装旧的可用的软件包。你可以在本地的 /var/cache/apt/archives/ 或远端的 http://archive.ubuntu.com/ 中找到先前的版本。请参考 [[UbuntuHelp:../ch-package.zh-cn.html#s-rescue-dpkg| 使用 dpkg 救助, 第 6.3.3 节]]。
 +
 +
从某个'''发行版本'''降级到先前的发行版本也是不被支持的,而且这样做往往造成很多问题。不过你愿意冒险的话,作为最后的手段这样做也是值得的。
 +
 +
----
 +
==== 6.2.6 aptitude, apt-get 和 apt-cache 命令 ====
 +
还是以上面使用 testing 发行版的用户为例,可使用下列命令来管系统:
 +
 +
*  aptitude upgrade (或 apt-get upgrade 或 aptitude dist-upgrade 或 apt-get dist-upgrade)
 +
这样就会跟随 dapper 版本 — 它们会跟踪 dapper 版本的更新情况,对系统上所有软件包进行升级,并从 dapper 处重新分析依赖关系并安装相关的包。 [[[UbuntuHelp:../footnotes.zh-cn.html#f35| 35]]]
 +
 +
*  apt-get dselect-upgrade
 +
这个命令跟踪 dapper 版本 — 根据 dselect 的选择对系统上的软件包进行升级。
 +
 +
*  aptitude install package/edgy
 +
从 edgy 中安装 package,并由 dapper 版本提供安装依赖的包。
 +
 +
*  aptitude install -t edgy package
 +
通过设置 edgy 的 Pin-Priority 为 990,可以从 edgy 处安装 package 及其依赖的包。
 +
 +
*  apt-cache policy foo bar ...
 +
检查 foo bar ... 软件包的状态。
 +
 +
*  aptitude show foo bar ... | less (或 apt-cache show foo bar ... | less)
 +
查看 foo bar ... 软件包的有关信息。
 +
 +
*  aptitude install foo=2.2.4-1
 +
安装 foo 软件包的特定版本 2.2.4-1。
 +
 +
*  aptitude install foo bar-
 +
安装 foo 软件包并删除 bar 软件包。
 +
 +
*  aptitude remove bar
 +
删除 bar 软件包,但保留其配置文件。
 +
 +
*  aptitude purge bar
 +
删除 bar 软件包及其所有配置文件。
 +
 +
在上面的例子中使用 -u 选项的作用是在实际升级之前将所有将要升级的软件包列出,并提示用户确认。下面的操作可将 -u 设置为默认行为:
 +
 +
<pre><nowiki>
 +
$ cat >> /etc/apt/apt.conf << .
 +
// Always show packages to be upgraded (-u)
 +
APT::Get::Show-Upgraded "true";
 +
.
 +
</nowiki></pre>
 +
 +
使用 --no-act 可进行模拟升级,并不是进行真正的升级行为。
 +
 +
----
 +
=== 6.3 Ubuntu 生存命令 ===
 +
掌握了这些知识,你就能够享受无尽的“升级”了 :-)
 +
 +
----
 +
==== 6.3.1 检测程序错误寻求帮助 ====
 +
如你使用某个软件包出现问题,在寻求帮助或发送错误报告之前请确认查看过下列站点 (lynx, links 和 w3m 都很好用):
 +
 +
<pre><nowiki>
 +
$ lynx https://launchpad.net/distros/ubuntu/+bugs/
 +
$ lynx https://launchpad.net/distros/ubuntu/+bugs/package-name  # 如果你知道软件包的名字
 +
$ lynx https://launchpad.net/distros/ubuntu/+bugs/bugnumber    # 如果你知道错误序号
 +
</nowiki></pre>
 +
 +
在 Google(www.google.com)中使用关键字“site:launchpad.net”搜索。
 +
 +
如有疑问,可阅读帮助文件。设置 CDPATH 如下:
 +
 +
<pre><nowiki>
 +
export CDPATH=.:/usr/local:/usr/share/doc
 +
</nowiki></pre>
 +
 +
然后输入
 +
 +
<pre><nowiki>
 +
$ cd packagename
 +
$ pager README.Debian # 如果存在的话
 +
$ mc
 +
</nowiki></pre>
 +
 +
更多技术支持资源列在 [[UbuntuHelp:../ch-support.zh-cn.html| Debian 技术支持, 第 15 章]]。
 +
 +
----
 +
==== 6.3.2 APT 升级错误以及解决方法 ====
 +
从 edgy/dapper 进行升级时可能出现 [[UbuntuHelp:../ch-woody.zh-cn.html#s-upgrade-system| 升级, 第 5.3 节]] 中提到的软件包关联问题。多数情况下,是因为升级的软件包所需的新增的关联包没有安装。可使用如下方法解决:
 +
 +
<pre><nowiki>
 +
# aptitude dist-upgrade
 +
</nowiki></pre>
 +
 +
如果这招无效,可以重复下面的方法至到问题解决:
 +
 +
<pre><nowiki>
 +
# aptitude -f upgrade        # 即使遇到错误也继续 upgrade
 +
... 或
 +
# aptitude -f dist-upgrade  # 即使遇到错误也继续 dist-upgrade
 +
</nowiki></pre>
 +
 +
一些的确存在问题的升级脚本会引起持续出错。最好的解决方法是检查该软件包的安装脚本 /var/lib/dpkg/info/packagename.{post-,pre-}{install,removal} 然后运行:
 +
 +
<pre><nowiki>
 +
# dpkg --configure -a    # 配置所有安装的软件包
 +
</nowiki></pre>
 +
 +
如果脚本报告缺少配置文件,查看一下 /etc 中相关的配置文件。如果配置文件有 .dpkg-new 扩展名(或其它类似的扩展名),去掉(mv)它的扩展名。
 +
 +
从 edgy/dapper 进行升级时可能出现软件包关联问题。可用这个方法智取:
 +
 +
<pre><nowiki>
 +
# aptitude -f install package # 重载坏关联
 +
</nowiki></pre>
 +
 +
还可以用 equivs 包来解决此类问题。参阅 /usr/share/doc/equivs/README.Debian 和 [[UbuntuHelp:../ch-package.zh-cn.html#s-equivs| equivs 软件包, 第 6.5.2 节]]。
 +
 +
----
 +
==== 6.3.3 使用 dpkg 救助 ====
 +
如果你在使用 APT 的时候遇到死胡同了,那么可以从 Ubuntu 的镜像站点下载软件包并使用 dpkg 来安装。如果你不能访问网络,可以在 /var/cache/apt/archives/ 中找到被缓存的软件包。
 +
 +
<pre><nowiki>
 +
# dpkg -i fetchmail_6.2.5-4_i386.deb
 +
</nowiki></pre>
 +
 +
如果你用这种方法安装软件包,但是遇到了依赖问题安装失败了,并且你确实需要安装这个软件包。你可以用 dpkg 的 --ignore-depends,--force-depends 和其他参数来安装软件包。dpkg(8) 有更详细的介绍。
 +
 +
----
 +
==== 6.3.4 恢复软件包选择状态的数据 ====
 +
如果 /var/lib/dpkg/status 因为某种原因坏掉了,Ubuntu 系统将会完全丢失软件包选择状态的数据。赶快到 /var/lib/dpkg/status-old 或 /var/backups/dpkg.status.* 下找找旧的 /var/lib/dpkg/status 文件。
 +
 +
将 /var/backups/ 放在其它的分区是个好习惯,因为该目录包含了许多非常重要的系统数据。
 +
 +
如果旧的 /var/lib/dpkg/status 文件也坏了,仍可以从 /usr/share/doc/ 下的目录进行恢复这些信息。
 +
 +
<pre><nowiki>
 +
# ls /usr/share/doc | \
 +
grep -v [A-Z] | \
 +
grep -v '^texmf$' | \
 +
grep -v '^debian$' | \
 +
awk '{print $1 " install"}' | \
 +
dpkg --set-selections
 +
# dselect --expert # 重新安装系统,如果需要的话去除一些选项
 +
</nowiki></pre>
 +
 +
----
 +
==== 6.3.5 /var 崩溃之后如何恢复系统 ====
 +
/var 目录包含着定时更新的数据如 mail,它们很容易遭破坏。将目录放到别的分区可降低风险,如果最坏的事情发生了,可以通过重建 /var 目录来挽救 Ubuntu 系统。
 +
 +
从相同或旧版本的最简 Ubuntu 系统中取得 /var 目录的内容框架,例如 [http://people.debian.org/~osamu/pub/ var.tar.gz],然后它放入受损系统的 root 目录,接着
 +
 +
<pre><nowiki>
 +
# cd /
 +
# mv var var-old      # 如果里面还有其他有用资料的话
 +
# tar xvzf var.tar.gz # 使用 Woody 框架文件
 +
# aptitude            # 或是用 dselect
 +
</nowiki></pre>
 +
 +
上述步骤可使系统恢复工作。使用 [[UbuntuHelp:../ch-package.zh-cn.html#s-recover-status| 恢复软件包选择状态的数据, 第 6.3.4 节]] 中描述的技术加速软件包选择数据的恢复。([FIXME]:该过程需要更多的实践来检验)
 +
 +
----
 +
==== 6.3.6 为无法启动的系统安装软件包 ====
 +
使用 Ubuntu 急救软盘 /CD 或从多启动 Linux 系统其它分区启动。 参阅 [[UbuntuHelp:../ch-tips.zh-cn.html#s-booting| 启动系统, 第 8.1 节]]. 将无法启动的系统挂载到 /target 并使用 dpkg 的 chroot 安装模式。
 +
 +
<pre><nowiki>
 +
# dpkg --root /target -i packagefile.deb </nowiki></pre>
 +
 +
接下来就可以着手配置并解决问题。
 +
 +
如是只是由于 lilo 损坏而造系统无法启动,可使用标准 Ubuntu 急救盘启动。假设你的 root 分区位于 /dev/hda12 且想使用 runlevel 3,在启动提示符输入:
 +
 +
<pre><nowiki>
 +
boot: rescue root=/dev/hda12 3
 +
</nowiki></pre>
 +
 +
这样,你就可以使用软盘中内核启动系统,新系统的功能基本齐全。(可能丢失某些内核特性或模块)
 +
 +
----
 +
==== 6.3.7 如果 dpkg 命令出错怎么办 ====
 +
如果 dpkg 损坏就不能安装任何 .deb 文件。下面的操作可帮助你修复这种状况。(在第一行,你可将“links”替换成你喜欢的浏览器。)
 +
 +
<pre><nowiki>
 +
$ links http://archive.ubuntu.com/ubuntu/pool/main/d/dpkg/
 +
... 下载完好的 dpkg_version_arch.deb
 +
$ su
 +
password: *****
 +
# ar x dpkg_version_arch.deb
 +
# mv data.tar.gz /data.tar.gz
 +
# cd /
 +
# tar xzfv data.tar.gz
 +
</nowiki></pre>
 +
 +
对 i386,亦可用 http://packages.ubuntu.com/dpkg 作为 URL。
 +
 +
----
 +
=== 6.4 Ubuntu 必杀技 ===
 +
有了这些命令的'''启迪''',你将会从无休止的升级冲突的地狱中解放出来,达到 Ubuntu '''天堂'''。 :-)
 +
 +
----
 +
==== 6.4.1 文件信息 ====
 +
在已安装的软件包中许找特定文件所属的软件包:
 +
 +
<pre><nowiki>
 +
$ dpkg {-S|--search} pattern
 +
</nowiki></pre>
 +
 +
或者搜索 Ubuntu archive:
 +
 +
<pre><nowiki>
 +
$ wget http://archive.ubuntu.com/ubuntu/dists/dapper/Contents-i386.gz
 +
$ zgrep -e pattern Contents-i386.gz </nowiki></pre>
 +
 +
或是用专门的软件包命令:
 +
 +
<pre><nowiki>
 +
# aptitude install dlocate 
 +
# 和 slocate 冲突 (locate 的安全版本)
 +
$ dlocate filename        # dpkg -L 和 dpkg -S 的高效代替品
 +
...
 +
# aptitude install auto-apt # 请求式软件包安装工具
 +
# auto-apt update          # 为 auto-apt 建立 db 文件
 +
$ auto-apt search pattern 
 +
# 在所有软件包中搜索 pattern,不论安装与否
 +
</nowiki></pre>
 +
 +
----
 +
==== 6.4.2 软件包信息 ====
 +
搜索并显示包文件的信息。编辑 /etc/apt/sources.list,让 APT 指向正确的包文件。如果想了解 dapper/edgy 中的相应软件包与当前系统安装的软件包有何差别,使用 apt-cache policy — 更好。
 +
 +
<pre><nowiki>
 +
# apt-get  check          # 更新缓冲区并检查损坏的软件包
 +
$ apt-cache search  pattern # 按文本描述搜索软件包
 +
$ apt-cache policy  package # 软件包的 priority/dists 信息
 +
$ apt-cache show -a package # 显示所有 dists 中软件包描述信息
 +
$ apt-cache showsrc package # 显示相应源码包的信息
 +
$ apt-cache showpkg package # 软件包调试信息
 +
# dpkg  --audit|-C          # 搜索未完成安装的软件包
 +
$ dpkg {-s|--status} package ... # 已安装软件包描述
 +
$ dpkg -l package ...      # 已安装软件包的状态(每个占一行)
 +
$ dpkg -L package ...      # 列出软件包安装的文件的名称
 +
</nowiki></pre>
 +
 +
你也这可这样查看软件包信息(我用 mc 浏览):
 +
 +
<pre><nowiki>
 +
/var/lib/apt/lists/*
 +
/var/lib/dpkg/available
 +
</nowiki></pre>
 +
 +
比较下面的文件可以确切了解最近的安装过程对系统造成了那些改变。
 +
 +
<pre><nowiki>
 +
/var/lib/dpkg/status
 +
/var/backups/dpkg.status*
 +
</nowiki></pre>
 +
 +
----
 +
==== 6.4.3 使用 APT 无人执守安装 ====
 +
使用 APT 无人执守安装,要在 /etc/apt/apt.conf 中加上一行: /etc/apt/apt.conf:
 +
 +
<pre><nowiki>
 +
Dpkg::Options {"--force-confold";}
 +
</nowiki></pre>
 +
 +
另一种等价的方法是运行 apt-get -q -y packagename。这种方法可能产生严重的负作用,所以使用起来要小心。参阅 apt.conf(5)和 dpkg(1)。
 +
 +
安装完毕以后,可以用 [[UbuntuHelp:../ch-package.zh-cn.html#s-reconfigure| 重新配置已安装的软件包, 第 6.4.4 节]] 中的方法配置特定的软件包。
 +
 +
----
 +
==== 6.4.4 重新配置已安装的软件包 ====
 +
使用下列方法重新配置已安装的软件包。
 +
 +
<pre><nowiki>
 +
# dpkg-reconfigure --priority=medium package [...]
 +
# dpkg-reconfigure --all  # 重新配置所有的软件包
 +
# dpkg-reconfigure locales # 生成额外的 locales
 +
# dpkg-reconfigure --p=low xserver-xfree86 # 重新配置 X 服务器
 +
</nowiki></pre>
 +
 +
如果你想永久改变 debconf 对话框模式,可这么做。
 +
 +
某些程序用于生成特殊的配置脚本。 [[[UbuntuHelp:../footnotes.zh-cn.html#f36| 36]]]
 +
 +
<pre><nowiki>
 +
apt-setup    - 创建 /etc/apt/sources.list
 +
install-mbr  - 安装主引导(Master Boot Record)管理器
 +
tzconfig      - 设定本地时间
 +
gpmconfig    - 设置 gpm 鼠标 daemon
 +
sambaconfig  - 在 Potato 中配置 Samba( Woody 使用 debconf 来配置)
 +
eximconfig    - 配置 Exim (MTA)
 +
texconfig    - 配置 teTeX
 +
apacheconfig  - 配置 Apache (httpd)
 +
cvsconfig    - 配置 CVS
 +
sndconfig    - 配置声音系统
 +
...
 +
update-alternatives - 设定默认启动命令,例如设定 vi 启动 vim
 +
update-rc.d        - System-V init 脚本管理工具
 +
update-menus        - Debian 菜单系统
 +
...
 +
</nowiki></pre>
 +
 +
----
 +
==== 6.4.5 删除和清除软件包 ====
 +
删除软件包但保留其配置文件:
 +
 +
<pre><nowiki>
 +
# aptitude remove package ...
 +
# dpkg  --remove package ...
 +
</nowiki></pre>
 +
 +
删除软件包并清除配置文件:
 +
 +
<pre><nowiki>
 +
# aptitude purge  package ...
 +
# dpkg  --purge  package ...
 +
</nowiki></pre>
 +
 +
----
 +
==== 6.4.6 阻止旧软件包升级 ====
 +
举个例子,要阻止 libc6 和 libc6-dev 通过 dselect 或使用 aptitude install package 命令升级,可执行:
 +
 +
<pre><nowiki>
 +
# echo -e "libc6 hold\nlibc6-dev hold" | dpkg --set-selections
 +
</nowiki></pre>
 +
 +
这种方法不影响 aptitude install package 命令操作。要阻止 aptitude upgrade package 或 aptitude dist-upgrade 命令对软件包执行的强制自动降级行为,可在 /etc/apt/preferences 中加上:
 +
 +
<pre><nowiki>
 +
Package: libc6
 +
Pin: release a=dapper
 +
Pin-Priority: 2000
 +
</nowiki></pre>
 +
 +
这里“Package:”后不能使用通配符如“libc6*”,如果要保持所有与 glibc 源码包相关的二进制包的版本同步,可以明确的列出它们。
 +
 +
该命令可以显示处于“阻止”状态的软件包:
 +
 +
<pre><nowiki>
 +
dpkg --get-selections "*"|grep -e "hold$"
 +
</nowiki></pre>
 +
 +
----
 +
==== 6.4.7 breezy/dapper/edgy 混合系统 ====
 +
apt-show-versions 可以列出发行版中可用软件包的版本。
 +
 +
<pre><nowiki>
 +
$ apt-show-versions | fgrep /dapper | wc
 +
... 你有多少 testing 软件包
 +
$ apt-show-versions -u
 +
... 列出可升级的软件包
 +
$ aptitude install `apt-show-versions -u -b | fgrep /edgy`
 +
... 将所有 edgy 软件包升级到最新版本
 +
</nowiki></pre>
 +
 +
----
 +
==== 6.4.8 删除缓存包文件 ====
 +
使用 APT 安装软件包会在 /var/cache/apt/archives 目录留下缓存文件,要清除这些文件可使用:
 +
 +
<pre><nowiki>
 +
# aptitude autoclean # 仅删除无用的包
 +
# aptitude clean    # 删除所有的包
 +
</nowiki></pre>
 +
 +
----
 +
==== 6.4.9 记录/拷贝系统配置 ====
 +
对软件包选择情况进行本地备份:
 +
 +
<pre><nowiki>
 +
$ dpkg --get-selections "*" >myselections  # 或使用 \*
 +
</nowiki></pre>
 +
 +
"*" 使 myselections 包含那些被指定“完全删除(purge)”的文件。
 +
 +
你可将这个文件发送到另一台电脑并在那儿按文件中的选择进行软件包安装。
 +
 +
<pre><nowiki>
 +
# dselect update
 +
# dpkg --set-selections <myselections
 +
# apt-get -u dselect-upgrade    # 或者 dselect install
 +
</nowiki></pre>
 +
 +
----
 +
==== 6.4.10 向 breezy 系统引入软件包 ====
 +
对 breezy 系统进行部分升级,在软件运行环境中重新编译源码的确是个诱人的想法,这样可以避免由于关联关系不得不对大量软件包升级。首先,将下列镜像源加入 /etc/apt/sources.list:
 +
 +
<pre><nowiki>
 +
deb-src http://archive.ubuntu.com/ubuntu dapper \
 +
main multiverse restricted universe
 +
deb-src http://archive.ubuntu.com/ubuntu edgy \
 +
main multiverse restricted universe
 +
</nowiki></pre>
 +
 +
由于屏幕输出的限制,上述每条 deb-src 命令均分成了 2 行,实际上在 sources.list 中它们均为单行。
 +
 +
然后下载源码并在本地生成软件包:
 +
 +
<pre><nowiki>
 +
$ apt-get update  # 更新软件包搜索列表
 +
$ apt-get source package
 +
$ dpkg-source -x package.dsc
 +
$ cd package-version
 +
... 查找需要的软件包(编译所需的关联包列在.dsc文件中)并安装它们,
 +
你还需要“fakerroot”软件包。
 +
 +
$ dpkg-buildpackage -rfakeroot
 +
 +
……或者(没有签名)
 +
$ dpkg-buildpackage -rfakeroot -us -uc # 如果需要,再使用“debsign”
 +
 +
……然后安装
 +
$ su -c "dpkg -i packagefile.deb"
 +
</nowiki></pre>
 +
 +
通常,需要安装一些带 “-dev” 后缀的软件包以满足关联关系。debsign 在 devscripts 软件包中。auto-apt 可以轻松解决这些关联问题。请使用 fakeroot,如是没有必要,就别使用 root 帐号。
 +
 +
现在,这些关联问题已被简化。例如,编译 pine 源码包:
 +
 +
<pre><nowiki>
 +
# apt-get build-dep pine
 +
# apt-get source -b pine
 +
</nowiki></pre>
 +
 +
----
 +
==== 6.4.11 本地软件包文件 ====
 +
为了创建与 APT 和 dselect 系统兼容的本地软件包文件,需要创建 Packages,包中文件要放在特定的目录树中。
 +
 +
Ubuntu 官方包文件喜欢存放于本地 deb 仓库,下面就来创建仓库:
 +
 +
<pre><nowiki>
 +
# aptitude install dpkg-dev
 +
# cd /usr/local
 +
# install -d pool # 软件包存放的物理地址
 +
# install -d dists/edgy/main/binary-i386
 +
# ls -1 pool | sed 's/_.*$/ priority section/' | uniq > override
 +
# 编辑 override # 调整 priority and section
 +
# dpkg-scanpackages pool override /usr/local/ \
 +
> dists/edgy/main/binary-i386/Packages
 +
# cat > dists/unstable/main/Release << EOF
 +
Archive: edgy
 +
Version: 3.0
 +
Component: main
 +
Origin: Local
 +
Label: Local
 +
Architecture: i386
 +
EOF
 +
# echo "deb file:/usr/local unstable main" \
 +
>> /etc/apt/sources.list
 +
</nowiki></pre>
 +
 +
还有一种快速但是肮脏的方法来创建本地 deb 仓库:
 +
 +
<pre><nowiki>
 +
# aptitude install dpkg-dev
 +
# mkdir /usr/local/debian
 +
# mv /some/where/package.deb /usr/local/debian
 +
# dpkg-scanpackages /usr/local/debian /dev/null | \
 +
gzip - > /usr/local/debian/Packages.gz
 +
#  echo "deb file:/usr/local/debian ./" >> /etc/apt/sources.list
 +
</nowiki></pre>
 +
 +
在 /etc/apt/sources.list 中设置相应镜像源入口地址,就可以通过 HTTP 或 FTP 方式远程访问存放在其中的包文件了。
 +
 +
----
 +
==== 6.4.12 转换或安装外来的二进制软件包 ====
 +
alien 可将其它格式的二进制软件包如 Redhat 的 rpm、Stampede 的 slp 、Slackware 的 tgz 和 Solaris 的 pkg 等转化成 Ubuntu 的 deb 格式软件包,如果你想在自己的系统上使用别的 Linux 发行版中的软件包,可使用 alien 将它转化成系统首选的软件包格式后安装。alien 还支持 LSB 的软件包。
 +
 +
----
 +
==== 6.4.13 自动安装命令 ====
 +
auto-apt 是一种请求式软件包安装工具。
 +
 +
<pre><nowiki>
 +
$ sudo auto-apt update
 +
... 升级数据库
 +
$ auto-apt -x -y run
 +
进入 auto-apt 模式:/bin/bash
 +
退出这个命令继而退出 auto-apt 模式。
 +
$ less /usr/share/doc/med-bio/copyright # 访问不存在的文件
 +
... 安装提供了这个文件的软件包。
 +
... 同样安装依赖的包
 +
</nowiki></pre>
 +
 +
----
 +
==== 6.4.14 校验已安装的软件包 ====
 +
debsums 可以校验已安装软件包的 MD5 编码,对某些软件包没有可用的 MD5 编码,系统管理员可使用一个临时的解决办法:
 +
 +
<pre><nowiki>
 +
# cat >>/etc/apt/apt.conf.d/90debsums
 +
DPkg::Post-Install-Pkgs {"xargs /usr/bin/debsums -sg";};
 +
^D
 +
</nowiki></pre>
 +
 +
per Joerg Wendland [email protected] (untested).
 +
 +
----
 +
==== 6.4.15 优化 sources.list ====
 +
简而言之,我尝试过用各种优化方法来创建 sources.list,但任何一种方法对我这个住在美国的人来说都没有明显的改善。最后我还是用 apt-setup 手工选择近一点的站点。
 +
 +
apt-spy 会根据站点回应时间和带宽自动创建 sources.list。netselect-apt 会创建一个更完整的 sources.list 文件,但它使用更落后的方法来选择镜像站点(比较 ping 时间)。
 +
 +
<pre><nowiki>
 +
# aptitude install apt-spy
 +
# cd /etc/apt ; mv sources.list sources.list.org
 +
# apt-spy -d dapper -l sources.apt
 +
</nowiki></pre>
 +
 +
----
 +
=== 6.5 其他 Ubuntu 的特性 ===
 +
----
 +
==== 6.5.1 dpkg-divert 命令 ====
 +
使用文件'''转移'''(diversions)的方法可以强令 dpkg 将文件安装到 '''转移''' 目录而非默认目录。对于某个引起冲突的文件,可以在 Ubuntu 软件包脚本中使用 '''Diversions''' 将它安装到别的目录。系统管理员还可以使用 diversion 来重载软件包配置文件,或者用来保留某些旧配置文件(这些文件没有在 '''conffiles''' 中登记)当安装新版软件时这些文件会被覆盖。(参阅 [[UbuntuHelp:../ch-system.zh-cn.html#s-conffile| 保存本地配置, 第 2.2.4 节]])。
 +
 +
<pre><nowiki>
 +
# dpkg-divert [--add]  filename # 添加 “转移”
 +
# dpkg-divert --remove filename # 删除 “转移”
 +
</nowiki></pre>
 +
 +
记住,不到万不得已不要使用 dpkg-divert。
 +
 +
----
 +
==== 6.5.2 equivs 软件包 ====
 +
如果你从源码编译程序,最好将它做成本地 Ubuntu 化软件包(*.deb)。最新的方法是使用 equivs。
 +
 +
<pre><nowiki>
 +
Package: equivs
 +
Priority: extra
 +
Section: admin
 +
Description: Circumventing Debian package dependencies
 +
This is a dummy package which can be used to create Debian
 +
packages, which only contain dependency information.
 +
</nowiki></pre>
 +
 +
----
 +
==== 6.5.3 Alternative 命令 ====
 +
如果想用 vi 来启动 vim,请用 update-alternatives:
 +
 +
<pre><nowiki>
 +
# update-alternatives --display vi
 +
...
 +
# update-alternatives --config vi
 +
Selection    Command
 +
-----------------------------------------------
 +
1        /usr/bin/elvis-tiny
 +
2        /usr/bin/vim
 +
*****+    3        /usr/bin/nvi
 +
 +
Enter to keep the default[*], or type selection number: 2
 +
</nowiki></pre>
 +
 +
Ubuntu alternatives 系统中的这些项目,都是以符号连接的形式存放在 /etc/alternatives 下的。
 +
 +
想设置你喜爱的 X window 环境,执行 update-alternatives 来指定 /usr/bin/x-session-manager 和 /usr/bin/x-window-manager。详情参阅 [[UbuntuHelp:../ch-tune.zh-cn.html#s-custom-x| 自定义 X 会话, 第 9.4.5.1 节]]。
 +
 +
/bin/sh 是指向 /bin/bash 或 /bin/dash 的链接。想兼容旧的 Bash 脚本,使用 /bin/bash 比较保险,但更好还是使用 /bin/dash,因为它更符合 POSIX 标准。升级到 2.4 版 Linux 内核,系统一般将它设置为 /bin/dash。
 +
 +
----
 +
==== 6.5.4 运行级别 Runlevel ====
 +
安装好之后,大部分 Ubuntu 软件包的服务被设定为在 runlevel 2 到 5 时运行。所以,在没有定制过的 Ubuntu 系统中,runleve 2、3、4、5、6 是没有区别的Ubuntu 保留这些给本地管理员使用。 [[UbuntuHelp:../ch-system.zh-cn.html#s-custombootscripts| 自定义运行级别, 第 2.4.3 节]] 说明如何定制 runlevels。 这样的 runlevels 系统和其他流行的 GNU/Linux 发行版本完全不同。 你可能要做的改变之一就是取消 runlevel 2 上的 xdm 和 gdm,使得在完成启动之后 X 显示管理去不会自动启动;然后你可以通过切换到 runlevel 3 来启动 X 显示管理器。
 +
 +
参阅 [[UbuntuHelp:../ch-system.zh-cn.html#s-runlevels| 运行级别, 第 2.4.2 节]] 来获得更多关于 runlevels 的信息。
 +
 +
----
 +
==== 6.5.5 停止 daemon 服务 ====
 +
Ubuntu 发行版非常注重系统安全,并期望系统管理员能担此重任。它将系统的易用性放在了第二位,许多 daemon 服务都定位在最高安全级别,因而,默认安装状态下系统只启动最少的(甚至没有)可用的服务。
 +
 +
如果拿不定把握(有关 Exim、DHCP...),可执行 ps aux 或检查 /etc/init.d/* 和 /etc/inetd.conf 下的内容,还可以使用 [[UbuntuHelp:../ch-tune.zh-cn.html#s-loginctrl| 用 PAM 来控制登录, 第 9.2.1 节]] 中提到的方法检查 /etc/hosts.deny。pidof 命令也很有用(参阅 pidof(8))
 +
 +
在 Ubuntu 系统中,默认状态下 X11 不允许 TCP/IP(远程)连接。参阅 [[UbuntuHelp:../ch-tune.zh-cn.html#s-xtcp| 在 TCP/IP 中使用 X, 第 9.4.6 节]],但是使用 SSH 进行 X 传送是允许的,参阅 [[UbuntuHelp:../ch-tune.zh-cn.html#s-xssh| 联接远程的 X 服务器 – ssh, 第 9.4.8 节]]。
 +
  
  

2007年5月22日 (二) 12:35的版本

Ubuntu 参考手册 摘要 Ubuntu 参考手册 旨在为运行 Ubuntu 的用户提供全面的指导。书中提供了大量 shell-command 实例,它们涵盖系统管理的方方面面,包括的主题有:Ubuntu 的基本概念、系统安装提示、Ubuntu 软件包管理、Ubuntu 中的 Linux 内核、系统微调、建立网关、文本编辑器、CVS、程序设计、面向非开发者的 GnuPG 等,每个主题都包括基础指南、实用技巧和其它相关信息。


版权声明 本参考手册主要修改来源为 Debian 中文参考手册, 依照其版权声明,采用同样的版权。

本文档版权适用于 GNU General Public License version 2 或更高版本的相关条款。

在遵守并包含本文档版权声明的前提下,制作和发布本文档的完整拷贝是允许的。并且,所有这些拷贝均受到本许可声明的保护。

在遵守上述完整拷贝版本有关版权声明的前提下,拷贝和发布基于本文档完整拷贝的修改版本是允许的,并且,发布所有通过修改本文档而得到的工作成果,须使用与本文档的许可声明一致的许可声明。

在遵守上述修改版本版权声明的前提下,拷贝和发布本文档其它语言的翻译版本是允许的,如果本许可声明有经自由软件基金会(Free Software Foundation)核准的当地化译本,则遵循当地化译本。


目录

第 1 章 - 序言


本书《Ubuntu 参考手册》的目的是对整个 Ubuntu 系统作一个全面的介绍,提供一本“安装之后的”用户使用手册。本手册的读者应该愿意阅读 shell 脚本(scripts)。我也假定读者在阅读之前已经具备了类 Unix 系统的基本操作技能。

我决定在本书中解释所有的细节,因为你可以在 manual 页、info 页或 HOWTO 文档中获得这些信息。我希望能给读者提供实用的信息,而非全面的解释。因此我会在正文中给出实际的命令序列,或是在 [[UbuntuHelp:../examples/|examples/]] 给出脚本示例作为参考。在按照这些示例下达命令之前,你必须要先理解其内容的含义。实际的命令序列可能会依你的系统的具体情况而有细微的差别。

书中的很多信息实际上是对在 参考资料, 第 15.1 节 中列出的众多权威参考文献的引用和提示。

本书最初是作为一本“快速参考手册”来写的,但是现在增加了很多内容。尽管如此,保持文字简短紧凑(keep it short and simple, KISS)是我的指导思想。

如果你是在寻找紧急情况下系统维护方面的帮助,请直接阅读 Ubuntu 生存命令, 第 6.3 节。


1.1 官方文档

本书的最新官方版本可在 http://wiki.ubuntu.org.cn/UbuntuManual/ 访问到。


1.2 文档约定

文中许多信息通过简短的 bash 命令给出,以下是其排版格式约定:

# command in root account  root用户命令
$ command in user account  普通用户命令
... description of action  命令动作描述

这些 shell 命令的例子使用 PS2=" "。 更多信息参见 Bash – GNU标准交互式shell, 第 13.2.1 节。

参考:

文中用到了下列缩写:

本文中的其它缩写会在使用前定义。

文中只提供了 LDP 文档的 URL,然而,LDP 文档已经被 Ubuntu 打包。 当这些包被安装后,LDP 文档会在 /usr/share/doc/HOWTO/ 里。

参阅 [[UbuntuHelp:../ch-support.zh-cn.html#s-references| 参考资料, 第 15.1 节]]。


1.3 脚本样例

本文档的 [[UbuntuHelp:../examples/| 脚本样例]] 需要通过网页访问下载。


1.4 基本设置

如果你的系统是最小安装,但你希望充分使用本文档, 请执行下面的命令来安装其它软件包,这些软件包含有一些有用的文档。

# apt-get install info man-db doc-base dhelp apt apt-utils auto-apt \
dpkg less mc ssh nano-tiny elvis-tiny vim sash \
kernel-package \
manpages manpages-dev doc-debian doc-linux-text \
debian-policy developers-reference maint-guide \
apt-howto harden-doc install-doc \
libpam-doc glibc-doc samba-doc exim-doc cvsbook \
gnupg-doc
# apt-get install debian-reference # for Sarge, do this too :)

对于 Woody 版,把 exim-doc-html 增加到上面的列表中。 对于 Sarge 版,请使用 exim4-doc-html 和 exim4-doc-info 来代替 exim-doc 包。


1.5 Ubuntu 发行版(distributions)基本概念

Ubuntu软件仓库包含上千个软件包,它们按照我们提供的基础等级和是否符合自由软件哲学,被分成四种组件,即“main”(主要)、“restricted”(受限)、“universe”(公共)和“multiverse”(多元化)。

Ubuntu软件仓库被分成四组,“main”、“restricted”、“universe”和“multiverse”,按照我们所能提供的基础能力以及它们是否符合 自由软件哲学 来划分。

标准Ubuntu安装都采用main和restricted的软件。你可以通过Synaptic软件管理器和Aptitude软件包管理器安装其他的软件。通过编辑/etc/apt/sources.list文件,就可以得到它们。如果要编辑sources.list,请使用“man sources.list”来获得更多信息。

Ubuntu 发行版有代码名称,具体描述在 Ubuntu 发布版代号, 第 2.1.7 节 中。 Warty 在2004年10月发布, 在 Warty 发布后,三个发行版对应为 Hoary、 Breezy 和 Dapper。

订阅低流量的邮件列表 [email protected], 可以得到关于 ubuntu 的重要声明信息。 参阅 Debian 文件, 第 2.1 节。

如果你想使用比发行版自带软件包更新的软件包版本, 你可以按照 [[UbuntuHelp:../ch-woody.zh-cn.html| 发行版升级到 Hoary、Breezy 或 Dapper, 第 5 章]] 的描述,升级到一个新的发行版; 或者你只升级选择的软件包。 如果该软件包不能够容易的升级,你可以按照 向 Breezy 系统引入软件包, 第 6.4.10 节. 的说明,把该软件包向后移植到你现在所使用的发行版上。

如果使用混合型发行版,例如在 Breezy 中加入 Dapper , 或是在 Hoary 中加入 Breezy,会一不留神从 Breezy 或 Dapper 中下载像 libc6 一样的核心软件包。 没有保证能够使这些软件包不含有 bug ,请你高度注意!

运行 Breezy 或 Dapper 版本的 Ubuntu 意味着可能会遇到严重软件错误。包含一个稳定版 Ubuntu 的多启动方案可有效控制风险,另一个技巧是使用 chroot,详情参阅 chroot, 第 8.6.35 节。后者可以实际在不同的终端同时运行不同版本的 Ubuntu。

在 Ubuntu 基础, 第 2 章 中我们将讲解有关 Ubuntu 发行版的一些基本概念,之后,我将向你介绍一些基本信息以帮助你与最新软件快乐相处,并从 restricted 和 universe 组件中获益。心急的读者可以直接翻到 Ubuntu 生存命令, 第 6.3 节。祝你升级愉快!


第 2 章 - Ubuntu 基础


本章讲述非开发人员需要掌握的 Ubuntu 系统基础知识。有关知识的权威参考,请参阅:

  • Desktop Guide
  • Server Guide
  • Install Guide

列表见 [[UbuntuHelp:../ch-support.zh-cn.html#s-references| 参考资料, 第 15.1 节]]。

如果你想查阅简要的“how-to”解释文档,可直接跳到 [[UbuntuHelp:../ch-package.zh-cn.html| Ubuntu 软件包管理, 第 6 章]] 或其它相关章节。

本章的内容取自“Ubuntu FAQ”,经过较大的改编,以适于普通 Ubuntu 系统管理者上手。


2.1 Ubuntu 文件


2.1.1 目录结构

Ubuntu 软件包位于 Ubuntu 镜像站点 的目录树中,可通过 FTP 或 HTTP 访问它们。

下列目录存在于任何 Ubuntu 镜像站点的 ubuntu 目录下:

dists/::: 本目录包含“发行版”(distributions),此处是获得 Ubuntu 发布版本(releases)和已发布版本(pre-releases)的软件包的正规途径。有些旧软件包及 Contens-*.gz Packages.gz 等文件仍在其中。

pool/::: 所有 Ubuntu 发布版及已发布版的软件包的新的物理地址。

indices/::: 维护人员文件和重载文件。

project/::: 大部分为开发人员的资源,如: project/experimental/::: 本目录包含了处于开发中的软件包和工具,它们均处于 alpha 测试阶段。用户不应使用这些软件,因为即使是经验丰富的用户也会被搞得一团糟。 project/orphaned/::: 已不再有人维护的软件包,它们已从发行版中孤立出来。


2.1.2 Ubuntu 发行版

现在在 dists 目录下有三个 Ubuntu 发行版。它们是“hoary”发行版,“breezy”发行版,和“dapper”发行版。有时还有一个“edgy”发行版。其中也包含了一个现不再支持"warty"发行版。


2.1.3 hoary 发行版

hoary 2005年4月发布,其发行版软件包入口:

  • hoary/main/:“main”组件包括了自由软件、可以被自由发布的软件和被Ubuntu团队完全支持的软件。其中包括了大多数流行的和稳定的开源软件,当您安装Ubuntu时默认安装的就是这些软件。
  • hoary/restricted/:“restricted”组件是专供普遍用途,而且没有自由软件版权,但依然被Ubuntu团队支持的软件。请注意,因为不能直接修改软件,因而我们可能不能提供完全的技术支持,即便如此,我们还能向实际作者反馈Bug报告。
  • hoary/universe/:“universe”组件是整个自由、开源Linux世界的缩影。在“universe”组件中,你可以找到大多数开源软件,以及在开源版权下的软件,所有这些都是在公共源的基础上建立的。这些软件都是使用“main”中的组件编写的,它们能与“main”组件相安无事地共同运行,但它们没有安全升级的保障。“universe”组件包含了数以千计的软件。虽然是公共的,用户必须明白它们与稳定的Ubuntu核心的软件的差异和不稳定。
  • hoary/multiverse/:multiverse”组件包含了“不自由”的软件,这意味着这些软件不满足 Ubuntu相对于“main”组件的各种版权政策。当您使用这些软件时,如何调整各种权力以及遵重版权所有者的问题,就完全依靠您自己把握了。 这些软件不被我们支持,而且通常不能被修改和更新,您将自己承担任何风险。

现在,作为以上位置的新增功能,实际上新的软件包都存储在pool目录中([[UbuntuHelp:../ch-system.zh-cn.html| pool目录, 第 2.1.10 节]])。


2.1.4 breezy 发行版

breezy 2005年10月发布。现在,除了上述目录,新上载的软件包的物理存储位置为pool目录( pool目录, 第 2.1.10 节)。在breezy下同样有main、restricted、universe和multiverse子目录,它们的作用与hoary中的一样。


2.1.5 dapper 发行版

dapper 2006年6月发布。提供了长达3年的支持,新版本以Ubuntu 6.06 LTS(Long Term Support)(长期支持),它针对一些大组织的需求对桌面版和服务器版都做个一定程度上的增强。新上载的软件包的物理存储位置为pool目录([[UbuntuHelp:../ch-system.zh-cn.html| pool目录, 第 2.1.10 节]])。在dapper下同样有main、restricted、universe和multiverse子目录,它们的作用与hoary中的一样。


2.1.6 edgy 发行版

edgy 发行版反映了系统的最新开发进展。欢迎广大用户使用并测试这些软件包,同时也提醒你们这些软件包还不完善。使用edgy发行版的好处就是你可以获得Ubuntu项目的最新更新—不过新东西也会出新问题,你得好坏兼收:-)


2.1.7 Ubuntu 发布版其它仓库

存在于dists目录下的物理目录名,例如breezy-updates和breezy-security,就是“附加的仓库”。当某个Ubuntu发行版处于维护阶段。将包的必要升级和安全更新放在附加的仓库里。其附加仓库通常有 ***-updates、***-security、***-proposed、***-backports。


2.1.8 已用过的发布版代号

已使用过的发行版代号有: Ubuntu 4.10 (The Warty Warthog)、 Ubuntu 5.04 (The Hoary Hedgehog)、 Ubuntu 5.10 (The Breezy Badger)、 Ubuntu 6-06 (The Dapper Darke)。


2.1.9 发布版代号

  • Warty Warthog 多疣的疣猪,
  • Hoary Hedgehog 灰白的刺猬,
  • Breezy Badger 活泼的獾,
  • Dapper Darke 漂亮的鸭子,
  • Edgy Eft 躁动的蜥蜴

2.1.10 pool目录

过去,软件包均放在dists目录下相应发行版的子目录中。这种做法产生了许多问题,当镜像站点进行新版本发布时大量带宽被消耗。

现在软件包均放进一个巨大的“池子(pool)”,按照源码包名称分类存放。为了方便管理,pool目录下按属性再分类(main、restricted、universe和multiverse),分类下面再按源码包名称的首字母归档。这些目录包含的文件有:运行于各种系统架构的二进制软件包,生成这些二进制软件包的源码包。

你可以执行命令apt-cache showsrc mypackagename,查看“Directory:”行获知每个软件包的存放位置。例如:apache软件包存放在pool/main/a/apache/软件包存放在lib*软件包数量巨大,它们以特殊的方式归档:例如,libpaper软件包存放在pool/main/libp/libpaper/。

诸如apt等命令访问的索引文件仍位于dists目录中。

通常,你大可不必注意这些,新版的apt和旧版dpkg-ftp会自动处理它们。


2.1.11 发布源目录结构

在每个主目录树下(dists/dapper/main、dists/dapper/restricted、dists/dapper/universe、dists/dapper/multiverse/,等)按芯片架构又分了子目录,每个子目录中存放着在该芯片架构下编译的二进制软件包。

  • binary-amd64/ AMD64 或 EM64T 架构
  • binary-i386/ 所有的使用 Intel/AMD/等 处理器的PC,
  • binary-powerpc/ Apple Macintosh G3, G4, 和 G5
  • binary-sparc/ Sun UltraSPARC 系统

2.1.12 源代码

Ubuntu 系统中的main,universe组件有源代码,不仅如此,许可证条款规定系统中所有的程序必须和其源代码一起发行,或提供源代码出售。

通常源代码发布在source目录,该目录同时处于所有架构目录中,更新的源码则在pool目录中(参阅[[UbuntuHelp:../ch-system.zh-cn.html| pool目录, 第 2.1.10 节]])。对于不太熟悉 Ubuntu 归档目录结构的用户想获得源代码可以试试apt-get source mypackagename命令。

有些软件包,如著名的pine,由于许可证限制,只提供源码包。(最近,pine-tracker软件包提供了一个简易的安装版)安装源码包的方法可参阅[[UbuntuHelp:../ch-package.zh-cn.html| 向系统引入软件包, 第 6.4.10 节]],[[UbuntuHelp:../ch-program.zh-cn.html| 打包, 第 13.10 节]]教你如何手工创建一个软件包。

restricted和multiverse目录中的软件包可能不提供源代码,因为它们没有正式加入 Ubuntu 系统。


2.2 Ubuntu 软件包管理系统


2.2.1 Ubuntu 软件包概述

软件包通常包含了实现一系列相关命令或特性所必须的所有的文件。Ubuntu 软件包采用了和Debian相同的软件包格式,有两种类型的软件包:

  • Binary packages(二进制软件包),它包含可执行文件、配置文件、man/info页面、版权声明和其它文档。这些软件包以 Ubuntu 特定的格式发布(参阅[[UbuntuHelp:../ch-system.zh-cn.html| Ubuntu 软件包格式, 第 2.2.2 节]]);它们通常使用.deb的扩展名以示区别。这种二进制软件包可使用 Ubuntu 工具dpkg解包,详情见有关帮助页面。
  • Source packages(源码包),包含一个.dsc文件它用于描述源码包(包括下列文件的名称),一个.orig.tar.gz文件它是未经修改的原始源代码压缩文件,以及一个.diff.gz文件它包含了该软件包 Ubuntu 化时所做的修改。dpkg-source工具可用于打包/解包 Ubuntu 源码包,详情可参阅有关帮助页面。

软件包管理系统安装的软件包时需要使用“倚赖关系”,它由软件包维护者声明。这些信息记录在与每个软件包关联的control文件中。例如,包含GNU C编译器(gcc)的软件包依赖于包含链接器和汇编器的binutils软件包。如果用户试图在没有安装binutils的情况下安装gcc,软件包管理系统(dpkg)将会显示一条错误信息,告诉你需要安装binutils,并停止安装gcc。(不过,倔强的用户可以对这个信息视而不见,参阅dpkg(8))。)更多信息,参阅下面的章节[[UbuntuHelp:../ch-system.zh-cn.html| 软件包依赖关系, 第 2.2.8 节]]。

Ubuntu 软件包管理工具可用于:

  • 操作和管理软件包或软件包的局部内容,
  • 帮助那些使用有限容量载体如软盘传输的用户分割软件包,
  • 帮助开发者将开发文件打包成软件包,
  • 帮助用户从远程 Ubuntu 文档站点安装软件包。

2.2.2 Ubuntu 软件包格式

Ubuntu “软件包”,或称之为 Debian 包文件( Debian archive file),包含了可执行文件、库文件、和相关程序的文档。通常 Ubuntu 文件的文件名以.deb结尾。 [[[UbuntuHelp:../footnotes.zh-cn.html| 1]]]

Ubuntu 二进制软件包内部格式描述见deb(5)帮助页面。所以要操作.deb文件请参阅dpkg-deb(8)。


2.2.3 Ubuntu 软件包命名约定

Ubuntu 软件包命名遵循下列约定:

foo_ver-rev_arch.deb

一般这里的foo是软件包的名称,ver是软件本身的版本号,rev是 Ubuntu 修订版本号,arch是目标架构名称。当然,文件很容易被改名;不过,你也可以通过运行下面的命令来找出文件filename实际是那个软件包:

dpkg --info filename 

Ubuntu 修订版本号由 Ubuntu 开发者或创建这个软件包的人指定。通常,包被修改过之后,会把修改版本号加一,有些也会加上ubuntu的标志以便和Debian区分开来。


2.2.4 保存本地配置

有可能被本机管理员修改的文件保存在/etc/目录中。 Ubuntu策略中规定所有对本地配置文件的修改都可以在软件包升级过程中被保留下来。

在软件包的发布中,如果包含默认的本地配置文件,这个文件就被称为“conffile”(默认配置)。如果不得到管理员的允许,软件包管理系统不会对上次 安装之后被修改过的默认配置进行升级;不过,如果管理员没有改动过默认配置,那么它就会被升级成最新软件包中的版本。这种策略几乎总是合理的,它有益于把 默认配置的改动减到最小。

下面的命令可以列出一个软件包中包含那些默认配置文件:

dpkg --status package 

文件列表位于“Conffiles”的后面。

在《 Ubuntu 策略手册》的“配置文件”一节,可以获得有关conffile(默认配置)文件的更多信息(参见[[UbuntuHelp:../ch-support.zh-cn.html| 参考资料, 第 15.1 节]])。


2.2.5 Ubuntu 维护脚本

Ubuntu 维护脚本是一种可执行脚本,它在软件包安装之前或之后自动运行。它和一个名叫control的文件一起组成 Ubuntu 包文件的“管理”部分。

这些文件是:

preinst:: 在 Ubuntu 包文件解包之前,运行这个脚本。许多“preinst”脚本的任务是停止作用于待升级软件包的服务,直到软件包安装或升级完成。

postinst:: 该脚本的任务是完成 Debian 包文件解包文件的配置工作。通常,“postinst”脚本等待用户输入,或提醒用户,如果他接受当前默认值,要记得软件包安装完后返回重新配置。许多“postinst”脚本负责执行有关命令为新安装或升级的软件重启服务。

prerm:: 该脚本负责停止与软件包关联的daemon服务。它在删除软件包关联文件之前执行。

postrm:: 该脚本负责修改软件包链接或文件关联,或删除由它创建的文件。(参阅虚拟软件包, 第 2.2.7 节)。

当前,所有的管理文件都存放在/var/lib/dpkg/info目录。与foo软件包相关的文件,名字以“foo”打头,以“preinst”、“postinst”等为扩展名。目录中的foo.list文件列出了foo软件包安装的所有文件。(注意这些文件的位置在由dpkg来确定,可能会因Debina版本而异)


2.2.6 软件包优先级

每个 Ubuntu 软件包均被发布者指点了一个优先级,作为软件包管理系统 的一个辅助参数,优先级的值有:

  • Required(必须) 该级别软件包是保证系统正常运行必须的。

包含所有必要的系统修补工具。不要删除这些软件包,否则整个系统将受到损坏,甚至无法使用dpkg恢复。只安装Required级软件包的系统不可能满足所有的用途,但它可以启动起来,让系统管理员安装想要的软件。

  • Important(重要) 在任何类Unix系统上均安装有该级别软件包。

系统若缺少这类软件,会运行困难或不好操作。该级别软件包并包括Emacs或X11或TeX或其它大型应用程序,它们只是一些实现系统底层功能的程序。

  • Standard(基本) 该级别软件包是任何Linux系统的标准件,它们组成一个小而精的字符模式的系统。

系统的默认安装就包括了它们。“Standard”级软件包不包括许多大型应用程序,但它包括Emacs(它比其它应用程序更底层)和Tex及LaTeX的精巧版(不支持X)。

  • Optional(推荐) 该级别软件包包括那些你可能想安装的软件,即使对它们并不熟悉,但对它们没有特殊的要求。

它们包括X11,TeX完整发布版和许多应用程序。

  • Extra(额外) 该级别软件包可能与其它高级别软件包冲突,仅当你知道其用途时才会使用它们,或者有运行它们有专门要求,这些都使它们不适合定为“Optional”级。

请注意软件包描述中“Priority: required”(优先级:必须)、“Section: base”(组件:基本)、“Essential: yes”(必要:是)的区别。“Section: base”(组件:基本)意味着在安装新系统时这个软件包要先于其它所有软件安装。大多数在“Section: base”中的软件包都被打上了“Priority: required”(优先级:必须)标签,或者至少是“Priority: important”(优先级:重要);并且其中的很多也同时具有“Essential: yes”(必要:是)标签。“Essential: yes”意味着要用软件包管理系统的dpkg等程序删除它时,必须给出额外的强制选项才行。比如,libc6、mawk和makedev软件包属于“Priority: required”和“Section: base”,但不是“Essential: yes”。


2.2.7 虚拟软件包

虚拟软件包是一个统称,它代指一组具有相近功能的软件包中的任何一个。例如,tin和trn都是新闻组阅读软件,当系统中某个程序需要使用新闻阅读器时,它们中的任何一个都可以满足要求。因此,这两个软件包一起提供了一个叫做news-reader(新闻阅读器)的“虚拟软件包”。

类似的,许多exim、exim4、sendmail、postfix这样的软件包都提供邮件传输代理的功能。因此,它们在一起提供了一个称为mail-transport-agent(邮件传输代理)的虚拟包。安装了它们中的任何一个,都会满足其它倚赖于邮件传输代理功能的程序的需要。

Ubuntu 有个机制,如果系统中提供同种虚拟包的软件包安装了多个,系统管理员可以指定一个为首选软件。相关的命令是update-alternatives,更详细的描述参阅[[UbuntuHelp:../ch-package.zh-cn.html| Alternative 命令, 第 6.5.3 节]]。


2.2.8 软件包依赖关系

Ubuntu 软件包管理系统依赖声明,它描述了这一事实:一些软件包需要其它软件包被安装才能正常运行或运行得更好。

  • 软件包A依赖(depends)软件包B:要运行A必须安装B。在有些情况下,A不仅依赖B,还要求B的特定版本。版本依赖通常有最低版本限制,A更依赖于B的最新版而非某个特定版本。
  • 软件包A推荐(recommends)软件包B:软件包维护者认为所有用户都不会喜欢缺少某些功能的A,而这些功能需要B来提供。
  • 软件包A建议(suggests)软件包B:B中某些文件与 A 的功能相关,并能够增强 A 的功能。这种关系通过声明软件包 B 增强 Enhances 软件包 A 来表示。
  • 软件包A与软件包B冲突(conflicts):如果系统中安装了B那么A无法运行。“Conflicts”常和“replaces”同时出现。
  • 软件包A替换(replaces)软件包B:B安装的文件被A中的文件移除和覆盖了。
  • 软件包A提供(provides)软件包B:A中包含了B中的所有文件和功能。

上述术语使用方法的更详细的信息参阅 Packaging Manualthe Policy Manual

注意,dselect可以对recommendssuggests类软件包进行细操作,apt-get只会简单的下载安装depends类软件包而不管recommendssuggests类软件包。这两个程序均正式使用APT作为其后台。


2.2.9 何为“Pre-depends”

dpkg 总是在配置一个有依赖关系的包之前,先对被依赖的包进行配置。 然而,dpkg 通常将归档文件随意解包,不顾依赖性。 (从归档文件中解包并提取文件,将他们放置到正确的位置。) 如果是 Pre-Depends 包,则在所依赖的其它包被解包和配置之前, Pre-Depends 包不会被解包。 [[[UbuntuHelp:../footnotes.zh-cn.html| 2]]] 使用这种依赖的目的是为了将依赖复杂性降至最底。


2.2.10 软件包状态

软件包有各种状态:“unknown”,“install”,“remove”,“purge”和“hold”。这些“希望”标记描述了用户打算如何操作这些软件包(既可以使用dselect的“Select”菜单,也可以直接调用dpkg)。

它们的意思是:

  • unknown - 用户并没描述他想对软件包进行什么操作。
  • install - 用户希望对软件包进行安装或升级。
  • remove - 用户希望删除软件包,但不想删除任何配置文件。
  • purge - 用户希望完全删除软件包,包括配置文件。
  • hold - 用户希望软件包保持现状,例如,用户希望保持当前的版本,当前的状态,当前的一切。

2.2.11 阻止软件包升级

有两种方法阻止软件包升级,使用dpkg,或者在Woody中使用APT。

使用dpkg,首先导出软件包选择列表:

dpkg --get-selections \* > selections.txt 

接着编辑文件selections.txt,修改想要恢复的软件所在的行,例如libc6,则将:

libc6                       install

改为:

libc6                       hold

保存文件,将它装入dpkg数据库:

dpkg --set-selections < selections.txt 

或者,如果你知道要恢复的软件包名称,执行:

echo libc6 hold | dpkg --set-selections

这个命令将在每个软件包安装过程中保持该软件包不变。

使用dselect也可以达到同样的效果。进入[S]elect屏幕,找到想阻止其升级的软件包,按“=”键(或者“H”)。更改在你退出[S]elect屏幕后立即生效。

Woody中的APT系统有一个新机制来阻止软件包升级,在下载升级档进程中使用Pin-Priority。参阅帮助页面apt_preferences(5),或阅读http://www.debian.org/doc/manuals/apt-howto/或apt-howto软件包。


2.2.12 源码包

源码包发布在source目录中,既可以手工下载可以使用

apt-get source foo 

获取它们(参阅apt-get(8)帮助页面)。


2.2.13 编译源码包

对于foo软件包,从源码编译需要foo_*.dsc、foo_*.tar.gz和foo_*.diff.gz文件(注意,对于由 Debian 开发的软件包,没有.diff.gz文件)。

当你得全了这些文件,如果你这安装了dpkg-dev软件包,运行:

$ dpkg-source -x foo_version-revision.dsc

它将软件包解压到一个名为foo-version的目录。

使用下列命令创建二进制软件包:

$ cd foo-version
$ su -c "apt-get update ; apt-get install fakeroot"
$ dpkg-buildpackage -rfakeroot -us -uc

然后,

# su -c "dpkg -i ../foo_version-revision_arch.deb"

安装新编译的软件包。参阅["../ch-package.zh-cn.html: 向系统引入软件包, 第 6.4.10 节]。


2.2.14 新建 Ubuntu 软件包

创建新软件包的详细信息,参阅 New Maintainers' Guide, 该文档在maint-guide包中,或浏览http://www.debian.org/doc/manuals/maint-guide/。


2.3 Ubuntu 系统升级

Ubuntu 的设计目标之一就是提供一个平滑、安全和可靠的升级过程。软件包系统在升级过程中会将重要改变警告系统管理员,在某些情况下,会要系统管理员来做决定。

你也应该阅读发布手记(Release Notes),它存在于所有的 Ubuntu 光盘中,也可以通过互联网访问http://www.Ubuntu.com/releases。

[[UbuntuHelp:../ch-package.zh-cn.html| Ubuntu 软件包管理, 第 6 章]]提供了升级的实用指南,本节只提供一个大纲,由包工具开始。


2.3.1 dpkg

它是操作软件包文件的主要工具;参阅 dpkg(8) 获得完整信息。

dpkg 由几个原始的辅助程序演化而来。

  • dpkg-deb:操作.deb文件。dpkg-deb(1)
  • dpkg-ftp:一个旧的软件包获取命令。dpkg-ftp(1)
  • dpkg-mountable:一个旧的软件包获取命令。dpkg-mountable(1)
  • dpkg-split:将大软件包分割成小包。dpkg-split(1)

dpkg-ftp 和 dpkg-mountable 已被新的APT系统取代。


2.3.2 APT

APT(the Advanced Packaging Tool)是 Ubuntu 软件包管理系统的高级界面,由几个名字以“apt-”打头的程序组成。apt-get、apt-cache和apt-cdrom是处理软件包的命令行工具,它们也是其它用户前台程序的后端,如dselect和aptitude。

更多信息,可安装apt软件包后阅读apt-get(8)、apt-cache(8)、apt-cdrom(8)、apt.conf(5)、sources.list(5)、apt_preferences(5)(woody)以及/usr/share/doc/apt/guide.html/index.html。

另一个资源是APT HOWTO,如果安装了apt-howto包,可在/usr/share/doc/Debian/apt-howto/中找到它。

apt-get upgrade和apt-get dist-upgrade只获取“Depends”类软件包,它忽略“Recommend”和“Suggests”类软件包,不想这样的话,可使用dselect。


2.3.3 dselect

这个程序是 Ubuntu 软件包管理系统中菜单驱动的用户界面。特别适用于首次安装和大面积升级。参阅[[UbuntuHelp:../ch-package.zh-cn.html| dselect, 第 6.2.4 节]]。

更多信息,可安装install-doc包后阅读/usr/share/doc/install-doc/dselect-beginner.en.html或dselect Documentation for Beginners


2.3.4 不停机系统升级

Ubuntu 系统的内核(文件系统)支持替换使用中的文件。 当一个软件包升级时,如果由该软件包提供的服务在当前运行级下正在运行,则该服务将被重新启动。 Ubuntu 系统不要求用户在 single-user 模式下进行不停机升级。


2.3.5 下载和缓存.deb文件

如果你手工下载包文件到硬盘(这完全没有必要,请阅读上面有关dpkg-ftp或APT的内容),当你完成软件包安装工作后,可以从系统中删除.deb文件。

如果是使用APT,这些文件会缓存在/var/cache/apt/archives/目录中。你可以在完成安装后删除它们(apt-get clean)或者将它们拷贝到另一个机器的/var/cache/apt/archives/目录中以备以后的安装。


2.3.6 升级记录

dpkg会对软件包的解包、配置、删除、完全删除进行记录,但不能(目前是这样)记录在包操作的过程中活跃终端的行为。

最简单的解决方法是在运行dpkg、dselect、apt-get等工具的会话中加入script(1)程序。


2.4 Ubuntu 系统引导进程


2.4.1 init程序

同所有的Unix一样, Ubuntu 启动要执行init程序。init的配置文件(/etc/inittab)中指定的第一个执行脚本应该是 /etc/init.d/rcS。

接下来将要发生要看是否安装了 sysv-rc 软件包或 file-rc 软件包。下面假设安装了 sysv-rc 软件包。 (file-rc 含有它自己的 /etc/init.d/rcS 脚本,在 rc 目录里使用文件代替符号链接来控制哪个服务在哪个运行级别启动。)

sysv-rc 软件包里面的 /etc/init.d/rcS 运行 /etc/rcS.d/ 目录下的所有脚本来执行初始化,如: 检查并挂载文件系统、装载内核模块、启动网络服务、设定时钟等。 接着,为了兼容性考虑,它运行/etc/rc.boot/目录下的文件(除了那些文件名中包含“.”的文件),该目录中的脚本是保留给系统管理员使用,不赞成使用该目录。 更多信息参见 系统初始化, 第 9.1 节 和 Debian Policy Manual 中的 System run levels and init.d scripts

Ubuntu 没有使用 BSD 风格的 rc.local 文件。


2.4.2 运行级别

完成系统启动进程后,init启动所有在默认运行级别配置为启动的服务。 默认运行级别由 /etc/inittab 中的 id 给出。 Ubuntu 使用 id=2。

Ubuntu 使用下列的运行级别:

  • 1(单用户模式 single-user mode),
  • 2 到 5(多用户模式 multi-user modes),
  • 0(关闭系统),
  • 6(重启系统)。

运行级7、8和9也能够使用,但是它们的 rc 目录在软件包安装的时候没有。

使用 telinit 命令来转换运行级别。

当进入一个运行级别时,所有在 /etc/rcrunlevel.d/ 目录下的脚本将被执行。 脚本名的第一个字母决定了该脚本的运行方式: 使用 K 开头的脚本,使用 stop 参数来运行。 使用 S 开头的脚本,使用 start 参数来运行。 这些脚本按照它们名字的字母顺序运行;因此,“stop”脚本比“start”脚本先运行。 在 K 或 S 之后的两个数字决定了脚本运行的先后次序,数字小的脚本先运行。

实际上,目录/etc/rcrunlevel.d/中的脚本都是指向/etc/init.d/的符号链接。这些脚本接受 “restart”和“force-reload”作为参数:“force-reload”的方式可以用来在系统启动后,重新启动服务或者强迫它们重新装载它们的配置文件。

例如:

# /etc/init.d/exim4 reload

2.4.3 自定义运行级别

自定义运行级别是一个高级的系统管理任务。 下面的指示面向大部分服务。

在运行级 R 启动 service 服务,创建一个符号链接 /etc/rcR.d/Sxyservice 到目标文件 ../init.d/service。 xy 是序列号,是由软件包在安装的时候分配给服务的。

停止服务,重命名符号链接,将它的名字用 K 开头来代替 S, 它的序列号是100减 xy。 可以使用象 sysv-rc-conf 或 ksysv 这样的运行级别编辑器来方便的修改服务。

在一个特定的运行级别目录,可以将某个服务的 S 符号链接删除来代替重新命名它。 这种作法不停止该服务,但将把该服务留在一种 sysv-rc 初始化系统认为的“漂浮”状态: 当运行级别改变时,该服务即不会启动,也不会停止, 它将保留它原有的状态,不管它是在运行或者没有运行。 注意,处于这种漂浮状态的服务,如果它所属的软件包升级了, 这个服务将启动,不管它在升级前是否运行。 这是当前 Debian 系统一个已知的缺点。 注意:还需要在运行级 0 和 6 之间保留服务的 K 符号链接。 如果删除了一个服务的所有符号链接,在升级该服务的软件包时, 所有的符号链接将恢复到它们的出厂默认模式。

建议对 /etc/rcS.d/ 目录里的符号链接做任何改变。


2.5 多样性支持

Ubuntu 提供几种途径,在不破坏系统的前提下满足系统管理员各种要求。

  • dpkg-divert,参阅 dpkg-divert 命令, 第 6.5.1 节。
  • equivs,参阅 equivs 软件包, 第 6.5.2 节。
  • update-alternative,参阅 Alternative 命令, 第 6.5.3 节。
  • make-kpkg可以支持多启动引导。参阅make-kpkg(1)和 Ubuntu 标准方式, 第 7.1.1 节。

/usr/local/目录下的所有文件均属于系统管理员,Ubuntu不会改动它们。/etc下的大部分文件属于conffiles,Ubuntu不会在升级后覆盖它们,除非系统管理员明确要求覆盖。


2.6 国际化

Ubuntu 系统是国际化产品,不论是在控制台下还是在X下,它都提供多种语言的字符显示和输入支持。许多文档、帮助页面以及系统消息都被翻译成各种语言。在安装过程中, Ubuntu 提示用户选择安装语言(有时是当地语言变量)。

如果你安装的系统提供的语言特性支持不能满足你的需要,或者你要改变当前语言或安装别的键盘方案以适应你的语言,参阅[[UbuntuHelp:../ch-tune.zh-cn.html| 本地化(localization), 第 9.7 节]]。


2.7 Ubuntu 和系统内核

参见 Ubuntu下的 Linux 内核, 第 7 章。


2.7.1 编译非 Ubuntu 源码包内核代码

首先你必须了解 Ubuntu policy有关头文件的规定。

Ubuntu C libraries是依据内核头文件最新stable发布版创建的。

跟随内核源码发布的内核头文件位于/usr/include/linux/include/。

如果你编译某个程序所用的内核头文件比libc6-dev提供的头文件还新,在编译时你必须在命令行中加上-I/usr/src/linux/include/。这些情况是存在的,例如,对于automounter daemon(amd)软件包而言,当新内核改变了对NFS的内部操作方式,amd需要知道这些改变。这时就需要引用新的内核头文件。


2.7.2 自定义内核创建工具

对于希望(或必须)使用自定义内核的用户,推荐下载kernel-package软件包。该软件包包含了创建内核包的脚本。有了它,新建 Ubuntu 内核镜像包只需在内核源码目录的一级目录运行

# make-kpkg kernel_image

在内核源码所在目录的顶层,执行下述命令可获得有关帮助

# make-kpkg --help

或阅读make-kpkg(8)帮助页面以及 Ubuntu下的 Linux 内核, 第 7 章。

如果所需的kernel-source-version(version代表内核版本号)包不存在,用户就得从Linux文件站点分别下载最新的(或需要的)内核源码。

有关kernel-package包的用法详述见于/usr/doc/kernel-package/README。


2.7.3 多系统引导器

要使用多系统引导器如grub或loadlin,请将编译好的Linux内核bzimage拷贝到相应的地方(例如/boot/grub或MS-DOS分区)。


2.7.4 制做引导软盘

Ubuntu 的 mkrboot 软件包可以帮你制作一张自定义启动软盘,软件包中的Shell脚本按syslinux格式制作启动软盘。对于那些使用MS-DOS格式化的软盘,其主引导扇区的记录将被修改为直接引导Linux(或是其它在盘中syslinux.cfg文件里的操作系统)。该软件包中的其它脚本可制作急救盘甚至重建基本系统。


2.7.5 模块加载规定

Ubuntu 的modconf软件包提供了一个shell脚本(/usr/sbin/modconf),它可以用来自定义内核模块配置。该脚本使用菜单界面,用户通过它给出系统中可挂载设备驱动的有关细节,它再将这些细节信息生成/etc/modules.conf文件(其中列出了别名aliases和其它参数,用于连接各种模块),该配置文件用来加载/etc/modutils/目录下和/etc/modules(其中列出了需要在系统启动时加载的模块)目录的相关模块。

新版的配置帮助文件 Configure.help 可为构造自定义内核提供帮助,同样,modconf软件包中也有一系列帮助文件(位于/usr/share/modconf/目录下),告诉你如何对模块设定合适的参数。参阅 模块化的 2.4 内核, 第 7.2 节中的例子。


2.7.6 卸载旧内核

uname -ra 可用来检查当前运行的内核版本,以确定是否与你打算卸载的内核版本相同。因此你可以使用如下命令删除不想要的内核镜像包:

# dpkg --purge --force-remove-essential linux-image-NNN 

(当然,要将NNN替换成你的内核版本号和修订版号。)

第 3 章 - Ubuntu 系统安装提示


Ubuntu 的官方安装文档位于 http://doc.ubuntu.com/ubuntu/install/ ,里面包含了 amd64、hppa、i386、ia64、powerpc和sparc的安装文档。中文翻译在 http://wiki.ubuntu.org.cn/ubuntu/install/


3.1 常规 Linux 安装提示

如果你在寻找精简的 Ubuntu 安装光盘,请别忘记检查 http://archive.ubuntu.com/ubuntu/dists/{发行版}/main/installer-{架构}/current/images/netboot/。

使用最新的开发版的 Ubuntu 会增加遇到严重软件错误的风险。在机器上安装一个稳定版本的 Ubuntu 然后使用多重启动方案可有效控制风险。或者使用更安全的 chroot 技巧,参阅 [[UbuntuHelp:../ch-tips.zh-cn.html| chroot, 第 8.6.35 节]]。后者可实现同时在不同的控制台运行多种版本的 Ubuntu


3.1.1 硬件兼容性

Linux 兼容绝大多数 PC 硬件,而且几乎可以安装在任何系统架构上。对我而言它的安装过程和 Windwos 95/98/Me 一样简单。可兼容的硬件列表也在不断增加。

如果你有一部笔记本电脑,可以去 Linux on Laptops 查找对应品牌和型号的安装指导。

我推荐的台式机硬件通常“比较保守”:

  • 用于工作目的时最好选 SCSI 而不是 IDE,IDE/ATAPI HD 适于个人使用。
  • IDE/ATAPI CD-ROM(或 CD-RW)。
  • 最好选 PCI 而不是 ISA, 特别是网卡(NIC)。
  • 选用便宜的 NIC。Tulip for PCI、NE2000 for ISA 都不错。
  • 初学 Linux 安装时避免使用 PCMCIA (笔记本电脑)。
  • 别使用 USB 键盘、鼠标......除非你想证明自己的实力。

如果你的机器特别慢,最好把硬盘插到另一个速度快些的机器上安装。


3.1.2 确定 PC 硬件和芯片组

在安装过程中,可能会要你确定电脑的硬件或芯片组等。有时了解这些信息并非易事,这儿有个方法:


  • 打开机箱亲自看看。
  • 记下显卡芯片、网卡芯片、串口和 IDE 端口周围的芯片上印的数字。
  • 记下印在 PCI 和 ISA 插卡背面的名称。

3.1.3 在 Ubuntu 下确定 PC 硬件

在 Linux 系统中使用下列命令,可获得机器当前使用的硬件及配置的相关信息。

$ pager /proc/pci      
$ pager /proc/interrupts      
$ pager /proc/ioports      
$ pager /proc/bus/usb/devices 

在安装过程中按 Alt-F2 进入控制台,可运行这些命令获得帮助。

在最初的安装结束之后,通过安装可选的软件包,比如 pciutils、usbutils 和 lshw,你就可以获得更多的系统信息。

$ lspci -v |pager      
$ lsusb -v |pager      

典型的中断用途

*   IRQ0: timer output (8254)
*   IRQ1: keyboard controller
*   IRQ2: cascade to IRQ8–IRQ15 on PC-AT
*   IRQ3: secondary serial port (io-port=0x2F8) (/dev/ttyS1)
*   IRQ4: primary serial port (io-port=0x3F8) (/dev/ttyS0)
*   IRQ5: free [sound card (SB16: io-port=0x220, DMA-low=1, DMA-high=5)]
*   IRQ6: floppy disk controller (io-port=0x3F0) (/dev/fd0, /dev/fd1)
*   IRQ7: parport (io-port=0x378) (/dev/lp0)
*   IRQ8: rtc
*   IRQ9: software interrupt (int 0x0A), redirect to IRQ2
*   IRQ10: free [network interface card (NE2000: io-port=0x300)]
*   IRQ11: free [(SB16-SCSI: io-port=0x340, SB16-IDE: io-port=0x1E8,0x3EE)]
*   IRQ12: PS/2 Mouse
*   IRQ13: free (was 80287 math coprocessor)
*   IRQ14: primary IDE controller (/dev/hda, /dev/hdb)
*   IRQ15: secondary IDE controller (/dev/hdc, /dev/hdd)

对于旧的非 PnP ISA 卡,你可能需要在 BIOS 中设定 IRQ5,IRQ10 和 IRQ11 为非 PnP 设备。

对于USB设备,它们在 /proc/bus/usb/devices 中以 Cls=nn 的形式列出:

*   Cls=00 : Unused
*   Cls=01 : Audio (speaker etc.)
*   Cls=02 : Communication (MODEM, NIC, ...)
*   Cls=03 : HID (Human Interface Device: KB, mouse, joystick)
*   Cls=07 : Printer
*   Cls=08 : Mass storage (FDD, CD/DVD drive, HDD, Flash, ...)
*   Cls=09 : Hub (USB hub)
*   Cls=255 : Vendor specific

如果设备类别(device class)不是 255,则 Linux 可支持该设备。

----
==== 3.1.4 在其它 OS 下确定 PC 硬件 ====
还可从其它操作系统中获取硬件信息。

安装其它商业版 Linux,当前它们在硬件侦测方面做得比 Debian 好。

安装 Windows。用鼠标右键点“我的电脑”在菜单中选属性/设备管理,可获得硬件配置信息。记下所有的资源信息如 IRQ、I/O 端口地址和 DMA。有些旧的 ISA 卡可能要在 DOS 下配置。

----
==== 3.1.5 Lilo 神话 ====
"Lilo 受限于 1024 柱面。" 大错特错!

Ubuntu 之后使用的新版 lilo 支持 lba32。只要主板的 BIOS 版本支持 lba32,lilo 就可以突破 1024 柱面的限制。

如果你使用的是旧版 lilo.conf,请确定在你的 lilo.conf 文件开头的某处加了一行命令指示系统读取“lba32”。参阅 /usr/share/doc/lilo/Manual.txt.gz。

----
==== 3.1.6 GRUB ====
GNU Hurd 项目组提供的新的系统引导工具 grub 可使用于 Debian Woody 系统。

<pre><nowiki>

要编辑 GRUB 菜单,可编辑 /boot/grub/menu.lst 文件。参阅[[UbuntuHelp:../ch-tips.zh-cn.html| 设置 GRUB 启动参数, 第 8.1.6 节]]获取有关启动参数设置信息,它和 lilo 的设置方法不太一样。

----
==== 3.1.7 选择引导软盘 ====
你可以使用 bootcd 包,来制作一个可以启动的软盘,当然我们更推荐你直接使用LiveCD来作为维护系统的工具。对于最新的dapper版本,你可以直接使用Desktop CD从光盘启动来维护,或者安装系统。

----
==== 3.1.8 安装系统 ====
这方面的官方文档在  http://doc.ubuntu.com/ubuntu/install/i386 ,中文翻译在:http://wiki.ubuntu.org.cn/ubuntu/install/i386

在安装 /dev/hda 的 mbr 时,我喜欢将 lilo 装在诸如 /dev/hda3 的位置,这样做可以减小引导信息被覆盖的风险。

下面是我在安装过程中所做的选择。

*   MD5 passwords "yes"
*   shadow passwords "yes"
*   Install "advanced" (dselect **) and select
**    取消 emacs (如果它被选中了)、nvi、tex、telnet、talk(d);
**    选上 mc、vim,nano-tiny 和 elvis-tiny 任选一个。
参阅 [[UbuntuHelp:../ch-package.zh-cn.html| dselect, 第 6.2.4 节]]。即使你是个 Emacs 迷也不要在安装阶段使用它,nano 可满足你的需要。也不要安装其它庞大的软件包如 Tex(Potato 曾在此阶段设置它为默认安装)。参阅[[UbuntuHelp:../ch-edit.zh-cn.html| 应急的编辑器, 第 11.2 节]]了解此时安装 nano-tiny 或 elvis-tiny 的原因。
*   在每个软件包安装对话框中,回答所有的配置提问均=“y”(替换当前值)
*   exim:选第2项,因为我使用 ISP 的 SMTP 服务器发送邮件。

有关 dselect 的更多信息,参阅[[UbuntuHelp:../ch-package.zh-cn.html| dselect, 第 6.2.4 节]]。

----
==== 3.1.9 网络所需的主机名和 IP 地址 ====
LAN 配置的例子(C subnet: 192.168.1.0/24):

<pre><nowiki>
Internet
|
+--- 外部 ISP 提供 POP 服务(使用 fetchmail 访问)
|
Access point ISP 提供 DHCP 服务和 SMTP 中继服务
|                     :
Cable modem         (Dialup)
|                     :
LAN 网关外部端口: eth0(IP 由 ISP 的 DHCP 提供)
使用老式笔记本电脑(IBM Thinkpad, 486 DX2 50 MHz, 20MB RAM)
运行 Linux 2.4 内核,提供 ext3 文件系统支持
运行“ipmasq”软件包(安装它的补丁、NAT 和 firewall)
运行“dhcp-client”软件包配置 eth0(覆盖 DNS 的设定)
运行“dhcp”软件包配置 eth1
运行“exim”作为 smarthost(mode 2)
运行“fetchmail”设一个较长的时间值(fallback)
运行“bind”作为高速域名服务器,在从 LAN 连入 Internet 时
作为认证域名服务器,在从 LAN 中连入网中某个域时
运行“ssh”使用端口 22 和 8080(从任何地点连接)
运行“squid”作为缓存服务器连接 Debian 包文档服务器(APT 需要连接它)
LAN 网关内部端口:eth1 (IP = 192.168.1.1,固定)
|
+--- LAN Switch (100 base T) ---+
|                              |
LAN 中一些固定 IP 客户端            LAN 中一些 DHCP客户端 
(IP == 192.168.1.2-127, 固定)     (IP == 192.168.1.128-200, 动态) 

参阅 [[UbuntuHelp:../ch-gateway.zh-cn.html| 网络设置, 第 10 章]] 了解更多网络设置方面的信息。 参阅 [[UbuntuHelp:../ch-gateway.zh-cn.html| 建立路由网关, 第 10.12 节]] 了解更多 LAN 网关服务器设置方面的信息。


3.1.10 用户帐号

为了让机器访问起来有一致的感觉,我的系统中开头几个帐号通常是不变的。

我首先创建的用户帐号名是“admin”(uid=100)。我通过该帐号转发所有的 root email。该帐号加入到 adm 用户组(参阅[[UbuntuHelp:../ch-tune.zh-cn.html| “为什么 GNU su 命令不支持 wheel group”, 第 9.2.2 节]]),这个用户组为成员提供大量 root 特权的命令,通过 su 或 sudo 命令就能使用 PAM。详情参阅[[UbuntuHelp:../ch-tutorial.zh-cn.html| 添加一个用户, 第 4.1.3 节]]。


3.1.11 创建文件系统


3.1.11.1 硬盘分区

我更喜欢将不同的目录树分别装在不同的分区下,这样可以将系统崩溃造成的损失减到最小。例如:

/          == (/ + /boot + /bin + /sbin)
== 50MB+
/tmp       == 100MB+
/var       == 100MB+
/home      == 100MB+
/usr       == 700MB+ with X
/usr/local == 100MB 

/usr 目录的大小很大程度上取决于 X window 应用程序和文档的数目。如果只运行控制台终端 /usr 可以小到 300MB,但如果你装了大量 Gnome 应用程序 2GB-3GB 也很正常。当 /usr/ 增长得太大,将 /usr/share/ 移到别的分区是最有效的解救方法。对新的 Linux2.4 内核包,/ 目录的大小可能要超过 200MB。

例如,当前我的 Internet 网关服务器的硬盘使用情况如下(由 df -h 命令输出):

Filesystem            Size  Used Avail Use% Mounted on
/dev/hda3             300M  106M  179M  38% /
/dev/hda7             100M   12M   82M  13% /home
/dev/hda8             596M   53M  513M  10% /var
/dev/hda6             100M  834k   94M   1% /var/lib/cvs
/dev/hda9             596M  222M  343M  40% /usr
/dev/hda10            596M  130M  436M  23% /var/cache/apt/archives
/dev/hda11            1.5G  204M  1.2G  14% /var/spool/squid 

(有块大空间留给 /var/spool/squid 作为下载软件包时代理服务器的缓冲区。)

下面的 fdisk -l 输出提供了一个分区分配方案:

# fdisk -l /dev/hda # comment

/dev/hda1             1        41    309928+   6  FAT16 # DOS
/dev/hda2            42        84    325080   83  Linux # (not used)
/dev/hda3   *        85       126    317520   83  Linux # Main
/dev/hda4           127       629   3802680    5  Extended
/dev/hda5           127       143    128488+  82  Linux swap
/dev/hda6           144       157    105808+  83  Linux
/dev/hda7           158       171    105808+  83  Linux
/dev/hda8           172       253    619888+  83  Linux
/dev/hda9           254       335    619888+  83  Linux
/dev/hda10          336       417    619888+  83  Linux
/dev/hda11          418       629   1602688+  83  Linux 

里面有一个未使用的分区。留作安装第二个 Linux 或为增长的目录树提供扩充余地。


3.1.11.2 挂载文件系统

下面的 /etc/fstab 文件可完成上述分区的挂载工作:

# /etc/fstab: 静态的文件系统信息。
#
# filesystem   mount point     type    options                dump pass
/dev/hda3       /               ext2    defaults,errors=remount-ro 0 1
/dev/hda5       none            swap    sw                      0 0
proc            /proc           proc    defaults                0 0
/dev/fd0        /floppy         auto    defaults,user,noauto    0 0
/dev/cdrom      /cdrom          iso9660 defaults,ro,user,noauto 0 0
#
# 各分区保持独立
/dev/hda7       /home           ext2    defaults                0 2
/dev/hda8       /var            ext2    defaults                0 2
/dev/hda6       /var/lib/cvs    ext2    defaults                0 2
# noatime 会提高读取文件时的访问速度
/dev/hda9       /usr            ext2    defaults,noatime        0 2
/dev/hda10      /var/cache/apt/archives ext2    defaults        0 2

# 为代理缓存设置的大分区
/dev/hda11      /var/spool/squid ext2   rw                      0 2

# 备份、可启动、DOS
/dev/hda1       /mnt/dos        vfat    rw,noauto               0 0
# 作为备份用的可启动的 Linux 系统(未设置)
/dev/hda2       /mnt/linux      ext2    rw,noauto               0 0
#
# nfs 挂载点
mickey:/        /mnt/mickey     nfs     ro,noauto,intr          0 0
goofy:/         /mnt/goofy      nfs     ro,noauto,intr          0 0
# minnie:/ /mnt/minnie smbfs ro,soft,intr,credentials={filename} 0 2

对于 NFS,我使用 noauto、intr 以及默认的 hard 项。如果有死连接,挂载进程可能会死掉,可以使用 Ctrl-C 恢复。

对于使用 Samba 连接的 Windows 机器(smbfs),rw,auto,soft,intr 是个好方案,参阅 [[UbuntuHelp:../ch-install.zh-cn.html| Samba 设置, 第 3.5 节]]。

对于软驱,使用 noauto,rw,sync,user,exec 可以防止因退盘前未执行卸载命令而造成文件损坏,但它会降低写盘速度。


3.1.11.3 自动挂载

自动挂载的要点:

  • 加载 vfat 模块,从而 /etc/auto.misc 可使用 -fstype=auto 参数:
# 在试图访问软驱之前
# modprobe vfat        ... 或者使这个设置自动完成,
# echo "vfat" >> /etc/modules       ... 重启系统。 
  • 设置 /etc/auto.misc 如下:
floppy -fstype=auto,sync,nodev,nosuid,gid=100,umask=000 :/dev/fd0       ... 此处 gid=100 表示 “users”。 
  • 在 /home/user 中创建链接文件 cdrom 和 floppy ,分别指向 /var/autofs/misc/cdrom 和 /var/autofs/misc/floppy。
  • 将 user 加入“users”用户组。

3.1.11.4 挂载 NFS

外部 Linux NFS 服务器(goofy)处于防火墙(gateway)之后。在我的 LAN 内部,安全策略非常宽松,因为只有我自己一个用户。为了访问 NFS,NFS 服务器端要按如下方式加上 /etc/exports:

# /etc/exports: the access control list for filesystems which may be
#               exported to NFS clients.  See exports(5).      /       (rw,no_root_squash) 

除安装和激活 NFS 服务器及客户机的软件包外,这一步对激活 NFS 服务器也是必要的。

为了简洁明了,我通常创建一个单独的 2GB 分区,用它进行实验或玩玩别的 Linux 系统。我有选择的共享了两个系统的 swap 和 /tmp 分区。多分区方案很难满足这种要求。如果只想装一个运行简单控制台模式的系统,分区留 500MB 就绰绰有余了。


3.1.12 DRAM 内存指导

下列是有关 DRAM 的简单指导。

4MB:  Linux 内核运行的最低配置。
16MB:  控制台系统运行的最低配置。
32MB:  简单 X 系统运行的最低配置。
64MB:  GNOME/KDE 系统运行最低配置。
128MB:  流畅运行 GNOME/KDE。
256MB:  如果你银子充裕干嘛不呢?DRAM 很便宜了。 

使用启动选项 mem=4m(或lilo append="mem=4m")可以看看只用 4MB 内存时系统如何运行。如果机器的 BIOS 比较旧且内存数大于 64MB 启动时就得加 lilo 启动参数。


3.1.13 Swap 空间

我按下面的指导原则来划分 swap 空间:

  • 每个 swap 分区均 <128MB(使用旧版2.0内核),<2GB(使用最新内核)
  • 总容量 =(机器内存大小的 1 到 2 倍)或(128MB 到 2GB 之间)
  • 将它们分散于不同的硬盘,在 /etc/fstab 中可使用 sw,pri=1 选项挂载它们。这样可确保内核以 RAID 方式使用 swap 分区,最大限度地发挥 swap 的性能。
  • 如果可能,使用硬盘中间的扇区。

尽管你不一定真的需要,但为系统设置多一些 swap 空间(128MB)总要好点,至少运行有内存漏洞的坏程序,系统会先慢下来而不是马上死机。


3.2 Bash 设置

我按自己的喜好修改 shell 启动脚本:

/etc/bash.bashrc        换成你的喜好
/etc/profile            保持发布版设定 ( \w -> \W)
/etc/skel/.bashrc       换成你的喜好
/etc/skel/.profile      换成你的喜好
/etc/skel/.bash_profile 换成你的喜好
~/.bashrc               换成你的喜好,会改变所有用户的设置
~/.profile              换成你的喜好,会改变所有用户的设置
~/.bash_profile         换成你的喜好,会改变所有用户的设置 

[[UbuntuHelp:../examples/| 可以参考我提供的脚本样例]]。我喜欢系统看起来清清楚楚,所以将 umask 设为 002 或 022。

PATH 依次由以下配置文件设定:

/etc/login.defs  - 在 shell 之前设定 PATH
/etc/profile     (会调用 /etc/bash.bashrc)
~/.bash_profile  (会调用 ~/.bashrc) 

3.3 鼠标设置


3.3.1 PS/2 鼠标

对于 ATX 主板上使用 PS/2 接口的鼠标,信号通路如下:

mouse -> /dev/psaux -> gpm -> /dev/gpmdata = /dev/mouse -> X 

这里,创建指向 /dev/gpmdata 的符号链接 /dev/mouse,有助于简化配置操作。(例如,如果你决定不再使用 gpm 服务,只需在删掉 gpm 服务后,将符号链接 /dev/mouse 指向 /dev/psaux。)

信号通路使得对键盘和鼠标插拔操作,只要重启 gpm 就可以生效,不必重启 X!

处于 gpm 输出与 X 输入之间的信号通路协议有两种执行方式,“ms3”(使用 Microsoft 3-button serial mouse 协议)和“raw”(对于已连接的鼠标使用相同的协议),此处选择的协议将决定 X 配置中使用的协议。

目前 dapper 发行版并没有默认安装 gpm ,如果需要使用它,手工安装如下:

 
sudo apt-get install gpm

下面我将示范一下如何配置 Logitech 3-button(传统Unix 风格的鼠标)PS/2 鼠标:


3.3.1.1 使用 ms3 协议方式
/etc/gpm.conf             | /etc/X11/xorg.conf
=========================+======================================
device=/dev/psaux        | Section "InputDevice"
responsiveness=          |  Identifier "Configured Mouse"
repeat_type=ms3          |  Driver     "mouse"
type=autops2             |  Option     "CorePointer"
append=""                |  Option     "Device"   "/dev/mouse"
sample_rate=             |  Option     "Protocol" "IntelliMouse"
| EndSection 

如果使用这种方式,设置鼠标类型只需编辑 gpm.conf ,X 的设置将保持不变。参阅[[UbuntuHelp:../examples/| 我的样例脚本]]。


3.3.1.2 使用 raw 协议方式
/etc/gpm.conf            | /etc/X11/xorg.conf
=========================+======================================
device=/dev/psaux        | Section "InputDevice"
responsiveness=          |  Identifier "Configured Mouse"
repeat_type=raw          |  Driver     "mouse"
type=autops2             |  Option     "CorePointer"
append=""                |  Option     "Device"   "/dev/mouse"
sample_rate=             |  Option     "Protocol" "MouseManPlusPS/2"
| EndSection 

如果使用这种方式,设置鼠标类型可编辑 gpm.conf,同时也会改变 X 的设置。


3.3.1.3 如何设置不同的鼠标

gpm 的设备类型 autops2 可以自动检测出市面上大多数 PS/2 鼠标。不幸的是它也不是万能的,而且目前的发布版中并不包括它,这时可在 gpm.conf 中试试 ps2 或者 imps2。想看看 gpm 支持哪些类型的鼠标可输入:gpm -t help。参阅 gpm(8)。

如果使用的是 2 键 PS/2 鼠标,可选上 X 协议的 Emulate3Buttons 项。协议中 2 键鼠标和 3 键鼠标的区别在于每次按下中间键时,是自动检测还是自动模拟信号传给 gpm。

对于在 X 协议[[UbuntuHelp:../ch-install.zh-cn.html| 使用 raw 协议方式, 第 3.3.1.2 节]] 或不使用 gpm,可使用下面的设置:

  • IntelliMouse: 串口鼠标(gpm 转换器使用“ms3”)
  • PS/2: PS/2 鼠标(通常首先试试这项)
  • IMPS/2: 任何 PS/2 鼠标(2键、3键或滚轴鼠标)
  • MouseManPlusPS/2: Logitech PS/2 鼠标
  • ...

更多信息可浏览 Mouse Support in XFree86

典型的 Microsoft 滚轴鼠标,有报导说这样设置最好:

/etc/gpm.conf            | /etc/X11/XF86Config-4
=========================+======================================
device=/dev/psaux        | Section "InputDevice"
responsiveness=          |  Identifier "Configured Mouse"
repeat_type=raw          |  Driver     "mouse"
type=autops2             |  Option     "CorePointer"
append=""                |  Option     "Device"   "/dev/mouse"
sample_rate=             |  Option     "Protocol" "IMPS/2"
|  Option     "Buttons" "5"
|  Option  "ZAxisMapping" "4 5"
| EndSection 

对于某些最新的 Toshiba 超薄笔记本,在 System-V init 脚本中设置 gpm 先于 PCMCIA 激活可防止系统锁死。听起来古怪不过这是真的。


3.3.2 USB 鼠标

请确定你设置了所有必须的 kernel 选项,并在编译的时候编入内核或编成模块了:

  • 在 “Input Core Support”选项下:
    • "Input core support" (CONFIG_INPUT, input.o),
    • "Mouse support" (CONFIG_INPUT_MOUSEDEV, mousedev.o),
  • 在 “USB support”选项下:
    • "Support for USB" (CONFIG_USB, usbcore.o),
    • "Preliminary USB device filesystem" (CONFIG_USB_DEVICEFS),
    • "UHCI" or "OHCI" (CONFIG_USB_UHCI || CONFIG_USB_UHCI_ALT || CONFIG_USB_OHCI, usb-uhci.o || uhci.o || usb-ohci.o),
    • "USB Human Interface Device (full HID) support" (CONFIG_USB_HID, hid.o), and
    • "HID input layer support" (CONFIG_USB_HIDINPUT)

这儿,模块的名称为小写。

如果你没使用 devfs,则需按下面的方法创建一个设备节点 /dev/input/mice:

# cd /dev
# mkdir input
# mknod input/mice c 13 63 

对于典型的滚轴 USB 鼠标,配置如下:

/etc/gpm.conf            | /etc/X11/XF86Config-4
=========================+======================================
device=/dev/input/mice   | Section "InputDevice"
responsiveness=          |  Identifier "Generic Mouse"
repeat_type=raw          |  Driver     "mouse"
type=autops2             |  Option     "SendCoreEvents" "true"
append=""                |  Option     "Device"   "/dev/input/mice"
sample_rate=             |  Option     "Protocol" "IMPS/2"
|  Option     "Buttons" "5"
|  Option  "ZAxisMapping" "4 5"
| EndSection 

更多信息可浏览 the Linux USB Project


3.3.3 触摸屏(Touchpad)

尽管触摸屏在笔记本电脑上默认是模拟 2 键 PS/2 鼠标的行为,仍可从 tpconfig 软件包获得对这类设备的完全操控。例如在 /etc/default/tpconfig 中设置 OPTIONS="--tapmode=0" 可屏蔽讨厌的“click by tap”行为。按如下方法设置 /etc/gpm.conf 可以控制台下使用触摸屏和 USB 外接鼠标。

device=/dev/psaux
responsiveness=
repeat_type=ms3
type=autops2
append="-M -m /dev/input/mice -t autops2"
sample_rate= 

3.4 NFS 设置

安装 NFS 要设置/etc/exports。

# apt-get install nfs-kernel-server
# echo "/ *.domainname-for-lan-hosts(rw,no_root_squash,nohide)" \
>> /etc/exports 

[[UbuntuHelp:../examples/| 详情见我的样例脚本]].


3.5 Samba 设置

参考资料:

以“share”方式安装 Samba 比较容易,因为安装过程会创建 WfW-type 共享驱动器。但最好使用“user”模式来配置它。

可以用 debconf 或 vi 来设置 Samba:

# dpkg-reconfigure --priority=low samba 
# vi /etc/samba/smb.conf 

[[UbuntuHelp:../examples/| 详情参阅我的脚本样例]].

可通过 smbpasswd 向 smbpasswd 文件添加一个新用户:

# smbpasswd -a username 

确保使用的加密密码有恰当的兼容性。

按下表中相应的值设定 os level(数字越大,服务器的优先级越高):

0:      Samba with a loose attitude (will never become a master browser)
1:      WfW 3.1, Win95, Win98, Win/Me?
16:     Win NT WS 3.51
17:     Win NT WS 4.0
32:     Win NT SVR 3.51
33:     Win NT SVR 4.0
255:    Samba with mighty power 

确认用户是共享目录所属组的成员,并且对目录赋予了执行权限。


3.6 打印机设置

传统打印方法是 lpr/lpd。新的 CUPS 系统(Common UNIX Pinting System)提供了另一方法 PDQ,详情参阅 Linux Printing HOWTO


3.6.1 lpr/lpd

对于 lpr/lpd 的打印缓冲池(type spoolers)(lpr、lprng 和 gnulpr),如果它们连接的是 PostScript 或 text-only 打印机(最基本的打印机)可按如下方式设置 /etc/printcap:

lp|alias:\
:sd=/var/spool/lpd/lp:\
:mx#0:\
:sh:\
:lp=/dev/lp0: 

上述各行的意思是:

  • Head line: lp – spool 名称, alias = alias
  • mx#0 – 不限最大文件尺寸
  • sh – 不打印页眉
  • lp=/dev/lp0 – 本地机印机,或 port@host 远程打印机

如果连接的是台 PostScript 打印机,上述设置就够用了。如果是 Windows 机器通过 Samba 打印,上述设置也适用于任何 Windows 支持的打印机(不支持双向通信)。你必须在 Windows 环境中对打印机做相应的配置。

如果你没有 PostScript 打印机,就得用 gs 安装过滤系统。有很多自动配置工具可用于配置 /etc/printcap,可选择下列任何一组:

  • gnulpr、(lpr-ppd)和 printtool— 我用这种
  • lpr 和 apsfilter
  • lpr 和 magicfilter
  • lprng 和 lprngtool
  • lprng 和 apsfilter
  • lprng 和 magicfilter

想运行 GUI 配置工具如 printtool,需要 root 权限,参阅 [[UbuntuHelp:../ch-tune.zh-cn.html| X 下获取 root 权限, 第 9.4.12 节]]。printtool 可创建打印缓冲池,它使用 gs 模拟 PostScript 打印机,所以要使用 PostScript 打印驱动来访问它们。在 Windows 端,“Apple LaserWriter”是标准件。


3.6.2 CUPS™

使用 aptitude 安装 Common UNIX Printing System(或CUPS™)和所有位于 "Tasks" -> "Servers" -> "Print Server". (Sarge) 下的软件包。 为了得到最佳的结果,你需要对 aptitude 进行如下的设置: "F10" -> "Options" -> "Dependency handling" -> "[X] Install Recommended packages automatically".

KDE 和 Gnome 桌面系统提供了简易的打印机设置。如果安装了 swat,你也可以用任何一种浏览器来设置。

$ mybrowser http://localhost:631 

举个例子,将你的打印机联接到可访问打印机列表中:

  • 在主页面上点击“Printers”,然后点“Add Printer”,
  • 输入用户名和密码,进入“root”,
  • 按提示添加打印机,
  • 返回“Printers”页面,点“Configure Printer”,
  • 设定打印纸尺寸、分辨率和其它参数。

更多信息可浏览 http://localhost:631/documentation.htmlhttp://www.cups.org/cups-help.html。

对于 2.4 内核,参见 [[UbuntuHelp:../ch-kernel.zh-cn.html| 并行端口支持, 第 7.2.6 节]]。


3.7 桌面 PC 的 CRON

Vixie cron 是计划任务默认安装的软件。 除非系统是 7×24 小时连续运行,该软件并不能够很好的工作。 对于桌面 PC, 需要在安装 cron 软件包的基础上再安装 anacron 来解决这个问题。 fcron 软件包可以作为 anacron 软件包的一个替代。

参见 [[UbuntuHelp:../ch-tips.zh-cn.html| 日程安排(cron,at), 第 8.6.27 节]] 来配置 CRON。


3.8 其它主机安装提示


3.8.1 初始化安装完成后再安装其他软件包

到现在,你已经拥有一个小巧但功能颇强的Debian。接下来,可以安装那些较大的软件包了。

  • 运行 tasksel。参阅[[UbuntuHelp:../ch-package.zh-cn.html| 安装 tasks, 第 6.2.2 节]]。

可按需选择:

    • End-user – X window system
    • Development – C and C++
    • Development – Python
    • Development – Tcl/Tk
    • Miscellaneous — TeX/LaTeX environment
    • 对于其他软件包,我喜欢把 tasksel 作为安装指导来用,查看 <Task Info> 了解有关任务的安装列表 然后用 dselect 来选择安装。
  • 运行 dselect。

在此,你最想做的事就是选择钟爱的编辑器和其它需要的程序。你可以同时安装 Emacs 的多个变种。参阅 [[UbuntuHelp:../ch-package.zh-cn.html| dselect, 第 6.2.4 节]] 和[[UbuntuHelp:../ch-edit.zh-cn.html| 流行的编辑器, 第 11.1 节]]。 你也可以将某些默认的软件包替换成特定版本。

    • lynx-ssh (而不是 lynx)
    • ...
  • ...

我通常编辑 /etc/inittab 来简化关机步骤。

...
# What to do when CTRL-ALT-DEL is pressed.
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -h now
... 

3.8.2 模块

在初始安装期间可进行设备驱动模块配置。以后还可使用 modconf 进行配置,它是基于菜单界面的工具,可用来配置那些在初始安装时未曾配置的模块或完成新内核安装后的配置工作。

所有预加载(preloading)模块的名称要加入到 /etc/modules 列表。也可以使用 lsmod 和 depmod 进行手工控制。

对于 2.4 版内核别忘了在 /etc/modules 中加上几行来处理 IP 伪装(FTP 等)。参阅[[UbuntuHelp:../ch-kernel.zh-cn.html| 模块化的 2.4 内核, 第 7.2 节]],特别是[[UbuntuHelp:../ch-kernel.zh-cn.html| 网络功能, 第 7.2.3 节]]。


3.8.3 CD-RW 基本步骤

对于在 2.4 版内核中使用 IDE 接口的 CD-RW,编辑下列文件:

/etc/lilo.conf  (添加 append="hdc=ide-scsi ignore=hdc", 
执行 lilo 激活)
/dev/cdrom      (创建链接 # cd /dev; ln -sf scd0 cdrom)
/etc/modules    (加入 "ide-scsi"和"sg"。如果需要可再加上"sr"。) 

详情参阅 [[UbuntuHelp:../quick/ch-tune.zh-cn.html| 刻录机, 第 9.3 节]]。


3.8.4 多内存和关机自动断电

编辑 /etc/lilo.conf,设置启动提示参数如下,实现识别大内存(适用于 2.2 版内核)和关机自动断电(适用于 APM):

append="mem=128M apm=on apm=power-off noapic" 

执行 lilo 完成上述设置。对称多处理器内核(SMP-kernel)需要 apm=power-off,而对我那堆糟糕的 SMP 硬件而言 noapic 也是需要的。系统启动时,在启动提示符后直接输入这些参数效果也一样。参阅[[UbuntuHelp:../ch-tips.zh-cn.html| 其它用于启动提示符的技巧, 第 8.1.5 节]]。

在 2.4 版内核中,如果 APM 是作为模块编译的,可在系统启动后运行 # insmod apm power_off=1 或设置 /etc/modules:

# echo "apm power_off=1" >>/etc/modules 

还可以这样:编译新版内核时加入 ACPI 支持可达到同样的效果,而且这种方式更适合 SMP(只有较新的主板才支持 ACPI)。对于较新的主板 2.4 版内核可以直接检测到大内存。

CONFIG_PM=y
CONFIG_ACPI=y
...
CONFIG_ACPI_BUSMGR=m
CONFIG_ACPI_SYS=m 

在 /etc/modules 中按如下顺序添加参数:

ospm_busmgr
ospm_system 

或者重新编译内核,在配置时将上述内核选项均设为“y”。总之,有了 ACPI 支持就不再需要任何启动提示参数。


3.8.5 无法访问某些站点的怪问题

如果 内核开启 ECN,对于某些使用劣质路由器的站点,会出现无法访问的问题。新的 dapper 发行版默认关闭了 ECN,检查 ECN 状态可使用:

# cat /proc/sys/net/ipv4/tcp_ecn
... 或
# sysctl net.ipv4.tcp_ecn 

将它关闭:

# echo "0" > /proc/sys/net/ipv4/tcp_ecn
... 或
# sysctl -w net.ipv4.tcp_ecn=0 

每次启动时禁止 TCP ECN,可编辑 /etc/sysctl.conf,加上:

net.ipv4.tcp_ecn = 0 

3.8.6 PPP 拔号设置

安装 pppconfig 软件包,设置 PPP 拨号访问。

# apt-get install pppconfig
# pppconfig
... 按提示配置 PPP 拨号
# adduser user_name dip
... 允许 user_name 进行 PPP 拨号访问 

用户(user_name)进行 PPP 拨号访问:

$ pon ISP_name   # 开始 PPP 访问,接通你的 ISP
... 享受 Internet
$ poff ISP_name # 停止 PPP 访问,ISP_name 可选 

详情参阅[[UbuntuHelp:../ch-gateway.zh-cn.html| 设置 PPP 接口, 第 10.2.4 节]]。

ADSL 用户使用 pppoeconf,来配置 PPPOE 拨号访问。

# apt-get install pppoeconf
# pppoeconf
... 按提示配置 PPPoe 拨号

3.8.7 /etc/ 中的其它配置文件

Ubuntu 标准安装不包含 /etc/cron.deny 文件,想添加可拷贝 /etc/at.deny。


第 4 章 - Ubuntu指南


这一节为真正的新手提供一个熟悉的 Ubuntu 世界,如果您已经使用了一段时间的类unix操作系统,那么您应该已经了解我在这里所说的一切。那么请用这个来做一个实战检验。


4.1 开始了

在您的电脑上安装完 Ubuntu 系统以后,您需要学习一点东西以便使用它,让我们来给您做一个快速的培训。


4.1.1 用超级用户登录到命令提示符

在重新启动系统的时候,您处在一个图形的登录界面,或者字符界面的登录界面,这个取决于您初始安装时所选择的发行版本,简单的说,如果您现在处在图形登录界面, 那么按下 Ctrl-Alt-F1 [[[UbuntuHelp:../footnotes.zh-cn.html| 3]]] 来获得字符界面。

假设您的主机名是foo,那么登录提示符看起来是这样的:

foo login:

输入用户名也就是你安装时设置的用户名,我们假设用户名为 ubuntu,如果采用 oem 方式安装,则用户名为 oem ,然后按回车键,然后会提示输入密码,就是您在安装过程中所输入的密码。在 Ubuntu 系统中,按照 Unix 的习惯,密码是不可见的。然后系统就会输出欢迎 信息而且给出 $ 的命令提示符等待您的输入。 [[[UbuntuHelp:../footnotes.zh-cn.html| 4]]]

foo login: ubuntu
Password:
Linux backup 2.6.15-25-686 #1 SMP PREEMPT Wed Jun 14 11:34:19 UTC 2006 i686 GNU/Linux

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
You have new mail.
Last login: Tue Jul  4 13:24:05 2006 on tty3
ubuntu@foo:~$

现在输入 sudo -sH ,会再次输入密码,输入相同的登录密码后,回车,切换到 root 帐号:

ubuntu@foo:~$ sudo -sH
sudo: please use single character options
Password:
root@@foo:~#

您现在已经准备好通过root的命令提示符进行系统的管理。这个root帐户也被称为超级 用户或者特权用户。拥有这个帐户,您将可以做任何事情:

  • 读,写和删除任何文件而不用去理会它们所要求的权限
  • 设置文件的归属,以及系统里面任何文件的访问权限
  • 登录到任何帐户而不需要他们的密码

通过和别人共享root用户的密码来共享root帐户是一个非常糟糕的想法。而使用程序比如 sudo(8)是共享管理权限的好方法。

请注意,优先使用非特权用户登录被认为是一个好的Unix习惯,哪怕是您要进行管理活动, 在必要的时候您也可以使用sudo, super,或者 su -c来 获得有限的root权限。 See [[UbuntuHelp:../ch-tune.zh-cn.html| 更安全地工作 – sudo, 第 9.2.4 节]]. [[[UbuntuHelp:../footnotes.zh-cn.html| 5]]]


4.1.2 设置最小的新手环境

我认为学习一个电脑系统就像学习一门新的外语。尽管书本指南是有帮助的,但是您需要 练习使用帮助工具。在这个情况下,我认为安装一些额外的软件包是一个好主意,比如 mc, vim, lynx, doc-linux-text, and debian-policy. [[[UbuntuHelp:../footnotes.zh-cn.html| 6]]]

# apt-get update
...
# apt-get install mc vim lynx doc-linux-text debian-policy
...

如果您已经安装了这些软件包,那么什么都不需要安装了。


4.1.3 添加一个用户

在安装过程中,您通常已经创建了一个非特权用户来接收发送给root帐户的e-mail。 [[[UbuntuHelp:../footnotes.zh-cn.html| 7]]] 因此您也不希望用这个特殊的帐户来进行下面的训练,那么您需要创建另外一个帐户。

假设您希望新帐户的名字叫penguin, 输入:

root@foo:root# adduser penguin
... 回答所有的问题

这样就可以了。 [[[UbuntuHelp:../footnotes.zh-cn.html| 8]]] 在更进一步之前,我们先来学习一点东西


4.1.4 在不同的控制台之间切换

在默认的 Ubuntu 系统中,有6个独立的伪终端,比如,您可以把PC的VGA字符终端当作 6个可以选择的VT-100终端来使用。从一个切换终端到另外一个,你只需要同时按下左Alt键 和F1 –:F6键。任何一个伪终端都可以让不同的用户独立登录。多用户环境是 Unix 的 一个很优秀的、使人迷恋的特性。

如果你偶然的在装有X装口系统的系统上按下了Alt-F7,控制台就会切换到图形界面,然后 再按下Ctrl-Alt-F1可以重新回到字符界面。您可以尝试在在不同的控制台之间切换,然后 再换回到原来的那个,您慢慢就会习惯于这样做。


4.1.5 怎样关闭机器

就像任何其它现代的操作系统一样,任何文件操作都会在内存当中缓存数据,Ubuntu 操作系统也需要一个适当的过程,让电脑电源关闭之前保证这些文件的一致性,您可以在 root 命令提示符下使用下面的命令来关闭系统。

# shutdown -h now

上面是在正常的多用户模式下面的方法。如果您是处在单用户模式,您可以在root用户的命令提示符下使用下面的命令:

# poweroff -i -f

可选择的其它方式,比如您可以用Ctrl-Alt-Delete来关闭系统 [[[UbuntuHelp:../footnotes.zh-cn.html| 9]]]

默认系统会自动关闭电源,如果APM和ACPI选项在 BIOS和Linux内核里面都配置有问题的话,等待系统在屏幕上输出"System halted"之后您就可以关闭电源了。可以看[[UbuntuHelp:../ch-install.zh-cn.html| 多内存和关机自动断电, 第 3.8.4 节]]获得详细信息。


4.1.6 玩的时间

现在您已经准备好使用 Ubuntu 系统了,而不用担心有任何冒险,因为您使用的非特权用户 penguin。 [[[UbuntuHelp:/footnotes.zh-cn.html| 10]]]

让我们先登录到 penguin 用户。 如果您现在正在root用户的命令提示符下面,输入 exit [[[UbuntuHelp:../footnotes.zh-cn.html| 11]]] 在root用户提示符下面关闭root的shell以后我们就返回了 ubuntu 用户提示符,再次输入 exit ,返回登录提示符。输入您刚创建的新 用户名penguin和对应的密码。 [[[UbuntuHelp:../footnotes.zh-cn.html| 12]]] 您将会获得如下的命令提示符

penguin@foo:penguin$

从现在开始,为了简单起见我们将使用简化的命令提示符,我们将使用:

  • # : root的命令提示符
  • $ : 非特权用户的命令提示符

我们将先用简单的方法[[UbuntuHelp:../ch-tutorial.zh-cn.html| Midnight Commander (MC), 第 4.2 节]]来学习 Ubuntu ,稍后使用较好的方法[[UbuntuHelp:../ch-tutorial.zh-cn.html| 类 Unix 工作环境, 第 4.3 节]]。


4.2 Midnight Commander (MC)

Midnight Commander (MC)是Linux控制台和其它终端环境中的GNU“瑞士军刀”。这给予了新 受一个菜单驱动控制台的体验,它比Unix标准命令容易学的多。

用命令来研究 Ubuntu 系统。这个是最好的学习方法。请不使用键盘而只用鼠标和回车键来访问下面的地址:

  • /etc 和它的字目录。
  • /var/log 和它的字目录。
  • /usr/share/doc 和它的字目录。
  • /sbin and /bin

4.2.1 提高 MC

为了让MC在退出的时候改变工作目录,您需要修改 ~/.bashrc(或者/etc/bash.bashrc,查看.bashrc),使用-P选项在它的 手册里面可以获取更详细的信息mc(1). [[[UbuntuHelp:../footnotes.zh-cn.html| 13]]]


4.2.2 启动MC

$ mc

在MC中用户可轻而易举使用菜单完成所有的文件操作。可以按F1获得帮助,您可以只用鼠 标和功能键来操作MC [[[UbuntuHelp:../footnotes.zh-cn.html| 14]]]


4.2.3 MC 里的文件管理器

默认状态下,所有文件列于两个目录面板。一种实用的方式是将右边窗口设定为“information”,用来查看文件访问权限等信息。下面是一些基本的击键。如果gpm daemon在运行,你还可以使用鼠标。(在MC中进行剪切和粘贴操作时别忘了按下shift键。)

  • F1: 帮助菜单
  • F3: 内置文件阅读器
  • F4: 内置编辑器
  • F9: 激活折叠菜单
  • F10: 退出Midnight Commander
  • Tab: 在两个窗口间移动
  • Insert: 为多文件操作生成文件如拷贝
  • Del: 删除文件(小心—请设置MC为安装删除模式)
  • Cursor keys: 与各自的名字一致

4.2.4 MC里的命令行技巧

  • cd命令可改变焦点屏幕中的目录位置。
  • Control-Enter或Alt-Enter可以将文件名拷贝到命令行。在编辑命令行时可与cp或mv命令结合使用。
  • Alt-Tab显示焦点文件所属文件或目录的文件名
  • 可指定MC两个目录窗口的起始目录;例如mc /etc /root。
  • Esc + numberkey ===== Fn(例如 Esc + '1' ===== F1, etc.; Esc + '0' ==== F10)
  • Esc- key ==== Alt-key (== Meta, M-); 例如Esc + 'c'等价于Alt-c

4.2.5 MC 里面的编辑器

内置编辑器的剪切-粘贴方式很有意思。按F3在起始处做标记,再次按F3在终止处做标记,这时中间的选中部分会高亮显示。然后你可以移动光标到某处按下 F6,被选中部分就会移到该处。如果你按下的是F5,选中部分就会拷贝到该处。F2用来存盘,F10退出,所有方向键的作为和它们的名字一样直观。

该编辑器可直接打开某个文件:

$ mc -e filename_to_edit
$ mcedit filename_to_edit

虽然它不是多窗口编辑器,但你可利用Linux多控制台的特性达到相同的效果。要在窗口间进行拷贝操作,可使用Alt-Fn切换虚拟控制台,然后使用“File->Insert file”或“File->Copy to file”将一个文件中的内容拷贝到另一个文件。

可指定任何外部编辑器作为内置编辑器。

许多程序使用环境变量EDITOR或VISUAL来决定使用哪个编辑器。如果你用不惯vim,可在~/.bashrc中加上几行来指定新的mcedit:

...
export EDITOR=mcedit
export VISUAL=mcedit
...

我强烈推荐将它们设定为vim。在Linux/Unix世界里就该使用vi(m)命令。 [[[UbuntuHelp:../footnotes.zh-cn.html| 15]]]


4.2.6 MC 里的阅读器

非常精巧的阅读器。它是在文档中搜索单词的利器。在/usr/share/doc目录下我总是用它,面对大量的Linux资料用它浏览是最快的方法。阅读器可以直接找开文件:

$ mc -v filename_to_view

4.2.7 MC的自动启动特性

在文件上按Enter,会激活相关的程序操作该文件。这是MC的一个极方便的特点。

executable file:        执行命令
man, html file:    将文件内容传入阅读器程序
tar, gz, deb file: 象浏览子目录一样浏览它的内容

为了使这些阅读器和虚拟文件的属性能够被查看,不要将可阅读文件设成可执行文件。可在MC文件菜单中改变文件属性或使用chmod命令。


4.2.8 MC 里的FTP虚拟文件系统

MC可通过FTP访问文件。按F9转到菜单栏,输入’p’激活FTP虚拟文件系统。按username:[email protected]格式输入URL,远程文件目录就会以本地目录的方式显示出来。

在URL里试着用http.us.debian.org/debian来浏览Debian存档文件。看[[UbuntuHelp:../ch-system.zh-cn.html| Ubuntu 文件, 第 2.1 节]] 就知道这些是怎么被识别的了。


4.3 类 Unix 工作环境

尽管MC让您能够做绝大多数的事情,但是利用shell来学习命令行工具,和熟悉类Unix系统 的工作环境还是很重要的。 [[[UbuntuHelp:../footnotes.zh-cn.html| 16]]]


4.3.1 特殊的按键组合

在类Unix环境里,有一些按键有特殊的意思。 [[[UbuntuHelp:../footnotes.zh-cn.html| 17]]]

  • Ctrl-U: 擦除一行光标前面的部分。
  • Ctrl-H: 擦除光标前面的一个字符。
  • Ctrl-D: 终止输入。(退出shell,如果您正在使用shell的话)。
  • Ctrl-C: 终止当前正在运行的程序。
  • Ctrl-Z: 暂停程序。 (把它放到后台运行请看[[UbuntuHelp:../ch-tutorial.zh-cn.html| command &, 第 4.3.10.1 节]])
  • Ctrl-S: 停止向屏幕输出。 [[[UbuntuHelp:../footnotes.zh-cn.html| 18]]]
  • Ctrl-Q: 重新激活向屏幕输出。

默认的shell,bash, 有历史编辑和tab补齐功能。

  • up-arrow: 开始历史命令搜索。
  • Ctrl-R: 开始增量历史命令搜索。
  • TAB: 完整的把文件名输入到命令行。
  • Ctrl-V TAB: 输入TAB而不是扩展命令行。

其他一些需要记住的按键组合。

  • Ctrl-Alt-Del:挂起或者重新启动系统 [[UbuntuHelp:../ch-install.zh-cn.html| 初始化安装完成后再安装其他软件包, 第 3.8.1 节]].
  • Left-click-and-drag mouse: 选择并且拷贝到剪贴板。
  • Click middle mouse button: 使用剪贴板的内容粘贴。
  • Meta-key (Emacs terminology) 传统的是使用 Left-Alt-key. 但是有些系统使用 Windows-key实现 Meta-key.

这里,为了在Linux字符界面下使用鼠标,您需要使用gpm服务。 [[[UbuntuHelp:../footnotes.zh-cn.html| 19]]] 查看[[UbuntuHelp:../ch-install.zh-cn.html| 鼠标设置, 第 3.3 节]]。


4.3.2 基本 Unix 命令

让我们来学习基本的Unix命令。 [[[UbuntuHelp:../footnotes.zh-cn.html| 20]]] 使用非特权用来执行下面的所有的命令。 penguin :

  • pwd
    • 显示当前工作路径。
  • whoami
    • 显示当前用户名。
  • file foo
    • 显示foo文件的属性。
  • type -p commandname
    • 显示命令commandname所的的地方。
    • which commandname也可以用来做这个 . [[[UbuntuHelp:../footnotes.zh-cn.html| 21]]]
  • type commandname
    • 显示命令 commandname的信息。
  • apropos key-word
    • 找到和 key-word相关的命令。
    • man -k key-word也可以做到
  • whatis commandname
    • 显示该命令的一句话帮助。 commandname.
  • man -a commandname
    • 显示命令的解释信息。 commandname. (Unix style)
  • info commandname
    • 显示很长的命令解释 commandname. (GNU style)

ls

    • 列出目录内容 (非以.开始的文件和目录) [[[UbuntuHelp:../footnotes.zh-cn.html| 22]]]
  • ls -a
    • 列出目录内容(所有的文件和目录)
  • ls -A
    • 列出目录内容。(几乎所有的文件和目录,略去".." and ".")
  • ls -la
    • 列出目录所有文件和目录的详细信息。查看[[UbuntuHelp:../ch-tutorial.zh-cn.html| Ubuntu 中的文件系统概念, 第 4.5.2 节]]。
  • ls -d *
    • 列出当前目录下的目录名称,而不是目录下的内容。
  • lsof foo
    • 显示文件foo的打开状态。
  • mkdir foo
    • 在当前目录下创建一个新的目录foo。
  • cd foo
    • 切换到当前目录下或者在变量CDPATH中列出来的目录foo。在builtins(7)查看命令cd。
  • cd /
    • 切换到根目录。
  • cd
    • 切换到用户主目录。
  • cd /foo
    • 切换到绝对路径/foo所指定的目录。
  • cd ..
    • 切换到上一级目录。
  • cd ~foo
    • 切换到用户主目录下的foo目录去。
  • cd -
    • 切换到上一次所去的目录。
  • </etc/motd pager
    • 使用默认的分页程序查看文件/etc/motd的内容,参照[[UbuntuHelp:../ch-tutorial.zh-cn.html| command < foo, 第 4.3.10.9 节]]。 [[[UbuntuHelp:../footnotes.zh-cn.html#f23| 23]]]
  • touch junkfile
    • 创建一个空文件junkfile。
  • cp foo bar
    • 拷贝一个已有的文件foo到新文件bar。
  • rm junkfile
    • 删除文件junkfile
  • mv foo bar
    • 把已有的文件foo重命名为bar
  • mv foo bar/baz
    • 把已有的文件foo移动到新位置并重命名为bar/baz。目录bar必须存在。
  • chmod 600 foo
    • 让已经存在的文件foo其他人不能读写。(所有人都 不能执行)。
  • chmod 644 foo
    • 使文件foo其他的人可以读,但是不能写。(所有人 都不能执行)
  • chmod 755 foo
    • 使文件foo其他的人能读不能写。(所有人都可以执行)
  • top
    • 全屏显示进程信息。输入”q”退出。
  • ps aux | pager
    • 用BSD风格输出所有正在运行的进程的信息。参照 [[UbuntuHelp:../ch-tutorial.zh-cn.html#s-cmd-pipe| command1 | command2, 第 4.3.10.2 节]]。
  • ps -ef | pager
    • 用system-V风格来输出所有正在运行的进程的信息。
  • ps aux | grep -e "[e]xim4*"
    • 显示exim4进程,或者运行exim的进程。输入man grep可以从grep(1)的手册页学习正则表达式。 [[[UbuntuHelp:../footnotes.zh-cn.html#f24| 24]]]
  • ps axf | pager
    • 用ASCCI艺术形式来显示运行所有进程信息。
  • kill 1234
    • 杀死进程号为1234的进程。 查看[[UbuntuHelp:../ch-tips.zh-cn.html#s-kill| 中止一个进程, 第 8.5.1 节]]。
  • grep -e "pattern" *.html
    • 找到当前目录下面所有以.html结尾的文件中含有"pattern"的行,并显示它们。
  • gzip foo
    • 用Lempel-Ziv(LZ77)压缩算法压缩foo,生成foo.gz。
  • gunzip foo.gz
    • 将文件foo.gz解压缩生成foo。
  • bzip2 foo
    • 将文件foo.bz2解压缩生成foo。
  • tar -xvvf foo.tar
    • 从打包文件foo.tar解出文件来。
  • tar -xvvzf foo.tar.gz
    • 从打包压缩的文件foo.tar.gz中解开文件。
  • tar -xvvf --bzip2 foo.tar.bz2
    • 从文件foo.tar.bz2解压缩文件。 [[[UbuntuHelp:../footnotes.zh-cn.html#f25| 25]]]
  • tar -cvvf foo.tar bar/
    • 把目录bar/的内容打包存放到foo.tar存档中。
  • tar -cvvzf foo.tar.gz bar/
    • 把目录bar/的内容打包并且压缩存放到foo.tar.gz存档中。
  • tar -cvvf --bzip2 foo.tar.bz2 bar/
    • 把目录bar/中的内容打包存放到foo.tar.bz2存档里面。 [[[UbuntuHelp:../footnotes.zh-cn.html#f26| 26]]]
  • zcat README.gz | pager
    • 实用默认的分页显示程序pager来显示压缩文件README.gz中的内容。
  • zcat README.gz > foo
    • 使用文件README.gz解开后的内容创建一个文件foo。
  • zcat README.gz >> foo
    • 把文件README.gz解开后的内容追加到文件foo的后面(如果文件不存在的话,就会创建一个)。
  • find . -name pattern
    • 用shell找到匹配pattern的文件名(慢一些)。
  • locate -d . pattern
    • 用shell找到匹配pattern的文件名(使用已有的规则的数据库,快一些)。

请用上面的这些命令来查看您的系统的目录和其他的信息,以此来熟练一些操作。如果您 对上面的这些控制台命令有任何不明白的地方,请首先阅读帮助手册,比如下面的命令就是 好的开始:

$ man man
$ man bash
$ man ls

现在也是时候启动vim然后按下F1键了。您最少也应该阅读开始的35行。然后把光标移动到|tutor|,再按下Ctrl-]就可以做在线测试了。查看[[UbuntuHelp:../ch-edit.zh-cn.html| 编辑器, 第 11 章]]可以学到更多关于编辑器的知识。

请注意许多来自于GNU和BSD的类Unix命令都会在您进行如下操作的时候(或者您没有给出任何参数)给出简单的帮助:

$ commandname --help
$ commandname -h

您也可以参照[[UbuntuHelp:../ch-tips.zh-cn.html| Ubuntu 小技巧, 第 8 章]]里的例子来进行自我测试。


4.3.3 命令执行

现在您已经比较了解应该如何使用 Ubuntu 系统了。让我们来更深入的了解 Ubuntu 系统的命令执行结构。 [[[UbuntuHelp:../footnotes.zh-cn.html#f27| 27]]]


4.3.4 简单的命令

一个简单的命令是如下面的序列


  • 可变的声明 (可选)
  • 命令的名字
  • 参数 (可选)
  • 重定向 (可选: > , >> , < , << , 等等)
  • 控制操作 (可选: && , || ; <换新行> , ; , & , ( , ) )

想了解更多复杂命令的解释和应用请查看[[UbuntuHelp:../ch-program.zh-cn.html#s-clprocess| 命令行处理, 第 13.2.6 节]]。


4.3.5 命令执行和环境变量

典型的使用shell来执行命令情况如下: [[[UbuntuHelp:../footnotes.zh-cn.html#f28| 28]]]

$ date
Sun Oct 26 08:17:20 CET 2003
$ LC_ALL=fr_FR date
dim oct 26 08:17:39 CET 2003

这里date程序是在前台执行的。环境变量LC_ALL是:

  • 取消设置 (系统默认的和 C)作为第一个命令
  • 设置为 fr_FR (French locale) 作为第二个命令。

绝大多数的命令并没有预先定义各种环境变量。像上面的例子选择如下方式:

$ LC_ALL=fr_FR
$ date
dim oct 26 08:17:39 CET 2003

正如您所看到的,命令的输出和环境变量设置有关,上面产生的是法语输出。如果您 想这个环境变量在子进程中也能够得到继承的话(e.g.,执行shell脚本的时候),您需要 使用下面的方式。

$ export LC_ALL

4.3.6 命令搜索路径

当您在shell提示符里面输入一个命令的时候,shell就会在PATH环境变量所列出的目录里面去查找。PATH环境变量的值也被叫做shell的查找目录。

在默认安装的 Debian中,用户的PATH环境变量里面也许没有包含/sbin/。因此如果您想运行一些命令比如/sbin/目录下的ifconfig,您就必须在PATH环境变量里面包含它。PATH环境变量一般是在初始化文件~/.bash_profile里面设置的,参看[[UbuntuHelp:../ch-install.zh-cn.html#s-bashconf| Bash 设置, 第 3.2 节]]。


4.3.7 命令行选项

一些命令带有参数,参数部分以-或者--开始的被称做选项。可以用来控制命令的行为。

$ date
Mon Oct 27 23:02:09 CET 2003
$ date -R
Mon, 27 Oct 2003 23:02:40 +0100

这里命令行参数-R改变了命令date的表现以让它输出符合RFC-2822的日期字符串。


4.3.8 Shell 通配符

通常您需要用命令来处理一组文件,但是您又不想输出所有的文件名。shell通配符使得这个成为可能。

  • *
    • 这个匹配0个或者多个字符。
    • 它不会匹配以"."开始的文件名.
  •  ?
    • 这个仅匹配一个字符。
  • [...]
    • 这个匹配[]里面的某个字符。
  • [a-z]
    • 这个匹配字符a到z之间的某个字符。
  • [^...]
    • 这个匹配任意不包含在[]里面的字符(不包含字符"^").

作为练习。请尝试着运行下面的命令并思考一下:

$ mkdir junk; cd junk; touch 1.txt 2.txt 3.c 4.h .5.txt
$ echo *.txt
*****txt 2.txt
$ echo *
*****txt 2.txt 3.c 4.h
$ echo *.[hc]
*****c 4.h
$ echo .*
***** .. .5.txt
$ echo .[^.]*
.5.txt
$ echo [^1-3]*
*****h
$ cd ..; rm -rf junk

4.3.9 命令返回值

每个命令都返回一个值和它返回的状态。

  • 返回0表示命令被正确执行
  • 返回非0的值表示命令没有正确执行。

返回值可以在命令执行后马上用shell用变量$?来访问。

$ [ 1 === 1 ] ; echo $?
0
$ [ 1 === 2 ] ; echo $?
1

请注意,在shell中的逻辑上下文中使用这些返回值的时候success被看做逻辑值TRUE。这个多少有一点不直观,因为success等价于值zero

参看[[UbuntuHelp:../ch-program.zh-cn.html#s-shell-cond| Shell条件表达式, 第 13.2.5 节]]。


4.3.10 典型的命令序列

在我们阅读了这些惯用的shell命令以后,让我们试者记住它们。参看[[UbuntuHelp:../ch-program.zh-cn.html#s-shell-param| Shell参数, 第 13.2.3 节]],[[UbuntuHelp:../ch-program.zh-cn.html#s-shell-redirect| Shell重定向, 第 13.2.4 节]],[[UbuntuHelp:../ch-program.zh-cn.html#s-shell-cond| Shell条件表达式, 第 13.2.5 节]],和[[UbuntuHelp:../ch-program.zh-cn.html#s-clprocess| 命令行处理, 第 13.2.6 节]]。


4.3.10.1 command &

command在子shell的background运行。后台任务让多成程序能够运行在一个shell里面。

管理这些后台任务的请求需要shell内建的: jobs,fg, bg,和kill。请查看 bash(1)这一小节中的"SIGNALS","JOB CONTROL","SHELL BUILTIN COMMANDS".的相关内容。 [[[UbuntuHelp:../footnotes.zh-cn.html#f29| 29]]]


4.3.10.2 command1 | command2

command1的标准输出被直接输入到 command2 的标准输入。 两个命令都可能并行地运行。这个被称作pipeline


4.3.10.3 command1 ; command2

command1command2被有序的执行。


4.3.10.4 command1 && command2

command1如果执行成功的话那么再执行command2。只有当command1并且command2都运行成功的话上面的命令序列才会成功返回。


4.3.10.5 command1 || command2

command1被执行以后,如果不成功的话,command2也会被执行。当command1 或者command2有一个执行成功的话,上面的序列就会返回真值。


4.3.10.6 command > foo

把command的标准输出重定向到文件foo。(覆盖内容)


4.3.10.7 command >> foo

把command的标准输出重定向到文件foo。(追加)


4.3.10.8 command > foo 2>&1

同时把command的标准输出和标准出错信息重定向到文件foo。


4.3.10.9 command < foo

把command的标准输入重定向到一个文件foo。

$ </etc/motd pager
... (the greetings)
$ pager </etc/motd
... (the greetings)
$ pager /etc/motd
... (the greetings)
$ cat /etc/motd | pager
... (the greetings)

尽管上面4个方法都显示同样的内容,但是最后一个多运行了cat命令。而且不必要的浪费了资源。


4.3.11 命令别名

您可以给一个命令序列起一个别名。比如:

$ alias la='ls -la'

现在, la就成了 ls -la命令的简写用来列出所有文件的详细信息。

您可以用type来显示命令的详细路径或者其他身份。比如:

$ type ls
ls is hashed (/bin/ls)
$ type la
la is aliased to `ls -la'
$ type echo
echo is a shell builtin
$ type file
file is /usr/bin/file

这里ls在最近被查找过了,而file没有,因此ls被"hashed",i.e.,shell有一个内部的记录可以用来快速的找到ls的地址。


4.4 类 Unix 文本处理

在类 Unix 的系统中,有几个文本处理工具经常用到。

  • 非正则表达式的方法有:
    • head 显示文件的开始部分。
    • tail 显示文件的结尾部分。
    • sort 给文件中的每一行排序。
    • uniq 删除文件中重复的行。
    • tr 转换或者删除字符。
    • diff 把文件中的内容一行一行的比较。
  • 基本的正则表达式Basic regular expression (BRE) :
    • grep 按模式匹配文本。
    • ed 一个原始的行编辑器。
    • sed 一个流编辑器。
    • vi 一个屏幕编辑器。
    • emacs 一个屏幕编辑器。
  • 扩展的正则表达式Extended regular expression (ERE) is used:
    • egrep 按模式匹配文本。
    • awk 进行简单的文本处理。 查看[[UbuntuHelp:../ch-program.zh-cn.html#s-awk| Awk, 第 13.3 节]].
    • perl做非常难以想像的文本处理。 查看[[UbuntuHelp:../ch-program.zh-cn.html#s-perl| Perl, 第 13.4 节]].

查看[[UbuntuHelp:../ch-tips.zh-cn.html#s-perl-i| 正规表达式的置换, 第 8.6.13 节]], [[UbuntuHelp:../ch-tips.zh-cn.html#s-scrp-snip| 精巧的管道命令辅助脚本, 第 8.6.18 节]], and [[UbuntuHelp:../ch-tips.zh-cn.html#s-perl-mad| 短小的Perl脚本, 第 8.6.20 节]] 可以找到一些脚本的例子。


4.4.1 正则表达式

正则表达式用在很多文本处理工具里面。它们和shell的通配符比较相似(查看[[UbuntuHelp:../ch-tutorial.zh-cn.html#s-cmd-wild| Shell 通配符, 第 4.3.8 节]]),但是它们更复杂也更强大。

正则表达式是由文本字符和元字符组成的,用来描述匹配模式。元字符是有特殊意义的字符。它们有两种主要的形式BRE和ERE,主要取决于[[UbuntuHelp:../ch-tutorial.zh-cn.html#s-text-process| 类 Unix 文本处理, 第 4.4 节]]里面是如何描述的。

在扩展的正则表达式(EREs)里面元字符包括"\ . [ ] ^ $ * + ? ( ) { } |"。正则表达式表示:

  • c
    • 这个用来匹配非元字符 "c".
  • \c
    • 这个用来匹配原本的字符"c".
  • .
    • 这个用来匹配任意字符包括换行符。
  • ^
    • 这个用来匹配字符串的开始。
  • $
    • 这个用来匹配字符串的结尾。
  • \<
    • 这个用来匹配一个单词的开始。
  • \>
    • 这个用来匹配一个单词的结尾。
  • [abc...]
    • 这个字符序列用来匹配 "abc..."中的任意字符。
  • [^abc...]
    • 这个否定的字符序列匹配所有的字符除了 "abc...".
  • r*
    • 这个匹配以"r" 开始的后面有0个或者多个字符的字符串。
  • r+
    • 这个匹配以"r" 开始的后面有一个或者多个字符的表达式。
  • r?
    • 以"r" 开始后面有0个或者1个其他的字符。
  • r1|r2
    • 匹配"r1"或者"r2"。
  • (r1|r2)
    • 匹配"r1"或者 "r2"并且把它当作一个分类 正则表达式。

在BREs里面元字符"+ ? ( ) { } |"不再具有它们特殊的含义,而是使用的有反斜杠的版本"\+ \? \( \) \{ \} \|"。因此分组(r1|r2)需要被表示成\(r1|r2\)。 因为emacs,虽然基本上是BRE,但是它把"+ ?"当作元字符。因此不需要特别表示它们。查看[[UbuntuHelp:../ch-tutorial.zh-cn.html#s-replaceex| 替换表达式, 第 4.4.2 节]]来了解构造分组是如何使用的。

举个例子,grep 可以用正则表达式来搜索文本:

$ egrep 'GNU.*LICENSE|Yoyodyne' /usr/share/common-licenses/GPL
GNU GENERAL PUBLIC LICENSE
                    GNU GENERAL PUBLIC LICENSE
        Yoyodyne, Inc., hereby disclaims all copyright interest in the program

4.4.2 替换表达式

在替换表达式里面,下面的字符有特殊的含义:

  • &
    • 这个会替换正则表达式所匹配的部分。(在emacs里面用\&)
  • \n
    • 这个会替换n-th括号正则表达式所匹配的内容。

在Perl里面,$n替换了\n,&也没有特殊的含义。

举个例子:

$ echo zzz1abc2efg3hij4 | \
sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/=&=/'
zzz=1abc2efg3hij4=
$ echo zzz1abc2efg3hij4 | \
sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/\2===\1/'
zzzefg3hij4===1abc
$ echo zzz1abc2efg3hij4 | \
perl -pe 's/(1[a-z]*)[0-9]*(.*)$/$2===$1/'
zzzefg3hij4===1abc
$ echo zzz1abc2efg3hij4 | \
perl -pe 's/(1[a-z]*)[0-9]*(.*)$/=&=/'
zzz=&=

请特别注意这些括号正则表达式的格式,以及这些被匹配的文本在文本处理工具里面是如何使用的。

这些正则表达式可以用来控制光标的运动和编辑器里面的文本替换。

请阅读所有相关手册来学习这些命令。


4.5 类 Unix 文件系统

在 GNU/Linux和其他的类Unix操作系统里面文件都被放在目录。 [[[UbuntuHelp:../footnotes.zh-cn.html#f30| 30]]] 所有的文件目录都被排列在一棵很大的树里面, 即文件层次树,他的根是/。

这些文件和目录可以跨多个设备。mount(8)命令可以把一些设备挂载到文件系统树里面来。反之umount(8)可以把设备卸载。


4.5.1 Unix 文件基础

这里是一些最基础的:

  • 文件名是区分大小写的,MYFILE和文件MyFile是不同的文件。
  • 跟目录指的是/不要把这个”root”和root用户相混淆了。参看[[UbuntuHelp:../ch-tutorial.zh-cn.html#s-login-root| 用超级用户登录到命令提示符, 第 4.1.1 节]]。
  • 任何目录都有一个可以由任意字母或者符号组成的名字,但是/是例外。 [31] 根目录是一个例外:它的名字是/(读做”slash"或者根目录)它不能被重命名。
  • 任何一个目录都是有下面几种形式给出的,完全限制的文件名绝对文件名,或者路径,给出所有需要经过的目录序列。这三种形式是等价的。所有的绝对文件名都以/目录开始,在目录和目录或者目录和文件之间用/隔开。最开始的/是一个目录的名字,但是后面的仅仅是文件名的分隔符。

上面的这些话看起来让人很费解。那么看看下面的例子吧:

/usr/share/keytables/us.map.gz

这就是一个完整限制的文件名;有些人把它叫做路径。然而人们经常 单独把us.map.gz 作为文件名。 [[[UbuntuHelp:../footnotes.zh-cn.html#f32| 32]]]

  • 根目录有很多分支,比如/etc/和/usr/。这些子目录 又分出很多子目录来,比如 /etc/init.d/和/usr/local/。 所有的加起来被称作目录树

您可以想像,一个绝对文件名就是从树的根基(/)到一个分支的末端(文件)的路由。您也会听到别人把目录树叫做家庭树:这样子目录就有 双亲,路径就显示了所有文件完整的血缘关系。 除此之外,还有相对路径,它从其它的地方开始而不是根目录。您可能还记得 ../指的是上一级目录。

  • 没有哪一个目录是和物理设备紧密关联的,比如您的磁盘。这个和DOS,CP/M,Windows系统不一样的,它们所有的路径都是以一个设备名开始的,比如C:\,参看[[UbuntuHelp:../ch-tutorial.zh-cn.html#s-file-system| Ubuntu 中的文件系统概念, 第 4.5.2 节]]。

关于文件层次的详细信息以及最好的操作练习可以在这里找到Filesystem Hierarchy Standard。作为一个初学者,您需要记住下面的事实:

  • /
    • 简单的一个/表示根目录。
  • /etc/
    • 这个是大多数系统配置文件存放的地方。
  • /var/log/
    • 这个是系统日志存放的地方。
  • /home/
    • 这个目录是存放所有非特权用户的主目录的。

4.5.2 Ubuntu 中的文件系统概念

按照Unix的传统, Ubuntu为存放物理数据的磁盘或者其它存储设备,还有这些硬件设备之间的交互提供文件系统,比如控制台屏幕和远程串行终端就用联合的方式表示。

每个在Ubuntu系统上的文件,目录,命名管道,或者物理设备都有一个数据结构被称作 inode,它被用来描述设备用用的属性,比如设备所有者,所属于的组, 上次访问时间等等。参看/usr/include/linux/fs.h来获得struct inode在 Debian GNU/Linux系统中的详细信息。

这些表现出来的统一的物理入口是非常强大的,因为它们使得可以使用同样的命令和同样 的操作来访问完全不同的设备。

您所有的文件都可以在一个次方上面,----或者您有20个磁盘,有些是在网络上其它的计算机上面, 在GNU/Linux系统中每个文件和目录都与其拥有者(主人)和拥有组相关联。所有的文件信息都保存在一个称为inode的数据结构中。


4.5.3 文件和目录的访问权限

文件和目录的访问权限对如下3类用户进行了分别定义:

  • 文件拥有者(u),
  • 文件拥有者所在用户组中的其它成员(g),和
  • 所有其它用户(o)。

每个文件均拥有下列三种权限:

  • read (r): 查看文件内容
  • write (w): 修改文件
  • execute (x): 如同命令一样执行文件

每个目录均拥有下列三种权限:

  • read (r): 列出目录内容
  • write (w): 在目录中增删文件
  • execute (x): 访问目录中的文件

在此,对目录的execute权限,不仅意味着允许查看目录下文件的内容,还允许查看文件的其它信息如文件大小、修改时间。

ls可用来显示目录和文件的这些信息。参阅 ls(1)。使用ls的-l选项,就会按如下顺序显示下列信息:

  • 文件类型(第1个字符)
    • -: 普通文件
    • d: 目录
    • l: 符号链接
    • c: 字符型设备节点
    • b: 块设备节点
    • p: 命名管道
    • s: 套接字
  • 文件访问权限(接下来的9个字符,每3个一组依次代表user、group和other)。
  • 文件的硬链接数
  • 文件拥有user的用户名
  • 文件所属group的用户组名
  • 文件的字符数大小 (bytes)
  • 文件的时间和日期 (mtime)
  • 文件的名称

在root账号下可使用chown改变文件的拥有者。要改变文件的所属组,可以文件拥有者或root的身份运行chgrp。要改变目录的访问权限,可以文件拥有者或root的身份运行chmod。

# chown newowner foo
# chgrp newgroup foo
# chmod  [ugoa][+-=][rwx][,...] foo

细节请参见 chown(1)、 chgrp(1) 和 chmod(1)。

例如,可以root帐号下创建一个目录树,并使其拥有者为foo,所属组为bar:

# cd /some/location/
# chown -R foo:bar .
# chmod -R ug+rwX,o=rX .

下面是3个更特殊的权限:

  • set user ID (s 或 S 代替 user's x),
  • set group ID (s 或 S 代替 group's x),
  • sticky bit (t 或 T 代替 other's x).

在此,如果隐藏在特殊权限后面的执行权限标位没有设置,则ls -l的输出中,这些标识位将使用大写字母。

为可执行文件设置set user ID位将允许用户以该文件拥有者的ID来执行该文件(例如以root身份)。同样,为可执行文件设置set group ID将允许用户以该文件所属组的ID来执行该文件(例如以root身份)。因为这些设置将引起安全风险,所以使用这些特性时要格外小心。

为目录设置set group ID,则该目录会使用BSD-like文件创建方案,即目录中所有新创建的文件均属于该目录所属的group

为目录设置sticky bit可防止非文件拥有者移动目录中的文件。为确保全局可写目录如/tmp或组可写目录中的文件内容不被修改,不仅要关闭文件的权限,还应设置目录的sticky bit,否则,任何对该目录有写权限的用户均可以将该文件移动到别处,然后在原地创建一个同名文件。

这儿有一些有关文件权限的有趣例子。

$ ls -l /etc/passwd /etc/shadow /dev/ppp /usr/sbin/pppd
crw-rw----    1 root     dip      108,   0 Jan 18 13:32 /dev/ppp
-rw-r--r--    1 root     root         1051 Jan 26 08:29 /etc/passwd
-rw-r-----    1 root     shadow        746 Jan 26 08:29 /etc/shadow
-rwsr-xr--    1 root     dip        234504 Nov 24 03:58 /usr/sbin/pppd
$ ls -ld /tmp /var/tmp /usr/local /var/mail /usr/src
drwxrwxrwt    4 root     root         4096 Feb  9 16:35 /tmp
drwxrwsr-x   10 root     staff        4096 Jan 18 13:31 /usr/local
drwxrwsr-x    3 root     src          4096 Jan 19 08:36 /usr/src
drwxrwsr-x    2 root     mail         4096 Feb  2 22:19 /var/mail
drwxrwxrwt    3 root     root         4096 Jan 25 02:48 /var/tmp

在 chmod(1) 命令里,有一种替代的数字模式来描述文件权限。这种数字模式使用 3 到 4 个八进制数字(以8为基)。 每个数字相应如下:

  • 第一个可选数字: set user ID (=4)、 set group ID (=2) 和 sticky bit (=1)之和
  • 第二个数字: userread (=4)、write (=2) 和 execute (=1) 权限之和
  • 第三个数字: 同上,用于 group
  • 第四个数字: 同上,用于 other

这听起来复杂,但实际上相当简单。 从 ls -l 命令的输出中,看第(2-10)列,把它们作为二进制(以2为基)文件权限(“-”表示“0”,“rwx” 表示“1”)的表示方式来读, 这种数字模式值将使你理解八进制(以8为基)的文件权限表示。 [[[UbuntuHelp:../footnotes.zh-cn.html#f33| 33]]] 例如,尝试:

$ touch foo bar
$ chmod u=rw,go=r foo
$ chmod 644 bar
$ ls -l foo bar
-rw-r--r--    1 penguin  penguin  0 Nov  3 23:30  foo
-rw-r--r--    1 penguin  penguin  0 Nov  3 23:30  bar 

默认的文件权限掩码使用 shell 内建命令 umask 设置。 参见 builtins(7)。


4.5.4 时间戳

GNU/Linux的文件有3种类型的时间戳:

  • mtime: 修改时间 (ls -l),
  • ctime: 状态改变时间 (ls -lc),以及
  • atime: 最近访问时间 (ls -lu).

注意ctime并非文件创建时间。

  • 覆盖一个文件会改变所有三类时间mtimectimeatime所有三类时间。
  • 改变文件的访问权限或拥有者会改变文件的ctimeatime
  • 读文件会改变文件的atime

注意,在 Debian 系统中,即便是简单的读文件通常会引起文件的写操作,从而更新inode上的atime信息。使用noatime选项来挂载文件系统,可使用系统忽略该操作,从而加速文件的访问和读取。参阅mount(8)。

使用 touch(1) 命令来改变存在文件的时间戳。


4.5.5 链接

在2种方法将文件foo关联到不同的文件名bar。

  • hardlink(硬链接)相当于现存文件的另一个名字。(ln foo bar),
  • symbolic link(符号链接),或者“symlink”,是通过名字指向另外一个文件的特殊文件。(ln -s foo bar)。

下面的例子显示了链接数的改变和使用rm命令时产生的微妙差异。

$ echo "Original Content" > foo
$ ls -l foo
-rw-r--r--    1 osamu    osamu           4 Feb  9 22:26 foo
$ ln foo bar     # 硬链接 
$ ln -s foo baz  # 符号链接
$ ls -l foo bar baz
-rw-r--r--    2 osamu    osamu           4 Feb  9 22:26 bar
lrwxrwxrwx    1 osamu    osamu           3 Feb  9 22:28 baz -> foo
-rw-r--r--    2 osamu    osamu           4 Feb  9 22:26 foo
$ rm foo
$ echo "New Content" > foo
$ cat bar
Original Content
$ cat baz
New Content

上例中符号链接均拥有名义上的文件访问权限“rwxrwxrwx”,它们的有效访问权限均由它们所指向的文件来定义。

  • 链接到它所属的目录,因此任何新目录的链接数都从2开始计算。.. 链接到父目录,因些目录链接数会随新的子目录数的增长而增长。

4.5.6 命名管道(FIFOs)

命名管道是一个行为象一个管道的文件。把某些东西放入命名管道文件,它从另外的一端出来。因此,它被称为 FIFO,或 First-In-First-Out:首先放入管道的东西将首先从另外一端出来。

如果写东西到一个命名管道,在写的东西在管道被读出之前,写的进程不会中止。如果从一个命名管道读,读的进程在中止之前,一直处于等待状态,直到有东西可以读为止。命名管道的大小始终为零 --- 它不储存数据,象 shell | 一样,它仅仅连接两个进程。然而, 这个管道有一个名字,两个进程没有必要在同一个命令行运行,或者由同一个用户运行。

做下面的操作来尝试:

$ cd; mkfifo mypipe
$ echo "hello" >mypipe & # 放入后台
[1] 5952
$ ls -l mypipe
prw-r--r--    1 penguin penguin  0 2003-11-06 23:18 mypipe
$ cat mypipe
hello
[1]+  Done                    echo hello >mypipe
$ ls mypipe
prw-r--r--    1 penguin penguin  0 2003-11-06 23:20 mypipe
$ rm mypipe

4.5.7 套接字

套接字类似于命名管道(FIFO),它允许进程交换信息。 对于套接字,那些进程不必要在同时运行,也没有必要是同一个祖先进程的子进程。 它是进程间通讯的端点。 信息交换可以通过网络发生在不同的主机之间。


4.5.8 设备文件

设备文件是系统上物理的或者虚拟的设备,比如说硬盘、显卡、显示器或者键盘。 一个虚拟设备的例子是控制台,由 /dev/console 表示。

有两种类型的设备:

  • 字符设备
    • 一次能够访问一个字符,那就是说,从设备读或者写的最小的数据单元是一个字符(byte)。
  • 块设备
    • 一定是访问一个叫块的大单元,它含有许多字符。 硬盘是一个块设备。

设备文件可以被读写,尽管设备文件包含二进制数据,而这些二进制数据对人类来说是费解的乱码。 向设备文件直接写数据,有时侯对解决硬件连接故障有用。 比如说,将一个文本文件导出到打印机设备 /dev/lp0, 或者发送调制解调器命令到一个适当的串口 /dev/ttyS0。 但是,除非是慎重的操作,它有可能造成一个大的破坏。 所以请小心。


4.5.8.1 /dev/null 等等

/dev/null 是一个特殊的设备文件,它忽略写给它的任何东西。 如果不需要某些东西,把它扔到 /dev/null。 它本质上是一个无底洞。 如果从 /dev/null 读东西,将会立即得到文件结束符(EOF)。

/dev/zero 是类似的,只是从它读的话,将会得到 \0 字符(不与数字零的 ASCII 码相同)。 参阅 [[UbuntuHelp:../ch-tips.zh-cn.html#s-dummyfile| 空文件, 第 8.6.34 节]]。


4.5.8.2 设备号

按例子执行 ls,将显示设备号。

$ ls -l /dev/hda /dev/ttyS0 /dev/zero
brw-rw----    1 root     disk       3,   0 Mar 14  2002 /dev/hda
crw-rw----    1 root     dialout    4,  64 Nov 15 09:51 /dev/ttyS0
crw-rw-rw-    1 root     root       1,   5 Aug 31 03:03 /dev/zero

在这里:

  • /dev/hda 主设备号为 3,次设备号为 0。 属于 disk 组的用户有读写访问权。
  • /dev/ttyS0 主设备号为 4,次设备号为 64。 属于 dialout 组的用户有读写访问权。
  • /dev/zero 主设备号为 1,次设备号为 5。 所有人都有读写访问权。

在老的系统中,安装过程使用 /sbin/MAKEDEV 命令来创建设备号。 参阅 MAKEDEV(8)。

在新的系统中, /dev 下的文件系统通过设备文件系统自动生成, 设备文件系统与 /proc 文件系统类似。


4.5.9 /proc 文件系统

/proc 文件系统是一个伪文件系统,它包含系统信息和正在运行的进程信息。

当注意到一个特殊的文件 /proc/kcore 时,人们经常恐慌,因为它通常很巨大。 该文件(或多或少)是计算机内存的一个拷贝。 它被用来调试内核, 实际上它并不存在,所以不必担心它的大小。

参阅 [[UbuntuHelp:../ch-kernel.zh-cn.html#s-proc-sys| 通过 proc 文件系统调整内核, 第 7.3 节]] 和 proc(5)。


4.6 X 窗口系统

参阅 [[UbuntuHelp:../ch-tune.zh-cn.html#s-x| X, 第 9.4 节]]。


4.6.1 启动 X 窗口系统

X 窗口系统能够使用类似 xdm 的图形登录守护启动,或者在控制台下输入如下的命令启动:

$ exec startx

4.6.2 X 窗口系统下的菜单

X 环境能够与许多窗口管理器协作,各个窗口管理器的用户界面有很大不同。 请记住,右击根窗口将显示一个选择菜单。这个功能总是存在。

  • 得到 shell 命令提示符,从菜单启动 Xterm :
    • "XShells" --> "XTerm".
  • 浏览有图形的网页,从菜单启动 Mozilla:
    • "Apps" --> "Net" --> "Mozilla Navigator".
  • 浏览有图形的 PDF 文件,从菜单启动 Xpdf:
    • "Apps" --> "Viewers" --> "Xpdf".

如果没有发现菜单条目,请安装适当的软件包。参阅 [[UbuntuHelp:../ch-package.zh-cn.html#s-apt-install| Ubuntu 软件包管理基础, 第 6.2 节]]。


4.6.3 X 窗口系统键盘序列

当运行 X 窗口系统时,下面是一些需要记住的重要键盘序列。

  • Ctrl-Alt-F1 到 F6: 切换到其它伪终端(从 X 系统、DOSEMU等。)
  • Alt-F7: 切换回 X 窗口
  • Ctrl-Alt-minus: 改变 X 窗口的屏幕解析度(减号为数字键盘的键)
  • Ctrl-Alt-plus: 在 X 窗口内以相反的方向改变屏幕解析度(加号为数字键盘的键)
  • Ctrl-Alt-Backspace: 中止 X 服务器程序
  • Alt-X, Alt-C, Alt-V: 通常在 Windows/Mac 下与 Ctrl- 键联合的粘贴、拷贝和剪切键,在 Netscape Composer 等程序中,使用 Alt- 键代替。

4.7 进一步学习

目前,推荐阅读来自 The Linux Documentation Project: Guides 的关键用户手册。

  • "The Linux System Administrators' Guide",
  • "The Linux Network Administrator's Guide, Second Edition",
  • "Linux: Rute User's Tutorial and Exposition"
    • 覆盖 GNU/Linux 系统管理的精装书(有在线版)
    • 作者:Paul Sheer
    • 出版:Prentice Hall
    • 软件包:rutebook (从 non-free)
    • 文件: /usr/share/doc/rutebook/

更多资源参阅 [[UbuntuHelp:../ch-support.zh-cn.html| Ubuntu 技术支持, 第 15 章]]。


第 5 章 - 发行版升级到 Breezy、Dapper 或 Edgy


升级的官方发布通知位于 http://www.ubuntu.com/ubuntu/releaseshttp://www.ubuntu.com/news(不断更新中)。

将系统升级到 Breezy、Dapper 或 Edgy 需要几个步骤,而且必须按照下面的顺序:

  • 升级到 Hoary (如果你的系统比 Hoary 要旧)
  • 升级到 Breezy
  • 升级到 Dapper
  • 升级到 Edgy

Ubuntu 不支持省略中间发布的升级


5.1 升级到 Hoary

升级系统到 Hoary。

# apt-get upgrade
# apt-get dist-upgrade

5.2 准备升级工作

你可以用通过网络获取软件包的方式来将一个版本升级到另外的一个版本。 这可以通过如下的方法来做。

生成一个干净的 stable 版存储列表:

# cd /etc/apt
# cp -f sources.list sources.list.old 
# :>sources.list  
# apt-setup noprobe

如果你想升级到 Breezy ,你需要增加 Breezy 版的存储源到这个新的列表。 如果你想升级到 Dapper ,你还需要增加 Dapper 版的存储源。

# cd /etc/apt
# grep -e "^deb " sources.list >srcs
# :>sources.list
# cp -f srcs sources.list
# sed -e "s/breezy/dapper/" srcs >>sources.list
# sed -e "s/breezy/dapper/" srcs >>sources.list 
# apt-get update
# apt-get install apt apt-utils

调整 /etc/apt/sources.list 和 /etc/apt/preferences 的艺术请参阅 [[UbuntuHelp:../ch-package.zh-cn.html#s-apt-install| Ubuntu 软件包管理基础, 第 6.2 节]] 。


5.3 升级

在按照描述的方法正确的设置 /etc/apt/sources.list 和 /etc/apt/preferences 文件后,你便可以开始升级了。

软件包的实质性信息请参见 [[UbuntuHelp:../ch-package.zh-cn.html| Ubuntu 软件包管理, 第 6 章]],如果你遇到问题,请查看 [[UbuntuHelp:../ch-package.zh-cn.html#s-apt-trouble| APT 升级错误以及解决方法, 第 6.3.2 节]]。


5.3.1 使用 dselect

如果系统在许多软件包都包含了 -dev 等软件包,推荐使用下面的 dselect 操作方法进行控制软件包的细化操作。

# dselect update  # 升级前请先完成这步
# dselect select  # 选择附加软件包

运行 dselect 时当前所有软件包均被选中,dselect 会提示你基于 Depends,Suggests 和 Recommends 的附加软件包,如果不想添加任何软件包,只需输入 Q 退出 dselect。

# dselect install

在安装过程中,必须回答一些有关软件包配置的问题,准备好你的笔记本花点时间处理它们。参阅 [[UbuntuHelp:../ch-package.zh-cn.html#s-dselect| dselect, 第 6.2.4 节]]。

使用 dselect。它能干得不赖 :)


5.3.2 使用 apt-get

# apt-get update
# apt-get -t breezy upgrade
# apt-get -t breezy dist-upgrade
# apt-get -t dapper upgrade
# apt-get -t dapper dist-upgrade
# apt-get -t edgy upgrade
# apt-get -t edgy dist-upgrade

一旦你的系统到达 hoary ,使用 aptitude 代替 apt-get 是明智的。(aptitude 接受 apt-get 所接受的许多选项,包括上面列出的那些选项。)

升级到目前 dselect 的设置:

# apt-get dselect-upgrade

参阅 [[UbuntuHelp:../ch-system.zh-cn.html#s-depends| 软件包依赖关系, 第 2.2.8 节]]。


第 6 章 - Ubuntu 软件包管理


高级包管理工具 aptitude 是目前首选的字符界面的 APT 前端程序。 它会记住哪些包是你安装的,哪些是为了满足依赖关系而安装的;在不被已安装包需要的情况下aptitude 会自动卸载后者。它内建一套高级的包过滤器,但是比较难上手。

synaptic 是目前首选的基于 GTK 的图形化 APT 前端程序。它的包过滤器比 aptitude 的好用多了。它包含了对 Debian Package Tags 的实验性支持。

为了减少 Ubuntu 仓库的网络负担和加快你下载的速度,你应该从 Ubuntu 镜像下载。

如果你需要在你本地网络的许多台机器上安装相同的包。在使用 APT 下载包的时候,请考虑使用 squid 来设置本地 HTTP 代理。必要的话,可以设置环境变量 http_proxy 或者在 /etc/apt/apt.conf 里面设置 http 的值。

尽管 apt_preferences(5) 中描述的 APT 的 pinning 功能非常强大,但造成的影响是难以察觉和管理的。你应该把它作为一个高级功能来看待。

在 [[UbuntuHelp:../ch-tips.zh-cn.html#s-chroot| chroot, 第 8.6.35 节]] 中描述的使用方法非常适合于需要同时确保系统的稳定性和使用最新软件的情况。



6.1 介绍

如果你没有精力阅读完所有的开发者文档,那么先看看本章的内容,然后开始体验 Ubuntu 的威力吧:-)


6.1.1 主要的包管理工具

dpkg      – Debian 包安装工具
apt-get   – APT 的命令行前端
aptitude  – APT 的高级的字符和命令行前端
synaptic  – 图形界面的 APT 前端
dselect   – 使用菜单界面的包管理工具
tasksel   – Task 安装工具

这些工具不是用来取代对方的,比如 dselect 同时使用 APT 和 dpkg。

APT 使用 /var/lib/apt/lists/* 来跟踪可用的软件包,而 dpkg 使用的是 /var/lib/dpkg/available。如果你使用了 aptitude 或者其他 APT 前端来安装软件包,同时你希望使用 dselect 来安装软件包,请不要忘记使用 dselect 菜单上的 [U]pdate (或者运行"dselect update") 来更新 /var/lib/dpkg/available。

在处理依赖关系上 apt-get 会自动下载安装依赖的软件包,但是不会处理所安装软件推荐的或者建议的软件包。

相反 aptitude 可以设置成安装所安装软件推荐的或者建议的软件包。

dselect 给使用者列出所安装软件推荐或建议的软件包,可以进行单独选择。 参阅 软件包依赖关系, 第 2.2.8 节.


6.1.2 方便的工具

dpkg-reconfigure  - 重新配置已安装的软件包
                (如果它是使用 debconf 进行配置的)
dpkg-source       - 管理源码包
dpkg-buildpackage - 自动生成包文件
apt-cache         - 在本地缓冲区检查包文件

6.2 Ubuntu 软件包管理基础


6.2.1 设置 APT

参考 [[UbuntuHelp:../ch-woody.zh-cn.html#s-testing-transition| 准备升级工作, 第 5.2 节]] 来设置 sources.list。 [[[UbuntuHelp:../footnotes.zh-cn.html#f34| 34]]] 请参考 [[UbuntuHelp:../ch-install.zh-cn.html| Ubuntu 系统安装提示, 第 3 章]], [[UbuntuHelp:../ch-woody.zh-cn.html| 发行版升级到 Breezy、Dapper 或 Edgy, 第 5 章]], 和 [[UbuntuHelp:../ch-edit.zh-cn.html#s-bin-editor| 应急的编辑器, 第 11.2 节]].


6.2.2 安装 tasks

你可以安装一些软件包集合,这些集合是由使 Ubuntu 系统满足某些特定用途的典型软件包组成的。 这些集合被称为“tasks”。

在初始化安装中,安装 tasks 最简单的方法就是使用 tasksel。 注意在使用之前,你需要运行

dselect update

建议使用 aptitude 来安装 tasks。 它能让你在选择好 tasks 并准备安装之前,删除 tasks 中的某些软件包。


6.2.3 aptitude

aptitude 是全新的可菜单操作的包安装工具,和 dselect 类似,但是是针对 APT 从头设计的。从大多数参数来讲,aptitude 完全可以作为 apt-get 的一个兼容的代替品。 参阅 aptitude(1) 和 /usr/share/doc/aptitude/README.

一旦开始使用 aptitude,你最好继续使用它,而不是选择其他替代工具。否则你将失去 aptitude 包存的软件安装清单,你就不能享受自动删除多余软件包的功能了。

全屏状态下 aptitude 接受单键的命令,大多数是小写的。主要的几个功能键如下:

按键	    动作
F10         菜单
?           按键命令帮助(完整的清单)
u           更新软件包信息
+           标记软件包为升级或者新安装
-           标记软件包为删除(保留配置文件)
_           标记软件包为完全删除(删除配置文件)
===           保持软件包的当前版本,阻止其被升级
U           标记所有可以升级的软件包为升级
g           下载和安装选择的软件包
q           退出当前屏幕,保存改变
x           退出当前屏幕,忽略改变
Enter       查看一个软件包的信息
C           查看一个软件包的更新日志
l           改变软件包树状显示限制
/           搜索第一个匹配的软件包
\           重复最后一次搜索

和 apt-get 一样, aptitude 安装软件包的时候自动解决依赖问题。 aptitude 还能安装即将安装的软件包推荐或者建议的软件包。你通过 F10 -> 选项 -> 处理依赖关系 在菜单上更改这一默认设置。

aptitude 的其他特点如下:

  • aptitude 能访问所有版本的软件包。
  • aptitude 的动作记录在 /var/log/aptitude。
  • aptitude 能轻松的追踪陈旧的和本地建立的软件包,并在“过期的和在本地创建的软件包”上列出。
  • aptitude 内建强大的包搜索和显示功能。熟悉 mutt 的用户很容易上手,因为这个显示方法的灵感来源于 mutt。 参阅 /usr/share/doc/aptitude/README 中的 “SEARCHING, LIMITING, AND EXPRESSIONS”
  • aptitude 在全屏状态下有嵌入的 su 功能。普通用户都可以执行,直到安装或删除软件的时候再取得管理员权限。

6.2.4 dselect

dselect 一直是主要的包维护工具。你可以考虑用 aptitude 代替。

当你启动程序的时候,dselect 会自动选择所有“Required”“Important”和“Standard”的包。

dselect 的用户界面是有些奇怪,但是大部分人已经习惯了。 它有四个主要命令: (指令都是大写的!):

按键	    动作
Q           退出。确认当前的选择并退出。 
(忽略依赖关系)
R           撤销! 我不是那个意思。
D           不管他!我不管你 dselect 怎么想的,照做就好了!
U           都照建议的来做

使用 D 和 Q,你可以选择有冲突的选项。请小心使用这个命令。

在 /etc/dpkg/dselect.cfg 中加上一行“expert”来减少干扰。

如果你的机器运行 dselect 的速度很慢,你可以考虑在速度快一点的机器上运行 dselect,确定你要安装的软件包之后,在慢的机器上通过 apt-get 来安装它们。


6.2.5 使用 APT 来维护发行版本

请编辑 /etc/apt/preferences 并加入以下内容来维持系统为 dapper 版本:

Package: *
Pin: release a=edgy
Pin-Priority: 800

Package: *
Pin: release a=dapper
Pin-Priority: 600

更多复杂的例子请参考 apt_preferences(5),可以让您做更多的事情,例如安装 edgy 的软件包的同时还能把系统维持在 dapper。

关于限制特定软件在特定版本上,而其他软件随系统升级的设置在 [[UbuntuHelp:../examples/| examples subdirectory]] 找到,即 preferences.dapper 和 preferences.edgy。

如果你混用不同的发行版本,例如 dapper 和 breezy 或 edgy 和 dapper,你终究还是会安装上 dapper 或 edgy 版本的核心软件,例如 libc6,这样作无法确保系统中没有臭虫。你需要特别小心。

另外一个例子,preferences.breezy,会强制降级所有的软件到 breezy。

Ubuntu 不支持将某个软件包降级到先前的发行版本。然而在新的软件包出问题时,你会发现你不得不安装旧的可用的软件包。你可以在本地的 /var/cache/apt/archives/ 或远端的 http://archive.ubuntu.com/ 中找到先前的版本。请参考 [[UbuntuHelp:../ch-package.zh-cn.html#s-rescue-dpkg| 使用 dpkg 救助, 第 6.3.3 节]]。

从某个发行版本降级到先前的发行版本也是不被支持的,而且这样做往往造成很多问题。不过你愿意冒险的话,作为最后的手段这样做也是值得的。


6.2.6 aptitude, apt-get 和 apt-cache 命令

还是以上面使用 testing 发行版的用户为例,可使用下列命令来管系统:

  • aptitude upgrade (或 apt-get upgrade 或 aptitude dist-upgrade 或 apt-get dist-upgrade)

这样就会跟随 dapper 版本 — 它们会跟踪 dapper 版本的更新情况,对系统上所有软件包进行升级,并从 dapper 处重新分析依赖关系并安装相关的包。 [[[UbuntuHelp:../footnotes.zh-cn.html#f35| 35]]]

  • apt-get dselect-upgrade

这个命令跟踪 dapper 版本 — 根据 dselect 的选择对系统上的软件包进行升级。

  • aptitude install package/edgy

从 edgy 中安装 package,并由 dapper 版本提供安装依赖的包。

  • aptitude install -t edgy package

通过设置 edgy 的 Pin-Priority 为 990,可以从 edgy 处安装 package 及其依赖的包。

  • apt-cache policy foo bar ...

检查 foo bar ... 软件包的状态。

  • aptitude show foo bar ... | less (或 apt-cache show foo bar ... | less)

查看 foo bar ... 软件包的有关信息。

  • aptitude install foo=2.2.4-1

安装 foo 软件包的特定版本 2.2.4-1。

  • aptitude install foo bar-

安装 foo 软件包并删除 bar 软件包。

  • aptitude remove bar

删除 bar 软件包,但保留其配置文件。

  • aptitude purge bar

删除 bar 软件包及其所有配置文件。

在上面的例子中使用 -u 选项的作用是在实际升级之前将所有将要升级的软件包列出,并提示用户确认。下面的操作可将 -u 设置为默认行为:

$ cat >> /etc/apt/apt.conf << .
// Always show packages to be upgraded (-u)
APT::Get::Show-Upgraded "true";
.

使用 --no-act 可进行模拟升级,并不是进行真正的升级行为。


6.3 Ubuntu 生存命令

掌握了这些知识,你就能够享受无尽的“升级”了 :-)


6.3.1 检测程序错误寻求帮助

如你使用某个软件包出现问题,在寻求帮助或发送错误报告之前请确认查看过下列站点 (lynx, links 和 w3m 都很好用):

$ lynx https://launchpad.net/distros/ubuntu/+bugs/
$ lynx https://launchpad.net/distros/ubuntu/+bugs/package-name  # 如果你知道软件包的名字
$ lynx https://launchpad.net/distros/ubuntu/+bugs/bugnumber     # 如果你知道错误序号

在 Google(www.google.com)中使用关键字“site:launchpad.net”搜索。

如有疑问,可阅读帮助文件。设置 CDPATH 如下:

export CDPATH=.:/usr/local:/usr/share/doc

然后输入

$ cd packagename
$ pager README.Debian # 如果存在的话
$ mc

更多技术支持资源列在 [[UbuntuHelp:../ch-support.zh-cn.html| Debian 技术支持, 第 15 章]]。


6.3.2 APT 升级错误以及解决方法

从 edgy/dapper 进行升级时可能出现 [[UbuntuHelp:../ch-woody.zh-cn.html#s-upgrade-system| 升级, 第 5.3 节]] 中提到的软件包关联问题。多数情况下,是因为升级的软件包所需的新增的关联包没有安装。可使用如下方法解决:

# aptitude dist-upgrade

如果这招无效,可以重复下面的方法至到问题解决:

# aptitude -f upgrade        # 即使遇到错误也继续 upgrade
... 或
# aptitude -f dist-upgrade   # 即使遇到错误也继续 dist-upgrade

一些的确存在问题的升级脚本会引起持续出错。最好的解决方法是检查该软件包的安装脚本 /var/lib/dpkg/info/packagename.{post-,pre-}{install,removal} 然后运行:

# dpkg --configure -a    # 配置所有安装的软件包

如果脚本报告缺少配置文件,查看一下 /etc 中相关的配置文件。如果配置文件有 .dpkg-new 扩展名(或其它类似的扩展名),去掉(mv)它的扩展名。

从 edgy/dapper 进行升级时可能出现软件包关联问题。可用这个方法智取:

# aptitude -f install package # 重载坏关联

还可以用 equivs 包来解决此类问题。参阅 /usr/share/doc/equivs/README.Debian 和 [[UbuntuHelp:../ch-package.zh-cn.html#s-equivs| equivs 软件包, 第 6.5.2 节]]。


6.3.3 使用 dpkg 救助

如果你在使用 APT 的时候遇到死胡同了,那么可以从 Ubuntu 的镜像站点下载软件包并使用 dpkg 来安装。如果你不能访问网络,可以在 /var/cache/apt/archives/ 中找到被缓存的软件包。

# dpkg -i fetchmail_6.2.5-4_i386.deb

如果你用这种方法安装软件包,但是遇到了依赖问题安装失败了,并且你确实需要安装这个软件包。你可以用 dpkg 的 --ignore-depends,--force-depends 和其他参数来安装软件包。dpkg(8) 有更详细的介绍。


6.3.4 恢复软件包选择状态的数据

如果 /var/lib/dpkg/status 因为某种原因坏掉了,Ubuntu 系统将会完全丢失软件包选择状态的数据。赶快到 /var/lib/dpkg/status-old 或 /var/backups/dpkg.status.* 下找找旧的 /var/lib/dpkg/status 文件。

将 /var/backups/ 放在其它的分区是个好习惯,因为该目录包含了许多非常重要的系统数据。

如果旧的 /var/lib/dpkg/status 文件也坏了,仍可以从 /usr/share/doc/ 下的目录进行恢复这些信息。

# ls /usr/share/doc | \
grep -v [A-Z] | \
grep -v '^texmf$' | \
grep -v '^debian$' | \
awk '{print $1 " install"}' | \
dpkg --set-selections
# dselect --expert # 重新安装系统,如果需要的话去除一些选项

6.3.5 /var 崩溃之后如何恢复系统

/var 目录包含着定时更新的数据如 mail,它们很容易遭破坏。将目录放到别的分区可降低风险,如果最坏的事情发生了,可以通过重建 /var 目录来挽救 Ubuntu 系统。

从相同或旧版本的最简 Ubuntu 系统中取得 /var 目录的内容框架,例如 var.tar.gz,然后它放入受损系统的 root 目录,接着

# cd /
# mv var var-old      # 如果里面还有其他有用资料的话
# tar xvzf var.tar.gz # 使用 Woody 框架文件
# aptitude            # 或是用 dselect

上述步骤可使系统恢复工作。使用 [[UbuntuHelp:../ch-package.zh-cn.html#s-recover-status| 恢复软件包选择状态的数据, 第 6.3.4 节]] 中描述的技术加速软件包选择数据的恢复。([FIXME]:该过程需要更多的实践来检验)


6.3.6 为无法启动的系统安装软件包

使用 Ubuntu 急救软盘 /CD 或从多启动 Linux 系统其它分区启动。 参阅 [[UbuntuHelp:../ch-tips.zh-cn.html#s-booting| 启动系统, 第 8.1 节]]. 将无法启动的系统挂载到 /target 并使用 dpkg 的 chroot 安装模式。

# dpkg --root /target -i packagefile.deb 

接下来就可以着手配置并解决问题。

如是只是由于 lilo 损坏而造系统无法启动,可使用标准 Ubuntu 急救盘启动。假设你的 root 分区位于 /dev/hda12 且想使用 runlevel 3,在启动提示符输入:

boot: rescue root=/dev/hda12 3

这样,你就可以使用软盘中内核启动系统,新系统的功能基本齐全。(可能丢失某些内核特性或模块)


6.3.7 如果 dpkg 命令出错怎么办

如果 dpkg 损坏就不能安装任何 .deb 文件。下面的操作可帮助你修复这种状况。(在第一行,你可将“links”替换成你喜欢的浏览器。)

$ links http://archive.ubuntu.com/ubuntu/pool/main/d/dpkg/
... 下载完好的 dpkg_version_arch.deb
$ su
password: *****
# ar x dpkg_version_arch.deb
# mv data.tar.gz /data.tar.gz
# cd /
# tar xzfv data.tar.gz

对 i386,亦可用 http://packages.ubuntu.com/dpkg 作为 URL。


6.4 Ubuntu 必杀技

有了这些命令的启迪,你将会从无休止的升级冲突的地狱中解放出来,达到 Ubuntu 天堂。 :-)


6.4.1 文件信息

在已安装的软件包中许找特定文件所属的软件包:

$ dpkg {-S|--search} pattern

或者搜索 Ubuntu archive:

$ wget http://archive.ubuntu.com/ubuntu/dists/dapper/Contents-i386.gz
$ zgrep -e pattern Contents-i386.gz 

或是用专门的软件包命令:

# aptitude install dlocate  
# 和 slocate 冲突 (locate 的安全版本)
$ dlocate filename         # dpkg -L 和 dpkg -S 的高效代替品
...
# aptitude install auto-apt # 请求式软件包安装工具
# auto-apt update          # 为 auto-apt 建立 db 文件
$ auto-apt search pattern  
# 在所有软件包中搜索 pattern,不论安装与否

6.4.2 软件包信息

搜索并显示包文件的信息。编辑 /etc/apt/sources.list,让 APT 指向正确的包文件。如果想了解 dapper/edgy 中的相应软件包与当前系统安装的软件包有何差别,使用 apt-cache policy — 更好。

# apt-get   check           # 更新缓冲区并检查损坏的软件包
$ apt-cache search  pattern # 按文本描述搜索软件包
$ apt-cache policy  package # 软件包的 priority/dists 信息
$ apt-cache show -a package # 显示所有 dists 中软件包描述信息
$ apt-cache showsrc package # 显示相应源码包的信息
$ apt-cache showpkg package # 软件包调试信息
# dpkg  --audit|-C          # 搜索未完成安装的软件包
$ dpkg {-s|--status} package ... # 已安装软件包描述
$ dpkg -l package ...       # 已安装软件包的状态(每个占一行)
$ dpkg -L package ...       # 列出软件包安装的文件的名称

你也这可这样查看软件包信息(我用 mc 浏览):

/var/lib/apt/lists/*
/var/lib/dpkg/available

比较下面的文件可以确切了解最近的安装过程对系统造成了那些改变。

/var/lib/dpkg/status
/var/backups/dpkg.status*

6.4.3 使用 APT 无人执守安装

使用 APT 无人执守安装,要在 /etc/apt/apt.conf 中加上一行: /etc/apt/apt.conf:

Dpkg::Options {"--force-confold";}

另一种等价的方法是运行 apt-get -q -y packagename。这种方法可能产生严重的负作用,所以使用起来要小心。参阅 apt.conf(5)和 dpkg(1)。

安装完毕以后,可以用 [[UbuntuHelp:../ch-package.zh-cn.html#s-reconfigure| 重新配置已安装的软件包, 第 6.4.4 节]] 中的方法配置特定的软件包。


6.4.4 重新配置已安装的软件包

使用下列方法重新配置已安装的软件包。

# dpkg-reconfigure --priority=medium package [...]
# dpkg-reconfigure --all   # 重新配置所有的软件包
# dpkg-reconfigure locales # 生成额外的 locales
# dpkg-reconfigure --p=low xserver-xfree86 # 重新配置 X 服务器

如果你想永久改变 debconf 对话框模式,可这么做。

某些程序用于生成特殊的配置脚本。 [[[UbuntuHelp:../footnotes.zh-cn.html#f36| 36]]]

apt-setup     - 创建 /etc/apt/sources.list
install-mbr   - 安装主引导(Master Boot Record)管理器
tzconfig      - 设定本地时间
gpmconfig     - 设置 gpm 鼠标 daemon
sambaconfig   - 在 Potato 中配置 Samba( Woody 使用 debconf 来配置)
eximconfig    - 配置 Exim (MTA)
texconfig     - 配置 teTeX
apacheconfig  - 配置 Apache (httpd)
cvsconfig     - 配置 CVS
sndconfig     - 配置声音系统
...
update-alternatives - 设定默认启动命令,例如设定 vi 启动 vim
update-rc.d         - System-V init 脚本管理工具
update-menus        - Debian 菜单系统
...

6.4.5 删除和清除软件包

删除软件包但保留其配置文件:

# aptitude remove package ...
# dpkg   --remove package ...

删除软件包并清除配置文件:

# aptitude purge  package ...
# dpkg   --purge  package ...

6.4.6 阻止旧软件包升级

举个例子,要阻止 libc6 和 libc6-dev 通过 dselect 或使用 aptitude install package 命令升级,可执行:

# echo -e "libc6 hold\nlibc6-dev hold" | dpkg --set-selections

这种方法不影响 aptitude install package 命令操作。要阻止 aptitude upgrade package 或 aptitude dist-upgrade 命令对软件包执行的强制自动降级行为,可在 /etc/apt/preferences 中加上:

Package: libc6
Pin: release a=dapper
Pin-Priority: 2000

这里“Package:”后不能使用通配符如“libc6*”,如果要保持所有与 glibc 源码包相关的二进制包的版本同步,可以明确的列出它们。

该命令可以显示处于“阻止”状态的软件包:

dpkg --get-selections "*"|grep -e "hold$"

6.4.7 breezy/dapper/edgy 混合系统

apt-show-versions 可以列出发行版中可用软件包的版本。

$ apt-show-versions | fgrep /dapper | wc
... 你有多少 testing 软件包
$ apt-show-versions -u
... 列出可升级的软件包
$ aptitude install `apt-show-versions -u -b | fgrep /edgy`
... 将所有 edgy 软件包升级到最新版本

6.4.8 删除缓存包文件

使用 APT 安装软件包会在 /var/cache/apt/archives 目录留下缓存文件,要清除这些文件可使用:

# aptitude autoclean # 仅删除无用的包
# aptitude clean     # 删除所有的包

6.4.9 记录/拷贝系统配置

对软件包选择情况进行本地备份:

$ dpkg --get-selections "*" >myselections   # 或使用 \*

"*" 使 myselections 包含那些被指定“完全删除(purge)”的文件。

你可将这个文件发送到另一台电脑并在那儿按文件中的选择进行软件包安装。

# dselect update
# dpkg --set-selections <myselections
# apt-get -u dselect-upgrade    # 或者 dselect install

6.4.10 向 breezy 系统引入软件包

对 breezy 系统进行部分升级,在软件运行环境中重新编译源码的确是个诱人的想法,这样可以避免由于关联关系不得不对大量软件包升级。首先,将下列镜像源加入 /etc/apt/sources.list:

deb-src http://archive.ubuntu.com/ubuntu dapper \
main multiverse restricted universe
deb-src http://archive.ubuntu.com/ubuntu edgy \
main multiverse restricted universe

由于屏幕输出的限制,上述每条 deb-src 命令均分成了 2 行,实际上在 sources.list 中它们均为单行。

然后下载源码并在本地生成软件包:

$ apt-get update  # 更新软件包搜索列表
$ apt-get source package
$ dpkg-source -x package.dsc
$ cd package-version
... 查找需要的软件包(编译所需的关联包列在.dsc文件中)并安装它们,
你还需要“fakerroot”软件包。

$ dpkg-buildpackage -rfakeroot 

……或者(没有签名)
$ dpkg-buildpackage -rfakeroot -us -uc # 如果需要,再使用“debsign”

……然后安装
$ su -c "dpkg -i packagefile.deb"

通常,需要安装一些带 “-dev” 后缀的软件包以满足关联关系。debsign 在 devscripts 软件包中。auto-apt 可以轻松解决这些关联问题。请使用 fakeroot,如是没有必要,就别使用 root 帐号。

现在,这些关联问题已被简化。例如,编译 pine 源码包:

# apt-get build-dep pine
# apt-get source -b pine

6.4.11 本地软件包文件

为了创建与 APT 和 dselect 系统兼容的本地软件包文件,需要创建 Packages,包中文件要放在特定的目录树中。

Ubuntu 官方包文件喜欢存放于本地 deb 仓库,下面就来创建仓库:

# aptitude install dpkg-dev
# cd /usr/local
# install -d pool # 软件包存放的物理地址
# install -d dists/edgy/main/binary-i386
# ls -1 pool | sed 's/_.*$/ priority section/' | uniq > override
# 编辑 override # 调整 priority and section
# dpkg-scanpackages pool override /usr/local/ \
> dists/edgy/main/binary-i386/Packages
# cat > dists/unstable/main/Release << EOF
Archive: edgy
Version: 3.0
Component: main
Origin: Local
Label: Local
Architecture: i386
EOF
# echo "deb file:/usr/local unstable main" \
>> /etc/apt/sources.list

还有一种快速但是肮脏的方法来创建本地 deb 仓库:

# aptitude install dpkg-dev
# mkdir /usr/local/debian
# mv /some/where/package.deb /usr/local/debian
# dpkg-scanpackages /usr/local/debian /dev/null | \
gzip - > /usr/local/debian/Packages.gz
#  echo "deb file:/usr/local/debian ./" >> /etc/apt/sources.list

在 /etc/apt/sources.list 中设置相应镜像源入口地址,就可以通过 HTTP 或 FTP 方式远程访问存放在其中的包文件了。


6.4.12 转换或安装外来的二进制软件包

alien 可将其它格式的二进制软件包如 Redhat 的 rpm、Stampede 的 slp 、Slackware 的 tgz 和 Solaris 的 pkg 等转化成 Ubuntu 的 deb 格式软件包,如果你想在自己的系统上使用别的 Linux 发行版中的软件包,可使用 alien 将它转化成系统首选的软件包格式后安装。alien 还支持 LSB 的软件包。


6.4.13 自动安装命令

auto-apt 是一种请求式软件包安装工具。

$ sudo auto-apt update
... 升级数据库
$ auto-apt -x -y run
进入 auto-apt 模式:/bin/bash
退出这个命令继而退出 auto-apt 模式。
$ less /usr/share/doc/med-bio/copyright # 访问不存在的文件
... 安装提供了这个文件的软件包。
... 同样安装依赖的包

6.4.14 校验已安装的软件包

debsums 可以校验已安装软件包的 MD5 编码,对某些软件包没有可用的 MD5 编码,系统管理员可使用一个临时的解决办法:

# cat >>/etc/apt/apt.conf.d/90debsums
DPkg::Post-Install-Pkgs {"xargs /usr/bin/debsums -sg";};
^D

per Joerg Wendland [email protected] (untested).


6.4.15 优化 sources.list

简而言之,我尝试过用各种优化方法来创建 sources.list,但任何一种方法对我这个住在美国的人来说都没有明显的改善。最后我还是用 apt-setup 手工选择近一点的站点。

apt-spy 会根据站点回应时间和带宽自动创建 sources.list。netselect-apt 会创建一个更完整的 sources.list 文件,但它使用更落后的方法来选择镜像站点(比较 ping 时间)。

# aptitude install apt-spy
# cd /etc/apt ; mv sources.list sources.list.org
# apt-spy -d dapper -l sources.apt

6.5 其他 Ubuntu 的特性


6.5.1 dpkg-divert 命令

使用文件转移(diversions)的方法可以强令 dpkg 将文件安装到 转移 目录而非默认目录。对于某个引起冲突的文件,可以在 Ubuntu 软件包脚本中使用 Diversions 将它安装到别的目录。系统管理员还可以使用 diversion 来重载软件包配置文件,或者用来保留某些旧配置文件(这些文件没有在 conffiles 中登记)当安装新版软件时这些文件会被覆盖。(参阅 [[UbuntuHelp:../ch-system.zh-cn.html#s-conffile| 保存本地配置, 第 2.2.4 节]])。

# dpkg-divert [--add]  filename # 添加 “转移”
# dpkg-divert --remove filename # 删除 “转移”

记住,不到万不得已不要使用 dpkg-divert。


6.5.2 equivs 软件包

如果你从源码编译程序,最好将它做成本地 Ubuntu 化软件包(*.deb)。最新的方法是使用 equivs。

Package: equivs
Priority: extra
Section: admin
Description: Circumventing Debian package dependencies
This is a dummy package which can be used to create Debian
packages, which only contain dependency information.

6.5.3 Alternative 命令

如果想用 vi 来启动 vim,请用 update-alternatives:

# update-alternatives --display vi
...
# update-alternatives --config vi
Selection    Command
-----------------------------------------------
1        /usr/bin/elvis-tiny
2        /usr/bin/vim
*****+    3        /usr/bin/nvi

Enter to keep the default[*], or type selection number: 2

Ubuntu alternatives 系统中的这些项目,都是以符号连接的形式存放在 /etc/alternatives 下的。

想设置你喜爱的 X window 环境,执行 update-alternatives 来指定 /usr/bin/x-session-manager 和 /usr/bin/x-window-manager。详情参阅 [[UbuntuHelp:../ch-tune.zh-cn.html#s-custom-x| 自定义 X 会话, 第 9.4.5.1 节]]。

/bin/sh 是指向 /bin/bash 或 /bin/dash 的链接。想兼容旧的 Bash 脚本,使用 /bin/bash 比较保险,但更好还是使用 /bin/dash,因为它更符合 POSIX 标准。升级到 2.4 版 Linux 内核,系统一般将它设置为 /bin/dash。


6.5.4 运行级别 Runlevel

安装好之后,大部分 Ubuntu 软件包的服务被设定为在 runlevel 2 到 5 时运行。所以,在没有定制过的 Ubuntu 系统中,runleve 2、3、4、5、6 是没有区别的Ubuntu 保留这些给本地管理员使用。 [[UbuntuHelp:../ch-system.zh-cn.html#s-custombootscripts| 自定义运行级别, 第 2.4.3 节]] 说明如何定制 runlevels。 这样的 runlevels 系统和其他流行的 GNU/Linux 发行版本完全不同。 你可能要做的改变之一就是取消 runlevel 2 上的 xdm 和 gdm,使得在完成启动之后 X 显示管理去不会自动启动;然后你可以通过切换到 runlevel 3 来启动 X 显示管理器。

参阅 [[UbuntuHelp:../ch-system.zh-cn.html#s-runlevels| 运行级别, 第 2.4.2 节]] 来获得更多关于 runlevels 的信息。


6.5.5 停止 daemon 服务

Ubuntu 发行版非常注重系统安全,并期望系统管理员能担此重任。它将系统的易用性放在了第二位,许多 daemon 服务都定位在最高安全级别,因而,默认安装状态下系统只启动最少的(甚至没有)可用的服务。

如果拿不定把握(有关 Exim、DHCP...),可执行 ps aux 或检查 /etc/init.d/* 和 /etc/inetd.conf 下的内容,还可以使用 [[UbuntuHelp:../ch-tune.zh-cn.html#s-loginctrl| 用 PAM 来控制登录, 第 9.2.1 节]] 中提到的方法检查 /etc/hosts.deny。pidof 命令也很有用(参阅 pidof(8))

在 Ubuntu 系统中,默认状态下 X11 不允许 TCP/IP(远程)连接。参阅 [[UbuntuHelp:../ch-tune.zh-cn.html#s-xtcp| 在 TCP/IP 中使用 X, 第 9.4.6 节]],但是使用 SSH 进行 X 传送是允许的,参阅 [[UbuntuHelp:../ch-tune.zh-cn.html#s-xssh| 联接远程的 X 服务器 – ssh, 第 9.4.8 节]]。





来源

Debian 参考手册

CVS, 星期日 三月 12 12:53:54 UTC 2006

Osamu Aoki osamu#at#debian.org

译者:

Hao "Lyoo" Liu iamlyoo#at#163.net

Ming Hua minghua#at#rice.edu

肖盛文 atzlinux#at#163.com

Haifeng Chen optical.dlz#at#gmail.com

解彦博 xieyanbo#at#gmail.com

easthero easthero#at#gmail.com

作者, 第 A.1 节

Copyright (c) 2001–2005 by Osamu Aoki <osamu#at#debian.org>.

Copyright (Chapter 2) (c) 1996–2001 by Software in the Public Interest.