本人小白纯属爱好折腾了好久,希望分享对小白有所帮助!
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
创建一个目录
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里的文件或目录.