Linux入门攻坚——6、磁盘管理——分区及文件系统管理

磁盘管理主要涉及分区的管理,以及分区后的文件系统管理。

磁盘的使用大体要分两步:

文件系统也是一个软件,根是自引用的。

文件系统的全局结构:物理格式:

一个磁盘刚被生产出来的时候,它里边没有划分扇区,第一步要做的事情就是低级格式化,又叫物理格式化。物理格式化会把磁盘分为一个一个的扇区,同时在物理格式化的时候,也会检测这个磁盘当中有没有坏扇区存在,如果有坏扇区存在,那么就会使用一些备用扇区来顶替坏扇区。总之,物理格式化做的就是划分扇区,并且检测出坏扇区,同时用一些备用扇区来替换坏扇区。

逻辑格式化:高级格式化

物理格式化完了之后,接下来应该逻辑格式化,又叫作高级格式化,逻辑格式化会把磁盘分为一个一个的分区,又叫一个一个的分卷。比如大家最熟悉的C盘D盘E盘,这就是三个不同的分区。
一个磁盘被分为多个分区,那每一个分区的大小是多少?他是从哪个地址到哪个地址?它的一个地址范围是多少?这个就需要用分区表来记录。在每一个分区当中,可以建立各自独立的文件系统,比如说在C盘这个分区里边,可以建立一个unix的文件系统。

一般磁盘经过分区后,由MBR + MBR GAP + 若干分区组成.
a. MBR+MBR GAP一般是2048bytes, 主要用于写入引导程序(如grub、LILO等),引导系统启动;
b. MBR固定是512字节,446(引导写入区域)+64(分区表)+2(固定55aa)

MBR为磁盘的第一个扇区,共512Bytes,其中,前446字节是引导代码区,随后的64字节用于存储分区信息,每个分区信息16字节,共可以存储4个分区信息,所以,使用MBR分区最多容纳四个分区。最后两个字节为55AA。

硬盘0磁道1 扇区的512个字节中记录的信息如下:
     512=           446           +                   64                       +                         2
             MBR(主引导记录)   MPT(主分区标示)           55aa(硬盘的有效性表示)

分区表内容
存储字节数据内容及含义
第 1 字节引导标志
第 2 字节本分区的起始磁道号
第 3 字节本分区的起始扇区号
第 4 字节本分区的起始柱面号
第 5 字节分区类型,可以识别主分区和扩展分区
第 6 字节本分区的结束磁道号
第 7 字节本分区的结束扇区号
第 8 字节本分区的结束柱面号
第 9~12 字节本分区之前已经占用的扇区数
第 13~16 字节本分区的总扇区数

通过最后的 9~12,13~16字节,可以看出,总扇区数最多是4G个,即2的32次方,而每个扇区512字节,所以MBR方式支持的磁盘最大4Gx512=2T字节。即2TB。(可以使用UEFI和GPT进行替代)

从上述可以看出,所谓分区,就是在主引导分区中,即磁盘的第一个扇区中修改分区表的内容,规定每个分区从哪个扇区开始,到哪个扇区结束,规定了分区的边界。

启动引导程序的作用
BIOS 的作用就是自检,然后从 MBR 中读取出启动引导程序。启动引导程序最主要的作用就是加载操作系统的内核。当然,每种操作系统的启动引导程序都是不同的。

每种操作系统的文件格式不同,因此,每种操作系统的启动引导程序也不一样。不同的操作系统只有使用自己的启动引导程序才能加载自己的内核。如果服务器上只安装了一个操作系统,那么这个操作系统的启动引导程序就会安装在 MBR 中。BIOS 调用 MBR 时读取出启动引导程序,就可以加载内核了。

但是在有些时候,服务器中安装了多个操作系统,而 MBR 只有一 个,那么在 MBR 中到底安装哪个操作系统的启动引导程序呢?

很明显,一个 MBR 是不够用的。每块硬盘只能有一个 MBR 是不能更改的,所以不可能増加 MBR 的数量。系统只能在每个文件系统(即每个分区)中单独划分出一个扇区,称作引导扇区(Boot Sector)。每个分区的引导扇区中也能安装启动引导程序,也就是说,在 MBR 和每个单独分区的引导扇区中都可以安装启动引导程序。这样多个操作系统才能安装在同一台服务器中(每个操作系统要安装在不同的分区中),而且每个操作系统都是可以启动的。

还有一个问题,BIOS 只能找到 MBR 中的启动引导程序,而找不到在分区的引导扇区中的启动引导程序。那么,要想完成多系统启动,方法是増加启动引导程序的功能,让安装到 MBR 中的启动引导程序(GRUB)可以调用在分区的引导扇区中的其他启动引导程序。

这里有一个分区起始位置的约定:分区是以柱面为单位。因为磁盘的第1扇区被mbr占用,所以mbr所属的柱面不能被分区使用。所以分区应该从第二柱面开始(实际上看是一个磁面的一条磁道)。这就是下图的MBR GAP部分,62个扇区,一个柱面即一个磁道,含有63个扇区,被MBR占用一个扇区后,就不能在归到其他分区,所以,一般的第一个分区是从63扇区开始的。(也有一种是从2048开始,总之就是分区不能跨磁道。)

分区完成后,就要对分区安装文件系统,所谓安装文件系统,从我个人的理解,就是对上面分区范围内的扇区中的部分扇区数据进行填充或修改,使之符合一定的数据结构,从底层扇区来讲,并没有什么改变,扇区依然保存的是0101序列,只不过,安装文件系统后,对特定的扇区内容进行了规定,扇区的特定位置保存的是什么数据,所以,文件系统是内核的一个进程,这个进程要使用这个进程能够理解的磁盘扇区数据结构,来进行磁盘的使用。

对于linux的文件系统,常用的如ext,其分区大致结构如下

预留一块区域作为引导区,所以第一个块组的前面要留 1K,用于启动引导区。最终,整个文件系统格式就是上面这个样子。那么为什么是引导块而不是引导扇区?为什么是1K而不是512?这其实又是一个逻辑的概念,磁盘属于块设备,读写是以一个扇区为单位进行的,但是经过测算统计,说是一次读2或4或8个扇区数据,效率会更好,还有一个原因是数据要使用,需要先读入内存中,而内存是分页使用的,一个页大小通常是4K,两个数据相匹配,于是就规定了一次读写操作的数据单位为块,一块可以是2、4、8个扇区。

几个概念:

  • node Bitmap:即inode位图,用二进制的方式记录了inode的使用情况, 比如inode是否空闲等。
  • Block Bitmap:即块位图,同Inode Bitmap,用二进制方式记录了块的使用情况。当查找或创建文件时,会扫描此位图来寻找空闲的inode号对应的块。
  • super block:超级块包含了该硬盘或分区上的文件系统的整体信息,如文件系统的大小等。
  • dentry:在内核中起到了连接不同的文件对象inode的作用,进而起到了维护文件系统目录树的作用。dentry是一个纯粹的内存结构,由文件系统在提供文件访问的过程中在内存中直接建立。dentry中包含了文件名,文件的inode号等信息

在Linux中,一切皆文件,对于文件,又分为元数据和数据,元数据是保存文件的属性,如文件的字节数、属主属组、读、写、执行权限、时间戳等等,数据就是文件的实际内容。ext文件系统将元数据保存在inode列表中,数据保存在数据块中,要创建一个新文件,先扫描inode位图,找到一个空的节点,填充新建文件的属性信息,然后扫描数据块位图块,找到空白数据块,保存实际数据内容。在节点inode中将保存分配的数据块号。如果分区很大,位图块也会很大,扫描这两个位图块会很耗费时间。然后,从程序的数据局部性特性出发,将分区再分成一个个块组,块组中的块位图数据量会小很多,操作将加快,所以分区又进行了块组划分。

在ext文件系统的格式中,数据块的位图是放在一个块里面的,共 4k,也就是最大可以表示空间为128M(4K*8bit*4K,4K*8bit表示位图共有多少位,1位就表示一个块,共可以表示多少数据块,后面的4K代表数据块的大小,一般是1,2,4,所以取最大4K,最大空间就是128M)。现在很多文件都比这个大。我们先把这个结构称为一个块组。有 N 多的块组,就能够表示 N 大的文件。

因为块组有多个,块组描述符也同样组成一个列表,我们把这些称为块组描述符表(GDT)。对于块组描述符表来讲,如果每个块组里面都保存一份完整的块组描述符表,一方面很浪费空间;另一个方面,由于一个块组最大 128M,而块组描述符表里面项数的多少,也就决定了块组的多少,128M * 块组的总数目是整个文件系统的大小,就被限制住了。改进的思路就是引入 Meta Block Groups 特性。

每一个元块组包含 64 个块组,块组描述符表也是 64 项,备份三份,在元块组的第一个,第二个和最后一个块组的开始处。这样化整为零,就可以发挥出 ext4 的 48 位块寻址的优势了,在超级块 ext4_super_block 的定义中,可以看到块寻址分为高位和低位,均为 32 位,其中有用的是 48 位,足够用了。

上面就是块组的逻辑结构,之所以叫逻辑结构,是因为从磁盘角度看,什么也没改变,还是一个个扇区保存了一串串01数据。

文件的保持,分为inode区和数据区,文件系统通常会将一个文件的元数据和实际数据两部份的数据分别存放在不同的区块,权限与属性放置到inode中,至于实际数据则放置到data block区块中。

文件的查找过程:以/var/log/message为例:

超级区块(superblock)会记录整个文件系统的整体信息,包括inode与block的总量、使用量、剩余量等,每个inode与block都有编号。超级块就是文件系统的心脏,它如此重要,以至于不得不做多个备份,在0或3、5、7的幂次方的块组中存在备份,即3,5,7的0次,1次,2次,3次。。。中,如,0次方就是组1,1次方就是3,5,7组中,2次方就是9,25,49组中等。

inode的数量与大小也是在格式化时就已经固定了,有三点需要注意:
a, 每个inode大小均固定为128bytes;
b, 每个档案都仅会占用一个inode而已;
c, inode记录一个block号码要花掉 4bytes

假设一个档案有4MB且每个block为4KB时,那么至少需要1K个block号码的记录,也就是需要inode至少有1K*4Bytes=4KB这么大(一个块用4Bytes表示),这不是开玩笑吗!每个inode只有128 bytes!!!

为此Ext2文件系统很聪明的将inode记录block号码的区域定义为:

12个直接 + 1个间接 + 个双间接 + 1个三间接记录区。

这样子inode能够指定多少个block呢?(以1KB大小的Block为例)
12个直接指向:共可记录12笔记录,也即12 blocks;
1个间接指向:1KB/4=256笔记录,也即256 blocks;
1个双间接指向:(1KB/4)*(1KB/4)=256*256=256^2笔记录,也即256^2 blocks;
1个三间接指向:(1KB/4)*(1KB/4)*(1KB/4)=256*256*256=256^3笔记录,也即256^3 blocks;

还有一个问题是关于根文件目录,根是自引用的,就是说根是高于磁盘的,系统默认就知道根在哪里,即对于一个分区,系统默认知道根,即/对应的inode在哪。一般的ext分区,其根对应的inode都是2。

对于普通数据文件,数据块中保存的是文件的实际内容,对于目录文件,数据块中保存的是其下文件与inode的对应表。

Linux磁盘管理:是对设备的管理,计算机的组成包括CPU、内存、I/O设备,磁盘就是I/O设备

I/O Portd:I/O设备地址;
一切皆文件:open(), read(), write(),  close()
块设备:block,存取单位“块”,磁盘
字符设备:char,存取单位“字符”,键盘

设备文件:关联至一个设备驱动程序,进而能够跟与之对应的硬件设备进行通信;
    设备号码:
        主设备号:major number,标识设备类型
        次设备号:minor number,标识同一类型下的不同设备
    硬盘接口类型:
        IDE、SCSI:并口
        SATA、SAS、USB:串口
    /dev/DEV_FILE
        磁盘设备的设备文件命名:
        IDE:/dev/hd
        SCSI,SATA,SAS,USB:/dev/sd
        不同设备:a-z,如/dev/sda,/dev/sdb,...
        同一设备上的不同分区:1,2,3...,如/dev/sda1,/dev/sda5,...

设备文件是特殊文件,一般只有元数据信息,而没有数据信息(内容)。

机械式硬盘:
    track:磁道
    cylinder:柱面
    sector:扇区,512bytes
    如何分区:按柱面划分
    0磁道0扇区:512bytes,是MBR,保存了分区的信息,参考前面。

磁盘分区管理操作:fdisk、parted、sfdisk

fdisk:对于一块硬盘来讲,最多只能管理15个分区
    fdisk -l [-u] [DEVICE]:显示分区情况
    fdisk device:对设备进行分区,包含很多内部命令,如下:
        p:print,显示当前硬件的已有分区,包括没有保存的改动
        n:new,创建新分区;    e:扩展分区,  p:主分区
        d:delete,删除一个分区
        w:write,写入磁盘,即保存退出
        q:quit,不保存退出
        m:获取帮助
         t:修改分区类型;  L:
         l:显示所支持的分区类型

显示当前设备分区情况:

分区(Centos6):


查看内核是否已经识别新的分区:
cat /proc/partitions 

centos7:

两个版本使用w退出时,都进行了同步磁盘操作,所以分区后,使用fdisk及cat /proc/partitions查看,新分区都显示出来了:

如果在/proc/partitions中没有,则要通知内核重新读取硬盘分区表:
partx -a /dev/DEVICE [-n M:N]
kpartx -a /dev/DEVICE -f  :force

Centos5使用:partprobe [/dev/DEVICE]

文件系统管理:

Linux文件系统:ext2,ext3,ext4,xfs,btrfs,reiserfs,jfs,
    swap:交换分区
    光盘:iso9660
Windows:fat32,ntfs,
Unix:FFS,UFS,JFS2
网络文件系统:NFS,CIFS
集群文件系统:GFS2,OCFS2
分布式文件系统:ceph,moosefs,mogilefs,GlusterFS,Lustre
根据是否支持“journal”功能:
    日志型文件系统:ext3,ext4,
    非日志型文件系统:ext2,vfat

文件系统的组成部分:
    内核中的模块:ext4,xfs
    用户空间的管理工具:mkfs.ext4,mkfs.xfs,mkfs.vfat    

因为Linux的文件系统如此之多,Linux使用的是VFS,Virtual FileSystem,虚拟文件系统。提供统一的应用接口,屏蔽底层不同磁盘,不同文件系统操作的差异。

创建文件系统:
    cat /proc/filesystems,当前系统支持的文件系统
    lsmod,内核加载的模块

用户空间的管理工具:

安装文件系统,相当于格式化:

blkid /dev/sdb1 :块设备属性信息查看
    -U UUID  :根据指定的UUID来查找对应的设备
    -L ‘LABEL’ :根据指定的LABEL来查找对应的设备

mkfs.FS_TYPE /dev/sdb1
        ext4、xfs、btrfs、vfat等
mkfs -t FS_TYPE -L 'LABEL' /dev/sdb1

mke2fs:ext系列文件系统专用管理工具
    -t {ext2 | ext3 | ext4}
    -b {1024 | 2048 | 4096}
    -L ‘LABEL’
    -j :相当于-t ext3
    -i  #:数据空间每多少个字节创建一个inode:此大小不应该小于block大小
    -N #:为数据空间创建多少个inode
    -m #:为管理人员预留的空间占据的百分比
    -O FEATURE[,...]:启用指定特性, -O ^FEATURE:关闭指定特性

mkswap [option] device:创建交换分区
    -L 'LABEL' 
    先调整分区类型为82

e2label DEVICE [LABEL]:管理ext系列文件系统的LABEL
tune2fs:重新设定ext系列文件系统可调整参数的值
    -l :查看指定文件系统超级块信息:
    -L ‘LABEL’:修改卷标
    -m #:修改预留给管理员的空间百分比
    -j :将ext2升级为ext3
    -O:文件系统属性启用或禁用
    -o:调整文件系统的默认挂载选项
    -U UUID:修改UUID
dumpe2fs
    -h:查看超级块信息

文件系统检测:
fsck:File System ChecK
    fsck.FS_TYPE
    fsck -t FS_TYPE
        -a : 自动修复错误
        -r : 交互式
    注意:FS_TYPE一定要与分区上已有文件系统类型相同。

e2fsck:ext系列文件系统专用的检测修复工具
    -f:强制性修复

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

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

相关文章

【Go入门】Web工作方式

【Go入门】 Web工作方式 我们平时浏览网页的时候,会打开浏览器,输入网址后按下回车键,然后就会显示出你想要浏览的内容。在这个看似简单的用户行为背后,到底隐藏了些什么呢? 对于普通的上网过程,系统其实是这样做的&…

基于RK3588的8k多屏异显安卓智能网络机顶盒

采用RK3588芯片方案的8K网络机顶盒,搭载纯净的安卓12操作系统,支持Ubuntu和Debian系统容拓展。主要面向外贸市场。此款机顶盒自带两个HDMI输出接口,一个HDMI输入接口,内置双频WiFi6无线模块,支持千兆以太网和USB接口。…

【文末送书】十大排序算法及C++代码实现

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。关…

微创机器人:CRM撬动售后服务数字化升级

一方面,我国医疗器械行业起步较晚,更注重产品的销售和业务的拓展,企业售后服务整体比较滞后。 另一方面,医疗器械售后服务环节数字化程度不足,一些企业仍通过传统的线下手段管理售后服务,进行数字化尝试的…

【快速解决】实验四 对话框 《Android程序设计》实验报告

目录 前言 实验要求 实验四 对话框 正文开始 第一步建立项目 第二步选择empty views activity点击next ​编辑 第三步起名字,点击finish 第四步对 activity _main.xml文件操作进行布局 第五步,建立两个新文件,建立方法如下 SecondA…

SLAM中提到的相机位姿到底指什么?

不小心又绕进去了,所以掰一下。 以我个人最直观的理解,假设无旋转,相机在世界坐标系的(5,0,0)^T的位置上,所谓“位姿”,应该反映相机的位置,所以相机位姿应该如下: Eigen::Matrix4d T Eigen::M…

亚马逊云科技AI创新应用下的托管在AWS上的数据可视化工具—— Amazon QuickSight

目录 Amazon QuickSight简介 Amazon QuickSight的独特之处 Amazon QuickSight注册 Amazon QuickSight使用 Redshift和Amazon QuickSightt平台构建数据可视化应用程序 构建数据仓库 数据可视化 Amazon QuickSight简介 亚马逊QuickSight是一项可用于交付的云级商业智能 (BI…

基于circle group的Reed-Solomon codes

1. 引言 Polygon团队Ulrich Habock等人2023年论文 Reed-Solomon codes over the circle group。 前序博客有: Plonky3 Mersenne素数域的Reed-Solomon codes设计 STARKs支持任意size的域,而不要求是椭圆曲线。STARKs中在选择域size时,越小…

Unity中 Start和Awake的区别

Awake和Start在Unity中都是MonoBehaviour脚本中的生命周期函数 Awake函数在游戏对象首次被加载时调用,在游戏对象初始化之前调用。 start函数在游戏对象初始化完成后调用,在update第一次执行前调用。 这两个函数在其生命周期内都只会调用一次&#xf…

SpringBoot的启动流程

一、SpringBoot是什么? springboot是依赖于spring的,比起spring,除了拥有spring的全部功能以外,springboot无需繁琐的xml配置,这取决于它自身强大的自动装配功能;并且自身已嵌入Tomcat、Jetty等web容器&am…

redis+python 建立免费http-ip代理池;验证+留接口

前言: 效果图: 对于网络上的一些免费代理ip,http的有效性还是不错的;但是,https的可谓是凤毛菱角; 正巧,有一个web可以用http访问,于是我就想到不如直接拿着免费的HTTP代理去做这个! 思路: 1.单页获取ipporttime (获取time主要是为了后面使用的时候,依照时效可以做文章) 2.整…

windows环境搭建Zblog博客并发布上线公网可访问

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员,自己搭建网站制作网页是绕…

总结 CNN 模型:将焦点转移到基于注意力的架构

一、说明 在计算机视觉时代,卷积神经网络(CNN)几十年来一直是主导范式。直到 2021 年 Vision Transformers (ViTs) 出现,这个领域才开始发生变化。现在,是时候采用受 Transformer 架构启发的基于注意力的模型了&#x…

Springboot+vue的机动车号牌管理系统(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频: Springbootvue的机动车号牌管理系统(有报告)。Javaee项目,springboot vue前后端分离项目 项目介绍: 本文设计了一个基于Springbootvue的前后端分离的机动车号牌管理系统,采用M(model&#xff09…

项目九、无线组网

目录 1 配置AC使AP放出Wifi1.1 确保AP和AC三层互通且AP知道AC的IP1.1.1 配置管理SVI的IP1.1.2 该SVI配置DHCP下发IP给AP 1.2 AC为AP下发配置1.2.1 AC用哪个接口回复AP1.2.2 AC验证AP身份(可以不认证)1.2.3 配置ssid 文件确定Wifi名称1.2.4 配置security …

Apache Pulsar 技术系列 - 基于 Pulsar 的海量 DB 数据采集和分拣

导语 Apache Pulsar 是一个多租户、高性能的服务间消息传输解决方案,支持多租户、低延时、读写分离、跨地域复制、快速扩容、灵活容错等特性。本文是 Pulsar 技术系列中的一篇,主要介绍 Pulsar 在海量DB Binlog 增量数据采集、分拣场景下的应用。 前言…

程序员开发者神器:10个.Net开源项目

今天一起盘点下,8月份推荐的10个.Net开源项目(点击标题查看详情)。 1、基于C#开发的适合Windows开源文件管理器 该项目是一个基于C#开发、开源的文件管理器,适用于Windows,界面UI美观、方便轻松浏览文件。此外&#…

课程设计:C++实现哈夫曼编码

功能实现: //1:先计算每个字符的权重//2:构建哈夫曼树//3:得出每个字符的哈夫曼编码。//4:根据哈夫曼编码转化为字符 代码实现: // 哈夫曼编码.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //1:先计…

【如何让你的建筑设计更高效】推荐7个3DMAX建筑设计的实用插件

3DMAX是创建具有复杂对象和照片级真实感材质的大型三维项目的绝佳工具。它有用于粒子模拟和参数化建模的内置工具,只要有足够的时间和练习,你就可以创建任何东西。然而,总有改进的余地。许多第三方开发人员已经发布了自己的扩展,也…

YOLOv8优化策略:轻量级Backbone改进 | VanillaNet极简神经网络模型 | 华为诺亚2023

🚀🚀🚀本文改进:一种极简的神经网络模型 VanillaNet,支持vanillanet_5, vanillanet_6, vanillanet_7, vanillanet_8, vanillanet_9, vanillanet_10, vanillanet_11等版本 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到创新,…