Gentoo Linux/MIPS手册
内容:
-
安装Gentoo
在这部分中,你将学习如何在你的系统中安装Gentoo。
-
关于如何安装Gentoo Linux
本章介绍了本手册所讲解的安装方式。
-
选择合适的安装方式
你可以以很多不同方式来安装Gentoo。本章解释了如何使用MIPS Netboot镜像来安装Gentoo。
-
配置网络
要下载最新的源代码,你要先设置好网络。
-
预备磁盘
为了能够安装Gentoo,你必须创建必要的分区。本章解释了怎样将磁盘分区,以便以后使用。
-
安装Gentoo安装文件
安装Gentoo是通过一个stage3文件来进行的。本章我们将描述如何解压stage3文件和配置Portage。
-
安装Gentoo基本系统
在安装和配置stage3之后,最终的结果将是你已经有了一个Gentoo基础系统供您差遣。本章将描述如何达到那个状态。
-
配置内核
Linux内核是任何一个发行版本的核心。这一章节将说明如何配置内核。
-
配置系统
你需要编辑一些重要的配置文件。在这一章中将对这些重要的配置文件作概述,并且介绍如何配置它们。
-
安装必要的系统工具
在这一章中我们将帮助你选择并安装一些重要的工具。
-
配置引导程序
在Silicon Graphics机器和Cobalt服务器上,都需要使用引导程序来加载内核。本节解释了如何设置SGI机器的arcboot/arcload和Cobalt服务器的colo。
-
结束Gentoo的安装
您几乎已经完成了。接下来我们只需要为您的系统创建一个(或更多)用户就可以了。
-
下一步该做什么?
现在你已经拥有了你自己的Gentoo操作系统了,但是下一步该做什么呢?
-
使用Gentoo
学习如何使用Gentoo:安装软件、更改变量、改变Portage行为方式等。
-
Portage入门
本章节阐述了一些“简单”的步骤,这些步骤是用户要维护自己系统中的软件所必须知道的。
-
USE标记
USE标记是Gentoo非常重要的一部分。在本章里,你将学习设定USE标记以及了解USE标记如何影响你的系统构建。
-
Portage特性
学习Portage所拥有的特性,比如对分布式编译的支持,以及ccache等等。
-
初始化脚本
Gentoo使用一种特殊的初始化脚本格式,有很多特色,包括由依赖关系驱动的决定和虚拟初始化脚本。本章会解释所有这些特色以及如何与这些脚本打交道。
-
环境变量
使用Gentoo你可以很容易地管理系统的环境变量。本章将教你如何去做,并描述一些常用的变量。
-
使用Portage
“使用Portage”深入全面介绍了Gentoo的软件管理工具Portage的功能。
-
文件和目录
当你想要深入了解Portage的时候,你需要知道它将文件和数据放在了什么地方。
-
通过变量来配置
Portage所有的设置都可以通过不同的变量来完成,你可以设置在配置文件中或者设置成一个环境变量。
-
使用多个软件分支
Gentoo根据软件的稳定性和架构支持将它们划分在不同的分支中。“使用多个软件分支”告诉你这些分支是如何配置的以及如何在个别情况下使用其他分支的软件。
-
Portage附加工具
您可以通过Portage提供的一些附加工具为您的Gentoo旅程带来更多的快乐。通过下文的阅读你会学会如何使用dispatch-conf和其他的一些工具。
-
改造Portage树
“改造Portage树”提供给你一些关于如何使用你自己的Portage树,如何只同步你想要的分类,加入自己的软件包等等的心得技巧。
-
Gentoo网络配置
一份全面的Gentoo网络指南。
-
新手上路
本指南可让你的网卡在大多数通用环境下迅速设置好并运行起来
-
高级配置
这里,我们将学习这些配置是如何起作用的——对于将来学习模块化网络来说,这是必不可少的知识。
-
模块化网络
Gentoo为您提供了灵活的网络支持——本节将告诉你怎样选择不同的DHCP客户端程序,如何配置网络的绑定和桥接以及配置VLAN等等相关的知识。
-
无线网络
配置无线网络并不是一件简单的事情。希望我们能让您的无线网络正常工作。
-
附加功能
如果你喜欢冒险的感觉,你可以在网络中加上自己的功能。
-
网络管理
本章是为笔记本电脑用户和频繁切换网络的用户准备的。
A. 安装Gentoo
1. 关于如何安装Gentoo Linux
1.a. 介绍
欢迎!
首先,欢迎使用Gentoo。你将进入一个多选择和高性能的世界。Gentoo就意味着选择。当你安装Gentoo时,你将会清楚的了解到——你能够选择怎样编译软件,如何安装Gentoo,以及使用哪种系统日志程序等等。
Gentoo是一个快速和现代化的元发行版,拥有简洁灵活的设计理念。Gentoo基于自由软件构建,它不会对用户隐瞒任何底层细节。Portage是Gentoo使用的软件包管理系统,由于它是使用Python语言编写的,因此你可以轻松地查看和修改源代码。Gentoo的软件包系统使用的是源代码(尽管也包含对预编译的软件包的支持),配置Gentoo使用的也都是标准的文本文件。换句话说就是,开放无处不在。
希望您能明白的一点是Gentoo的根本在于选择,这一点非常重要。我们会尽力做到不强加给用户任何东西,如果你觉得被强迫安装了任何你不喜欢的东西,请请提交一个bug报告。
安装的步骤有哪些?
Gentoo的安装可以被分成10个步骤,从第2章到第11章,每一步都会令系统进入一个新的状态:
-
第一步后,你已准备就绪,可以安装Gentoo了
-
第二步后,你已为安装Gentoo准备好了网络连接
-
第三步后,你的硬盘已初始化完毕,等待Gentoo的安装
-
第四步后,你的安装环境已经准备好了,并准备chroot到一个新的系统环境中
-
第五步后,一些核心的软件包安装完毕,这在所有的Gentoo安装中都是相同的
-
第六步后,你已经编译好了你的Linux内核
-
第七步后,你已经写好绝大多数的Gentoo系统配置文件
-
第八步后,必要的系统工具(你可以从列表中选择)已经安装完毕
-
第九步后,你选择的启动引导程序已经安装配置好了,并且你已经登录了你新的Gentoo系统中
-
第十步后,你就可以在你的Gentoo linux系统中探索了
当你面临某个选择时,我们会尽力为你解释它的利弊。我们首先会介绍一个默认的选项,这在标题中会以“默认:”标识出来。剩下的则会被标注为:“备选:”千万不要认为默认选项是我们推荐的,这只是我们认为绝大多数用户会采用的。
有时候你也可以做一些可选的步骤。这样的步骤会被标注为“可选:”,当然这些步骤对于安装Gentoo来说就不是必须的。然而,有些可选的步骤依赖于你之前所做出的决定。我们将会在你需要做这样决定以及可选步骤出现的时候提醒你。
我有哪些选择?
你可以通过很多不同的方法来安装Gentoo。你可以下载我们的安装光盘安装,可以从已经安装好的另外一个发行版上安装,可以从一张可引导光盘上安装(比如Knoppix),也可以从网络启动环境或从一张恢复软盘上安装等等。
这份文档讲解了如何使用Gentoo安装光盘或者在某些情况下使用网络启动来安装Gentoo。这种安装方式假设你想要使用最新的软件包。如果你想要进行无网络安装,你应该阅读Gentoo 2008.0手册,那里面包含无网络安装指南。
请注意,如果你打算用GRP(Gentoo参考平台,一套供即时使用的预编译软件包),你一定要依照Gentoo 2008.0手册来安装。
关于其他安装方法请参考我们的其他安装指南。我们还提供了Gentoo安装技巧和窍门,也值得一读。如果你觉得本安装指南太过详细,你还可以使用我们文档资源中的可用于你的硬件架构的快速安装手册。
你也有这些选择:你可以从头编译整个系统,或使用Gentoo预编译软件包以在很短时间内便装好一个可用的系统。当然,你也可以使用折中的方案,从已完成一半的系统开始安装。
碰到问题?
如果你在安装过程中(或是在安装文档中)碰到问题,请到bug追踪系统检查这是否是已知的bug。如果没有,请创建一个bug报告,然后我们来解决它。大家不要害怕负责解决(你的)bug的开发人员,他们通常是不会吃人的。
需要注意的是,虽然你当前阅读的文档是针对某一特定的硬件架构的,但是它还是会包含对其他平台架构的引用。这是因为Gentoo手册中的绝大部分的源代码是对所有硬件架构都适用的(目的是减少重复劳动和节省有限的开发资源)。我们会努力把这种负面影响减少到最小以避免混淆。
如果你不能确定你的问题是否是一个使用者问题(尽管你已经仔细地阅读了文档但仍然出了错)还是一个软件问题(尽管我们已经仔细地测试了安装步骤/文档但仍然出了错),我们欢迎你到irc.freenode.net的#gentoo(英文)或是#gentoo-cn(中文)提问。当然,如果你有其他方面的关于Gentoo的问题,我们也欢迎:)
如果你有关于Gentoo的问题,请到我们的Gentoo文档查看常见问题。你也可以浏览我们论坛中的FAQs。如果你还是无法找到答案,那么就去irc.freenode.net中我们的#gentoo频道寻找吧,我们中的一些狂热者会一直呆在IRC里的:-)
2. 选择合适的安装方式
2.a. 硬件需求
介绍
在开始之前,我们首先列出安装Gentoo的硬件需求。
硬件需求
CPU (big endian) |
MIPS3、MIPS4、MIPS5或者MIPS64级CPU |
CPU (little endian) |
MIPS4、MIPS5或者和MIPS64级CPU |
内存 |
128MB |
硬盘空间 |
3.0GB(不包括交换分区) |
交换分区 |
至少256MB |
你也应该查看一下我们的网站上的MIPS硬件要求文档。
2.b. 安装说明
有关处理器架构的说明
在很多架构上,处理器都经过了几代的发展,每一代新处理都是在前一代处理器的基础上构建而来。MIPS也不例外。MIPS架构包含了好几代CPU。为了正确的选择你的netboot镜像stage tarball和CFLAGS,你需要知道你的系统的CPU属于哪个家族。这些所谓的家族被称为Instruction Set Architecture。
MIPS ISA |
32或64位 |
包括的CPU |
MIPS 1 |
32位 |
R2000,
R3000
|
MIPS 2 |
32位 |
R6000
|
MIPS 3 |
64位 |
R4000,
R4400,
R4600,
R4700
|
MIPS 4 |
64位 |
R5000,
RM5000,
RM7000,
R8000,
R9000,
R10000,
R12000,
R14000,
R16000
|
MIPS 5 |
64位 |
目前没有
|
MIPS32 |
32位 |
AMD Alchemy系列,4kc、4km等等……有好几个属于MIPS32 ISA的版本。
|
MIPS64 |
64位 |
Broadcom SiByte SB1、5kc……等等……有好几个属于MIPS64 ISA的版本。
|
注意:
这个MIPS5ISA级别是Silicon Graphics早在1994年设计的,不过从来没有应用到实物CPU里。它继续在MIPS64 ISA里做为它的一部分存在着。
|
注意:
经常的,MIPS32和MIPS64 ISA会被人们所误解。MIPS64 ISA级别实际上是MIPS5 ISA的超集,所以它包括了MIPS5和之前的ISA的所有指令。MIPS32是MIPS64的32位子集,它的存在是由于大多数程序只需要32位的处理能力。
|
还有,另外一个需要掌握的概念是字节序(endianness)。字节序就是一个字在内存里保存的方式。一个字的保存方式有big endian(最高位字节在前),和little endian(最低位字节在前)两种。Intel x86机器是little endian的,不过Apple和Sparc机器是big endian。在MIPS上,两种都有可能。为了把它们区分开,我们在架构名后加上el来表示little endian。
架构 |
32或64位 |
字节序 |
包括的机器 |
mips |
32位 |
big endian |
Silicon Graphics |
mipsel |
32位 |
little endian |
Cobalt服务器 |
mips64 |
64位 |
big endian |
Silicon Graphics |
mips64el |
64位 |
little endian |
Cobalt服务器 |
如果你想学习更多有关ISA的知识,下面的网站可能有用。
Stage3 Tarball
stage3是一个含有最小Gentoo环境的压缩包,适合按照手册继续安装Gentoo。以前,Gentoo手册介绍了使用3种stage的安装方法。虽然Gentoo仍然提供stage1和stage2,但在官方的安装指南中只使用stage3。如果你对stage1和stage2感兴趣,请阅读Gentoo FAQ中的如何使用stage1或stage2安装Gentoo?
2.c. Netboot概述
在这一节中,我们将讲解要想成功的网络启动Silicon Graphics工作站或者Cobalt服务器,你需要做些什么。这只是一个简单的指引,内容不是很详尽,要获取更多信息,推荐您阅读无盘HOWTO。
你所需要的:取决于具体的机器,你将需要一些特定的硬件才能成功netboot并安装Linux。
-
基本需求:
- DHCP/BOAMD Alchemy系列,4kc、4km等等……有好几个属于MIPS32 ISA的版本。OTP服务器(推荐ISC DHCPd)
- 耐心——很多耐心
-
Silicon Graphics工作站需要:
- TFTP服务器(推荐tftp-hpa)
-
如果你想要或需要使用串口终端:
-
MiniDIN8 --> RS-232串口线(只有IP22和IP28系统需要)
- Null-modem线
- VT100或者ANSI兼容终端,支持9600波特率
-
Cobalt服务器(不是早期的Qube)需要:
- NFS服务器
- Null-modem线
- VT100或者ANSI兼容终端,支持115200波特率
注意:
SGI机器的串口使用MiniDIN 8接口。很显然Apple modem线正好可用来做串口线,不过随着近来越来越多的Apple机器转而使用USE和内置modem,这种线已经很难找了。Linux/MIPS Wiki上有一个布线图,而且大多数电子商店里应该可以买到所需的接头。
|
注意:
至于终端,可以是一个真正的VT100/ANSI终端,或者可以是PC上运行的终端模拟软件(比如HyperTerminal,Minicom,seyon,Telex,xc,screen——任何你所喜欢的)。这台机器是什么平台都无所谓——只要有一个能用的RS-232串口和合适的软件。
|
注意:
注意本指引不涵盖早期的Qube。早期的Qube服务器在它的默认配置中缺少串口,所以在上面安装Gentoo是不可能的,除非在改锥和替代机器的帮助下。下面的网站上有一个如何在这种机器上安装Gentoo的指引。http://www.metzner.org/projects/qube/
|
设置TFTP和DHCP——一个简单的指引
好了,工已利其器,现在该善其事了。就像前面提到的——这不是一个完整的指引,这只是可以完成安装的一个基本配置。你可以使用本指引来完成你的第一次安装,也可以使用本指引的建议来修改你目前的安装步骤来支持netboot。
值得注意的是这些服务器不一定必须运行Gentoo Linux,你也可以运行FreeBSD或者其他类Unix系统。不过,本指引假设你要运行Gentoo Linux。如果需要,你也可以在其他机器上运行TFTP/NFS,而不在DHCP服务器上运行。
警告:
Gentoo/MIPS团队不能帮你把其他操作系统设定为netboot服务器。如果你选择了其他OS,我们假设你知道你自己在做什么。
|
第一步——配置DHCP。为了让ISC DHCP守护进程可响应BOOTP请求(就像SGI和Cobalt BOOTROM所要求的),你需要在所使用的地址范围上启用动态BOOTP;然后为每一个客户端设定一个条目包括指向启动镜像的指针。
代码 3.1: 安装ISC的DHCP |
# emerge dhcp
|
安装完后你要创建/etc/dhcp/dhcpd.conf。这里有一个基本的配置可以让你很快上路。
代码 3.2: 一个基本的dhcpd.conf |
ddns-update-style none;
subnet 192.168.10.0 netmask 255.255.255.0 {
pool {
range dynamic-bootp 192.168.10.1 192.168.10.254;
}
option domain-name-servers 203.1.72.96, 202.47.56.17;
option routers 192.168.10.1;
authoritative;
allow bootp;
}
|
使用这个配置,我们可以在subnet子句中添加任意多个客户端。后面我们将讲解需要添加些什么内容。
下一步——配置TFTP服务器。建议你使用tftp-hpa,因为这是唯一已知可以正常工作的TFTP服务器。按照下面的指令来安装它。
代码 3.3: 安装tftp-hpa |
# emerge net-ftp/tftp-hpa
|
这将会为你创建/tftproot供你存放netboot镜像。如果你愿意你可以把它移到别处。本指引将假设你使用默认位置。
2.d. Netboot SGI工作站
下载Netboot镜像
根据你要安装的系统的不同,我们提供了几个可能的镜像供下载。它们都是根据系统类型和CPU而命名的。机器类型如下:
代号 |
机器 |
IP22 |
Indy, *Indigo 2, Challenge S |
IP26 |
*Indigo 2 Power |
IP27 |
Origin 200, Origin 2000 |
IP28 |
*Indigo 2 Impact |
IP30 |
Octane |
IP32 |
O2 |
注意:
* 一个常见的错误是混淆IRIS Indigo(IP23配置有R3000 CPU或者IP20配置有R4000
CPU,它们都不运行Linux),Indigo 2(IP22,可以运行Linux),基于R8000的Indigo 2 Power(根本不能运行Linux)和基于R10000的Indigo 2 Impact(IP28,高度实验性的)。请记住它们是不同的机器。
|
还有在文件名里,r4k指代R4000系列处理器,r5k指代R5000,rm5k指代RM5200,还有r10k指代R10000。你可以在Gentoo镜像里找到这些镜像。
一个SGI客户端的DHCP配置
当你下载完文件后,把压缩的镜像放到你的/tftproot目录里。(使用bzip2 -d来解压缩)然后修改你的/etc/dhcp/dhcpd.conf文件,为你的SGI客户端添加条目。
代码 4.1: SGI工作站的dhcpd.conf片段 |
subnet xxx.xxx.xxx.xxx netmask xxx.xxx.xxx.xxx {
host sgi {
hardware ethernet 08:00:69:08:db:77;
next-server 192.168.10.1;
fixed-address 192.168.10.3;
filename "/gentoo-r4k.img";
}
}
|
内核选项
我们差不多完成了,不过还需要做一些小的调较。用root权限打开一个终端,键入下面的命令。
代码 4.2: 为了能让TFTP正常工作而对SGI机器做的一些修正 |
# echo 1 > /proc/sys/net/ipv4/ip_no_pmtu_disc
# echo "2048 32767" > /proc/sys/net/ipv4/ip_local_port_range
|
这样你的Linux服务器与SGI的PROM就应该能正常工作了。
启动你的守护进程……
现在,你已经可以启动守护进程了。键入下面的命令:
代码 4.3: 启动DHCP和TFTP守护进程 |
# /etc/init.d/dhcp start
# /etc/init.d/in.tftpd start
|
如果上一步没有出现任何错误,你就可以启动工作站了,然后继续按手册进行安装。不管什么原因,如果DHCP服务器没有启动起来,尝试在命令行执行“dhcpd”看看有什么反应——如果一切正常,它应该在后台启动,否则你会看到它的错误信息,以及紧挨着的“exiting。”
一个简单的验证tftp守护进程是否在运行的方法是键入下面的命令——如果你看到类似下面的输出——那么一切正常。
代码 4.4: 检查TFTPd正在运行 |
# netstat -al | grep ^udp
udp 0 0 *:bootpc *:*
udp 0 0 *:631 *:*
udp 0 0 *:xdmcp *:*
udp 0 0 *:tftp *:*
|
Netboot SGI机器
好了,所有的事情都准备就绪,DHCP和TFTP都已经正常运行。现在是时候启动SGI机器了。启动机器——当你在屏幕上看到“Running power-on diagnostics”,点击“Stop For Maintenance”或者按ESCAPE。你可以看到类似下面的菜单。像下面那样键入命令。
代码 4.5: SGI PROM维护菜单 |
Running power-on diagnostics
System Maintenance Menu
1) Start System
2) Install System Software
3) Run Diagnostics
4) Recover System
5) Enter Command Monitor
Option? 5
Command Monitor. Type "exit" to return to the menu.
>> bootp(): root=/dev/ram0
|
从这里开始,机器开始下载镜像,然后,大约20秒后,开始启动Linux。如果一切正常,你应该像下面显示的那样停在Busybox的ash shell处,然后就可以继续配置网络了。
代码 4.6: 当一切正常的时候…… |
init started: BusyBox v1.00-pre10 (2004.04.27-02:55+0000) multi-call binary
Gentoo Linux; http://www.gentoo.org/
Copyright 2001-2004 Gentoo Technologies, Inc.; Distributed under the GPL
Gentoo/MIPS Netboot for Silicon Graphics Machines
Build Date: April 26th, 2004
* To configure networking, do the following:
* For Static IP:
* /bin/net-setup <IP Address> <Gateway Address> [telnet]
* For Dynamic IP:
* /bin/net-setup dhcp [telnet]
* If you would like a telnetd daemon loaded as well, pass "telnet"
* As the final argument to /bin/net-setup.
Please press Enter to activate this console.
|
除错
如果机器不听话拒绝下载镜像,有两种可能,(1)你在某一步犯了错误,或者(2)它需要一点温柔的劝告。(不,把手里的大锤放下!)这里有一个检查列表:
-
dhcpd可以分配给SGI机器IP地址。你可以应该可以在系统日志里看到一些有关BOOTP的信息。tcpdump这里也是有用的。
-
你的tftp文件夹(一般是/tftproot)的权限设置正确——应该是全体可读的。
-
检查系统日志来查看tftp服务器报告了什么(可能是错误)
如果你已经检查了服务器上的所有的服务,在SGI机器上仍然得到超时等结果,尝试在终端键入下面的命令。
代码 4.7: 哄骗SGI PROM令其正常工作 |
>> resetenv
>> unsetenv netaddr
>> unsetenv dlserver
>> init
>> bootp(): root=/dev/ram0
|
2.e. 备选方法:Gentoo/MIPS SGI LiveCD
概览
在Silicon Graphics机器上,可以从光盘启动来安装操作系统。(比如IRIX就是这样装的)最近,用于装Gentoo的这样的可引导光盘的镜像也出现了。这些光盘的工作方式和IRIX的是一样的。
目前Gentoo/MIPS LiveCD只能用于配置有R4000和R5000系列CPU的SGI Indy,Indigo 2和O2工作站,不过其他平台在将来也可能支持。
你可以在你喜欢的Gentoo镜像的experimental/mips/livecd目录里找到可以下载的LiveCD镜像。
警告:
这些光盘目前仍然处于高度实验阶段。现在不能保证它一定可以用。你可以报告成功或失败到Bugzilla,论坛里的这个帖子或者#gentoo-mips IRC频道。我们期待着听到您的消息。
|
烧录LiveCD
一件值得注意的重要事项,SGI PROM不支持ISO9660格式,也不支持El Torito引导标准。这些CD镜像就像一个硬盘一样有SGI盘标,卷头里保存着启动镜像。所以,烧录这些CD镜像的时候必须要小心。
下面是一个命令示例,假设使用一个24倍速的IDE刻录机。如果你有一个SCSI刻录机,你可能需要修改dev参数。类似的还有speed参数——如果你碰到了麻烦,你可能需要降速。
代码 5.1: 使用cdrecord烧录 |
# bzip2 -d mips-livecd-prototype-rc2-20041027.img.bz2
# cdrecord -vv -pad speed=24 dev=ATAPI:0,0,0 -tao mips-livecd-prototype-rc2-20041027.img
|
注意:
在Windows里烧录这些光盘也是可能的,假设你的刻录软件只是不加分辨的照现有的样子烧录这些镜像。不过目前为之,还没有人成功的以这种方式烧录出可用的光盘。
|
注意:
如果你不知道该用什么作为dev的参数,以root身份运行cdrecord -scanbus——这将会告诉你你的刻录机的位置。
|
2.f. Netboot Cobalt服务器
netboot步骤概览
和SGI机器不同的是,Cobalt服务器用NFS来传输需要启动的内核。机器加电启动时,按住左右两个方向键。然后机器会尝试通过BOOTP来获得IP地址,通过NFS从服务器挂载/nfsroot目录,然后尝试下载并启动文件vmlinux_raq-2800.gz(文件名取决于型号),此文件应该是一个标准的ELF二进制文件。
下载Netboot镜像
在这个页面http://dev.gentoo.org/~redhatter/mips/cobalt/netboots/上,你可以找到使Cobalt启动运行所必需的启动镜像。你所需要的文件的名字是nfsroot-KERNEL-COLO-DATE-cobalt.tar——选择最新的一个然后像下面那样把它解压缩到/里。
代码 6.1: 解压缩nfsroot镜像 |
# tar -C / -xvf nfsroot-2.6.13.4-1.19-20051122-cobalt.tar
|
NFS服务器的配置
因为这台机器使用NFS来下载它的镜像,你需要在你的服务器上导出/nfsroot。如果你还没有做这一步,你需要安装net-fs/nfs-utils。
代码 6.2: 安装nfs-utils |
# emerge net-fs/nfs-utils
|
这一步完成后,把下面的内容放到你的/etc/exports文件里。如果你原因你可以设置更严格的限制。
代码 6.3: Export /nfsroot目录 |
/nfsroot *(ro,sync)
|
现在,当前面的完成后,你就可以启动NFS服务器了:
代码 6.4: 启动NFS服务器 |
# /etc/init.d/nfs start
|
如果现在NFS服务器已经在运行了,你可以告诉它让它用exportfs再查看一下exports文件。
代码 6.5: Export一个新的文件系统 |
# exportfs -av
|
Cobalt机器的DHCP配置
现在,DHCP的配置是比较简单直接的。把下面的内容加入你的/etc/dhcp/dhcpd.conf文件。
代码 6.6: Cobalt服务器的dhcpd.conf片段 |
subnet xxx.xxx.xxx.xxx netmask xxx.xxx.xxx.xxx {
host qube {
option root-path "/nfsroot";
hardware ethernet 00:10:e0:00:86:3d;
next-server 192.168.10.1;
fixed-address 192.168.10.2;
filename "default.colo";
}
}
|
启动你的守护进程……
现在,你已经可以启动守护进程了。键入下面的命令:
代码 6.7: 启动DHCP和NFS守护进程 |
# /etc/init.d/dhcp start
# /etc/init.d/nfs start
|
如果上一步没有出现任何错误,你就可以启动工作站了,然后继续按手册进行安装。不管什么原因,如果DHCP服务器没有启动起来,尝试在命令行执行“dhcpd”看看有什么反应——如果一切正常,它应该在后台启动,否则你会看到它的错误信息,以及紧挨着的“exiting。”
Netboot Cobalt机器
好了,所有的事情已经齐备,DHCP已经运行了,和NFS一样。现在是时候启动Cobalt机器了。连接好null modem线,把终端设置成波特率115200,8位,无奇偶校验位,一个停止位,VT100模拟。当这步完成后,在加电时按住左右两个方向键。
如果一切正常,背部面板应该显示“Net Booting”,你应该看到一些网络活动,紧接着CoLo开始启动。在后面板上,下拉菜单直到你看到“Network (NFS)”然后按回车。你应该可以在串口终端上观察到机器开始启动。
代码 6.8: 启动内核 |
elf: 80080000 <-- 00001000 6586368t + 192624t
elf: entry 80328040
net: interface down
CPU revision is: 000028a0
FPU revision is: 000028a0
Primary instruction cache 32kB, physically tagged, 2-way, linesize 32 bytes.
Primary data cache 32kB 2-way, linesize 32 bytes.
Linux version 2.4.26-mipscvs-20040415 (root@khazad-dum) (gcc version 3.3.3...
Determined physical RAM map:
memory: 08000000 @ 00000000 (usable)
Initial ramdisk at: 0x80392000 (3366912 bytes)
On node 0 totalpages: 32768
zone(0): 32768 pages.
zone(1): 0 pages.
zone(2): 0 pages.
Kernel command line: console=ttyS0,115200 root=/dev/ram0
Calibrating delay loop... 249.85 BogoMIPS
Memory: 122512k/131072k available (2708k kernel code, 8560k reserved, 3424k dat)
|
如果一切正常,您应该会停在Busybox的ash shell处,就想下面所显示的,然后你可以继续配置网络了。
代码 6.9: 当一切正常的时候…… |
VFS: Mounted root (ext2 filesystem) readonly.
Freeing unused kernel memory: 280k freed
init started: BusyBox v1.00-pre10 (2004.04.27-02:55+0000) multi-call binary
Gentoo Linux; http://www.gentoo.org/
Copyright 2001-2004 Gentoo Technologies, Inc.; Distributed under the GPL
Gentoo/MIPS Netboot for Cobalt Microserver Machines
Build Date: April 26th, 2004
* To configure networking, do the following:
* For Static IP:
* /bin/net-setup <IP Address> <Gateway Address> [telnet]
* For Dynamic IP:
* /bin/net-setup dhcp [telnet]
* If you would like a telnetd daemon loaded as well, pass "telnet"
* As the final argument to /bin/net-setup.
Please press Enter to activate this console.
|
除错
如果机器不听话拒绝下载镜像,有两种可能,(1)你在某一步犯了错误,或者(2)它需要一点温柔的劝告。(不,把手里的大锤放下!)这里有一个检查列表:
-
dhcpd是用来赋予Cobalt服务器IP地址的。你应该在系统日志里看到一些有关BOOTP请求的信息。tcpdump在这里也是有用的。
-
你的/nfsroot文件夹的权限设置正确。(应该是全体可读的)
-
确保NFS服务器正在运行并且已经导出了/nfsroot目录。在服务器上用exportfs -v来检查。
3. 配置网络
3.a. 自动网络检测
能够自动检测到么?
如果你的系统接入一个拥有DHCP服务器的以太网,那么很可能网络配置已经自动设置好了。如果是这样,你就可以利用到安装盘中的许多网络命令,如ssh,scp,ping,irssi,wget和links。
如果网络已经为你配置好了,/sbin/ifconfig命令就能列出lo以外的一些网卡的信息,如eth0:
代码 1.1: 一个正常工作的网络配置的/sbin/ifconfig命令输出 |
# /sbin/ifconfig
eth0 Link encap:Ethernet HWaddr 00:50:BA:8F:61:7A
inet addr:192.168.0.2 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::50:ba8f:617a/10 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1498792 errors:0 dropped:0 overruns:0 frame:0
TX packets:1284980 errors:0 dropped:0 overruns:0 carrier:0
collisions:1984 txqueuelen:100
RX bytes:485691215 (463.1 Mb) TX bytes:123951388 (118.2 Mb)
Interrupt:11 Base address:0xe800
|
可选:配置网络代理
如果你是通过代理访问网络,就要在安装过程中设置代理信息。设置代理很容易:只要定义一个包含代理服务器信息的变量即可。
通常情况下只要将这个变量定义为代理服务器主机名。作为例子,我们假定代理名叫proxy.gentoo.org,端口为8080。
代码 1.2: 定义代理服务器 |
# export http_proxy="http://proxy.gentoo.org:8080"
# export ftp_proxy="ftp://proxy.gentoo.org:8080"
# export RSYNC_PROXY="proxy.gentoo.org:8080"
|
如果代理要求用户名和密码,请使用以下格式的变量:
代码 1.3: 添加用户名/密码到代理变量 |
http://用户名:密码@proxy.gentoo.org:8080
|
测试网络
ping一下你的ISP提供的DNS服务器(可于/etc/resolv.conf中找到)和一个任选的网站,以确定数据包传到了网上、DNS域名解析正常,等等。
代码 1.4: 进一步测试网络 |
# ping -c 3 www.gentoo.org
|
如果现在你的网络可用了,就可以略过本章的余下部分,进入下一章预备磁盘。如果没有,请接下去阅读。
3.b. 自动网络配置
如果网络没有马上配置好,一些安装介质允许你使用net-setup(普通或无线网络),pppoe-setup(ADSL用户)或pptp(PPTP用户——x86、amd64、alpha、ppc和ppc64平台可用)来继续配置。
如果你的安装介质没有提供这些工具或者你的网络还是不能运行,请阅读手动配置网络。
默认:使用net-setup
如果网络没有自动配置好,最简单的配置方法是执行net-setup脚本:
代码 2.1: 执行net-setup脚本 |
# net-setup eth0
|
net-setup会问你一些关于你的网络环境的问题。全部回答完之后,你就能拥有一个正常工作的网络连接。按照前面叙述的方法测试一下网络连接。如果测试结果正常,恭喜!现在你已准备好开始安装Gentoo了。略过本章的余下部分并进入预备磁盘。
如果网络还不能配置好,请继续阅读手动配置网络。
备选:使用PPP
假如你通过PPPoE连接internet,安装盘(所有版本)中包含的ppp工具会让事情变得简单。使用所提供的pppoe-setup脚本来配置网络。它会提示你输入一些信息,包括连接到你的adsl调制解调器的网络设备、用户名和密码、DNS服务器的IP以及是否需要一个基本的防火墙。
代码 2.2: 使用ppp |
# pppoe-setup
# pppoe-start
|
如果配置出错了,请仔细检查/etc/ppp/pap-secrets或/etc/ppp/chap-secrets,确保你在其中输入的用户名和密码无误,并确定使用了正确的以太网设备。如果网络设备不存在,必须加载适当的网络模块。这种情况下你应该继续阅读手动配置网络,我们在其中解释了如何加载适当的网络模块。
如果一切正常,请继续阅读预备磁盘。
备选:使用PPTP
如果你需要支持PPTP连接,可以使用我们的安装光盘中所提供的pptpclient。不过你必须首先确定配置没有问题。编辑/etc/ppp/pap-secrets或/etc/ppp/chap-secrets使其中包含正确的用户名/密码对:
代码 2.3: 编辑/etc/ppp/chap-secrets |
# nano -w /etc/ppp/chap-secrets
|
然后如果有必要,调整一下/etc/ppp/options.pptp。
代码 2.4: 编辑/etc/ppp/options.pptp |
# nano -w /etc/ppp/options.pptp
|
当做好了所有的配置,就请执行pptp(跟随一些不能在options.pptp中设置的选项)来连接服务器:
代码 2.5: 连接到一个“拨入”服务器 |
# pptp <服务器ip>
|
现在请继续阅读预备磁盘。
3.c. 手动配置网络
加载适当的网络模块
安装光盘在启动时,会尝试检测所有硬件设备并加载适当的内核模块(驱动程序)以支持你的硬件。绝大多数情况下,它都做得非常好。尽管如此,某些情况下它还是可能无法自动载入你需要的内核模块。
如果net-setup或pppoe-setup执行失败,那么很可能是没有一下子找到你的网卡。这意味着你将不得不手动加载适当的内核模块。
要找出我们为网络提供了哪些内核模块,请使用ls:
代码 3.1: 搜索所提供的模块 |
# ls /lib/modules/`uname -r`/kernel/drivers/net
|
如果找到了你的网卡的驱动程序,请使用modprobe来加载这个内核模块:
代码 3.2: 使用modprobe加载一个内核模块 |
# modprobe pcnet32
|
现在用ifconfig检查一下是否检测到你的网卡了。成功检测到的网卡会输出类似下面这样的信息:
代码 3.3: 测试网卡是否可用,成功 |
# ifconfig eth0
eth0 Link encap:Ethernet HWaddr FE:FD:00:00:00:00
BROADCAST NOARP MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
|
不过如果你得到如下错误信息,说明没有检测到网卡。
代码 3.4: 测试网卡是否可用,失败 |
# ifconfig eth0
eth0: error fetching interface information: Device not found
|
如果你的系统中存在多块网卡,分别名为eth0、eth1等等。确保你想要使用的那张网卡没有问题,并在阅读本文整篇文章时都记得使用它正确的名字。我们假定使用的是eth0这张网卡。
假如你现在拥有一张成功检测到的网卡,可以再试一试net-setup或pppoe-setup(现在应该能正常使用了)。不过对于用户中的喜欢刨根究底的人,我们会为你解释如何通过手动配置网络。
基于你的网络设置,请从以下列表中选择相应的章节继续:
使用DHCP
DHCP(动态主机配置协议)可以让你自动获得网络信息(IP地址、子网掩码、广播地址、网关以及域名服务器等)。只有在你的网络中拥有一台DHCP服务器时才能获得(或者你的网络服务提供商提供DHCP服务)。执行dhcpcd使网络接口自动获得这些信息:
代码 3.5: 使用dhcpcd |
# dhcpcd eth0
# dhcpcd -HD eth0
|
如果工作正常(尝试ping一些互联网上的服务器,比如Google),那么你就完全准备好继续下一步了。略过本章的余下部分并继续阅读预备磁盘。
预备无线网络接入
注意:
iwconfig命令仅在x86、amd64和ppc安装光盘中提供。不过在其他情况下,你仍可以按照linux-wlan-ng项目的介绍,来使无线扩展运作起来。
|
如果你正在使用一张无线(802.11)网卡,那么在继续任何一步之前你需要先配好无线设置。要查看当前的无线网卡设置,可以使用iwconfig。执行iwconfig会显示以下类似信息:
代码 3.6: 显示当前无线设置 |
# iwconfig eth0
eth0 IEEE 802.11-DS ESSID:"GentooNode"
Mode:Managed Frequency:2.442GHz Access Point: 00:09:5B:11:CC:F2
Bit Rate:11Mb/s Tx-Power=20 dBm Sensitivity=0/65535
Retry limit:16 RTS thr:off Fragment thr:off
Power Management:off
Link Quality:25/10 Signal level:-51 dBm Noise level:-102 dBm
Rx invalid nwid:5901 Rx invalid crypt:0 Rx invalid frag:0 Tx
excessive retries:237 Invalid misc:350282 Missed beacon:84
|
注意:
一些无线网卡的设备名可能为wlan0或ra0,而不是eth0。执行不带任何命令行参数的iwconfig以确定正确的设备名。
|
对大多数用户来说,可能只有两处设置需要重点修改,即ESSID(亦称无线网络名)或WEP密钥。如果前面列出的ESSID和AP地址正是你的无线AP的ESSID和地址,并且你不使用WEP,那么你的无线网络已工作正常。如果你需要修改你的ESSID或添加一个WEP密钥,可以参照下列命令:
注意:
如果你的无线网络使用的是WPA或者WPA2,你将需要使用wpa_supplicant。欲获取更多有关在Gentoo Linux里配置无线网络的信息,请阅读Gentoo手册中的无线网络一章。
|
代码 3.7: 修改ESSID和/或添加WEP密钥 |
# iwconfig eth0 essid GentooNode
# iwconfig eth0 key 1234123412341234abcd
# iwconfig eth0 key s:某密钥
|
然后可以使用iwconfig再次确认你的无线设置。一旦你配好无线设置,就可以继续配置下一节(理解网络术语)所述的IP级别的网络选项,或者可以使用前面所述的net-setup工具。
理解网络术语
注意:
如果你知道IP地址、广播地址、子网掩码和域名服务器,那你就可以略过本节并继续阅读使用ifconfig和route。
|
如果以上所做的全部失败,你将不得不手动配置你的网络。这其实一点也不难。不过,你需要熟悉一些网络术语,才能配置好网络令自己满意。读完本节之后,你将了解到什么是网关,子网掩码是作什么用的,广播地址是如何形成的,以及为什么需要域名服务器。
在一个网络中,所有主机都通过IP地址(互联网协议地址)来识别。一个这种地址是由四个0到255之间的整数组合成的。嗯,至少我们是这样认识它的。实际上,一个IP地址由32个比特(0和1)组成。让我们看一个例子:
代码 3.8: IP地址的一个例子 |
IP地址(整数): 192.168.0.2
IP地址(位): 11000000 10101000 00000000 00000010
-------- -------- -------- --------
192 168 0 2
|
在所有可访问到的网络里,这样的IP地址跟主机是一一对应的(比如你能够连接到的每台主机必须拥有一个唯一的IP地址)。为了区别一个网络内部和外部的主机,IP地址被分为两个部分:网络部分和主机部分。
子网掩码用来描述这种区分,它由一系列的1跟随着一系列的0组成。IP中映射在1上的部分为网络部分,另一部分为主机部分。照例,子网掩码可以描述为IP地址的形式。
代码 3.9: 区分网络/主机的例子 |
IP地址: 192 168 0 2
11000000 10101000 00000000 00000010
子网掩码: 11111111 11111111 11111111 00000000
255 255 255 0
+--------------------------+--------+
网络 主机
|
也就是说,192.168.0.14仍是我们的例子网络中的成员,而192.168.1.2就不是了。
广播地址是一个跟你的网络在同一个网段的IP地址,只是它的主机部分全部为1。你的网络中所有的主机都监听这个IP地址。它真正的用途是用来广播数据包。
代码 3.10: 广播地址 |
IP地址: 192 168 0 2
11000000 10101000 00000000 00000010
广播: 11000000 10101000 00000000 11111111
192 168 0 255
+--------------------------+--------+
网络 主机
|
为了能在互联网上冲浪,你必须知道是哪台主机在共享Internet连接。这台主机称为网关。由于它是一台普通主机,所以它有一个普通的IP地址(比如192.168.0.1)。
前面我们陈述了每台主机拥有它自己的IP地址。为了能够通过域名(而不是IP地址)连到这台主机,你需要一种服务,以将一个域名(如dev.gentoo.org)翻译成一个IP地址(如64.5.62.82)。这种服务称为域名服务。你必须在/etc/resolv.conf中定义必要的域名服务器以享用这种服务。
某些情况下,你的网关也作为域名服务器提供服务。否则就必须加入ISP提供的域名服务器。
总结一下,继续下一步之前你需要了解下列知识:
网络名词 |
范例 |
你的IP地址 |
192.168.0.2 |
子网掩码 |
255.255.255.0 |
广播 |
192.168.0.255 |
网关 |
192.168.0.1 |
域名服务器 |
195.130.130.5, 195.130.130.133 |
使用ifconfig和route
设置网络包括三个步骤。首先我们使用ifconfig为自己设置一个IP地址。然后使用route设置到网关的路由。最后我们通过将域名服务器的IP写入/etc/resolv.conf来结束整个过程。
为了设置一个IP地址,你需要先获得你的IP地址、广播地址和子网掩码。然后执行以下命令,用你的IP地址、广播地址和子网掩码分别替代${IP地址}、${广播}和${子网掩码}。
代码 3.11: 使用ifconfig |
# ifconfig eth0 ${IP地址} broadcast ${广播} netmask ${子网掩码} up
|
现在使用route设置路由。用你的网关IP地址代替${网关}:
代码 3.12: 使用route |
# route add default gw ${网关}
|
现在用你喜欢的编辑器(我们的例子中使用nano)打开/etc/resolv.conf:
代码 3.13: 创建/etc/resolv.conf |
# nano -w /etc/resolv.conf
|
现在使用下面的模板填写你的域名服务器。注意用适当的域名服务器地址替换${域名服务器1}和${域名服务器2}。
代码 3.14: /etc/resolv.conf模板 |
nameserver ${域名服务器1}
nameserver ${域名服务器2}
|
这就是全部了。现在通过ping一些互联网上的服务器(比如Google)来测试一下你的网络。如果一切正常,那就恭喜了。你现在已准备好开始安装Gentoo了。接下来请继续阅读预备磁盘。
4. 预备磁盘
4.a. 块设备介绍
块设备
我们要好好了解下Gentoo Linux以及普通Linux中有关磁盘方面的知识,包括Linux文件系统、分区和块设备。然后,一旦你熟悉了磁盘和文件的方方面面,我们将会指导你设置分区和文件系统,为你安装Gentoo Linux做好准备。
一开始我们先介绍块设备。最有名的块设备可能就是Linux系统中表示第一个IDE硬盘的/dev/sda。SCSI硬盘和Serial ATA硬盘都是/dev/sda。如果你正在使用内核里新的libata架构,即便IDE硬盘也会是/dev/sd*。如果你用的是旧的设备架构,你的第一个IDE硬盘将是/dev/hda。
上面介绍的块设备代表磁盘的抽象接口。用户程序可以使用这些块设备来与你的磁盘进行交互,而不用理会你的驱动器到底是IDE、SCSI还是其他的。程序可以把磁盘当作一系列连续的、可随机访问的512字节大小的块来访问。
分区
尽管在理论上可以使用一整块磁盘来安装你的Linux系统,但是在实际中几乎从不这样做。相反,整个磁盘块设备被分割成更小、更容易管理的块设备。它们被称为分区。
4.b. 设计分区方案
多少和多大?
分区的数目主要根据你的系统环境来决定。例如,如果你有很多用户,你可能更希望把你的/home目录独立出来,因为这样做可以增加安全性,备份起来也更容易。如果你安装Gentoo用来做邮件服务器,你的/var目录应该独立出来,因为邮件都存储在/var目录中。选择一个好的文件系统将最大限度地提高你的系统性能。游戏服务器应该把/opt目录独立出来,因为大多数游戏服务端软件都安装在那。理由也与/home目录类似:安全与备份。你一定要使/usr目录保持足够大:因为它将不仅包含大部分应用程序,而且Portage树本身就需要大约500M空间,这还不包括存储在其中的各种源代码包。
正如你所看到的,这完全取决于你想要达到什么目的。独立的分区或卷有以下优点:
-
你可以为每一个分区或卷选择最佳性能的文件系统
-
如果一个有问题的工具不停地向一个分区或卷写文件,也不会把你整个系统的可用空间 都用完
-
如果需要,可以减少文件系统检测的时间,因为多个检测可以并行的进行(尽管这个优势在多磁盘系统上比多分区系统上更为明显)
-
通过对一些分区的进行只读、nosuid(忽略setuid位)、noexec(忽略可执行位)等方式 挂载,安全性会大大增强
然而,多分区系统有一大缺点:如果配置的不合理,可能导致系统中一个分区有很大的空闲空间,而另一个没有空闲空间了。SCSI和SATA还有15个分区的限制。
4.c. 使用MIPS上的fdisk来为你的磁盘分区
SGI机器:创建一个SGI盘标
SGI系统里的所有磁盘都需要一个SGI盘标,它和Sun和MS-DOS盘标的功能类似——保存有关磁盘分区的信息。创建一个新的SGI盘标将会在磁盘上创建两个特殊的分区:
-
SGI卷头(第9分区):这个分区很重要。这是引导程序保存的地方,某些情况下还保存内核镜像。
-
SGI卷(第11分区):这个分区的目的类似于Sun盘标的第三个分区“Whole disk”。这个分区跨越整个磁盘,不要碰它。除了以某种未知方式帮助PROM(或者IRIX会以某些方式用到它)之外,它没有其他什么特殊用途。
警告:
SGI卷头必须从柱面0开始。否则,你将不能从这个磁盘启动。
|
下面是从fdisk里截取出来的片段。请阅读它并修改它以适应你的需要……
代码 3.1: 创建SGI盘标 |
# fdisk /dev/sda
Command (m for help): x
Expert command (m for help): m
Command action
b move beginning of data in a partition
c change number of cylinders
d print the raw data in the partition table
e list extended partitions
f fix partition order
g create an IRIX (SGI) partition table
h change number of heads
m print this menu
p print the partition table
q quit without saving changes
r return to main menu
s change number of sectors/track
v verify the partition table
w write table to disk and exit
Expert command (m for help): g
Building a new SGI disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content will be irrecoverably lost.
Expert command (m for help): r
Command (m for help): p
Disk /dev/sda (SGI disk label): 64 heads, 32 sectors, 17482 cylinders
Units = cylinders of 2048 * 512 bytes
----- partitions -----
Pt# Device Info Start End Sectors Id System
9: /dev/sda1 0 4 10240 0 SGI volhdr
11: /dev/sda2 0 17481 35803136 6 SGI volume
----- Bootinfo -----
Bootfile: /unix
----- Directory Entries -----
Command (m for help):
|
注意:
如果你的磁盘已经有了一个SGI盘标,那么fdisk不将允许再创建一个新的盘标。有两个方法可以解决这个问题。一个是创建一个Sun或者MS-DOS盘标,把改动写入磁盘,然后重启fdisk。第二个是用空数据覆盖分区表,用这个命令:dd if=/dev/zero of=/dev/sda bs=512 count=1。
|
把SGI卷头调整到正好的大小
重要:
这一步通常是需要的,因为fdisk里的一个bug。由于某些原因,卷头不能被正确的创建,结果是它开始和结束都是在柱面0。这将导致不能创建多个分区。为了解决这个问题……请接着读。
|
既然SGI盘标已经建立了,下面就可以定义分区了。上面的例子为你定义了两个分区。这两个是特殊分区,一般不要改动它。不过,为了安装Gentoo,我们将需要加载引导程序,可能还有多个内核镜像(取决于系统类型)直接到卷头里。卷头本身可以保存最多八个任意大小的镜像,每个镜像的名字八个字符。
把卷头变大的过程不是很简单;需要一点小技巧。因为fdisk的奇怪行为,我们不能简单的删除并重新添加卷头。在下面提供的例子里,我们将创建一个50MB的卷头,以及一个50MB的/boot分区。你的磁盘的实际布局可能与此不同,下面这个只是一个示例。
代码 3.2: 正确的改变SGI卷头的大小 |
Command (m for help): n
Partition number (1-16): 1
First cylinder (5-8682, default 5): 51
Last cylinder (51-8682, default 8682): 101
Command (m for help): d
Partition number (1-16): 9
Command (m for help): n
Partition number (1-16): 9
First cylinder (0-50, default 0): 0
Last cylinder (0-50, default 50): 50
|
如果你不确定怎样使用fdisk,看一看下面Cobalts的分区指令。概念是完全一样的——只是要记得不要动卷头和whole disk分区。
这些完成后,你就可以任意创建其他的分区了。当所有的分区划分完毕后,记得把交换分区的ID改为82,也就是Linux Swap。如果不改,ID将为83,Linux Native。
现在分区已经创建完毕,你可以继续创建文件系统。
Cobalt机器:为你的磁盘分区
在Cobalt机器上,BOOTROM期望看到一个MS-DOS主引导扇区,所以分区是相对简单的——实际上,这和在Inter x86机器上分区是一样的。不过你要记得一些事情。
-
Cobalt固件要求/dev/sda1是一个格式化为EXT2 Revision 0的Linux分区。不可以是EXT2 Revision 1!(Cobalt BOOTROM只能理解EXT2r0)
-
前面说到的分区的根目录里必须有一个gzip压缩的ELF镜像,vmlinux.gz,它将会作为内核被加载
因为这个原因,我建议创建一个大约20MB的/boot分区,格式化为EXT2r0,以供你在里面安装CoLo和你的内核。这样你就能在你的根文件系统上运行一个现代文件系统(EXT3或者ReiserFS)。
我下面将假设你已经创建了/dev/sda1以便后来加载作为/boot分区。如果你希望把它作为/,你需要记得PROM的要求。
好了,我们继续……要创建分区,你在命令行提示符处键入fdisk /dev/sda。你需要知道的主要命令有这些:
-
o:清除旧的分区表,开启一个新的空MS-DOS分区表
-
n:新分区
-
t:改变分区类型
- 欲改为Linux Swap键入82,改为Linux FS键入83
-
d:删除分区
-
p:显示分区表
-
q:退出——不改动旧分区表。
-
w:退出——把当前分区表写入磁盘。
代码 3.3: 为磁盘分区 |
# fdisk /dev/sda
The number of cylinders for this disk is set to 19870.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Command (m for help): o
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.
The number of cylinders for this disk is set to 19870.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
Command (m for help): p
Disk /dev/sda: 10.2 GB, 10254827520 bytes
16 heads, 63 sectors/track, 19870 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Device Boot Start End Blocks Id System
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-19870, default 1):
Last cylinder or +size or +sizeM or +sizeK (1-19870, default 19870): +20M
Command (m for help): p
Disk /dev/sda: 10.2 GB, 10254827520 bytes
16 heads, 63 sectors/track, 19870 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 40 20128+ 83 Linux
Command (m for help): n
Command action
e extended
p primary partition (1-4)
e
Partition number (1-4): 2
First cylinder (41-19870, default 41):
Using default value 41
Last cylinder or +size or +sizeM or +sizeK (41-19870, default 19870):
Using default value 19870
Command (m for help): n
Command action
l logical (5 or over)
p primary partition (1-4)
l
First cylinder (41-19870, default 41):<Press ENTER>
Using default value 41
Last cylinder or +size or +sizeM or +sizeK (41-19870, default 19870): +500M
Command (m for help): n
Command action
l logical (5 or over)
p primary partition (1-4)
l
First cylinder (17294-19870, default 17294): <Press ENTER>
Using default value 17294
Last cylinder or +size or +sizeM or +sizeK (1011-19870, default 19870): <Press ENTER>
Using default value 19870
Command (m for help): p
Disk /dev/sda: 10.2 GB, 10254827520 bytes
16 heads, 63 sectors/track, 19870 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Device Boot Start End Blocks ID System
/dev/sda1 1 21 10552+ 83 Linux
/dev/sda2 22 19870 10003896 5 Extended
/dev/sda5 22 1037 512032+ 83 Linux
/dev/sda6 1038 5101 2048224+ 83 Linux
/dev/sda7 5102 9165 2048224+ 83 Linux
/dev/sda8 9166 13229 2048224+ 83 Linux
/dev/sda9 13230 17293 2048224+ 83 Linux
/dev/sda10 17294 19870 1298776+ 83 Linux
Command (m for help): t
Partition number (1-10): 10
Hex code (type L to list codes): 82
Changed system type of partition 10 to 82 (Linux swap)
Command (m for help): p
Disk /dev/sda: 10.2 GB, 10254827520 bytes
16 heads, 63 sectors/track, 19870 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Device Boot Start End Blocks ID System
/dev/sda1 1 21 10552+ 83 Linux
/dev/sda2 22 19870 10003896 5 Extended
/dev/sda5 22 1037 512032+ 83 Linux
/dev/sda6 1038 5101 2048224+ 83 Linux
/dev/sda7 5102 9165 2048224+ 83 Linux
/dev/sda8 9166 13229 2048224+ 83 Linux
/dev/sda9 13230 17293 2048224+ 83 Linux
/dev/sda10 17294 19870 1298776+ 82 Linux Swap
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
#
|
现在分区已经创建完毕,你可以继续创建文件系统。
4.d. 创建文件系统
文件系统
有几种文件系统是可以使用的。ReiserFS、Ext2和Ext3在MIPS架构上是稳定的。其他的文件系统都是实验性质的。
ext2是经考验证明可靠的Linux文件系统,但是没有元数据日志,这意味这在启动系统时的ext2文件系统的日常检查相当耗时。现在相当一部分的新一代的日志文件系统都可以非常迅速检查一致性,因此比那些非日志文件系统更受欢迎。当你启动系统碰巧遇到文件系统状态不一致时,日志文件系统不会在那里耽搁很长时间。如果你要在一个很小的硬盘(小于4G)上装Gentoo,那么你需要在创建ext2文件系统时预留足够的inode,执行此命令mke2fs -T small /dev/<device>.
ext3是ext2文件系统的带日志版本,提供了元数据日志模式以快速恢复数据。此外还提供了其他增强的日志模式,如完整数据日志模式和有序数据日志模式。它使用了HTree索引,在几乎所有的情况下都能保持高性能。简而言之,ext3是非常好及可靠的文件系统。如果你要在一个很小的硬盘(小于4G)上装Gentoo,那么你需要在创建ext2文件系统时预留足够的inode,执行此命令mke2fs -T small /dev/<device>。
JFS是IBM的高性能日志文件系统。JFS是一个轻量级的、快速的和稳定的基于B+树的文件系统,在很多情况下都有很好的表现。
ReiserFS是基于B+树的文件系统,它有着非常全面的性能,特别时在处理很多小文件的时候,虽然会占用多一点CPU。ReiserFS相比其他文件系统显得受维护的不够。
XFS是一种带元数据日志的文件系统,它有一个健壮的特性集,并且对可伸缩性进行了优化。XFS似乎对各种各样的硬件问题显得不够宽容。
在分区上应用文件系统
要在分区或卷上创建文件系统,对于每种可能的文件系统都有专门的工具。
文件系统 |
创建命令 |
ext2 |
mke2fs |
ext3 |
mke2fs -j |
reiserfs |
mkreiserfs |
xfs |
mkfs.xfs |
jfs |
mkfs.jfs |
例如,要使启动分区(本例中的/dev/sda1)为ext2和根分区(本例中的/dev/sda3)为ext3,应该这样做:
代码 4.1: 在分区上应用文件系统 |
# mke2fs /dev/sda1
# mke2fs -j /dev/sda3
|
现在在你新建的分区(或逻辑卷)上创建文件系统。
警告:
如果你在Cobalt服务器上安装,记得/dev/sda1必须是EXT2 revision 0;所有其他文件系统(比如EXT2 revision 1、EXT3、ReiserFS、XFS、JFS还有其他的)都不行!你可以用这个命令来格式化:mke2fs -r 0 /dev/sda1。
|
激活交换分区
mkswap是创建和初始化交换分区的命令:
代码 4.2: 创建交换分区标志 |
# mkswap /dev/sda2
|
使用swapon命令来激活交换分区:
代码 4.3: 激活交换分区 |
# swapon /dev/sda2
|
使用上面提到的命令来创建和激活交换分区。
4.e. 挂载
现在你的分区都已经初始化了,并且安装了文件系统,是时候来挂载这些分区了。使用mount命令进行挂载。别忘记为每个你创建的分区建立所需的挂载目录。作为例子,我们来挂载根分区和启动分区:
代码 5.1: 挂载分区 |
# mount /dev/sda3 /mnt/gentoo
# mkdir /mnt/gentoo/boot
# mount /dev/sda1 /mnt/gentoo/boot
|
注意:
如果你希望/tmp目录在一个独立的分区上,确保在挂载之后修改它的权限:chmod 1777 /mnt/gentoo/tmp。这同样适用于/var/tmp目录。
|
我们还需要在/proc目录上挂载proc文件系统(内核的虚拟接口)。但是,我们首先需要把我们的文件放到分区上。
请继续阅读安装Gentoo安装文件。
5. 安装Gentoo安装文件
5.a. 安装一个Stage Tarball
正确设置日期/时间
在继续之前,你需要检查和更新系统日期/时间。未正确设置的时钟可能会在将来导致奇怪的结果!
确认当前日期/时间,请运行date:
代码 1.1: 确认日期/时间 |
# date
Fri Mar 29 16:21:18 CEST 2005
|
如果显示的日期/时间不正确,可以使用date MMDDhhmmYYYY命令(MM是月,DD是日,hh是时,mm是分,YYYY是年)来更新它。在这一步,你应该使用UTC时间。稍后你可以设置你自己的时区。举个例子,设置时间为2005年3月29日16时21分:
代码 1.2: 设置UTC日期/时间 |
# date 032916212005
|
做出你的选择
下一步你要做的是安装你所选择的stage tarball到你的系统里。
5.b. 下载Stage Tarball
进入Gentoo的挂载点,也就是装Gentoo的分区挂载的地方(很可能是/mnt/gentoo):
代码 2.1: 进入Gentoo的挂载点 |
# cd /mnt/gentoo
|
下面这个表格指定了你的系统需要哪个stage。Stage可以从官方Gentoo镜像下载,它们在releases/mips/current目录下。
字节序 |
CPU |
位置 |
big endian
(SGI用户)
|
R4000
R4400
R4600
|
mips3/stage#-mips3-RELEASE.tar.bz2 |
big endian
(SGI用户)
|
R5000
RM5200
RM7000
R10000
R12000
R14000
|
mips4/stage#-mips4-RELEASE.tar.bz2 |
little endian
(Cobalt用户)
|
RM5230
RM5231
|
cobalt/stage#-mipsel4-RELEASE.tar.bz2 |
little endian
(其他用户)
|
所有的标准CPU类型
|
cobalt/stage#-mipsel1-RELEASE.tar.bz2 |
警告:
虽然我们提供little endian MIPS1的stage,但是对于little endian MIPS系统的支持只局限于Cobalt服务器。它们是为那些想在目前不支持的平台上试验Gentoo的人提供的,所以我们假设你知道你在做什么。
|
如果你需要通过代理上网的,那么请export http_proxy和ftp_proxy这两个变量:
代码 2.2: 为wget设置代理信息 |
# export http_proxy="http://proxy.server.com:port"
# export ftp_proxy="http://proxy.server.com:port"
|
Gentoo/MIPS netboot镜像提供了wget作为下载文件的工具。因为空间的限制,在SGI netboot镜像里不可能提供功能更完善的浏览器。LiveCD用户可以是用elinks。
代码 2.3: 用wget下载tarball |
# wget -c http://distfiles.gentoo.org/releases/mips/mips4/stage3-mips4-2008.0.tar.bz2
|
如果你想校验所下载的stage tarball的完整性,使用md5sum或者sha1sum然后把输出同镜像站上提供的MD5校验和对比。例如校验一个mips4的stage tarball:
代码 2.4: 校验一个stage tarball完整性的例子 |
# md5sum -c stage3-mips4-2008.0.tar.bz2.DIGESTS
stage3-mips4-2008.0.tar.bz2: OK
# sha1sum -c stage3-mips4-2008.0.tar.bz2.DIGESTS
stage3-mips4-2008.0.tar.bz2: OK
|
解开Stage Tarball
现在把你所下载的stage解压缩到系统里。我们使用GNU的tar命令来做,这是最简单的方法:
代码 2.5: 解开stage |
# tar -xjpf stage?-*.tar.bz2
|
确保你使用了同样的参数(xvjpf)。x表示解开(Extract),v表示详细信息(Verbose)可以用来查看解压缩时发生了什么(可选参数),j表示使用bzip2解压缩,p表示保留权限(Preserve permissions),还有f表示我们要解开一个文件,而不是标准输入。
现在stage已经安装好,下面我们继续安装Portage。
5.c. 安装Portage
解开一个Portage快照
现在你得安装一个Portage的快照,它包含的一堆文件告诉Portage哪些软件可以安装,有哪些profile可用等等。
下载和安装Portage快照
进入Gentoo文件系统的挂载点(很可能是/mnt/gentoo):
代码 3.1: 进入Gentoo的挂载点 |
# cd /mnt/gentoo
|
从本地镜像下载一个portage快照。你可以在snapshots/目录下找到它们。使用和stage tarball一样的处理方式把它传输到目标系统里。
代码 3.2: 解开Portage快照 |
# tar -xjf portage-*.tar.bz2 -C /mnt/gentoo/usr
|
5.d. 配置编译选项
介绍
你可设置一些影响Portage行为的变量来优化Gentoo。这些变量都可作为环境变量来设置(使用export),但是它们不是永久的。为了保持你的设置,Portage为你提供了/etc/make.conf,一个Portage的配置文件。这就是我们现在要编辑的文件。
注意:
所有可能的变量都用注释形式罗列在/mnt/gentoo/etc/make.conf.example里。要成功的安装Gentoo,你只需要设置下面提到的变量。
|
打开一个文本编辑器,现在我们要改变我们下面将要讨论的优化变量。我们提供了两个编辑器,vi(Busybox的一部分)和nano。我们将假设你正在使用nano。
代码 4.1: 打开/etc/make.conf |
# nano -w /mnt/gentoo/etc/make.conf
|
你很可能已经注意到了,make.conf.example文件的结构和一般的文件一样:注释行以"#"开头,其它行使用VARIABLE="content"的语法来定义变量。make.conf文件也使用相同的语法。其中的一些变量我们接下来讨论。
CFLAGS和CXXFLAGS
CFLAGS和CXXFLAGS变量分别定义了gcc C和C++编译器的优化标记。尽管我们通常都在这里定义,你也可以对每个软件单独定义这些优化标记以获得最好的性能。因为每个程序都是不同的。
在make.conf里你应该定义一些你认为可以使系统在一般情况下快速响应的优化标记。不要把实验性质的设置放到这个变量里来;过多的优化会使程序表现很差(崩溃,甚至更糟,不正常工作)。
我们不会解释所有可能的优化选项。如果你想搞清楚它们,请阅读GNU在线手册或者是gcc info页面(info gcc——只能在可工作的Linux系统中查看)。make.conf.example本身也包含了不少信息和范例;不要忘了也看看它。
第一个设置是-march=标记,它指定了目标架构的名字。可能的选项会在make.conf.example里有说明(以注释形式出现)。例子有ISA级别(mips1……mips4)和CPU型号(r4400,r4600……等等)。对于纯ISA级别架构,可以简单的只指定-mips3而不必-march=mips3。
代码 4.2: GCC -march和-mips#设定 |
-march=r4600
-march=mips4
-mips4
|
第二个是-O标记(是大写的O,而不是数字零),它是指定gcc的优化级别的标记。可能的级别有s(为优化文件大小),0(0——不优化),1、2乃至3是针对速度的优化标记(每个级别都包含前一级的优化措施,并额外增加了一些)。-O2是推荐的默认设置。-O3已知当全局启用时会引起一些问题,所以我们推荐你还是用-O2。
在MIPS世界里很重要的一个设定是-mabi=参数。MIPS有3个不同的ABI:32(纯32位,也称o32),64(全64位,也称n64)和n32(32位数据结构和64位指令的混合体)。你想用哪个就用这个参数来选择。注意你需要有你所选择的ABI的库。比如,在layman的术语里,这意味着你不能在32位userland(甚至n32 userland)里使用-mabi=64。
另一个普遍使用的优化标记是-pipe(不同编译阶段通信使用管道而不是临时文件)。 它对产生的代码没有任何影响。
使用-fomit-frame-pointer(它将不在寄存器里为不需要帧指针的函数保存帧指针)可能会在调试程序的时候造成严重后果!
在你定义CFLAGS和CXXFLAGS的时候,你需要把这些优化标记都合并起来,就像下面这个例子:
代码 4.4: 定义CFLAGS和CXXFLAGS变量 |
CFLAGS="-mabi=32 -mips4 -pipe -O2"
CXXFLAGS="${CFLAGS}"
|
注意:
你应该看一看编译优化指南以了解更多的信息,比如不同的编译选项将如何影响你的系统。
|
MAKEOPTS
通过使用MAKEOPTS你可以定义在安装软件的时候同时可以产生并行编译的数目。你的CPU数目加一是个不错的选择,但是这个准则并不永远都是完美的。
代码 4.5: 单CPU系统的MAKEOPTS |
MAKEOPTS="-j2"
|
设置已准备好,让我们开始!
根据你的喜好更新/mnt/gentoo/etc/make.conf并保存(nano用户可以敲Ctrl-X)。你现在准备好可以继续安装Gentoo基本系统了。
6. 安装Gentoo基本系统
6.a. Chroot
可选:选择境像站点
为了快速下载源代码,建议你选择一个速度快的境像站点。Portage将在make.conf中查找并使用GENTOO_MIRRORS变量定义的境像列表。你也可以浏览我们的镜像列表来寻找一个或者多个离你最近的镜像(通常它们是最快的),不过我们提供了一个不错的工具来帮助你选择境像,它叫mirrorselect。
代码 1.1: 使用mirrorselect更新GENTOO_MIRRORS变量 |
# mirrorselect -i -o >> /mnt/gentoo/etc/make.conf
|
警告:
不要选择任何IPv6的境像。我们的stage目前还不支持IPv6。
|
另一个重要的设置就是make.conf里的SYNC设置。这个变量包含你更新Portage树(Portage下载和安装软件时需要用到的ebuild和脚本等信息的集合)时用到的rsync服务器信息。虽然你可以手动输入一个SYNC服务器地址,不过还是让mirrorselect来帮你完成更加的方便:
代码 1.2: 使用mirrorselect选择rsync镜像站点 |
# mirrorselect -i -r -o >> /mnt/gentoo/etc/make.conf
|
运行完mirrorselect以后,最好自己再检查一下/mnt/gentoo/etc/make.conf里的设置!
拷贝DNS信息
在我们进入新环境之前,还有一件事需要完成,那就是从/etc/resolv.conf拷贝DNS信息。这一步可以保证你在进入新的系统环境后还可以继续使用网络。/etc/resolv.conf包含了你网络里的域名服务器。
代码 1.3: 拷贝DNS信息 |
# cp -L /etc/resolv.conf /mnt/gentoo/etc/
|
挂载/proc和/dev文件系统
将/proc文件系统挂载到/mnt/gentoo/proc,这样chroot后的环境里安装时也可以获取内核提供的相关信息,然后以bind方式挂载/dev文件系统。
代码 1.4: 挂载/proc和/dev |
# mount -t proc none /mnt/gentoo/proc
# mount -o bind /dev /mnt/gentoo/dev
|
进入新的系统环境
现在所有的分区都已经被初始化,基本环境也已安装完毕,现在是到了该用chroot进入新安装环境的时候了。这意味着我们从当前安装环境(安装光盘或者其他安装介质)切换到你安装的系统里(也就是被初始化的分区)。
完成chroot有三步。首先我们用chroot把根文件系统从/(安装介质里)切换到/mnt/gentoo(在你的分区里)。然后我们使用env-update来建立新的环境,也就是创建新的环境变量。最后我们用source加载这些变量。
代码 1.5: chroot到新环境里 |
# chroot /mnt/gentoo /bin/bash
# env-update
>> Regenerating /etc/ld.so.cache...
# source /etc/profile
# export PS1="(chroot) $PS1"
|
祝贺你!你现在已经在你自己的Gentoo Linux环境里了。当然这离安装完成还有段时间,因为我们可以看到安装指南还剩下很多章节呢 :-)
6.b. 配置Portage
更新Portage树
你现在应该更新你的Portage树到最新版本。执行emerge --sync。
代码 2.1: 更新Portage树 |
# emerge --sync
# emerge --sync --quiet
|
如果你网络前面的防火墙的配置使得rsync请求被阻挡的话,你可以使用emerge-webrsync下载和安装一个最新的portage快照。
如果系统警告你有一个新版本的Portage可用,你可以使用emerge --oneshot portage来更新它。
选择正确的Profile
首先,我们看一下一些小的定义。
profile是每个Gentoo系统的构造块。它不仅指定了USE、CFLAGS以及其他重要变量的默认值,它还把系统可用的软件版本锁定在某个范围。而这些都是由Gentoo的开发者来维护的。
以前,这个profile很少会有用户接触到。然而,有些情况下你可以决定需不需要修改profile。
你可以用下面的命令来查看当前使用的profile:
代码 2.2: 验证系统profile |
# eselect profile list
Available profile symlink targets:
[1] default/linux/mips/2008.0/generic-be/o32/ *
[2] default/linux/mips/2008.0/generic-be/o32//desktop
[3] default/linux/mips/2008.0/generic-be/o32//server
|
默认的profile会提供给你一个基于2.6版本内核的Linux系统。这是默认推荐的,但是你也可以选择另外一个profile。
系统也为某些架构提供了desktop和server的子profile。运行eselect profile list来显示所有可用的profile。
看完了你的体系结构可用的profile之后,如果你愿意,你可以换一个profile。
代码 2.3: 切换profile |
# eselect profile set 2
|
注意:
子profile developer是专为Gentoo Linux开发任务而准备的,而不是用来帮助构建一般性的开发环境的。
|
配置USE变量
USE是Gentoo为用户提供的最具威力的变量之一。很多程序通过它可以选择编译或者不编译某些可选的支持。例如,一些程序可以在编译时加入对gtk或是对qt的支持。其它的程序可以在编译时加入或不加入对于SLL的支持。有些程序甚至可以在编译时加入对帧缓冲的支持(svgalib)以取代X11(X服务器)。
大多数的发行版会使用尽可能多的支持特性编译它们的软件包,这既增加了软件的大小也减慢了启动时间,而这些还没有算上可能会涉及到的大量依赖性问题。Gentoo可以让你自己定义软件编译的选项,而这正是USE要做的事。
在USE变量里你可以定义关键字,它被用来对应相应的编译选项。比如,ssl会让程序在它编译时加入对它的支持。-X会移除其对于X服务器的支持(注意前面的减号)。gnome gtk -kde -qt3 -qt4将会在你编译软件的时候添加对gnome(和gtk)的支持,并且移除对kde(和qt)的支持,这可以让你的系统尽可能多的为GNOME做优化。
默认的USE设置位于你profile的make.defaults文件里。你可以在符号连接/etc/make.profile所指向的目录和它所有的父目录里找到make.defaults文件。默认的USE设置是所有make.defaults文件里USE的集合。所有你放在/etc/make.conf里的USE都会根据默认设置重新计算。如果你添加了一些USE的设置,它会被增加到默认的列表里。如果你删除了一些USE设置(通过放一个减号到它前面),它将被从默认的列表里移除(如果它确实在默认列表里的话)。绝对不要改变/etc/make.profile目录里的任何东西,它会在你更新Portage的时候被覆盖掉!
关于USE的详解你可以在Gentoo手册的第二部分,USE标记里找到。对于USE标记的详细介绍可以查看你的系统里/usr/portage/profiles/use.desc。
代码 2.4: 查看可用的USE标记 |
# less /usr/portage/profiles/use.desc
|
作为一个例子,我们展示一个基于KDE的系统并带有DVD、ALSA以及光盘刻录支持的USE设置:
代码 2.5: 打开/etc/make.conf |
# nano -w /etc/make.conf
|
代码 2.6: USE设置 |
USE="-gtk -gnome qt3 qt4 kde dvd alsa cdr"
|
可选:glibc Locales
在你的系统里可能只会用到一个或两个locale。你可用/etc/locale.gen来指定locale。
代码 2.7: 打开/etc/locale.gen |
# nano -w /etc/locale.gen
|
下面这个例子中的locale同时支持英语(美国)和德语(德国)并带有字符集格式(比如UTF-8)的支持。
代码 2.8: 指定你的locale |
en_US ISO-8859-1
en_US.UTF-8 UTF-8
de_DE ISO-8859-1
de_DE@euro ISO-8859-15
|
下一步我们运行locale-gen。它会产生所有你在/etc/locale.gen文件里指定的locale。
现在我们继续配置内核。
7. 配置内核
7.a. 时区
您首先需要选择您自己的时区,这样可以让系统知道它的位置在哪里。您可以在/usr/share/zoneinfo中找到您所在的时区,然后把它复制到/etc/localtime。请不要使用/usr/share/zoneinfo/Etc/GMT*下的时区,因为它们“名不副实”。例如,GMT-8事实上是GMT+8区。
代码 1.1: 设置时区信息 |
# ls /usr/share/zoneinfo
# cp /usr/share/zoneinfo/GMT /etc/localtime
|
7.b. 安装源码
选择内核
Linux内核是所有发行版的核心。它位于用户程序和系统硬件之间。Gentoo提供给我们几个可选的内核源码。完整的清单参见Gentoo内核指南。
基于MIPS的系统只能选择一个内核源代码mips-sources。这个补丁集和其他架构的补丁集是不同的,因为它有很多针对MIPS架构的补丁。
代码 2.1: 安装内核源码…… |
# emerge mips-sources
|
重要:
在Origin 200/2000、Indigo2 Impact (R10000)、Octane/Octane2和O2上,需要一个64位内核来启动系统。对于这些机器,你应该emerge kgcc64来创建一个交叉编译器来编译64位内核。
|
代码 2.2: 安装kgcc64…… |
# emerge kgcc64
|
当您查看/usr/src时,您将会看到一个叫做linux的符号链接指向您安装的内核源码。在我们这个例子中,安装的源码指向mips-sources-2.6.23.14-mips。您的版本可能有所不同,所以请你记住这一点。
代码 2.3: 查看内核源码符号链接 |
# ls -l /usr/src/linux
lrwxrwxrwx 1 root root 12 Oct 13 11:04 /usr/src/linux -> linux-2.6.23.14-mips
|
现在是时候配置和编译你的内核代码了。
7.c. 内核编译与安装
介绍
前面,我们介绍过怎样手工配置内核源代码。但是因为我们支持的系统的数量太多,手工配置这里就不太现实了。本节向您展示了多种内核配置方法。
使用内核代码里的示例配置
很多受支持的系统都在内核源代码里有一个隐藏的示例.config。不过不是所有的系统都有。对于有的系统来说,可以使用下面表格里的命令来配置。
系统 |
配置命令 |
Cobalt服务器 |
make cobalt_defconfig |
Indy, Indigo2 (R4k), Challenge S |
make ip22_defconfig |
Origin 200/2000 |
make ip27_defconfig |
Indigo2 Impact (R10k) |
make ip28_defconfig
|
O2 |
make ip32_defconfig |
使用来自安装媒介的正在运行的内核的配置
所有的Gentoo安装镜像都提供一个内核配置文件,/proc/config.gz。很多情况下都可以利用这个配置文件。不过最好还是你的内核源代码和你正在运行的内核的源代码相差不多。要解开它,只需要像下面那样用zcat命令就可以。
代码 3.1: 从/proc/config.gz解出.config |
# zcat /proc/config.gz > .config
|
重要:
这个内核配置是netboot镜像用的。也就是它需要就近找到一个根文件系统,要么是initramfs里的一个目录,要么是一个initrd回环设备。所以当你运行make menuconfig时,不要忘记进到General Setup里禁用initramfs的选项。
|
硬件兼容性数据库
为了帮助用户找到可以用的设定,有人建立了一个硬件兼容性数据库。这个数据库列出了很多不同MIPS设备的支持,而且允许用户贡献他们知道可以用的内核配置。这个站点的地址是http://stuartl.longlandclan.hopto.org/gentoo/mips。
如果你觉得这个服务有用,欢迎你贡献你的笔记和.config文件,以使别人可以从你的经验中受益。不过要注意的是,从这个站点下载的任何配置文件都不能保证一定可用。
根据你的需要调整配置
当你找到一个配置之后,下载到你的内核源代码目录里,重命名为.config。在那个目录里,运行make oldconfig来更新配置文件,在编译开始前你还能定制这个配置文件。
代码 3.2: 编译内核 |
# cd /usr/src/linux
# cp /path/to/example-config .config
# make oldconfig
# make menuconfig
|
重要:
在Kernel Hacking部分,有一个选项叫“你正在使用交叉编译器么?”这个会告诉内核Makefile在编译内核时把“mips-linux-”(或者mipsel-linux-……等等)加在gcc和as前。这个选项应该被关闭,即时是在交叉编译时。如果你确实需要调用交叉编译器,请定义CROSS_COMPILE变量就像下面一节所演示的。
|
重要:
Octane系统上JFS和ALSA有一个已知问题,ALSA不能工作。鉴于JFS在MIPS上只是试验性质,建议目前不要使用JFS。
|
编译与安装
既然现在您的内核已经配置成功了,那么就是时候编译并且安装它了。退出配置界面并且开启编译进程:
注意:
在64位机器上,你需要指定CROSS_COMPILE=mips64-unknown-linux-gnu-(或者mips64el-...如果这是个little endian系统)来使用64位编译器。
|
代码 3.3: 编译内核 |
# make vmlinux modules modules_install
# make vmlinux modules modules_install CROSS_COMPILE=mips64-unknown-linux-gnu-
# make vmlinux modules CROSS_COMPILE=mips64-unknown-linux-gnu-
# make modules_install INSTALL_MOD_PATH=/somewhere
|
重要:
当为Indy、Indigo2 (R4k)、Challenge S和O2编译64位内核时,请使用vmlinux.32目标,而不要用vmlinux。否则,你的系统将不能启动。这样做因为PROM不支持ELF64格式。
|
代码 3.4: 使用vmlinux.32目标 |
# make vmlinux.32
|
当内核编译完毕,把内核镜像复制到/.
注意:
在Cobalt服务器上,引导程序需要的是一个压缩了的内核镜像。复制到/boot之后记得用gzip -9来压缩一下内核镜像.
|
代码 3.5: 安装内核 |
# cp vmlinux /boot/kernel-2.6.23.14-mips
# gzip -9v /boot/kernel-2.6.23.14-mips
|
7.d. 内核模块
配置模块
您应该在/etc/modules.autoload.d/kernel-2.6中列出您需要自动加载的模块。如果您愿意,您也可以加上模块的选项。
要查看所有可用的模块,运行如下的find命令。不要忘记把“<kernel version>”替换成你刚编译好的内核版本:
代码 4.1: 查看所有可用的模块 |
# find /lib/modules/<kernel version>/ -type f -iname '*.o' -or -iname '*.ko' | less
|
例如,要自动加载3c59x.ko模块,编辑kernel-2.6文件然后写入模块的名字。
代码 4.2: 编辑/etc/modules.autoload.d/kernel-2.6 |
# nano -w /etc/modules.autoload.d/kernel-2.6
|
代码 4.3: /etc/modules.autoload.d/kernel-2.6 |
3c59x
|
现在请从配置您的系统一章来继续您的安装。
8. 配置系统
8.a. 文件系统信息
fstab是什么?
在Linux系统下,系统所用到的所有分区都必须在/etc/fstab文件中指明。这个文件包含了这些分区的挂载点(在系统目录树中的位置)、挂载方法和特殊挂载选项(是否自动挂载,是否可以用户挂载等)。
创建/etc/fstab
/etc/fstab使用一种特殊语法格式。每行都包含六个字段。这些字段之间由空白键(空格键,tab键,或者两者混合使用)分隔。每个字段都有自己的含意:
-
第一个字段是对分区的描述,也就是设备文件的路径
-
第二个字段是分区挂载点,也就是分区应该挂载到的地方
-
第三个字段给出分区所用的文件系统
-
第四个字段给出的是挂载分区时mount命令所用的挂载选项。由于每个文件系统都有自己的挂载选项,我们建议你阅读mount手册(man mount)以获得所有挂载选项的列表。多个挂载选项之间是用逗号分隔的。
-
第五个字段是给dump使用的,用以决定这个分区是否需要dump。一般情况下,你可以把该字段设为0(零)。
-
第六个字段是给fsck使用的,用以决定系统非正常关机之后文件系统的检查顺序。根文件系统应该为1,而其它的应该为2(如果不需要文件系统自检的话可以设为0)。
重要:
Gentoo系统默认的/etc/fstab文件不是有效的fstab文件。你必须创建自己的/etc/fstab。
|
代码 1.1: 打开/etc/fstab |
# nano -w /etc/fstab
|
让我们看看/boot分区的挂载选项是怎么写的。这仅仅是个例子,如果你没有或者不能创建/boot,请不要复制它。
在我们默认的MIPS分区例子中,/boot一般
为/dev/sda1分区,且采用ext2文件系统。
这个分区在引导过程中需要自检,因此我们这样写:
代码 1.2: /etc/fstab中/boot行的一个例子 |
/dev/sda1 /boot ext2 defaults 1 2
|
为了提高系统的安全性,一部分用户不希望/boot分区自动挂载。这些用户应该用noauto替换defaults。这就表示用户每次使用该分区时,需要手动挂载。
增加符合你分区方案的规则,为你的光驱(当然,如果你有其他分区或者驱动器,也为它们加上)添加挂载规则。
现在就参考以下例子创建你的/etc/fstab:
代码 1.3: /etc/fstab的一个完整例子 |
/dev/sda1 /boot ext2 defaults,noatime 1 2
/dev/sda2 none swap sw 0 0
/dev/sda3 / ext3 noatime 0 1
/dev/cdrom /mnt/cdrom auto noauto,user 0 0
|
auto选项可以使mount猜测文件系统(推荐对于可移动设备采用这个选项,因为它们可能采用很多不同的文件系统),而user选项使得非root用户可以挂载光驱。
为了提高性能,大部分用户会添加noatime挂载选项。由于不记录该分区中文件的访问时间(一般来说你并不需要知道它),这个选项能够提高系统速度。
请再次确认你的/etc/fstab文件是正确的,保存并退出,继续下面的内容。
8.b. 网络信息
主机名、域名等
用户必须要做的事情之一就是命名自己的机器。尽管这看上去很容易,但是很多用户觉得为他们的Linux机器起一个合适的名字是很难的。为了加快事情的进度,你应该知道你所命名的所有名字都是可以在今后重新修改的。因此,你可以简单命名你的系统为tux,域名为homenetwork。
代码 2.1: 设定主机名 |
# nano -w /etc/conf.d/hostname
HOSTNAME="tux"
|
第二,如果你需要一个域名,在/etc/conf.d/net中设定。只有你的ISP或者网络管理员说你需要一个域名,或者你有一个DNS服务器但是没有DHCP服务器的时候,你才需要域名。如果你的网络是DHCP分配IP,那么你不需要理会DNS和域名的问题。
代码 2.2: 设定域名 |
# nano -w /etc/conf.d/net
dns_domain_lo="homenetwork"
|
注意:
如果你选择不设定域名,你可以去掉登录界面上的这条信息“This is hostname.(none)”。你只需要修改/etc/issue,把字符串.\O从该文件里删掉即可。
|
如果你有一个NIS域(如果你不知道这是什么,就说明你没有),你也需要定义一个:
代码 2.3: 设定NIS域名 |
# nano -w /etc/conf.d/net
nis_domain_lo="my-nisdomain"
|
注意:
如果想知道更多关于DNS和NIS配置的信息,可以看/etc/conf.d/net.example当中的例子。当然,你也可以安装openresolv来帮助设置DNS、NIS。
|
配置你的网络
在准备说“嘿,我们已经配置过网络”之前,你应该记得在开始安装Gentoo之初所设置的网络配置是仅仅为了安装而设置的。现在你所要设置的是Gentoo系统的永久网络配置。
注意:
更多关于网络配置的详细信息,包括网卡绑定、网桥、802.1Q VLANs和无线网络在内的高级配置会在Gentoo网络配置这一部分介绍.
|
/etc/conf.d/net当中收集了所有的网络信息。尽管这个文件采用直接易懂的语法,如果你还是因为觉得不够直观而完全不知道如何手动进行网络配置的话,请不用担心,我们将一一解释。在/etc/conf.d/net.example中有一个详细注释过的例子,它涵盖了许多种类不同的配置。
系统默认使用DHCP。如果使用DHCP的话,你需要安装一个DHCP客户端。这个将在稍后的安装必要的系统工具部分介绍。但是不要忘记安装一个DHCP客户端。
如果你需要配置你的网络连接,不管是因为你是需要指定DHCP选项还是你根本不想采用DHCP,请使用你喜欢的编辑器(在这个例子中用的是nano)打开/etc/conf.d/net:
代码 2.4: 打开/etc/conf.d/net准备编辑 |
# nano -w /etc/conf.d/net
|
你会看到以下的文件:
代码 2.5: 默认的/etc/conf.d/net |
# This blank configuration will automatically use DHCP for any net.*
# scripts in /etc/init.d. To create a more complete configuration,
# please review /etc/conf.d/net.example and save your configuration
# in /etc/conf.d/net (this file :]!).
|
为了输入你自己的IP地址,子网掩码和网关,你需要设置config_eth0和routes_eth0:
代码 2.6: 手动为eth0设置IP信息 |
config_eth0=( "192.168.0.2 netmask 255.255.255.0 brd 192.168.0.255" )
routes_eth0=( "default via 192.168.0.1" )
|
如果你使用DHCP,请定义一下config_eth0:
代码 2.7: 让eth0自动获得IP地址 |
config_eth0=( "dhcp" )
|
请阅读/etc/conf.d/net.example以得到所有选项的列表。如果你需要设定特殊的DHCP选项,请参考你的DHCP客户端的手册页。
如果你有多个网络接口,那么重复之前对于config_eth1、config_eth2等的操作步骤。
现在可以保存配置并且退出,继续下面的安装和配置。
在启动时自动启用网络
为了在启动时自动激活网络接口,你必须添加这些到default运行级别。
代码 2.8: 添加net.eth0到默认的运行级别 |
# rc-update add net.eth0 default
|
如果你有多个网络接口,你需要为他们创建合适的net.eth1、net.eth2等启动脚本。你可以用ln来做这个。
代码 2.9: 创建额外的启动脚本 |
# cd /etc/init.d
# ln -s net.lo net.eth1
# rc-update add net.eth1 default
|
记下网络信息
现在你需要告诉Linux有关你的网络的信息。这需要在/etc/hosts文件中定义,它将帮助你将那些无法被域名解析器解析的主机名解析成IP地址。你需要定义你自己的系统。如果你不想启用内部DNS系统的话,你也需要定义内部网络上的其它系统。
代码 2.10: 打开/etc/hosts |
# nano -w /etc/hosts
|
代码 2.11: 填入网络信息 |
127.0.0.1 tux.homenetwork tux localhost
192.168.0.5 jenny.homenetwork jenny
192.168.0.6 benny.homenetwork benny
|
保存并且退出编辑器,继续下面的过程。
8.c. 系统信息
Root密码
首先我们键入以设置root密码:
代码 3.1: 设置root密码 |
# passwd
|
系统信息
Gentoo使用/etc/rc.conf来做通用的、系统级的配置。打开/etc/rc.conf并好好读读这个文件中的注解:)
代码 3.2: 打开/etc/rc.conf |
# nano -w /etc/rc.conf
|
当你完成对/etc/rc.conf的配置后,保存并退出。
正如你所看到的,为了帮助你完成必要变量的配置,这个文件有丰富的注释信息。你可以让你的系统使用unicode并定义你的默认编辑器和你的显示管理器(比如gdm或者kdm)。
Gentoo用/etc/conf.d/keymaps来处理键盘设置。编辑它就可以设置你的键盘。
代码 3.3: 打开/etc/conf.d/keymaps |
# nano -w /etc/conf.d/keymaps
|
KEYMAP这个变量要特别注意。如果你选择了错误的KEYMAP,在你敲击键盘的时候会有奇怪的结果。
完成/etc/conf.d/keymaps的配置之后,保存并退出。
Gentoo使用/etc/conf.d/clock来设置时钟选项。根据你的需要来编辑它。
代码 3.4: 打开/etc/conf.d/clock |
# nano -w /etc/conf.d/clock
|
如果你机器上的钟不用UTC,你需要在文件钟加上CLOCK="local"。否则,你的时钟就有可能出现偏差。
完成对/etc/conf.d/clock的配置后,保存并且退出。
请继续阅读安装必要的系统工具。
9. 安装必要的系统工具
9.a. 系统日志工具
因为有一些工具提供给用户的功能比较类似,它们就没有包含在stage3当中。现在就是你选择安装哪一个的时候了。
你首先需要决定的就是系统日志工具。Unix和Linux在日志记录功能方面有良好的传统——如果你愿意的话你可以把系统发生的所有事件都记录到日志文件中。这些功能就是通过系统日志工具来完成的。
Gentoo提供了多种系统日志工具可供选择。这当中有sysklogd(传统的系统日志守护进程),syslog-ng(一个高级系统日志工具),metalog(一个可以灵活配置的系统日志工具)。Portage内或许还有其他的系统日志工具——我们的可用软件包数量是以天为单位在增加的。
如果你打算使用sysklogd或者syslog-ng你很可能会随后希望安装logrotate,因为这些系统日志工具并没有提供系统日志文件的滚动功能。
要安装你所选择的系统日志工具,你可以用emerge命令安装它,并使用rc-update将它加入default运行级别。以下就是一个安装syslog-ng的例子。当然你要把它换成你的系统日志工具:
代码 1.1: 安装一个系统日志工具 |
# emerge syslog-ng
# rc-update add syslog-ng default
|
9.b. 可选:Cron守护进程
接下来你可以选择cron守护进程。尽管这是可选的并且不是系统所必须的,但是最好能够安装一个。那么,什么是cron守护进程呢?cron守护进程执行预定的命令。如果你需要执行一些有规律(例如每天、每周或者每月)的命令,这就会非常有用。
Gentoo提供了三个可选的cron守护进程:dcron、fcron和vixie-cron。安装这其中一个的方法和安装一个系统日志工具的方法类似。但是,dcron和fcron需要额外的配置命令,即crontab /etc/crontab。如果你不知道应该选择哪个,那么就用vixie-cron好了。
我们对无网络安装只提供了vixie-cron。如果你希望安装其它的cron守护进程,那你只能等待稍后安装了。
代码 2.1: 安装一个cron守护进程 |
# emerge vixie-cron
# rc-update add vixie-cron default
# crontab /etc/crontab
|
9.c. 可选:文件索引
如果你想索引你的系统文件使得你能够使用locate工具很快定位它们,你需要安装sys-apps/slocate。
代码 3.1: 安装slocate |
# emerge slocate
|
9.d. 文件系统工具
根据你所使用的文件系统的不同,你需要安装必须的文件系统工具(用于检查文件系统完整性、创建额外的文件系统等)。请注意管理ext2/ext3文件系统的工具(e2fsprogs)已经做为系统的一部分被安装了。
以下的表格列出了特定文件系统所需要安装的工具。
文件系统 |
工具 |
安装命令 |
XFS |
xfsprogs |
emerge xfsprogs |
ReiserFS |
reiserfsprogs |
emerge reiserfsprogs |
JFS |
jfsutils |
emerge jfsutils |
如果你是EVMS用户,你还需要安装evms:
代码 4.1: 安装EVMS工具 |
# USE="-gtk" emerge evms
|
USE="-gtk"参数会避免安装一些相关依赖的基于GTK的程序。如果你希望使用evms的图形工具,你可以重新编译evms。
9.e. 网络工具
如果你不需要任何其它网络相关的工具(例如ppp或dhcp客户端)可以跳过这部分内容继续进入配置引导程序
可选:安装一个DHCP客户端
如果你需要Gentoo为你的网卡自动获得IP地址,你需要安装dhcpcd(或者任何其它的DHCP客户端——参见网络模块当中的DHCP客户端列表)。如果你不安装的话,你安装完Gentoo系统后可能会无法连接网络。
代码 5.1: 安装dhcpcd |
# emerge dhcpcd
|
可选:安装PPPoE客户端
如果你需要ppp来连接网络,你需要安装它。
代码 5.2: 安装ppp |
# emerge ppp
|
现在进入配置引导程序部分。
10. 配置引导程序
10.a. Silicon Graphics机器——配置arcload
哪一个?
在SGI机器上,我们使用arcload引导程序。在之前的发布中,我们也提供arcboot,不过它已经被正式宣布淘汰了,替代者就是arcload。
注意:
SGI卷头文件名最长为8个字符,在一个卷头里最多不能存在超过16个文件。
|
安装arcload
arcload是为需要64位内核的机器写的,因此不能使用arcboot(因为后者不能很容易地编译得到64位的可执行程序)。它还解决了一些从卷头加载内核时所引发的问题。所以,现在你知道为什么了,我们就可以继续安装了:
代码 1.1: 安装arcload和dvhtool |
# emerge arcload dvhtool
|
安装结束后,你应该可以发现arcload二进制文件静静的躺在/usr/lib/arcload路径下。现在,有两个文件存在:
-
sashARCS:针对Indy、Indigo2 (R4k)、Challenge S和O2系统的32位二进制文件
-
sash64:针对Octane/Octane2、Origin 200/2000和Indigo2 Impact系统的64位二进制文件
使用dvhtool来安装适用于你的系统的二进制文件到卷头里:
代码 1.2: 把arcload放到卷头 |
# dvhtool --unix-to-vh /usr/lib/arcload/sashARCS sashARCS
# dvhtool --unix-to-vh /usr/lib/arcload/sash64 sash64
|
注意:
你不一定非要使用sasARCS或者sash64这两个名字,除非你要把它安装到一个可引导光盘的卷头里。对于普通的硬盘启动,如果你愿意,你可以使用别的名字。
|
现在使用dvhtool命令来验证它们已经被装到卷头里了。
代码 1.3: 检查arcload已经在卷头里 |
# dvhtool --print-volume-directory
----- directory entries -----
Entry #0, name "sash64", start 4, bytes 55859
#
|
现在,arc.cf文件的语法类似C语言。要知道如何配置它的详细信息,请看Linux/MIPS wiki上的arcload页。简单的说,你定义一些选项,这些选项你可以在启动时使用OSLoadFilename变量来启用和禁用。
代码 1.4: 一个arc.cf的例子 |
append "root=/dev/sda3";
append "ro";
append "console=ttyS0,9600";
ip28 {
working {
description "SGI Indigo2 Impact R10000\n\r";
image system "/working";
}
new {
description "SGI Indigo2 Impact R10000 - Testing Kernel\n\r";
image system "/new";
}
debug {
description "Debug console";
append "init=/bin/bash";
}
}
|
从arcload-0.5开始,arc.df和内核既可以存在于卷头中,也可以位于分区里。如果你想用这个新功能,你可以把这些文件放在你/boot分区里(或者/如果你的boot分区不是独立的)。arcload使用来自流行的grub引导程序的文件系统驱动代码,因此支持相当一批文件系统。
代码 1.5: 把arc.cf和内核放在卷头 |
# dvhtool --unix-to-vh arc.cf arc.cf
# dvhtool --unix-to-vh /usr/src/linux/vmlinux new
|
完成后,剩下要做的只是在PROM中设定一些选项。请参阅重启系统一节。
10.b. Cobalt微服务器——配置Colo
安装CoLo
在Cobalt服务器上,这些机器的芯片里安装的固件的能力很有限。Cobalt的BOOTROM和SGI的PROM相比很原始,有一些很严重的局限性。
-
内核大小的限制为675kb(大约)。Linux 2.4目前的大小几乎不可能使内核大小达到这个要求。Linux 2.6更加是完全没有可能。
-
原始的固件不支持64位内核(虽然现在的Cobalt机器试验性的支持了这个功能)
-
shell最多只是基本的
为了克服这些限制,人们开发了另外一个固件,叫做Colo(Cobalt Loader)。这是一个BOOTROM镜像,既可以烧入Cobalt服务器里的芯片里,也可以从已有的固件中加载。
注意:
本指南将引领你完成Colo的设置,以使它可以被初始的固件所加载。这是唯一真正安全的我们所推荐的设置Colo的方法。
|
警告:
你可以,如果你愿意,把它烧入服务器,完全替代原来的固件——不过,如果那样做的话,你自己要为你的行为负全责。万一发生了什么错误,你将需要物理的移除BOOTROM并使用初始的固件来重新编程它。如果你不确定如何来做到这一点——那么不要把它烧入你的机器。如果你忽略了这个建议,那么我们将不会为之后所发生的任何事情负任何责任。
|
好了,结束了这条警告,我们继续来安装CoLo。首先,从emerge这个包开始。
代码 2.1: 安装colo |
# emerge colo
|
安装好之后(我希望你看到了那些信息;-))你应该可以在/usr/lib/colo目录下找到2个文件,colo-chain.elf:初始固件要加载的“内核”,和colo-rom-image.bin:可以烧入BOOTROM的ROM镜像。首先我们挂载/boot并且制作一个colo-chain.elf的压缩副本放在/boot里,系统将会在这个目录寻找它。
代码 2.2: 把CoLo放在它应该存在的地方 |
# gzip -9vc /usr/lib/colo/colo-chain.elf > /boot/vmlinux.gz
|
配置CoLo
现在,当系统第一次启动时,它会加载CoLo,后者会在背面的LCD上显示一个菜单。第一个选项(也是默认选项,大约5秒钟后将执行它)是启动硬盘。然后系统将尝试挂载它所发现的第一个Linux分区,然后执行default.colo。该文件的语法在CoLo的文档(看一下/usr/share/doc/colo-X.YY/README.shell.gz——其中X.YY是实际安装的版本号)中有详细的说明,同时也很简单。
注意:
小贴士:当安装内核的时候,我通常创建两个内核镜像,kernel.gz.working——一个已知可以工作的内核,和kernel.gz.new——一个刚刚编译好的内核。你可以用符号连接来指向当前的"new"和"working"内核,或者干脆重命名内核镜像。
|
代码 2.3: 一个基本的default.colo |
mount sda1
load /kernel.gz.working
execute root=/dev/sda3 ro console=ttyS0,115200
|
注意:
CoLo会拒绝加载不是以#:CoLo:#开头的脚本。你可以把它想象成shell脚本里的#!/bin/sh。
|
也可以问一个问题,比如你想以启动哪个内核和配置,并设定一个默认超时时间。这个配置就实现了这一点,询问用户希望使用哪个内核,并执行选中的镜像。vmlinuz.gz.new和vmlinuz.gz.working可以是实际的内核镜像,也可以指向磁盘上的内核镜像的符号链接。50作为select的参数,指定了50/10秒后将会启动第一个选项(“Working“)。
代码 2.4: 基于菜单的配置 |
lcd "Mounting sda1"
mount sda1
select "Which Kernel?" 50 Working New
goto {menu-option}
var image-name vmlinux.gz.working
goto 3f
@var image-name vmlinux.gz.working
goto 2f
@var image-name vmlinux.gz.new
@lcd "Loading Linux" {image-name}
load /{image-name}
lcd "Booting..."
execute root=/dev/sda5 ro console=ttyS0,115200
boot
|
请看位于/usr/share/doc/colo-VERSION的文档以获得更多信息。
10.c. 设置串口终端
OK,到目前为止,安装好的Linux已经可以正常启动,不过只是假设你从物理终端登录的前提下。在Cobalt机器上,很不幸——没有物理终端。
注意:
对于有受支持的显卡的用户来说,如果他们愿意,可以跳过本节。
|
首先,打开你的文本编辑器开始编辑/etc/inittab。在这个文件里,你可以看到类似这样的内容:
代码 3.1: inittab的配置 |
c1:12345:respawn:/sbin/agetty 38400 tty1 linux
c2:12345:respawn:/sbin/agetty 38400 tty2 linux
c3:12345:respawn:/sbin/agetty 38400 tty3 linux
c4:12345:respawn:/sbin/agetty 38400 tty4 linux
c5:12345:respawn:/sbin/agetty 38400 tty5 linux
c6:12345:respawn:/sbin/agetty 38400 tty6 linux
ca:12345:ctrlaltdel:/sbin/shutdown -r now
|
首先,请注释掉c0这一行。默认的,这个设定是为了使用波特率为9600 bps的终端。在Cobalt服务器上,你可能需要把这里改为115200以匹配BOOT ROM所决定的波特率。下面是我的机器上这一段的配置。在无头机器上(例如Cobalt服务器),我还建议把本地终端那几行(c1到c6)都注释掉,因为当他们不能打开/dev/ttyX的时候总会有奇怪的行为。
代码 3.2: inittab的示例片段 |
c0:12345:respawn:/sbin/agetty 115200 ttyS0 vt102
|
现在,最后一步……我们需要告诉系统,本地的串口可以被认为是安全的终端。我们需要修改的文件是/etc/securetty。它包含了一个系统信任的终端列表。我们只需要多加两行进去,使串口线可以用来让root用户登录。
代码 3.3: 使root可以在串口终端登录 |
# echo 'ttyS0' >> /etc/securetty
# echo 'tts/0' >> /etc/securetty
|
10.d. 重启系统
退出chroot的环境,卸载所有已挂载的分区。然后输入您已经等待多时的那个魔术般的 命令:reboot。
代码 4.1: 退出chroot,卸载所有分区和重启 |
# exit
cdimage ~# cd
cdimage ~# umount /mnt/gentoo/boot /mnt/gentoo/dev /mnt/gentoo/proc /mnt/gentoo
cdimage ~# reboot
|
注意:
Cobalt用户:本章的剩余部分讲解了如何设定SGI PROM以使它可以从磁盘引导arcload并加载Linux。这并不适用于Cobalt服务器的配置。实际上,你要做的已经完成了——第一次启动前没有其他需要配置的了,你可以跳到下一章:结束Gentoo的安装
|
10.e. 调较SGI PROM
一般性的PROM设定
既然你已经安装好了引导程序,你可以重启机器了。
代码 5.1: 重启系统 |
# exit
# umount /mnt/gentoo/boot
# umount /mnt/gentoo
# reboot
|
当你重启之后,去到System Maintenance Menu并选择Enter Command Monitor(5)就像你netboot这台机器时做的一样。
代码 5.2: 配置PROM来启动Gentoo |
1) Start System
2) Install System Software
3) Run Diagnostics
4) Recover System
5) Enter Command Monitor
Option? 5
Command Monitor. Type "exit" to return to the menu.
>> setenv SystemPartition scsi(0)disk(1)rdisk(0)partition(8)
>> setenv AutoLoad Yes
>> setenv TimeZone EST5EDT
>> setenv console d1
>> setenv dbaud 9600
|
现在,下边的设定取决于你要怎样引导系统。
直接卷头启动的设定
这部分内容的出现只是为了保持完整。我们推荐用户查看安装arcload那部分内容,而不要看这里。
注意:
只适用于Indy,Indigo2(R4k)和Challenge S。
|
代码 5.3: 从卷头启动的PROM设定 |
>> setenv OSLoadPartition <根设备>
>> setenv OSLoader <内核文件名>
>> setenv OSLoadFilename <内核文件名>
>> setenv OSLoadOptions <内核参数>
|
如果你想尝试启动一个内核,而不改变当前的内核参数设定,你可以执行boot -fPROM命令:
代码 5.4: 在不改变环境变量的情况下启动 |
# boot -f new root=/dev/sda3 ro
|
arcload的设定
arcload使用OSLoadFilename选项来指定哪些选项用arc.cf里的内容来设定。这个配置文件本质上是一个脚本,脚本中的顶级块为不同的系统定义了启动镜像,在块内可定义一些可选的设定。所以,定义OSLoadFilename=mysys(serial)就能引入mysys块的设定,并且serial选项的内容将会覆盖已有的设定。
在前面的示例文件里,我们定义了一个系统块,ip28,有working、new和debug3个选项。我们这样来定义我们的PROM变量:
代码 5.5: 使用arcload的PROM设定 |
>> setenv OSLoader sash64
>> setenv OSLoadFilename ip28(working)
|
从arcload-0.5开始,文件不需要再放在卷头里——它们可以被放在分区内。要告诉arcload哪里去寻找它的配置文件和内核,我们需要设定OSLoadPartition PROM变量。确切的值这里将取决于你的磁盘在SCSI总线的什么位置。把SystemPartitionsPROM变量作为一个引导——只有分区号码需要改变。
注意:
分区是从0开始命名,而不是1,和在Linux里一样
|
代码 5.6: 告诉arcload哪里去寻找arc.cf |
>> setenv OSLoadPartition scsi(0)disk(1)rdisk(0)partition(8)
>> setenv OSLoadPartition scsi(0)disk(1)rdisk(0)partition(0)[ext2]
|
全部完成
现在你已经准备好享受Gentoo了!当重启进入到您新装的Gentoo系统之后,请阅读结束您的Gentoo安装来完成剩下的工作。
11. 结束Gentoo的安装
11.a. 用户管理
为日常使用添加一个用户
在Unix/Linux系统中,用root进行工作是一件危险的事情,应该尽量避免。因此我们强烈推荐您为日常使用添加一个普通用户。
用户所属的组定义了其可以执行的活动。下表中列出了许多您可能希望使用的重要组:
组 |
描述 |
audio |
允许使用声音设备 |
cdrom |
允许直接使用光驱 |
floppy |
允许直接使用软驱 |
games |
允许运行游戏 |
portage |
允许以普通用户的身份执行emerge --pretend
|
usb |
允许使用USB设备 |
plugdev |
允许挂载和使用可拔插设备,例如摄像头和U盘
|
video |
允许使用视频采集设备和硬件加速
|
wheel |
允许使用su
|
例如,要创建一个名为john的用户,并使其隶属于wheel组,users组和audio组,请先用root用户登录(只有root有权限创建用户),然后执行useradd命令:
代码 1.1: 添加一个日常使用的用户 |
Login: root
Password:
# useradd -m -G users,wheel,audio -s /bin/bash john
# passwd john
Password:
Re-enter password:
|
有时,普通用户可能需要以root身份执行一些任务,这时您可以使用su -来临时取得root权限。另外一种方法就是使用sudo包,如果配置正确,使用它将会非常安全。
11.b. 磁盘清理
移除tarball
现在您的gentoo已经结束了安装并完成了重启,如果一切顺利,您就可以将下载下来的stage3 tarball和Portage快照文件从硬盘里清除掉了。请记住它们是被下载到您的/目录中的。
代码 2.1: 移除stage3 tarball |
# rm /stage3-*.tar.bz2*
|
代码 2.2: 移除Portage快照文件 |
# rm /portage-latest.tar.bz2*
|
12. 下一步该做什么?
12.a. 文档
恭喜!您现在拥有了一个可以运转的Gentoo系统。但接下来往何处去?现在您拥有什么样的选择?先探索些什么?Gentoo为它的用户提供了大量的可能性,因此也有大量已经提供文档(少量没有)的特性。
您无疑应该先看一下Gentoo手册里标题为在Gentoo中工作的那一章节,那里解释了如何保证您随时用上最新的软件,如何安装更多的软件,什么是USE标记,以及Gentoo Init系统是如何工作的等等。
如果您有兴趣对系统进行优化以使其适合桌面应用,或者您想了解如何将您的系统配置成一个完整可用的桌面系统,请参阅我们所提供的全面的Gentoo桌面文档资源。另外,我们也提供本地化指南供您参考,利用它您可以使您的系统看起来更加本地化。
我们还提供了一份值得您阅读的Gentoo安全手册
您如果想得到一份我们已有的可用文档的列表,请查看我们提供的文档资源页面。
12.b. 线上Gentoo
当然也非常欢迎您加入我们的Gentoo论坛或者我们建立的Gentoo IRC 频道中的任意一个。
我们也有一些邮件列表是面对所有用户开放的。加入列表的方法已包含在前述页面中。
现在,我们将保持安静,以便让您享受您的安装过程。:)
B. 使用Gentoo
1. Portage入门
1.a. 欢迎使用Portage
Portage可能是Gentoo在软件包管理方面最瞩目的创新。它所具有的高度灵活性以及其他大量的特性,使其经常被认为是Linux中最好用的软件包管理工具。
Portage完全用Python和Bash写成。由于它们均为脚本语言,所以Portage对于用户而言也就是完全可见的。
绝大部分用户将通过emerge工具来使用Portage。本章节的目的不是在重复emerge的man page里已经提供的内容,如果要完整的了解emerge工具提供的选项,请参考其man page里给出的相应说明。
代码 1.1: 获取emerge的帮助信息 |
$ man emerge
|
1.b. Portage树
Ebuilds
当我们谈到(软件)包的时候,我们通常指的是Portage树为Gentoo用户提供的包的名称。Portage树是ebuilds文件的集合,这些文件包含了Portage管理工具维护软件(安装,搜索,查询, ...)时所需要的所有信息,并被默认的放置在/usr/portage目录中。
每当您要求Portage对系统中的软件包执行一些操作的时候,它会以系统中的ebuilds文件作为基础。因此您最好定期更新系统Portage树中的ebuild文件,这样Portage才知道新加入了哪些软件,哪些软件发布了安全更新,等等。
更新Portage树
通常我们使用rsync命令来更新Portage树,它是一个快速的增量性的文件传输工具。另外emerge命令为rsync命令提供了一个相当简单的前端。
代码 2.1: 更新Portage树 |
# emerge --sync
|
如果由于防火墙的限制,您无法进行rsync操作,您仍然可以通过下载我们每天汇总的Portage树快照来更新本地的Portage树。emerge-webrsync命令会自动将最新的Portage快照下载并安装到您的系统中。
代码 2.2: 运行emerge-webrsync |
# emerge-webrsync
|
1.c. 软件包维护
软件的查询
要在Portage树中查找指的的软件,您可以使用emerge命令里内建的查找功能。默认情况下,emerge --search会返回那些名字与您指定(无论完整或部分)的名字匹配的软件包。
例如,要查找那些名字中包含“pdf”字样的软件:
代码 3.1: 查找名字包含pdf的软件包 |
$ emerge --search pdf
|
而如果要通过软件的描述来查找相应的软件,您可以使用--searchdesc (或者简写为 -S) 开关:
代码 3.2: 查找与pdf相关的软件包 |
$ emerge --searchdesc pdf
|
当您观察输出结果的时候,会注意到它提供了大量信息。因为相关的区域已经进行了明确的标注,我们就不再进一步介绍各个部分的含义:
代码 3.3: 'emerge --search'返回结果的例子 |
* net-print/cups-pdf
Latest version available: 1.5.2
Latest version installed: [ Not Installed ]
Size of downloaded files: 15 kB
Homepage: http://cip.physik.uni-wuerzburg.de/~vrbehr/cups-pdf/
Description: Provides a virtual printer for CUPS to produce PDF files.
License: GPL-2
|
软件的安装
每当您找到一个感兴趣的软件,您可以轻松地用emerge命令安装它。例如,要安装gnumeric:
代码 3.4: 安装gnumeric |
# emerge gnumeric
|
因为许多应用程序互相依赖,试图安装其中任何一个,可能将会要求同时安装其所依赖的其他相关软件。无需担心,Portage可以很好地处理软件包间的依赖问题。当您安装某个软件的时候,您可以加上--pretend开关,以便观察Portage将会同时安装哪些软件。例如:
代码 3.5: 假装安装gnumeric |
# emerge --pretend gnumeric
|
当您要求Portage安装一个软件的时候,必要时它会自动从internet下载相应的源代码包并默认将其保存在/usr/portage/distfiles目录中,然后将源代码包解压缩,编译并安装软件。如果您仅仅希望Portage将源代码包下载到本地而不安装它们,在emerge命令后加上--fetchonly的选项:
代码 3.6: 下载gnumeric的源代码包 |
# emerge --fetchonly gnumeric
|
查找已安装软件的文档
许多软件包中包含有自己的文档,有些时候doc的USE标记决定了软件包中的自带文档是否会被安装到本地。您可以通过emerge -vp <软件包名称>命令来检查是否存在doc USE标记。
代码 3.7: 检查是否存在doc的USE标记 |
# emerge -vp alsa-lib
[ebuild N ] media-libs/alsa-lib-1.0.14_rc1 -debug +doc 698 kB
|
最好的启用doc的方式是在/etc/portage/package.use里对想要启用的包单独启用,这样你就能只获得你想要的软件文档。全局启用此标记已知会导致循环依赖。欲了解更多信息请看USE标志一章。
当一个软件包安装结束后,它的文档通常会存放在/usr/share/doc目录下以软件包名命名的子目录中。您也可以通过equery工具来列出此软件安装后生成的所有文件,这个工具来自于app-portage/gentoolkit 包。
代码 3.8: 定位包的文档 |
# ls -l /usr/share/doc/alsa-lib-1.0.14_rc1
total 28
-rw-r--r-- 1 root root 669 May 17 21:54 ChangeLog.gz
-rw-r--r-- 1 root root 9373 May 17 21:54 COPYING.gz
drwxr-xr-x 2 root root 8560 May 17 21:54 html
-rw-r--r-- 1 root root 196 May 17 21:54 TODO.gz
# equery files alsa-lib | less
media-libs/alsa-lib-1.0.14_rc1
* Contents of media-libs/alsa-lib-1.0.14_rc1:
/usr
/usr/bin
/usr/bin/alsalisp
|
软件的移除
当您想把一个软件包从系统中移除的时候,使用emerge --unmerge命令。命令执行完成后,除了那些在安装软件包后您修改过的配置文件,Portage将会移除此软件包安装到您系统中的所有文件。保留这些修改过的配置文件是为了便于您今后再次使用同一个软件包。
不过,您需要特别注意的是:Portage将不会检查您要删除的包是否仍被其他的包依赖。但是当您要删除一个可能破坏您系统的重要的软件包时,它还是会给予警告。
代码 3.9: 从系统中删除gnumeric |
# emerge --unmerge gnumeric
|
当您从系统中移除一个软件包时,之前那些为了满足其依赖关系而自动被一并安装的软件包将会被保留。如果想让Portage找出那些现在可以移除的相关软件包,可以使用emerge的--depclean功能。稍后我们将谈到这点。
更新您的系统
要保持您系统在最佳状态(更不用说安装那些最新的安全更新),您需要定期的更新您的系统。由于Portage只能检查本地Portage树中已有的ebuilds文件,因此您首先应该更新您的Portage树。当您的Portage树更新后,您可以用emerge --update world命令来更新系统。在下一个例子里,我们还会使用--ask开关来控制Portage显示它要更新的软件包列表,并让您决定是否继续更新。
代码 3.10: 更新您的系统 |
# emerge --update --ask world
|
Portage接下来会查找您已经安装的软件包是否有更新版本,但它只会核对那些您已经明确地安装过的软件包(也就是在/var/lib/portage/world文件中列出的包),并不会完整去的检查与这些软件产生依赖关系的包是否也需要更新。如果您想更新系统中的每个软件包,那就加上--deep参数:
代码 3.11: 更新整个系统 |
# emerge --update --deep world
|
因为有时开发者会为那些您没有明确要求安装(但被其他软件包依赖而装入系统中)的包推出安全更新,我们也推荐偶尔运行一下这个命令。
每当您改变了系统中任何的USE标记后,您可能需要加入--newuse选项。这样Portage将会检查这个USE标记的变动是否导致需要安装新的软件包或者将现有的包重新编译。
代码 3.12: 执行完整更新 |
# emerge --update --deep --newuse world
|
Meta软件包
Portage树中的一些软件包并没有包含任何实际的内容,而只是用来安装一系列软件包的集合。例如,kde包就是一个包含了一系列与KDE相关的互相依赖的软件包的集合,您可以通过安装它来在系统中搭建起一个完整的KDE环境。
如果您试图从系统中移除一个这样的软件包的集合体,只是单纯地使用emerge --unmerge命令并不能完成您的要求,原因在于这些包的依赖关系仍然保留在系统中。
不用担心,Portage也提供了移除孤立依赖的软件包的功能,但由于软件包间的依赖关系是动态的,您首先需要充分地更新您的整个系统,包括更改USE标记设定而导致的变化。在这之后您可以运行emerge --depclean来移除那些完全没有被其他包依赖的软件包(“orphaned dependencies”)。移除之后你需要重新编译那些曾经与刚刚移除的这些包动态连接过的应用程序,因为实际上这些程序不需要那些包。
所有这些可以用以下三个命令来实现:
代码 3.13: 移除孤立依赖的软件包 |
# emerge --update --deep --newuse world
# emerge --depclean
# revdep-rebuild
|
revdep-rebuild工具由gentoolkit包提供;使用前别忘了首先emerge它:
代码 3.14: 安装gentoolkit包 |
# emerge gentoolkit
|
1.d. 当Portage抱怨的时候...
有关SLOT,Virtual,分支,体系结构和Profile
正如我们之前指出的那样,Portage是一个非常强大并支持许多特性的软件包管理工具,而这是其他类似工具所欠缺的。为了理解这一点,我们为您粗略地解释一些Portage的面貌。
通过使用Portage,一个软件的不同版本可以共存于一个系统中。其他发行版倾向于直接在软件包名字中包含版本号(例如freetype 和 freetype2),Gentoo的Portage使用一种我们称之为SLOT的技术来实现这种并存。一个ebuild为它自身的版本声明了一个确切的SLOT。具有不同SLOT的同一软件的Ebuild可以共存于同一个系统中。例如,上例中那个freetype包就拥有不同的ebuilds,里面分别有SLOT="1"和SLOT="2"的标志。
有一些不同的软件包提供了类似的功能。比如metalogd,sysklogd和syslog-ng都是系统日志记录工具。那些依赖于“系统日志记录工具”的程序并不能随便的依赖于其中之一,比如metalogd,因为其他的系统日志工具可能也是很好的选择。好在Portage允许使用虚拟包:每一个系统日志记录工具都可以提供virtual/syslog包,因此应用程序们可以设定成仅仅依赖于virtual/syslog即可。
Portage树中的软件可以存在于不同的分支中。您的系统默认只会接受那些Gentoo认为稳定的软件包。绝大多数新提交的软件会被添加到测试分支里。这意味着在此软件被标示为稳定版前需要进行更多的测试。尽管您可以看到那些软件的ebuilds已经加入Portage树,在它们未被加入稳定分支前Portage将不会安装它们。
有些软件只在某几个体系结构上可用。或者在其他体系结构中还不能运行,或者仍需要对其进行更多的测试,或者将软件提交到Portage树中的开发者还不能确定这个软件能否运行于其他体系结构。
每一个Gentoo安装都依附于一个确定的profile,此文件里除了其他信息外还包含了一个正常工作的系统需要的软件包的列表。
被阻挡的包
代码 4.1: Portage关于被阻挡的包的警告(使用 --pretend参数) |
[blocks B ] mail-mta/ssmtp (is blocking mail-mta/postfix-2.2.2-r1)
|
代码 4.2: Portage关于被阻挡的包的警告(不使用 --pretend参数) |
!!! Error: the mail-mta/postfix package conflicts with another package.
!!! both can't be installed on the same system together.
!!! Please use 'emerge --pretend' to determine blockers.
|
Ebuilds文件中包含了特定的字段,里面为Portage提供了此软件的各种依赖关系的信息。总计有两种可能的依赖关系:一种是编译依赖,在DEPEND区域进行声明;另一种是“运行时”依赖,在RDEPEND区域中进行声明。如果上述两种依赖关系中任何一个明确指明某个实体或者虚拟包(译注:可能已安装和正要安装)与要安装的包不相容的时候,就会阻挡软件的安装。
为了使安装得以继续进行,您可以选择不安装这个软件包,或者先将发生冲突的包卸载。例如,在我们给出的这个例子中,您可以选择不安装postfix,或者先卸载ssmtp。
你也可能会遇到某些特定版本的包被屏蔽的情况,比如<media-video/mplayer-bin-1.0_rc1-r2。在这种情况下,升级到一个更新的版本就能解决问题。
也有可能两个需要安装的包互相阻挡。这种少见的情况下,您应该明确自己为什么需要同时安装它们。绝大多数时候您只需要安装它们之中的一个就可以了。如果不是这样,请您到Gentoo的bug跟踪系统中提交一个bug,以便我们找出解决方案。
被屏蔽的包
代码 4.3: Portage关于被屏蔽的包的警告 |
!!! all ebuilds that could satisfy "bootsplash" have been masked.
|
代码 4.4: Portage关于被屏蔽的包的警告——原因 |
!!! possible candidates are:
- gnome-base/gnome-2.8.0_pre1 (masked by: ~x86 keyword)
- lm-sensors/lm-sensors-2.8.7 (masked by: -sparc keyword)
- sys-libs/glibc-2.3.4.20040808 (masked by: -* keyword)
- dev-util/cvsd-1.0.2 (masked by: missing keyword)
- games-fps/unreal-tournament-451 (masked by: package.mask)
- sys-libs/glibc-2.3.2-r11 (masked by: profile)
|
当您想安装一个对于您系统不可用的软件包。您会收到类似这样的屏蔽错误提示。您应该试着安装那些对于您系统可用的程序或者等待那些不可用的包被置为可用的。通常一个软件包被屏蔽的原因在于:
-
~arch keyword 意味着这个软件没有经过充分的测试,不能进入稳定分支,请等待一段时间后在尝试使用它。
-
-arch keyword或-* keyword 意味着这个软件不能工作在您机器的体系结构中。如果您确信它能工作那么请到我们的bugzilla网站提交一个bug报告。
-
missing keyword 意味着这个软件还没有在您机器的体系结构中进行过测试。您可以咨询相应体系结构移植小组是否能对它进行测试,或者您自己为他们进行这样的测试并将您得到的结论提交到我们的bugzilla网站。
-
package.mask 意味着这个软件被认为是损坏的,不稳定的或者有更严重的问题,它被故意标识为“不应使用”。
-
profile 意味着这个软件不适用于您的profile。安装这样的应用软件可能会破坏您的系统,或者只是不能与您使用的profile相兼容。
依赖缺失
代码 4.5: Portage关于依赖缺失的警告 |
emerge: there are no ebuilds to satisfy ">=sys-devel/gcc-3.4.2-r4".
!!! Problem with ebuild sys-devel/gcc-3.4.2-r2
!!! Possibly a DEPEND/*DEPEND problem.
|
这表示您正尝试安装的应用程序依赖于您的系统不可用的另外一些软件包。请到bugzilla查看是否有此问题的记录,如果没有查找到相关信息的话请提交一个报告。除非您的系统混用了不同分支,否则这类问题不应该发生,若发生了那就是一个bug。
意指不明的Ebuild名称
代码 4.6: Portage对于意指不明的Ebuild名称的警告 |
!!! The short ebuild name "aterm" is ambiguous. Please specify
!!! one of the following fully-qualified ebuild names instead:
dev-libs/aterm
x11-terms/aterm
|
您要安装的应用程序对应有多个同名的包。您需要同时指定类别的名称。Portage会列出所有可供选择的名称匹配的包。
循环依赖
代码 4.7: Portage关于循环依赖问题的警告 |
!!! Error: circular dependencies:
ebuild / net-print/cups-1.1.15-r2 depends on ebuild / app-text/ghostscript-7.05.3-r1
ebuild / app-text/ghostscript-7.05.3-r1 depends on ebuild / net-print/cups-1.1.15-r2
|
两个(或多个)您想安装的包由于循环依赖而不能安装。这很可能源于Portage树中的bug。请等一段时间后重新sync再尝试安装。您也可以去bugzilla看看是否已经有此问题的报告,或者提交一个关于它的报告。
下载失败
代码 4.8: Portage关于下载失败的警告 |
!!! Fetch failed for sys-libs/ncurses-5.4-r5, continuing...
!!! Some fetch errors were encountered. Please see above for details.
|
当Portage下载指定软件的源代码失败时,它会尝试继续安装其它(若适用)的应用程序。源代码下载失败可能源于镜像服务器没有正确同步,也可能因为ebuild文件给出了错误的下载地址。那些保存源代码的服务器也可能因为某些原因当机。
一小时后重试一次看看问题是否仍然存在。
系统Profile保护
代码 4.9: Portage关于profile中保护的包的警告 |
!!! Trying to unmerge package(s) in system profile. 'sys-apps/portage'
!!! This could be damaging to your system.
|
您要求移除系统核心软件包中的一个。它是您的profile中所列出的必需的软件,因此不能从系统中移除。
Digest验证失败
有时当您试图emerge一个软件包时,它会失败并给出以下信息:
代码 4.10: Digest验证失败 |
>>> checking ebuild checksums
!!! Digest verification failed:
|
这是Portage树中出现了错误的迹象,通常这是由于开发者在向Portage树提交一个软件包时出错造成的。
当digest校验失败的时候,请不要尝试自己去为此软件包重新产生digest。使用ebuild foo manifest并不能修复问题,反而几乎肯定会使问题变得更糟。
取而代之的应该是等待一至两个小时以便让开发者来修复Portage树。一般来说错误很有可能马上就会被开发者注意到,但Portage树的修复也需要一点点时间。当您等待的时候,到Bugzilla看看是否已经有人报告了这个问题。如果没有,那就为那个损坏的包提交一个bug报告吧。
一旦在Bugzilla上看到此问题已经修复,您只需要重新sync就可以下载下来那些修复后的digest。
重要:
但值得注意的是:这并不意为着您可以短时间内多次重复sync您的portage树(对于同一个rsync服务器)。正如(当您运行emerge --sync时)rsync策略所指出的那样,那些短时间内过于频繁进行多次sync的用户将会被更新服务器禁止访问(一般是将你的IP添加到禁止名单并保留一段指定的时间后才解除)。实际上,最好等到您的下次计划更新的日子再sync,因为这样您不会使rsync服务器过载而影响其他用户的正常使用。
|
2. USE标记
2.a. USE标记是什么?
USE标记的指导思想
你在安装gentoo(或者是其他发行版,甚至于其他特定操作系统)的时候,你要依据你工作的环境做出选择。服务器跟工作站的组织结构不同,游戏机跟3D工作站也会不一样。
不单只是选择你想要安装的包时如此,选择某一个包需要的特性时同样如此。如果你不需要OpenGL,为什么还要颇费周折的安装OpenGL并在其他包中加入对OpenGL的支持?如果你不想用KDE,而且软件包没有KDE也能完美运行,为什么还要在编译这些包的时候加入KDE支持?
为了帮用户判断什么需要安装或激活,什么不需要;我们希望用户能用简单的方式设定他们自己的环境。这能促使用户判断他真正需要的东西,并让Portage(我们的包管理系统)做出有用的决定的过程变得简单。
USE标记的设定
我们来具体看看USE标记。每一个标记都是代表对某特定概念的支持和依赖关系信息的关键字。如果你设定了某个USE标记,Portage会明白你选择了支持这个关键字(所代表的概念)。当然这同时也改变了这个包的依赖关系信息。
让我们看一个示例:关键字kde。如果你的USE变量里面没有这个关键字,所有具有可选KDE支持的包在编译时都不会编译KDE支持。所有具有可选KDE依赖关系的包在安装时都不会(做为一个依赖关系而)安装KDE库。如果你设定了kde关键字,这些包在安装时都会编译KDE支持,而且KDE库也会(作为一个依赖关系而)被安装。
通过正确设定关键字,你会得到一个根据你的需要而定制的系统。
有哪些USE标记?
USE标记分两类:全局和局部USE标记。
-
全局USE标记适用范围是整个系统,可以被许多包使用。这就是大多数人眼里的USE标记。
-
局部USE标记只被单个包用来做该包特有的决定。
当前可用的全局USE标记列表可以在网上或者本机的/usr/portage/profiles/use.desc文件里找到。
当前可用的局部USE标记列表可以在本机的/usr/portage/profiles/use.local.desc 文件里找到。
2.b. 使用USE标记
声明永久USE标记
希望您已经意识到了USE标记的重要性,现在我们就让你了解怎样声明USE标记。
就像前面提到的,所有USE标记都声明在USE变量里面。为了让用户能方便地查找和选择USE标记,我们提供了一份默认的USE设定。这些设定是我们觉得Gentoo用户通常都要用到的USE标记的集合。这个默认设置在make.defaults文件──你的profile的一部分──里声明。
你的系统使用的profile是符号链接/etc/make.profile所指向的目录。每个profile叠加于某个更大的profile之上,最终的结果是这些profile的并集。初始profile是base profile(/usr/portage/profiles/base)。
让我们看看2004.3 profile的默认设定:
代码 2.1: 2004.3 profile的累积make.defaults USE标记 |
USE="x86 oss apm arts avi berkdb bitmap-fonts crypt cups encode fortran f77
foomaticdb gdbm gif gpm gtk imlib jpeg kde gnome libg++ libwww mad
mikmod motif mpeg ncurses nls oggvorbis opengl pam pdflib png python qt
quicktime readline sdl spell ssl svga tcpd truetype X xml2 xmms xv zlib"
|
就像你看到的那样,这个变量已经包括了非常多的关键字。不要通过修改make.defaults文件里的USE变量来满足你的需要:在升级Portage的时候,这个文件将会被破坏(被覆盖)。
要改变这个默认设置,你需要在USE变量里添加或移去关键字。这是通过在/etc/make.conf里定义USE全局变量来实现的。在这个变量里,添加你需要的额外的USE标记,或者移去你不需要的USE标记。后者可通过在标记前面加个负号(“-”)前缀来实现。
例如,要移除对KDE和QT的支持,并添加对ldap的支持,可以在/etc/make.conf 里声明USE如下:
代码 2.2: /etc/make.conf里关于USE设置的一个例子 |
USE="-kde -qt3 -qt4 ldap"
|
为单个包声明USE标记
如果你想要为一个(或者几个)程序而不是系统范围内声明一个USE标记,你需要创建/etc/portage目录(如果没有这个目录的话),然后编辑/etc/portage/package.use文件。通常这是一个文件,不过它也可以是一个目录;请看man portage以获得更多信息。下面的例子假设package.use是一个文件。
比如说,如果你不想全局的启用berkdb支持,但是你想把它应用到mysql,你可以这样:
代码 2.3: /etc/portage/package.use示例 |
dev-db/mysql berkdb
|
你当然也可以直接为某一个程序禁用USE标记。比如说,如果你不想要PHP的java支持:
代码 2.4: /etc/portage/package.use第二个示例 |
dev-php/php -java
|
声明临时USE标记
有时,你只想暂时改变一个USE设置。你可以仅仅把USE变量声明成一个环境变量,而不必两次修改/etc/make.conf。但是要记住,当你重新emerge或者升级这个程序的时候(不管是单独地还是作为系统升级的一部分),你的修改都会丢失!
下面的例子我们将在安装seamonkey的时候暂时性地从USE设置中移去java标记。
代码 2.5: 将USE作为一个环境变量使用 |
# USE="-java" emerge seamonkey
|
优先级
当然,我们需要一个明确的先后次序来决定何处的USE设定优先级较高。你肯定不希望在定义了USE="-java"之后,因为某个有更高优先级的设定而导致java仍然被使用。USE设定的优先级顺序是(由低到高):
-
make.defaults里面的USE默认设定
-
用户在/etc/make.conf里面的USE设定
-
用户在/etc/portage/package.use里面的USE设定
-
作为环境变量的USE设定
运行emerge --info可以看到Portage识别的最终的USE设定。它会列出Portage使用的所有相关变量(包括USE变量)。
代码 2.6: 运行emerge --info |
# emerge --info
|
在你的整个系统上应用新的USE标记
如果你已经修改了你的USE标记,而且你想用新USE标记更新你的系统,可以使用emerge 的--newuse选项:
代码 2.7: 重新构建你的系统 |
# emerge --update --deep --newuse world
|
然后运行Portage的depclean来移除已经安装到你的旧系统里但是在新USE标记中被废除的条件依赖关系。
警告:
运行emerge --depclean是一项危险的操作,必须小心。请反复检查要删除的包的列表里确定没有你仍然需要的包。下面这个例子里,我们添加了-p选项来depclean──只列出这些包而不删除他们。
|
代码 2.8: 删除不需要的包 |
# emerge -p --depclean
|
depclean完成之后,运行revdep-rebuild来重新构建那些动态链接到由可能已经删除的包提供的公共对象的程序。revdep-rebuild是gentoolkit包的一部分,不要忘了先emerge它。
代码 2.9: 运行revdep-rebuild |
# revdep-rebuild
|
这些都完成之后,你的系统就已经应用上了新的USE标记设定。
2.c. 包特有的USE标记
查看可用USE标记
让我们以seamonkey来作例子,看看它接收什么USE标记。我们可以以--pretend和--verbose为选项执行emerge来查看:
代码 3.1: 查看使用的USE标记 |
# emerge --pretend --verbose seamonkey
These are the packages that I would merge, in order:
Calculating dependencies ...done!
[ebuild R ] www-client/seamonkey-1.0.7 USE="crypt gnome java -debug -ipv6
-ldap -mozcalendar -mozdevelop -moznocompose -moznoirc -moznomail -moznopango
-moznoroaming -postgres -xinerama -xprint" 0 kB
|
emerge并不是做这件事的唯一工具。事实上,我们有一个专门的包信息工具叫equery,它属于gentoolkit包。所以首先请安装gentoolkit:
代码 3.2: 安装gentoolkit |
# emerge gentoolkit
|
现在以uses为参数执行equery来查看指定包的USE标记。例如:gnumeric包:
代码 3.3: 用equery来查看当前使用的USE标记 |
# equery --nocolor uses =gnumeric-1.6.3 -a
[ Searching for packages matching =gnumeric-1.6.3... ]
[ Colour Code : set unset ]
[ Legend : Left column (U) - USE flags from make.conf ]
[ : Right column (I) - USE flags packages was installed with ]
[ Found these USE variables for app-office/gnumeric-1.6.3 ]
U I
- - debug : Enable extra debug codepaths, like asserts and extra output.
If you want to get meaningful backtraces see
http://www.gentoo.org/proj/en/qa/backtraces.xml.
- - gnome : Adds GNOME support
+ + python : Adds support/bindings for the Python language
- - static : !!do not set this during bootstrap!! Causes binaries to be
statically linked instead of dynamically
|
3. Portage特性
3.a. Portage特性
Portage有几个附加的特性,它们能够令您的Gentoo之旅更加愉快。这些特性中的大多数依赖于某些能够提高性能、可靠性、安全性等的软件工具。
为了打开或者关闭某一Portage特性您需要编辑/etc/make.conf中的FEATURES变量,这个变量包含不同的特性关键字,用空格分开。在一些情况下您可能还需要额外的安装被这个特性所依赖的工具。
并不是所有Portage所支持的特性都在这里列出。完整的概述,请查阅make.conf手册页。
代码 1.1: 查阅make.conf手册页 |
$ man make.conf
|
查看特性的默认设置,运行emerge --info并且查找FEATURE变量或者用grep显示它:
代码 1.2: 找出已经被设定的特性 |
$ emerge --info | grep FEATURE
|
3.b. 分布式编译
使用distcc
distcc是一个分布式编译程序,可以把编译任务分配给同一网络中的不同机器,这些机器的配置不必完全相同。distcc客户端发送所有必须的信息给所有可利用的distcc服务器(运行distccd的机器)。这样它们每一个都能为客户端编译一部分源码。所导致的效果就是更短的编译时间。
您可以在Gentoo Distcc文档里找到更多的关于distcc的信息(包括如何让它在Gentoo上工作)。
安装distcc
Distcc使用一个图形化监视器来监视您的机器发送出去的编译工作。如果您使用GNOME,那么将“gnome”放入您的USE设置中。但是,如果您不使用GNOME而仍然希望使用这个监视器,那么就把“gtk”放进您的USE设置中。
代码 2.1: 安装distcc |
# emerge distcc
|
激活Portage支持
添加distcc到/etc/make.conf之中的FEATURES变量。然后,设定您合意的MAKEOPTS变量。一个众所周知的参数是"-jX",其中X为运行distccd主机(包含当前主机)的CPU数目加上一,但是您也可能用其他的数字来得到更好的结果。
现在运行distcc-config并输入已有的DistCC服务器。作为一个简单例子,我们假设已有的DistCC服务器是192.168.1.102(当前主机)、192.168.1.103和192.168.1.104(两个远端服务器):
代码 2.2: 配置Distcc,使用已有的三个DistCC服务器 |
# distcc-config --set-hosts "192.168.1.102 192.168.1.103 192.168.1.104"
|
当然,也不要忘了运行distccd系统服务:
代码 2.3: 开始Distcc系统服务 |
# rc-update add distccd default
# /etc/init.d/distccd start
|
3.c. 缓冲编译结果
关于ccache
ccache是一个快速的编译器缓存。当您编译一个程序的时候,它会缓存中间的结果。这样,不论什么时候您重新编译同一个程序,编译所需要得时间将被大大缩短。对于普通的编译来说,这可以提高编译速度5到10倍。
如果您对ccache的工作机制有兴趣,请访问ccache主页.
安装ccache
要安装ccache,只需要运行emerge ccache:
代码 3.1: 安装ccache |
# emerge ccache
|
激活Portage支持
打开/etc/make.conf并添加ccache到FEATURES变量。然后添加一个新的变量CCACHE_SIZE并设置它为"2G":
代码 3.2: 在/etc/make.conf中设定CCACHE_SIZE |
CCACHE_SIZE="2G"
|
要检查ccache是否运行,只需让它提供给您它的统计数据。因为Portage使用一个不同的ccache主目录,您需要设定CCACHE_DIR变量:
代码 3.3: 查看ccache统计数据 |
# CCACHE_DIR="/var/tmp/ccache" ccache -s
|
/var/tmp/ccache是Portage的默认ccache主目录;为了修改这个设置,您可以设定/etc/make.conf中的CCACHE_DIR参数。
不过,如果您运行ccache,它使用的默认目录是${HOME}/.ccache。这就是为什么当您查询(Portage)ccache统计数据的时候您需要设定CCACHE_DIR参数的原因。
非Portage C编译中使用ccache
如果您需要在非Portage编译中使用ccache,添加/usr/lib/ccache/bin到您PATH参数里靠前的位置(在/usr/bin之前)。这一点可以通过编辑在您用户主目录中的.bash_profile文件来实现。使用.bash_profile是定义PATH参数的一个方式.
代码 3.4: 编辑.bash_profile |
PATH="/usr/lib/ccache/bin:/opt/bin:${PATH}"
|
3.d. 二进制包支持
创建预编译包
Portage支持用预编译包安装。尽管Gentoo本身并不提供预编译包(除GRP快照之外),Portage依然能够处理预编译包。
如果某个包已经被安装在您的系统上,您可以用quickpkg来创建一个预编译包。也可以用带有--buildpkg或--buildpkgonly选项的emerge命令。
如果您希望Portage为您所安装的每一个单独的包创建预编译包,在FEATURES中添加buildpkg参数.
预编译包的更多扩展支持可以用catalyst得到。关于catalyst的更多信息请参阅Catalyst FAQ.
安装预编译包
尽管Gentoo并不提供,但是您可以自己建立一个“中心仓库”来存放预编译包。如果您希望使用这个仓库,您需要设定PORTAGE_BINHOST参数使Portage能够知道它。例如,如果预编译包在ftp://buildhost/gentoo上:
代码 4.1: 在/etc/make.conf中设定PORTAGE_BINHOST参数 |
PORTAGE_BINHOST="ftp://buildhost/gentoo"
|
当您需要安装预编译包的时候,在emerge命令后的--getbinpkg选项旁加入--usepkg选项。前者让emerge命令从预定的服务器上下载预编译包,后者让emerge首先试图安装预编译包,如果预编译包不存在,那么才下载并编译源码。
例如:用预编译包安装gnumeric
代码 4.2: 安装gnumeric的预编译包 |
# emerge --usepkg --getbinpkg gnumeric
|
关于emerge的预编译包的更多信息请参阅emerge手册页:
代码 4.3: 阅读emerge手册页 |
$ man emerge
|
3.e. 下载文件
并行下载
当您在编译一系列软件的时候,Portage能在编译某一个包的同时下载编译列表中后面的包的源码,这样就缩短了安装时间。如果您希望使用这种功能,添加“parallel-fetch”到您的FEATURES变量里。
Usersfetch
当您以root身份运行Portage,FEATURES="userfetch"可以让Portage在下载源码包的时候放弃root特权。这是一个小小的安全性的提高。
4. 初始化脚本
4.a. 运行级别
启动你的系统
当你启动系统时,会发现有很多的文字信息输出。如果注意观察的话,会发现每次启动时这些文字信息都是相同的。所有这些动作的顺序我们称之为启动顺序,而且它们基本上是被静态定义的。
首先,你的引导程序会把你在引导程序配置文件中定义的内核镜像加载到内存中,之后它就告诉CPU可以运行内核了。当内核被加载且运行后,内核会初始化所有内核专有的结构体和任务,并开启init进程。
然后,这个进程确保所有的文件系统(在/etc/fstab中定义的)都已被挂载且能使用。接着,该进程会执行位于/etc/init.d下的一些脚本,这些脚本会启动一些你需要的服务,以使你能获得一个成功启动的系统。
最终,当所有的脚本执行完毕,init将激活终端(大多情况下只是激活虚拟终端,可以使用Alt-F1、Alt-F2等来访问),并把一个叫agetty的特殊进程附于其上。这个进程会确保你可以通过运行login从这些终端登录到你的系统中。
初始化脚本
现在init不会随机的执行/etc/init.d下的脚本。甚至,它不会运行/etc/init.d下所有的脚本,它只会执行那些需要被执行的脚本。这个是由/etc/runlevels目录决定的。
首先,init会运行所有/etc/runlevels/boot目录下的符号链接所指向的/etc/init.d目录下的脚本。通常,它会按照字母顺序执行这些脚本,但是有些脚本中含有依赖关系,意味着系统要在执行另一个脚本之后才能运行此脚本。
当/etc/runlevels/boot目录所引用的脚本都执行完毕后,init将继续运行/etc/runlevels/default目录下的符号链接所指向的脚本。同样它们会按照字母顺序执行这些脚本,除非一个脚本有依赖关系,那样的话现有次序就会被改变以使启动顺序更加合理。
Init进程是如何工作的
当然init自己不会决定所有的启动顺序。它需要一个配置文件来指定它的工作流程。这个配置文件就是/etc/inittab。
如果你还记得我们刚刚描述的启动顺序,你会记得init首先做的是挂载所有的文件系统。这个功能其实是在/etc/inittab这个配置文件中定义好的。如下:
代码 1.1: /etc/inittab中系统初始化行 |
si::sysinit:/sbin/rc sysinit
|
这一行告诉init必须运行/sbin/rc sysinit来初始化系统。/sbin/rc脚本是负责系统初始化的,所以你可能会说init它本身并没做太多的事情——它只是把初始化系统任务交给了另一个进程。
接下来,init会执行所有在/etc/runlevels/boot目录下的具有符号链接的脚本。这是由下面这行定义的:
代码 1.2: 系统初始化,承上 |
rc::bootwait:/sbin/rc boot
|
同样,rc脚本将完成必要的工作。注意:给rc脚本的参数(boot)和要用的/etc/runlevels的子目录是一样的。
现在init进程将检查配置文件来判断应该运行哪个运行级别(runlevel)。它是通过读取/etc/inittab中的下面这行来决定的:
代码 1.3: 系统默认运行级别行 |
id:3:initdefault:
|
在这个例子(绝大部分的Gentoo用户将使用)里,运行级别id为3。根据这个信息,init进程会检查该执行什么来启动运行级别3:
代码 1.4: 运行级别的定义 |
l0:0:wait:/sbin/rc shutdown
l1:S1:wait:/sbin/rc single
l2:2:wait:/sbin/rc nonetwork
l3:3:wait:/sbin/rc default
l4:4:wait:/sbin/rc default
l5:5:wait:/sbin/rc default
l6:6:wait:/sbin/rc reboot
|
定义了级别3的行将再次调用rc脚本来启动服务(现在参数为default)。请再次注意:rc使用的参数和/etc/runlevels下的子目录是一样的。
当rc执行完毕后,init将会决定哪些虚拟终端需要被激活以及每个终端需要运行什么样的命令:
代码 1.5: 虚拟终端定义 |
c1:12345:respawn:/sbin/agetty 38400 tty1 linux
c2:12345:respawn:/sbin/agetty 38400 tty2 linux
c3:12345:respawn:/sbin/agetty 38400 tty3 linux
c4:12345:respawn:/sbin/agetty 38400 tty4 linux
c5:12345:respawn:/sbin/agetty 38400 tty5 linux
c6:12345:respawn:/sbin/agetty 38400 tty6 linux
|
什么是运行级别?
你已经看到init使用一种数字的方式来决定需要激活的运行级别。运行级别表示你系统运行的状态,它包含了你进入或退出一个运行级别时需要执行的一组脚本(运行级别脚本或者初始化脚本)。
在Gentoo中定义了七种运行级别:三个内部运行级别和四个用户自定义运行级别。这些内部运行级别分别叫做sysinit、shutdown和reboot,它们所做的就如同像它们的名字那样:初始化系统、关闭系统和重启系统。
用户定义的运行级别都在/etc/runlevels目录下有同名的子目录:boot、default、nonetwork和single。运行级别boot会启动所有其他运行级别必须要使用到的系统服务。其余的三个运行级别的不同之处主要在于它们要启动的服务:default是用来日常工作用的;nonetwork是在无网络的情况下使用的;还有single是用户修复系统时用的。
使用初始化脚本
实际上rc进程调用的脚本都称为初始化脚本。每个在/etc/init.d下的脚本都可以在执行时带上以下参数,如:start、stop、restart、pause、zap、status、ineed、iuse、needsme、usesme或者broken。
要启动、停止或者重启一个服务(和所有依赖于它的服务),应该用参数start、stop和restart。示例如下:
代码 1.6: 启动Postfix服务 |
# /etc/init.d/postfix start
|
注意:
只有那些需要给定服务的服务会被暂停或重启。而其他依赖(使用但不需要)于它的服务则不会被暂停或重启。
|
如果你想要停止一个服务,但是不想影响依赖于它的服务,可以用pause这个参数:
代码 1.7: 停止Postfix服务但又保持相关依赖着的服务继续运行 |
# /etc/init.d/postfix pause
|
如果你要查看一个服务的运行状态(如:启动、停止、暂停……),你可以使用参数status:
代码 1.8: 查看postfix服务的运行状态 |
# /etc/init.d/postfix status
|
如果状态信息告诉你服务正在运行,但是你知道它实际上没有运行,这种情况下你可以使用参数zap将状态信息重设为“停止”:
代码 1.9: 重设postfix的状态信息 |
# /etc/init.d/postfix zap
|
有些时候我们也需要知道某个服务的依赖性,这时可以使用参数iuse或者ineed。使用ineed你可以查看这个服务正常工作真正必要的服务,而另一个方面iuse将会显示这个服务可能使用到的所有服务,但这并不一定是正常工作所必需的。
代码 1.10: 列出Postfix服务所依赖的所有必要服务列表 |
# /etc/init.d/postfix ineed
|
同样的,我们也可以知道哪些服务需要这个服务(needsme)或者哪些服务可以使用这个服务(usesme):
代码 1.11: 列出哪些服务需要Postfix服务 |
# /etc/init.d/postfix needsme
|
最后,我们还可以知道这个服务需要但又缺少的依赖关系:
代码 1.12: 列出Postfix所缺少的依赖关系 |
# /etc/init.d/postfix broken
|
4.b. 使用rc-update
什么是rc-update?
Gentoo的初始化系统使用依赖关系树(dependency-tree)来决定什么服务会首先被启动。因为这是个很乏味的工作,我们不想让我们的用户去手动来完成它,所以我们创建了简化运行级别和初始化脚本的管理工具(rc-update)。
使用rc-update你可以从一个运行级别中添加或删除初始化脚本。rc-update工具会自动调用/sbin/depscan.sh脚本来重新创建依赖关系树。
添加和删除服务
在Gentoo的安装过程中你已经添加初始化脚本到“default”运行级别。那时你可能还不清楚“default”是干什么的,但是现在你应该知道了。rc-update脚本需要由第二个参数来决定其行为:add、del或者是show。
要添加或删除一个初始化脚本,只需要给rc-update add或者del参数,并随后跟上初始化脚本和运行级别。如下:
代码 2.1: 从default级别中删除Postfix服务 |
# rc-update del postfix default
|
rc-update -v show命令将会显示出所有已存在的初始化脚本,并列出它们在哪个运行级别中运行:
代码 2.2: 获得初始化脚本的信息 |
# rc-update -v show
|
你也可以运行rc-update show(没有-v参数)来只查看已经启用的初始化脚本和他们的运行级别。
4.c. 配置服务
我们为什么需要额外的配置?
初始化脚本有时候是很复杂的。因此我们不想让用户自己直接编辑初始化脚本,这样将更容易出错。然而能够配置这样的一个服务也挺重要。比如:你可能想给某个服务本身添加更多的选项。
把配置信息独立于脚本之外存放的另一个原因是,你不用担心升级初始化脚本会覆盖掉你之前所做的改动。
/etc/conf.d目录
Gentoo提供了一个简单的方法来配置这样的一个服务:每一个可以配置的初始化脚本在/etc/conf.d里有一个文件。比如:apache2的初始化脚本(叫做/etc/init.d/apache2)有一个配置文件叫/etc/conf.d/apache2,它包含了Apache 2服务器启动时你要给它的选项:
代码 3.1: 在/etc/conf.d/apache2中定义的变量 |
APACHE2_OPTS="-D PHP5"
|
这样的一个配置文件包含了变量,且只含有变量(就如同/etc/make.conf一样),可以使得配置服务非常简便。它还允许我们提供更多有关这个变量的信息(以注释形式)。
4.d. 撰写初始化脚本
需要这样吗?
当然不是,自己写一个初始化脚本通常情况下不是必需的,因为Gentoo给已提供的服务准备了一个立刻就能使用的初始化脚本。但是,你可能没有通过Portage来安装一个服务,在这种情况下你通常将需要创建一个初始化脚本。
如果服务软件提供者提供的初始化脚本不是明确地专为Gentoo而写的,请不要使用它,因为Gentoo的初始化脚本和其他发行版的初始化脚本是不兼容的!
布局
一个初始化脚本的基本布局如下所示:
代码 4.1: 初始化脚本的基本布局 |
#!/sbin/runscript
depend() {
}
start() {
}
stop() {
}
restart() {
}
|
所有的初始化脚本都需要定义函数start()函数。其他所有的部分都是可选的。
依赖关系
在这里我们可以定义两种依赖关系:use和need。我们之前提到过,依赖关系中need比use要更加严格。紧跟着依赖关系类型之后你需要输入你所依赖的服务,或者虚拟依赖关系。
一个虚拟依赖关系是由一个服务提供的,但它不仅仅只有那个服务提供。我们自己定制的初始化脚本可以依赖于一个系统日志服务,但是可能我们有很多可用的系统日志程序(如:metalogd、syslog-ng、sysklogd……)。你不可能同时需要所有的系统日志程序(因为没有一个系统会同时安装和运行所有的系统日志程序),我们确保所有的这些服务都提供了一个虚拟依赖关系。
让我们来看看postfix服务的依赖关系信息:
代码 4.2: Postfix的依赖关系信息 |
depend() {
need net
use logger dns
provide mta
}
|
就像你看到的,postfix服务信息如下:
-
需要(虚拟)依赖关系net(比如可由/etc/init.d/net.eth0提供)
-
使用到的(虚拟)依赖关系logger(比如可由/etc/init.d/syslog-ng提供)
-
使用到的(虚拟)依赖关系dns(比如可由/etc/init.d/named提供)
-
提供(虚拟)依赖关系mta(所有的mail服务器一样)
控制执行顺序
在一些情况下你可能并不需要某一个服务,但是,你可能需要这个服务在系统中其他某可能存在的服务之前(或之后)启动(注意这个条件——这不再是依赖关系了)以及运行在同一个运行级别(注意这个条件——只牵扯到同一运行级别的服务)。你可以使用before或者after设置用来提供这个信息。
下面我们来看一下Portmap服务的配置情况:
代码 4.3: Portmap服务的depend()函数 |
depend() {
need net
before inetd
before xinetd
}
|
你也可以使用“*”来代替相同运行级别的所有服务,虽然这种做法不是很明智。
代码 4.4: 让初始化脚本在它所属的运行级别中第一个运行 |
depend() {
before *
}
|
如果你的服务需要写入本地磁盘,则需要localmount服务。如果它在/var/run目录下放置文件,例如一个pid文件(pidfile),那么我们需要它在bootmisc之后运行。示例如下:
代码 4.5: depend()函数示例 |
depend() {
need localmount
after bootmisc
}
|
标准函数
紧随函数depend(),你还需要定义函数start()。它包含了初始化该服务所需要的所有命令。我们推荐使用函数ebegin和eend函数来通知用户要发生的事情:
代码 4.6: start()函数示例 |
start() {
ebegin "Starting my_service"
start-stop-daemon --start --exec /path/to/my_service \
--pidfile /path/to/my_pidfile
eend $?
}
|
--exec和--pidfile都应该用在start和stop函数中。如果这个服务并没有创建一个pidfile,那么如果可能的话就用--make-pidfile创建一个,不过你应该进行必要的测试以确保可行。否则,就不要使用pid文件(pidfile)。你也可以添加--quiet选项到start-stop-daemon中,但是通常我们不建议使用它,除非这个服务输出的信息极端冗长。使用--quiet选项的服务如果启动失败,那么可能会给调试带来困难。
注意:
我们要确保--exec选项实际上调用的是一个服务,而不仅仅是一个启动和退出服务的shell脚本——那是初始化脚本应该做的事。
|
如果你需要更多的start()函数示例,可以阅读/etc/init.d目录下的初始化脚本源代码。
你还可以定义其他的函数:stop()和restart()。但你不是一定要定义这些函数,因为如果我们使用start-stop-daemon时我们的初始化系统可以足够智能地填充这些函数。
虽然你不必创建一个stop函数,但下面还是给出了示例:
代码 4.7: stop()函数示例 |
stop() {
ebegin "Stopping my_service"
start-stop-daemon --stop --exec /path/to/my_service \
--pidfile /path/to/my_pidfile
eend $?
}
|
如果你的服务运行了一些其他语言的脚本(例如:bash、python、或者是perl),并且这个脚本之后改了名字(例如:foo.py改为foo),那么你需要给start-stop-daemon添加--name选项。同时,你必须要明确说明改过的名字。在这个例子中,一个服务启动了foo.py脚本,之后该脚本改名为foo:
代码 4.8: 一个启动foo脚本的服务 |
start() {
ebegin "Starting my_script"
start-stop-daemon --start --exec /path/to/my_script \
--pidfile /path/to/my_pidfile --name foo
eend $?
}
|
关于start-stop-daemon更多的信息你可以从man手册中得到:
代码 4.9: 获得start-stop-daemon的man帮助 |
$ $ man start-stop-daemon
|
Gentoo初始化脚本的语法是基于Bourne Again Shell(bash)的,所以你可以自由地在你的初始化脚本中使用bash兼容的结构。
添加自定义选项
如果你想要初始化脚本支持比我们当前所看到的更多的选项,你可以添加选项名称到opts变量中,然后创建一个与选项同名的函数。示例:支持一个名为restartdelay的选项:
代码 4.10: 支持restartdelay选项 |
opts="${opts} restartdelay"
restartdelay() {
stop
sleep 3
start
}
|
服务配置变量
要支持/etc/conf.d里的配置文件,你不需要作任何操作:当你的初始化脚本执行的时候,下面的文件将会被自动source(也就是说可以使用里面的变量):
- /etc/conf.d/<你的初始化脚本>
- /etc/conf.d/basic
- /etc/rc.conf
而且,如果你的初始化脚本提供了一个虚拟依赖关系(如:net),那么和这个依赖关系相关的文件(如:/etc/conf.d/net)也会被source。
4.e. 改变运行级别的行为
谁可能从此获益?
许多笔记本用户会遇到这样的情形:在家时你需要启动net.eth0,而在路上你就不需要启动net.eth0(因为没有网络可用)。使用Gentoo,你可以根据你的意愿来改变运行级别的行为。
例如:你可以创建另一个可以启动的“default”运行级别,并分配其他的一些初始化脚本给它。然后你可以在启动时选择你想要运行哪个“default”运行级别。
使用softlevel
首先,给你的另一个“default”运行级别创建一个运行级别目录。作为一个例子我们创建offline运行级别:
代码 5.1: 创建一个运行级别目录 |
# mkdir /etc/runlevels/offline
|
下面我们添加必要的初始化脚本到新创建的运行级别中。示例:如果你需要一个与你当前的default运行级别一模一样的副本,但不包括net.eth0:
代码 5.2: 添加必要的初始化脚本 |
# cd /etc/runlevels/default
# for service in *; do rc-update add $service offline; done
# rc-update del net.eth0 offline
# rc-update show offline
acpid | offline
domainname | offline
local | offline
net.eth0 |
|
虽然net.eth0已经从offline运行级别中被移除了,udev仍然尝试启动任何它检测到的设备并启动对应的服务。因此,你将需要把每一个你不想启动的网络服务(还有其他任何udev可能启动的设备的服务)加入/etc/conf.d/rc,如下所示。
代码 5.3: 在/etc/conf.d/rc里禁用设备启动的服务 |
RC_COLDPLUG="yes"
RC_PLUG_SERVICES="!net.eth0"
|
注意:
欲知更多有关设备启动的服务的信息,请看/etc/conf.d/rc文件中的注释。
|
现在可以编辑你的引导程序的配置文件并且添加一个offline运行级别的条目。示例:在/boot/grub/grub.conf中:
代码 5.4: 增加一个offline运行级别的条目 |
title Gentoo Linux Offline Usage
root (hd0,0)
kernel (hd0,0)/kernel-2.4.25 root=/dev/hda3 softlevel=offline
|
至此,所有的设置都好了。如果你启动你的系统并在启动时选择新添的条目,将会使用运行级别offline而不是default。
使用bootlevel
使用bootlevel完全类似于softlevel。仅仅不同的是在这里你要定义另一个“boot”运行级别而不是另一个的“default”运行级别。
5. 环境变量
5.a. 环境变量?
什么是环境变量
环境变量是一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。许多用户(特别是那些刚接触Linux的新手)发现这些变量有些怪异或者难以控制。其实,这是个误会:通过使用环境变量,你可以很容易的修改一个牵涉到一个或多个应用程序的配置信息。
重要的例子
下表罗列了一些Linux系统使用的变量并说明了它们的用处。在表格后面将列举一些变量例值。
变量 |
说明 |
PATH |
这个变量包含了一系列由冒号分隔开的目录,系统就从这些目录里寻找可执行文件。如果你输入的可执行文件(例如ls、rc-update或者emerge)不在这些目录中,系统就无法执行它(除非你输入这个命令的完整路径,如/bin/ls)。
|
ROOTPATH |
这个变量的功能和PATH相同,但它只罗列出超级用户(root)键入命令时所需检查的目录。
|
LDPATH |
这个变量包含了一系列用冒号隔开的目录,动态链接器将在这些目录里查找库文件。
|
MANPATH |
这个变量包含了一系列用冒号隔开的目录,命令man会在这些目录里搜索man页面。
|
INFODIR |
这个变量包含了一系列用冒号隔开的目录,命令info将在这些目录里搜索info页面。
|
PAGER |
这个变量包含了浏览文件内容的程序的路径(例如less或者more)。
|
EDITOR |
这个变量包含了修改文件内容的程序(文件编辑器)的路径(比如nano或者vi)。
|
KDEDIRS |
这个变量包含了一系列用冒号隔开的目录,里面放的是KDE相关的资料。
|
CONFIG_PROTECT |
这个变量包含了一系列用空格隔开的目录,它们在更新的时候会被Portage保护起来。
|
CONFIG_PROTECT_MASK |
这个变量包含了一系列用空格隔开的目录,它们在更新的时候不会被Portage保护起来。
|
下面你可以找到所有这些变量定义的范例:
代码 1.1: 定义范例 |
PATH="/bin:/usr/bin:/usr/local/bin:/opt/bin:/usr/games/bin"
ROOTPATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin"
LDPATH="/lib:/usr/lib:/usr/local/lib:/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2.3"
MANPATH="/usr/share/man:/usr/local/share/man"
INFODIR="/usr/share/info:/usr/local/share/info"
PAGER="/usr/bin/less"
EDITOR="/usr/bin/vim"
KDEDIRS="/usr"
CONFIG_PROTECT="/usr/X11R6/lib/X11/xkb /opt/tomcat/conf \
/usr/kde/3.1/share/config /usr/share/texmf/tex/generic/config/ \
/usr/share/texmf/tex/platex/config/ /usr/share/config"
CONFIG_PROTECT_MASK="/etc/gconf"
|
5.b. 全局变量的定义
/etc/env.d目录
Gentoo采用了/etc/env.d目录来集中定义全局变量。在这个目录里,你会发现很多类似00basic、05gcc等等这样的文件,它们包含了文件名中提到的应用程序需要的变量。
举个例子,当你安装gcc时,一个名为05gcc的文件就会被ebuild所创建,里面包含了如下一些变量:
代码 2.1: /etc/env.d/05gcc |
PATH="/usr/i686-pc-linux-gnu/gcc-bin/3.2"
ROOTPATH="/usr/i686-pc-linux-gnu/gcc-bin/3.2"
MANPATH="/usr/share/gcc-data/i686-pc-linux-gnu/3.2/man"
INFOPATH="/usr/share/gcc-data/i686-pc-linux-gnu/3.2/info"
CC="gcc"
CXX="g++"
LDPATH="/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2.3"
|
其他的发行版会让你到/etc/profile或者其他地方修改和添加这些变量的定义。而Gentoo为用户(还有为Portage)提供了更加便捷的方式来维护和管理环境变量,以后你不再需要把精力放在那些众多的包含环境变量的文件身上了。
比如,当你更新完gcc的时候,/etc/env.d/05gcc也会被同时更新,而不需要你手工来完成。
这不仅对Portage有益,作为用户,你也是受益者。有时候你需要设置某个系统范围的环境变量。我们拿http_proxy变量来做例子,为了避免把/etc/profile搞乱,你只要新建一个文件(/etc/env.d/99local)然后添加你的定义:
代码 2.2: /etc/env.d/99local |
http_proxy="proxy.server.com:8080"
|
通过使用同一个文件来定义你所有的变量,你对如何定义自己的变量有了个大概的了解。
env-update脚本
/etc/env.d中的好几个文件都定义了PATH变量。这并没有错:当你运行env-update的时候,它会在更新环境变量之前把这些定义都追加到PATH里,因此对于软件包(或者用户)来说将会很容易地设置他们自己的环境变量,而不影响到现有变量的值。
env-update脚本会根据/etc/env.d里文件的字母顺序来附加变量的值。这些文件名必须要以两位数字开头。
代码 2.3: env-update所用的更新顺序 |
00basic 99kde-env 99local
+-------------+----------------+-------------+
PATH="/bin:/usr/bin:/usr/kde/3.2/bin:/usr/local/bin"
|
变量并不总是被串联起来,只有下列变量才会被串联:KDEDIRS、PATH、LDPATH、MANPATH、INFODIR、INFOPATH、ROOTPATH、CONFIG_PROTECT、CONFIG_PROTECT_MASK、PRELINK_PATH以及PRELINK_PATH_MASK。对于(/etc/env.d里的文件中按照字母顺序排列后)其他所有变量,最新定义的值才会被使用到。
当你运行env-update的时候,它会在文件/etc/profile.env里(会被/etc/profile使用)创建所有的环境变量。它也会从变量LDPATH中获取信息用来建立/etc/ld.so.conf。这些完成以后,它将运行ldconfig来重建动态链接器需要的文件/etc/ld.so.cache。
如果你想在运行env-update后立即看到效果,执行下面的命令来更新你的环境。自己安装过Gentoo的用户可能已经记住了这个安装指南中提到过的命令:
代码 2.4: 更新环境 |
# env-update && source /etc/profile
|
注意:
上面的命令只会更新你当前终端里的环境变量、新控制台以及它们的子程序。因此,假如你正在X11里工作,你要么在每一个你打开的终端里输入source /etc/profile,要么重新启动X,这样所有新的终端才能引用到新的变量。如果你使用了登录管理器,登陆成root然后输入/etc/init.d/xdm restart。如果不是这样,你需要注销然后重新登录回X这样才能产生使用新变量值的子程序。
|
重要:
你在定义其他变量时不能使用shell变量。这意味着这样的定义FOO="$BAR"(此处$BAR是另外一个变量)是不允许的。
|
5.c. 本地变量的定义
特定用户
你并不是一直都想定义全局变量。比如你想把/home/my_user/bin和当前目录(你当前所在的目录)添加到PATH变量中,但又不想让其他用户的PATH变量中也有这个。如果你想定义一个本地变量,可以使用~/.bashrc或者~/.bash_profile:
代码 3.1: 在~/.bashrc中扩展PATH做为本地使用 |
PATH="${PATH}:/home/my_user/bin:"
|
当你重新登录的时候,你的PATH变量将被更新。
特定会话
有时候甚至需要更加严格的定义。你可能要使用一个你临时创建的目录里面的程序,而又不想输入它的路径或者为此短时间内内修改~/.bashrc。
在这种情况下,你只需要在当前会话中使用export来定义PATH变量。只要你不注销,PATH变量将保持这个临时的设置。
代码 3.2: 定义特定会话中的环境变量 |
# export PATH="${PATH}:/home/my_user/tmp/usr/bin"
|
C. 使用Portage
1. 文件和目录
1.a. Portage文件
配置指南
Portage附带了一个默认的配置文件/etc/make.globals。当你打开它时,你就会发现所有的Portage配置选项都是通过变量来控制的。Portage读取的是什么变量,这些变量分别又是什么意思,下面将详细解释。
因为许多配置命令在不同的架构下是不同的,Portage也有相应的各组默认配置文件,它们是你的profile的一部分。你的profile是/etc/make.profile这个链接文件指向的目录;Portage的配置选项是在你的profile以及所有被继承的profile中的make.defaults文件中设定的。我们稍后将详细解释profile及/etc/make.profile目录。
如果打算改变配置变量,不要变更/etc/make.globals或是make.defaults。而应该修改/etc/make.conf,它比前面的几个文件有更高的优先级。你会发现还有一个/usr/share/portage/config/make.conf.example文件。顾名思义,它仅仅是一个例子而已——Portage并不读取这个文件。
你也可以将一个Portage的配置变量定义为环境变量,但我们并不推荐这样做。
Profile特定的信息
我们已经见到过/etc/make.profile目录了。不过,这并不是一个真正的目录,而是一个指向profile的符号链接,默认情况下是一个位于/usr/portage/profiles里的目录,虽然你也可以在其他地方创建自己的profile并指向他们。这个符号链接指向的profile就是你的系统所使用的。
一个profile包含了Portage需要的与架构相关的信息,比如该profile对应的system包含的软件包的列表,以及对这个profile来说不能运行的(或者被屏蔽掉)的软件列表,等等。
用户特定的配置
当你需要变更Portage安装软件的行为时,你需要做的就是编辑/etc/portage 中的文件。我们强烈建议你使用/etc/portage中的文件而不是通过修改环境变量来变更这些行为!
在/etc/portage目录中,你可以创建下列文档:
-
package.mask它列出了你永远不希望Portage安装的软件包。
-
package.unmask它列出了本来Gentoo的开发者不建议安装的,但是你希望能安装的软件包。
-
package.keywords它列出了还未被确认适合你的系统或架构,但是你希望能安装的软件包。
-
package.use它列出了你希望某些特定软件包使用的而不是整个系统使用的USE标记。
这些并不需要一定是文件;它们也可以是有包含单个软件包信息文件的目录。更多关于/etc/portage目录的信息及你能创建的文件的完整列表可以在Portage的手册页中找到:
代码 1.1: 阅读Portage的手册页 |
$ man portage
|
改变Portage文件和目录的位置
先前提到的配置文件不能保存在其他地方——Portage总是会在这些特定的位置搜索配置文件。不过Portage还用了许多其他的位置来满足不同的目的:编译、保存源代码、保存portage树。
所有的这些目的都有众所周知的默认位置,不过你可以根据你自己的喜好通过/etc/make.conf来改变它们。本章中的其他部分将解释Portage使用哪些特定的位置存放它们以及怎样改变它们在你的文件系统中的存放地点。
这篇文档并不是一份全面的参考。如果你需要100%范围的说明,请参看Portage和make.conf的手册页:
代码 1.2: 阅读Portage和make.conf的手册页 |
$ man portage
$ man make.conf
|
1.b. 储存文件
Portage树
Portage树的默认位置是/usr/portage。这是PORTDIR变量定义的。当你把Portage树保存在其他位置(通过改变这个变量),不要忘了相应地改变符号链接/etc/make.profile指向的位置。
如果你改变了PORTDIR变量,你可能也需要改变下面几个变量,因为它们不会知道PORTDIR变量的改变。这是Portage处理这些变量的方式导致的:PKGDIR、DISTDIR、RPMDIR。
预编译二进制包
虽然Portage并不默认使用预编译的二进制包,但却对其有多方面的支持。当你要求Portage使用预编译的二进制包时,它就会在/usr/portage/packages中寻找它们。这个位置是通过PKGDIR变量定义的。
源代码
程序的源代码默认保存于/usr/portage/distfiles。这个位置是通过DISTDIR变量定义的。
Portage数据库
Portage将你系统的状态(装了哪些软件包,什么文件属于哪个软件包……)保存在/var/db/pkg。不要手动改变这些文件!它可能破坏Portage对你系统的了解。
Portage缓存
Portage缓存(包括修改时间、虚拟包、依赖关系树信息……)储存在/var/cache/edb。这个位置就是一个缓存:如果你没有正在运行portage相关的程序,你就可以清空它。
1.c. 编译软件
Portage的临时文件
Portage的临时文件默认保存在/var/tmp。这是通过PORTAGE_TMPDIR变量定义的。
如果你改变了PORTAGE_TMPDIR变量,你也需要改变下列的变量,因为它们不会知道PORTAGE_TMPDIR变量的改变。这是由于PORTAGE处理这些变量的方式导致的:BUILD_PREFIX。
编译目录
Portage为每一个它所安装的软件包在/var/tmp/portage里创建特定的编译目录。这一位置是通过BUILD_PREFIX变量定义的。
Live文件系统位置
默认情况下,Portage将所有的文件安装到当前文件系统(/)里。但是你可以通过改变环境变量ROOT来改变它。这在你想要创建一个新的编译镜像时是很有用的。
1.d. 日志特性
Ebuild日志
Portage能为每一个ebuild建立日志文件,但只有当PORT_LOGDIR变量设定的位置是portage可写的才行。默认情况下,这个变量没有设定。如果你没有设定PORT_LOGDIR,你就不会收到当前日志系统报告的任何编译日志,然而你可能收到一些来自新的elog机制的日志。如果你定义了PORT_LOGDIR并且你也使用elog,你就将收到编译日志以及elog保存的任何日志,就像下文解释的一样。
Portage通过elog对日志记录提供精确的控制:
-
PORTAGE_ELOG_CLASSES:这是你设置什么信息被记入日志的地方。你可以使用任何用空格分隔的info、warn、error、log和qa的组合。
-
info: 记录下ebuild打印的“einfo”信息
-
warn: 记录下ebuild打印的“ewarn”信息
-
error: 记录下ebuild打印的“eerror”信息
-
log: 记录下一些ebuild中的“elog”信息
-
qa: 记录下ebuild打印的“QA Notice”信息
-
PORTAGE_ELOG_SYSTEM:这是用来选择处理日志信息的模块的。如果留空,则日志记录就被取消。你可以使用任何用空格分隔开的save、custom、syslog、mail、save_summary和mail_summary的组合。你必须至少选择一个模块以使用elog。
-
save:表示将每一个软件包的日志保存在$PORT_LOGDIR/elog中,或者是在$PORT_LOGDIR 没有配置的情况下保存在/var/log/portage/elog 目录下面。
-
custom:将所有的信息传递给用户在$PORTAGE_ELOG_COMMAND中定义的命令,这将在随后讨论。
-
syslog:把所有的信息发送给已安装的系统日志软件。
-
mail:把所有的信息传递给用户在$PORTAGE_ELOG_MAILURI中定义的邮件服务器;这将在随后讨论。这一elog的邮件特性需要>=portage-2.1.1。
-
save_summary: 和save类似,不过它把所有的信息保存在$PORT_LOGDIR/elog/summary.log里,或者/var/log/portage/elog/summary.log里,如果$PORT_LOGDIR没有定义的话。
-
mail_summary: 和mail类似,不过它会在emerge结束时把所有的信息在一个邮件里发送出去。
-
PORTAGE_ELOG_COMMAND:这个仅仅在custom模块被激活时使用。在这里你指定一个命令来处理日志信息。注意,你可以利用两个变量:${PACKAGE}是软件包的名字和版本,而${LOGFILE}是日志文件的绝对路径。这里是一个可能的用法:
-
PORTAGE_ELOG_COMMAND="/path/to/logger -p '\${PACKAGE}' -f '\${LOGFILE}'"
-
PORTAGE_ELOG_MAILURI:这包含了mail模块的设定,如地址、用户、密码、邮件服务器、端口。默认配置是 “root@localhost localhost”。
-
这里是一个使用smtp服务器的例子,基于用户名和密码认证并使用特定端口(默认端口是25):
-
PORTAGE_ELOG_MAILURI="user@some.domain username:password@smtp.some.domain:995"
-
PORTAGE_ELOG_MAILFROM:允许你配置日志邮件的“from”地址;如果没有配置的话,默认是“portage”。
-
PORTAGE_ELOG_MAILSUBJECT:允许你为日志邮件生成一个主题行。注意你可以使用两个变量:${PACKAGE}将会显示软件包的名子和版本,而${HOST}则是运行Portage的主机的FQDN。
-
这里是一个可能的应用:
-
PORTAGE_ELOG_MAILSUBJECT="package \${PACKAGE} was merged on \${HOST} with some messages"
重要:
如果你使用Portage-2.0.*中的enotice,你必须完全移除enotice,因为它和elog不兼容。
|
2. 通过变量来配置
2.a. Portage的配置
如前面所述,你可以在/etc/make.conf中定义许多变量来配置Portage。请参考make.conf的手册页以获得更详细和完整的信息:
代码 1.1: 阅读make.conf的手册页 |
$ man make.conf
|
2.b. 构建相关的选项
配置和编译器选项
当Portage构建应用程序时,他会将下面变量的内容传给编译器和configure脚本:
-
CFLAGS和CXXFLAGS定义了编译器编译C和C++程序所使用的参数。
-
CHOST为程序的configure脚本定义了build和host信息。
-
MAKEOPTS参数被传递给make命令,通常用来设定编译时并行处理线程的数量。更多关于make的参数可在make的手册页中找到。
USE变量也会在配置和编译的过程中被用到,不过这在前面的章节中已经详细解释过了。
安装相关选项
当Portage在安装了一个某软件的新版本后,会把属于旧版本的已经过时的文件从你的系统中删除。在此之前Portage会给用户5秒钟时间撤销此操作,这5秒钟由CLEAN_DELAY变量定义。
你可以通过设定EMERGE_DEFAULT_OPTS变量以使emerge每次运行时都使用某些特定的选项。一些常用的选项是--ask,--verbose,--tree,等等。
2.c. 配置文件的保护
Portage的保护位置
Portage一般会用新文件覆盖掉旧文件,除非这些旧文件位于受保护的位置里。这些受保护的位置由CONFIG_PROTECT变量设定,通常是配置文件的位置。在设置时,多个目录间用空格分开。
当受保护的位置里的文件有新版本时,新文件被保存前将会被更名,同时用户会被告知此新配置文件的存在。
你可以利用emerge --info来获得目前CONFIG_PROTECT的设置:
代码 3.1: 获得CONFIG_PROTECT的设定 |
$ emerge --info | grep 'CONFIG_PROTECT='
|
更多关于Portage配置文件保护的信息可以查看emerge手册页的CONFIGURATION FILES部分:
代码 3.2: 更多关于Portage配置文件保护的信息 |
$ man emerge
|
解除对某些目录的保护
你可以通过变量CONFIG_PROTECT_MASK来解除对受保护目录下某些子目录的保护。
2.d. 下载的选项
服务器的地址
当你的系统上没有所需要的信息和数据时,Portage就会从网络上获取数据。含有这些信息和数据的服务器的位置定义在以下变量中:
-
GENTOO_MIRRORS定义了一些提供源代码(distfiles)的服务器地址。
-
PORTAGE_BINHOST定义了一个特定的服务器地址,此服务器可为你的系统提供预先编译好的软件包。
第3个变量设定rsync服务器的地址,此服务器用来更新你的Portage树:
-
SYNC定义了一个特定的服务器,Portage用此服务器获取Portage树。
GENTOO_MIRRORS和SYNC变量可以由程序mirrorselect自动设定。首先你要emerge mirrorselect。更多信息参考mirrorselect的在线帮助:
代码 4.1: 更多关于mirrorselect的信息 |
# mirrorselect --help
|
如果你需要使用代理服务器,你可以用http_proxy、ftp_proxy和RSYNC_PROXY变量来设定它们。
获取源代码的命令
当Portage需要获取源代码时,默认使用wget来下载。你可以通过定义FETCHCOMMAND变量来改变它。
Portage支持断点续传。默认是使用wget来实现,但你可以通过定义RESUMECOMMAND来变量来改变它。
确保你的FETCHCOMMAND和RESUMECOMMAND把源代码存放到正确的位置。在这些变量中你应该用\${URI}和\${DISTDIR}分别指定源代码和distfiles的位置。
你可以对不同的传输协议使用不同的设置,相关的参数有FETCHCOMMAND_HTTP、FETCHCOMMAND_FTP、RESUMECOMMAND_HTTP和RESUMECOMMAND_FTP等等。
Rsync的设置
你不能改变Portage用来更新Portage树所使用的rsync命令,但你可以设定一些与rsync命令相关的变量:
-
PORTAGE_RSYNC_OPTS定义了一些在sync过程中使用的变量,变量之间用空格分开。不要做任何改变除非你十分清楚会有什么后果。注意某些必要的选项总会起作用,即使PORTAGE_RSYNC_OPTS的设置是空的。
-
PORTAGE_RSYNC_EXTRA_OPTS可以用于在同步过程中设置附加选项。选项之间用空格分开。
- --timeout=<number>: 这里设定rsync连接超时的秒数。此变量默认为180秒。如果用户是使用拨号上网或者一台处理速度慢的电脑,这个值需要设到300或者更高。
- --exclude-from=/etc/portage/rsync_excludes: 这个参数指定一个文件,内容是rsync在更新过程中需要忽略的软件包和/或者类别的列表。这个例子指定的是/etc/portage/rsync_excludes。请参考使用Portage树的子集以了解此文件的格式。
- --quiet: 减少屏幕输出
- --verbose: 在屏幕上输出完整的文件列表
- --progress: 为每个文件显示一个进度条
-
PORTAGE_RSYNC_RETRIES定义了rsync程序试图连接到由SYNC变量所指定的服务器的次数,默认为3。
更多有关这些参数的信息请阅读man rsync.
2.e. Gentoo的设置
分支的选则
你可以用ACCEPT_KEYWORDS变量改变默认的系统分支。此变量的默认设置为你的电脑体系结构的稳定分支。更多关于Gentoo分支的信息可以在下一章节找到。
Portage的特性
你可以通过FEATURES变量激活Portage的某个特性。这些已在前面的章节中讨论过,如Portage的特性.
2.f. Portage的行为
资源管理
通过PORTAGE_NICENESS变量,你可以增加或减少Portage运行时的nice值。PORTAGE_NICENESS变量的值会被加到目前的nice值上。
更多关于nice值的信息, 请参考nice的手册页:
代码 6.1: 更多关于nice的信息 |
$ man nice
|
输出行为
NOCLOR变量的默认值为“false”,如果你想禁用Portage的彩色输出,请把这个变量设为“true”。
3. 使用多个软件分支
3.a. 使用一个分支
稳定的分支
Gentoo提供了一个ACCEPT_KEYWORDS变量来定义您系统所使用的软件分支。默认情况下,系统会选择您的体系结构的稳定软件分支。例如x86。
我们推荐您只使用默认的稳定软件分支。不过,如果您不是那么注重稳定性,并且愿意向http://bugs.gentoo.org提交一些bug报告来帮助和完善Gentoo,请继续阅读下面的内容。
测试的分支
如果您想用最新版本的软件,您可以考虑转向使用测试分支。要让Portage转而使用测试分支的软件,您只需在您的体系结构名称前加上一个~符号。
顾名思义,“测试分支”就是带有测试性质的。如果一个包正处于测试中,这代表软件的开发人员认为它虽然已经具有了相当的功能但还没有经过完全的测试。使用这样的软件,您当然可能会第一个发现它的bug,并可以提交一个bug报告来通知相关的开发者。
要小心的是,您可能会遇到不稳定性、不完美的软件包处理(例如错误或者缺失的依赖关系)、过于频繁的更新(导致大量的编译)和损坏的包等问题。如果您还不是很清楚Gentoo的工作方式以及如何去解决这些问题,我们推荐您还是使用稳定且测试过分支。
例如,要选择针对x86体系结构的测试分支,请修改/etc/make.conf文件并设定如下内容:
代码 1.1: 设定ACCEPT_KEYWORDS变量 |
ACCEPT_KEYWORDS="~x86"
|
之后如果您更新系统,您将会发现有大量的包需要更新。要提醒您注意的是:您使用测试分支更新系统后,再想转回使用官方的稳定分支将不是一件容易的事情(当然您使用系统的备份的情况除外)。
3.b. 混合使用稳定和测试分支
package.keywords文件的位置
您可以让Portage使用某些软件的测试分支中的版本,对于系统的其他软件则使用稳定分支。要实现这样的目的,您需要在/etc/portage/package.keywords文件里加入那些软件包的名字及其所属分类的名称。您也可以建立一个同名文件夹,并在里面建立的文件里加入上述内容。例如,要使用gnumeric属于测试分支中的版本:
代码 2.1: /etc/portage/package.keywords中针对gnumeric设置,一行完整内容 |
app-office/gnumeric ~x86
|
测试特定版本
如果您希望Portage使用测试分支中某软件的特定版本,但后续版本不再这么做,你可以在package.keywords里加入相应的版本号来实现这个目的。在此情况下您必须使用 = 运算符。您也可以通过使用<=,<,>或>=运算符来指定一个要使用的版本范围。
任何情况下,如果您添加了版本号,您必须使用一个运算符;如果您忽略了版本号,您就不能使用运算符。
在如下的例子中,我们要求Portage接受版本号为1.2.13的gnumeric:
代码 2.2: 允许gnumeric的测试版本 |
=app-office/gnumeric-1.2.13 ~x86
|
3.c. 使用被屏蔽的包
package.unmask文件的位置
Gentoo的开发者们不支持您使用这个文件。如果您要使用它请千万小心。开发者们将不会回应有关于package.unmask和/或package.mask的支持请求。您已经被提醒过了。
当一个包被Gentoo的开发者们屏蔽,但你不考虑package.mask文件(默认保存于/usr/portage/profiles目录下)里所陈述的原因,仍然想使用它的话,请在/etc/portage/package.unmask文件(如果是一个文件夹,就在此文件夹下的文件中)中加入与package.mask里那行一模一样的内容。
比如说,软件包=net-mail/hotwayd-0.8被屏蔽了,但是您想解除这个屏蔽,需要做的只是在package.unmask中加入相同的一行内容就可以了。
代码 3.1: /etc/portage/package.unmask |
=net-mail/hotwayd-0.8
|
package.mask文件的位置
当您希望Portage忽略一个特定的软件包或者一个软件包的特定版本,您可以在/etc/portage/package.mask文件(或者此目录下的一个文件)中加入一行适当的内容来屏蔽它。
例如,当您不希望Portage安装比gentoo-sources-2.6.8.1更新版本的内核时,您只需要在package.mask文件里加入下面一行内容:
代码 3.2: /etc/portage/package.mask的例子 |
>sys-kernel/gentoo-sources-2.6.8.1
|
4. Portage附加工具
4.a. dispatch-conf
dispatch-conf是一个帮助合并._cfg0000_<名称>文件的工具。._cfg0000_<名称>文件是由Portage在它要覆盖被CONFIG_PROTECT变量所保护的某个目录里的文件时建立的。
使用dispatch-conf能够在合并配置文件并升级更新的同时保持所有更新记录。dispatch-conf以RCS版本管理系统或是补丁的方式来保存配置文件间的差别。这意味着如果你在升级配置文件犯下错误时,你可以随时退回到你的配置文件的之前版本。
使用dispatch-conf,你可以保持配置文件原来的样子,或者使用新的配置文件,你还可以编辑当前文件或交互式地合并更新。除此之外,dispatch-conf还有一些很棒的特性:
-
可以自动合并仅有注释变更的文件;
-
可自动合并仅有空白符数量的不同的文件;
确定你先编辑了/etc/dispatch-conf.conf并创建了archive-dir变量设定的目录。
代码 1.1: 运行dispatch-conf |
# dispatch-conf
|
当运行dispatch-conf的时候,程序会带你把每个改变了的配置文件挨个过一边。按u来用新配置文件更新(替换)现在的配置文件,然后继续处理下一个。按z来删除新配置文件,然后继续处理下一个。当处理完所有的配置文件之后,dispatch-conf就会退出。你也可以随时按q来退出。
更多信息,请查阅dispatch-conf手册页。它会告诉你交互式的合并新旧配置文件,编辑新配置文件,检查两个文件间的差异等等。
代码 1.2: 阅读dispatch-conf手册页 |
$ man dispatch-conf
|
4.b. etc-update
你也可以使用etc-update来合并配置文件。它不像dispatch-conf那样简单易用,功能也少,但是它也能提供交互式合并功能并且能自动合并一些简单的改变。
不过,和dispatch-conf不同的是,etc-update不保留你的配置文件的旧版本。一旦你更新了文件,旧版本就永远丢失了。所以要非常小心,因为使用etc-update与使用dispatch-conf相比明显的不安全。
代码 2.1: 运行etc-update |
# etc-update
|
在整合简单直观的更动后,系统会提示你一个需要更新的受保护的文件列表。在最底下会提示你可选的操作选项:
代码 2.2: etc-update选项 |
Please select a file to edit by entering the corresponding number.
(-1 to exit) (-3 to auto merge all remaining files)
(-5 to auto-merge AND not use 'mv -i'):
|
如果你输入-1,etc-update将直接退出且不执行任何变更。如果你输入-3或-5,所有列出的配置文件将被更新的版本覆盖。因此先选出无需自动升级的配置文件非常重要,而具体步骤也很简单,只需要输入在该配置文件左边显示的数字就可以了。
我们选择配置文件/etc/pear.conf作为范例:
代码 2.3: 更新指定的配置文件 |
Beginning of differences between /etc/pear.conf and /etc/._cfg0000_pear.conf
End of differences between /etc/pear.conf and /etc/._cfg0000_pear.conf
1) Replace original with update
2) Delete update, keeping original as is
3) Interactively merge original with update
4) Show differences again
|
现在你可以看到这两个文件之间的差别。如果你认为升级的配置文件可以正确无误的投入使用,输入1。如果你认为升级的配置文件是不必要的,或者它也没有提供任何新的或有用的信息,输入2。如果你想交互地升级你当前的配置文件,输入3。
这里我们就不再赘述交互性整合的详细过程。出于完整性的考虑,我们将列出在整合两个文件时可以用到的所有的命令。你将看到来自新旧文件的两行内容和一个提示符,在提示符这里你可以输入以下命令:
代码 2.4: 用交互方式配置时可以使用的命令 |
ed: 编辑并使用两种版本,每一个版本都加上一个不同的标题头。
eb: 编辑并使用两个版本。
el: 编辑并使用左边的版本。
er: 编辑并使用右边的版本。
e: 编辑一个新的版本。
l: 使用左边的版本。
r: 使用右边的版本。
s: 包含相同的行。
v: 包含相同的行,并列出来源。
q: 退出。
|
当你完成重要的配置文件的更新后,余下的其它配置文件你就可以采用自动更新的方法了。当无法再找到任何可更新的配置文件时etc-update将退出。
4.c. quickpkg
利用quickpkg可以对系统中已安装的包进行打包归档。这些归档文件可以作为预编译包使用。运行quickpkg非常简单:只要加上你想要制作的软件包的名字就可以了。
例如,要打包curl,arts,procps
代码 3.1: quickpkg的使用范例 |
# quickpkg curl arts procps
|
预编译包会保存在$PKGDIR/All(默认为/usr/portage/packages/All)。指向这些包的符号链接保存在$PKGDIR/<category>中。
5. 改造Portage树
5.a. 使用Portage树的一个子集
排除软件包/类别
你可以有选择地更新特定的类别/软件包并且忽略其他类别/软件包。我们通过让emerge --sync在执行rsync的时候排除个别类别/软件包来实现这个功能。
你需要在/etc/make.conf中赋予--exclude-from变量一个文件名,该文件应包含你想要排除的软件包。
代码 1.1: 在/etc/make.conf中指定包含排除软件包条目的文件 |
PORTAGE_RSYNC_EXTRA_OPTS="--exclude-from=/etc/portage/rsync_excludes"
|
代码 1.2: 在/etc/portage/rsync_excludes中设定排除所有游戏 |
games-*/*
|
然而要注意的是这可能导致依赖性问题,因为新的、允许安装的软件包可能依赖于那些新的、但被排除的软件包。
5.b. 添加非官方Ebuild
定义一个Portage Overlay目录
可以让你的Portage使用官方Portage树里面没有的ebuild。创建一个新的目录(比如/usr/local/portage)用以存放第三方ebuild。请在新目录中使用跟官方Portage树一样的目录结构!
然后在/etc/make.conf中定义PORTDIR_OVERLAY变量,使它指向刚才创建的目录。现在,每当你用到Portage的时候,这些ebuilds也会被同时计算在内,并且当你下次运行emerge --sync时,不会删除/覆盖这些ebuild。
使用多个Overlay仓库
对于开发多个Overlay的许多高级用户而言,他们会在更新Portage树之前测试软件包或是想使用来源广泛的非官方ebuild。app-portage/gentoolkit-dev软件包提供了gensync工具,帮助你的overlay仓库时时都处于最新的状态。
可以用gensync一次更新所有的仓库,也可以选择更新其中的几个。每个仓库会有一个.syncsource文件于/etc/gensync/配置目录下,其内容包含仓库的存放位置、名字、ID等。
假设你有两个额外的仓库,分别名为java(存放开发中的java ebuild)和entapps(存放在家中为你给公司开发的应用程序)。那么可以通过以下命令来更新这些仓库:
代码 2.1: 使用gensync更新仓库 |
# gensync java entapps
|
5.c. 非Portage维护的软件
Portage环境下使用自己维护的软件
尽管Portage已经提供了某些软件,但是某些情况下你还是想自己配置、安装和维护这些软件,而不是希望Portage为你自动完成这些过程。典型的例子是内核源码和nvidia驱动程序。你可以配置一下Portage让它知道某个软件包已经通过手动安装到系统中了。这个过程叫做注入”,Portage是通过/etc/portage/profile/package.provided文件来实现这个功能的。
举个例子,如果你想告诉Portage已经手动安装了gentoo-sources-2.6.11.6,那么把下面一行添加到/etc/portage/profile/package.provided文件里:
代码 3.1: package.provided范例 |
sys-kernel/gentoo-sources-2.6.11.6
|
D. Gentoo网络配置
1. 新手上路
1.a. 新手上路
注意:
本文假定你已经配置好了你的内核,包括你的硬件的模块,并且你知道你的硬件(译注:这里指网卡)的接口名。我们同时假定你已经设置了eth0,当然它也可以是eth1、wlan0等等。
|
注意:
本文档要求你正在运行的是baselayout-1.11.11或更高版本。
|
要开始配置你的网卡,你首先需要告诉Gentoo RC系统你的网卡。这可以通过在/etc/init.d目录里建立一个指向net.lo的名叫net.eth0的符号链接来实现。
代码 1.1: 建立符号连接net.eth0指向net.lo |
# cd /etc/init.d
# ln -s net.lo net.eth0
|
现在Gentoo的RC系统知道了这个接口。它还需要知道怎么来配置这个接口。所有的网络接口都在/etc/conf.d/net文件里设置。下面是一个设置DHCP和静态地址的简单配置:
代码 1.2: /etc/conf.d/net文件的一个示例 |
config_eth0=( "dhcp" )
config_eth0=( "192.168.0.7/24" )
routes_eth0=( "default via 192.168.0.1" )
config_eth0=( "192.168.0.7 netmask 255.255.255.0" )
routes_eth0=( "default via 192.168.0.1" )
|
注意: CIDR代表无级别Internet域路由(Classless InterDomain Routing)。一开始,IPv4地址被归类为A,B或者C类。最初的分类系统没有考虑到Internet如此流行,会有耗尽IP的危险。CIDR允许一个IP地址可以表达多个IP地址。除了以一个斜线跟着一个数字结束外,CIDR IP地址跟普通IP地址是一样的;例如:192.168.0.0/16。CIDR是RFC 1519定义的。
|
现在我们已经配置好了接口,可以用下面的命令启动、停止它
代码 1.3: 启动和停止网络脚本 |
# /etc/init.d/net.eth0 start
# /etc/init.d/net.eth0 stop
|
重要:
我们建议你在/etc/conf.d/rc文件里设置RC_VERBOSE="yes"。这样你可以在网络出现故障的时候,得到关于故障的更多信息。
|
现在已经成功地启动并停止了你的网络接口,你可能希望在Gentoo启动的时候启动它。这样做就可以了:(最后那个“rc”命令通知Gentoo启动当前runlevel中还没有被启动的脚本)
代码 1.4: 配置网络接口以便在启动的时候装载它 |
# rc-update add net.eth0 default
# rc
|
2. 高级配置
2.a. 高级配置
config_eth0变量是一个网络接口配置的核心。它包含了一组用来配置接口的高级指令列表(我们用eth0作为示例)。指令列表中的每一条命令都是顺序执行的。该列表中只要至少有一条命令正常工作,则这个网络接口就被认为是可以使用的。
这里列出了一些可用的指令。
命令 |
描述 |
null |
不做任何事 |
noop |
如果网络接口已经开启并且也绑定好地址的话,则中止配置过程,配置成功。
|
一个IPv4或是IPv6的地址 |
绑定地址到接口上 |
dhcp、adsl或apipa(或者一个第三方模块提供的自定义命令)
|
运行提供这些命令的模块,例如dhcp这个命令会运行一个提供DHCP功能的模块,它可能是dhcpcd、dhclient或者pump中的一个。
|
如果一条命令执行失败,你可以指定一条fallback指令。这条fallback指令必须完全符合配置的结构。
你可以连在一起使用这些指令,下面是一些真实应用的例子。
代码 1.1: 配置示例 |
config_eth0=(
"192.168.0.2/24"
"192.168.0.3/24"
"192.168.0.4/24"
)
config_eth0=(
"192.168.0.2/24"
"4321:0:1:2:3:4:567:89ab"
"4321:0:1:2:3:4:567:89ac"
)
config_eth0=(
"noop"
"dhcp"
)
fallback_eth0=(
"null"
"apipa"
)
|
注意:
当你使用的是ifconfig模块并且绑定了一个以上的网络地址,系统会为每一个网络地址建立一个别名。在上面的两个例子中你将会得到这几个网络接口:eth0、eth0:1和eth0:2。由于内核和其他程序会把eth0:1和eth0:2看作eth0,所以你将无法对这些接口做什么特殊的事情。
|
重要:
fallback中的顺序相当重要!如果我们没有指定null选项,那么apipa只会在noop命令失败后才会执行。
|
2.b. 网络依赖性
/etc/init.d中的初始化脚本可能依赖于某个特定的网络接口或只是net服务。可以通过定义在/etc/conf.d/rc中的RC_NET_STRICT_CHKING这个变量,来使net代表不同的意思。
值 |
描述 |
none |
系统始终认为net服务已经启动了 |
no |
这是说除了net.lo之外,至少还需要再启动一个net.*服务。同时拥有WIFI网络和静态NIC网络的笔记本用户可使用这个值。对他们来说某一时间只要有一个网络接口启动,那么net服务就应被视为启动了。
|
lo |
这和no选项相同,不过就是把net.lo也考虑在内了。它对那些不怎么在意在系统启动时哪个网络接口会被启动的用户很有用。
|
yes |
所有的网络接口都启动后,net服务才算启动。
|
可是需要依赖net.eth0和net.eth1的net.br0应该怎么处理呢?net.eth1可能是一个无线网络或是一个PPP设备,且需要在桥接前先设定好。这不能在/etc/init.d/net.br0中定义,因为它只是一个到net.lo的符号连接。
答案是在/etc/conf.d/net里定义一个自己的depend()函数。
代码 2.1: /etc/conf.d/net中net.br0的依赖关系 |
depend_br0() {
need net.eth0 net.eth1
}
|
要获得更多关于依赖性的讨论。请参考Gentoo手册中的这一节撰写初始化脚本
2.c. 变量名称和值
变量的名称是动态的,它们通常的结构是variable_${interface|mac|essid|apmac}。例如dhcpcd_eth0变量代表eth0的dhcpcd命令参数。而dhcpcd_essid变量代表连接到ESSID为"essid"的AP的网络接口的dhcpcd命令参数。
不过,没有什么强制性的和快速的标准规定了网络接口名称必须是ethx。事实上,许多无线网络接口除了使用ethx之外,也会使用类似于wlanx、rax之类的名称。而且一些用户自定义的网络接口(比如网桥接口)可以被命名为任何名字(比如foo)。更有趣的是,无线网络接入点可以在ESSID中使用非英文字符或数字字符——这一点很重要,因为你可以为每一个ESSID设定网络参数。
不幸的是Gentoo在网络设定方面使用的是bash的变量名——而bash不能使用数字、英文字母之外的任何字符。为了突破这样的一个限制,我们把所有除数字、英文字母之外的字符用_字符表示。
bash的另一个问题是变量的内容——一些字符需要转义。这可以通过在需要转义的字符前面加\来解决。下面列出的是需要转义的字符列表:"、'和\。
在这个例子中,我们使用无线网络ESSID,因为它可以包含的字符范围最广。我们使用My "\ NET这个ESSID:
代码 3.1: 变量名示例 |
dns_domain_My____NET="My \"\\ NET"
|
3. 模块化网络
3.a. 网络模块
我们现在支持模块化的网络脚本,这意味着我们可以很方便地增添新的网络接口和配置模块,同时和原来已存在的模块或是接口保持良好的兼容性。
只要模块需要的软件包已安装,它就会被默认载入。如果你指定一个模块而它需要的软件包未被安装,则你就会收到一个错误信息通知你需要安装哪一个软件包。一般来说,只有当你安装了提供相同服务的两个及以上的软件包时,你才需要使用模块设定来选择你想使用其中的哪一个。
注意:
除非有特别说明,这里所讨论的全部设定都保存在/etc/conf.d/net中。
|
代码 1.1: 模块选择 |
modules=( "iproute2" )
modules_eth0=( "pump" )
modules=( "!iwconfig" )
|
3.b. 网络接口处理程序
目前我们提供了两个网络接口处理程序:ifconfig和iproute2。你可以使用i这两个程序中的一个进行任意种类的网络配置。
ifconfig是目前Gentoo默认使用的网络接口处理程序,而且它也包含在系统的profile之中。iproute2是另一个灵活且强大的软件包,但是默认的系统配置中并不包含它。
代码 2.1: 安装iproute2 |
# emerge sys-apps/iproute2
modules=( "iproute2" )
|
由于ifconfig和iproute2的功能很类似,我们允许使用它们的基本配置功能以使二者可以通用。例如说下面的代码片段对于它们之中的任何一个来说都是起效的。
代码 2.2: ifconfig和iproute2示例 |
config_eth0=( "192.168.0.2/24" )
config_eth0=( "192.168.0.2 netmask 255.255.255.0" )
config_eth0=( "192.168.0.2/24 brd 192.168.0.255" )
config_eth0=( "192.168.0.2 netmask 255.255.255.0 broadcast 192.168.0.255" )
|
3.c. DHCP
DHCP是一种通过DHCP服务器来获得相关的网络信息(比如IP地址、DNS服务器、网关等)的方式。这意味着如果在网络上存在着一个DHCP服务器的话,你只要让每一个客户端使用DHCP,这些客户端就会自动地配置好相关的网络设置。当然,如果在使用DHCP之前还需要配置无线网络或是PPP等其他设定的话,你就必须先配置好这些才行。
dhclient、dhcpcd或者pump都可以提供DHCP功能。每一种DHCP模块都有各自的优缺点——下面是一个快速的检阅。
DHCP模块 |
软件包 |
优点 |
缺点 |
dhclient |
net-misc/dhcp |
由ISC(也是BIND DNS软件的开发人员)制作;高度可配置性。
|
配置起来过于复杂;软件十分臃肿;无法通过DHCP获得NTP服务器;默认不发送主机名。
|
dhcpcd |
net-misc/dhcpcd |
Gentoo一直以来的预设软件;不依赖其他外部软件;由Gentoo开发的。
|
有时很慢;当租约为无穷大时不会变成守护进程。 |
pump |
net-misc/pump |
轻量级的;不依赖其他外部软件
|
不再被上游维护,不可靠,尤其在使用modem的时候;不能通过DHCP获得NIS服务器。
|
当你在系统上安装有不止一种DHCP客户端,你需要指定使用哪一个——否则如果系统装有dhcpcd,我们将默认使用它。
你可以使用module_eth0="..."(把module改成你所使用DHCP模块的名称——例如:dhcpcd_eth0)为DHCP模块指定选项。
我们尝试使DHCP的配置更加灵活——所以我们通过dhcp_eth0变量来支持下面这些命令,默认不使用它们中的任何一个:
-
release - 释放IP地址以便它可以被重新使用
-
nodns - 不覆盖/etc/resolv.conf
-
nontp - 不覆盖/etc/ntp.conf
-
nonis - 不覆盖/etc/yp.conf
代码 3.1: 在/etc/conf.d/net中的DHCP配置范例 |
modules=( "dhcpcd" )
config_eth0=( "dhcp" )
dhcpcd_eth0="-t 10"
dhcp_eth0="release nodns nontp nonis"
|
注意:
由于dhcpcd和pump默认会把主机名发送给DHCP服务器,所以你就可以不用去指定它了。
|
3.d. 基于PPPoE/PPPoA的ADSL
首先我们安装ADSL软件。
代码 4.1: 安装ppp软件包 |
# emerge net-dialup/ppp
|
注意:
如果你需要PPPoA,确保你使用的是>=baselayout-1.12.x。
|
其次,创建PPP网络脚本和PPP所使用的以太网卡的网络脚本:
代码 4.2: 创建PPP和以太网卡网络脚本 |
# ln -s /etc/init.d/net.lo /etc/init.d/net.ppp0
# ln -s /etc/init.d/net.lo /etc/init.d/net.eth0
|
确保在/etc/conf.d/rc设定RC_NET_STRICT_CHECKING="yes"。
现在我们需要配置/etc/conf.d/net。
代码 4.3: 一个基本的PPPoE设定 |
config_eth0=( null )
config_ppp0=( "ppp" )
link_ppp0="eth0"
plugins_ppp0=( "pppoe" )
username_ppp0='user'
password_ppp0='password'
pppd_ppp0=(
"noauth"
"defaultroute"
"usepeerdns"
"holdoff 3"
"child-timeout 60"
"lcp-echo-interval 15"
"lcp-echo-failure 3"
noaccomp noccp nobsdcomp nodeflate nopcomp novj novjccomp
)
depend_ppp0() {
need net.eth0
}
|
你也可以在/etc/ppp/pap-secrets中定义你的密码。
代码 4.4: /etc/ppp/pap-secrets范例 |
"username" * "password"
|
如果你通过一个USB调制解调器来使用PPPoE,你需要emerge br2684ctl。请阅读/usr/portage/net-dialup/speedtouch-usb/files/README来了解如果正确的配置它。
重要:
请仔细阅读/etc/conf.d/net.example里有关ADSL和PPP的部分。它包含了你的PPP设定可能需要的设置的详尽解释。
|
3.e. APIPA(自动获得私有的IP地址)
APIPA通过在某网络接口arping在169.254.0.0-169.254.255.255范围内的某个随机地址的方式来在该范围内尝试寻找空闲地址。如果没有收到任何ARP应答,该IP地址就会被绑定到这个网络接口上。
只有在网络上不存在DHCP服务器,同时本机不直接连接到internet并且其他所有的计算机都使用APIPA时才适用。
为了支持APIPA,请emerge net-misc/iputils或net-analyzer/arping。
代码 5.1: /etc/conf.d/net中的APIPA配置 |
config_eth0=( "dhcp" )
fallback_eth0=( "apipa" )
config_eth0=( "apipa" )
|
3.f. 绑定
为了使用连接绑定,请emerge net-misc/ifenslave。
绑定可以用来增加网络带宽。如果你有两块网卡连接到同一个网络,你可以把它们绑定在一起这样你的应用程序只看到一个网卡,但实际上却是在同时使用两个物理网卡传送数据。
代码 6.1: 在/etc/conf.d/net中配置绑定 |
slaves_bond0="eth0 eth1 eth2"
config_bond0=( "null" )
depend_bond0() {
need net.eth0 net.eth1 net.eth2
}
|
3.g. 桥接(802.1d的支持)
为了获得对桥接支持,请emerge net-misc/bridge-utils。
桥接是用来把两个网络连接在一起。举例来说,你有一台通过ADSL modem接入internet的服务器,它同时通过无线网卡为其他计算机提供internet接入服务。你就可以创建桥接把这两个网络接口连接在一起。
代码 7.1: /etc/conf.d/net中桥接的配置 |
brctl_br0=( "setfd 0" "sethello 0" "stp off" )
bridge_br0="eth0 eth1"
config_eth0=( "null" )
config_eth1=( "null" )
config_br0=( "192.168.0.1/24" )
depend_br0() {
need net.eth0 net.eth1
}
|
重要:
在使用一些桥接的设定时,你可能需要参考文档变量名称
|
3.h. MAC地址
如果你使用的是sys-apps/baselayout-1.11.14或者更新版本的话,你无需安装任何软件就可以更改网络接口对应的MAC地址或者为某个网络接口指定一个MAC地址。不过,如果你需要为网络接口指定一个随机的MAC地址或者你的baselayout的版本比上述版本要旧的话,你需要安装好net-analyzer/macchanger后才能使用这些功能。
代码 8.1: MAC地址变更示例 |
mac_eth0="00:11:22:33:44:55"
mac_eth0="random-ending"
mac_eth0="random-samekind"
mac_eth0="random-anykind"
mac_eth0="random-full"
|
3.i. 隧道
你不需要安装任何软件就可以使用隧道,因为网络接口处理程序会帮你做好这些事。
代码 9.1: 在/etc/conf.d/net中配置隧道 |
iptunnel_vpn0="mode gre remote 207.170.82.1 key 0xffffffff ttl 255"
iptunnel_vpn0="mode ipip remote 207.170.82.2 ttl 255"
config_vpn0=( "192.168.0.2 peer 192.168.1.1" )
|
3.j. VLAN(802.1q的支持)
为了获得对VLAN的支持,请emerge net-misc/vconfig.
虚拟局域网(Virtual LAN)是一组有如运作在同个网段的一组网络设备的集合——尽管实际上可能不是。VLAN成员只能看到同一VLAN的成员,哪怕和其他VLAN成员处于同一物理网段中。
代码 10.1: 在/etc/conf.d/net中配置VLAN |
vlans_eth0="1 2"
vconfig_eth0=( "set_name_type VLAN_PLUS_VID_NO_PAD" )
vconfig_vlan1=( "set_flag 1" "set_egress_map 2 6" )
config_vlan1=( "172.16.3.1 netmask 255.255.254.0" )
config_vlan2=( "172.16.2.1 netmask 255.255.254.0" )
|
重要:
在使用一些VLAN的设定时,你可能需要查看文档变量名称。
|
4. 无线网络
4.a. 介绍
目前您可以使用我们提供的wireless-tools 或wpa_supplicant工具来配置无线网络。请记住重要的一点是,您对无线网络的配置是全局性的,而非针对具体的接口。
wpa_supplicant是一个最好的选择,但缺点是它不支持所有的驱动。请浏览wpa_supplicant网站获得它所支持的驱动列表。另外,wpa_supplicant目前只能连接到那些你已经配置好ESSID的无线网络。
wireless-tools支持几乎所有的无线网卡和驱动,但它不能连接到那些只支持WPA的AP。
警告:
由于linux-wlan-ng驱动有其自己特有的安装和配置方式,而且与其他软件的方式完全不同,因此目前它并不被baselayout所支持。有传闻说linux-wlan-ng的开发者要将它的设置方式改成wireless-tools的方式——到时候您就可以在baselayout中使用linux-wlan-ng了。
|
4.b. WPA Supplicant
WPA Supplicant工具包可以让您连接到那些使用WPA的AP。因为还只是beta版,所以它的配置方法仍会常常变化——尽管如此,在大部分情况下它已经能很好的工作。
代码 2.1: 安装wpa_supplicant |
# emerge net-wireless/wpa_supplicant
|
重要:
要让wpa_supplicant正常工作,您必须在内核中打开CONFIG_PACKET支持。
|
现在我们需要配置一下/etc/conf.d/net文件以便我们可以选择使用wpa_supplicant而不用wireless-tools(两者都安装在系统中时,默认使用的是wireless-tools)。
代码 2.2: 在/etc/conf.d/net中配置wpa_supplicant |
modules=( "wpa_supplicant" )
wpa_supplicant_eth0="-Dmadwifi"
|
注意:
如果您用host-ap驱动,您首先要将无线设备卡设置成Managed模式以便能正确地配合wpa_supplicant工作。你可以在/etc/conf.d/net中设置iwconfig_eth0="mode managed"来实现这一点。
|
看起来这很简单,不是么?不过我们还需要配置wpa_supplicant本身,这将会比较麻烦一些,具体取决于你要连接的AP的安全程度。下面的例子是从/usr/share/doc/wpa_supplicant-<version>/wpa_supplicant.conf.gz中抽取并简化而来的,此文件出自wpa_supplicant软件包。
代码 2.3: 一个/etc/wpa_supplicant/wpa_supplicant.conf的例子 |
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=0
ap_scan=1
network={
ssid="simple"
psk="very secret passphrase"
priority=5
}
network={
ssid="second ssid"
scan_ssid=1
psk="very secret passphrase"
priority=2
}
network={
ssid="example"
proto=WPA
key_mgmt=WPA-PSK
pairwise=CCMP TKIP
group=CCMP TKIP WEP104 WEP40
psk=06b4be19da289f475aa46a33cb793029d4ab3db7a23ee92382eb0106c72ac7bb
priority=2
}
network={
ssid="plaintext-test"
key_mgmt=NONE
}
network={
ssid="static-wep-test"
key_mgmt=NONE
wep_key0="abcde"
wep_key1=0102030405
wep_key2="1234567890123"
wep_tx_keyidx=0
priority=5
}
network={
ssid="static-wep-test2"
key_mgmt=NONE
wep_key0="abcde"
wep_key1=0102030405
wep_key2="1234567890123"
wep_tx_keyidx=0
priority=5
auth_alg=SHARED
}
network={
ssid="test adhoc"
mode=1
proto=WPA
key_mgmt=WPA-NONE
pairwise=NONE
group=TKIP
psk="secret passphrase"
}
|
4.c. Wireless Tools
初始设置和管理模式
Wireless Tools提供了一个通用的方法设置无线网络接口,最高可达WEP安全等级。虽然WEP是一种较弱的安全方式,但它也是最普遍使用的加密方式。
Wireless Tools的配置由几个主要变量来控制,以下配置文件的例子描述了您所需要了解的所有内容。要牢记于心的是:可确保“连接到没有加密的并且信号最强的AP”的配置并不存在——但我们会一直尝试并帮您连接到某个AP。
代码 3.1: 安装wireless-tools |
# emerge net-wireless/wireless-tools
|
注意:
尽管您可以将无线设置保存在/etc/conf.d/wireless中,但是本指南还是推荐您将它们保存在/etc/conf.d/net之中。
|
代码 3.2: 在/etc/conf.d/net中配置iwconfig的例子 |
modules=( "iwconfig" )
key_ESSID1="[1] s:yourkeyhere key [1] enc open"
key_ESSID2="[1] aaaa-bbbb-cccc-dd key [1] enc restricted"
preferred_aps=( "ESSID1" "ESSID2" )
|
细致调整AP选择
您可以添加一些额外的选项来细致的调整AP的选择,不过正常情况下并不需要这么做。
您可以决定是否只连接首选的AP。默认情况下,当配置中列出的所有AP的连接都失败后,这时如果环境中有一个非加密的AP,系统将会与其连接。这个行为可以用associate_order变量来进行控制。下面给出一个相关的值的列表以及它们如何控制AP的选择。
值 |
描述 |
any |
默认行为 |
preferredonly |
只连接首选列表里的可见AP |
forcepreferred |
按首选列表里的顺序强制连接AP,如果扫描不到的话
|
forcepreferredonly |
不进行扫描——按首选列表里的顺序直接尝试连接AP
|
forceany |
和forcepreferred一样,外加连接到任何其他可用的AP |
最后我们还提供了一些blacklist_aps和unique_ap的选择。blacklist_aps的工作方式和preferred_aps类似。unique_ap是一个yes或no的值,它决定了是否允许两个无线接口同时接入一个AP。
代码 3.3: blacklist_aps和unique_ap的例子 |
blacklist_aps=( "ESSID3" "ESSID4" )
unique_ap="yes"
|
Ad-Hoc和Master模式
当您在管理模式中无法连接到任何AP时,您也可以将自己的设备设置成Ad-Hoc节点。
代码 3.4: 失败后转用ad-hoc模式 |
adhoc_essid_eth0="This Adhoc Node"
|
那么,要如何连接到Ad-Hoc网络,或者干脆运行于Master模式使自身成为一个无线接入点呢?这里有这样一个设置!您可能需要参照本章前面的内容来指定WEP密钥。
代码 3.5: ad-hoc/master配置的例子 |
mode_eth0="ad-hoc"
essid_eth0="This Adhoc Node"
channel_eth0="9"
|
重要:
以下是从NetBSD 文档的BSD wavelan文档中逐字逐句复制过来的内容。目前共计有14个可用的频道;1-11频道在北美是合法的,而在欧洲大部分地区则是频道1-13,在法国是频道10-13,在日本只允许使用频道14。如果有疑问,请参考随您所购买的无线网卡或AP附带的说明书。确保调整您的无线网卡与AP(或工作于ad-hoc模式的另一块无线网卡)使用同一个频道。默认情况下,在北美和欧洲大部分地区销售的无线网卡使用频道3;在法国使用频道11,在日本使用频道14。
|
Wireless Tools故障修除
一些环境或驱动的问题可能会使无线网络不能正常工作,下表多给出一些变量,可能有助于你解决问题。
参数 |
默认值 |
描述 |
iwconfig_eth0 |
|
请参看iwconfig的man page了解iwconfig各项参数 |
iwpriv_eth0 |
|
请参看iwpriv的man pages了解iwpriv各项参数 |
sleep_scan_eth0 |
0 |
在尝试扫描前的休眠时间(以秒为单位)。当驱动/固件需要时间激活时设置这个值。
|
sleep_associate_eth0 |
5 |
无线网络尝试连接到AP等待的秒数,超时则转向下一个AP。
|
associate_test_eth0 |
MAC |
一些驱动程序在失去连接或尝试连接时不会重置无效AP的MAC地址,而有一些驱动程序在碰到这些情况时不会重设quality level。这里有效的设定是MAC,quality和all。
|
scan_mode_eth0 |
|
某些驱动必须在ad-hoc模式下扫描,因此若扫描失败的话请尝试把此变量设置成ad-hoc
|
iwpriv_scan_pre_eth0 |
|
扫描前先向接口发送一些iwpriv命令。更多细节请参看iwpriv的man page。
|
iwpriv_scan_post_eth0 |
|
扫描后向接口发送一些iwpriv命令。更多细节请参看iwpriv的man page。
|
4.d. 针对每个ESSID的网络配置
有时,您连接ESSID1需要使用一个固定IP,而连接ESSID2要使用DHCP。实际上,大多数模块变量可以针对每个ESSID来定义。下面我们给出具体的做法。
注意:
只有使用WPA Supplicant或者Wireless Tools时,这些设定才起作用。
|
代码 4.1: 覆盖每一个ESSID的配置 |
config_ESSID1=( "192.168.0.3/24 brd 192.168.0.255" )
routes_ESSID1=( "default via 192.168.0.1" )
config_ESSID2=( "dhcp" )
fallback_ESSID2=( "192.168.3.4/24" )
fallback_route_ESSID2=( "default via 192.168.3.1" )
dns_servers_ESSID1=( "192.168.0.1" "192.168.0.2" )
dns_domain_ESSID1="some.domain"
dns_search_domains_ESSID1="search.this.domain search.that.domain"
config_001122334455=( "dhcp" )
dhcpcd_001122334455="-t 10"
dns_servers_001122334455=( "192.168.0.1" "192.168.0.2" )
|
5. 附加功能
5.a. 标准函数钩子
你可以定义4个函数,它们将会在start/stop操作前后被调用。这些函数将会以接口名称作为参数被调用,以便于一个函数可以控制多个适配器。
preup()和predown()函数的返回值必须为0(成功),这意味着可以使一个网络接口进入配置状态或退出配置状态。如果preup()返回一个非0值,则网络接口配置过程将被中止。如果predown()返回一个非0值,则停止该网络接口运行的操作将被终止。
postup()和postdown()函数的返回值会被忽略,因为就算它们返回失败,系统也没有什么可以做的。
${IFACE}表示要打开/关闭的接口。${IFVAR}是${IFACE}转化而来的bash允许的变量名。
代码 1.1: pre/post up/down函数范例 |
preup() {
if ethtool ${IFACE} | grep -q 'Link detected: no'; then
ewarn "No link on ${IFACE}, aborting configuration"
return 1
fi
return 0
}
predown() {
if is_net_fs /; then
eerror "root filesystem is network mounted -- can't stop ${IFACE}"
return 1
fi
return 0
}
postup() {
return 0
}
postdown() {
return 0
}
|
5.b. 无线工具函数钩子
注意:
此功能不适用于WPA Supplicant──但是${ESSID}和${ESSIDVAR}变量在postup()函数中是可用的。
|
你可以定义2个函数,它们将会在执行相关的操作前后被调用。这些函数将会以接口名称作为参数被调用,以便于一个函数可以控制多个适配器。
preassociate()函数的返回值应该为0(成功),这意味着一个网络接口的配置或取消配置过程可以继续。如果preassociate()返回一个非0值,则网络接口的配置过程将被中止。
postassociate()函数的返回值是被忽略的,因为就算它们返回失败,系统也没有什么可以做的。
${ESSID}被设置为你所连接到的AP的ESSID。${ESSIDVAR}是${ESSID}转化而来的bash允许的变量名。
代码 2.1: pre/post association functions |
preassociate() {
local user pass
eval user=\"\$\{leap_user_${ESSIDVAR}\}\"
eval pass=\"\$\{leap_pass_${ESSIDVAR}\}\"
if [[ -n ${user} && -n ${pass} ]]; then
if [[ ! -x /opt/cisco/bin/leapscript ]]; then
eend "For LEAP support, please emerge net-misc/cisco-aironet-client-utils"
return 1
fi
einfo "Waiting for LEAP Authentication on \"${ESSID//\\\\//}\""
if /opt/cisco/bin/leapscript ${user} ${pass} | grep -q 'Login incorrect'; then
ewarn "Login Failed for ${user}"
return 1
fi
fi
return 0
}
postassociate() {
return 0
}
|
注意:
${ESSID}和${ESSIDVAR}在predown()和postdown()函数中不可用。
|
6. 网络管理
6.a. 网络管理
如果你经常移动你的电脑,你可能会遇到没有网线和没有插入网线或者没有无线网络可用的情况。你也许希望在插入网线或无线网络可用时网络能够自动连上。
在这里你可以找到帮助你实现这个功能的一些工具。
注意:
本章只介绍ifplugd,但还有一些工具如netplug可供选择。netplug是ifplugd的轻量级替代者,但是它依赖于你的内核网络驱动的正常工作,而很多驱动不能正常工作。
|
6.b. ifplugd
ifplugd是一个在插入或拔出网线时启动或停止网络连接的程序。它也可以检测你的无线网卡和AP的关联,或者是在AP进入范围时检测。
代码 2.1: 安装ifplugd |
# emerge sys-apps/ifplugd
|
ifplugd的配置相当简单。配置文件放置在/etc/conf.d/net中。运行man ifplugd以获得详细的变量信息。同时,请查看/etc/conf.d/net.example以获得更多例子。
代码 2.2: ifplug设置范例 |
ifplugd_eth0="..."
ifplugd_eth0="--api-mode=wlan"
|
除了管理多个网络连接之外,你可能需要增加一个工具来使得管理多个DNS服务器和配置更加容易。当你通过DHCP来获取IP地址时,这将非常有用。只需要emerge openresolv.
代码 2.3: 安装openresolv |
# emerge openresolv
|
查看man resolvconf来学习他更多的特性。
本文档的内容遵循知识共享-署名-相同方式共享许可协议
|