1991 年,linus torvalds 同學入手了一台個人計算機(pc)。
當時可用的作業系統有商用 unix 和 pc windows,兩者都**不菲,於是 linus 決定寫乙個作業系統(核心)來驅動自己的計算機(?)。
其參考 unix 實現並用自己的名字與 unix 合併來命名,即 linux。
sudo apt-get update
sudo apt-get install qemu-kvm busybox-static -y
$ ll /vmlinuz
lrwxrwxrwx 1 root root 30 2月 24 21:45 /vmlinuz -> boot/vmlinuz-4.4.0-116-generic
$ ll -h /boot/vmlinuz-4.4.0-116-generic
-rw------- 1 root root 6.9m 2月 13 08:57 /boot/vmlinuz-4.4.0-116-generic
$ sudo file /boot/vmlinuz-4.4.0-116-generic
/boot/vmlinuz-4.4.0-116-generic: linux kernel x86 boot executable bzimage, version 4.4.0-116-generic (buildd@lgw01-amd64-021) #140-ubuntu smp mon , ro-rootfs, swap_dev 0x6, normal vga
沒有錯,這是乙個只有6.9m
的單檔案二進位制檔案,
就是這個只有幾 m 的單檔案負責啟動計算機,管理硬體資源,提供程式執行環境(詳情參考作業系統課程)。
從前使用古董 bios 主機板和古董核心時,把核心二進位制檔案刻在磁碟起始處(硬編碼核心啟動引數),
bios 主機板通電自檢後嘗試載入磁碟第乙個扇區的**,即核心引導**,隨後核心完成自載入。
現代計算機軟硬體發展成熟,通常使用引導器(grub)載入核心。
測試核心啟動最簡便的方式就是使用 qemu 虛擬機器。kvm/qemu 廣泛應用於 openstack 等雲計算環境和我的個人電腦。
建立並啟動一台虛擬機器:
qemu-system-x86_64 -enable-kvm -cpu host -smp 1 -m 1g
執行後可看到虛擬機器啟動失敗。當然會失敗,因為這是臺裸機。
qemu 虛擬機器還支援直接載入核心檔案(類似引導器),簡直不要太方便。
sudo cp -l /vmlinuz ./
sudo chown $user: ./vmlinuz
qemu-system-x86_64 -enable-kvm -cpu host -smp 1 -m 1g -kernel ./vmlinuz
果然,核心愉快的載入起來了,同時愉快的報錯:"unable to mount root fs"。
虛擬機器沒有磁碟,找不到根檔案系統,意料之中。
沒有根檔案系統?不存在的。新建乙個檔案做硬碟,建立檔案系統:
truncate -s 1g sda.raw
mkfs.ext4 sda.raw -f
啟動虛擬機器:
執行結果:
核心只負責準備好執行環境,系統服務管理、使用者互動等是 init 和 shell 的事。所以核心叫核心,shell 叫外殼嘛。
核心啟動完成後嘗試執行 init,預設路徑/sbin/init
,很遺憾這個檔案不存在。
核心引數init=
可自定義 init 檔案路徑。
init 怎麼配置,要裝一套系統嗎,好怕怕。沒關係,祭出上古神器 busybox(盒子很忙)。
busybox 可提供基本 shell 環境,其只有乙個單檔案可執行檔案。將其拷貝到虛擬機器硬碟,建立/bin/sh
軟鏈結。
sudo mount -o loop sda.raw /mnt/
sudo rsync -rtploi /bin/busybox -r /mnt/
sudo ln -s /bin/busybox /mnt/bin/sh
sudo umount /mnt
再次啟動虛擬機器:
執行結果:
嘗試配置更完整的系統環境。
busybox 包含基本的 init 能力,類似 sysv-init,支援使用/etc/inittab
配置檔案。
經測試無/etc/inittab
檔案時其嘗試執行/etc/init.d/rcs
初始化。
sudo chroot /mnt/ /bin/busybox --install -s /bin/
( cd /mnt/ && sudo mkdir dev/ proc/ sys/ etc/ tmp/ var/ run/ -p )
#!/bin/sh
set -e
if test -z "$(ls dev/)" ; then
mount -t devtmpfs devtmpfs dev/
fimkdir -p dev/pts
for e in "proc proc proc/" "sysfs sysfs sys/" "devpts devpts dev/pts/" ; do mount -t $ ; done
# todo fix root fs readonly, make it writable
mount -o remount,rw /
if ! ( test -d var/run || ( test -l var/run && test "$(readlink var/run)" = /run ) ) ; then
ln -sf /run var/
fimount -t tmpfs -o nosuid,noexec,size=100m,mode=755 tmpfs run/
mkdir run/lock
結果如下:
有同學會問,是不是只要在 rcs 裡增加應用啟動指令碼(或者配置 inittab),就可以做乙個「應用容器」了呢?是的。
核心必須保持小而精。
如今 linux 社群發展成熟而龐大,包含豐富的硬體驅動和核心模組等。
linux 支援兩階段啟動,啟動時需要的驅動、模組和指令碼等,被放在乙個叫 initrd 的地方,以保持核心小而精。
比如 linux 網路啟動(本地無盤),網絡卡驅動、配置指令碼、nfs 客戶端等都放在 initrd 中。
第一階段基礎核心啟動,第二階段再執行 initrd 。
系統上看,每個核心檔案對應乙個 initrd 檔案:
$ ll -h /boot/vmlinuz-4.4.0-116-generic /boot/initrd.img-4.4.0-116-generic --sort=none
-rw------- 1 root root 6.9m 2月 13 08:57 /boot/vmlinuz-4.4.0-116-generic
-rw-r--r-- 1 root root 38m 2月 24 21:46 /boot/initrd.img-4.4.0-116-generic
initrd 定製相對自由,可以包含很多東西(通常還附送 busybox)。
通常使用通用型核心和 initrd,以相容各種硬體和環境。
如果針對特定硬體和環境定製,那麼核心和 initrd 可以做的很小,即嵌入式場景,現在也叫 iot 。
兩階段啟動怎麼玩?且聽下回分解。
Linux核心 了解Linux核心搶占
目錄 無強制搶占 可搶占核心 自願核心搶占 完全實時搶占 在配置linux核心時,我們可以設定一些影響系統行為的引數。您可以使用不同的優先順序,排程類和搶占模型。了解並選擇正確的引數非常重要。在這篇文章中,我將介紹不同的搶占模型,以及每種模型如何影響使用者和核心行為 如果配置核心 使用make me...
Linux 核心 vs Windows 核心
windows 和 linux 可以說是我們比較常見的兩款作業系統的。windows 基本占領了電腦時代的市場,商業上取得了很大成功,但是它並不開源,所以要想接觸原始碼得加入 windows 的開發團隊中。這兩個作業系統各有千秋,不分伯仲。作業系統核心的東西就是核心,這次我們就來看看,linux 核...
Linux 核心 vs Windows 核心
作者丨小林coding windows 和 linux 可以說是我們比較常見的兩款作業系統的。windows 基本占領了電腦時代的市場,商業上取得了很大成功,但是它並不開源,所以要想接觸原始碼得加入 windows 的開發團隊中。這兩個作業系統各有千秋,不分伯仲。作業系統核心的東西就是核心,這次我們...