LFS编译过程必备辅助手册(一)
创始人
2024-03-01 13:01:37
0

很多人对Linux进行了一定的学习之后,都会有一种自己从头搭建一套Linux的想法,在这方面LFS和Gentoo都是不错的起点。不过虽然它们已经尽量提供详细文档了,但对于初学者来说还是存在一定的困难的。

因此本站特邀 PHILO (@看见微软我就跑)和 米油 两位同学将他们自己学习LFS的经验分享给大家,也希望大家一起来参与到LFS之旅中。

前言

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

从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下方便一直用
  1. 然后挂载LFS的分区
sudo mount -v -t ext4 /dev/sdaX $LFS  #X为你的LFS硬盘分区号
  1. 最后就可以切换到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手册上的命令质量是非常高的。经过亲身测试绝对没有错误。
LFS

相关内容

Bitbucket git...
在解决Bitbucket git lfs无法推送和拉取的问题时,可...
2024-12-19 10:01:24
编译glibc时出现LFS...
这个错误通常是由于缺少或版本过旧的相关程序造成的。需要先检查系统中...
2024-12-08 06:01:48
本地GitLFS仓库通过r...
这种情况可能是因为Git LFS追踪的大型文件没有被正确同步。可以...
2024-11-29 13:31:47
本地Gitlab服务器上使...
生成服务器证书和密钥可以使用openssl生成自签名证书和密钥:生...
2024-11-29 13:30:48
本地仓库中使用GitLFS...
为了使用Git LFS的最佳实践,建议按照以下步骤操作:安装Git...
2024-11-29 05:00:20
Artifactory未遵...
要解决"Artifactory未遵循git-lfs协议"的问题,可...
2024-11-11 00:31:12

热门资讯

Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
JStock:Linux 上不... 如果你在股票市场做投资,那么你可能非常清楚投资组合管理计划有多重要。管理投资组合的目标是依据你能承受...
通过 SaltStack 管理... 我在搜索Puppet的替代品时,偶然间碰到了Salt。我喜欢puppet,但是我又爱上Salt了:)...
Epic 游戏商店现在可在 S... 现在可以在 Steam Deck 上运行 Epic 游戏商店了,几乎无懈可击! 但是,它是非官方的。...
《Apex 英雄》正式可在 S... 《Apex 英雄》现已通过 Steam Deck 验证,这使其成为支持 Linux 的顶级多人游戏之...
如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
2024 开年,LLUG 和你... Hi,Linuxer,2024 新年伊始,不知道你是否已经准备好迎接新的一年~ 2024 年,Lin...
什么是 KDE Connect... 什么是 KDE Connect?它的主要特性是什么?它应该如何安装?本文提供了基本的使用指南。科技日...
Opera 浏览器内置的 VP... 昨天我们报道过 Opera 浏览器内置了 VPN 服务,用户打开它可以防止他们的在线活动被窥视。不过...