📄 1705.html
字号:
[root@myhost root]# mkdir $LFS/sources<br>
[root@myhost root]# chmod a+wt $LFS/sources<br>
<br>
t: sticky<br>
<br>
STICKY DIRECTORIES<br>
When the sticky bit is set on a directory, files in that directory may<br>
be unlinked or renamed only by root or their owner. Without the sticky<br>
bit, anyone able to write to the directory can delete or rename files.<br>
The sticky bit is commonly found on directories, such as /tmp, that are<br>
world-writable.<br>
<br>
#---- install script begin ----------------------------------------------------<br>
export LFS=/mnt/lfs<br>
mkdir -p $LFS<br>
mount /dev/hda4 $LFS<br>
mkdir $LFS/sources<br>
chmod a+wt $LFS/sources<br>
<br>
#---- install script end ------------------------------------------------------<br>
<br>
<br>
Chapter 4 安装材料: 包和补丁<br>
<br>
4.1 所需软件包及补丁: <br>
<br>
使用 Linux From Scratch 官方提供的 LFS 5.0:<br>
http://packages.lfs-es.org/lfs-packages-5.0.tar<br>
<br>
中国 linuxsir 镜像:<br>
http://lfs.linuxsir.org/htdocs/files/lfs-packages-5.0.tar<br>
<br>
内含软件清单如下:<br>
autoconf-2.57.tar.bz2 inetutils-1.4.2.tar.bz2<br>
automake-1.7.6.tar.bz2 kbd-1.08-more-programs.patch<br>
bash-2.05b-2.patch kbd-1.08.tar.bz2<br>
bash-2.05b.tar.bz2 less-381.tar.bz2<br>
binutils-2.14.tar.bz2 lfs-bootscripts-1.12.tar.bz2<br>
bison-1.875-attribute.patch lfs-utils-0.3.tar.bz2<br>
bison-1.875.tar.bz2 libtool-1.5.tar.bz2<br>
bzip2-1.0.2.tar.bz2 linux-2.4.22.tar.bz2<br>
coreutils-5.0-hostname-2.patch m4-1.4.tar.bz2<br>
coreutils-5.0.tar.bz2 make-3.80.tar.bz2<br>
coreutils-5.0-uname.patch MAKEDEV-1.7.bz2<br>
dejagnu-1.4.3.tar.bz2 man-1.5m2-80cols.patch<br>
diffutils-2.8.1.tar.bz2 man-1.5m2-manpath.patch<br>
e2fsprogs-1.34.tar.bz2 man-1.5m2-pager.patch<br>
ed-0.2-mkstemp.patch man-1.5m2.tar.bz2<br>
ed-0.2.tar.bz2 man-pages-1.60.tar.bz2<br>
expect-5.39.0-spawn.patch modutils-2.4.25.tar.bz2<br>
expect-5.39.0.tar.bz2 ncurses-5.3-etip-2.patch<br>
file-4.04.tar.bz2 ncurses-5.3.tar.bz2<br>
findutils-4.1.20.tar.bz2 ncurses-5.3-vsscanf.patch<br>
flex-2.5.4a.tar.bz2 net-tools-1.60-miitool-gcc33-1.patch<br>
gawk-3.1.3-libexecdir.patch net-tools-1.60.tar.bz2<br>
gawk-3.1.3.tar.bz2 patch-2.5.4.tar.bz2<br>
gcc-2.95.3-2.patch perl-5.8.0-libc-3.patch<br>
gcc-2.95.3-no-fixinc.patch perl-5.8.0.tar.bz2<br>
gcc-2.95.3-returntype-fix.patch procinfo-18.tar.bz2<br>
gcc-2.95.3.tar.bz2 procps-3.1.11-locale-fix.patch<br>
gcc-3.3.1-no_fixincludes-2.patch procps-3.1.11.tar.bz2<br>
gcc-3.3.1-specs-2.patch psmisc-21.3.tar.bz2<br>
gcc-3.3.1-suppress-libiberty.patch sed-4.0.7.tar.bz2<br>
gcc-core-3.3.1.tar.bz2 shadow-4.0.3-newgrp-fix.patch<br>
gcc-g++-3.3.1.tar.bz2 shadow-4.0.3.tar.bz2<br>
gcc-testsuite-3.3.1.tar.bz2 sysklogd-1.4.1.tar.bz2<br>
gettext-0.12.1.tar.bz2 sysvinit-2.85.tar.bz2<br>
glibc-2.3.2-sscanf-1.patch tar-1.13.25.tar.bz2<br>
glibc-2.3.2.tar.bz2 tcl8.4.4-src.tar.bz2<br>
glibc-linuxthreads-2.3.2.tar.bz2 texinfo-4.6.tar.bz2<br>
grep-2.5.1.tar.bz2 util-linux-2.12.tar.bz2<br>
groff-1.19.tar.bz2 vim-6.2.tar.bz2<br>
grub-0.93-gcc33-1.patch zlib-1.1.4.tar.bz2<br>
grub-0.93.tar.bz2 zlib-1.1.4-vsnprintf.patch<br>
gzip-1.3.5.tar.bz2<br>
<br>
<br>
Chapter 5 创建临时系统<br>
<br>
5.1 工具链技术说明<br>
<br>
Chapter 5 的目的是提供一个健全的(sane)临时环境,使我们可以通过 chroot 进入,借助它我们可以在 Chapter 6 建立一个干净无误的 LFS 系统。因此我们要尽可能的从主系统分离,建立一个自给自足(self-contained and self-hosted)的工具链(toolchain)。此临时系统安装在 $LFS/tools 下。<br>
<br>
关键技术要点:<br>
<br>
1. 类似于交叉编译(cross compiling)的原理,把工具装载同一前缀下协同工作,从而发挥一些GNU的“魔力”。<br>
2. 小心处理标准连接库的搜索路径,以保证程序只连接到我们选择的库上。<br>
3. 小心处理GCC的specs文件,来告诉编译器选用正确的动态连接器。<br>
<br>
工作平台(work platform / target triplet): i686-pc-linux-gnu<br>
<br>
确定方法: 解开 binutils 源码,运行 ./config.guess 并观察结果<br>
<br>
动态连接器(动态加载器): /lib/ld-linux.so.2<br>
<br>
确定方法: 用下面的命令来检查主系统中的任何一个二进制程序:'readelf -l <name of binary> | grep interpreter'并观察结果<br>
[root@myhost root]# readelf -l /bin/dmesg | grep interpreter<br>
[Requesting program interpreter: /lib/ld-linux.so.2]<br>
<br>
<br>
5.2 创建$LFS/tools目录,并创建符号连接/tools<br>
<br>
[root@myhost root]# mkdir $LFS/tools<br>
[root@myhost root]# ln -s $LFS/tools /<br>
<br>
5.3 增加lfs用户<br>
<br>
[root@myhost /]# useradd -s /bin/bash -m lfs<br>
[root@myhost /]# passwd lfs<br>
[root@myhost /]# chown lfs $LFS/tools<br>
[root@myhost /]# chown lfs $LFS/sources<br>
[root@myhost /]# su - lfs<br>
[lfs@myhost lfs]$ <br>
<br>
"-" 让 su 命令启动一个新的,干净的shell<br>
<br>
5.4 环境设置<br>
<br>
[lfs@myhost lfs]$ cat >~/.bash_profile << "EOF"<br>
> set +h<br>
> umask 022<br>
> LFS=/mnt/lfs<br>
> LC_ALL=POSIX<br>
> PATH=/tools/bin:$PATH<br>
> export LFS LC_ALL PATH<br>
> unset CC CXX CPP LD_LIBRARY_PATH LD_PRELOAD<br>
> EOF<br>
[lfs@myhost lfs]$ source ~/.bash_profile <br>
<br>
说明:<br>
set +h 关掉bash的 "hash"功能。关掉hash功能,那些交互的命令(make,patch, sed,cp 等等)将总是使用新的程序。<br>
将用户文件创建掩码(umask)设为022。 rwx-r-x-r-x<br>
LC_ALL 变量控制某些软件包的本地化,使它们输出的信息遵守指定国家的规范。设置成 "POSIX" (或"C",它们俩是相同的)我们保证在chroot环境中不会出现任何问题。<br>
我们把 /tools/bin 附加到标准路径前面,是为了在安装过程中,总是能用到已经安装了的临时工具。<br>
CC, CXX, CPP, LD_LIBRARY_PATH 和 LD_PRELOAD 环境变量都有可能破坏我们的工具链,因此这里取消它们的设置,以预防可能的问题。<br>
source 命令读了刚才创建的设置文件。<br>
<br>
#---- install script begin ----------------------------------------------------<br>
mkdir $LFS/tools<br>
ln -s $LFS/tools /<br>
useradd -s /bin/bash -m lfs<br>
passwd lfs<br>
chown lfs $LFS/tools<br>
chown lfs $LFS/sources<br>
su - lfs<br>
<br>
cat > ~/.bash_profile << "EOF"<br>
set +h<br>
umask 022<br>
LFS=/mnt/lfs<br>
LC_ALL=POSIX<br>
PATH=/tools/bin:$PATH<br>
export LFS LC_ALL PATH<br>
unset CC CXX CPP LD_LIBRARY_PATH LD_PRELOAD<br>
EOF<br>
<br>
source ~/.bash_profile<br>
<br>
#---- install script end ------------------------------------------------------<br>
<br>
5.5 安装 Binutils-2.14 第一遍<br>
<br>
预计所需编译时间: 1.0SBU<br>
预计所需硬盘空间: 194MB<br>
<br>
Binutils 是一组开发工具,包括连接器、汇编器和其它用于生成目标文件和档案的工具。<br>
安装下列程序: addr2line, ar, as, c++filt, gprof, ld, nm, objcopy, objdump, ranlib, readelf, size, strings, strip<br>
安装下列库文件: libiberty.a, libbfd.[a, so], libopcodes.[a, so]<br>
<br>
测算时间方法:<br>
time { command seq1 && command seq2 && ... && command seqn; }<br>
注意: 在{后面有一个空格, 在最后一条命令序列后面有一个分号,然后和后面的}只见至少要有一个空格<br>
<br>
[lfs@myhost tools]$ cp $LFS/sources/binutils-2.14.tar.bz2 /tools/<br>
[lfs@myhost tools]$ bunzip2 binutils-2.14.tar.bz2<br>
[lfs@myhost tools]$ tar xvf binutils-2.14.tar<br>
[lfs@myhost tools]$ rm binutils-2.14.tar<br>
[lfs@myhost tools]$ cd binutils-2.14<br>
[lfs@myhost binutils-2.14]$ mkdir ../binutils-build<br>
[lfs@myhost binutils-2.14]$ cd ../binutils-build<br>
[lfs@myhost binutils-build]$ ../binutils-2.14/configure <br>
> --prefix=/tools --disable-nls<br>
[lfs@myhost binutils-build]$ make configure-host<br>
[lfs@myhost binutils-build]$ make LDFLAGS="-all-static"<br>
<br>
make configure-host: 强制所有的子目录都进行配置,无此参数,静态连接就会失败<br>
make LDFLAGS="-all-static": 通过libtool将参数传递给连接器,使 Binutils 软件包中所有程序都静态连接<br>
<br>
[lfs@myhost binutils-build]$ make install<br>
[lfs@myhost binutils-build]$ make -C ld clean<br>
[lfs@myhost binutils-build]$ make -C ld LDFLAGS="-all-static" LIB_PATH=/tools/lib<br>
<br>
为后面的"锁定"glibc准备连接器脚本:<br>
make -C ld clean: 删除所有编译生成文件,但保留子目录ld<br>
make -C ld LDFLAGS="-all-static" LIB_PATH=/tools/lib: 重新编译ld子目录中的所有文件<br>
<br>
#---- install script begin ----------------------------------------------------<br>
cd /tools<br>
cp $LFS/sources/binutils-2.14.tar.bz2 /tools/<br>
bunzip2 binutils-2.14.tar.bz2<br>
tar xvf binutils-2.14.tar<br>
rm binutils-2.14.tar<br>
cd binutils-2.14<br>
mkdir ../binutils-build<br>
cd ../binutils-build<br>
time { ../binutils-2.14/configure <br>
--prefix=/tools --disable-nls &&<br>
make configure-host &&<br>
make LDFLAGS="-all-static" &&<br>
make install &&<br>
<br>
make -C ld clean &&<br>
make -C ld LDFLAGS="-all-static" LIB_PATH=/tools/lib; <br>
}<br>
<br>
#---- install script end ------------------------------------------------------<br>
<br>
real 2m54.436s<br>
user 2m22.380s<br>
sys 0m22.020s<br>
<br>
<br>
5.6 安装 GCC-3.3.1 第一遍<br>
<br>
预计所需编译时间: 4.4SBU<br>
预计所需硬盘空间: 300MB<br>
<br>
GCC软件包包含GNU C/C++编译器<br>
安装下列程序: c++, cc(link to gcc), cc1, cc1plus, collect2, cpp, g++, gcc, gccbug, gcov<br>
安装下列库文件: libgcc.a, libgcc_eh.a, libgcc_s.so, libstdc++.[a,so] 和 libsupc++.a<br>
<br>
[lfs@myhost tools]$ cp $LFS/sources/gcc-core-3.3.1.tar.bz2 /tools<br>
[lfs@myhost tools]$ bunzip2 gcc-core-3.3.1.tar.bz2 <br>
[lfs@myhost tools]$ tar xvf gcc-core-3.3.1.tar <br>
[lfs@myhost tools]$ rm gcc-core-3.3.1.tar <br>
[lfs@myhost tools]$ cd gcc-3.3.1<br>
[lfs@myhost gcc-3.3.1]$ mkdir ../gcc-build<br>
[lfs@myhost gcc-3.3.1]$ cd ../gcc-build<br>
[lfs@myhost gcc-build]$ ../gcc-3.3.1/configure --prefix=/tools <br>
> --with-local-prefix=/tools <br>
> --disable-nls --enable-shared <br>
> --enable-languages=c<br>
<br>
configure --enable-shared: 这个参数咋一看有点自相矛盾。但只有加上它,才能编译出 libgcc_s.so.1 和 libgcc_eh.a, Glibc(下一个软件包)的配置脚本只有在能找到 libgcc_eh.a 时才能确保产生正确的结果。请注意,gcc的可执行程序仍然会被静态连接,因为这是由后面 BOOT_LDFLAGS 中的 -static来控制的。<br>
<br>
[lfs@myhost gcc-build]$ make BOOT_LDFLAGS="-static" bootstrap<br>
<br>
make bootstrap: bootstrap目标不仅仅是编译 GCC,而是重复编译它几次。它用第一次编译生成的程序来第二次编译自己,然后又用第二次编译生成的程序来第三次编译自己,最后比较第二次和第三次编译的结果,以确保编译器能毫无差错的编译自身,这通常表明编译是正确的。<br>
<br>
[lfs@myhost gcc-build]$ make install<br>
[lfs@myhost gcc-build]$ ln -sf gcc /tools/bin/cc<br>
[lfs@myhost gcc-build]$ cd .. <br>
[lfs@myhost tools]$ rm -rf gcc-3.3.1<br>
[lfs@myhost tools]$ rm -rf gcc-build<br>
<br>
#---- install script begin ----------------------------------------------------<br>
cd /tools<br>
cp $LFS/sources/gcc-core-3.3.1.tar.bz2 /tools<br>
bunzip2 gcc-core-3.3.1.tar.bz2 <br>
tar xvf gcc-core-3.3.1.tar <br>
rm gcc-core-3.3.1.tar <br>
cd gcc-3.3.1<br>
mkdir ../gcc-build<br>
cd ../gcc-build<br>
time { ../gcc-3.3.1/configure --prefix=/tools <br>
--with-local-prefix=/tools <br>
--disable-nls --enable-shared <br>
--enable-languages=c &&<br>
make BOOT_LDFLAGS="-static" bootstrap &&<br>
make install &&<br>
ln -sf gcc /tools/bin/cc; <br>
}<br>
cd .. <br>
rm -rf gcc-3.3.1<br>
rm -rf gcc-build<br>
<br>
#---- install script end ------------------------------------------------------<br>
<br>
real 12m6.969s<br>
user 11m21.500s<br>
sys 0m39.570s<br>
<br>
<br>
5.7 安装 Linux-2.4.22 头文件<br>
<br>
预计所需编译时间: 0.1SBU<br>
预计所需硬盘空间: 186MB<br>
<br>
[lfs@myhost tools]$ cp $LFS/sources/linux-2.4.22.tar.bz2 /tools<br>
[lfs@myhost tools]$ bunzip2 linux-2.4.22.tar.bz2 <br>
[lfs@myhost tools]$ tar xvf linux-2.4.22.tar <br>
[lfs@myhost tools]$ rm linux-2.4.22.tar<br>
[lfs@myhost tools]$ cd linux-2.4.22<br>
[lfs@myhost linux-2.4.22]$ make mrproper<br>
[lfs@myhost linux-2.4.22]$ make include/linux/version.h<br>
创建平台相关的 include/asm 符号链接:<br>
[lfs@myhost linux-2.4.22]$ make symlinks<br>
安装平台相关的内核头文件:<br>
[lfs@myhost linux-2.4.22]$ mkdir /tools/include/asm<br>
[lfs@myhost linux-2.4.22]$ cp include/asm/* /tools/include/asm<br>
[lfs@myhost linux-2.4.22]$ cp -R include/asm-generic /tools/include<br>
安装跨平台的内核头文件:<br>
[lfs@myhost linux-2.4.22]$ cp -R include/linux /tools/include<br>
还有几个内核头文件要使用 autoconf.h 头文件。因为我们没有配置内核,所以就需要自己创建这个文件,以避免编译错误。创建一个空的 autoconf.h 文件。<br>
[lfs@myhost linux-2.4.22]$ touch /tools/include/linux/autoconf.h<br>
[lfs@myhost linux-2.4.22]$ cd ..<br>
[lfs@myhost tools]$ rm -rf linux-2.4.22<br>
<br>
#---- install script begin ----------------------------------------------------<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -