2022年6月6日 星期一

[Linux] 實作Bootloader, kernel & rootfs開機流程 (上)

轉貼本網站文章請註明出處 from Awaysu
https://awaysu-programming.blogspot.com


一個系統開機的流程基本上是Bootloader=> kernel=> filesystem
這裡我用VirtualBox模擬一台x86電腦來驗證了解
當然如果你手上有其他平台像是樹梅派也是一樣做法
只是cross compiler原本是x86的gcc改成arm的arm-linux-gcc


1. 下載Bootloader
這邊我選一個x86簡單的bootloader - extlinux

apt-get install uuid-dev
git clone https://github.com/geneC/syslinux.git
make
extlinux會產生在./bios/extlinux/extlinux拷貝至tftp下
但如果是embedded system,大多使用uboot.


2. 下載Kernel

wget http://ftp.ntu.edu.tw/linux/kernel/v4.x/linux-4.19.104.tar.gz
tar zxvf linux-4.19.104.tar.gz
cd linux-4.19.104
make
kernel image會產生在./arch/x86_64/boot/bzImage拷貝至tftp下
如果需要.config,可以參考此檔


3. 創建file system下的進入點init
這裡我們只是印出訊息The is init test !!!迴圈等待
init.c

#include <stdio.h>

int main()
{
    printf("\n\n The is init test !!! \n\n");
    while(1)
    {}
    return 0;
}
build成init 
gcc -static -o init init.c
init拷貝至tftp下


4. 下載一個可以開機的Linux CD
我選Tiny Core Linux因為只有18M又有基本的linux指令
http://www.tinycorelinux.net/13.x/x86_64/release/CorePure64-13.1.iso


5. 建立VirtualBox虛擬電腦
開啟VirtualBox,新增一台類型為Linux,版本為Arch Linux (64-bit)的虛擬電腦
裝置=>光碟機=>設定CorePure64-13.1.iso並開機

 


5. 重開機
開機後看見boot:按下Enter會看到tc@box:~$表示可以下指令



6. 寫入所需檔案

# extlinux 需要此lib link
sudo mkdir /lib64
sudo ln -s /lib/ld-linux-x86.so.2 /lib64/ld-linux-x86.so.2

#格式化硬碟並mount
sudo mkfs.ext4 /dev/sda 
sudo mount -t ext4 /dev/sda /mnt
sudo cd /mnt

#下載kernel
sudo tftp -l bzImage -r bzImage -g 10.118.96.20

#下載rootfs進入的init
sudo tftp -l init -r init -g 10.118.96.20
sudo chmod 777 init

#下載bootloader並寫入
sudo tftp -l extlinux -r extlinux -g 10.118.96.20
sudo chmod 777 extlinux
sudo ./extlinux -i /mnt

#產生所需的dev node
sudo mkdir dev
sudo mknod dev/console c 5 1
sudo mknod dev/ram b 1 0


7. 建立檔案/mnt/extlinux.conf
sudo vi /mnt/extlinux.conf

DEFAULT emblinux
timeout 10
prompt 0
label emblinux
  kernel bzImage
  append noinitrd root=/dev/sda rw init=/init ide=nodma

此檔案為開機指令, kennel為bzImage, rootfs為/dev/sda,init是我們編譯出來的init
Bootloader extlinux 開完後就會按照此設定開機


8. 移除Linux CD後重開機


9. 開機後就可以看見系統最後進到我們寫的 The is init test !!!


如果想要自己建構出更詳細的file system可以參考 [Linux Porting] 建立基本可開機的filesystem 


沒有留言:

張貼留言