鸟哥的Linux私房菜-第七章、Linux 磁盘与文件系统管理

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


前言

本章介绍了磁盘和文件系统的管理,重点是制作文件系统,包括分区、格式化与挂载等内容。


一、认识 Linux 文件系统

1.文件系统特性

格式化:由于各个操作系统的文件属性/权限不同,为了能够被操作系统使用,存放文件所需的数据,需对分区格式化。
文件系统:一个可被挂载的数据(定义:操作系统用于明确存储设备或分区上文件的方法和数据结构;即在存储设备上组织文件的方法),由三部分组成:

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

2.Linux 的 EXT2 文件系统

文件系统一开始 就将 inode 与 block 规划好了,除非重新格式化(或者利用 resize2fs 等 指令变更文件系统大小),否则 inode 与 block 固定后就不再变动。
EXT2文件系统在格式化时区分为多个区块群组(block group),前面还有一个开机扇区(boot sector),这个开机扇区可以安装开机管理程序。每一个区块群组(block group)的六个主要内容:

(1)data block (数据区块)

在 Ext2 文件系统中所支持的 block 大小有 1K, 2K 及 4K 三种,block限制如下:

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

(2)inode table (inode 表格)

inode 记录的文件数据至少有下面这些:

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

同时,inode还有以下特点:

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

EXT2 的 inode / block 与文件大小的关系: inode 记录 block 号码的区域定义为12个直接,一个间接, 一个双间接与一个三间接记录区。间接指再拿一个 block 来当作记录 block 号码的记录区,如果文件太大时, 就会使用间接的 block 来记录号码。

inode结构示意图

  • 总额:将直接、间接、双间接、三间接加总,得到 12 + 256 + 256256 + 256256*256 (K) = 16GB

(3)Superblock (超级区块)

主要记录信息:

  • block 与 inode 的总量;
  • 未使用与已使用的 inode / block 数量;
  • block 与 inode 的大小 (block 为 1, 2, 4K,inode 为 128Bytes 或 256Bytes);
  • filesystem 的挂载时间、最近一次写入数据的时间、最近一次检验磁盘 (fsck)的时间等文件系统的相关信息;
  • 一个 valid bit 数值,若此文件系统已被挂载,则 valid bit 为 0 ,若未被挂载,则 valid bit 为 1 。

(4)Filesystem Description (文件系统描述说明)

描述每个 block group 的开始与结束的 block 号码, 以及说明每个区段 (superblock, bitmap, inodemap, data block) 分别介 于哪一个 block 号码之间。可使用dumpe2fs [-bh] 设备文件名 来查询,其中设备文件名可通过blkid命令查询。

(5)block bitmap (区块对照表)

block bitmap 中记录 block 是否使用,可以很快速的找到可使用的空间来处置文件。

(6)inode bitmap (inode 对照表)

这个其实与 block bitmap 是类似的功能,只是 block bitmap 记录的是使用与未使用的 block 号码, 至于 inode bitmap 则是记录使用与未使用的 inode 号码。

3.与目录树的关系

(1)目录

创建目录时,文件系统会分配一个 inode 与至少一块 block 给该目录。其中,inode 记录该目录的相关 权限与属性,并可记录分配到的那块 block 号码; 而 block 则是记录在 这个目录下的文件名与该文件名占用的 inode 号码数据。

(2)文件

创建文件时,ext2 会分配一个 inode 与相对于该文件大小的 block 数量给该文件。

(3)目录树读取

因为文件名是记录在目录的 block 当中, 因 此当我们要读取某个文件时,就务必会经过目录的 inode 与 block ,然 后才能够找到那个待读取文件的 inode 号码, 最终才会读到正确的文件 的 block 内的数据。
由于目录树是由根目录开始读起,因此系统通过挂载的信息可以 找到挂载点的 inode 号码,此时就能够得到根目录的 inode 内容,并依 据该 inode 读取根目录的 block 内的文件名数据,再一层一层的往下读 到正确的文件名。

(4)filesystem 大小与磁盘读取性能

当文件太大,同时block并非连续,所以读取时磁头频繁扫动。这种情况可通过格式化和合理分区来解决。

4.Linux 文件系统的运行

当系统载入一个文件到内存后,如果该文件没有被更动过,则在 内存区段的文件数据会被设置为干净(clean)的。 但如果内存中的文 件数据被更改过了(例如你用 nano 去编辑过这个文件),此时该内存 中的数据会被设置为脏的 (Dirty)。此时所有的动作都还在内存中执 行,并没有写入到磁盘中! 系统会不定时的将内存中设置为“Dirty”的 数据写回磁盘,以保持磁盘与内存数据的一致性。 你也可以利用sync指令来手动强迫写入磁盘。

5.挂载点的意义 (mount point)

挂载点一定是目录,该目录为进入该文件系统的入口。

6.XFS 文件系统简介

xfs 文件系统在数据的分佈上,主要规划为三个部份,一个数据区(data section)、一个文件系统活动登录区(log section)以及一个实 时运行区(realtime section)。inode与 block 都 是系统需要用到时, 这才动态配置产生,所以格式化动作超级快。

二、文件系统的简单操作

1.磁盘与目录的容量

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

(1)df

df [-ahikHTm] [目录或文件名],其中-h代表以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;-i代表不用磁盘容量,而以 inode 的数量来显示。

(2)du

du [-ahskm] 文件或目录名称,其中-s代表列出总量而已,而不列出每个各别的目录占用容量。

2.实体链接与符号链接: ln

在 Linux 下面的链接文件有两种,一种是类似 Windows 的捷径功能的文件,可以让你快速的链接到目标文件(或目录); 另一种则是通过文件系统的 inode 链接来产生新文件名,而不是产生新文件,这种称为实体链接 (hard link)。

(1)Hard Link (实体链接, 硬式链接或实际链接)

ln 来源文件 目标文件
hard link 是在某个目录下新增一笔文件名链接到某 inode 号码的关连记录。最大的好处就是“安全”, 如果你将任何一个“文件名”删除,其实 inode 与 block 都还是存在的。但有两个限制:不能跨 Filesystem;不能 link 目录。
hard link 进行“文件的链接”时,在 ls -l 所显示的第二字段会增加一。

(2)Symbolic Link (符号链接,亦即是捷径)

ln -s 来源文件 目标文件
Symbolic link 就是在创建一个独立的文件,而这个文件会让数据的读取指向他 link 的那个文件的文件名,所以,当来源文件被删除之后,symbolic link 的文件会无法打开。
Symbolic Link 与 Windows 的捷径可 以给他划上等号,由 Symbolic link 所创建的文件为一个独立的新的文件,所以会占用掉 inode 与 block

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

新增磁盘步骤:

  • 1.对磁盘进行分区,以创建可用的 partition ;
  • 2.对该 partition 进行格式化 (format),以创建系统可用的 filesystem;
  • 3.若想要仔细一点,则可对刚刚创建好的 filesystem 进行检验;
  • 4.在 Linux 系统上,需要创建挂载点 (亦即是目录),并将他挂载上来。

(1)观察磁盘分区状态

a. lsblk 列出系统上的所有磁盘列表

lsblk,列出本系统下的所有磁盘与磁盘内的分区信息;
lsblk 设备名,列出指定磁盘与磁盘内的分区信息。

b. blkid 列出设备的 UUID 等参数

blkid列出设备名称、UUID 名称以及文件系统的类型 (TYPE)。

c. parted 列出磁盘的分区表类型与分区信息

parted 设备名称 print,列出指定磁盘的相关数据。

(2)磁盘分区: gdisk/fdisk

MBR 分区表请 使用 fdisk 分区, GPT 分区表请使用 gdisk 分区。

gdisk

gdisk 设备名称,进入系统操作程序,只要离开 gdisk 时按 下“q”,那么所有的动作“都不会生效!”,相反的, 按下“w”就是动作生效的意思。可以使用问号 (?) 来查看可用指令,常用命令如下:

  • d delete a partition : 删除一个分区
  • n add a new partition : 增加一个分区
  • p print the partition table : 印出分区表
  • q quit without saving changes : 不储存分区就直接离开 gdisk
  • w write table to disk and exit : 储存分区操作后离开 gdisk
用gdisk新增分区
Command (? for help): n # 就是这个!所以开始新增的行为!
Partition number (4-128, default 4): 4 # 默认就是 4 号,所以也能 enter 即可!
First sector (34-83886046, default = 65026048) or {+-}size{KMGTP}: 65026048 # 也能 enter
Last sector (65026048-83886046, default = 83886046) or {+-}size{KMGTP}: +1G # 决不要 enter
Command (? for help): W #储存分区操作后离开 gdisk

partprobe -s
partprobe 更新 Linux 核心的分区表信息

partprobe -s后才可以使用lsblk查到新增或删除的磁盘分区。

用 gdisk 删除一个分区
Command (? for help): d
Partition number (1-6): 6
Command (? for help): w 

partprobe -s

fdisk

操作与gdisk几乎一样。

(3)磁盘格式化(创建文件系统)

格式化指令:make filesystem, mkfs,即mkfs.xfs和mkfs.ext4。

mkfs.xfs 设备名称用于创建 xfs 文件系统。

4.文件系统检验

文件系统错乱时使用xfs_repair 或 fsck.ext4 设备名称检查文件系统。
执行 xfs_repair/fsck.ext4 时, 被检查的 partition 不可挂载到系统上,即是需要在卸载的状态进行检查。

5.文件系统挂载与卸载

文件系统挂载时需注意:

  • 单一文件系统不应该被重复挂载在不同的挂载点(目录)中;
  • 单一目录不应该重复挂载多个文件系统;
  • 要作为挂载点的目录,理论上应该都是空目录才是。
[root@study ~]# mount -a #依照配置文件 /etc/fstab 的数据将所有未挂载的磁盘都挂载上来
[root@study ~]# mount [-l] #显示目前挂载的信息
[root@study ~]# mount LABEL='' 挂载点
[root@study ~]# mount UUID='' 挂载点
[root@study ~]# mount  设备文件名 挂载点
[root@study ~]# umount 设备文件名或挂载点 #将设备文件卸载

6.磁盘/文件系统参数修订

xfs_admin 修改 XFS 文件系统的 UUID 与 Label name
tune2fs 修改 ext4 的 label name 与 UUID

四、设置开机挂载

开机挂载 /etc/fstab 及 /etc/mtab

系统挂载的限制:

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

[设备文件名/UUID/LABEL] [挂载点] [文件系统] [文件系统参数] [dump] [fsck]

设置完毕后使用 mount -a 测试语法是否正确!!!

五、内存交换空间(swap)之创建

1.使用实体分区创建swap

  • 1.先进行分区,gdisk —> partprobe
  • 2.创建 swap 格式(格式化),mkswap 分区文件名
  • 3.载入,swapon 分区文件名,使用free查看前后变化

2.使用文件创建swap

六、文件系统的特殊观察与操作

1.磁盘空间之浪费问题

一个 block 只能放置 一个文件, 因此太多小文件将会浪费非常多的磁盘容量

2.利用 GNU 的 parted 进行分区行为(Optional)


总结

重点了解分区、格式化与挂载,分别惯用的指令为:gdisk, mkfs, mount三个指令。

猜你喜欢

转载自blog.csdn.net/qq_39271952/article/details/128357377