参考视频链接:https://www.bilibili.com/video/BV1yk4y1B7Fx/spm_id_from=333.788.recommend_more_video.0
参考教程:https://www.bilibili.com/read/cv7118525/
运行环境:基于X64平台虚拟机的ubuntu20.04系统
首先下载linux内核源码:
地址:https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.250.tar.xz
我采用的版本是4.9.250,可以根据需求登录https://www.kernel.org/更改其他版本使用
在Ubuntu创建一个工作目录,后续工作均在这个目录进行
我选择的目录是/home/ubuntu/work/kernel (这里ubuntu是我的用户名)
通过xftp或其他工具将下载的linux-4.9.250.tar.xz包放到该目录下,执行以下命令进行解压:
xz -d linux-4.9.250.tar
tar -xvf linux-4.9.250.tar
进入到linux-4.9.250目录,并切换到root用户
1)指定硬件体系架构
采用X86架构,输入以下命令
export ARCH=x86
make x86_64_defconfig
make meunconfig
此时会进入kernel config配置界面
注意:此处的[*]代表被选中,[ ]表示未被选中
依次进入
General setup —>
[*]Initial RAM filesystem and RAM disk (initramfs/initrd) support
选中上面这个选项(光标放上去按空格可以选中或者取消),如果已经选中了就什么也不用做。
返回上一级,依次进入
Device Drivers —>
[*]Block devices —>
[*] RAM block device support
选中该选项,并将下面的Default RAM disk size (kbytes)修改为65536
选择
make
第一次编译时间可能比较长,约10分钟左右,请耐心等待编译完成。
编译成功后的内核位于:arch/x86_64/boot/bzImage
编译过程如果出现以下错误
fatal error: openssl/opensslv.h: No such file or directory
执行以下代码安装OpenSSL开发包
apt-get install libssl-dev
重新执行make。
1)下载busybox
下载地址:
https://busybox.net/downloads/busybox-1.32.0.tar.bz2
原教程采用的版本为1.30.0, 编译时出现错误,编译不通过,更换了1.32.0后成功。
通过xftp或其他方法将busybox-1.32.0.tar.bz2放在/home/ubuntu/work/kernel目录下
2)解压:
tar xvf busybox-1.32.0.tar.bz2
3)配置busybox
进入busybox-1.32.0目录,配置busybox为静态编译,这样busybox运行的时候不需要额外对的动态链接库。
输入命令
make menuconfig
打开以下界面
依次选择
Settings —>
— Build Options
[*] Build static binary (no shared libs) (NEW)
选中该选项。
依次选择
4)编译与安装
首先在busybox-1.32.0目录下执行
make
make install
5)补充相关文件或目录
首先创建几个文件夹,执行
mkdir etc dev mnt
mkdir -p etc/init.d/
在etc(是我们创建出来的etc,而不是ubuntu系统的etc)目录添加fstab文件,执行命令
vim etc/fstab
在文件中输入以下内容:
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
none /tmp ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0
mdev /dev ramfs defaults 0 0
在etc/init.d目录下创建rsS文件,输入命令:
vim etc/init.d/rcS
输入以下内容:
mkdir -p /proc
mkdir -p /tmp
mkdir -p /sys
mkdir -p /mnt
/bin/mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
更改该文件权限:
chmod 755 etc/init.d/rcS
在etc目录下创建inittab:
vim etc/inittab
输入以下内容:
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::askfirst:-/bin/sh
::cttlaltdel:/bin/umount -a -r
更改文件权限
chmod 755 etc/inittab
还需要执行以下指令创建三个虚拟设备
cd dev
mknod console c 5 1
mknod null c 1 3
mknod tty1 c 4 1
参考博主思路:
1.先制作一个空的镜像文件;
2.然后把此镜像文件格式化为ext3格式;
3.然后把此镜像文件挂载,并把根文件系统复制到挂载目录;
4.卸载该镜像文件。
5.打成gzip包。
在/home/ubuntu/work/kernel/busybox-1.32.0目录下
1)创建一个镜像文件并将其格式化为ext3格式:
dd if=/dev/zero of=./rootfs.ext3 bs=1M count=32
mkfs.ext3 rootfs.ext3
mkdir fs
mount -o loop rootfs.ext3 ./fs
cp -rf ./_install/* ./fs
umount ./fs
gzip --best -c rootfs.ext3 > rootfs.img.gz
以上内核和文件系统镜像应准备好,准备启动内核…
首先需要在Ubuntu内安装qemu虚拟机,通过执行以下命令查看qemu是否已经安装:
dpkg -l|grep qemu-system-x86
如果返回类似以下内容表示已经安装了
否则,应先安装qemu,执行以下命令安装
apt-get install qemu-system-x86
安装完成以后在/home/ubuntu/work/kernel目录下执行:
qemu-system-x86_64 -kernel ./linux-4.9.250/arch/x86_64/boot/bzImage -initrd ./busybox-1.32.0/rootfs.img.gz -append "root=/dev/ram init=/linuxrc" -serial file:output.txt