设为首页 收藏本站
查看: 595|回复: 0

[经验分享] LFS Linux From Scratch 笔记(经验非教程)

[复制链接]

尚未签到

发表于 2017-6-10 07:30:14 | 显示全部楼层 |阅读模式
  做了一个自己的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的经验,应该问题也不大。
DSC0000.png

  当然做事,就要对自己的事情负责。
  现在我把需要的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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-385683-1-1.html 上篇帖子: 通过udev创建ASM共享磁盘(RAC) 下篇帖子: salt 配置管理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表