Linux内核编译+Busybox文件系统制作(基础)

本人小白纯属爱好折腾了好久,希望分享对小白有所帮助!

linux-5.15.1,5.14.14版本都可以,编译linux-4.9.229 出错提示
cc1: error: ‘-fcf-protection’ is not compatible with this target,
其他版本没试过。

使用的工具版本

linux发行版: Ubuntu 21.10
直接下载Linux-5.10.79
Linux内核各版本下载
下载文件系统工具: busybox-1.34.1

参考文章
http://www.jinbuguo.com/kernel/longterm-linux-kernel-options.html
https://www.bilibili.com/read/cv11271232

安装编译环境 ( 如果还缺什么根据编译提示自己加 )

apt install git gcc fakeroot build-essential libncurses-dev xz-utils libssl-dev bc flex libelf-dev bison liblz4-tool

编译linux内核

创建一个目录

mkdir linux-busybox

把下载 linux内核和buxybox 放到目录 linux-busybox 里然后解压

tar -xzvf linux-5.10.79.tar.xz
tar -xjvf busybox-1.34.1.tar.bz2  

进入linux-5.10.79内核跟目录执行下面命令

指定体系结构

export ARCH=x86

在根目录生成一个配置文件.config

make x86_64_defconfig

打开配置菜单界对.config做进一步设置

make menuconfig

(启动make menuconfig 时终端窗口不能太小,否则会启动失败)

设置选项

General setup —>
   [ * ] Initial RAM filesystem and RAM disk (initramfs/initrd) support

Device Drivers —>
   [ * ] Block devices —>
         < * > RAM block device support
            (16) Default number of RAM disks (NEW)
           (65536) Default RAM disk size (kbytes) (NEW)

如图设置

*******************************************************************
说明:(英文不好, 机翻+猜)

设置选项功能,所以箭头键选择,空格键或y、n、m回车键来进行设置。

支持初始RAM文件系统和RAM磁盘(initramfs/initrd)
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support

RAM块设备支持
RAM block device support

RAM磁盘的默认数量(NEW)
(16) Default number of RAM disks (NEW)

默认RAM磁盘大小(kbytes)(NEW), 按回车键填入65536
(65536) Default RAM disk size (kbytes) (NEW)

个人理解:linux启动后挂载基于内存的文件系统,
所以要设置上面选项给与支持,否则会出现
end kernel panic not syncing VFS Unable to mount root fs on unknown block 就是无法在未知块上挂载根文件系统 。
还有 65536处默认是4096也会出现错误可能是大小了
看网上的设置65536就成功了
**************************************************************

编译内核

make

如果编译成功,内核默认在目录 arch/x86_64/boot/bzImage

如果编译失败, 可能需要删除一些文件才能再次编译,可以按需要使用下面命令

make clean
删除大多数生成的文件,但保持配置和
有足够的构建支持来构建外部模块
make  mrproper
删除所有生成的文件,+,配置,+,各种备份文件

制作文件系统

进入busybox-1.34.1根目录

启动菜单配置选项

make menuconfig

Settings —>
  — Build Options
  [*] Build static binary (no shared libs)

就是构建静态二进制,这样就不用依赖动态库了

编译安装

make && make install

You will probably need to make your busybox binary setuid root to ensure all configured applets will work properly.
出现这个提示不是报错!

完成编译安装, 会在busybox-1.34.1根目录多出个_install目录.

进入 _install 目录,创建以下目录

mkdir -p bin sbin dev etc etc/init.d usr mnt tmp proc sys

创建并编辑文件 fstab 、inittab、rcS,分别写入下面对应内容

touch etc/fstab
vim etc/fstab

proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
touch etc/inittab
vim etc/inittab

::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
touch etc/init.d/rcS
vim etc/init.d/rcS

/bin/mount -a
mount -o remount,rw /
echo /sbin/mdev > /proc/sys/kernel/hotplug
mkdir -p /dev/pts
mount -t devpts devpts dev/pts
mdev -s

记得给它们添加执行权限

chmod 755 etc/fstab 
chmod 755 etc/inittab
chmod 755 /init.d/rcS

进入目录 dev 创建设备文件

cd dev
mknod console c 5 1
mknod null c 1 3
mknod tty1 c 4 1

回到busybox1.34.1根目录创建shell脚本文件

cd ../../
touch abc.su 
vim abc.su

写入代码

#!/bin/bash
umount ./fs
rm -rf rootfs.ext3
rm -rf fs
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 > rootext4fs.img.gz

给脚本添加执行权限然后执行

chmod 755 abc.cu
./abc.su

使用虚拟机qemu运行
安装qemu x86平台

apt install qemu-system-x86

进入目录linux-busybox在终端输入

qemu-system-x86_64 -kernel ./linux-5.10.79/arch/x86_64/boot/bzImage -initrd ./busybox-1.34.1/rootfs.img.gz -append "root=/dev/ram init=/linuxrc" -serial file:output.txt

-append “ ”里的内容路径 / 应该是文件系统roofs.img.gz的根路径, 所以这里的ram 和linux 是文件系统rootfs.img.bz里的文件或目录.

Linux内核编译+Busybox文件系统制作(基础)_第1张图片
piease press Enter to activate this console (请按Enter键激活控制台)

你可能感兴趣的:(笔记,linux,内核,busybox)