文件系统的组成
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]
