当前位置: 首页 > Linux

如何自定义Linux外围文件系统?

时间:2023-04-06 23:18:25 Linux

本文由Cloud+Community发布作者:我是好宝宝一般来说,我们所说的Linux系统是指基于LinuxKernel和GNUProject的各种操作系统发行版。为了掌握Linux操作系统的使用,了解Linux操作系统的运行过程,了解内核与外围支持系统的关系,加深对开源操作系统的认识,我决定搭建一个wheel-自己定制一个Linux文件系统。这里有两种实现方式:直接执行init**\*(M1)***加载bios硬件信息->读取MBR->执行Grub->加载内核->加载驱动->init->执行bash使用system/sbin/init**\*(M2)***加载bios硬件信息->读取MBR->执行Grub->加载内核->加载驱动程序->init->/sbin/init->getrun-级别信息->/etc/rc.d/rc.sysinit->services–>/etc/rc.d/rc.local–>mingetty–>login我们先选择*M1*。思路使用原系统拷贝必要的组件到新内存中使用initrd.img机制在内存盘中测试原文件kernel和modulesStartStep1:获取initrd.img的shell版本首先,我们可以写一个scriptinit让内核使用文件系统启动后,可以直接得到一个Bash。创建脚本init其中:/bin目录是常用命令,init是自己写的脚本,/lib64目录是应用程序依赖的动态库。initcontent现在我们需要使用命令行创建bin和sbin目录,并在其中添加bash、ls、rm、cp、mv、echo、cat、less等基本命令。由于这些命令需要依赖/lib64等目录下的一些动态链接的共享库,所以需要将依赖库复制到小系统对应的目录下,使用ldd命令查询应用程序及其依赖的动态库.完成后,执行:find。|cpio-Hnewc-o|gzip>/boot/initrd.img将根文件系统打包成initrd.img放在/boot目录下。系统启动时会自动执行initrd.img中的init。好不容易生成了initrd.img,如何测试新建的initrd.img,需要在grub启动配置文件中添加一个入口进行测试。titleCentOS6Miniroot(hd0,0)kernel/vmlinuz-2.6.32-642.el6.x86_64initrd/initrd.img重启后会出现启动选项。Step2:完成挂载原系统的能力为了能够挂载原系统,必须在initrd.img中加载原系统运行所必需的驱动模块,比如ext4文件系统的驱动,scsi设备的相关驱动等,/sbin/modinfo配合/sbin/insmod,将驱动放在/moduleStep3:完成管理设备的能力(udev)使用服务程序udevd来管理和监控主机设备自动加载需要的驱动模块,比我们自己实现的更靠谱。udevd的规则文件在/lib/udev/目录下,配置文件在/etc/udev/目录下。同时,在/etc/nsswitch.conf中配置的nameserviceexchange也是需要的。它依赖的库是/lib目录下的libnss。开头的文件,将上面的文件复制到我们的目录下,然后使用/sbin/start\_udev命令启动udevd服务。(udevd需要调用一些其他的系统命令,比如/sbin/modprobe,可以通过strace跟踪获取)。小系统的目录文件:/dev目录是系统存放可用设备的目录,/log是strace命令生成的日志记录文件。Step4:完成登录能力。由于登录机制比较复杂,涉及到进程管理机制、进程组、控制台等诸多方面,所以我们使用*M2*将/sbin/init命令复制到系统小目录下,init脚本改为#!/bin/bashexec/sbin/init控制权交给/sbin/init后,系统启动时,必须等到完成一系列调用,进入登录界面,用户才能重新获得控制权。/sbin/init的过程大致分为三部分:第一部分是udevd加载驱动模块、文件系统检查和root切换,相关配置在/etc/rc.sysinit中;第二部分是启动各种服务,相关配置在/etc/rc.d/目录下;第三块是登录部分,需要调用/sbin/mingetty、/bin/login等命令。将上述涉及的命令和文件复制到小系统对应目录下,并修改配置。由于小系统启动后initrd.img作为临时root文件系统直接运行在内存中,而我们的小系统不需要进行root切换,所以/etc/rc.conf中的remount\_needed()函数体。sysinit被注释掉,这样就不会再进行root切换了。由于系统采用了新的Upstart启动方式(/sbin/init程序已改为由upstart软件包提供),将Upstart启动相关的配置文件复制到系统小目录:/etc/inittab配置默认运行级别/etc/init/rcS.conf加载rc.sysinit脚本完成系统初始化任务/etc/init/rc.conf兼容脚本,负责各个运行级别/etc/init/rcS-sulogin的调用处理。conf启动/sbin用于单用户模式??/sushell环境/etc/init/control-alt-delete.conf控制终端下的Ctrl+Alt+Del热键操作/init控制打开的tty终端数量,终端配色方案/etc/init/tty.conf控制tty终端的开启将bootmini/etc/inittab的运行优先级改为2,则/sbin/init会在系统启动时执行bootmini对于/etc/rc.d中S开头的文件/rc2.d/目录,将一些不需要打开的服务文件改成K开头,在bootmini/etc/rc.d/rc.local文件中,可以添加用户需要的操作系统启动后自动执行。登录程序基于认证系统PAM,配置文件在/etc/pam.d/目录下,相关库文件包括/lib64/security/及其依赖的库文件;登录还涉及用户组管理/bin/chgrp、/bin/chown、/bin/chmod等,保存用户名文件/etc/passwd、/etc/group,用户密码文件为/etc/shadow。其他一些涉及到的文件可以通过strace来分析。可在真机上运行的完整版小系统的一些目录文件:/etc/bin/sbin/usr/bin/usr/sbin此时,文件系统就可以运行了。在下一篇文章中,我们将构建另一个切割Linux内核的轮子。真机效果也将在下一篇文章中看到。本文已由腾讯云+社区在各渠道发布获取更多新鲜技术干货,可以关注我们的腾讯云技术社区-云家社区公众号和知乎代理号