LFS Linux From Scratch 笔记(经验非教程)
做了一个自己的DIY Linux系统。从编译每一行代码,建立每一个文件系统结构开始。
创造自己的GNU/Linux系统,不同于任何发行版。按照的教程是来自 linuxfromscratch.org 来的。我选用的是systemd lfs 8.0 稳定版的教程。
做完系统你会发现。原来内核只占这个系统的一个小部分,更大的是系统的架构,功能。GNU/HURD 也是一个类似的GNU规范系统,只是不用Linux内核而已。GNU标准规范的影响力,是巨大的。
准备编译机器注意事项
说说这里面遇到的一些问题和自己解决的方法。
用的ubuntu16.04 64位的处理器环境。这个叫host system(gcc5.4.0)。需要给这个host system安装很多编译需要的环境。用这个机器来编译下一个机器的所有运行环境。
有个version的脚本,可以帮你查看你系统是否准备好了。
还需要一个额外的硬盘。这个可以在virtualbox里面挂载一个。由于编译完的空间占用很大,比如说编译一个gcc产生的文件就高达2.5G,所以,需要一个大一点的硬盘。官方说至少6G。我做过多次的LFS,经验告诉我至少12G,更好是20G。
这个额外的硬盘是用来专门容纳制作好的系统的。当然你也可以用一个大一点的文件系统挂载成一个硬盘(不推荐)。
有很多包需要编译的。这里着重说一下。期间有多个包要多次编译。例如binutils、gcc、glibc。为什么要多次编译呢?
第一次用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、bzip2、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能管什么。1、一般普通的services 2、dns 解析的服务 3、timedatectl 硬件时间(包括校准等,这是要替代原生ntp的节奏,很多路由器都用简单的ntpd,systemd这个另类太装了有点)4、系统各种journal,log什么的。5、系统硬件的一些事件触发(systemd-hwdb)6、loginctl ,t登录密码,用户会话维持(这个有点奇特。systemd 230 版本后,竟然用screen tmux不能维持长会话了。需要前面加个 systemd-run --scope --user /usr/bin/screen )7、systemd-notify。这个更像是一种信使的东西,系统层。 8、localectl 管理系统等locale、编码货币单位 9、启动时的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。