当前位置: 首页 > news >正文

Day17_最小文件系统

文件系统(rootfs)

文件系统类型

BusyBox部署

下载:

# 官网:https://busybox.net/
# 下载:wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2

编译:

sudo make menuconfig
#  Setting# [*] Build static binary (no shared libs)# (aarch64-linux-gnu-) Cross compiler prefix  //注意 一定要指定交叉编译工具
# 生成编译文件 busybox sudo time make -j16
# 生成目录 _installsudo make install

裁剪:

# 创建必要目录cd _instalmkdir dev etc var proc tmp home root mnt sys
# 拷贝最简示例配置cp -rf ../examples/bootfloppy/etc/* etc/
# 拷贝编译工具链里的库cp /home/linux/toolchain/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/lib . -adu -mh lib
# 裁剪掉静态库文件rm  lib/*.a
# 裁剪掉库里的调试信息aarch64-linux-gnu-strip  lib
# 删掉不需要的库rm -rf lib/debug/du -mh lib
# 风险删除rm libstdc++*rm libtsan*rm libgfortran*# 创建必要的设备文件sudo mknod dev/null c 1 3sudo mknod   dev/console  c  5  1

U-Boot启动配置

# 设置启动参数
env set bootargs  root=/dev/nfs rw nfsroot=192.168.9.119:/nfs/rootfs,v3 console=ttyS0,115200 init=/linuxrc ip=192.168.9.9 /*# root=/dev/nfs -> 指定根文件系统通过NFS挂载# rw -> 以读写模式挂载根文件系统# nfsroot=192.168.9.119:/nfs/rootfs,v3 -> 指定NFS的IP和挂载目录,强制使用v3协议(重要)# console=ttyS0,115200 -> 指定内核控制台输出设备及参数# init=/linuxrc -> 指定内核启动后执行的第一个用户空间程序# ip=192.168.9.9 /* -> 设置客户端的静态 IP 地址# 设置启动指令
env set bootcmd pci enum \; pci \; ping 192.168.9.119 \; ext4load mmc 0:1 0x84000000 /boot/Image \; tftp 0x83100000 a.dtb \; booti 0x84000000 - 83100000# pci enum ; pci -> 扫描pci设备,激活网卡# ping 192.168.9.119 -> 调通网络(tftp之前不ping,无法连通,原因未知)# ext4load mmc 0:1 0x84000000 /boot/Image -> 使用ext4文件系统格式,查看mmc0的第一个分区,将/boot/Image下载到内存地址0x84000000 # tftp 0x83100000 a.dtb -> 从tftp下载设备树到0x83100000# booti 0x84000000 - 83100000 -> 执行arm64内核和设备树

此时可启动并挂在NFS文件系统

启动配置文件

/etc/inittab 启动配置文件
/etc/rcS 启动脚本
/etc/fstab 自动挂载的文件系统列表
/etc/profile 系统环境变量的设置

/etc/inittab 启动配置文件

#this is run first except when booting in single-user mode.
::sysinit:/etc/init.d/rcS      # 指定系统初始化脚本是rcS 也可指定别的名字,但习惯用rcS
# /bin/sh invocations on selected ttys
# start an "askfirst" shell on the console (whatever that may be)
::askfirst:-/bin/sh    # 需按确认键,才能进入shell    
# stuff to do when restarting the init process
::restart:/sbin/init
# stuff to do before rebooting
::ctrlaltdel:/sbin/reboot

/etc/inittab是传统 Unix/Linux 系统中 init 进程(初始化进程,PID=1)的核心配置文件,用于定义系统启动、运行级别切换及进程管理规则。其作用可概括为以下方面:


一、核心功能

  1. 设置默认运行级别
    • 通过 initdefault 动作指定系统启动后进入的运行级别(如 id:3:initdefault: 表示默认进入多用户命令行模式)。

    • 运行级别定义:

      级别用途
      0关机
      1单用户模式(救援模式)
      2多用户无网络
      3多用户命令行模式
      4保留未定义
      5图形界面模式
      6重启
  2. 控制系统初始化流程
    • 执行 sysinit 动作的命令(如 /etc/rc.d/rc.sysinit),完成挂载文件系统、加载内核模块等基础初始化。
    • 在用户登录前完成关键系统服务启动(如网络配置、硬件检测)。
  3. 管理运行级别对应的进程
    • 根据运行级别(rstate 字段)执行对应脚本(如 l3:3:wait:/etc/rc.d/rc 3 进入级别 3 时执行 /etc/rc.d/rc 3)。

    • 通过 action 字段控制进程行为:

      动作类型说明
      respawn进程终止后自动重启(常用于终端登录服务)
      wait执行进程并等待其结束再继续
      once仅执行一次,不监控
      ctrlaltdel捕获 Ctrl+Alt+Del 组合键并执行操作(如安全重启)
      powerfail电源故障时执行紧急操作
  4. 监控关键进程
    • 对需持续运行的服务(如 ttymon 终端监控)配置 respawn,确保异常退出后自动恢复。

二、配置文件格式

每行配置由 4个冒号分隔字段 组成:

id:runlevels:action:process
  • id:唯一标识符(1-2字符),不能重复。
  • runlevels:生效的运行级别(如 235 表示级别2、3、5)。
  • action:进程控制策略(如 sysinit, respawn)。
  • process:需执行的命令或脚本路径(如 /sbin/rc3)。

示例

co:234:respawn:/usr/lib/saf/ttymon -g -h -p "console login"
# 标识符为 "co",在级别2/3/4下生效,若进程退出则重启 ttymon 登录服务[3](@ref)。

三、现代系统的演进

  • 被 systemd 取代: 现代 Linux 发行版(如 Ubuntu ≥15.04、CentOS 7+)使用 systemd 替代传统 init 系统,/etc/inittab 可能不存在或仅保留兼容性配置。
  • 配置生效方式: 修改后需运行 init qtelinit q 重新加载配置。

四、典型应用场景

  1. 定义开机初始化任务(如挂载文件系统)。
  2. 设置不同运行级别的服务(如级别3启动网络服务,级别5启动图形界面)。
  3. 守护关键进程(如自动恢复崩溃的登录服务)。
  4. 处理特殊事件(如断电时执行安全关机)。

总结

/etc/inittab 是传统 Linux 初始化系统的核心枢纽,通过运行级别与动作策略的联动,实现系统启动、服务管理和故障恢复的自动化。尽管现代系统已转向 systemd,理解其机制仍有助于掌握 Linux 服务管理的底层逻辑。


/etc/init.d/rcS 启动脚本

#!/bin/sh
# This is the first script called by init process
/bin/mount  -a         # 挂载 /etc/fstab文件指定的所有文件系统 
#/etc/init.d/rc.local  # 扩展子脚本
echo  /sbin/mdev  >  /proc/sys/kernel/hotplug  # 设置系统的有热插拔设备时,调用mdev程序
/sbin/mdev  -s  # mdev 系统启动和热插拔 或动态加载驱动程序时,自动产生驱动程序所需的节点文件#./app.exe   # 可添加自己程序,让其上电自己运行
/sbin/ifconfig eth0 192.168.9.18 # 启动后自动配置ip# $ chmod   +x  init.d/rcS	# 添加可执行权限	

/etc/init.d/rcS 是 Linux 系统启动过程中一个非常关键的系统初始化脚本,尤其在基于 SysVinit 或 BusyBox init 的系统(常见于嵌入式设备)中扮演着核心角色。下表快速总结了它的主要职责:

功能类别具体作用
🛠️ 系统基础配置设置环境变量(如 PATH)、运行级别(通常为单用户模式 S)、文件创建默认权限(umask)等。
💾 文件系统管理挂载核心虚拟文件系统(如 /proc, /sys),并根据 /etc/fstab 文件挂载所有必要的文件系统(通过 mount -a 命令)。
⚙️ 设备初始化使用 mdev 机制动态创建和管理 /dev 目录下的设备节点,这是硬件驱动能够被应用程序访问的基础。
🌐 服务与网络启动启动系统基础服务(如系统日志 syslogd),并配置网络接口(如设置 IP 地址)。
🚀 执行用户脚本作为初始化流程的收尾,通常会转而执行 /etc/rc.local 脚本,以便管理员添加自定义的启动命令。

脚本的执行时机与重要性

/etc/init.d/rcS 并非由内核直接启动,而是由系统的 第一个用户空间进程(通常是 /sbin/init) 根据 /etc/inittab 配置文件中的指令来调用。通常,在 inittab 文件中会有一行类似 ::sysinit:/etc/init.d/rcS 的配置,这表示在系统初始化阶段会执行该脚本。


它的核心重要性在于,它负责将系统从一个仅加载了内核的最小化环境,引导至一个具备基本服务、可用文件系统和标准设备节点的完整可用的运行环境,为后续启动更多服务和用户登录做好准备。


补充说明与注意事项

  • 系统差异性:在现代使用 systemd 的桌面或服务器 Linux 发行版(如 CentOS 8+, Ubuntu 16.04+)中,初始化流程已由 systemd 统一管理,rcS 脚本的作用被其取代。因此,这个脚本现在主要见于使用 BusyBox 的嵌入式 Linux 系统、旧版发行版或一些轻量级定制系统中。
  • 自定义启动任务:如果你想在系统启动时自动执行某些命令,最标准的做法不是直接修改 rcS 脚本,而是将命令添加到 /etc/rc.local 文件中。因为 rcS 脚本最终通常会执行 rc.local。直接修改核心初始化脚本可能导致系统启动异常。

总而言之,/etc/init.d/rcS 是传统 Linux 初始化系统的重要枢纽,它搭建了从内核启动到多用户系统就绪之间的桥梁。

希望这些解释能帮助你更好地理解这个文件。如果你的系统环境比较特殊,或者有具体的配置需求,分享更多细节可能会获得更有针对性的建议。

/etc/fstab 自动挂载的文件系统列表

#device     mount-point   type     	options         dump     fsck order
proc        /proc         proc         defaults     	 0     	   0
tmpfs       /tmp          tmpfs     	defaults         0         0
sysfs       /sys          sysfs     	defaults         0         0
tmpfs  	    /dev          tmpfs     	defaults         0         0

   /etc/fstab 文件是 Linux 系统中一个至关重要的静态配置文件,它定义了系统在启动时如何自动挂载各种文件系统。简单来说,它就像一份系统存储设备的“挂载清单”,确保你的硬盘分区、U盘、网络存储等都能在开机后自动连接到目录树的正确位置上。


下面这个表格能让你快速抓住 /etc/fstab 的核心结构:

字段顺序字段名作用说明常见示例
1文件系统指定要挂载的设备或资源。强烈推荐使用 UUID 或 LABEL,以避免设备名(如 /dev/sda1)因硬件顺序变化而导致挂载失败。UUID=1234-5678, LABEL=MyData, /dev/sda1
2挂载点指定设备要挂载到的目录。该目录必须预先存在,否则挂载会失败。/, /home, /mnt/data
3文件系统类型指定设备的文件系统格式。系统会根据此类型调用对应的驱动模块。ext4, xfs, ntfs, vfat, swap, nfs
4挂载选项控制挂载行为的参数,多个选项用逗号分隔。defaults 是一组常用选项的合集。defaults, ro(只读), noauto(不自动挂载)
5dump 备份控制 dump 备份工具是否备份此文件系统。现在较少使用,通常设为 00(不备份), 1(备份)
6fsck 顺序控制系统启动时 fsck 检查文件系统的顺序。根分区通常设为 1,其他需要检查的分区设为 20 表示不检查。0(不检查), 1(最先检查), 2(其次检查)

💡 重要操作指南

编辑 /etc/fstab 文件需要格外小心,因为配置错误可能导致系统无法正常启动。请务必遵循以下步骤:

  1. 备份原文件:在开始修改前,先执行 sudo cp /etc/fstab /etc/fstab.bak 命令备份,以便在出错时可以恢复。
  2. 使用 UUID 或 LABEL:这是最佳实践。你可以使用 blkid 命令来查看所有设备的 UUID 和文件系统类型。
  3. 测试配置:修改保存后,千万不要直接重启系统。应先运行 sudo mount -a 命令。这个命令会尝试挂载 /etc/fstab 中所有没有 noauto 选项的条目。如果没有任何错误提示,说明配置语法基本正确;如果报错,请根据提示修复文件中的错误行。
  4. 处理外接设备:对于U盘、移动硬盘等可能不总是连接在电脑上的设备,建议在挂载选项中添加 nofail。这样即使设备不存在,系统启动时也不会因此报错而停滞。

🧩 配置示例解读

通过一个例子可以更直观地理解:

# <文件系统>        <挂载点>  <类型>  <选项>        <dump>  <pass>
UUID=3f2c1d4e-...   /         ext4   defaults,noatime  1       1
/dev/sdb2           none      swap   sw                0       0
LABEL=MyPhotos      /mnt/pic  vfat   defaults,user     0       2
  • 第一行(根分区):使用 UUID 标识,挂载到根目录 /,文件系统是 ext4,使用默认选项并禁用访问时间更新以提升性能,需要备份,并在启动时优先进行文件系统检查。
  • 第二行(交换分区):设备是 /dev/sdb2,类型为 swap,挂载点为 none,选项为 sw,不需要备份和检查。
  • 第三行(数据分区):使用卷标 MyPhotos 标识,挂载到 /mnt/pic 目录,文件系统是 vfat,允许普通用户挂载,不需要备份,在根分区之后进行文件系统检查。

希望这些解释能帮助你全面理解 /etc/fstab 文件。如果你在配置过程中遇到具体问题,比如想了解某个特定文件系统的最佳挂载选项,可以告诉我,我们一起看看。

/etc/profile 系统环境变量的设置

#!/bin/sh
export HOSTNAME=linux
export USER=root
export HOME=root
export PS1="[$USER@$HOSTNAME\W]\# "   # 终端前的提示符
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH  LD_LIBRARY_PATH

/etc/profile是 Linux 系统中一个至关重要的系统级全局配置文件,它为所有用户设置初始的 Shell 工作环境。为了让你快速抓住核心,下面这个表格汇总了它的关键信息:


特性描述
配置文件类型系统级全局配置脚本
执行时机用户登录系统时(例如通过 SSH 登录或控制台登录)
影响范围对所有用户生效(除非被用户个人配置覆盖)
主要功能设置全局环境变量(如 PATH)、运行系统级脚本、定义全局函数或别名等

💡 核心功能详解

  • 设置全局环境变量:这是 /etc/profile 最核心的作用之一。它可以定义一些对所有用户都有效的环境变量,最常见的例子就是 PATH 变量,它决定了系统在哪些目录中查找可执行文件。此外,还常用来设置 JAVA_HOMELANG(系统语言)等重要的系统级变量。
  • 执行系统级脚本与任务:你可以在这个文件中加入一些命令或逻辑,使其在用户登录时自动执行。例如,自动启动某些服务、检查系统状态或加载内核模块等。
  • 模块化设计:一个非常重要的良好实践是,/etc/profile 文件通常会**自动加载 /etc/profile.d/ 目录下的所有以 .sh结尾的脚本**[4](@ref)[6](@ref)。这样做的好处是,不同的软件包(如 Java、Python)可以将自己需要的环境变量设置写成独立的脚本放在这个目录里,使得管理更加清晰和方便,避免了直接修改/etc/profile` 可能带来的混乱。

⚠️ 重要注意事项

  • 修改需要权限:编辑 /etc/profile 文件需要 root(管理员)权限。请务必谨慎修改,因为任何错误都可能影响所有用户的正常登录。
  • 如何生效:修改文件后,新设置不会立即生效。你需要重新登录系统,或者在当前终端中执行 source /etc/profile 命令来手动加载新的配置。
  • 与用户配置文件的区别和顺序:系统在为用户准备环境时,配置文件的加载是有顺序的:
    1. /etc/profile (系统全局,最先执行)
    2. 然后是用户个人目录下的配置文件(如 ~/.bash_profile~/.bash_login~/.profile),这些文件允许用户进行个性化设置,并可以覆盖全局配置。
  • 登录 Shell 与非登录 Shell:/etc/profile 只在用户登录系统时(即启动“登录 Shell”)才会执行。如果你只是打开一个新的终端窗口(通常是“非登录 Shell”),它不会执行 /etc/profile,而是读取 ~/.bashrc 这样的文件。

💎 总结

简单来说,/etc/profile 就像是系统在用户登录时为其准备的一个标准工作环境模板,确保每个用户一开始都拥有一个统一且功能完备的基础操作环境。对于系统管理员而言,它是进行全局环境配置的强大工具;对于普通用户,理解它有助于明白系统环境是如何构建的,以及如何个性化自己的配置。

希望这些解释能帮助你全面理解 /etc/profile 文件。如果你对某个具体的配置场景有疑问,或者想了解更多关于其他配置文件(如 ~/.bashrc)的区别,我们可以继续深入探讨。

制作Ramdisk

内核支持配置

# 内核源码目录
make menuconfigGeneral setup [*] Initial RAM filesystem and RAM disk (initramfs/initrd) supportDevice Driver [*] Block devices<*>   RAM block device support   (16)    Default number of RAM disks (8192)  Default RAM disk size (kbytes)  # 需与内核启动参数一致(0x800000 = 8192*1024 8M大小)# initrd=addr,0x800000 root=/dev/ram rw # addr是根文件系统的下载地址;# 0x800000是根文件系统的大小,该大小需要和内核配置的ramdisk size 8192 kbytes相一致;# /dev/ram是ramdisk的设备节点,rw表示根文件系统可读、可写;

制作镜像:

cd /nfs
# 创建一个指定大小的空RAM磁盘镜像文件
sudo dd if=/dev/zero of=ramdisk.img bs=1k count=8192
# 将空文件格式化为 ext2 文件系统,并直接复制根文件系统内容
sudo mkfs.ext2 -i 8192 ramdisk.img -d rootfs
# 压缩
sudo gzip -9 -f ramdisk.img  du -h rootfs/    # rootfs大小要小于8192
du -h ramdisk.img.gz  # 查看镜像大小

U-Boot启动配置:

setenv bootargs initrd=0xa0000000,0x800000 root=/dev/ram0 rw  rootwait rootfstype=ext2 console=ttyS0,115200 init=/linuxrc ip=192.168.9.9env set bootcmd pci enum \; pci \; ping 192.168.9.119 \; ext4load mmc 0:1 0x84000000 /boot/Image \; tftp 0x83100000 a.dtb \; booti 0x84000000 - 83100000

http://www.dtcms.com/a/457523.html

相关文章:

  • 参数迁移对迭代次数的影响
  • Coze源码分析-资源库-编辑数据库-后端源码-数据存储层
  • Python学习之Day07-08学习(Django网页Web开发)
  • STM32之IWDG-独立看门狗
  • Linux 系统编程:(一)从历史演进到 XShell 远程登录实操
  • 基于cherryusb自制daplink,并对stm32u575进行烧录过程,daplink的执行流进行trace分析
  • 洛阳瀍河建设局网站2021年10月新闻摘抄
  • 学习Java第三十四天——黑马点评48~60
  • 全功能按键非阻塞式实现
  • 学做网站的视频南京谷歌推广
  • iptables
  • STM32+8266+小程序智能家居【小白实战项目】
  • 如何部署一个Java项目
  • 联想乐享赋能笔记本选购新体验:智能解析五大系列,精准匹配用户需求
  • 西安网站设计报价怎样创建网站和网页
  • Go中使用反射的动态方法调用
  • 泰安市住房和城乡建设部网站哪个网站diy做宝宝衣服
  • springboot+vue心理咨询服务小程序(源码+文档+调试+基础修改+答疑)
  • 优秀电商网站设计上海网站建设管理系统
  • 速通JavaWeb1
  • 【开题答辩全过程】以 vue基于SSM框架的高考志愿填报辅助系统设计与实现为例,包含答辩的问题和答案
  • linux网站建设论文logo免费设计图案
  • 怎么把网站源码扒下来wordpress缓存方案
  • 整体设计 逻辑系统程序 之17 Source 容器(Docker)承载 C/P/D 三式的完整设计与双闭环验证 之1
  • 汕头网站设计哪家好网页设计图片与文字对齐左对齐
  • GIS PAD平板手机移动端地理信息系统
  • kafka解决了什么问题?mmap 和sendfile
  • 做网站一定要买免费ppt制作
  • c++ 是静态编译语言
  • 寻找哈尔滨网站建设淘宝客网站的建设