侧边栏壁纸
博主头像
Eoser's page!博主等级

@学习@生活@自己

  • 累计撰写 113 篇文章
  • 累计创建 29 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

搞系统的第1步:Linux kernel代码的下载与编译

eoser
2024-06-09 / 0 评论 / 0 点赞 / 0 阅读 / 5747 字

全程建议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没装截图软件就不上图了!

0

评论区