LFS编译过程必备辅助手册（一）
前言
LFS（Linux from scratch）是从源代码开始编译Linux操作系统。如果需要深度定制Linux操作系统或者需要 更加深入学习Linux的学习者可以从这里开始您的旅途。这份意义的深渊不必多说。 同时也希望您能加入我们一起开始这段旅程加入我们
从7月初开始我们团队里面两个人为了更加深入的学习Linux方面的知识。也为了瞻仰LFS大神们的光辉。 开始了LFS的旅程，因为LFS官方文档写的虽然非常具体，但是多多少少对于一些Linux新手来说造成很多困扰。
因此我们团队做完LFS之后写了这篇辅助性质
LFS
前言
LFS（Linux from scratch）是从源代码开始编译Linux操作系统。如果需要深度定制Linux操作系统或者需要 更加深入学习Linux的学习者可以从这里开始您的旅途。这份意义的深渊不必多说。 同时也希望您能加入我们一起开始这段旅程加入我们
从7月初开始我们团队里面两个人为了更加深入的学习Linux方面的知识。也为了瞻仰LFS大神们的光辉。 开始了LFS的旅程，因为LFS官方文档写的虽然非常具体，但是多多少少对于一些Linux新手来说造成很多困扰。
因此我们团队做完LFS之后写了这篇辅助性质

> 
> 很多人对Linux进行了一定的学习之后，都会有一种自己从头搭建一套Linux的想法，在这方面LFS和Gentoo都是不错的起点。不过虽然它们已经尽量提供详细文档了，但对于初学者来说还是存在一定的困难的。
> 
> 
> 因此本站特邀 PHILO （@看见微软我就跑）和 米油 两位同学将他们自己学习LFS的经验分享给大家，也希望大家一起来参与到LFS之旅中。
> 
> 
> 


前言
--


LFS（Linux from scratch）是从源代码开始编译Linux操作系统。如果需要深度定制Linux操作系统或者需要更加深入学习Linux的学习者可以从这里开始您的旅途。这份意义的深渊不必多说。 同时也希望您能加入我们一起开始这段旅程： **[→加入我们←](http://ubtamator.github.io/)**


![](/data/attachment/album/201407/18/110221aa0hiapkvh9ahnvs.jpg)


从7月初开始我们团队里面两个人为了更加深入的学习Linux方面的知识。也为了瞻仰LFS大神们的光辉。 开始了LFS的旅程，因为LFS官方文档写的虽然非常具体，但是多多少少对于一些Linux新手来说造成很多困扰。


因此我们团队做完LFS之后写了这篇**辅助**性质的说明，对新手遇到问题的时候提供帮助。


### 进行LFS旅程的前提条件


1. 比较熟悉Linux操作
2. 有一定Linux开发基础
3. 在LFS之前有过从源码编译软件的经验。
4. 有一定的英文基本功，除了看手册之外，有的时候抛出错误的时候应该有google查找并解决错误的能力。


### 文档使用方法：


1. 首先对本辅助文档完整的浏览一遍，这样有助于理解LFS的整个过程做什么
2. 然后扫一遍LFS官方文档的目录，这样至少知道每个章节的目的。
3. 当你进行到LFS某一步时，遇到问题后可以对应上本辅助手册的具体问题的解决方案


### LFS全过程概括


1. 对磁盘的准备和用户的准备
2. 建立temp系统
3. 编译LFS系统
4. 最后调整


### LFS 编译完成的成果


LFS在编译完成的最后除了Linux基础内核目录结构（bin etc lib proc dev等等这些）还有一个tools这个目录（过程概括中的第2部分），它的存在是为了编译LFS整个系统的。所以在第五章这一部分中，就是利用ubuntu或centos主机系统的编译环境（称之为HOST）来编译出tools这个目录下的编译环境。


**提示**：其实制作LFS所有用到的工具链接，就是在ubuntu或centos下编译出一个新的交叉编译器(就是/tools目录下的所有工具)，而这个新的交叉编译器在编译出来后，就不会依赖于现有操作系统编译器和库文件(ubuntu or centos)，此时我们就可以利用这个全新的交叉编译工具(/tools目录下的所有工具)制造属于我们自己的Linux了，利用这个新的工具，从源码开始编译出所有我们需要的软件和库，最后编译Linux内核，设置bash脚本，启动脚本，tmpfs文件系统需要的配置文件，整个LFS的过程就结束了。


A： Linux发行版本的选择
---------------


1. CentOS 6.3 （虚拟机双硬盘）
2. Ubuntu 14.04 with GCC4.4（64bit） （笔记本电脑+双硬盘+LFS系统构建在SSD硬盘上）
3. 在以上两种Linux发行版上分别进行编译运行,且最终都取得成功。
4. 使用LFS官网上LFS7.5的源码进行编译制作


B：前四章的内容：硬盘分区、用户准备篇
-------------------


主机所用操作系统的准备工作: (ubuntu14.04 64位下需要安装的软件)



> 
> 1.在ubunt下安装bison（ubuntu下默认没有安装）
> 
> 
> 
> ```
> sudo apt-get install bison 
> #LFS 手册要求
> 
> ```
> 
> 2.不能用gcc4.8，需要换成gcc4.4（ubuntu14.04默认gcc4.8)
> 
> 
> 
> ```
>  sudo apt-get install gcc-4.4 g++-4.4
>  sudo rm `which gcc`
>  sudo rm  `which g++`
>  sudo ln -sv /usr/bin/gcc-4.4  /usr/bin/gcc
>  sudo ln -sv /usr/bin/g++-4.4  /usr/bin/g++
> 
> ```
> 
> **这里CentOS没有什么特别要说的。主要因为全部都用默认的，就可以了。各种依赖C6-Media就可以解决** 
> 
> 
> 3.到LFS官网上下载LFS7.5的所有源码: <ftp://ftp.lfs-matrix.net/pub/lfs/lfs-packages/>
> 
> 
> 


### 1.磁盘分区准备


1. plan: 准备一个10到20GB的分区，这一步请谨慎操作
2. action: 创建分区(表)并格式化。创建分区表请使用fdisk , 如果需要图形界面下的请使用GPartion，如果这两种工具都不会请到windows下分区（无需格式化）



```
#格式化分区
sudo mkfs -v -t ext4  /dev/sdaX #这里的X是填上自己的分区号

```

PS:因为现在计算机的内存都比较大，所以可以不需要swap分区。（第一次进行LFS，一个根“/”分区就够了，等以后有经验了，在进行多分区的操作）


### 2.用户准备


直接参考手册上的来就行了。


小建议：


PS1='[\[\e[32m\]#\##\[\e[31m\]\u@\[\e[36m\]\h \w]\$\[\e[m\]'


PS1修改成这个变量看着能舒服点。


注意：每次开机，或是重启后，在进入lfs用户前，都要对 LFS变量进行检查，查看LFS=/mnt/lfs变量是否存在，然后对lfs使用的分区进行挂载


### 前四章的小结：



> 1. 这一部分没有什么难点，准备硬盘分区是因为要让LFS作为独立的硬盘来启动。新建分区、格式化分区、准备lfs用户是Linux操作的基础素质。 **注意** ：为了下面的编译过程能更快，可以在输入make命令时在后面加入-j4，使用4个进程进行同时编译，在多核处理器上编译的速度有明显提升
> 




---


#### 开始进入编译代码的环境（每次开机或重启动后需要进行下面步骤进入lfs用户环境）



> 1. 首先导入LFS变量
> 
> 
> 
> ```
> export LFS=/mnt/lfs
> #建议放到/etc/profile下方便一直用
> 
> ```
> 
>  2. 然后挂载LFS的分区
> 
> 
> 
> ```
> sudo mount -v -t ext4 /dev/sdaX $LFS  #X为你的LFS硬盘分区号
> 
> ```
> 
>  3. 最后就可以切换到lfs用户了
> 
> 
> 
> ```
> su - lfs  #注意中间这个 - 符号是一定要的，代表为lfs用户启动一个login shell 
> 
> ```
> 
> 补充：通常我们在开机后，启动的第一个shell称之为login shell，当进入GUI界面后，不需要输入密码启动的shell称之为non-login shell。这两种shell是有区别的。大家都知道shell的运行是需要环境变量的支持的。配置这些环境变量的文件就是配置shell工作环境的文件。两种shell在读取配置文件时有很大的不同，下面是总结它们分别读取哪些配置文件：
> 
> 
> 1. login shell 启动--->读取/etc/porfile文件--->读取~/.bash\_profile文件
> 2. no-login shell 启动--->读取~/.bashrc文件
> 3. exec env -i /bin/bash命令会开启一个全新的non-login shell。
> 


**注意**：每次重新开机或重启后都需要进行下面的步骤，切换到lfs用户，因为对于新手来说，不可能一天就编译完lfs的所有源，可以把以上步骤保存到一个文件中，每次重启系统进行LFS之前，参照以上步骤进入到LFS编译环境。


C: 第五章的内容：编译得到\$LFS/tools/目录下面的工具包
----------------------------------


+ 第一步，编译出一个全新的与主机系统无关的工具链。这些工具链包含了：compiler(就是我们常用的gcc,g++)，assembler(就是把汇编程序变成a.obj文件的工具)，linker(就是把很多\*.obj文件和库文件链接成可运行文件a.out的工具)，还有各类库文件(为后面编译其它的软件提供基础设施)，当然还有大量的其它工具
+ 第二步，得用第一步编译出来的工具，编译其它的工具（这里可以看出，在制作LFS的过程中，编译的先后顺序是非常生要的，因为有了鸡，才能下蛋）
+ 注意 1：上面两步编译出来的工具都会安装到 \$LFS/tools目录下面（也就是/mnt/lfs/tools目录下面）。LFS手册中把这个称之为临时的文件系统，就是因为\$LFS/tools这个目录在第6章结束时就会被删除，因为$LFS/tools已经使用完了，没有利用价值了。
+ 注意 2：参照LFS手册上的指令进行编译，基本不会遇到错误，因为编译代码的步骤就是老三样：configure && make && make install，但是有一点，一定要注意，所有的安装包一定要打补丁，因为LFS手册没有强调打补丁的过程，所以自己如果发现这个源码包有补丁文件，一定要记得打上。
+ 注意 3：因为需要编译的软件太多，到最后你可能不会愿意自已每个单词都输入到命令行进行编译，所以通常会直接复制LFS手册中的命令。但是复制时，请一定注意先把指令复制到一个空的文件编辑器中，然后检查一下，复制过来的内容是否正确，因为从PDF文件复制到文本中的内容，格式会发生很大的变化。这一点在你尝试的过程中就会发现了。然后在文本编译器或是vim中进行编辑后，在复制到lfs用户的命令行中。
+ 注意 4：在编译perl时，按照官方文档打补丁会出现readonly的错误，下面是是正确的操作命令：

```
cd /mnt/lfs/sources
tar xvf perl-5.16.2
cd perl-5.16.2/hints
cp linux.sh linux.sh.org
cd ..
patch -Np1 -i ../perl-5.16.2-libc-1.patch
cd hints
diff linux.sh linux.sh.org   #输出打补丁情况，则为正常打补丁，编译过程参考手册

```
+ 注意 5：手册上的configure的位置一定刚要注意有三种情况，第一种是在源代码目录之外进行configure，第二种是在源代码目录里面进行configure，第三种（特殊情况）是libstdc++是在gcc源码目录的子目录里面进行configure。所以在执行命令之前一定刚要看好执行命令的前提条件，不妨思考一下LFS的笔者为什么这么写。
+ 温馨提示： 第一次编译GCC时可能会遇到环境问题，不要气馁，失败是正常的（我失败了10次以上）。不过我们可以保证LFS手册上的命令质量是非常高的。经过亲身测试绝对没有错误。
