Linux一一第七章、磁盘与文件系统管理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuanyin235/article/details/83176782

7.1 认识Linux文件系统

7.1.1 磁盘组成与分区的复习

盘片的物理组成:

实体磁盘和虚拟磁盘:

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

若有使用到软件磁盘阵列的话,那还有 /dev/md[0-128] 的磁盘文件名。使用的是 LVM 时,文件名则为/dev/VGNAME/LVNAME 等格式。

7.1.2 文件系统特性

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

FAT格式(例如U盘)读取方式:

7.1.3 Linux的EXT2文件系统(inode)

Ext2 文件系统在格式化的时候基本上是区分为多个区块群组 (block group) 的,每个区块群组都有独立的inode/block/superblock 系统

data block (数据区块)
data block 是用来放置文件内容数据地方,在 Ext2 文件系统中所支持的 block 大小有 1K, 2K及 4K 三种而已。

除此之外 Ext2 文件系统的 block 还有什么限制呢?有的!基本限制如下:
        原则上,block 的大小与数量在格式化完就不能够再改变了(除非重新格式化) ;
        每个 block 内最多只能够放置一个文件的数据;
       承上,如果文件大于 block 的大小,则一个文件会占用多个 block 数量;
       承上,若文件小于 block ,则该 block 的剩余容量就不能够再被使用了(磁盘空间会浪费) 。
由于每个block最多只能存放一个文件的数据,那么存在下面矛盾:

(1).如果block设置太大,文件太小,就会造成block浪费

(2).如果block设置太小,文件太大,这样会造成过多的block数量,而inode也要记录更多的block号码,导致文件系统不良的读写性能

inode table (inode 表格)
基本上,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 的内容。

Superblock (超级区块)
Superblock 是记录整个 filesystem 相关信息的地方, 没有 Superblock ,就没有这个filesystem 了。他记录的信息主要有:
        block 与 inode 的总量;
        未使用与已使用的 inode / block 数量;
        block 与 inode 的大小 (block 为 1, 2, 4K,inode 为 128Bytes 或 256Bytes) ;
        filesystem 的挂载时间、最近一次写入数据的时间、最近一次检验磁盘 (fsck) 的时间等文件系统的相关信息;
        一个 valid bit 数值,若此文件系统已被挂载,则 valid bit 为 0 ,若未被挂载,则 valid bit为 1


Filesystem Description (文件系统描述说明)
       这个区段可以描述每个 block group 的开始与结束的 block 号码,以及说明每个区段(superblock, bitmap, inodemap, data block) 分别介于哪一个 block 号码之间。这部份也能够用 dumpe2fs 来观察的。


block bitmap (区块对照表)
       通过block bitmap可以快速的找到可使用的空间来处置文件

node bitmap (inode 对照表)
       记录使用与未使用的 inode 号码

dumpe2fs: 查询 Ext 家族 superblock 信息的指令
       每个区段与 superblock 的信息都可以使用 dumpe2fs 这个指令来查询的!不过很可惜的是,我们的 CentOS 7 现在是以 xfs 为默认文件系统, 所以目前你的系统应该无法使用 dumpe2fs 去查询任何文件系统的。


7.1.4 与目录树的关系

由于目录树是由根目录开始读起,因此系统通过挂载的信息可以找到挂载点的 inode 号码,此时就能够得到根目录的 inode 内容,并依据该 inode 读取根目录的 block 内的文件名数据,再一层一层的往下读到正确的文件名。

7.1.5 EXT2/EXT3/EXT4 文件的存取与日志式文件系统的功能
假设我们想要新增一个文件,此时文件系统的行为是:
      1. 先确定使用者对于欲新增文件的目录是否具有 w 与 x 的权限,若有的话才能新增;
      2. 根据 inode bitmap 找到没有使用的 inode 号码,并将新文件的权限/属性写入;
      3. 根据 block bitmap 找到没有使用中的 block 号码,并将实际的数据写入 block 中,且更新 inode 的 block 指向数据;
      4. 将刚刚写入的 inode 与 block 数据同步更新 inode bitmap 与 block bitmap,并更新superblock 的内容。
一般来说,我们将 inode table 与 data block 称为数据存放区域,至于其他例如 superblock、block bitmap 与 inode bitmap 等区段就被称为 metadata (中介数据) 啰,因为 superblock,inode bitmap 及 block bitmap 的数据是经常变动的,每次新增、移除、编辑时都可能会影响到这三个部分的数据,因此才被称为中介数据的啦。


日志式文件系统 (Journaling filesystem)
该区块专门在记录写入或修订文件时的步骤, 那不就可以简化一致性检查的步骤了?也就是说:
       1. 预备:当系统要写入一个文件时,会先在日志记录区块中纪录某个文件准备要写入的信息;
       2. 实际写入:开始写入文件的权限与数据;开始更新 metadata 的数据;
       3. 结束:完成数据与 metadata 的更新后,在日志记录区块当中完成该文件的纪录。


7.1.6 Linux 文件系统的运行

Linux 系统上面文件系统与内存有非常大的关系:
      系统会将常用的文件数据放置到内存的缓冲区,以加速文件系统的读/写;
      承上,因此 Linux 的实体内存最后都会被用光!这是正常的情况!可加速系统性能;
      你可以手动使用 sync 来强迫内存中设置为 Dirty 的文件回写到磁盘中;
      若正常关机时,关机指令会主动调用 sync 来将内存的数据回写入磁盘内;
      但若不正常关机(如跳电、死机或其他不明原因) ,由于数据尚未回写到磁盘内, 因此重新开机后可能会花很多时间在进行磁盘检验,甚至可能导致文件系统的损毁(非磁盘损毁)
 

7.1.7 挂载点的意义 (mount point)
概念:每个 filesystem 都有独立的 inode / block / superblock 等信息,这个文件系统要能够链接到目录树才能被我们使用。 将文件系统与目录树结合的动作我们称为“挂载”。

重点是:挂载点一定是目录,该目录为进入该文件系统的入口。因此并不是你有任何文件系统都能使用,必须要“挂载”到目录树的某个目录后,才能够使用该文件系统的。


7.1.8 其他 Linux 支持的文件系统与 VFS
常见的支持文件系统有:
       传统文件系统:ext2 / minix / MS-DOS / FAT (用 vfat 模块) / iso9660 (光盘) 等等;
       日志式文件系统: ext3 /ext4 / ReiserFS / Windows' NTFS / IBM's JFS / SGI's XFS /ZFS
       网络文件系统: NFS / SMBFS


7.1.9 XFS 文件系统简介
CentOS 7 开始,默认的文件系统已经由原本的 EXT4 变成了 XFS 文件系统了!为啥CentOS 要舍弃对 Linux 支持度最完整的 EXT 家族而改用 XFS 呢? 这是有一些原因存在的。
       EXT 家族当前较伤脑筋的地方:支持度最广,但格式化超慢!
XFS 文件系统的配置
xfs 文件系统在数据的分佈上,主要规划为三个部份,一个数据区 (data section) 、一个文件系统活动登录区 (log section) 以及一个实时运行区 (realtime section) 。 这三个区域的数据内容如下:


数据取:

       xfs 的这个数据区的储存区群组 (allocation groups, AG) ,你就将它想成是 ext家族的 block 群组 (block groups) 就对了!本小节之前讲的都可以在这个区块内使用。 只是 inode 与 block 是动态产生,并非一开始于格式化就完成配置的。


文件系统活动登录区 (log section)

      在登录区这个区域主要被用来纪录文件系统的变化,其实有点像是日志区
 

实时运行区 (realtime section)
      当有文件要被创建时,xfs 会在这个区段里面找一个到数个的 extent 区块,将文件放置在这个区块内,等到分配完毕后,再写入到 data section 的 inode 与 block 去! 这个 extent 区块的大小得要在格式化的时候就先指定,最小值是 4K 最大可到 1G。一般非磁盘阵列的磁盘默认为 64K 容量,而具有类似磁盘阵列的 stripe 情况下,则建议 extent 设置为与 stripe 一样大较佳。这个 extent 最好不要乱动,因为可能会影响到实体磁盘的性能喔
 

XFS 文件系统的描述数据观察

7.2 文件系统的简单操作

7.2.1 磁盘与目录的容量
df:列出文件系统的整体磁盘使用量;
du:评估文件系统的磁盘使用量(常用在推估目录所占容量)

7.2.2 实体链接与符号链接: ln

Hard Link (实体链接, 硬式链接或实际链接)
         hard link 应该仅能在单一文件系统中进行的,即使某一个目录下的关连数据被杀掉了,也没有关系,只要有任何一个目录下存在着关连数据,那么该文件就不会不见!
Symbolic Link (符号链接,亦即是捷径)
        Symbolic link 就是在创建一个独立的文件,而这个文件会让数据的读取指向他 link 的那个文件的文件名!由于只是利用文
件来做为指向的动作, 所以,当来源文件被删除之后,symbolic link 的文件会“开不了”, 会一直说“无法打开某文件!”。实际上就是找不到原始“文件名”而已啦!

7.3 磁盘的分区、格式化、检验与挂载

参考文章:https://blog.csdn.net/xiaoliuliu2050/article/details/79958648

7.3.1 观察磁盘分区状态
lsblk 列出系统上的所有磁盘列表

blkid 列出设备的 UUID 等参数
parted 列出磁盘的分区表类型与分区信息
 

7.3.2 磁盘分区: gdisk/fdisk
注意的是:“MBR 分区表请使用 fdisk 分区, GPT 分区表请使用 gdisk 分区!”
gdisk

这个 gdisk 只有 root 才能执行,此外,请注意,使用的“设备文件名”请不要加上数字,因为partition 是针对“整个磁盘设备”而不是某个 partition 呢!所以执行“ gdisk /dev/vda1 ” 就会发生错误啦!要使用 gdisk /dev/vda 才对!
 

fdisk

由于我这边安装的磁盘分区类型是MBR格式,所以,分区步骤如下:

1.常用的格式:fdisk -l列出使用的磁盘设备

2.创建主分区(MBR):

a)  Fdisk /dev/sda进入磁盘分区环境

b)  n 添加一个新的磁盘

我们发现当我们想添加一个主分区3时,这个时候显示No free sectors available,这是因为我们所有的磁盘容量都已经分配给了主分区1和主分区2了,没有多余的空间进行磁盘分区了。

接下来我们希望再添加一块虚拟硬盘,如下所示:

我们退出当前虚拟机,然后点击编辑虚拟机设置:

点击完成,我们可以看到新增加了一个20G的虚拟硬盘

我们启动虚拟机,用fdisk -l指令再次查询:

现在我们对sdb这个磁盘进行分区,我们希望分三个主分区+一个扩展分区,一个扩展分区里面又添加了三个逻辑分区

我们先创建三个主分区1,2,3

同时,我们用指令p查看一下:

接下来我们创建扩展分区:

同样,我们用指令查一下:

接下来,利用w指令直接写入磁盘分区表吧!

另外利用partprobe 更新 Linux 核心的分区表信息

7.3.3 磁盘格式化(创建文件系统)
分区完毕后,需要对文件系统进行格式化。

XFS 文件系统 mkfs.xfs

使用上述指令创建的其实是 xfs 文件系统

7.3.5 文件系统挂载与卸载
不过要进行挂载前,你最好先确定几件事:
       单一文件系统不应该被重复挂载在不同的挂载点(目录) 中;
       单一目录不应该重复挂载多个文件系统;
       要作为挂载点的目录,理论上应该都是空目录才是。
要将文件系统挂载到我们的 Linux 系统上,就要使用 mount 这个指令

挂载 xfs/ext4/vfat 等文件系统

我们采用临时挂载至D/xfs,E,F,G,H,I文件夹下

这里有个问题点,就是我们直接采用mount /dev/sdb1 D/xfs指令时出现挂载不了的情况,报错如下:

解决方案参考网上文章:https://blog.csdn.net/zt_16KK/article/details/78059764

然后,我们依次挂载其余的分区,最后利用df -h指令查看挂载后的情况:

接下来我们使用该分区,我们通过touch指令创建一个.txt文档

可以看到已经可以正常使用该分区了。

但是上述只是临时挂载,重启后,挂载的分区就会消失,如下所示:

7.4 设置开机挂载

永久挂载

通过修改/etc/fstab这个文件,来达到,当系统启动的时候自动挂载

7.4.1 开机挂载 /etc/fstab 及 /etc/mtab
系统挂载的一些限制:
       根目录 / 是必须挂载的﹐而且一定要先于其它 mount point 被挂载进来。
       其它 mount point 必须为已创建的目录﹐可任意指定﹐但一定要遵守必须的系统目录架构原则 (FHS)
       所有 mount point 在同一时间之内﹐只能挂载一次。
       所有 partition 在同一时间之内﹐只能挂载一次。
       如若进行卸载﹐您必须先将工作目录移到 mount point(及其子目录) 之外。

我们直接查阅一下 /etc/fstab 这个文件的内容

之前我们分区后使用的是临时挂载的方式,重新开机后我们需要再次进行分区,这次我们打算分成两个主分区(8G+8G),一个扩展分区:包含两个逻辑区(2G+2G)

添加两个主分区:

添加扩展区:

然后w指令写入并利用partprobe 更新 Linux 核心的分区表信息

最后,格式化

设置挂载:

首先我们在外面mkdir data1文件夹,利用pwd获取当前文件路径为/home/jack

然后我们利用nano /ect/fstab指令往里面添加如下文本:

最后,我们利用指令mount -a自动挂载并查询挂载是否成功:

接下来我们利用同样的方法将其余的分区分别挂载

但是当我们重新去mount -a指令时,发现无法挂载

这个时候,我们需要重新格式化再挂载,如下所示:

这样,我们就解决了。

猜你喜欢

转载自blog.csdn.net/xuanyin235/article/details/83176782
今日推荐