1. 程式人生 > >如何定制Linux外圍文件系統?

如何定制Linux外圍文件系統?

其他 star vml 如何 系統啟動 分享圖片 效果 控制 art

本文由雲+社區發表

作者:我是乖寶寶哦

一般來說,我們所說的Linux系統指的是各種基於Linux KernelGNU Project的操作系統發行版。為了掌握Linux操作系統的使用,了解 Linux操作系統的運作過程,理解內核與外圍支撐系統的關系,加深對開源操作系統的認識,我決定造個輪子——自己定制一個Linux文件系統。

這裏有兩種實現方法:

  • 直接自己實現init**\*(M1)***

加載bios 的硬件信息-> 讀取MBR –>執行Grub ->加載kernel–> 加載驅動–> init –> 執行bash

  • 利用系統/sbin/init**\*(M2)***

加載bios 的硬件信息-> 讀取MBR –>執行Grub ->加載kernel–> 加載驅動–> init –> /sbin/init -> 取得run-level信息 -> /etc/rc.d/rc.sysinit -> services –> /etc/rc.d/rc.local –> mingetty –> login

我們先選擇*M1*。

思路

  1. 利用原有系統復制必備部件到新存儲器
  2. 利用initrd.img機制在RAM Disk中測試
  3. 搭配原文件內核和模塊啟動

Step1:獲得shell版本的initrd.img

首先,我們可以寫一個腳本init

,使得內核用該文件系統啟動後能夠直接獲得一個Bash

技術分享圖片創建腳本 init

其中:/bin目錄下是常用命令,init是自己寫的腳本,/lib64目錄下是應用程序所依賴的動態庫。

技術分享圖片init 內容

現在我們需要使用命令行,創建binsbin目錄,向其中添加bashlsrmcpmvechocatless等基礎命令。由於這些命令需要依賴/lib64等目錄下的一些動態鏈接的共享庫,所以需要將依賴的庫拷貝到小系統對應的目錄下,用ldd命令查詢應用程序及其依賴的動態庫。完成之後,執行:

find . | cpio -H newc -o | gzip > /boot/initrd.img

將根文件系統打包成initrd.img

放到/boot目錄下。啟動時系統會自動執行initrd.img中的init

費了這麽大勁生成initrd.img,如何測試新建的initrd.img呢,需要在grub啟動配置文件當中增加一個入口用於測試。

title CentOS 6 Mini
root (hd0,0)
kernel /vmlinuz-2.6.32-642.el6.x86_64
initrd /initrd.img

這樣重啟之後就會出現啟動選項了。

Step2:完成掛載原系統能力

為了能掛載原系統,必須在initrd.img中加載原系統運行所必須的驅動模塊,比如ext4文件系統的驅動、scsi設備的相關驅動等,/sbin/modinfo 配合/sbin/insmod,驅動放到/module

技術分享圖片

Step3:完成擁有管理設備能力(udev)

利用管理、監控主機設備的服務程序udevd來自動加載所需的驅動模塊,比我們自己實現更加可靠。udevd的規則文件在/lib/udev/目錄下,配置文件在/etc/udev/目錄下,同時還需要/etc/nsswitch.conf配置的名稱服務交換,其依賴的庫為/lib目錄下以libnss開頭的文件,將上述文件拷貝到我們的目錄下,然後使用/sbin/start\_udev命令可以啟動udevd服務。(udevd需要調用一些其他的系統命令,如/sbin/modprobe,可用strace進行跟蹤獲取)。

技術分享圖片小系統的目錄文件

其中:/dev目錄下是系統存放可用設備的目錄,/log是使用strace命令生成的log記錄文件。

Step4:完成擁有login登錄能力

由於login的機制比較復雜,涉及進程管理機制和進程組、控制臺等許多方面,因此我們采用*M2*,將/sbin/init命令拷到小系統目錄下,init腳本改為

#!/bin/bash
exec /sbin/init

將控制權交給/sbin/init之後,系統啟動時就必須等到它完成一系列調用之後,進入login界面,用戶才能重新獲得控制權。

/sbin/init的過程大致分為三塊:第一塊是udevd加載驅動模塊、文件系統檢查和根切換,相關配置在/etc/rc.sysinit中;第二塊是啟動各項服務,相關配置在/etc/rc.d/目錄下;第三塊是登錄部分,需要調用/sbin/mingetty/bin/login等命令。將上述所涉及的命令及文件拷貝到小系統對應的目錄下,並對配置進行修改。

由於小系統啟動之後initrd.img作為臨時根文件系統直接在內存中運行,而我們小系統不需要進行根切換,故將/etc/rc.sysinitremount\_needed()函數體註釋掉,這樣就不會根切換了。

由於系統采用了全新的Upstart啟動方式(/sbin/init程序已經改由upstart軟件包提供),將與Upstart啟動相關的配置文件拷貝至小系統目錄下:

/etc/inittab 配置默認運行級別
/etc/init/rcS.conf 加載rc.sysinit腳本,完成系統初始化任務
/etc/init/rc.conf 兼容腳本,負責各運行級別的調用處理
/etc/init/rcS-sulogin.conf 為單用戶模式啟動/sbin/sushell環境
/etc/init/control-alt-delete.conf 控制終端下的Ctrl+Alt+Del熱鍵操作
/etc/init/start-ttys.conf 配置tty終端的開啟數量、設備文件
/etc/sysconfig/init 控制tty終端的開啟數量、終端顏色方案
/etc/init/tty.conf 控制tty終端的開啟

bootmini/etc/inittab的運行優先級改為2,那麽系統啟動時/sbin/init將執行bootmini/etc/rc.d/rc2.d/目錄下以S開頭的文件,將一些不需要開啟的服務文件名改為K開頭。

bootmini/etc/rc.d/rc.local文件中可以加入用戶需要系統開機啟動後自動執行的操作。

login程序基於認證體系PAM, 配置文件在/etc/pam.d/目錄下,相關庫文件有/lib64/security/及其依賴的庫文件;login還涉及用戶組管理/bin/chgrp/bin/chown/bin/chmod等,保存用戶名的文件/etc/passwd/etc/group,用戶密碼文件為/etc/shadow。其他一些涉及的文件可通過strace來幫助分析。

可在真機上運行的完整版小系統

部分目錄文件:

技術分享圖片/etc

技術分享圖片/bin

技術分享圖片/sbin

技術分享圖片/usr/bin

技術分享圖片/usr/sbin

至此,文件系統算是可以跑了。下一篇我們再造個輪子——進行Linux內核的裁剪。真機效果也將在下篇看到。

此文已由騰訊雲+社區在各渠道發布

獲取更多新鮮技術幹貨,可以關註我們騰訊雲技術社區-雲加社區官方號及知乎機構號

如何定制Linux外圍文件系統?