梳理一些Linux知識 by quqi99

2021-06-18 11:10:44 字數 2741 閱讀 2732

梳理一些linux知識( by quqi99 )

本文是一些使用linux方面的高度概括,除了看linux的**以外,熟練用linux估計也就是這些內容了,當然,可以還要包括一些linux核心的除錯方面的內容。本文包括:

linux啟動過程;

怎麼做根檔案系統映象,是通過交叉編譯鏈從頭編譯,還是從已有的發行版製作;

根檔案系統映象做完之後,怎麼做記憶體根檔案系統initrd或initramfs;

兩種根檔案系統準備好之後,怎麼定製linux核心;

兩種根檔案系統和定製的linux核心準備好之後,如果加上bootloader (grub)做成可引導的,再結合兩種工具(壓縮塊裝置的工具,將塊裝置轉換成光碟iso裝置的工具)製作成可引導的iso檔案;

技術都是相通的,雖然從來沒有做過嵌入式linux,也將通過模擬從理論層面想象arm平台上嵌入式linux的啟動過程;

1,bios,在pc體系中,機器加電啟動後,cpu會載入一小段彙編寫的韌體程式,叫bios,bios會檢測硬體,收集硬體資訊等等,然後將控制權交給硬碟mbr中的bootloader程式。(我相信arm平台上應該有類似於bios的東西,可能叫bios這個名字,也可能叫別的名字)。

2,bootloader,硬碟的頭512個節字叫mbr用於儲存bootloader程式,在pc平台有我們熟悉的lilo或grub等(在arm平台上也應該有類似的bootloader,可能不是grub,但我相信開源世界已經為我們做好了類似的東西,需要我們google之)。並且,grub可以直接儲存在硬碟的頭512位元組的mbr中,

在硬碟的每個分割槽的頭512個節字中依然可以儲存它,這也是為什麼每塊分割槽都能安裝乙個作業系統支援雙系統多系統的原因。

3,grub會引導核心,例如下列配置grub引導第一塊硬碟(hd0)上的/dev/sda9分割槽的linux核心(vmlinuz-3.8.0-rc5),同時,也指明了乙個initrd (initrd-linux3.8.0-rc5.img)

grub> root (hd0,msdos9)

grub> kernel /boot/vmlinuz-3.8.0-rc5 ro root=/dev/sda9 acpi=off

grub> initrd /boot/initrd-linux3.8.0-rc5.img

grub> boot

4,核心與兩個根檔案系統的啟動過程,linux系統中有除了核心(主要用於對檔案,程序等資源進行管理)外一般還有兩個根檔案系統,乙個執行在記憶體中(initrd或者initramfs),乙個儲存在硬碟中(如openstack映象)。執行在記憶體中的根檔案系統有兩種實現,一種是上面提到的initrd,如果上面grub指定了initrd,核心在啟動時就會載入它到記憶體的乙個區域執行做一些初始化的工作,如想要在後面載入硬碟裡的根檔案系統的話肯定得先初始化硬碟驅動啊,但是initrd的大小不能大於核心指定的記憶體大小,所以為了克服這個問題,核心自帶了乙個空的根檔案系統叫initramfs,核心啟動後除了mount硬碟的根檔案外,它也會mount到rootfs,由於rootfs是記憶體的ramfs檔案系統的乙個例項,所以initramfs的大小不像initrd那樣受指定記憶體大小限制,同時,由於它mount到了rootfs之間它也是常駐記憶體的(initrd在完成它的使命之後核心會收回它即用的記憶體空間)。不管是initrd還是映象,它們都是根檔案系統,也就都有名為init的可執行檔案,核心載入initrd時,就會把initrd的init啟動做為第乙個程序,initrd的init就會做一些初始化工作如載入硬碟驅動,完事之後通過exec命令執行硬碟根檔案系統裡的init,由於exec的特點是子程序會完全替換父程序的程序空間,所以這樣也就完全了根檔案系統的切換。

5,根檔案系統映象如何做成可引導的,由上面的原理,我們知道,映象就是乙個帶有init指令碼的根檔案系統,所以它只要是linux核心可以識別的檔案格式即可(如ext4等),所以虛機檔案系統(raw,qcow2)做成核心用到的映象需要轉換成ext4等檔案系統格式。

另外,根檔案系統映象由於儲存在硬碟中,肯定也是乙個塊裝置,如果通過loop裝置模擬的檔案系統映象是可以直接通過dd命令拷貝到硬碟(/dev/sda)就能直接用的。

如果要將它製作成光碟的話,顯然還需要加上引導程式grub,且核心也應該是定製支援iso9006光碟驅動的核心,將根檔案系統的映象+grub+定製的核心通過「壓縮塊分割槽」(我沒有實際做過,不知道叫什麼名字,但通過原理分析我相信谷歌一下了肯定有這樣的工具)的工具壓縮成乙個單檔案,最後通過

製作光碟(因為光碟不是塊裝置,肯定不能使用dd命令,應該有針對光碟的專用命令,同樣,我不知道叫什麼,搜尋一下肯定有)的工具把它做成iso檔案即可。

6,現在的問題就是根檔案映象是怎麼做的問題。有兩種方法,一種是通過交叉編譯工具鏈交叉編譯,交叉編譯工具鏈就是在宿主機上編譯出可以支援其他平台(如其他pc平台,或者arm平台)的gcc(c,c++編譯器), glibc(c程式庫), binutils(彙編和鏈結工具),gdb(除錯工具),大家知道,linux上原始碼安裝程式時依賴問題繁多,再加上宿主平台和目標平台差異的問題,我沒實際做過但我相信估計會遇到很多具體的細節問題,要求你對gcc等這些編譯或makefile知識少不了。然後可以在宿主機上隨便建乙個目錄且將乙個塊裝置mount在這個目錄上,在這目錄在建立根檔案系統,將這個目錄chroot之後就可以利用之前的交叉編譯工具安裝目標平台的一系列軟體,這樣做出來的就映象。但這種方式很麻煩,我覺得只有兩種場景有用,一是需要為新的cpu型別準備linux系統,二是需要減小linux發行版的體積。對於第乙個需求必須這樣做,對於第二個減小體積我相信可以直接使用某些小的linux發行版來做,如meego等。從理論上,更有可能直接將你正在使用的linux的根檔案系統拷貝出來通過上面的一步結合啟動分割槽做成iso。

一些Linux知識

etc security limits 設定檔案描述符 注意行首加 cat proc pid limits 實際的對程序的限制都在這裡 systemctl list unit files grep vncserver查開機是否自啟 lsb release a查系統版本 檢視該值的命令是 sysctl...

linux一些知識

linux的基本目錄結構詳解 bin 二進位制可執行命令 dev 裝置特殊檔案 etc 系統管理和配置檔案 etc rc.d 啟動的配置檔案和指令碼 home 使用者主目錄的基點,比如使用者user的主目錄就是 home user,可以用 user表示 lib 標準程式設計庫,又叫動態鏈結共享庫,作...

linux一些基礎知識

1.檢視幫助 man cd 2.列出當前目錄下的內容 ls選項與引數 a 全部的檔案,連同隱藏檔 開頭為.的檔案 a 全部的檔案,連同隱藏檔,但不包括.和.這兩個目錄 d 僅列出目錄本身,而不是列出目錄內的檔案 l 長資料串列出,包含檔案的屬性和許可權等 n 列出uid和gid而非使用者和群組的名稱...