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

7.1 认识 Linux 文件系统

7.1.1 磁盘组成与分区复习

  • 扇区(Sector)为最小的物理储存单位,且依据磁盘设计的不同,目前主要有 512bytes 与 4K 两种格式;
  • 将扇区组成一个圆柱,叫做柱面(Cylinder);
  • 早期的分区主要以柱面为最小分区单位,现在的分区通常使用扇区为最小分区单位(每个扇区都有其号码喔,
    就好像座位一样);
  • 磁盘分区表主要有两种格式,一种是限制较多的 MBR 分区表,一种是较新且限制较少的 GPT 分区表。
  • MBR 分区表中,第一个扇区最重要,里面有:主要开机区(Master boot record, MBR)及分区表(partition
    table), 其中 MBR 占有 446 bytes,而 partition table 则占有 64 bytes。
  • GPT 分区表除了分区数量扩充较多之外,支持的磁盘容量也可以超过 2TB。
  • /dev/sd[a-p][1-128]:为实体磁盘的磁盘文件名
  • /dev/vd[a-d][1-128]:为虚拟磁盘的磁盘文件名

7.1.2文件系统特性

  • Linux 的文件系统为 Ext2 (Linux second extended file system, ext2fs)
  • 通常我们可以称呼一个可被挂载的数据为一个文件系统而不是一个分区
  • 文件系统通常会将这两部份的数据分别存放在不同的区块,权限与属性放置到
    inode 中,至于实际数据则放置到 data block 区块中。
  • 每个 inode 与 block 都有编号,三个数据的意义简略说明如下:
    • superblock:记录此 filesystem 的整体信息,包括 inode/block 的总量、使用量、剩余量, 以及文件系统的
      格式与相关信息等;
    • inode:记录文件的属性,一个文件占用一个 inode,同时记录此文件的数据所在的 block 号码;
    • block:实际记录文件的内容,若文件太大时,会占用多个 block 。

7.1.3 Linux 的 EXT2 文件系统(inode)

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

data block (数据块)
在 Ext2 文件系统中所支持的 block 大小有 1K, 2K 及4K 三种

因为 block 大小而产生的 Ext2 文件系统限制如下

块大小最大单一文件限制最大文件系统总容量
1k2k4k
16G256G2T
2T8T16T

基本限制如下:

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

其记录内容

  • 该文件的存取模式(read/write/excute)
  • 该文件的拥有者与群组(owner/group)
  • 该文件的容量
  • 该文件建立或状态改变的时间(ctime)
  • 最近一次的读取时间(atime)
  • 最近修改的时间(mtime)
  • 定义文件特性的旗标(flag),如 SetUID…
  • 该文件真正内容的指向 (pointer)
  • 每个 inode 大小均固定为 128 bytes (新的 ext4 与 xfs 可设定到 256 bytes);
  • 每个文件都仅会占用一个 inode 而已;
  • 承上,因此文件系统能够建立的文件数量与 inode 的数量有关;
  • 系统读取文件时需要先找到 inode,并分析 inode 所记录的权限与用户是否符合,若符合才能够开始实际
    读取 block 的内容。
Superblock (超级区块)

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 。
Filesystem Description (文件系统描述说明)
block bitmap (区块对照表)
记录了空闲区块
inode bitmap (inode 对照表)
记录了空闲inode
dumpe2fs
查询 Ext 家族 superblock 信息的指令
dumpe2fs [-bh]  装 置文件名
选项与参数:
-b :列出保留为坏轨的部分(一般用不到吧!?)
-h :仅列出 superblock 的数据,不会列出其他的区段内容!
blkid <==这个指令可以叫出目前系统有被格式化的装置

7.1.4 与目录树的关系

目录树读取:

例子

如果我想要读取 /etc/passwd这个文件时,系统是如何读取的呢?
    ll - - di / /etc /etc/passwd
    128 dr-xr-xr-x. 17 root root 4096 May 4 17:56 /
    33595521 drwxr-xr-x. 131 root root 8192 Jun 17 00:20 /etc
    36628004 -rw-r--r--. 1 root root 2092 Jun 17 00:20 /etc/passwd
  1. / 的 inode:
    透过挂载点的信息找到 inode 号码为 128 的根目录 inode,且 inode 规范的权限让我们可以读取该 block
    的内容(有 r 与 x) ;
  2. / 的 block:
    经过上个步骤取得 block 的号码,并找到该内容有 etc/ 目录的 inode 号码 (33595521);
  3. etc/ 的 inode:
    读取 33595521 号 inode 得知 dmtsai 具有 r 与 x 的权限,因此可以读取 etc/ 的 block 内容;
  4. etc/ 的 block:
    经过上个步骤取得 block 号码,并找到该内容有 passwd 文件的 inode 号码 (36628004);
  5. passwd 的 inode:
    读取 36628004 号 inode 得知 dmtsai 具有 r 的权限,因此可以读取 passwd 的 block 内容;
  6. passwd 的 block:
    最后将该 block 内容的数据读出来。

简而言之,先找到inode,确定权限,再从inode中找出block的地址,去寻找

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

假设我们想要新增一个文件,此时文件系
统的行为是:

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

因为 superblock, inode bitmap 及
block bitmap 的数据是经常变动的,每次新增、移除、编辑时都可能会影响到这三个部分的数据,因此被称为中介数据

数据的不一致 (Inconsistent) 状态

系统在重新启动的时候,就会藉由 Superblock 当中记录的 valid bit (是否有挂载) 与 filesystem state(clean与否)等状态来判断是否强制进行数据一致性的检查

日志式文件系统 (Journaling filesystem)
专门在记录写入或修订文件时的步骤
  1. 预备:当系统要写入一个文件时,会先在日志记录区块中纪录某个文件准备要写入的信息;
  2. 实际写入:开始写入文件的权限与数据;开始更新 metadata 的数据;
  3. 结束:完成数据与 metadata 的更新后,在日志记录区块当中完成该文件的纪录。

7.1.6 Linux 文件系统的运作

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

7.1.7 挂载点的意义 (mount point)

将文件系统与目录树结合的动作我们称为『挂载』。

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

同一个 filesystem 的某个 inode 只会对应到一个文件内容,从而可以判断不同的文件名是否为相同的文件

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

常见的支持文件系统有:

  • 传统文件系统: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)
虚拟文件切换开关,自动替我们切换文件系统
  • VFS 文件系统示意图
graph TD
    A[使用者程序]-->B[系统呼叫界面]
    B-->C[虚拟档案系统]
    C-->D[XFS FS]
    C-->E[DOS FS]
    C-->F[Ext3/Ext4 FS]
    C-->G[Reiser FS]
    D-->H[缓冲快取]
    E-->H[缓冲快取]
    F-->H[缓冲快取]
    G-->H[缓冲快取]
    H-->I[装置驱动程序]
    I-->J[硬件装置驱动器]

7.1.9 XFS 文件系统简介

XFS 文件系统的配置

xfs 文件系统在资料的分布上,主要规划为三个部份

  • 资料区 (data section)
  • 文件系统活动登录区 (log section)
  • 实时运作区 (realtime section)
资料区 (data section)
放置包括 inode/data block/superblock 等数据

xfs 的 block 与 inode 有多种不同的容量可供设定,block 容量可由 512bytes ~ 64K 调配,不过,Linux 的环境下, 由于内存控制的关系 (页面文件 pagesize 的
容量之故),因此最高可以使用的 block 大小为 4K

文件系统活动登录区 (log section)
主要被用来纪录文件系统的变化
实时运作区 (realtime section)

当有文件要被建立时,xfs 会在这个区段里面找一个到数个的 extent 区块,将文件放置在这个区
块内,等到分配完毕后,再写入到 data section 的 inode 与 block 去

XFS 文件系统的描述数据观察
xfs_info  挂载点|装置文件名
#范例一:找出系统 /boot 这个挂载点底下的文件系统的 superblock 纪录
  df -T /boot
  Filesystem Type 1K-blocks Used Available Use% Mounted on
    /dev/vda2 xfs 1038336 133704 904632 13% /boot
    
    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
  • 第 1 行里面的 isize 指的是 inode 的容量,每个有 256bytes 这么大。至于 agcount 则是前面谈到的储存
    区群组 (allocation group) 的个数,共有 4 个, agsize 则是指每个储存区群组具有 65536 个 block 。配
    合第 4 行的 block 设定为 4K,因此整个文件系统的容量应该就是 4655364K 这么大!
  • 第 2 行里面 sectsz 指的是逻辑扇区 (sector) 的容量设定为 512bytes 这么大的意思。
  • 第 4 行里面的 bsize 指的是 block 的容量,每个 block 为 4K 的意思,共有 262144 个 block 在这个文
    件系统内。
  • 第 5 行里面的 sunit 与 swidth 与磁盘阵列的 stripe 相关性较高。这部份我们底下格式化的时候会举一个
    例子来说明。
  • 第 7 行里面的 internal 指的是这个登录区的位置在文件系统内,而不是外部设备的意思。且占用了 4K *
    2560 个 block,总共约 10M 的容量。
  • 第 9 行里面的 realtime 区域,里面的 extent 容量为 4K。不过目前没有使用。

7.2 文件系统的简单操作

7.2.1 磁盘与目录的容量

  • df:列出文件系统的整体磁盘使用量;
  • du:评估文件系统的磁盘使用量(常用在推估目录所占容量)
df
df [-ahikHTm] [ 目 录 或文件名] ]
选项与参数:
-a :列出所有的文件系统,包括系统特有的 /proc 等文件系统;
-k :以 KBytes 的容量显示各文件系统;
-m :以 MBytes 的容量显示各文件系统;
-h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
-H :以 M=1000K 取代 M=1024K 的进位方式;
-T :连同该 partition 的 filesystem 名称 (例如 xfs) 也列出;
-i :不用磁盘容量,而以 inode 的数量来显示
  • Filesystem:代表该文件系统是在哪个 partition ,所以列出装置名称;
  • 1k-blocks:说明底下的数字单位是 1KB 可利用 -h 或 -m 来改变容量;
  • Used:用掉的磁盘空间
  • Available:剩下的磁盘空间
  • Use%:磁盘的使用率
  • Mounted on:就是磁盘挂载的目录
  du [- - ahskm]  文件 或目 录 名 称
选项与参数:
-a :列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已。
-h :以人们较易读的容量格式 (G/M) 显示;
-s :列出总量而已,而不列出每个各别的目录占用容量;
-S :不包括子目录下的总计,与 -s 有点差别。
-k :以 KBytes 列出容量显示;
-m :以 MBytes 列出容量显示;

7.2.2 实体链接与符号链接: ln

Hard Link ( 实体链接, 硬体链接或实体连接)

hard link 是在某个目录下新增一个文件名链接到某 inode 号码的关联记录

  • 不能跨 Filesystem
  • 不能 link 目录
Symbolic Link (符号链接,即快捷方式)

Symbolic link 就是在建立一个独立的文件,而这个文件会让数据的读取指向他 link 的那个文件的档名

  ln [-sf]  来源文件 目标文件#即新文件名
选项与参数:
-s :如果不加任何参数就进行连结,那就是 hard link,至于 -s 就是 symbolic link
-f :如果目标文件存在时,就主动的将目标文件直接移除后再建立!
  • 关于目录的 link 数量:
    当我们建立一个新的目录时,新的目录的 link 数为 2,而上层目录的 link 数则会增加 1

7.3 磁盘的分区 、格式化、检验与挂载

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

7.3.1 观察磁盘分区状态

lsblk 列出系统上所有磁盘列表
  lsblk [- - dfimpt] [device]
选项与参数:
-d :仅列出磁盘本身,并不会列出该磁盘的分区数据
-f :同时列出该磁盘内的文件系统名称
-i :使用 ASCII 的线段输出,不要使用复杂的编码 (再某些环境下很有用)
-m :同时输出该装置在 /dev 底下的权限数据 (rwx 的数据)
-p :列出该装置的完整文件名!而不是仅列出最后的名字而已。
-t :列出该磁盘装置的详细数据,包括磁盘队列机制、预读写的数据量大小等
  • NAME:就是装置的文件名啰!会省略 /dev 等前导目录!
  • MAJ:MIN:其实核心认识的装置都是透过这两个代码来熟悉的!分别是主要:次要装置代码!
  • RM:是否为可卸除装置 (removable device),如光盘、USB 磁盘等等
  • SIZE:当然就是容量啰!
  • RO:是否为只读装置的意思
  • TYPE:是磁盘 (disk)、分区槽 (partition) 还是只读存储器 (rom) 等输出
  • MOUTPOINT:就是前一章谈到的挂载点
blkid 列出装置的 UUID 等参数

UUID : 全局唯一标识符

parted 列出磁盘的分区表类型与分区信息
parted device_name print

7.3.2 磁盘分区: gdisk/fdisk

MBR 分区表请使用 fdisk 分区, GPT 分区表请使用 gdisk 分区!

gdisk(待更新)
gdisk  装置名称
partprobe 更新 Linux 核心的分区
partprobe [-s]

7.3.3 磁盘格式化(建置文件系统)

XFS 文件系统 mkfs.xfs
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 文件系统 for RAID 效能优化 (Optional)
EXT4 文件系统 mkfs.ext4
  • 我有两个线程的 CPU 数量,所以 agcount 最好指定为 2
  • 当初设定 RAID 的 stripe 指定为 256K 这么大,因此 su 最好设定为 256k
  • 设定的磁盘阵列有 8 颗,因为是 RAID5 的设定,所以有一个 parity (备份碟),因此指定 sw 为 7
  • 由上述的数据中,我们可以发现数据宽度 (swidth) 应该就是 256K*7 得到 1792K,可以指定 extsize 为
    1792k
EXT4 文件系统 mkfs.ext4
  mkfs.ext4 [-b size] [-L label]  装置名称
选项与参数:
-b :设定 block 的大小,有 1K, 2K, 4K 的容量,
-L :后面接这个装置的表头名称。
其他文件系统 mkf

s

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_repair 处理 XFS
xfs_repair [-fnd]  装 置名 称
选项与参数:
-f :后面的装置其实是个文件而不是实体装置
-n :单纯检查并不修改文件系统的任何数据 (检查而已)
-d :通常用在单人维护模式底下,针对根目录 (/) 进行检查与修复的动作!
fsck.ext4 处理 EXT4 文件系统
选项与参数:
-p :当文件系统在修复时,若有需要回复 y 的动作时,自动回复 y 来继续进行修复动作。
-f :强制检查!一般来说,一般用户强制细节检查
-D :针对文件系统下的目录进行优化配置。
-b :后面接 superblock 的位置!一般用于备份superblock

7.3.5 文件系统挂载与卸除

注意事项
  • 单一文件系统不应该被重复挂载在不同的挂载点(目录)中
  • 单一目录不应该重复挂载多个文件系统
  • 要作为挂载点的目录,理论上应该都是空目录才是
  • 如果一个空目录被挂载了文件系统之后,原目录下的东西会被隐藏直至该文件系统被卸载
mount -a 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: 重新挂载,这在系统出错,或重新更新参数时,很有用!
系统自动挂载文件系统所参考的文件
  • /etc/filesystems:系统指定的测试挂载文件系统类型的优先级;
  • /proc/filesystems:Linux 系统已经加载的文件系统类型。
Linux 支持的文件系统之驱动程序都写在如下的目录中
  • /lib/modules/$(uname -r)/kernel/fs/
挂载 xfs/ext4/vfat 等文件系统

挂载其他大同小异

  1. 找到需要挂载的硬件UUID(lsblk、blkid)
  2. 建立需要挂载的目录(mkdir)
  3. 使用mount命令先写硬件UUID在写目录地址
重新挂载根目录与挂载不特定目录
  mount -o remount,rw,auto /
umount ( 将装置文件删除 )
umount [-fn]  装置文件名或挂载点
选项与参数:
-f :强制卸除!可用在类似网络文件系统 (NFS) 无法读取到的情况下;
-l :立刻卸除文件系统,比 -f 还强!
-n :不更新 /etc/mtab 情况下卸除。

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

mknod

系统透过文件的 major 与 minor 数值来替代该文件所代表的装置
这两个只看容易通过 ll 命令找到

mknod  装置文件名 [bcp] [Major] [Minor]
选项与参数:
装置种类:
b :设定装置名称成为一个周边储存设备文件,例如磁盘等
c :设定装置名称成为一个周边输入设备文件,例如鼠标/键盘等
p :设定装置名称成为一个 FIFO 文件
Major :主要装置代码
Minor :次要装置代码
xfs_admin 修改 XFS 文件系统的 UUID 与 Label name
  xfs_admin [-lu] [-L label] [-U uuid]  装置文件名
选项与参数:
-l :列出这个装置的 label name
-u :列出这个装置的 UUID
-L :设定这个装置的 Label name
-U :设定这个装置的 UUID !
tune2fs 修改 ext4 的 label name 与 UUID
tune2fs [-l] [-L Label] [-U uuid]  装置文件名
选项与参数:
-l :类似 dumpe2fs -h 的功能 将 superblock 内的数据读出来
-L :修改 LABEL name
-U :修改 UUID 

7.4 设定开机挂载

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

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

就是将我们利用 mount 指令进行挂载时, 将所有的选项与参数写入
到/etc/fstab (filesystem table)中

该文件的六个字段,极其重要

[装置/UUID 等] [挂载点] [文件系统] [文件系统参数] [dump] [fsck]
  • 第一栏:磁盘装置文件名/UUID/LABEL name:
    • 文件系统或磁盘的装置文件名,如 /dev/vda2 等
    • 文件系统的 UUID 名称,如 UUID=xxx
    • 文件系统的 LABEL 名称,例如 LABEL=xxx

以上三选一,建议使用UUID

  • 第二栏:挂载点 (mount point):
    • 一定是目录
  • 第三栏:磁盘分区的文件系统
    • 包括 xfs, ext4, vfat, reiserfs, nfs 等等
  • 第四栏:文件系统参数
参数意思内容意义
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
defaults同时具有 rw, suid, dev, exec, auto, nouser, async 等参数。 基本上,预设情况使用defaults 设定即可!
  • 第五栏:能否被 dump 备份指令作用:
    • 直接填写0
  • 第六栏:是否以 fsck 检验扇区:
    • 直接填 0

/etc/fstab 是开机时的配置文件,不过,实际 filesystem 的挂载是记录到 /etc/mtab 与 /proc/mounts 这两个文件当中的
若出现问题无法正常开机,进入单人维护模式下,可用

mount -n -o remount,rw /

7.4.2 特殊装置 loop 挂载 (映像文件不挂载就使用)

挂载光盘/DVD 映象文件
mount -o loop ios文件 挂载地址
建立大文件以制作 loop 装置文件
  • 建立大型文件
    • 假设我要建立一个空的文件在 /srv/loopdev
dd if=/dev/zero of=/srv/loopdev bs=1M count=512
# if 是 input file ,输入文件。那个 /dev/zero 是会一直输出 0 的装置
# of 是 output file ,将一堆零写入到后面接的文件中。
# bs 是每个 block 大小,就像文件系统那样的 block 意义;
# count 则是总共几个 bs 的意思。所以 bs*count 就是这个文件的容量了!
  • 大型文件的格式化
    • 预设 xfs 不能够格式化文件的,所以要格式化文件得要加入特别的参数才行
  mkfs.xfs -f /srv/loopdev
  • 挂载
      mount -o loop  UUID=" " /mnt

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

  • 设定一个 swap partition
  • 建立一个虚拟内存的文件

7.5.1 使用物理分区创建内存交换区

分区:

先使用 gdisk 在你的磁盘中分区出一个分区给系统作为 swap 。由于 Linux 的 gdisk 预设会将分
区的 ID 设定为 Linux 的文件系统,所以还得要设定一下 system ID 。

格式化:

利用建立 swap 格式的『mkswap 装置文件名』就能够格式化该分区成为 swap 格式

使用:

最后将该 swap 装置启动,方法为:swapon 装置文件名

观察:

通过 free 与 swapon -s 这个指令来观察一下内存的用量

7.5.2 使用 文件置 建置 swap

  1. 使用 dd 这个指令来新增一个 128MB 的文件在 /tmp 底下:
dd if=/dev/zero of=/tmp/swap bs=1M count=128
  1. 使用 mkswap 将 /tmp/swap 这个文件格式化为 swap 的文件格式
mkswap /tmp/swap
  1. 使用 swapon 来将 /tmp/swap 启动
swapon /tmp/swap
swapon -s
  1. 使用 swapoff 关掉 swap file,并设定自动启用
nano /etc/fstab
/tmp/swap swap swap defaults 0 0

# 确保恢复原始状态  再进行测试
swapoff /tmp/swap
swapon -s

swapon -a
swapon -s
# 最终你又会看正确的三个 swap 出现啰!这也才确定你的 /etc/fstab 设定无误!

7.6 文件系统的特殊观察与操作

7.6.1 磁盘空间之浪费问题

7.6.2 利用 GNU 的parted 进行分区行为(Optional)

parted 可以直接在一行指令列就完成分区,是一个非常好用的指令!它常用的语法如下:

parted [ 装 置 ] [ 指令 ] [ 参数 ]
选项与参数:
指令功能:
新增分区:mkpart [primary|logical|extended] [ext4|vfat|xfs] 开始 结束
显示分区:print
删除分区:rm [partition]

7.7 重点回顾

  • 一个可以被挂载的数据通常称为『文件系统, filesystem』而不是分区 (partition)
  • 基本上 Linux 的传统文件系统为 Ext2 ,该文件系统内的信息主要有:
    • superblock:记录此 filesystem 的整体信息,包括 inode/block 的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;
    • inode:记录文件的属性,一个文件占用一个 inode,同时记录此文件的数据所在的 block 号码;
    • block:实际记录文件的内容,若文件太大时,会占用多个 block 。
  • Ext2 文件系统的数据存取为索引式文件系统(indexed allocation)
  • 整理碎片是将一个文件的多个 block 放在同一个区域,增加检索速度
  • Ext2 文件系统主要有:boot sector, superblock, inode bitmap, block bitmap, inode table, data block 等六大部分。
  • data block 是用来放置文件内容数据地方,在 Ext2 文件系统中所支持的 block 大小有 1K, 2K 及 4K 三种
  • inode 记录文件的属性/权限等数据,其他重要项目为: 每个 inode 大小均为固定,有 128/256bytes 两种基本容量。每个文件都仅会占用一个 inode; 因此文件系统能够建立的文件数量与 inode 的数量有关
  • 文件的 block 在记录文件的实际数据,目录的 block 则在记录该目录底下文件名与其 inode 号码的对照表;
  • 日志式文件系统 (journal) 会多出一块记录区,随时记载文件系统的主要活动,可加快系统复原时间;
  • Linux 文件系统为增加效能,会让主存储器作为大量的磁盘高速缓存;
  • 实体链接只是多了一个文件名对该 inode 号码的链接而已;
  • 符号链接就类似 Windows 的快捷方式功能。
  • 磁盘的使用必需要经过:分区、格式化与挂载,分别惯用的指令为:gdisk, mkfs, mount 三个指令
  • 分区时,应使用 parted 检查分区表格式,再判断使用 fdisk/gdisk 来分区,或直接使用 parted 分区
  • 为了考虑效能,XFS 文件系统格式化时,可以考虑加上 agcount/su/sw/extsize 等参数较佳
  • 如果磁盘已无未分区的容量,可以考虑使用大型文件取代磁盘装置- 开机自动挂载可参考/etc/fstab 之设定,设定完毕务必使用 mount -a 测试语法正确否;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值