文件系统的管理与文件管理不太一样喔!是在底层进行分割、格式化的动作~还有开机过程出问题要如何处理!?来瞧瞧看看!
系统总有容量不足,或者是需要其他文件系统挂载的时刻,毕竟管理员会经常从不同的来源来取得所需要软件与数据。 因此,管理文件系统就是管理员一个很重要的任务。Linux 文件系统最早使用 Ext2 文件系统家族(包括 EXT2/EXT3/EXT4 等等), 但由于磁盘容量越来大,因此适合大容量的 XFS 文件系统在 CentOS 8 被设为缺省文件系统了。因此读者应该要熟悉这些文件系统的管理才行。
目前 CentOS 8 Linux 文件系统主要支持 EXT2 家族 (目前新版为 EXT4) 以及 XFS 大型文件系统两种。其中 XFS 相当适合大容量磁盘, 格式化的性能非常快。但无论哪种文件系统,都必须要符合 inode 与 block 等文件系统使用的特性。
磁盘内的圆形磁盘盘常见的物理特性如下:
整颗磁盘必须要经过分割之后,Linux 操作系统才能够读取分区内的文件系统。目前的 Linux 磁盘分割主要有两种分割, 分别为早期的 MSDOS 与现今的 GPT。由于 MBR 会有 2TB 容量的限制,但目前的磁盘容量已经都超过 2TB 来到 8TB 以上的等级, 因此 MSDOS 的分割类型就不太适用了。
磁盘文件名主要为 /dev/sd[a-p] 这种实体磁盘的文件名,以及通过 virtio 模块加速的 /dev/vd[a-p] 的虚拟磁盘文件名。 另外,如果使用了软件磁盘数组,或者是 Intel 主板上面内置的磁盘数组时,磁盘文件名则会增加类似 /dev/md126 这类的名称。 由于虚拟机的环境中,大部分磁盘的容量还是小于 2TB 的条件,因此传统的 MSDOS 分割表还是有其存在的需求的。
由于技术的成熟,近年来 SSD 或 M2 插槽的固态硬盘已经使用的越来越广泛,而这些固态硬盘并没有所谓的磁头、磁柱与磁道,因此, 分割工具渐渐则以磁区 (sector) 为单位去进行分割的行为了!这样对于传统磁盘或固态硬盘来说,就会显的一致!
如前所示,由于 MBR 的纪录区块仅有 64 bytes 用在分割表,因此缺省分割表仅能纪录四笔分割信息。 所谓的分割信息即是纪录开始与结束的磁区。这四笔纪录主要为『主要分区 (primary)』与『延伸分区 (extended)』。延伸分割不能被格式化应用, 需要再从延伸分割当中割出『逻辑分割 (logical)』之后,才能够应用。以 P 代表主要、E 代表延伸、L 代表逻辑分区,则相关性为:
常见的磁盘磁区有 512bytes 与 4K 容量,为了兼容于所有的磁盘,因此在磁区的定义上面, 大多会使用所谓的逻辑区块地址(Logical Block Address, LBA)来处理。GPT 将磁盘所有区块以此 LBA(缺省为 512bytes) 来规划,而第一个 LBA 称为 LBA0 (从 0 开始编号)。
与 MSDOS 仅使用第一个 512bytes 区块来纪录不同, GPT 使用了 34 个 LBA 区块来纪录分割信息! 同时与过去 MBR 仅有一个区块的情况不同, GPT 除了前面 34 个 LBA 之外,整个磁盘的最后 33 个 LBA 也拿来作为另一个备份! 因此,如果磁盘前面的分割纪录不小心被恶搞而失去,可以通过分割工具,以磁盘最后方的磁区记载的分割表来复原, 对于信息安全来说,也是相当重要的保护!
LBA2 ~ LBA33 为实际纪录分割表的所在,每个 LBA 纪录 4 笔数据,所以共可纪录 32*4=128 笔以上的分割信息。 因为每个 LBA 为 512bytes,因此每笔纪录可占用 512/4=128 bytes 的纪录,因为每笔纪录主要纪录开始与结束两个磁区的位置, 因此纪录的磁区位置最多可达 64 比特,若每个磁区容量为 512bytes ,则单一分区的最大容量就可以限制到 8ZB, 其中 1ZB 为 2^30 TB。
此外,每笔 GPT 的分割纪录,都是属于 primary 的分割纪录,可以直接拿来进行格式化应用的。
新的操作系统在规划文件系统时,一般文件会有属性(如权限、时间、身份数据纪录等)以及实际数据的纪录, 同时整个文件系统会纪录全部的信息,因此通常文件系统会有如下几个部份:
以 EXT2 文件系统为例,为了简化管理,整个文件系统会将全部的内容分出数个区块群组 (block group), 每个区块群组会有上述的 superblock/inode/block 的纪录,可以下图标意:
superblock 为整个文件系统的总结信息处,要读取文件系统一定要从 superblock 读起。superblock 主要纪录数据为:
每一个 inode 都有号码,而 inode 的内容在记录文件的属性以及该文件实际数据是放置在哪几号 block 内。 inode 记录的文件数据至少有底下这些:
由于每个文件固定会占用一个 inode,而目前文件所记载的属性数据越来约多,因此 inode 有底下几个特色:
文件实际的数据存放在 data block 上面,每个 block 也都会有号码,提供给文件来保存实际数据,也让 inode 可以纪录数据放在哪个 block 号码内。
一般来说,文件系统内的一个文件被读取时,流程是这样的:
至于新建文件的流程则是这样的:
至于删除文件的流程则是这样的:
当用户在 Linux 下的文件系统创建一个目录时,文件系统会分配一个 inode 与至少一块 block 给该目录。其中,inode 记录该目录的相关权限与属性,并可记录分配到的那块 block 号码; 而 block 则是记录在这个目录下的文件名与该文件名占用的 inode 号码数据。也就是说目录所占用的 block 内容在记录如下的信息:
前一小节提到读取文件数据时,最重要的就是读到文件的 inode 号码。然而读者实际操作系统时,并不会理会 inode 号码, 而是通过『文件名』来读写数据的。因此,目录的重要性就是记载文件名与该文件名对应的 inode 号码。
从前一小节的练习当中读者可以发现到目录的缺省链接数 (使用 ls -l 观察文件名的第二个字段) 为 2, 这是因为每个目录底下都有 . 这个文件名,而这个文件名代表目录本身,因此目录本身有两个文件名链接到同一个 inode 号码上, 故链接数至少为 2 。又同时每个目录内都有 .. 这个文件名来代表父目录,因此每增加一个子目录,父目录的链接数也会加 1 。
由于链接数增加后,若文件名删除时,其实 inode 号码并没有被删除,因此这个『实体链接』的功能会保护好原本的文件数据。 用户可以通过 ln 这个指令来达成实体链接与符号链接 (类似捷径) 的功能。
就像U盘放入 windows 操作系统后,需要取得一个 H:\> 或者是其他的磁盘名称后才能够被读取一样, Linux 底下的目录树系统中,文件系统设备要能够被读取,就得要与目录树的某个目录链接在一起,亦即进入该目录即可看到该设备的内容之意。 该目录就被称为挂载点。
观察挂载点的方式最简单为使用 df (display filesystem) 这个指令来观察,而读者也可以通过观察 inode 的号码来了解到挂载点的 inode 号码。
一般来说,创建文件系统需要的动作包括:分割、格式化与挂载三个步骤。而分割又有 MBR 与 GPT 两种方式,实做时需要特别留意。
创建分割之前,需要先判断:(1)目前系统内的磁盘文件名与(2)磁盘目前的分割格式。这两个工作可以使用底下的指令完成:
如果是 GPT 的分割表,请使用 gdisk 指令来分割,若为 msdos (MBR) 分割表,则需要使用 fdisk 来分割。当然, 读者也能够直接参考指令型的 parted 来进行分割,只是指令比较麻烦一些些,并且没有默认值而已。由刚刚上面的练习可以发现到训练机为 GPT 分割表, 因此底下将以 gdisk 来进行分割的行为。首先读者先了解一下 gdisk 的操作界面以及在线查找的方式:
[root@study ~]# gdisk /dev/vda GPT fdisk (gdisk) version 0.8.6 Partition table scan: MBR: protective BSD: not present APM: not present GPT: present Found valid GPT with protective MBR; using GPT. <==找到了 GPT 的分割表! Command (? for help): <==这里可以让你输入指令动作,可以按问号 (?) 来查看可用指令 Command (? for help): ? b back up GPT data to a file c change a partition's name d delete a partition # 删除一个分割 i show detailed information on a partition l list known partition types n add a new partition # 增加一个分割 o create a new empty GUID partition table (GPT) p print the partition table # 印出分割表 (常用) q quit without saving changes # 不保存分割就直接离开 gdisk r recovery and transformation options (experts only) s sort partitions t change a partition's type code v verify disk w write table to disk and exit # 保存分割操作后离开 gdisk x extra functionality (experts only) ? print this menu Command (? for help):
之后开始列出目前这个 /dev/vda 的整体磁盘信息与分割表信息:
Command (? for help): p <== 这里可以输出目前磁盘的状态 Disk /dev/vda: 83886080 sectors, 40.0 GiB # 磁盘文件名/磁区数与总容量 Logical sector size: 512 bytes # 单一磁区大小为 512 bytes Disk identifier (GUID): A4C3C813-62AF-4BFE-BAC9-112EBD87A483 # 磁盘的 GPT 识别码 Partition table holds up to 128 entries First usable sector is 34, last usable sector is 83886046 Partitions will be aligned on 2048-sector boundaries Total free space is 18862013 sectors (9.0 GiB) Number Start (sector) End (sector) Size Code Name # 底下为完整的分割信息了! 1 2048 6143 2.0 MiB EF02 # 第一个分区数据 2 6144 2103295 1024.0 MiB 0700 3 2103296 65026047 30.0 GiB 8E00 # 分割编号 开始磁区号码 结束磁区号码 容量大小 Command (? for help): q # 想要不保存离开吗?按下 q 就对了!不要随便按 w 啊!
接下来请管理员直接创建一个 1GB 的分区。
由于 /dev/vda 磁盘正在使用中,因此内核缺省不会重新去探索分割表的变动,读者需要使用 partprobe 强制内核更新目前使用中的磁盘的分割表, 这样才能够找到正确的设备文件名了。若需要列出内核侦测到的完整分割表,也能使用『 cat /proc/partitions 』来观察。
文件系统的创建使用 mkfs (make filesystem) 即可处理。另外,内存置换应该要使用 mkswap 才对。目前的操作系统大多已经针对文件系统建置时做好优化设置, 因此除非读者有特殊需求,或者是读者知道自己高端磁盘数组的相关参数,否则使用默认值应该就能够取得不错的文件系统性能。
每个磁盘分区的文件系统,都有其各自的识别码,这个识别码应该是独一无二的,建议同学们要认识 UUID 而不要只是记忆磁盘分区的文件名, 这是因为未来要进行挂载时,磁盘的文件名是可能会改变的,但是 UUID 则不会改变!所以,挂载使用时,还是使用 UUID 比较好!
文件系统要挂载时,请先注意到底下的要求:
常见的挂载方式如下:
[root@localhost ~]# mount -a [root@localhost ~]# mount [-l] [root@localhost ~]# mount [-t 文件系统] LABEL='' 挂载点 [root@localhost ~]# mount [-t 文件系统] UUID='' 挂载点 # 建议用这种方式 [root@localhost ~]# 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) 的内存机制 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: 重新挂载,这在系统出错,或重新更新参数时,很有用!
请将 /dev/vda4, /dev/vda5 分别挂载到 /srv/linux, /srv/win 目录内,同时观察挂载的情况。
[root@localhost ~]# mkdir /srv/linux /srv/win [root@localhost ~]# mount /dev/vda4 /srv/linux [root@localhost ~]# mount /dev/vda5 /srv/win [root@localhost ~]# df -T /srv/linux /srv/win 文件系统 类型 1K-区段 已用 可用 已用% 挂载点 /dev/vda4 xfs 1038336 40368 997968 4% /srv/linux /dev/vda5 vfat 1532984 4 1532980 1% /srv/win
通过 df -T 可以查找到整体系统的文件系统挂载状态,如果只是想要查阅到某几个载点的信息,可以如上所示, 直接将载点放在 df 指令后面即可!这样画面也比较干净!至于 swap,这个内存置换并不是文件系统, 所以只能用开/关 (on/off) 的方式来加入/移除内存置换功能而已!请使用 swapon 的方式来启动 /dev/vda6 这个内存置换空间。
[root@localhost ~]# free total used free shared buff/cache available Mem: 1872280 624016 689576 12668 558688 1075544 Swap: 2097148 0 2097148 [root@localhost ~]# swapon /dev/vda6 [root@localhost ~]# swapon -s Filename Type Size Used Priority /dev/dm-1 partition 2097148 0 -2 /dev/vda6 partition 1048572 0 -3 [root@localhost ~]# free total used free shared buff/cache available Mem: 1872280 625264 688252 12668 558764 1074272 Swap: 3145720 0 3145720
开机自动挂载的参数设置档写入在 /etc/fstab 当中,不过在编辑这个文件之前,管理员应该先知道系统挂载的限制:
训练机的 /etc/fstab 这个文件的内容如下:
[root@localhost ~]# cat /etc/fstab
/dev/mapper/centos-root / xfs defaults 0 0
UUID=73f13e7b-43c4-43c5-93b4-9e65b962752d /boot ext4 defaults 1 2
/dev/mapper/centos-home /home xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
这个文件主要有六个字段,每个字段的意义如下:
[设备/UUID等] [挂载点] [文件系统] [文件系统参数] [dump] [fsck]
参数 | 内容意义 |
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 设置即可! |
针对我们训练机的 /etc/fstab 的内容来说,在第 5, 6 字段上,除了 /boot 这个 ext4 的文件系统还有使用之外, 其余的通通设置为 0 了!基本上,连同 ext4 也都能设置为 0 啦!避免未来改写数据时,忘记修改这个字段! 好了,那么让我们来处理一下我们的新建的文件系统,看看能不能开机就挂载呢?
[root@localhost ~]# blkid /dev/vda{4,5,6}
/dev/vda4: UUID="f3f0b058-d9e3-4e78-a4f7-c7d9513513bb" TYPE="xfs" .....
/dev/vda5: UUID="2F4E-C22A" TYPE="vfat" PARTLABEL="Microsoft basic.....
/dev/vda6: UUID="d4e164a3-1e73-40ce-93cb-e3558fbbe8a0" TYPE="swap".....
[root@localhost ~]# vim /etc/fstab
UUID="f3f0b058-d9e3-4e78-a4f7-c7d9513513bb" /srv/linux xfs defaults 0 0
UUID="2F4E-C22A" /srv/win vfat defaults 0 0
UUID="d4e164a3-1e73-40ce-93cb-e3558fbbe8a0" swap swap defaults 0 0
[root@locahost ~]# mount -a [root@locahost ~]# swapon -a [root@locahost ~]# df -T /dev/vda{4,5} 文件系统 类型 1K-区段 已用 可用 已用% 挂载点 /dev/vda4 xfs 1038336 40368 997968 4% /srv/linux /dev/vda5 vfat 1532984 4 1532980 1% /srv/win [root@locahost ~]# swapon -s Filename Type Size Used Priority /dev/dm-1 partition 2097148 0 -2 /dev/vda6 partition 1048572 0 -3
你得要特别注意的是,当上述的设备或挂载点已经被使用时,那么你的 /etc/fstab 内关于该设备或载点的信息,将不会被测试挂载。 所以,上面的练习中,原有的挂载点,亦即是 /, /home 等,其实不会被重新测挂载的。因此,当你要测试时,请先将要被测试的载点卸载, 这样才能够真的测试你的设置是否正确喔!
管理员可能因为某些原因需要将文件系统回收利用,例如抽换旧硬盘来使用等等,因此读者仍须学会如何卸载磁盘。 此外,或许因为设置的问题可能导致开机时因为文件系统的问题而导致无法顺利完成开机的流程,此时就需要额外的修复作业。
若需要将文件系统卸载并回收 (旧的数据需要完整删除),一般建议的流程如下:
管理员如果修改过 /etc/fstab 却忘记使用 mount -a 测试,则当设置错误,非常有可能会无法顺利开机。如果是根目录设置出错,问题会比较严重, 如果是一般正规目录设置错误,则依据该目录的重要性,可能会进入单人维护模式或者是依旧可以顺利开机。底下的练习中,读者将实验让 /home 设置错误, 以尝试进入单人维护模式救援文件系统。
[root@localhost ~]# vim /etc/fstab # 先找到这一行: /dev/mapper/centos-home /home xfs defaults 0 0 # 将上面的数据改成如下的模样 /dev/mapper/centos-home1 /home xfs defaults 0 0
老实说,文件系统设置错误是一个很常见的情况,很多时候是因为 /etc/fstab 手滑打错字产生的问题。所以, 了解怎么解决问题,对于系统管理员来说,也是一个很重要的训练!
作业硬盘一般操作说明:
作业当中,某些部份可能为简答题~若为简答题时,请将答案写入 /home/student/ans.txt 当中,并写好正确题号,方便老师订正答案。 请注意,文件名写错将无法上传!
请使用 root 的身份进行如下实做的任务。直接在系统上面操作,操作成功即可,上传结果的程序会主动找到你的实做结果。
容量 | 文件系统 | 挂载点 |
2GB | XFS | /data/xfs |
1GB | VFAT | /data/vfat |
1.5GB | EXT4 | /data/ext4 |
1GB | swap | - |
作业结果传输:请以 root 的身分运行 vbird_book_check_unit 指令上传作业结果。 正常运行完毕的结果应会出现【XXXXXX_aa:bb:cc:dd:ee:ff_unitNN】字样。若需要查阅自己上传数据的时间, 请在操作系统上面使用浏览器查找: http://192.168.251.254 检查相对应的课程文件。 相关流程请参考: vbird_book_check_unit