鸟哥的Linux私房菜第七章学习笔记

第7章 Linux磁盘与文件系统管理

一、要点总结

7.1 认识Linux文件系统

  • 磁盘分区需要被格式化成文件系统才能被操作系统使用。

  • 基本上Linux的传统文件系统为ext2,是一种索引式文件系统。它的主要构成有:

    • superblock:记录此文件系统的整体信息,包括inode/block的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;
    • inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的 block 号码;
    • block:实际记录文件的内容,若文件太大时,会占用多个 block 。
  • 需要碎片整理的原因是文件写入的block太过于离散了,此时文件读取的性能将会变的很差。 这个时候可以通过碎片整理将同一个文件所属的blocks集合在一起。FAT这种非索引式文件系统就需要时常碎片整理一下。

  • inode和block在格式化的时候就规划好了,除非重新格式化或者利用resize2fs等命令修改大小,否则都无法变动了。

  • ext2文件系统格式化好后分为启动扇区(boot sector)和多个区块群组(block group),每个区块群组内有独立的超级块、文件系统描述、inode对照表、block对照表、inode table和data block六个部分。

    • data block是用来放置文件内容数据地方。
      • 在ext2文件系统中所支持的block大小有1K, 2K及4K三种而已。block大小会影响最大单一文件大小和最大文件系统容量。
      • 每个区块最多只能放一个文件的数据,如果文件小于区块,剩下的容量不能再被使用,就造成浪费了。
    • inode 记录文件的属性/权限等数据,也是一个文件使用的区块的索引。系统读取文件是先找到inode,并分析上面的权限是否和用户符合,若符合就找出inode上记录的区块的数据。
      • 每个文件都仅会占用一个 inode 而已; 因此文件系统能够创建的文件数量与 inode 的数量有关。
      • 每个 inode 大小均固定为128B,xfs和ext4可以到256B。由于block被inode记录,所以文件的最大大小和inode大小有关。为了增大能记录的最大文件大小,inode记录区块号码区域被分为12个直接、一个间接、一个双间接、一个三间接记录区。所谓间接就是再拿一个区块当作记录区块号码的记录区。
    • superblock(超级块)是记录整个文件系统信息的地方,包括区块和inode的大小、总量和余量、文件系统的挂载状态、挂载时间等信息。
    • Filesystem Description(文件系统描述说明)描述每个区块群组的开始与结束的block号码,以及说明区块群组内每个区段(superblock, bitmap, inodemap, data block)分别位于那些区块。
    • 区块对照表(block bitmap)记录哪些区块是空的,便于系统快速新建文件。
    • inode对照表(inode bitmap)记录哪些inode是空的,便于系统快速新建文件。
  • 查询ext系列系统superblock信息的命令dumpe2fs

    1
    2
    3
    4
    dumpe2fs [-bh] 设备文件名
    # 选项与参数:
    # -b :列出保留为坏轨的部分(一般用不到)
    # -h :仅列出superblock的数据,不会列出其他的区块群组的内容。
  • 和目录的关系

    • 新建目录的时候,文件系统会分配一个inode与至少一个区块给该目录。inode记录目录的权限和属性,区块记录目录下文件的文件名和inode号码。
    • 目录树读取时,会一层一层依次经过从根目录到具体文件的inode和block。
    • 将文件系统和目录树结合的操作称为挂载。挂载点一定是目录,该目录是进入文件系统的入口。
  • 日志式文件系统 (journal) 会多出一块记录区,随时记载文件系统的主要活动,可加快系统在发生数据不一致后的复原时间。

  • Linux 文件系统为增加读写性能,使用了异步处理的思路:让内存作为大量的磁盘高速缓存,系统不定时把内存里标记为dirty的数据写回磁盘,也可通过sync命令手动写回。

  • 整个 Linux 的系统都是通过一个名为Linux VFS(Virtual Filesystem Switch)的核心功能去读取各种各样的文件系统。,相当于一层抽象。

  • XFS文件系统主要规划为三个部份,一个数据区 (data section)、一个文件系统活动登录区 (log section)以及一个实时运行区 (realtime section)。可以使用xfs_info去观察超级区块内容。

7.2 文件系统的简单操作

  • 观察文件系统的整体磁盘使用量df

    1
    2
    3
    4
    5
    6
    7
    8
    9
    df [-ahikHTm] [目录或文件名]
    # 选项与参数:
    # -a :列出所有的文件系统,包括系统特有的 /proc 等文件系统;
    # -k :以 KBytes 的容量显示各文件系统;
    # -m :以 MBytes 的容量显示各文件系统;
    # -h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
    # -H :以 M=1000K 取代 M=1024K 的进位方式;
    # -T :连同该 partition 的 filesystem 名称 (例如 xfs) 也列出;
    # -i :不用磁盘容量,而以 inode 的数量来显示
    • 在Linux下面如果df没有加任何选项,那么默认会将系统内所有的(不含特殊内存内的文件系统与 swap)都以 1 KBytes 的容量来列出来。
    • df后面加上目录或者是文件时,df会自动的分析该目录或文件所在的分区,并将该分区的容量显示出来。
    • 由于df主要读取的数据几乎都是针对一整个文件系统,因此读取的范围主要是在superblock内的信息, 所以这个指令显示结果的速度非常的快速。
  • 查看文件或目录的磁盘使用量du

    1
    2
    3
    4
    5
    6
    7
    8
    du [-ahskm] 文件或目录名称
    # 选项与参数:
    # -a :列出所有的文件与目录容量,因为默认仅统计目录下面的文件量而已。
    # -h :以人们较易读的容量格式 (G/M) 显示;
    # -s :列出总量而已,而不列出每个各别的目录占用容量;
    # -S :不包括子目录下的总计,与 -s 有点差别。
    # -k :以 KBytes 列出容量显示;
    # -m :以 MBytes 列出容量显示;
    • 直接输入du没有加任何选项时,则du会分析【目前所在目录】的文件与目录所占用的磁盘空间。但是实际显示时,仅会显示目录容量(不含文件),因此.目录有很多文件没有被列出来,所以全部的目录相加不会等于.的容量。此外,输出的数值数据为【1K】大小的容量单位。
    • df不一样的是,du这个指令其实会直接到文件系统内去搜寻所有的文件数据, 所以会执行一小段时间。
  • 建立链接ln

    1
    2
    3
    4
    ln [-sf] 来源文件 目标文件
    # 选项与参数:
    # -s :如果不加任何参数就进行链接,那就是hard link,至于 -s 就是symbolic link
    # -f :如果【目标文件】存在时,就主动的将目标文件直接移除后再创建
    • Linux下的链接文件主要有两种,硬链接和符号链接。

    • 硬链接(Hard Link,硬式链接或实际链接)

      • 文件名只和目录有关,而文件内容则和inode有关。硬链接只是在某个目录下新增一笔文件名链接到某inode号码的关连记录而已,因此也大概率不会改变系统使用的inode和block数量。
      • ll -i 文件名显示的第二个字段就是有多少个文件名链接到相同的inode。
        • 当我们新建一个目录时候,因为除了这个目录还会新建...,所以这个目录的链接数是2,而上层目录的链接数会加一。
      • 硬链接最大的好处是安全:如果将任何一个文件名删除,其实inode和数据区块都还是存在的。
      • 但是硬链接还是有限制的:
        1. 不能跨文件系统
        2. 不能链接目录(因为如果硬链接到目录,链接的数据需要同被链接目录下所有数据都建立链接,以后新建目录也要额外新建链接,导致了相当大的系统复杂度)
    • 符号链接(Symbolic Link,快捷方式)

      • 符号链接就是建立一个独立的文件,有独立的inode,但是block指向它链接的那个文件的文件名。由于符号链接创建了一个独立的新文件,所以会占用inode和block。

      • 使用ll -i 文件名查看后会发现链接文件会写上目标文件的文件名,例如:

        1
        2
        3
        ll -i /etc/crontab /root/crontab2
        34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 /etc/crontab
        53745909 lrwxrwxrwx. 1 root root 12 Jun 23 22:31 /root/crontab2 -> /etc/crontab

7.3 磁盘分区管理

  • 观察磁盘分区状态

    • lsblk列出系统上所有磁盘列表

      • lsblk可以看成【list block device】的缩写。
      • 可以用来查看挂载点、分区容量等信息。
      1
      2
      3
      4
      5
      6
      7
      8
      lsblk [-dfimpt] [device]
      # 选项与参数:
      # -d :仅列出磁盘本身,并不会列出该磁盘的分区数据
      # -f :同时列出该磁盘内的文件系统名称
      # -i :使用 ASCII 的线段输出,不要使用复杂的编码 (再某些环境下很有用)
      # -m :同时输出该设备在 /dev 下面的权限数据 (rwx 的数据)
      # -p :列出该设备的完整文件名!而不是仅列出最后的名字而已。
      # -t :列出该磁盘设备的详细数据,包括磁盘伫列机制、预读写的数据量大小等
    • blkid列出设备的UUID等参数

      • UUID 是全局唯一标识符(universally unique identifier),Linux 会将系统内所有的设备都给予一个独一无二的标识符,这个标识符就可以拿来作为挂载或是使用这个设备或文件系统。
      1
      blkid # 每一行打印一个文件系统,主要列出设备名称、UUID以及文件系统的类型(TYPE)
    • parted列出磁盘的分区表类型与分区信息

      • 这个命令可以用来查看分区表类型,便于后面选择对应的分区管理工具。
      1
      parted device_name print
  • 磁盘分区管理

    • GPT分区使用gdisk

      1
      gdisk 设备名称
      • gdisk只有root可以执行。
      • 这个程序是完全不需要背命令的,只要按下【?】就能看到所有的操作。
      • 值得注意的是【q】和【w】操作,只要离开时按下【q】那么所有的操作都不会生效。反之按下【w】就是写入、操作生效的意思。
      • 更改分区后,因为Linux还在使用这块磁盘,担心系统出问题,所以用cat /proc/partitions观察分区表可以发现并没有更新。这时有两种方法更新,一是重启,二是通过partprobe命令强制更新Linux内核的分区表信息。
      • 另外,万分注意:不要去处理一个正在使用中的分区!一定要先卸载分区再对分区进行操作,否则虽然磁盘还是会写入正确的分区信息,但是核心会无法更新分区表的信息。另外,文件系统与 Linux 系统的稳定性,恐怕也会变得怪怪的。
    • MBR分区使用fdisk

      • fdiskgdisk使用的方式几乎一样。
      • 轻微的不同:
        • fdisk使用【m】显示提示,而不是【?】。
        • fdisk有时使用柱面(cylinder)作为分区的最小单位。
    • parted适用于两种分区表

      1
      2
      3
      4
      5
      6
      parted [设备] [指令 [参数]]
      # 选项与参数:
      # 命令功能:
      # 新增分区:mkpart [primary|logical|extended] [ext4|vfat|xfs] 开始 结束
      # 显示分区:print
      # 删除分区:rm [partition]
      • 如果你想要将原本的 MBR 改成 GPT 分区表,或原本的 GPT 分区表改成 MBR 分区表,也能使用parted

7.4 磁盘分区的格式化(创建文件系统)

  • 使用mkfs系列命令格式化硬盘(创建文件系统)

    • 格式化的指令非常的简单,那就是使用mkfs(make filesystem)这个命令。输入mkfs [Tab] [Tab]找到对应想格式化的文件系统类型即可。

    • XFS文件系统的mkfs.xfs

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      mkfs.xfs [-b bsize] [-d parms] [-i parms] [-l parms] [-L label] [-f] \
      [-r parms] 设备名称
      # 选项与参数:
      # 关于单位:下面只要谈到“数值”时,没有加单位则为 Bytes 值,可以用 k,m,g,t,p (小写)等来解释
      # 比较特殊的是 s 这个单位,它指的是 sector 的“个数”喔!
      # -b :后面接的是 block 容量,可由 512 到 64k,不过最大容量限制为 Linux 的 4k 喔!
      # -d :后面接的是重要的 data section 的相关参数值,主要的值有:
      # agcount=数值 :设置需要几个储存群组的意思(AG),通常与 CPU 有关
      # agsize=数值 :每个 AG 设置为多少容量的意思,通常 agcount/agsize 只选一个设置即可
      # file :指的是“格式化的设备是个文件而不是个设备”的意思!(例如虚拟磁盘)
      # size=数值 :data section 的容量,亦即你可以不将全部的设备容量用完的意思
      # su=数值 :当有 RAID 时,那个 stripe 数值的意思,与下面的 sw 搭配使用
      # sw=数值 :当有 RAID 时,用于储存数据的磁盘数量(须扣除备份碟与备用碟)
      # sunit=数值 :与 su 相当,不过单位使用的是“几个 sector(512Bytes大小)”的意思
      # swidth=数值 :就是 su*sw 的数值,但是以“几个 sector(512Bytes大小)”来设置
      # -f :如果设备内已经有文件系统,则需要使用这个 -f 来强制格式化才行!
      # -i :与 inode 有较相关的设置,主要的设置值有:
      # size=数值 :最小是 256Bytes 最大是 2k,一般保留 256 就足够使用了!
      # internal=[0|1]:log 设备是否为内置?默认为 1 内置,如果要用外部设备,使用下面设置
      # logdev=device :log 设备为后面接的那个设备上头的意思,需设置 internal=0 才可!
      # size=数值 :指定这块登录区的容量,通常最小得要有 512 个 block,大约 2M 以上才行!
      # -L :后面接这个文件系统的标头名称 Label name 的意思!
      # -r :指定 realtime section 的相关设置值,常见的有:
      # extsize=数值 :就是那个重要的 extent 数值,一般不须设置,但有 RAID 时,
      # 最好设置与 swidth 的数值相同较佳!最小为 4K 最大为 1G 。
      • 因为 xfs 可以使用多个数据流来读写系统以增加速度,因此那个 agcount 可以跟 CPU 的核心数来做搭配。
    • ext4文件系统的mkfs.ext4

      1
      2
      3
      4
      mkfs.ext4 [-b size] [-L label] 设备名称
      # 选项与参数:
      # -b :设置 block 的大小,有 1K, 2K, 4K 的容量,
      # -L :后面接这个设备的标头名称。
  • 内存交换分区(swap)的创建

    现在想像一个情况,你已经将系统创建起来了,此时却才发现你没有创建内存交换分区,那该如何是好?你可以使用如下方式来建立你的内存分区

    • 使用物理分区创建内存交换分区
      1. 分区:先使用gdisk在你的磁盘中分区出一个分区给系统作为内存交换分区。
      2. 格式化:利用建立内存交换分区格式的 mkswap 设备文件名 就能够格式化该分区称为内存交换分区格式
      3. 使用:最后将该swap设备启动,方法为 swapon 设备文件名
      4. 观察:最终通过freeswapon -s这个命令来观察以下内存的使用量。
    • 使用文件创建内存交换文件
      1. 使用dd 这个命令来新增一个空文件
      2. mkswap将这个文件格式化为内存交换文件的文件格式
      3. 使用swapon来将这个内存交换文件启动
      4. swapoff关掉内存交换文件,并在/etc/fstab设置自动启用

7.5 文件系统检验

文件系统运行时会有磁盘与内存数据非同步的状况发生,因此莫名其妙的死机非常可能导致文件系统的错乱。不同的文件系统救援的指令不太一样,我们主要针对 xfs 及 ext4 这两个主流文件系统来说明。

  • 注意:通常只有身为 root 且你的文件系统有问题的时候才使用这个命令,否则在正常状况下使用此命令, 可能会造成对系统的危害。

  • 由于在扫描磁盘的时候,可能会造成部分文件系统的改变,所以一定要先卸载文件系统再检查硬盘

  • xfs_repair处理XFS文件系统

    1
    2
    3
    4
    5
    xfs_repair [-fnd] 设备名称
    # 选项与参数:
    # -f :后面的设备其实是个文件而不是实体设备
    # -n :单纯检查并不修改文件系统的任何数据(检查而已)
    # -d :通常用在单人维护模式下面,针对根目录(/) 进行检查与修复的动作!很危险!不要随便使用。
    • 因为修复文件系统是个很庞大的任务。因此,修复时该文件系统不能被挂载。
    • 但是根目录是无法被卸载的。这时就需要进入单人维护或恢复模式,然后通过 -d 这个选项来处理。 加入 -d 这个选项后,系统会强制检验该设备,检验完毕后就会自动重新启动。
  • fsck.ext4处理ext4文件系统

    1
    2
    3
    4
    5
    6
    7
    8
    9
    fsck.ext4 [-pf] [-b superblock] 设备名称
    # 选项与参数:
    # -p :当文件系统在修复时,若有需要回复 y 的动作时,自动回复 y 来继续进行修复动作。
    # -f :强制检查!一般来说,如果 fsck 没有发现任何 unclean 的旗标,不会主动进入
    # 细部检查的,如果您想要强制 fsck 进入细部检查,就得加上 -f 旗标啰!
    # -D :针对文件系统下的目录进行最优化配置。
    # -b :后面接 superblock 的位置!一般来说这个选项用不到。但是如果你的 superblock 因故损毁时,
    # 通过这个参数即可利用文件系统内备份的 superblock 来尝试救援。一般来说,superblock 备份在:
    # 1K block 放在 8193, 2K block 放在 16384, 4K block 放在 32768

7.6 文件系统挂载和卸载、设置启动挂载

  • 挂载的原则:

    • 单一文件系统不应该被重复挂载在不同的挂载点(目录)中;
    • 单一目录不应该重复挂载多个文件系统;
    • 要作为挂载点的目录,理论上应该都是空目录才是。
      • 如果你要用来挂载的目录里面并不是空的,那么挂载了文件系统之后,原目录下的东西就会暂时的消失。注意并不是被覆盖掉, 而是暂时的隐藏了起来。
  • 使用mount命令挂载

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    mount -a
    mount [-l]
    mount [-t 文件系统] LABEL='' 挂载点
    mount [-t 文件系统] UUID='' 挂载点 # 鸟哥近期建议用这种方式喔!
    mount [-t 文件系统] 设备文件名 挂载点
    # 选项与参数:
    # -a :依照配置文件/etc/fstab的数据将所有未挂载的磁盘都挂载上来
    # -l :单纯的输入 mount 会显示目前挂载的信息。加上 -l 可增列Label名称。
    # -t :可以加上文件系统种类来指定欲挂载的类型。常见的 Linux 支持类型有:xfs, ext3, ext4,
    # reiserfs, vfat, iso9660(光盘格式), nfs, cifs, smbfs (后三种为网络文件系统类型)
    # -n :在默认的情况下,系统会将实际挂载的情况实时写入 /etc/mtab 中,以利其他程序的运行。
    # 但在某些情况下(例如单人维护模式)为了避免问题会刻意不写入。此时就得要使用 -n 选项。
    # -o :后面可以接一些挂载时额外加上的参数!比方说帐号、密码、读写权限等:
    # async, sync: 此文件系统是否使用同步写入 (sync) 或非同步 (async) 的
    # 内存机制,请参考文件系统运行方式。默认为 async。
    # atime,noatime: 是否修订文件的读取时间(atime)。为了性能,某些时刻可使用 noatime
    # ro, rw: 挂载文件系统成为只读(ro) 或可读写(rw)
    # auto, noauto: 允许此 filesystem 被以 mount -a 自动挂载(auto)
    # dev, nodev: 是否允许此 filesystem 上,可创建设备文件? dev 为可允许
    # suid, nosuid: 是否允许此 filesystem 含有 suid/sgid 的文件格式?
    # exec, noexec: 是否允许此 filesystem 上拥有可执行 binary 文件?
    # user, nouser: 是否允许此 filesystem 让任何使用者执行 mount ?一般来说,
    # mount 仅有 root 可以进行,但下达 user 参数,则可让
    # 一般 user 也能够对此 partition 进行 mount 。
    # defaults: 默认值为:rw, suid, dev, exec, auto, nouser, and async
    # remount: 重新挂载,这在系统出错,或重新更新参数时,很有用!
    • 基本上,CentOS 7 已经太聪明了,因此你不需要加上 -t 这个选项,系统会自动的分析最恰当的文件系统来尝试挂载你需要的设备。由于文件系统几乎都有 superblock ,我们的 Linux 可以通过分析 superblock 搭配 Linux 自己的驱动程序去测试挂载, 如果成功的套和了,就立刻自动的使用该类型的文件系统挂载起来。一般是根据下面两个文件的信息进行测试:

      • /etc/filesystems:系统指定的测试挂载文件系统类型的优先级;
      • /proc/filesystems:Linux系统已经加载的文件系统类型。、
    • 光驱一旦挂载就无法退出光盘了,除非你将它卸载才能退出。CD或DVD光盘挂载后使用df看占用率是100%的,是因为只读无法写入了。

    • 根目录根本就不能够被卸载。问题是,如果你的挂载参数要改变, 或者是根目录出现【只读】状态时,如何重新挂载呢?最可能的处理方式就是重新开机 (reboot)! 不过你也可以这样做:

      1
      mount -o remount,rw,auto /
    • 我们也可以利用 mount 来将某个目录挂载到另外一个目录去。虽然下面的方法也可以使用 符号链接来代替,不过在某些不支持符号链接的程序运行中,还是得要通过这样的方法才行。通过mount --bind可以把两个目录连接到同一个inode去

      1
      mount --bind /var /data/var
  • 使用umount将设备文件卸载

    1
    2
    3
    4
    5
    umount [-fn] 设备文件名或挂载点
    # 选项与参数:
    # -f :强制卸载!可用在类似网络文件系统 (NFS) 无法读取到的情况下;
    # -l :立刻卸载文件系统,比 -f 还强;
    # -n :不更新 /etc/mtab 情况下卸载。
    • 基本上,卸载后面接设备或挂载点都可以。不过最后一个 centos-root 由于有其他挂载,因此该项目一定要使用挂载点来卸载才行。
  • /etc/fstab设置开机自动挂载

    1
    2
    3
    vim /etc/fstab
    # [设备/UUID等] [挂载点] [文件系统] [文件系统参数] [dump] [fsck]
    mount -a
    • 文件系统参数

      参数 内容意义
      async/sync 非同步/同步 设置磁盘是否以非同步方式运行!默认为 async(性能较佳)
      auto/noauto 自动/非自动 当下达 mount -a 时,此文件系统是否会被主动测试挂载。默认为 auto。
      rw/ro 可读写/只读 让该分区以可读写或者是只读的型态挂载上来,如果你想要分享的数据是不给使用者随意变更的, 这里也能够设置为只读。则不论在此文件系统的文件是否设置 w 权限,都无法写入喔!
      exec/noexec 可执行/不可执行 限制在此文件系统内是否可以进行“执行”的工作?如果是纯粹用来储存数据的目录, 那么可以设置为 noexec 会比较安全。不过,这个参数也不能随便使用,因为你不知道该目录下是否默认会有可执行文件。举例来说,如果你将 noexec 设置在 /var ,当某些软件将一些可执行文件放置于 /var 下时,那就会产生很大的问题喔! 因此,建议这个 noexec 最多仅设置于你自订或分享的一般数据目录。
      user/nouser 允许/不允许使用者挂载 是否允许使用者使用 mount指令来挂载呢?一般而言,我们当然不希望一般身份的 user 能使用 mount 啰,因为太不安全了,因此这里应该要设置为 nouser 啰!
      suid/nosuid 具有/不具有 suid 权限 该文件系统是否允许 SUID 的存在?如果不是可执行文件放置目录,也可以设置为 nosuid 来取消这个功能!
      defaults 同时具有 rw, suid, dev, exec, auto, nouser, async 等参数。 基本上,默认情况使用 defaults 设置即可!
    • dump:能否被 dump 备份指令作用。

    • fsck:是否以 fsck 检验扇区。

    • /etc/fstab 是开机时的配置文件,不过,实际 filesystem 的挂载是记录到 /etc/mtab 与 /proc/mounts 这两个文件当中的。

  • 特殊设备 loop 挂载 (镜像文件不烧录就挂载使用)

    • 挂载CD/DVD镜像文件

      下载了CD/DVD的镜像文件后,不一定需要烧录成为光盘才能够使用该文件里面的数据。我们可以通过 loop 设备来挂载。

      1
      mount -o loop /tmp/CentOS-7.0-1406-x86_64-DVD.iso /data/centos_dvd
    • 创建大文件以制作 loop 设备文件

      既然能够挂载 DVD的镜像文件,那么我能不能制作出一个大文件,然后将这个文件格式化后挂载呢? 当然可以!这个方法可以在不改变原有分区的情况下,额外创造出一块感觉上的分区!

      1
      2
      3
      4
      dd if=/dev/zero of=/srv/loopdev bs=1M count=512 # 创建一个512MB的空文件
      mkfs.xfs -f /srv/loopdev # 格式化创造文件系统
      mount -o loop /srv/loopdev /mnt # 挂载
      df /mnt # 查看文件系统

7.7 修改磁盘、文件系统的参数

  • Linux下所有设备都以文件来表示,但是那个文件如何代表该设备?很简单,就是通过文件的major和minor数值来替代。

  • mknod

    1
    2
    3
    4
    5
    6
    7
    8
    mknod 设备文件名 [bcp] [Major] [Minor]
    # 选项与参数:
    # 设备种类:
    # b :设置设备名称成为一个周边储存设备文件,例如磁盘等;
    # c :设置设备名称成为一个周边输入设备文件,例如鼠标/键盘等;
    # p :设置设备名称成为一个 FIFO 文件;
    # Major :主要设备代码;
    # Minor :次要设备代码;
  • xfs_admin修改 XFS 文件系统的 UUID 与 Label name

    1
    2
    3
    4
    5
    6
    xfs_admin [-lu] [-L label] [-U uuid] 设备文件名
    # 选项与参数:
    # -l :列出这个设备的 label name
    # -u :列出这个设备的 UUID
    # -L :设置这个设备的 Label name
    # -U :设置这个设备的 UUID
  • tune2fs修改 ext4 的 label name 与 UUID

    1
    2
    3
    4
    5
    tune2fs [-l] [-L Label] [-U uuid] 设备文件名
    # 选项与参数:
    # -l :类似 dumpe2fs -h 的功能~将 superblock 内的数据读出来;
    # -L :修改 LABEL name;
    # -U :修改 UUID 。

二、习题解答(非官方,仅为个人练习记录)

  1. 我们常常说,启动的时候,【发现磁盘有问题】,请问,这个问题的产生是【文件系统的损毁】,还是【磁盘的损毁】?

    都可能。

  2. 当我有两个文件,分别是 file1 与 file2 ,这两个文件互为硬链接的文件,请问, 若我将 file1 删除,然后再以类似 vi 的方式重新创建一个名为 file1 的文件, 则 file2 的内容是否会被更动?

    不会。新建的文件有自己的inode和block,文件名只是目录block里的一条记录罢了。