编译内核(安装内核)
1. 下载内核源码
https://mirrors.edge.kernel.org/pub/linux/kernel/
2. 安装内核编译所需的环境
sudo apt install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison -y
# centos: yum install ncurses-devel make gcc bc openssl-devel
3. 解压内核源码
xz -d linux-5.3.8.tar.xz && tar xvf linux-5.3.8.tar
4. 生成.config文件(拷贝当前操作系统的配置文件)
# export ARCH=x86 指定硬件体系结构
# make x86_64_defconfig 配置为x86_64_defconfig
# 当然可以直接拷贝当前操作系统的config文件
cp /boot/config-`uname -r` .config
make menuconfig # 对内核进行微调配置
General setup --->
----> [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support # 支持cpio格式文件系统
Device Drivers --->
[*] Block devices --->
<*> RAM block device support
(65536) Default RAM disk size (kbytes)
5. 编译内核
make -j $(nproc)
# 此过程生成vmlinux,编译成功后内核位于arch/x86_64/boot/bzImage
# 如果需要将编译好的内核安装在当前的物理主机上,可以进行下面的步骤
6. 安装编译生成的modules
sudo make modules_install
7. 安装新内核相关文件
sudo make install
# 此过程生成vmlinuz
8. 重启
reboot
对于linux内核,编译可以生成不同的镜像文件,例如:make zImage、make uImage
他们之间的区别:
- vmlinux:编译出来的最原始的内核文件,未压缩
- zImage:是vmlinux经过gzip压缩后的文件
- bzImage bz表示“big zImage”,不是用bzip2压缩的。两者的不同之处在于,zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么采用zImage或bzImage都行,如果比较大应该用bzImage。
- uImage U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的tag。
- vmlinuz 是bzImage/zImage文件的拷贝或指向bzImage/zImage的链接。
编译制作busybox根文件系统
busybox是一个集成了一百多个最常用linux命令和工具的软件,通过编译busybox可以生成这些工具的二进制可执行程序。
前置软件:
apt install libncurses5-dev -y
- 下载busybox源码 https://busybox.net/downloads/
mkdir /home/rootfs && cd /home/rootfs
wget https://busybox.net/downloads/busybox-1.20.0.tar.bz2
- 解压配置
tar -xvf busybox-1.20.0.tar.bz2
make menuconfig
Busybox Settings -> Build Option
[ ]Build BusyBox as a static binary (no shared libs)
编译完成之后会生成一个busybox可执行程序,其用法是# busybox ls、busybox mkdir 就相当于执行ls、mkdir,如果选择静态编译,那么编译出来的busybox是可以单独运行的,但是自己编写的程序要是在busybox文件系统上运行则需要使用静态编译,即例如:gcc -static hello.c -o hello才可以运行。
如果不选择该选项,则编译出来的busybox不可以独立运行,需要将相应的的动态库或者符号链接等复制到busybox文件系统中相对应的目录中,否则程序不能运行,那么自己编写的程序就不需要使用静态编译了。( )Cross Compiler prefix (NEW)
标识用什么编译器来编译busybox,默认用x86(应该)
- 编译和安装
vi include/libbb.h
#include <sys/resource.h>
# 不添加会报错
# scripts/Makefile.build:197: recipe for target 'loginutils/passwd.o' failed
# Makefile:740: recipe for target 'loginutils' failed
make && make install
- 编译完成后的busybox就安装在源码根目录下的_install目录了,我们进入_install目录,补充一些必要的文件或目录,相关的shell命令如下:
mkdir etc dev mnt
mkdir -p proc sys tmp mnt
mkdir -p etc/init.d/
vim etc/fstab
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
vim etc/init.d/rcS
echo -e "Welcome to tinyLinux"
/bin/mount -a
echo -e "Remounting the root filesystem"
mount -o remount,rw /
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
vim etc/inittab
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::askfirst:-/bin/sh
::ctrlaltdel:/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
这样一个最小的、完整的可以被内核启动的文件系统就完成了。
制作根文件系统的镜像文件
- 先制作一个空的镜像文件;
- 然后把此镜像文件格式化为ext3格式;
- 然后把此镜像文件挂载,并把根文件系统复制到挂载目录;
- 卸载该镜像文件。
- 打成gzip包
#!/bin/bash
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 > rootfs.img.gz
通过qemu就可以将编译好的内核和文件系统镜像启动了。
一些报错
内核
编译内核报错:make[1]: *** 没有规则可制作目标“certs/rhel.pem”,由“certs/x509_certificate_list” 需求。 停止
make menuconfig
Cryptographic API >
Certificates for signature checking >
Additional X.509 keys for default system keyring 删除内容
re
https://blog.csdn.net/weixin_38251305/article/details/104268266
内核地址
https://mirrors.edge.kernel.org/pub/linux/kernel/
http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/
ubuntu
https://www.cnblogs.com/haiyonghao/p/14440263.html
centos
https://blog.csdn.net/daa20/article/details/105011505/
https://www.linuxidc.com/Linux/2015-11/125671.htm