创建我的LFS-(2)

来源:互联网 发布:指向数组指针的指针 编辑:程序博客网 时间:2024/05/16 15:13

    



>>>>>>>>>>>>>>>>开始构建LFS>>>>>>>>>>>>>>>>>>>>


6.2. 挂载虚拟内核文件系统

(1)为虚拟内核文件系统建立挂载目录:

mkdir -pv $LFS/{dev,proc,sys}

(2)创建初始设备节点

mknod -m 600 $LFS/dev/console c 5 1

mknod -m 666 $LFS/dev/null c 1 3

(3)挂载并填充 /dev 目录

mount -v --bind /dev $LFS/dev

(4)挂载虚拟内核文件系统

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



6.4. 进入 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



==========================================================================

注意:从此处开始,都是以root用户在 虚跟环境 下进行操作的。

因此,如果重启,必须重新配置 虚根环境,然后chroot进来。也就是执行:

6.2中的(3) 和 (4),然后是 6.4 中的chroot .......

最好把swap分区给给 swapon 一下。

===> 可以写成脚本,重启后直接执行脚本即可 chroor。

在以下步骤中,编译程序时,使用的:

编译器 gcc 是步骤5.11中编译的纯正的 编译器B2: /tools/bin/gcc

连接器 ld 是步骤5.12中编译的纯正的 连接器B2: /tools/lib/ld-linux.so.2 

库文件 是 /tools/lib (在编译连接器B2时指定的)

==>以上这些工具链都是位于 /tools/ 目录中的!

(在步骤5.7调整工具链中,为gcc产生了spec文件,指定连接器/tools/lib/ld-linux.so.2,即:连接器B2)

==========================================================================



6.5 创建目录

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}



6.6 创建符号连接

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

创建文件系统挂载信息文件

create /etc/mtab

创建账号群组文件

create /etc/passwd

create /etc/group

创建日志记录文件

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

6.7Linux-2.6.22.5 API Headers

安装了:/usr/include/{asm{,-generic},linux,mtd,rdma,sound}/*.h

这些头文件被 glibc 库使用


6.8. Man-pages

直接把各种 man pages 拷贝到 /usr/share/man/ 中。


6.9 Glic

库文件B + 编译器B2 + 链接器B2 ==> 库文件C

配置命令如下,注意:安装路径选项为:--prefix=/usr,即:最终环境C的库文件路径。

../glibc-2.5.1/configure --prefix=/usr \

    --disable-profile --enable-add-ons \

    --enable-kernel=2.6.0 --libexecdir=/usr/lib/glibc



make install 之后,配置glibc:

创建 /etc/nsswitch.conf

创建 /etc/localtime

可以用tzselect这个脚本得到本地时区

配置动态链接库加载程序: /etc/ld.so.conf

默认情况下,动态链接库加载程序(/lib/ld-linux.so.2)搜索 /lib 和 /usr/lib 目录来寻找程序

需要使用的动态连接库。但是,如果某些库在这两个目录之外,你就需要把它们的路径加到

/etc/ld.so.conf 文件里,以便动态链接库加载程序能够找到它们。 

/usr/local/lib 和 /opt/lib 是两个经常包含动态连接库但又不在默认目录中的目录,

我们要把它们添加到动态链接库加载程序的搜索路径中。



6.10 再次调整工具链

(1) 连接器调整

现在,最终的 C 库已经安装好了,我们需要再次调整工具链,让本章随后编译的那些工具都连接到这个库上。

基本上,就是把 5.7 中"调整工具链"那里做的调整给取消掉。在 5.7 中,工具链使用的库是从宿主系统的 

/{,usr/}lib 转向新安装的 /tools/lib 目录。同样的,现在工具链使用的库将从临时的 /tools/lib 转向 

LFS 系统最终的 /{,usr/}lib 目录。


在 5.12 中,第二次编译 binutils 中连接器的最后部分,做了 “为再次调整工具链做准备” 的工作,就是:

make -C ld clean

make -C ld LIB_PATH=/usr/lib:/lib

cp -v ld/ld-new /tools/bin

这个连接器 ld-new 就是到 /usr/lib:/lib 中找库函数。

因此,这里只要把 ld-new 改名为 ld,下面编译程序时,使用的库函数就是 /usr/lib:/lib 中的,满足最终

环境C。

(2)编译器spec文件修正

在5.7 工具链调整 的第2部分,曾经把编译器GCC的spec文件指定的连接器/lib/ld-linux.so.2 全部改为

/tools/lib/ld-linux.so.2,因为那时需要使用环境B中的工具链,即:/tools/ 目录下的工具链。

那么现在,需要调整回来,创建最终的环境C工具链。

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

把 /tools/lib/ld-linux.so.2 改为 /lib/ld-linux.so.2 之后,生成spec文件,下面 gcc 编译时看到有这个

文件,就使用该文件里配置。



>>>> 从这里开始,编译程序时,链接器都是到 /usr/lib:/lib 中寻找库函数。



6.11 binutils

库文件C + 编译器B2 + 链接器B2 ==> 链接器C


第三次编译 binutils,安装到 /usr 目录。



6.12 GCC

库文件C + 编译器B2 + 链接器C ==> 编译器C

../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++

安装到 /usr 目录。

>>>> 此时,最终环境C中的:库文件,编译器,链接器 已经新鲜出炉!

>>>> 因为在 chroot 时,PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin,因此下面编译程序时

将会使用 /usr/bin 中的编译器gcc。




6.13 Berkeley DB-4.4.20

Berkeley DB 包含一些程序和工具,供其他的一些程序来在做数据库相关函数时调用。


6.14 Sed


6.15 E2fsprogs

与ext2, ext3文件系统有关


6.16 Coreutils

Coreutils 软件包包括一套显示、设置基本系统属性的工具。


6.17 Iana-Etc

Iana-Etc 软件包提供了网络服务和协议的数据。


6.18 M4

M4 软件包包含一个宏处理器。

M4 能够将宏展开并将输入拷贝到输出。宏可以是内嵌的也可以是用户定义的,并且可以接受很多参数。

除了展开宏,m4 还有其它内置的功能,比如包含引用文件、运行 Unix 命令、进行整数运算、文本操作、

循环等等。m4 可以被用作一个编译器的前端或作为自身的一个宏处理程序。

6.19 Bison

Bison 软件包包括一个语法分析程序生成器。

根据一系列规则来生成一个可以分析文本文件的结构的程序的程序,Bison 是一个替代 Yacc 

(Yet Another Compiler Compiler) 的语法分析程序生成器。


6.20 Ncurses

Ncurses 程序包提供字符终端处理库,包括面板和菜单。


6.21 Procps

Procps 包含有用于监视系统进程的程序。


6.22 Libtool

GNU libtool 是一个通用库支持脚本,将使用动态库的复杂性隐藏在统一的、可移植的接口中。


6.23 Perl

Perl 将 C, sed, awk 和 sh 的最佳特性集于一身,是一种强大的编程语言。

6.24 Readline

Readline 软件包是一个提供命令行编辑和历史纪录功能的库集合。


6.25 Zlib

6.26 Autoconf

Autoconf 能生成用于自动配置源代码的 shell 脚本。


6.27 Automake

Automake 与 Autoconf 配合使用,产生 Makefile 文件。


6.28 Bash

6.29 Bzip

Bzip2 包含了对文件进行压缩和解压缩的工具,对于文本文件,bzip2 比传统的 gzip 拥有更高压缩比。

6.30 Diffutils

6.31 File

6.32 Findutils

6.33 Flex

Flex 软件包包含一个能生成识别文本模式的程序的工具。

模式识别在很多程序中是非常有用,用户设置一些查询规则,然后 flex 可以生成一个查询程序。

人们使用 flex 可以比亲自编写查询程序更便捷。

6.34 GRUB

GRUB 程序包包含 GRand 统一引导装载程序。

需要把/usr/lib/grub/i386-pc/stage{1,2} 拷贝到/boot/grub/中。

6.35 Gawk

Gawk 软件包包含用于管理文本文件的程序。

6.36 Gettext

Gettext 用于系统的国际化和本地化,可以在编译程序的时候使用本国语言支持(NLS),可以使程序

的输出使用用户设置的语言而不是英文。

6.37 Grep

Grep 可以搜索文件中符合指定匹配模式的行。

6.38 Groff

Groff 软件包包含几个处理和格式化文本的程序。

Groff 把标准的文本和特殊的命令翻译成格式化的输出,就像你在 man 手册页里看到的那样。

6.39 Gzip

6.40 Inetutils

Inetutils 包含基本的网络程序。

6.41 IPRoute2

IPRoute2 包含了基本的和高级的基于 IPv4 网络的程序。

6.42 Kbd

Kbd 包含键盘映射表和键盘工具。

6.43 Less

6.44 Make

6.45 Man-DB

Man-DB 包含查找和显示 man 手册页的程序。

6.46 Mktemp

Mktemp 软件包包含用于在 shell 脚本中创建安全临时文件的程序。

6.47 Module-Init-Tools

Module-Init-Tools 包含处理 2.5.47 及以上版本的内核模块时使用的工具。

6.48 Patch

6.49 Psmisc

Psmisc 包含有用于显示进程信息的程序。

6.50 Shadow

Shadow 包含用于在安全方式下处理密码的程序。

6.51 Sysklogd

Sysklogd 包含记录系统日志信息的程序,比如内核处理意外事务的日志。

创建 /etc/syslog.conf 文件

6.52 Sysinit

Sysvinit 软件包包含一些控制系统启动、运行、关闭的程序。

创建文件:/etc/inittab


6.53 Tar


6.54 Texinfo

Texinfo 软件包包含读取、写入、转换 Info 文档的程序


6.55 Udev

Udev 软件包包含动态地创建设备节点的程序。


6.56 Util-linux

Util-linux 软件包包含许多工具。其中比较重要的是加载、卸载、格式化、分区和管理硬盘驱动器,

打开 tty 端口和得到内核消息。


6.57 Vim

创建 /etc/vimrc 文件。

6.59 再次清理系统

把二进制代码中的调试信息去掉,因为上面编译时都是带 -g 的。

/tools/bin/find /{,usr/}{bin,lib,sbin} -type f -exec /tools/bin/strip --strip-debug '{}' ';'


6.60 从现在起,在退出后,每当重新进入 Chroot 环境,请使用下面修改过的 chroot 命令:

chroot "$LFS" /usr/bin/env -i \

    HOME=/root TERM="$TERM" PS1='\u:\w\$ ' \

    PATH=/bin:/usr/bin:/sbin:/usr/sbin \

    /bin/bash --login



这样做的理由是起初在 /tools 目录下的程序已经不再需要了,这个目录可以删除以重新获得更多硬盘空间。

在实际动手删除这个目录之前,请退出虚根环境并且使用上面修改过的命令重新进入虚根环境。还有一点,

在删除 /tools 目录前,请将此目录打包压缩并且存储在一个安全的地方,以备以后编译另一个 LFS 系统。


原创粉丝点击