声明: 本手册已经被新版本代替了,不再被维护。 |
内容:
首先,欢迎使用Gentoo。你将进入一个制定和性能的世界。当你安装Gentoo时,你将会清楚的了解到——你能够选择怎样编译软件,如何安装Gentoo,以及使用哪种系统日志程序等等。
Gentoo是一个快速和现代化的元发行版,拥有简洁灵活的设计理念。Gentoo基于自由软件构建,它不会对用户隐瞒任何底层细节。Portage是Gentoo使用的软件包管理系统,由于它是使用Python语言编写的,因此你可以轻松地查看和修改源代码。Gentoo的软件包系统使用的是源代码(尽管也包含对预编译的软件包的支持),配置Gentoo使用的也都是标准的文本文件。换句话说就是,开放无处不在。
希望您能理解的是Gentoo赖以生存的根本在于赋予用户以选择的权利,这一点很重要。我们会尽力做到不强加给用户任何东西,并且我们会尽最大努力为用户提供选择。如果你觉得有地方需要改进,请提交一个bug报告。
Gentoo Linux有两种易用的安装程序。一个是基于GTK+的(在X环境下使用),另一个是基于Dialog的,在控制台下使用。这本手册的第3章的内容涉及GTK+的安装程序第4章将讲解基于Dialog的安装程序。
你可以通过很多不同的方法来安装Gentoo。你可以下载我们的安装光盘安装,可以从已经安装好的另外一个发行版上安装,可以从一张可引导光盘上安装(比如Knoppix),也可以从网络启动环境或从一张恢复软盘上安装等等。
这份文档讲解了如何使用Gentoo Linux安装光盘来安装Gentoo,这张可启动光盘包含了安装Gentoo并使之运行起来所需要的全部东西。这里有两种类型的安装光盘,安装光盘和含安装程序的LiveCD。安装光盘是安装Gentoo所需的最小环境,它只包含了安装Gentoo Linux所必需的软件包。LiveCD具有完整的Gentoo Linux环境,你可以使用它做各种各样的工作,而其中的一个就是安装Gentoo Linux。目前,并不是所有的体系结构都有LiveCD,如果你使用的架构没有LiveCD,那么这篇文档中所指的就是通用安装光盘。
这篇安装向导并不会马上安装所有软件的最新可用版本;如果你想使用最新的软件进行安装请查看Gentoo Linux手册中的安装指南。
关于其他安装方法请参考我们的其他安装指南。我们还提供了Gentoo安装技巧和窍门,也值得一读。如果你觉得本安装指南太过详细,你还可以使用我们文档资源中的可用于你的硬件架构的快速安装手册。
如果你在安装过程中(或是在安装文档中)碰到问题,请到Gentoo发行版管理工程查找这些错误,访问bug追踪系统检查这是否是已知的bug。如果没有,请创建一个bug报告,然后我们来解决它。大家不要害怕负责解决(你的)bug的开发人员,他们通常是不会吃人的。
需要注意的是,虽然你当前阅读的文档是针对某一特定的硬件架构的,但是它还是会包含对其他平台架构的引用。这是因为Gentoo手册中的绝大部分的源代码是对所有硬件架构都适用的(目的是减少重复劳动和节省有限的开发资源)。我们会努力把这种负面影响减少到最小以避免混淆。
如果你不能确定你的问题是否是一个使用者问题(尽管你已经仔细地阅读了文档但仍然出了错)还是一个软件问题(尽管我们已经仔细地测试了安装步骤/文档但仍然出了错),我们欢迎你到irc.freenode.net的#gentoo(英文)或是#gentoo-cn(中文)提问。当然,如果你有其他方面的关于Gentoo的问题,我们也欢迎:)
如果你有关于Gentoo的问题,请到我们的Gentoo文档查看常见问题。你也可以浏览我们论坛中的FAQs。如果你还是无法找到答案,那么就去irc.freenode.net中我们的#gentoo频道寻找吧,我们中的一些狂热者会一直呆在IRC里的:-)
Gentoo参考平台,以下缩写为GRP,它是一个预构建好的软件包快照,可以让使用者(也就是你!)加快安装Gentoo的过程。GRP包含了构建一个完整可用的Gentoo所需要的所有软件包。它不仅可以在安装基础系统时加速安装过程,而且对于需要耗费长时间编译的软件(比如xorg-x11、GNOME、OpenOffice、Mozilla‥‥‥)都有对应的GRP软件包可供使用。
但是这些预编译的软件包在Gentoo发行版本的生命周期中并不会被维护下去。这些快照在每次Gentoo发布新版本时发布,这么做是为了可以在短时间内安装好具有完整功能的Gentoo。当你装好Gentoo后,就可以边使用,边在后台更新你的Gentoo系统。
你的Portage树——ebuilds(包含了软件包的所有相关信息,比如描述、主页、源代码URL、编译步骤、依赖性等等)的集合——它必须和GRP集同步:软件可用的ebuild版本和对应的GRP软件包版本必须相符。
因为这个原因,你只会在使用当前这种安装方式时受益于GRP。要提醒那些想用所有软件的最新版本来进行安装的人们的是,那样的GRP并不存在。
并不是所有的硬件架构都提供GRP软件包。当然这也并不说明GRP不支持其他的硬件架构,只是由于我们没有足够的硬件资源构建和测试GRP软件包。
目前,如下所列这些硬件架构平台都有GRP软件可供使用:
如果你的硬件架构(或是子架构)不在列表中,你将无法使用GRP来进行安装。
介绍就到此为止了,让我们从启动通用安装光盘/安装程序LiveCD继续。
在开始之前,我们首先列出能够让你使用LiveCD成功安装Gentoo系统所需要硬件。
CPU | 任何AMD64或EM64T CPU |
内存 | 256MB |
磁盘空间 | 1.5GB(不包括交换分区) |
交换分区 | 至少256MB |
LiveCD是一个可启动的光盘,它包含一个完整的Gentoo环境,允许你从光盘启动Linux。在启动的过程中,它会检测你系统中的硬件并且加载相应的驱动程序。Gentoo安装光盘是由Gentoo开发者维护的。
目前有两种安装光盘可以使用:
2.c. 下载、刻录及启动Gentoo Linux安装程序LiveCD
你可以从我们的任何一个镜像网站下载LiveCD。它们位于releases/amd64/2008.0/livecd目录下。
在那个目录中,你能找到一个ISO文件。那是一个完全的光盘镜像文件,你可以把它刻录到CD-R的光盘上。
下载文件之后,你可以校验一下它的完整性,看它是不是被损坏了:
使用GnuPG程序来取得我们的公钥,执行下列命令:
代码 3.1: 获取公钥 |
$ gpg --keyserver subkeys.pgp.net --recv-keys 17072058
|
现在验证签名:
代码 3.2: 验证加密签名 |
$ gpg --verify <签名文件> <下载的iso>
|
你必须选择原始刻录方式来刻录下载的ISO文件。至于具体如何刻录,则取决于你选择的刻录程序。我们将在这里讨论cdrecord和K3B;更多的信息可以在我们的Gentoo FAQ中找到。
重要: 请完整阅读本节,因为在继续开始后面的工作之前你很可能将没有机会阅读它了。 |
一旦你已经刻录完LiveCD,就是时候来启动它了。把你所有光驱中的光盘全部取出,重新启动系统并且进入BIOS。通常按DEL、F1或ESC键来进入,这取决于你使用的BIOS版本。在BIOS里修改启动顺序使得光驱在硬盘之前启动。这个设置通常在"CMOS Setup"下。如果你不进行设置,你的系统会忽略光驱,只从硬盘启动。
现在把LiveCD放入光驱中并重新启动系统。你会看到一个启动提示符。在这一屏按回车键以使用默认选项来开始启动过程,或者在启动选项中指定一个内核来定制启动LiveCD,然后单击回车键。
指定内核?对,我们在LiveCD上提供了几个内核。默认的是gentoo。其他的内核是为了特定硬件的需要,名字带-nofb的表示的是未启用framebuffer的内核。
下面列出的是你能够使用的内核的简单介绍:
内核 | 说明 |
gentoo | 支持K8 CPU(带NUMA支持)和EM64T CPU的默认内核 |
gentoo-nofb | 与gentoo相同,但是不支持framebuffer |
memtest86 | 测试本地内存错误 |
你也能够设置内核选项。那些选项都是可选的设置,你可以根据自己的意愿打开或者关闭他们。以下列表与你在启动界面按下F2至F7键收到的信息相同。
硬件选项:
卷/设备管理:
其他选项:
注意: 此CD将会先检查“no*”选项,然后再检查“do*”选项,所以你可以以你指定的顺序来覆盖任意选项。 |
现在启动你的光盘,选择一个内核(如果你不喜欢默认的gentoo内核)和启动选项。例如:我们给你演示如何以dopcmcia内核参数启动gentoo内核:
代码 3.3: 启动安装光盘 |
boot: gentoo dopcmcia
|
你将看到启动界面和一个进度条。如果你正在把Gentoo安装到一个使用非US键盘的系统中,你必须立刻按下Alt-F1键切换到字符模式下,按提示信息来做。如果10秒钟内没有选择,系统则接受默认的键盘布局(US键盘)并继续启动过程。一旦启动过程结束,系统将启动Gnome桌面环境,你将会以“gentoo”用户的身份自动登陆图形模式的“Live” Gentoo Linux。在其他控制台你将以“root”用户登陆,并使用root提示符(#)。你可以通过按键Alt-F2,Alt-F3,Alt-F4,Alt-F5,Alt-F6切换到其他控制台。按键Alt-F7切换回你启动的图形桌面。如果你想在X界面里切换到其他控制台,需要在上述组合键前面加上Ctrl。你可以通过使用sudo程序在图形环境中的终端上以root用户执行命令。你甚至可以在终端中变成root用户来执行多个任务。
代码 3.4: 使用sudo来运行程序 |
(仅仅是示例) (编辑组文件) # sudo vi /etc/group (在一个会话中变为root) # sudo su - |
当LiveCD启动时,它尝试检测你的所有硬件设备并加载相适应的内核模块来支持你的硬件。在大多数情况下,它做的很好。但是,在某些情况下,它可能没法自动加载你需要的内核模块。如果PCI自动检测漏掉了你的系统的一些硬件,你不得不手动加在相应的内核模块。而这个任务需要root权限。
在下一个例子中,我们尝试加载8139too模块(支持特定型号的网卡):
代码 3.5: 加载内核模块 |
# modprobe 8139too
|
如果你想让其他人访问你的安装环境,或是你不想使用root权限的irssi来聊天(由于安全的原因),你需要创建必需的用户帐号并且修改root密码。修改root密码和添加新用户这些工作需要你拥有root权限。
使用passwd工具修改root密码:
代码 3.6: 修改root密码 |
$ sudo su - # passwd New password: (输入你的新密码) Re-enter password: (再输入一次) |
为了创建一个用户帐号,我们首先输入它的相关信息,接着是密码。我们使用useradd和passwd来完成这些工作。下面的例子中,我们创建一个叫“john”的用户。
代码 3.7: 创建用户帐号 |
# useradd -m -G users john # passwd john New password: (输入john的密码) Re-enter password: (再输入john的密码) |
你可以使用su来把你的用户身份从root变成新建的用户:
代码 3.8: 改变用户id |
# su - john
|
你也可以改变图形环境中的“gentoo”用户的密码。这个帐号已经适合在互联网上冲浪使用了。
代码 3.9: 改变gentoo的密码 |
$ passwd New password: (输入你的新密码) Re-enter password: (再输入一次) |
如果你想在安装的时候查看Gentoo用户手册(不管是光盘中的还是在线的),你可以使用Mozilla Firefox(在图形环境中)或者使用links(在终端环境下)。
代码 3.10: 在Firefox中显示光盘上的文档 |
# firefox /mnt/cdrom/docs/handbook/html/index.html
|
如果你更喜欢使用links来看文本形式的手册,请确认你已经创建了一个用户帐号(参见可选:用户帐号)。然后按Alt-F2进入一个新的终端然后登陆。
代码 3.11: 使用links来显示光盘上的文档 |
# links /mnt/cdrom/docs/handbook/html/index.html
|
你可以通过按Alt-F7返回一开始的图形界面。
不过,最好还是使用Gentoo在线手册,因为它比光盘上提供的要新。你可以使用Firefox或links来查看,但是必须在你完成配置你的网络那章之后(否则你将无法连接到互联网来查看文档):
代码 3.12: 使用Firefox查看在线文档 |
# firefox http://www.gentoo.org/doc/zh_cn/handbook/2008.0/handbook-amd64.xml
|
代码 3.13: 使用links查看在线文档 |
# links http://www.gentoo.org/doc/zh_cn/handbook/2008.0/handbook-amd64.xml
|
你现在可以选择使用基于GTK+的安装程序(需要X)或者基于Dialog的安装程序(可以运行在控制台上)来继续安装。
Gentoo Linux安装程序(GLI)提供了一个友好的在你的电脑上安装Gentoo的过程的介绍。请仔细阅读每一个选项。每一个安装步骤都有详细帮助信息,请看每一屏的左侧。我们建议您在做出每个选择前,都先浏览帮助页面。请注意在安装过程中的任何时候您都可以保存您的配置进度,并在之后随时继续之前的安装。
为了在您的机器上安装Gentoo,您需要准备好磁盘。Partitioning画面将显示已检测到的磁盘列表,您可以为每一个分区指定文件系统。点击Clear partitions将会清除您磁盘上先前所有的分区,请谨慎使用!您也可以为某些分区重新指定大小。
如果您选择Recommend layout,安装程序将删除硬盘上所有已有分区,并建立三个分区:/boot: 100MB,/swap:512MB,剩下的所有有效空间都给/根分区使用。
警告: 在使用任何分区工具来更改您的分区表前,您都应该先备份好您的系统,任何一点bug都可能造成您数据的丢失。你对分区表所做的任何改动,安装程序都会立即执行。 |
从地图上选择离您所在地最近的一个地点。然后,您需要设定您的系统时钟使用UTC还是local时间。
在这一节,您将要配置您电脑上的不同网络接口。仔细阅读可用的选项。
在Hostname/Proxy Information/Other标签页中,您需要为您的系统选择一个主机名称。如果需要,您还可以指定代理服务器和DNS设置。
首先为系统管理员(root用户)设置root密码。
我们强烈建议你创建一个普通用户,作为平时使用。用root用户来完成所有工作非常不安全,应当尽量避免!建立您的用户,设定密码,并加入到合适的组中。您也可以为用户另外指定主目录,选择一个shell,以及添加有用的注释。
LiveCD已经包含了许多预编译包。如果您想安装的话,请勾上相应的确认框。
在这一节您可以选择开机时要启动的一些服务。仔细阅读可用的选项和描述,然后选择您想要的服务。举个例子,如果您已经选择安装xorg-x11,并想一开机就直接进入图形桌面,那您就要从列表中选择“xdm”。
现在您可以调整各种设定,包括键盘布局、图形化的显示管理器、默认编辑器,以及设定您的系统时钟(UTC时间还是local时间)。
现在,您已经安装好了。您可以随时重启进入您的新Gentoo系统。
恭喜,您的系统现在已经安装好了。接下来请看下一步该怎么走?一章以学习更多关于Gentoo的知识。
启动Gentoo Linux Installer LiveCD后,默认会载入一个图形桌面。若不能启动图形桌面,则会显示一个命令行提示符。运行安装程序,只需简单输入:
代码 1.1: 运行安装程序 |
# installer-dialog
|
Gentoo Linux安装程序(GLI)提供了一个友好的在你的电脑上安装Gentoo的过程的介绍。请仔细阅读每一个选项。每一个安装步骤的屏幕顶端都有详细的帮助信息。我们建议您在做出每一个选择之前都好好读一读帮助信息。请注意,在安装过程中的任何时候您都可以保存您的配置进度,并在之后随时继续之前的安装。按制表键(你的键盘上的)来在屏幕上的菜单间移动,按回车键来确认一个动作。
为了在你的机器上安装Gentoo,你需要准备好磁盘。分区画面将显示已检测到的磁盘列表,您可以为每一个分区指定文件系统。选择清除分区将会清除您磁盘上先前所有的分区,请谨慎使用!你也可以为某些分区重新指定大小。
如果您选择推荐的分区布局,安装程序将建立三个分区:/boot: 100MB,/swap:最多512MB,剩下的所有有效空间都给/根分区使用。
警告: 在使用任何分区工具来更改您的分区表前,您都应该先备份好您的系统,任何一点bug都可能造成您数据的丢失。 |
从列表中选择跟你实际位置最近的地区。
在这一节,你可以配置检测到的各种各样的网络设备。仔细阅读可用的选项。
下一节你可以选择使用DHCP或手动配置IP地址。一旦网络设备正确配置好了,你就要为系统设一个主机名。如果需要,您还可以指定一个域名以及任何必要的DNS服务器信息。
首先为系统管理员(root用户)设置root密码。
我们强烈建议你创建一个普通用户,作为平时使用。用root用户来完成所有工作非常不安全,应当尽量避免!建立您的用户,设定密码,并加入到合适的组中。您也可以为用户另外指定主目录以及为他们选择登录shell。
LiveCD已经包含了许多预编译包。如果您想安装的话,请勾上相应的确认框。
在这一节您可以选择开机时要启动的一些服务。仔细阅读可用的选项和描述,然后选择您想要的服务。举个例子,如果您已经选择安装xorg-x11,并想一开机就直接进入图形桌面,那您就要从列表中选择“xdm”。
现在您可以调整各种设定,包括键盘布局、图形化的显示管理器、默认编辑器,以及设定您的系统时钟(UTC时间还是local时间)。
安装程序会问你是否想保存安装配置文件供以后使用。安装程序会在安装结束时提示你。你会回到命令提示符。之后要做的事就是重启系统,输入:
代码 4.1: 重新启动 |
# shutdown -r now
|
恭喜,您的系统现在已经安装好了。接下来请看下一步该怎么走?一章以学习更多关于Gentoo的知识。
恭喜!您现在拥有了一个可以运转的Gentoo系统。但接下来往何处去?现在您拥有什么样的选择?先探索些什么?Gentoo为它的用户提供了大量的可能性,因此也有大量已经提供文档(少量没有)的特性。
您无疑应该先看一下Gentoo手册里标题为在Gentoo中工作的那一章节,那里解释了如何保证您随时用上最新的软件,如何安装更多的软件,什么是USE标记,以及Gentoo Init系统是如何工作的等等。
如果您有兴趣对系统进行优化以使其适合桌面应用,或者您想了解如何将您的系统配置成一个完整可用的桌面系统,请参阅我们所提供的全面的Gentoo桌面文档资源。另外,我们也提供本地化指南供您参考,利用它您可以使您的系统看起来更加本地化。
我们还提供了一份值得您阅读的Gentoo安全手册
您如果想得到一份我们已有的可用文档的列表,请查看我们提供的文档资源页面。
当然也非常欢迎您加入我们的Gentoo论坛或者我们建立的Gentoo IRC 频道中的任意一个。
我们也有一些邮件列表是面对所有用户开放的。加入列表的方法已包含在前述页面中。
现在,我们将保持安静,以便让您享受您的安装过程。
Gentoo是一个更新快速的发行版。接下来的章节将为您描述一些会影响Gentoo安装的重要的变更。我们只列出那些在安装中通常会遇到的,那些在安装中不会发生变化的包将不会给出。
到目前为止还没有重要的变更。
Portage可能是Gentoo在软件包管理方面最瞩目的创新。它所具有的高度灵活性以及其他大量的特性,使其经常被认为是Linux中最好用的软件包管理工具。
Portage完全用Python和Bash写成。由于它们均为脚本语言,所以Portage对于用户而言也就是完全可见的。
绝大部分用户将通过emerge工具来使用Portage。本章节的目的不是在重复emerge的man page里已经提供的内容,如果要完整的了解emerge工具提供的选项,请参考其man page里给出的相应说明。
代码 1.1: 获取emerge的帮助信息 |
$ man emerge
|
当我们谈到(软件)包的时候,我们通常指的是Portage树为Gentoo用户提供的包的名称。Portage树是ebuilds文件的集合,这些文件包含了Portage管理工具维护软件(安装,搜索,查询, ...)时所需要的所有信息,并被默认的放置在/usr/portage目录中。
每当您要求Portage对系统中的软件包执行一些操作的时候,它会以系统中的ebuilds文件作为基础。因此您最好定期更新系统Portage树中的ebuild文件,这样Portage才知道新加入了哪些软件,哪些软件发布了安全更新,等等。
通常我们使用rsync命令来更新Portage树,它是一个快速的增量性的文件传输工具。另外emerge命令为rsync命令提供了一个相当简单的前端。
代码 2.1: 更新Portage树 |
# emerge --sync
|
如果由于防火墙的限制,您无法进行rsync操作,您仍然可以通过下载我们每天汇总的Portage树快照来更新本地的Portage树。emerge-webrsync命令会自动将最新的Portage快照下载并安装到您的系统中。
代码 2.2: 运行emerge-webrsync |
# emerge-webrsync
|
要在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标记 |
(当然alsa-lib只是一个例子。) # 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来定位您感兴趣的文件:) # 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
|
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
|
有关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) |
当您想安装一个对于您系统不可用的软件包。您会收到类似这样的屏蔽错误提示。您应该试着安装那些对于您系统可用的程序或者等待那些不可用的包被置为可用的。通常一个软件包被屏蔽的原因在于:
代码 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。
代码 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文件给出了错误的下载地址。那些保存源代码的服务器也可能因为某些原因当机。
一小时后重试一次看看问题是否仍然存在。
代码 4.9: Portage关于profile中保护的包的警告 |
!!! Trying to unmerge package(s) in system profile. 'sys-apps/portage' !!! This could be damaging to your system. |
您要求移除系统核心软件包中的一个。它是您的profile中所列出的必需的软件,因此不能从系统中移除。
有时当您试图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服务器过载而影响其他用户的正常使用。 |
你在安装gentoo(或者是其他发行版,甚至于其他特定操作系统)的时候,你要依据你工作的环境做出选择。服务器跟工作站的组织结构不同,游戏机跟3D工作站也会不一样。
不单只是选择你想要安装的包时如此,选择某一个包需要的特性时同样如此。如果你不需要OpenGL,为什么还要颇费周折的安装OpenGL并在其他包中加入对OpenGL的支持?如果你不想用KDE,而且软件包没有KDE也能完美运行,为什么还要在编译这些包的时候加入KDE支持?
为了帮用户判断什么需要安装或激活,什么不需要;我们希望用户能用简单的方式设定他们自己的环境。这能促使用户判断他真正需要的东西,并让Portage(我们的包管理系统)做出有用的决定的过程变得简单。
我们来具体看看USE标记。每一个标记都是代表对某特定概念的支持和依赖关系信息的关键字。如果你设定了某个USE标记,Portage会明白你选择了支持这个关键字(所代表的概念)。当然这同时也改变了这个包的依赖关系信息。
让我们看一个示例:关键字kde。如果你的USE变量里面没有这个关键字,所有具有可选KDE支持的包在编译时都不会编译KDE支持。所有具有可选KDE依赖关系的包在安装时都不会(做为一个依赖关系而)安装KDE库。如果你设定了kde关键字,这些包在安装时都会编译KDE支持,而且KDE库也会(作为一个依赖关系而)被安装。
通过正确设定关键字,你会得到一个根据你的需要而定制的系统。
USE标记分两类:全局和局部USE标记。
当前可用的全局USE标记列表可以在网上或者本机的/usr/portage/profiles/use.desc文件里找到。
当前可用的局部USE标记列表可以在本机的/usr/portage/profiles/use.local.desc 文件里找到。
希望您已经意识到了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标记 |
(这个例子是base,default-linux,default-linux/x86和
default-linux/x86/2004.3的设定的并集)
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标记,你需要创建/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变量声明成一个环境变量,而不必两次修改/etc/make.conf。但是要记住,当你重新emerge或者升级这个程序的时候(不管是单独地还是作为系统升级的一部分),你的修改都会丢失!
下面的例子我们将在安装seamonkey的时候暂时性地从USE设置中移去java标记。
代码 2.5: 将USE作为一个环境变量使用 |
# USE="-java" emerge seamonkey
|
当然,我们需要一个明确的先后次序来决定何处的USE设定优先级较高。你肯定不希望在定义了USE="-java"之后,因为某个有更高优先级的设定而导致java仍然被使用。USE设定的优先级顺序是(由低到高):
运行emerge --info可以看到Portage识别的最终的USE设定。它会列出Portage使用的所有相关变量(包括USE变量)。
代码 2.6: 运行emerge --info |
# emerge --info
|
如果你已经修改了你的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标记设定。
让我们以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
|
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
|
distcc是一个分布式编译程序,可以把编译任务分配给同一网络中的不同机器,这些机器的配置不必完全相同。distcc客户端发送所有必须的信息给所有可利用的distcc服务器(运行distccd的机器)。这样它们每一个都能为客户端编译一部分源码。所导致的效果就是更短的编译时间。
您可以在Gentoo Distcc文档里找到更多的关于distcc的信息(包括如何让它在Gentoo上工作)。
Distcc使用一个图形化监视器来监视您的机器发送出去的编译工作。如果您使用GNOME,那么将“gnome”放入您的USE设置中。但是,如果您不使用GNOME而仍然希望使用这个监视器,那么就把“gtk”放进您的USE设置中。
代码 2.1: 安装distcc |
# emerge distcc
|
添加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 |
ccache是一个快速的编译器缓存。当您编译一个程序的时候,它会缓存中间的结果。这样,不论什么时候您重新编译同一个程序,编译所需要得时间将被大大缩短。对于普通的编译来说,这可以提高编译速度5到10倍。
如果您对ccache的工作机制有兴趣,请访问ccache主页.
要安装ccache,只需要运行emerge ccache:
代码 3.1: 安装ccache |
# emerge ccache
|
打开/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编译中使用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}"
|
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
|
当您在编译一系列软件的时候,Portage能在编译某一个包的同时下载编译列表中后面的包的源码,这样就缩短了安装时间。如果您希望使用这种功能,添加“parallel-fetch”到您的FEATURES变量里。
当您以root身份运行Portage,FEATURES="userfetch"可以让Portage在下载源码包的时候放弃root特权。这是一个小小的安全性的提高。
当你启动系统时,会发现有很多的文字信息输出。如果注意观察的话,会发现每次启动时这些文字信息都是相同的。所有这些动作的顺序我们称之为启动顺序,而且它们基本上是被静态定义的。
首先,你的引导程序会把你在引导程序配置文件中定义的内核镜像加载到内存中,之后它就告诉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自己不会决定所有的启动顺序。它需要一个配置文件来指定它的工作流程。这个配置文件就是/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
|
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参数)来只查看已经启用的初始化脚本和他们的运行级别。
初始化脚本有时候是很复杂的。因此我们不想让用户自己直接编辑初始化脚本,这样将更容易出错。然而能够配置这样的一个服务也挺重要。比如:你可能想给某个服务本身添加更多的选项。
把配置信息独立于脚本之外存放的另一个原因是,你不用担心升级初始化脚本会覆盖掉你之前所做的改动。
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一样),可以使得配置服务非常简便。它还允许我们提供更多有关这个变量的信息(以注释形式)。
当然不是,自己写一个初始化脚本通常情况下不是必需的,因为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服务信息如下:
在一些情况下你可能并不需要某一个服务,但是,你可能需要这个服务在系统中其他某可能存在的服务之前(或之后)启动(注意这个条件——这不再是依赖关系了)以及运行在同一个运行级别(注意这个条件——只牵扯到同一运行级别的服务)。你可以使用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 #在再次启动前等待3秒钟
start
}
|
要支持/etc/conf.d里的配置文件,你不需要作任何操作:当你的初始化脚本执行的时候,下面的文件将会被自动source(也就是说可以使用里面的变量):
而且,如果你的初始化脚本提供了一个虚拟依赖关系(如:net),那么和这个依赖关系相关的文件(如:/etc/conf.d/net)也会被source。
许多笔记本用户会遇到这样的情形:在家时你需要启动net.eth0,而在路上你就不需要启动net.eth0(因为没有网络可用)。使用Gentoo,你可以根据你的意愿来改变运行级别的行为。
例如:你可以创建另一个可以启动的“default”运行级别,并分配其他的一些初始化脚本给它。然后你可以在启动时选择你想要运行哪个“default”运行级别。
首先,给你的另一个“default”运行级别创建一个运行级别目录。作为一个例子我们创建offline运行级别:
代码 5.1: 创建一个运行级别目录 |
# mkdir /etc/runlevels/offline
|
下面我们添加必要的初始化脚本到新创建的运行级别中。示例:如果你需要一个与你当前的default运行级别一模一样的副本,但不包括net.eth0:
代码 5.2: 添加必要的初始化脚本 |
(复制所有在default运行级别中的服务到offline运行级别中) # cd /etc/runlevels/default # for service in *; do rc-update add $service offline; done (删除在offline运行级别中不需要的服务) # rc-update del net.eth0 offline (显示在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完全类似于softlevel。仅仅不同的是在这里你要定义另一个“boot”运行级别而不是另一个的“default”运行级别。
环境变量是一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。许多用户(特别是那些刚接触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" |
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" |
通过使用同一个文件来定义你所有的变量,你对如何定义自己的变量有了个大概的了解。
/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是另外一个变量)是不允许的。 |
你并不是一直都想定义全局变量。比如你想把/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"
|
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的配置变量定义为环境变量,但我们并不推荐这样做。
我们已经见到过/etc/make.profile目录了。不过,这并不是一个真正的目录,而是一个指向profile的符号链接,默认情况下是一个位于/usr/portage/profiles里的目录,虽然你也可以在其他地方创建自己的profile并指向他们。这个符号链接指向的profile就是你的系统所使用的。
一个profile包含了Portage需要的与架构相关的信息,比如该profile对应的system包含的软件包的列表,以及对这个profile来说不能运行的(或者被屏蔽掉)的软件列表,等等。
当你需要变更Portage安装软件的行为时,你需要做的就是编辑/etc/portage 中的文件。我们强烈建议你使用/etc/portage中的文件而不是通过修改环境变量来变更这些行为!
在/etc/portage目录中,你可以创建下列文档:
这些并不需要一定是文件;它们也可以是有包含单个软件包信息文件的目录。更多关于/etc/portage目录的信息及你能创建的文件的完整列表可以在Portage的手册页中找到:
代码 1.1: 阅读Portage的手册页 |
$ man portage
|
先前提到的配置文件不能保存在其他地方——Portage总是会在这些特定的位置搜索配置文件。不过Portage还用了许多其他的位置来满足不同的目的:编译、保存源代码、保存portage树。
所有的这些目的都有众所周知的默认位置,不过你可以根据你自己的喜好通过/etc/make.conf来改变它们。本章中的其他部分将解释Portage使用哪些特定的位置存放它们以及怎样改变它们在你的文件系统中的存放地点。
这篇文档并不是一份全面的参考。如果你需要100%范围的说明,请参看Portage和make.conf的手册页:
代码 1.2: 阅读Portage和make.conf的手册页 |
$ man portage $ man make.conf |
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将你系统的状态(装了哪些软件包,什么文件属于哪个软件包……)保存在/var/db/pkg。不要手动改变这些文件!它可能破坏Portage对你系统的了解。
Portage缓存(包括修改时间、虚拟包、依赖关系树信息……)储存在/var/cache/edb。这个位置就是一个缓存:如果你没有正在运行portage相关的程序,你就可以清空它。
Portage的临时文件默认保存在/var/tmp。这是通过PORTAGE_TMPDIR变量定义的。
如果你改变了PORTAGE_TMPDIR变量,你也需要改变下列的变量,因为它们不会知道PORTAGE_TMPDIR变量的改变。这是由于PORTAGE处理这些变量的方式导致的:BUILD_PREFIX。
Portage为每一个它所安装的软件包在/var/tmp/portage里创建特定的编译目录。这一位置是通过BUILD_PREFIX变量定义的。
默认情况下,Portage将所有的文件安装到当前文件系统(/)里。但是你可以通过改变环境变量ROOT来改变它。这在你想要创建一个新的编译镜像时是很有用的。
Portage能为每一个ebuild建立日志文件,但只有当PORT_LOGDIR变量设定的位置是portage可写的才行。默认情况下,这个变量没有设定。如果你没有设定PORT_LOGDIR,你就不会收到当前日志系统报告的任何编译日志,然而你可能收到一些来自新的elog机制的日志。如果你定义了PORT_LOGDIR并且你也使用elog,你就将收到编译日志以及elog保存的任何日志,就像下文解释的一样。
Portage通过elog对日志记录提供精确的控制:
重要: 如果你使用Portage-2.0.*中的enotice,你必须完全移除enotice,因为它和elog不兼容。 |
如前面所述,你可以在/etc/make.conf中定义许多变量来配置Portage。请参考make.conf的手册页以获得更详细和完整的信息:
代码 1.1: 阅读make.conf的手册页 |
$ man make.conf
|
当Portage构建应用程序时,他会将下面变量的内容传给编译器和configure脚本:
USE变量也会在配置和编译的过程中被用到,不过这在前面的章节中已经详细解释过了。
当Portage在安装了一个某软件的新版本后,会把属于旧版本的已经过时的文件从你的系统中删除。在此之前Portage会给用户5秒钟时间撤销此操作,这5秒钟由CLEAN_DELAY变量定义。
你可以通过设定EMERGE_DEFAULT_OPTS变量以使emerge每次运行时都使用某些特定的选项。一些常用的选项是--ask,--verbose,--tree,等等。
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来解除对受保护目录下某些子目录的保护。
当你的系统上没有所需要的信息和数据时,Portage就会从网络上获取数据。含有这些信息和数据的服务器的位置定义在以下变量中:
第3个变量设定rsync服务器的地址,此服务器用来更新你的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等等。
你不能改变Portage用来更新Portage树所使用的rsync命令,但你可以设定一些与rsync命令相关的变量:
更多有关这些参数的信息请阅读man rsync.
你可以用ACCEPT_KEYWORDS变量改变默认的系统分支。此变量的默认设置为你的电脑体系结构的稳定分支。更多关于Gentoo分支的信息可以在下一章节找到。
你可以通过FEATURES变量激活Portage的某个特性。这些已在前面的章节中讨论过,如Portage的特性.
通过PORTAGE_NICENESS变量,你可以增加或减少Portage运行时的nice值。PORTAGE_NICENESS变量的值会被加到目前的nice值上。
更多关于nice值的信息, 请参考nice的手册页:
代码 6.1: 更多关于nice的信息 |
$ man nice
|
NOCLOR变量的默认值为“false”,如果你想禁用Portage的彩色输出,请把这个变量设为“true”。
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" |
之后如果您更新系统,您将会发现有大量的包需要更新。要提醒您注意的是:您使用测试分支更新系统后,再想转回使用官方的稳定分支将不是一件容易的事情(当然您使用系统的备份的情况除外)。
您可以让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 |
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 |
当您希望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 |
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
|
你也可以使用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将退出。
利用quickpkg可以对系统中已安装的包进行打包归档。这些归档文件可以作为预编译包使用。运行quickpkg非常简单:只要加上你想要制作的软件包的名字就可以了。
例如,要打包curl,arts,procps
代码 3.1: quickpkg的使用范例 |
# quickpkg curl arts procps
|
预编译包会保存在$PKGDIR/All(默认为/usr/portage/packages/All)。指向这些包的符号链接保存在$PKGDIR/<category>中。
你可以有选择地更新特定的类别/软件包并且忽略其他类别/软件包。我们通过让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-*/* |
然而要注意的是这可能导致依赖性问题,因为新的、允许安装的软件包可能依赖于那些新的、但被排除的软件包。
可以让你的Portage使用官方Portage树里面没有的ebuild。创建一个新的目录(比如/usr/local/portage)用以存放第三方ebuild。请在新目录中使用跟官方Portage树一样的目录结构!
然后在/etc/make.conf中定义PORTDIR_OVERLAY变量,使它指向刚才创建的目录。现在,每当你用到Portage的时候,这些ebuilds也会被同时计算在内,并且当你下次运行emerge --sync时,不会删除/覆盖这些ebuild。
对于开发多个Overlay的许多高级用户而言,他们会在更新Portage树之前测试软件包或是想使用来源广泛的非官方ebuild。app-portage/gentoolkit-dev软件包提供了gensync工具,帮助你的overlay仓库时时都处于最新的状态。
可以用gensync一次更新所有的仓库,也可以选择更新其中的几个。每个仓库会有一个.syncsource文件于/etc/gensync/配置目录下,其内容包含仓库的存放位置、名字、ID等。
假设你有两个额外的仓库,分别名为java(存放开发中的java ebuild)和entapps(存放在家中为你给公司开发的应用程序)。那么可以通过以下命令来更新这些仓库:
代码 2.1: 使用gensync更新仓库 |
# gensync java entapps
|
尽管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 |
注意: 本文假定你已经配置好了你的内核,包括你的硬件的模块,并且你知道你的硬件(译注:这里指网卡)的接口名。我们同时假定你已经设置了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文件的一个示例 |
# DHCP config_eth0=( "dhcp" ) # 使用CIDR形式表示的静态IP config_eth0=( "192.168.0.7/24" ) routes_eth0=( "default via 192.168.0.1" ) # 使用netmask形式表示的静态IP config_eth0=( "192.168.0.7 netmask 255.255.255.0" ) routes_eth0=( "default via 192.168.0.1" ) |
注意: 如果你没有指定,DHCP是默认选项。 |
注意: 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 |
config_eth0变量是一个网络接口配置的核心。它包含了一组用来配置接口的高级指令列表(我们用eth0作为示例)。指令列表中的每一条命令都是顺序执行的。该列表中只要至少有一条命令正常工作,则这个网络接口就被认为是可以使用的。
这里列出了一些可用的指令。
命令 | 描述 |
null | 不做任何事 |
noop | 如果网络接口已经开启并且也绑定好地址的话,则中止配置过程,配置成功。 |
一个IPv4或是IPv6的地址 | 绑定地址到接口上 |
dhcp、adsl或apipa(或者一个第三方模块提供的自定义命令) | 运行提供这些命令的模块,例如dhcp这个命令会运行一个提供DHCP功能的模块,它可能是dhcpcd、dhclient或者pump中的一个。 |
如果一条命令执行失败,你可以指定一条fallback指令。这条fallback指令必须完全符合配置的结构。
你可以连在一起使用这些指令,下面是一些真实应用的例子。
代码 1.1: 配置示例 |
# 加上三个IPv4的地址 config_eth0=( "192.168.0.2/24" "192.168.0.3/24" "192.168.0.4/24" ) # 加上一个IPv4的地址和两个IPv6的地址 config_eth0=( "192.168.0.2/24" "4321:0:1:2:3:4:567:89ab" "4321:0:1:2:3:4:567:89ac" ) # 保持使用内核分配的地址,除非网络接口没有启动。如果是这样则改用DHCP获 #取。如果DHCP失败的话则由APIPA指定一个网络地址。 config_eth0=( "noop" "dhcp" ) fallback_eth0=( "null" "apipa" ) |
注意: 当你使用的是ifconfig模块并且绑定了一个以上的网络地址,系统会为每一个网络地址建立一个别名。在上面的两个例子中你将会得到这几个网络接口:eth0、eth0:1和eth0:2。由于内核和其他程序会把eth0:1和eth0:2看作eth0,所以你将无法对这些接口做什么特殊的事情。 |
重要: fallback中的顺序相当重要!如果我们没有指定null选项,那么apipa只会在noop命令失败后才会执行。 |
/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的依赖关系 |
# 你可以使用目前脚本里能用的任何依赖关系(use、after、before)
depend_br0() {
need net.eth0 net.eth1
}
|
要获得更多关于依赖性的讨论。请参考Gentoo手册中的这一节撰写初始化脚本
变量的名称是动态的,它们通常的结构是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" (上面的例子意思是当一块无线网卡连接到ESSID为My "\ NET的无线接入点时 把dns域名设置为My "\NET) |
我们现在支持模块化的网络脚本,这意味着我们可以很方便地增添新的网络接口和配置模块,同时和原来已存在的模块或是接口保持良好的兼容性。
只要模块需要的软件包已安装,它就会被默认载入。如果你指定一个模块而它需要的软件包未被安装,则你就会收到一个错误信息通知你需要安装哪一个软件包。一般来说,只有当你安装了提供相同服务的两个及以上的软件包时,你才需要使用模块设定来选择你想使用其中的哪一个。
注意: 除非有特别说明,这里所讨论的全部设定都保存在/etc/conf.d/net中。 |
代码 1.1: 模块选择 |
# 选择iproute2而不用ifconfig modules=( "iproute2" ) # 你也可以为一个网络接口指定其他的模块 # 这个例子中我们希望使用pump来代替dhcpcd modules_eth0=( "pump" ) # 你也可以指定不使用哪一个模块——例如你一方面想使用supplicant或是 # linux-wlan-ng来控制无线网络配置,一方面又想配置每一个ESSID相关联的网络设定。 modules=( "!iwconfig" ) |
目前我们提供了两个网络接口处理程序:ifconfig和iproute2。你可以使用i这两个程序中的一个进行任意种类的网络配置。
ifconfig是目前Gentoo默认使用的网络接口处理程序,而且它也包含在系统的profile之中。iproute2是另一个灵活且强大的软件包,但是默认的系统配置中并不包含它。
代码 2.1: 安装iproute2 |
# emerge sys-apps/iproute2 # 在iproute2和ifconfig都已安装的情况下,选用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" )
|
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变量来支持下面这些命令,默认不使用它们中的任何一个:
代码 3.1: 在/etc/conf.d/net中的DHCP配置范例 |
# 只在你安装了一个以上的DHCP模块后才需要 modules=( "dhcpcd" ) config_eth0=( "dhcp" ) dhcpcd_eth0="-t 10" # 10秒后超时 dhcp_eth0="release nodns nontp nonis" # 只获取IP地址 |
注意: 由于dhcpcd和pump默认会把主机名发送给DHCP服务器,所以你就可以不用去指定它了。 |
首先我们安装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设定可能需要的设置的详尽解释。 |
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配置 |
# 首先尝试DHCP——如果DHCP失败则使用APIPA config_eth0=( "dhcp" ) fallback_eth0=( "apipa" ) # 只使用APIPA config_eth0=( "apipa" ) |
为了使用连接绑定,请emerge net-misc/ifenslave。
绑定可以用来增加网络带宽。如果你有两块网卡连接到同一个网络,你可以把它们绑定在一起这样你的应用程序只看到一个网卡,但实际上却是在同时使用两个物理网卡传送数据。
代码 6.1: 在/etc/conf.d/net中配置绑定 |
# 把网络接口绑定在一起 slaves_bond0="eth0 eth1 eth2" # 你可以不为绑定而得的网络接口配置IP地址 config_bond0=( "null" ) # 依赖eth0、eth1和eth2, 因为它们需要额外的配置 depend_bond0() { need net.eth0 net.eth1 net.eth2 } |
为了获得对桥接支持,请emerge net-misc/bridge-utils。
桥接是用来把两个网络连接在一起。举例来说,你有一台通过ADSL modem接入internet的服务器,它同时通过无线网卡为其他计算机提供internet接入服务。你就可以创建桥接把这两个网络接口连接在一起。
代码 7.1: /etc/conf.d/net中桥接的配置 |
# 配置桥接——可以使用"man brctl"来获得更多信息 brctl_br0=( "setfd 0" "sethello 0" "stp off" ) # 增加端口到网桥br0中 bridge_br0="eth0 eth1" # 你需要把端口配置成null,这样dhcp就不会启动了 config_eth0=( "null" ) config_eth1=( "null" ) # 最后为网桥配置一个IP地址——你也可以使用DHCP config_br0=( "192.168.0.1/24" ) # 依赖eth0和eth1,因为它们需要额外的配置 depend_br0() { need net.eth0 net.eth1 } |
重要: 在使用一些桥接的设定时,你可能需要参考文档变量名称 |
如果你使用的是sys-apps/baselayout-1.11.14或者更新版本的话,你无需安装任何软件就可以更改网络接口对应的MAC地址或者为某个网络接口指定一个MAC地址。不过,如果你需要为网络接口指定一个随机的MAC地址或者你的baselayout的版本比上述版本要旧的话,你需要安装好net-analyzer/macchanger后才能使用这些功能。
代码 8.1: MAC地址变更示例 |
# 设置网络接口的MAC地址 mac_eth0="00:11:22:33:44:55" # 只随机选择MAC地址的最后3个字节 mac_eth0="random-ending" # 在同种物理连接类型(比如: 光纤、铜缆、无线)中随机选择,范围至所有制造商 mac_eth0="random-samekind" # 在任意物理连接类型(比如: 光纤、铜缆、无线)中随机选择,范围至所有制造商 mac_eth0="random-anykind" # 完全随机——警告: 一些通过这个方式获得的MAC地址有可能无法正常工作 mac_eth0="random-full" |
你不需要安装任何软件就可以使用隧道,因为网络接口处理程序会帮你做好这些事。
代码 9.1: 在/etc/conf.d/net中配置隧道 |
# GRE隧道 iptunnel_vpn0="mode gre remote 207.170.82.1 key 0xffffffff ttl 255" # IPIP隧道 iptunnel_vpn0="mode ipip remote 207.170.82.2 ttl 255" # 配置网络接口 config_vpn0=( "192.168.0.2 peer 192.168.1.1" ) |
为了获得对VLAN的支持,请emerge net-misc/vconfig.
虚拟局域网(Virtual LAN)是一组有如运作在同个网段的一组网络设备的集合——尽管实际上可能不是。VLAN成员只能看到同一VLAN的成员,哪怕和其他VLAN成员处于同一物理网段中。
代码 10.1: 在/etc/conf.d/net中配置VLAN |
# 像这样为网络接口指定VLAN号 # 请确认每个VLAN号前面没有以0填充 vlans_eth0="1 2" # 你也可以配置VLAN # 查看vconfig的手册页获取更多的信息 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的设定时,你可能需要查看文档变量名称。 |
目前您可以使用我们提供的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了。 |
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 |
# 使用wpa_supplicant代替wireless-tools modules=( "wpa_supplicant" ) # 因为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 # 确保只有root用户能读取WPA的配置 ctrl_interface_group=0 # 使用wpa_supplicant来扫描和选择AP ap_scan=1 # 简单的情形:WPA-PSk密码验证方式,PSK是ASCII密码短语,所有合法的加密方式都允许连接 network={ ssid="simple" psk="very secret passphrase" # 优先级越高,就能越早匹配到。 priority=5 } # 与前面的设置相同,但要求对特定的SSID进行扫描(针对那些拒绝广播SSID的AP) network={ ssid="second ssid" scan_ssid=1 psk="very secret passphrase" priority=2 } # 仅使用WPA-PSK方式。允许使用任何合法的加密方式的组合 network={ ssid="example" proto=WPA key_mgmt=WPA-PSK pairwise=CCMP TKIP group=CCMP TKIP WEP104 WEP40 psk=06b4be19da289f475aa46a33cb793029d4ab3db7a23ee92382eb0106c72ac7bb priority=2 } # 明文连接方式(不使用WPA和IEEE802.1X) network={ ssid="plaintext-test" key_mgmt=NONE } # 共享WEP密钥连接方式(不使用WPA和IEEE802.1X) network={ ssid="static-wep-test" key_mgmt=NONE # 引号包含的密钥是ASCII密钥 wep_key0="abcde" # 没有引号包含的密钥是十六进制密钥 wep_key1=0102030405 wep_key2="1234567890123" wep_tx_keyidx=0 priority=5 } # 共享WEP密钥连接方式(无WPA和IEEE802.1X),使用共享密钥IEEE802.11验证方式 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 } # 在IBSS/ad-hoc网络中使用WPA-None/TKIP network={ ssid="test adhoc" mode=1 proto=WPA key_mgmt=WPA-NONE pairwise=NONE group=TKIP psk="secret passphrase" } |
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的例子 |
# 使用iwconfig而不用wpa_supplicant modules=( "iwconfig" ) # 为名为ESSID1和ESSID2的AP配置WEP密钥 # 您最多可以配置4个WEP密钥,但任何时候只有其中1个起作用。 # 所以我们提供一个默认的下标[1]来设置密钥[1],之后紧接着把活动密钥设置为[1]。 # 我们这么做以备你让其他ESSID使用[1]以外的WEP密钥。 # # key加上前缀s:意味着它是一个ASCII密钥,否则它就是一个16进制密钥。 # # enc open 指定开放安全性(最安全) # enc restricted 指定限制安全性(较不安全) key_ESSID1="[1] s:yourkeyhere key [1] enc open" key_ESSID2="[1] aaaa-bbbb-cccc-dd key [1] enc restricted" # 以下仅在我们扫描可用的AP时起作用 # 有时有多个AP可见,所以我们需要规定一个首选的连接次序。 preferred_aps=( "ESSID1" "ESSID2" ) |
您可以添加一些额外的选项来细致的调整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的例子 |
# 有时您根本不想连接到某些AP blacklist_aps=( "ESSID3" "ESSID4" ) #如果您有多个无线网卡,您可以决定是否允许每个卡都能连接到同一个无线AP # 可以取的值是"yes"或者"no" # 默认设置为"yes" unique_ap="yes" |
当您在管理模式中无法连接到任何AP时,您也可以将自己的设备设置成Ad-Hoc节点。
代码 3.4: 失败后转用ad-hoc模式 |
adhoc_essid_eth0="This Adhoc Node" |
那么,要如何连接到Ad-Hoc网络,或者干脆运行于Master模式使自身成为一个无线接入点呢?这里有这样一个设置!您可能需要参照本章前面的内容来指定WEP密钥。
代码 3.5: ad-hoc/master配置的例子 |
# 设定模式为managed(默认)、ad-hoc或者master。并不是所有的设备都支持所有的模式。 mode_eth0="ad-hoc" # 设定接口的ESSID # 在managed模式中,这将强制此接口只尝试连接特定的ESSID。 essid_eth0="This Adhoc Node" # 指定使用的频道,否则将默认使用频道3。 channel_eth0="9" |
重要: 以下是从NetBSD 文档的BSD wavelan文档中逐字逐句复制过来的内容。目前共计有14个可用的频道;1-11频道在北美是合法的,而在欧洲大部分地区则是频道1-13,在法国是频道10-13,在日本只允许使用频道14。如果有疑问,请参考随您所购买的无线网卡或AP附带的说明书。确保调整您的无线网卡与AP(或工作于ad-hoc模式的另一块无线网卡)使用同一个频道。默认情况下,在北美和欧洲大部分地区销售的无线网卡使用频道3;在法国使用频道11,在日本使用频道14。 |
一些环境或驱动的问题可能会使无线网络不能正常工作,下表多给出一些变量,可能有助于你解决问题。
参数 | 默认值 | 描述 |
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。 |
有时,您连接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服务器和其他的一些东西 # 注意:DHCP将覆盖这些设定,除非我们要求它不要覆盖 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" # 根据无线AP的MAC地址来覆盖相关设定 # 这在不同地点有相同ESSID的情况下非常有用 config_001122334455=( "dhcp" ) dhcpcd_001122334455="-t 10" dns_servers_001122334455=( "192.168.0.1" "192.168.0.2" ) |
你可以定义4个函数,它们将会在start/stop操作前后被调用。这些函数将会以接口名称作为参数被调用,以便于一个函数可以控制多个适配器。
preup()和predown()函数的返回值必须为0(成功),这意味着可以使一个网络接口进入配置状态或退出配置状态。如果preup()返回一个非0值,则网络接口配置过程将被中止。如果predown()返回一个非0值,则停止该网络接口运行的操作将被终止。
postup()和postdown()函数的返回值会被忽略,因为就算它们返回失败,系统也没有什么可以做的。
${IFACE}表示要打开/关闭的接口。${IFVAR}是${IFACE}转化而来的bash允许的变量名。
代码 1.1: pre/post up/down函数范例 |
preup() { # 在打开接口之前先测试它的网络物理连接是否已连接上。这只在某些网络 # 适配器上有效,而且需要安装ethtool包。 if ethtool ${IFACE} | grep -q 'Link detected: no'; then ewarn "No link on ${IFACE}, aborting configuration" return 1 fi # 记得返回0以表示操作成功 return 0 } predown() { # 脚本默认内容是测试根文件系统是否是NFS提供的。在此情况下系统是不会允 # 许你关闭接口的。注意,如果你定义了一个predown()函数,你就覆盖了这个逻辑。 # 如果你仍然需要它的话,请往下看…… if is_net_fs /; then eerror "root filesystem is network mounted -- can't stop ${IFACE}" return 1 fi # 记得返回0以表示操作成功 return 0 } postup() { # 这个函数可以被用来实现一些功能,比如注册一个动态DNS服务。 # 而另一个可能是在网络接口一启动时就开始传送/接收邮件。 return 0 } postdown() { # 这个函数出现在这主要是为了完整性……我还没有想到任何可以用它来做的好玩的事情 ;-) return 0 } |
注意: 此功能不适用于WPA Supplicant──但是${ESSID}和${ESSIDVAR}变量在postup()函数中是可用的。 |
你可以定义2个函数,它们将会在执行相关的操作前后被调用。这些函数将会以接口名称作为参数被调用,以便于一个函数可以控制多个适配器。
preassociate()函数的返回值应该为0(成功),这意味着一个网络接口的配置或取消配置过程可以继续。如果preassociate()返回一个非0值,则网络接口的配置过程将被中止。
postassociate()函数的返回值是被忽略的,因为就算它们返回失败,系统也没有什么可以做的。
${ESSID}被设置为你所连接到的AP的ESSID。${ESSIDVAR}是${ESSID}转化而来的bash允许的变量名。
代码 2.1: pre/post association functions |
preassociate() { # 下面添加了两个配置变量leap_user_ESSID和leap_pass_ESSID。 # 当你已经连接的ESSID的这两个变量都被配置时,我们就执行CISCO LEAP脚本。 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()函数中不可用。 |
如果你经常移动你的电脑,你可能会遇到没有网线和没有插入网线或者没有无线网络可用的情况。你也许希望在插入网线或无线网络可用时网络能够自动连上。
在这里你可以找到帮助你实现这个功能的一些工具。
注意: 本章只介绍ifplugd,但还有一些工具如netplug可供选择。netplug是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设置范例 |
(把eth0替换成要监控的网卡) ifplugd_eth0="..." (监控一个无限网卡) ifplugd_eth0="--api-mode=wlan" |
除了管理多个网络连接之外,你可能需要增加一个工具来使得管理多个DNS服务器和配置更加容易。当你通过DHCP来获取IP地址时,这将非常有用。只需要emerge openresolv.
代码 2.3: 安装openresolv |
# emerge openresolv
|
查看man resolvconf来学习他更多的特性。
本文档的内容遵循知识共享-署名-相同方式共享许可协议