博主的更多文章>>
完全手工打造自定义的LINUX
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。否则将追究法律责任。https://www.wendangku.net/doc/3811479768.html,/65148/67355
LFS相关
LFS是Linux From Scratch的简称,LFS 存在的一个重要原因是可以帮助人们学习li nux 系统内部是如何工作的。构建一个LFS 系统会帮助演示是什么使linux 运转,各种组件如何在一起互相依赖的工作。最好的事情之一通过这种学习可以获得完全根据自己的需求定制linux 系统的能力。
LFS 的一个关键的好处是它让用户对于系统有更多的控制,而不是依赖于他人的linux 实现。在LFS 的世界里,你自己坐在司机的位置,掌控系统的每一个细节,比如目录布局和启动脚本配置等等。你也能掌控在哪里、为何、以及怎样安装每一个程序。有关LFS相关的资料可以去这个链接中查找.[url]https://www.wendangku.net/doc/3811479768.html,/[/url] 。
本文的环境为VM5.5搭建,其中分配给虚拟机的内存为256M,硬盘大小为8G,当然,真正完成后系统的大小不到600M,但是在编译时至少需要3G的空间。为了方便使用,其中的软件包可以去LFS项目中下载现成的ISO包,地址为[url]http://kerrek.linuxfromscr https://www.wendangku.net/doc/3811479768.html,/pub/lfs-livecd/[/url] lfslivecd-x86-6.3-r2130.iso,当然,如果想使用更新的软件,请去相应的网站下载。这里的用的是lfslivecd-x86-6.3-r2130.iso。
由于制作的过程比较长,可能会持续好几天,如果是通过VM来做的话,可以利用它的暂停功能来保护现场,使用时间启动现场继续制作过程。
注意:这里出现的指令都是必须要输入的指令,不同于以前的文章风格。
一:初始化制作环境。
在使用VM时有一个麻烦的地方,它不能从物理机器保存的文件中通过复制粘贴命令的方式来进行安装制作,而LFS有很多的编译指令或其它命令都大同小异,本着方便至上的原因,所以开启它的网络功能,然后通过远程连接工具(Putty,SshClient)来进行指令操作。
使用光盘启动,没什么好说的,到了设置系统时间和地区时如下图所示:
1:完成后会启动到用户模式,输入下列指令用开启网络功能并设置管理员密码。注意:在设置VM虚拟机时在有关网卡的设定中请使用"桥接"模式,否则可能获取不到IP,而且局域网中还要满足可以通过DHCP的方式来获取IP。
2:通过SshClient连入主机,对硬盘执行分区操作
这里可以按照你自己的需要的分区,这里我按照设置一个根分区和一个交换分区为例,交换分区占用512M,其余的全部分给根分区,/dev/hda1为交换分区;/dev/hda2作为目标系统根目录。
保存退出后进行磁盘分区的格式化
3:创建相应的文件和路径。
在这里要说明的是两个LiveCD下的重要目录/usr/share/LFS-BOOK-6.3-HTML目录存放的就是LFS手册;/lfs-sources里面存放的就是建造LFS所需要的源码包,不需要到处下软件了。具体指令的作用可以参考相关文档,这里就不做详细说明了。所创建的符号链接使得将要编译的工具链总是位于/tools目录下,这意味着编译器、汇编器和连接器在编译目标目录为/tools时总可以使用。
以root 用户登录的时候,犯一个错误就足以损坏甚至摧毁系统,因此,本章我们推荐使用一个无特权的用户来编译和安装软件包。您可以使用您自己的用户名,不过为了建立一个干净的工作环境,建议您新建一个名为lfs 的组,并在其中添加一个名为lfs 的用户,我们将在安装过程中使用这个用户。
作为lfs 用户登录的时候,初始shell 通常是一个登陆shell(login shell),它会首先读取宿主系统的/etc/profile 文件(可能包含一些设置和环境变量),然后继续读取 .bash_profil e 文件来完成登录初始化。.bash_profile 文件中的exec env -i.../bin/bash 命令用完全空的环境来取代当前的环境(除了继承HOME, TERM, PS1 变量外)。这样能保证我们的编译环境不会被宿主系统中不必要的或者有潜在危险的环境变量所影响,从而确保获得一个干净的工作环境。
二:构建临时编译环境。
这里的总体目标是提供一个临时环境,您可以chroot 到这个环境,在里面构建一个干净、没有问题的目标LFS 系统。为了尽量的与宿主系统分开,我们创建了一个自包含、自依赖的工具链。
1:Binutils第一遍
大家可以注意到后面所有的解包命令均使用tar xvf来完成,而不管文件的压缩方式是b z2还是gz,这是因为较新的tar程序都具有自动识别后缀名并自动调用相应的解压缩工具的能力,所以可以不需要指定压缩方式因LFS的LiveCD中提供的tar版本比较新,后面制作的tar版本也比较新,因此支持自动识别的能力,同时为了使文章的解压命令
看起来比较统一方便维护(同样对于想制作成脚本的朋友也会比较方便)因此后面统一使用t
2:GCC第一遍
3:Linux-2.6.22.5 API Headers
4:Glibc
5:调整并测试工具链
现在,需要停下来确认新工具链的基本功能(编译和连接)是否按预期工作,运行下面的命令做一个简单的合理性检查:
6:TCL
7:GCC第二遍
现在,需要停下来确认GCC的基本功能(编译和连接)是否按预期工作,运行下面的命令做一个简单的合理性检查:
8:Binutils第二遍
9:Ncurses
10:Bash
11:Bzip
12:Coreutils
13:Diffutils
14:Findutils
15:Gawk
16:Gettext
17:Grep
18:Gzip
19:Make
20:Patch
21:Perl
22:Sed
23:Tar
24:Textinfo
25:Util-linux
26:清理系统垃圾,去掉调试符号
这一步的步骤是可选的,但如果LFS 分区实在很小则除外;了解哪些东西是不必要的、可以删除的也是有好处的。到目前为止已经安装的可执行程序和库文件包含大约130 MB 不必要的调试符号,运行下面的命令删除这些符号:
三:构建LFS系统
我们通过chroot 命令进入一个临时的微型Linux 系统,并作一些最后的准备,然后开始安装软件包。在这里软件包的安装顺序应当严格遵守,以确保没有一个程序会把/tools 作为路径硬连接到代码中。同样不要并行编译包。并行编译可能会节省时间(特别是在双CPU的机器上),但也可能造成程序包含/tools 硬连接路径,以致在/tools 目录被删除之后,程序无法运行。
1:改变所有者;挂载虚拟内核文件系统;进入Chroot 环境以及创建/dev设备
2:创建目录树和必要的符号链接
3:创建passwd, group, log 文件
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
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
cd /sources
export LFS=/cdrom/lfs-sources
4:Linux Header
5:Man-pages
6:Glibc
tar xvf $LFS/glibc-2.5.1.tar.bz2
cd glibc-2.5.1
tar -xvf $LFS/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 sed -i 's|@BASH@|/bin/bash|' elf/ldd.bash.in
mkdir -v ../glibc-build
cd ../glibc-build
../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
touch /etc/ld.so.conf
make install
make localedata/install-locales
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
cp -v --remove-destination /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
cat > /etc/ld.so.conf << "EOF"
/usr/local/lib
/opt/lib
EOF
cd ..
rm -rf glibc-build
rm -rf glibc-2.5.1
7:再次调整工具链
现在,最终的 C 库已经安装好了,我们需要再次调整工具链,让随后编译的那些工具都连接到这个库上。基本上,就是把前面"调整工具链"那里做的调整给取消掉。前面的工具链使用的库是从宿主系统的/{,usr/}lib 转向新安装的/tools/lib 目录。同样的,现在工具链使用的库将从临时的/tools/lib 转向LFS 系统最终的/{,usr/}lib 目录。
现在,需要停下来确认新工具链的基本功能(编译和连接)是否按预期工作,运行下面的命令做一个简单的合理性检查:
8:Binutils
9:GCC
这里也最好是测试一下GCC,其方法和前面的测试方法一致。10:Berkeley DB
11:Sed
12:E2fsprogs
13:Coreutils
14:Iana-etc
15:M4
16:Bison