06-07 - 文件系统(下)

news2025/1/11 0:51:40

---- 整理自 王利涛老师 课程
实验环境:宅学部落 www.zhaixue.cc

文章目录

  • 15. 根文件系统
    • 15.1 根文件系统的基本概念
    • 15.2 挂载根文件系统的三种方式
    • 15.3 根文件系统的挂载
      • 15.3.1 rootfs 文件系统的概念
      • 15.3.2 root= 参数分析
      • 15.3.3 根目录“ / ”
  • 16. 使用 initrd 作为根文件系统:CPIO 格式
    • 16.1 initrd 和 ramdisk
    • 16.2 内核配置
    • 16.3 uboot 配置
    • 16.4 制作 initrd 镜像
    • 16.5 initrd 挂载过程分析
      • 16.5.1 CPIO initrd 挂载过程分析
      • 16.5.2 rdinit=/linuxrc 的启动
  • 17. 使用 initrd 作为文件系统:ramdisk 格式
  • 18. 使用 initramfs 作为根文件系统
    • 18.1 initramfs 配置挂载过程
    • 18.2 initramfs 挂载过程分析
  • 19. 基于内存的文件系统:tmpfs
  • 20. 文件系统的自动挂载
  • 21. 文件系统的性能指标

上一篇不迷路: 06-07 - 文件系统(下)

15. 根文件系统

15.1 根文件系统的基本概念

  • 什么是根文件系统?
  • 根文件系统和一般文件系统有什么区别?
  • 为什么需要根文件系统?
  • 根文件系统的目录
  • VFS 和根文件系统是什么关系?
  • 如何指定根文件系统?

15.2 挂载根文件系统的三种方式

在这里插入图片描述

15.3 根文件系统的挂载

15.3.1 rootfs 文件系统的概念

  • rootfs 的作用
    • 子文件系统挂载到父文件系统上,那么最上层文件系统挂载到哪里?根文件系统肯定是挂载到根目录上,根目录是哪里来的?这就是 rootfs 的作用,在挂载根文件系统之前,完成一些基本环境的初始化,后续才能去挂载我们真正的根文件系统。
  • 为什么不直接挂载分区,而先使用 rootfs?
  • rootfs 和根文件系统是什么关系?
    • 不是一个概念
  • rootfs 和根目录的关系?
  • 第一个根目录 “ / ” 何时创建的?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

rootfs 文件系统设置了自己的根目录和当前目录为 " / "。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

15.3.2 root= 参数分析

  • root=/dev/mmcblk0 挂载 SD 卡为根文件系统
  • root=/dev/nfs 挂载NFS为根文件系统:根据 root 参数挂载指定的根文件系统
  • noinitrd 启动参数
  • init=/linuxrc 启动

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
回到这里的代码:
在这里插入图片描述

我们当前进程的当前目录 current->pwd 设置为了 "/root" 目录。但是当前进程的根目录 current->root 还是 "/"

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

再回到代码的这里:

在这里插入图片描述

init_mount 改变挂载点,NFS 文件系统本来挂载在"/root" 目录,现在移动到根目录 “/”,如图中的红色虚线。
init_chroot 将当前目录也就是 “/root” 设置为根目录 “/”,如图中的红色实线。这样,NFS 就成了根文件系统。

在这里插入图片描述

15.3.3 根目录“ / ”

  • 作用是什么?
  • 什么时候初始化的?
  • 根文件系统和根目录是什么关系?
  • rootfs 的根目录: /
  • NFS 的根目录 :/root -> vfsmount->mnt_root
  • 一个系统中允许多个 ”/” 吗?
  • 根目录可以切换吗?

在这里插入图片描述

16. 使用 initrd 作为根文件系统:CPIO 格式

initrd 总的来说目前有两种格式:image 格式和 cpio 格式。image 格式也叫文件系统镜像文件(老式块设备的 initrd 文件),主要在 linux 2.4 内核中使用流行;在linux 2.5 内核开始引入 initramfs 技术,initramfs 实际上已经克服了 imgae-initrd 的缺点,本质上也是 cpio 格式的 initrd,只不过是和内核编译到了一个 image 文件,放在了 .init.ramfs 段内;到 linux 2.6 的内核支持两种格式的 initrd,即 image-initrd 和 cpio-initrd,此时的 cpio-initrd 文件已不再编译进内核而单独成一文件,使用 cpio 工具生成。https://blog.51cto.com/u_15064644/4817854

16.1 initrd 和 ramdisk

  • 什么是 ramdisk?
  • 什么是 initrd?
  • 为什么会有 initrd?
  • Linux 内核在初始化之后会启动一个 init 进程,在这个 init 进程中挂载根文件系统,但是 init 进程的二进制 bin 文件是存储在文件系统中的,所以这就有了先有鸡还是先有蛋的问题。为了解决这个问题,内核采用了两步走的方法:除了内核镜像外,还有一个独立的 initrd.img 镜像,内核会先 mount 这个镜像作为根文件系统,然后执行 initrd 中的 /linuxrc 或者 /init 来挂载真正的根文件系统。
  • initrd 和 ramdisk 的关系,其实就像系统备份镜像和 C 盘的关系,普通的根文件系统数据(包括二进制文件、脚本、配置文件、目录等)是存放在磁盘中的,因为 ramdisk 是在内存中模拟的一块磁盘设备,断电后数据不会永久保存,所以我们需要一个备份镜像保存在磁盘上,在系统启动时,将备份数据镜像加载到内存中的 ramdisk 中就可以了,而 initrd 就是根文件系统的备份镜像,为了节省体积,还会支持各种压缩格式,加载到内核中再解压。
  • 如何制作 initrd 镜像?
    通过 ramdisk
    通过 loopback
    cpio 格式:find . | cpio -o -H newc | gzip -c > ../initrd.gz
  • 如何设置 root、initrd 参数挂载 initrd?
    root=
    initrd=
    rdinit=/linuxrc

16.2 内核配置

因为 initrd 基于 ramdisk 实现,所以内核需要支持 initrd 和 ramdisk 功能。

在这里插入图片描述
在这里插入图片描述
注:ramdisk 大小设置为了 4M,下面会用到。

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- vexpress_defconfig -j$(nproc)
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig -j$(nproc)
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j$(nproc)
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- uImage LOADADDR=0x60003000 -j$(nproc)

16.3 uboot 配置

使用 initrd 作为根文件系统,需要在启动参数中指定,然后传输给内核,在嵌入式系统中,一般可以通过 uboot 的 bootcmd 和 bootargs 来传递。

在这里插入图片描述

tftp 0x60003000 uImage;tftp 0x60500000 vexpress-v2p-ca9.dtb;tftp 0x62000000 initrd.gz;setenv bootargs 'initrd=0x62000000,4M root=/dev/ram0 rw rdinit=/linuxrc console=ttyAMA0';bootm 0x60003000 - 0x60500000;

16.4 制作 initrd 镜像

  1. 基于之前的 NFS 镜像文件制作 initrd 镜像,NFS 镜像文件如下,大小为 26M,大于 4M。

在这里插入图片描述

  1. 先拷贝一份 NFS 的镜像文件,然后删除其中 lib 目录下的库文件,只保留 libc 库。

在这里插入图片描述
在这里插入图片描述

  1. find . | cpio -o -H newc | gzip -c > ../initrd.gz

在这里插入图片描述

  1. 加载 initrd 结果。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

16.5 initrd 挂载过程分析

find . | cpio -o -H newc | gzip -c > ../initrd.gz

16.5.1 CPIO initrd 挂载过程分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
do_initcalls 就会执行到如下函数:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

16.5.2 rdinit=/linuxrc 的启动

回到前面:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

17. 使用 initrd 作为文件系统:ramdisk 格式

  • 制作一个 ramdisk 镜像
  • ramdisk 格式的 initrd 挂载过程分析
  • 使用 initrd 的优点、缺点: page cache \ 地址空间

在这里插入图片描述
在这里插入图片描述

需要修改 boot 配置中的 bootcmd 参数:

# 将之前的 initrd.gz 改成 initrd
CONFIG_BOOTCOMMAND="tftp 0x60003000 uImage;tftp 0x60500000 vexpress-v2p-ca9.dtb;tftp 0x62000000 initrd;setenv bootargs 'initrd=0x62000000,4M root=/dev/ram0 rw rdinit=/linuxrc console=ttyAMA0';bootm 0x60003000 - 0x60500000;"

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

前面过程一样,一直走到这里:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

18. 使用 initramfs 作为根文件系统

  • 相比 initrd(一种 cpio 制作的,一种传统 ramdisk 方式制作的),initramfs 的优势有哪些?
  • 启动参数
    • root:initramfs 作为根文件系统,root、init 不用设置,只需要指定文件系统的源目录就可以了
    • 文件系统中默认要有一个 init 文件

18.1 initramfs 配置挂载过程

  • 使用 initramfs 的内核配置
    使用之前创建的 ramdisk 路径,同时将路径下的 linux 更名为 init 。然后再开始编译内核。

在这里插入图片描述
在这里插入图片描述

  • 使用 initramfs 的 u-boot 编译配置
tftp 0x60003000 uImage;tftp 0x60800000 vexpress-v2p-ca9.dtb;setenv bootargs 'console=ttyAMA0';bootm 0x60003000 - 0x60800000;

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

18.2 initramfs 挂载过程分析

  • initramfs 的挂载过程分析
  • Linkscript: arch/arm/kernel/vmlinux.lds
  • Head file: include/asm-generic/vmlinux.lds.h
  • Makefile: usr/Makefile

前面过程和之前章节一样:

在这里插入图片描述

这里着重分析一下两个参数:__initramfs_start__initramfs_size

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

19. 基于内存的文件系统:tmpfs

  • 内存的文件系统
    • ramfs VS ramdisk
    • ramfs VS tmpfs
  • tmpfs 的优点:
    • 快、不用格式化、动态调整大小、扩展性好
  • tmpfs 的实现:linux-5.10.4/mm/shmem.c
  • tmpfs 的应用领域
    • 临时目录、临时文件
  • tmpfs 的挂载:mount -t tmpfs -o size=4m tmpfs /tmp

在这里插入图片描述
在这里插入图片描述

20. 文件系统的自动挂载

  • 文件系统挂载方式
    • 内核挂载、启动参数、自动挂载
  • 根文件系统的常用目录
  • 启动脚本
  • 文件系统的自动挂载

在这里插入图片描述

注意:实验前将文件系统还原成 NFS 配置,包括 boot 和 kernel。

在这里插入图片描述
在这里插入图片描述

21. 文件系统的性能指标

  • 不同应用场景
    分布式
    服务器、PC
    消费电子
  • 文件系统得到性能指标
    文件名长度、最大文件数、最大分区、最大文件大小
    挂载速度、读写速度、稳定性、日志
  • 如何选型文件系统?
  • 常见的文件系统
    • Windows:FAT16、FAT32、NTFS
    • Linux:ext2、ext3、ext4、btrfs、zfs
    • 光盘:ISO9660
    • 网络文件系统:SMBAFS、CIFS、NFS

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2065199.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能家居:‌未来生活的崭新篇章

随着科技的飞速发展,‌智能家居正逐渐从概念走向现实,‌为我们的日常生活带来前所未有的便捷与舒适。‌智能家居,‌简而言之,‌就是利用先进的物联网技术、‌人工智能、‌大数据分析等,‌将家中的各种设备连接起来&…

text token通过cross attention来编辑图片

https://zhuanlan.zhihu.com/p/645249016https://zhuanlan.zhihu.com/p/645249016diffusers中的cross-attention实现_diffusers.models.attention.crossattention-CSDN博客文章浏览阅读71次。在models/unets/unet_2d_condition.py中,如何在Unet中将原注意力类替换,Unet中的at…

笔记:Echarts柱状图 实现滚轮条 数据太多

效果👇👇👇 配置:👇 let option {dataZoom: [{type: "slider",show: true,zoomLock: true,start: 0,end: 20,bottom: 60,height: 10,textStyle: {color: "transparent",fontSize: 9,},fillerColo…

WEB应用服务器 -- Tomcat详解及案例实现

一、Web前端三大核心技术 1.1 HTML HTML(HyperText Markup Language)超文本标记语言,它不同于一般的编程语言。超文本即超出纯文本的范畴,例如:描述文本颜色、大小、字体等信息,或使用图片、音频、视频等…

Linux 操作系统全览:从文件管理到系统状态掌控

在当今的计算机技术领域,Linux 操作系统以其稳定性、安全性和高度的可定制性而备受青睐。本文将深入探讨 Linux 操作系统的多个重要方面,包括文件管理、文本操作、软件安装、用户和权限管理以及网络和系统状态管理。 一、Linux 文件管理 Linux 的文件系…

哈工深、NUS等联合提出全新信息抽取基准任务:细粒度定位的统一多模态信息抽取...

信息抽取是 NLP 领域长久以来最经典的研究方向之一。信息抽取的研究经历过了多模态抽取阶段,以及大一统的抽取阶段。在大语言模型和多模态时代,信息抽取的发展何去何从,目前社区仍在积极探索中。 近期,由哈工深和新加坡国立大学等…

131-横向移动-Kerberos攻击SPN扫描WinRMWinRSRDP

1、RDP协议 Remote Desktop Protocol 远程桌面协议通常开放3389 ,Windows上面使用mstsc就可以弹出最常见的远程桌面连接方式,一般都是使用明文进行连接其实还可以使用hash进行 在内网中使用RDP协议一般是需要进行代理转发或者建立节点的 端口扫描 shel…

实现AOP机制 + Spring总结

文章目录 1.目录2.SmartAnimal.java 接口(JDK代理必须有接口)3.SmartDog.java4.SmartAnimalAspect.java5.SunSpringApplicationContext.java1.在Bean的后置处理器之后使用动态代理2.完整代码 6.测试1.AppMain.java 调用被代理的类的方法2.结果 7.Spring底…

维特——六九轴陀螺仪传感器代码的移植方法

使用的是如图所示的这款陀螺仪,相比MPU6050,它可以做到Z轴不漂的效果。 官方给的代码是使用两个串口,一个用来和上位机通信,一个用来于该模块通信。在实际使用中,我们只需要单片机和该模块通信即可,所以我…

Centos安装Jenkins教程详解版(JDK8+Jenkins2.346.1)

本教程基于 JDK8 和 Jenkins2.346.1 JDK安装 下载OpenJDK8文件 wget https://mirrors.tuna.tsinghua.edu.cn/Adoptium/8/jdk/x64/linux/OpenJDK8U-jdk_x64_linux_hotspot_8u422b05.tar.gz解压到指定目录 # 创建目录 mkdir -p /usr/local/software# 解压文件到指定目录&#…

uniapp点击预览图片,两种效果

背景&#xff1a; 在使用uniapp框架中&#xff0c;我们对图片的展示需要点击放大展示(单张)&#xff1b;如果是多张图片&#xff0c;要支持左右滑动查看多张图片(多张)。 官网链接&#xff1a;点击跳转官网 一、单张&#xff0c;点击放大 代码&#xff1a; <template> …

Spring模块详解Ⅲ(Spring Expression Language (SPEL)和Spring JDBC)

目录 Spring Expression Language&#xff08;SpEL&#xff09;Spring Context 模块详解1. 什么是 Spring Context?2. ApplicationContext 的主要实现3. 国际化支持国际化消息文件使用 MessageSourceXML 配置&#xff1a;Java 配置&#xff1a; 使用国际化消息&#xff1a; 4.…

SwapPrompt(论文解读): Test-Time Prompt Adaptation for Vision-Language Models

2023(Neural IPS) 摘要 测试自适应 &#xff08;TTA&#xff09; 是无监督域自适应&#xff08;UDA&#xff09;中一种特殊且实用的设置&#xff0c;它允许源域中的预训练模型去适应另一个目标域中的未标记测试数据。为了避免计算密集型的骨干网络微调过程&#xff0c;因此利…

【技巧】-DNSlog外带文件

❤️博客主页&#xff1a; iknow181 &#x1f525;系列专栏&#xff1a; 网络安全、 Python、JavaSE、JavaWeb、CCNP &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐评论✍ 1.什么是DNSlog 我们都知道DNS就是将域名解析为ip&#xff0c;用户在浏览器上输入一个域名A.com&#x…

实现Nginx四层负载均衡

Nginx在1.9.0版本开始支持tcp模式的负载均衡&#xff0c;在1.9.13版本开始支持udp协议的负载&#xff0c;udp主要用于 DNS的域名解析&#xff0c;其配置方式和指令和http 代理类似&#xff0c;其基于ngx_stream_proxy_module模块实现tcp 负载&#xff0c;另外基于模块ngx_strea…

vue2版本空目录下创建新项目的方法2024

vue2版本空目录下创建新项目的方法2024 node -v npm -v vue -V 安装vue-cli 2.9版本的命令 npm install vue-cli -g 卸载vue2.x方法&#xff1a; npm uninstall vue-cli -g 设置 NPM 镜像 npm config set registry https://registry.npmmirror.com vue -V 报错时需设置环…

多进程和多线程基础概念LINUX

进程和程序的区别 程序是静态的&#xff0c;它是保存在磁盘上的指令的有序集合&#xff0c;没有任何执行的概念进程是一个动态的概念&#xff0c;它是程序执行的过程&#xff0c;包括了动态创建、调度和销毁的整个过程 并行&#xff1a;在 cpu 多核的支持下&#xff0c;实现物…

Git 的基本使用

1.创建 Git 本地仓库 仓库是进⾏版本控制的⼀个⽂件⽬录。我们要想对⽂件进⾏版本控制&#xff0c;就必须先创建⼀个仓库出来&#xff0c;例如下面代码创建了gitcode_linux的文件夹&#xff0c;之后再对其进行初始化。创建⼀个 Git 本地仓库对应的命令为 git init &#xff0c…

视频项目开发,EasyCVR视频融合平台为何成为关键驱动力

智慧类视频项目是基于多个系统融合&#xff0c;旨在实现更广泛联动功能&#xff0c;以满足智能化应用需求为基石的信息化项目。当前&#xff0c;智慧社区、智慧园区、智慧工厂乃至智慧城市等应用场景的需求日益增长。这些智慧项目的整合进程中&#xff0c;视频融合能力扮演着不…

ASP.NET Core 入门教程一 创建最小 API

构建最小 API&#xff0c;以创建具有最小依赖项的 HTTP API。 它们非常适合需要在 ASP.NET Core 中仅包括最少文件、功能和依赖项的微服务和应用。 本教程介绍使用 ASP.NET Core 生成最小 API 的基础知识。 启动 Visual Studio 2022 并选择“创建新项目”。 在“创建新项目”…