Linux课程设计——《基于LFS制作Nginx服务器的Linux发行版》
河南中医学院
《Linux操作系统》课程设计报告
题目:基于LFS制作Nginx服务器的Linux发行版
完成日期: 2012 年 12 月 31 日
目 录
1. 课程设计题目概述………………………………………………………………………………4
2. 研究内容与目的... 4
3. 研究方法... 5
4. 研究报告... 6
4.1.1 下载LFS和LiveCD……………………………………………………………………………………6
4.1.2 新建虚拟主机 …………………………………………………………………………………………6
4.1.3 设置时区和语言…………………………………………………………………………………………6
4.1.4 使用ssh连接LiveCD………………………………………………………………………………6
4.1.5 检查宿主系统工具和版本号……………………………………………………………………7
4.1.6 硬盘分区………………………………………………………………………………………………….7
4.1.7 硬盘格式化………………………………………………………………………………………………7
4.1.8 挂载分区………………………………………………………………………………………………… 7
4.1.9 查看挂在分区………………………………………………………………………………………….8
4.1.10 配置环境………………………………………………………………………………………………….8
4.2.1 交叉编译Binutils………………………………………………………………………………….9
4.2.2 编译GCC…………………………………………………………………………………………………10
4.2.3 Linux内核头件………………………………………………………………………………………10
4.2.4 安装Gblic………………………………………………………………………………………………11
4.2.5 调整工具链…………………………………………………………………………………………… 11
4.2.6 编译Tcl…………………………………………………………………………………………………13
4.2.7 编译Expect……………………………………………………………………………………………13
4.2.8 编译DejaGUN……………………………………………………………………………………………13
4.2.9 第二次编译GCC…………………………………………………………………………………………13
4.2.10 第二次编译Binutils……………………………………………………………………………14
4.2.11 编译工具…………………………………………………………………………………………………15
4.2.12 编译VIM………………………………………………………………………………………………… 21
4.3.1 切换系统…………………………………………………………………………………………………22
4.3.2 创建系统目录结构…………………………………………………………………………………23
4.3.3 安装Linux内核头文件 ……………………………………………………………………… 25
4.3.4 安装man-pages……………………………………………………………………………………. 25
4.3.5 安装Glibc …………………………………………………………………………………………. 26
4.3.6 再次调整工具链…………………………………………………………………………………… 27
4.3.7 安装Binutils和Gcc…………………………………………………………………………….28
4.3.8 安装其他软件包…………………………………………………………………………………….29
4.3.9 搭建Nginx服务器…………………………………………………………………………………31
4.4.1 安装LFS-Bootscripts 6.3……………………………………………………………………32
4.4.2 配置脚本……………………………………………………………………………………………….32
4.4.3 编译Linux内核 ………………………………………………………………………………….35
4.4.4 配置GRUB引导系统……………………………………………………………………………… 37
4.4.5 重启系统 ……………………………………………………………………………………………… 38
5. 测试报告/实验报告... 39
6. 课题研究结论... 40
7. 总结... 41
1.课程设计题目概述
首先系统是基于LFS-Linux from Search来编译制作的,需要从头编译Linux,在编译时我们实现安装时用户对网络的配置、指定root用户、选择硬盘和分区方式、选择时区、选择语言等;编译实现安装系统中自动安装Nginx,实现初始化完成相关配置,提供一个Web服务;编译实现安装中系统自动安装FTP Server,实现初始化完成相关配置,可以通过默认账户访问,直接修改Web服务的目录内容;系统安装完成后,可以通过ssh远程访问操作系统,可以通过Web方式默认访问默认网站,可以通过FTP方式访问网站目录。将做好的系统制作成iso的镜像文件并刻录成光盘,这样就制作了属于个人的Linux操作系统发行版。
【关键词】LFS 制作 Linux 发行版 Nginx
2. 研究内容与目的
Linux From Scratch项目简称LFS,它提供具体的步骤、特定的补丁、必须的脚本,从而提供一个简便的创建Linux发行版的途径。LFS并不是一个发行版,但是它可以作为制作初级发行版的良好练习,它指导你如何制作一个以 Linux 作为内核的操作系统。这个操作系统的所有代码都来自于开源项目,通过编译这些源代码来组成一个实用的操作系统。对于这样的一个系统,其中的每一个地方都是自己编译完成的,不仅可以查看它的源代码实现,而且还可以随意修改,形成一个你自己专属的操作系统版本。一个完全属于你自己的,独一无二的操作系统,更重要的是, 在构建这个系统的过程中,我们将会学到许多的知识。
制作Linux发行版的意义不在于机械地编译,在于让使用者理解编译参数的作用,理解补丁的作用,理解LFS附带的脚本的工作过程,从而达到脱离LFS、独立制作并完善发行版的目的。在制作过程中我们需要搭建FTP服务器,需要搭建Nginx服务器,需要提供Web服务,需要实现使用ssh进行远程连接的功能,作为一个独立的操作系统它的基本功能都需要我们进行预先编译安装,比如需要安装浏览器、压缩软件和解压缩软件,虽然这些功能我们在使用Linux系统时是使用的命令,但是它的背后是需要软件的支持。通过搭建这些服务器,编译安装一些软件,最终实现的是用户在安装我们的操作系统后系统自带安装有Nginx服务器、FTP Server服务器。
3. 研究方法
3.1研究方法
实验法、文献研究法
3.2实验方法
在本地主机上安装虚拟机,加载LFS,使用ssh进行远程连接,然后编译安装。
3.3可行性分析
通过虚拟机软件,可以在一台物理计算机上模拟出二台或多台虚拟的计算机,这些虚拟机完全就像真正的计算机那样进行工作,可以安装操作系统、安装应用程序、访问网络资源等等。在电脑上安装 LFS 是有风险的,操作失误有可能会破坏自己的系统,造成你电脑上的资料丢失。使用虚拟机来安装 LFS 系统,就算是打算在真实的电脑上使用 LFS 系统。
LFS提供具体的安装步骤、特定的补丁、必须的脚本,从而提供一个简便的创建Linux发行版的途径。下载LFS-LiveCD的镜像文件,在虚拟机中进行安装,这样不会对真实的系统造成损坏。另外在这里我们需要考虑每次启动后都能恢复到之前做过的工作,即使出错也不至于从头开始编译,幸运的是在VMWare中有快照这个功能,在完成某一阶段后我们可以创建一个快照,如果后面的编译出错了我们可以从创建的快照的中恢复,方便找出错误的地方,更重要的是节省时间,待完成编译后,删除这些快照。
AnyToISO 是一个镜像文件创建转换工具,能够创建CD/DVD/蓝光光盘,本地文件夹的镜像,支持将BIN, MDF, PDI, CDI, NRG, B5I, IMG, DAA, UIF CD/DVD-ROM等镜像文件转成我们都熟悉的ISO格式,还可以提取任何网上能找到的CD/DVD镜像文件.很多程序只能创建自身格式的镜像文件可以将这些格式的镜像转换成ISO格式,以便装载到Parallels/VMWare虚拟机或烧录它。
4. 研究报告
制作过程
第一章:准备阶段
4.1.1 下载LFS和LiveCD
下载LFS网址为:ftp://anduin.linuxfromscratch.org/LFS-LiveCD/lfslivecd-x86-6.3-r2160.iso
这里我选择的版本是lfslivecd-x86-6.3-r2160
4.1.2 新建虚拟机
(1)选择Workstation为 Workstation 8
(2)选择Guest operating system 为Linux,选择Version为Other Linux 2.6.x kernel
(3)输入Virtual machine name为mylinux
(4)选择CPU为1个单核
(5)选择网络设置为Use network address translation (NAT)
(6)选择IO类型为LSI Logic (Recommended)
(8)选择硬盘设置为Create a new virtual disk
(9)选择硬盘类型为SCSI (recommended)
(10)设置硬盘大小为80G,不选择Allocate all disk space now,设置保存硬盘文件名为mylinux_sda
(11)确认信息后选择镜像文件加载路径,然后启动虚拟机。
4.1.3 设置时区和语言
(1)选择时区为Asia/Chongqing
(2)选择时钟为Localtime
(3)选择语言为Chinese (Simplifiled,UTF-8)
4.1.4 使用ssh连接LiveCD
(1)启动ssh服务
root[~]#/etc/rc.d/init.d/sshd start
(2)修改root的密码
root[~]#passwd
课程设计中出于方便的需要我的密码全设置为123456
(3)查看主机IP地址
root[~]#ifconfig eth0 | grep ‘inet addr’
显示结果为:inet addr 10.20.93.89 Bcast:10.20.93.255 Mask:255.255.255.0
(4)在Windows下使用ping命令测试本地主机与虚拟机之间的连接状况。由于我使用的是校园网,随机分配到本地主机的IP地址为10.20.93.243,本地主机与虚拟机在同一个网段,所以不但能够连接成功,而且在虚拟机中还能够登录外网,这样的好处就是方便了我从网上下载安装penSSl、PCRE、Nginx。
(5)使用putty登录,Host Name为10.20.93.89
4.1.5 检查宿主系统工具和版本号
root[~]# wget http://www.adintr.com/media/tools/lfs_check_host _6.3.sh.txt -host_check.sh
root[~]#source host_check.sh
4.1.6 硬盘分区
将硬盘分四个区
第一个分区:/boot分区,大小为1G,存放启动系统所需的文件。
第二个分区:/root分区(根分区),大小为40G,存放系统的根目录。
第三个分区:/use/src分区,大小为35G,存放源代码。
第四个分区:/swap分区,大小为4G,操作系统的虚拟内存。
分区命令:
root[ ~ ]# fdisk -l
root [ ~ ]# fdisk /dev/sda
4.1.7 硬盘格式化
前三个分区格式化成ext3格式,最后一个分区格式化成swap格式
root [ ~ ]# mke2fs -jv /dev/sda1
root [ ~ ]# mke2fs -jv /dev/sda2
root [ ~ ]# mke2fs -jv /dev/sda3
root [ ~ ]# mkswap /dev/sda4
4.1.8 挂载分区
为了能够在系统上访问这些分区,需要挂载这些分区,挂载之前先创建一个目录 /mnt/lfs,并且设置一个环境变量 LFS=/mnt/lfs。
root [ ~ ]# mkdir /mnt/lfs
root [ ~ ]# export LFS=/mnt/lfs
开始挂载分区
root [ ~ ]# mount -v -t ext3 /dev/sda2 $LFS
root [ ~ ]# mkdir -pv $LFS{/boot,/usr/src}
root [ ~ ]# mount -v -t ext3 /dev/sda1 $LFS/boot
root [ ~ ]# mount -v -t ext3 /dev/sda3 $LFS/usr/src
root [ ~ ]# /sbin/swapon -v /dev/sda4
4.1.9 查看挂载分区
root [ ~ ]# df–h
4.1.10 配置环境
将源代码从光 盘拷贝到硬盘上,由于之前已经将硬盘挂载到了 /mnt/lfs 上面了,所以:
root [ ~ ]# mkdir -v $LFS/sources
root [ ~ ]# chmod -v a+wt $LFS/sources
root [ ~ ]# cp /lfs-sources/* $LFS/sources/
编译正式系统之前,先编译一套工具,现在就创建好存放这些工具的目录:
root [ ~ ]# mkdir -v $LFS/tools
root [ ~ ]# ln -sv $LFS/tools /
创建一个用来完成编译工作的用户(同样设置密码为123456):
root [ ~ ]# groupadd lfs
root [ ~ ]# useradd -s /bin/bash -g lfs -m -k /dev/null lfs
root [ ~ ]# passwd lfs
root [ ~ ]# chown -v lfs $LFS/tools
root [ ~ ]# chown -v lfs $LFS/sources
root [ ~ ]# su - lfs
lfs [ ~ ]$
创建两个脚本来设置工作的环境变量,第一个 ~/.bash_profile 是用户登时自动执行的,我们创建并编译这个文件为:
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL PATH
W(W用来保存对环境变量的配置)
第二章:构建临时工具
要构建一个操作系统,需要有一些工具,其中最重要的就是编译器。gcc 支持一种交叉编译的方法,即编译出和当前编译器所在环境不同的环境的目标代码,通过反复编译、逐步将构建出的目标代码和宿主系统环境分离开来。
4.2.1 交叉编译Binutils
binutils 包含了汇编器,连接器等工具。gcc 依赖于这些工具,在编译的时候就会对这 些工具做检测。编译过程如下:
lfs:~$ cd $LFS/sources
lfs:/mnt/lfs/sources$ tar xvf binutils-2.17.tar.bz2
lfs:/mnt/lfs/sources$ mkdir binutils-build
lfs:/mnt/lfs/sources$ cd binutils-build
lfs:/mnt/lfs/sources/binutils-build$ CC="gcc -B/usr/bin/" ../binutils-2.17/configure --prefix=/tools --disable-nls --disable-werror
lfs:/mnt/lfs/sources/binutils-build$ make install
lfs:/mnt/lfs/sources/binutils-build$ make -C ld clean
lfs:/mnt/lfs/sources/binutils-build$ make -C ld LIB_PATH=/tools/lib
lfs:/mnt/lfs/sources/binutils-build$ cp -v ld/ld-new /tools/bin
4.2.2 编译GCC
先将命令写入脚本,然后直接运行脚本来完成所有的编译。
lfs:~$ cat > build_gcc.sh << "EOF"
> cd $LFS/sources
> tar xvf gcc-4.1.2.tar.bz2
> mkdir 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
> make bootstrap
> make install
> ln -vs gcc /tools/bin/cc
> EOF
lfs:~$ source build_gcc.sh
4.2.3 Linux内核头文件
lfs:~$ cat > build_linux_header.sh << "EOF"
> cd $LFS/sources
> tar xvf 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
> EOF
lfs:~$ source build_linux_header.sh
4.2.4 安装Gblic
lfs:~$ cat > build_glibc.sh << "EOF"
> cd $LFS/sources
> tar xvf 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
> mkdir -v /tools/etc
> touch /tools/etc/ld.so.conf
> make install
> EOF
lfs:~$ source build_glibc.sh
4.2.5 调整工具链
现在,有了连接器,汇编器,GCC 编译器,还有 Glibc 库,一个基本的 C 编译环 境所需要的内容已经齐备了。下面要做一些设置,让之后的编译都在我们创建的工具上进行。首先需要调整的是第一个 Binutils 中的连接器,它需要重命名才能被找到和使用。在进 行 备 份 之后 , 用 调 整 后 的 连 接 器 替 换 之 前 的 , 并 且 创 建 一 个 连 接 到 /tools/$(gcc -dumpmachine)/bin 下面:
lfs:~$ mv -v /tools/bin/{ld,ld-old}
lfs:~$ mv -v /tools/$(gcc -dumpmachine)/bin/{ld,ld-old}
lfs:~$ mv -v /tools/bin/{ld-new,ld}
lfs:~$ ln -sv /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld
下面通过修改 gcc 的 specs 文件来调整 gcc 所使用的动态连接器。
lfs:~$ gcc -dumpspecs | sed 's@^/lib/ld-linux.so.2@/tools&@g' > `dirname $(gcc -print-libgcc-file-name)`/specs
调整完成后需要进行一次测试,通过编译一个 .c 文件,然后分析生成的二进制文件来查看它所连接的库是否指向了我们的工具下。
lfs:~$ echo "main(){}" > dummy.c
lfs:~$ cc dummy.c
lfs:~$ readelf -l a.out | grep '/tools'
lfs:~$ rm -v dummy.c a.out
4.2.6 编译Tcl
gcc 和 binutils 的测试需要用到 Tcl,为了之后的测试能够运行我们先要编译它:
lfs:~$ cat > build_tcl.sh << "EOF"
> cd $LFS/sources
> tar xvf tcl8.4.15-src.tar.gz
> cd tcl8.4.15/unix
> ./configure --prefix=/tools
> make
> make install
> make install –private -headers
> ln -sv tclsh8.4 /tools/bin/tclsh
> EOF
lfs:~$ source build_tcl.sh
4.2.7 编译Expect
expect 提供了在脚本中和需要交互的程序进行对话的功能。
lfs:~$ cat > build_expect.sh << "EOF"
> cd $LFS/sources
> tar xvf expect-5.43.0.tar.gz
> cd expect-5.43
> patch -Np1 -i ../expect-5.43.0-spawn-1.patch
> 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 SCRIPTS="" install
> EOF
4.2.8编译DejaGNU
DejaGNU 包含了其他程序的测试框架。
lfs:~$ cat > build_dejagnu.sh << "EOF"
> cd $LFS/sources
> tar xvf dejagnu-1.4.4.tar.gz
> cd dejagnu-1.4.4
> ./configure --prefix=/tools
> make install
> make check
> cd
> EOF
lfs:~$ source build_dejagnu.sh
4.2.9第二次编译GCC
现在,测试 GCC 和 Binutils 的工具已经安装好了,再次编译 gcc,让它使用新的glibc,并中签当的测试。运行如下命令:
lfs:~$ cat > build_gcc2.sh << "EOF"
> cd $LFS/sources
> rm gcc-4.1.2 -f -r
> rm gcc-build -f -r
> tar xvf gcc-4.1.2.tar.bz2
> mkdir gcc-build
> cd gcc-4.1.2
> cp -v gcc/Makefile.in{,.orig}
> sed 's@\./fixinc\.sh@-c true@' gcc/Makefile.in.orig > gcc/Makefile.in
> cp -v gcc/Makefile.in{,.tmp}
> sed 's/^XCFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in.tmp > gcc/Makefile.in
> patch -Np1 -i ../gcc-4.1.2-specs-1.patch
> cd ../gcc-build
> ../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
> make -k check
> make install
> EOF
lfs:~$ source build_gcc2.sh
4.2.10第二次编译Binutils
lfs:~$ cat > build_binutils2.sh << "EOF"
> cd $LFS/sources
> rm -r -f binutils-build
> rm -r -f binutils-2.17
> tar xvf binutils-2.17.tar.bz2
> mkdir binutils-build
> cd binutils-build
> ../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 ld/ld-new /tools/bin
> cd
> echo -e "\aFinished"
> EOF
lfs:~$ source build_binutils2.sh
4.2.11编译工具
编译环境完成后还需要一系列的工具, LFS 6.3 中一些简单的工具包括:
Ncurses: 独立于终端的字符处理库;
Bash:最常用的 Shell 终端;
Bzip2:Bzip2 包含了对文件进行压缩和解压缩的工具,对于文本文件,
Coreutils:软件包包括一整套用于显示和设置基本系统特征的工具;
Diffutils:软件包里的程序可以显示两个文件或目录的差异;
Findutils:软件包包含查找文件的程序。
Gawk:软件包包含处理文本文件的程序;
Gettext:包含用于系统的国际化和本地化的工具,这些工具允许用 NLS来编译程序,而以用户本国的语言输出消息;
Grep:包含查找文件中内容的程序;
Gzip:软件包包含了压缩和解压文件的程序;
Make:软件包包含一个编译软件包的程序;
Patch:软件包包含一个根据“patch”文件来修改或建立文件的程序。补丁文件通常是用 diff 程序创建的;
Perl:软件包包含实用萃取与报告语言;
Sed:软件包包含一个流编辑器;
Tar:软件包含有一个归档程序;
Texinfo:软件包包含读取、写入和转换成 Info 文档的程序;
Util-linux:包含许多的工具程序,包括文件系统,控制台,分区,消息等等。
使用 vi build_tools.sh 来进行编辑:
cd $LFS/sources
tar xvf ncurses-5.6.tar.gz
cd ncurses-5.6
./configure --prefix=/tools --with-shared
e-overwrite
make
make install
cd $LFS/sources
tar xvf bash-3.2.tar.gz
cd bash-3.2
patch -Np1 -i ../bash-3.2-fixes-5.patch
--without-debug --without-ada --enabl
./configure --prefix=/tools --without-bash-malloc
make
make tests
make install
ln -vs bash /tools/bin/sh
cd $LFS/sources
tar xvf bzip2-1.0.4.tar.gz
cd bzip2-1.0.4
make
make PREFIX=/tools install
cd $LFS/sources
tar xvf coreutils-6.9.tar.bz2
cd coreutils-6.9
./configure --prefix=/tools
make
make RUN_EXPENSIVE_TESTS=yes check
make nstall
cp -v src/su /tools/bin/su-tools
cd $LFS/sources
tar xvf diffutils-2.8.1.tar.gz
cd diffutils-2.8.1
./configure --prefix=/tools
make
make install
cd $LFS/sources
tar xvf findutils-4.2.31.tar.gz
cd findutils-4.2.31
./configure --prefix=/tools
make
make install
cd $LFS/sources
tar xvf gawk-3.1.5.tar.bz2
cd gawk-3.1.5
./configure --prefix=/tools
echo -e "\n#define HAVE_LANGINFO_CODESET 1\n#define HAVE_LC_MESSAGES 1\n" >> con
fig.h
make
make check
make install
cd $LFS/sources
tar xvf gettext-0.16.1.tar.gz
cd gettext-0.16.1/gettext-tools
./configure --prefix=/tools --disable-shared make -C gnulib-lib
make -C src msgfmt
cp -v src/msgfmt /tools/bin
cd $LFS/sources
tar xvf grep-2.5.1a.tar.bz2
cd grep-2.5.1a
./configure --prefix=/tools --disable-perl-regexp
make
make check
make install
cd $LFS/sources
tar xvf gzip-1.3.12.tar.gz
cd gzip-1.3.12
./configure --prefix=/tools
make
make check
make install
cd $LFS/sources
tar xvf make-3.81.tar.bz2
cd make-3.81
./configure --prefix=/tools
make
make check
make install
cd $LFS/sources
tar xvf patch-2.5.4.tar.gz
cd patch-2.5.4
./configure --prefix=/tools
make
make install
cd $LFS/sources
tar xvf perl-5.8.8.tar.bz2
cd perl-5.8.8
patch -Np1 -i ../perl-5.8.8-libc-2.patch
./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
cd $LFS/sources
tar xvf sed-4.1.5.tar.gz
cd sed-4.1.5
./configure --prefix=/tools
make
make check
make install
cd $LFS/sources
tar xvf tar-1.18.tar.bz2
cd tar-1.18
./configure --prefix=/tools
make
make check
make install
cd $LFS/sources
tar xvf texinfo-4.9.tar.bz2
cd texinfo-4.9
./configure --prefix=/tools
make
make check
make install
cd $LFS/sources
tar xvf util-linux-2.12r.tar.bz2
cd util-linux-2.12r
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
cd
echo -e "\aFinished"
脚本编辑完成后开始安装:
lfs:~$ source build_tools.sh
下面的脚本用于验证以上的安装是否成功:
#!/bin/bash
function check_tool() {
local name=$1
local val=$2
echo -e -n "check $1...\t"
if [ "$val" = "" ]; then
echo -e "\e[1;31m[FAILED]\e[0m"
else
echo -e "\e[1;32m[OK]\e[0m"
fi
}
check_tool "Ncurses" `ls /tools/lib/libncurse* | grep /tools` check_tool "Bash" `which bash | grep /tools`
check_tool "Bzip2" `which bzip2 | grep /tools`
check_tool "Coreutils" `which chown | grep /tools`
check_tool "Diffutils" `which diff | grep /tools`
check_tool "Findutils" `which find | grep /tools`
check_tool "Gawk" `which awk | grep /tools`
check_tool "Gettext" `which msgfmt | grep /tools`
check_tool "Grep" `which grep | grep /tools`
check_tool "Gzip" `which gzip | grep /tools`
check_tool "Patch" `which patch | grep /tools`
check_tool "Perl" `which perl | grep /tools`
check_tool "Sed" `which sed | grep /tools`
check_tool "Tar" `which tar | grep /tools`
check_tool "Texinfo" `which info | grep /tools`
check_tool "Util-linux" `which mount | grep /tools`
4.2.12 编译VIM
LFS 6.3 在编译临时工具的时候并没有包含vim,虽然之后的过程可以不使用vim来完成,但是如果有这个工具在的话会方便很多,所以这里我们先编译一个临时版本来使用。编译过程如下:
lfs:~$ cd $LFS/sources
lfs:/mnt/lfs/sources$ tar xvf vim-7.1.tar.bz2
lfs:/mnt/lfs/sources$ cd vim71
lfs:/mnt/lfs/sources/vim71$ patch -Np1 -i ../vim-7.1-fixes-1.patch
lfs:/mnt/lfs/sources/vim71$./configure --prefix=/tools --enable-gui=no --without-x
lfs:/mnt/lfs/sources/vim71$ make
lfs:/mnt/lfs/sources/vim71$ make test
lfs:/mnt/lfs/sources/vim71$ make install
lfs:/mnt/lfs/sources/vim71$ which vim
lfs:/mnt/lfs/sources/vim71$ ln -sv vim /tools/bin/vi
已经建立好了用于构建 LFS 系统的工具了,为了尽量减少宿主系统的影响,使用 chroot 切换到新的系统中进行工作,然后再安装系统软件。
第三章 构建系统软件
4.3.1 切换系统
在之前的$LFS/tools 是属于lfs 这个用户的,而 lfs 这个用户是宿主系统上的用户, 所以我们首先要把文件的所有者改回 root,由于 root 的用户ID和组ID 都是0,可以确保在新系统下面所有者仍然是 root。
root [ ~ ]# export LFS=/mnt/lfs
root [ ~ ]# mkdir -pv $LFS/{dev,proc,sys}
root [ ~ ]# mknod -m 600 $LFS/dev/console c 5 1
root [ ~ ]# mknod -m 666 $LFS/dev/null c 1 3
root [ ~ ]# mount -v --bind /dev $LFS/dev
root [ ~ ]# mount -vt devpts devpts $LFS/dev/pts
root [ ~ ]# mount -vt tmpfs shm $LFS/dev/shm
root [ ~ ]# mount -vt proc proc $LFS/proc
root [ ~ ]# mount -vt sysfs sysfs $LFS/sys
现在使用 chroot 来切换环境,为了让以后重新登录时切换方便,把切换的命令放入脚本中,以后每次登陆后都运行一次这个脚本:
root [ ~ ]# cat > chsys.sh << "EOF"
> export LFS=/mnt/lfs
> 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
> EOF
root [ ~ ]# chmod +x chsys.sh
root [ ~ ]# ./chsys.sh
I have no name!:/#
4.3.2 创建系统目录结构
Linux/Unix系统的目录树是有一定规则的,为了解决各种系统的一些差别,已经形成了一个标我们这里将基本按照标准来创建这些目录结构:
I have no name!:/# mkdir -pv /{bin,boot,etc/opt,home,lib,mnt,opt}
I have no name!:/# mkdir -pv /{media/{floppy,cdrom},sbin,srv,var}
I have no name!:/# install -dv -m 0750 /root
I have no name!:/# install -dv -m 1777 /tmp /var/tmp
I have no name!:/# mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src}
I have no name!:/# mkdir -pv /usr/{,local/}share/doc,info,locale,man}
I have no name!:/# mkdir -v /usr/{,local/share/misc,terminfo,zoneinfo}
I have no name!:/# mkdir -pv /usr/{,local/}share/man/man{1..8}
I have no name!:/# for dir in /usr /usr/local; do
> ln -sv share/{man,doc,info} $dir
> done
I have no name!:/# mkdir -v /var/{lock,log,mail,run,spool}
I have no name!:/# mkdir -pv /var/{opt,cache,lib/{misc,locate},local}
为了保证兼容性,接下来创建一些符号连接:
I have no name!:/# ln -sv /tools/bin/{bash,cat,echo,grep,pwd,stty}/bin
I have no name!:/# ln -sv /tools/bin/perl /usr/bin
I have no name!:/# ln -sv /tools/lib/libgcc_s.so{,.1} /usr/lib
I have no name!:/# ln -sv /tools/lib/libstdc++.so{,.6} /usr/lib
I have no name!:/# ln -sv bash /bin/sh
创建一个空文件/etc/mtab,用来记录已经加载的文件系统:
I have no name!:/# touch /etc/mtab
创建/etc/passwd 和/etc/group 文件,这两个文件记录了系统的用户和组信息:
I have no name!:/# cat > /etc/passwd << "EOF"
>root:x:0:0:root:/root:/bin/bash
>nobody:x:99:99:Unprivileged User:/dev/null:/bin/false
> EOF
I have no name!:/# 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 就可以看到正常的命令提示符了:
I have no name!:/# exec /tools/bin/bash --login +h
root:/#
login,agetty 和 init 等一些程序要使用日志文件来记录登陆之类的信息,果文件不 存在,它们就无法写入,所以把这些日志文件先初始化好:
root:/# touch /var/run/utmp /var/log/{btmp,lastlog,wtmp}
root:/# chgrp -v utmp /var/run/utmp /var/log/lastlog
root:/# chmod -v 664 /var/run/utmp /var/log/lastlog
系统结构就创建到此了,下面开始安装软件。
root:/# chgrp -v utmp /var/run/utmp /var/log/lastlog
root:/# chmod -v 664 /var/run/utmp /var/log/lastlog
系统结构就创建到此了,下面我们开始安装软件。
4.3.3 安装Linux内核头文件
Glibc 需要这些头文件才能工作,所以我们需要首先安装它。
root:/# cd
root:~# cat > install_linux_header.sh << "EOF"
> cd /sources
> rm -r linux-2.6.22.5
> tar xvf linux-2.6.22.5.tar.bz2
> cd linux-2.6.22.5
> 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
> echo -e '\aFinished!'
> EOF
root:~# source install_linux_header.sh
4.3.4 安装man-pages
包含了一些用户手册。
root:~# cat > install_man_page.sh << "EOF"
>cd /sources
>tar xvf man-pages-2.63.tar.bz2
>cd man-pages-2.63
>make install
>cd
>echo -e '\aFinished!'
>EOF
root:~# source install_man_page.sh
4.3.5 安装 Glibc
Glibc 软件包包含主要的 C 库。这个库提供了基本例程, 用于分配内存、搜索目录、 打开关闭文件、 读写文件、 字串处理、模式匹配、数学计算等等。Glibc 对系统来说很重要,所以我们一步一步的来手动安装,确保过程中没有出现错误。
首先,我们清除上次安装的临时文件并重新解压:
root:~# cd /sources
root:/sources# rm -r glibc-2.5.1
root:/sources# tar xvf glibc-2.5.1.tar.bz2
root:/sources# cd glibc-2.5.1
root:/sources/glibc-2.5.1#
root:/sources/glibc-2.5.1# tar xvf ../glibc-libidn-2.5.1.tar.gz
root:/sources/glibc-2.5.1# mv glibc-libidn-2.5.1 libidn
root:/sources/glibc-2.5.1# sed -i '/vi_VN.TCVN/d' localedata/SUPPORTED
root:/sources/glibc-2.5.1# sed -i 's|libs -o|libs-L/usr/lib-Wl,
-dynamic-linker=/lib/ld-linux.so.2 'scripts/test-installation.pl
现在开始为编译进行配置:
root:/sources/glibc-2.5.1# rm -r ../glibc-build
root:/sources/glibc-2.5.1# mkdir ../glibc-build
root:/sources/glibc-2.5.1# cd ../glibc-build
root:/sources/glibc-build# ../glibc-2.5.1/configure --prefix=/usr --disable-profile --enable-add-ons --enable-kernel=2.6.0 --libexecdir=/usr/lib/glibc
4.3.6 再次调整工具链
现在,最终的 Glibc 库已经安装好了,需要再次调整工具链,让随后编译的那些工具都连接到这个库上。上一次调整工具链的时候,从宿主系统/{,usr/}lib 转向新安装 的/tools/lib 目录。现在,把工具链使用的库将从临时的 /tools/lib 转向 LFS 系统最终的/{,usr/}lib目录。调整的过程和之前是类似的。
root:~# mv -v /tools/bin/{ld,ld-old}
root:~# mv -v /tools/$(gcc -dumpmachine)/bin/{ld,ld-old}
root:~# mv -v /tools/bin/{ld-new,ld}
root:~# ln -sv /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld
root:~# 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
首先,进行备份后替换掉原来的连接器。然后修改 gcc 的 specs 文件,只需要把其中 /tools 的内容删除掉,就会自动指向正确的路径了。下面调整进行检查,首先可以尝试用vi 打开 `dirname $(gcc --print-libgcc-file-name)`/specs文件,搜索是否还有 /tools存在。然后我们编译程序来检验:
root:~# echo 'main(){}' > dummy.c
root:~# cc dummy.c -v -Wl,--verbose &> dummy.log
root:~# readelf -l a.out | grep ': /lib'
root:~# grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
root:~# grep -B1 '^ /usr/include' dummy.log
root:~# grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
root:~# grep "/lib/libc.so.6 " dummy.log
root:~# grep found dummy.log
root:~# rm -v dummy.c a.out dummy.log
4.3.7 安装 Binutils和Gcc
首先安装Binutils
root:~# cat > install_binutils.sh << "EOF"
> cd /sources
> rm -r binutils-build
> rm -r binutils-2.17
> tar xvf binutils-2.17.tar.bz2
> cd binutils-2.17
> mkdir -v ../binutils-build
> cd ../binutils-build
> ../binutils-2.17/configure --prefix=/usr --enable-shared
> make tooldir=/usr
> make check
> make tooldir=/usr install
> cp -v ../binutils-2.17/include/libiberty.h /usr/include
> echo -e "\aFinished!"
> EOF
root:~# source install_binutils.sh
然后是gcc
root:~# cat > install_gcc.sh << "EOF"
> cd /sources
> rm -r gcc-build
> rm -r gcc-4.1.2
> tar xvf gcc-4.1.2.tar.bz2
> cd gcc-4.1.2
> sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in
> sed -i 's/^XCFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in
> sed -i 's@\./fixinc\.sh@-c true@' gcc/Makefile.in
> sed -i 's/@have_mktemp_command@/yes/' gcc/gccbug.in
> mkdir -v ../gcc-build
> cd ../gcc-build
> ../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
> make install
> ln -sv ../usr/bin/cpp /lib
> ln -sv gcc /usr/bin/cc
> echo -e "\aFinished!"
> EOF
root:~# source install_gcc.sh
4.3.8 安装其他软件包
到此最终的编译环境就已经搭建好了,现在开始编译和安装软件包。和之前一样,分别进行安装这些软件包。我们要安装的软件包括:
Berkeley DB:数据库相关的程序和工具,许多其他的应用会使用到;
Sed:一个流编辑器;
E2fsprogs:处理ext2文件系统的工具,它还支持ext3和ext4日志文件系统;
Coreutils:包括一套显示、设置基本系统属性的工具;
Iana-Etc:提供了网络服务和协议的数据;
M4:M4 软件包包含一个宏处理器;
Bison:包含一个语法分析程序生成器;
Ncurses:包提供字符终端处理库;
Procps:包含监测程序的程序;
Libtool:一个 GNU 通用库支持脚本,将使用动态库的复杂性隐藏在统一的、可移植的接口中;
Readline:一个提供命令行编辑和历史纪录功能的库集合;
Zlib:一些程序会用到的压缩和解压程序;
Autoconf:生成用于自动配置源代码的shell脚本;
Automake:与Autoconf配合使用,产生Makefile文件;
Bash:Bourne-Again SHell,命令行解析软件;
Bzip2:包含了对文件进行压缩和解压缩的工具;
Diffutils:显示两个文件或目录的差异;
File:用来判断一个或一组文件类型的工具;
Findutils:查找文件的工具;
Flex:能生成识别文本模式程序的工具;
GRUB:包含 GRand 统一引导装载程序;
Gawk:包含处理文本文件的程序;
Gettext:包含国际化和本地化的工具;
Grep:可以搜索文件中符合指定匹配模式的行;
Groff:包含一些处理和格式化文本的程序;
Gzip:包含压缩和解压缩文件的程序;
Inetutils:包含基础网络程序;
IPRoute2:包含了基本的和高级的基于 IPv4 网络的程序;
Kbd:包含键盘映射表和键盘工具;
Less:包含一个文本文件查看器;
Make:包含一个编译软件包的程序;
Man-DB:查找和显示 man 手册页的程序;
Mktemp:在 shell 脚本中创建安全的临时文件;
Module-Init-Tools:处理 Linux 内核模块时使用的工具;
Patch:一个根据“patch”文件来修改或建立文件的程序。补丁文件通常是用 diff程序创建的;
Psmisc:用于显示进程信息的程序;
Shadow:用于安全方式下处理密码的程序;
Sysklogd:包含记录系统日志信息的程序,比如内核处理意外事务的日志;
4.3.9 搭建Nginx服务器
要安装Nginx首先编译和安装OpenSSL,从网上下载这个资源,安装代码:
# wget ftp://ftp.openssl.org/source/openssl-1.0.0c.tar.gz
# tar -zxf openssl-1.0.0c.tar.gz
# cd openssl-1.0.0c/
# ./config --prefix=/usr/local --openssldir=/usr/local/ssl
# make && make install
# ./config shared --prefix=/usr/local --openssldir=/usr/local/ssl
# make clean
# make && make
然后下载编译和安装PCRE包
# wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.12.tar.gz
# tar zxvf pcre-8.12.tar.gz
解压后,在配置nginx的时候指定到这个目录即可。
下面开始安装Nginx:
# wget http://sysoev.ru/nginx/nginx-1.0.4.tar.gz
# tar zxvf nginx-1.0.4.tar.gz
# cd nginx-1.0.4
# ./configure --prefix=/usr/local/www/nginx --with-pcre=/yujialin/pcre-8.12
--with-http_stub_status_module --with-http_gzip_static_module
# make
# make install
第四章 启动LFS系统
Linux 系统的启动和初始化有许多的实现方案,每个发现版本不尽相同,LFS采用了SystemV风格的初始化风格。
4.4.1 安装LFS-Bootscripts 6.3
LFS 的启动脚本被打包在 LFS-Bootscripts 包里面,它只是一些脚本文件,解压后直接进行安装:
root:~# cd /sources
root:/sources# tar xvf lfs-bootscripts-6.3.tar.bz2
root:/sources# cd lfs-bootscripts-6.3
root:/sources/lfs-bootscripts-6.3# make install
4.4.2 配置脚本
首先需要确定硬件的时钟是否使用了UTC时间,通过使用如下命令:
root:~# hwclock --localtime --show
如果显示的时间和本地时间一致,则硬件时钟不是使用UTC时间的,需要创建如下文
件来将UTC变量设置为0:
root:~# cat > /etc/sysconfig/clock << "EOF"
># Begin /etc/sysconfig/clock
>UTC=1
># End /etc/sysconfig/clock
>EOF
接下来我们需要创建一个全局的键盘映射文件 /etc/inputrc,不需要自定义键盘时设置脚本的内容为:
# 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
使用如下脚本来设置主机名:
root:~# echo "HOSTNAME=LFS" > /etc/sysconfig/network
使用 ifconfig 查看主机IP地址后设置 /etc/hosts文件内容:
# Begin /etc/hosts (network card version)
127.0.0.1 localhost
10.20.93.89 LFS
# End /etc/hosts (network card version)
接下来是网卡的配置,我通过在LiveCD的宿主系统里使用ifconfig、route等命令获得相关信息后进行设置:
root:~# cd /etc/sysconfig/network-devices
root:/etc/sysconfig/network-devices# mkdir -v ifconfig.eth0
root:/etc/sysconfig/network-devices#
> ONBOOT=yes
> SERVICE=ipv4-static
> IP=10.20.93.89
> GATEWAY=10.20.93.2
> PREFIX=24
> BROADCAST=10.20.93.255
> EOF
然后配置域名服务器:
root:~# cat > /etc/resolv.conf << "EOF"
> # Begin /etc/resolv.conf
> domain mylinux
> nameserver 211.69.32.8
> nameserver 211.69.32.92
> nameserver 8.8.8.8
> # End /etc/resolv.conf
> EOF
最后要创建的一个配置文件是分区表和挂载点的:
root:~# cat > /etc/fstab << "EOF"
># Begin /etc/fstab
># filesystem mountpoint type options dump fsck order
> /dev/sda2 / ext3 defaults 1 1
> /dev/sda1 /boot ext3 defaults 0 0
> /dev/sda3 /usr/src ext3 defaults 0 0
> /dev/sda4 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
> tmpfs /dev/shm tmpfs defaults 0 0
># End /etc/fstab
> EOF
root:~#
4.4.3 编译Linux内核
Linux 内核的配置比较复杂,一些应用可能对内核的配置会有一些特别的要求,我们进入系统后随时都还可以重新编译内核。
首先,解压内核的压缩包:
root:~# cd /sources
root:/sources# rm -r linux-2.6.22.5
root:/sources# tar xvf linux-2.6.22.5.tar.bz2
root:/sources# cd linux-2.6.22.5
root:/sources/linux-2.6.22.5# make mrproper
root [ ~ ]# cp -v /usr/src/linux-2.6.22.5/.config /mnt/lfs/sources/linux-2.6.22.5/
root:/sources/linux-2.6.22.5# make LANG=en_US.UTF-8 LC_ALL= menuconfig
之后,进入如下配置界面:
(1) 在 Device Drivers->SCSI device support->SCSI low-level drivers 下加入 BusLogic SCSI support 的支持,可以采用编译到内核来避免未用 initrd 脚本来加载模块而导致启动失败。
(2) 在 Device Drivers->Networking support->Ethernet (10 or 100Mbit)加入 AMD PCnet32 PCI support 的支持。
(3) 在 Device Drivers->Sound->Advanced Linux Sound Architecture->PCI devices 加入(Creative) Ensoniq AudioPCI 1371/1373 的支持。
(4) 在 File Systems->XFS support 加入 XFS 的支持,可以采用编译到内核来避免未用 initrd 脚本来加载模 块而导致启动失败
在 Device
(5) Drivers->Graphics support 中加入 Support for frame buffer devices,并选择上 VESA VGA graphics supports。
(6) 在 Device Drivers->Graphics support->Console display driver support 中加入Framebuffer Console support 并选择上 Select compiled-in fonts,选上 VGA 8x16 font 。
配置界面的部分截图
4.4.4 配置GRUB引导系统
首先,把 grub 安装到硬盘的主引导分区上.
root:~# grub
grub> root(hd0,0)
grub> setup(hd0)
grub> quit
root:~#
下面我们创建引导系统的配置文件:
root:~# 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 10
> # Use prettier colors.
> color green/black light-green/black
> # The first entry is for LFS.
> title LFS(6.3)
> root (hd0,0)
> kernel /vmlinux-2.6.22.5-aslinux-1.0 root=/dev/sda2
> EOF
root:~# mkdir -v /etc/grub
mkdir: created directory `/etc/grub'
root:~# ln -sv /boot/grub/menu.lst /etc/grub `/etc/grub/menu.lst' -> `/boot/grub/menu.lst'
4.4.5 重启系统
root:~# logout
root [ ~ ]# export LFS=/mnt/lfs
root [ ~ ]# umount $LFS/dev/pts
root [ ~ ]# umount $LFS/dev/shm
root [ ~ ]# umount $LFS/dev
root [ ~ ]# umount $LFS/proc
root [ ~ ]# umount $LFS/sys
root [ ~ ]# umount $LFS/usr/src
root [ ~ ]# umount $LFS/boot
root [ ~ ]# umount $LFS
root [ ~ ]# shutdown -r now
等系统重新启动后就可以看到 LFS 的引导画面了:
5. 测试报告/实验报告
(1)没有删除快照前的测试。配置安装好了Nginx,但是FTP服务器没有搭建好,也找不出什么问题。尝试了好几次,每一次都能安装上文件,也不提示出错,但是就是在重启系统后无法启动FTP服务器。
(2)删除快照后的测试。由于在制作系统时我创建了18个快照是的文件夹总共有20多个G,然而真正的系统应该只有几百兆,我试着一步步删除快照,每删除一个我都重新启动一次系统,看看还能不能进入系统。不幸的是当我把创建的所有快照删除完以后,重新启动系统,就出现错误,这个严重的错误导致了我没有办法配置系统引导程序,这样一来做成的iso文件也不能成为系统。
出现问题截图:
6. 课题研究结论
首先这个课题是需要良好的自学能力,能充分运用课堂和实验中学到的知识。课程设计准备阶段是对题目要求的认真理解,在网上搜索文献资料,阅读别人的文献,尽快理解整个制作过程与制作这个系统的思想。然后是对系统进行分区、格式化、配置环境……。在第二部分是构建临时工具,这些工具是用来构建系统用的,其中最重要的工具就是编译器。在第三部分是构建系统软件,构建的这些软件都是随系统自带安装的,其中Nginx服务器也是在这一部分搭建的。第四部分是启动LFS系统,在这一部分是对系统启动前的最后设置,需要配置GRUB来引导系统启动。最后就是将制作过程中创建的快照删掉,把没有必要的文件删掉,为系统减负,然后配置引导程序,做成IOS镜像文件,最后刻录成光盘。理论上这个方案是可行的,但是我到了配置引导程序时出错,导致制作失败。
7. 总结
如果用一个词来说的话,那我觉得就是“投入”。当初选这个课程自己也是犹犹豫豫的,最后两个好友的一句话让我放开去做,我们是四个人的“私下小组”,实现资料共享,技术共享(原则上这次课程设计是每个人做自己的),我们的进度也是同步的。在将近一个星期的时间里大部分时间晚上都会熬到1点多,中间出现了很多问题,也都一一被解决了,但是最后却未能做出来一张Linux系统光盘,最后一个问题的出现没有能够解决,导致了我们的失败。等到快要上交课程设计时下面我来总结这次课程设计中出现的问题和思考:
(1)网络设置问题
起初我查看了一下我用的校园网的IP地址是随机分配的,所以我也就将虚拟系统的网络设置为桥接,但是当我做到从网上下载编译安装Nginx的时候却不能连接到外网,如下图,虽然一直在解析主机,但是试了几次还是不能从网上下载资源,为了检测到底是什么地方除了问题,我启用了LFS的界面,也就是输入startx命令,在界面中通过火狐浏览器打开百度页面时也是不能解析,查看IP地址后才知道是网络设置的问题。
解决方法:返回到之前做的快照8(设置IP之前的部分),修改虚拟系统的IP地址 # ifconfig eth0 10.20.93.89 netmask 255.255.255.0,然后把网络设置为NAT,不使用桥接。
(2)安装Nginx时出现的问题
在编译安装完成其他软件后我就进入了对Nginx服务器的安装,起初我试了几次,总是出现缺这缺那的,最后我停下来查看了一下资料发现在搭建Nginx时需要一些环境,所以需要先安装环境,然后在搭建Nginx服务器。比如我编译和安装了PRCE库还有OpenSSL,但是我搭建好了之后还是出现问题。仔细查看了一下若安装成功后 /usr/local/www/nginx 目录下有四个子目录分别是:conf、html、logs、sbin 。其中 Nginx 的配置文件存放于 conf/nginx.conf,Nginx 只有一个程序文件位于 sbin 目录下的 nginx 文件。最后发现自己的 80 端口被其他程序占用,修改后运行 sbin/nginx 命令来启动 Nginx,打开浏览器访问此机器的 IP,如果浏览器出现 Welcome to nginx!