全程建议ubuntu docker运行!!!
下载kernel代码
使用git从清华镜像clone代码
# 官方
# git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
# 清华镜像
git clone https://mirrors.tuna.tsinghua.edu.cn/git/linux.git
# 中国科学技术大学镜像站
# git clone https://mirrors.ustc.edu.cn/linux.git
安装环境配置
sudo apt update
sudo apt install git build-essential libncurses-dev bison flex libssl-dev libelf-dev
开始编译linux
1.切换到需要编译的版本,并创建本地分支(以v6.8-rc7为例)
git checkout -b v6.8-rc7 tags/v6.8-rc7
2.内核配置
几种配置方法:
make defconfig
:创建一个基本的配置,适用于大多数系统。make allnofconfig
:内核最小化编译。make allyesconfig
:内核最大化编译。make menuconfig
:提供一个文本模式的图形界面来配置内核。make xconfig
:如果你有图形界面,可以使用这个选项。
这里用defconfig来配置举例,主要是将整个流程搞通,就不配置内核内容了
# 进入代码目录,执行如下
make defconfig
#########下面是执行结果#########
eoser@eoser-UPC:~/opensrc/linux$ make defconfig
HOSTCC scripts/basic/fixdep
HOSTCC scripts/kconfig/conf.o
HOSTCC scripts/kconfig/confdata.o
HOSTCC scripts/kconfig/expr.o
LEX scripts/kconfig/lexer.lex.c
YACC scripts/kconfig/parser.tab.[ch]
HOSTCC scripts/kconfig/lexer.lex.o
HOSTCC scripts/kconfig/menu.o
HOSTCC scripts/kconfig/parser.tab.o
HOSTCC scripts/kconfig/preprocess.o
HOSTCC scripts/kconfig/symbol.o
HOSTCC scripts/kconfig/util.o
HOSTLD scripts/kconfig/conf
*** Default configuration is based on 'x86_64_defconfig'
#
# configuration written to .config
#
3.编译开整,编译内核
make -j$(nproc)
这里可能汇报错,一般是依赖问题,根据内容搜索,apt安装好库就行了,比如我就遇到了缺少`#include <gelf.h>`头文件的问题,安装编译环境时加入libelf-dev就行了
4.编译内核模块
make modules
5.将编译结果安装到非系统文件并创建系统镜像(该方案没跑通,以下保留的三我认为还有点用的东西)
此处失败,查找网络后用编译版本busybox + syslinux的方法引导
## 默认安装到系统,不推荐
# sudo make modules_install
# sudo make install
## 推荐安装方法
# 创建存放文件夹
mkdir -p ../out/linux/lib/modules
mkdir -p ../out/linux/boot
# 输出位置设置变量方便使用
rootfs=$(cd ../ && pwd)/out/linux
# 安装到存放文件夹
sudo make INSTALL_MOD_PATH=$rootfs modules_install
# 拷贝内核到boot
cp arch/x86/boot/bzImage $rootfs/boot/vmlinuz-$(make kernelversion)
# 创建系统镜像
apt install initramfs-tools
mkinitramfs -o $rootfs/boot/initramfs-$(make kernelversion).img
# 安装镜像制作软件
apt install xorriso
# 创建引导目录
mkdir -p $rootfs/boot/grub
# 写入引导配置
cat > $rootfs/boot/grub/grub.cfg<< EOF
default 0
timeout 5
linux /boot/vmlinuz-$(make kernelversion) root=/dev/sda1 ro
initrd /boot/initramfs-$(make kernelversion).img
EOF
......
#创建busybox的软连接
for i in $($rootfs/bin/busybox --list);do ln -s ../bin/busybox $rootfs/bin/$i ;done
......
# 将引导程序写入到目录
xorriso -as mkisofs -o ../out/linux-$(make kernelversion).iso -b boot/grub/grub.cfg -no-emul-boot -boot-load-size 4 -boot-info-table $rootfs
编译Busybox
1.第一步当然是拉代码啊,有点奇怪,官方git我开发机器拉不下来,nas镜像仓库却能拉下来
git clone https://git.busybox.net/busybox.git
# 或者
git clone https://mirror.ghproxy.com/https://github.com/mirrors/busybox.git
2.编译
make defconfig
# 编译前 .config 文件中的CONFIG_STATIC=y要加上,因为这是打包的,不能用动态库
make -j12
3,安装到指定目录,为后面生成镜像准备(会在指定目录下产生多个文件夹和文件,并且与busybox关联)
make install CONFIG_PREFIX=$rootfs
chmod 777 -R $rootfs
4.创建必要文件与文件夹
mkdir -p $rootfs/{dev,proc,sys}
cat > $rootfs/init << EOF
#!/bin/sh
dmesg -n 1
mount -t devtmpfs none /dev
mount -t proc none /proc
mount -t sysfs none /sys
setsid cttyhack /bin/sh
EOF
chomd +x $rootfs/init
5.打包当前的$rootfs目录
cd $rootfs
find . | cpio -R root:root -H newc -o | gzip > rootfs.gz
mkdir os
mv rootfs.gz ./os/
现在启动需要的最小化系统文件搞定,接下来准备引导
syslinux引导系统
1.第一步是下载文件
https://mirrors.edge.kernel.org/pub/linux/utils/boot/syslinux/
# 别在意哈,新建的docker环境,啥也没装
apt install wget
# 我就是新欢啥都下新的,哈哈哈,可惜也不新了,都没维护了,后面研究更好的引导方式
wget https://mirrors.edge.kernel.org/pub/linux/utils/boot/syslinux/syslinux-6.03.tar.xz
2.解压拷贝文件并创建脚本
tar -xvf syslinux-6.03.tar.xz
cp ./syslinux-6.03/bios/core/isolinux.bin ./os/
cp ./syslinux-6.03/efi32/com32/elflink/ldlinux/ldlinux.e32 ./os/
# cp ./syslinux-6.03/efi32/com32/elflink/ldlinux/ldlinux.e64 ./os/
cp $rootfs/../../linux/arch/x86/boot/bzImage ./os/linux
echo 'default linux initrd=rootfs.gz' > ./os/isolinux.cfg
3.打包成iso镜像
# 安装镜像制作软件
apt install xorriso
xorriso -as mkisofs -o $rootfs/myos.iso -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table $rootfs/os
现在镜像成了!虚拟机跑跑看。
总结
自己编译内核+busybox+syslinux 可行!
iso包大小:15M
能正常进命令行页面!ubuntu没装截图软件就不上图了!
评论区