编译Linux内核2.6,并使用GRUB引导启动

⌚Time: 2023-09-09 00:51:22

👨‍💻Author: Jack Ge

编译环境

系统版本

Ubuntu 10.04.3 LTS 32位

Release 10.04

Codename lucid

Make版本

GNU Make 3.81

gcc版本

Target: i486-linux-gnu

Thread model: posix

gcc version 4.4.3 (ubuntu 4.4.3-4ubuntu5)

编译Linux内核

Linux内核下载地址

https://mirrors.edge.kernel.org/pub/linux/kernel/

我下载linux-2.6.34.1版本

解压


tar -xzvf linux-2.6.34.1.tar.gz

cd linux-2.6.34.1

安装Ncurses


sudo apt-get install libncurses5-dev

配置编译参数


make menuconfig

使用默认的配置

退出如果有提示选择Yes

编译内核,需要20分钟


make

默认编译系统本身的x86架构,如果指定架构,可以添加ARCH=x86_64ARCH=i386等参数

使用-j 4等参数可以使用多线程编译,但是容易出错

编译完成

bzImage就是编译出来的内核镜像文件,在arch/x86/boot/bzImage路径下

制作文件系统

为了使linux能够运行,需要制作一个文件系统,这就用到了busybox。

busybox-1.35.0下载地址

https://busybox.net/downloads/busybox-1.35.0.tar.bz2

编译busybox

解压


tar -xjvf busybox-1.35.0.tar.bz2

cd busybox-1.35.0

配置


make menuconfig

在settings,使用空格键选中Build static binary (no shared libs)

之后退出配置,编译


make

编译成功

可能的报错

如果在之后编译过程出现如下报错


nsenter.c:(.text.nsenter_main+0x1b0): undefined reference to `setns'

就要在

Linux System Utilities--->nsenter,去掉该选项,重新编译make

报错


sync.c:(.text.sync_main+0x7c): undefined reference to `syncfs'

Coreutils--->sync选项去掉,重新make编译

创建文件系统镜像

建立一个文件系统镜像,大小8MB


dd if=/dev/zero of=ramdisk.img bs=1M count=8

格式化ext2为文件系统


mkfs -t ext2 ramdisk.img 

建立一个文件夹并挂载文件系统


mkdir fs

sudo mount -o loop ramdisk.img fs

之后查看fs文件夹,里面有一个默认的lost+found文件夹,这是格式化文件系统时产生的,说明格式化成功了


ls fs

lost+found

现在将busybox安装到文件系统


sudo make install CONFIG_PREFIX=fs

通过CONFIG_PREFIX=fs指定将busybox安装到当前的fs目录下

安装完成

查看文件系统内容,有bin/ sbin/ usr/三个文件夹和一个linuxrc文件,这个文件是指向bin/busybox的软链接

进入fs文件夹,创建更多目录


cd fs

mkdir proc sys home mnt lib etc

添加启动文件

进入etc目录建立一个inittab文件


cd etc

vi inittab


#/etc/inittab

::sysinit:/etc/init.d/rcS

::askfirst:/-bin/sh

::once:/usr/sbin/telnetd -l /bin/login

::ctrlaltdel:/sbin/reboot

::shutdown:/bin/umount -a -r

之后建立一个rc文件


#/etc/rc

#!/bin/sh

mount -t proc proc /proc

mount -t sysfs sys /sys

赋予rc文件执行权限


chmode 777 rc

之后建立一个init.d文件夹,进入


mkdir init.d

cd init.d

创建指向rc文件的软链接rcS


ln -s ../rc rcS

卸载文件系统


sudo umount fs

现在已经完成了一个基本的linux文件系统

启动linux内核

使用qemu虚拟机启动linux内核

命令


qemu -kernel /home/uu1/下载/linux-2.6.34.1/arch/x86/boot/bzImage -hda /home/uu1/下载/busybox-1.35.0/ramdisk.img -append "root=/dev/sda"

-kernel 指定内核文件路径,就是编译的bzImage

-hda 文件系统镜像文件,也就是ramdisk.img的路径

-append 附加参数

成功的进入到了系统,使用ls命令可以看到根目录的文件

使用grub引导启动

GNU GRUB(GRand Unified Bootloader简称“GRUB”)是一个来自GNU项目的多操作系统启动程序。GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。

我们使用GRUB进行测试,启动这个linux内核。

为了方便首先把bzImage和ramdisk.img拷贝到/home/dd1/目录下面

之后关机进入grub

c进入命令行模式

设置根目录硬盘和分区,内核和根文件系统


root=(hd0,msdos1)

linux /home/dd1/bzImage

initrd /home/dd1/ramdisk.img

如果不知道分区号,使用tab提示

之后只需要输入boot命令启动


boot

成功启动进入系统

启动内核时卡死的情况

如果你的启动卡在了这里


Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

内核恐慌。大概是制作的错误的文件系统,或者启动参数的配置错误导致的

解决只读文件系统的问题

如果想在这个小型linux上面建立文件


cd home/

touch a

会发现提示是一个只读的文件系统

解决办法是使用以下的命令


mount -o remount rw /

这个命令的大概意思是重新挂载根目录为读写模式

之后在创建文件就可以成功了

为了每次重启不需要重复输入这条命令,可以将命令添加到/ect/rc文件中


#/etc/rc

#!/bin/sh

mount -t proc proc /proc

mount -t sysfs sys /sys

mount -o remount rw /