Linux磁盘和文件系统管理

文件系统的组成

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]


 

 

你可能感兴趣的:(centos学习,鸟哥的Linux私房菜)