如何定制Linux外围文件系统?

本文由云+社区发表

作者:我是乖宝宝哦

一般来说,我们所说的Linux系统指的是各种基于Linux KernelGNU Project的操作系统发行版。为了掌握Linux操作系统的使用,了解 Linux操作系统的运作过程,理解内核与外围支撑系统的关系,加深对开源操作系统的认识,我决定造个轮子——自己定制一个Linux文件系统。

这里有两种实现方法:

  • 直接自己实现init**\*(M1)***

加载bios 的硬件信息-> 读取MBR –>执行Grub ->加载kernel–> 加载驱动–> init –> 执行bash

  • 利用系统/sbin/init**\*(M2)***

加载bios 的硬件信息-> 读取MBR –>执行Grub ->加载kernel–> 加载驱动–> init –> /sbin/init -> 取得run-level信息 -> /etc/rc.d/rc.sysinit -> services –> /etc/rc.d/rc.local –> mingetty –> login

我们先选择*M1*。

思路

  1. 利用原有系统复制必备部件到新存储器
  2. 利用initrd.img机制在RAM Disk中测试
  3. 搭配原文件内核和模块启动

Step1:获得shell版本的initrd.img

首先,我们可以写一个脚本init,使得内核用该文件系统启动后能够直接获得一个Bash

创建脚本 init

其中:/bin目录下是常用命令,init是自己写的脚本,/lib64目录下是应用程序所依赖的动态库。

init 内容

现在我们需要使用命令行,创建binsbin目录,向其中添加bashlsrmcpmvechocatless等基础命令。由于这些命令需要依赖/lib64等目录下的一些动态链接的共享库,所以需要将依赖的库拷贝到小系统对应的目录下,用ldd命令查询应用程序及其依赖的动态库。完成之后,执行:

find . | cpio -H newc -o | gzip > /boot/initrd.img

将根文件系统打包成initrd.img放到/boot目录下。启动时系统会自动执行initrd.img中的init

费了这么大劲生成initrd.img,如何测试新建的initrd.img呢,需要在grub启动配置文件当中增加一个入口用于测试。

title CentOS 6 Mini
root (hd0,0)
kernel /vmlinuz-2.6.32-642.el6.x86_64
initrd /initrd.img

这样重启之后就会出现启动选项了。

Step2:完成挂载原系统能力

为了能挂载原系统,必须在initrd.img中加载原系统运行所必须的驱动模块,比如ext4文件系统的驱动、scsi设备的相关驱动等,/sbin/modinfo 配合/sbin/insmod,驱动放到/module

Step3:完成拥有管理设备能力(udev)

利用管理、监控主机设备的服务程序udevd来自动加载所需的驱动模块,比我们自己实现更加可靠。udevd的规则文件在/lib/udev/目录下,配置文件在/etc/udev/目录下,同时还需要/etc/nsswitch.conf配置的名称服务交换,其依赖的库为/lib目录下以libnss开头的文件,将上述文件拷贝到我们的目录下,然后使用/sbin/start\_udev命令可以启动udevd服务。(udevd需要调用一些其他的系统命令,如/sbin/modprobe,可用strace进行跟踪获取)。

小系统的目录文件

其中:/dev目录下是系统存放可用设备的目录,/log是使用strace命令生成的log记录文件。

Step4:完成拥有login登录能力

由于login的机制比较复杂,涉及进程管理机制和进程组、控制台等许多方面,因此我们采用*M2*,将/sbin/init命令拷到小系统目录下,init脚本改为

#!/bin/bash
exec /sbin/init

将控制权交给/sbin/init之后,系统启动时就必须等到它完成一系列调用之后,进入login界面,用户才能重新获得控制权。

/sbin/init的过程大致分为三块:第一块是udevd加载驱动模块、文件系统检查和根切换,相关配置在/etc/rc.sysinit中;第二块是启动各项服务,相关配置在/etc/rc.d/目录下;第三块是登录部分,需要调用/sbin/mingetty/bin/login等命令。将上述所涉及的命令及文件拷贝到小系统对应的目录下,并对配置进行修改。

由于小系统启动之后initrd.img作为临时根文件系统直接在内存中运行,而我们小系统不需要进行根切换,故将/etc/rc.sysinitremount\_needed()函数体注释掉,这样就不会根切换了。

由于系统采用了全新的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热键操作
/etc/init/start-ttys.conf 配置tty终端的开启数量、设备文件
/etc/sysconfig/init 控制tty终端的开启数量、终端颜色方案
/etc/init/tty.conf 控制tty终端的开启

bootmini/etc/inittab的运行优先级改为2,那么系统启动时/sbin/init将执行bootmini/etc/rc.d/rc2.d/目录下以S开头的文件,将一些不需要开启的服务文件名改为K开头。

bootmini/etc/rc.d/rc.local文件中可以加入用户需要系统开机启动后自动执行的操作。

login程序基于认证体系PAM, 配置文件在/etc/pam.d/目录下,相关库文件有/lib64/security/及其依赖的库文件;login还涉及用户组管理/bin/chgrp/bin/chown/bin/chmod等,保存用户名的文件/etc/passwd/etc/group,用户密码文件为/etc/shadow。其他一些涉及的文件可通过strace来帮助分析。

可在真机上运行的完整版小系统

部分目录文件:

/etc

/bin

/sbin

/usr/bin

/usr/sbin

至此,文件系统算是可以跑了。下一篇我们再造个轮子——进行Linux内核的裁剪。真机效果也将在下篇看到。

此文已由腾讯云+社区在各渠道发布

获取更多新鲜技术干货,可以关注我们腾讯云技术社区-云加社区官方号及知乎机构号

原文地址:https://www.cnblogs.com/qcloud1001/p/10329671.html

时间: 2024-10-31 09:54:41

如何定制Linux外围文件系统?的相关文章

使用kernel编译+busybox定制Linux系统--实现ssh远程登录+web服务的迷你主机

在运维工作中很多时候我们需要裁剪Linux系统,减少系统性能的消耗,提升系统服务的性能,以往通过光盘安装的Linux都是比较臃肿的,但出现这样的需求后,我可以对Linux进行重新编译再busybox工具移植即可实现,接下来我们一步一步实现kernel编译+busybox定制Linux系统--实现ssh远程登录+web服务: 实现过程如下: 一.规划子主机的磁盘存储规划 1.添加一个大小为10G的硬盘 2.查询系统硬件信息参数: # lspci  00:00.0 Host bridge: Inte

第17章- 构建Linux根文件系统

本章目标 l 了解Linux的文件系统层次标准(FHS) l 了解根文件系统下各目录的作用 l 掌握构建根文件系统的方法:移植Busybox.构造各个目录.文件等 l 掌握制作yaffs.jffs2文件系统映象文件的方法 推广: 想了解更多嵌入式知识请移步到 100ask.taobao.com 17.1  Linux文件系统概述 17.1.1  Linux文件系统的特点 类似于Windows下的C.D.E等各个盘,Linux系统也可以将磁盘.Flash等存储设备划分为若干个分区,在不同分区存放不

Linux根文件系统裁剪 论文阅读笔记

Linux裁剪方法研究 2006 2 Linux裁剪原理: 2 Linux嵌入式系统根文件系统的选择与制作 2006 3 Linux嵌入式系统根文件系统的选择与制作 2006 3 基于ARM的嵌入式Linux操作系统移植的研究 2006 5 基于ARM的嵌入式文件系统研究与设计 2010 6 基于嵌入式Linux的Ext2根文件系统制作分析 2015 6 嵌入式Linux裁剪研究 2009 7 嵌入式Linux根文件系统的构建与分析 2015 8 嵌入式Linux共享库裁剪技术分析与改进 200

通过yocto给p1010rdb定制linux,并启动linux

一.通过yocto定制linux 1.安装yocto yocto只能在非root用户下编译,所以先新建一个用户. useradd chen  passwd -d chen 重启电脑进入chen用户. 给chen用户添加root权限,vim /etc/sudoers 第99行添加  chen   ALL=(ALL)   ALL chen ALL = NOPASSWD: /usr/bin/yum mkdir yocto  将光盘中的资料拷贝到yocto下,光盘名称(yocto soure iso).

Linux根文件系统

Linux根文件系统详解 Linux系统的文件系统又被称为根文件系统(roofs),FHS是Linux系统的文件系统标准,各个不同的Linux发行版都得遵从FHS FHS规定如下: ·/bin目录 bin(binary,二进制文件),该目录里面是一些二进制文件,Linux系统下二进制文件是ELF格式的,而Windows系统下的二进制文件是PE格式的,该目录下全是一些可执行的二进制文件,所有的用户命令都在其中 ·/boot目录 该目录下包含着一些和系统启动相关的文件,比如我们的内核文件.initr

嵌入式 Linux根文件系统移植(一)——Linux文件系统简介

嵌入式 Linux根文件系统移植(一)--Linux文件系统简介 本文对文件系统分析的代码来源于linux 2.6.35.7版本. 一.文件系统的体系结构 文件系统是对存储设备上的数据和元数据进行组织的机制,便于用户和操作系统的交互.Linux支持多种文件系统,文件系统接口实现为分层的体系结构,将用户接口层.文件系统实现和操作存储设备的驱动程序分隔开.Linux文件系统的体系结构如下: 用户空间包含一些应用程序(例如,文件系统的使用者)和 GNU C库(glibc),为文件系统调用(打开.读取.

Linux及文件系统基本介绍

Linux及文件系统基本介绍 1   互联网行业现状 在服务器端市场: 超级计算机 2014年11月的数据显示前500系统中的485个系统都在运行着 Linux 的发布系统,而仅仅只有一台运行着 Windows 系统 截止到目前,运行 Linux 系统的处理器有 22,851,693 个之多,而 windows 系统仅仅只有 30,720 云计算 2014年 Linux 基金会撰写了一个报告,研究发现 75% 的大公司在使用 Linux 系统作为他们的主要平台,相对的使用 Windows 系统的

linux 缩减文件系统大小 LVM

linux缩减文件系统大小 LVM 实验环境: (1)操作系统:centos6.7 i686 (2)VMware Workstation 12版本 (3)实验硬盘大小5G 先查看下当前磁盘使用情况: 增加大小为5G的虚拟硬盘: 建立文件系统: (1)主要步骤如下: (2)格式化: #mkfs.ext4 /dev/vg_wtf/lv_wtf (3)挂载: #mkdir /wtf #建立挂载目录 #mount /dev/vg_wtf/lv_wtf  /wtf (4)查看目前磁盘使用情况,截图如下:

定制linux自动化安装镜像

定制linux自动化安装镜像 安装必须的软件 yum -y install createrepo mkisofs anaconda-runtime yum -y install rsync 制作镜像基本模型 mkdir /yousm/CentOS6.2                      #创建镜像目录 mount /dev/cdrom   /mnt                     #挂载现有的安装系统盘 /usr/bin/rsync -a --exclude=Packages/-