工具
練習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/bzImage
與arch/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
修復 No such device tty2, tty3, tty4
請確定/mnt/dev
存在並且fstab擁有devtmpfs(存疑)
poweroff無法使用
請確定/mnt/proc
存在
參考資料
kernel
Linux