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















