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)的核心配置文件,用于定义系统启动、运行级别切换及进程管理规则。其作用可概括为以下方面:
一、核心功能
- 设置默认运行级别
通过
initdefault
动作指定系统启动后进入的运行级别(如id:3:initdefault:
表示默认进入多用户命令行模式)。运行级别定义:
级别 用途 0 关机 1 单用户模式(救援模式) 2 多用户无网络 3 多用户命令行模式 4 保留未定义 5 图形界面模式 6 重启 - 控制系统初始化流程
- 执行
sysinit
动作的命令(如/etc/rc.d/rc.sysinit
),完成挂载文件系统、加载内核模块等基础初始化。- 在用户登录前完成关键系统服务启动(如网络配置、硬件检测)。
- 管理运行级别对应的进程
根据运行级别(
rstate
字段)执行对应脚本(如l3:3:wait:/etc/rc.d/rc 3
进入级别 3 时执行/etc/rc.d/rc 3
)。通过
action
字段控制进程行为:
动作类型 说明 respawn
进程终止后自动重启(常用于终端登录服务) wait
执行进程并等待其结束再继续 once
仅执行一次,不监控 ctrlaltdel
捕获 Ctrl+Alt+Del 组合键并执行操作(如安全重启) powerfail
电源故障时执行紧急操作 - 监控关键进程
- 对需持续运行的服务(如
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 q
或telinit q
重新加载配置。
四、典型应用场景
- 定义开机初始化任务(如挂载文件系统)。
- 设置不同运行级别的服务(如级别3启动网络服务,级别5启动图形界面)。
- 守护关键进程(如自动恢复崩溃的登录服务)。
- 处理特殊事件(如断电时执行安全关机)。
总结
/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
(不自动挂载)5 dump 备份 控制 dump
备份工具是否备份此文件系统。现在较少使用,通常设为0
。0
(不备份),1
(备份)6 fsck 顺序 控制系统启动时 fsck
检查文件系统的顺序。根分区通常设为1
,其他需要检查的分区设为2
,0
表示不检查。0
(不检查),1
(最先检查),2
(其次检查)💡 重要操作指南
编辑
/etc/fstab
文件需要格外小心,因为配置错误可能导致系统无法正常启动。请务必遵循以下步骤:
- 备份原文件:在开始修改前,先执行
sudo cp /etc/fstab /etc/fstab.bak
命令备份,以便在出错时可以恢复。- 使用 UUID 或 LABEL:这是最佳实践。你可以使用
blkid
命令来查看所有设备的 UUID 和文件系统类型。- 测试配置:修改保存后,千万不要直接重启系统。应先运行
sudo mount -a
命令。这个命令会尝试挂载/etc/fstab
中所有没有noauto
选项的条目。如果没有任何错误提示,说明配置语法基本正确;如果报错,请根据提示修复文件中的错误行。- 处理外接设备:对于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_HOME
、LANG
(系统语言)等重要的系统级变量。- 执行系统级脚本与任务:你可以在这个文件中加入一些命令或逻辑,使其在用户登录时自动执行。例如,自动启动某些服务、检查系统状态或加载内核模块等。
- 模块化设计:一个非常重要的良好实践是,
/etc/profile
文件通常会**自动加载/etc/profile.d/ 目录下的所有以
.sh结尾的脚本**[4](@ref)[6](@ref)。这样做的好处是,不同的软件包(如 Java、Python)可以将自己需要的环境变量设置写成独立的脚本放在这个目录里,使得管理更加清晰和方便,避免了直接修改
/etc/profile` 可能带来的混乱。
⚠️ 重要注意事项
- 修改需要权限:编辑
/etc/profile
文件需要 root(管理员)权限。请务必谨慎修改,因为任何错误都可能影响所有用户的正常登录。- 如何生效:修改文件后,新设置不会立即生效。你需要重新登录系统,或者在当前终端中执行
source /etc/profile
命令来手动加载新的配置。- 与用户配置文件的区别和顺序:系统在为用户准备环境时,配置文件的加载是有顺序的:
/etc/profile
(系统全局,最先执行)- 然后是用户个人目录下的配置文件(如
~/.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