制作比較簡單的Linux系統
本文檔在virtualbox5.1.30,和ubuntu14.04下制作的.目的是了解系統的啟動過程.
1. 新建一個虛擬機(名稱:linux,類型:Linux,版本:Ubuntu(64bit))
除了虛擬硬盤大小設置2G,其它選項默認.
2. 在一個已經安裝好ubuntu的虛擬機添加上述的虛擬硬盤.
先在安裝好的ubuntu上選擇設置->儲存->控制器:SATA->添加虛擬硬盤.
找到步驟1建立的虛擬硬盤.
結果如圖:

3.啟動已安裝好的ubuntu.給虛擬硬盤分區.
如圖/dev/sdb就是步驟1的虛擬硬盤.

分區命令:sudo fdisk /dev/sdb
如圖,只分了一個主分區:

4.給虛擬硬盤安裝grub引導.
a.把/dev/sdb1格式化ext4文件系統.如圖:

b.掛載/dev/sdb1到/mnt.
命令:sudo mount -t ext4 /dev/sdb1 /mnt/
c.安裝grub.

5.添加grub.cfg
最簡單的方法是拷貝ubuntu虛擬機上的/boot/grub/grub.cfg到/mnt/boot/grub/,然后修改.
a.修改所有的uuid,用如圖的uuid(sdb1)替換原來的uuid(每個分區有唯一的uuid).

b.如圖修改147,165,182行.

6.拷貝vmlinux和ramdisk.
如圖命令:

7.自己寫一個init程序,測試內核能否啟動.
代碼如圖:(文件名mian.c)

編譯命令:gcc -static main.c -o init,然后拷貝init到/mnt.
8.在/mnt下創建proc,sys,dev三個文件夾,/mnt內容如下:

9.啟動linux虛擬機,如圖,說明內核和init都成功運行.

10.拷貝sh和ls命令程序和動態庫. (可以拷貝更多命令)
注意:ubuntu系統的bash無法在這里當作init進程,sh實際是dash
a.先在/mnt下創建bin,lib/x86_64-linux-gnu,lib64文件夾.
b.sudo cp /bin/sh /bin/ls ./bin/
c.查看sh,ls需要哪些動態庫,如下:

d.拷貝步驟c的動態庫到lib/x86_64-linux-gnu和lib64.
結果如圖:

11.啟動linux虛擬機,啟動前修改grub.cfg的init=/bin/sh,或者啟動時修改.結果如下:

