I am LAZY bones? AN ancient AND boring SITE

分类: 'gentoo' 的归档

gnome-panel 消失解决办法

2010年的最后一天,打开自己的blog看了一眼,最后一个月居然什么都没留下了,觉得这样实在不太好,于是趁最后时刻,写点什么。
想了一下有什么值得一写的,发现还真不多,因为近来实在是少有时间去折腾,就拿这个来充数吧,如果能帮到有同样现象的朋友,也算不错。
我的gentoo在某次升级以后,gnome-panel就突然消失不见了,我的环境是蛮正常蛮标准的gnome+compiz,我的compiz开了窗口阴影,在屏幕最上方,本来是panel的地方,阴影还是有的。ps看了一下进程,gnome-panel也在。杀掉重启,或者执行 gnome-panel –replace 都无效。看起来就是面板的高度变成了0像素。
查了任何可查的日志,也没有发现什么异常。于是google了一把,发现有人说把 .gconf 删掉就可以恢复了,于是先把整个xdm停掉,把 .gconf 改名,再启动gnome,发现面板果然正常了。当然副作用就是我的大部分设置都丢了,这是我不能接受的。
当然到了这一步,就比较好办了,虽然我的办法很土,但是有效:继续用类似二分法的办法缩小.gconf里面的影响范围,当然,由于gconfd每次都会随gnome启动,所以每做一次范围确认都得停掉gnome,再打开。呵呵,虽然麻烦,但是还是很快早到了元凶,那就是: ~/.gconf/desktop/gnome/interface/%gconf.xml 一个主管界面和字体设置的配置文件,于是,干脆把它删掉,重新在系统-首选项-外观 那里设置一下字体,我的gnome-panel就这么回来了。
可能我这个问题是因为我的ubuntu和gentoo共用一个 /home 引起的,但是奇怪的是ubuntu下面板一切正常,自是gentoo有问题。
好了,问题解决了,最后一句俗却真诚的话:新年快乐!

gentoo下的pppoe拨号

最近,无线路由坏了,所以只能先用自己的电脑拨adsl了。
其实这本也没什么,我的win7和ubuntu都只要稍微设置一下就OK了。
这里再稍微提一下ubuntu的pppoe设置:记得以前的版本(应该是6.xx的时候吧),NetworkManager是不直接支持pppoe的,还要自己手工设置,然后执行pon/poff来拨号,但是现在进步了,直接在NM里输一下用户名和密码就可以上了。
但是我的gentoo是用wicd来管理网络的,而wicd至今都还不支持pppoe,于是只能用原始的命令行来拨号了。
于是eix一搜,发现有个net-dialup/rp-pppoe,安上,看到有 pppoe-setup、pppoe-start、pppoe-stop。啥都不用说了,先pppoe-setup,再pppoe-start,本以为会很顺利,但是几次尝试都在最后一步出错了,而且提示的错误都没啥价值,不知道从何查起~
正当我无计可施,想妥协安个NetworkManager的时候,忽然灵感一现,发现了可能的错误原因,那就是──内核模块。原来,之前我的gentoo内核基本上也是按需配置的,以前我一直都有路由器拨号,所以没有在内核选项里打开ppp的支持,才导致了这一郁闷的结果,哈哈,既然发现了可能的原因,那就好办了,make menuconfig 里面选上 Device Drivers —>Network device support —>PPP (point-to-point protocol) support 下面的所有项,编译完再重启。再 pppoe-start ,果然看到了 Connected!

gentoo中使用dropbox

Dropbox是一个网络在线存储服务,默认免费可以有2G的存储空间,客户端支持WIN、Linux、MAC等,甚至连没有X的环境都支持了,这个比较难得。
而且对于公开的文件还支持外链,挺不错的。
但是这个我在08年9月份注册以后,就没怎么用过了,呵呵。
然后,最近想着怎么备份我的gentoo,就又想到了这个,于是又开始折腾。
首先,肯定要在gentoo里先能用上Dropbox,这个其实不难,虽然portage里还没有dropbox,但是网上可以很方便地找到ebuild,比如这个
加进自己的overlay(gentoo用户大多都有个自己的overlay吧?)以后,直接 emergr nautilus-dropbox 就装好了,完了以后,还需要把自己加入到 dropbox 这个组,登出再进来一次就可以打开dropbox了,输入账号密码就可以绑定机器了。默认同步会 ~/Dropbox 到网上,很不错。
接下来,就是把gentoo里需要备份的文件打包,然后放进这个目录下面,这个就很简单了,基本上就是一个tar命令放到cron里每天执行下就好了,我的如下:

#!/bin/sh
#gentoo备份脚本
 
LOCAL_PATH="/home/lily/Dropbox/gentoo.bak/"
#备份文件的前缀,默认自动按时间生成
PRE=`date +%F-%H-%M-%S`
 
tar zcf "$LOCAL_PATH/$PRE.tar.gz" \
/usr/local/portage \
/etc/portage \
/etc/make.conf \
/usr/src/linux/.config \
/etc/hosts \
/etc/fstab \
/etc/locale.gen
 
find "$LOCAL_PATH" -name "*.gz" -mtime +15 -exec rm {} \;

大家还能想出要备份什么文件的么?

PS: 如果你刚好还没注册Dropbox,又想试试的话,可以用我的这个推广链接注册,你我都会得到额外的250M空间(需要你安装了客户端并用它登录一次才有),现在通过推广,最多可以得到10G免费空间了,哈哈。

让ubuntu也来帮gentoo编译

最近,貌似关于gentoo的新闻越来越多了。刚又听说,chrome OS的宿主系统已经从ubuntu转向gentoo了,其实,我对这个倒是一点都不感到意外,gentoo对于这种特定的应用,可定制性显然比ubuntu强很多,让我来选的话也会选gentoo的。只是觉得一向低调的gentoo被google这么一搞,也许以后都没有办法再低调了,哈哈。
好像有点扯远了,说到gentoo,大家肯定会想到无休止的编译,也确实,gentoo的编译是比较费时间的,尤其是在性能不怎么强悍的机器上,比如跑着chrome的上网本里。如果你另外有几台强悍些的台式机或者服务器的话,其实可以把编译的工作分担一部分给强悍的机器。这时候就要用到distcc了。
distcc是一个通过网络进行分布式编译的工具,它包含两部分,一部分是服务端程序 distccd,一部分是客户端程序 distcc。大致的原理就是,distcc连接一个或多个distccd,有编译任务的时候,distcc依次并行地把C或C++文件分发给各distccd,distccd调用它们本地的编译器编译出 .o 文件以后,再发回给distcc,另外,configure和link等工作还是由客户端自己来完成。
这样一来,对各服务端的系统也就有了一个额外的要求:必须保证服务端和客户端的gcc版本是一致的,否则出来的.o肯定link不了啊,呵呵。
如果你的客户端和服务端都装的是gentoo,采用的一样的架构和keywords,那其实这个要求还是很好满足的:两边都升到最新即可,这样配置方法可以参考官方文档
但是如果你想用装着ubuntu、fedora、RHEL等发行版的服务端的话,就有点困难了,gentoo如果开了~x86的话,gcc的版本很容易就比这些发行版高出一大截了。
本文就是要解决这个问题的:

解决的思路,就是利用chroot,在各发行版里构建一套没有内核的gentoo系统(因为有kernel也用不着嘛),然后把里面的编译环境都升级到最新,再在里面安装运行distccd。
条件是你需要有server的root权限。
方法其实也不难,大致如下:

#建立gentoo的根目录,这里最好有>1.5G的硬盘空间,不然会不够用
mkdir gentoo
cd gentoo
#可以从 http://www.gentoo.org/main/en/mirrors.xml 这里选择速度快的mirror。
#下载你需要的架构的stage3
wget http://gentoo.cs.nctu.edu.tw/gentoo/releases/x86/current-stage3/stage3-i686-20100126.tar.bz2
#下载最新的portage树,其实不下也是可以的,不过后面emerge --sync的时候会慢些。
wget http://gentoo.cs.nctu.edu.tw/gentoo/snapshots/portage-latest.tar.bz2
#释放文件
tar xvf stage3-i686-20100126.tar.bz2 -C .
tar xvf portage-latest.tar.bz2 -C usr/
#清理现场
rm stage3-i686-20100126.tar.bz2 portage-latest.tar.bz2

然后,为了方便起见,在当前目录写一个gogentoo的脚本,内容如下,加上可执行权限:

#!/bin/bash
 
[[ $UID == 0 ]] || { echo "Must be root to go gentoo."; exit 0; }
 
cp /etc/resolv.conf etc/
mount -t proc proc proc/
mount -o bind /dev dev/
chroot . /bin/bash

然后执行 sudo ./gogentoo 就进入gentoo环境了。进去以后执行:

env-update
source /etc/profile
 
#添加 ~x86 的keywords,请按需修改成你自己的。
nano /etc/make.conf
#更新系统
emerge --sync
emerge -avuDN world
#完成以后,一般还需要gcc-config到最新的gcc版本。然后清理系统
emerge --depclean -av
#最后安装distcc
emerge distcc

到了这里,服务端的软件环境就算准备完毕了,你可以对比下两边的

gcc --version

的输出,看看是否完全一致。
不过,如果你在chroot环境下,直接执行 /etc/init.d/distccd start 来启动服务的话,多半是会遇到错误的,会提示什么udev有问题,我也没深究。不过既然不让启动服务的话,我手工启动总好了吧,于是执行:

distccd --port 3632 --log-file /var/log/distccd --log-level critical --allow client的IP -N 15

这样启动的distccd也照样能工作,哈哈。
以上步骤在 i686-pc-linux-gnu 的gentoo client 和 ubuntu 9.10 的server上试验通过。理论上这样做好的gentoo,应该是可以从ubuntu打包出来,到其他发行版直接用的,这样就很方便做出一个灰常强大的编译集群了,哈哈,改天试试看。

接下来就是配置你的client来使用这个server了,这个就和普通的没区别了,这里也先不讨论了,如有必要,另外再写一篇就好,呵呵。

perl升级引起的gentoo编译错误

最近,gentoo portage里的perl从 5.8.8 版本升到了 5.10.1 ,导致在编译一些其他包的时候,出现一些莫名的错误,而且这些错误都和perl有关。
例如,在 emerge gnome-extra/gnome-screensaver-2.28.3 的时候,就会出现:

checking for XML::Parser… configure: error: XML::Parser perl module is required for intltool

这样的错误。
解决办法是emerge一个 perl-cleaner,然后执行:

sudo perl-cleaner --all

把perl相关的模块和文件都检查并修正一遍,然后再编译其他包,就不会出错了。

去掉wget烦人的 “eta(英国中部时间)” 提示

gentoo 里的 wget ,从1.12版本开始,就一直有个不影响功能的小毛病:由于中文翻译的失误,进度提示的时候,会被拉成很多行。原因就是原来英文的ETA这3个字母,被翻译成了 “eta(英国中部时间)” 这么长,所以引起断行出错。
zh_CN.po 里,其实还是有说明的,只不过翻译人员疏忽了。如下:

#. TRANSLATORS: "ETA" is English-centric, but this must
#. be short, ideally 3 chars.  Abbreviate if necessary.
#: src/progress.c:805
#, c-format
msgid "  eta %s"
msgstr " eta(英国中部时间) %s"

既然这个小毛病不影响功能,之前也就没太在意,一直在等上游更新,不过到了 1.12-r1 版本,仍旧还有这个毛病,我也渐渐的看不下去了,就决定动手自己改掉它了。
方法也很简单,用之前我介绍过的命令就可以了,具体如下:

msgunfmt /usr/share/locale/zh_CN/LC_MESSAGES/wget.mo -o - | sed 's/eta(英国中部时间)/ETA/' | msgfmt - -o /tmp/zh_CN.mo
sudo cp /tmp/zh_CN.mo /usr/share/locale/zh_CN/LC_MESSAGES/wget.mo

搞定。

lafilefixer

前几天,对gentoo进行常规升级的时候,就有个别包没有编译过去,这对gentoo来说本不算什么的(谁让咱用的是 ~x86 呢),也就没太在意,但是近来越来越多的不同的包都出现了同一个错误:
报缺少 /usr/lib/libGL.la 文件,revdep-rebuild 也不能解决问题,甚至 revdep-rebuild 的过程中也有这个错误。
于是到sir里搜了一下,发现已经有人问过了,也得到了解决。
解决办法就是装上 lafilefixer ,运行一下

lafilefixer --justfixit

其实,la文件本身就是一个记录同名动态库或者静态库文件信息的一个文本文件。而lafilefixer也仅仅是一个bash脚本,它把需要更新的la文件都重写了一遍,哈哈。

Gentoo换了profile以后,鼠标键盘不能动的解决办法

Gentoo 10.0 的profile出来已经蛮久了,但是我一直都没换,直到昨天才设置成了 default/linux/x86/10.0/desktop ,结果一大堆包需要重新编译了(呃。。好吧,其实我本来就有好几天没更新系统了。。)。
编译完重启就发现问题了:启动到gdm以后,鼠标键盘都动不了了,按什么键都无效,输不了用户名了,包括ctrl+alt+F1都不管用了,但是触摸板却是有效的。
第一个想到的 qlist -I -C x11-drivers/ 里面的几个包重新编译一下,发现无效;然后看elogv,发现hal说要把xorg.conf里的input相关的都删掉,试了也无效。
最后的解决办法是:在 /etc/make.conf 的 INPUT_DEVICES= 里加上 evdev ,然后安装 x11-drivers/xf86-input-evdev 这个包。

gentoo的ACCEPT_LICENSE

最近 sudo emerge -avuDN @system @world 的时候,老是会有这样的提示:

!!! The following installed packages are masked:
- app-cdr/nero-4.0.0.0 (masked by: Nero-EULA-US license(s))
A copy of the 'Nero-EULA-US' license is located at '/usr/portage/licenses/Nero-EULA-US'.
 
- app-emulation/virtualbox-bin-3.0.8 (masked by: PUEL license(s))
A copy of the 'PUEL' license is located at '/usr/portage/licenses/PUEL'.

也不知道哪个版本的portage引入的这个机制,不过看文档倒是3年前就有的。
不过,如果你像我一样是个人用户,并不是很在意版权问题的话(其实也没啥问题,呵呵),其实只需要在 /etc/make.conf 里加一行:

ACCEPT_LICENSE="*"

就可以解决这个烦人的提示了。
PS: 这个东西现在貌似还不是很完善,因为目前都还没有在 emerge –info 里体现出来。。。

x11-drivers/xf86-video-radeonhd-1.3.0 会引起黑屏

今天对我的gentoo进行了解常规的uDN升级,但是等我晚上到家打开电脑就不能正常启动了,字符界面的信息输出完以后到了X就直接黑屏了,看了近期的升级日志,发现x11-drivers/xf86-video-radeonhd-1.3.0这个升级非常可疑,于是暂时mask掉,退回1.2.5版本,果然就好了。
我的显卡是x1700,用的是2.6.31内核里面的drm模块。有遇到相同问题的gentoo用户吗?