從 0 安裝Linux

工具

練習qemu啟動kernel

qemu-system-x86_64 --kernel /boot/vmlinuz-linux 

r888800009/kernel-tools to create a initramfs

git clone https://github.com/r888800009/kernel-tools
cd kernel-tools
./initramfs-script.sh
cd ..

# 如果自行編譯
qemu-system-x86_64 -kernel ./arch/x86_64/boot/bzImage  -m 1024M  -nographic -initrd ./kernel-tools/initramfs.img -append "console=ttyS0" -s -S

About -append please see The kernel’s command-line parameters — The Linux Kernel documentation

kernel

抓取kernel

花費的空間實在太大也太慢,直接抓取最新的提交,加上-depth 1

git clone --depth 1 git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git

如果抓取kernel.org的完整的repo

git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git

或torvalds的鏡像

git clone https://github.com/torvalds/linux.git 

這邊也有寫好的腳本 linux-clone,可以抓取特定版本的 kernel

linux-clone 5.13.4

編譯kernel

Kernel Build System — The Linux Kernel documentation 先配置內核設定,這邊使用預設設定所以直接退出

make menuconfig

透過多線程下去編譯內核

make bzImage -j 4

應該可以在arch/x86/boot/bzImagearch/x86_64/boot/bzImage看到bzImage,透過qemu執行

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

編譯模塊

make modules -j 4

最後將kernel安裝到特定位置,可以透過grub去啟動他

make install INSTALL_PATH=/tmp/kernel 

busyBox編譯

下載busybox並且編譯,作為啟動後第一個shell

git clone git://git.busybox.net/busybox

透過make進行編譯,配置編譯選項啟用靜態(Settings -> Build Options -> Build static binary)

make menuconfig

之後編譯

make

安裝

make install 

製作 initramfs

kernel-tools/initramfs-script.sh at main · r888800009/kernel-tools

編譯grub

首先獲取grub

git clone https://git.savannah.gnu.org/git/grub.git
cd grub

編譯grub

PYTHON=python2 ./bootstrap
./configure --prefix=`pwd`/local
make
make check
make install

./configure --prefix=`pwd`/local可以使grub安裝```pwd`/local``

不知道為什麼一直make check fail,改python2和--disable-werror還是fail,如果有人想告訴我原因可以開個issue

FAIL: iso9660_test
FAIL: tar_test
FAIL: grub_func_test

將grub安裝到image

建立映像檔

qemu-img create linux.img 1G   

將linux.img掛載到loop0,並且設定分割區可開機

sudo losetup -fP linux.img 
sudo fdisk /dev/loop0

檢查是否成功產生分割區

lsblk

格式化

sudo mkfs.ext4 /dev/loop0p1 
sudo mount /dev/loop0p1 /mnt

設定權限使得可寫

sudo chown `whoami`:`users` /mnt/  -R 

設定device.map

mkdir -p /mnt/boot/grub
cat > /mnt/boot/grub/device.map <<EOF
(hd0)  /dev/loop0
EOF

安裝grub到img,./grub-install應該要在編譯好的grub repo裡面,不加上sudo會導致無法讀取loop0p1之類的

sudo ./grub-install --root-directory=/mnt /dev/loop0 --no-floppy --target=i386-pc

清理

sudo chown root:root /mnt/ -R
sudo umount /mnt                                                         
sudo losetup -d /dev/loop0

執行

qemu-system-x86_64 -drive format=raw,file=linux.img 

參考

將kernel放入映像檔並透過grub啟動

先掛載根目錄

sudo losetup -fP linux.img
sudo mount /dev/loop0p1 /mnt
sudo chown `whoami`:`users` /mnt/ -R
lsblk

安裝內核到image

make modules_install INSTALL_MOD_PATH=/mnt  
make install INSTALL_PATH=/mnt/boot 

配置grub (註: 這裡也是可以用 grub-mkconfig 去裝,不過 LFS doc 不建議使用在 LFS 上 )

cat > /mnt/boot/grub/grub.cfg << "EOF"
# Begin /boot/grub/grub.cfg
set default=0
set timeout=5

insmod ext2
set root=(hd0,1)

menuentry "Linux" {
        linux   /boot/vmlinuz root=/dev/sda1 rw
}
EOF

參考LFS grub

清理

sudo chown root:root /mnt/ -R
sudo umount /mnt                                                         
sudo losetup -d /dev/loop0

執行

qemu-system-x86_64 -drive format=raw,file=linux.img

透過內核掛載root並且啟動busybox

先掛載根目錄

sudo losetup -fP linux.img
sudo mount /dev/loop0p1 /mnt
sudo chown `whoami`:`users` /mnt/ -R 

設定fstab

mkdir -p /mnt/etc
mkdir -p /mnt/dev
mkdir -p /mnt/proc
cat > /mnt/etc/fstab << "EOF"
# file system  mount-point  type     options             dump  fsck
#                                                              order

/dev/sda1     /            ext4    defaults            1     1
devtmpfs       /dev         devtmpfs mode=0755,nosuid    0     0
EOF

busybox安裝

cd busybox
make install CONFIG_PREFIX=/mnt/

清理

sudo chown root:root /mnt/ -R
sudo umount /mnt                                                         
sudo losetup -d /dev/loop0

執行

qemu-system-x86_64 -drive format=raw,file=linux.img

參見LFS fstab

修復 No such device tty2, tty3, tty4

請確定/mnt/dev存在並且fstab擁有devtmpfs(存疑)

poweroff無法使用

請確定/mnt/proc存在

參考資料

kernel


Linux