作了一個本身的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這種思路的人仍是會有的。可是但願你們也不要忘本,一些經典的好的,也都學學,別扔了基礎。
還有其餘的步驟須要作。裝一些其餘軟件包、設定等。這些根據使用GNU/Linux的經驗,應該問題也不大。
固然作事,就要對本身的事情負責。
如今我把須要的LFS包都已經下載下來,打成一個包,集中下載了。免去下載痛苦。支持md5校驗。
其中還寫了怎麼用一個乾淨的Ubuntu 16.04 64位系統,來去安裝編譯環境。
包裏面帶有HTML、PDF版本的LFS手冊。支持離線編譯操做。
歡迎體驗!
源碼包下載地址:https://pan.baidu.com/s/1pLRRYuJ 密碼:76q5
---- update ----
All in one
我建立了一個項目,不但作了一個本身的系統 Breath OS,並且還把怎麼作、用什麼作、作成什麼樣、寫了個教程,封裝了LFS 開發環境,上傳到了 github,雲存儲,能夠直接下載。作事作到底嘛
支持離線LFS編譯,替代再也不更新的 LFS Live CD。