0%

從零開始的Linux安裝(一)--搞定Kernel和弄好基本shell

從零開始安裝Linux好簡單,只要讓它噴錯誤噴個兩天就可以上手惹(X

抓取並編譯Linux kernel

企鵝?可以吃嗎?

抓取Kernel

到kernel.org去下載就可以惹

編譯Kernel

1
2
$ make menuconfig //內核設定,裡面有很多選項可以折騰
$ make -j4 //使用多線程去編譯,數字設定你cpu所擁有的線程數

之後就可以在arch/x86_64/boot/bzImage看到bzImage,我們在這裡可以先開機看看

1
$ qemu-system-x86_64 --kernel arch/x86_64/boot/bzImage

抓取並編譯busybox

什麼是busybox?顧名思義就是個很忙碌的盒子(X

抓取busybox

1
$ git clone git://busybox.net/busybox

編譯busybox

1
2
$ make deconfig //生成預設設定檔案
$ make menuconfig //設定

選上Busybox Settings —>Build Options的第一個選項Build BusyBox as a static binary(no shared libs)因為我們的Linux還沒有任何library,所以必須靜態連結,然後直接make下去吧

創建rootfs

我們現在要做一個只會在RAM中運行的Linux,這個Linux在運行時不訪問硬碟
首先在工作目錄下創建rootfs的資料夾

1
$ cp -r busybox3/_install/* $PWD

現在rootfs裡有了bin sbin usr目錄 好像還缺了什麼

1
mkdir proc mnt var tmp dev sys etc

同時在rootfs裡面還要有一個init文件,這個init文件可以是一個可執行檔,連結,或是一個shell script

1
$ ln -s bin/sh

新增dev下幾個必要的設備console,null,tty,tty1,tty2,tty3,tty4

1
2
3
4
5
6
7
8
cd dev
mknod console c 5 1
mknod null c 1 3
mknod tty c 5 0
mknod tty1 c 4 1
mknod tty2 c 4 2
mknod tty3 c 4 3
mknod tty4 c 4 4

這些tty是和用戶交互的終端
接下來要讓它自動掛載一些必要設備 在etc新增init.d資料夾,並新增名為rcS的檔案(記得chmod +x rcS)在裡面輸入以下腳本

1
2
3
4
5
6
7
8
9
10
11
#!/bin/sh

if [ -e /proc ] && ! [ -e /proc/mounts ]; then
mount -t proc proc /proc
fi

if [ -e /sys ] && ! [ -e /sys/kernel ] && grep -q sysfs /proc/filesystems; then
mount sysfs /sys -t sysfs
fi

exit 0

好了,一個運行在RAM的”基本”Linux就做好了,現在把它壓縮成鏡像吧

1
2
3
4
cd rootfs
find . | cpio -H newc -o > ../rootfs.img
cd ../
gzip rootfs.img -f

開機看看

1
qemu-system-x86_64 -kernel ./linux-4.15/arch/x86_64/boot/bzImage -initrd rootfs.img.gz -append "root=/dev/ram init=/init"