LFS Linux From Scratch 笔记(经验非教程)

作了一个本身的DIY Linux系统。从编译每一行代码,创建每个文件系统结构开始。html

创造本身的GNU/Linux系统,不一样于任何发行版。按照的教程是来自 linuxfromscratch.org 来的。我选用的是systemd lfs 8.0 稳定版的教程。linux

 

作完系统你会发现。原来内核只占这个系统的一个小部分,更大的是系统的架构,功能。GNU/HURD 也是一个相似的GNU规范系统,只是不用Linux内核而已。GNU标准规范的影响力,是巨大的。git

 

准备编译机器注意事项

说说这里面遇到的一些问题和本身解决的方法。程序员

用的ubuntu16.04 64位的处理器环境。这个叫host system(gcc5.4.0)。须要给这个host system安装不少编译须要的环境。用这个机器来编译下一个机器的全部运行环境。github

 

有个version的脚本,能够帮你查看你系统是否准备好了。编程

 

还须要一个额外的硬盘。这个能够在virtualbox里面挂载一个。因为编译完的空间占用很大,好比说编译一个gcc产生的文件就高达2.5G,因此,须要一个大一点的硬盘。官方说至少6G。我作过屡次的LFS,经验告诉我至少12G,更好是20G。ubuntu

 

这个额外的硬盘是用来专门容纳制做好的系统的。固然你也能够用一个大一点的文件系统挂载成一个硬盘(不推荐)。bash

 

有不少包须要编译的。这里着重说一下。期间有多个包要屡次编译。例如binutils、gcc、glibc。为何要屡次编译呢?session

 

 

第一次用host system的 gcc 5.4.0 编译binutils, gcc (6.3.0),是为了后来用已经编译好的gcc 6.3.0再去编译剩下部分的binutils、gcc、glibc。这样下面新系统上的软件都是同一个编译器6.3.0编译的软件了,这个过程也就是说的制做tool chain 工具链的过程。而后到了后面,chroot进入系统后,再次用这个编译好的gcc 6.3.0 ,再把这些 binutils、glibc等按照正确的系统目录、结构、架构,编译一遍。这个过程叫“真实编译”。用工具链产生的“真”东西,再把系统须要的组件,“真真”地编译一遍。架构

是的,你要编译不少遍,不少遍。bash环境下,启用 export MAKEFLAGS='-j5' 若是你是4个线程的CPU的话。核心数 4 + (1) 基本上能让编译最快。可是有些pkg,你真的须要用 -j1 来编译。

 

重复编译注意删除以前编译源码及文件

每次不一样的设定,编译 例如binutils、gcc的时候,都要将以前的 源代码 文件夹删掉,从新解压,从新 configure,从新编译,从新安装。不然会出现不可逆转的错误。(例如chroot 新LFS系统后,gcc失效)

其余的编译后的源代码也能够删掉,留着也没什么用。若是下次用的话,能够留着。省点空间是好的。

 

 

打补丁时候注意

官方教程 第五章 不要打补丁,到了第六章再打补丁!

 

其实仔细看提供的教程第六章,就知道怎么打补丁了。如下我提供的方法仅供将来单独打补丁使用。一切按照 lfs 8.0 手册来就行了。

 

关于如何制做补丁,如何打补丁,这里有个更好的教程,简单明了。

http://www.360doc.com/content/13/0323/23/8363527_273525975.shtml

 

-----如下不要用在lfs 8.0 systemd stable中 ,仅供将来本身维护升级系统参考---------

其中有一些patch,例如glibc2.5 有一些patch须要打。能够用patch -p0 < ../somewhere.patch 打补丁。-p0 的意思是补丁与包是在同一个目录下。(a.patch, bash-4.4/   在同一个目录下)  打补丁。打完补丁,再configure,再make,make install。

 

须要打补丁的按照顺序依次有

glibc、bash、bzip二、coreutils

 

有的补丁是须要cd进入文件夹内打的。

例如glibc, bzip2

tar -xf glibc-2.25.tar.gz

cd glibc-2.25

patch -p1 < ../glibc-2.25-fhs-1.patch

 

而其余的例如coreutils,是不须要进入文件夹打的。

tar -xf coreutils-8.26.tar.xz

patch -p0 < ./coreutils-8.26-i18n-1.patch   

注意,这里的-p 是0。  

 

 

上面打补丁的时候,因为补丁做者的缘由,有多是在包目录外diff 作的补丁,有多是在包里面 diff作的补丁。(会害死一帮小白,这点得注意哦)

基本上补丁都是上面的方式打的。

 

-----以上打补丁打方法,在lfs中不要用了。按照 LFS 8.0 systemd 稳定版的教程打补丁,里面有提醒怎么打补丁的-----

 

咱们会发现,编译gcc的时候,总要使用三个库。mpfr,gmp,mpc。都是高精度代数数学库。

 

发现后期到了第六章再次编译gcc的时候,要82个SBU时间(加上test时间)。这但是很考验机器的主频,线程,散热了。

 

 

 

------ 下面是闲聊谈谈 LFS的一些事 -------------

读了好几百页的英文文档。发现如今的systemd 跟gcc学的很像。systemd是从redhat这个公司开源出来的。如今已经混入主流Linux发行版了。本身DIY时候用systemd的愿意之一就是systemd 把不少东西都统一块儿来了。

有点像是管天管地。说说systemd能管什么。一、通常普通的services 二、dns 解析的服务 三、timedatectl 硬件时间(包括校准等,这是要替代原生ntp的节奏,不少路由器都用简单的ntpd,systemd这个另类太装了有点)四、系统各类journal,log什么的。五、系统硬件的一些事件触发(systemd-hwdb)六、loginctl ,t登陆密码,用户会话维持(这个有点奇特。systemd 230 版本后,居然用screen tmux不能维持长会话了。须要前面加个 systemd-run --scope --user /usr/bin/screen )七、systemd-notify。这个更像是一种信使的东西,系统层。  八、localectl 管理系统等locale、编码货币单位 九、启动时的tmp文件系统挂载方式(tmpfs文件方式,仍是以一个 /tmp 目录方式) 等等等等。。。

原本一个简单的系统,用什么resolvconf、ntpd、log、init、ifconfig能干的事,systemd就说本身要万能要统一。好比说微型设备,内存容量等不够的,确定还走老路子。可是随着各类硬件参数升高,渐渐的为了快速连带开发,systemd愈来愈多的出现。为何要用systemd呢?缘由比较简单,那就统一化操做。固然,要按照systemd写服务规范。(至少跟以前的那些不一样的程序、不一样的规范不同了,统一点了)。

systemd 的这个用户session管理有点绝。之前,用户登陆的时候,就会启用一些乱七八糟的进程放在后台,长久不用不少僵尸进程。systemd 用 loginctl 来解决。 挺有创新的。

---- 在一个用户登陆后,用这个 loginctl enable-linger ,退出用户session后,后台打开的全部进程能够变成 long running process 。

---- 或者,用 systemd-run --scope --user /user/bin/screen xxxxxxx 这样的方式,单独的让某个screen 、tmux这样的程序在后台运行(退出用户会话后)。

---- 做为系统root 管理员。也可经过设置 /etc/logind.conf 里面 KillUserProccesses=no ,让全部登陆用户关闭session后,后台进程均可以长运行。默认的是yes             (看到这种驼峰方式的命名方法,我心安了。像是这种严格的命名OO的思想,是必须的。不少人写的垃圾代码,垃圾变量命名,虽然能work,可是阅读困难,移植性差。量大的程序员确定遇到过。虽然有些开源软件写手表示不服,可是这也仅仅是本身的不服吧。)

  

systemd也不是能达到80%完美的好东西。好比不少修改的设置,都须要系统重启,而且须要运行systemd这个服务才能操做。不然,你连改个设置,都不能用什么chroot的方法去救以前的系统。由于你把硬盘拆下来,chroot进去,这样是救不了原来的系统的,大部分仍是得一点一点改才行。那你说,要systemd干吗?!这个systemd对将来管理系统崩溃后的维护,简直就是灾难。Unix的哲学之一,以文件方式控制系统。而不是像systemd那样,作什么东西,都半黑半透明的方式。有必定的温馨简约,可是也带来了很是大的隐患。

但是问题来了,systemd是由一个商业公司RedHat牵头的。开源世界被商业牵头,那让100% 自由开源斗士看到,确定不肯意。因此,这里咱们还有另一个比systemd更牛的东西,就是普及还不太够。我先不说,之后放出。

systemd 从新发明车轮子,虽然速度快了点,可是不是给开发者用的。网上搜搜systemd的评论,好几年了,很多都是骂的。可是Red Hat的工做人员已经混入一些开源社区的骨干部门了,因此他们可让不少发行版发行带有systemd的发行版,有话语权。虽然你们都在贡献代码,可是能打对号的就拿几我的。

若是要避免这种事情发生,开源社区首先要针对某些人的identity进行调查,是否带有目的性强的商业背景。失去了对自由的控制,可不是一件好事。

 

可是systemd的思路,像是如今的这种的DevOps,作产品的思路。由于它很能领悟如今系统、软件开发者的一些痛点。这就像是编程语言的比较。拿什么脚本语言和高级语言(c)比较。不是一类,可是会让你有的时候站在另一个高度迭代开发,提升效率。那我相信,将来追随systemd这种思路的人仍是会有的。可是但愿你们也不要忘本,一些经典的好的,也都学学,别扔了基础。

 

放上成功的效果图,LFS 制做成功并启动!

 

还有其余的步骤须要作。装一些其余软件包、设定等。这些根据使用GNU/Linux的经验,应该问题也不大。

 

 

 

固然作事,就要对本身的事情负责。

如今我把须要的LFS包都已经下载下来,打成一个包,集中下载了。免去下载痛苦。支持md5校验。

其中还写了怎么用一个干净的Ubuntu 16.04 64位系统,来去安装编译环境。

包里面带有HTML、PDF版本的LFS手册。支持离线编译操做。

 

欢迎体验!

源码包下载地址:https://pan.baidu.com/s/1pLRRYuJ 密码:76q5

 

 

---- update ----

LFS 8.0 完整开发环境下载(本人自制)

All in one

我建立了一个项目,不但作了一个本身的系统 Breath OS,并且还把怎么作、用什么作、作成什么样、写了个教程,封装了LFS 开发环境,上传到了 github,云存储,能够直接下载。作事作到底嘛

支持离线LFS编译,替代再也不更新的 LFS Live CD。

项目地址 https://github.com/xros/Breath_OS

相关文章
相关标签/搜索