linux 鸟哥私房菜 从0到1 笔记(七)-未完待续

磁盘与文件系统 —— 本章非常重要,笔记写得比较单薄,后续会做一个专题,结合hdfs /alluxio的文件/块管理来介绍。

 

50、linux下查看磁盘分区的文件系统格式

1)df -T 只可以查看已经挂载的分区和文件系统类型。

[root@gulonglong-bees-manager-2-normal-host-10-101-93-200-vm ~]# df -T
Filesystem     Type  1K-blocks     Used Available Use% Mounted on
/dev/vda1      ext4   41147472 10011532  29039124  26% /
tmpfs          tmpfs   1961236       16   1961220   1% /dev/shm


2)fdisk -l 可以显示出所有挂载和未挂载的分区,但不显示文件系统类型。

[root@gulonglong-bees-manager-2-normal-host-10-101-93-200-vm ~]# fdisk -l

Disk /dev/vda: 42.9 GB, 42949672960 bytes
255 heads, 63 sectors/track, 5221 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000566fa

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *           1        5221    41936658+  83  Linux


3)parted -l 可以查看未挂载的文件系统类型,以及哪些分区尚未格式化。

Model: Virtio Block Device (virtblk)
Disk /dev/vda: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  42.9GB  42.9GB  primary  ext4         boot


4)lsblk -f 也可以查看未挂载的文件系统类型。

[root@gulonglong-bees-manager-2-normal-host-10-101-93-200-vm ~]# lsblk -f
NAME   FSTYPE LABEL UUID                                 MOUNTPOINT
vda
`-vda1 ext4         e700044b-a7cf-4e33-b04c-99b29725af6e /

 

5)file -s /dev/sda3

[root@gulonglong-bees-manager-2-normal-host-10-101-93-200-vm ~]# file -s /dev/vda1
/dev/vda1: Linux rev 1.0 ext4 filesystem data (needs journal recovery) (extents) (large files) (huge files)

注意:以上例子,虚拟机是vda,物理机是sda;

 

51、文件系统分区后,分区需要格式化,才能使用。

格式化的目的:每种os存放的文件 属性和权限各不相同,为了存放这些数据,就需要将分区进行格式化,以便文件系统能够识别和使用。

 

52、文件数据: 一个文件包含哪些内容

1)文件的真实内容     —— 存放在 data block区块

2)文件的权限(rwx)和众多文件属性(用户、组、时间等) ——  存放在inode

3)superblock 超级区块,记录整个文件的整体信息(包括inode 和 block的总量,使用量,剩余量等)

linux 鸟哥私房菜 从0到1 笔记(七)-未完待续_第1张图片

每个文件都有一个inode(inode有编号);inode记录了文件数据所在block的位置信息(记录的是block编号);

所以关系是:  file A -> inodeA编号 -> [block编号1,block编号2...] -> block1,block2... 

 

53、索引式文件系统

1)传统文件系统(老式) EXT2(inode)

linux 鸟哥私房菜 从0到1 笔记(七)-未完待续_第2张图片

灰色inode区域,蓝色block区域;

文件A 对应inode4,文件一共拆分成4个block,分别为2-7-14-15。

获取文件A的数据时,先查询inode4,获取到4个block编号,然后在block区域并行读取4个block。

这种数据获取的方法,称之为 索引式文件系统。

 

2)U盘的文件系统是FAT格式,不同于上面的索引方式,没有inode的存在。

linux 鸟哥私房菜 从0到1 笔记(七)-未完待续_第3张图片

每个block记录了下一个block编号位置,所以只能一个个block逐个串行读取。

 

54、磁盘重组

一个文件的块写入时,过于离散,降低文件读取的性能。

磁盘重组,是将一个文件的所有块进行汇集在一起,加快文件读写。

EXT式是通过inode 索引式文件系统,理论上不需要进行磁盘重组,不过频繁的删除移动新增操作,也可能到时部分block过于离散。

线上经验,实际上几乎不进行过磁盘重组。

 

55、块群组

背景:将整个文件系统的block和inode 都放置在一处,如果数据量达到数百GB,那么block和inode的管理就很难了。

快群组:设置block group ,每个block group 有独立的superblock,快群组之间相互独立,如下:

linux 鸟哥私房菜 从0到1 笔记(七)-未完待续_第4张图片

特别注意:只是将原来单一的block 大区划分为多个block group,它们还是对应同一个文件系统。

block group的组成:

1)data block(数据区块)  存放数据的block区域;

ETX2 系统:默认块大小可以是1KB;支持大于16GB的单一文件;整个文件系统的总文件大小是2TB;

    linux 鸟哥私房菜 从0到1 笔记(七)-未完待续_第5张图片

block 的更多限制:

linux 鸟哥私房菜 从0到1 笔记(七)-未完待续_第6张图片

特别注意:一个block只能存放一个文件的数据,就算有剩余空间也不能被其他文件共享使用。

block过大,对于小文件,利用率过低。

block过小,对于大文件,占用过多block,对应的inode需要存储更多的block编号,影响读写性能

现在磁盘大小都很大容量了,基本上会直接选用4KB的块大小。

 

2)inode table  保存文件的属性 和 文件数据 落在哪些编号的block上。

linux 鸟哥私房菜 从0到1 笔记(七)-未完待续_第7张图片

linux 鸟哥私房菜 从0到1 笔记(七)-未完待续_第8张图片

è¿éåå¾çæè¿°

一个inode需要4Byte,假设一个文件400MB且block size 4KB,则需要切成十万个block;inode table无法保存如此多的block编号。

128Bytes能记录的block块是有限的,因此inode采用12个直接地址映射,1个一级地址,1个二级地址,1个三级地址,

因此块大小为1k的文档的最大值为12k+256k+256*256k+256*256*256k约等于16G

linux 鸟哥私房菜 从0到1 笔记(七)-未完待续_第9张图片

小结:

文件小时,使用直接映射;

文件大时,使用间接映射。

所谓间接,就是再用一个块(1KB)来当做记录block的记录区来使用,那么每个block编号 4Byte,多用一个块来记录block编号,就扩展了1k / 4Byte = 256 个编号。

直接映射: 12 个block

一级映射: (1k / 4Byte)个block

二级映射: (1k / 4Byte)* (1k / 4Byte)  个block

二级映射: (1k / 4Byte)* (1k / 4Byte)* (1k / 4Byte)  个block

每隔真实block的块为1KB,所以这个文件的总大小可以为 1KB * 总块数 = 16G

 

3)superblock  没有它,就没有filesystem。

linux 鸟哥私房菜 从0到1 笔记(七)-未完待续_第10张图片

superblock 默认1024Bytes,虽然每个block group 都有一个superblock,实际上只有第一个有效,其他都是对第一个block group的superblock的备份。

用于查看superblock的命令工具: dumpe2fs

blkid
/dev/vda1: UUID="e700044b-a7cf-4e33-b04c-99b29725af6e" TYPE="ext4"

dumpe2fs /dev/vda1  > my_superblock.info  导出到本地,查看具体参数项。后续补充

linux 鸟哥私房菜 从0到1 笔记(七)-未完待续_第11张图片

[root@gulonglong-bees-manager-2-normal-host-10-101-93-200-vm ~]# dumpe2fs /dev/vda1 |grep "Block size"
dumpe2fs 1.41.12 (17-May-2010)
Block size:               4096   当前block size 大小

 

4)文件系统描述

linux 鸟哥私房菜 从0到1 笔记(七)-未完待续_第12张图片

5)区块映射表

linux 鸟哥私房菜 从0到1 笔记(七)-未完待续_第13张图片

6)inode映射表

特别注意:block 和inode 都是格式化时 固定好了,不能改变,除非重新格式化。

 

补充:文件系统和分区、block group的关系说明

传统文件系统,一个partition就是一个filesystem,默认有P1~P4。一般我们采用P1作为主分区,P2作为延伸分区并虚拟出多个逻辑分区。所以,实际上P1+P2(L5-L9),对应的也只是一个文件系统。

EXT2开始,系统将block区块,划分为多个 区块群组 block group,每个block group有独立完整的 inode/block/superblock系统。同样,多个block group 构成一个完整的文件系统。原则上一个文件系统应该只有一个superblock(管理整个文件系统的整体信息),但是除了第一个block group 有 superblock之外,其他block group 也可能有superblock,不过它们只是对前者superblock的备份,用于文件系统的故障恢复啦。

 

56、目录的文件数据

按照上面所说,创建一个文件,会为这个文件分配一个inode 以及 文件拆分的多个block块。

inode记录了文件的权限和属性,block记录文件的真实数据。—— 文件的文件数据。

同样地,创建一个目录,也会为这个目录分配一个inode(目录也是一种特殊的文件)以及至少一个block。

inode的作用相同,至于这个block,记录的是这个目录下的一系列文件名 和 这些个文件名占用的inode编号。

目录的block内容,如下:

linux 鸟哥私房菜 从0到1 笔记(七)-未完待续_第14张图片

和文件一样,一个inode 4Bytes,如果该目录下有太多文件,一个block不足以保存时,os会给与这个目录再多一个block来保存inode信息。 一个block 1KB,一个inode 4Bytes,所以每增多一个block,可以多保存 256个文件的元数据。

小结:

综合文件和目录的“元数据”,可以看到inode 本身不保存 文件名,文件的文件名是保存在其所属目录的block里面。

当我们要读取某个文件时,必须要经过目录的inode 和 block,才能找到文件的inode编号。

举例说明:要查找的文件是/tmp/anaconda-ks.cfg

一)定位目录

1)整个目录树是从根目录开始的,所以系统通过挂载的信息可以查找到挂载点的inode编号,也就找到根目录的inode内容。

2)通过根目录的inode,找到根目录的block内容:通过目录下的文件名 反向查找该文件的inode编号。

3)循环1)和 2)的过程,根据目标path(/tmp/anaconda-ks.cfg),一层层往下读,直到查找到目标path的文件(anaconda-ks.cfg)为止。

二)定位文件

1)首先在目录的block中,描述了anaconda-ks.cfg的文件名反向映射到inode编号 53735697。 一一映射

2)然后根据inode编号53735697 找到文件 anaconda-ks.cfg。

3)找到anaconda-ks.cfg后,查看里面的inode,找到文件拆解后对应的所有block的编号。

4)根据文件映射所有block编号,找到在数据区块(或者block group)中的一个或多个block

5)最后进行多个block的并行读取。

粗糙地理解为,首先通过挂载点找到根目录,然后遵循“上层目录 inode-> 上层目录block->下层目录inode->下层目录block”的解析过程来递归查找各级子目录,直到找到目标文件,然后“文件inode->文件block” 最后并行读取文件各个block数据。

流程图如下:

linux 鸟哥私房菜 从0到1 笔记(七)-未完待续_第15张图片

这个过程中,还涉及各级子目录的权限校验,此处不详。

 

书本例子:

查找 /etc/passwd

linux 鸟哥私房菜 从0到1 笔记(七)-未完待续_第16张图片

 

57、文件读写性能问题

一个文件过大,例如有100GB。

写文件时,块分配策略 基本都是分配空闲可用的块来存储文件的部分数据,即该文件的块编号可能不是连续的,即非连续存储。

假设,该文件的块非常离散时。

读文件时,磁盘的机械手臂在盘片中移动幅度可能会很大,从而造成读性能大大降低。

此时,可以将数据先复制出来,然后对filesystem进行格式化,再重新放入数据。——实际上,线上很少有这样的机会。

 

58、创建一个目录或文件的流程

linux 鸟哥私房菜 从0到1 笔记(七)-未完待续_第17张图片

按照以上block group的组成,一般将 data block 和 inode table 称为数据存放区域。而将 superblock 、block bitmap、inode bitmap 称为 元数据。元数据的信息是经常变动的。

创建一个文件和目录,都需要经历上面的4个过程,但是如果中途发生异常就退出了,那么metadata的数据可能和 数据存放区域的数据不一致了。—— 数据不一致 inconsistent

老式的文件系统,会在开机/文件系统初始化时,检查数据不一致情况,但是这个检查是非常昂贵的,因为需要搜索整个文件系统,针对元数据和数据存放区域的比对,非常耗时。 

为了解决这一问题,使用 日志式文件系统(journal fileSystem)。

journal fileSystem

在文件系统中,规划出一个区域,专门用来记录 “写入/修改文件”的步骤,从而进行文件一致性检查。

这种方式,记录了所有文件的操作审计,如果这个文件在操作过程发生异常,只要通过日志,就可以直接定位这个文件进行对一个处理,而不必对整个文件系统进行扫描比对。

前面的章节,提及到dumpe2fs命令查看superblock,包含了journal filesystem的信息,如下:

Journal inode:            8
Journal backup:           inode blocks
Journal features:         journal_incompat_revoke
Journal size:             128M
Journal length:           32768
Journal sequence:         0x007fdb67
Journal start:            23673

默认inode编号=8,记录了journal区的block信息,使用了128MB来处理日志。

 

58、非同步处理 asynchronously

背景:文件保存在磁盘,磁盘数据读入内存,CPU才能调用内存中的数据进行运算。编辑一个大文件时,可能需要不定时地执行一下保存动作。由于磁盘写入的速度远远低于内存写入,往往耗在磁盘的写入/读取的等待上。

解决:当文件系统载入一个文件到内存后,没经过修改,内存中的文件是“clean”。然后对文件进行编辑,内存中的文件标志为“dirty”。此时,所有操作都是内存中,并没有写入到磁盘。

到此,文件系统通过“非同步处理”,定时将内存中“dirty”的数据写入到磁盘,以保持磁盘的数据和内存中的数据一致性。

 

59、热数据和内存的缓存区

为了加快数据读取能力,应该避免每次都从磁盘去拿取,而是从内存中读取。

文件系统会将常用的数据放在内存的缓存区,以加快文件系统的读取速度。

 

60、文件系统和内存的关系

linux 鸟哥私房菜 从0到1 笔记(七)-未完待续_第18张图片

 

61、挂载点的意义

默认系统只有一个block 区,为了避免单点问题,所以设置了 block group;

一个文件系统,包含一个或多个block group ,block group 有完整的 inode 、 block 、superblock。

filesysem 都必须连接都 目录树,才能被正常使用。 

这个连接的桥梁,就是 挂载点的意义。

挂载点 就是 目录, 这个目录就是该文件系统的入口。

后续补充,查找当前有多少个挂载点(文件系统),各个目录落在哪个block group。

 

62、XFS 

centos7 开始,默认的ext4 变成了 xfs文件系统。

ext4 格式化过慢,虚拟化支持不够。

xfs 作为大容量磁盘和高性能文件系统,兼有ext4的所有功能。

xfs 数据分布:数据区data section、文件系统活动登录区log section、实时运行区 realtime section。

1)数据区,

划分为多个存储区群组allocation group (类似于block group),分别放置文件系统的数据。

a、整个文件系统的superblock

b、剩余空间的管理机制

c、inode的分配与跟踪

inode和block 是动态分配,格式化动作极快。—— 不同于 block group是一开始格式化好的。

inode和block的容量可以更大,但是受linux 内核限制,还是保持和ext4的数值则可。

2)文件系统活动登录区,简称 日志区

前面提及到文件数据的一致性,采用日志式文件系统journal filesystem。此处的活动登录区(就是日志区啦),完成的就是这个事情。

linux 鸟哥私房菜 从0到1 笔记(七)-未完待续_第19张图片

日志活动非常频繁,xfs 可以采用外部的磁盘来充当log section,例如SSD磁盘,来加快硬性处理。

3)实时运行区

linux 鸟哥私房菜 从0到1 笔记(七)-未完待续_第20张图片

有点临时目录存放临时文件,最后commit 移动到目标目录的意味。

此处,仅以ext4 和 xfs 做比对, 不对xfs做详细介绍。

 

63、简单的文件操作

1)df 针对整个系统,读取的是superblock的信息,所以非常快。

[root@gulonglong-bees-manager-2-normal-host-10-101-93-200-vm ~]# df -lh
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        40G  9.6G   28G  26% /
tmpfs              1.9G   16K  1.9G   1% /dev/shm

Filesystem :挂载的分区

size:目录或文件的总大小

Mounted on:磁盘挂载的目录,即挂载点,

[root@gulonglong-bees-manager-2-normal-host-10-101-93-200-vm ~]# df -ih
Filesystem     Inodes IUsed IFree IUse% Mounted on
/dev/vda1        2.5M   38K  2.5M    2% /
tmpfs            479K     5  479K    1% /dev/shm

Inodes: 各个分区可用的inode数量。inode数量就是文件的数量。目录也是一种文件。

2)du 针对特定目录,直接到文件系统去收集信息,响应相对慢些。

[root@gulonglong-bees-manager-2-normal-host-10-101-93-200-vm ~]# du -sh /tmp
40M    /tmp

 

3)软连接 / 硬连接

硬链接:

文件名和目录有关,文件内容和inode有关。

多个文件名对应同一个inode,就是硬链接。

同一个目录下,创建两个文件名,指向同一个inode。

注意:联想目录的block内容,其实只是多了一条“文件inode号 -> 文件名”记录而已,不会增加inode和block的开销。

好处:数据安全,误删了第一个文件名,可以通过另一个文件名来继续访问数据。

限制:

linux 鸟哥私房菜 从0到1 笔记(七)-未完待续_第21张图片

不能硬链接到目录,可想而知,目录下的文件或者嵌套子目录,一层层递归去建立映射记录,会相当复杂,引发不可知异常。

软连接:

创建一个文件,指向原来的文件。

好处:数据安全,和硬链接一样。不同的是虚拟的连接,不涉及block/inode 映射关系的新增变更,所以支持目录的软连接。

和硬链接对比,似乎硬链接更安全,但是软连接更灵活。

 

关于命令,此处不做举例,以后做一篇专题,列举所有命令的使用示例和返回结果的术语解释。

 

64、磁盘的分区、格式化、校验和挂载

1)新增一块磁盘的流程:

linux 鸟哥私房菜 从0到1 笔记(七)-未完待续_第22张图片

partition 设置多大? inode和block的数量几何? 是否加入journa?

2)磁盘分区

方式:MBR 和 GPT

分区工具:parted

a、查看磁盘分区信息

  • lsblk 列举所有磁盘

[root@gulonglong-bees-manager-2-normal-host-10-101-93-200-vm ttt]# lsblk
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda    252:0    0  40G  0 disk
`-vda1 252:1    0  40G  0 part /

linux 鸟哥私房菜 从0到1 笔记(七)-未完待续_第23张图片

  • lsblk -f  和  blkid  查看 设备的UUID等参数;

[root@gulonglong-bees-manager-2-normal-host-10-101-93-200-vm ttt]# blkid
/dev/vda1: UUID="e700044b-a7cf-4e33-b04c-99b29725af6e" TYPE="ext4"

  • parted 列出磁盘的分区表类型和分区信息

[root@gulonglong-bees-manager-2-normal-host-10-101-93-200-vm ttt]# parted
GNU Parted 2.1
Using /dev/vda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted)

b、进行磁盘分区

MBR 采用 gdisk 进行分区;

GPT 采用 fdisk 进行分区;

。。。。。。未完

 

65、swap

早期的os内存非常不足,内存不足时,数据会临时放到swap处,以便内存可以继续为程序服务。不过,swap是用磁盘来存放数据,等同于磁盘和内存进行数据交互。因为CPU从内存读取数据,内存和磁盘交互,如此一来,读取性能大降,CPU运算性能也拖慢了。

目前内存都从32GB~飙到64GB,甚至128GB等,基本上很少用到swap,保留1GB,做到“备而不用”则可。

 

本篇笔记主要梳理理论及其概念关系,暂时到此,实践性笔记后续补充。

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(2020-linux)