文件系统的组成
Linux文件系统(filesystem)组成
superblock:记录整个文件系统的信息,包括inode、block的总量、使用量、剩余量,以及文件系统的格式和其他相关信息
inode:记录文件或者目录的属性和数据所在的block号码,一个文件或者目录占用一个inode
block:记录文件的实际数据
inode和block都会有相应的唯一编号,inode中存储有文件数据存放的block号码,这种数据存取的方式成为索引式文件系统。
FAT格式,每个block都会存放下一个block号码,当存放数据的block太过离散,就会使得文件读取时间增加。碎片整理就是将离散的文件数据整理在一起提高文件读取效率
EXT2将文件系统分为多个区块群组(block group),每个区块群组有独立的superblock/inode/block。文件系统的最前端有一个Boot Sector,用来存放开机引导程序
data block
datablock的ETX2文件系统中大小主要有种:1K、2K、4K,在文件系统创建时大小就已经确定了
block大小
1K
2K
4K
单一文件最大容量
16GB
256GB
2T
文件系统最大容量
2T
8T
16T
1、block大小和数量在文件系统建立后不能改变,除非重新格式化
2、每个block只能存放一个文件的数据
3、当文件大小超过block大小,则会占用多个block
4、被使用的block内的剩余空间不能再被使用,所以文件所占用的存储空间一般大于文件实际大小,造成空间浪费,尤其是小文件
inode table
inode记录文件或目录的属性和实际存放数据的block号码
1、文件的权限(rwx)
2、文件所属用户和组(owner和group)
3、文件的容量(文件实际大小还是存储占用大小???)
4、ctime
5、atime
6、mtime
7、特殊权限SUID\SGID\SBIT
8、文件内容的实际指向(pointer)(block号码???)
EXT2的inode的属性:
1、每个inode占用128Bytes,ext4和xfs占用256Bytes
2、每个文件只占用一个inode,inode数量在文件系统创建时也已经确定,因此文件系统能够存放的数量更inode数量有关
3、系统读取文件时,先读取inode内容,判断用户身份对应的权限,权限匹配才能够读取block内容
4、每个block号码需要占用inode 4Bytes的容量,当文件容量太大时,直接使用inode无法记录全部的block号码。因此inode记录的block号码区域分为12个直接、1个间接、1个二级间接和1个三级间接单元
直接单元是指存储的block号码直接指向文件存储数据
间接单元是指存储的block号码指向的block里面存储的是剩余的一部分直接单元
二级间接单元是指存储的block号码指向的block里面存储的是剩余的一部分间接单元
三级间接单元是指存储的block号码指向的block里面存储的是剩余的一部分二级间接单元
所以,一个inode记录的文件容量,以1K block为例,
(1)12个直接,12*1K
(2)1个间接,一个block可以存储 1K/4Bytes=256个block号码,256*1K
(3)1个二级间接,256*256*1K
(4)1个三级间接,256*256*256*1K
所以总容量为 12*1K + 256*1K + 256*256*1K + 256*256*256*1K = 16GB
EXT4为256Bytes的inode,增加存储有ACL、SELinux等信息
superblock:
superblock的大小一般来说有1024Bytes,记录的信息有
1、inode和block的总量
2、inode和block的使用量和未使用量
3、inode和block的大小
4、文件系统的最近一次挂载时间、最近一次文件写入时间、最近一次文件系统检测(fsck)时间等
5、一个valid bit数值,'0/1'代表文件系统'挂载/未挂载'
每个block group都可能存在superblock,但是一个文件系统只有一个superblock,所以第一个block group含有superblock,其他则没有,如果有,则为superblock的备份,用来进行系统恢复
文件系统描述说明(filesystem description)
记录每个block group的起始与结束的block号码,说明每个区段(superblock, bitmap, inodemap, data block) 分别介于哪一个 block 号码之间
区块对照表(block bitmap)
记录使用和未使用的block号码
inode对照表(inode bitmap)
记录使用和未使用inode号码
查询EXT2/3/4的superblock信息
dumpe2fs [-bh] filesystem
-b,列出保留坏轨的部分
-h,仅列出superblock的信息
目录树
在创建目录时,系统会分配一个inode和至少一个block,inode记录目录的权限和属性等信息,而block则是记录目录里面的文件名以及对应的inode号码
inode number
filename
12345678
23456789
...... a
b
......
文件
在创建文件时,系统会分配一个inode和若干个block,由于文件的inode里不包含文件的名称,因此即使有w权限也不能修改文件名。如果要修改文件名,只有在文件所在相关目录下具有w权限。(需要x权限???)
目录树的读取
例如/etc/passwd文件系统在读取时:
(1)由根目录/,读取根目录的inode,判断相关权限,寻找到存放目录树数据的block,读取数据
(2)根据上述block寻找到etc/的inode,读取etc/的inode,判断相关权限,寻找到存放目录树数据的block,读取数据
(3)根据上述block寻找到passwd的inode,读取passwd的inode,判断相关权限,寻找到存放文件数据的block,读取数据
EXT2/3/4文件的存取和日志式文件系统的功能
创建文件时:
1、判断写入文件的目录是否有w和x权限
2、根据inode bitmap寻找没有使用的inode,将文件属性和权限写入
3、根据block bitmap寻找没有使用的block,将文件数据写入,并更新inode里面的block号码
4、将上述步骤的inode和block号码同步更新到inode bitmap和block bitmap,并更新superblock(更新的原因???)
inode table和datablock成为数据存放区域,superblock、inode bitmap、block bitmap成为metadata(中介数据)
数据不一致的状态(inconsistent)
当文件新增时产生异常中断,中介数据和数据存放数据就有可能不匹配的情况,就会发生数据不一致的状态
EXT2文件系统中,系统在开机时会通过superblock里面的valid bit与filesystem state是否为clean等来判断是否强制进行数据一致性检查,检查通过程序e2fsck进行。然而,但文件数据比较多时,耗费时间会比较多
日志式文件系统
在filesystem中划出一块日志记录区域,来记录文件写入或修改时的步骤
1、在文件写入之前,在日志记录区块记录文件准备要写入的一些信息
2、文件权限属性和数据的写入;metadata数据的更新
3、上述步骤完成后,日志区块更新该文件完成的记录
当出现写入文件异常中断时,通过检查日志记录区块就可以知道哪个文件,进行针对性的修复,而不必对整个文件系统进行一致性检查,达到快速修复的目的。EXT2不具备这个特性,需要升级至EXT3/4
Linux文件系统的运行
非同步处理:但一个文件被载入内存之后,如果文件未被修改,则被标志为clean,反之,则被标志为dirty。系统会不定时将dirty数据写入磁盘来保证数据一致性。通过命令sync可以强制将dirty数据立刻写入磁盘
挂载点的意义(mount point)
将文件系统与目录结合的动作称为"挂载",挂载点一定是目录。文件系统需要挂载之后才能够使用。
其他linux支持的文件系统与VFS(virtual filesystem switch)
查看linux支持的文件系统 ls -l /lib/modules/$(uname -r)/kernel/fs,目前已经载入内存的文件系统 cat /proc/filesystems
VFS(virtual filesystem switch)
通过virtual filesystem switch,系统能够管理文件系统,自动识别文件系统类型。
XFS文件系统
文件系统的查看
文件系统的简单信息查看
df [-ahikmHT] file/directory 常用于文件系统容量查看
-a,列出所有文件系统,包括/proc
-h,将文件大小以更加易读的形式显示出来,例如默认是以bytes为单位,对于大小适合的文件,可以转换为KB、MB、GB等
-H,以M=1000K代替M=1024K计算
-k,以KBytes为单位显示文件容量
-m,以MBytes为单位显示文件容量
-i,使用inode数量代替容量显示
-T,显示对应partition的filesystem类型
df主要从superblock读取信息,执行速度很快
du [-ahsSmk] file/directory 常用于目录容量查看
-a,列出所有文件和目录容量,默认仅统计目录下的文件量
-h,将文件大小以更加易读的形式显示出来,例如默认是以bytes为单位,对于大小适合的文件,可以转换为KB、MB、GB等
-s,列出总量而不显示每个目录的容量
-S,列出目录下每个目录、子目录和文件各自占用的容量,不包括子目录
-m,以MBytes为单位显示文件容量
-k,以KBytes为单位显示文件容量
du直接从文件系统中搜索文件数据,执行速度需要耗费时间较多
ln链接
实体链接和符号链接
Hard Link(实体链接)
1、每个文件占用一个inode,文件通过inode来指向实际内容
2、读取文件需要通过读取目录树的内容来寻找文件名和对应的inode number
文件名只和目录有关,文件内容和inode有关,可以存在多个文件名指向同一个inode number,这种就是Hard Link。(也就是只需在目录树下新增一条文件名记录并匹配inode number)这种链接方式不耗费inode
限制:
1、不能跨越filesystem(filesystem文件格式可能不同;相同格式的文件系统之间的inode是相互独立的,存在inode号码重叠的情况) 2、不能链接目录(???)
Symbolic Link(符号链接)
符号链接会创建一个文件,这个文件会让读取的数据指向被链接的文件名。类似于windows的快捷方式。所以文件被删除以后,符号链接会提示找不到源文件
创建链接ln
ln [-sf] source destination
-s,创建symbol link,默认创建hard link
-f,强制操作,若destination存在,则删除后重新创建链接
link数量
当创建一个目录 /tmp/directory 时,目录底下会同时创建 /directory/. 和 /directory/..
/tmp/directory 和 /tmp/diectory/. 是相同的目录,而 /tmp/directory/.. 指向上一级目录 /tmp,所以当我们新建一个空目录时,新建目录的链接数就已经是2了,而上一级目录链接数则会增加1
磁盘的分区、格式化、检验与挂载
磁盘的分区、格式化、检验与挂载
查看磁盘分区
lsblk [-dfimpt] [device]
-d,仅列出磁盘本身而不列出磁盘的分区
-f,列出磁盘文件系统类型
-i,使用ASCII码线段输出,不实使用复杂编码
-m,同时列出该设备在/dev下的权限
-p,列出设备的完整名称
-t,列出设备的详细信息
NAME:设备文件名
MAJ:MIN:主要:次要设备代码
RM:是否为可卸载设备
SIZE:设备容量
RO:是否为只读
TYPE:设备类型,磁盘(disk)、分区(partition)、只读存储器(rom)等
MOUNTPOINT:挂载点
列出设备的UUID
UUID是全局单一识别码
blkid
列出磁盘分区表类型和分区信息
parted device print
磁盘分区
GPT
gdisk device
MBR
fdisk device
更新linux核心分区表信息
partprobe [-s]
磁盘格式化
默认单位为Bytes
mkfs
mkfs.xfs
mkfs.ext4
文件系统检验
xfs_repair [-fnd] device
-f,
-n,仅进行检查
-d,在单人维护模式下,针对根目录(/)进行检查和修复
fsck.ext4 [-pf] [-b superblock] device
-p,当文件系统在修复时,如果有需要回复y的动作时,自动回复y来继续进行修复动作
-f,强制进行详细检查
-b,后边接superblock的位置。当superblock损坏时,可以通过备份来进行修复。superblock的备份位置:1k block在8193,2k block在16384,4k block在32768
文件系统的挂载与卸载
注意:1、一个文件系统只能挂载在一个目录
2、一个目录只能挂载一个文件系统
3、被挂载的目录是个空目录。如果目录不为空,那目录原本的文件会暂时消失直至文件系统被卸载
mount
-a,根据配置文件/etc/fstab来挂载所有的文件系统
-l,增加显示label信息
-t,后面增加文件系统类型来指定挂载挂载类型
-n,在默认情况下,系统会将挂载情况实时写入/etc/mtab,以利于其他程序运行。单人维护模式下不写入
-o,后面接一些挂载的额外参数
--bind directory new_directory,将文件夹挂载到另一个文件夹上
挂载参考的信息:1、/etc/filesystems,系统制定的测试挂载文件系统类型的优先顺序
2、/proc/filesystems,系统已经载入的文件系统类型
umount [-fln] device/mountpoint
-f,强制卸载
-l,立刻卸载,比-f要强
-n,不更新/etc/mtab的情况下卸载
磁盘/文件系统参数的修改
mknod device [bcp] [Major] [Minor]
b,设置这杯名称成为一个周边存储设备。例如磁盘
c,设置设备名称成为一个周边输入设备。例如鼠标
p,设置设备名称成为一个FIFO文件
Major,主要设备代码
Minor,次要设备代码
xfs_admin [-lu] [-L label] [-U uuid] device
-l,列出设备的label
-u,列出设备的UUID
-L,设置设备的label
-U,设置设备的UUID
uuidgen,产生一个新的uuid
tune2fs [-l] [-L label] [-U uuid] device
-l,将superblock被的数据读取出来,类似于dumpe2fs -h
-L,设置设备的label
-U,设置设备的UUID
设置开机挂载
设置开机挂载/etc/fstab和/etc/mtab
根目录必须挂载,且必须是第一个被挂载的
/etc/fstab挂载格式:6个字段
[设备/UUID] [mount point] [filesystem type] [文件系统参数] [dump] [fsck]
修改完以后,可以通过mount -a来测试新增格式是否符合规范。实际挂载记录在/etc/mtab和/proc/mounts文件中
特殊设备loop挂载
挂载光盘/DVD镜像文件
mount -o loop iso_file mount_point
创建大文件以制作loop设备
交换空间(swap)的创建
交换空间(swap)
使用实体分区创建swap
1、给swap创建分区,修改system id(系统会默认给新分区分配文件系统ID)
2、使用mkswap格式化成swap格式
3、启用创建的swap(swapon)
使用文件创建swap
1、使用dd创建一个文件
2、使用mkswap格式化成swap格式
3、启用创建的swap(swapon)
分区工具parted
parted [device] [command [options]]
command: 创建新分区 mkpart [primary|logical|extended] [filesystem type]
显示分区 print
删除分区 rm [partition]