Linux源码只有运行起来才能成为操作系统,否则她只能静静的躺在存储介质上沉睡,本文就讲解如何将这个睡美人唤醒,唤醒后给他穿上旗袍她就成为RedHat,给她换上包臀裙她就成为SUSE,再或者给她换上超短裙,她就成为Ubuntu,总之就是你可以按照自己的想象,随意打扮这个小姑娘,当然我们也可让她裸奔。
没有编译过内核的朋友,可以查看我之前写过的一篇文章
CentOS下编译Linux内核_巭犇的博客-CSDN博客_centos 编译内核,本文在此基础之上,将唤醒这个沉睡的美人。
如果想要唤醒这个沉睡的少女(睡你MB,起来嗨),需要对计算机启动过程的原理有基本的认识,这里不再赘述,我只简单的讲解下关键的过程。
PC上电--->BIOS--->Bootloader加载OS kernel和initramfs
创建磁盘文件
对磁盘分区
将磁盘分区关联到/dev/loop设备
磁盘第一个扇区是MBR,紧跟着MBR的是2043个空闲的扇区,实际上GRUB就嵌入到这个空闲的扇区,因此磁盘真正用于保存数据是从2049扇区开始
losetup用于将磁盘文件与linux中的设备文件进行关联,为后续磁盘分区与格式化做准备, 命令中的“-o“”表示磁盘正在用于存储数据的起始位置(单位是字节,即2048 x 512 = 1048576 )
格式化分区并挂载分区
挂载分区
安装grub到MBR之后的空闲分区
配置内核文件
将编译好的内核文件放入/boot/目录下
配置initramfs文件
制作initramfs时,需要与内核版本一致,因为我当前的内核正是系统使用的内核,因此直接用uname -r 代替。
配置grub.cfg
hd0表示第一个硬盘,而msdos1表示该硬盘的第一个分区
linux (hd0,msdos1)/boot/bzImage console=tty0
表示:系统第一个硬盘,第一个分区的boot/bzImage文件是内核压缩镜像,而后面的console=tty0是内核启动参数,告诉内核输出到控制台上,而非图形化界面。
initrd (hd0,msdos1)/boot/initramfs
表示:系统第一个硬盘,第一个分区的boot/initramfs是内存文件系统。
到此为止,磁盘文件已制作完成,只需卸载磁盘文件即可,如下所示
唤醒沉睡的少女(从磁盘运行Linux)
通过qemu-system-x86_64命令启动磁盘文件
至此内核已载入内存并通过cpu控制计算机
截止到目前,系统一直在使用initramfs作为临时的根文件系统,initramfs的主要目的之一就是辅助系统顺利地切换到真正的根文件系统。既然现在已经正确的驱动了硬盘,那么接下来,我们就切换到硬盘上的真正的根文件系统。
在grub.cfg中的内核文件后通过添加“root=/dev/sda2”可以指定根文件系统所在的介质,并通在修改initramfs中的init脚本即可以实现根文件系统的挂载。
接下来请尽情蹂躏吧,比如给她配个房子(切换到真正的根)、给房子配把锁(ssh)。。。
想进一步了解操作系统如何启动的道友,强烈推荐阅读《深度探索Linux操作系统》以及访问Welcome to Linux From Scratch!,Linux From Scratch (LFS) 完全通过源码一步一步引导你构建自己的Linux操作系统。
以下输出分为三部分
- 关机
- 加载内核与initramfs
- 切换到真正的根文件系统,并启动相关服务