一、什么是文件系统?

文件系统是操作系统用于明确磁盘或分区上的文件的方法和数据结构;即在磁盘上组织文件的方法。也指用于存储文件的磁盘或分区,或文件系统种类。文件系统是对应硬盘的分区的,而不是整个硬盘,不管是硬盘只有一个分区,还是几个分区,不同的分区可以有着不同的文件系统!

二、linux的文件系统的种类 VFS (virtual file system)

  1. linux 的文件系统:
  • ext2(无日志功能)
  • ext3
  • ext4
  • xfs(企业级64位文件系统)
  • reiserfs(反删除功能很好)
  • btrfs(centos 7上)
光盘:
  • iso9660
网络文件系统:
  • cifs
  • nfs
集群文件系统:
  • gfs2
  • cofs2
内核级分布式文件系统:
  • ceph
windows的文件系统:
  • vfat(fat32)
  • ntfs
伪文件系统:
  • proc
  • sysfs
  • tmpfs
  • hugepagefs
unix的文件系统:
  • ufs
  • ffs
  • jfs
交换文件系统:
  • swap
用户空间的分布式文件系统:
  • mogilefs moosefs
  • flusterfs

日志型文件系统的优势

在磁盘空间中新建或复制一个文件时,找一个日志区域,把元数据先放在日志区域中,再分配磁盘块存数据,存储完了后,再把元数据移到元数据区,如果存储过程中出了故障,系统会在下次启动时自动检查日志区,把未移动到元数据区的元数据所对应的文件,再检查一次其完整性。以此保证了数据损坏的情况。

日志型文件系统的弱点

会消耗系统性能

内核级文件系统的组成

  1. 文件系统驱动,即加载对应的模块,完成对虚拟文件系统的支持。以便支持更多特性的文件系统
  2. 文件系统管理工具:由用户空间的应用程序提供,完成各文件系统的管理

文件系统的组成部分

  1. 块组

  • 记录block使用信息的索引,快速定位那些block号码没有被使用,使用0、1标识
  • 记录Inode的使用信息的索引,快速定位那些Inode号码没有被使用,使用0、1标识
  • 数据区域 (block区域)
  • bitmap(Inode位图,单块实现记录,即在块组中寻找一个块记录下相关信息)
  • blockmap(块位图,单块实现记录,即在块组中寻找一个块记录下相关信息)
  • Inode(每个Inode都有一个编号)
  • Inode包含大小、权限 、属主、属组、时间戳、数据块指针、inode号
  1. 元数据区域(Inode区域)

超级块

  • 包含了有多少块组,每个块组中有多少个块,多少个inode号码
  • GDT,块组描述符
  • 超级块会随机放到各块组中的一个块,以实现冗余

三、什么是Inode

理解Inode要从文件存储说起,文件存储在硬盘上,硬盘最小的存储单元叫扇区”sector”,每个扇区512byte(相当于0.5KB),内核读取文件不会每个扇区读取,这样的读取方式效率太低,而是一次性读取一个块,取一个block。这种由多个扇区组成的块是文件存储最小的单元,”块”的大小最见的是4KB,即连续八个serctor组成一个block. 当有一个大文件写入的时候,内核会调用八个连续的块标记写入,当最后不能完全填充所有的块时,将把未使用的块释放出来,以供后续的文件写入时使用。当前期规则文件系统时,可以根据生产需要来指定块大小,一般情况为:1024,2048,4096。Linux最小存储单元为1KB,这种情况下, 每次写入则用二个sector。
文件数据都储存在”块”中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为”索引节点”。每一个文件都有对应的inode,里面包含了与该文件有关的一些信息

四、文件的存储方式

存储分为两部分

  1. 元数据
  • 即文件的本身的基本信息,也叫Inode信息,包含文件的大小,权限 ,属主,属组,时间戳,数据块指针,Inode号、连接数等
数据
  • 即在数据区块占用的块,并将数据写入到块中

五、目录的存储方式

  1. 元数据
  • 即文件的本身的基本信息,也叫Inode信息,包含文件的大小,权限 ,属主,属组,时间戳,数据块指针,Inode号、连接数等
目录下的文件名
  • 包含目录下的文件名、及文件名的inode号码
根本身
  • 根是自引用的,引内核挂载根文件系统,并记录了根的位置,并且将信息缓存至内存中
文件名是记录在上级目录中

六、硬盘的识别机制

  1. Centos 5
  • sd[abc…]#
  • hd[abc..]#
  • IDE硬盘
  • SATA、SCSI、USB、SAS
Centos 6、7
  • sd[abc…]#
  • IDE、SATA、SCSI、USB、SAS

七、硬盘的机制

1. 标识机制

/dev目录中,创建一个硬件设备文件,并关联到内核的驱动程序中,硬件设备文件如下特性:
  1. 设备文件本身也是一个文件,他不占用磁盘块
  2. 他以major、minor区分硬件类型
  • major设备号区别设备类型
  • minor设备号区别同一设备不同类型

2. 硬盘的分区机制

  1. MBR分区机制

  • 前446字节:bootload主引导记录
  • 64字节存放分区信息,每个分区占用16字节,故最多只能分四个分区
  • 2字节标识MBR区域的有效性,一般55AA为有效,否则无效
  • 为了能使用更多的分区,最多可以使用3个主分区,一个扩展分区,再到扩展分区上建立更多的逻辑分区
  • 在硬盘的0磁道0扇区使用一个块512byte来记录如下信息

GPT分区机制

3. 硬盘的存储单位

  • sector (扇区),一般为512byte
  • block(块),最小文件存储单元了1K,故最小需要两个块
  • cylinder(柱面),分区划分是基于柱面的

4. 系统引用设备的方式

  • 设备文件名
  • 卷标
  • UUID

5. 硬件设备的手动建立

`mknod` - make block or character special files
    synopsis: mknod [option] … NAME TYPE [MAJOR MINOR]
    options:
        -m : 创建时指定mode,创建后的设备文件访问权限

例:mknod testdev b 111 2  #建立testdev设备文件,为块设备,主设备号111 次设备号2

文件系统管理工具

一、创建文件系统

  1. mke2fs命令:

     mke2fs -  - create an ext2/ext3/ext4 filesystem
         synopsis: mke2fs [option] device
         options:
         -t {ext2,ext3,ext4} :指明要创建的文件系统类型
         -b {1024|2048|4096} : 指明文件系统的块大小,不超过4096
         -L LABEL :指明卷标
         -j : journal,创建有日志功能的文件系统ext3
             mke2fs -j = mke2fs -t ext3 = mkfs -t ext3 = mkfs.ext3  = 
         -i #:  bytes-per-inode,指明inode与字节的比率,即每多少字节创建一个inode
         -N # : 直接指明要给此文件系统创建的Inode数量
         -O :设置某种属性,挂载时这些属性将会继承
             mke2fs -O has_journal /dev/sda3  #启用日志功能
              mke2fs -O ^  has_journal /dev/sda3  #关闭已给定的日志功能
         -m # : 指定预留的空间百分比;不需要加百分号
注意:mkfs.ext2 , mkfs.ext3 , mkfs.ext4 mkfs.xfs mkfs.vfat 可以完成mke2fs的所有功能
  1. swap分区的建立

  • 注意:mount -a 对swap挂载项无效
  • 设备    挂载点    文件系统类型    挂载选项    自动转储频率    开机自检次序
  • /dev/sdb6    swap     swap    defaults    0    0
  1. 调整分区类型为82
  2. 使用mkswap命令进行格式化
  3. 使用swapon DEVICE命令开启swap分区
  4. 修改fstab文件,让系统自动加载swap交换分区,其格式为:
  5. 使用swapoff DEVICE命令关闭swap分区

二、查看及修改文件系统

  1. tune2fs命令:

     `tune2fs` - adjust tunable filesystem parameters on ext2/ext3/ext4 filesystems
         synopsis: tune2fs [ option] device
         options:
             -j  device : 从ext2升级到ext3,无损升级
             -L LABEL : 修改或设置卷标
             -m # : 调整预留空间的百分比
             -O [ ^] Feather : 开启或关闭某种特性,挂载时这些特性将继承
             -o [^]Mount_options : 开启或关闭默认挂载选项调整 
                 acl ^acl : 关闭或启用用户挂载的acl开启和关闭
             -l : 查看超级块的内容,就是查看整个分区的Infomation
             -c # : 指定挂载多少次进行自检,0或-1表示关闭此功能,即查看超级块中的Maximum Mount count值
             -i # : 每挂载使用多少天后进行自检,0或-1表示关闭此功能,即查看超块中的Mount count值。
  2. dumpe2fs命令:

     `dumpe2fs` - dumpe2fs - dump ext2/ext3/ext4 filesystem information
         synopsys: dumpe2fs [ -bfhixV ] [ -o superblock=superblock ]  device
         optiosn:
             -h : 查看超级块信息

三、检查文件系统

fsck命令

    `fsck` - check and repair a Linux file system
        synopsis: fsck [-sAVRTMNP] [-C [fd]] [-t fstype] [filesys...]  [--] [fs-specific-options]
        options: 
            -t fstype : 指明文件系统类型
                fsck -t ext4 == fsck.ext4 
            -a : 自动修复所有错误(不建议自动加-a ,就是把没有写完的文件删除。如果需要这个文件,可以将已经写的文件找回来,删除就没有了)
            -r :交互修复

e2fsck命令

`e2fsck` - check a Linux ext2/ext3/ext4 file system
    synopsis: e2fsck [option] device
    options: 
        -y : 对所有问题回答为yes
        -f : 即使文件系统处于clean状态,也要强制进行检测

四、查看文件系统

blkid命令

    `blkid` - command-line utility to locate/print block device attributes
        synopsis: blkid
        options:
            -L LABEL : 查看谁在使用label这个卷标。
            -U UUID : 根据UUID定位设备

df命令(查看硬盘分区使用情况)

    `df` - report file system disk space usage
        options:
            -l : 查看本地的硬盘
            -h : haman格式显示,就是转化存储单位显示 
            -i : 查看磁盘的Inode使用情况

du命令(查看文件占用空间大小)

    `du` - estimate file space usage
        options:
            -s : 显示总的文件大小
            -h : haman格式显示

lsblk命令(查看硬盘分区使用情况)

    `lsblk` list block devices
        * 以树型结构显示各分区使用情况

挂载文件系统

一、为什么需要挂载?

根之外的文件系统需要被访问,就需要『关联』至文件系统下的某目录来实现,此关联过程即为挂载。此目录即为挂载点

二、挂载的特性

Mount_point当为文件的访问入口时,需注意如下特性:
  • 目录需要事先存在的
  • 应该使用未被或不会被其它进程所使用的目录
  • 挂载的目录当有人访问时,目录不能被卸载
  • /etc/mtab是记录了所有的mount设备

三、Mount命令

`mount` - mount a system
    synopsis: mount [-lhV]
              mount -a [-fFnrsvw] [-t vfstype] [-O optlist]
              mount [-fnrsvw] [-o option[,option]...]  device|dir
              mount [-fnrsvw] [-t vfstype] [-o options] device dir
    options:
        -r : readonly,只读挂载
        -w : read and write,读写挂载
        -n : 不更新/etc/mtab文件,默认挂载都会在挂载时记录至/etc/mtab文件中。
        -t : system type, 挂载设备上的文件系统的类型,多数可忽略
        -L LABEL : 挂载时以卷标的方式指明设备
            `mount -L LABEL DIR
        -U UUID : 挂载时以UUID的方式挂载
            `mount -U UUID DIR
        -a :自动挂载/etc/fstab文件中的所有设备
        -o OPTIONS : 挂载指明参数,即挂载的选项
        --bind OLDDIR NEWDIR : 将目录挂载至另一个目录
    -o options:
        async/sync : 异步或同步操作,异步的方式是先将数据写入至内存,再保存至硬盘,同步是直接写入硬盘,异步的性能会提升很多
        atime/noatime : 立即更新访问时间戳/关闭
        diratime/nodiratime : 开启/关闭目录的访问时间戳
        remount : 重新挂载,在需要指明其他选项,即不影响其他用户访问的情况下使用
        acl : 支持使用facl功能
            mount -o acl DEVICE DIR
            tune2fs -o acl DEVICE :调整文件系统的默认属性为支持挂载时开启acl功能
        ro : 只读
        rw : 读写
        dev/nodev : 开启/关闭在在此设备上创建设备文件功能
        exec/noexec : 是否允许运行此设备上的二进制程序文件
        auto/noauto : 是否支持mount -a 命令自动挂载
        user/nouser : 是否允许普通用户挂载此文件系统
        suid : 是否允许SUID或SGID的程序生效
        relatime : 是否参考atime mtime的时候来修改inode的访问时间
        loop : 镜像文件
        netdev : 在启动如果连接不上网络映射的盘, 就停止挂载其网络系统,适用于ext2文件系统。
  • 注意: Mount不加参数的默认(defaluts)设置为:
    • rw, suid,dev,exec,auto,nouser,async,relatime
查看当前系统上所有挂载的设备
  • mount
  • cat /etc/mtab
  • cat /proc/mounts
Mount的使用技巧
  • 可以实现将目录挂载到目录上,作为其临时访问的入口
    • mount --bind 源目录 目录目录
  • 挂载光盘
    • mount -r /dev/cdrom DIR
  • 挂载本地回环设备
    • mount -o loop /FILE /DIR

umount命令

`umount` - umount file system 
    synopsis: umount DEVICE|DIR

四、强制umount

1、查看目录或者设备被谁使用
  • lsof DIR|DEVICE
    • 使用lsof命令查看目录或设备被谁使用
  • fuser -v DIR|DEVICE
    • 使用fuser -v 参数查看目录或设备被使用情况
      2、结束访问目录或设备的进程
  • fuser -km DIR|DIVECE
    • -k : kill
    • -m : 指定要结束访问进程的目录或设备
/etc/fstab文件格式:
  • 1、要挂载的设备
    • 如果是设备文件可以直接写,如果是uuid或者LABEL,需要在其前面加 “UUID=” 或者 “LABEL=”
    • 可以是设备文件
    • 可以是LABEL
    • 可以是UUID
  • 2、挂载点
    *目录: swap的挂载点就是swap
  • 3、文件系统类型
    • swap的文件系统类型为swap
  • 4、挂载选项
    • defaults: 使用默认的挂载选项,如果需要指定多个挂载选项,使用逗号分隔
  • 5、转转储频率(即是备份)
    • 0:从不备份
    • 1: 每天备份
    • 2 : 每隔一天
  • 6、自检次序(优先级)
    • 0 :不自检
    • 1 :首先自检
    • 2:次级自检
    • ….
    • 9

Linux删除文件逻辑

1、将此文件inode所有指向的data block标记为未使用
2、将此文件的inode标记为未使用
3、下次在写入数据时,再填充相应的data block块

移动和复制文件

  • 复制:就是新建文件

  • 移动:只是修改文件路径映射,inode还是同一个文件
    • 在同一文件系统上移动,只是改变其路径
    • 在不同文件系统之间移动,复制数据至目标文件,并删除原文件