[md]闲着也是闲着,记录以下linux kernel的环境搭建,这里主要也是跟着arttnab3师傅来一步一步走的
$ sudo apt-get update
$ sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils qemu flex libncurses5-dev fakeroot build-essential ncurses-dev xz-utils libssl-dev bc bison libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev libelf-dev
有如下三种方式
$ wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.11.tar.xz
我求稳,跟着师傅来,他是我的神,采取法一
前往Linux Kernel Archive下载对应版本的内核源码,这里选用5.11这个版本的内核镜像。
$ wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.11.tar.xz
解压我们下载来的内核源码
$ tar -xvf linux-5.11.tar.xz
完成后进入文件夹内,执行如下命令开始配置编译选项
$ make menuconfig
通常保存的路径在当前目录下的 .config 文件中,如果你在生成配置文件后才想起来忘了改某个选项也可以直接编辑这个文件
自己编译这里出了点网络问题,咱们换一个法子,以后我再补全
使用如下命令可以查看现有的内核镜像
$ sudo apt search linux-image-
这里采用5.8进行示范
$ sudo apt download linux-image-5.8.0-43-generic
下载下来是一个deb文件,解压
$ dpkg -X ./linux-image-5.8.0-43-generic_5.8.0-43.49~20.04.1_amd64.deb extract
./
./boot/
./boot/vmlinuz-5.8.0-43-generic
./usr/
./usr/share/
./usr/share/doc/
./usr/share/doc/linux-image-5.8.0-43-generic/
./usr/share/doc/linux-image-5.8.0-43-generic/changelog.Debian.gz
./usr/share/doc/linux-image-5.8.0-43-generic/copyright
其中的./boot/vmlinuz-5.8.0-43-generic便是bzImage内核镜像文件
一般位于/boot/目录下,也可以直接拿出来用
BusyBox 是一个集成了三百多个最常用Linux命令和工具的软件,包含了例如ls、cat和echo等一些简单的工具,我们将用 busybox 为我们的内核提供一个基本的编译busybox
I.获取busybox源码用户环境
$ wget https://busybox.net/downloads/busybox-1.33.0.tar.bz2
解压
$ tar -jxvf busybox-1.33.0.tar.bz2
$ make menuconfig
勾选Settings —> Build static binary file (no shared lib)
若是不勾选则需要单独配置lib,比较麻烦
接下来就是编译了,速度会比编译内核快很多
$ make install
编译完成后会生成一个_install目录,接下来我们将会用它来构建我们的磁盘镜像
$ cd _install
$ mkdir -pv {bin,sbin,etc,proc,sys,home,lib64,lib/x86_64-linux-gnu,usr/{bin,sbin}}
$ touch etc/inittab
$ mkdir etc/init.d
$ touch etc/init.d/rcS
$ chmod +x ./etc/init.d/rcS
::sysinit:/etc/init.d/rcS
::askfirst:/bin/ash
::ctrlaltdel:/sbin/reboot
::shutdown:/sbin/swapoff -a
::shutdown:/bin/umount -a -r
::restart:/sbin/init
在上面的文件中指定了系统初始化脚本,因此接下来配置etc/init.d/rcS,写入如下内容:
#!/bin/sh
mount -t proc none /proc
mount -t sys none /sys
/bin/mount -n -t sysfs none /sys
/bin/mount -t ramfs none /dev
/sbin/mdev -s
主要是配置各种目录的挂载
也可以在根目录下创建init文件,写入如下内容:
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs devtmpfs /dev
exec 0/dev/console
exec 2>/dev/console
echo -e "\nBoot took $(cut -d' ' -f1 /proc/uptime) seconds\n"
setsid cttyhack setuidgid 1000 sh
umount /proc
umount /sys
poweroff -d 0 -f
别忘了添加可执行权限:
$ chmod +x ./init
$ echo "root:x:0:0:root:/root:/bin/sh" > etc/passwd
$ echo "ctf:x:1000:1000:ctf:/home/ctf:/bin/sh" >> etc/passwd
$ echo "root:x:0:" > etc/group
$ echo "ctf:x:1000:" >> etc/group
$ echo "none /dev/pts devpts gid=5,mode=620 0 0" > etc/fstab
在这里建立了两个用户组root和ctf,以及两个用户root和ctf
4. 配置glibc库
将需要的动态链接库拷到相应位置即可
这里师傅没弄我就也不弄,哼
使用如下命令打包文件系统
$ find . | cpio -o --format=newc > ../../rootfs.cpio
也可以采用如下写法
$ find . | cpio -o -H newc > ../core.cpio
注意这里的打包位置可以随意
若是我们后续需要向文件系统中补充一些其他的文件,可以选择在原先的_install文件夹中添加(不过这样的话若是配置多个文件系统则会变得很混乱),也可以解压文件系统镜像后添加文件再重新进行打包
$ cpio -idv < ./rootfs.cpio
$ find . | cpio -o --format=newc > ../new_rootfs.cpio
冲冲冲,激动的心颤抖的手,我们将使用自己配置的文件系统与内核跑起来
首先将先前的bzImage和rootfs.cpio放到同一个目录下
接下来编写启动脚本
#!/bin/sh
qemu-system-x86_64 \
-m 128M \
-kernel ./bzImage \
-initrd ./rootfs.cpio \
-monitor /dev/null \
-append "root=/dev/ram rdinit=/sbin/init console=ttyS0 oops=panic panic=1 loglevel=3 quiet nokaslr" \
-cpu kvm64,+smep \
-smp cores=2,threads=1 \
-netdev user,id=t0, -device e1000,netdev=t0,id=nic0 \
-nographic \
-s
这里文件名使用boot.sh
部分参数说明如下:
mount: mounting none on /sys failed: No such device
坐等师傅解答[/md]