1.1安装系统centos6.3-x86-64
1.2用剩余空间分区,本实验挂载分区为/dev/sda4,swap分区/dev/sda3
(注:如果用LIVECD,可以格式所有的硬盘,否则不是,提前预留一定的空间!本文已经在原来的母机上存在SWAP分区。则不讲SWAP)
1.3挂载分区
exportLFS=/mnt/lfs
mkdir$LFS
mount�Ct�Cvext4/dev/sda4$LFS
1.4建用户
groupaddlfs
useradd�Cs/bin/bash�Cglfs�Cm�Ck/dev/nulllfs;
1.5在$LFS下建目录
分别创建souces、tools,分别给lfs用户权限
chown�Cvlfs/tools
chown�Cvlfs$LFS/sources
1.6以lfs用户登录,su�Clfs;
创建用户环境.bash_profile
cat>~/.bash_profile<<"EOF"
execenv-iHOME=$HOMETERM=$TERMPS1='\u:\w\$'/bin/bash
EOF
创建.bashrc
cat>~/.bashrc<<"EOF"
set+h
umask022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname-m)-lfs-linux-gnu
PATH=/tools/bin:/bin:/usr/bin
exportLFSLC_ALLLFS_TGTPATH
EOF
对刚才用户配置文件进行source
source~/.bash_profile
2.1安装交叉Binutils
cd$LFS/source
tar�CJxvfbinutils-2.23.2.tar.xz
cdbinutils-2.23.2
mkdir../binutils-build
cd../binutis-build
编译binutis
../binutils-2.23.2/configure\
--prefix=/tools\
--with-sysroot=$LFS\
--with-lib-path=/tools/lib\
--target=$LFS_TGT\
--disable-nls\
--disable-werror
make
创建一个符号链接
case$(uname-m)in
x86_64)mkdir-v/tools/lib&&ln-svlib/tools/lib64;;
esac
安装程序包
makeinstall
2.2安装GCC-4.8.1
所要的依赖包有,mprf,gmp,mpc
cd$LFS/source
tar-Jxvfgcc-4.8.1.tar.xz
cdgcc-4.8.1
把三个依赖包都解压在gcc的源目录中
pwd
/mnt/lfs/sources/gcc-4.8.1
tar-Jxf../mpfr-3.1.2.tar.xz
mv-vmpfr-3.1.2mpfr
tar-Jxf../gmp-5.1.2.tar.xz
mv-vgmp-5.1.2gmp
tar-zxf../mpc-1.0.1.tar.gz
mv-vmpc-1.0.1mpc
改变GCC默认动态链接器位置
以下命令,是要在GCC源码中运行,否则不成功,也会导致glibc编译失败
pwd
/mnt/lfs/sources/gcc-4.8.1
forfilein\
$(findgcc/config-namelinux64.h-o-namelinux.h-o-namesysv4.h)
do
cp-uv$file{,.orig}
sed-e's@/lib\(64\)\?\(32\)\?/ld@/tools&@g'\
-e's@/usr@/tools@g'$file.orig>$file
echo'
#undefSTANDARD_STARTFILE_PREFIX_1
#undefSTANDARD_STARTFILE_PREFIX_2
#defineSTANDARD_STARTFILE_PREFIX_1"/tools/lib/"
#defineSTANDARD_STARTFILE_PREFIX_2""'>>$file
touch$file.orig
done
修复Glibc编制问题
sed-i'/kprot/agcc_cv_libc_provides_ssp=yes'gcc/configure
不要构建.info文件
sed-i's/BUILD_INFO=info/BUILD_INFO=/'gcc/configure
新建gcc-build文件夹
mkdir�Cv../gcc-build
cd../gcc-build
编译gcc
../gcc-4.8.1/configure\
--target=$LFS_TGT\
--prefix=/tools\
--with-sysroot=$LFS\
--with-newlib\
--without-headers\
--with-local-prefix=/tools\
--with-native-system-header-dir=/tools/include\
--disable-nls\
--disable-shared\
--disable-multilib\
--disable-decimal-float\
--disable-threads\
--disable-libmudflap\
--disable-libssp\
--disable-libgomp\
--disable-libquadmath\
--enable-languages=c\
--with-mpfr-include=$(pwd)/../gcc-4.8.1/mpfr/src\
--with-mpfr-lib=$(pwd)/mpfr/src/.libs
make
安装程序包
makeinstall
创建依赖的链接
ln-svlibgcc.a`$LFS_TGT-gcc-print-libgcc-file-name|\
sed's/libgcc/&_eh/'`
2.3安装LINUXAPI头文件
cd$LFS/sources
tar-Jxvflinux-3.10.10.tar.xz
cdlinux-3.10.10
编译内核
makemrproper
makeheaders_check
makeINSTALL_HDR_PATH=destheaders_install
cp-rvdest/include/*/tools/include
2.4安装Glibc-2.18
cd$LFS/sources
tar�CJxvfglibc-2.18.xz
cdglibc-2.18
确认rpc头文件
if[!-r/usr/include/rpc/types.h];then
su-c'mkdir-p/usr/include/rpc'
su-c'cp-vsunrpc/rpc/*.h/usr/include/rpc'
fi
Glibc源代码目录外创建目录编译Glibc
mkdir-v../glibc-build
cd../glibc-build
编译Glibc(注:一定要确认bison,gawk,是否已经在母机上安装了!否则第二次编译时,不会成功!)
../glibc-2.18/configure\
--prefix=/tools\
--host=$LFS_TGT\
--build=$(../glibc-2.18/scripts/config.guess)\
--disable-profile\
--enable-kernel=2.6.32\
--with-headers=/tools/include\
libc_cv_forced_unwind=yes\
libc_cv_ctors_header=yes\
libc_cv_c_cleanup=yes
安装GLIBC
make&&makeinstall
检查新工具链的基本功能(编译和链接)能正常工作
echo'main(){}'>dummy.c
$LFS_TGT-gccdummy.c
readelf-la.out|grep':/tools'
清理测试文件
rm-vdummy.ca.out
2.5编译BINUTILS-2.23.2第二遍
创建独立的编制目录
mkdir�Cv../binutils-build
cd../binutils-build
清楚掉原来的数据
rm�Crf*
编译binutils
CC=$LFS_TGT-gcc\
AR=$LFS_TGT-ar\
RANLIB=$LFS_TGT-ranlib\
../binutils-2.23.2/configure\
--prefix=/tools\
--disable-nls\
--with-lib-path=/tools/lib
安装binutils
make&&makeinstall
准备链接器
make-Cldclean
make-CldLIB_PATH=/usr/lib:/lib
cp-vld/ld-new/tools/bin
(注:binutils源码包还是第一次的!)
2.6编译GCC中Libstdc++-4.8.1
pwd
/mnt/lfs/sources/gcc-4.8.1
创建gcc-build
mkdir-pv../gcc-build
cd../gcc-build
编译Libstdc++
../gcc-4.8.1/libstdc++-v3/configure\
--host=$LFS_TGT\
--prefix=/tools\
--disable-multilib\
--disable-shared\
--disable-nls\
--disable-libstdcxx-threads\
--disable-libstdcxx-pch\
--with-gxx-include-dir=/tools/$LFS_TGT/include/c++/4.8.1
安装libstdc++
make&&makeinstall
(注:之前解压的GCC源码,与放编译文件的gcc-build,先不要删除否则会导致编译失败。)
2.7安装GCC第二次
cd$IFS/soures
清空原来的源码包(注:一定!一定要清空,不然编译不成功!!!)
rm�Crfgcc-4.8.4
rm�Crfgcc-build
tar�Cxvfgcc-4.8.4.tar.gz
cdgcc-4.8.4
创建一个完整版本的内置头文件
catgcc/limitx.hgcc/glimits.hgcc/limity.h>\
`dirname$($LFS_TGT-gcc-print-libgcc-file-name)`/include-fixed/limits.h
对X86计算机,需要强制使用-fomit-frame-pointer编译器标记
cp-vgcc/Makefile.in{,.tmp}
sed's/^T_CFLAGS=$/&-fomit-frame-pointer/'gcc/Makefile.in.tmp\
>gcc/Makefile.in
再次改变GCC默认动态链接器位置
forfilein\
$(findgcc/config-namelinux64.h-o-namelinux.h-o-namesysv4.h)
do
cp-uv$file{,.orig}
sed-e's@/lib\(64\)\?\(32\)\?/ld@/tools&@g'\
-e's@/usr@/tools@g'$file.orig>$file
echo'
#undefSTANDARD_STARTFILE_PREFIX_1
#undefSTANDARD_STARTFILE_PREFIX_2
#defineSTANDARD_STARTFILE_PREFIX_1"/tools/lib/"
#defineSTANDARD_STARTFILE_PREFIX_2""'>>$file
touch$file.orig
done
解压所需要的程序包
pwd
/mnt/lfs/sources/gcc-4.8.4
tar-Jxf../mpfr-3.1.2.tar.xz
mv-vmpfr-3.1.2mpfr
tar-Jxf../gmp-5.1.2.tar.xz
mv-vgmp-5.1.2gmp
tar-zxf../mpc-1.0.1.tar.gz
mv-vmpc-1.0.1mpc
不要构建.info文件
sed-i's/BUILD_INFO=info/BUILD_INFO=/'gcc/configure
再创建一个独立的编制目录
mkdir-v../gcc-build
cd../gcc-build
编译GCC
CC=$LFS_TGT-gcc\
AR=$LFS_TGT-ar\
RANLIB=$LFS_TGT-ranlib\
../gcc-4.8.1/configure\
--prefix=/tools\
--with-local-prefix=/tools\
--with-native-system-header-dir=/tools/include\
--enable-clocale=gnu\
--enable-shared\
--enable-threads=posix\
--enable-__cxa_atexit\
--enable-languages=c,c++\
--disable-libstdcxx-pch\
--disable-multilib\
--disable-bootstrap\
--disable-libgomp\
--with-mpfr-include=$(pwd)/../gcc-4.8.1/mpfr/src\
--with-mpfr-lib=$(pwd)/mpfr/src/.libs
安装程序
make&&makeinstall
创建符号链接
ln-vsgcc/tools/bin/cc
检查新工具链的基本功能
echo'main(){}'>dummy.c
ccdummy.c
readelf-la.out|grep':/tools'
清理测试文件
rm-vdummy.ca.out
2.8安装tcl
pwd
/mnt/lfs/sources
tar�Cxvftcl8.6.0.tar.gz
cdtcl8.6.0/unix
./configure�Cprefix=/tools
安装程序包
make&&makeinstall
(注:官方网站建议,此次编译不需要TZ=UTCmaketest检测)
让安装的库可写
chmod�Cvu+w/tools/lib/libtcl8.6.so
安装tcl头文件
makeinstall-private-headers
做一个符号链接
ln-svtclsh8.6/tools/bin/tclsh
2.9安装Expect
tar�Czxvfexpect5.45.tar.gz
cd/expect5.45
确保测试套件工具,编制工具链可用
cp-vconfigure{,.orig}
sed's:/usr/local/bin:/bin:'configure.orig>configure
编译expect
./configure--prefix=/tools--with-tcl=/tools/lib\
--with-tclinclude=/tools/include
安装expect
make
测试程序包
maketest
安装程序包
makeSCRIPTS=""install
2.10安装dejaGNU
tar�CzxvfdejaGNU-1.5.1.tar.gz
编译dejaGNU
./configure�Cprefix=/tools
编制安装包
makeinstall
测试
makecheck
2.11安装check-0.9.10
编译check
./configure�Cprefix=/tools
编制程序包
make
测试套件
makecheck
安装程序包
makeinstall
2.12安装ncurses
编译ncrses
./configure--prefix=/tools--with-shared\
--without-debug--without-ada--enable-overwrite
编译程序包
make
安装程序包
makeinstall
2.13安装bash
先打补丁
patch-Np1-i../bash-4.2-fixes-12.patch
编译bash
./configure--prefix=/tools--without-bash-malloc
编译程序包
make
测试套件
maketests
安装程序包
makeinstall
做一个链接
ln-svbash/tools/bin/sh
2.14安装BZIP
cdbzip2-1.0.6/
编译
make
安装程序包
makePREFIX=/toolsinstall
2.15安装coreutils
cdcoreutils/
编译coreutils
./configure--prefix=/tools--enable-install-program=hostname
编译程序包
make
测试套件
makeRUN_EXPENSIVE_TESTS=yescheck
安装程序包
makeinstall
2.16安装diffutils-3.3
cddiffutils-3.3/
修复程序包和glibc-2.18不兼容
sed-i-e'/getsisa/d'lib/stdio.in.h
编译diffutils
./configure--prefix=/tools
编译程序包
make
测试套件
makecheck
安装程序包
makeinstall
2.17安装flie
编译flie
cdflie/
./configure--prefix=/tools
编译程序包
make
测试套件
makecheck
安装程序包
makeinstall
2.18安装findutils
编译findutils
cdfindutils/
./configure--prefix=/tools
编译程序包
make
测试套件
makecheck
安装程序包
makeinstall
2.19安装gawk
编译gawk
cdgawk/
./configure--prefix=/tools
编译程序包
make
测试套件
makecheck
安装程序包
makeinstall
2.20安装gettext
编译gettext
cdgettext-tools/
EMACS="no"./configure--prefix=/tools--disable-shared
编译程序包
make-Cgnulib-lib
make-Csrcmsgfmt测试套件
安装msgfmt二进制
cp-vsrc/msgfmt/tools/bin
2.21安装grep
编译grep
cdgrep/
./configure--prefix=/tools
编译程序包
make
测试套件
makecheck
安装程序包
makeinstall
2.22安装gzip
编译gzip
cdgrep/
./configure--prefix=/tools
编译程序包
make
测试套件
makecheck
安装程序包
makeinstall
2.23安装M4
修复此程序包与GLIBC-2.17不兼容的问题
sed-i-e'/getsisa/d'lib/stdio.in.h
编译M4
cdM4/
./configure--prefix=/tools
编译程序包
make
测试套件
makecheck
安装程序包
makeinstall
2.23安装make
编译make
cdmake/
./configure--prefix=/tools
编译程序包
make
测试套件
makecheck
安装程序包
makeinstall
2.24安装patch
编译patch
cdpatch/
./configure--prefix=/tools
编译程序包
make
测试套件
makecheck
安装程序包
makeinstall
2.25安装perl
打补丁,修改C库不可更改的路径
patch-Np1-i../perl-5.18.0-libc-1.patch
编译PERL
cdperl/
shConfigure-des-Dprefix=/tools
编译程序包
make
需要安装几个工具和库:
cp-vperlcpan/podlators/pod2man/tools/bin
mkdir-pv/tools/lib/perl5/5.18.0
cp-Rvlib/*/tools/lib/perl5/5.18.0
2.25安装sed
编译sed
cdsed/
./configure--prefix=/tools
编译程序包
make
测试套件
makecheck
安装程序包
makeinstall
2.26安装tar
修复此程序包与Glibc-2.17不兼容的问题:
sed-i-e'/getsisa/d'gnu/stdio.in.h
准备编译Tar:
./configure--prefix=/tools
编译程序包:
make
测试套件
makecheck
安装程序包
makeinstall
2.27安装texinfo
编译texinfo
cdtexinfo/
./configure--prefix=/tools
编译程序包
make
测试套件
makecheck
安装程序包
makeinstall
2.28安装xz
编译xz
cdxz/
./configure--prefix=/tools
编译程序包
make
测试套件
makecheck
安装程序包
makeinstall
3.1剥离
移除不必要的项目
strip--strip-debug/tools/lib/*
strip--strip-unneeded/tools/{,s}bin/*
移除文档
rm-rf/tools/{,share}/{info,man,doc}
3.2改变归属
(注:退出lfs用户!!切换到root用户!!以下操作将在root用户下进行!!!)
修改/mnt/lfs/tools归属用户
chown-Rroot:root$LFS/tools
4.1编制LFS系统
准备虚拟内核文件
创建挂载文件系统的目录
mkdir-v$LFS/{dev,proc,sys}
4.2创建初始设备节点
mknod-m600$LFS/dev/consolec51
mknod-m666$LFS/dev/nullc13
4.3挂载并填充/dev
mount-v--bind/dev$LFS/dev
4.4挂载虚拟内核文件系统
mount-vtdevptsdevpts$LFS/dev/pts
mount-vtprocproc$LFS/proc
mount-vtsysfssysfs$LFS/sys
创建/dev/shm到/run/shm符号链接
if[-h$LFS/dev/shm];then
link=$(readlink$LFS/dev/shm)
mkdir-p$LFS/$link
mount-vttmpfsshm$LFS/$link
unsetlink
else
mount-vttmpfsshm$LFS/dev/shm
fi
4.5符号链接式程序管理
安装pkg
cdpkg-config-0.28
./configure--prefix=/usr/pkg/libfoo/1.1--with-internal-glib
make
makeinstall
再次安装
./configure--prefix=/usr--with-internal-glib
make
makeDESTDIR=/usr/pkg/libfoo/1.1install
5.1进入chroot环境
(注:以下中tools/bin/目录中不存在env文件,将不能chroot环境,请将重装Coreutils-8.19)
进入现在之存在临时工具的空间
chroot"$LFS"/tools/bin/env-i\
HOME=/root\
TERM="$TERM"\
PS1='\u:\w\$'\
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin\
/tools/bin/bash--login+h
5.2创建目录
创建LFS文件系统中的某些结构
mkdir-pv/{bin,boot,etc/{opt,sysconfig},home,lib,mnt,opt,run}
mkdir-pv/{media/{floppy,cdrom},sbin,srv,var}
install-dv-m0750/root
install-dv-m1777/tmp/var/tmp
mkdir-pv/usr/{,local/}{bin,include,lib,sbin,src}
mkdir-pv/usr/{,local/}share/{doc,info,locale,man}
mkdir-v/usr/{,local/}share/{misc,terminfo,zoneinfo}
mkdir-pv/usr/{,local/}share/man/man{1..8}
fordirin/usr/usr/local;do
ln-svshare/{man,doc,info}$dir
done
case$(uname-m)in
x86_64)ln-svlib/lib64&&ln-svlib/usr/lib64;;
esac
mkdir-v/var/{log,mail,spool}
ln-sv/run/var/run
ln-sv/run/lock/var/lock
mkdir-pv/var/{opt,cache,lib/{misc,locate},local}
5.3创建必要的文件和符号链接
ln-sv/tools/bin/{bash,cat,echo,pwd,stty}/bin
ln-sv/tools/bin/perl/usr/bin
ln-sv/tools/lib/libgcc_s.so{,.1}/usr/lib
ln-sv/tools/lib/libstdc++.so{,.6}/usr/lib
sed's/tools/usr/'/tools/lib/libstdc++.la>/usr/lib/libstdc++.la
ln-svbash/bin/sh
创建/etc/mtab文件
touch/etc/mtab
5.4创建/etc/passwd
cat>/etc/passwd<<"EOF"
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/dev/null:/bin/false
nobody:x:99:99:UnprivilegedUser:/dev/null:/bin/false
EOF
5.5创建/etc/group文件
cat>/etc/group<<"EOF"
root:x:0:
bin:x:1:
sys:x:2:
kmem:x:3:
tape:x:4:
tty:x:5:
daemon:x:6:
floppy:x:7:
disk:x:8:
lp:x:9:
dialout:x:10:
audio:x:11:
video:x:12:
utmp:x:13:
usb:x:14:
cdrom:x:15:
mail:x:34:
nogroup:x:99:
EOF
5.6启动新的SHELL
exec/tools/bin/bash--login+h
5.7创建日志文件
touch/var/log/{btmp,lastlog,wtmp}
chgrp-vutmp/var/log/lastlog
chmod-v664/var/log/lastlog
chmod-v600/var/log/btmp
5.8安装linuxAPI头文件
编译API
makemrproper
安装程序
makeheaders_check
makeINSTALL_HDR_PATH=destheaders_install
finddest/include\(-name.install-o-name..installNaNd\)-delete
cp-rvdest/include/*/usr/include
5.9安装MAN-pages-3.44
安装程序
makeinstall
5.10安装glibc-2.16.0
修复编制失效问题
sed-i's#<rpc/types.h>#"rpc/types.h"#'sunrpc/rpc_clntout.c
用一个补丁修复导致它失败的漏洞:
patch-Np1-i../glibc-2.16.0-fix_test_installation-1.patch
将其默认解释器改为/bin/bash:
sed-i's|@BASH@|/bin/bash|'elf/ldd.bash.in
现在修复一个在使用有问题的名称服务器时导致某些程序崩溃的问题:
patch-Np1-i../glibc-2.16.0-res_query_fix-1.patch
Glibc文档推荐在源代码目录外另建目录编译Glibc:
mkdir-v../glibc-build
cd../glibc-build
准备编译Glibc:
../glibc-2.16.0/configure\
--prefix=/usr\
--disable-profile\
--enable-add-ons\
--enable-kernel=2.6.25\
--libexecdir=/usr/lib/glibc
编译程序包
make
测试
make-kcheck2>&1|teeglibc-check-log
grepErrorglibc-check-log
创建ld.so.conf
touch/etc/ld.so.conf
安装程序号
makeinstall
重新编制glibc和几个BLFS程序包要求它们:
cp-v../glibc-2.16.0/sunrpc/rpc/*.h/usr/include/rpc
cp-v../glibc-2.16.0/sunrpc/rpcsvc/*.h/usr/include/rpcsvc
cp-v../glibc-2.16.0/nis/rpcsvc/*.h/usr/include/rpcsvc
5.11安装覆盖必要测试需要的最少区域数据:
mkdir-pv/usr/lib/locale
localedef-ics_CZ-fUTF-8cs_CZ.UTF-8
localedef-ide_DE-fISO-8859-1de_DE
localedef-ide_DE@euro-fISO-8859-15de_DE@euro
localedef-ide_DE-fUTF-8de_DE.UTF-8
localedef-ien_GB-fUTF-8en_GB.UTF-8
localedef-ien_HK-fISO-8859-1en_HK
localedef-ien_PH-fISO-8859-1en_PH
localedef-ien_US-fISO-8859-1en_US
localedef-ien_US-fUTF-8en_US.UTF-8
localedef-ies_MX-fISO-8859-1es_MX
localedef-ifa_IR-fUTF-8fa_IR
localedef-ifr_FR-fISO-8859-1fr_FR
localedef-ifr_FR@euro-fISO-8859-15fr_FR@euro
localedef-ifr_FR-fUTF-8fr_FR.UTF-8
localedef-iit_IT-fISO-8859-1it_IT
localedef-iit_IT-fUTF-8it_IT.UTF-8
localedef-ija_JP-fEUC-JPja_JP
localedef-iru_RU-fKOI8-Rru_RU.KOI8-R
localedef-iru_RU-fUTF-8ru_RU.UTF-8
localedef-itr_TR-fUTF-8tr_TR.UTF-8
localedef-izh_CN-fGB18030zh_CN.GB18030
5.12安装区域数据
makelocaledata/install-locales
创建/etc/nsswitch.conf
cat>/etc/nsswitch.conf<<"EOF"
#Begin/etc/nsswitch.conf
passwd:files
group:files
shadow:files
hosts:filesdns
networks:files
protocols:files
services:files
ethers:files
rpc:files
#End/etc/nsswitch.conf
EOF
安装时区数据
tar-xf../tzdata2012j.tar.gz
ZONEINFO=/usr/share/zoneinfo
mkdir-pv$ZONEINFO/{posix,right}
fortzinetceterasouthamericanorthamericaeuropeafricaantarctica\
asiaaustralasiabackwardpacificnewsolar87solar88solar89\
systemv;do
zic-L/dev/null-d$ZONEINFO-y"shyearistype.sh"${tz}
zic-L/dev/null-d$ZONEINFO/posix-y"shyearistype.sh"${tz}
zic-Lleapseconds-d$ZONEINFO/right-y"shyearistype.sh"${tz}
done
cp-vzone.tabiso3166.tab$ZONEINFO
zic-d$ZONEINFO-pAmerica/New_York
unsetZONEINFO
获知本地时区
tzselect
创建/etc/locatime文件
(注:此实验的时区选用Asia/Shanghai!)
cp-v--remove-destination/usr/share/zoneinfo/Asia/Shanghai\
/etc/localtime
5.13调解工具链
备份/tools中的链接器
mv-v/tools/bin/{ld,ld-old}
mv-v/tools/$(gcc-dumpmachine)/bin/{ld,ld-old}
mv-v/tools/bin/{ld-new,ld}
ln-sv/tools/bin/ld/tools/$(gcc-dumpmachine)/bin/ld
修改GCC的specs文件指向新的动态链接器
gcc-dumpspecs|sed-e's@/tools@@g'\
-e'/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/@}'\
-e'/\*cpp:/{n;s@$@-isystem/usr/include@}'>\
`dirname$(gcc--print-libgcc-file-name)`/specs
检查specs文件
echo'main(){}'>dummy.c
ccdummy.c-v-Wl,--verbose&>dummy.log
readelf-la.out|grep':/lib'
检查起始文件
grep-o'/usr/lib.*/crt[1in].*succeeded'dummy.log
检查编译器是否寻找正确的头文件
grep-B1'^/usr/include'dummy.log
下一步检查新的链接器使用正确的搜索路径:
grep'SEARCH.*/usr/lib'dummy.log|sed's|;|\n|g'
确保GCC使用正确的动态链接器:
grepfounddummy.log
清理测试文件:
rm-vdummy.ca.outdummy.log
5.14安装zlib-1.2.7
准备编译Zlib:
./configure--prefix=/usr
编译程序包:
make
要测试结果,执行:
makecheck
安装程序包:
makeinstall
共享库需要移动到/lib,所以位于/usr/lib的,.so文件需要重新创建:
mv-v/usr/lib/libz.so.*/lib
ln-sfv../../lib/libz.so.1.2.7/usr/lib/libz.so
5.15安装File
准备编译File:
./configure--prefix=/usr
编译程序包:
make
要测试结果,执行:
makecheck
安装程序包
makeinstall
5.16安装Binutils
(注:此次编译时,需要把原来的编译源码包删除!!)
测试确认PTY在chroot环境中正常工作:
expect-c"spawnls"
阻止安装一个过时的standards.info文件
rm-fvetc/standards.info
sed-i.bak'/^INFO/s/standards.info//'etc/Makefile.in
Binutils文档推荐在源代码目录外另建目录编制Binutils:
mkdir-v../binutils-build
cd../binutils-build
准备编译Binutils:
../binutils-2.23.1/configure--prefix=/usr--enable-shared
编译程序包:
maketooldir=/usr
测试结果:
make-kcheck
安装程序包:
maketooldir=/usrinstall
安装某些程序包需要的libiberty头文件:
cp-v../binutils-2.23.1/include/libiberty.h/usr/include
5.17安装GMP
准备编译GMP:
./configure--prefix=/usr--enable-cxx--enable-mpbsd
测试结果:
makecheck2>&1|teegmp-check-log
确保套件中全部166个测试都通过。要确认结果,执行以下命令:
awk'/testspassed/{total+=$2};END{printtotal}'gmp-check-log
安装程序包:
makeinstall
安装文档:
mkdir-v/usr/share/doc/gmp-5.0.5
cp-vdoc/{isa_abi_headache,configuration}doc/*.html\
/usr/share/doc/gmp-5.0.5
5.18安装MPFR
准备编译MPFR:
./configure--prefix=/usr\
--enable-thread-safe\
--docdir=/usr/share/doc/mpfr-3.1.1
编译程序包:
make
测试
makecheck
安装程序包:
makeinstall
安装文档:
makehtml
makeinstall-html
5.19安装MPC
准备编译MPC:
./configure--prefix=/usr
编译程序包:
make
要测试结果,执行:
makecheck
安装程序包:
makeinstall
5.20安装GCC
(注:删除原来的源码包时,本次解压之后,GCC所需要的三个程序包,还要在源码包中解压!MPC,MPRF,GMP!!否则编译失败!!)
禁止安装libiberty.a
sed-i's/install_to_$(INSTALL_DEST)//'libiberty/Makefile.in
强制编制使用-fomit-frame-pointer
case`uname-m`in
i?86)sed-i's/^T_CFLAGS=$/&-fomit-frame-pointer/'gcc/Makefile.in;;
esac
修复Makefile中的错误:
sed-i-e/autogen/d-e/check.sh/dfixincludes/Makefile.in
推荐在源代码目录外另建目录编制GCC:
mkdir-v../gcc-build
cd../gcc-build
准备编译GCC:
../gcc-4.7.2/configure--prefix=/usr\
--libexecdir=/usr/lib\
--enable-shared\
--enable-threads=posix\
--enable-__cxa_atexit\
--enable-clocale=gnu\
--enable-languages=c,c++\
--disable-multilib\
--disable-bootstrap\
--with-system-zlib
编译程序包
make
增大栈尺寸
ulimit�Cs32768
测试
makecheck
获取测试结果
../gcc-4.7.2/contrib/test_summary
安装程序包
makeinstall
C预处理器安装到/lib目录中,创建符号链接
ln-sv../usr/bin/cpp/lib
使用cc这个名字调用C编译器,创建符号链接
ln-svgcc/usr/bin/cc
确保编译和链接正常工作
echo'main(){}'>dummy.c
ccdummy.c-v-Wl,--verbose&>dummy.log
readelf-la.out|grep':/lib'
设置为使用正确的起始文件
grep-o'/usr/lib.*/crt[1in].*succeeded'dummy.log
检查一下编译器是否寻找正确的头文件:
grep-B4'^/usr/include'dummy.log
检查新的链接器使用正确的搜索路径:
grep'SEARCH.*/usr/lib'dummy.log|sed's|;|\n|g'
确认使用的是正确的libc:
grep"/lib.*/libc.so.6"dummy.log
确保GCC使用正确的动态链接器:
grepfounddummy.log
清理测试文件:
rm-vdummy.ca.outdummy.log
最后,移动一个位置不正确的文件:
mkdir-pv/usr/share/gdb/auto-load/usr/lib
mv-v/usr/lib/*gdb.py/usr/share/gdb/auto-load/usr/lib
5.21安装Sed
修复一些回归测试:
patch-Np1-i../sed-4.2.1-testsuite_fixes-1.patch
准备编译Sed:
./configure--prefix=/usr--bindir=/bin--htmldir=/usr/share/doc/sed-4.2.1
编译程序包:
make
生成HTML文档:
makehtml
要测试结果,执行:
makecheck
安装程序包:
makeinstall
安装HTML文档:
make-Cdocinstall-html
5.22安装Bzip2
打补丁:
patch-Np1-i../bzip2-1.0.6-install_docs-1.patch
确保符号链接的安装是相对的:
sed-i's@\(ln-s-f\)$(PREFIX)/bin/@\1@'Makefile
确保此手册页被安装到了正确的位置:
sed-i"s@(PREFIX)/man@(PREFIX)/share/man@g"Makefile
如此准备编译Bzip2:
make-fMakefile-libbz2_so
makeclean
编译和测试程序包:
make
安装程序包:
makePREFIX=/usrinstall
安装共享的bzip2二进制到/bin目录,制作一些必要的符号链接并整理:
cp-vbzip2-shared/bin/bzip2
cp-avlibbz2.so*/lib
ln-sv../../lib/libbz2.so.1.0/usr/lib/libbz2.so
rm-v/usr/bin/{bunzip2,bzcat,bzip2}
ln-svbzip2/bin/bunzip2
ln-svbzip2/bin/bzcat
5.23安装Pkg-config
准备编译Pkg-config:
./configure--prefix=/usr\
--with-internal-glib\
--docdir=/usr/share/doc/pkg-config-0.27.1
编译程序包:
make
要测试结果,执行:
makecheck
安装程序包:
makeinstall
5.24安装Ncurses
准备编译Ncurses:
./configure--prefix=/usr\
--mandir=/usr/share/man\
--with-shared\
--without-debug\
--enable-widec
编译程序包:
make
安装程序包:
makeinstall
移动共享库到/lib目录
mv-v/usr/lib/libncursesw.so.5*/lib
一个符号链接指向了一个不存在的文件夹。重新创建它:
ln-sfv../../lib/libncursesw.so.5/usr/lib/libncursesw.so
以符号链接和链接器脚本的方法欺骗这些应用程序链接到宽字符库:
forlibinncursesformpanelmenu;do
rm-vf/usr/lib/lib${lib}.so
echo"INPUT(-l${lib}w)">/usr/lib/lib${lib}.so
ln-sfvlib${lib}w.a/usr/lib/lib${lib}.a
done
ln-sfvlibncurses++w.a/usr/lib/libncurses++.a
确保在编制时需要-lcurses的旧应用程序仍可以正常编制:
rm-vf/usr/lib/libcursesw.so
echo"INPUT(-lncursesw)">/usr/lib/libcursesw.so
ln-sfvlibncurses.so/usr/lib/libcurses.so
ln-sfvlibncursesw.a/usr/lib/libcursesw.a
ln-sfvlibncurses.a/usr/lib/libcurses.a
如果需要,安装Ncurses文档:
mkdir-v/usr/share/doc/ncurses-5.9
cp-v-Rdoc/*/usr/share/doc/ncurses-5.9
5.25安装util-linux-2.22.1
cdutil-linux-2.22.1
推荐使用/var/lib/hwclock目录
sed-i-e's@etc/adjtime@var/lib/hwclock/adjtime@g'\
$(grep-rl'/etc/adjtime'.)
mkdir-pv/var/lib/hwclock
安装Util-linux
./configure--disable-su--disable-sulogin--disable-login
编译程序包:
make
安装程序包
makeinstall
5.26安装Psmisc
准备编译Psmisc:
./configure--prefix=/usr
编译程序包:
make
安装程序包:
makeinstall
最后将killall和fuser两个程序移动到FHS指定的位置:
mv-v/usr/bin/fuser/bin
mv-v/usr/bin/killall/bin
5.27安装E2fsprogs
E2fsprogs文档推荐在源代码树的一个子目录中编译该程序包:
mkdir-vbuild
cdbuild
准备编译E2fsprogs:
../configure--prefix=/usr\
--with-root-prefix=""\
--enable-elf-shlibs\
--disable-libblkid\
--disable-libuuid\
--disable-uuidd\
--disable-fsck
编译程序包
make
要测试结果,执行:
make-kcheck
安装二进制、文档和共享库:
makeinstall
安装静态库和头文件:
makeinstall-libs
使安装的静态库可写,移除调试符号:
chmod-vu+w/usr/lib/{libcom_err,libe2p,libext2fs,libss}.a
解压,然后更新系统的dir。
gunzip-v/usr/share/info/libext2fs.info.gz
install-info--dir-file=/usr/share/info/dir/usr/share/info/libext2fs.info
创建并安装一些额外的文档
makeinfo-odoc/com_err.info../lib/et/com_err.texinfo
install-v-m644doc/com_err.info/usr/share/info
install-info--dir-file=/usr/share/info/dir/usr/share/info/com_err.info
5.28安装Shadow
禁用groups程序的安装
sed-i's/groups$(EXEEXT)//'src/Makefile.in
findman-nameMakefile.in-execsed-i's/groups\.1//'{}\;
使用SHA-512方法来加密密码
sed-i-e's@#ENCRYPT_METHODDES@ENCRYPT_METHODSHA512@'\
-e's@/var/spool/mail@/var/mail@'etc/login.defs
准备编译Shadow:
./configure--sysconfdir=/etc
编译程序包:
make
安装程序包:
makeinstall
移动一个放置错误的程序到正确的位置:
mv-v/usr/bin/passwd/bin
要启Shadow处理过的密码
pwconv
要启Shadow处理过的组密码
grpconv
邮箱文件不被useradd创建
sed-i's/yes/no/'/etc/default/useradd
设置用户root密码
passwdroot
5.29安装Coreutils
修复测试bug
sed-i-e's/!isatty/isatty/'\
-e'45i\||errno==ENOENT'gnulib-tests/test-getlogin.c
POSIX要求Coreutils中的程序即使在多字节区域数据中也能正确识别字符边界
patch-Np1-i../coreutils-8.19-i18n-1.patch
编译Coreutils:
FORCE_UNSAFE_CONFIGURE=1./configure\
--prefix=/usr\
--libexecdir=/usr/lib\
--enable-no-install-program=kill,uptime
程序包:
make
安装程序包:
makeinstall
移动程序包到FHS给定的位置:
mv-v/usr/bin/{cat,chgrp,chmod,chown,cp,date,dd,df,echo}/bin
mv-v/usr/bin/{false,ln,ls,mkdir,mknod,mv,pwd,rm}/bin
mv-v/usr/bin/{rmdir,stty,sync,true,uname}/bin
mv-v/usr/bin/chroot/usr/sbin
mv-v/usr/share/man/man1/chroot.1/usr/share/man/man8/chroot.8
sed-is/\"1\"/\"8\"/1/usr/share/man/man8/chroot.8
移动/usr/bin/下head,sleep,nice到/bin目录下
mv-v/usr/bin/{head,sleep,nice}/bin
5.30安装Iana-Etc
将IANA提供的原始数据装换成/etc/protocols和/etc/services的数据文件
make
安装程序包:
makeinstall
5.31安装M4
修复此程序包和Glibc-2.18.0不兼容的问题
sed-i-e'/getsisa/d'lib/stdio.in.h
准备编译M4
./configure--prefix=/usr
编译程序包
make
测试程序
sed-i-e'41s/ENOENT/&||errno==EINVAL/'tests/test-readlink.h
makecheck
安装程序包
makeinstall
5.32安装Bison
准备编译Bison
./configure--prefix=/usr
修复新编译的副本不支持国际化
echo'#defineYYENABLE_NLS1'>>lib/config.h
编译程序包
make
测试
makecheck
安装程序包
makeinstall
5.33安装Procps
防止获取内核时钟频率时显示错误信息补丁
patch-Np1-i../procps-3.2.8-fix_HZ_errors-1.patch
修复watch程序中一个和unicode有关的漏洞
patch-Np1-i../procps-3.2.8-watch_unicode-1.patch
修复Makefile问题
make-3.82编制:
sed-i-e's@\*/module.mk@proc/module.mkps/module.mk@'\
-e's@^#SKIP@SKIP@'Makefile
编译程序包
make
安装程序包:
makeinstall
5.34安装Grep
准备编译Grep:
./configure--prefix=/usr--bindir=/bin
编译程序包:
make
测试
makecheck
安装程序包:
makeinstall
5.35安装Readline
重新安装Readline会导致旧的库被移动到<libraryname>.old
sed-i'/MV.*old/d'Makefile.in
sed-i'/{OLDSUFF}/c:'support/shlib-install
应用补丁修复已知漏洞
patch-Np1-i../readline-6.2-fixes-1.patch
编译Readline
./configure--prefix=/usr--libdir=/lib
编译程序包:
makeSHLIB_LIBS=-lncurses
安装程序包:
makeinstall
将静态库移动到合适的位置
mv-v/lib/lib{readline,history}.a/usr/lib
下一步移动/lib中的.so文件并重新链接到/usr/lib
rm-v/lib/lib{readline,history}.so
ln-sfv../../lib/libreadline.so.6/usr/lib/libreadline.so
ln-sfv../../lib/libhistory.so.6/usr/lib/libhistory.so
安装文档
mkdir-v/usr/share/doc/readline-6.2
install-v-m644doc/*.{ps,pdf,html,dvi}\
/usr/share/doc/readline-6.2
5.36安装Bash
应用补丁修复上游指出的多个漏洞
patch-Np1-i../bash-4.2-fixes-10.patch
编译Bash
./configure--prefix=/usr\
--bindir=/bin\
--htmldir=/usr/share/doc/bash-4.2\
--without-bash-malloc\
--with-installed-readline
编译程序包:
make
安装程序包:
makeinstall
运行新编译的bash程序(替换掉现在在运行的副本):
exec/bin/bash--login+h
5.37安装Libtool
准备编译Libtool:
./configure--prefix=/usr
编译程序包:
make
测试
makecheck
安装程序包:
makeinstall
5.38装GDBM
编译GDBM
./configure--prefix=/usr--enable-libgdbm-compat
编译程序包:
make
测试
makecheck
安装程序包
makeinstall
5.39安装Inetutils
修复此程序包与Glibc-2.18.0不兼容的问题
sed-i-e'/getsisa/d'lib/stdio.in.h
编译Inetutils
./configure--prefix=/usr\
--libexecdir=/usr/sbin\
--localstatedir=/var\
--disable-ifconfig\
--disable-logger\
--disable-syslogd\
--disable-whois\
--disable-servers
编译程序包
make
测试
makecheck
安装程序包
makeinstall
make-Cdochtml
make-Cdocinstall-htmldocdir=/usr/share/doc/inetutils-1.9.1
将某些程序移动到与FHS兼容的位置
mv-v/usr/bin/{hostname,ping,ping6}/bin
mv-v/usr/bin/traceroute/sbin
5.40安装Perl
创建一个基本的/etc/hosts文件供Perl的配置文件和可选的测试套件使用
echo"127.0.0.1localhost$(hostname)">/etc/hosts
此版本的Perl现在编制Compress::Raw::Zlib模块。默认地,Perl会使用其内置的Zlib源代码副本。运
行以下命令使Perl使用系统上安装的Zlib库
sed-i-e"s|BUILD_ZLIB\s*=True|BUILD_ZLIB=False|"\
-e"s|INCLUDE\s*=./zlib-src|INCLUDE=/usr/include|"\
-e"s|LIB\s*=./zlib-src|LIB=/usr/lib|"\
cpan/Compress-Raw-Zlib/config.in
使用Perl自动检测到的默认值
shConfigure-des-Dprefix=/usr\
-Dvendorprefix=/usr\
-Dman1dir=/usr/share/man/man1\
-Dman3dir=/usr/share/man/man3\
-Dpager="/usr/bin/less-isR"\
-Duseshrplib
编译程序包
make
测试
make-ktest
安装程序包
makeinstall
5.41安装Autoconf
编译Autoconf:
./configure--prefix=/usr
编译程序包
make
测试
makecheck
安装程序包
makeinstall
5.42安装Automake
准备编译Automake:
./configure--prefix=/usr--docdir=/usr/share/doc/automake-1.12.5
编译程序包
make
安装程序包:
makeinstall
5.43安装Diffutils
修复此程序包与Glibc-2.18.0不兼容的问题
sed-i-e'/getsisa/d'lib/stdio.in.h
准备编译Diffutils:
./configure--prefix=/usr
编译程序包:
make
测试:
makecheck
安装程序包:
makeinstall
5.44安装Gawk
准备编译Gawk:
./configure--prefix=/usr--libexecdir=/usr/lib
编译程序包
make
测试
makecheck
安装程序包
makeinstall
安装文档:
mkdir-v/usr/share/doc/gawk-4.0.1
cp-vdoc/{awkforai.txt,*.{eps,pdf,jpg}}/usr/share/doc/gawk-4.0.1
5.45安装Findutils
编译Findutils
./configure--prefix=/usr\
--libexecdir=/usr/lib/findutils\
--localstatedir=/var/lib/locate
编译程序包
make
测试
makecheck
安装程序包
makeinstall
updatedb脚本也需要修改才能修正这个路径:
mv-v/usr/bin/find/bin
sed-i's/find:=${BINDIR}/find:=\/bin/'/usr/bin/updatedb
5.46安装Flex
修复一些回归测试
patch-Np1-i../flex-2.5.37-bison-2.6.1-1.patch
编译Flex:
./configure--prefix=/usr\
--docdir=/usr/share/doc/flex-2.5.37
编译程序包:
make
测试
make-kcheck
安装程序包:
makeinstall
有一些程序包会在/usr/lib中寻找lex库。创建一个符号链接解决此问题:
ln-svlibfl.a/usr/lib/libl.a
创建一个打包脚本,命名为lex,以lex模拟模式调用flex:
cat>/usr/bin/lex<<"EOF"
#!/bin/sh
#Begin/usr/bin/lex
exec/usr/bin/flex-l"$@"
#End/usr/bin/lex
EOF
chmod-v755/usr/bin/lex
5.47安装Gettext
修复此程序包和Glibc-2.18.0间的一个不兼容问题
sed-i-e'/getsisa/d'gettext-*/*/stdio.in.h
编译Gettext:
./configure--prefix=/usr\
--docdir=/usr/share/doc/gettext-0.18.1.1
编译程序:
make
makecheck
安装程序包:
makeinstall
5.48安装Groff
编译Groff
PAGE=<paper_size>./configure--prefix=/usr
编译程序包:
make
安装程序包:
makeinstall
某些文档程序,例如xman,需要以下符号链接才能工作:
ln-sveqn/usr/bin/geqn
ln-svtbl/usr/bin/gtbl
5.49安装Xz
准备编译Xz
./configure--prefix=/usr--libdir=/lib--docdir=/usr/share/doc/xz-5.0.4
编译程序包
make
测试:
makecheck
安装程序包:
makepkgconfigdir=/usr/lib/pkgconfiginstall
5.50安装GRUB
修复一个该程序包与Glibc-2.18.0间的不兼容错误
sed-i-e'/getsisa/d'grub-core/gnulib/stdio.in.h
编译GRUB
./configure--prefix=/usr\
--sysconfdir=/etc\
--disable-grub-emu-usb\
--disable-efiemu\
--disable-werror
--disable-werror
编译程序包
make
安装程序包
makeinstall
5.51安装Less
编译Less
./configure--prefix=/usr--sysconfdir=/etc
编译程序包
make
安装程序包
makeinstall
5.52安装Gzip
编译Gzip
./configure--prefix=/usr--bindir=/bin
编译程序包
make
makecheck
安装程序包
makeinstall
将某些不需要在根文件系统上的程序移开
mv-v/bin/{gzexe,uncompress,zcmp,zdiff,zegrep}/usr/bin
mv-v/bin/{zfgrep,zforce,zgrep,zless,zmore,znew}/usr/bin
5.53安装IPRoute2
应用一个补丁修复一个由iptables程序包缺失造成的编译问题
patch-Np1-i../iproute2-3.6.0-ipset-1.patch
移除对BerkeleyDB的依赖
sed-i'/^TARGETS/s@arpd@@g'misc/Makefile
sed-i/ARPD/dMakefile
sed-i's/arpd.8//'man/man8/Makefile
编译程序包
makeDESTDIR=
安装程序包
makeDESTDIR=\
MANDIR=/usr/share/man\
DOCDIR=/usr/share/doc/iproute2-3.6.0install
5.54安装Kbd
loadkeys在不带有文件名运行时的行为是不正常的。以下补丁修复之
patch-Np1-i../kbd-1.15.3-upstream_fixes-1.patch
退格键和删除键的行为在Kbd程序包中不同的键盘映射中是不一致的。以下补丁为i386键盘映射解决
patch-Np1-i../kbd-1.15.3-backspace-1.patch
修复西班牙语信息翻译阻止kbd与gettext-0.18.1.1一同编制的一个漏洞
sed-i'/guardado\el/s/\(^.*en\%\)\(.*\)/\14\$\2/'po/es.po
移除多余的resizecons程序(只移除32位x86版本,因为它需要由早于linux-2.6且与现代KMS不兼
容而已不存在的svgalib来提供视频模式文件――通常使用setfont来重设控制台尺寸)和它的手册页
sed-i's/\(RESIZECONS_PROGS=\)yes/\1no/'configure&&
sed-i's/resizecons.8//'man/man8/Makefile.in&&
touch-d'2011-05-0708:30'configure.ac
编译Kbd
./configure--prefix=/usr--datadir=/lib/kbd
编译程序包
make
安装程序包
makeinstall
二进制程序需要位于根分区上
mv-v/usr/bin/{kbd_mode,loadkeys,openvt,setfont}/bin
安装文档
mkdir-v/usr/share/doc/kbd-1.15.3
cp-R-vdoc/*\
/usr/share/doc/kbd-1.15.3
5.55安装Kmod
准备编译Kmod
./configure--prefix=/usr\
--bindir=/bin\
--libdir=/lib\
--sysconfdir=/etc\
--disable-manpages\
--with-xz\
--with-zlib
编译程序包
make
测试
makecheck
安装程序包并创建符号链接以兼容Module-Init-Tools,即先前用于处理Linux内核模块的程序包:
makepkgconfigdir=/usr/lib/pkgconfiginstall
fortargetindepmodinsmodmodinfomodprobermmod;do
ln-sv../bin/kmod/sbin/$target
done
ln-svkmod/bin/lsmod
5.56安装Libpipeline
准备编译Libpipeline
PKG_CONFIG_PATH=/tools/lib/pkgconfig./configure--prefix=/usr
编译程序包
make
测试
makecheck
安装程序包
makeinstall
5.57安装Make
应用一些上游补丁
patch-Np1-i../make-3.82-upstream_fixes-3.patch
准备编译Make
./configure--prefix=/usr
编译程序包:
make
测试
makecheck
安装程序包:
makeinstall
5.58安装Man-DB
准备编译Man-DB:
./configure--prefix=/usr\
--libexecdir=/usr/lib\
--docdir=/usr/share/doc/man-db-2.6.3\
--sysconfdir=/etc\
--disable-setuid\
--with-browser=/usr/bin/lynx\
--with-vgrind=/usr/bin/vgrind\
--with-grap=/usr/bin/grap
编译程序包
make
测试
makecheck
安装程序包
makeinstall
5.59安装Patch
准备编译Patch
./configure--prefix=/usr
编译程序包
make
测试
makecheck
安装程序包
makeinstall
5.60安装Sysklogd
编译程序包
make
这个程序包不包含测试套件
安装程序包:
makeBINDIR=/sbininstall
配置Sysklogd
创建一个新的/etc/syslog.conf文件
cat>/etc/syslog.conf<<"EOF"
#Begin/etc/syslog.conf
auth,authpriv.*-/var/log/auth.log
*.*;auth,authpriv.none-/var/log/sys.log
daemon.*-/var/log/daemon.log
kern.*-/var/log/kern.log
mail.*-/var/log/mail.log
user.*-/var/log/user.log
*.emerg*
#End/etc/syslog.conf
EOF
5.61安装Sysvinit
init传递终止信号到各个由init本身启动且不应当在新运行等级下运行的进程
sed-i's@Sendingprocesses@&configuredvia/etc/inittab@g'src/init.c
阻止这些程序和它们的手册页的Sysvinit版本被安装
sed-i-e's/utmpdump/d'\
-e'/mountpoint/d'src/Makefile
编译程序包
make-Csrc
安装程序包
make-Csrcinstall
5.62安装Tar
修复此程序包与Glibc-2.18.0不兼容的问题
sed-i-e'/getsisa/d'gnu/stdio.in.h
编译Tar
FORCE_UNSAFE_CONFIGURE=1\
./configure--prefix=/usr\
--bindir=/bin\
--libexecdir=/usr/sbin
编译程序包:
make
测试
makecheck
安装程序包
makeinstall
make-Cdocinstall-htmldocdir=/usr/share/doc/tar-1.26
5.63安装Texinfo
准备编译Texinfo:
./configure--prefix=/usr
编译程序包
make
测试
makecheck
安装程序包
makeinstall
选择安装TeX的某些组件
makeTEXMF=/usr/share/texmfinstall-tex
Info文档系统使用纯文本文件保存菜单条目。此文件位于/usr/share/info/dir。然而由于不同程序的Makefile有时会出现问题,此文件可能会与系统上安装的信息页不同步。以下可选命令可以重新创建此文件
cd/usr/share/info
rm-vdir
forfin*
doinstall-info$fdir2>/dev/null
done
5.64安装Udev
udev-lfs压缩包包含LFS特有的文件,用于编制Udev。将其解包至systemd原地码目录中
tar-xvf../udev-lfs-195.tar.bz2
编译程序包
make-fudev-lfs-195/Makefile.lfs
安装程序包
make-fudev-lfs-195/Makefile.lfsinstall
设置稳定的udev网络规则
bashudev-lfs-195/init-net-rules.sh
5.65安装Vim
改变vimrc配置文件的默认位置到/etc
echo'#defineSYS_VIMRC_FILE"/etc/vimrc"'>>src/feature.h
编译Vim
./configure--prefix=/usr--enable-multibyte
编译程序包
make
测试
maketest
安装程序包:
makeinstall
很多用户习惯于使用vi而不是vim。要允许在用户按习惯输入vi时运行vim,创建其二进制和提供的手册页语言的符号链接
ln-svvim/usr/bin/vi
forLin/usr/share/man/{,*/}man1/vim.1;do
ln-svvim.1$(dirname$L)/vi.1
done
新建链接允许通过/usr/share/doc/vim-7.3
ln-sv../vim/vim73/doc/usr/share/doc/vim-7.3
配置Vim
cat>/etc/vimrc<<"EOF"
"Begin/etc/vimrc
setnocompatible
setbackspace=2
syntaxon
if(&term=="iterm")||(&term=="putty")
setbackground=dark
endif
"End/etc/vimrc
EOF
获取其他选项的文档
vim-c':options'
6.1再次剥离
退出chroot模式
logout
重新进入chroot模式
chroot$LFS/tools/bin/env-i\
HOME=/rootTERM=$TERMPS1='\u:\w\$'\
PATH=/bin:/usr/bin:/sbin:/usr/sbin\
/tools/bin/bash�Clogin
现在二进制和库就可以安全剥离了
/tools/bin/find/{,usr/}{bin,lib,sbin}-typef\
-exec/tools/bin/strip--strip-debug'{}'';'
6.2清理
重新进入chroot环境,使用以下修改过的命令
chroot"$LFS"/usr/bin/env-i\
HOME=/rootTERM="$TERM"PS1='\u:\w\$'\
PATH=/bin:/usr/bin:/sbin:/usr/sbin\
/bin/bash�Clogin
7.1配置IP地址
cd/etc/sysconfig/
cat>ifconfig.eth0<<"EOF"
ONBOOT=yes
IFACE=eth0
SERVICE=ipv4-static
IP=192.168.1.1
GATEWAY=192.168.1.2
PREFIX=24
BROADCAST=192.168.1.255
EOF
7.2配置DNS
cat>/etc/resolv.conf<<"EOF"
#Begin/etc/resolv.conf
domainaiyou.com
nameserver202.96.128.86
nameserver8.8.8.8
#End/etc/resolv.conf
EOF
7.3配置计算机名称
cat>/etc/hosts<<"EOF"
#Begin/etc/hosts(networkcardversion)
127.0.0.1localhost
#End/etc/hosts(networkcardversion)
EOF
配置网络名
echo"HOSTNAME=<lfs>">/etc/sysconfig/network
7.4安装LFS-BOOTSCRIPTS
tar�CxvfLFS-bootscripts-20130821.tar.gz
cdLFS-bootscripts-20130821
makeinstall
7.5配置时间
cat>/etc/sysconfig/clock<<"EOF"
#Begin/etc/sysconfig/clock
UTC=1
#Setthistoanyoptionsyoumightneedtogivetohwclock,
#suchasmachinehardwareclocktypeforAlphas.
CLOCKPARAMS=
#End/etc/sysconfig/clock
EOF
7.6配置console
cat>/etc/sysconfig/console<<"EOF"
#Begin/etc/sysconfig/console
UNICODE="1"
KEYMAP="de-latin1"
KEYMAP_CORRECTIONS="euro2"
LEGACY_CHARSET="iso-8859-15"
FONT="LatArCyrHeb-16-m8859-15"
#End/etc/sysconfig/console
EOF
7.7配置键盘模式
cat>/etc/inputrc<<"EOF"
#Begin/etc/inputrc
#ModifiedbyChrisLynn<[email protected]>
#Allowthecommandprompttowraptothenextline
sethorizontal-scroll-modeOff
#Enable8bitinput
setmeta-flagOn
setinput-metaOn
#Turnsoff8thbitstripping
setconvert-metaOff
#Keepthe8thbitfordisplay
setoutput-metaOn
#none,visibleoraudible
setbell-stylenone
#Allofthefollowingmaptheescapesequenceofthevalue
#containedinthe1stargumenttothereadlinespecificfunctions
"\eOd":backward-word
"\eOc":forward-word
#forlinuxconsole
"\e[1~":beginning-of-line
"\e[4~":end-of-line
"\e[5~":beginning-of-history
"\e[6~":end-of-history
"\e[3~":delete-char
"\e[2~":quoted-insert
#forxterm
"\eOH":beginning-of-line
"\eOF":end-of-line
#forKonsole
"\e[H":beginning-of-line
"\e[F":end-of-line
#End/etc/inputrc
EOF
7.8配置启动盘
cat>/etc/fstab<<"EOF"
#Begin/etc/fstab
#filesystemmount-pointtypeoptionsdumpfsck
#order
/dev/sda4/ext4defaults11
/dev/sda3swapswappri=100(注:超级重要!!)
proc/procprocnosuid,noexec,nodev00
sysfs/syssysfsnosuid,noexec,nodev00
devpts/dev/ptsdevptsgid=5,mode=62000
tmpfs/runtmpfsdefaults00
devtmpfs/devdevtmpfsmode=0755,nosuid00
#End/etc/fstab
EOF
7.9重新编译内核,此次编译要编译本机的硬件驱动,如网卡,硬盘
(注:要删除原来编译过的文件)
makemrproper
makemunconfig
选择适应自身的硬件驱动!否则会导致开机不成功!本人已经在这里浪费了大量时间。当所有都编译了,开机不成功,当时自杀的念头也存在了。
可以导致开机不成功,如硬盘,文件系统。
A.以VMWare9.0为基础虚拟的硬件来配置内核
如果在建立虚拟机的时候是选择的BusLogic的SCSI磁盘,那么应该在DeviceDrivers->SCSIdevicesupport->SCSIlow-leveldrivers下加入BusLogicSCSIsupport的支持,可以采用编译到内核来避免未用initrd脚本来加载模块而导致启动失败
B.因之前采用的是ext4文件系统,因此在FileSystems->ext4support加入ext4的支持,可以采用编译到内核来避免未用initrd脚本来加载模块而导致启动失败
C.网上驱动,支持网络则应该在DeviceDrivers->Networkingsupport->Ethernet(10or100Mbit)加入Internetsupport的支持,可以采用编译到内核也可以编译成模块的方式
makemodules_install
cp-varch/x86/boot/bzImage/boot/vmlinuz-3.10.10-lfs-7.4
cp-vSystem.map/boot/System.map-3.10.10
cp-v.config/boot/config-3.10.10
install-d/usr/share/doc/linux-3.10.10
cp-rDocumentation/*/usr/share/doc/linux-3.10.10
7.10配置LINUX下的USB
install-v-m755-d/etc/modprobe.d
cat>/etc/modprobe.d/usb.conf<<"EOF"
#Begin/etc/modprobe.d/usb.conf
installohci_hcd/sbin/modprobeehci_hcd;/sbin/modprobe-iohci_hcd;true
installuhci_hcd/sbin/modprobeehci_hcd;/sbin/modprobe-iuhci_hcd;true
#End/etc/modprobe.d/usb.conf
EOF
7.11加载GRUB文件
grub-install/dev/sda
7.12配置GRUB启动文件
cat>/boot/grub/grub.cfg<<"EOF"
#Begin/boot/grub/grub.cfg
setdefault=0
settimeout=5
insmodext2
setroot=(hd0,4)
menuentry"GNU/Linux,Linux3.10.10-lfs-7.4"{
linux/boot/vmlinuz-3.10.10-lfs-7.4root=/dev/sda4ro
}
EOF
(注:此小节红色文字中的hd0,4;/dev/sda4,应填写原来划分分区号)
7.13创建lfs-release
echoSVN-20121118>/etc/lfs-release
创建一个文件显示你的系统符合Linux基础标准(LSB)运行:
cat>/etc/lsb-release<<"EOF"
DISTRIB_ID="LinuxFromScratch"
DISTRIB_RELEASE="SVN-20121118"
DISTRIB_CODENAME="<YourName>"
DISTRIB_DESCRIPTION="LinuxFromScratch"
EOF
7.14退出chroot模式
logout
7.16卸载lfs文件系统(注:如果不卸载可能会导致关机不正常!)
umount-v$LFS
7.15重启系统
reboot
8.1安装OPENSSL(本文用LFS建议的版本,OpenSSL-1.0.1e)
在LFS官网下载两个补丁包(如果不用这补丁包,那就完蛋!)
解压OpenSSL-1.0.1e.tar.gz
tarxvfOpenSSL-1.0.1e
cdOpenSSL-1.0.1e/
打补丁
patch-Np1-i../openssl-1.0.1e-fix_parallel_build-1.patch
patch-Np1-i../openssl-1.0.1e-fix_pod_syntax-1.patch
编译
./config�Cpreifx=/usr/local/opensslshared
make
测试
maketest(注:这步不能跳过!!!)
安装程序包
makeinstall
把链接库拷贝到/usr/lib/(注:此步关系到能不能编译openssh!很重要!)
cp/usr/local/openssl/lib/*/usr/lib/
更新链接库
ldconfig
8.2安装openssh(注:LFS官网建议使用OpenSSH-6.3p1)
解压
tarxvfOpenSSH-6.3p1.tar.gz
cdOpenSSH-6.3p1/
编译(注:指定OPENSSL的选项不能少!!否则编译不成功!!!)
./configure�Cprefix=/usr/local/openssh�Cwith-ssl-dir=/usr/local/openssl--with-ssl-headers=/usr/local/ssl/include/--with-ssl-lib=/usr/local/ssl/lib/
安装
make&&makeinstall
总结:编译LFS一个很复杂的过程,如有一步不慎,可能会全盘皆输。当然,在某个“重大”的过程,少不了用用快照这个功能,这功能对于编译LFS是一个很好的工具。编译好LFS之后,又高兴又失落,浪费了整整一周的时间。重新编译次数巨大,编译内核时间占据比较大。
本文出自 “傻菜鸟” 博客,谢绝转载!