LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 14123|回复: 56

如何在保持系统精简干净的情况下升级,欢迎拍砖

[复制链接]
发表于 2004-6-11 06:29:43 | 显示全部楼层 |阅读模式
hehe,别误会,还是用gentoo,不过过去我都是用emerge -UDp world和emerge -UDv world更新系统,这两天在这个贴的煽动下改弦易辙了
http://forums.gentoo.org/viewtop ... =asc&highlight=
具体来说,这个升级方法就是
emerge sync
emerge -uDpv world
emerge -uDv world
emerge -pv depclean
emerge -v depclean
revdep-rebuild -pv
revdep-rebuild -v
dispatch-conf

我觉得如果如果大家既想不断升级自己的系统,又希望自己的系统干净稳定,这个贴可以连上去看一看

我开始看到的时候,吓了一跳,居然敢用depclean,不过用过一次以后改变了原来的很多看法。
首先是如果可能,尽量要避免emerge -UDp world,这是因为在gentoo的发布里,有时候会有已经发布的包,因为有问题而被撤掉的情况,如果用emerge -UDv world一路往前冲,迟早有一天会严重危害系统的。hehe,我后面的内容都是在承认了这个基础上进行的讨论。

过去之所以会用emerge -UDv world,往往是因为有很多包,关键字是~x86的,如果我不想把系统改成~x86的不稳定版,而我又希望升级,如果用emerge -uDv world,就会发现那些用~x86装的包会被downgrade成稳定版本的,这样往往不是我们所希望的。
能够既不用updateonly,又可以装这些包的方法,就是利用/etc/portage/package.keywords文件,这种方案要比ACCEPT_KEYWORDS="~x86"和直接emerge 那个ebuild文件要好。最主要的优点是通过package.keywords(实际上还有一堆,package.mask package.unmask等等,用man portage可以看到介绍),你可以保留一份记录,就是你的机器上有哪些软件包是装的不稳定版本。这样emerge -uDv world,就可以保持这些包。而另外一些你所不知道的,有可能需要downgrade的包,就会照常被降级不象用-U参数的时候,它们会被保持不变。

一般装~x86的包和被mask的包,还有一个常用的方法是直接emerge 在portage树里的ebuild文件,这种方法比起ACCEPT_KEYWORDS方法来说,在安全上是一个更不好的方案。首先就是和ACCEPT_KEYWORDS的方法一样,它没有记录下来哪些包是不稳定版本,所以会导致不能用emerge -uDv world升级。我发现还有一个很糟糕的现象是,直接用ebuild文件进行的emerge,不会把软件包记录到world里面去,也就是说,你甚至在几个月以后根本就不记得你装过这个软件。其实这个道理很象是开支票,我记得刚出来的时候,开支票不知道留记录,结果后来发现帐面上一团乱麻,根本就不知道那些支票是干什么的。后来学乖了,不管是开支票还是兑现支票,都留个底,这样做好处是非常多的。

也就是说,如需要装的软件里关键字是“~x86”,那么比较恰当的方法是在/etc/portage/package.keywords文件里加上一个条目,下面是几个例子
=sys-kernel/linux-headers-2.6.5        -*
dev-tex/latex-beamer        ~x86
sys-libs/glibc                ~x86
dev-tex/xcolor                ~x86
dev-tex/pgf                ~x86
=app-office/openoffice-ximian-1.1.57        ~x86
用等号的时候是你只想对某个版本的包用~x86关键字的时候。
对于有的被mask的包,处理的方法也类似,是在
/etc/portage/package.unmask里面加上相应的条目

另外一个看法上的改变就是emerge depclean的使用,过去我是把emerge depclean看成洪水猛兽的,因为有太多血的教训了。可是现在发现,emerge depclean有它的好处,它的使用也不是那么可怕。一个重要的一点,就是安装包的时候,一定要用我上面说的方法。
至于为什么,其实我在上面说的方法,都是通过/etc/portage/package.xxx文件的配置,最终都保证你的包是直接用emerge -v abc(abc是包的名字)安装的,这样的安装,会在world文件里留下安装的记录。emerge depclean就是通过检查world和system,world里不依赖的包去掉来实现的,通过直接emerge -v abc安装的包,它所依赖的包都不会被删除。也就是说这样能够更有效的保证删除的是不需要的包。我帮人装gentoo的时候,还发现,用/etc/portage/package.xxx文件配置不稳定包的安装还有一个非常大的好处,就是它能保留住你当初安装的时候的一些经验。比如有的包必须用某个USE开关才能安装,你通过修改/etc/portage/package.use文件把它安装上了。到新的机器上,只要把/etc/portage/目录下的文件都拷贝过来,所有的包就都能正常安装。要不然你又遇到同样的问题的时候,很多时候会忘了你当初是怎么解决的。我的/etc/portage/package.use文件是这样的
=x11-libs/gtk+-1*        -nls
sys-apps/coreutils        -acl
其中gtk如果加上nls标志总是不能安装,过去还有过mplayer如果用gtk2参数安装,对话框就会不认中文的情况,现在不需要了,但是也可以这样解决。
扯远了,回到emerge depclean上面来。用emerge depclean之前,一定要检查一下emerge -p depclean的输出结果,一般对于以前经常用emerge ...ebuild来安装软件的,第一次执行emerge -p depclean会看到很多你认为有用的软件,把这些软件加到/var/cache/edb/world文件里,然后再emerge -p depclean,就会看到这些软件以及和它们有依赖关系的软件都会从删除的list里去掉。
最后是执行emerge depclean之前的严重提醒!!!首先是acl版本的coreutils会依赖于两个和acl有关的库文件,而这两个库文件,由于emerge depclean的bug,会被删除,从而导致所有的ls, rm等等命令都不能用了。所以在emerge depclean之前,一定要用-acl的参数把coreutils重新编译一遍,当然方法就是在/etc/portage/package.use里加上-acl这一条。
另外一个提醒!!如果在list里看到了devfsd,那么出于安全,要把devfsd加到world文件里去。从而保证emerge depclean不会删除devfsd,不然会死得很难看的。
如果以前都是用的emerge -UDv world和ACCEPT_KEYWORDS="~x86" emerge ..方法安装的软件,那么第一次用emerge depclean的时候要小心,过了这个第一次,以后坚持用/etc/portage目录配置软件包的安装,emerge depclean就会省事得多。

好了,现在就可以用revdep-rebuild来检查和修正动态链接库的依赖关系,这个命令很安全,可以放心使用。

前面的几个命令里dispatch-conf好像是用来备份config的,最好是先给系统装一个rcs,然后在/etc目录下建立一个config-archive目录,然后再执行dispatch-conf

在gentoo上,并不是所有的包在安装了新版本后会删除老版本的,这一般是出于安全的考虑,可是这也导致了gentoo的使用时间越长,gentoo的体积越大。我用glsa-check -f all的时候,发现系统居然跑去更新kde-3.1,后来发现我升级到kde 3.2的时候,3.1根本就没删除。不过目前我没找到很有效的方法来解决这种情况,我就是用qpkg -d -nc -v > dlist做个列表,看里面有不需要的,就试着unmerge,删除以后用emerge -uDv world再把系统更新一遍,主要是防止有的老的包的确是需要的,然后用revdep-rebuild。

不过提醒大家的是,在执行emerge depclean和emerge unmerge的时候,一定一定要知道自己在做什么,至少心里有谱,知道可能会有什么影响。
 楼主| 发表于 2004-6-11 06:34:53 | 显示全部楼层
前两天比较ft,发现整个kde3.1都还呆在硬盘上呢,所以才下决心要注意系统的精简了。
发表于 2004-6-11 06:55:31 | 显示全部楼层
emerge ebuild居然不会加到world里面?匪夷所思呀
a feature or a bug?

这篇文章真不错,谢谢
发表于 2004-6-11 06:57:21 | 显示全部楼层
不错, 我也有精简我的系统的冲动了, 但可能没时间了。。:p
先加到心得区, 以后再转到技术置顶。
发表于 2004-6-11 07:20:07 | 显示全部楼层
我的dlist如下,哪个可以删除呀?
dev-libs/glib-1.2.10-r5
dev-libs/glib-2.4.1
sys-libs/db-4.1.25_p1-r3
sys-libs/db-1.85-r1
x11-libs/gtk+-1.2.10-r11
x11-libs/gtk+-2.4.1
发表于 2004-6-11 07:22:16 | 显示全部楼层
最初由 penny 发表
emerge ebuild居然不会加到world里面?匪夷所思呀
a feature or a bug?

呵呵,就给我遇上了!
发表于 2004-6-11 07:37:24 | 显示全部楼层
我可是经常emerge ebuild呀,还有什么方法补救吗?
有什么方法能将其加入到world里?
发表于 2004-6-11 07:42:16 | 显示全部楼层
最初由 orphen 发表
我可是经常emerge ebuild呀,还有什么方法补救吗?
有什么方法能将其加入到world里?

emerge -pv depclean
看看有哪些你确定是不应删的包,然后加入到world去。
发表于 2004-6-11 07:53:44 | 显示全部楼层
不过更彻底的作法还是把它们加到package.keywords里重新emerge一次。始终通过emerge ebuild装的包都是当时mask了的,如果现在仍然mask的话,remerge正是你改变坏习惯的好机会!;)
发表于 2004-6-11 07:57:26 | 显示全部楼层
加个相关的链结以方便查找:
How bleeding edge is your system update procedure?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表