做了一个自己的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。

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

LFS Linux From Scratch 笔记(经验非教程)的更多相关文章

  1. LFS Linux From Scratch 笔记2(经验非教程)BLFS

    LFS 完了. 其实还没完,还要装一些其他的组件,系统才算是对人类有用的系统. 正好这里有个BLFS Beyound Linux From Scratch 的教程. 其实,按照现有的可运行的LFS系统 ...

  2. LFS(Linux From Scratch)学习

    一.简介 LFS──Linux from Scratch,就是一种从网上直接下载源码,从头编译LINUX的安装方式.它不是发行版,只是一个菜谱,告诉你到哪里去买菜(下载源码),怎么把这些生东西( ra ...

  3. 马哥Linux base学习笔记

     介绍课程: 中级: 初级:系统基础 中级:系统管理.服务安全及服务管理.shell脚本 高级: MySQL数据库: Cache & storgae 集群: Cluster   lb: 4la ...

  4. Linux Basic学习笔记01

    介绍课程: 中级: 初级:系统基础 中级:系统管理.服务安全及服务管理.Shell脚本: 高级: MySQL数据库: cache & storage 集群: Cluster lb: 4laye ...

  5. Welcome to Linux From Scratch!

    /**************************************************************************** * Welcome to Linux Fro ...

  6. linux初级学习笔记三:linux操作系统及常用命令,及如何复制和移动文件!(视频序号:02_4)

    本节学习的命令:cp,mv,install,du,read 本节学习的技能:文件的移动与复制 cp( copy):复制和移动文件 cp SRC DEST -r:递归复制一个目录及其目录中的所有文件 - ...

  7. Linux From Scratch(从零开始构建Linux系统,简称LFS)- Version 7.7(一)

    一. 准备工作 1. 需要一个Linux宿主系统,例如早先版本的 LFS,Ubuntu/Fedora,SuSE 或者是在你的架构上可以运行的其它发行版 如果想实现Win7与Linux双系统,可参考我的 ...

  8. Linux From Scratch(从零开始构建Linux系统,简称LFS)(一)

    一. 准备工作 1. 需要一个Linux宿主系统,例如早先版本的 LFS,Ubuntu/Fedora,SuSE 或者是在你的架构上可以运行的其它发行版 如果想实现Win7与Linux双系统,可参考我的 ...

  9. Linux From Scratch(从零开始构建Linux系统,简称LFS)- Version 7.7(三)

    八. 构建LFS系统 1. 准备虚拟内核文件系统 内核会挂载几个文件系统用于自己和用户空间程序交换信息.这些文件系统是虚拟的,并不占用实际磁盘空间, 它们的内容会放在内存里. mkdir -pv $L ...

随机推荐

  1. K 线图的认识

    股市中的一个铁律就是:如果有个操盘规则广为所知,它会自动平衡,该规则就会失效. 1. 基本经济学概念 大盘:market index,上证综合指数(上海证券综合指数): 其样本股是全部上市股票,包括 ...

  2. PS 滤镜算法— — 表面模糊

    图像的表面模糊处理,其作用是在保留图像边缘的情况下,对图像的表面进行模糊处理.在对人物皮肤处理上,比高斯模糊更有效.因为高斯模糊在使人物皮肤光洁的同时,也将一些边缘特征如脸部的眉毛.嘴唇等给模糊了,不 ...

  3. PAT 1061 - 1064 题解

    这四道题来自 13 年 08 月 30 的 PAT 测试. 代码量不大,思路也比较直接.不过第一题的处理逻辑不太清晰,需要好好把握.稍有不慎就掉进坑里了(很多人被这道 20'的题坑了一个多小时心慌意乱 ...

  4. C#步骤控件

    C#开发step步骤条控件   现在很多的javascript控件,非常的不错,其中step就是一个,如下图所示: 那么如何用C#来实现一个step控件呢? 先定义一个StepEntity类来存储步骤 ...

  5. python判断栈的弹出序列是否合法

    参考:https://www.2cto.com/kf/201701/552515.html 数据结构之判断栈的弹出序列是否合法:输入两个整数序列,第一个序列表示栈的压入序列,请判断第二个序列是否为该栈 ...

  6. 权限控制方案之——基于URL拦截

    概述: 在系统开发过程中需要考虑的一个重要的问题就是权限问题,权限问题也是安全问题的一个范畴,我们要求在用户登录系统之后,要控制用户可以访问的系统资源,使得用户只可以访问到系统事先分配好的资源:这里的 ...

  7. DDD实战11 在项目中使用JWT的token 进行授权验证

    步骤: 1.首先要在webapi的管道中 使用认证(Authentication) 2.要在webapi的服务中注册验证条件 代码如下: namespace Dealer.WebApi { publi ...

  8. OpenGL(二十三) 各向异性纹理过滤

    如果使用一般的纹理过滤,当观察方向跟模型表面不是相互垂直的的情况下,会出现纹理信息的丢失,表现为图像看上去比较模糊,如下图所示,远处场景的细节信息很差: 针对这种情况,可以采用同向异性过滤的方式处理纹 ...

  9. Linux性能测试 uptime命令

    uptime 命令用于查看服务器运行了多长时间以及有多少个用户登录,快速获知服务器的负荷情况. 以下是 uptime 的运行实例: :: up days, min, users, load avera ...

  10. c#-WPF string,color,brush之间的转换

    原文:c#-WPF string,color,brush之间的转换 String转换成Color string-"ffffff" Color color = (Color)Colo ...