本文由雲+社區發表ios
做者:我是乖寶寶哦shell
通常來講,咱們所說的Linux系統
指的是各類基於Linux Kernel
和GNU Project
的操做系統發行版。爲了掌握Linux
操做系統的使用,瞭解 Linux
操做系統的運做過程,理解內核與外圍支撐系統的關係,加深對開源操做系統的認識,我決定造個輪子——本身定製一個Linux
文件系統。bash
這裏有兩種實現方法:less
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***。spa
initrd.img
機制在RAM Disk
中測試首先,咱們能夠寫一個腳本init
,使得內核用該文件系統啓動後可以直接得到一個Bash
。操作系統
其中:/bin
目錄下是經常使用命令,init
是本身寫的腳本,/lib64
目錄下是應用程序所依賴的動態庫。命令行
如今咱們須要使用命令行,建立bin
和sbin
目錄,向其中添加bash
、ls
、rm
、cp
、mv
、echo
、cat
、less
等基礎命令。因爲這些命令須要依賴/lib64
等目錄下的一些動態連接的共享庫,因此須要將依賴的庫拷貝到小系統對應的目錄下,用ldd
命令查詢應用程序及其依賴的動態庫。完成以後,執行:3d
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
複製代碼
這樣重啓以後就會出現啓動選項了。
爲了能掛載原系統,必須在initrd.img
中加載原系統運行所必須的驅動模塊,好比ext4
文件系統的驅動、scsi
設備的相關驅動等,/sbin/modinfo
配合/sbin/insmod
,驅動放到/module
利用管理、監控主機設備的服務程序udevd來自動加載所需的驅動模塊,比咱們本身實現更加可靠。udevd
的規則文件在/lib/udev/
目錄下,配置文件在/etc/udev/
目錄下,同時還須要/etc/nsswitch.conf
配置的名稱服務交換,其依賴的庫爲/lib
目錄下以libnss
開頭的文件,將上述文件拷貝到咱們的目錄下,而後使用/sbin/start\_udev
命令能夠啓動udevd
服務。(udevd
須要調用一些其餘的系統命令,如/sbin/modprobe
,可用strace
進行跟蹤獲取)。
其中:/dev
目錄下是系統存放可用設備的目錄,/log
是使用strace
命令生成的log
記錄文件。
因爲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
來幫助分析。
部分目錄文件:
至此,文件系統算是能夠跑了。下一篇咱們再造個輪子——進行Linux
內核的裁剪。真機效果也將在下篇看到。
此文已由騰訊雲+社區在各渠道發佈
獲取更多新鮮技術乾貨,能夠關注咱們騰訊雲技術社區-雲加社區官方號及知乎機構號