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版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28