LFS: 移植Gentoo Portage系统的脚本
时间:2009-08-28
来源:互联网
于是决定用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不久完事了。
ps,gentoo有一个prefix项目,正是为其他系统准备的。
作者: zhou3345 发布时间: 2009-08-29
用LFS后感觉很痛快,尤其是重写所有的init脚本后, 感觉整个系统都是你的, 想干吗干吗
就是没有包管理系统..
作者: swordhui 发布时间: 2009-08-29
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所有的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
关于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文件 这就是开源的世界 ) 有空可以讨论一些到底是什么区分了一个发行版.. 启动脚本? 包管理系统? 还是其他的什么东西? | 
作者: d00m3d 发布时间: 2009-08-30
| 
          作者: d00m3d
         
          可能大多数包都可行,但部份包泄及系统启动方式的可能要特别注意一下,因为 LFS 系统默认采用 SysV 方式,但 Gentoo 则采用 BSD 方式,哪些什麽 rc 脚本要很小心
         | 
对于涉及到启动的包, 我看最好直接忽视Gentoo的启动脚本, 自己根据软件包的man文档自己写一个LFS的, 反正他们装在不同的目录.
作者: swordhui 发布时间: 2009-08-30
| 
          作者: zhou3345
         
          如果仅仅是想用ebuild的话,不知道楼主有没有尝试过slackbuild的脚本?个人认为比portage要少折腾。 关于initrc的东东,不知道楼主对openrc/baselayout2有何看法? | 
研究了一下SlackBuild
对SlackWare不感兴趣, 不过KISS理念到可以借鉴.
Gentoo确实做的太复杂了.
也许lfs+paco确实是个不错的选择, 再辅以必要的安装脚本...
作者: swordhui 发布时间: 2009-09-09
热门阅读
-   office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具 office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具阅读:74 
-   如何安装mysql8.0 如何安装mysql8.0阅读:31 
-   Word快速设置标题样式步骤详解 Word快速设置标题样式步骤详解阅读:28 
-   20+道必知必会的Vue面试题(附答案解析) 20+道必知必会的Vue面试题(附答案解析)阅读:37 
-   HTML如何制作表单 HTML如何制作表单阅读:22 
-   百词斩可以改天数吗?当然可以,4个步骤轻松修改天数! 百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!阅读:31 
-   ET文件格式和XLS格式文件之间如何转化? ET文件格式和XLS格式文件之间如何转化?阅读:24 
-   react和vue的区别及优缺点是什么 react和vue的区别及优缺点是什么阅读:121 
-   支付宝人脸识别如何关闭? 支付宝人脸识别如何关闭?阅读:21 
-   腾讯微云怎么修改照片或视频备份路径? 腾讯微云怎么修改照片或视频备份路径?阅读:28 















