LFS8.0完全安装搭建制作教程

前言
楼主用了半个月才装好,由于软件包不准确浪费了3天的时间,因此搭建的话务必要验证软件包完整性。
内核用了4天,想尽各种方法和可能,结果是iscsi驱动没有包含在内核中,导致每次都开不了机。
下面链接包含软件包和内核,虚拟机是vmware12的,应该可用。主要参考官方文档http://www.linuxfromscratch.org/lfs/view/stable/
链接:http://pan.baidu.com/s/1boWo6nX 密码:02wc
一、安装虚拟机与安装CentOS系统
搭建主机系统为CentOS6.6,最小化安装。

二、检测运行环境是否符合需求
##############################脚本开始##############################
cat > version-check.sh << "EOF"
#!/bin/bash
# Simple script to list version numbers of critical development tools
export LC_ALL=C
bash --version | head -n1 | cut -d" " -f2-4
MYSH=$(readlink -f /bin/sh)
echo "/bin/sh -> $MYSH"
echo $MYSH | grep -q bash || echo "ERROR: /bin/sh does not point to bash"
unset MYSH

echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3-
bison --version | head -n1

if [ -h /usr/bin/yacc ]; then
echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`";
elif [ -x /usr/bin/yacc ]; then
echo yacc is `/usr/bin/yacc --version | head -n1`
else
echo "yacc not found"
fi

bzip2 --version 2>&1 < /dev/null | head -n1 | cut -d" " -f1,6-
echo -n "Coreutils: "; chown --version | head -n1 | cut -d")" -f2
diff --version | head -n1
find --version | head -n1
gawk --version | head -n1

if [ -h /usr/bin/awk ]; then
echo "/usr/bin/awk -> `readlink -f /usr/bin/awk`";
elif [ -x /usr/bin/awk ]; then
echo awk is `/usr/bin/awk --version | head -n1`
else
echo "awk not found"
fi

gcc --version | head -n1
g++ --version | head -n1
ldd --version | head -n1 | cut -d" " -f2- # glibc version
grep --version | head -n1
gzip --version | head -n1
cat /proc/version
m4 --version | head -n1
make --version | head -n1
patch --version | head -n1
echo Perl `perl -V:version`
sed --version | head -n1
tar --version | head -n1
makeinfo --version | head -n1
xz --version | head -n1

echo 'int main(){}' > dummy.c && g++ -o dummy dummy.c
if [ -x dummy ]
then echo "g++ compilation OK";
else echo "g++ compilation failed"; fi
rm -f dummy.c dummy
EOF

bash version-check.sh


cat > library-check.sh << "EOF"#!/bin/bashfor lib in lib{gmp,mpfr,mpc}.la; do echo $lib: $(if find /usr/lib* -name $lib| grep -q $lib;then :;else echo not;fi) founddoneunset libEOFbash library-check.sh
##############################脚本结束##############################

检测完成后将得到各个所需要的软件的版本,至此,显示“未找到命令”的则为未安装软件,请安装满足需求。
还要查看对应版本号是否达到官方手册中的软件需求的标准,旧版本的软件需要升级。

##############################版本要求##############################
  • Bash-3.2 (/bin/sh should be a symbolic or hard link to bash)
  • Binutils-2.17 (Versions greater than 2.27 are not recommended as they have not been tested)
  • Bison-2.3 (/usr/bin/yacc should be a link to bison or small script that executes bison)
  • Bzip2-1.0.4
  • Coreutils-6.9
  • Diffutils-2.8.1
  • Findutils-4.2.31
  • Gawk-4.0.1 (/usr/bin/awk should be a link to gawk)
  • GCC-4.7 including the C++ compiler, g++ (Versions greater than 6.3.0 are not recommended as they have not been tested)
  • Glibc-2.11 (Versions greater than 2.25 are not recommended as they have not been tested)
  • Grep-2.5.1a
  • Gzip-1.3.12
  • Linux Kernel-2.6.32
The reason for the kernel version requirement is that we specify that version when building glibc in Chapter 6 at the recommendation of the developers. It is also required by udev.
If the host kernel is earlier than 2.6.32 you will need to replace the kernel with a more up to date version. There are two ways you can go about this. First, see if your Linux vendor provides a 2.6.32 or later kernel package. If so, you may wish to install it. If your vendor doesn't offer an acceptable kernel package, or you would prefer not to install it, you can compile a kernel yourself. Instructions for compiling the kernel and configuring the boot loader (assuming the host uses GRUB) are located in  Chapter 8 .
  • M4-1.4.10
  • Make-3.81
  • Patch-2.5.4
  • Perl-5.8.8
  • Sed-4.1.5
  • Tar-1.22
  • Texinfo-4.7
  • Xz-5.0.0
##############################版本要求##############################
搭建主机系统为CentOS6.6,最小化安装,因此需要安装缺少的软件:
yum install epel-release -y
yum install gcc bison binutils byacc perl patch xz texinfo gcc-c++ -y
yum install gmp-devel mpfr-devel libmpc-devel -y

三、运行环境与条件
1.设置变量
export LFS=/mnt/lfs
2.创建新的文件系统并挂载
创建系统分区,并格式化为ext4,创建目录/mnt/lfs,将/dev/sda5挂载到/mnt/lfs
fidsk /dev/sda
mkfs.ext4 /dev/sda5
mkdir -pv $LFS
mount -v -t ext4 /dev/sda5 $LFS
3.在LFS分区下创建sources目录
在$LFS下创建目录sources供软件下载与存放,并将权限设置为可写与sticky
mkdir -v $LFS/sources
chmod -v a+wt $LFS/sources
4.下载软件包
下载软件列表wget-list,并下载wget-list列表里的软件包
wget http://www.linuxfromscratch.org/lfs/view/8.0/wget-list
wget --input-file=wget-list --continue --directory-prefix=$LFS/sources
检查软件包正确性(重要)
pushd $LFS/sourcesmd5sum -c md5sumspopd
5.在LFS分区下创建tools目录
在$LFS下创建目录tools供软件的布署,并将其链接到主机/tools上
mkdir -v $LFS/tools
ln -sv $LFS/tools /
6.创建lfs组和用户
groupadd lfs
useradd -s /bin/bash -g lfs -m -k /dev/null lfs
passwd lfs
7.设置$LFS下文件拥有者
chown -v lfs $LFS/tools
chown -v lfs $LFS/sources
8.设置用户环境
切换到lfs用户
su - lfs
##############################脚本开始##############################
cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF
source ~/.bash_profile
cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL LFS_TGT PATH
EOF
source ~/.bashrc
##############################脚本结束##############################
export命令查看输出
declare -x HOME="/home/lfs"
declare -x LC_ALL="POSIX"
declare -x LFS="/lfs"
declare -x OLDPWD
declare -x PATH="/tools/bin:/bin:/usr/bin"
declare -x PS1="\\u:\\w\\\$ "
declare -x PWD="/home/lfs"
declare -x SHLVL="1"
declare -x TERM="linux"
测试变量是否正常
echo $LFS
echo $LFS_TGT

四、构建一个临时系统
1.Binutils
cd $LFS/sources
tar xvf binutils-2.27.tar.bz2
cd binutils-2.27
mkdir -v build
cd build
../configure --prefix=/tools \
--with-sysroot=$LFS \
--with-lib-path=/tools/lib \
--target=$LFS_TGT \
--disable-nls \
--disable-werror
make
#x86_64需要创建链接到/tools/lib64
##############################脚本开始##############################
case $(uname -m) in
x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;;
esac
##############################脚本结束##############################
make install
2.GCC
cd $LFS/sources
tar xvf gcc-6.3.0.tar.bz2
cd gcc-6.3.0
#安装GCC需要的GMP,MPFR,MPC
tar xvf ../gmp-6.1.2.tar.xz
mv -v gmp-6.1.2 gmp
tar xvf ../mpfr-3.1.5.tar.xz
mv -v mpfr-3.1.5/ mpfr
tar -zxvf ../mpc-1.0.3.tar.gz
mv -v mpc-1.0.3 mpc
#设置64位库默认目录名称为lib
##############################脚本开始##############################
cd $LFS/sources/gcc-6.3.0/
for file in gcc/config/{linux,i386/linux{,64}}.hdo cp -uv $file{,.orig} sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \ -e 's@/usr@/tools@g' $file.orig > $file echo '#undef STANDARD_STARTFILE_PREFIX_1#undef STANDARD_STARTFILE_PREFIX_2#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file touch $file.origdone

case $(uname -m) in x86_64) sed -e '/m64=/s/lib64/lib/' \ -i.orig gcc/config/i386/t-linux64 ;;esac
##############################脚本结束##############################
#编译安装gcc
mkdir -v build
cd build
../configure --target=$LFS_TGT --prefix=/tools --with-glibc-version=2.12 --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-libatomic --disable-libgomp --disable-libmpx --disable-libquadmath --disable-libssp --disable-libvtv --disable-libstdcxx --enable-languages=c,c++
make && make install
3.Linux-4.9.9
cd $LFS/sources
tar xvf linux-4.9.9.tar.xz
cd linux-4.9.9
make mrproper
make INSTALL_HDR_PATH=dest headers_install
cp -rv dest/include/* /tools/include
4.Glibc
cd $LFS/sources
tar xvf glibc-2.25.tar.xz
cd glibc-2.25
mkdir -v build
cd build
#编译安装
../configure --prefix=/tools --host=$LFS_TGT --build=$(../scripts/config.guess) --enable-kernel=2.6.32 --with-headers=/tools/include libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes
make && make install
#执行一个检测脚本
##############################脚本开始##############################
echo 'int main(){}' > dummy.c$LFS_TGT-gcc dummy.creadelf -l a.out | grep ': /tools'
##############################脚本结束##############################
不正常则显示空白。
正常执行则输出的最后一行显示:
[Requesting program interpreter: /tools/lib/ld-linux.so.2]
64位则是:
[Requesting program interpreter:/tools/lib64/ld-linux-x86-64.so.2]
一切正常,则清理测试文件:
rm -v dummy.c a.out
5.Libstdc++
cd $LFS/sources/gcc-6.3.0/build
rm -rf *
../libstdc++-v3/configure \ --host=$LFS_TGT \ --prefix=/tools \ --disable-multilib \ --disable-nls \ --disable-libstdcxx-threads \ --disable-libstdcxx-pch \ --with-gxx-include-dir=/tools/$LFS_TGT/include/c++/6.3.0
make && make install
6.Binutils-pass2
cd $LFS/sources/binutils-2.27/build
rm -rf *
CC=$LFS_TGT-gcc \AR=$LFS_TGT-ar \RANLIB=$LFS_TGT-ranlib \../configure \ --prefix=/tools \ --disable-nls \ --disable-werror \ --with-lib-path=/tools/lib \ --with-sysroot
make && make install
make -C ld cleanmake -C ld LIB_PATH=/usr/lib:/libcp -v ld/ld-new /tools/bin
7.GCC-pass2
rm -rf $LFS/sources/gcc-6.3.0
tar xvf gcc-6.3.0.tar.bz2
cd $LFS/sources/gcc-6.3.0
cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \ `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h
改变gcc的动态链接器的默认位置
for file in gcc/config/{linux,i386/linux{,64}}.hdo cp -uv $file{,.orig} sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \ -e 's@/usr@/tools@g' $file.orig > $file echo '#undef STANDARD_STARTFILE_PREFIX_1#undef STANDARD_STARTFILE_PREFIX_2#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file touch $file.origdone
改变默认目录名为64位lib
case $(uname -m) in x86_64) sed -e '/m64=/s/lib64/lib/' \ -i.orig gcc/config/i386/t-linux64 ;;esac
解压gcc所需的GMP,MPFR,MPC
tar -xf ../mpfr-3.1.5.tar.xzmv -v mpfr-3.1.5 mpfrtar -xf ../gmp-6.1.2.tar.xzmv -v gmp-6.1.2 gmptar -xf ../mpc-1.0.3.tar.gzmv -v mpc-1.0.3 mpc
编译安装
mkdir build
cd build
rm -rf *
CC=$LFS_TGT-gcc \CXX=$LFS_TGT-g++ \AR=$LFS_TGT-ar \RANLIB=$LFS_TGT-ranlib \../configure \ --prefix=/tools \ --with-local-prefix=/tools \ --with-native-system-header-dir=/tools/include \ --enable-languages=c,c++ \ --disable-libstdcxx-pch \ --disable-multilib \ --disable-bootstrap \ --disable-libgomp
make && make install
许多程序用用到cc而不是gcc,所以将gcc链接到cc
ln -sv gcc /tools/bin/cc
#执行一个检测脚本
##############################脚本开始##############################
echo 'int main(){}' > dummy.ccc dummy.creadelf -l a.out | grep ': /tools'
##############################脚本结束##############################
不正常则显示空白。
正常执行则输出的最后一行显示:
[Requesting program interpreter: /tools/lib/ld-linux.so.2]
64位则是:
[Requesting program interpreter:/tools/lib64/ld-linux-x86-64.so.2]
一切正常,则清理测试文件:
rm -v dummy.c a.out
8.Tcl-core
cd $LFS/sources/
tar xvf tcl-core8.6.6-src.tar.gz
cd tcl8.6.6/unix
./configure --prefix=/tools
make
TZ=UTC make test
make install
chmod -v u+w /tools/lib/libtcl8.6.so
make install-private-headers
ln -sv tclsh8.6 /tools/bin/tclsh
9.Expect
cd $LFS/sources
tar xvf expect5.45.tar.gz
cd expect5.45
cp -v configure{,.orig}sed 's:/usr/local/bin:/bin:' configure.orig > configure
./configure --prefix=/tools \ --with-tcl=/tools/lib \ --with-tclinclude=/tools/include
make
make test
make SCRIPTS="" install
10.DejaGNU
cd $LFS/sources
tar xvf dejagnu-1.6.tar.gz
cd dejagnu-1.6
./configure --prefix=/tools
make install
make check
11.Check
cd $LFS/sources
tar xvf check-0.11.0.tar.gz
cd check-0.11.0
PKG_CONFIG= ./configure --prefix=/tools
make
make check
make install
12.Ncurses
cd $LFS/sources
tar xvf ncurses-6.0.tar.gz
cd ncurses-6.0
sed -i s/mawk// configure
./configure --prefix=/tools \ --with-shared \ --without-debug \ --without-ada \ --enable-widec \ --enable-overwrite
make && make install
13.Bash
cd $LFS/sources
tar xvf bash-4.4.tar.gz
cd bash-4.4
./configure --prefix=/tools --without-bash-malloc
make
make tests
make install
ln -sv bash /tools/bin/sh
14.Bison
cd $LFS/sources
tar xvf bison-3.0.4.tar.xz
cd bison-3.0.4
./configure --prefix=/tools
make
make check
make install
15.Bzip2
cd $LFS/sources
tar xvf bzip2-1.0.6.tar.gz
cd bzip2-1.0.6
编译测试
make
安装
make PREFIX=/tools install
16.Coreutils
cd $LFS/sources
tar xvf coreutils-8.26.tar.xz
cd coreutils-8.26
./configure --prefix=/tools --enable-install-program=hostname
make
make RUN_EXPENSIVE_TESTS=yes check
make install
17.Diffutils
cd $LFS/sources
tar xvf diffutils-3.5.tar.xz
cd diffutils-3.5
./configure --prefix=/tools
make
make check
make install
18.File
cd $LFS/sources
tar xvf file-5.30.tar.gz
cd file-5.30
./configure --prefix=/tools
make
make check
make install
19.Findutils
cd $LFS/sources
tar xvf findutils-4.6.0.tar.gz
cd findutils-4.6.0
./configure --prefix=/tools
make
make check
make install
20.Gawk
cd $LFS/sources
tar xvf gawk-4.1.4.tar.xz
cd gawk-4.1.4
./configure --prefix=/tools
make
make check
make install
21.Gettext
cd $LFS/sources
tar xvf gettext-0.19.8.1.tar.xz
cd gettext-0.19.8.1
cd gettext-toolsEMACS="no" ./configure --prefix=/tools --disable-shared
make -C gnulib-libmake -C intl pluralx.cmake -C src msgfmtmake -C src msgmergemake -C src xgettext
cp -v src/{msgfmt,msgmerge,xgettext} /tools/bin
22.Grep
cd $LFS/sources
tar xvf grep-3.0.tar.xz
cd grep-3.0
./configure --prefix=/tools
make
make check
make install
23.Gzip
cd $LFS/sources
tar xvf gzip-1.8.tar.xz
cd gzip-1.8
./configure --prefix=/tools
make
make check
make install
24.M4
cd $LFS/sources
tar xvf m4-1.4.18.tar.xz
cd m4-1.4.18
./configure --prefix=/tools
make
make check
make install
25.Make
cd $LFS/sources
tar xvf make-4.2.1.tar.bz2
cd make-4.2.1
./configure --prefix=/tools --without-guile
make
make check
make install
26.Patch
cd $LFS/sources
tar xvf patch-2.7.5.tar.xz
cd patch-2.7.5
./configure --prefix=/tools
make
make check
make install
27.Perl
cd $LFS/sources
tar xvf perl-5.24.1.tar.bz2
cd perl-5.24.1
sh Configure -des -Dprefix=/tools -Dlibs=-lm
make
cp -v perl cpan/podlators/scripts/pod2man /tools/binmkdir -pv /tools/lib/perl5/5.24.1cp -Rv lib/* /tools/lib/perl5/5.24.1
28.Sed
cd $LFS/sources
tar xvf sed-4.4.tar.xz
cd sed-4.4
./configure --prefix=/tools
make
make check
make install
29.Tar
cd $LFS/sources
tar xvf tar-1.29.tar.xz
cd tar-1.29
./configure --prefix=/tools
make
make check
make install
30.Texinfo
cd $LFS/sources
tar xvf texinfo-6.3.tar.xz
cd texinfo-6.3
./configure --prefix=/tools
make
make check
make install
31.Util-linux
cd $LFS/sources
tar xvf util-linux-2.29.1.tar.xz
cd util-linux-2.29.1
./configure --prefix=/tools \ --without-python \ --disable-makeinstall-chown \ --without-systemdsystemunitdir \ PKG_CONFIG=""
make && make install
32.Xz
cd $LFS/sources
tar xvf xz-5.2.3.tar.xz
cd xz-5.2.3
./configure --prefix=/tools
make
make check
make install
33.删不必要的文件
删除调试用的可执行和库的链接
strip --strip-debug /tools/lib/*/usr/bin/strip --strip-unneeded /tools/{,s}bin/*
若想节省更多空间,可删除文档文件
rm -rf /tools/{,share}/{info,man,doc}
34.剥离
为了保证系统安全性,应该将权限设置给root用户
chown -R root:root $LFS/tools

五、构建一个LFS系统
1.准备虚拟内核文件系统
创建系统文件目录
mkdir -pv $LFS/{dev,proc,sys,run}
创建初始设备节点
mknod -m 600 $LFS/dev/console c 5 1mknod -m 666 $LFS/dev/null c 1 3
安装填充/dev
mount -v --bind /dev $LFS/dev
挂载虚拟内核文件系统
mount -vt devpts devpts $LFS/dev/pts -o gid=5,mode=620mount -vt proc proc $LFS/procmount -vt sysfs sysfs $LFS/sysmount -vt tmpfs tmpfs $LFS/run
在某些主机系统上/dev/shm是/run/shm的链接
if [ -h $LFS/dev/shm ]; then mkdir -pv $LFS/$(readlink $LFS/dev/shm)fi
2.进入Chroot环境
export LFS=/mnt/lfs
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
3.创建系统结构的目录
mkdir -pv /{bin,boot,etc/{opt,sysconfig},home,lib/firmware,mnt,opt}mkdir -pv /{media/{floppy,cdrom},sbin,srv,var}install -dv -m 0750 /rootinstall -dv -m 1777 /tmp /var/tmpmkdir -pv /usr/{,local/}{bin,include,lib,sbin,src}mkdir -pv /usr/{,local/}share/{color,dict,doc,info,locale,man}mkdir -v /usr/{,local/}share/{misc,terminfo,zoneinfo}mkdir -v /usr/libexecmkdir -pv /usr/{,local/}share/man/man{1..8}case $(uname -m) in x86_64) mkdir -v /lib64 ;;esacmkdir -v /var/{log,mail,spool}ln -sv /run /var/runln -sv /run/lock /var/lockmkdir -pv /var/{opt,cache,lib/{color,misc,locate},local}
4.创建必要的文件和链接
创建链接
ln -sv /tools/bin/{bash,cat,echo,pwd,stty} /binln -sv /tools/bin/perl /usr/binln -sv /tools/lib/libgcc_s.so{,.1} /usr/libln -sv /tools/lib/libstdc++.so{,.6} /usr/libsed 's/tools/usr/' /tools/lib/libstdc++.la > /usr/lib/libstdc++.laln -sv bash /bin/sh
ln -sv /proc/self/mounts /etc/mtab
创建/etc/passwd
cat > /etc/passwd << "EOF"root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/dev/null:/bin/falsedaemon:x:6:6:Daemon User:/dev/null:/bin/falsemessagebus:x:18:18:D-Bus Message Daemon User:/var/run/dbus:/bin/falsenobody:x:99:99:Unprivileged User:/dev/null:/bin/falseEOF
创建/etc/group
cat > /etc/group << "EOF"root:x:0:bin:x:1:daemonsys: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:adm:x:16:messagebus:x:18:systemd-journal:x:23:input:x:24:mail:x:34:nogroup:x:99:users:x:999:EOF
删除”我有 没有名字!”提示,启动一个新的shell
exec /tools/bin/bash --login +h
初始化日志文件和登录用户适当的权限
touch /var/log/{btmp,lastlog,faillog,wtmp}chgrp -v utmp /var/log/lastlogchmod -v 664 /var/log/lastlogchmod -v 600 /var/log/btmp
5.重建Linux内核API头部
cd /sources/linux-4.9.9
make mrproper
make INSTALL_HDR_PATH=dest headers_install
删除用不到的目录find dest/include \( -name .install -o -name ..install.cmd \) -deletecp -rv dest/include/* /usr/include
6.Man-pages
cd /sources
tar xvf man-pages-4.09.tar.xz
cd man-pages-4.09
make install
7.Glibc
(1)安装Glibc
cd /sources
rm -rf glibc-2.25
tar xvf glibc-2.25.tar.xz
cd glibc-2.25
patch -Np1 -i ../glibc-2.25-fhs-1.patch
64位链接脚本
##############################脚本开始##############################
case $(uname -m) in x86) ln -s ld-linux.so.2 /lib/ld-lsb.so.3 ;; x86_64) ln -s ../lib/ld-linux-x86-64.so.2 /lib64 ln -s ../lib/ld-linux-x86-64.so.2 /lib64/ld-lsb-x86-64.so.3 ;;esac
##############################脚本结束##############################
编译安装
mkdir build
cd build
../configure --prefix=/usr \ --enable-kernel=2.6.32 \ --enable-obsolete-rpc \ --enable-stack-protector=strong \ libc_cv_slibdir=/lib
make
make check
防止报错
touch /etc/ld.so.conf
make install
cp -v ../nscd/nscd.conf /etc/nscd.confmkdir -pv /var/cache/nscd
设置语言包
mkdir -pv /usr/lib/localelocaledef -i cs_CZ -f UTF-8 cs_CZ.UTF-8localedef -i de_DE -f ISO-8859-1 de_DElocaledef -i de_DE@euro -f ISO-8859-15 de_DE@eurolocaledef -i de_DE -f UTF-8 de_DE.UTF-8localedef -i en_GB -f UTF-8 en_GB.UTF-8localedef -i en_HK -f ISO-8859-1 en_HKlocaledef -i en_PH -f ISO-8859-1 en_PHlocaledef -i en_US -f ISO-8859-1 en_USlocaledef -i en_US -f UTF-8 en_US.UTF-8localedef -i es_MX -f ISO-8859-1 es_MXlocaledef -i fa_IR -f UTF-8 fa_IRlocaledef -i fr_FR -f ISO-8859-1 fr_FRlocaledef -i fr_FR@euro -f ISO-8859-15 fr_FR@eurolocaledef -i fr_FR -f UTF-8 fr_FR.UTF-8localedef -i it_IT -f ISO-8859-1 it_ITlocaledef -i it_IT -f UTF-8 it_IT.UTF-8localedef -i ja_JP -f EUC-JP ja_JPlocaledef -i ru_RU -f KOI8-R ru_RU.KOI8-Rlocaledef -i ru_RU -f UTF-8 ru_RU.UTF-8localedef -i tr_TR -f UTF-8 tr_TR.UTF-8localedef -i zh_CN -f GB18030 zh_CN.GB18030
make localedata/install-locales
(2)设置Glibc
因Glibc在网络环境下工作并不是很好,因此创建/etc/nsswitch.conf
##############################脚本开始##############################
cat > /etc/nsswitch.conf << "EOF"# Begin /etc/nsswitch.confpasswd: filesgroup: filesshadow: fileshosts: files dnsnetworks: filesprotocols: filesservices: filesethers: filesrpc: files# End /etc/nsswitch.confEOF
##############################脚本结束##############################
添加时区数据
tar -xf ../../tzdata2016j.tar.gzZONEINFO=/usr/share/zoneinfomkdir -pv $ZONEINFO/{posix,right}
##############################脚本开始##############################
for tz in etcetera southamerica northamerica europe africa antarctica \ asia australasia backward pacificnew systemv; do zic -L /dev/null -d $ZONEINFO -y "sh yearistype.sh" ${tz} zic -L /dev/null -d $ZONEINFO/posix -y "sh yearistype.sh" ${tz} zic -L leapseconds -d $ZONEINFO/right -y "sh yearistype.sh" ${tz}done
##############################脚本结束##############################
cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFOzic -d $ZONEINFO -p America/New_Yorkunset ZONEINFO
测试命令:tzselect
cp -v /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
(3)配置动态加载程序
默认从/lib/ld-linux.so.2搜索/lib和/usr/lib来加载程序运行需要的动态库文件。若要使用其他目录的库文件,则需要将它们添加到/etc/ld.so.conf中,动态加载程序才能发现它们。
加载额外的两个库到/etc/ld.so.conf
cat > /etc/ld.so.conf << "EOF"# Begin /etc/ld.so.conf/usr/local/lib/opt/libEOF
设置搜索目录的库配置文件
cat >> /etc/ld.so.conf << "EOF"# Add an include directoryinclude /etc/ld.so.conf.d/*.confEOFmkdir -pv /etc/ld.so.conf.d
8.调整工具链
mv -v /tools/bin/{ld,ld-old}mv -v /tools/$(uname -m)-pc-linux-gnu/bin/{ld,ld-old}mv -v /tools/bin/{ld-new,ld}ln -sv /tools/bin/ld /tools/$(uname -m)-pc-linux-gnu/bin/ld
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

测试1
echo 'int main(){}' > dummy.ccc dummy.c -v -Wl,--verbose &> dummy.logreadelf -l a.out | grep ': /lib'
正常则输出
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

测试2
grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
正常则输出
/usr/lib/../lib/crt1.o succeeded/usr/lib/../lib/crti.o succeeded/usr/lib/../lib/crtn.o succeeded

测试3
grep -B1 '^ /usr/include' dummy.log
正常则输出
#include <...> search starts here: /usr/include

测试4
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
正常则输出
SEARCH_DIR("/usr/lib")SEARCH_DIR("/lib")

测试5
grep "/lib.*/libc.so.6 " dummy.log
正常则输出
attempt to open /lib/libc.so.6 succeeded

测试6
grep found dummy.log
正常则输出
found ld-linux-x86-64.so.2 at /lib/ld-linux-x86-64.so.2

删除测试文件
rm -v dummy.c a.out dummy.log
9.Zlib
cd /sources
tar xvf zlib-1.2.11.tar.xz
cd zlib-1.2.11
./configure --prefix=/usr
make
make check
make install
mv -v /usr/lib/libz.so.* /libln -sfv ../../lib/$(readlink /usr/lib/libz.so) /usr/lib/libz.so
10.File
cd /sources
rm -rf file-5.30
tar xvf file-5.30.tar.gz
cd /sources/file-5.30
./configure --prefix=/usr
make
make check
make install
11.Binutils
cd /sources
rm -rf binutils-2.27
tar xvf binutils-2.27.tar.bz2
cd /sources/binutils-2.27
expect -c "spawn ls"
正常则输出
spawn ls
编译安装
mkdir buildcd build
../configure --prefix=/usr \ --enable-gold \ --enable-ld=default \ --enable-plugins \ --enable-shared \ --disable-werror \ --with-system-zlib
make tooldir=/usr
make -k check
make tooldir=/usr install
12.GMP
cd /sources
tar xvf gmp-6.1.2.tar.xz
cd gmp-6.1.2
./configure --prefix=/usr \ --enable-cxx \ --disable-static \ --docdir=/usr/share/doc/gmp-6.1.2
32位需要用ABI=32 ./configure ...
make
make html
make check 2>&1 | tee gmp-check-log
awk '/# PASS:/{total+=$3} ; END{print total}' gmp-check-log
确保190个测试全部通过
make installmake install-html
13.MPFR
cd /sources
tar xvf mpfr-3.1.5.tar.xz
cd mpfr-3.1.5
./configure --prefix=/usr \ --disable-static \ --enable-thread-safe \ --docdir=/usr/share/doc/mpfr-3.1.5
make
make html
make check
make installmake install-html
14.MPC
cd /sources
tar xvf mpc-1.0.3.tar.gz
cd mpc-1.0.3
./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/mpc-1.0.3
makemake html
make check
make installmake install-html
15.GCC
rm -rf /sources/gcc-6.3.0
cd /sources
tar xvf gcc-6.3.0.tar.bz2
cd /sources/gcc-6.3.0
64位系统需要更改lib的库名为64位
case $(uname -m) in x86_64) sed -e '/m64=/s/lib64/lib/' \ -i.orig gcc/config/i386/t-linux64 ;;esaccd build
rm -rf *
SED=sed \../configure --prefix=/usr \ --enable-languages=c,c++ \ --disable-multilib \ --disable-bootstrap \ --with-system-zlib
make
测试之前需要修改堆栈限制
ulimit -s 32768
make -k check
执行脚本查看测试结果
../contrib/test_summary
make install
ln -sv ../usr/bin/cpp /lib
ln -sv gcc /usr/bin/cc
install -v -dm755 /usr/lib/bfd-pluginsln -sfv ../../libexec/gcc/$(gcc -dumpmachine)/6.3.0/liblto_plugin.so \ /usr/lib/bfd-plugins/

测试1
echo 'int main(){}' > dummy.ccc dummy.c -v -Wl,--verbose &> dummy.logreadelf -l a.out | grep ': /lib'
正常则输出
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

测试2
grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
正常输出
/usr/lib/gcc/x86_64-pc-linux-gnu/6.3.0/../../../../lib/crt1.o succeeded/usr/lib/gcc/x86_64-pc-linux-gnu/6.3.0/../../../../lib/crti.o succeeded/usr/lib/gcc/x86_64-pc-linux-gnu/6.3.0/../../../../lib/crtn.o succeeded

测试3
grep -B4 '^ /usr/include' dummy.log
正常输出
#include <...> search starts here: /usr/lib/gcc/x86_64-pc-linux-gnu/6.3.0/include /usr/local/include /usr/lib/gcc/x86_64-pc-linux-gnu/6.3.0/include-fixed /usr/include

测试4
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
64位正常输出
SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib64")SEARCH_DIR("/usr/local/lib64")SEARCH_DIR("/lib64")SEARCH_DIR("/usr/lib64")SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib")SEARCH_DIR("/usr/local/lib")SEARCH_DIR("/lib")SEARCH_DIR("/usr/lib");
32位正常输出
SEARCH_DIR("/usr/i686-pc-linux-gnu/lib32")SEARCH_DIR("/usr/local/lib32")SEARCH_DIR("/lib32")SEARCH_DIR("/usr/lib32")SEARCH_DIR("/usr/i686-pc-linux-gnu/lib")SEARCH_DIR("/usr/local/lib")SEARCH_DIR("/lib")SEARCH_DIR("/usr/lib");

测试5
grep "/lib.*/libc.so.6 " dummy.log
正常输出
attempt to open /lib/libc.so.6 succeeded

测试6
grep found dummy.log
正常输出
found ld-linux-x86-64.so.2 at /lib/ld-linux-x86-64.so.2

删除测试文件
rm -v dummy.c a.out dummy.log

移动错位的文件
mkdir -pv /usr/share/gdb/auto-load/usr/libmv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib
16.Bzip2
cd /sources
rm -rf bzip2-1.0.6
tar xvf bzip2-1.0.6.tar.gz
cd bzip2-1.0.6
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
make -f Makefile-libbz2_somake clean
make
make PREFIX=/usr install
cp -v bzip2-shared /bin/bzip2cp -av libbz2.so* /libln -sv ../../lib/libbz2.so.1.0 /usr/lib/libbz2.sorm -v /usr/bin/{bunzip2,bzcat,bzip2}ln -sv bzip2 /bin/bunzip2ln -sv bzip2 /bin/bzcat
17.Pkg-config
cd /sources
tar zxvf pkg-config-0.29.1.tar.gz
cd pkg-config-0.29.1
./configure --prefix=/usr \ --with-internal-glib \ --disable-compile-warnings \ --disable-host-tool \ --docdir=/usr/share/doc/pkg-config-0.29.1
make
make check
make install
18.Ncurses
cd /sources
rm -rf ncurses-6.0
tar xvf ncurses-6.0.tar.gz
cd ncurses-6.0
sed -i '/LIBTOOL_INSTALL/d' c++/Makefile.in
./configure --prefix=/usr \ --mandir=/usr/share/man \ --with-shared \ --without-debug \ --without-normal \ --enable-pc-files \ --enable-widec
make
make install
将库文件移到/lib,并做链接
mv -v /usr/lib/libncursesw.so.6* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libncursesw.so) /usr/lib/libncursesw.so
骗过查找“无界字符”的程序
for lib in ncurses form panel menu ; do rm -vf /usr/lib/lib${lib}.so echo "INPUT(-l${lib}w)" > /usr/lib/lib${lib}.so ln -sfv ${lib}w.pc /usr/lib/pkgconfig/${lib}.pcdone
确保旧程序能找到-lcurses
rm -vf /usr/lib/libcursesw.soecho "INPUT(-lncursesw)" > /usr/lib/libcursesw.soln -sfv libncurses.so /usr/lib/libcurses.so
安装文档文件
mkdir -v /usr/share/doc/ncurses-6.0cp -v -R doc/* /usr/share/doc/ncurses-6.0

若是想用5版本,再构建包
make distclean./configure --prefix=/usr \ --with-shared \ --without-normal \ --without-debug \ --without-cxx-binding \ --with-abi-version=5 make sources libscp -av lib/lib*.so.5* /usr/lib
19.Attr
cd /sources
tar xvf attr-2.4.47.src.tar.gz
cd attr-2.4.47
sed -i -e 's|/@pkg_name@|&-@pkg_version@|' include/builddefs.in
sed -i -e "/SUBDIRS/s|man[25]||g" man/Makefile
./configure --prefix=/usr \ --bindir=/bin \ --disable-static
make
make -j1 tests root-tests
make install install-dev install-libchmod -v 755 /usr/lib/libattr.so
mv -v /usr/lib/libattr.so.* /libln -sfv ../../lib/$(readlink /usr/lib/libattr.so) /usr/lib/libattr.so
20.Acl
cd /sources
tar xvf acl-2.2.52.src.tar.gz
cd acl-2.2.52
sed -i -e 's|/@pkg_name@|&-@pkg_version@|' include/builddefs.in
sed -i "s:| sed.*::g" test/{sbits-restore,cp,misc}.test
sed -i -e "/TABS-1;/a if (x > (TABS-1)) x = (TABS-1);" \ libacl/__acl_to_any_text.c
./configure --prefix=/usr \ --bindir=/bin \ --disable-static \ --libexecdir=/usr/lib
make
make install install-dev install-libchmod -v 755 /usr/lib/libacl.so
mv -v /usr/lib/libacl.so.* /libln -sfv ../../lib/$(readlink /usr/lib/libacl.so) /usr/lib/libacl.so
21.Libcap
cd /sources
tar xvf libcap-2.25.tar.xz
cd libcap-2.25
sed -i '/install.*STALIBNAME/d' libcap/Makefile
make
make RAISE_SETFCAP=no lib=lib prefix=/usr installchmod -v 755 /usr/lib/libcap.so
mv -v /usr/lib/libcap.so.* /libln -sfv ../../lib/$(readlink /usr/lib/libcap.so) /usr/lib/libcap.so
22.Sed
cd /sources
rm -rf sed-4.4
tar xvf sed-4.4.tar.xz
cd sed-4.4
sed -i 's/usr/tools/' build-aux/help2mansed -i 's/panic-tests.sh//' Makefile.in
./configure --prefix=/usr --bindir=/bin
makemake html
make check
make installinstall -d -m755 /usr/share/doc/sed-4.4install -m644 doc/sed.html /usr/share/doc/sed-4.4
23.Shadow
cd /sources
tar xvf shadow-4.4.tar.xz
cd shadow-4.4
sed -i 's/groups$(EXEEXT) //' src/Makefile.infind man -name Makefile.in -exec sed -i 's/groups\.1 / /' {} \;find man -name Makefile.in -exec sed -i 's/getspnam\.3 / /' {} \;find man -name Makefile.in -exec sed -i 's/passwd\.5 / /' {} \;
sed -i -e 's@#ENCRYPT_METHOD DES@ENCRYPT_METHOD SHA512@' \ -e 's@/var/spool/mail@/var/mail@' etc/login.defs
若想支持Cracklib
sed -i 's@DICTPATH.*@DICTPATH\t/lib/cracklib/pw_dict@' etc/login.defs
sed -i 's/1000/999/' etc/useradd
编译安装
./configure --sysconfdir=/etc --with-group-name-max-length=32
make && make install
配置Shadow
mv -v /usr/bin/passwd /bin
pwconv
grpconv
sed -i 's/yes/no/' /etc/default/useradd
passwd root
24.Psmisc
cd /sources
tar xvf psmisc-22.21.tar.gz
cd psmisc-22.21
./configure --prefix=/usr
make
make install
mv -v /usr/bin/fuser /binmv -v /usr/bin/killall /bin
25.Iana
cd /sources
tar xvf iana-etc-2.30.tar.bz2
cd iana-etc-2.30
make && make install
26.M4
cd /sources
rm -rf m4-1.4.18
tar xvf m4-1.4.18.tar.xz
cd m4-1.4.18
./configure --prefix=/usr
make
make check
make install
27.Bison
cd /sources
rm -rf bison-3.0.4
tar xvf bison-3.0.4.tar.xz
cd bison-3.0.4
./configure --prefix=/usr --docdir=/usr/share/doc/bison-3.0.4
make & make install
28.Flex
cd /sources
tar xvf flex-2.6.3.tar.gz
cd flex-2.6.3
HELP2MAN=/tools/bin/true \./configure --prefix=/usr --docdir=/usr/share/doc/flex-2.6.3
make
make check
make install
ln -sv flex /usr/bin/lex
29.Grep
cd /sources
rm -rf grep-3.0
tar xvf grep-3.0.tar.xz
cd grep-3.0
./configure --prefix=/usr --bindir=/bin
make
make check
make install
30.Readline
cd /sources
tar xvf readline-7.0.tar.gz
cd readline-7.0
sed -i '/MV.*old/d' Makefile.insed -i '/{OLDSUFF}/c:' support/shlib-install
./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/readline-7.0
make SHLIB_LIBS=-lncurses
make SHLIB_LIBS=-lncurses install
mv -v /usr/lib/lib{readline,history}.so.* /libln -sfv ../../lib/$(readlink /usr/lib/libreadline.so) /usr/lib/libreadline.soln -sfv ../../lib/$(readlink /usr/lib/libhistory.so ) /usr/lib/libhistory.so
install -v -m644 doc/*.{ps,pdf,html,dvi} /usr/share/doc/readline-7.0
31.Bash
cd /sources
rm -rf bash-4.4
tar xvf bash-4.4.tar.gz
cd bash-4.4
patch -Np1 -i ../bash-4.4-upstream_fixes-1.patch
./configure --prefix=/usr \ --docdir=/usr/share/doc/bash-4.4 \ --without-bash-malloc \ --with-installed-readline
make
chown -Rv nobody .
su nobody -s /bin/bash -c "PATH=$PATH make tests"
make installmv -vf /usr/bin/bash /bin
exec /bin/bash --login +h
32.Bc
cd /sources
tar xvf bc-1.06.95.tar.bz2
cd bc-1.06.95
patch -Np1 -i ../bc-1.06.95-memory_leak-1.patch
./configure --prefix=/usr \ --with-readline \ --mandir=/usr/share/man \ --infodir=/usr/share/info
make
echo "quit" | ./bc/bc -l Test/checklib.b
make install
33.Libtool
cd /sources
tar xvf libtool-2.4.6.tar.xz
cd libtool-2.4.6
./configure --prefix=/usr
make
make check
make install
34.GDBM
cd /sources
tar xvf gdbm-1.12.tar.gz
cd gdbm-1.12
./configure --prefix=/usr \ --disable-static \ --enable-libgdbm-compat
make
make check
make install
35.Gperf
cd /sources
tar xvf gperf-3.0.4.tar.gz
cd gperf-3.0.4
./configure --prefix=/usr --docdir=/usr/share/doc/gperf-3.0.4
make
make -j1 check
make install
36.Expat
cd /sources
tar xvf expat-2.2.0.tar.bz2
cd expat-2.2.0
./configure --prefix=/usr --disable-static
make
make check
make install
install -v -dm755 /usr/share/doc/expat-2.2.0install -v -m644 doc/*.{html,png,css} /usr/share/doc/expat-2.2.0
37.Inetutils
cd /sources
tar xvf inetutils-1.9.4.tar.xz
cd inetutils-1.9.4
./configure --prefix=/usr \ --localstatedir=/var \ --disable-logger \ --disable-whois \ --disable-rcp \ --disable-rexec \ --disable-rlogin \ --disable-rsh \ --disable-servers
make
make check
make install
mv -v /usr/bin/{hostname,ping,ping6,traceroute} /binmv -v /usr/bin/ifconfig /sbin
38.Perl
cd /sources
rm -rf perl-5.24.1
tar xvf perl-5.24.1.tar.bz2
cd perl-5.24.1
echo "127.0.0.1 localhost $(hostname)" > /etc/hosts
export BUILD_ZLIB=Falseexport BUILD_BZIP2=0
sh Configure -des -Dprefix=/usr \ -Dvendorprefix=/usr \ -Dman1dir=/usr/share/man/man1 \ -Dman3dir=/usr/share/man/man3 \ -Dpager="/usr/bin/less -isR" \ -Duseshrplib
make
make -k test
make install
unset BUILD_ZLIB BUILD_BZIP2
39.XML::Parser
cd /sources
tar xvf XML-Parser-2.44.tar.gz
cd XML-Parser-2.44
perl Makefile.PL
make
make test
make install
40.Intltool
cd /sources
tar xvf intltool-0.51.0.tar.gz
cd intltool-0.51.0
sed -i 's:\\\${:\\\$\\{:' intltool-update.in
./configure --prefix=/usr
make
make check
make installinstall -v -Dm644 doc/I18N-HOWTO /usr/share/doc/intltool-0.51.0/I18N-HOWTO
41.Autoconf
cd /sources
tar xvf autoconf-2.69.tar.xz
cd autoconf-2.69
./configure --prefix=/usr
make
make check
make install
42.Automake
cd /sources
tar xvf automake-1.15.tar.xz
cd automake-1.15
sed -i 's:/\\\${:/\\\$\\{:' bin/automake.in
./configure --prefix=/usr --docdir=/usr/share/doc/automake-1.15
make
sed -i "s:./configure:LEXLIB=/usr/lib/libfl.a &:" t/lex-{clean,depend}-cxx.shmake -j4 check
make install
43.Xz
cd /sources
rm -rf xz-5.2.3
tar xvf xz-5.2.3.tar.xz
cd xz-5.2.3
./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/xz-5.2.3
make
make check
make installmv -v /usr/bin/{lzma,unlzma,lzcat,xz,unxz,xzcat} /binmv -v /usr/lib/liblzma.so.* /libln -svf ../../lib/$(readlink /usr/lib/liblzma.so) /usr/lib/liblzma.so
44.Kmod
cd /sources
tar xvf kmod-23.tar.xz
cd kmod-23
./configure --prefix=/usr \ --bindir=/bin \ --sysconfdir=/etc \ --with-rootlibdir=/lib \ --with-xz \ --with-zlib
make
make installfor target in depmod insmod lsmod modinfo modprobe rmmod; do ln -sfv ../bin/kmod /sbin/$targetdoneln -sfv kmod /bin/lsmod
45.Gettext
cd /sources
rm -rf gettext-0.19.8.1
tar xvf gettext-0.19.8.1.tar.xz
cd gettext-0.19.8.1
sed -i '/^TESTS =/d' gettext-runtime/tests/Makefile.in &&sed -i 's/test-lock..EXEEXT.//' gettext-tools/gnulib-tests/Makefile.in
./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/gettext-0.19.8.1
make
make check
make installchmod -v 0755 /usr/lib/preloadable_libintl.so
46.Procps-ng
cd /sources
tar xvf procps-ng-3.3.12.tar.xz
cd procps-ng-3.3.12
./configure --prefix=/usr \ --exec-prefix= \ --libdir=/usr/lib \ --docdir=/usr/share/doc/procps-ng-3.3.12 \ --disable-static \ --disable-kill
make
sed -i -r 's|(pmap_initname)\\\$|\1|' testsuite/pmap.test/pmap.expmake check
make install
mv -v /usr/lib/libprocps.so.* /libln -sfv ../../lib/$(readlink /usr/lib/libprocps.so) /usr/lib/libprocps.so
47.E2fsprogs
cd /sources
tar xvf e2fsprogs-1.43.4.tar.gz
cd e2fsprogs-1.43.4
mkdir -v buildcd build
LIBS=-L/tools/lib \CFLAGS=-I/tools/include \PKG_CONFIG_PATH=/tools/lib/pkgconfig \../configure --prefix=/usr \ --bindir=/bin \ --with-root-prefix="" \ --enable-elf-shlibs \ --disable-libblkid \ --disable-libuuid \ --disable-uuidd \ --disable-fsck
make
ln -sfv /tools/lib/lib{blk,uu}id.so.1 libmake LD_LIBRARY_PATH=/tools/lib check
make install
make install-libs
chmod -v u+w /usr/lib/{libcom_err,libe2p,libext2fs,libss}.a
gunzip -v /usr/share/info/libext2fs.info.gzinstall-info --dir-file=/usr/share/info/dir /usr/share/info/libext2fs.info
makeinfo -o doc/com_err.info ../lib/et/com_err.texinfoinstall -v -m644 doc/com_err.info /usr/share/infoinstall-info --dir-file=/usr/share/info/dir /usr/share/info/com_err.info
48.Coreutils
cd /sources
rm -rf coreutils-8.26
tar xvf coreutils-8.26.tar.xz
cd coreutils-8.26
patch -Np1 -i ../coreutils-8.26-i18n-1.patch
sed -i '/test.lock/s/^/#/' gnulib-tests/gnulib.mk
FORCE_UNSAFE_CONFIGURE=1 ./configure \ --prefix=/usr \ --enable-no-install-program=kill,uptime
FORCE_UNSAFE_CONFIGURE=1 make
make NON_ROOT_USERNAME=nobody check-root
echo "dummy:x:1000:nobody" >> /etc/group
chown -Rv nobody .
su nobody -s /bin/bash \ -c "PATH=$PATH make RUN_EXPENSIVE_TESTS=yes check"
sed -i '/dummy/d' /etc/group
make install
mv -v /usr/bin/{cat,chgrp,chmod,chown,cp,date,dd,df,echo} /binmv -v /usr/bin/{false,ln,ls,mkdir,mknod,mv,pwd,rm} /binmv -v /usr/bin/{rmdir,stty,sync,true,uname} /binmv -v /usr/bin/chroot /usr/sbinmv -v /usr/share/man/man1/chroot.1 /usr/share/man/man8/chroot.8sed -i s/\"1\"/\"8\"/1 /usr/share/man/man8/chroot.8
mv -v /usr/bin/{head,sleep,nice,test,[} /bin
49.Diffutils
cd /sources
rm -rf diffutils-3.5
tar xvf diffutils-3.5.tar.xz
cd diffutils-3.5
sed -i 's:= @mkdir_p@:= /bin/mkdir -p:' po/Makefile.in.in
./configure --prefix=/usr
make
make check
make install
50.Gawk
cd /sources
rm -rf gawk-4.1.4
tar xvf gawk-4.1.4.tar.xz
cd gawk-4.1.4
./configure --prefix=/usr
make
make check
make install
mkdir -v /usr/share/doc/gawk-4.1.4cp -v doc/{awkforai.txt,*.{eps,pdf,jpg}} /usr/share/doc/gawk-4.1.4
51.Findutils
cd /sources
rm -rf findutils-4.6.0
tar xvf findutils-4.6.0.tar.gz
cd findutils-4.6.0
sed -i 's/test-lock..EXEEXT.//' tests/Makefile.in
./configure --prefix=/usr --localstatedir=/var/lib/locate
make
make check
make install
mv -v /usr/bin/find /binsed -i 's|find:=${BINDIR}|find:=/bin|' /usr/bin/updatedb
52.Groff
cd /sources
tar xvf groff-1.22.3.tar.gz
cd groff-1.22.3
PAGE=A4 ./configure --prefix=/usr
make && make install
53.GRUB
cd /sources
tar xvf grub-2.02~beta3.tar.xz
cd grub-2.02~beta3
./configure --prefix=/usr \ --sbindir=/sbin \ --sysconfdir=/etc \ --disable-efiemu \ --disable-werror
make
make install
54.Less
cd /sources
tar xvf less-481.tar.gz
cd less-481
./configure --prefix=/usr --sysconfdir=/etc
make && make install
55.Gzip
cd /sources
rm -rf gzip-1.8
tar xvf gzip-1.8.tar.xz
cd gzip-1.8
./configure --prefix=/usr
make
make check
make install
mv -v /usr/bin/gzip /bin
56.IPRoute
cd /sources
tar xvf iproute2-4.9.0.tar.xz
cd iproute2-4.9.0
sed -i /ARPD/d Makefilesed -i 's/arpd.8//' man/man8/Makefilerm -v doc/arpd.sgml
sed -i 's/m_ipt.o//' tc/Makefile
make
make DOCDIR=/usr/share/doc/iproute2-4.9.0 install
57.Kbd
cd /sources
tar xvf kbd-2.0.4.tar.xz
cd kbd-2.0.4
patch -Np1 -i ../kbd-2.0.4-backspace-1.patch
sed -i 's/\(RESIZECONS_PROGS=\)yes/\1no/g' configuresed -i 's/resizecons.8 //' docs/man/man8/Makefile.in
PKG_CONFIG_PATH=/tools/lib/pkgconfig ./configure --prefix=/usr --disable-vlock
make
make check
make install
mkdir -v /usr/share/doc/kbd-2.0.4cp -R -v docs/doc/* /usr/share/doc/kbd-2.0.4
58.Libpipeline
cd /sources
tar xvf libpipeline-1.4.1.tar.gz
cd libpipeline-1.4.1
PKG_CONFIG_PATH=/tools/lib/pkgconfig ./configure --prefix=/usr
make
make check
make install
59.Make
cd /sources
rm -rf make-4.2.1
tar xvf make-4.2.1.tar.bz2
cd make-4.2.1
./configure --prefix=/usr
make
make check
make install
60.Patch
cd /sources
rm -rf patch-2.7.5
tar xvf patch-2.7.5.tar.xz
cd patch-2.7.5
./configure --prefix=/usr
make
make check
make install
61.Sysklogd
cd /sources
tar xvf sysklogd-1.5.1.tar.gz
cd sysklogd-1.5.1
sed -i '/Error loading kernel symbols/{n;n;d}' ksym_mod.csed -i 's/union wait/int/' syslogd.c
make
make BINDIR=/sbin install
设置Sysklogd
cat > /etc/syslog.conf << "EOF"# Begin /etc/syslog.confauth,authpriv.* -/var/log/auth.log*.*;auth,authpriv.none -/var/log/sys.logdaemon.* -/var/log/daemon.logkern.* -/var/log/kern.logmail.* -/var/log/mail.loguser.* -/var/log/user.log*.emerg *# End /etc/syslog.confEOF
62.Sysvinit
cd /sources
tar xvf sysvinit-2.88dsf.tar.bz2
cd sysvinit-2.88dsf
patch -Np1 -i ../sysvinit-2.88dsf-consolidated-1.patch
make -C src
make -C src install
设置启动文件
ln -s /etc/rc.d/init.d/*** /etc/rc.d/rc3.d/***
63.Eudev
cd /sources
tar xvf eudev-3.2.1.tar.gz
cd eudev-3.2.1
sed -r -i 's|/usr(/bin/test)|\1|' test/udev-test.pl
sed -i '/keyboard_lookup_key/d' src/udev/udev-builtin-keyboard.c
阻止硬编码到Eudev的二进制库文件
cat > config.cache << "EOF"HAVE_BLKID=1BLKID_LIBS="-lblkid"BLKID_CFLAGS="-I/tools/include"EOF
编译安装
./configure --prefix=/usr \ --bindir=/sbin \ --sbindir=/sbin \ --libdir=/usr/lib \ --sysconfdir=/etc \ --libexecdir=/lib \ --with-rootprefix= \ --with-rootlibdir=/lib \ --enable-manpages \ --disable-static \ --config-cache
LIBRARY_PATH=/tools/lib make
mkdir -pv /lib/udev/rules.dmkdir -pv /etc/udev/rules.d
make LD_LIBRARY_PATH=/tools/lib check
make LD_LIBRARY_PATH=/tools/lib install
tar -xvf ../udev-lfs-20140408.tar.bz2make -f udev-lfs-20140408/Makefile.lfs install
LD_LIBRARY_PATH=/tools/lib udevadm hwdb --update
64.Util-linux
cd /sources
rm -rf util-linux-2.29.1
tar xvf util-linux-2.29.1.tar.xz
cd util-linux-2.29.1
mkdir -pv /var/lib/hwclock
./configure ADJTIME_PATH=/var/lib/hwclock/adjtime \ --docdir=/usr/share/doc/util-linux-2.29.1 \ --disable-chfn-chsh \ --disable-login \ --disable-nologin \ --disable-su \ --disable-setpriv \ --disable-runuser \ --disable-pylibmount \ --disable-static \ --without-python \ --without-systemd \ --without-systemdsystemunitdir
make
chown -Rv nobody .su nobody -s /bin/bash -c "PATH=$PATH make -k check"
make install
65.Man-DB
cd /sources
tar xvf man-db-2.7.6.1.tar.xz
cd man-db-2.7.6.1
./configure --prefix=/usr \ --docdir=/usr/share/doc/man-db-2.7.6.1 \ --sysconfdir=/etc \ --disable-setuid \ --enable-cache-owner=bin \ --with-browser=/usr/bin/lynx \ --with-vgrind=/usr/bin/vgrind \ --with-grap=/usr/bin/grap \ --with-systemdtmpfilesdir=
make
make check
make install
66.Tar
cd /sources
rm -rf tar-1.29
tar xvf tar-1.29.tar.xz
cd tar-1.29
FORCE_UNSAFE_CONFIGURE=1 \./configure --prefix=/usr \ --bindir=/bin
make
make check
make installmake -C doc install-html docdir=/usr/share/doc/tar-1.29
67.Texinfo
cd /sources
rm -rf texinfo-6.3
tar xvf texinfo-6.3.tar.xz
cd texinfo-6.3
./configure --prefix=/usr --disable-static
make
make check
make install
make TEXMF=/usr/share/texmf install-tex
pushd /usr/share/inform -v dirfor f in * do install-info $f dir 2>/dev/nulldonepopd
68.Vim
cd /sources
tar xvf vim-8.0.069.tar.bz2
cd vim80/
echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h
sed -i '/call/{s/split/xsplit/;s/303/492/}' src/testdir/test_recover.vim
./configure --prefix=/usr
make
make -j1 test &> vim-test.log
make install
ln -sv vim /usr/bin/vifor L in /usr/share/man/{,*/}man1/vim.1; do ln -sv vim.1 $(dirname $L)/vi.1done
ln -sv ../vim/vim80/doc /usr/share/doc/vim-8.0.586
配置vim
cat > /etc/vimrc << "EOF"" Begin /etc/vimrcset nocompatibleset backspace=2set mouse=rsyntax onif (&term == "xterm") || (&term == "putty") set background=darkendif" End /etc/vimrcEOFtouch ~/.vimrc
69.再次剥离
logout
再次登录
chroot $LFS /tools/bin/env -i \ HOME=/root TERM=$TERM PS1='\u:\w\$ ' \ PATH=/bin:/usr/bin:/sbin:/usr/sbin \ /tools/bin/bash --login
二进制和库安全剥离
/tools/bin/find /usr/lib -type f -name \*.a \ -exec /tools/bin/strip --strip-debug {} ';'/tools/bin/find /lib /usr/lib -type f -name \*.so* \ -exec /tools/bin/strip --strip-unneeded {} ';'/tools/bin/find /{bin,sbin} /usr/{bin,sbin,libexec} -type f \ -exec /tools/bin/strip --strip-all {} ';'
70.清理
rm -rf /tmp/*
chroot "$LFS" /usr/bin/env -i \ HOME=/root TERM="$TERM" PS1='\u:\w\$ ' \ PATH=/bin:/usr/bin:/sbin:/usr/sbin \ /bin/bash --login
rm -f /usr/lib/lib{bfd,opcodes}.arm -f /usr/lib/libbz2.arm -f /usr/lib/lib{com_err,e2p,ext2fs,ss}.arm -f /usr/lib/libltdl.arm -f /usr/lib/libfl.arm -f /usr/lib/libfl_pic.arm -f /usr/lib/libz.a
六、系统配置
定义udev规则
bash /lib/udev/init-net-rules.sh
网络配置
cd /etc/sysconfig/cat > ifconfig.eth0 << "EOF"ONBOOT=yesIFACE=eth0SERVICE=ipv4-staticIP=192.168.1.2GATEWAY=192.168.1.1PREFIX=24BROADCAST=192.168.1.255EOF
DNS设置
cat > /etc/resolv.conf << "EOF"# Begin /etc/resolv.confnameserver 192.168.1.2# End /etc/resolv.confEOF
设置主机名
echo "<lfs>" > /etc/hostname
设置hosts文件
cat > /etc/hosts << "EOF"# Begin /etc/hosts (network card version)127.0.0.1 localhost# End /etc/hosts (network card version)EOF
设置inittab
cat > /etc/inittab << "EOF"# Begin /etc/inittabid:3:initdefault:si::sysinit:/etc/rc.d/init.d/rc Sl0:0:wait:/etc/rc.d/init.d/rc 0l1:S1:wait:/etc/rc.d/init.d/rc 1l2:2:wait:/etc/rc.d/init.d/rc 2l3:3:wait:/etc/rc.d/init.d/rc 3l4:4:wait:/etc/rc.d/init.d/rc 4l5:5:wait:/etc/rc.d/init.d/rc 5l6:6:wait:/etc/rc.d/init.d/rc 6ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r nowsu:S016:once:/sbin/sulogin1:2345:respawn:/sbin/agetty --noclear tty1 96002:2345:respawn:/sbin/agetty tty2 96003:2345:respawn:/sbin/agetty tty3 96004:2345:respawn:/sbin/agetty tty4 96005:2345:respawn:/sbin/agetty tty5 96006:2345:respawn:/sbin/agetty tty6 9600# End /etc/inittabEOF
设置时间
cat > /etc/sysconfig/clock << "EOF"# Begin /etc/sysconfig/clockUTC=1# Set this to any options you might need to give to hwclock,# such as machine hardware clock type for Alphas.CLOCKPARAMS=# End /etc/sysconfig/clockEOF
设置环境变量
cat > /etc/profile << "EOF"# Begin /etc/profile
export LANG=en_US.UTF-8
export INPUTRC=/etc/inputrc
alias ls="ls --color"
alias ll="ls -l"
export PS1='\u:\w\$ '
# End /etc/profileEOF
设置输入文件
cat > /etc/inputrc << "EOF"# Begin /etc/inputrc# Modified by Chris Lynn <roryo@roryo.dynup.net># Allow the command prompt to wrap to the next lineset horizontal-scroll-mode Off# Enable 8bit inputset meta-flag Onset input-meta On# Turns off 8th bit strippingset convert-meta Off# Keep the 8th bit for displayset output-meta On# none, visible or audibleset bell-style none# All of the following map the escape sequence of the value# contained in the 1st argument to the readline specific functions"\eOd": backward-word"\eOc": forward-word# for linux console"\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# for xterm"\eOH": beginning-of-line"\eOF": end-of-line# for Konsole"\e[H": beginning-of-line"\e[F": end-of-line# End /etc/inputrcEOF
设置shell文件
cat > /etc/shells << "EOF"# Begin /etc/shells/bin/sh/bin/bash# End /etc/shellsEOF
挂载配置文件
cat > /etc/fstab << "EOF"/dev/<xxx> / <fff> defaults 1 1/dev/<yyy> swap swap pri=1 0 0proc /proc proc nosuid,noexec,nodev 0 0sysfs /sys sysfs nosuid,noexec,nodev 0 0devpts /dev/pts devpts gid=5,mode=620 0 0tmpfs /run tmpfs defaults 0 0devtmpfs /dev devtmpfs mode=0755,nosuid 0 0EOF
七、创建可启动系统
挂载虚拟文件系统
export LFS=/mnt/lfs
mount -vt devpts devpts $LFS/dev/pts -ogid=5,mode=620
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
mount -vt tmpfs tmpfs $LFS/run
进入chroot环境
export LFS=/mnt/lfs
chroot $LFS /tools/bin/env -i \
HOME=/root TERM=$TERM PS1='\u:\w\$ ' \
PATH=/bin:/usr/bin:/sbin:/usr/sbin \
/tools/bin/bash --login
1.LFS-Bootscripts
cd /sources
tar xvf lfs-bootscripts-20150222.tar.bz2
cd lfs-bootscripts-20150222
make install
2.Linux内核
cd /sources
rm -rf linux-4.9.9
tar xvf linux-4.9.9.tar.xz
cd linux-4.9.9
make mrproper
make menuconfig
内核设置
最好是用宿主的内核设置,但是也有开不了机的情况,可以根据自己机器的硬件信息进行选择。
vmlinuz是内核文件,initrd是内核运行后才执行的组件,在内核选项中,* 表示编入内核,M表示加入组件。
像scsi磁盘相关之类的,应该编入内核。
有时在内核设置时无法设置为*,可以保存文件后再编辑.config文件。
虚拟机用到的设置
Processor type and features --->
[*] EFI stub support

Device Drivers --->
Generic Driver Options --->
[ ] Support for uevent helper

Device Drivers --->
<*> ATA/ATAPI/MFM/RLL support (DEPRECATED)
[*] Fusion MPT devices support --->全选

Device Drivers --->
[*] SCSI device support --->
[*] SCSI device support
[*] SCSI generic support
[*] SCSI low-level drivers --->
<*> BusLogic SCSI support
<*> VMware PVSCSI driver support
[*] LSI Logic New Generation RAID Device Drivers (NEW)
[*] LSI Logic Legacy MegaRAID Driver (NEW)
[*] LSI Logic MegaRAID SAS RAID Module (NEW)
[*] LSI MPT Fusion SAS 3.0 & SAS 2.0 Device Driver (NEW)
(128) LSI MPT Fusion SAS 2.0 Max number of SG Entries (16 - 256) 
(128) LSI MPT Fusion SAS 3.0 Max number of SG Entries (16 - 256) 
<*> Legacy MPT2SAS config option

Device Drivers --->
[*] Network device support --->
[*] Ethernet driver support --->
<*>AMD PCnet32 PCI support

Device Drivers --->
Graphics support --->
[*] DRM driver for VMware Virtual GPU

修改文件,将虚拟机SCSI的型号编入内核
vim .config
CONFIG_SCSI_SYM53C8XX_2=y

编译安装
sh -c 'yes "" | make oldconfig'
make
make modules_install
cp -v arch/x86/boot/bzImage /boot/vmlinuz-4.9.9-lfs-8.0
cp -v System.map /boot/System.map-4.9.9
cp -v .config /boot/config-4.9.9
install -d /usr/share/doc/linux-4.9.9cp -r Documentation/* /usr/share/doc/linux-4.9.9
install -v -m755 -d /etc/modprobe.d
cat > /etc/modprobe.d/usb.conf << "EOF"# Begin /etc/modprobe.d/usb.confinstall ohci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i ohci_hcd ; trueinstall uhci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i uhci_hcd ; true# End /etc/modprobe.d/usb.confEOF
3.使用GRUB引导
安装GRUB
grub-install /dev/sda
写入引导菜单
cat > /boot/grub/grub.cfg << "EOF"# Begin /boot/grub/grub.cfgset default=0set timeout=5insmod ext2set root=(hd0,2)menuentry "GNU/Linux, Linux 4.9.9-lfs-8.0" { linux /boot/vmlinuz-4.9.9-lfs-8.0 root=/dev/sda2 ro}EOF
4.完成重启
logout
umount -v $LFS/dev/ptsumount -v $LFS/devumount -v $LFS/runumount -v $LFS/procumount -v $LFS/sys
umount -v $LFS/usrumount -v $LFS/homeumount -v $LFS
shutdown -r now
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值