centos 6.3_x64编译7.4 LFS

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之后,又高兴又失落,浪费了整整一周的时间。重新编译次数巨大,编译内核时间占据比较大。

本文出自 “傻菜鸟” 博客,谢绝转载!

你可能感兴趣的:(centos,lfs,lfs,编译LFS,编译7.4,6.3编译)