LFS编译过程必备辅助手册（一）
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手册上的命令质量是非常高的。经过亲身测试绝对没有错误。

OK
#LFS编译过程必备辅助手册

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

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

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

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

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

- 对磁盘跟用户的准备
- 建立temp系统
- 编译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发行版本的选择

- CentOS 6.3 （虚拟机双硬盘）
- Ubuntu 14.04 with GCC4.4（64bit） （笔记本电脑+双硬盘+LFS系统构建在SSD硬盘上）
- 在以上两种Linux发行版上分别进行编译运行,且最终都取得成功。
- 使用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.磁盘分区准备

- plan: 准备一个10到20GB的分区，这一步请谨慎操作
- 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使用的分区进行挂载


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


####`开始进入编译代码的环境`

（每次开机或重启动后需要进行下面步骤进入lfs用户环境）


- 首先导入LFS变量

```
export LFS=/mnt/lfs
#建议放到/etc/profile下方便一直用
```


- 然后挂载LFS的分区

```
sudo mount -v -t ext4 /dev/sdaX $LFS #X为你的LFS硬盘分区号
```


- 最后就可以切换到lfs用户了

```
su - lfs #注意中间这个 - 符号是一定要的，代表为lfs用户启动一个login shell
```


`补充`

：通常我们在开机后，启动的第一个shell称之为login shell,当进入GUI界面后，不需要输入密码启动的shell称之为non-login shell。这两种shell是有区别的。大家都知道shell的运行是需要环境变量的支持的。配置这些环境变量的文件就是配置shell工作环境的文件。两种shell在读取配置文件时有很大的不同，下面是总结它们分别读取哪些配置文件：

- login shell 启动--->读取/etc/porfile文件--->读取~/.bash_profile文件
- no-login shell 启动--->读取~/.bashrc文件
`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手册上的命令质量是非常高的。经过亲身测试绝对没有错误。

####进入第六章前的准备 由于第六章所有的操作都是在root用户下进行的，所以要把第五章编译好的$LFS/tools目录改为root用户所有，命令如下：(下面的命令，请用root身份运行)

```
export LFS=/mnt/lfs
chown -R root:root $LFS/tools
```


##D: 开启第六章,构建真正的LFS系统 从第六章开始我们就正式开始编译LFS系统了，大概几十个模块只要跟着脚本走一般都不会遇到问题。 只是有几点需要注意。


- 这个是需要正常运行的操作系统所以所有的patch补丁包一定都要打上。

- perl的patch包需要参考网上的一些文章来解决read only 的问题。（GOOGLE问题的第一个链接就是答案）
- 最开始的chroot是需要用root权限来实行的。
- dev下的设备挂载是要用lfs用户的最高权限来执行mount（也就是说需要给lfs用户添加到sudoers里面）
- 有的时候你需要终止你自己的工作。等其他时间继续编译lfs，你需要重新挂载dev目录 和chroot
- 在编译内核的时候你需要生成.config文件如果这个文件你自己调整的话始终都非非常费劲的对于内核新手来说最好的方案就是找个发型版本（eg.ubuntu 14.04）复制/boot里面的内核配置文件，不然会出现很多内核驱动不支持的现象。比如说网卡
- 在编译完了之后有很多脚本需要你进行执行的。 ** 但是一定要注意，脚本的选择比较多。选择合适你的脚本，另外脚本挺长，有的需要翻页。**
- /etc/sysconfig/console 这个脚本不需要建立。
- 在设定grub的脚本的时候一定要注意你自己bootlfs时候的参数是多少（比如说新建虚拟机之后你几块硬盘几号分区什么的。）