如何定製Linux外圍檔案系統?
本文由雲+社群發表
作者:我是乖寶寶哦
一般來說,我們所說的Linux系統
指的是各種基於Linux Kernel
和GNU 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*。
思路
- 利用原有系統複製必備部件到新儲存器
- 利用
initrd.img
機制在RAM Disk
中測試 - 搭配原檔案核心和模組啟動
Step1:獲得shell版本的initrd.img
首先,我們可以寫一個指令碼init
,使得核心用該檔案系統啟動後能夠直接獲得一個Bash
。
建立指令碼 init
其中:/bin
目錄下是常用命令,init
是自己寫的指令碼,/lib64
目錄下是應用程式所依賴的動態庫。
init 內容
現在我們需要使用命令列,建立bin
和sbin
目錄,向其中新增bash
、ls
、rm
、cp
、mv
、echo
、cat
、less
等基礎命令。由於這些命令需要依賴/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.sysinit
中remount\_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如何系統掛載u盤複製檔案Linux
- Linux系統如何定製History輸出格式Linux
- Linux 日誌檔案系統如何工作Linux
- Linux檔案系統Linux
- [Linux]檔案系統Linux
- Linux系統篇-檔案系統&虛擬檔案系統Linux
- linux檔案系統損壞如何修復Linux
- Linux系統檔案系統及檔案基礎篇Linux
- Linux作業系統定時備份檔案方法Linux作業系統
- 論Linux檔案系統Linux
- Linux AUFS 檔案系統Linux
- linux的檔案系統Linux
- 分散式檔案系統(HDFS)與 linux系統檔案系統 對比分散式Linux
- 『學了就忘』Linux檔案系統管理 — 57、Linux檔案系統介紹Linux
- 檔案系統(十一):Linux Squashfs只讀檔案系統介紹Linux
- linux之路(五)檔案系統Linux
- Linux檔案系統、目錄Linux
- Linux 檔案系統詳解Linux
- linux 檔案系統擴容Linux
- Linux檔案系統詳解Linux
- rootfs -根檔案系統製作
- 如何在Linux系統安裝檔案同步工具:FreeFileSync?Linux
- 在Linux中,如何建立檔案系統的備份?Linux
- 在Linux系統中如何刪除一個檔案?Linux
- 導覽Linux系統檔案系統型別Linux型別
- Linux系統程式設計【4】——檔案系統Linux程式設計
- Linux系統網路檔案配置Linux
- 12_Linux檔案系統概念Linux
- Linux檔案系統的實現Linux
- Linux EXT2 檔案系統Linux
- 理解Linux檔案系統之 inodeLinux
- Linux 檔案系統擴充套件Linux套件
- linux系統檔案開啟數Linux
- Linux 檔案系統基本介紹Linux
- windows共享到linux系統檔案WindowsLinux
- Linux 檢視系統檔案命令Linux
- Linux雜記-根檔案系統Linux
- 二、Linux檔案系統結構Linux