+ -
当前位置:首页 → 问答吧 → LFS: 移植Gentoo Portage系统的脚本

LFS: 移植Gentoo Portage系统的脚本

时间:2009-08-28

来源:互联网

最近用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网站下一个快照.



代码:
#!/bin/bash



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


#local vars.
libdir=lib
portage_base="/usr/${libdir}/portage"
portage_share_config=/usr/share/portage/config
S=$LFS_TEMP/$PackageName
D=
ARCH=x86

#echek error code. $1 is string if error.
err_check()
{
 if [ "$?" != 0 ]; then
 echo $1
 exit 1
 fi
 return 0
}


die()
{
        echo $*
        exit 1
}

instman()
{
        for i in $(ls $1 2>/dev/null);
        do
 len=${#i}
 len=$(($len-1))
 manind=${i:$len:1}
 cp $i /usr/share/man$manind
 err_check "copy $i failed."
        done
}


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

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

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

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

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

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


        #install bins
        for x in $(find "$S"/bin -type d) ; do
 x=${x#$S/}
 mkdir -p $portage_base/$x || die "dodir failed"
 cd "$S"/$x || die "cd failed"
 cp $(find . -mindepth 1 -maxdepth 1 -type f ! -type l) \
 $portage_base/$x || \
 die "doexe failed"
 symlinks=$(find . -mindepth 1 -maxdepth 1 -type l)
 if [ -n "$symlinks" ] ; then
 cp -P $symlinks "$D$portage_base/$x" || die "cp failed"
 fi
 done

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

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

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

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

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

        #/usr/sbin
        my_syms="archive-conf
 dispatch-conf
 emaint
 emerge-webrsync
 env-update
 etc-update
 fixpackages
 quickpkg
 regenworld"
 for x in ${my_syms}; do
 ln -sv ../${libdir}/portage/bin/${x} /usr/sbin/${x}
 done

        ln -sv env-update /usr/sbin/update-env
 ln -sv etc-update /usr/sbin/update-etc

        mkdir -p /etc/portage


        #get portage.

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


        #add user/group
        useradd -M -c "portage system" -s /bin/false portage
        
        ;;

*)
        exit 1
        ;;
esac

#end


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

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

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

代码:
emerge -avtO 软件包名
来安装.

作者: swordhui   发布时间: 2009-08-28

这么改,升级下去最终会变为纯粹的gentoo的。
直接用gentoo不久完事了。

ps,gentoo有一个prefix项目,正是为其他系统准备的。

作者: zhou3345   发布时间: 2009-08-29

算算我用Gentoo也4年多了, 不过感觉在Gentoo里做点手脚不太容易
用LFS后感觉很痛快,尤其是重写所有的init脚本后, 感觉整个系统都是你的, 想干吗干吗

就是没有包管理系统..

作者: swordhui   发布时间: 2009-08-29

此举以往亦有人做过,但如二楼所言,portage 会令你的系统最终成为不拆不扣的 Gentoo,而非 LFS 系统下使用 portage.

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

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

http://www.linuxsir.org/bbs/showthread.php?t=255051

作者: d00m3d   发布时间: 2009-08-29

感谢提供的这些链接.
我刚开始有在LFS上使用Portage想法的时候, 在Google上搜索LFS Gentoo port没有搜到以上文章.

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

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

作者: swordhui   发布时间: 2009-08-29

LFS的好处之一是可以做得非常小型,非常适合定制专用系统,没必要引入Gentoo Portage,除非你想把它当发行版来用

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

作者: 5000   发布时间: 2009-08-29

引用:
作者: 5000
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

作者: swordhui   发布时间: 2009-08-29

稍作修改:

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

改为

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

其他经测试正常.

作者: swordhui   发布时间: 2009-08-29

如果仅仅是想用ebuild的话,不知道楼主有没有尝试过slackbuild的脚本?个人认为比portage要少折腾。

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

作者: zhou3345   发布时间: 2009-08-29

引用:
作者: zhou3345
如果仅仅是想用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也能做到这些, 有空可以研究一些

作者: swordhui   发布时间: 2009-08-29

引用:
作者: swordhui
感谢提供的这些链接.
我刚开始有在LFS上使用Portage想法的时候, 在Google上搜索LFS Gentoo port没有搜到以上文章.

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

有空可以讨论一些到底是什么区分了一个发行版.. 启动脚本? 包管理系统? 还是其他的什么东西?
可能大多数包都可行,但部份包泄及系统启动方式的可能要特别注意一下,因为 LFS 系统默认采用 SysV 方式,但 Gentoo 则采用 BSD 方式,哪些什麽 rc 脚本要很小心

作者: d00m3d   发布时间: 2009-08-30

引用:
作者: d00m3d
可能大多数包都可行,但部份包泄及系统启动方式的可能要特别注意一下,因为 LFS 系统默认采用 SysV 方式,但 Gentoo 则采用 BSD 方式,哪些什麽 rc 脚本要很小心
很好的提醒, Thanks.
对于涉及到启动的包, 我看最好直接忽视Gentoo的启动脚本, 自己根据软件包的man文档自己写一个LFS的, 反正他们装在不同的目录.

作者: swordhui   发布时间: 2009-08-30

引用:
作者: zhou3345
如果仅仅是想用ebuild的话,不知道楼主有没有尝试过slackbuild的脚本?个人认为比portage要少折腾。

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


研究了一下SlackBuild
对SlackWare不感兴趣, 不过KISS理念到可以借鉴.

Gentoo确实做的太复杂了.
也许lfs+paco确实是个不错的选择, 再辅以必要的安装脚本...

作者: swordhui   发布时间: 2009-09-09