编译环境
系统版本
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_64、ARCH=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 /