创建我的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 系统。
- 创建我的LFS-(2)
- 创建我的LFS-(1)
- 创建我的LFS-(3)
- 我的LFS起步篇
- 我做LFS的相关
- 我的LFS之旅!!!!!!!
- 我的LFS ID是26328
- lfs我来了..
- LFS(2)
- 第一章 创建自己的GNU/Liunx系统——LFS
- Joyan的LFS之路(2)
- LFS编译2次gcc的原因
- LFS笔记(创建虚拟机)
- LFS的安装脚本
- lfs的介绍
- git lfs的使用
- LFS安装(2)
- LFS<0603-2>
- strlen和sizeof的区别
- 在虚拟机中直接使用liveCD:lfslivecd-x86-6.3-r2160.iso
- LFS开始之前 - 转载
- 虚函数的作用
- 创建我的LFS-(1)
- 创建我的LFS-(2)
- 创建我的LFS-(3)
- ubuntu10.04 中安装 Xdialog
- zenity 脚本设置系统日期和时间
- linux 自动挂载U盘(1)
- gtkdialog 编译时的 signal 结构体问题
- 添加Udev规则,让Linux自动挂载U盘(转载)
- 使用 udev 高效、动态地管理 Linux 设备文件(转载)--1
- 使用 udev 高效、动态地管理 Linux 设备文件(转载)--2