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的总量,使用量,剩余量等)

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

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

 

53、索引式文件系统

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

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

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

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

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

 

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

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

 

54、磁盘重组

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

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

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

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

 

55、块群组

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

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

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

block group的组成:

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

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

    

block 的更多限制:

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

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

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

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

 

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

è¿éåå¾çæè¿°

一个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

小结:

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

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

所谓间接,就是再用一个块(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。

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  导出到本地,查看具体参数项。后续补充

[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)文件系统描述

5)区块映射表

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内容,如下:

和文件一样,一个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数据。

流程图如下:

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

 

书本例子:

查找 /etc/passwd

 

57、文件读写性能问题

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

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

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

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

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

 

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

按照以上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、文件系统和内存的关系

 

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。此处的活动登录区(就是日志区啦),完成的就是这个事情。

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

3)实时运行区

有点临时目录存放临时文件,最后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的开销。

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

限制:

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

软连接:

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

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

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

 

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

 

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

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

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 /

  • 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,做到“备而不用”则可。

 

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

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值