全部文章 | 论坛文集

作者: chaos   发表日期: 2006-09-11 15:27   复制链接




                  Garnome-2.16.0的编译与启动
作者:chaos 社区:华镭社区:http://openrays.org (本文容许自由转载,但请保留出处和作者,谢谢支持)

    这回的成功进行的比较深入。虽然第一次的编译因为硬盘空间不够而前功尽弃,(全部编译估计得要3G的空间)但是第二次总算下来了。(用了2.6G,去掉了Firefox和一些我看起来没用的东西,不知会不会产生漏洞。。。)这回总算有一些拿的出手的“经验”和大家分享了。

1,引言
    我编译Gnome-2.16.0的初衷是想体会一下DIY的乐趣,就着尝尝鲜。但是毕竟华镭系统是经过测试的,新桌面环境虽然在理论上会完全兼容,但是不能保证100%不出问题。如果你的电脑上有关键数据,那么你还是用华镭的桌面吧。毕竟他已经很好用了。
    Garnome可以从http://ftp.gnome.org/pub/GNOME/sources/garnome/里下。

2,编译
  !编译时的操作全部在非root用户下进行!编译Garnome时应该保持网络的畅通。因为Garnome遇到需要的软件包而你设的GARCHIVEDIR 里没有的话,他会从网上自动下载。
  编译之前最好要通读一遍README(E文的,惨啊,慢慢来~~),FAQ看看也可以。先把DEPS-LIST里的软件包安了,建议先把能下的软件包先下了(Gnome的ftp里有),放到一个文件夹里(比如~/balls)。要不然Garnome用wget下,剧慢无比。不要忘了先修改gar.conf.mk里的GARCHIVEDIR(先把注释去掉,=~/balls)和main_prefix(我的是/opt/gnoe-2.16.0)。在avahi的Makefile(/garnome-××/freedesktop/avahi/)里的 “CONFIGURE_ARGS = $(DIRPATHS) --disable-qt3 --disable-qt4 --enable-compat-howl --enable-compat-libdns_sd --with-dbus-sys=$(sysconfdir)/dbus-1/system.d”后面加上--with-avahi-user=name --with-avahi-group=name(name是你的用户名)
    再cd到***/garnome-2.16.0/desktop,然后make paranoid-install,然后可以去睡觉了(不过要每隔半小时一小时的来看看,以防中间出错)。
  编译可以说占了很长的时间(2.5G赛扬,256M内存,用了一天时间。)。我觉得Garnome里的有些东西可以不要,比如,eka(软电话),Firefox(解压版的就挺好,而且编译这个要花很长时间(3小时),很大空间(700M左右)。),evolution(我从来不用,但是evolution-data-server得要)等等。去掉他们的方法也很简单,直接删掉那个目录就行。(也可以把他们剪切到别的地方去,实在不行了在切回来)。
  不过Firefox的问题还是要说一下。好多东西(比如librsvg,evolution-data-server等等)依赖这个,(不知为什么),单纯的切掉那个目录是不行的,错误提示是‘找不到../firefox那个目录’云云。这时我们可以缘木求鱼,找到依赖Fx的软件包的Makefile,注释掉里面的

LIBDEPS += $(shell if test ! "`ls $(shell echo $(PKG_CONFIG_PATH) | sed -e "s/:/ /g") 2>&1 /dev/null | grep mozilla-gtkmozembed.pc || ls $(shell echo $(PKG_CONFIG_PATH) | sed -e "s/:/ /g") 2>&1 /dev/null | grep firefox-gtkmozembed.pc`" ; then echo bootstrap/firefox ; fi )

再运行make paranoid-install就行了。(!注意:虽然我的Gnome-2.16.0运行到现在还没出什么大问题,但是舍掉Garnome里的软件包毕竟有一些风险性。其他的还行,就是Fx的这个,总觉得改人家的Makefile有些危险(毕竟是菜鸟嘛)。于是我发了一封信到Garnome的邮件列表,问问这么做可靠不可靠。可是由于不是注册用户,信件还在审查中,未回。)
    遇到问题可以先上Google上搜一下,一般在Garnome的邮件列表里都有解决方案。

3,启动(这一节写得比较琐碎。。。。因为没学过编写脚本,所以这几个脚本可能有疏漏之处,还请高人指正)
    编译完后最大的问题就是启动了。README里提供了两个脚本,可以按照他的先创建Garnome-start:
#!/bin/bash

GARNOME=$HOME/garnome

## Use GARNOME's DBus, HAL, and Avahi

## Fedora users should uncomment this section
#if [ `grep "<user>messagebus</user>" $GARNOME/etc/dbus-1/system.conf` ]; then
#     cat $GARNOME/etc/dbus-1/system.conf | \
#     sed 's,<user>messagebus</user>,<user>dbus</user>,' > \
#     $GARNOME/etc/dbus-1/system.conf;
#fi

su -c "pkill dbus; \
    pkill avahi-daemon; \
    pkill avahi-dnsconfd; \
    pkill hald; \
    rm -rf $GARNOME/var/run/messagebus.pid; \
    rm -rf $GARNOME/var/run/avahi-daemon/pid; \
    rm -rf $GARNOME/var/run/dbus/pid;\         #加这一行,要不然好像不能启动dbus
    rm -rf $GARNOME/var/run/haldaemon.pid; \
    $GARNOME/bin/dbus-daemon --system; \
    $GARNOME/sbin/avahi-daemon -D; \
    $GARNOME/sbin/avahi-dnsconfd -D; \
    $GARNOME/sbin/hald"
和Garnome-session:
#!/bin/bash

GARNOME=$HOME/garnome

PATH=$GARNOME/bin:$PATH
LD_LIBRARY_PATH=$GARNOME/lib:$LD_LIBRARY_PATH
PYTHONPATH=$GARNOME/lib/python2.4/site-packages:$GARNOME/lib/python2.4/site-packages/gtk-2.0
PKG_CONFIG_PATH=$GARNOME/lib/pkgconfig:/usr/lib/pkgconfig
GDK_USE_XFT=1
XDG_DATA_DIRS=$GARNOME/share
XDG_CONFIG_DIRS=$GARNOME/etc/xdg
MANPATH=$GARNOME/man:$MANPATH
DBUS_LAUNCH="$GARNOME/bin/dbus-launch --exit-with-session"

export PATH LD_LIBRARY_PATH PYTHONPATH PKG_CONFIG_PATH \
    GDK_USE_XFT XDG_DATA_DIRS XDG_CONFIG_DIRS MANPATH DBUS_LAUNCH

#这个脚本是启动新Gnome的脚本,好像新Gnome启动是没有运行~/.bashrc,于是我只好把变量加到这里了,还是请高人指点一个更
#好的办法。下面几行是我加的(最后一行不是)
export LANG=zh_CN.GB18030
export LC_CTYPE=zh_CN.GB18030
export XMODIFIERS="@im=fcitx"
export XIM=fcitx
export XIM_PROGRAM=fcitx

export HISTTIMEFORMAT=[%F\ %T]
export JAVA_HOME=/home/chaos/downloads/jre1.5.0_06
export CLASSPATH=$JAVA_HOME/jre/lib:$JAVA_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin

export PKG_CONFIG_PATH=/usr/share/pkgconfig#:/opt/gnome-2.16.0/share/pkgconfig:/opt/gnome-2.16.0/lib/pkgconfig

exec $DBUS_LAUNCH $GARNOME/bin/gnome-session

最后,Note: If you have altered the install path in gar.conf.mk, remember to set
  the GARNOME variable at the top of your script to point to the correct
  directory.
也别忘了将这两个脚本改为可执行。

    然后再像他说的,chmod a+x garnome-session ;sudo cp garnome-session /usr/bin(其实最好在/usr/bin下创建garnome-session的链接,方便以后的修改)

    然后打开Gedit,到/opt/gnome-2.16.0/share/gdm/BuiltInSessions下打开“系统默认会话”(实际上好像是default.desktop,双击打不开)。在最下面找到:

Exec=default

改成:

Exec=/usr/bin/garnome-session
保存。

    这时就可以用新编译的gdm(/opt/gnome-2.16.0/sbin/gdm)启动Gnome-2.16.0了。不过要想在启动后自动进入新的gdm,还要费一番功夫。(啊,不要急~~慢慢来,可以休息一下~~)
    这里要先讲一下/etc/init.d;/etc/rcN.d;/etc/inittab的作用。(我是从《Debian系统的安装与设置》这本书里看的,知道的可以跳过)
    系统在启动时是要运行一系列的程序的,那么那些程序在哪里,哪个文件指导系统去运行那些程序?在字符界面(tty1)登录时可以看到上面有一句话:*Entering runlevel 2 。这意味着什么呢?
    这意味着系统在这之后,开始按顺序运行/etc/rc2.d下的脚本了。runlevel 0 对应/etc/rc0.d下的脚本(这是关机程序),runlevel 1 对应/etc/rc1.d下的(这是字符界面的单用户),runlevel 2~5 对应/etc/rc2~5.d下的(这是多用户),runlevel 6 对应/etc/rc6.d下的(这是重启程序)。哪个文件里规定系统启动时进入哪个runlevel呢?是/etc/inittab。打开他,可以看到注释行下面第一行是:id:2:initdefault: 这个2就规定了系统最后进入runlevel 2。(如果你要是把他设成0,嘻嘻,启动完后就自动关机了;设成6,嘻嘻嘻嘻,启动之后自动重启,烤鸡版的。我没试过。那位有兴趣可以试试,准备好救援系统。。。)进入rcN.d,可以看到里面全是链接,那些真正的脚本全在/etc/init.d里,这样可以使系统更加安全,修改更方便。进入rc0.d,可以看到大部分脚本名是以Kxx开头;rc2.d里的脚本名大部分是以Sxx开头。这就是系统的巧妙之处了(至少我是这样认为)。执行每个init.d下的脚本都需要一个参数,这个参数可以是start,stop,restart,relaod,foce-reload的其中一个(作用嘛,望文生义就行了)。系统运行脚本时按数字的顺序,遇到K打头的,传递一个stop参数,中止那个程序;遇到S打头的,传递一个start参数,打开那个程序。我们如果要启动新gdm,就必定要先编一个“init.d型”的脚本,把他复制到/etc/init.d下(最好是链接过去,而不是复制。如果是链接的注意保留原文件。)然后修改某个rc.d里的启动链接,让系统自动启动DBus, HAL, and Avahi先铺平道路,然后启动新gdm,再进新的Gnome。我是修改的rc3.d.其他的不动,以防万一。以下就以rc3.d为例了。
    先写DBus, HAL, and Avahi的启动脚本。就把以前写的Garnome-start改一下就行。因为系统启动时必定是root用户,所以就不要su了:
#!/bin/bash

GARNOME=/opt/gnome-2.16.0

## Use GARNOME's DBus, HAL, and Avahi

## Fedora users should uncomment this section
#if [ `grep "<user>messagebus</user>" $GARNOME/etc/dbus-1/system.conf` ]; then
#     cat $GARNOME/etc/dbus-1/system.conf | \
#     sed 's,<user>messagebus</user>,<user>dbus</user>,' > \
#     $GARNOME/etc/dbus-1/system.conf;
#fi
    #我把rc3.d下启动dbus的脚本删了,所以不用pkill dbus;
    pkill avahi-daemon;
    pkill avahi-dnsconfd;
    pkill hald;
    rm -rf $GARNOME/var/run/messagebus.pid;
    rm -rf $GARNOME/var/run/avahi-daemon/pid;
    rm -rf $GARNOME/var/run/dbus/pid         #加这一行,要不然好像不能启动dbus
    rm -rf $GARNOME/var/run/haldaemon.pid;
    $GARNOME/bin/dbus-daemon --system;
    $GARNOME/sbin/avahi-daemon -D;
    $GARNOME/sbin/avahi-dnsconfd -D;
    $GARNOME/sbin/hald
改完后保存,链接到init.d。别忘了把属性改成可执行。我让他替换了原先S20dbus的位置,链接名为S20garnome-start。现在的这个脚本还不具备关闭三个Daemon的功能,不管传递什么参数,他都是让三个Daemon启动,因为我实在找不到关闭他们的脚本。
    下面开始写新gdm的脚本。他就比较好写了。因为在/opt/gnome-2.16.0/sbin下有三个脚本:gdm,gdm-restart,gdm-safe-restart,gdm-stop。嘻嘻,这时就可以发扬拿来主义了。我在/opt/gnome-2.16.0/sbin下写了一个新脚本,叫gdma,内容如下:(前面的注释行是抄的。。。。。)

#! /bin/sh
### BEGIN INIT INFO
# Provides:       x-display-manager gdm
# Required-Start:   avahi-daemon dbus-daemon
#
# Default-Start:   3
# Default-Stop:     S 0 6
# Short-Description: GNOME Display Manager
# Description:     Debian init script for the GNOME Display Manager
### END INIT INFO
#
# Author:     chaos.proton <chaos.proton@gmail.com>
#

start() #复制自gdm
{
# A script so that
#   1) we read the standard system env vars
#   2) syadmins/integrators can add their own private options etc...

test -f /etc/profile && . /etc/profile

# Try to set LC_MESSAGES to LANG if neither LC_MESSAGES or LC_ALL is set.
# This ensures that gdm can display in a system's default language if only
# LANG is set.

# Make sure LANG is set
if [ -z "$LANG" ]
then
test -f /etc/sysconfig/language && export LANG=`. /etc/sysconfig/language; echo $RC_LANG`
fi
if [ -z "$LC_MESSAGES" ]
then
  if [ -z "$LC_ALL" ]
  then
    LC_MESSAGES=$LANG
    export LC_MESSAGES
  fi
fi

exec /opt/gnome-2.16.0/sbin/gdm-binary "$@"

}

restart() #复制自gdm-restart
{

PIDFILE=`gdmflexiserver --command="GET_CONFIG daemon/PidFile"`
CHECKPIDFILE=`echo $PIDFILE | sed 's/^\([^ ]*\) .*$/\1/'`
if [ "x$CHECKPIDFILE" = "xOK" ]; then
    PIDFILE=`echo $PIDFILE | sed 's/^.* \(.*\)$/\1/'`
else
    PIDFILE=""
fi

if test x$PIDFILE = x ; then
    echo "Can't find the PID file in the configuration file, going to try:"
    echo "/var/run/gdm.pid"
    PIDFILE=/var/run/gdm.pid
fi
if test '!' -f $PIDFILE ; then
    echo "$PIDFILE doesn't exist, perhaps GDM isn't running"
    exit 1
fi
# exec the kill to get the correct return code
exec kill -HUP `cat $PIDFILE`

}

stop() #复制自gdm-stop
{
PIDFILE=`gdmflexiserver --command="GET_CONFIG daemon/PidFile"`
CHECKPIDFILE=`echo $PIDFILE | sed 's/^\([^ ]*\) .*$/\1/'`
if [ "x$CHECKPIDFILE" = "xOK" ]; then
    PIDFILE=`echo $PIDFILE | sed 's/^.* \(.*\)$/\1/'`
else
    PIDFILE=""
fi

if test x$PIDFILE = x ; then
    echo "Can't find the PID file in the configuration file, going to try:"
    echo "/var/run/gdm.pid"
    PIDFILE=/var/run/gdm.pid
fi
if test '!' -f $PIDFILE ; then
    echo "$PIDFILE doesn't exist, perhaps GDM isn't running"
    exit 1
fi
# exec the kill to get the correct return code
exec kill -TERM `cat $PIDFILE`

}


case "$1" in # 识别参数,从S20dbus改的。
start)
  start
;;
stop)
  stop
;;
reload|force-reload) #,跟S20dbus学的,狂汗。。。
  stop
  sleep 1
  start
;;
restart)
  restart
;;
*)
  echo "Usage: /etc/init.d/$NAME {start|stop|reload|restart|force-reload}" >&2
  exit 1
;;
esac
保存,改成可执行,链接到init.d。在rc3.d里链接成S99gdma(务必把原来的S99gdm删掉),在rc0,6.d里链接成K02gdma(不要把原来的K01gdm删掉,以备不时之需。)
    大功告成。再把/etc/inittab里的 id:2:initdefault: 改成:id:3:initdefault: 。重启,进入新gdm后在会话里选择系统默认,输入用户名和密码,就行了。

4,问题
    我的这个Gnome(在我的机器上的,可以叫chaos edition吧,哈哈)不是什么问题都没有。好像他启动时并不执行Xsession.d里的东西。所以并不是自动启动fcitx,进去之后还要手动激活一下。而且激活时不能开Gedit,要不然Gnome会重启(就是屏幕上只剩Gedit,面板什么的都没了,然后启动一个‘错误报告’,可是又说找不到‘GDB’(可能是没编译他),自己又关掉,等一下,Gnome又恢复了,然后一切恢复正常)。还有就是在Gedit里用fcitx输入叹号后,鼠标就没了,(晃也没有),在输入一个空格,晃一下,鼠标就有了,奇。。。。
    还有,虽然设了
export LANG=zh_CN.GB18030
export LC_CTYPE=zh_CN.GB18030
解决了很多问题(没设置之前中文文件夹全显示乱码),但是仍然有点问题(极少数依然是乱码)。。。。

5,后记
    我写这篇文章的目的就像秦武杨兄所说,希望能让想试一试的同志少走一些弯路。如果能起到抛砖引玉的作用,就更好了。我觉得编一个桌面,对自己比较有用,对社区却没有多大贡献。我还是希望高手们能利用这个新的桌面,创新的开发出一些实用的工具,或者对Gnome进行性能优化,本地化,再分享出来,推进华镭,推进社区的发展,这才是真正有用的。
    最后,鉴于本人语文水平有限(曾经有一张150满分的语文卷,我答了75.。。。)和对LINUX的了解有限,文中难免有疏漏之处,敬请指正。



阅读全文(3413) 回复(1) 推送返回 chaos 的主页



 
    文章评论 共1条回复
      guest
2006-09-11 15:46

原创好文!
返回