• Linux之磁盘与文件系统


    Linux之磁盘与文件系统

    Author:onceday date:2022年8月8日

    本文内容主要收集整理于《鸟哥的Linux私房菜》

    长路漫漫,独自前行,没有终点,唯有坚持。

    1.引言

    磁盘的分区表的格式一般有两种:主引导记录(MBR)和GUID分区表(GPT)

    磁盘目录在:\dev下。

    Linux的正统文件系统为ext2(Linux second Extend file system)

    较新的文件系统一般具有以下部分:

    • 超级区块(superblock):记录文件系统的整体信息,包括inode与数据区块的总量、使用量、剩余量,以及文件系统的格式与相关信息等。

    • inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的区块号码。

    • 数据区块:实际记录文件的内容,若文件太大时,会占用多个区块。

    这种类型的文件系统被称为索引式文件系统。

    文件系统一般在格式化分区的时候就把inode和数据区块的大小固定了。

    整个分区文件系统最前面是一个启动扇区,可以安装启动程序。

    后面是区块群组(block groups),每个区块都包含一个超级区块(可能),inode以后数据区块信息。

    数据区块的大小会影响文件系统支持的最大文件大小:

    • 1KB对应16GB

    • 2KB对应256GB

    • 4KB对应2TB

    遵循以下原则:

    • 每个区块内最多只能放置一个文件的数据。

    • 如果文件大于区块的大小,则一个文件会占用多个区块数量。

    • 如果文件小于区块,则该区块的剩余容量就不能够再被使用了。

    2.ext文件系统基础

    inode table包含记录以下信息:

    • 读写属性rwx、拥有者和用户组、大小、状态改变时间

    • 文件特性标识(flag)

    • 文件内容真正的指向。

    inode的大小是固定的,ext4为256B,而每个数据区块需要4B,因此当文件太大时,需要用到间接记录,即第一个inode指向第二个inode,然后第二个inode记录实际的区块编号。

    超级区块包含信息:

    • 数据区块与inode的总量

    • 未使用和已使用的inode与数据区块的数量

    • 数据区块与inode的大小

    • 文件系统的挂载时间,写入时间等信息

    • 是否挂载位

    每个文件系统只有一个超级区块,其他区块群组内的超级区块主要是用来进行备份。

    Filesystem description(文件系统描述):

    • 这个区段可以描述每个区块群组的开始和结束的区块,说明各区段的分布情况。

    区块对照表(block bitmap):

    • 用于确定空闲的数据区块

    inode对照表:

    • 用于记录inode的使用情况

    3.dumpe2fs查看ext文件系统信息

    dumpe2fs  /dev/sda3  
    dumpe2fs -h  /dev/sda3   #仅列出超级区块的区域内容
    
    • 1
    • 2

    查看当前已加载到内核中支持的文件系统:

    cat /proc/filesystems
    
    • 1

    当前linux支持的文件系统:

    ls -l /lib/modules/$(uname -r)/kernel/fs
    
    • 1

    Linux统一通过名为Virtual Filesystem Switch的虚拟文件系统来抽象底层文件接口的不同。

    现代Linux一般使用支持大容量的xfs文件系统来替代ext文件系统:

    使用以下命令可查看xfs文件系统的信息:

    xfs_info /dev/vda
    
    • 1

    4.文件系统的简单操作

    4.1 df 列出文件系统的整体磁盘使用情况

    以易读的方式将系统内所有文件系统全部列出来:

    df -h
    df -k #以Kbytes容量
    df -m #以mbytes容量  
    df -a #包括proc在内的特殊文件系统也列出来   
    
    • 1
    • 2
    • 3
    • 4

    列出文件系统名称:

    df -T
    
    • 1

    不用磁盘容量,而以inode的数量来显示:

    df -i
    
    • 1
    4.2 du查看目录的磁盘使用量

    列出所有的文件与目录容量,默认只统计目录下面的文件量:

    du -a 文件/目录
    du -h  #以更易读的方式列出大小
    
    • 1
    • 2

    只列出总量,不列出子目录的数据:

    du -s 文件/目录
    
    • 1
    4.3 ln生成硬链接

    硬链接只是将某个目录下新增一条文件名链接到某inode号码的关联记录。

    相比于符号链接,其具有更大的限制:

    • 不能跨文件系统

    • 不能链接到目录

    删除硬链接的其中一个文件名,那么inode和区块还会保留,可以通过另外一个文件名来读取。

    ln 源文件 目标文件    #创建硬链接
    ln -s 源文件 目标文件 #符号链接
    ln -f 源文件 目标文件 #如果目标文件存在,就将目标文件删除后再建立。
    
    • 1
    • 2
    • 3

    5.磁盘分区、格式化、检验和挂载

    一般在系统增加一块磁盘,要经过以下步骤:

    1. 对磁盘进行划分,建立可用的硬盘分区

    2. 对该硬盘分区进行格式化,建立系统可用的文件系统

    3. 对刚建好的文件系统进行检验

    4. 将检验后的文件系统挂载到目录上

    5.1lsblk观察磁盘分区状态

    列出所有磁盘内的分区信息:

    lsblk
    lsblk -d #仅列出磁盘本身
    lsblk -f #同时列出该磁盘内的文件系统名称
    lsblk -i #使用ASCII的字符输出,不使用复杂的编码
    lsblk -m #输出该设备在/dev下面的权限信息
    lsblk -p #列出该设备的完整文件名
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    5.2 blkid列出设备的UUID等参数
    blkid
    blkid -h #查看帮助信息
    
    • 1
    • 2
    5.3 parted列出磁盘的分区表类型与分区信息
    parted 磁盘目录 print
    
    • 1
    5.4 使用fdisk(MBR)/gdisk(GPT)进行磁盘分区

    软件不能混合分区格式使用,不然会覆盖其他分区的格式,造成磁盘无法读取。

    使用时交互式的,直接输入以下命令进入交互:

    gdisk/fdisk 磁盘目录
    
    • 1

    该程序最后一步只要不写入,那么前面的操作不会对磁盘分区有任何影响。

    处理一个正在使用的分区时,可能会造成严重的后果,因此务必小心。

    当确定好分区情况后,需要等内核更新分区表的信息。

    一种方式是重新启动,一种方式是通过partprobe命令。

    partprobe -s #-s输出详细的过程信息
    
    • 1

    也可以使用fdisk/gdisk来删除分区表。

    此外还可以使用parted来进行分区操作,可以在一条命令搞定分区操作。

    parted /dev/vda mkpart primary fat32 36.0GB 36.5GB
    
    • 1
    • primary字段还可以选为logical、Extended

    • 36.0GB是开始地址,36.5GB是结束位置。

    5.5 mkfs格式化分区

    命令使用如下:

    mkfs.xfs [-f] 设备名称 # -f可以强制格式化一个已有文件系统的分区
    mkfs.ext4 
    mkfs.xxxx #可以用[tab][tab]来查看支持的文件系统
    
    • 1
    • 2
    • 3

    建议直接使用默认参数,这个需要专门学习文件系统的知识。

    5.6 文件系统检验

    xfs_repair处理xfs文件系统:

    xfs_repair  设备名称
    xfs_repair -f 文件
    xfs_repair -n #单纯检查而不修改任何内容
    xfs_repair -d #单人维护模式下修复根目录,危险
    
    • 1
    • 2
    • 3
    • 4

    被检查/恢复的文件系统不能处于挂载状态。

    必须进入恢复模式下,才能修复根目录(/)

    修复ext4文件系统:

    fsck.ext4 [-f] 设备名称 #-f表示强行检查
    
    • 1
    5.7 文件系统挂载和卸载

    挂载点是目录,这个目录是进入磁盘分区的入口:

    • 单一文件系统不应该被重复挂载在不同的挂载点(目录)中

    • 单一目录不应该重复挂载多个文件系统

    • 要作为挂载点的目录,理论上应该都是空目录才行

    如果挂载目录不是空目录,挂载目录后,源目录下面的东西就会自动隐藏。等到新分区被卸载之后,才会重新显示出来。

    可以使用mount来设置和查看挂载信息:

    mount [-l] #显示所有挂载磁盘信息,-l会额外显示Label名称
    mount -a   #依照配置文件/etc/fstab的数据将所有未挂载的磁盘都挂载上来。
    
    • 1
    • 2

    以下是三种挂载方式:

    mount [-t 文件系统] LABEL='' 挂载点
    mount [-t 文件系统] UUID='' 挂载点
    mount [-t 文件系统] 设备文件名='' 挂载点
    
    • 1
    • 2
    • 3

    使用-o选项还可以指定更多的自定义选项。

    现在Linux发行版系统,一般不需要指定-t选项,因为系统会自己进行测试,选择最合适的文件系统。

    也可以使用mount将一个目录挂载到另外一个目录下:

    mount --bind /var  /data/var
    
    • 1

    可以使用umount将设备文件卸载:

    umount [-fl] 设备文件名或挂载点
    
    • 1
    • -f强制卸载,可在类似网络文件系统(NFS)无法读取到的情况下

    • -l立即卸载文件系统,比-f还强

    如果磁盘分区挂载在多个目录下,只能逐个使用挂载目录点卸载。

    5.8 磁盘、文件系统参数自定义

    mknod设置文件的设备类参数,如设备的种类。

    mknod 设备文件名 [bcp] [major] [Minor]
    
    • 1

    xfs_admin修改XFS文件系统的UUID和Label name:

    xfs_admin [-lu] 设备文件名  #列出设备的label name和UUID
    xfs_admin [-L] 设备文件名   #设置这个设备的Label name
    xfs_admin [-U] 设备文件名   #设置这个设备的UUID
    
    • 1
    • 2
    • 3

    tune2fs修改ext4的label name和UUID:

    tune2fs [-l] 设备文件名  #读出superblock内的数据
    tune2fs [-L] 设备文件名  #修改Lable name
    tune2fs [-U] 设备文件名  #修改UUID
    
    • 1
    • 2
    • 3

    6. 启动挂载设置(/etc/fstab和/etc/mtab)

    根目录是一定要挂载的,且要先于其他挂载点(mount point)被挂载进来。

    同一时间挂载点和磁盘分区只能挂载一次。

    卸载时,也必须将工作目录移到挂载点之外。

    #!/etc/fstab
    #             
    # / was on /dev/sda3 during installation
    UUID= xxx···xxx  /             ext4  errors=remount-ro 0       1
    
    • 1
    • 2
    • 3
    • 4

    其选项可为以下参数:

    • async/sync,是否以异步方式运行

    • auto/noauto,当执行mount -a时,此文件系统是否会被主动测试挂载

    • rw/ro,可读写或只读的状态

    • exec/noexec,限制文件系统内是否可以进行执行的权限

    • user/nouser,是否允许用户挂载

    • defaults,默认具有所有权限

    该文件写完以后一定要进行使用mount -a进行测试,否则一旦出错,LInux系统将无法启动。

    7.特殊文件挂载

    loop设备文件挂载的是镜像文件,可以使用dd制作大文件,然后强行格式化,并进行挂载。

    可以使用mkswap格式化分区或者大文件,然后挂载成为交换文件。

  • 相关阅读:
    java JDBC连接数据库代码大全
    学习笔记—Grafana监控docker--mysql、redis的实战
    高性能音乐流媒体服务Diosic
    分享一些你代码更好的小建议,流畅编码提搞效率
    ArrayList源码解析
    Spring学习笔记(三十七)——Flyway 数据库版本控制
    【YOLOv7】主要改进点详解
    关于LWIP的一点记录(一)
    【数据结构】460. LFU 缓存
    SQL Server关于AlwaysOn的理解-读写分离的误区(一)
  • 原文地址:https://blog.csdn.net/Once_day/article/details/126244190