鸟哥的Linux私房菜读书笔记:Linux磁盘与文件系统管理

news2024/11/26 0:21:39

系统管理员很重要的任务之一就是管理好自己的磁盘文件系统, 每个分区不可太大也不能太小, 太大会造成磁盘容量的浪费, 太小则会产生文件无法储存的困扰。 前面谈到的文件权限与属性中, 这些权限与属性分别记录在文件系统的哪个区块内? 这就得要
谈到 filesystem 中的 inode 与 block 了。 同时, 为了虚拟化与大容量磁盘, 现在的 CentOS 7默认使用大容量性能较佳的 xfs 当默认文件系统了! 这也得了解一下。 此章节我们的重点在于如何制作文件系统, 包括分区、 格式化与挂载等, 是很重要的一个章节

磁盘的组成与分区

首先说明一下磁盘的物理组成, 整颗磁盘的组成主要有:

  • 圆形的盘片( 主要记录数据的部分) ;
  • 机械手臂, 与在机械手臂上的磁头( 可读写盘片上的数据) ;
  • 主轴马达, 可以转动盘片, 让机械手臂的磁头在盘片上读写数据。

上面我们知道数据储存与读取的重点在于盘片, 而盘片上的物理组成则为( 假设此磁盘为单碟片

  • 扇区( Sector) 为最小的物理储存单位, 且依据磁盘设计的不同, 目前主要有 512Bytes与 4K 两种格式;
  • 将扇区组成一个圆, 那就是柱面( Cylinder) ;
  • 早期的分区主要以柱面为最小分区单位, 现在的分区通常使用扇区为最小分区单位( 每个扇区都有其号码喔, 就好像座位一样) ;
  • 磁盘分区表主要有两种格式, 一种是限制较多的 MBR 分区表, 一种是较新且限制较少的GPT 分区表。
  • MBR 分区表中, 第一个扇区最重要, 里面有: ( 1) 主要开机区( Master boot record,MBR) 及分区表( partition table) , 其中 MBR 占有 446 Bytes, 而 partition table 则占有 64 Bytes.
  • GPT 分区表除了分区数量扩充较多之外, 支持的磁盘容量也可以超过 2TB。

至于磁盘的文件名部份, 基本上, 所有实体磁盘的文件名都已经被仿真成 /dev/sd[a-p] 的格式, 第一颗磁盘文件名为 /dev/sda。 而分区的文件名若以第一颗磁盘为例, 则为 /dev/sda[1-128] 。 除了实体磁盘之外, 虚拟机的磁盘通常为 /dev/vd[a-p] 的格式。 若有使用到软件磁盘阵列的话, 那还有 /dev/md[0-128] 的磁盘文件名。 使用的是 LVM 时, 文件名则为/dev/VGNAME/LVNAME 等格式

  • /dev/sd[a-p][1-128]: 为实体磁盘的磁盘文件名;
  • /dev/vd[a-d][1-128]: 为虚拟磁盘的磁盘文件名

复习完物理组成后, 来复习一下磁盘分区吧! 如前所述, 以前磁盘分区最小单位经常是柱面, 但 CentOS 7 的分区软件, 已经将最小单位改成扇区了, 所以容量大小的分区可以切的更细~此外, 由于新的大容量磁盘大多得要使用 GPT 分区表才能够使用全部的容量, 因此过去那个 MBR 的传统磁盘分区表限制就不会存在了。 不过, 由于还是有小磁盘啊! 因此, 你在处理分区的时候, 还是得要先查询一下, 你的分区是 MBR 的分区? 还是 GPT 的分区?鸟哥建议过强制使用 GPT 分区喔! 所以本章后续的动作, 大多还是以 GPT 为主来介绍

文件系统特性

我们都知道磁盘分区完毕后还需要进行格式化( format) , 之后操作系统才能够使用这个文件系统。 为什么需要进行“格式化”呢? 这是因为每种操作系统所设置的文件属性/权限并不相同, 为了存放这些文件所需的数据, 因此就需要将分区进行格式化, 以成为操作系统能够利用的“文件系统格式( filesystem) ”。

由此我们也能够知道, 每种操作系统能够使用的文件系统并不相同。 举例来说, windows 98以前的微软操作系统主要利用的文件系统是 FAT ( 或 FAT16) , windows 2000 以后的版本有所谓的 NTFS 文件系统, 至于 Linux 的正统文件系统则为 Ext2 ( Linux second extended file system, ext2fs) 这一个。 此外, 在默认的情况下, windows 操作系统是不会认识 Linux的 Ext2 的。

传统的磁盘与文件系统之应用中, 一个分区就是只能够被格式化成为一个文件系统, 所以我们可以说一个 filesystem 就是一个 partition。 但是由于新技术的利用, 例如我们常听到的LVM与软件磁盘阵列( software raid) , 这些技术可以将一个分区格式化为多个文件系统( 例如LVM) , 也能够将多个分区合成一个文件系统( LVM, RAID) ! 所以说, 目前我们在格式化时已经不再说成针对 partition 来格式化了, 通常我们可以称呼一个可被挂载的数据为一个文件系统而不是一个分区喔!

那么文件系统是如何运行的呢? 这与操作系统的文件数据有关。 较新的操作系统的文件数据除了文件实际内容外, 通常含有非常多的属性, 例如 Linux 操作系统的文件权限( rwx) 与文件属性( 拥有者、 群组、 时间参数等) 。 文件系统通常会将这两部份的数据分别存放在不同的区块, 权限与属性放置到 inode 中, 至于实际数据则放置到 data block 区块中。 另外, 还有一个超级区块 ( superblock) 会记录整个文件系统的整体信息, 包括 inode 与 block 的总量、 使用量、 剩余量等。
每个 inode 与 block 都有编号, 至于这三个数据的意义可以简略说明如下:

  • superblock: 记录此 filesystem 的整体信息, 包括inode/block的总量、 使用量、 剩余量,以及文件系统的格式与相关信息等;
  • inode: 记录文件的属性, 一个文件占用一个inode, 同时记录此文件的数据所在的 block号码;
  • block: 实际记录文件的内容, 若文件太大时, 会占用多个 block

由于每个 inode 与 block 都有编号, 而每个文件都会占用一个 inode , inode 内则有文件数据放置的 block 号码。 因此, 我们可以知道的是, 如果能够找到文件的 inode 的话, 那么自然就会知道这个文件所放置数据的 block 号码, 当然也就能够读出该文件的实际数据了。 这是个比较有效率的作法, 因为如此一来我们的磁盘就能够在短时间内读取出全部的数据, 读写的性能比较好啰。

我们将 inode 与 block 区块用图解来说明一下, 如下图所示, 文件系统先格式化出 inode 与block 的区块, 假设某一个文件的属性与权限数据是放置到 inode 4 号( 下图较小方格内) ,而这个 inode 记录了文件数据的实际放置点为 2, 7, 13, 15 这四个 block 号码, 此时我们的操作系统就能够据此来排列磁盘的读取顺序, 可以一口气将四个 block 内容读出来! 那么数据的读取就如同下图中的箭头所指定的模样了。

这种数据存取的方法我们称为索引式文件系统( indexed allocation) 。 那有没有其他的惯用文件系统可以比较一下啊? 有的, 那就是我们惯用的U盘( 闪存) , U盘使用的文件系统一般为 FAT 格式。 FAT 这种格式的文件系统并没有 inode 存在, 所以 FAT 没有办法将这个文件的所有 block 在一开始就读取出来。 每个 block 号码都记录在前一个 block 当中, 他的读取方式有点像下面这样:

上图中我们假设文件的数据依序写入1->7->4->15号这四个 block 号码中, 但这个文件系统没有办法一口气就知道四个 block 的号码, 他得要一个一个的将 block 读出后, 才会知道下一个block 在何处。 如果同一个文件数据写入的 block 分散的太过厉害时, 则我们的磁头将无法在磁盘转一圈就读到所有的数据, 因此磁盘就会多转好几圈才能完整的读取到这个文件的内容!

常常会听到所谓的“磁盘重组”吧? 需要磁盘重组的原因就是文件写入的 block 太过于离散了,此时文件读取的性能将会变的很差所致。 这个时候可以通过磁盘重组将同一个文件所属的blocks 汇整在一起, 这样数据的读取会比较容易啊! 想当然尔, FAT 的文件系统需要三不五时的磁盘重组一下, 那么 Ext2 是否需要磁盘重整呢?

由于 Ext2 是索引式文件系统, 基本上不太需要常常进行磁盘重组的。 但是如果文件系统使用太久, 常常删除/编辑/新增文件时, 那么还是可能会造成文件数据太过于离散的问题, 此时或许会需要进行重整一下的。 不过, 老实说, 鸟哥倒是没有在 Linux 操作系统上面进行过Ext2/Ext3 文件系统的磁盘重组说! 似乎不太需要啦!

Linux的EXT2文件系统(incode)

在第五章当中我们介绍过 Linux 的文件除了原有的数据内容外, 还含有非常多的权限与属性, 这些权限与属性是为了保护每个使用者所拥有数据的隐密性。 而前一小节我们知道filesystem 里面可能含有的 inode/block/superblock 等。 为什么要谈这个呢? 因为标准的Linux 文件系统 Ext2 就是使用这种 inode 为基础的文件系统啦!

而如同前一小节所说的, inode 的内容在记录文件的权限与相关属性, 至于 block 区块则是在记录文件的实际内容。 而且文件系统一开始就将 inode 与 block 规划好了, 除非重新格式化( 或者利用 resize2fs 等指令变更文件系统大小) , 否则 inode 与 block 固定后就不再变动。但是如果仔细考虑一下, 如果我的文件系统高达数百GB时, 那么将所有的 inode 与 block 通通放置在一起将是很不智的决定, 因为 inode 与 block 的数量太庞大, 不容易管理。

为此之故, 因此 Ext2 文件系统在格式化的时候基本上是区分为多个区块群组 ( block group) 的, 每个区块群组都有独立的 inode/block/superblock 系统。 感觉上就好像我们在当兵时, 一个营里面有分成数个连, 每个连有自己的联络系统, 但最终都向营部回报连上最正确的信息一般! 这样分成一群群的比较好管理啦! 整个来说, Ext2 格式化后有点像下面这样


在整体的规划当中, 文件系统最前面有一个开机扇区( boot sector) , 这个开机扇区可以安装开机管理程序, 这是个非常重要的设计, 因为如此一来我们就能够将不同的开机管理程序安装到个别的文件系统最前端, 而不用覆盖整颗磁盘唯一的 MBR, 这样也才能够制作出多重开机的环境啊! 至于每一个区块群组( block group) 的六个主要内容说明如后:

  • data block ( 数据区块)

data block 是用来放置文件内容数据地方, 在 Ext2 文件系统中所支持的 block 大小有 1K, 2K及 4K 三种而已。 在格式化时 block 的大小就固定了, 且每个 block 都有编号, 以方便 inode的记录啦。 不过要注意的是, 由于 block 大小的差异, 会导致该文件系统能够支持的最大磁盘容量与最大单一文件大小并不相同。 因为 block 大小而产生的 Ext2 文件系统限制如下

Block 大小

1KB

2KB

4KB

最大单一文件限制

16GB

256GB

2TB

最大文件系统总容量

2TB

8TB

16TB

你需要注意的是, 虽然 Ext2 已经能够支持大于 2GB 以上的单一文件大小, 不过某些应用程序依然使用旧的限制, 也就是说, 某些程序只能够捉到小于 2GB 以下的文件而已, 这就跟文件系统无关了! 举例来说, 鸟哥在环工方面的应用中有一套秀图软件称为PAVE, 这套软件就无法捉到鸟哥在数值模式仿真后产生的大于 2GB 以上的文件! 所以后来只能找更新的软件来取代它了!

除此之外 Ext2 文件系统的 block 还有什么限制呢? 有的! 基本限制如下:

  • 原则上, block 的大小与数量在格式化完就不能够再改变了( 除非重新格式化);
  • 每个 block 内最多只能够放置一个文件的数据;
  • 承上, 如果文件大于 block 的大小, 则一个文件会占用多个 block 数量;
  • 承上, 若文件小于 block , 则该 block 的剩余容量就不能够再被使用了( 磁盘空间会浪费) 。

如上第四点所说, 由于每个 block 仅能容纳一个文件的数据而已, 因此如果你的文件都非常小, 但是你的 block 在格式化时却选用最大的 4K 时, 可能会产生一些容量的浪费喔! 我们以下面的一个简单例题来算一下空间的浪费吧!

例题: 假设你的Ext2文件系统使用 4K block , 而该文件系统中有 10000 个小文件, 每个文件大小均为 50Bytes, 请问此时你的磁盘浪费多少容量? 答: 由于 Ext2 文件系统中一个 block仅能容纳一个文件, 因此每个 block 会浪费“ 4096 - 50 = 4046 ( Byte) ”, 系统中总共有一万个小文件, 所有文件大小为: 50 ( Bytes) x 10000 = 488.3KBytes, 但此时浪费的容量为: “ 4046 ( Bytes) x 10000 = 38.6MBytes ”。 想一想, 不到 1MB 的总文件大小却浪费将近 40MB 的容量, 且文件越多将造成越多的磁盘容量浪费。

什么情况会产生上述的状况呢? 例如 BBS 网站的数据啦! 如果 BBS 上面的数据使用的是纯文本来记载每篇留言, 而留言内容如果都写上“如题”时, 想一想, 是否就会产生很多小文件了呢?

好, 既然大的 block 可能会产生较严重的磁盘容量浪费, 那么我们是否就将 block 大小订为1K 即可? 这也不妥, 因为如果 block 较小的话, 那么大型文件将会占用数量更多的 block ,而 inode 也要记录更多的 block 号码, 此时将可能导致文件系统不良的读写性能。

所以我们可以说, 在您进行文件系统的格式化之前, 请先想好该文件系统预计使用的情况。

  • inode table ( inode 表格)

如前所述 inode 的内容在记录文件的属性以及该文件实际数据是放置在哪几号 block 内! 基本上, inode 记录的文件数据至少有下面这些:

  • 该文件的存取模式( read/write/excute) ;
  • 该文件的拥有者与群组( owner/group) ;
  • 该文件的容量;
  • 该文件创建或状态改变的时间( ctime) ;
  • 最近一次的读取时间( atime) ;
  • 最近修改的时间( mtime) ;
  • 定义文件特性的旗标( flag) , 如 SetUID...;
  • 该文件真正内容的指向 ( pointer) ;

inode 的数量与大小也是在格式化时就已经固定了, 除此之外 inode 还有些什么特色呢?

  • 每个 inode 大小均固定为 128 Bytes ( 新的 ext4 与 xfs 可设置到 256 Bytes) ;
  • 每个文件都仅会占用一个 inode 而已;
  • 承上, 因此文件系统能够创建的文件数量与 inode 的数量有关;
  • 系统读取文件时需要先找到 inode, 并分析 inode 所记录的权限与使用者是否符合, 若符合才能够开始实际读取 block 的内容。

我们约略来分析一下 EXT2 的 inode / block 与文件大小的关系好了。 inode 要记录的数据非常多, 但偏偏又只有 128Bytes 而已, 而 inode 记录一个 block 号码要花掉 4Byte , 假设我一个文件有 400MB 且每个 block 为 4K 时, 那么至少也要十万笔 block 号码的记录呢!inode 哪有这么多可记录的信息? 为此我们的系统很聪明的将 inode 记录 block 号码的区域定义为12个直接, 一个间接, 一个双间接与一个三间接记录区。 这是啥? 我们将 inode 的结构画一下好了。

文件系统的简单操作

稍微了解了文件系统后, 再来我们得要知道如何查询整体文件系统的总容量与每个目录所占用的容量

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

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

相关文章

[Golang实战]如何快速接入chatgpt/openai?[引入go-gpt3][新手开箱可用]

如何快速接入chatgpt?[引入go-gpt3]上文介绍了如何在网页使用chatgpt?V1.介绍下在golang中使用chatgpt?1.查看官网推荐的chatgpt项目2.访问go-gpt33.使用并运行在自己的项目中...(是因为例子很难理解,所以一一对应了属性做了配置)3.1安装项目3.2换上自己的代码3.3换上自己的…

LeetCode - 1109 - 航班预定统计

目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 1109. 航班预订统计 - 力扣(LeetCode) 题目描述 这里有 n 个航班,它们分别从 1 到 n 进行编号。 有一份航班预订表 bookings ,表中第 i 条预订记录 bookin…

【C语言】BCD码、十进制互相转换

目录 0. 前言: 1. BCD码 2. 算法原理 3. 进制转换 3.1 两位BCD码的转换: 3.2 其他进制转换 3.3 任意进制转二进制 参考资料: 0. 前言: 记录今天用15单片机写DS1302时钟芯片程序的时候遇到的问题 时间显示是这个样的 0 1…

电源浪涌保护器的演化发展与未来创新方向

随着科学信息技术和城市经济的发展,感应雷、电磁脉冲和雷电波浸入所造成的危害大大增加。一般建筑物的外部防雷措施只能预防直击雷,而强大的电磁场产生的感应雷和脉冲电压却能潜入室内危及电路上的设备。如今通讯网络、电脑仪器和各类用电设备越来越精密…

2023VR视频加密解决方案

如今VR技术在各个领域中的使用,使得我们在日常生活中也可以看到它的身影,常见的就是应用到培训、影院和游戏当中,我们都知道VR视频比传统的平面视频能给用户带来更好的体验,而且现在在教育、娱乐等领域VR类视频也越来越多。相比于…

运动基元(二):贝塞尔曲线

贝塞尔曲线是我第一个深入接触并使用于路径规划的运动基元。N阶贝塞尔曲线具有很多优良的特性,例如端点性、N阶可导性、对称性、曲率连续性、凸包性、几何不变性、仿射不变性以及变差缩减性。本章主要介绍贝塞尔曲线用于运动基元时几个特别有用的特性。 一、贝塞尔曲线的定义 …

C++复习笔记4

编译器给一个类默认生成的六个成员函数: 构造函数、析构函数、拷贝构造函数、赋值运算符重载、对象取地址运算符以及常对象取地址运算符。其中析构函数不能重载,默认的拷贝和赋值两个函数存在浅拷贝的问题。 对象取地址运算符重载和常对象取地址运算符…

KD03丨选品种-横截面动量

大家好,今天我们分享可达鸭系列第3篇策略——横截面动量。 想必这种逻辑大家也都熟悉,为了照顾大部分新人朋友,开始还是简单介绍一下该该逻辑理论。 横截面是一种非时序动量逻辑,从统计学感性描述(非严谨客观描述&am…

windows安装PaddleSpeech(无需visual studio)

前言 首先啊,狠狠的批评一下paddle,不想看请直接跳到用法,另外我python版本是3.9,所以包找的也都是3.9。 1.分成许多子项目涵盖AI的不同领域,初心是好,安装起来得安装多个环境。 2.官方文档推荐linux安装&…

anaconda详细介绍、安装及使用(python)

anaconda详细介绍、安装及使用1 介绍1.1 简介1.2 特点1.3 版本下载2 Anaconda管理Python包命令3 安装3.1 windows安装4 操作4.1 Conda 操作4.2 Anaconda Navigator 操作4.3 Spyder 操作4.4 Jupyter Notebook 操作5 示例参考1 介绍 1.1 简介 Anaconda是用于科学计算&#xff08…

力扣sql简单篇练习(十四)

力扣sql简单篇练习(十四) 1 银行账户概要|| 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # 高于相当于大于的意思 SELECT u.name,t.balance FROM Users u INNER JOIN (SELECT account,sum(amount) balanceFROM TransactionsGROUP BY accountHAVIN…

Kafka入门(四)

下面尝试一下Kafka 的生产者客户端和消费者客户端的实现。 1、客户端简介 生产者就是负责向Kafka发送消息的应用程序,消费者就是拉取Kafka消息的应用程序。 在Kafka的历史版本中,主要的客户端如下: 基于Scala语言编写的客户端,称…

JAVA工具篇--3 maven项目转gradle项目

前言:将已有的Maven 项目转换为Gradle 项目; 1 项目转换: 1.1 winr 打开cmd命令窗口, 然后进入到maven项目根目录后,输入命令: gradle init --info --type pom1.2 选择构建的语言: 输入 1 然后回车; 1.3…

Rust编码的信息窃取恶意软件源代码公布,专家警告已被利用

黑客论坛上发布了一个 用Rust编码的信息窃取恶意软件源代码 ,安全分析师警告,该恶意软件已被积极用于攻击。 该恶意软件的开发者称,仅用6个小时就开发完成,相当隐蔽, VirusTotal的检测率约为22% 。 恶意软件开发者在…

canal使用说明:MySQL、Redis实时数据同步

1. canal简介 canal是阿里开源的数据同步工具,基于bin log可以将数据库同步到其他各类数据库中,目标数据库支持mysql,postgresql,oracle,redis,MQ,ES等 canal分成服务端deployer和客户端adapter,我们可以部署多个,同时为了方便管…

AssertionError: 618 columns passed, passed data had 508 columns【已解决】

问题描述 程序中断,报错如下AssertionError: 618 columns passed, passed data had 508 columns Exception has occurred: ValueError 618 columns passed, passed data had 508 columns AssertionError: 618 columns passed, passed data had 508 columnsThe abo…

< CSDN周赛解析:第 27 期 >

CSDN周赛解析:第 27 期👉 前言👉 第一题: 幸运数字> 解析> 解决方案> 拓展知识👉 第二题: 投篮> 解析> 解决方案👉 第三题: 通货膨胀-x国货币> 解析> 解决方案…

数字展陈技术,让珍贵馆藏资源走出深闺

这篇文章来自于笔者2017年发表在《档案时空》第12期的一篇文章,原名为《数字展陈技术在档案展览中的应用》。 档案时空 时隔5年,数字视觉技术的发展突飞猛进,特别是这两年元宇宙浪潮席卷全球,VR/AR/MR技术的综合应用给受众带来非一…

【PyTorch】教程:对抗学习实例生成

ADVERSARIAL EXAMPLE GENERATION 研究推动 ML 模型变得更快、更准、更高效。设计和模型的安全性和鲁棒性经常被忽视,尤其是面对那些想愚弄模型故意对抗时。 本教程将提供您对 ML 模型的安全漏洞的认识,并将深入了解对抗性机器学习这一热门话题。在图像…

Java程序设计-ssm企业财务管理系统设计与实现

摘要系统设计系统实现开发环境:摘要 对于企业集来说,财务管理的地位很重要。随着计算机和网络在企业中的广泛应用,企业发展速度在不断加快,在这种市场竞争冲击下企业财务管理系统必须优先发展,这样才能保证在竞争中处于优势地位。…