一、实验环境(rhel7.0版本)
主机环境:rhel7.0
各主机信息
主机名 | IP |
---|---|
server | 172.25.254.1 |
二、认识 Linux 文件系统
1、磁盘组成、磁盘文件名及分区介绍
整块磁盘的组成主要有:
- 圆形的碟片(主要记录数据的部分)
- 机械手臂,与机械手臂上的磁头(可擦写碟片上的数据)
- 主轴马达,可以转动碟片,让机械手臂上的磁头在碟片上读写数据。
碟片的组成主要有:
- 扇区:扇区为最小的物理存储单位,且依据磁盘设计的不同,目前主要有 512B 与 4KB 两种
- 柱面:将扇区组成一个圆,那就是柱面
磁盘文件名介绍:
- 物理磁盘的文件名:/dev/sd[a-p][1-128]
- 虚拟磁盘的文件名:/dev/vd[a-p][1-128]
- LVM:/dev/VGNAME/LVNAME
分区介绍:
- 早期的分区主要以 柱面 为最小的物理存储单位,现在的分区通常使用 扇区 为最小分区单位(每个扇区都有其号码,就好像座位一样)。
- 磁盘分区表主要有两种格式,一种是限制较多的 MBR 分区表,一种是较新且限制较少的 GPT 分区表。
- MBR 分区表中,第一个扇区最重要,里面有主引导记录(MBR)及分区表,其中 MBR 占有 446B,而分区表则占有 64 B。
- GPT 分区表除了分区数量扩充较多之外,支持的磁盘容量也可以超过 2TB。
2、文件系统类型
我们知道磁盘分区完毕后还需要爱进行格式化,之后操作系统才能够使用这个文件系统。为什么需要格式化?这是因为每种操作系统所设置的文件属性/权限并不相同,为了存放这些文件所需的数据,因此就需要将分区格式化,以成为操作系统能够利用的文件系统格式。
文件系统通常会将数据分别存放在不同的区块,
- 权限与属性放置到 innode 中
- 实际的数据放置到数据区块中
- 还有一个超级区块,会记录整个文件系统的整体信息,包括 innode 与数据区块的总量、使用量、剩余量等
ext2 文件系统与 FAT 文件系统的区别:
- ext2 文件系统是所引式文件系统,读取数据的速度较快;且基本上不需要进行碎片整理。
- FAT 文件系统不是索引式文件系统,读取数据的速度较慢;经常需要进行碎片整理,碎片整理的原因是文件写入的区块太过于离散,此时文件读取的性能将会变得很差所致。这个时候可以通过碎片整理将同一个文件所属的区块集合在一起,这样数据的读取会比较容易。
3、Linux 的 ext2/ext3/ext4 文件系统
文件系统一开始就将 inode 与数据区块 规划好了,除非重新格式化(或利用 resize2fs 命令修改其大小),否则 inode 与数据区块固定后就不再变动。但是,如果我的文件系统高达数百 GB 时,那么将所由的 inode 与数据区块通通放置在一起将是很不明智的决定,因此 inode 与数据区块的数量太庞大,不容易管理。
因此,ext2/ext3/ext4 文件系统格式化的时候基本上是区分为多个区块群组,每个区块群组都有以下的六个主要内容:
(1)数据区块
数据区块是用来放置文件数据地方,在 ext2 文件系统中所支持的区块大小有 1K、2K、4K三种,在格式化时就已经固定了,且每隔区块都有编号,以方便 inode 的记录。其差异如下:
Block大小 | 1KB | 2KB | 4KB |
最大单一文件限制 | 16GB | 256GB | 2TB |
最大文件系统总容量 | 2TB | 8TB | 16TB |
除此之外,ext2 文件系统的区块的基本限制如下:
- 原则上,区块的大小与数量在格式化完就不能够再修改(除非重新格式化或利用 resize2fs 命令修改其大小);
- 每个区块内最多只能够放置一个文件的数据;
- 承上,如果文件大于区块的大小,则一个文件会占用多个区块数量;
- 承上,若文件小于区块,则该区块的剩余容量就不能够再被使用了(磁盘空间会浪费)。
(2)inode table (inode 表)
inode 记录的数据至少有下面这些:
- 该文件的属性(r、w、x);
- 该文件的拥有者与所属组
- 该文件的大小
- 该文件建立或状态改变的时间(ctime)
- 最近一次的读取时间(atime)
- 最近修改的时间(mtime)
- 定义文件特性的标识
- 该文件真正内容的指向
inode 的数量与大小再格式化时就已经固定了,除此之外 inode 还有些什么特色?
- 每个 inode 大小均固定为 128B(新的 ext4 与 xfs 可设置到 256B);
- 每个文件都仅会占用一个 inode 而已;
- 承上,因此文件系统能够建立的文件数量与 inode 的数量有关;
- 系统读取文件时需要先找到 inode,并分析 inode 所记录的权限与用户是否相符,若符合才能够读取区块的内容;
- inode 记录一个数据区块要使用 4B。
系统将 inode 记录区块号码的取余定义为 12 个直接、一个间接、一个双间接与一个三间接记录区。
所谓的间接就是 再拿一个区块来当作记录区块号码的记录区,如果文件太大,就会使用简介的区块来记录编号。双间接、三间接以此类推。
(3)SUperblock(超级区块)
没有超级区块,就没有这个文件系统,它记录的信息主要有:
- 数据区块与 inode 的总量;
- 未使用与已使用的 inode 与数据区块数量;
- 数据区块与 inode 的大小(block 为 1、2、4K,inode 为 128B、256B);
- 文件系统的挂载时间、最近一次写入数据的时间、最近一次检验磁盘(fsck)的时间等文件系统的相关信息;
- 一个有效位数值,若此文件系统已被挂载,则有效位为0,若为被挂载,则有效位为 1。
一般来说,超级区块的大小为 1024B。
此外,每个区块群组都可能含有超级区块。但是我们也说一个文件系统应该仅有一个超级区块而已,那是怎么回事?事实上除了第一个区块群组内会含有超级区块之外,后续的区块群组不一定含有超级区块,而若含有超级区块则该超级区块主要是作为第一个区块群组内超级区块的备份,这样可以进行超级区块的恢复。
(4)Filesystem Description(文件系统描述说明)
这个区段可以描述每个区块群组的开始与结束的区块,以及说明每个区段(超级区块、对照表、inode 对照表、数据分块)分别介于拿一个区块之间。
(5)区块对照表(block bitmap)
新增文件时总会甬道区块,那你要使用那个区块来记录?当然是选择空区块来记录新文件的数据。那你怎么知道哪个区块是空的呢?这就要通过区块对照表的帮助了。
同样,如果你要删除文件时,那么哪些文件原本占用的区块号码就要释放出来。
(6)inode 对照表(inode bitmap)
与区块对照表的功能类似,只是区块对照表记录的是使用与未使用的区块号码,inode 对照表则是记录使用与未使用的 inode 号码。
真实数据与元数据的概念
数据区块称为真实数据存放区域;
inode table、SUperblock、Filesystem Description、区块对照表、inode 对照表 这些区段被称为元数据。
dump2fs命令——查询 ext 系列超级区块信息的命令
dump2fs [-bh] 设备文件名
选项与参数:
-b:列出保留为坏道的部分(一般用不到)
-h:禁猎出 superblock 的数据,不会列出其他的区段内容
[root@server ~]# blkid <==这个命令可以显示出目前系统被格式化的设备
/dev/vda1: UUID="96d4a822-5cd8-48b8-a353-91305bc9672e" TYPE="xfs"
/dev/vda2: UUID="b3937a5a-4586-4eae-8c77-ad18526fb1d4" TYPE="swap"
/dev/vda3: UUID="128c866d-892b-4384-bc8b-6491715d969b" TYPE="xfs"
/dev/vdb5: UUID="b75c8455-192a-4f3f-bb34-9dac4c175416" TYPE="ext4"
[root@server ~]# dumpe2fs /dev/vdb5
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name: <none> <==文件系统的名称(不一定会有)
Last mounted on: <not available> <==上次挂载的目录位置
Filesystem UUID: b75c8455-192a-4f3f-bb34-9dac4c175416 <==UUID号码
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype extent 64bit flex_bg sparse_super huge_file uninit_bg dir_nlink extra_isize
Filesystem flags: signed_directory_hash
Default mount options: user_xattr acl <==默认挂载时会加上的挂载参数
Filesystem state: clean <==这个文件系统的状态是什么,clean 是没问题
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 25688 <==inode 的总数
Block count: 102400 <==区块的总数
Reserved block count: 5120 <==保留的区块总数
Free blocks: 93504 <==还有多少的区块可用数量
Free inodes: 25677 <==还有多少的 inode 可用数量
First block: 1
Block size: 1024 <==单个区块的大小(即 1K)
...(中间省略)...
Inode size: 128 <==inode 的容量大小(128B)
Journal inode: 8
Default directory hash: half_md4
Directory Hash Seed: eb633381-dd9c-4f06-bea2-6b527b4267ae
Journal backup: inode blocks
Journal features: (none)
Journal size: 4096k <==Journal 日志的可供存储大小
Journal length: 4096
Journal sequence: 0x00000001
Journal start: 0
Group 0: (Blocks 1-8192) <==第一个区块群组位置
Checksum 0xf5a9, unused inodes 1965
Primary superblock at 1, Group descriptors at 2-2 <==主要超级区块的所在
Reserved GDT blocks at 3-258
Block bitmap at 259 (+258), Inode bitmap at 275 (+274) <==区块对照表、inode 对照表对应的超级区块所在
Inode table at 291-537 (+290) <==inode 表对应的超级区块所在
4683 free blocks, 1965 free inodes, 2 directories, 1965 unused inodes
Free blocks: 3510-8192 <==剩余的区块数
Free inodes: 12-1976 <==剩余的 inode 数
...(下面省略)...
4、与目录树的关系
目录的内容在记录文件名,一般文件才是实际记录数据内容的地方。
(1)目录
当我们在 Linux 的文件系统建立一个目录时,文件系统会分配一个 inode 与至少一块区块给该目录。
其中 inode 记录该目录的相关权限与属性,并可记录分配到的那块区块号码,而区块则是记录在这个目录下的文件名与该文件名占用的 inode 号码数据。
(2)文件
但我们在 Linux 下的 ext2 建立一个一般文件时,ext2 会分配一个 inode 与相对于该文件大小的区块数量给该文件。例如:假设我的一个区块为 4KB,而我要建立一个 100KB 的文件,那么 Linux 将分配一个 inode 与 25 个区块来存储该文件。但是,请注意,由于 inode 仅有 12 个直接指向,因此还需要爱一个区块来记录区块号码。
(3)目录树读取
从上面的介绍,我们可以知道 inode 本身并不记录文件名,文件名的记录是在目录的区块中。
举例来说,如果我想要读取 /etc/passwd 这个文件时,系统是如何读取的呢?
[root@server ~]# ll -id / /etc/ /etc/passwd
128 drwxr-xr-x. 18 root root 4096 Jun 20 09:59 /
16777345 drwxr-xr-x. 135 root root 8192 Jun 20 09:59 /etc/
18809130 -rw-r--r--. 1 root root 2097 Jun 18 14:33 /etc/passwd
读文件的流程为(假设读取者的身份为 student):
1、/ 的 inode:
通过挂载点的信息找到 inode 号码为 128 的根目录的 inode,且 inode 的规范让 student 可以读取该区块的内容(有 r 与 x)。
2、/ 的区块:
经过上述步骤取得区块的号码,并找到该内容有 etc/ 目录的 inode 号码(16777345)。
3、etc/ 的 inode:
读取 16777354 号 inode 得知 student 具有 r 与 x 的权限,因此可以读取 etc/ 的区块内容。
4、etc/ 的区块:
经过上各步骤取得区块号码,并找到该内容有 passwd 文件的 inode 号码(18809130)。
5、passwd 的 inode:
读取 18809130 号 inode 得知 student 具有 r 的权限,因此可以读取 passwd 的区块内容。
6、passwd 的区块:
最后将该区块内容的数据读出来。
5、ext2/ext3/ext4 文件的存取与日志式文件系统的功能
假如,我们要新增一个文件,此时文件系统的操作是:
- 先确定用户对于欲新增文件的目录是否具有 w 与 x 的权限,若有的话才能新增;
- 根据 inode 对照表找到没有使用的 inode 号码,并将新文件的权限/属性写入;
- 根据区块对照表找到没有使用的 区块号码,并将时即的数据写入区块中,且更新inode 的区块指向数据;
- 将刚刚写入的 inode 与区块数据同步更新 inode 对照表与区块对照表,并更新超级区块的内容。
数据的不一致状态的产生
假如,你的文件在写入文件系统时,因为某些原因导致系统中断(例如突然的断电、系统内核发生错误等的怪事发生时),所以写入的数据仅有 inode 对照表和数据区块而已,最后一个同步更新元数据的步骤还没有完成,此时就会发生元数据的内容与数据数据存放区产生不一致的情况。
数据的不一致状态的解决
解决办法一:
早期的 ext2 文件系统中,如果发生这个问题,那么系统在重新启动的时候,就会借由超级区块当中记录的有效位(是否有挂载)与文件系统状态(正确挂载与否)等状态来判断是否强制进行数据不一致的检查,若需要检查时则以 e2fsck 这个程序来进行。——费时,要查找整个文件系统。
解决办法二:
采用日志式文件系统——适用于 ext3/ext4 文件系统:
在我们的文件系统中规划一个区块,该区块专门记录写入或修改文件时的步骤,也就是说:
- 预备:当系统要写入一个文件时,会先在日志记录区块中记录某个文件准备要写入的信息;
- 实际写入:开始写入文件的权限与数据;开始更新 metadata 的数据;
- 结束:完成数据与 metadata 的更新后,在日志记录区块当中完成该文件的记录。
6、Linux 文件系统的运行
Linux 使用一个称为 异步处理 的方式。所谓的异步处理是这样的:
当系统加载一个文件到内存后,如果该文件没有被修改过,则在内存区段的文件数据会被设置【干净(clean)】。但如果内存中的文件数据被更改过了,此时该内存中的数据会被设置为【脏的【Dirty】】文件,此时所有的操作都还在内存中执行,并没有写入到磁盘中。系统会不定时的将内存中设置位【Dirty】的数据写回磁盘,以保持磁盘与内存数据的一致性。
Linux 系统上面的文件系统与内存有非寻大的关系:
- 系统会将常用的文件数据放置到内存的缓冲区,以加速文件系统的读写操作;
- 承上,因此 Linux 的物理内存最后都会被用光,者是正常的情况,可加速系统性能;
- 你可以手动使用 sync 来强制内存中设置为 Dirty 的文件回写入磁盘中;
- 若正常关机时,关机命令会主动调用 sync 来将内的数据写入磁盘内;
- 但若不正常关机(如断电、宕机等),由于数据未回写到磁盘内,因此重新启动后可能会花时间在进行磁盘校验,甚至可能导致文件系统的孙换(非磁盘损坏)。
7、挂载点的意义
每个文件系统都有独立的 inode、区块、超级区块等信息,这个文件系统要能够链接到目录树才能被我们使用。将文件系统与目录树结合的操作我们称为【挂载】。
重点是:挂载点一定是目录,该目录为进入该文件系统的入口。
由于 xfs 文件系统最顶层的目录的 inode 一般为 128 号,因此可以发现 /、/boot 为三个不同的文件系统,因为每一行的文件属性并不相同,且三个目录的挂载点也均不相同。
根目录下的 . 与 .. 是相同的东西,因为权限是一模一样。如果使用文件系统的观点来看,同一个文件系统的某个 inode 只会对应到一个文件内容而已(因为一个文件占用一个 inode) ,因此我们可以通过判断 inode 号码来确认不同文件名是否为相同的文件,所以可以这样看:
上面的信息中由于挂载点均为 /,因此三个文件(/、/.、/..)均在同一个文件系统内,而三个文件的 inode 号码均为 128号,因此这桑格文件名都指向同一个 inode 号码,当然这三个文件的内容也就一模一样。
8、其他 Linux 支持的文件系统与 VFS
常见的 Linux 支持的文件系统有:
- 传统文件系统:etx2、minix、FAT(用 vfst 模块)、iso9660(光盘)等
- 日志式文件系统:ext3、ext4、ReiserFS、Windows'NTFS、IBM‘s JFS、SGI's XFS、ZFS
- 网络文件系统:NFS、SMBFS
想要知道你的 Linux 支持的文件系统有哪些,可以查看下面这个目录:
[root@server ~]# ll /lib/modules/3.10.0-123.el7.x86_64/kernel/fs/
系统目前已加载到内存 中的文件系统则有:
[root@server ~]# cat /proc/filesystems
Linux VFS(Virtual Filesystem Switch)
所由 Linux 系统都是通过一个名为 Virtual Filesystem Switch 的内核功能去i读取文件系统。也就是说,这个 Linux 识别的文件系统其实都是 VFS 在进行管理,我们用户并不需要知道每隔硬盘分区上面的文件系统是什么,VFS 会主动帮我们做好读取的操作。
9、XFS 文件系统简介
(1)为什么 CentOS 7.x ,默认的文件系统由 ext 系列变成了 XFS 文件系统
原因有两点:
- 因为 ext 文件系统系列对于文件格式化的处理方面,采用的是预先规划出所有的 inode 、区块、元数据等数据,未来系统可以直接使用,不需要再进行动态配置的做法。
- ext 文件系统系列在处理巨型文件方面的性能不是很好。
(2)XFS 文件系统的配置
基本上 XFS 文件系统就是一个日志式文件系统,前面介绍的关于文件系统的知识,大部分在 XFS 文件系统环境下都是可以使用的。
XFS 文件系统在数据的分布上,主要规划为三个部分,一个数据区、一个文件系统活动登录区以及一个实时运行区。下面分别介绍这三部分内容:
1、数据区
基本上,数据区跟我们之前谈过的 ext 系列一样,包括 inode、数据区块、超级区块等数据,都放置在这个区块。这个数据区与 ext 系列的区块群组类似。总之,xfs 这个数据区的存储区群组,你就将它想成是 ext 系列的区块群组就对了,本小节之前讲的都可以在这个区块内使用,只是 inode 与区块是动态产生,并非一开始于格式化就完成配置的。
另外,于 ext 系列不同的是,xfs 的区块与 inode 有多种不同的容量可供设置,区块容量可在 512B~64KB 调整,不过,在 Linux 的环境下,由于存储控制的关系,最高可以使用的区块大小为 4K。至于 inode容量可在 256B~2MB,不过,大概还是保留 256B 的默认值就够用了。
2、文件系统活动登录区
这个区域主要被用来记录文件系统的变化,其实有点像是日志区。文件的变化会在这里记录下来,直到该变化完整地写入 到数据区块后,该条记录才会被结束。如果文件系统因为某些缘故而损坏时,系统会拿这个登录区块来进行检验,看看系统挂掉之前,文件系统正在运行哪些操作,借以快速恢复文件系统。
在这个区域,你可以指定外部的磁盘来作为 xfs 文件系统地日志区块。
3、实时运行区
当有文件要被建立时,xfs 会在这个区段里面找到一个到数个 evenrt 区块,将文件放置在这个区块内,等到分配完毕后,再写入到数据区地 inode 与 区块内。
(3)XFS 文件系统地描述数据观察
xfs_info 挂载点|设备文件名
[root@server ~]# df -Th /boot/
Filesystem Type Size Used Avail Use% Mounted on
/dev/vda1 xfs 197M 102M 95M 52% /boot
[root@server ~]# xfs_info /boot/
meta-data=/dev/vda1 isize=256 agcount=4, agsize=12800 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0
data = bsize=4096 blocks=51200, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal bsize=4096 blocks=853, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
上面的输出信息可以这样解释:
- 第 1 行里面的 isize 指的是 inode 的容量,每个有 256B 这么大。至于 agcount 则是存储区群组的个数,共 4 个, agsize 则是指每个存储区群组具有 12800 个区块,配合第 4 行的区块设置为 4K,因此整个文件系统的容量应该就是 4 * 12800 * 4K = 200MB 这么大。
- 第 2 行里面的 sectsz 指的是逻辑扇区的容量设置为 512B 这么大的意思。
- 第 4 行里面的 bsize 指的是区块的容量,每隔区块为 4K 的意思,共有 51200 个区块在这个文件系统内。
- 第 5 行里面的 sunit 与 swidth 与磁盘阵列的 stripe 相关性较高。
- 第 7 行里面的 internal 指的是这个登录区的位置在文件系统内,而不是外部设备的意思,且占用了 4K * 853 个区块,总共约有 3.3M 的容量。
- 第 9 行里面的 realtime 区域,里面的 extent 容量为 4K,不过目前没有使用。
值的注意的是:利用 xfs_info 命令时,后面接的设备文件名必须是已经挂载了的设备文件名。
三、文件系统的简单操作
1、磁盘与目录的容量——df 命令 + du 命令
磁盘的整体数据是在超级区块中,但是每个文件的容量则在 inode 当中记载。那在命令行模式下面该如何显示这几个数据?下面就让我们来谈一谈这两个命令:
- df:列出文件系统的整体磁盘使用量
- du:查看文件系统的磁盘使用量(常用在查看目录所占的磁盘空间)
查看博客:https://mp.csdn.net/postedit/89487143
2、硬链接与符号链接:ln
在 Linux 下面的链接文件有两种,
- 一种是类似Windows 的快捷方式功能的文件,可以让你快速地链接到目标文件(或目录),这种称为 软链接/符号链接;
- 另一种则是通过文件系统地 inode 链接来产生新文件名,而不是产生新文件,这种称为 硬链接。
(1)硬链接
【1】、硬链接的含义及实例
硬链接只是在某个目录下新增一条文件名连接到某 inode 号码地关联记录而已。
举个例子来说,假设我系统有个 /root/crontab ,它是 /etc/crontab 的硬链接,也就是说这两个文件名链接到同一个 inode 号码,自然这两个文件名的所有信息都会一模一样(除了文件名之外),实际的情况如下所示:
[root@server ~]# ll -i /etc/crontab
17407609 -rw-r--r--. 1 root root 451 Dec 28 2013 /etc/crontab
[root@server ~]# ln /etc/crontab crontab <== 建立硬链接的命令
[root@server ~]# ll -i /etc/crontab /root/crontab
17407609 -rw-r--r--. 2 root root 451 Dec 28 2013 /etc/crontab
17407609 -rw-r--r--. 2 root root 451 Dec 28 2013 /root/crontab
除了,inode 号码、文件名的所有信息(除了文件名)一样之外,你会发现第二个字段由原本的 1 变成了 2,哪个字段称为链接,这个字段的意义为:有多少文件名链接到这个 inode 号码。
【2】、硬链接的好处
硬链接的好处在于安全:如果你将任何一个文件名删除,其实 inode 与 区块都还是存在的。此时你可以通过另一个文件名来读取正确的文件数据。此外,不论你使用哪个文件名来编辑,最终的结果都会写入到相同的 inode 与区块种,因此均能进行数据的修改。
【3】、硬链接对 inode 号与区块的影响
一般来说,使用硬链接设置链接文件时,磁盘的空间与 inode 的数目都不会改变。硬链接只是在某个目录下的区块多写入了一个关联数据而已,既不会增加 inode 也不会消耗区块数量。
硬链接的制作中,其实还是有可能会改变系统的区块,那就是当你新增的这条数据却刚好江牡蛎的区块填满时,就可能会新加一个区块来记录文件名关联性,而导致磁盘空间的变化。不过,一般硬链接所用掉的关联数据量很小,所以通常不会改变 inode 与磁盘空间的大小。
【4】、硬链接的限制
- 不能跨文件系统
- 不能链接目录
不能链接目录的原因是:如果使用硬链接到此目录时,链接的数据需要连同被链接目录下面的所有数据都建立链接。举例来说,如果你要将 /etc/ 使用硬链接建立一个 /etc_hd 的目录时,那么在 /etc_hd 下面的所有文件名同时都与 /etc 下面的文件名建立硬链接,而不是仅链接到 /etc_hd 与 /etc 而已。并且,未来如果需要在 /etc_hd 下面建立新文件时,连带 /etc 下面的数据又要建立一次硬链接,因此造成相当大的环境复杂度。所以,目前硬链接对于目录暂时是不支持的。
(2)软链接/符号链接
【1】、符号链接的含义及实例
符号链接就是建立一个独立的文件,而这个文件会让数据的读取指向它链接的那个文件的文件名。由于只是利用文件来作为指向的操作,所以,当源文件被删除之后,符号链接的文件会【打不开了】,会一直说【无法打开某文件】,实际上就是找不到原始文件名而已。
符号链接与 Windows 的快捷方式可以给它划上等号,由符号链接所建立的文件作为一个独立的文件,所以会占用 inode 号码。
举例来说,我们先建立一个符号链接到 /etc/crontab 去看看:
[root@server ~]# ln -s /etc/crontab crontab_2
[root@server ~]# ll -i /etc/crontab /root/crontab_2
17407609 -rw-r--r--. 2 root root 451 Dec 28 2013 /etc/crontab
34874124 lrwxrwxrwx. 1 root root 12 Jun 20 17:20 /root/crontab_2 -> /etc/crontab
这两个文件指向不同的 inode 号码,当然是两个独立的文件,而且链接文件的重要内容就是它会写上目标文件的文件名,你可以发上表中的链接文件的大小为 12B。因为箭头(—>)右边的文件名【/etc/crontab】总共有 12 个字母,每个字母占用 1 个字节,所以文件大小就是 12B 了。
【2】、建立符号链接的命令——ln
ln [-sf] 源文件 目标文件
选项与参数:
-s:如果笔架任何参数就进行链接,那就是硬链接,至于 -s 就是符号链接
-f:如果目标文件存在时,就主动的将目标文件直接删除后再建立
范例一:将 /etc/passwd 复制到 /tmp 下面,并且观察 inode 与区块
[root@server ~]# cd /tmp/
[root@server tmp]# cp -a /etc/passwd .
[root@server tmp]# du -sb ; df -i .
10601 . <==先注意一下这里的容量是多少
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/vda3 8719360 113810 8605550 2% /
范例二:将 /tmp/passwd 制作硬链接称为 passwd-hd 文件,并查看文件与容量。
[root@server tmp]# ln passwd passwd-hd
[root@server tmp]# du -sb ; df -i .
10601 .
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/vda3 8719360 113810 8605550 2% /
# 仔细看,即使多了一个文件在 /tmp 下面,整个 inode 与区块的容量并没有改变
[root@server tmp]# ll -i passwd*
52845013 -rw-r--r--. 2 root root 2097 Jun 18 14:33 passwd
52845013 -rw-r--r--. 2 root root 2097 Jun 18 14:33 passwd-hd
# 原来是指向同一个 inode,这是个重点,另外,那个第二栏的链接数也会增加
范例三:将 /tmp/passwd 建立一个符号链接
[root@server tmp]# ln -s passwd passwd-so
[root@server tmp]# ll -i passwd*
52845013 -rw-r--r--. 2 root root 2097 Jun 18 14:33 passwd
52845013 -rw-r--r--. 2 root root 2097 Jun 18 14:33 passwd-hd
52845014 lrwxrwxrwx. 1 root root 6 Jun 20 17:46 passwd-so -> passwd
# passwd-so 指向的 inode number 不同了。这是一个新的文件,这个文件的内容是指向 passwd 这个文件。
# passwd-so 的大小是 6Bytes,因为【passwd】这个单词共有六个字符之故
[root@server tmp]# du -sb ; df -i .
10607 .
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/vda3 8719360 113811 8605549 2% /
# 呼呼,整个容量与 inode 使用数都改变,确实如此
范例四:删除原始文件 passwd,其他两个文件是否能够开启?
[root@server tmp]# rm -rf passwd
[root@server tmp]# cat passwd-hd
...(正常显示完毕)...
[root@server tmp]# cat passwd-so
cat: passwd-so: No such file or directory
[root@server tmp]# ll passwd*
-rw-r--r--. 1 root root 2097 Jun 18 14:33 passwd-hd
lrwxrwxrwx. 1 root root 6 Jun 20 17:46 passwd-so -> passwd
# 符号链接果然无法打开,如果符号链接的目标文件不存在,其实文件名就会由特殊的颜色显示
3、本地存储设备的识别
(1)fidsk -l 查看真实存在的设备
(2)cat /proc/partitions 查看系统识别的设备
(3)blkid 查看系统可以使用的设备
(4)df 查看系统正在挂载的设备(设备在使用之前必须先挂载,通过blkid查看可以使用的设备,设
备可以使用之后,就可以通过df命令进行挂载,挂载之后就可以使用了)
四、磁盘的分区、格式化、检验、挂载与卸载
对于一块新的磁盘,应该有哪些操作需要做:
- 对磁盘进行分区,以建立可用的磁盘分区;
- 对该磁盘分区进行格式化,以建立系统可用的文件系统;
- 若想要仔细一点,则可对刚刚建立好的文件系统进行校验;
- 在 Linux 系统上,需要建立挂载点(亦即是目录),并将它挂载起来。
1、查看磁盘分区状态
(1)lsblk ——列出系统上所有磁盘列表
lsblk [-dfimpt] [device]
选项与参数:
-d:仅列出磁盘本身,并不会列出该磁盘的分区数据;
-f:同时列出该磁盘内的文件系统名称;
-i:使用 ASCII 的字符输出,不要使用复杂的编码(在某些环境下很有用);
-m:同时输出该设备在 /dev 下面的权限信息(rwx 的数据);
-p:列出该设备的完整文件名,而不是仅列出最后的名字而已;
-t:列出该磁盘设备的详细数据,包括磁盘阵列机制、预读写的数据量大小等。
【1】、范例一:列出本系统下的所有磁盘与磁盘内的分区信息
[root@server ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 253:0 0 9G 0 disk <==一整块磁盘
├─vda1 253:1 0 200M 0 part /boot
├─vda2 253:2 0 500M 0 part [SWAP]
└─vda3 253:3 0 8.3G 0 part /
vdb 253:16 0 20G 0 disk <==一整块磁盘
├─vdb1 253:17 0 100M 0 part
├─vdb2 253:18 0 200M 0 part
├─vdb3 253:19 0 200M 0 part
├─vdb4 253:20 0 1K 0 part
└─vdb5 253:21 0 100M 0 part
- NAME:就是设备名,会省略 /dev 等前导目录;
- MAJ:MIN:其实内核识别的设备都是通过这两个代码来实现的,分别是主要与此要设备代码;
- RM:是否为可卸载设备,如光盘、USB 磁盘等;
- SIZE:当然就是容量;
- RO:是否为只读设备的意思;
- TYPE:是磁盘(disk)、分区(partition)还是只读存储器(rom)等输出;
- MOUNTPOINT:挂载点;
【2】、范例二:仅列出 /dev/vda 设备内的所有数据的整文件名
[root@server ~]# lsblk -ip /dev/vda
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
/dev/vda 253:0 0 9G 0 disk
|-/dev/vda1 253:1 0 200M 0 part /boot
|-/dev/vda2 253:2 0 500M 0 part [SWAP]
`-/dev/vda3 253:3 0 8.3G 0 part /
(2)parted——列出磁盘的分区标类型与分区信息
parted device_name print
【1】、范例一:列出 /dev/vda 磁盘的相关信息
[root@server ~]# parted /dev/vda print
Model: Virtio Block Device (virtblk) <==磁盘的模块名称(厂商)
Disk /dev/vda: 9664MB <==磁盘的总容量
Sector size (logical/physical): 512B/512B <==磁盘的每个逻辑/物理扇区容量
Partition Table: msdos <==分区表的格式(MBR/GPT),msdos 代表 MBR分区;gpt 代表 GPT 分区
Disk Flags:
Number Start End Size Type File system Flags #下面才是分区数据
1 1049kB 211MB 210MB primary xfs boot
2 211MB 735MB 524MB primary linux-swap(v1)
3 735MB 9664MB 8929MB primary xfs
2、磁盘分区:fdisk/gdisk
- 若是 MBR 分区表,则使用 fdisk 命令来处理磁盘分区
- 若是 GPT 分区表,则使用 gdisk 命令来处理磁盘分区。
至于怎么查看是 MBR 分区表还是 GPT 分区表,就需要使用上面提到的 parted 命令了。
因为我的操作系统采用的是 MBR 分区表,所以这里介绍下 MBR 分区表:
早期的 Linux 系统为了兼容 Windows 的磁盘,因此使用的是支持 Windows 的 MBR (Master Boot Record ,主引导记录)的方式来处理启动引导程序与分区表。而启动引导程序记录区与分区表则通通放在磁盘的第一个扇区,这个扇区通常是 512 字节的大小(旧的磁盘扇区都是 512 字节),所以说,第一个扇区的 512 字节主要有这两个东西:
- 主引导记录:可以安装启动引导程序的地方,有 446 字节;
- 分区表:记录整块磁盘分区的状态,有 64 字节。
由于分区表就只有 64 字节而已,最多只能容纳四组分区记录,这四个分区的记录被称为主要(Primary)或扩展(Extended)分区。
对于分区,要注意的内容如下:
- 其实所谓的分区只是针对那个 64 字节的分区表进行设置而已;
- 硬盘默认的分区表仅能写入四组分区信息;
- 这四组划分信息我们称为主要(Primary)或扩展(Extended)分区;
- 分区的最小单位通常为柱面(Cyliner)或扇区(Sector);
- 当系统要写入磁盘时,一定会参考磁盘分区表,才能针对某个分五进行数据的处理。
MBR 主要分区、扩展分区与逻辑分区的特性我们做个简单的定义:
- 主要分区与扩展分区最多可以有 4 个(硬盘的限制);
- 扩展分区最多只能有 1 个(操作系统的限制);
- 逻辑分区是由扩展分区持续划分出来的分区;
- 能够被格式化后作为数据存取的分区是主要分区与逻辑分区,扩展分区无法格式化;
- 逻辑分区的数量依操作系统而不同,在 Linux 系统中 SATA 硬盘一经可以突破 63 个一上的分区限制。
(1)fdisk
【1】、fdsk -l 查看真实存在的设备,看哪块磁盘需要分区
【2】、fdisk /dev/vdb 为/dev/vdb分区
[root@server ~]# fdisk /dev/vdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): m
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition # 删除一个分区
g create a new empty GPT partition table
G create an IRIX (SGI) partition table
l list known partition types
m print this menu
n add a new partition # 增加一个分五
o create a new empty DOS partition table
p print the partition table # 打印分区表(常用)
q quit without saving changes # 不保存分区就直接离开 fdisk
s create a new empty Sun disklabel
t change a partition's system id # 修改分区的 id
u change display/entry units
v verify the partition table
w write table to disk and exit # 保存分区操作后离开 fdisk
x extra functionality (experts only)
Command (m for help): p
Disk /dev/vdb: 21.5 GB, 21474836480 bytes, 41943040 sectors # 磁盘文件名/总容量/扇区数
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes # 单一扇区为 512 Bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos # MBR 分区表
Disk identifier: 0x3320dea6 # 磁盘的识别码
Device Boot Start End Blocks Id System
# 分区编号 开始扇区号码 结束扇区号码 该分区的大小(Bytes) 文件系统Id 号 文件系统类型
(1)用 fdisk 新增一个分区
【1】、建立主分区(3个主分区)
第1个主分区
重点在【Last sector】那一行,拿行绝对不要使用默认值,因为默认值会将所有的容量用光,因为它默认选择最大的扇区号码。因为我们仅要 100M 而已,所以你得要加上 +1G 这样即可。不需要计算扇区的数量,fdisk 会根据你填写的数值,直接计算最接近该容量的扇区数。
第2个主分区
第3个主分区
【2】、建立扩展分区(将主分区之外的空间都给扩展区分,在扩展分区中又能划分逻辑分区)
建立扩展分区
在扩展分区中建立逻辑分区
这里需要注意的是:只有在扩展分区(扩展分区的大小为剩下的所有大小,而且标签也不需要更改)中,建立逻辑分区才可以使用,扩展分区是不可以直接使用的。
【3】、保存退出
【4】、查看系统识别的设备中是否有我们刚刚分好的区(/dev/vdb1、/dev/vdb2、/dev/vdb3、/dev/vdb4、/dev/vdb5)
(2)用 fdisk 删除一个分区
3、磁盘格式化(创建文件系统)
(1)XFS 文件系统:mkfs.xfs 命令
mkfs.xfs [-b bsize] [-d parmms] [-i parms] [-L label] [-f] [-r parms] 设备名称
选项与参数:
关于单位:下面只要谈到【数值】时,没有加单位则为 Bytes 值,可以用 k、m、g、t、p(小写)等来解释
比较特殊的是 s 这个单位,它指的是扇区的【个数】
-b:后面接的是区块容量,可由 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 (512 Bytes 大小)】的意思。
swaidth=数值:就是 su*sw 的数值,但是以【几个 sector (512 Bytes 大小)】来设置。
-i:与 inode 有较相关的设置,主要的设置值有:
size=数值:最小是 256 Bytes 最大是 2k,一般保留 256 就足够时用了。
internal=[0|1]:log 设备是否为内置?默认为 1 内置,如果要用外部设备,使用下面设置:
logdev=device:log 设置为后面接的那个设备上面的意思,需设置 internal=0 才可
size=数值:指定这块登录区的容量,通常最小得要有 512 个区块,大约 2M 以上才行。
-L:后面接这个文件系统的标头名称 Label name 的意思。
-f:如果设备内一经有文件系统,则需要使用这个 -f 来强制格式化才行。
-r:指定 realtime section 的相关设置值,常见的有:
extsize=数值:就是那个重要的 extent 数值,一般步虚设置,但有 RAID 时,最好设置与 swidth 的数值相同较佳。最小为 4K 最大为 1G。
【1】、案例一:将前一小节分出来的 /dev/vdb1 格式化为 xfs 文件系统
【2】、找出你系统的 CPU 数,并据以设置你的 agcount 数值
值的注意的是:当一个磁盘分区,已经有文件系统(已经经过格式化)。现在,要将该磁盘分区重新格式化为 XFS 的文件系统,如果不加 -f 参数会报错。但是如果是重新格式化为别的文件系统(非 XFS 文件系统),则不会报错。
(2)ext4 文件系统:mkfs.ext4 命令
mkfs.ext4 [-b size] [-L label] 设备名称
选项与参数:
-b:设置区块的大小,有 1K、2K、4K 的容量
-L:后面接这个设备的标头名称。
【1】、案例一:将前一小节分出来的 /dev/vdb2 格式化为 ext4 文件系统
(3)mkfs 命令
mkfs 其实是个综合命令而已,当我们使用 mkfs -t xfs 时,它就会跑去找 mkfs.xfs 相关的参数给我们使用。如果想要知道系统还支持哪种文件系统的格式功能,直接按 [tab] 就很清楚了。
[root@server ~]# mkfs [tab] [tab]
mkfs mkfs.cramfs mkfs.ext3 mkfs.fat mkfs.minix mkfs.vfat
mkfs.btrfs mkfs.ext2 mkfs.ext4 mkfs.gfs2 mkfs.msdos mkfs.xfs
【1】、案例一:将刚刚的 /dev/vdb2 重新格式化为 VFAT 文件系统
4、文件系统检验
(1)xfs_repair 处理 XFS 文件系统
当有 xfs 文件系统错乱才需要使用这个命令,所以,这个命令最好是不要用到,但有问题发生时,这个命令却又很重要
xfs_repair [-fnd] 设备名称
选项与参数:
-f:后面的设备其实是个文件而不是实体设备
-n:单纯检查并不修改文件系统的任何数据(检查而已)
-d:通常在单人模式下面,针对根目录(/)进行检查与修复的操作,很危险,不要随便使用。
【1】、范例一:检查一下刚刚建立的 /dev/vdb1 文件系统
[root@server ~]# xfs_repair /dev/vdb1
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 即可。
【2】、检查一下系统原本就有的 /dev/vda3 文件系统
值的注意的是:修复时该文件系统不能被挂载。
Linux 下有个设备无法被卸载,那就是根目录。如果你的根目录有问题怎么办?这时要进入单人维护或恢复模式,然后通过 -d 这个选项来处理。加入 -d 选项后,系统会强制检验该设备,检验完毕后就会自动重新启动。
(2)fsck.ext4 处理 ext4 文件系统
fsck.ext4 [-pfD] [-b 超级区块] 设备名称
选项与参数:
-p:当文件系统在修复时,若有需要回复 y 的操作时,自动回复 y 来继续进行修复操作
-f:强制检查,一般来说,如果 fsck 没有发现任何 unclean 的标识,不会主动进入
-D:针对文件系统下的目录进行最优化设置
-b:后面接超级区块的位置,一般来说这个选项用不到。但是如果你的超级区块因故损坏时,
通过这个参数即可例一嗯文件系统内备份的超级区块来尝试恢复,一般来说,超级区块备份在:
1K 区块放在 8193,2K 区块放在 16384,4K 区块放在 32768
【1】、范例一:检查一次 /dev/vdb2
【2】、强制检查一次 /dev/vdb2
(3)e2fsck 命令
e2fack 命令等同于 fsck.ext2/fsck.ext3/fsck.ext4。
(4)xfs_repair 与 fsck.ext4 命令需要注意的地方
- 通常只有 root 且你的文件系统有问题的时候才使用这个命令,否则正常状况下使用此命令,可能会造成对系统的危害。
- 由于 xfs_repair 与 fsck.ext4 在扫描磁盘的时候,可能会造成文件系统的改变,所以 执行 xfs_repair 与 fsck.ext4 时,被检查的硬盘分区务必不能挂载到系统上,亦即是需要在卸载的状态。mount
5、文件系统挂载与卸载
在挂载之前,你最好先确定几件事:
- 单一文件系统不应该被重复挂载在不同的挂载点(目录)中;
- 单一目录不应该重复挂载多个文件系统;
- 要作为挂载点的目录,理论上应该是空目录。
如果你要用来挂载的目录里面并不是空的,那么挂载了文件系统之后,原目录下的东西就会暂时地消失。要注意,并不是覆盖掉,而是暂时地隐藏了起来,等到该分区被卸载后,原目录下地内容就会再次跑出来。
(1)文件系统的挂载——mount 命令
查看博客:https://mp.csdn.net/postedit/89319211
基本上,Redhat 7.x 已经太聪明了,因此你不需要加上 -t 这个选项,系统会自动分析最恰当的文件系统来挂载你需要地设备,这也是使用 blkid 就能够显示正确地文件系统地缘故。那么 Redhat 是怎么找出文件系统的类型的呢?由于文件系统几乎都有超级区块,我们的 Linux 可以通过分析超级区块搭配 Linux 自己的驱动程序去测试挂载,如果挂载,就立刻自动使用该类型的文件系统挂载起来。
那么系统有没有指定哪些类型的文件系统才需要上述的挂载测试呢?主要参考下面这两个文件:
- /etc/filesystems:系统指定的测试挂载文件系统的优先级
- /proc/filesystems:Linux 系统已经加载的文件系统类型
那我怎么知道我的 Linux 有没有相关文件系统类型的驱动程序呢?我们 Linux 支持的文件系统的驱动程序都写在如下的目录中:
- /lib/modules/$(uname -r)/kernels/fs
例如 ext4 的驱动程序就写在【/lib/modules/$(uname -r)/kernels/ext4】这个目录下
mount /dev/vdb1 /mnt 将/dev/vdb1挂载到/mnt目录中
[root@server ~]# blkid
/dev/vda1: UUID="96d4a822-5cd8-48b8-a353-91305bc9672e" TYPE="xfs"
/dev/vda2: UUID="b3937a5a-4586-4eae-8c77-ad18526fb1d4" TYPE="swap"
/dev/vda3: UUID="128c866d-892b-4384-bc8b-6491715d969b" TYPE="xfs"
/dev/vdb1: UUID="4e6ccdf5-8647-41b9-8a3e-6a29365c6d1a" TYPE="xfs"
/dev/vdb2: UUID="7b2c2a8b-a05d-4a11-ba74-4c710ce3f81c" TYPE="ext4"
[root@server ~]# ls /mnt/
[root@server ~]# mount /dev/vdb1 /mnt/ #也可以使用 mount UUID="4e6ccdf5-8647-41b9-8a3e-6a29365c6d1a" /mnt 这个命令
[root@server ~]# df /mnt/
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/vdb1 98988 5280 93708 6% /mnt
挂载成功之后,测试是否可以使用
(2)文件系统的卸载——umount 命令
umount [-fln] 设备文件名或挂载点
选项与参数:
-f:强制卸载。可用在类似网络文件系统(NFS)无法读取到的情况
-l:立刻卸载文件系统,比 -f 还强
-n:不更新 /etc/mtab 情况下卸载
umount /dev/vdb1 将/dev/vdb1卸载
[root@server ~]# umount /dev/vdb1 # 或使用命令 umount /mnt
[root@server ~]# ls /mnt/
[root@server ~]#
卸载之后所建立的文件消失
6、磁盘/文件系统参数自定义
(1)mknod
我们都知道,Linux 下面所有的设备都以文件来表示。但是那个文件如何代表该设备?很简单,就是通过文件的 major 与 minor 数值来代替。所以,这个 major 和 minor 数值是有i特殊意义的,不能随意设置。我们在 lsblk 命令的用法中谈到过这两个数值。
[root@server ~]# ll /dev/vda*
brw-rw----. 1 root disk 253, 0 Jun 21 10:25 /dev/vda
brw-rw----. 1 root disk 253, 1 Jun 21 10:25 /dev/vda1
brw-rw----. 1 root disk 253, 2 Jun 21 10:25 /dev/vda2
brw-rw----. 1 root disk 253, 3 Jun 21 10:25 /dev/vda3
上表中 253 为主要设备代码(major)。而 0~3 则为此要设备代码(minor)。我们的 iLnux 内核支持的设备数据都是通过这两个数值来决定的,举例来说,常见的磁盘文件名 /devsda 与 /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 设备文件名 [bcp] [Major] [Minor]
选项与参数:
设备种类:
b:设置设备名称成为一个外接存储设备文件,例如磁盘等
c:设置设备名称成为一个外接输入设备文件,例如鼠标/键盘等
p:设置设备名称成为一个FIFO文件
Major:主要设备代码
Minor:此要设备代码
【1】、范例一:由上面的介绍,我们知道 /dev/vda10 设备代码 252,10。请建立并查看此设备
(2)xfs_admin——修改 XFS 文件系统的 UUID 与 Label name
如果你当初格式化的时候忘记加上标头名称,后来想要再次加上,不需要重复格式化,直接使用 xfs_admin 即可。
xfs_admin [-lu] [-L label] [-U uuid] 设备文件名
选项与参数:
-l:列出这个设备的 label name
-u:列出这个设备的 UUID
-L:设置这个设备的 Label name
-U:设置这个设备的 UUID
【1】、范例一:设置 /dev/vdb1 的 label name 为 love_xfs,并测试挂载
【2】、范例二:利用 uuidgen 产生新 UUID 来设置 /dev/vdb1 ,并测试挂载。
(3)tune2fs——修改 ext4 的 UUID 与 Label name
tune2fs [-l] [-L Label] [-U uuid] 设备文件名
选项与参数:
-l:类似 dump2fs -h 的功能,将 superblock 内的数据读出来
-L:修改 LABEL name
-U:修改 UUID
【1】、范例一:列出 /dev/vdb2 的 label name 之后。将它改成 love_ext4 ,并测试挂载
五、设置开机自动挂载
系统挂载的一些限制:
- 根目录 / 是必须挂载的,而且一顶要先于其他挂载点(mount point)被挂载起来。
- 其他挂载点必须为已建立的目录,可任意指定。
- 所有挂载点在同一时间内,只能挂载一次。
- 所有硬盘分区在同一时间内,只能挂载一次。
- 若进行卸载,您必须先将工作目录移到挂载点(及其子目录)之外。
(1)fstab 文件的帮助手册内容
man 5 fstab 查看自动挂载文件的帮助手册
表示设备名称
表示挂载点
表示文件系统类型
表示挂载参数
这个参数如果是0表示不备份
这个参数如果是0表示不检查
(2)/etc/fstab 文件内容详解
[root@server ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sun May 12 07:26:19 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=128c866d-892b-4384-bc8b-6491715d969b / xfs defaults 1 1
UUID=96d4a822-5cd8-48b8-a353-91305bc9672e /boot xfs defaults 1 2
UUID=b3937a5a-4586-4eae-8c77-ad18526fb1d4 swap swap defaults 0 0
#/dev/vg0/lv0 /mnt xfs defaults 0 0
[设备/UUID 等] [挂载点] [文件系统] [文件系统参数] [dump] [fsck]
- 第一栏:磁盘设备文件名/UUID/LABEL name:
- 文件系统或磁盘的设备文件名,如 /dev/vda2 等;
- 文件系统的 UUID 名称,如 UUID=xxx;——推荐使用这种方式,因为 UUID 是唯一的。
- 文件系统的 LABEL 名称,如 LABEL=xxx。
- 第二栏:挂载点:
- 一定是目录
- 第三栏:磁盘分区的文件系统:
- 第四栏:文件系统的参数:
- 第五栏:能否被 dump 备份命令作用:
- dump 是一个用来作为备份的命令,不过现在有太多的备份方案,所以这个项目不要理会,直接输入 0 即可。
- 第六栏:是否以 fsck 检验扇区:
- 早期启动的流程中,会有一段时间去检验本机的文件系统,看看文件系统是否完整(clean)。不过这个阶段主要是通过 fsck 去完成,我们现在用的 xfs 文件系统就没有办法适用,因为 xfs 会自己进行检验,不需要额外进行这个操作,所以直接填 0 就好了。
(3)实战 /etc/fstab
【1】、vim /etc/fstab 编辑自动挂载文件
【2】、mount -a 用来启动/etc/fstab中的所有文件系统
【3】、测试:
重启系统之前
重启系统
重启系统之后
(4) /etc/fstab 内容写错,导致系统重启失败时的解决办法
示例如下:
方法如下:
根据提示,输入root用户的密码
当该文件中内容很多时,可能一时不知道错误出在哪里,所以先将其注释,重启系统之后再进行排错
六、内存交换分区(swap分区)的管理
在安装 Linux 时一定需要两个硬盘分区,一个是根目录,另外一个就是内存交换区(swap),swap 分区不需要太大。
swap 会被利用到的时刻经常就是物理内存不足的情况。我们知道 CPU 所读取的数据都来自于内存,如果内存不足的时候,为了让后续的程序可以顺利运行,需要将暂不使用的程序和数据挪到内存交换分区中,此时内存就会空出来给需要执行的程序加载。由于 内存交换分区是用硬盘来暂时存放内存中的信息,所以用到它时,你的主机磁盘就会开始闪个不停。
(1)使用物理分区创建内存交换分区
【1】、第一步:建立swap分区
建立分区,并设定分区标签为82
通过t来修改分区的id
看到/dev/vdb5的id由原来的Linux改为了Linux swap / Solaris,代表swap分区已经建立好
因为/dev/vdb1正在挂载,所以在建立swap分区的时候会出现错误,通过partprobe命令,使得系统识别分区
这里需要注意的是即使在fdisk /dev/vdb之前,将/dev/vdb1卸载,虽然保存退出之后不会出现错误,但是通过df命令查看,发现/dev/vdb1又是处于挂载状态。
【2】、第二步:将 swap 分区格式化为内存交换分区格式
mkswp /dev/dev6
因为swap分区与普通分区不同,所以有特定的挂载,查看和卸载方法(不能使用mount,df和umount)
【3】、第三步:挂载 swap 分区
swapon /dev/vdb5 挂载/dev/vdb5
我们可以看到 swap 分区挂载之后,确实增加了 500M 的 swap 分区。
【4】、第四步:观察swap分区
swapon -s 查看挂载信息
如何实现 swap 分区的自动挂载呢?
vim /etc/fstab
测试:
重启系统之前
重启系统
重启系统之后
【5】、第五步:删除 swap 分区(同时也就是完成了卸载的动作)
vim /etc/fstab 删除swap分区自动启动的命令
swapoff /dev/vdb6
通过swapon -s进行验证
swapon -s看不到 /dev/vdb5 则代表删除成功
(2)使用文件创建内存交换文件
【1】、第一步:使用 dd 这个命令在 /tmp 下面新增一个 128M 的文件
【2】、第二步:使用 mkswap 将 /tmp/swap 这个文件格式化为内存交换文件的文件格式
【3】、第三步:使用 【swapon】 来将 /tmp/swap 启动
我们可以看到 swap 分区挂载之后,确实增加了 128M 的 swap 分区。
【4】、第四步:使用 【swapon -s】来查看 swap 分区
如何实现 swap 文件的自动挂载呢?
vim /etc/fstab
值的注意的是:这里不能用 UUID,这是因为系统仅会查询区块设备不会查询文件。
测试:
重启系统之前
重启系统
重启系统之后
【5】、第五步:使用 【swapoff】 来关闭 关闭 /tmp/swap
vim /etc/fstab 删除 /tmpswap 分区自动启动的命令
swapoff /tmp/swap
通过swapon -s进行验证
swapon -s看不到 /dev/tmpvdb5 则代表删除成功
七、文件系统的特殊观察与操作
1、磁盘空间之浪费问题
一个区块只能存放一个文件,因此太多小文件将会浪费非常多的磁盘容量。
当你使用 ls -l 去查询某个目录下的数据时,第一行都会出现 【total】的字样?其实那就是该目录下的所有数据所耗用的数据区块数量 * 区块大小的值。
所有文件的所有区块相加就得到 24K 这个数值。如果计算每个文件实际容量的相加结果,其实只有不到 15K 而已,所以,这样就浪费掉好多容量。
2、利用 GNU 的 patred 进行分区操作(可选)
- gdisk 主要针对 GPT,
- fdisk 主要支持 MBR,
- parted 既支持 GPT 又支持 MBR。且 parted 直接进行硬盘分区而不需要跟用户互动。
parted [设备] [命令 [参数]]
选项与参数:
命令:
新增分区:mkpart [primary|logical|extend] [ext4|vfat|xfs] 开始 结束
显示分区:print
删除分区:rm [partition]
【1】、范例一:以 parted 列出目前本机的 /dev/vdb 这块磁盘的分区表信息
[root@server ~]# parted /dev/vdb print
Model: Virtio Block Device (virtblk) <==磁盘类型与型号
Disk /dev/vdb: 21.5GB <==磁盘文件名与容量
Sector size (logical/physical): 512B/512B <==每个扇区的大小
Partition Table: msdos <==是 GPT 分区表(显示为 gpt)还是 MBR 分区标(显示为 msdos)
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 106MB 105MB primary xfs
2 106MB 316MB 210MB primary ext4
3 316MB 630MB 315MB primary
4 630MB 21.5GB 20.8GB extended
5 631MB 1156MB 524MB logical linux-swap(v1)
[1] [2] [3] [4] [5] [6]
1、Number:这个就是分区的号码。举例来说,1 号代表 /dev/vdb1
2、Start:分区的起始位置在这块磁盘的多少 MB 处?它以容量作为单位。
3、End:分区的结束位置在这块磁盘的多少 MB 处?
4、Size:由上述两者的分析,得到这个分区有多少容量
5、Type:是什么分区(主分区、扩展分区、逻辑分区)
6、File system:分析可能的文件系统类型是什么?
【2】、建立一个 512MB 的分区,并将其格式化 vfat 格式
八、关于手动挂载 U 盘 + 如何修改 U 盘的权限 + 如何解决系统正忙的问题
1、如何手动挂载u盘?
(1)将u盘插入电脑
因为u盘插入电脑之后,会自动挂载,所以要想做u盘手动挂载的实验,必须先把u盘卸载
(2)卸载u盘
(3)手动挂载u盘
可以看到u盘里面的东西,代表u盘手动挂载实验成功
2、如何修改u盘的权限
(1)mount 查看u盘目前的权限
(2)修改u盘的权限
方法一:
先卸载u盘,然后指定u盘挂载之后的权限,进行挂载u盘
umount /mnt 或者mount /dev/sdd1 卸载u盘
mount -o ro /dev/sdd1 /mnt 指定以ro的权限挂载u盘
方法二:
不卸载u盘,直接修改权限
mount -o remount,rw /dev/sdd1 /mnt 或者mount -o remount,rw /mnt 重新挂载u盘,并将权限改为rw
3、解决系统正忙的方法
将/mnt/file打入后台运行
解决方法一:
【1】、losf /mnt
【2】、kill -9 PID 强制杀死进程
【3】、umount /mnt
u盘成功卸载,代表实验成功
解决方法二:
【1】、fuser -vm /mnt 查看谁在用/mnt
【2】、fuser -kvm /mnt 查看谁在用/mnt 并结束繁忙进程
【3】、umount /mnt
u盘成功卸载,代表实验成功
九、磁盘分区配额 + 磁盘分区加密
1、磁盘分区配额
(1)新建分区,并对其铺设文件系统
【1】、新建分区
【2】、对其铺设文件系统
(2)创建挂载点目录,进行挂载,并查看挂载参数
【1】、创建挂载点目录
【2】、进行挂载
证明文件的权限是记录在磁盘分区上的,而不是目录本身
【3】、查看挂载参数
(3)对 student 用户进行限额配置,这里限额为 20M(总分区大小为 100M)
如何设定开机自动挂载呢?
vim /etc/fstab 编辑/dev/vdb7自动挂载的命令
mount -a 实现/etx/fstab中所有的文件系统的挂载
(4)测试
截取的最大限额为20M,测试成功
6.磁盘加密
(1)新建一个分区
(2)对该分区进行加密,相当于上锁
cryptsetup lucksFormat /dev/vdb9
(3)以任意一个名字打开锁
crotsetup open /dev/vdb8 xin
锁打开之后,会在相应目录下生成相应的链接文件
(4)对该分区铺设文件系统
mkfs.xfs /dev/mapper/xin
(5)挂载该分区,进行测试,看该分区是否已经能够正常使用
mount /dev/mapper/xin /mnt
touch /mnt/file{1..3}
(6)卸载相应的设备
umount /mnt
(6)关闭锁
cryprtsetup close xin
原来生成的链接文件消失,代表锁已关闭。