LSM 内核模块实现 Demo
前言
最近为了完成作业,被折磨的不轻。版本的不兼容,各种的报错经历了太多。在此记录,希望对大家有所帮助。
本人在写这篇文章的时候,重新安装虚拟机,从头开始的,所以,如果能坚持到最后,大概率会成功的。祝你们好运。(当然,如果这篇文章还没有过太久的话)
准备工作
经过了大量测试,红帽公司的系统好像并不是很好编译 busybox,本人使用 Fedora 系统进行编译时,总是显示缺少依赖,而网上也找不到相应的库。转而使用教程较多的 Ubuntu 系统。为了本身系统的安全,当然使用虚拟机。
系统参数:Ubuntu 20.04,处理器 2 CPU * 1 内核/CPU,内存 4G,其他使用默认设置,然后直接创建就可以了。
linux 内核源码版本:linux-4.20.17。内核版本不能选用太低版本,因为当前 binutils 工具不是前向兼容的,之前有些类型现在版本的工具是无法识别的。比如 linux-4.14.0 版本,部分数据类型就已经不受支持了。
busybox:一般用最新版本即可,本人使用 busybox-1.35.0,是当前最新。
上面简单介绍一下各种工具或系统的版本,下面开始具体的实施工作。
虚拟机安装完成后,首先进行换源(Software & Updates软件),然后执行apt update && apt upgrade
升级各种软件包(或者他会自动弹出一个Software Updater的窗口,直接 install),避免之后在安装工具时出现缺少依赖包或者依赖包安装困难的问题。但是,现在不要着急安装gcc,gcc的安装稍后再说,现在只要先升级即可。
安装 gcc
因为 Ubuntu 默认安装的是 gcc-9,所以我们需要指定版本进行安装,否则在内核编译过程中会出现版本不兼容的问题。
首先apt remove gcc-9
卸载高版本。
使用安装命令apt install gcc-8
进行安装4。但是安装之后执行 gcc 命令可能还会提示你安装 gcc,这是因为我们安装了 gcc-8,在 /usr/bin 目录下只有 gcc-8 而没有 gcc,所以 shell 找不到命令。
为此,执行命令ln /usr/bin/gcc-8 /usr/bin/gcc
。我们就直接将 gcc-8 链接为 gcc 就可以了。
Qemu
当然,我们不可能直接在系统中运行编译好的内核,还是需要在虚拟机中运行的。所以,我们安装 Qemu 轻量级虚拟机。
命令为sudo apt install qemu-system-x86
。
内核下载
下载 linux 内核,从中选择相应的版本。笔者使用的是:linux-4.20.17。
使用 busybox 制作根文件系统
在系统启动的时候,需要先加载一段内存镜像,以便于找到系统真正的入口。在我们调试内核的时候,更多的使用 busybox。他可以帮助我们生成一个根文件系统,我们将其打包到一个 cpio 镜像文件之后就可以重复使用了。
首先,我们安装所需要的依赖4。
sudo apt-get install bison
sudo apt-get install flex
sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc
在安装的过程中,可以先下载 busybox5,从中选择最新版本,或者使用笔者使用的版本:busybox-1.35.0。但是在依赖安装完成后才能进行编译工作。
将下载好的 busybox 解压然后放到解压好的 linux 目录下并改名为 busybox。
Qemu 运行内核
为了保险起见,我们先编译一下内核试一试,能不能运行。下面借用1中所给出的步骤(略有改动):
- 进入到下载好的 Linux 内核文件中,将配置文件中的选项清空
make allnoconfig
- make menuconfig 进入配置文件菜单选项,将以下选择勾选。注意,要吧窗口调大一点,要不然他会提示窗口太小无法运行的报错。
64-bit kernel ---> yes
General setup ---> Initial RAM filesystem and RAM disk (initramfs/initrd) support ---> yes
General setup ---> Configure standard kernel features ---> Enable support for printk ---> yes
Executable file formats / Emulations ---> Kernel support for ELF binaries ---> yes
Executable file formats / Emulations ---> Kernel support for scripts starting with #! -