Gentoo Logo

基础布局Baselayout和OpenRC迁移指南

内容:

1.  背景知识

什么是baselayout?

为了让所有系统能正常得工作,Baselayout提供了一个基础的文件集合,比如/etc/hosts。她也为Gentoo提供了基础的文件系统布局(如目录/etc/var/usr/home

什么是OpenRC?

OpenRC是一个基于依赖关系的rc系统,可以和系统所提供任何init程序配合运行,一般指的是/sbin/init。但是她是用来取代/sbin/init的。Gentoo Linux默认使用的init是由sys-apps/sysvinit提供,而Gentoo/FreeBSD则使用由sys-freebsd/freebsd-sbin提供的FreeBSD init。

那么干嘛要迁移?

最初的Gentoo的rc系统是为baselayout-1建立并且完全是由bash写出来的。这里有几个缺陷。比如在启动的时候需要访问某些系统调用,而这样就需要增加基于C的调用。这些调用都是静态连接的,从而会让rc系统随时间的增长而不断膨大。

而且,在Gentoo扩展到其他平台如Gentoo/FreeBSD和Gentoo嵌入式之后,就更不可能要求有一个基于bash的rc系统了。所以完全用C写的baselayout-2应运而生,她只需要一个兼容POSIX的shell。在开发baselayout-2的过程中,我们发现把rc系统和仅仅提供基础文件和文件系统布局的baselayout分成不同的包会更好。于是OpenRC诞生了。

OpenRC主要由Roy Marples开发,她支持Gentoo现在的所有变种(如Gentoo Linux,Gentoo/FreeBSD,Gentoo嵌入式和Gentoo Vserver)以及其他的平台如FreeBSD和NetBSD。

2.  迁移到OpenRC

迁移到OpenRC的过程是比较直接的;你的包管理器在常规升级的时候就已经包括了。重要的是在你安装新的>=sys-apps/baselayout-2sys-apps/openrc之后的步骤。一定要运行dispatch-conf以确保/etc目录里的文件都已经更新到了最新版本。不这么做的话系统会无法启动,那样的话你就需要使用Gentoo LiveCD并按照以下步骤并来修复你的系统。

更新完配置文件后,在重启前复查以下几点。

/etc/conf.d/rc

/etc/conf.d/rc文件将不再使用,所有里边的设置需要被迁移到/etc/rc.conf中相应的设置。请通读/etc/rc.conf/etc/conf.d/rc后再迁移设置。在完成修改后删除文件/etc/conf.d/rc。

内核模块

一般情况下,当你想在启动的时候自动加载某些模块的话,就把模块名连同参数一起加入到/etc/modules.autoload.d/kernel-2.6里边。baselayout-2不再用这个文件了。在baselayout-2里,不管内核的版本是多少,自动加载模块和模块参数都被放到了/etc/conf.d/modules文件里边。

例子:老式的配置文件

代码 2.1: /etc/modules.autoload.d/kernel-2.6

ivtv
cx88_dvb video_br=2

转换后应该是这样的:

代码 2.2: /etc/conf.d/modules

# 启动时自动加载模块列表
modules_2_6="ivtv cx88_dvb"
# 模块参数
module_cx88_dvb_args_2_6="video_br=2"

以上例子中,模块以及其参数只会在使用2.6.x系列内核情况下生效。新版本配置文件允 许在针对不同内核版本的情况下对模块和参数进行细致微调。

一个更深入的例子:

代码 2.3: 一个关于/etc/conf.d/modules的详细例子

# 不管内核是什么版本,都加载模块ochi1394和ieee1394
modules="ohci1394 ieee1394"
# 只有在2.6.X系列内核的时候加载tun和usbserial
modules_2_6="tun usbserial"
# 只有在2.6.23内核时,才加载cx88_dvb
modules_2_6_23="cx88_dvb"
# 内核版本2.6.23-gentoo-r5才加载ivtv
modules_2_6_23_gentoo_r5="ivtv"

# 内核版本为2.6.23-gentoo-r5的时候,传递参数video_br=2给内核模块cx88_dvb
module_cx88_dvb_args_2_6_23_gentoo_r5="video_br=2"
# 2.6.x系列内核的话,传递vendor和product参数给usbserial模块
module_usbserial_args_2_6="vendor=0x1410 product=0x2110"
# 不管内核是什么版本,传递debug参数给模块ieee1394
module_ieee1394_args="debug" 

注意: 请注意module_modules_之间的区别。

Boot运行级别

boot运行级别为每台机器完成了几个重要的启动步骤。比如,确保你的根文件系统以读写方式挂载,确保你的文件系统已经检查过错误,确保你的挂载点确实存在,还有确保/proc伪文件系统在启动过程中已经挂载。

在OpenRC里,默认情况下块储存设备的卷管理服务不再被自动启动。这些卷管理服务包括lvm、raid、swap、device-mapper(dm)、dm-crypt和evms等等。你必须确保这些服务对应的启动脚本确实在boot运行级别里,否则你的系统可能不能正常启动。

尽管OpenRC ebuild会尝试帮你完成迁移工作,你还是应该复查一下所有的卷管理服务看看她们是否被正确迁移:

代码 2.4: 显示boot运行级别的所有服务

# ls -l /etc/runlevels/boot/

如果在上面的结果里你没有看到root、procfs、mtab、swap和fsck,请运行下面的命令把她们加入boot运行级别:

代码 2.5: 把必需的服务加入boot运行级别

# rc-update add root boot
# rc-update add procfs boot
# rc-update add mtab boot
# rc-update add fsck boot
# rc-update add swap boot

如果你知道你使用了mdraid,lvm和swap,但是却没在上边结果中看到的话,那你要运行以 下命令把启动脚本增加到boot runlevel中。

代码 2.6: 把mdraid和lvm加入boot运行级别

# rc-update add mdraid boot
# rc-update add lvm boot

Udev

OpenRC不再默认启动udev,但是它必须要在sysinit运行级别中以便能够被启动。OpenRC ebuild应该检测udev之前是否被启用并把它加入sysinit运行级别。不过,为了保险,还是亲自检查一下udev

代码 2.7: 检查udev

# ls -l /etc/runlevels/sysinit
lrwxrwxrwx 1 root root 14 2009-01-29 08:00 /etc/runlevels/sysinit/udev -> \
/etc/init.d/udev

如果udev不在上面命令的结果里,那就把它加入正确的运行级别:

代码 2.8: 把udev加入到sysinit运行级别

# rc-update add udev sysinit

网络

因为baselayout和OpenRC被拆分成了两个不同的包,你的net.eth0启动脚本在升级过程中可能消失。请依照下面的步骤来替换这个脚本:

代码 2.9: 添加回缺失的net.eth0脚本

# cd /etc/init.d
# ln -s net.lo net.eth0

如果你还缺失了其他网络启动脚本,请使用上面的命令来把她们添加回来。只需要把eth0替换成你的网络界面的名字即可。

还有,/etc/conf.d/net里的配置不再使用bash风格的数组。请查看/usr/share/doc/openrc-<version>/net.example以获取配置指令。这个转化应该很简单,以一个静态IP的配置为例:

代码 2.10: 旧的/etc/conf.d/net风格

config_eth0=( "192.168.1.37 netmask 255.255.255.0 brd 192.168.1.255" )
routes_eth0=( "default via 192.168.1.100" )

代码 2.11: 新的/etc/conf.d/net风格

config_eth0="192.168.1.37 netmask 255.255.255.0 brd 192.168.1.255"
routes_eth0="default via 192.168.1.100"

时钟

设置时钟的文件不再叫/etc/conf.d/clock了,而是由系统原生的时钟调整工具的名字命名。这就是说Linux下这个文件叫/etc/conf.d/hwclock,而在FreeBSD中叫/etc/conf.d/adjkerntz。如果一个系统没有一个可用的实时时种(RTC)芯片,那么它应该用/etc/init.d/swclock,这个脚本将会根据系统关机时创建的一个文件的修改时间(mtime)来设置系统时间。/etc/init.d里的启动脚本的名字也相应的改变了,所以请确保适用于你的系统的脚本已经在适当的运行级别里了。

还有,TIMEZONE变量也不再在这个文件里设置了。应该把这个变量的值写入文件/etc/timezone。如果这个文件不存在,你需要创建这个文件,并在里面写入你的时区。请复查这两个文件并确定她们的正确性。

这个文件的正确的值是你的时区相对于此目录/usr/share/zoneinfo的路径。比如,对于居住在中国的人来说,下面的是一个正确的设定。

代码 2.12: /etc/timezone

Asia/Shanghai

XSESSION

XSESSION变量也不再在文件/etc/rc.conf中设置了。你可以为每个用户在他们的~/.bashrc(或类似文件)里设定XSESSION变量,或者全局的设定在/etc/env.d/里。

这里有全局设定的一个例子:

代码 2.13: 全局设定XSESSION

# echo 'XSESSION="Xfce4"' > /etc/env.d/90xsession

重要: /etc/env.d里创建文件后必须运行命令env-update然后登出再登录才能让修改生效。如果你把这个变量设定在~/.bashrc里,那么你重新source这个文件即可source ~/.bashrc.

EDITOR和PAGER

EDITOR变量也不在/etc/rc.conf里了。EDITOR和PAGER变量的默认值都在/etc/profile里设定。如果你想改变,请在你自己的~/.bashrc(或起同等作用的)文件中设置这两个变量,或者新建一个文件/etc/env.d/99editor并且在里边设置系统默认值。

重要: /etc/env.d里创建文件后必须运行命令env-update然后登出再登录才能让修改生效。如果是在~/.bashrc里设置变量的话,你可以用命令 source ~/.bashrc来使你的改动立即生效。

启动记录

在此之前,你可以用app-admin/showconsole来记录启动过程。但是现在OpenRC的记录是在内部处理的,所以也就不需要showconsole来作这个事情了。你可以放心的删除掉showconsole。如想继续记录启动信息,只需在/etc/rc.conf里设置一个变量就可以了。记录可以在/var/log/rc.log里找到。

代码 2.14: 在/etc/rc.conf中开启启动记录

rc_logger="YES"

完成

在你完成了配置文件和启动脚本的更新后,最后一件事就是重启。这一步是必须的,因为系统状态信息在升级中不会被保留下来,所以你需要重启来达到这个目的。



打印

更新于2010年 1月 2日

本翻译的原始版本已经不再被维护

总结: 这个指南会指导你如何从baselayout-1迁移到baselayout-2和OpenRC。

Doug Goldstein
作者

Joshua Saddler
作者

Roy Marples
贡献者

周骞
译者

张乐
编辑

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.