【Linux实用技术】LFS6.3构建实录
作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/
几点说明:
1. 本文档参考了 金步国在LinuxSir 上的文档和对 LFS 英文文档的翻译 。
2. 本文档只是一个 step by step,在 LFS 时,强烈建议本文档与 LFS6.3 英文文档同时打开以便对照查看,LFS英文文档是本文档的基础,而且上边许多原因和细节很有学习价值,在此为了简略一一略去,但并不代表没有意义,相反每一步背后的原因才是学习的关键。
3. LFS 对于初学 Linux的人是毒药酒,但是对于老鸟又过于简单(BLFS、CLFS或许才有实用价值),而我恰恰是介于两者中间的学习者,所以极为欢迎技术交流和拍砖:warmbupt@gmail.com,MSN:eudaemon@livemail.tw
4. 文档前边的 X.X 是对应英文文档的小节号,后来觉得麻烦而且没有必要就省去了。
5. 建议在此基础上进行BLFS,甚至进而打造自己带有图形界面的Livecd。
Warmbupt
Embedded IPPBX Technology Undergraduate Innovation Institution(EIUTI)
Beijing University of Posts and Telecommunications
++++++++++++++++++++++++以下为正文+++++++++++++++++++++++++++
版本:LFS-Book-6.3 ,使用官方的 lfslivecd-x86-6.3-r2145
安装环境为:
VMWare-6.02build
虚拟机内存:512M
虚拟机硬盘:IDE 8GB,上边已经有了一个 WindowsServer2003 使用了全部硬盘
(为了模仿真实情况,否则使用空虚拟机也太理想化了)
虚拟机网卡:Host-only
虚拟机 CD-ROM:lfslivecd-x86-6.3-r2145.iso
CPU:p-M 1.6G
没有 USB、串口以及声卡设备
===============================================
2.2.先准备分区:
利用分区软件 Paragon Partition Manager 服务器版分出一个 5.5G 的自由分区和
一个 400MB-500MB 的交换分区(注意在实际中,若你本来有 Linux 则可直接使
用它的 Swap 分区)
重启时更改下启动顺序,CDROM 在硬盘前。
开机:在 boot 处直接回车。
时区(Localtime):Asia/Shanghai,然后 Localtime
区域(Local):C (默认)[因为没有中文]
键盘布局(Keyboard):us
#cfdisk
选择 Freespace 那个
选择 primary 建立主分区
将 NTFS 的 Boot 标记去掉,然后将新建 Linux 分区标记为 Bootable
然后按 Write 后键入 yes 写入即可。
Quit
===============================================
2.3 在分区表上分区:
在 hda2(这个是新建分区,要看清楚~hda3 是交换分区)上建立 ext3 文件系统
#mke2fs –jv /dev/hda2
选择默认的记录大小即可。
创建交换分区:
mkswap /dev/hda3
===============================================
2.4 挂载新的 hda2 分区
切换到根目录,并指定 LFS 环境变量(纯属为了方便操作)
#cd /
#mkdir –pv /mnt/lfs
#export LFS=/mnt/lfs
#mount –v –t ext3 /dev/hda2 $LFS
激活交换分区:
/sbin/swapon –v /dev/hda3
===============================================
3.1 复制所有将要用到的源代码和补丁,并将 sources 目录设置为可写和 sticky 模
式
#mkdir –v $LFS/sources
#chmod -v a+wt $LFS/sources
#mkdir /mnt/cdrom
#mount –v /dev/cdrom /mnt/cdrom
#cp /mnt/cdrom/lfs-sources/* $LFS/sources
#umount /dev/cdrom
===============================================
4.2 创建$LFS/tools 目录[存放临时工具链]
#mkdir -v $LFS/tools
在宿主系统创建$LFS/tools 目录的软连接(符号链接)tools,
注意:是链接到宿主系统的根目录!
#ln -sv $LFS/tools /
===============================================
4.3 添加 LFS 组和用户
#groupadd lfs
#useradd -s /bin/bash -g lfs -m -k /dev/null lfs
修改其密码:
#passwd lfs
密码为 linuxtest(自己设的)
并且修改 root 密码
#passwd root
密码为 admin(自己设的)
修改$LFS/tools 和$LFS/sources 目录所有权
#chown –v lfs $LFS/tools
#chown –v lfs $LFS/sources
切换到 lfs 用户#su - lfs
===============================================
4.4 设置 bash 工作环境
1.建立文件.bash_profile)
#cat > ~/.bash_profile << "EOF"
>exec env -i HOME=$HOME TERM=$TERM PS1='/u:/w/$ ' /bin/bash
>EOF
设置 bash 工作环境 2(建立文件.bashrc)
#cat > ~/.bashrc << "EOF"
>set +h
>umask 022
>LFS=/mnt/lfs
>LC_ALL=POSIX
>PATH=/tools/bin:/bin:/usr/bin
>export LFS LC_ALL PATH
>EOF
运行.bash_profile 文件,以使刚刚配置的环境生效
$source ~/.bash_profile
=============================
Chapter 5.3. 构建临时编译环境[仅包含必要的工具,用于最终的 LFS 系统]
----------------------------------------------------------
构建这个小系统分两步进行:
第一步是构建一个新的不依赖于宿主系统的工具链(编译器、汇编器、连接器、
库文件以及一些有用的软件)
第二个步骤是利用这个工具链去构建其它基本的工具
本章中编译的文件将安装在 $LFS/tools 目录下,
这些软件包编译出来是起临时作用的,我们不希望这些软件和即将建立的 LFS
系统混杂在一起。
安装完每个软件包之后,删除其源文件和编译目录,除非另有特别的指令。
$cd $LFS/sources
=============================
Binutils-2.17 - Pass 1
-----------------------
解包
$tar xvjf $LFS/sources/binutils-2.17.tar.bz2
解包后的文件所在目录:$LFS/sources/binutils-2.17
但是我们要用一个另外的目录来编译它,而不是在源码目录中:
$mkdir $LFS/sources/binutils-build
$cd binutils-build
配置编译脚本
CC="gcc -B/usr/bin/" ../binutils-2.17/configure --prefix=/tools --disable-nls
--disable-werror
编译和安装(并且计算 SBU 的时间值)
$ time { make && make install;}
(P.S:我的机器是
Real 3m45.631s
User 1m35.300s
Sys 2m0.026s
)
为后面"锁定"glibc 准备连接器脚本
$make -C ld clean
$make -C ld LIB_PATH=/tools/lib
现在不能删除 Binutils 的编译目录和源码目录,我们在本章后面部份还要用到它
们,所以请别动它们。
------------------------------------
GCC-4.1.2 - Pass 1
------------------------------------
$cd $LFS/sources/
解包
$tar xvjf gcc-4.1.2.tar.bz2
解包后的文件所在目录:$LFS/sources/gcc-pass1/gcc-4.1.2
但是我们要用一个另外的目录来编译它,而不是在源码目录中:
$mkdir -v gcc-build
$ cd gcc-build
配置编译脚本
$CC="gcc -B/usr/bin/" ../gcc-4.1.2/configure --prefix=/tools /
--with-local-prefix=/tools --disable-nls --enable-shared /
--enable-languages=c
编译
$ time { make bootstrap;}
(P.S:我的机器是
Real 33m56.326s
User 28m35.945s
Sys 4m42.788s
)(手册中的 9.2SBU=34m36s 差不多~~,很可信的~,你要是双核什么的我就不
知道了~)
安装
$make install
创建/tools/bin/cc 的符号链接(软链接),因为许多程序和脚本试图运行 cc 而不是
gcc
$ln -s gcc /tools/bin/cc
------------------------------------
Linux-2.6.22.5 API Headers
------------------------------------
$cd $LFS/sources/
解包
$tar xvjf linux- 2.6.22.5.tar.bz2
$cd linux-2.6.22.5
安装步骤为
make mrproper
make headers_check
make INSTALL_HDR_PATH=dest headers_install
cp -rv dest/include/* /tools/include
------------------------------------
Glibc-2.5.1
------------------------------------
$cd $LFS/sources/
解包
解包后的文件所在目录:
$tar xvjf $LFS/sources/glibc-2.5.1.tar.bz2
我们要用一个另外的目录来编译它,而不是在源码目录中:
$mkdir glibc-build
$cd glibc-build
配置编译脚本
$ ../glibc-2.5.1/configure --prefix=/tools /
--disable-profile --enable-add-ons /
--enable-kernel=2.6.0 --with-binutils=/tools/bin /
--without-gd --with-headers=/tools/include /
--without-selinux
编译
$make
运行测试套件(出错不要紧)
$make check
安装,前两个命令用于修正缺少/tools/etc/ld.so.conf 文件的警告
$mkdir /tools/etc
$touch /tools/etc/ld.so.conf
$make install
------------------------------------
调整/测试工具连
------------------------------------
现在临时的 C 库已经安装好了,我们需要让本章随后编译的那些工具都连接到
这个库上。
为了实现这一目标,我们需要调整连接器脚本和编译器的 specs 文件。
新建连接。
#mv -v /tools/$(gcc –dumpmachine)/bin/{ld,ld-old}
#ln -sv /tools/bin/ld /tools/$(gcc –dumpmachine)/bin/ld
修正 GCC specs 文件,使它指向新的动态连接器
gcc -dumpspecs | sed 's@^/lib/ld-linux.so.2@/tools&@g' /
`dirname $(gcc -print-libgcc-file-name)`/specs
执行下面的命令,以防止主机的头文件污染了编译环境
$ GCC_INCLUDEDIR=`dirname $(gcc -print-libgcc-file-name)`/include &&
find ${GCC_INCLUDEDIR}/* -maxdepth 0 -xtype d -exec rm -rvf '{}' /; &&
rm -vf `grep -l "DO NOT EDIT THIS FILE" ${GCC_INCLUDEDIR}/*` &&
unset GCC_INCLUDEDIR
现在来检查一下新工具链的基本功能(编译和连接)是否正常:
$cd ~
$echo 'main(){}' > dummy.c
$cc dummy.c
$readelf -l a.out | grep ': /tools'
如果一切正常,应该不会出错,而且最后一个命令的结果是:
[Requesting program interpreter: /tools/lib/ld-linux.so.2]
尤其要注意 tools/lib 应该是我们的动态连接器的前缀。
如果你没看到上面的结果,那么就有大问题了。在改正之前,不要继续,因为没
什么意义。
大多数情况下,出错都是因为上面的 specs 文件没改对。
在确定一切正常后,删除测试文件:
$rm –v dummy.c a.out
----------------------------
Tcl-8.4.15
----------------------------
这个软件包和接下来安装的两个软件包(Expect 和 DejaGNU)是为了给运行 GCC
和 Binutils 的测试程序提供支持。
即使没有运行本章中测试程序(不是必需的),运行 Chapter 6 中的测试程序也需要
这些软件包。
$cd $LFS/sources/
解包
$tar xvzf tcl-8.4.15-src.tar.bz2
配置
$cd tcl8.4.15/unix
$./configure --prefix=/tools
编译、测试并安装
$make
$ TZ=UTC make test.(时间还是蛮久的,即使出错也没有什么大碍)
$make install
安装 TCL 的头文件:
$make install-private-headers
为 tclsh 创建一个必须的符号链接:
$ln -sv tclsh8.4 /tools/bin/tclsh
[注意]暂时不要删除 tcl8.4.9 的源码目录,下一个软件包需要里面的头文件。
------------------------------
Expect-5.43.0
------------------------------
$cd $LFS/sources/
解包
$tar xvzf expect-5.43.0.tar.bz2
切换目录,打补丁
$cd expect-5.43
$patch -Np1 -i ../expect-5.43.0-spawn-1.patch
配置,首先强迫配置程序使用/bin/stty 以保证工具链最后的测试正确
$cp configure{,.bak}
$sed 's:/usr/local/bin:/bin:' configure.bak > configure
进行配置:
./configure --prefix=/tools --with-tcl=/tools/lib /
--with-tclinclude=/tools/include --with-x=no
编译并安装
$make
$make test
$make SCRIPTS="" install
------------------------------
DejaGNU-1.4.4
------------------------------
$cd $LFS/sources/
解包
$tar xvzf dejagnu-1.4.4.tar.bz2
配置
$cd dejagnu-1.4.4
$./configure --prefix=/tools
编译并安装
$make install
测试:
$ make check.
------------------------------
GCC-4.1.2 - Pass 2
------------------------------
$cd $LFS/sources/
运行 GCC 和 Binutils 的测试套件,先测试主系统中 PTY 是否设置正常:
$expect -c "spawn ls"
正确的回答应当是“spawn ls”
如果如果你得到“The system has no more ptys. Ask your system administrator to
create more.”
说明主系统的 PTY 没设置好。这种情况下,运行 GCC 和 Binutils 的测试套件就
没什么意义了。
为了防止 fixinclude 脚本污染编译环境,执行下列命令:
$cp -v gcc-4.1.2/Makefile.in{,.orig}
$sed 's@/./fixinc/.sh@-c true@' gcc-4.1.2/Makefile.in.orig > gcc-4.1.2/Makefile.in
调整编译选项,
$cp -v gcc-4.1.2/Makefile.in{,.tmp}
$sed 's/^XCFLAGS =$/& -fomit-frame-pointer/' gcc-4.1.2/Makefile.in.tmp /
> gcc-4.1.2/Makefile.in
切换目录,打补丁[这两个补丁非常重要]
$cd gcc-4.1.2/
$patch -Np1 -i ../gcc-4.1.2-specs-1.patch
我们要用一个另外的目录来编译它,而不是在源码目录中:
$mkdir -v ../gcc-build2
$cd ../gcc-build2
编译前配置
../gcc-4.1.2/configure --prefix=/tools /
--with-local-prefix=/tools --enable-clocale=gnu /
--enable-shared --enable-threads=posix /
--enable-__cxa_atexit --enable-languages=c,c++ /
--disable-libstdcxx-pch
编译
$make
测试[-k 参数是让测试套件即使遇到错误也继续运行,直到完成]
$make -k check
查看测试结果[GCC 的测试套件非常详细,基本上是肯定会出错的,这个过程相当
漫长]
安装
$make install
再执行一次合理性检查
$cd ..
$echo 'main(){}' > dummy.c
$cc dummy.c
$readelf -l a.out | grep ': /tools'
如果一切正常,应该不会出错,而且最后一个命令的结果是:
[Requesting program interpreter: /tools/lib/ld-linux.so.2]
尤其要注意 tools/lib 应该是我们的动态连接器的前缀。
如果你没看到上面的结果,那么就有大问题了。在改正之前,不要继续,因为没
什么意义。
在确定一切正常后,删除测试文件:
$rm dummy.c a.out
---------------------------------------
Binutils-2.15.94.0.2.2 - Pass 2
---------------------------------------
$cd $LFS/sources/
$mkdir binutils-build2
$cd binutils-build2
编译前配置
$../binutils-2.17/configure --prefix=/tools /
--disable-nls --with-lib-path=/tools/lib
编译和安装
$make
$make check
$make install
为下一章的“再调整”阶段配置连接器
$make -C ld clean
$make -C ld LIB_PATH=/usr/lib:/lib
$cp -v ld/ld-new /tools/bin
请不要删除 Binutils 的源码和编译目录,保持这些目录的现状,下一章还需要用
到。
---------------------------------------
Ncurses-5.6
---------------------------------------
$cd $LFS/sources/
解包
$tar xvzf ncurses-5.6.tar.bz2
$cd ncurses-5.6
编译前配置
$ ./configure --prefix=/tools --with-shared /
--without-debug --without-ada --enable-overwrite
编译和安装
$make
$make install
--------------------------------
Bash-3.2
--------------------------------
$cd $LFS/sources/
解包
$tar xvjf $LFS/sources/bash-3.2.tar.bz2
切换目录,打补丁
$cd bash-3.2
$patch -Np1 -i ../bash-3.2-fixes-5.patch
编译前配置
$./configure --prefix=/tools --without-bash-malloc
编译并安装
$make
$make check
$make install
为那些用 sh 作为 shell 的程序创建符号链接:
$ln -vs bash /tools/bin/sh
-----------------------------
Bzip2-1.0.4
-----------------------------
$cd $LFS/sources/
解包
$tar -xvjf bzip2-1.0.4.tar.bz2
切换目录
$cd $LFS/sources/bzip2-1.0.4
Bzip2 没有 configure 脚本,用下面的命令直接编译和安装:
$make && make PREFIX=/tools install
------------------------------
Coreutils-5.2.1
------------------------------
$cd $LFS/sources/
解包
$tar -xvjf $LFS/sources/coreutils-5.2.1.tar.bz2 -C $LFS/sources/
切换目录,配置
$cd $LFS/sources/coreutils-5.2.1
编译并安装
$make
$make RUN_EXPENSIVE_TESTS=yes check
$make install
建立 su 链接
$cp -v src/su /tools/bin/su-tools
--------------------------------
Diffutils-2.8.1
--------------------------------
$cd $LFS/sources/
解包
$tar xvjf diffutils-2.8.1.tar.bz2
切换目录,配置
$cd $LFS/sources/diffutils-2.8.1
$./configure --prefix=/tools
编译并安装
$make && make install
--------------------------------
Findutils-4.2.31
--------------------------------
$cd $LFS/sources/
解包
$tar xvjf $LFS/sources/findutils-4.2.31.tar.bz2 -C $LFS/sources/
切换目录,配置
$cd $LFS/sources/findutils-4.2.31
$./configure --prefix=/tools
编译并安装
$make && make install
---------------------------------------
Gawk-3.1.5
---------------------------------------
$cd $LFS/sources/
解包
$tar xvjf gawk-3.1.5.tar.bz2
切换目录
$cd gawk-3.1.5
修补一个 BUG:
$cat >> config.h << "EOF"
#define HAVE_LANGINFO_CODESET 1
#define HAVE_LC_MESSAGES 1
EOF
配置
$./configure --prefix=/tools
编译并安装
$make && make install
--------------------------------
Gettext-0.16.1
--------------------------------
(这一节我是按照 6.1 编译的,因为 6.3 的第一步 Make 总是找不到,我也找不
到原因)
$cd $LFS/sources/
解包
$tar xvjf $LFS/sources/gettext-0.16.1.tar.bz2 -C $LFS/sources/
切换目录,配置
$cd $LFS/sources/gettext-0.16.1
$./configure --prefix=/tools --disable-libasprintf /
--without-csharp
编译并安装
$make
$make install
--------------------------------
Grep-2.5.1a
--------------------------------
$cd $LFS/sources/
解包
$tar -xvjf $LFS/sources/grep-2.5.1a.tar.bz2 -C $LFS/sources/
切换目录,配置
$cd $LFS/sources/grep-2.5.1a
$./configure --prefix=/tools --disable-perl-regexp
编译并安装
$make
$make check.
$make install
--------------------------------
Gzip-1.3.12
--------------------------------
$cd $LFS/sources/
解包
$tar -xvjf $LFS/sources/gzip-1.3.12.tar.bz2
切换目录,配置
$cd $LFS/sources/gzip-1.3.12
$./configure --prefix=/tools
编译并安装
$make
$make check.
$make install
--------------------------------
Make-3.81
--------------------------------
$cd $LFS/sources/
解包
$tar -xvjf $LFS/sources/make-3.81.tar.bz2
切换目录,配置
$cd $LFS/sources/make-3.81
$./configure --prefix=/tools
编译并安装
$make
$make check.
$make install
--------------------------------
Patch-2.5.4
--------------------------------
$cd $LFS/sources/
解包
$tar xvjf $LFS/sources/patch-2.5.4.tar.bz2
切换目录,配置
$cd $LFS/sources/patch-2.5.4
$./configure --prefix=/tools
编译并安装
$make && make install
--------------------------------
Perl-5.8.6
--------------------------------
$cd $LFS/sources/
解包
$tar -xvjf $LFS/sources/perl-5.8.8.tar.bz2 -C $LFS/sources/
切换目录,打补丁
$cd $LFS/sources/perl-5.8.8
$patch -Np1 -i $LFS/sources/perl-5.8.6-libc-2.patch
编译前配置['IO Fcntl POSIX'全是字母]
$./configure.gnu --prefix=/tools -Dstatic_ext='Data/Dumper Fcntl IO POSIX'
仅编译必须的工具:
$make perl utilities
复制这些工具及其库文件:
$cp -v perl pod/pod2man /tools/bin
$mkdir -pv /tools/lib/perl5/5.8.8
$cp -Rv lib/* /tools/lib/perl5/5.8.8
--------------------------------
Sed-4.1.5
--------------------------------
$cd $LFS/sources/
解包
$tar xvzf $LFS/sources/sed-4.1.5.tar.gz
切换目录,配置
$cd $LFS/sources/sed-4.1.5
$./configure --prefix=/tools
编译并安装
$make && make install
--------------------------------
Tar-1.18
--------------------------------
$cd $LFS/sources/
解包
$tar -xvjf $LFS/sources/tar-1.18.tar.bz2 -C $LFS/sources/
切换目录,配置
$cd $LFS/sources/tar-1.18
$./configure --prefix=/tools
编译并安装
$make && make install=
--------------------------------
Texinfo-4.9
--------------------------------
$cd $LFS/sources/
解包
$tar -xvjf $LFS/sources/texinfo-4.9.tar.bz2 -C $LFS/sources/
切换目录,配置
$cd $LFS/sources/texinfo-4.9
$./configure --prefix=/tools
编译并安装
$make && make install
--------------------------------
Util-linux-2.12r
--------------------------------
$cd $LFS/sources/
解包
$tar -xvjf $LFS/sources/util-linux-2.12r.tar.bz2 -C $LFS/sources/
切换目录
$cd $LFS/sources/util-linux-2.12r
默认的 Util-linux 并不使用刚才安装在/tools 目录下的头文件和库文件,我们更改
配置脚本来修正这个问题:
$sed -i 's@/usr/include@/tools/include@g' configure
配置
$./configure
编译一些支持例程:
$make -C lib
我们只需要这个软件包中的某些工具,因此只需要编译这几个工具就可以了:
$make -C mount mount umount
$make -C text-utils more
把这些程序复制到临时工具目录:
$cp –v mount/{,u}mount text-utils/more /tools/bin
------------------------------
可选步骤:系统清理
------------------------------
了解哪些东西是不必要的、可以删除的也是有好处的。
到目前为止已经安装的可执行程序和库文件包含大约 70MB 不必要的调试符号,
运行下面的命令删除这些符号:
$strip --strip-debug /tools/lib/*
$strip --strip-unneeded /tools/{,s}bin/*
删除文档还可以再节省 20MB 空间:
$rm -fr /tools/{info,man}
改变一下$LFS/tools 的所有者
$su root
$chown -R root:root $LFS/tools
如果你想休息一下,没问题,因为所有的临时工具都已经安装完毕。建议用虚拟
机的 snapshot 快照一下。
你可以安全的关闭电脑,下次用光盘重启后可以直接从第六章开始你的冒险之
旅。
但是之前不要忘记先挂载硬盘上必要的分区和环境变量 LFS
mkdir /mnt/lfs
mount /dev/hda2 /mnt/lfs
export LFS=/mnt/lfs
ln -s $LFS/tools
上接第一贴
=========================================================
因为所有的临时工具都已经安装完毕,可以安全的关闭电脑去休息一下。
但是请在开始第六章之前先使用 Live CD 开机,然后运行下列命令
$net-setup eth0
选择 eth0 后选择 DHCP 就可以得到一个地址了。(虚拟机就是好~~)
/etc/rc.d/init.d/sshd start
终于可以 putty 上了~可以复制粘贴了~
先设置好环境:
echo 'exec env -i HOME=$HOME TERM=$TERM PS1='/''/u:/w/$ '/'' /bin/bash' >
~/.bash_profile && /
echo 'set +h' > ~/.bashrc && /
echo 'umask 022' >> ~/.bashrc && /
echo 'LFS=/mnt/lfs' >> ~/.bashrc && /
echo 'LC_ALL=POSIX' >> ~/.bashrc && /
echo 'PATH=/tools/bin:/bin:/usr/bin' >> ~/.bashrc && /
echo 'export LFS LC_ALL PATH' >> ~/.bashrc && /
source ~/.bash_profile
=========================================================
第六章,安装基本的系统软件
=========================================================
安装前的准备工作(请先切换到 root 用户)
在新建的目录中挂载虚拟内核文件系统:
mkdir -pv $LFS/{dev,proc,sys}
新建初始化设备节点:
mknod -m 600 $LFS/dev/console c 5 1
mknod -m 666 $LFS/dev/null c 1 3
挂载移植/dev
mount -v --bind /dev $LFS/dev
挂载虚拟内核文件系统:
mount -vt devpts devpts $LFS/dev/pts
mount -vt tmpfs shm $LFS/dev/shm
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
进入 chroot 环境:
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
得到一个 I have no name!:/#的提示符就对了~
请注意以下的工作都是在 chroot 环境下进行的,如果你重启或者关机了,注意要
重新建立虚拟内核文件系统。
----------------------------
创建目录:
mkdir -pv /{bin,boot,etc/opt,home,lib,mnt,opt}
mkdir -pv /{media/{floppy,cdrom},sbin,srv,var}
install -dv -m 0750 /root
install -dv -m 1777 /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}
for dir in /usr /usr/local; do
ln -sv share/{man,doc,info} $dir
done
mkdir -v /var/{lock,log,mail,run,spool}
mkdir -pv /var/{opt,cache,lib/{misc,locate},local}
----------------------------------------------------------------------
创建重要文件和符号链接:
ln -sv /tools/bin/{bash,cat,echo,grep,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
ln -sv bash /bin/sh
为某些需要创建一个空的/etc/mtab
touch /etc/mtab
为了让 root 可以登录,创建文件:/ etc/ passwd 和 / etc/ group
cat > /etc/passwd << "EOF"
root:x:0:0:root:/root:/bin/bash
nobody:x:99:99:Unprivileged User:/dev/null:/bin/false
EOF
cat > /etc/group << "EOF"
root:x:0:
bin:x:1:
sys:x:2:
kmem:x:3:
tty:x:4:
tape: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
开启一个新 Shell:
exec /tools/bin/bash --login +h
创建记录并给予适当权限:
touch /var/run/utmp /var/log/{btmp,lastlog,wtmp}
chgrp -v utmp /var/run/utmp /var/log/lastlog
chmod -v 664 /var/run/utmp /var/log/lastlog
----------------------------------------------------------------------
安装 Linux-2.6.22.5 API 头文件
$cd /sources/
解包
$tar xvfj linux-2.6.22.5.tar.bz2
$cd linux-2.6.22.5
为了防止在/usr/include/scsi 下安装头文件,进行以下操作
$sed -i '/scsi/d' include/Kbuild
安装头文件:
$make mrproper
$make headers_check
$make INSTALL_HDR_PATH=dest headers_install
$cp -rv dest/include/* /usr/include
$cd ..
----------------------------------------------------------------------
安装 man 手册:
解包:
$ tar xvfj man-pages-2.63.tar.bz2
$ cd man-pages-2.63
安装
$make install
$cd ..
----------------------------------------------------------------------
安装 Glibc-2.5.1:
解包:
$tar xvjf glibc-2.5.1.tar.bz2
$ cd glibc-2.5.1
安装 IDN 库:
$tar -xvf ../glibc-libidn-2.5.1.tar.gz
$mv glibc-libidn-2.5.1 libidn
避免一些麻烦:
$ sed -i '/vi_VN.TCVN/d' localedata/SUPPORTED
调整检验脚本的检查位置:
$sed -i /
's|libs -o|libs -L/usr/lib -Wl,-dynamic-linker=/lib/ld-linux.so.2 -o|' /
scripts/test-installation.pl
改变解释脚本的 Shell 位置:
$ sed -i 's|@BASH@|/bin/bash|' elf/ldd.bash.in
重新建立一个编译目录:
$cd ..
$mkdir glibc-build2
$cd glibc-build2
配置安装:
$ ../glibc-2.5.1/configure --prefix=/usr /
--disable-profile --enable-add-ons /
--enable-kernel=2.6.0 --libexecdir=/usr/lib/glibc
$make
做检查:
$make -k check 2>&1 | tee glibc-check-log
$grep Error glibc-check-log
为了避免因缺少/etc/ld.so.conf 而产生的警告:
$ touch /etc/ld.so.conf
安装:
$make install
安装个人地区特征:
$mkdir -pv /usr/lib/locale
localedef -i de_DE -f ISO-8859-1 de_DE
localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro
localedef -i en_HK -f ISO-8859-1 en_HK
localedef -i en_PH -f ISO-8859-1 en_PH
localedef -i en_US -f ISO-8859-1 en_US
localedef -i es_MX -f ISO-8859-1 es_MX
localedef -i fa_IR -f UTF-8 fa_IR
localedef -i fr_FR -f ISO-8859-1 fr_FR
localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro
localedef -i it_IT -f ISO-8859-1 it_IT
localedef -i ja_JP -f EUC-JP ja_JP
localedef -i zh_CN -f GB18030 zh_CN
localedef -i zh_CN -f UTF-8 zh_CN
localedef -i zh_TW -f BIG5 zh_TW
localedef -i zh_TW -f UTF-8 zh_TW
localedef -i zh_HK -f BIG5-HKSCS zh_HK
localedef -i zh_HK -f UTF-8 zh_HK
localedef -i zh_SG -f GBK zh_SG
localedef -i zh_SG -f UTF-8 zh_SG
localedef -i en_US -f UTF-8 en_US
创建/etc/nsswitch.conf
$cat > /etc/nsswitch.conf << "EOF"
# Begin /etc/nsswitch.conf
passwd: files
group: files
shadow: files
hosts: files dns
networks: files
protocols: files
services: files
ethers: files
rpc: files
# End /etc/nsswitch.conf
EOF
确定本地时区:
$tzselect
选择亚洲中国北京,时间我这是不对的,认了吧。。。
创建/etc/localtime 文件
$cp -v --remove-destination /usr/share/zoneinfo/Asia/Chongqing /etc/localtime
创建/etc/ld.so.conf 文件
$cat > /etc/ld.so.conf << "EOF"
# Begin /etc/ld.so.conf
/usr/local/lib
/opt/lib
# End /etc/ld.so.conf
EOF
----------------------------------------------------------------------
------------------------------------
调整/测试工具连
------------------------------------
现在临时的 C 库已经安装好了,我们需要让本章随后编译的那些工具都连接到
这个库上。
为了实现这一目标,我们需要调整连接器脚本和编译器的 specs 文件。
新建连接。
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/lib/ld-linux.so.2@/lib/ld-linux.so.2@g' /
-e '//*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' /
-e '//*cpp:/{n;s@$@ -isystem /usr/include@}' > /
`dirname $(gcc --print-libgcc-file-name)`/specs
现在来检查一下新工具链的基本功能(编译和连接)是否正常:
$echo 'main(){}' > dummy.c
$cc dummy.c -v -Wl,--verbose &> dummy.log
$readelf -l a.out | grep ': /lib'
如果一切正常,应该不会出错,而且最后一个命令的结果是:
[Requesting program interpreter: /lib/ld-linux.so.2]
尤其要注意 tools/lib 应该是我们的动态连接器的前缀。
确认我们安装了正确的开始文件:
$ grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
正确的输出是:
/usr/lib/crt1.o succeeded
/usr/lib/crti.o succeeded
/usr/lib/crtn.o succeeded
确认是在正确的位置寻找头文件:
$ grep -B1 '^ /usr/include' dummy.log
正确的输出是:
#include <...> search starts here:
/usr/include
确认新的连接器已经被使用:
$ grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |/n|g'
正确的输出是:
SEARCH_DIR("/tools/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/lib")
SEARCH_DIR("/lib");
确认我们使用了正确的 libc:
$ grep "/lib/libc.so.6 " dummy.log
正确的输出为:
attempt to open /lib/libc.so.6 succeeded
确认 GCC 使用了正确动态连接器:
正确的输出为:
found ld-linux.so.2 at /lib/ld-linux.so.2
在确定一切正常后,删除测试文件:
$ rm -v dummy.c a.out dummy.log
$cd ..
----------------------------------------------------------------------
安装 Binutils-2.17
解包:
$ tar xvfj binutils-2.17.tar.bz2
$ cd binutils-2.17
确认 PTYs 在 chroot 环境下正常工作了:
$ expect -c "spawn ls"
正常的输出为:
spawn ls
否则,必须解决相关问题(我没有遇到问题,所以也不清楚怎么解决)
建立编译目录:
$mkdir -v ../binutils-build3
$cd ../binutils-build3
配置安装:
$ ../binutils-2.17/configure --prefix=/usr /
--enable-shared
编译:
$make tooldir=/usr
检查:
$make check
安装:
$ make tooldir=/usr install
复制 libiberty 必要的头文件:
$cp -v ../binutils-2.17/include/libiberty.h /usr/include
$cd ..
----------------------------------------------------------------------
解压:
$ tar jxvf gcc-4.1.2.tar.bz2
$ cd gcc-4.1.2
安装 GCC-4.1.2
禁止 libiberty. a.的安装:
$ sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in
与前边编译保持一致性:
$ sed -i 's/^XCFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in
禁止 fixincludes 脚本运行:
$ sed -i 's@/./fixinc/.sh@-c true@' gcc/Makefile.in
伪装 GCCBUG 脚本:
$ sed -i 's/@have_mktemp_command@/yes/' gcc/gccbug.in
重新建立编译目录:
$mkdir -v ../gcc-build3
$cd ../gcc-build3
安装配置:
../gcc-4.1.2/configure --prefix=/usr /
--libexecdir=/usr/lib --enable-shared /
--enable-threads=posix --enable-__cxa_atexit /
--enable-clocale=gnu --enable-languages=c,c++
编译:
$make
检查:
$make -k check
回收检查结果:
$../gcc-4.1.2/contrib/test_summary
安装:
$make install
建立一些必要链接:
$ln -sv ../usr/bin/cpp /lib
$ln -sv gcc /usr/bin/cc
现在来检查一下新工具链的基本功能(编译和连接)是否正常:
$echo 'main(){}' > dummy.c
$cc dummy.c -v -Wl,--verbose &> dummy.log
$readelf -l a.out | grep ': /lib'
正确的结果为:
[Requesting program interpreter: /lib/ld-linux.so.2]
确认我们安装了正确的开始文件:
$grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
正确的输出是:
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/http://www.cnblogs.com/../crt1.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/http://www.cnblogs.com/../crti.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/http://www.cnblogs.com/../crtn.o succeeded
确认编译器寻找的是正确的头文件:
$ grep -B3 '^ /usr/include' dummy.log
正确的输出为:
#include <...> search starts here:
/usr/local/include
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/include
/usr/include
确认新的连接器协同正确的路径正在被使用
$grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |/n|g'
正确的输出为:
SEARCH_DIR("/usr/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");
确认使用的是正确的 libc
$ grep "/lib/libc.so.6 " dummy.log
正确的输出为:
attempt to open /lib/libc.so.6 succeeded
确认 GCC 使用的动态链接库是正确的:
$ grep found dummy.log
正确的输出为:
found ld-linux.so.2 at /lib/ld-linux.so.2
在确定一切正常后,删除测试文件:
$ rm -v dummy.c a.out dummy.log
$cd ..
----------------------------------------------------------------------
安装 Berkeley DB-4.5.20
解压:
$tar xvfz db-4.5.20.tar.gz
$cd db-4.5.20
打补丁:
$patch -Np1 -i ../db-4.5.20-fixes-1.patch
为安装做配置:
$cd build_unix
$../dist/configure --prefix=/usr --enable-compat185 --enable-cxx
编译:
$make
安装:
$make docdir=/usr/share/doc/db-4.5.20 install
更改安装文档的所有权:
$chown -Rv root:root /usr/share/doc/db-4.5.20
$cd ..
$cd ..
----------------------------------------------------------------------
安装 Sed-4.1.5
解压:
$ tar xvfz sed-4.1.5.tar.gz
$ cd sed-4.1.5
配置:
$./configure --prefix=/usr --bindir=/bin --enable-html
编译:
$make
安装:
$make install
$cd ..
----------------------------------------------------------------------
安装 E2fsprogs-1.40.2
解压:
$ tar zxvf e2fsprogs-1.40.2.tar.gz
$ cd e2fsprogs-1.40.2
修补路径:
$sed -i -e 's@/bin/rm@/tools&@' lib/blkid/test_probe.in
配置:
$mkdir -v build
$cd build
$../configure --prefix=/usr --with-root-prefix="" /
--enable-elf-shlibs
编译:
$make
$make check
安装:
$make install
安装头文件和库:
$make install-libs
$cd ..
$cd ..
----------------------------------------------------------------------
安装 Coreutils-6.9
解压:
$ tar jxvf coreutils-6.9.tar.bz2
$ cd coreutils-6.9
打补丁:
$patch -Np1 -i ../coreutils-6.9-uname-1.patch
$patch -Np1 -i ../coreutils-6.9-suppress_uptime_kill_su-1.patch
$patch -Np1 -i ../coreutils-6.9-i18n-1.patch
配置:
$ ./configure --prefix=/usr
编译:
$make
测试很繁琐,此处略去
安装
$make install
存放程序到 FHS 指定的位置:
$mv -v /usr/bin/{cat,chgrp,chmod,chown,cp,date,dd,df,echo} /bin
$mv -v /usr/bin/{false,hostname,ln,ls,mkdir,mknod,mv,pwd,readlink,rm} /bin
$mv -v /usr/bin/{rmdir,stty,sync,true,uname} /bin
$mv -v /usr/bin/chroot /usr/sbin
$mv -v /usr/bin/{head,sleep,nice} /bin
$cd ..
----------------------------------------------------------------------
安装 Iana-Etc-2.20
解压:
$ tar jxvf iana-etc-2.20.tar.bz2
$ cd iana-etc-2.20
编译:
$make
安装
$make install
$cd ..
----------------------------------------------------------------------
安装 M4-1.4.10:
解压:
$ tar vfjx m4-1.4.10.tar.bz2
$ cd m4-1.4.10
配置:
$ ./configure --prefix=/usr
编译:
$make
安装:
$make install
$cd ..
----------------------------------------------------------------------
安装 Bison-2.3
解压:
$ tar jxvf bison-2.3.tar.bz2
$ cd bison-2.3
配置:
$./configure --prefix=/usr
$ echo '#define YYENABLE_NLS 1' >> config.h
编译:
$make
安装:
$make install
$cd ..
----------------------------------------------------------------------
安装 Ncurses-5.6
解压:
$ tar zxvf ncurses-5.6.tar.gz
$ cd ncurses-5.6
打补丁:
$ patch -Np1 -i ../ncurses-5.6-coverity_fixes-1.patch
配置:
$ ./configure --prefix=/usr --with-shared --without-debug --enable-widec
编译:
$make
安装:
$make install
更改库的权限:
$chmod -v 644 /usr/lib/libncurses++w.a
移动库的位置:
$mv -v /usr/lib/libncursesw.so.5* /lib
创建连接:
$ ln -sfv http://www.cnblogs.com/lib/libncursesw.so.5 /usr/lib/libncursesw.so
欺骗一些需要非宽字符的程序:
$ for lib in curses 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${lib}w.a /usr/lib/lib${lib}.a ; /
done
$ln -sfv libncurses++w.a /usr/lib/libncurses++.a
确保带有-lcurses 可以编译通过
$ rm -vf /usr/lib/libcursesw.so
$echo "INPUT(-lncursesw)" >/usr/lib/libcursesw.so
$ln -sfv libncurses.so /usr/lib/libcurses.so
$ln -sfv libncursesw.a /usr/lib/libcursesw.a
$ln -sfv libncurses.a /usr/lib/libcurses.a
$cd ..
----------------------------------------------------------------------
解压:
$ tar xvfz procps-3.2.7.tar.gz
$ cd procps-3.2.7
编译:
$make
安装:
$make install
$cd ..
----------------------------------------------------------------------
安装 Libtool-1.5.24
解压:
$ tar zxvf libtool-1.5.24.tar.gz
$ cd libtool-1.5.24
配置:
$ ./configure --prefix=/usr
编译:
$make
安装:
$make install
$cd ..
----------------------------------------------------------------------
安装 Perl-5.8.8
创建/etc/hosts
$echo "127.0.0.1 localhost $(hostname)" > /etc/hosts
配置:
$ ./configure.gnu --prefix=/usr /
-Dman1dir=/usr/share/man/man1 /
-Dman3dir=/usr/share/man/man3 /
-Dpager="/usr/bin/less -isR"
编译:
$make
检测:
$make check
安装:
$make install
$cd ..
----------------------------------------------------------------------
安装 Readline-5.2
解压:
$ tar zxvf readline-5.2.tar.gz
$ cd readline-5.2
去除一些链接上的误解
$sed -i '/MV.*old/d' Makefile.in
$sed -i '/{OLDSUFF}/c:' support/shlib-install
打补丁:
$patch -Np1 -i ../readline-5.2-fixes-3.patch
配置:
$./configure --prefix=/usr --libdir=/lib
编译:
$make SHLIB_LIBS=-lncurses
安装:
$make install
将库移动到合适位置:
$mv -v /lib/lib{readline,history}.a /usr/lib
移动并重新连接.so 文件:
$rm -v /lib/lib{readline,history}.so
$ln -sfv http://www.cnblogs.com/lib/libreadline.so.5 /usr/lib/libreadline.so
$ln -sfv http://www.cnblogs.com/lib/libhistory.so.5 /usr/lib/libhistory.so
$cd ..
----------------------------------------------------------------------
安装 Zlib-1.2.3
解压:
$ tar zxvf zlib-1.2.3.tar.gz
$ cd zlib-1.2.3
配置:
$./configure --prefix=/usr --shared --libdir=/lib
编译:
$make
检测:
$make check
安装:
$make install
删除刚安装在/lib 中的.so 文件并重新连接它:
$rm -v /lib/libz.so
$ln -sfv http://www.cnblogs.com/lib/libz.so.1.2.3 /usr/lib/libz.so
编译静态库:
$make clean
$./configure --prefix=/usr
$make
检测:
$make check
安装:
$make install
修改静态库权限:
$ chmod -v 644 /usr/lib/libz.a
$cd ..
----------------------------------------------------------------------
安装 Autoconf-2.61
解压:
$ tar jxvf autoconf-2.61.tar.bz2
$ cd autoconf-2.61
配置:
$ ./configure --prefix=/usr
编译:
$ make
安装:
$make install
$cd ..
----------------------------------------------------------------------
安装 Automake-1.10
解压:
$ tar jxvf automake-1.10.tar.bz2
$ cd automake-1.10
配置:
$ ./configure --prefix=/usr
编译:
$make
检测:
$make check
安装:
$make install
$cd ..
----------------------------------------------------------------------
安装 Bash-3.2
解压:
$ tar zxvf bash-3.2.tar.gz
$ cd bash-3.2
安装 Bash 的文档:
$ tar -xvf ../bash-doc-3.2.tar.gz
$sed -i "s|htmldir = @htmldir@|htmldir = /usr/share/doc/bash-3.2|" /
Makefile.in
打补丁:
$ patch -Np1 -i ../bash-3.2-fixes-5.patch
配置:
$ ./configure --prefix=/usr --bindir=/bin /
--without-bash-malloc --with-installed-readline
编译:
$make
略去检测部分
安装:
$ make install
运行刚刚安装的 bash
$ exec /bin/bash --login +h
----------------------------------------------------------------------
安装:Bzip2-1.0.4
解压:
$ tar zxvf bzip2-1.0.4.tar.gz
$ cd bzip2-1.0.4
打补丁:
$ patch -Np1 -i ../bzip2-1.0.4-install_docs-1.patch
编译:
$ make -f Makefile-libbz2_so
$ make clean
$ make
安装:
$ make PREFIX=/usr install
$ cp -v bzip2-shared /bin/bzip2
$ cp -av libbz2.so* /lib
$ ln -sv http://www.cnblogs.com/lib/libbz2.so.1.0 /usr/lib/libbz2.so
$ rm -v /usr/bin/{bunzip2,bzcat,bzip2}
$ ln -sv bzip2 /bin/bunzip2
$ ln -sv bzip2 /bin/bzcat
$ cd ..
----------------------------------------------------------------------
安装: Diffutils-2.8.1
解压:
$ tar zxvf diffutils-2.8.1.tar.gz
$ cd diffutils-2.8.1
打补丁:
$ patch -Np1 -i ../diffutils-2.8.1-i18n-1.patch
为防止重新编译 man/diff.1:
$ touch man/diff.1
配置:
$ ./configure --prefix=/usr
编译:
$ make
安装:
$make install
$cd ..
----------------------------------------------------------------------
安装 File-4.21
解压:
$ tar zxvf file-4.21.tar.gz
$ cd file-4.21
配置:
$ ./configure --prefix=/usr
编译:
$make
安装:
$make install
$cd ..
----------------------------------------------------------------------
安装 Findutils-4.2.31
解压:
$tar zxvf findutils-4.2.31
$cd findutils-4.2.31
配置:
$ ./configure --prefix=/usr --libexecdir=/usr/lib/findutils /
--localstatedir=/var/lib/locate
编译:
$make
检测:
$make check
安装:
$ make install
进行必要的移动和脚本替换:
$mv -v /usr/bin/find /bin
$sed -i -e 's/find:=${BINDIR}/find:=//bin/' /usr/bin/updatedb
$cd ..
----------------------------------------------------------------------
安装 Flex-2.5.33
解压:
$tar jxvf flex-2.5.33
$cd flex-2.5.33
配置:
$ ./configure --prefix=/usr
编译:
$make
检测
$make check
安装:
$make install
做适当连接:
$ ln -sv libfl.a /usr/lib/libl.a
用 flex 伪装 lex
$ cat > /usr/bin/lex << "EOF"
#!/bin/sh
# Begin /usr/bin/lex
exec /usr/bin/flex -l "$@"
# End /usr/bin/lex
EOF
$chmod -v 755 /usr/bin/lex
$cd ..
----------------------------------------------------------------------
安装 GRUB-0.97
解压:
$ tar zxvf grub-0.97.tar.gz
$ cd grub-0.97
打补丁:
$ patch -Np1 -i ../grub-0.97-disk_geometry-1.patch
配置:
$ ./configure --prefix=/usr
编译:
$make && make check.
安装:
$ make install
$ mkdir -v /boot/grub
$ cp -v /usr/lib/grub/i386-pc/stage{1,2} /boot/grub
$ cp -v /usr/lib/grub/i386-pc/{e2fs_,reiserfs_}stage1_5 /boot/grub
$cd ..
----------------------------------------------------------------------
安装 Gawk-3.1.5
解压:
$ tar jxvf gawk-3.1.5.tar.bz2
$ cd gawk-3.1.5
打补丁:
$ patch -Np1 -i ../gawk-3.1.5-segfault_fix-1.patch
配置:
$ ./configure --prefix=/usr --libexecdir=/usr/lib
手动修复 BUG
$ cat >> config.h << "EOF"
#define HAVE_LANGINFO_CODESET 1
#define HAVE_LC_MESSAGES 1
EOF
编译安装
$make && make check && make install
$cd ..
----------------------------------------------------------------------
安装 Gettext-0.16.1
解压:
$ tar zxvf gettext-0.16.1.tar.gz
$ cd gettext-0.16.1
配置:
$ ./configure --prefix=/usr
编译安装:
$make && make install
$cd ..
----------------------------------------------------------------------
安装 Grep-2.5.1a
解压:
$ tar xvfj grep-2.5.1a.tar.bz2
$ cd grep-2.5.1a
打补丁:
$ patch -Np1 -i ../grep-2.5.1a-redhat_fixes-2.patch
修改 test 需要的文件权限:
$ chmod +x tests/fmbtest.sh
配置:
$ ./configure --prefix=/usr --bindir=/bin
编译安装:
$make && make check && make install
$cd ..
----------------------------------------------------------------------
安装 Groff-1.18.1.4
解压:
$
$
打补丁:
$ patch -Np1 -i ../groff-1.18.1.4-debian_fixes-1.patch
让其使用 ASCII
$ sed -i -e 's/2010/002D/' -e 's/2212/002D/' /
-e 's/2018/0060/' -e 's/2019/0027/' font/devutf8/R.proto
配置:
$PAGE=A4 ./configure --prefix=/usr --enable-multibyte
编译安装:
$make && make install
做适当连接:
$ ln -sv eqn /usr/bin/geqn
$ ln -sv tbl /usr/bin/gtbl
$ cd ..
----------------------------------------------------------------------
安装 Gzip-1.3.12
解压:
$tar zxvf gzip-1.3.12
$cd gzip-1.3.12
配置:
./configure --prefix=/usr --bindir=/bin
编译:
make
安装
make install
做适当连接:
mv -v /bin/{gzexe,uncompress,zcmp,zdiff,zegrep} /usr/bin
mv -v /bin/{zfgrep,zforce,zgrep,zless,zmore,znew} /usr/bin
$cd ..
----------------------------------------------------------------------
安装 Inetutils-1.5
解压:
$tar zxvf inetutils-1.5
$cd inetutils-1.5
打补丁:
$ patch -Np1 -i ../inetutils-1.5-no_server_man_pages-2.patch
配置:
$./configure --prefix=/usr --libexecdir=/usr/sbin /
--sysconfdir=/etc --localstatedir=/var /
--disable-ifconfig --disable-logger --disable-syslogd /
--disable-whois --disable-servers
编译安装
$make && make install
将 ping 放到适当位置:
$mv -v /usr/bin/ping /bin
$cd ..
----------------------------------------------------------------------
安装 IPRoute2-2.6.20-070313
解压:
$ tar zxvf iproute2-2.6.20-070313.tar.gz
$ cd iproute-2.6.20-070313/
修复一处:
$ sed -i -e '/tc-bfifo.8/d' -e '/tc-pfifo.8/s/pbfifo/bfifo/' Makefile
编译:
$ make SBINDIR=/sbin
安装:
$ make SBINDIR=/sbin install
进行必要的移动:
$mv -v /sbin/arpd /usr/sbin
$cd ..
----------------------------------------------------------------------
安装 Kbd-1.12
解压:
$ tar jxvf kbd-1.12.tar.bz2
$ cd kbd-1.12
打补丁:
$ patch -Np1 -i ../kbd-1.12-backspace-1.patch
$ patch -Np1 -i ../kbd-1.12-gcc4_fixes-1.patch
配置:
$ ./configure --datadir=/lib/kbd
编译安装:
$make && make install
进行必要移动:
$ mv -v /usr/bin/{kbd_mode,openvt,setfont} /bin
$cd ..
----------------------------------------------------------------------
安装 Less-406
解压:
$ tar zvxf less-406.tar.gz
$ cd less-406
配置:
$ ./configure --prefix=/usr --sysconfdir=/etc
编译安装:
$ make && make install
$cd ..
----------------------------------------------------------------------
安装 Make-3.81
解压:
$ tar jxvf make-3.81.tar.bz2
$ cd make-3.81
配置:
$ ./configure --prefix=/usr
编译安装:
$make && make install
$cd ..
----------------------------------------------------------------------
安装 Man-DB-2.4.4
解压:
$ tar zxvf man-db-2.4.4.tar.gz
$ cd man-db-2.4.4
改变手册的位置:
$mv man/de{_DE.88591,}
$mv man/es{_ES.88591,}
$mv man/it{_IT.88591,}
$mv man/ja{_JP.eucJP,}
$sed -i 's,/*_/*,??,' man/Makefile.in
修改 man_ db. Conf:
$sed -i -e '/%/t/usr/man%d' -e '/%/t/usr/local/man%d' src/man_db.conf.in
创建运行时必须的文件:
$cat >> include/manconfig.h.in << "EOF"
#define WEB_BROWSER "exec /usr/bin/lynx"
#define COL "/usr/bin/col"
#define VGRIND "/usr/bin/vgrind"
#define GRAP "/usr/bin/grap"
EOF
打补丁:
$patch -Np1 -i ../man-db-2.4.4-fixes-1.patch
配置:
$./configure --prefix=/usr --enable-mb-groff --disable-setuid
编译安装:
$make && make install
确保 UTF-8 显示正常:
$cat >> convert-mans << "EOF"
#!/bin/sh -e
FROM="$1"
TO="$2"
shift ; shift
while [ $# -gt 0 ]
do
FILE="$1"
shift
iconv -f "$FROM" -t "$TO" "$FILE" >.tmp.iconv
mv .tmp.iconv "$FILE"
done
EOF
install -m755 convert-mans /usr/bin
$cd ..
----------------------------------------------------------------------
安装 Mktemp-1.5
解压:
$ tar zxvf mktemp-1.5.tar.gz
$ cd mktemp-1.5
打补丁:
$patch -Np1 -i ../mktemp-1.5-add_tempfile-3.patch
配置:
$./configure --prefix=/usr --with-libc
编译安装:
$make
$make install
$make install-tempfile
$cd ..
----------------------------------------------------------------------
安装 Module-Init-Tools-3.2.2
解压:
$ tar jxvf module-init-tools-3.2.2.tar.bz2
$ cd module-init-tools-3.2.2
打补丁:
$ patch -Np1 -i ../module-init-tools-3.2.2-modprobe-1.patch
配置:
$ ./configure
$make check
$make distclean
$ ./configure --prefix=/ --enable-zlib
编译安装:
$make && make INSTALL=install install
$cd ..
----------------------------------------------------------------------
安装 Patch-2.5.4
解压:
$ tar xzvf patch-2.5.4.tar.gz
$ cd patch-2.5.4
配置:
$ ./configure --prefix=/usr
编译安装:
$make && make install
$cd ..
----------------------------------------------------------------------
安装 Psmisc-22.5
解压:
$ tar zxvf psmisc-22.5.tar.gz
$ cd psmisc-22.5
配置:
$ ./configure --prefix=/usr --exec-prefix=""
编译安装:
$make && make install
移动一些文件到适当位置:
$ mv -v /bin/pstree* /usr/bin
做适当连接:
$ ln -sv killall /bin/pidof
$cd ..
----------------------------------------------------------------------
安装 Shadow-4.0.18.1
解压:
$ tar jxvf shadow-4.0.18.1.tar.bz2
$ cd shadow-4.0.18.1
打补丁:
$ patch -Np1 -i ../shadow-4.0.18.1-useradd_fix-2.patch
配置:
$ ./configure --libdir=/lib --sysconfdir=/etc --enable-shared --without-selinux
禁止安装 groups 程序
$ sed -i 's/groups$(EXEEXT) //' src/Makefile
find man -name Makefile -exec sed -i 's/groups/.1 / /' {} /;
禁止中文和韩文手册:
$ sed -i -e 's/ ko//' -e 's/ zh_CN zh_TW//' man/Makefile
支持 UTF-8
$ for i in de es fi fr id it pt_BR; do
convert-mans UTF-8 ISO-8859-1 man/${i}/*.?
done
for i in cs hu pl; do
convert-mans UTF-8 ISO-8859-2 man/${i}/*.?
done
convert-mans UTF-8 EUC-JP man/ja/*.?
convert-mans UTF-8 KOI8-R man/ru/*.?
convert-mans UTF-8 ISO-8859-9 man/tr/*.?
改变 mail 位置:
$ sed -i -e 's@#MD5_CRYPT_ENAB.no@MD5_CRYPT_ENAB yes@' /
-e 's@/var/spool/mail@/var/mail@' etc/login.defs
编译安装:
$make && make install
做必要移动和连接:
$mv -v /usr/bin/passwd /bin
$ mv -v /lib/libshadow.*a /usr/lib
$rm -v /lib/libshadow.so
$ln -sfv http://www.cnblogs.com/lib/libshadow.so.0 /usr/lib/libshadow.so
配置程序:
使能:
$ pwconv
$ grpconv
改变新用户默认的家目录:
$useradd -D -b /home
$sed -i 's/yes/no/' /etc/default/useradd
改变 root 的密码:
$ passwd root
$cd ..
----------------------------------------------------------------------
安装 Sysklogd-1.4.1
解压:
$ tar zvxf sysklogd-1.4.1.tar.gz
$ cd sysklogd-1.4.1
打补丁:
$ patch -Np1 -i ../sysklogd-1.4.1-fixes-2.patch
$ patch -Np1 -i ../sysklogd-1.4.1-8bit-1.patch
编译安装:
$make && make install
创建/ 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
$cd ..
----------------------------------------------------------------------
安装 Sysvinit-2.86
解压:
$ tar zxvf sysvinit-2.86.tar.gz
$ cd sysvinit-2.86
消除显示信息的误解:
$ sed -i 's@Sending processes@& configured via /etc/inittab@g' /
src/init.c
编译:
$ make -C src
安装:
$ make -C src install
新建/ etc/ inittab
$ cat > /etc/inittab << "EOF"
# Begin /etc/inittab
id:3:initdefault:
si::sysinit:/etc/rc.d/init.d/rc sysinit
l0:0:wait:/etc/rc.d/init.d/rc 0
l1:S1:wait:/etc/rc.d/init.d/rc 1
l2:2:wait:/etc/rc.d/init.d/rc 2
l3:3:wait:/etc/rc.d/init.d/rc 3
l4:4:wait:/etc/rc.d/init.d/rc 4
l5:5:wait:/etc/rc.d/init.d/rc 5
l6:6:wait:/etc/rc.d/init.d/rc 6
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
su:S016:once:/sbin/sulogin
1:2345:respawn:/sbin/agetty tty1 9600
2:2345:respawn:/sbin/agetty tty2 9600
3:2345:respawn:/sbin/agetty tty3 9600
4:2345:respawn:/sbin/agetty tty4 9600
5:2345:respawn:/sbin/agetty tty5 9600
6:2345:respawn:/sbin/agetty tty6 9600
# End /etc/inittab
EOF
$cd ..
----------------------------------------------------------------------
安装 Tar-1.18
解压:
$ tar jxvf tar-1.18.tar.bz2
$ cd tar-1.18
配置:
$ ./configure --prefix=/usr --bindir=/bin --libexecdir=/usr/sbin
编译安装:
$make && make install
$cd ..
----------------------------------------------------------------------
安装 Texinfo-4.9
解压:
$ tar jxvf texinfo-4.9.tar.bz2
$ cd texinfo-4.9
打补丁:
$ patch -Np1 -i ../texinfo-4.9-multibyte-1.patch
$ patch -Np1 -i ../texinfo-4.9-tempfile_fix-1.patch
配置:
$ ./configure --prefix=/usr
编译安装:
$make && make install
$ make TEXMF=/usr/share/texmf install-tex
重建文件/ usr/ share/ info/ dir
$ cd /usr/share/info
rm dir
for f in *
do install-info $f dir 2>/dev/null
done
$cd /sources/
----------------------------------------------------------------------
安装 Udev-113
解压:
$tar jxvf udev-113.tar.bz2
$ cd udev-113
创建一些刚启动是 udev 无法操控的设备:
$install -dv /lib/{firmware,udev/devices/{pts,shm}}
$mknod -m0666 /lib/udev/devices/null c 1 3
$ln -sv /proc/self/fd /lib/udev/devices/fd
$ln -sv /proc/self/fd/0 /lib/udev/devices/stdin
$ln -sv /proc/self/fd/1 /lib/udev/devices/stdout
$ln -sv /proc/self/fd/2 /lib/udev/devices/stderr
$ln -sv /proc/kcore /lib/udev/devices/core
编译:
$make EXTRAS="`echo extras/*/`"
安装
$make DESTDIR=/ EXTRAS="`echo extras/*/`" install
复制一些必须文件:
$cp -v etc/udev/rules.d/[0-9]* /etc/udev/rules.d/
安装 LFS 的一些规则文件:
$cd ..
$ tar jxvf udev-config-6.3.tar.bz2
$cd udev-config-6.3
$make install
安装相关文档:
$make install-doc
$make install-extra-doc
$cd ..
$install -m644 -v docs/writing_udev_rules/index.html /
/usr/share/doc/udev-113/index.html
(会出错)
----------------------------------------------------------------------
安装 Util-linux-2.12r
解压:
$ tar jxvf util-linux-2.12r.tar.bz2
$ cd util-linux-2.12r
FHS 兼容:
$sed -e 's@etc/adjtime@var/lib/hwclock/adjtime@g' /
-i $(grep -rl '/etc/adjtime' .)
$mkdir -pv /var/lib/hwclock
打补丁:
$patch -Np1 -i ../util-linux-2.12r-cramfs-1.patch
$patch -Np1 -i ../util-linux-2.12r-lseek-1.patch
配置
$./configure
编译:
$make HAVE_KILL=yes HAVE_SLN=yes
安装:
$make HAVE_KILL=yes HAVE_SLN=yes install
----------------------------------------------------------------------
安装 Vim-7.1
解压:
$ tar jxvf vim-7.1.tar.bz2
$ cd vim71/
打补丁:
$patch -Np1 -i ../vim-7.1-fixes-1.patch
$patch -Np1 -i ../vim-7.1-mandir-1.patch
改变一些配置:
$echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h
配置:
$./configure --prefix=/usr --enable-multibyte
编译安装:
$make && make install
连接为 Vi
$ ln -sv vim /usr/bin/vi
for L in "" fr it pl ru; do
ln -sv vim.1 /usr/share/man/$L/man1/vi.1
done
使其文档通用:
$ ln -sv ../vim/vim71/doc /usr/share/doc/vim-7.1
配置:
$ cat > /etc/vimrc << "EOF"
" Begin /etc/vimrc
set nocompatible
set backspace=2
syntax on
if (&term == "iterm") || (&term == "putty")
set background=dark
endif
" End /etc/vimrc
EOF
----------------------------------------------------------------------
清理系统:
登出:
$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/}{bin,lib,sbin} -type f /
-exec /tools/bin/strip --strip-debug '{}' ';'
删除/tools
$rm /tools -rf
----------------------------------------------------------------------
安装 LFS-Bootscripts-6.3
解压:
$cd /sources
$ tar jxvf lfs-bootscripts-6.3.tar.bz2
$ cd lfs-bootscripts-6.3
安装:
$make install
$cd /
----------------------------------------------------------------------
设置 setclock 脚本
查看自己的硬件时钟是不是设为 UTC 了?
新建一个 /etc/sysconfig/clock 文件:
$cat > /etc/sysconfig/clock << "EOF"
# Begin /etc/sysconfig/clock
UTC=1
# End /etc/sysconfig/clock
EOF
略去设置控制台,配置 sysklogd 脚本
----------------------------------------------------------------------
创建 etc/inputrc 键盘映射配置文件:
$ cat > /etc/inputrc << "EOF"
# Begin /etc/inputrc
# Modified by Chris Lynn <roryo@roryo.dynup.net>
# Allow the command prompt to wrap to the next line
set horizontal-scroll-mode Off
# Enable 8bit input
set meta-flag On
set input-meta On
# Turns off 8th bit stripping
set convert-meta Off
# Keep the 8th bit for display
set output-meta On
# none, visible or audible
set 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/inputrc
EOF
----------------------------------------------------------------------
设置 bash 的启动文件:
查看 Glibc 支持的所有 locales 列表:
$locale –a
应该能看到:
………
………
zh_CN
zh_CN.gb18030
zh_CN.utf8
zh_HK
zh_HK.big5hkscs
zh_HK.utf8
zh_SG
zh_SG.gbk
zh_SG.utf8
zh_TW
zh_TW.big5
zh_TW.utf8
确定正确的规范名称,我们选择 zh_CN.gb18030:
$LC_ALL=zh_CN.gb18030 locale charmap
上面的命令将会打印:
UTF-8
这样就得到了正确的 locale 设置是" zh_CN. UTF-8"。进一步确认上述命令对应
使用的字符编码、货币符号、国际长途电话号码前缀
$LC_ALL=zh_CN.gb18030 locale language
$LC_ALL=zh_CN.gb18030 locale charmap
$LC_ALL=zh_CN.gb18030 locale int_curr_symbol
$LC_ALL=zh_CN.gb18030 locale int_prefix
分别输出:chinese,UTF-8,CNY,86
创建 /etc/profile 文件:
$ cat > /etc/profile << "EOF"
# Begin /etc/profile
export LANG=zh_CN.chinese
# End /etc/profile
EOF
----------------------------------------------------------------------
配置 localnet 脚本:
创建/ etc/ sysconfig/ network
$ echo "HOSTNAME=warmbupt" > /etc/sysconfig/network
我设置的主机名为 warmbupt。
----------------------------------------------------------------------
定制/etc/hosts 文件,仅配置本地主机
cat > /etc/hosts << "EOF"
# Begin /etc/hosts (network card version)
127.0.0.1 localhost
# End /etc/hosts (network card version)
EOF
----------------------------------------------------------------------
配置网络
为网卡配置稳定的名字
创建规则:
$ /lib/udev/write_net_rules all_interfaces
观看内容:
$cat /etc/udev/rules.d/70-persistent-net.rules
我看到的信息为(略去注释)
SUBSYSTEM=="net",DRIVERS=="?*", ATTRS{address}=="00:0c:29:f6:14:a1",
NAME="et"
产生网卡配置文件:
$ cd /etc/sysconfig/network-devices
mkdir -v ifconfig.eth0
cat > ifconfig.eth0/ipv4 << "EOF"
ONBOOT=yes
SERVICE=ipv4-static
IP=192.168.2.131
GATEWAY=192.168.2.0
PREFIX=24
BROADCAST=192.168.2.255
EOF
由于没有必要,故略去不做创建/etc/resolv.conf 的动作。
下边该是让我们的 LFS 启动起来的时候
创建/etc/fstab 文件(注意间隔都用 tab 键,不是空格)
$cat > /etc/fstab << "EOF"
# Begin /etc/fstab
# file system mount-point type options dump fsck
# order
/dev/hda2 ext3 defaults 1 1
/dev/hda3 swap swap pri=1 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
devpts /dev/pts devpts gid=4,mode=620 0 0
shm /dev/shm tmpfs defaults 0 0
# End /etc/fstab
EOF
----------------------------------------------------------------------
编译内核:
解压:
$cd /sources
$tar xvfj linux-2.6.22.5.tar.bz2
$cd linux-2.6.22.5
清除内核树:
$make mrproper
编译选择:
$make menuconfig(make LANG=<host_LANG_value> LC_ALL= menuconfig 是原
来文档写的,但是很郁闷我的$LANG or $LC_ ALL or $LC_ CTYPE 都没有设置)
自己选几个吧,看需要了。
虚拟机的话一定注意选上:
Device Drivers --> Network Device Support --> Ethernet (10 or 100MBIT)
-->AMD PCnet32 这个驱动 这个驱动 这个驱动 这个驱动,,,,否则找不到网卡 否则找不到网卡 否则找不到网卡 否则找不到网卡~
保存退出后
$make
要是有模块则
$make modules_install
复制一些必要文件:
$cp -v arch/i386/boot/bzImage /boot/warmbupt-lfskernel-2.6.22.5
$cp -v System.map /boot/System.map-2.6.22.5
$cp -v .config /boot/config-2.6.22.5
$install -d /usr/share/doc/linux-2.6.22.5
$cp -r Documentation/* /usr/share/doc/linux-2.6.22.5
设置 GRUB:
$grub
>root (hd0,1)
>setup (hd0)
>quit
建立 menu.lst
cat > /boot/grub/menu.lst << "EOF"
# Begin /boot/grub/menu.lst
# By default boot the first menu entry.
default 0
# Allow 30 seconds before booting the default.
timeout 30
# Use prettier colors.
color green/black light-green/black
# The first entry is for LFS.
title LFS 6.3
root (hd0,1)
kernel /boot/warmbupt-lfskernel-2.6.22.5 root=/dev/hda2
EOF
加入 windows 分区
$cat >> /boot/grub/menu.lst << "EOF"
title Windows
rootnoverify (hd0,0)
chainloader +1
EOF
为了符合 FHS 标准:
$mkdir -v /etc/grub && ln -sv /boot/grub/menu.lst /etc/grub
重新启动:
首先退出 chroot 环境:
$logout
然后卸载虚拟文件系统:
$ umount -v $LFS/dev/pts
$ umount -v $LFS/dev/shm
$ umount -v $LFS/dev
$ umount -v $LFS/proc
$ umount -v $LFS/sys
卸载 LFS 文件系统:
$ umount -v $LFS
----------------------------------------------------------------------
----------------------------------------------------------------------
直接用虚拟机重启,Enjoy it!
-----------------------------------------------------------------------
END