手把手帶你自制Linux系統之六 編譯核心及busybox完成系統定製
重新看了一下前面的幾章,發現其實前面的5章一直圍繞一個話題講解 — 如何利用CentOS現有資源組裝一個Linux。這種方式十分拙劣,Linux核心是固化的、initrd沒有充分精簡、命令需要一個一個拷貝,最終做出來的Linux不能算是完全定製的。 這一章就來自己編譯Linux原始碼生成核心,使用busybox原始碼製作initrd及跟檔案系統,完全從頭開始製作一個真正定製的Linux。 並不是說前面的幾章就沒有意義,本章雖然從頭開始,但其中依然會用到很多前面幾章已經講過做過的步驟,前面的章節講解很多Linux啟動的原理,所以從第一章開始的每一章都是必不可少的。 下面就按照Linux系統啟動順序來從頭開始製作。
1. 建立分割槽
將準備好的磁碟分割槽並格式化,具體步驟檢視第二章第一步。
格式化完成後得到兩個分割槽,/dev/hda1 大小 20M,/dev/hda2 大小 512M。
分別掛載至/mnt/boot和/mnt/sysroot。
2. 安裝GRUB
使用grub-install 命令安裝grub,指定根路徑為/mnt,裝置為/dev/hdagrub-install --root-directory=/mnt /dev/hda
建立grub配置檔案
vi /mnt/boot/grub/grub.conf
內容如下,root(grub root)為第一塊磁碟的第一個分割槽,kernel使用vmlinuz,initrd使用 initrd.gz
default=0 timeout=5 title MiniLinux (2.6.38.5) root (hd0,0) kernel /vmlinuz ro root=/dev/hda2 initrd /initrd.gz
3. 編譯kernel
這裡使用的是 linux-2.6.38.5.tar.bz2,下載地址: 將下載完成後檔案解壓到 /usr/src下,建立一個軟連結指向linux-2.6.28.5cd /usr/src
ln -s linux-2.6.28.5 linux
複製我提供的config檔案:config-2.6.38.5-1.miniLinux,其中已經精簡了許多用不到的模組。
cd linux
cp config-2.6.38.5-1.miniLinux .config
如果還有其它特殊需求,使用make menuconfig可以開啟配置介面。
如修改local version:
開始編譯make menuconfig General setup ---> Local version
make SUBDIR=arch/
核心編譯完成後,生成的arch/x86/boot/bzImage 就是需要的核心檔案vmlinuz,將它拷貝到boot下cp /usr/src/linux/arch/x86/boot/bzImage /mnt/boot/vmlinuz
4. 製作initrd
busybox體積嬌小,功能強大,不僅適合用來做根檔案系統,也同樣適合做initrd。 編譯busybox 這裡使用1.23.2版本,下載地址: 下載完成後解壓busybox-1.23.2.tar.bz2 這個版本的busybox依賴一個高版本Linux核心中的標頭檔案,從上一步解壓得到的2.6.28.5核心原始碼中拷貝過來。cd busybox-1.23.2
mkdir include/mtd
cp /usr/src/linux-2.6.28.5/include/mtd/ubi-user.h include/mtd
配置busybox為靜態編譯模式
make menuconfig
Busybox Settings ---> Build Options ---> [*] Build BusyBox as a static binary (no shared libs)
勾選build busybox as a static binary,靜態編譯busybox
編譯並安裝,預設安裝在busybox目錄下的_install
make install
拷貝busybox安裝目錄下的檔案到臨時目錄,開始製作initrd
mkdir /tmp/initrd/
cd /tmp/initrd/
cp /root/busybox-1.23.2/_install -a .
建立幾個必要目錄
mkdir proc sys mnt/sysroot dev tmp etc -pv
建立裝置檔案console和null
mknod dev/console c 5 1
mknod dev/null c 1 3
移除linuxrc,建立init指令碼檔案
rm linuxrc
vi init
init指令碼的主要工作是載入核心訪問真正的根檔案系統所在裝置需要的驅動,然後切換到真正的根。
不過在上一步編譯核心時,已經把ext3檔案系統的驅動做進了核心,這裡就需要載入ext3驅動了。
init內容如下:
#!/bin/sh
echo "Mounting proc and sys..."
mount -t proc proc /proc
mount -t sysfs sysfs /sys
echo "Detect and export hardware infomation..."
mdev -s
echo "Mount real rootfs to /sysroot..."
mount -t ext3 -o ro /dev/hda2 /sysroot
echo "Switch to real rootfs..."
exec chroot /sysroot /sbin/init
給init指令碼新增可執行許可權
chmod +x init
將/tmp/initrd中的所有檔案打包並壓縮為initrd.gz
find . | cpio -H newc --quiet -o | gzip -9 > /mnt/boot/initrd.gz
5. 製作根檔案系統
製作根檔案系統同樣需要用到上一步的busybox。 拷貝busybox安裝後的檔案到/dev/hda2cd /mnt/sysroot
cp /root/busybox-1.23.2/_install -a .
rm linuxrc
建立根檔案系統必需的路徑
mkdir boot dev etc/rc.d/init.d home lib/modules mnt proc root sbin sys tmp var/{lock,run,log} -pv
建立裝置檔案console、null
mknod dev/console c 5 1
mknod dev/null c 1 3
建立inittab檔案
vi inittab
busybox中的init沒有啟動級別的概念,所以使用的inittab檔案與一般的sysvinit、upStart使用的格式有一些出入,內容如下:
::sysinit:/etc/rc.d/rc.sysinit
::respawn:/sbin/getty 9600 tty1
::respawn:/sbin/getty 9600 tty2
::shutdown:/bin/umount -a -r
::ctrlaltdel:/sbin/reboot
新增登入認證功能
需要建立3個檔案:passwd, shadow, group
grep "^root\>" /etc/passwd > /mnt/sysroot/etc/passwd
grep "^root\>" /etc/shadow> /mnt/sysroot/etc/shadow
grep "^root\>" /etc/group> /mnt/sysroot/etc/group
busybox沒有提供bash,只有ash,修改passwd中/bin/bash為/bin/shvi /mnt/sysroot/etc/passwd
內容
root:x:0:0:root:/root:/bin/sh
建立系統初始化指令碼檔案rc.sysinit
vi /mnt/sysroot/etc/rc.d/rc.sysinit
內容如下:
#!/bin/sh
#
echo -e "\tWelcome to \033[31mMy Mini Linux \033[0m"
下面一點一點在rc.sysinit中加入內容
掛載proc和sysfs 虛擬檔案系統
echo "Mount proc and sys..."
mount -t proc proc /proc
mount -t sysfs sysfs /sys
以讀寫方式重新掛載根檔案系統
echo "Remount the rootfs..."
mount -t ext3 -o remount,rw /dev/hda2 /
動態管理裝置檔案,busybox提供了mdev,用法和功能同udev一樣
echo "Detect and export hardware infomation..."
mdev -s
掛載fstab中描述的其它檔案系統
echo "Mount the other filesystem..."
mount -a
rc.sysinit新增可執行許可權
chmod +x rc.sysinit
fstab檔案內容如下:
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/hda1 /boot ext3 defaults 0 0
/dev/hda2 / ext3 defaults 1 1
6. 新增網路功能
需要的步驟初始化網絡卡驅動(rc.sysinit中安裝驅動模組) -> 配置網絡卡(由/etc/rc.d/init.d/network指令碼負責) 具體參考第四章 有一點小區別的是,自己編譯得到pcnet32.ko模組不依賴其他模組。pcnet32.ko路徑在/usr/src/linux/drivers/net/pcnet32.ko
7. 一些細節小功能的完善
設定主機名 rc.sysinit中新增echo "Set the hostname"
[ -f /etc/hostname ] && . /etc/hostname
[ -z "$HOSTNAME" -o "$HOSTNAME" == '(none)' ] && HOSTNAME = localhost
在/etc 下建立hostname檔案用來儲存HOSTNAME變數
vi etc/hostname
內容
HOSTNAME="minilinux"
新增登入前提示資訊
vi etc/issue
內容
Mini Linux (2.6.38.5)
Kernel \r on an \m
設定終端提示符
設定環境變數PS1即可設定提示字串。但是ash使用的配置檔案與bash不一樣,ash可以使用/etc/profile和~/.profile兩個檔案。為了對全部使用者生效,在/etc/profile中新增PS1變數。
vi etc/profile
內容
export PS1='[\[email protected]\h \W]\\$ '
其中\u等符號會分別被替換
\u - user,使用者名稱
\h - hostname,主機名
\W - current path,當前路徑
\\$ - 提示符,root 為#,其它為$
8. 測試
啟動後一切正常,如圖所示:總結
本章使用自己編譯的linux核心以及busybox製作出了一個Linux小系統。與前面使用系統中現成資源組裝起來的Linux系統相比,本章自己造輪子的方式才算是完成了真正意義上的自制。 這種方式製作出來的系統有很多的優點,能夠根據自己的需要對系統進行裁剪優化;busybox集成了大多數常用命令,不需要一個一個的移植需要的命令;使用busybox製作的initrd和跟檔案系統更加的小巧,啟動速度也更塊。 busybox中雖然功能很齊全,但還是有一些常用工具沒有提供,比如bash。而且大都是其他命令的簡化版本,如果想要使用更強大的功能也是需要單獨移植。 本章的完結也代表著本系列教程的完結,看了一下日期從8月份開始第一章,到現在日曆都已經翻到了2016,才終於完成。中間有2個月工作比較忙,耽誤了一下。不過這樣算下來效率還是不高,因為文章中的大部分都是馬哥講到的,我主要是調整了一下順序,分了一下章節,查了一下資料,補充了一小下。整個教程做下來,我自己也學到了很多關於Linux的東西,明白了/etc下辣麼多檔案都是用來幹嘛的。也真心希望這個教程可以幫助到其他和我一樣熱愛Linux,以及想要通過做一個小的Linux的方式來學習Linux系統的朋友。 教程用到的主要檔案已經上傳github:相關推薦
手把手帶你自制Linux系統之六 編譯核心及busybox完成系統定製
手把手帶你自制Linux系統之六 編譯核心及busybox完成系統定製 重新看了一下前面的幾章,發現其實前面的5章一直圍繞一個話題講解 — 如何利用CentOS現有資源組裝一個Linux。這種方式十分拙劣,Linux核心是固化的、initrd沒有充分精簡、命令需要一個一個
6小時手把手帶你快速做一個自己的Java學生資訊管理系統之Java學生資訊管理系統專案原始碼視訊教程
本視訊教程一共分為四個階段,每個階段都會是上一個階段的擴充套件,每一個階段的系統都可獨立作為一個完整的系統。第一階段是Java學生資訊管理系統,完成了學生資訊的管理、班級資訊的管理、教師資訊的管理、以及
帶你領略Linux系統發展及版本更叠
裏程碑 簡體中文 電腦愛好者 計算機 奔騰處理器 Linux的出現是在1991年,Linus Torvalds的學生開發的,最初的Linux是類似Unix操作系統,可用於386,486或奔騰處理器的計算機上。Linus Torvalds是一個偉人,他讓Linux重獲“自由”,讓每個需要它的
Linux學習之六-Linux系統的基礎優化
rond 機房 backup 阿裏 提高效率 過濾 temp ssa sed替換 Linux系統的基礎優化 何謂‘優化‘。顧名思義,優化就是采取某些措施使某個東西或者某事物變得更加優異,出色。對於Linux而言,在初期安裝好系統之後,也需要對其進行一定的基礎優化,可分為安全
手把手教你安裝Linux(CentOS 7)系統及網路配置
準備工作 做U盤啟動 安裝系統 配置網路 檢視本地ip相關資訊
手把手教你寫Linux裝置驅動---定時器(一)(基於友善之臂4412開發板)
這個專題我們來說下Linux中的定時器。在Linux核心中,有這樣的一個定時器,叫做核心定時器,核心定時器用於控制某個函式,也就是定時器將要處理的函式在未來的某個特定的時間內執行。核心定時器註冊的處理函
手把手教你製作linux U盤啟動盤及安裝Ubuntu與win7雙系統
linux系統簡介 與Windows系統相比,linux系統有很多優點,在開發中,linux也是一項必不可少的技能。基本後臺伺服器都部署在linux上。linux是基於Un
前端深入之css篇丨初探【transform】,手把手帶你實現1024程式設計師節動畫
寫在前面 馬上就2020年了,不知道小夥伴們今年學習了css3動畫了嗎? 說起來css動畫是一個很尬的事,一方面因為公司用css動畫比較少,另一方面大部分開發者習慣了用JavaScript來做動畫,所以就導致了許多程式設計師比較排斥來學習css動畫(至少我是),但是一個不懂css動畫的前端工程師不能稱之為掌握
Net分布式系統之六:微服務之API網關
pan 業務邏輯 nginx clas 系統 gin 性能 blog services 本人建立了個人技術、工作經驗的分享微信號,計劃後續公眾號同步更新分享,比在此更多具體。歡迎有興趣的同學一起加入相互學習。基於上篇微服務架構分享,今天分享其中一個重要的基礎組件&ldq
手把手帶你畫一個 時尚儀表盤 Android 自己定義View
androi alias 屬性 extend 三角函數 blank xutils content 還在 拿到美工效果圖。咱們程序猿就得畫得一模一樣。 為了不被老板噴,僅僅能多練啊。 聽說你認為前面幾篇都so easy,那今天就帶你做個相對照較復雜的。
Linux學習之三:檔案與文件系統的壓縮與打包
常用 etc 存在 filename 目錄 時有 blog 備份工具 restore 將檔案進行壓縮處理是為了使文件更加方便在網絡上傳輸以及降低硬盤使用量。進行壓縮的原理就是檔案在存儲時有很多的空間是無用的,而壓縮就是將這些空間給釋放出來。 Linux下幾種常見的壓縮方式後
別怕,手把手帶你撕、拉、扯下SpringMVC的外衣
ons mvc springmvc test stp 實的 per war sdi 提到框架,就不得不提一下看源碼,我們平時總是想求大神帶我們飛,然而看源碼就是一個向大神學習的最直接的一種方式,然而我們每次鼓起勇氣看源碼前是這樣的但是一點開源碼,頓時代碼如洪流湧入,你的內心
一篇文章帶你入門Linux——馬哥Linux基礎學習筆記
更改密碼 自帶 ctime 詳細信息 內嵌 桌面環境 地址定界 格式符 p s 1.課程體系: 中級: 初級:系統基礎 中級:系統管理、服務安全及服務管理、Shell腳本; 高級: MySQL數據庫; cache & stor
Android性能優化:手把手帶你全面了解 內存泄露 & 解決方案
new t 簡單介紹 新建 cti 接口 stat you bit ray . 簡介 即 ML (Memory Leak)指 程序在申請內存後,當該內存不需再使用 但 卻無法被釋放 & 歸還給 程序的現象2. 對應用程序的影響 容易使得應用程序發生內存溢出,即 OO
手把手帶你入坑H5與小程序直播開發視頻課程直播的工作原理教程
直播 H5 微信 第1章 課程介紹對於課程整體以及直播行業的現狀進行介紹第2章 直播工作原理所謂知其然也要知其所以然,只會用別人總結好的東西很難有質的進步,只有深諳背後的工作原理才能進一步吃透到進階。本章從直播協議入手到工作原理詳解,步步為營,化繁為簡,極易吸收。第3章 Video詳解video
Linux環境搭建 | 手把手教你安裝Linux虛擬機
界面 rup 對話 rtu 發行版 所在 兼容性 運維 編輯 前言 作為一名Linux工程師,不管是運維、應用、驅動方向,在工作中肯定會需要Linux環境。想要獲得Linux環境,一個辦法就是將電腦系統直接換成Linux系統,但我們平常用慣了Windows系統,直接切換為L
大數據是什麽?華為雲學院帶你探索大數據之旅
個人 知識管理 一個 信息技術 每年 大數據 vol 核心 創新 大數據是什麽?華為雲學院帶你探索大數據之旅我們首先從大數據是什麽開始講起,!下面由我來帶領大家!展開我們本次的大數據學習之旅!大數據是什麽,內容將包括大數據的產生,發展大數據的基本概念。首先我們來追溯一下大數
手把手帶你擼一套Android簡易ORM框架
ORM概念 實體模型建立 註解列 ID 主鍵 自增長 資料表的列
手把手帶你抓取智聯招聘的“資料分析師”崗位!
前言 很多網友在後臺跟我留言,是否可以分享一些爬蟲相關的文章,我便提供了我以前寫過的爬蟲文章的連結(如下連結所示),大家如果感興趣的話也可以去看一看哦。在本文中,我將以智聯招聘為例,分享一下如何抓取近5000條的資料分析崗資訊。 往期爬蟲連結 上海歷史天氣和空氣質量資料獲取(Pyth