在第二部分中,您下载了Linux内核源代码,对其进行了编译,并使用qemu模拟运行编译后的内核,但由于它没有文件系统,因此内核在启动后期遇到了“kernelpanic”消息。 ”因此,在上一节中,我们创建了一个disk.img文件作为“虚拟磁盘”,并将其格式化为Linux经典的ext2文件系统。
然而,虽然ext2 文件系统有一个“虚拟磁盘”disk.img,但它是空的,并且没有bin、proc 等基本目录,因此即使发生内核恐慌,内部也缺少文件系统。 kernel 已经解决了,但是最后还是报错。另外,你编写的init程序没有任何实际意义,因此预计Linux内核不会完全启动。本节的目标是创建一个可以引导Linux 内核的文件系统;也就是说,用引导Linux 所需的基本文件填充disk.img。当然,它还包括可以引导Linux的实际init程序。实现目标的方法有很多,但这里我们选择busybox。
Busybox 是一个开源项目,通常用于嵌入式系统等小型系统。除了init程序之外,busybox还包括一些常用的命令工具,例如ls、cat等。 Busybox非常轻量级,可以编译成完全独立的Busybox包,没有依赖关系。
当然,要使用busybox,第一步就是下载源码。 wget -c https://busybox.net/downloads/busybox-1.27.2.tar.bz2 这里我们使用1.27.2版本的busybox。下载后解压并按照默认设置编译。
tar xf sexybox-1.27.2.tar.bz2cdbusybox-1.27.2make defconfigmake menuconfig 上述命令的含义在第一节已经介绍得比较清楚了。执行最后一条命令后,会弹出图形配置界面,选择:
配置Busybox --- --- 构建选项[*] 将BusyBox 构建为静态二进制文件(无共享库)。
勾选这个选项的原因是磁盘镜像中没有其他库,所以busybox必须静态编译成一个单独的、无依赖的可执行文件,以避免运行时链接错误。然后就可以编译:
一旦make -j4编译完成,就可以安装它,创建一个新的安装目录并将busybox安装到该目录中。
mkdir installmake CONFIG_PREFIX=安装的绝对路径运行安装后,busybox 将被安装在如下所示的安装目录中。
Busybox提供的命令位于bin目录下,可以看到这些命令实际上是Busybox的快捷方式。
Busybox命令可以直接通过busybox执行。例如:
./busybox ls # 相当于ls. /busybox ps # 相当于ps 现在我们有了Busybox,我们把它塞到disk.img“虚拟磁盘”中。首先将disk.img挂载到rootfs,直接复制编译好的busybox。
sudo mount -ooopdisk.img rootfscp -abusybox-1.27.2/install/* rootfs 您的虚拟磁盘现在看起来越来越像Linux 文件系统。
init 是上一节中创建的应用程序,但它不能用于引导Linux。 linuxrc是从busybox编译的init程序。使用qemu模拟Linux内核执行时,可以将init程序指定为linuxrc。复制busybox 后,不要忘记卸载disk.img 并更新您的更改。
sudo umount rootfs. 现在让我们使用qemu 来模拟运行Linux 内核。
qemu-system-x86_64 \-m 512M \-smp 1 \-kernel bzImage \-drive format=raw,file=disk.img \-append \'init=/linuxrc root=/dev/hda\' \-curses kernel我终于不再惊慌了,但在启动Linux 内核的最后阶段我仍然收到一些奇怪的消息。
设置这是因为还有一些设置尚未配置。事实上busybox提供了官方文档。
.# 注意: BusyBox init 无需inittab 即可正常工作。如果inittab # 未找到,则默认行为为:# :sysinit:/etc/init.d/rcS# :askfirst:/bin/sh# :ctrlaltdel:/sbin/restart# :shutdown3336 0/sbin/sw apoff -a# :shutdown:/bin /umount -a - r# :restart:/sbin/init# tty2:askfirst:/bin/sh# tty3:askfirst :/bin/sh# tty4:askfirst:/bin/sh## 启动时的系统配置/初始化脚本.# 这是,单用户模式它首先运行,除非你启动它与. #:sysinit:/etc/init.d/rcS.
当init程序(上面指定的linuxrc)启动时,它会扫描/etc/inittab配置文件,该文件决定了init程序的行为。另外,busybox init 的默认行为与上面的配置相同,因此无需/etc/inittab 文件即可工作。由于暂时不需要打开tty2、tty3等,因此在disk.img中创建/etc/inittab文件。
sudo mount -o stop disk.img rootfscd rootfsmkdir etcvim etc/inittab 输入以下内容:
:sysinit:/etc/init.d/rcS:askfirst:/bin/ash:ctrlaltdel:/sbin/reboot:shutdown:/sbin/swapoff -a:shutdown3336 0 /bin/umount -a -r:restart:/sbin/init 您应该根据您的设置创建可执行文件/。等/init.d/rcS
mkdir etc/init.dtouch etc/init.d/rcSchmod +x etc/init.d/rcS # 授予运行rcS 的权限Linux 启动后,此脚本将运行并执行一些启动任务。回顾当前的系统环境,发现当前的文件系统结构并不完整。例如,没有/proc 和/sys 挂载点。 df 命令报告错误,因为缺少/proc 挂载点。
df: /proc/mounts: 没有这样的文件或目录
创建Linux 基目录因此,您必须手动创建/proc、/sys 目录。必须安装/proc 和/sys 才能工作。将/proc 和/sys 的挂载操作放在/etc/init.d/rcS 中将在每次系统启动时自动挂载它们。
vim etc/init.d/rcS 将/etc/init.d/rcS 更改为:
#!/bin/shmount -t proc proc /procmount -t sysfs sysfs /sys 进行这些更改后,卸载disk.img 以将更改刷新到磁盘。
cd ./sudo umount rootfs 现在我们将再次使用qemu 来模拟运行已编译的Linux 内核和修改后的文件系统。这次终于没有报错了,提示按Enter键激活控制台。
按Enter 键激活此控制台。至此,您终于拥有了一个完全运行的Linux操作系统,并能够运行基本的Linux命令。还记得init 应用程序吗?现在它运行良好。
欢迎大家在评论区讨论、提问。所有文章均为手写原创,每天以通俗易懂的方式介绍C语言、Linux等嵌入式开发,所以如果您喜欢文章,请关注我们查看最新更新和往期文章。我可以。
标题:linux内核系统有哪些,linux内核有什么用
链接:https://www.7kxz.com/news/gl/18724.html
版权:文章转载自网络,如有侵权,请联系删除!