LinuxSir.cn,穿越时空的Linuxsir!

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

LFS: 移植Gentoo Portage系统的脚本

[复制链接]
发表于 2009-8-28 19:24:56 | 显示全部楼层 |阅读模式
最近用LFS装上了X系统和GTK, 一切都很顺利. 直到装celestia-1.6.0的时候.. 终于受不了了!! 怒了,负责Celestia发布的那帮人, 在代码发布前到底有没有编译过?

  于是决定用LFS安装基本的系统包, 然后移植Gentoo的Portage系统,有它管理其他软件包, 尤其是Celestia这种..

安装脚本如下 (参考Gentoo ebuild, 并将其改为纯bash模式)

依赖关系:
(1) portage严重依赖于Python2.x, 目前请不要使用3.x
(2) 运行前需要将portage库放入/etc/portage目录, 可以去gentoo的mirror网站下一个快照.




  1. #!/bin/bash



  2. PackageName=portage-2.2_rc35
  3. PackageURL=http://mirror.mcs.anl.gov/pub/gentoo/distfiles/portage-2.2_rc35.tar.bz2
  4. patchURL=http://mirror.mcs.anl.gov/pub/gentoo/distfiles/portage-2.2_rc40.patch.bz2


  5. #local vars.
  6. libdir=lib
  7. portage_base="/usr/${libdir}/portage"
  8. portage_share_config=/usr/share/portage/config
  9. S=$LFS_TEMP/$PackageName
  10. D=
  11. ARCH=x86

  12. #echek error code. $1 is string if error.
  13. err_check()
  14. {
  15.         if [ "$?" != 0 ]; then
  16.                 echo $1
  17.                 exit 1
  18.         fi
  19.         return 0
  20. }


  21. die()
  22. {
  23.         echo $*
  24.         exit 1
  25. }

  26. instman()
  27. {
  28.         for i in $(ls $1 2>/dev/null);
  29.         do
  30.                 len=${#i}
  31.                 len=$(($len-1))
  32.                 manind=${i:$len:1}
  33.                 cp $i /usr/share/man$manind
  34.                 err_check "copy $i failed."
  35.         done
  36. }


  37. case "${1}" in
  38. download)
  39.          #替换成你自己的下载命令
  40.         check_and_download $PackageURL
  41.         check_and_download $patchURL
  42.         ;;
  43. build)
  44.         #step0: unpack.
  45.         #替换成你自己的解压命令, 并到解压后的源码目录
  46.         unpack_and_enter $PackageName $PackageURL

  47.         #patch.
  48.         bzip2 -dc  $LFS_SOURCE/`basename $patchURL` | patch -p0
  49.         err_check "[Error] patch $PackageName failed."

  50.         #install cnf.
  51.         cd "${S}"/cnf
  52.         cp etc-update.conf dispatch-conf.conf /etc
  53.         err_check "[Error] copy cnf of $PackageName failed."

  54.         mkdir -p ${portage_share_config}
  55.         cp ./{sets.conf,make.globals} ${portage_share_config}
  56.         err_check "[Error] copy sets.conf of $PackageName failed."

  57.         if [ -f "make.conf.${ARCH}".diff ]; then
  58.                 patch make.conf "make.conf.${ARCH}".diff || \
  59.                         die "Failed to patch make.conf.example"
  60.                 cp make.conf ${portage_share_config}/make.conf.example
  61.         else
  62.                 echo ""
  63.                 echo "Portage does not have an arch-specific configuration for this arch."
  64.                 echo "Please notify the arch maintainer about this issue. Using generic."
  65.                 echo ""
  66.                 cp make.conf ${portage_share_config}/make.conf.example
  67.         fi

  68.         #make symbol
  69.         rm /etc/make.globals
  70.         ln -sv ${portage_share_config}/make.globals /etc/make.globals


  71.         #install bins
  72.         for x in $(find "$S"/bin -type d) ; do
  73.                 x=${x#$S/}
  74.                 mkdir -p $portage_base/$x || die "dodir failed"
  75.                 cd "$S"/$x || die "cd failed"
  76.                 cp $(find . -mindepth 1 -maxdepth 1 -type f ! -type l) \
  77.                         $portage_base/$x || \
  78.                         die "doexe failed"
  79.                 symlinks=$(find . -mindepth 1 -maxdepth 1 -type l)
  80.                 if [ -n "$symlinks" ] ; then
  81.                         cp -P $symlinks "$D$portage_base/$x" || die "cp failed"
  82.                 fi
  83.         done

  84.         #install pym
  85.         for x in $(find "$S"/pym -type d) ; do
  86.                 x=${x#$S/}
  87.                 mkdir -p $portage_base/$x || die "dodir failed"
  88.                 cd "$S"/$x || die "cd failed"
  89.                 cp *.py $portage_base/$x || die "doins failed"
  90.                 symlinks=$(find . -mindepth 1 -maxdepth 1 -type l)
  91.                 if [ -n "$symlinks" ] ; then
  92.                         cp -P $symlinks "$D$portage_base/$x" || die "cp failed"
  93.                 fi
  94.         done

  95.         # Symlinks to directories cause up/downgrade issues and the use of these
  96.         # modules outside of portage is probably negligible.
  97.         for x in "${D}${portage_base}/pym/"{cache,elog_modules} ; do
  98.                 [ ! -L "${x}" ] && continue
  99.                 die "symlink to directory will cause upgrade/downgrade issues: '${x}'"
  100.         done

  101.         cp  "${S}"/pym/portage/tests/runTests  ${portage_base}/pym/portage/tests

  102.         #install man pages.
  103.         instman "${S}"/man/*.[0-9]

  104.         #/usr/bin
  105.         for x in ebuild egencache emerge portageq repoman ; do
  106.                 ln -sv  ../${libdir}/portage/bin/${x} /usr/bin/${x}
  107.         done

  108.         #/usr/sbin
  109.         my_syms="archive-conf
  110.                 dispatch-conf
  111.                 emaint
  112.                 emerge-webrsync
  113.                 env-update
  114.                 etc-update
  115.                 fixpackages
  116.                 quickpkg
  117.                 regenworld"
  118.         for x in ${my_syms}; do
  119.                 ln -sv ../${libdir}/portage/bin/${x} /usr/sbin/${x}
  120.         done

  121.         ln -sv env-update /usr/sbin/update-env
  122.         ln -sv etc-update /usr/sbin/update-etc

  123.         mkdir -p /etc/portage


  124.         #get portage.

  125.         #symbol link
  126.         ln -sv ../usr/portage/profiles/default/linux/x86/10.0 /etc/make.profile


  127.         #add user/group
  128.         useradd -M -c "portage system" -s /bin/false portage
  129.        
  130.         ;;

  131. *)
  132.         exit 1
  133.         ;;
  134. esac

  135. #end
复制代码




先运行download下载代码
再运行build编译
完成后, 用emerge --sync 试验一下是否成功.

在我的LFS系统运行正常, 随后一直使用emerge管理新软件包, 唯一需要注意的是,

这个emerge不能处理依赖关系, 因为基本系统包来源于LFS, 不适Gentoo.
所以使用时, 自己解决依赖关系, 然后用:

  1. emerge -avtO 软件包名
复制代码


来安装.
发表于 2009-8-28 20:31:08 | 显示全部楼层
这么改,升级下去最终会变为纯粹的gentoo的。
直接用gentoo不久完事了。

ps,gentoo有一个prefix项目,正是为其他系统准备的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-28 21:05:45 | 显示全部楼层
算算我用Gentoo也4年多了, 不过感觉在Gentoo里做点手脚不太容易
用LFS后感觉很痛快,尤其是重写所有的init脚本后, 感觉整个系统都是你的, 想干吗干吗

就是没有包管理系统..
回复 支持 反对

使用道具 举报

发表于 2009-8-29 07:15:28 | 显示全部楼层
此举以往亦有人做过,但如二楼所言,portage 会令你的系统最终成为不拆不扣的 Gentoo,而非 LFS 系统下使用 portage.

http://www.linuxsir.cn/bbs/showthread.php?t=328022

http://www.linuxsir.cn/bbs/showthread.php?t=255764

http://www.linuxsir.cn/bbs/showthread.php?t=255051
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-29 09:52:17 | 显示全部楼层
感谢提供的这些链接.
我刚开始有在LFS上使用Portage想法的时候, 在Google上搜索LFS Gentoo port没有搜到以上文章.

Portage的精华在它的ebuilds库, 这些ebuild文件是LFS也能用的. 好多软件LFS/BLFS的书里没有, 但又不能正常编译时, 就需要ebuild库帮忙了. 我看ebuild全是用bash写的, 如果我们手工处理依赖关系, 只要Gentoo的ebuild工具编译想要的包,  可以不用担心LFS会变成Gentoo. (必要时可以修改ebuild文件 这就是开源的世界 )

有空可以讨论一些到底是什么区分了一个发行版..  启动脚本? 包管理系统? 还是其他的什么东西?
回复 支持 反对

使用道具 举报

发表于 2009-8-29 11:21:36 | 显示全部楼层
LFS的好处之一是可以做得非常小型,非常适合定制专用系统,没必要引入Gentoo Portage,除非你想把它当发行版来用

另外你说你重写了LFS所有的init脚本,有必要吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-29 11:48:33 | 显示全部楼层
Post by 5000;2021552
LFS的好处之一是可以做得非常小型,非常适合定制专用系统,没必要引入Gentoo Portage,除非你想把它当发行版来用

另外你说你重写了LFS所有的init脚本,有必要吗?


本来是没有必要, 不过我天生不喜欢罗嗦的东西
看到LFS的网络配置有点罗嗦, 就想用简单的取而代之了, 简单到只写符合我自己机器eth0, eth1配置脚本

顺便, 重写这个脚本也是学习bash编程的开始, 虽然大部分是抄写, 但抄写并调试 非常有助于学习.

简化过后的eth0启动脚本:

IPADDR=192.168.3.99/24
ROUTADDR=192.168.3.

case "${1}" in
start)
        boot_mesg "bring up  eth0 to $IPADDR.."
        ip addr add dev eth0 $IPADDR > /dev/null
        if [ ${?} != 0 ]; then
                echo_failure
                boot_mesg -n "ip addr failed." ${FAILURE}
                exit 1
        fi
        
        #link up.
        ip link set eth0 up > /dev/null
        if [ ${?} != 0 ]; then
                echo_failure
                boot_mesg -n "ip link failed." ${FAILURE}
                exit 1
        fi

        #set route.
        ip route add default dev eth0 via $ROUTADDR > /dev/null
        evaluate_retval
        ;;
stop)
        boot_mesg "bring down eth0..."
        ip link set eth0 down > /dev/null
        ip addr delete dev eth0 $IPADDR > /dev/null
        evaluate_retval
        ;;
restart)
        ${0} stop
        sleep 1
        ${0} start
        ;;
status)
        statusproc
        ;;
*)
        echo "Usage: ${0} {start|stop|restart|status}"
        exit 1
        ;;
esac


有了这个经验, 又写了eth1的启动脚本 (Wireless + dhcpcd )

prog_daemon=/usr/bin/wpa_supplicant
prog_dhcp=/sbin/dhcpcd

case "${1}" in
start)
        boot_mesg "bring up wireless eth1.."
        loadproc $prog_daemon -ieth1 -c/etc/wpa_supplicant.conf -B
        evaluate_retval

        boot_mesg "get address via dhcp.."
        loadproc $prog_dhcp eth1
        evaluate_retval
        ;;
stop)
        boot_mesg "bring down eth1..."
        ip link set eth1 down > /dev/null
        ip addr delete dev eth1 $IPADDR > /dev/null
        evaluate_retval

        boot_mesg "Stopping dhcpcd..."
        killproc $prog_dhcp

        boot_mesg "Stopping wpa_supplicant..."
        killproc $prog_daemon

        ;;
restart)
        ${0} stop
        sleep 1
        ${0} start
        ;;
status)
        statusproc $prog_daemon
        statusproc $prog_dhcp
        ;;
*)
        echo "Usage: ${0} {start|stop|restart|status}"
        exit 1
        ;;
esac
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-29 16:31:50 | 显示全部楼层
稍作修改:

bzip2 -d $LFS_SOURCE/`basename $patchURL` | patch -p0

改为

bzip2 -dc $LFS_SOURCE/`basename $patchURL` | patch -p0

其他经测试正常.
回复 支持 反对

使用道具 举报

发表于 2009-8-29 19:20:27 | 显示全部楼层
如果仅仅是想用ebuild的话,不知道楼主有没有尝试过slackbuild的脚本?个人认为比portage要少折腾。

关于initrc的东东,不知道楼主对openrc/baselayout2有何看法?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-29 19:57:47 | 显示全部楼层
Post by zhou3345;2021674
如果仅仅是想用ebuild的话,不知道楼主有没有尝试过slackbuild的脚本?个人认为比portage要少折腾。

关于initrc的东东,不知道楼主对openrc/baselayout2有何看法?



前几年自从接触了Gentoo后, 一直都在用Gentoo, 有空研究一下SlackBuild, 看看它怎么管理依赖关系, 怎么定制编译选项, 怎么管理软件包.

第一次接触OpenRC好像在看Funtoo的时候, 貌似解决了Gentoo RC系统链接C库时的静态编译问题. 我有过几次读Gentoo rc文件的冲动, 不过都中途放弃了. 相反LFS的rc脚本让我受益良多. 我想LFS的rc文件应该不存在静态编译的问题, 它只依赖Bash, Bash是动态链接到C库的.

我的目的很简单, 用一些简单的bash脚本, 配置基本的系统服务, 容易定制, 让系统快速启动就可以.如果OpenRC也能做到这些, 有空可以研究一些
回复 支持 反对

使用道具 举报

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

本版积分规则

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