LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: easior lars

江湖救急啊!

[复制链接]
 楼主| 发表于 2012-2-7 13:48:31 | 显示全部楼层
Post by RichardGv;2159736
  • 您太草率了,不稳定分枝中有很多这种情况。核心包的升级/降级最好要等ebuild出现两三天之后再做。
  • 第一步的解救方法,请按timemars指出的做软链接。
  • 第二步我的建议是立刻升Portage-2.2(目前是2.2.0_alpha85,需要在/etc/portage/package.keywords中做个手脚),不要revdep-rebuild。portage-2.2有preserve-libs功能,默认开启,可以保留仍然被使用的旧版本库文件,而在一段时间内不做revdep-rebuild。尽管名义上是alpha版但相当稳定。

    接下来用quickpkg备份libpcre-8.21,以防万一:
    1. quickpkg libpcre
    复制代码


    接着无视依赖强制升级libpcre: (-O 就是--nodeps,无视依赖安装任何包)
    1. emerge -O1 '=dev-libs/libpcre-8.30-r2'
    复制代码


    然后就高枕无忧了... 下一次emerge -uD @world时,portage会将libpcre再次降级到8.21,照做就好。Portage-2.2的preserve-libs应该会自动保留'=dev-libs/libpcre-8.30-r2'提供的libpcre.so.1.0.0,因此不会导致日后编译出错。revdep-rebuild或者emerge @preserved-rebuild都不需要,因为php等少数几个依赖=dev-libs/libpcre-8.21的包很快就会支持=dev-libs/libpcre-8.30-r2,这样现在省去了很多时间,日后再次升级到8.30时重新编译100多个包的麻烦也消除了。
  • 再次建议在/etc/make.conf FEATURES变量中打开buildsyspkg/buildpkg,具体原因请参见我的上一个回复。(另外为什么我发现您倾向于无视我的回复...)


您老我怎敢忽略啊!!
主要是我的机器老旧,目前的剩余空间只剩4G左右,
保留二进制文件的话不知道空间还能剩多少?

不过可以先尝试升级portage至alpha状态。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-2-7 16:01:07 | 显示全部楼层
Post by zhou3345;2159730
你这是mask,不是patch。
https://bugs.gentoo.org/show_bug.cgi?id=402357

没办法,自己改了个ebuild:
https://github.com/transtone/zm-overlay/tree/master/dev-lang/php


问个问题,本地overlay如何安装、维护?
感觉layman管不了;
另外,普通用户不太可能经常去/usr/local/portage之类的目录修改ebuild。
回复 支持 反对

使用道具 举报

发表于 2012-2-7 19:59:48 | 显示全部楼层
Post by easior lars;2159738
您老我怎敢忽略啊!!
主要是我的机器老旧,目前的剩余空间只剩4G左右,
保留二进制文件的话不知道空间还能剩多少?

不过可以先尝试升级portage至alpha状态。

我... 有那么老吗?   咳咳,开个玩笑。

Portage升到2.2对老电脑尤其有好处。每次看到要revdep-rebuild重新编译几十个包就头痛啊。虽说有了Portage-2.2的preserve-libs仍然要重新编译这些包,但不像Portage-2.1一样必须立刻编译完,否则很多软件就不能用了,而可以推迟到没有工作的时候... 另外revdep-rebuild的搜索时间也省去了,直接emerge @preserved-rebuild就好。

我4岁半的老爷机Gentoo分区目前剩下3.2GB可用,其他几个分区加起来也只有2GB左右... 4GB的剩余空间其实相当多的,现在我emerge个firefox还要几个分区东挪西凑出4GB的空间呢...

buildpkg/buildsyspkg耗费的空间很小,保留4天内所有更新的包最多需要100MB。除非您在用一个经典款的1GB昆腾硬盘,buildsyspkg耗费的空间可以忽略不计。(当然libreoffice之流... 其实emerge有一个参数叫--buildpkg-exclude可以加到make.conf的EMERGE_DEFAULT_OPTS中用来避免为某些包创建二进制包。)

开了buildpkg/buildsyspkg的话建议定期清除旧的二进制包。例如每天删除4天前(和更老的)的二进制包要用:
  1. eclean-pkg -dn -t4d
复制代码
(呃,您不会没装gentoolkit吧...)
顺便还可以清除旧的源码包,通常源码包比二进制包占的空间多...
  1. eclean-dist -d -t4d
复制代码
假若您记性不好的话,有两种选择:1. 吃忘不了、脑白金等等... 2. 把这两条命令加入cron job,可以在/etc/cron.daily中新建一个shell script(注意加可执行权限),或者参考Gentoo Cron Guide,加入crontab之中: http://www.gentoo.org/doc/en/cron-guide.xml

关于建立local overlay,不能用layman的,请参考:
http://en.gentoo-wiki.com/wiki/O ... verlay_with_Portage
(我不是第一次贴这个链接了吧... 看不懂的话请说出来,我们还可以客串一下翻译...)

local overlay还是相当有用的(虽然Gentoo提供了强悍的/etc/portage/env和/etc/portage/patches,足以代替local overlay中一大半的ebuild)。我自己的local overlay中ebuild为数不少(当然不能与zhou3345的zm-overlay相提并论...)。有些是对Portage tree中的原ebuild做了比较复杂的修改,靠/etc/portage/env不方便实现的,有些是9999的ebuild,有些是Portage tree和其他overlay中都没有的新版本的ebuild。

另外,用Gentoo的人中真的有“普通用户”吗? 一年之后您大概也会变成“老油条”了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-2-8 08:54:48 | 显示全部楼层
Post by RichardGv;2159758
我... 有那么老吗?   咳咳,开个玩笑。

关于建立local overlay,不能用layman的,请参考:
http://en.gentoo-wiki.com/wiki/O ... verlay_with_Portage
(我不是第一次贴这个链接了吧... 看不懂的话请说出来,我们还可以客串一下翻译...)

您老(哈哈)的回复让我等半瓶老酒感觉滴水不漏,不太好回复啊!
实在是您老的水平已超出我等很多啊!

例如cron job,记得刚装系统的时候,装了syslog-ng、守护进程的vixie-cron,当初不知道它们有毛用。后来有一次系统中出现了deadletter(这件事情,到目前我还没有太明白),才有版友提示翻看handbook中syslog-ng、vixie-cron的部分,才知道它们的意义。当然,这些东西没有用过,就不太知道怎么用!你提到的这个cron job倒是个很好的例证!

关于local_overlay,看到zhou的zm_overlay,感觉超过了我的想象。不过看到http://en.gentoo-wiki.com/wiki/O ... verlay_with_Portage 的内容,才发现事情其实蛮简单的。最早以前,为了给某个包打补丁,LIYANRUI版友就提过这个,因此我早就创建过local_overlay了。包括最近的firefox-9.0的ebuild、aliwangwang的ebuild、你写的auctex-9999的ebuild,早就进了我的loca_overlay。遗憾的是,这些都不是我写的。

主要是本人的理论水平太低,与Gentoo相关的知识,甚至是Linux的,都是源自于实践(其实是不务正业)!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-2-10 11:40:39 | 显示全部楼层
apache-2的ebuild好像还没有修复!

!!! existing preserved libs:
>>> package: dev-libs/libpcre-8.30-r2
*  - /lib/libpcre.so.0
*  - /lib/libpcre.so.0.0.1
*      used by /usr/sbin/apache2 (www-servers/apache-2.2.21-r1)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-2-10 11:58:11 | 显示全部楼层
Post by RichardGv;2159758

开了buildpkg/buildsyspkg的话建议定期清除旧的二进制包。例如每天删除4天前(和更老的)的二进制包要用:
  1. eclean-pkg -d -t4d
复制代码

(呃,您不会没装eclean吧...)
顺便还可以清除旧的源码包,通常源码包比二进制包占的空间多...
  1. eclean-dist -d -t4d
复制代码

假若您记性不好的话,有两种选择:1. 吃忘不了、脑白金等等... 2. 把这两条命令加入cron job,可以在/etc/cron.daily中新建一个shell script(注意加可执行权限),或者参考Gentoo Cron Guide,加入crontab之中: http://www.gentoo.org/doc/en/cron-guide.xml


大概明白crontab的工作原理:自建crons.cron,之后用crontab crons.cron加入系统。

于是在/etc/cron.daily目录中新建可执行脚本elcean,添加了你给出的两条命令。这样算不算完成了cron.daily的添加,需要在/etc/crontab中修改吗?
回复 支持 反对

使用道具 举报

发表于 2012-2-10 14:14:19 | 显示全部楼层
注意我前面的"eclean-pkg -d -t4d"出了个比较致命的错误:我忘记保存二进制包的目的了。应该保存旧版本的包,而非只保存最新版本,与distfiles的清除策略截然相反。遗憾的是eclean无法实现我需要的功能--只保存目前安装的包和上一个版本的二进制包,比如,在升级到libpcre-8.30后,保存目前安装的libpcre-8.30的二进制包和上一个版本libpcre-8.21的二进制包。我看看能不能打个patch吧。

现在我的建议是在eclean-pkg -d时加上-n (--package-names),保存目前安装的包的所有仍然有ebuild的版本的二进制包,比如如果您安装了www-client/firefox-10.0,这样执行的结果是,所有目前存在ebuild的版本,3.6.20、3.6.22、8.0、9.0、10.0的二进制包均会被保留(如果您曾经生成过它们的话),而7.0等已没有ebuild的版本的二进制包会被删除。问题是虽说二进制包相对较小,但如果大量积累总占用空间仍然可观。如果开的是buildsyspkg问题不大,开了buildpkg就要小心了。
  1. eclean-pkg -dn -t4d
  2. eclean-dist -d -t4d
复制代码
Post by easior lars;2159885
apache-2的ebuild好像还没有修复!

!!! existing preserved libs:
>>> package: dev-libs/libpcre-8.30-r2
*  - /lib/libpcre.so.0
*  - /lib/libpcre.so.0.0.1
*      used by /usr/sbin/apache2 (www-servers/apache-2.2.21-r1)

等完全确定libpcre-8.30稳定之后,重新编译Apache应该就好了。
Post by easior lars;2159887
大概明白crontab的工作原理:自建crons.cron,之后用crontab crons.cron加入系统。

于是在/etc/cron.daily目录中新建可执行脚本elcean,添加了你给出的两条命令。这样算不算完成了cron.daily的添加,需要在/etc/crontab中修改吗?

一般只需加入/etc/cron.daily即可。其他发行版可能要修改crontab,Gentoo自己有个run-crons脚本,提供/etc/cron.{hourly,daily,weekly,monthly},允许用户方便地加入cron jobs。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-2-13 08:37:55 | 显示全部楼层
又收到了dead.letter,根据http://www.gentoo.org/doc/en/cron-guide.xml的说法,可能是cron碰到了问题。请问系统到底怎么回事?

cron的情况如下:

  1. # ls /etc/cron*
  2. cron.allow  cron.deny  crontab

  3. cron.d:

  4. cron.daily:
  5. eclean  mlocate

  6. cron.hourly:

  7. cron.monthly:

  8. cron.weekly:
  9. pfl
复制代码

其中mlocate、pfl是软件包自带的:

  1. # qfile mlocate
  2. sys-apps/mlocate (/var/lib/mlocate)
  3. sys-apps/mlocate (/etc/cron.daily/mlocate)
  4. # qfile pfl
  5. app-portage/pfl (/usr/sbin/pfl)
  6. app-portage/pfl (/usr/lib/python2.7/site-packages/pfl)
  7. app-portage/pfl (/var/lib/pfl)
  8. app-portage/pfl (/etc/cron.weekly/pfl)
复制代码

而eclean是自建的:

  1. # cat eclean
  2. #!/bin/sh

  3. eclean-pkg -dn -t4d
  4. eclean-dist -d -t4d
复制代码

另外,根据http://www.gentoo.org/doc/en/cro ... 了常用任务:

  1. # crontab -l
  2. # DO NOT EDIT THIS FILE - edit the master and reinstall.
  3. # (crons.cron installed on Sat Feb 11 00:29:16 2012)
  4. # (Cron version V5.0 -- $Id: crontab.c,v 1.12 2004/01/23 18:56:42 vixie Exp $)
  5. #Mins  Hours  Days   Months  Day of the week  cron-job
  6. 22     2      *      *       1                /usr/bin/updatedb
  7. 5      8      *      *       *                /usr/bin/layman -S
  8. 30     8      *      *       *                /usr/bin/emerge --sync
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2012-2-13 10:48:25 | 显示全部楼层
Post by easior lars;2160003
又收到了dead.letter,根据http://www.gentoo.org/doc/en/cron-guide.xml的说法,可能是cron碰到了问题。请问系统到底怎么回事?


  • 其他cron的情况我不太清楚,从vixie-cron的源码看,它执行一个cron job时会将所有子进程的输出(更准确的说是“孙子辈”进程的输出,stdout和stderr都包括)作为邮件发送,无论cron job执行成功与否。因为您没有配置MTA,这些邮件不会被正常发送,而是跑到了/root/dead.letter中。因此只要您的某一个或几个cron job有输出,dead.letter就会有内容... 产生dead.letter并不意味着cron job执行出错了,尽管dead.letter的确是个不祥的名字。
  • 我相信您一定立刻想到了给crontab中的cron jobs加个shell pipe/redirection,把输出导引走,就像:
    1. /usr/bin/layman -S > /root/layman.log
    复制代码
    不幸的是这并不是完美的方案:某些cron daemon不会在执行cron job时使用$SHELL -c CRON_JOB(就是说,它们会直接创建子进程"/usr/bin/layman -S",而不是"sh -c /usr/bin/layman -S",这就意味着cron daemon不会认识">"/"|"这类shell提供的符号。(尽管vixie-cron的确会通过shell来执行cron job,但使用这样兼容性不佳的格式可能会在您转到其他cron daemon时产生难以理解的错误。)
    因此正确的方法是给新建一个shell script,把需要输出重定向或者管道的cron job写进去,再将该shell script加入cron job,或者写成" sh -c 'layman -S > /root/layman.log' “的格式。
  • 将emerge --sync和layman -S写入cron job恐非上策,因为存在浪费服务器资源的可能。对overlay的服务器问题尤为严重,因为overlay是没有mirror的。我的建议是在您确定有时间更新系统时手动emerge --sync。
  • eix提供了一个eix-sync命令,可以自动执行layman -S / emerge --sync / eix-update等。详细信息可以在man eix中找到。尊驾不妨一试。
  • 对单个文件,直接用gzip压缩即可( gzip dead.letter ),没有使用tar的必要。tar的主要作用是打包多个文件和保存文件属性。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-2-13 17:01:19 | 显示全部楼层
Post by RichardGv;2160007
  • 其他cron的情况我不太清楚,从vixie-cron的源码看,它执行一个cron job时会将所有子进程的输出(更准确的说是“孙子辈”进程的输出,stdout和stderr都包括)作为邮件发送,无论cron job执行成功与否。因为您没有配置MTA,这些邮件不会被正常发送,而是跑到了/root/dead.letter中。因此只要您的某一个或几个cron job有输出,dead.letter就会有内容... 产生dead.letter并不意味着cron job执行出错了,尽管dead.letter的确是个不祥的名字。
  • 我相信您一定立刻想到了给crontab中的cron jobs加个shell pipe/redirection,把输出导引走,就像:
    1. /usr/bin/layman -S > /root/layman.log
    复制代码

    不幸的是这并不是完美的方案:某些cron daemon不会在执行cron job时使用$SHELL -c CRON_JOB(就是说,它们会直接创建子进程"/usr/bin/layman -S",而不是"sh -c /usr/bin/layman -S",这就意味着cron daemon不会认识">"/"|"这类shell提供的符号。(尽管vixie-cron的确会通过shell来执行cron job,但使用这样兼容性不佳的格式可能会在您转到其他cron daemon时产生难以理解的错误。)
    因此正确的方法是给新建一个shell script,把需要输出重定向或者管道的cron job写进去,再将该shell script加入cron job,或者写成" sh -c 'layman -S > /root/layman.log' “的格式。


感谢您的指点!

想问一下有没有gentoo中配置MTA的文档?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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