- 7.1 认识Linux 档案系统
- 7.1.1 磁碟组成与分割的复习
- 7.1.2档案系统特性索引式档案系统
- 7.1.3 Linux的EXT2档案系统(inode) : data block , inode table , superblock , dumpe2fs
- 7.1.4 与目录树的关系
- 7.1.5 EXT2/EXT3 档案的存取与日志式档案系统的功能
- 7.1.6 Linux 档案系统的运作
- 7.1.7 挂载点的意义(mount point)
- 7.1.8 其他Linux 支援的档案系统与VFS
- 7.1.9 XFS档案系统简介xfs_info
- 7.2 档案系统的简单操作
- 7.2.1磁碟与目录的容量: df , du
- 7.2.2实体连结与符号连结: ln
- 7.3 磁碟的分割、格式化、检验与挂载
- 7.3.1观察磁碟分割状态: , lsblk , blkid , parted
- 7.3.2磁碟分割gdisk/fdisk: gdisk , partprobe , fdisk
- 7.3.3磁碟格式化(建置档案系统): mkfs.xfs , mkfs.xfs for raid , mkfs.ext4 , mkfs
- 7.3.4档案系统检验: xfs_repair , fsck.ext4
- 7.3.5档案系统挂载与卸载: mount , umount
- 7.3.6磁碟/档案系统参数修订mknod , xfs_admin , uuidgen , tune2fs
- 7.4 设定开机挂载
- 7.4.1 开机挂载/etc/fstab 及/etc/mtab
- 7.4.2特殊装置loop挂载(映象档不烧录就挂载使用)挂载DVD , 大型档案 , dd
- 7.5 记忆体置换空间(swap)之建置
- 7.5.1使用实体分割槽建置swap: mkswap , free , swapon , swapoff
- 7.5.2 使用档案建置swap
- 7.6 档案系统的特殊观察与操作
- 7.6.1 磁碟空间之浪费问题
- 7.6.2 利用GNU 的parted 进行分割行为(Optional)
- 7.7 重点回顾
- 7.8 本章习题- 第一题一定要做
- 7.9 参考资料与延伸阅读
- 针对本文的建议:http://phorum.vbird.org/viewtopic.php?t=23881

Linux最传统的磁盘文件系统(filesystem)使用的是EXT2。所以,先讲一下EXT2。又因为文件系统是建立在磁盘上面的。所以还需要了解磁盘的物理组成。

下面就是对磁盘的组成与分割的简要讲解:

磁盘组成与分割

磁盘组成

整个磁盘的组成主要有:

  • 圆形的磁盘盘(主要记录资料的部分);
  • 机械手臂,与在机械手臂上的磁盘读取头(可读写磁盘盘上的资料);
  • 主轴马达,可以转动磁盘,让机械手臂的读取头在磁盘上读写数据。

chapter7 Linux磁盘与文件系统管理 - 图1

磁盘中的术语

磁头(head)、 磁道(track)、 柱面(cylinder)、扇区(sector)、 圆盘(platter)。那么这些都代表着什么呢?

chapter7 Linux磁盘与文件系统管理 - 图2

chapter7 Linux磁盘与文件系统管理 - 图3

磁盘上的资料

既然资料都是写入磁盘盘上头,那么磁盘盘上头的资料又是如何写入的呢?其实磁盘盘上头的资料有点像下面的图示所示:
chapter7 Linux磁盘与文件系统管理 - 图4
图0.2.5、磁盘盘上的资料格式(图片取自维基百科)

当初设计就是在类似磁盘盘同心圆上面切出一个一个的小区块,这些小区块整合成一个圆形,让机器手臂上的读写头去存取。 这个小区块就是磁盘的最小物理储存单位,称之为磁区(sector),那同一个同心圆的磁区组合成的圆就是所谓的磁轨(track)。由于磁盘里面可能会有多个磁盘,因此在所有磁盘上面的同一个磁轨可以组合成所谓的磁柱(cylinder)

我们知道同心圆外圈的圆比较大,占用的面积比内圈多啊!所以,为了善用这些空间,因此外围的圆会具有更多的磁区( 注16 )!就如同图0.2.5的示意一般。 当磁盘盘转一圈时,外圈的磁区数量比较多,因此如果资料写入在外圈,转一圈能够读写的资料量当然比内圈还要多!因此通常数据的读写会由外圈开始往内写的喔!这是预设值啊!


磁盘分割

我们在计算机概论谈过磁盘的组成主要有磁盘盘、机械手臂、磁盘读取头与主轴马达所组成,而资料的写入其实是在磁盘盘上面。磁盘盘上面又可细分出磁区(Sector)磁轨(Track)两种单位,其中磁区的物理量设计有两种大小,分别是512bytes与4Kbytes。假设磁盘只有一个磁盘盘,那么磁盘盘有点像底下这样:
chapter7 Linux磁盘与文件系统管理 - 图5
图2.2.1、磁盘盘组成示意图

那么是否每个磁区都一样重要呢?其实整颗磁盘的第一个磁区特别的重要,因为他记录了整颗磁盘的重要信息!

早期磁盘第一个磁区里面含有的重要资讯我们称为MBR (Master Boot Record) 格式,但是由于近年来磁盘的容量不断扩大,造成读写上的一些困扰, 甚至有些大于2TB 以上的磁盘分割已经让某些操作系统无法存取。因此后来又多了一个新的磁盘分割格式,称为GPT (GUID partition table)!这两种分割格式与限制不太相同啦!

那么分割表(分区表)又是啥?其实妳刚刚拿到的整颗硬盘就像一根原木,你必须要在这根原木上面切割出你想要的区段, 这个区段才能够再制作成为你想要的家具!如果没有进行切割,那么原木就不能被有效的使用。同样的道理,你必须要针对你的硬盘进行分割,这样硬盘才可以被你使用的!


复习完上面内容之后。我们知道数据储存与读取的重点在于磁盘盘,而磁盘盘上的物理组成则为(假设此磁碟为单碟片,磁碟盘图示请参考上面的图式 ):

  • 磁区(Sector)为最小的物理储存单位,且依据磁碟设计的不同,目前主要有512bytes 与4K 两种格式;
  • 将磁区组成一个圆,那就是磁柱(Cylinder)
  • 早期的分割主要以磁柱为最小分割单位,现在的分割通常使用磁区为最小分割单位(每个磁区都有其号码,就好像座位一样);
  • 磁碟分割表主要有两种格式,一种是限制较多的MBR 分割表一种是**较新且限制较少的GPT 分割表**。
  • MBR 分割表中,第一个磁区最重要,里面有:(1)主要开机区(Master boot record, MBR) 及 分割表(partition table), 其中MBR 占有446 bytes,而分割表(partition table )则占有64 bytes 。
  • GPT 分割表除了分割数量扩充较多之外,支援的磁碟容量也可以超过2TB。

至于磁盘的文件名部份,基本上,所有实体磁碟的档名都已经被模拟成/dev/sd[ap] 的格式,第一颗磁碟档名为/dev/sda。而分割槽的档名若以第一颗磁碟为例,则为/dev/sda[1-128] 。除了实体磁碟之外,虚拟机的磁碟通常为/dev/vd[ap] 的格式。若有使用到软体磁碟阵列的话,那还有/dev/md[0-128] 的磁碟档名。使用的是LVM 时,档名则为/dev/VGNAME/LVNAME 等格式。关于软体磁碟阵列与LVM 我们会在后面继续介绍,这里主要介绍的以实体磁碟及虚拟磁碟为主喔!

  • /dev/sd[ap][1-128]:为实体**磁碟**的磁碟档名;
  • /dev/vd[ad][1-128]:为虚拟**磁碟**的磁碟档名。

文件系统特性⭐

image.png
磁碟分割完毕后还需要进行格式化(format),之后操作系统才能够使用这个文件系统。

为什么需要进行『格式化』呢? 这是因为每种操作系统所设定的文件属性/权限并不相同, 为了存放这些文件所需的资料,因此就需要将分割槽进行格式化,以成为操作系统能够利用的『文件系统格式(filesystem )』。

每种操作系统的文件系统并不相同。(默认情况:windows作业系统是不会认识Linux的Ext2的)

例如:windows 98的文件系统是FAT(或FAT16);windows 2000以后的版本有所谓的NTFS文件系统; 至于Linux的正统文件系统则为Ext2 (Linux second extended file system , ext2fs )

文件系统如何工作?

image.png
这与操作系统的文件数据有关。较新的操作系统的文件数据除了文件实际内容外,通常含有非常多的属性,例如Linux作业系统的文件权限(rwx) 与 文件属性(拥有者、群组、时间参数等)。

文件系统通常会将这两部份的资料分别存放在不同的区块:

  • 权限**属性放置到inode中**,一个档案占用一个inode。
  • 至于实际资料**则放置到data block区块中**。若档案太大时,会占用多个block 。

还有一个超级区块(superblock)会记录整个文件系统的整体资讯,包括inode与block的总量、使用量、剩余量等。

索引式文件系统

inode 与block 区块用图解来说明一下:

chapter7 Linux磁盘与文件系统管理 - 图8
文件系统先格式化出inode 与block 的区块,假设某一个文件的属性与权限资料是放置到inode 4 号(上图图较小方格内),而这个inode 记录了文件资料的实际放置点为2, 7, 13, 15 这四个block 号码,此时我们的作业系统就能够据此来排列磁碟的读取顺序,可以一口气将四个block 内容读出来!那么资料的读取就如同下图中的箭头所指定的模样了。这种资料存取的方法我们称为索引式文件系统(indexed allocation)**。**

那有没有其他的惯用档案系统可以比较一下啊?有的,那就是我们惯用的随身碟(快闪记忆体),随身碟使用的档案系统一般为FAT格式。FAT这种格式的档案系统并没有inode存在,所以FAT没有办法将这个档案的所有block在一开始就读取出来。每个block号码都记录在前一个block当中,他的读取方式有点像底下这样: chapter7 Linux磁盘与文件系统管理 - 图9 图7.1.2、FAT档案系统资料存取示意图 上图中我们假设档案的资料依序写入1->7->4->15号这四个block 号码中, 但这个档案系统没有办法一口气就知道四个block 的号码,他得要一个一个的将block 读出后,才会知道下一个block 在何处。如果同一个档案资料写入的block 分散的太过厉害时,则我们的磁碟读取头将无法在磁碟转一圈就读到所有的资料, 因此磁碟就会多转好几圈才能完整的读取到这个档案的内容!

『磁盘重组』
需要磁碟重组的原因就是档案写入的block太过于离散了,此时档案读取的效能将会变的很差所致。 这个时候可以透过磁碟重组将同一个档案所属的blocks汇整在一起,这样资料的读取会比较容易啊! 想当然尔,FAT的档案系统需要时不时的磁碟重组一下,那么Ext2是否需要磁碟重整呢?

由于Ext2 是索引式档案系统,基本上不太需要常常进行磁碟重组的。但是如果档案系统使用太久, 常常删除/编辑/新增档案时,那么还是可能会造成档案资料太过于离散的问题,此时或许会需要进行重整一下的。

Linux中的EXT2文件系统⭐

文件系统一开始就将inode与block规划好了,除非重新格式化(或者利用 resize2fs 等指令变更文件系统大小),否则inode与block固定后就不再变动

为了防止inode与block的数量太庞大,Ext2 文件系统在格式化的时候是划分为多个区块群组(block group) 的,每个区块群组都有独立的 inode/block/superblock 系统。

感觉上就好像我们在当兵时,一个营里面有分成数个连,每个连有自己的联络系统, 但最终都向营部回报连上最正确的资讯一般!这样分成一群群的比较好管理!

Ext2 格式化后有点像底下这样:
chapter7 Linux磁盘与文件系统管理 - 图10
EXT2 文件系统示意图

至于每一个区块群组(block group)的六个主要内容说明如后:

data block (资料区块)

image.png
在Ext2文件系统中所支持的block大小有1K, 2K及4K三种而已。在格式化时block的大小就固定了,且每个block都有编号,以方便inode的记录。

因block带下造成的限制:

  • 原则上,block 的大小与数量在格式化完就不能够再改变了(除非重新格式化);
  • 每个block 内最多只能够放置一个文件的数据;
  • 承上,如果文件大于block 的大小,则一个文件会占用多个block 数量;
  • 承上,若文件小于block ,则该block 的剩余容量就不能够再被使用了(磁碟空间会浪费)。


inode table (inode 表格)

image.png
inode记录的文件数据至少有底下这些:

  • 该文件的存取模式(read/write/excute);
  • 该文件的拥有者与群组(owner/group);
  • 该文件的容量;
  • 该文件建立或状态改变的时间(ctime);
  • 最近一次的读取时间(atime);
  • 最近修改的时间(mtime);
  • 定义文件特性的旗标(flag),如SetUID…;
  • 该文件真正内容的指向(pointer);

inode 的特色:(inode 的数量与大小也是在格式化时就已经固定了

  • 每个inode 大小均固定为128 bytes (新的ext4 与xfs 可设定到256 bytes);
  • 每个文件都仅会占用一个inode 而已;
  • 承上,因此文件系统能够建立的文件数量与inode 的数量有关;
  • 系统读取文件时需要先找到inode,并分析inode 所记录的权限与使用者是否符合,若符合才能够开始实际读取 block 的内容。


EXT2 的inode / block 与文件大小的关系

我们的系统很聪明的将inode 记录block 号码的区域定义为:

  • 12个直接
  • 一个间接**, 一个双间接一个三间接**记录区。

这是啥?我们将inode 的结构画一下好了。

chapter7 Linux磁盘与文件系统管理 - 图13
node 结构示意图

上图最左边为inode本身(128 bytes)【最新的扩展到256bytes】,里面有12个直接指向block号码的对照,这12笔记录就能够直接取得block号码啦!至于所谓的间接就是再拿一个block来当作记录block号码的记录区,如果文件太大时,就会使用间接的block来记录号码。

Superblock (超级区块)

image.png
Superblock 是记录整个filesystem 相关信息的地方, 没有Superblock ,就没有这个filesystem 了。他记录的信息主要有:

  • block 与inode 的总量;
  • 未使用与已使用的inode / block 数量;
  • block 与inode 的大小 (block 为1, 2, 4K,inode 为128bytes 或256bytes);
  • filesystem 的挂载时间、最近一次写入资料的时间、最近一次检验磁碟(fsck) 的时间等档案系统的相关资讯;
  • 一个valid bit 数值,若此档案系统已被挂载,则valid bit 为0 ,若未被挂载,则valid bit 为1 。

superblock的大小为1024bytes

superblock与block group的关系:**
除了第一个block group 内会含有superblock 之外,后续的block group 不一定含有superblock ,而若含有superblock 则该superblock 主要是做为第一个block group 内superblock 的备份,这样可以进行superblock的救援呢!

Filesystem Description (文件系统描述说明)

image.png
这个区段可以描述每个block group的开始与结束的block号码,以及说明每个区段(superblock, bitmap, inodemap, data block)分别介于哪一个block号码之间。这部份也能够用dumpe2fs来观察的。

block bitmap (区块对照表)

image.png
**

inode bitmap (inode 对照表)

image.png
**

dumpe2fs:查询Ext 家族superblock 信息的指令

image.png

[root@study ~]# dumpe2fs [-bh] 设备文件名
选项与参数:
-b :列出保留为坏轨的部分(一般用不到吧!?)
-h :仅列出superblock 的资料,不会列出其他的区段内容!

与目录树的关系⭐

目录

image.png
当我们在Linux下的档案系统建立一个目录时,档案系统会分配一个inode至少一块block给该目录。
其中:

  • inode记录该目录的相关权限与属性,并可记录分配到的那块block号码;
  • block则是记录在这个目录下的文件名该文件名名占用的inode号码资料。目录所占用的block内容在记录如下:

chapter7 Linux磁盘与文件系统管理 - 图20

目录树读取

image.png
inode本身并不记录文件名文件名的记录是在目录的block当中。
**

7.1.5 EXT2/EXT3/EXT4 文件案的存取与日志式文件系统的功能

如果是新建一个档案或目录时,我们的档案系统是如何处理的呢?这个时候就得要block bitmap 及inode bitmap 的帮忙了!假设我们想要新增一个档案,此时档案系统的行为是:

  1. 确定使用者对于欲新增档案的目录是否具有w 与x 的权限,若有的话才能新增;
  2. 根据inode bitmap 找到没有使用的inode 号码,并将新档案的权限/属性写入;
  3. 根据block bitmap 找到没有使用中的block 号码,并将实际的资料写入block 中,且更新inode 的block 指向资料;
  4. 将刚刚写入的inode 与block 资料同步更新inode bitmap 与block bitmap,并更新superblock 的内容。

一般来说,我们将inode table与data block称为资料存放区域,至于其他例如superblock、 block bitmap与inode bitmap等区段就被称为metadata (中介资料),因为superblock, inode bitmap及block bitmap的资料是经常变动的,每次新增、移除、编辑时都可能会影响到这三个部分的资料,因此才被称为中介资料的啦。

资料的不一致(Inconsistent) 状态

例如你的档案在写入档案系统时,因为不知名原因导致系统中断(例如突然的停电啊、系统核心发生错误啊~等等的怪事发生时),所以写入的资料仅有inode table及data block而已,最后一个同步更新中介资料的步骤并没有做完,此时就会发生metadata的内容与实际资料存放区产生不一致(Inconsistent)的情况了。

在早期的Ext2档案系统中,如果发生这个问题,那么系统在重新开机的时候,就会藉由Superblock当中记录的valid bit (是否有挂载)与filesystem state (clean与否)等状态来判断是否强制进行资料一致性的检查!若有需要检查时则以e2fsck这支程式来进行的。

不过,这样的检查真的是很费时~因为要针对metadata 区域与实际资料存放区来进行比对, 呵呵~得要搜寻整个filesystem 呢~如果你的档案系统有100GB 以上,而且里面的档案数量又多时, 哇!系统真忙碌~而且在对Internet 提供服务的伺服器主机上面, 这样的检查真的会造成主机复原时间的拉长~真是麻烦~这也就造成后来所谓**日志式档案系统**的兴起了

日志式档案系统(Journaling filesystem)

如果在我们的filesystem 当中规划出一个区块,该区块专门在记录写入或修订档案时的步骤, 那不就可以简化一致性检查的步骤了?也就是说:

  1. 预备:当系统要写入一个档案时,会先在日志记录区块中纪录某个档案准备要写入的资讯;
  2. 实际写入:开始写入档案的权限与资料;开始更新metadata 的资料;
  3. 结束:完成资料与metadata 的更新后,在日志记录区块当中完成该档案的纪录。

万一资料的纪录过程当中发生了问题,那么我们的系统只要去检查日志记录区块, 就可以知道哪个档案发生了问题,针对该问题来做一致性的检查即可,而不必针对整块filesystem 去检查, 这样就可以达到快速修复filesystem 的能力了!这就是日志式档案最基础的功能。

ext2可达到这样的功能吗?当然可以啊!就透过ext3/ext4即可!ext3/ext4是ext2的升级版本,并且可向下相容ext2版本呢!所以啰,目前我们才建议大家,可以直接使用ext4这个filesystem啊!

7.1.6 Linux 文件系统的运作

所有的资料都得要载入到记忆体后CPU才能够对该资料进行处理。想一想,如果你常常编辑一个好大的档案,在编辑的过程中又频繁的要系统来写入到磁碟中,由于磁碟写入的速度要比记忆体慢很多,因此你会常常耗在等待磁碟的写入/读取上。真没效率

为了解决这个效率的问题,因此我们的Linux 使用的方式是透过一个称为非同步处理(asynchronously) 的方式。所谓的非同步处理是这样的:

  • 当系统载入一个档案到记忆体后,如果该档案没有被更动过,则在记忆体区段的档案资料会被设定为干净(clean)的。 但如果记忆体中的档案资料被更改过了(例如你用nano去编辑过这个档案),此时该记忆体中的资料会被设定为脏的(Dirty)。此时所有的动作都还在记忆体中执行,并没有写入到磁碟中系统会不定时的将记忆体中设定为『Dirty』的资料写回磁碟,以保持磁碟与记忆体资料的一致性。(注:你也可以利用第四章谈到的sync指令来手动强迫写入磁碟)

记忆体的速度要比磁碟快的多,因此如果能够将常用的档案放置到记忆体当中,这不就会增加系统性能吗?因此我们Linux 系统上面档案系统与记忆体有非常大的关系:

  • 系统会将常用的档案资料放置到主记忆体的缓冲区,以加速档案系统的读/写;
  • 承上,因此Linux 的实体记忆体最后都会被用光!这是正常的情况!可加速系统效能;
  • 你可以手动使用sync 来强迫记忆体中设定为Dirty 的档案回写到磁碟中;
  • 若正常关机时,关机指令会主动呼叫sync 来将记忆体的资料回写入磁碟内;
  • 但若不正常关机(如跳电、当机或其他不明原因),由于资料尚未回写到磁碟内, 因此重新开机后可能会花很多时间在进行磁碟检验,甚至可能导致档案系统的损毁(非磁碟损毁)。

**

7.1.7 挂载点的意义(mount point)

每个filesystem都有独立的inode / block / superblock等资讯,这个档案系统要能够连结到目录树才能被我们使用。将 文件系统 与 目录树 结合的动作我们称为『挂载』。

注意:挂载点一定是目录,该目录为进入该文件系统的入口

因此并不是你有任何档案系统都能使用,必须要『挂载』到目录树的某个目录后,才能够使用该档案系统的。


7.1.8 其他Linux 支持的文件系统与VFS

Linux 还有支援很多档案系统格式的, 尤其是最近这几年推出了好几种速度很快的日志式档案系统,包括SGI 的XFS 档案系统, 可以适用更小型档案的Reiserfs 档案系统,以及Windows 的FAT 档案系统等等, 都能够被Linux 所支援喔!常见的支援档案系统有:

  • 传统档案系统:ext2 / minix / MS-DOS / FAT (用vfat 模组) / iso9660 (光碟)等等;
  • 日志式档案系统: ext3 /ext4 / ReiserFS / Windows’ NTFS / IBM’s JFS / SGI’s XFS / ZFS
  • 网路档案系统: NFS / SMBFS


Linux VFS (Virtual Filesystem Switch)

整个Linux 的系统都是透过一个名为Virtual Filesystem Switch 的核心功能去读取filesystem 的。整个Linux 认识的filesystem 其实都是VFS 在进行管理,我们使用者并不需要知道每个partition 上头的 filesystem 是什么,VFS 会主动的帮我们做好读取的动作。
chapter7 Linux磁盘与文件系统管理 - 图22
图7.1.6、VFS 档案系统的示意图

7.1.9 XFS 文件系统简介

CentOS 7 开始,预设的档案系统已经由原本的EXT4 变成了XFS 档案系统了!

EXT 家族当前较伤脑筋的地方:支援度最广,但格式化超慢!

  • Ext 档案系统家族对于档案格式化的处理方面,采用的是预先规划出所有的inode/block/meta data 等资料,未来系统可以直接取用, 不需要再进行动态配置的作法。但是当磁碟容量越来越大,传统ext 家族档案系统在格式化的时候,光是系统要预先分配inode 与block 就消耗你好多好多的人类时间了


  • 另外,由于虚拟化的应用越来越广泛,而作为虚拟化磁碟来源的巨型档案(单一档案好几个GB 以上!) 也就越来越常见了。这种巨型档案在处理上需要考虑到效能问题,否则虚拟磁碟的效率就会不太好看。

XFS文件系统的配置

xfs 就是被开发来用于高容量磁碟以及高效能档案系统之用。
几乎所有Ext4 档案系统有的功能, xfs 都可以具备!

xfs 档案系统在资料的分布上,主要规划为三个部份,一个资料区(data section)一个档案系统活动登录区(log section)以及一个即时运作区(realtime section)。这三个区域的资料内容如下:

  • 资料区(data section)
    • 资料区就跟我们之前谈到的ext 家族一样,包括inode/data block/superblock 等资料,都放置在这个区块。这个资料区与ext 家族的block group 类似,也是分为多个储存区群组(allocation groups) 来分别放置档案系统所需要的资料。每个储存区群组都包含了(1)整个档案系统的superblock、 (2)剩余空间的管理机制、 (3)inode的分配与追踪。此外,inode与block 都是系统需要用到时, 这才动态配置产生,所以格式化动作超级快
    • 与ext 家族不同的是, xfs 的block 与inode 有多种不同的容量可供设定,block 容量可由512bytes ~ 64K 调配,不过,Linux 的环境下, 由于内存控制的关系(分页档pagesize 的容量之故),因此最高可以使用的block 大小为4K 而已!


  • 文件系统活动登录区(log section)
    • 主要被用来纪录档案系统的变化,其实有点像是日志区。档案的变化会在这里纪录下来,直到该变化完整的写入到资料区后, 该笔纪录才会被终结。如果档案系统因为某些缘故(例如最常见的停电) 而损毁时,系统会拿这个登录区块来进行检验,看看系统挂掉之前, 档案系统正在运作些啥动作,借以快速的修复档案系统。
    • 因为系统所有动作的时候都会在这个区块做个纪录,因此这个区块的磁碟活动是相当频繁的!
    • xfs 设计有点有趣,在这个区域中, 妳可以指定外部的磁碟来作为xfs 档案系统的日志区块喔!


  • 即时运作区(realtime section)
    • 当有文件要被建立时,xfs 会在这个区段里面找一个到数个的extent 区块,将文件放置在这个区块内,等到分配完毕后,再写入到data section 的inode 与block 去!
    • 这个extent 区块的大小得要在格式化的时候就先指定,最小值是4K 最大可到1G。一般非磁碟阵列的磁碟预设为64K 容量,而具有类似磁碟阵列的stripe 情况下,则建议extent 设定为与stripe 一样大较佳。这个extent 最好不要乱动,因为可能会影响到实体磁碟的效能。


XFS 文件系统的描述资料观察

可以使用xfs_info 去观察的!详细的指令作法可以参考如下:

| [root@study ~]# xfs_info 挂载点|装置档名

范例一:找出系统/boot这个挂载点底下的档案系统的superblock纪录 [root@study ~]# df -T /boot Filesystem Type 1K-blocks Used Available Use% Mounted on /dev/vda2 xfs 1038336 133704 904632 13% /boot

没错!可以看得出来是xfs 档案系统的!来观察一下内容吧!

[root@study ~]# xfs_info /dev/vda2 1 meta-data=/dev/vda2 isize=256 agcount=4, agsize=65536 blks 2 = sectsz=512 attr=2, projid32bit=1 3 = crc=0 finobt=0 4 data = bsize=4096 blocks=262144, imaxpct=25 5 = sunit=0 swidth=0 blks 6 naming =version 2 bsize=4096 ascii-ci=0 ftype=0 7 log =internal bsize=4096 blocks=2560, version=2 8 = sectsz=512 sunit=0 blks, lazy-count=1 9 realtime =none extsz=4096 blocks=0, rtextents=0 | | —- |

7.2 文件系统的简单操作

7.2.1 磁盘与目录的容量

磁盘的整体资料是在superblock 区块中,但是每个各别文件的容量则在inode 当中记载的。那在文字介面底下该如何叫出这几个资料呢?底下就让我们来谈一谈这两个指令:

df:列出文件系统的整体磁碟使用量;
du:评估文件系统的磁碟使用量(常用在推估目录所占容量)。

  • df | [root@study ~]# df [-ahikHTm] [目录或档名] 选项与参数: -a :列出所有的档案系统,包括系统特有的/proc 等档案系统; -k :以KBytes 的容量显示各档案系统; -m :以MBytes 的容量显示各档案系统; -h :以人们较易阅读的GBytes, MBytes, KBytes 等格式自行显示; -H :以M=1000K 取代M=1024K 的进位方式; -T :连同该partition 的filesystem 名称(例如xfs) 也列出; -i :不用磁碟容量,而以inode 的数量来显示

范例一:将系统内所有的filesystem列出来! [root@study ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/centos-root 10475520 3409408 7066112 33% / devtmpfs 627700 0 627700 0% /dev tmpfs 637568 80 637488 1% /dev/shm tmpfs 637568 24684 612884 4% /run tmpfs 637568 0 637568 0% /sys/fs/cgroup /dev/mapper/centos-home 5232640 67720 5164920 2% /home /dev/vda2 1038336 133704 904632 13% /boot

在Linux 底下如果df 没有加任何选项,那么预设会将系统内所有的

(不含特殊记忆体内的档案系统与swap) 都以1 Kbytes 的容量来列出来!

至于那个/dev/shm 是与记忆体有关的挂载,先不要理他! |

| —- |

先来说明一下范例一所输出的结果讯息为:

  • Filesystem:代表该档案系统是在哪个partition ,所以列出装置名称;
  • 1k-blocks:说明底下的数字单位是1KB呦!可利用-h或-m来改变容量;
  • Used:顾名思义,就是使用掉的磁碟空间啦!
  • Available:也就是剩下的磁碟空间大小;
  • Use%:就是磁碟的使用率啦!如果使用率高达90%以上时,最好需要注意一下了,免得容量不足造成系统问题喔!(例如最容易被灌爆的/var/spool/mail这个放置邮件的磁碟)
  • Mounted on:就是磁碟挂载的目录所在啦!(挂载点啦!)

由于df 主要读取的资料几乎都是针对一整个档案系统,因此读取的范围主要是在Superblock 内的资讯, 所以这个指令显示结果的速度非常的快速
在显示的结果中你需要特别留意的是那个根目录的剩余容量!因为我们所有的资料都是由根目录衍生出来的,因此当根目录的剩余容量剩下0 时,那你的Linux 可能就问题很大了。

  • du | [root@study ~]# du [-ahskm]档案或目录名称 选项与参数: -a :列出所有的档案与目录容量,因为预设仅统计目录底下的档案量而已。 -h :以人们较易读的容量格式(G/M) 显示; -s :列出总量而已,而不列出每个各别的目录占用容量; -S :不包括子目录下的总计,与-s 有点差别。 -k :以KBytes 列出容量显示; -m :以MBytes 列出容量显示;

范例一:列出目前目录下的所有档案容量 [root@study ~]# du 4 ./.cache/dconf <==每个目录都会列出来 4 ./.cache/abrt 8 ./.cache ….(中间省略)…. 0 ./test4 4 ./.ssh <==包括隐藏档的目录 76 . <==这个目录(.)所占用的总量

直接输入du没有加任何选项时,则du会分析『目前所在目录』

的档案与目录所占用的磁碟空间。但是,实际显示时,仅会显示目录容量(不含档案),

因此. 目录有很多档案没有被列出来,所以全部的目录相加不会等于. 的容量喔!

此外,输出的数值资料为1K 大小的容量单位。

范例二:同范例一,但是将档案的容量也列出来 [root@study ~]# du -a 4 ./.bash_logout <==有档案的列表了 4 ./.bash_profile 4 ./.bashrc ….(中间省略)…. 4 ./.ssh/known_hosts 4 ./.ssh 76 .

范例三:检查根目录底下每个目录所占用的容量 [root@study ~]# du -sm /* 0 /bin 99 /boot ….(中间省略)…. du: cannot access ‘/proc/17772/task/17772/fd/4’: No such file or directory du: cannot access ‘/proc/17772/fdinfo/4’: No such file or directory 0 /proc <==不会占用硬碟空间! 1 /root 25 /run ….(中间省略)…. 3126 /usr <==系统初期最大就是他了啦! 117 /var

这是个很常被使用的功能~利用万用字元* 来代表每个目录,如果想要检查某个目录下,

哪个次目录占用最大的容量,可以用这个方法找出来。值得注意的是,如果刚刚安装好Linux 时,

那么整个系统容量最大的应该是/usr 。而/proc 虽然有列出容量,但是那个容量是在记忆体中,

不占磁碟空间。至于/proc 里头会列出一堆『No such file or directory』 的错误,

别担心!因为是记忆体内的程序,程序执行结束就会消失,因此会有些目录找不到,是正确的! |

| —- |

与df 不一样的是,du 这个指令其实会直接到文件系统内去搜寻所有的档案资料, 所以上述第三个范例指令的运作会执行一小段时间
此外,在预设的情况下,容量的输出是以KB 来设计的, 如果你想要知道目录占了多少MB ,那么就使用-m 这个参数即可啰!
而, 如果你只想知道该目录占了多少容量的话,使用-s 就可以!

至于-S 这个选项部分,由于du 预设会将所有档案的大小均列出,因此假设你在/etc 底下使用du 时, 所有的档案大小,包括/etc 底下的次目录容量也会被计算一次。然后最终的容量(/etc) 也会加总一次, 因此很多朋友都会误会du 分析的结果不太对劲。所以啰,如果想要列出某目录下的全部资料, 或许也可以加上-S 的选项,减少次目录的加总喔!
**

7.2.2 实体连结 与 符号连结: ln

在Linux 底下的连结档有两种,

  • 一种是类似Windows 的捷径功能的档案,可以让你快速的连结到目标档案(或目录);
  • 另一种则是透过档案系统的inode 连结来产生新档名,而不是产生新档案!这种称为实体连结(hard link)

Hard Link (实体连结, 硬式连结或实际连结)

在前一小节当中,我们知道几件重要的资讯,包括:

  • 每个文件都会占用一个inode ,档案内容由inode 的记录来指向;
  • 想要读取该文件,必须要经过目录记录的文件名来指向到正确的inode 号码才能读取。

也就是说,其实**档名与目录有关,但是档案内容与inode有关
那么想一想,
有没有可能有多个档名对应到同一个inode号码呢?有的!那就是hard link的由来。所以简单的说:hard link只是在某个目录下新增一笔档名连结到某inode号码的关连记录而已**。

例如:假设我系统有个/root/crontab 他是/etc/crontab 的实体连结,也就是说这两个档名连结到同一个inode , 自然这两个档名的所有相关资讯都会一模一样(除了档名之外)。实际的情况可以如下所示:

| [root@study ~]# ll -i /etc/crontab 34474855 -rw-r—r—. 1 root root 451 Jun 10 2014 /etc/crontab

[root@study ~]# ln /etc/crontab . <==建立实体连结的指令 [root@study ~]# ll -i /etc/crontab crontab 34474855 -rw-r—r—. 2 root root 451 Jun 10 2014 crontab 34474855 -rw-r—r—. 2 root root 451 Jun 10 2014 /etc/crontab | | —- |

你可以发现两个档名都连结到34474855这个inode号码,是否档案的权限/属性完全一样呢?因为这两个『档名』其实是一模一样的『档案』啦!而且你也会发现第二个栏位由原本的1变成2了!那个栏位称为『连结』,这个栏位的意义为:『有多少个档名连结到这个inode号码』的意思。如果将读取到正确资料的方式画成示意图,就类似如下画面:
chapter7 Linux磁盘与文件系统管理 - 图23
图7.2.1、实体连结的档案读取示意图
上图的意思是:你可以透过1或2的目录之inode指定的block找到两个不同的档名,而不管使用哪个档名均可以指到real那个inode去读取到最终资料!
那这样有什么好处呢?

  • 最大的好处就是『安全』!如同上图中, 如果你将任何一个『档名』删除,其实inode与block都还是存在的! 此时你可以透过另一个『档名』来读取到正确的档案资料喔!
  • 此外,不论你使用哪个『档名』来编辑,最终的结果都会写入到相同的inode与block中,因此均能进行资料的修改!

一般来说使用hard link 设定连结档时,磁碟的空间与inode 的数目都不会改变!我们还是由图7.2.1 来看,由图中可以知道, hard link 只是在某个目录下的block 多写入一个关连资料而已,既不会增加inode 也不会耗用block 数量!

但有时候,hard link 的制作中,其实还是可能会改变系统的block 的,那就是当你新增这笔资料却刚好将目录的block 填满时,就可能会新加一个block 来记录档名关连性,而导致磁碟空间的变化!不过,一般hard link 所用掉的关连资料量很小,所以通常不会改变inode 与磁碟空间的大小喔!

由图7.2.1 其实我们也能够知道,事实上hard link 应该仅能在单一档案系统中进行的,应该是不能够跨档案系统才对!因为图7.2.1 就是在同一个filesystem 上嘛!所以hard link 是有限制的:

  • 不能跨Filesystem
  • 不能link 目录。(原因:避免出现多个父目录。如下解释)

image.png

Symbolic Link (符号连结,亦即捷径)

Symbolic link就是在建立一个独立的档案,而这个档案会让资料的读取指向他link的那个档案的档名!由于只是利用档案来做为指向的动作,所以,当来源档被删除之后,symbolic link的档案会『开不了』,会一直说『无法开启某档案!』。实际上就是找不到原始『档名』而已啦!

例如:我们先建立一个符号连结档连结到/etc/crontab 去看看:

| [root@study ~]# ln -s /etc/crontab crontab2 [root@study ~]# 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 | | —- |

由上表的结果我们可以知道两个档案指向不同的inode号码,当然就是两个独立的档案存在!而且连结档的重要内容就是他会写上目标档案的『档名』。
你可以发现为什么上表中连结档的大小为12 bytes呢?因为箭头(—>)右边的档名『/etc/crontab』总共有12个英文,每个英文占用1个bytes ,所以档案大小就是12bytes了

关于上述的说明,我们以如下图示来解释:
chapter7 Linux磁盘与文件系统管理 - 图25
图7.2.2、符号连结的档案读取示意图
由1 号inode 读取到连结档的内容仅有档名,根据档名连结到正确的目录去取得目标档案的inode , 最终就能够读取到正确的资料了。你可以发现的是,如果目标档案(/etc/crontab)被删除了,那么整个环节就会无法继续进行下去, 所以就会发生无法透过连结档读取的问题了!

这个Symbolic Link与Windows的捷径可以给他划上等号,由Symbolic link所建立的档案为一个独立的新的档案,所以会占用掉inode与block

制作连接档的指令:ln

| [root@study ~]# ln [-sf]来源档目标档 选项与参数: -s :如果不加任何参数就进行连结,那就是hard link,至于-s就是symbolic link -f :如果目标档存在时,就主动的将目标档直接移除后再建立!

范例一:将/etc/passwd复制到/tmp底下,并且观察inode与block [root@study ~]# cd /tmp [root@study tmp]# cp -a /etc/passwd . [root@study tmp]# du -sb ; df -i . 6602 . <==先注意一下这里的容量是多少! Filesystem Inodes IUsed IFree IUse% Mounted on /dev/mapper/centos-root 10485760 109748 10376012 2% /

利用du与df来检查一下目前的参数~那个du -sb是计算整个/tmp底下有多少bytes的容量啦!

范例二:将/tmp/passwd制作hard link成为passwd-hd档案,并观察档案与容量 [root@study tmp]# ln passwd passwd-hd [root@study tmp]# du -sb ; df -i . 6602 . Filesystem Inodes IUsed IFree IUse% Mounted on /dev/mapper/centos-root 10485760 109748 10376012 2% /

仔细看,即使多了一个档案在/tmp底下,整个inode与block的容量并没有改变!

[root@study tmp]# ls -il passwd* 2668897 -rw-r—r—. 2 root root 2092 Jun 17 00:20 passwd 2668897 -rw-r—r—. 2 root root 2092 Jun 17 00:20 passwd-hd

原来是指向同一个inode啊!这是个重点啊!另外,那个第二栏的连结数也会增加!

范例三:将/tmp/passwd建立一个符号连结 [root@study tmp]# ln -s passwd passwd-so [root@study tmp]# ls -li passwd* 2668897 -rw-r—r—. 2 root root 2092 Jun 17 00:20 passwd 2668897 -rw-r—r—. 2 root root 2092 Jun 17 00:20 passwd-hd 2668898 lrwxrwxrwx. 1 root root 6 Jun 23 22:40 passwd-so -> passwd

passwd-so指向的inode number不同了!这是一个新的档案~这个档案的内容是指向

passwd 的。passwd-so 的大小是6bytes ,因为『passwd』 这个单字共有六个字元之故

[root@study tmp]# du -sb ; df -i . 6608 . Filesystem Inodes IUsed IFree IUse% Mounted on /dev/mapper/centos-root 10485760 109749 10376011 2% /

呼呼!整个容量与inode使用数都改变啰~确实如此啊!

范例四:删除原始档案passwd ,其他两个档案是否能够开启? [root@study tmp]# rm passwd [root@study tmp]# cat passwd-hd …..(正常显示完毕!) [root@study tmp]# cat passwd-so cat: passwd-so: No such file or directory [root@study tmp]# ll passwd* -rw-r—r—. 1 root root 2092 Jun 17 00:20 passwd-hd lrwxrwxrwx. 1 root root 6 Jun 23 22:40 passwd-so -> passwd

怕了吧!符号连结果然无法开启!另外,如果符号连结的目标档案不存在,

其实档名的部分就会有特殊的颜色显示喔! |

| —- |

关于目录的link 数量

当我们以hard link 进行『档案的连结』时,可以发现,在ls -l 所显示的第二栏位会增加一才对,那么请教,如果建立目录时,他预设的link 数量会是多少?

建立一个新目录名称为/tmp/testing 时,基本上会有三个东西,那就是:

  • /tmp/testing
  • /tmp/testing/.
  • /tmp/testing/..

其中/tmp/testing/tmp/testing/.其实是一样的!都代表该目录。/tmp/testing/..则代表/tmp这个目录。所以说,当我们建立一个新的目录时, 『新的目录的link数为2 ,而上层目录的link数则会增加1』。

| [root@study ~]# ls -ld /tmp drwxrwxrwt. 14 root root 4096 Jun 23 22:42 /tmp [root@study ~]# mkdir /tmp/testing1 [root@study ~]# ls -ld /tmp drwxrwxrwt. 15 root root 4096 Jun 23 22:45 /tmp #这里的link数量加1了! [root@study ~]# ls -ld /tmp/testing1 drwxr-xr-x. 2 root root 6 Jun 23 22:45 /tmp/testing1/ | | —- |

原本的所谓上层目录/tmp 的link 数量由14 增加为15 ,至于新目录/tmp/testing 则为2 。

7.3 磁碟的分割、格式化、检验与挂载

对于一个系统管理者( root )而言,磁碟的的管理是相当重要的一环,尤其近来磁碟已经渐渐的被当成是消耗品了….. 如果我们想要在系统里面新增一颗磁碟时,应该有哪些动作需要做的呢:

  1. 对磁碟进行分割,以建立可用的partition ;
  2. 对该partition 进行格式化(format),以建立系统可用的filesystem;
  3. 若想要仔细一点,则可对刚刚建立好的filesystem 进行检验;
  4. 在Linux 系统上,需要建立挂载点(亦即是目录),并将他挂载上来;

7.3.1 观察磁碟分割状态

lsblk:列出系统上的所有磁碟列表

lsblk 可以看成『 list block device 』的缩写,就是列出所有储存装置的意思!

| [root@study ~]# lsblk [-dfimpt] [device] 选项与参数: -d :仅列出磁碟本身,并不会列出该磁碟的分割资料 -f :同时列出该磁碟内的档案系统名称 -i :使用ASCII 的线段输出,不要使用复杂的编码(再某些环境下很有用) -m :同时输出该装置在/dev 底下的权限资料(rwx 的资料) -p :列出该装置的完整档名!而不是仅列出最后的名字而已。 -t :列出该磁碟装置的详细资料,包括磁碟伫列机制、预读写的资料量大小等

范例一:列出本系统下的所有磁碟与磁碟内的分割资讯 [root@study ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 1024M 0 rom vda 252:0 0 40G 0 disk #一整颗磁碟 |-vda1 252:1 0 2M 0 part |-vda2 252:2 0 1G 0 part /boot -vda3 252:3 0 30G 0 part |-centos-root 253:0 0 10G 0 lvm / #在vda3内的其他档案系统 |-centos-swap 253:1 0 1G 0 lvm [SWAP]-centos-home 253:2 0 5G 0 lvm /home | | —- |

从上面的输出我们可以很清楚的看到,目前的系统主要有个sr0 以及一个vda 的装置,而vda 的装置底下又有三个分割, 其中vda3 甚至还有因为LVM 产生的档案系统!相当的完整吧!从范例一我们来谈谈预设输出的资讯有哪些。

  • NAME:就是装置的档名啰!会省略/dev 等前导目录!
  • MAJ:MIN:其实核心认识的装置都是透过这两个代码来熟悉的!分别是主要:次要装置代码!
  • RM:是否为可卸载装置(removable device),如光碟、USB 磁碟等等
  • SIZE:当然就是容量啰!
  • RO:是否为唯读装置的意思
  • TYPE:是磁碟(disk)、分割槽(partition) 还是唯读记忆体(rom) 等输出
  • MOUTPOINT:就是前一章谈到的挂载点!

blkid:列出装置的UUID 等参数

lsblk 也可以使用-f 来列出档案系统与装置的UUID 资料。而blkid也可以。

UUID 全域单一识别码(universally unique identifier),Linux 会将系统内所有的装置都给予一个独一无二的识别码, 这个识别码就可以拿来作为挂载或者是使用这个装置/档案系统之用了。

| [root@study ~]# blkid /dev/vda2: UUID=”94ac5f77-cb8a-495e-a65b-2ef7442b837c” TYPE=”xfs” /dev/vda3: UUID=”WStYq1-P93d-oShM-JNe3-KeDl-bBf6-RSmfae” TYPE=”LVM2_member” /dev/sda1: UUID=”35BC-6D6B” TYPE=”vfat” /dev/mapper/centos-root: UUID=”299bdc5b-de6d-486a-a0d2-375402aaab27” TYPE=”xfs” /dev/mapper/centos-swap: UUID=”905dc471-6c10-4108-b376-a802edbd862d” TYPE=”swap” /dev/mapper/centos-home: UUID=”29979bf1-4a28-48e0-be4a-66329bf727d9” TYPE=”xfs” | | —- |

如上所示,每一行代表一个档案系统,主要列出装置名称、UUID 名称以及档案系统的类型(TYPE)!

parted :列出磁盘的分割表类型与分割信息

| [root@study ~]# parted device_name print

范例一:列出/dev/vda磁碟的相关资料 [root@study ~]# parted /dev/vda print Model: Virtio Block Device (virtblk) #磁碟的模组名称(厂商) Disk /dev/vda : 42.9GB #磁碟的总容量 Sector size (logical/physical): 512B/512B #磁碟的每个逻辑/物理磁区容量 Partition Table: gpt #分割表的格式(MBR/GPT) Disk Flags: pmbr_boot

Number Start End Size File system Name Flags #底下才是分割资料 1 1049kB 3146kB 2097kB bios_grub 2 3146kB 1077MB 1074MB xfs 3 1077MB 33.3GB 32.2GB lvm | | —- |

看到上表的说明,你就知道啦!我们用的就是GPT 的分割格式喔!这样会观察磁碟分割了吗?接下来要来操作磁碟分割了喔!

7.3.2 磁盘分割: gdisk/fdisk

『MBR分割表请使用fdisk分割, GPT分割表请使用gdisk分割!』

gdisk

| [root@study ~]# gdisk装置名称

范例:由前一小节的lsblk输出,我们知道系统有个/dev/vda,请观察该磁碟的分割与相关资料 [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): | | —- |

你应该要透过lsblk 或blkid 先找到磁碟,再用parted /dev/xxx print 来找出内部的分割表类型,之后才用gdisk 或fdisk 来操作系统。上表中可以发现gdisk 会扫描MBR 与GPT 分割表,不过这个软体还是单纯使用在GPT 分割表比较好啦!

使用gdisk这支程式是完全不需要背指令的。你可以参考看看。其中比较不一样的是『q与w』这两个玩意儿!不管你进行了什么动作,只要离开gdisk时按下『q』,那么所有的动作『都不会生效!』相反的,按下『w』就是动作生效的意思。所以,你可以随便玩gdisk ,只要离开时按下的是『q』即可。

好了,先来看看分割表资讯吧!

| 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啊! |

| —- |

使用『 p 』可以列出目前这颗磁碟的分割表资讯,这个资讯的上半部在显示整体磁碟的状态。以鸟哥这颗磁碟为例,这个磁碟共有40GB 左右的容量,共有83886080 个磁区,每个磁区的容量为512bytes。要注意的是,现在的分割主要是以磁区为最小的单位
下半部的分割表资讯主要在列出每个分割槽的个别资讯项目。每个项目的意义为:

  • Number:分割槽编号,1 号指的是/dev/vda1 这样计算。
  • Start (sector):每一个分割槽的开始磁区号码位置
  • End (sector):每一个分割的结束磁区号码位置,与start 之间可以算出分割槽的总容量
  • Size:就是分割槽的容量了
  • Code:在分割槽内的可能的档案系统类型。Linux 为8300,swap 为8200。不过这个项目只是一个提示而已,不见得真的代表此分割槽内的档案系统喔!
  • Name:档案系统的名称等等。

从上表我们可以发现几件事情:

  • 整部磁碟还可以进行额外的分割,因为最大磁区为83886080,但只使用到65026047 号而已;
  • 分割槽的设计中,新分割通常选用上一个分割的结束磁区号码数加1 作为起始磁区号码!

这个gdisk只有root才能执行,此外,请注意,使用的『装置档名』请不要加上数字,因为partition是针对『整个磁碟装置』而不是某个partition呢!所以执行『 gdisk /dev/vda1 』就会发生错误啦!要使用gdisk /dev/vda才对!

用gdisk 新增分割槽

假设我需要有如下的分割需求:

  • 1GB 的xfs 档案系统(Linux)
  • 1GB 的vfat 档案系统(Windows)
  • 0.5GB 的swap (Linux swap)(这个分割等一下会被删除喔!) | [root@study ~]# gdisk /dev/vda Command (? for help): p 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

    找出最后一个sector的号码是很重要的!

Command (? for help): ? #查一下增加分割的指令为何 Command (? for help): n #就是这个!所以开始新增的行为! Partition number (4-128, default 4): 4 #预设就是4号,所以也能enter即可! First sector (34-83886046, default = 65026048 ) or {+-}size{KMGTP}: 65026048 #也能enter Last sector (65026048-83886046, default = 83886046 ) or {+-}size{KMGTP}: +1G #决不要enter

这个地方可有趣了!我们不需要自己去计算磁区号码,透过+容量的这个方式,

就可以让gdisk 主动去帮你算出最接近你需要的容量的磁区号码喔!

Current type is ‘ Linux filesystem ‘ Hex code or GUID (L to show codes, Enter = 8300 ): #使用预设值即可~直接enter下去!

这里在让你选择未来这个分割槽预计使用的档案系统!预设都是Linux档案系统的8300啰!

Command (? for help): p 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 4 65026048 67123199 1024.0 MiB 8300 Linux filesystem | | —- |

重点在『 Last sector 』那一行,那行绝对不要使用预设值!因为预设值会将所有的容量用光!因此它预设选择最大的磁区号码!因为我们仅要1GB 而已,所以你得要加上+1G 这样即可!不需要计算sector 的数量,gdisk 会根据你填写的数值, 直接计算出最接近该容量的磁区数!
每次新增完毕后,请立即『 p 』查看一下结果喔!

| Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING PARTITIONS!!

Do you want to proceed? (Y/N): y OK; writing new GUID partition table (GPT) to /dev/vda. Warning: The kernel is still using the old partition table. The new table will be used at the next reboot. The operation has completed successfully.

gdisk 会先警告你可能的问题,我们确定分割是对的,这时才按下y !不过怎么还有警告?

这是因为这颗磁碟目前正在使用当中,因此系统无法立即载入新的分割表~

[root@study ~]# cat /proc/partitions major minor #blocks name

252 0 41943040 vda 252 1 2048 vda1 252 2 1048576 vda2 252 3 31461376 vda3 253 0 10485760 dm-0 253 1 1048576 dm-1 253 2 5242880 dm-2

你可以发现,并没有vda4, vda5, vda6 喔!因为核心还没有更新! |

| —- |

因为Linux 此时还在使用这颗磁碟,为了担心系统出问题,所以分割表并没有被更新喔!这个时候我们有两个方式可以来处理!其中一个是重新开机,不过很讨厌!另外一个则是透过partprobe 这个指令来处理即可

partprobe 更新Linux 核心的分割表信息

| [root@study ~]# partprobe [-s] #你可以不要加-s !那么萤幕不会出现讯息! [root@study ~]# partprobe -s #不过还是建议加上-s比较清晰! /dev/vda: gpt partitions 1 2 3 4 5 6

[root@study ~]# lsblk /dev/vda #实际的磁碟分割状态 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vda 252:0 0 40G 0 disk |-vda1 252:1 0 2M 0 part |-vda2 252:2 0 1G 0 part /boot |-vda3 252:3 0 30G 0 part | |-centos-root 253:0 0 10G 0 lvm / | |-centos-swap 253:1 0 1G 0 lvm [SWAP] | -centos-home 253:2 0 5G 0 lvm /home &#124;-vda4 252:4 0 1G 0 part &#124;-vda5 252:5 0 1G 0 part-vda6 252:6 0 500M 0 part

[root@study ~]# cat /proc/partitions #核心的分割纪录 major minor #blocks name

252 0 41943040 vda 252 1 2048 vda1 252 2 1048576 vda2 252 3 31461376 vda3 252 4 1048576 vda4 252 5 1048576 vda5 252 6 512000 vda6

现在核心也正确的抓到了分割参数了! |

| —- |

用gdisk 删除一个分割槽

| [root@study ~]# gdisk /dev/vda Command (? for help): p 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 4 65026048 67123199 1024.0 MiB 8300 Linux filesystem 5 67123200 69220351 1024.0 MiB 0700 Microsoft basic data 6 69220352 70244351 500.0 MiB 8200 Linux swap

Command (? for help): d Partition number (1-6): 6

Command (? for help): p

你会发现/dev/vda6不见了!非常棒!没问题就写入吧!

Command (? for help): w

同样会有一堆讯息!鸟哥就不重复输出了!自己选择y来处理吧!

[root@study ~]# lsblk

你会发现!怪了!怎么还是有/dev/vda6呢?没办法!还没有更新核心的分割表啊!所以当然有错!

[root@study ~]# partprobe -s [root@study ~]# lsblk

这个时候,那个/dev/vda6才真的消失不见了!了解吧! |

| —- |

万分注意!不要去处理一个正在使用中的分割槽!

fdisk

依旧有些旧的系统,以及虚拟机器的使用上面,还是有小磁碟存在的空间!这时处理MBR 分割表, 就得要使用fdisk !
fdisk 有时会使用磁柱(cylinder) 作为分割的最小单位,与gdisk 预设使用sector 不太一样!大致上只是这点差别!另外, MBR 分割是有限制的(Primary, Extended, Logical…)!不要忘记了!

7.3.3 磁盘格式化(创建档案系统)

分割完毕后自然就是要进行档案系统的格式化!格式化的指令非常的简单,那就是『make filesystem, mkfs』 这个指令。

这个指令其实是个综合的指令,他会去呼叫正确的档案系统格式化工具软体!

因为CentOS 7 使用xfs 作为预设档案系统, 底下我们会先介绍mkfs.xfs ,之后介绍新一代的EXT 家族成员mkfs.ext4,最后再聊一聊mkfs 这个综合指令吧!

XFS 档案系统mkfs.xfs

『格式化』其实应该称为『建置档案系统(make filesystem)』才对。
所以使用的指令是mkfs !那我们要建立的其实是xfs 档案系统, 因此使用的是mkfs.xfs 这个指令才对。这个指令是这样使用的:

| [root@study ~]# 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 。

范例:将前一小节分割出来的/dev/vda4格式化为xfs档案系统 [root@study ~]# mkfs.xfs /dev/vda4 meta-data=/dev/vda4 isize=256 agcount=4, agsize= 65536 blks = sectsz=512 attr=2, projid32bit=1 = crc=0 finobt=0 data = bsize=4096 blocks=262144, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=0 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0

很快格是化完毕!都用预设值!较重要的是inode 与block 的数值

[root@study ~]# blkid /dev/vda4 /dev/vda4: UUID=”39293f4f-627b-4dfd-a015-08340537709c” TYPE=”xfs”

确定建置好xfs 档案系统了! |

| —- |

使用预设的xfs 档案系统参数来建置系统即可!速度非常快!

如果我们有其他额外想要处理的项目,才需要加上一堆设定值!
举例来说,因为xfs 可以使用多个资料流来读写系统,以增加速度,因此那个agcount 可以跟CPU 的核心数来做搭配!比如,如果我的伺服器仅有一颗4 核心,但是有启动 Intel 超执行绪功能,则系统会模拟出8 颗CPU 时,那个agcount 就可以设定为8 喔!举个例子来瞧瞧:

| 范例:找出你系统的CPU数,并据以设定你的agcount数值 [root@study ~]# grep ‘processor’ /proc/cpuinfo processor : 0 processor : 1

所以就是有两颗CPU 的意思,那就来设定设定我们的xfs 档案系统格式化参数吧!!

[root@study ~]# mkfs.xfs -f -d agcount=2 /dev/vda4 meta-data=/dev/vda4 isize=256 agcount=2, agsize=131072 blks = sectsz=512 attr=2, projid32bit=1 = crc=0 finobt=0 …..(底下省略)…..

可以跟前一个范例对照看看,可以发现agcount 变成2 了喔!

此外,因为已经格式化过一次,因此mkfs.xfs 可能会出现不给你格式化的警告!因此需要使用-f |

| —- |

EXT4 档案系统mkfs.ext4

如果想要格式化为ext4 的传统Linux 档案系统的话,可以使用mkfs.ext4 这个指令即可!这个指令的参数快速的介绍一下!

| [root@study ~]# mkfs.ext4 [-b size] [-L label]装置名称 选项与参数: -b :设定block 的大小,有1K, 2K, 4K 的容量, -L :后面接这个装置的标头名称。

范例:将/dev/vda5格式化为ext4档案系统 [root@study ~]# mkfs.ext4 /dev/vda5 mke2fs 1.42.9 (28-Dec-2013) Filesystem label= #显示Label name OS type: Linux Block size=4096 (log=2) #每一个block的大小 Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks #跟RAID相关性较高 65536 inodes, 262144 blocks #总计inode/block的数量 13107 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=268435456 8 block groups #共有8个block groups喔! 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376

Allocating group tables: done Writing inode tables: done Creating journal (8192 blocks): done Writing superblocks and filesystem accounting information: done

[root@study ~]# dumpe2fs -h /dev/vda5 dumpe2fs 1.42.9 (28-Dec-2013) Filesystem volume name: Last mounted on: Filesystem UUID: 3fd5cc6f-a47d-46c0-98c0-d43b072e0e12 ….(中间省略)…. Inode count: 65536 Block count: 262144 Block size: 4096 Blocks per group: 32768 Inode size: 256 Journal size: 32M | | —- |

其他档案系统mkfs

mkfs 其实是个综合指令而已,当我们使用mkfs -t xfs 时,它就会跑去找mkfs.xfs 相关的参数给我们使用!如果想要知道系统还支援哪种档案系统的格式化功能,直接按[tabl] 就很清楚了!

| [root@study ~]# mkfs[tab][tab] mkfs mkfs.btrfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.ext4
mkfs.fat mkfs.minix mkfs.msdos mkfs.vfat mkfs.xfs | | —- |

7.3.4 档案系统检验

如果档案系统真的发生错乱的话,那该如何是好?就…挽救啊!不同的档案系统救援的指令不太一样,我们主要针对xfs 及ext4 这两个主流来说明而已喔!

xfs_repair 处理XFS 档案系统


当有xfs 档案系统错乱才需要使用这个指令**!所以,这个指令最好是不要用到啦!但有问题发生时,这个指令却又很重要…

| [root@study ~]# xfs_repair [-fnd]装置名称 选项与参数: -f :后面的装置其实是个档案而不是实体装置 -n :单纯检查并不修改档案系统的任何资料(检查而已) -d :通常用在单人维护模式底下,针对根目录(/) 进行检查与修复的动作!很危险!不要随便使用

范例:检查一下刚刚建立的/dev/vda4档案系统 [root@study ~]# xfs_repair /dev/vda4 Phase 1 - find and verify superblock… Phase 2 - using internal log Phase 3 - for each AG… Phase 4 - check for duplicate blocks… Phase 5 - rebuild AG headers and trees… Phase 6 - check inode connectivity… Phase 7 - verify and correct link counts… done

共有7 个重要的检查流程!详细的流程介绍可以man xfs_repair 即可!

范例:检查一下系统原本就有的/dev/centos/home档案系统 [root@study ~]# xfs_repair /dev/centos/home xfs_repair: /dev/centos/home contains a mounted filesystem xfs_repair: /dev/centos/home contains a mounted and writable filesystem

fatal error — couldn’t initialize XFS library | | —- |

xfs_repair 可以检查/修复档案系统,不过,因为修复档案系统是个很庞大的任务!因此,修复时该档案系统不能被挂载!所以,检查与修复/dev/vda4 没啥问题,但是修复/dev/centos/home 这个已经挂载的档案系统时,就出现上述的问题了!没关系,若可以卸载,卸载后再处理即可。

Linux 系统有个装置无法被卸载,那就是根目录啊
如果你的根目录有问题怎办?这时得要进入单人维护或救援模式,然后透过-d 这个选项来处理!加入-d 这个选项后,系统会强制检验该装置,检验完毕后就会自动重新开机啰!不过,鸟哥完全不打算要进行这个指令的实做… 永远都不希望实做这东西

fsck.ext4 处理EXT4 档案系统

fsck 是个综合指令,如果是针对ext4 的话,建议直接使用fsck.ext4 来检测比较妥当!那fsck.ext4 的选项有底下几个常见的项目:

| [root@study ~]# 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

范例:找出刚刚建置的/dev/vda5的另一块superblock,并据以检测系统 [root@study ~]# dumpe2fs -h /dev/vda5 | grep ‘Blocks per group’ Blocks per group: 32768

看起来每个block 群组会有32768 个block,因此第二个superblock 应该就在32768 上!

因为block 号码为0 号开始编的!

[root@study ~]# fsck.ext4 -b 32768 /dev/vda5 e2fsck 1.42.9 (28-Dec-2013) /dev/vda5 was not cleanly unmounted, check forced. Pass 1: Checking inodes, blocks, and sizes Deleted inode 1577 has zero dtime. Fix? yes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information

/dev/vda5: * FILE SYSTEM WAS MODIFIED * #档案系统被改过,所以这里会有警告! /dev/vda5: 11/65536 files (0.0% non-contiguous), 12955/262144 blocks

好巧合!鸟哥使用这个方式来检验系统,恰好遇到档案系统出问题!于是可以有比较多的解释方向!

当档案系统出问题,它就会要你选择是否修复~如果修复如上所示,按下y 即可!

最终系统会告诉你,档案系统已经被更改过,要注意该项目的意思!

范例:已预设设定强制检查一次/dev/vda5 [root@study ~]# fsck.ext4 /dev/vda5 e2fsck 1.42.9 (28-Dec-2013) /dev/vda5: clean, 11/65536 files, 12955/262144 blocks

档案系统状态正常,它并不会进入强制检查!会告诉你档案系统没问题(clean)

[root@study ~]# fsck.ext4 -f /dev/vda5 e2fsck 1.42.9 (28-Dec-2013) Pass 1: Checking inodes, blocks, and sizes ….(底下省略)…. | | —- |

注意:通常只有身为root且你的档案系统有问题的时候才使用这个指令,否则在正常状况下使用此一指令,可能会造成对系统的危害!通常使用这个指令的场合都是在系统出现极大的问题,导致你在Linux开机的时候得进入单人单机模式下进行维护的行为时,才必须使用此一指令!

如果你怀疑刚刚格式化成功的磁碟有问题的时后,也可以使用xfs_repair/fsck.ext4来检查一磁碟呦!其实就有点像是Windows的scandisk啦!此外,由于xfs_repair/fsck.ext4在扫瞄磁碟的时候,可能会造成部分filesystem的修订,所以『执行xfs_repair/fsck.ext4时,被检查的partition务必不可挂载到系统上!亦即是需要在卸载的状态!』

7.3.5 档案系统挂载与卸载

我们在本章一开始时的挂载点的意义当中提过挂载点目录而这个目录是进入磁碟分割槽(其实是档案系统!)的入口就是了。不过要进行挂载前,你最好先确定几件事:

  • 单一档案系统不应该被重复挂载在不同的挂载点(目录)中;
  • 单一目录不应该重复挂载多个档案系统;
  • 要作为挂载点的目录,理论上应该都是空目录才是。

如果你要用来挂载的目录里面并不是空的,那么挂载了档案系统之后,原目录下的东西就会暂时的消失。

举个例子来说,假设你的/home原本与根目录(/)在同一个档案系统中,底下原本就有/home/test与/home/vbird两个目录。然后你想要加入新的磁碟,并且直接挂载/home底下,那么当你挂载上新的分割槽时,则/home目录显示的是新分割槽内的资料,至于原先的test与vbird这两个目录就会暂时的被隐藏掉了!注意喔!并不是被覆盖掉,而是暂时的隐藏了起来,等到新分割槽被卸载之后,则/home原本的内容就会再次的跑出来啦!

而要将档案系统挂载到我们的Linux 系统上,就要使用mount 这个指令.

| [root@study ~]# mount -a [root@study ~]# mount [-l] [root@study ~]# mount [-t档案系统] LABEL=’’挂载点 [root@study ~]# mount [-t档案系统] UUID=’’挂载点 #鸟哥近期建议用这种方式喔! [root@study ~]# 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 这个选项,系统会自动的分析最恰当的档案系统来尝试挂载你需要的装置!
这也是使用blkid 就能够显示正确的档案系统的缘故!
那CentOS 是怎么找出档案系统类型的呢?由于档案系统几乎都有superblock ,我们的Linux 可以透过分析superblock 搭配Linux 自己的驱动程式去测试挂载, 如果成功的套和了,就立刻自动的使用该类型的档案系统挂载起来啊!

那么系统有没有指定哪些类型的filesystem 才需要进行上述的挂载测试呢?主要是参考底下这两个档案:

  • /etc/filesystems:系统指定的测试挂载档案系统类型的优先顺序;
  • /proc/filesystems:Linux系统已经载入的档案系统类型。

那我怎么知道我的Linux 有没有相关档案系统类型的驱动程式呢?我们Linux 支援的档案系统之驱动程式都写在如下的目录中:
/lib/modules/$(uname -r)/kernel/fs/
例如ext4 的驱动程式就写在『/lib/modules/$(uname -r)/kernel/fs/ext4/』这个目录下啦!

挂载xfs/ext4/vfat 等档案系统

| 范例:找出/dev/vda4的UUID后,用该UUID来挂载档案系统到/data/xfs内 [root@study ~]# blkid /dev/vda4 /dev/vda4: UUID=”e0a6af55-26e7- 4cb7-a515-826a8bd29e90” TYPE=”xfs”

[root@study ~]# mount UUID=”e0a6af55-26e7-4cb7-a515-826a8bd29e90” /data/xfs mount: mount point /data/xfs does not exist #非正规目录!所以手动建立它!

[root@study ~]# mkdir -p /data/xfs [root@study ~]# mount UUID=”e0a6af55-26e7-4cb7-a515-826a8bd29e90” /data/xfs [root@study ~]# df /data/ xfs Filesystem 1K-blocks Used Available Use% Mounted on /dev/vda4 1038336 32864 1005472 4% /data/xfs

顺利挂载,且容量约为1G左右没问题!

范例:使用相同的方式,将/dev/vda5挂载于/data/ext4 [root@study ~]# blkid /dev/vda5 /dev/vda5: UUID=”899b755b-1da4-4d1d-9b1c-f762adb798e1” TYPE=”ext4”

[root@study ~]# mkdir /data/ext4 [root@study ~]# mount UUID=”899b755b-1da4-4d1d-9b1c-f762adb798e1” /data/ext4 [root@study ~]# df /data/ext4 Filesystem 1K-blocks Used Available Use% Mounted on /dev/vda5 999320 2564 927944 1% /data/ext4 | | —- |

挂载CD 或DVD 光碟

| 范例:将你用来安装Linux的CentOS原版光碟拿出来挂载到/data/cdrom! [root@study ~]# blkid …..(前面省略)….. /dev/sr0 : UUID=”2015-04-01-00-21-36-00” LABEL=”CentOS 7 x86_64 “ TYPE=”iso9660” PTTYPE=”dos”

[root@study ~]# mkdir /data/cdrom [root@study ~]# mount /dev/sr0 /data/cdrom mount: /dev/sr0 is write-protected, mounting read-only

[root@study ~]# df /data/cdrom Filesystem 1K-blocks Used Available Use% Mounted on /dev/sr0 7413478 7413478 0 100% /data/cdrom

怎么会使用掉100% 呢?是啊!因为是DVD 啊!所以无法再写入了啊! |

| —- |

光碟机一挂载之后就无法退出光碟片了!除非你将他卸载才能够退出!从上面的资料你也可以发现,因为是光碟嘛!所以磁碟使用率达到100% ,因为你无法直接写入任何资料到光碟当中!此外,如果你使用的是图形界面,那么系统会自动的帮你挂载这个光碟到/media/里面去喔!也可以不卸载就直接退出!但是文字界面没有这个福利就是了
**

挂载vfat 中文随身碟(USB磁碟)

请拿出你的随身碟并插入Linux 主机的USB 槽中!注意,你的这个随身碟不能够是NTFS 的档案系统喔!接下来让我们测试测试吧!

| 范例:找出你的随身碟装置的UUID,并挂载到/data/usb目录中 [root@study ~]# blkid /dev/sda1: UUID=”35BC-6D6B” TYPE=”vfat”

[root@study ~]# mkdir /data/usb [root@study ~]# mount -o codepage=950,iocharset=utf8 UUID=”35BC-6D6B” /data/usb [root@study ~]# # mount - o codepage=950,iocharset=big5 UUID=”35BC-6D6B” /data/usb [root@study ~]# df /data/usb Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda1 2092344 4 2092340 1% /data/usb | | —- |

重新挂载根目录与挂载不特定目录

整个目录树最重要的地方就是根目录了,所以根目录根本就不能够被卸载的!
问题是,如果你的挂载参数要改变, 或者是根目录出现『唯读』状态时,如何重新挂载呢

  • 最可能的处理方式就是重新开机(reboot)!
  • 不过你也可以这样做: | 范例:将/重新挂载,并加入参数为rw与auto [root@study ~]# mount -o remount,rw,auto / | | —- |

重点是那个『 -o remount,xx 』的选项与参数!请注意,要重新挂载(remount) 时, 这是个非常重要的机制!尤其是当你进入单人维护模式时,你的根目录常会被系统挂载为唯读,这个时候这个指令就太重要了!

另外,我们也可以利用mount 来将某个目录挂载到另外一个目录去这并不是挂载档案系统,而是额外挂载某个目录的方法!虽然底下的方法也可以使用symbolic link 来连结,不过在某些不支援符号连结的程式运作中,还是得要透过这样的方法才行。

| 范例:将/var这个目录暂时挂载到/data/var底下: [root@study ~]# mkdir /data/var [root@study ~]# mount —bind /var /data/var [root@study ~]# ls -lid /var /data/var 16777346 drwxr-xr-x. 22 root root 4096 Jun 15 23:43 /data/var 16777346 drwxr-xr-x. 22 root root 4096 Jun 15 23:43 /var

内容完全一模一样啊!因为挂载目录的缘故!

[root@study ~]# mount | grep var /dev/mapper/centos-root on /data/var type xfs (rw,relatime,seclabel,attr2,inode64,noquota) | | —- |

透过这个mount —bind 的功能, 您可以将某个目录挂载到其他目录去喔!而并不是整块filesystem 的啦!所以从此进入/data/var 就是进入/var 的意思!

umount (将装置档案卸载)

| [root@study ~]# umount [-fn]装置档名或挂载点 选项与参数: -f :强制卸载!可用在类似网路档案系统(NFS) 无法读取到的情况下; -l :立刻卸载档案系统,比-f 还强! -n :不更新/etc/mtab 情况下卸载。 | | —- |

就是直接将已挂载的档案系统给他卸载即是!卸载之后,可以使用df 或mount 看看是否还存在目录树中?卸载的方式,可以下达装置档名或挂载点,均可接受啦!底下的范例做看看吧!

| 范例:将本章之前自行挂载的档案系统全部卸载: [root@study ~]# mount …..(前面省略)….. /dev/vda4 on /data/xfs type xfs (rw, relatime,seclabel,attr2,inode64,logbsize=256k,sunit=512,..) /dev/vda5 on /data/ext4 type ext4 (rw,relatime,seclabel,data=ordered) /dev/sr0 on /data/cdrom type iso9660 (ro,relatime) /dev/sda1 on /data/usb type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=950,iocharset=…) /dev/mapper/centos-root on /data/var type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

先找一下已经挂载的档案系统,如上所示,特殊字体即为刚刚挂载的装置啰!

基本上,卸载后面接装置或挂载点都可以!不过最后一个centos-root 由于有其他挂载,

因此,该项目一定要使用挂载点来卸载才行!

[root@study ~]# umount /dev/vda4 <==用装置档名来卸载 [root@study ~]# umount /data/ext4 <==用挂载点来卸载 [root@study ~]# umount /data/cdrom <==因为挂载点比较好记忆! [root@study ~]# umount /data/usb
[root@study ~]# umount /data/var <==一定要用挂载点!因为装置有被其他方式挂载 | | —- |

由于通通卸载了,此时你才可以退出光碟片、软碟片、USB随身碟等设备喔!如果你遇到这样的情况:

| [root@study ~]# mount /dev/sr0 /data/cdrom [root@study ~]# cd /data/cdrom [root@study cdrom]# umount /data/cdrom umount: /data/cdrom: target is busy. (In some cases useful info about processes that use the device is found by lsof(8) or fuser(1))

[root@study cdrom]# cd / [root@study /]# umount /data/cdrom | | —- |

由于你目前正在/data/cdrom/的目录内,也就是说其实『你正在使用该档案系统』的意思!所以自然无法卸载这个装置!那该如何是好?就『离开该档案系统的挂载点』即可。以上述的案例来说,你可以使用『 cd / 』回到根目录,就能够卸载/data/cdrom啰!简单吧!

7.3.6 磁盘/文件系统参数修订

mknod

在Linux底下所有的装置都以文件来代表!但是那个档案如何代表该装置呢?很简单!就是透过档案的majorminor数值来替代的。
举例来说,在鸟哥的这个测试机当中,那个用到的磁碟/dev/vda的相关装置代码如下:

| [root@study ~]# ll /dev/vda* brw-rw——. 1 root disk 252, 0 Jun 24 02:30 /dev/vda brw-rw——. 1 root disk 252, 1 Jun 24 02:30 /dev/vda1 brw-rw——. 1 root disk 252, 2 Jun 15 23:43 /dev/vda2 brw-rw——. 1 root disk 252, 3 Jun 15 23:43 /dev/vda3 brw-rw——. 1 root disk 252, 4 Jun 24 20:00 /dev/vda4 brw-rw——. 1 root disk 252, 5 Jun 24 21:15 /dev/vda5 | | —- |

上表当中252 为主要装置代码(Major) ;0~5 则为次要装置代码(Minor)。我们的Linux 核心认识的装置资料就是透过这两个数值来决定的!举例来说,常见的磁碟档名/dev/sda 与/dev/loop0 装置代码如下所示:

磁碟档名 Major Minor
/dev/sda 8 0-15
/dev/sdb 8 16-31
/dev/loop0 7 0
/dev/loop1 7 1

基本上,Linux核心2.6版以后,硬体档名已经都可以被系统自动的即时产生了,我们根本不需要手动建立装置档案。不过某些情况底下我们可能还是得要手动处理装置档案的,例如在某些服务被关到特定目录下时(chroot),就需要这样做了。此时这个mknod就得要知道如何操作才行!

| [root@study ~]# mknod装置档名[bcp] [Major] [Minor] 选项与参数: 装置种类: b :设定装置名称成为一个周边储存设备档案,例如磁碟等; c :设定装置名称成为一个周边输入设备档案,例如滑鼠/键盘等; p :设定装置名称成为一个FIFO 档案; Major :主要装置代码; Minor :次要装置代码;

范例:由上述的介绍我们知道/dev/vda10装置代码252, 10,请建立并查阅此装置 [root@study ~]# mknod /dev/vda10 b 252 10 [root@study ~]# ll /dev/ vda10 b rw-r—r—. 1 root root 252, 10 Jun 24 23:40 /dev/vda10

上面那个252与10是有意义的,不要随意设定啊!

范例:建立一个FIFO档案,档名为/tmp/testpipe [root@study ~]# mknod /tmp/testpipe p [root@study ~]# ll /tmp/testpipe p rw-r—r—. 1 root root 0 Jun 24 23:44 /tmp/testpipe

注意啊!这个档案可不是一般档案,不可以随便就放在这里!

测试完毕之后请删除这个档案吧!看一下这个档案的类型!是p 喔!^_^

[root@study ~]# rm /dev/vda10 /tmp/testpipe rm: remove block special file ‘/dev/vda10’ ? y rm: remove fifo ‘/tmp/testpipe’ ? y | | —- |

xfs_admin 修改XFS 档案系统的UUID 与Label name

如果你当初格式化的时候忘记加上标头名称,后来想要再次加入时,不需要重复格式化!直接使用这个xfs_admin 即可。这个指令直接拿来处理LABEL name 以及UUID 即可!

| [root@study ~]# xfs_admin [-lu] [-L label] [-U uuid]装置档名 选项与参数: -l :列出这个装置的label name -u :列出这个装置的UUID -L :设定这个装置的Label name -U :设定这个装置的UUID 喔!

范例:设定/dev/vda4的label name为vbird_xfs,并测试挂载 [root@study ~]# xfs_admin -L vbird_xfs /dev/vda4 writing all SBs new label = “vbird_xfs” #产生新的LABEL名称啰! [root@study ~]# xfs_admin -l /dev/vda4 label = “vbird_xfs” [root@study ~]# mount LABEL=vbird_xfs /data/xfs/

范例:利用uuidgen产生新UUID来设定/dev/vda4,并测试挂载 [root@study ~]# umount /dev/vda4 #使用前,请先卸载! [root@study ~]# uuidgen e0fa7252-b374-4a06-987a-3cb14f415488 #很有趣的指令!可以产生新的UUID喔! [root@study ~]# xfs_admin -u /dev/vda4 UUID = e0a6af55-26e7-4cb7-a515-826a8bd29e90 [root@study ~]# xfs_admin -U e0fa7252-b374-4a06-987a-3cb14f415488 /dev/vda4 Clearing log and setting UUID writing all SBs new UUID = e0fa7252-b374-4a06-987a-3cb14f415488 [root@study ~]# mount UUID=e0fa7252-b374-4a06-987a-3cb14f415488 /data/xfs | | —- |

tune2fs 修改ext4 的label name 与UUID

| [root@study ~]# tune2fs [-l] [-L Label] [-U uuid]装置档名 选项与参数: -l :类似dumpe2fs -h 的功能~将superblock 内的资料读出来~ -L :修改LABEL name -U :修改UUID 啰!

范例:列出/dev/vda5的label name之后,将它改成vbird_ext4 [root@study ~]# dumpe2fs -h /dev/vda5 | grep name dumpe2fs 1.42.9 (28-Dec-2013) Filesystem volume name: #果然是没有设定的!

[root@study ~]# tune2fs -L vbird_ext4 /dev/vda5 [root@study ~]# dumpe2fs -h /dev/vda5 | grep name Filesystem volume name: vbird_ext4 [root@study ~]# mount LABEL=vbird_ext4 /data/ext4 | | —- |

7.4 设定开机挂载

手动处理mount 不是很人性化,我们总是需要让系统『自动』在开机时进行挂载的!本小节就是在谈这玩意儿!另外,从FTP 伺服器捉下来的映像档能否不用烧录就可以读取内容?我们也需要谈谈先!

7.4.1 开机挂载/etc/fstab 及/etc/mtab

在开始说明前,这里要先跟大家说一说系统挂载的一些限制:

  • 根目录**/** 是必须挂载的﹐而且**一定要先于其它**mount point 被挂载进来。
  • 其它mount point 必须为已建立的目录﹐可任意指定﹐但一定要遵守必须的系统目录架构原则(FHS)
  • 所有mount point 在同一时间之内﹐只能挂载一次。
  • 所有partition 在同一时间之内﹐只能挂载一次。
  • 如若进行卸载﹐您必须先将工作目录移到mount point(及其子目录) 之外。

**
让我们直接查阅一下/etc/fstab 这个档案的内容吧!

| [root@study ~]# cat /etc/fstab

Device Mount point filesystem parameters dump fsck

/dev/mapper/centos-root / xfs defaults 0 0 UUID=94ac5f77-cb8a-495e-a65b-2ef7442b837c /boot xfs defaults 0 0 /dev/mapper/centos-home /home xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0 | | —- |

其实/etc/fstab (filesystem table)就是将我们利用mount指令进行挂载时,将所有的选项与参数写入到这个档案中就是了。
除此之外, /etc/fstab还加入了dump这个备份用指令的支持!与开机时是否进行文件系统检验fsck等指令有关。

这个档案的内容共有六个栏位,这六个栏位非常的重要!你『一定要背起来』才好!各个栏位的总结资料与详细资料如下:

[装置/UUID等] [挂载点] [档案系统] [档案系统参数] [dump] [fsck]
  • 第一栏:磁碟装置档名/UUID/LABEL name:

这个栏位可以填写的资料主要有三个项目:

  • 档案系统或磁碟的装置档名,如/dev/vda2 等
  • 档案系统的UUID 名称,如UUID=xxx
  • 档案系统的LABEL 名称,例如LABEL=xxx
  • 第二栏:挂载点(mount point):

    • 挂载点是目录
  • 第三栏:磁碟分割槽的档案系统:

    • 在手动挂载时可以让系统自动测试挂载,但在这个档案当中我们必须要手动写入档案系统才行!包括xfs, ext4, vfat, reiserfs, nfs 等等。
  • 第四栏:档案系统参数:

记不记得我们在mount这个指令中谈到很多特殊的档案系统参数?还有我们使用过的『-o codepage=950』?这些特殊的参数就是写入在这个栏位啦!虽然之前在mount已经提过一次,这里我们利用表格的方式再汇整一下:

参数 内容意义
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 是一个用来做为备份的指令,不过现在有太多的备份方案了,所以这个项目可以不要理会啦!直接输入0 就好了!
  • 第六栏:是否以fsck 检验磁区:

    • 早期开机的流程中,会有一段时间去检验本机的档案系统,看看档案系统是否完整(clean)。不过这个方式使用的主要是透过fsck 去做的,我们现在用的xfs 档案系统就没有办法适用,因为xfs 会自己进行检验,不需要额外进行这个动作!所以直接填0 就好了

7.4.2 特殊装置loop 挂载(映象档不烧录就挂载使用)

如果有光碟映像档,或者是使用档案作为磁碟的方式时,那就得要使用特别的方法来将他挂载起来,不需要烧录啦!

挂载光碟/DVD映象档

建立大档案以制作loop 装置档案

7.5 记忆体置换空间(swap)之建置

7.5 内存置换空间(swap)之建置

以前的年代因为记忆体不足,因此那个可以暂时将记忆体的程序拿到硬碟中暂放的记忆体置换空间(swap)就显的非常的重要!否则,如果突然间某支程式用掉你大部分的记忆体,那你的系统恐怕有损毁的情况发生喔!所以,早期在安装Linux之前,大家常常会告诉你:安装时一定需要的两个partition ,一个是根目录,另外一个就是swap(记忆体置换空间)。关于记忆体置换空间的解释在第三章安装Linux内的磁碟分割时有约略提过,请你自行回头瞧瞧吧!