第六章 存储结构与管理硬盘
1 从“/”开始
- Linux 系统中的文件和目录名称是严格区分大小写的。例如,root、rOOt、Root、 rooT 均代表不同的目录,并且文件名称中不得包含斜杠(/)。
![image-20230510092559048](https://i-blog.csdnimg.cn/blog_migrate/c58c6987666645b9cc32c456a26c4cd1.png)
2 物理设备命名规则
udev设备管理器
系统内核中的 udev 设备管理器会自动把硬件名称规范起来,目的是让用户通过设备文件的名 字可以猜出设备大致的属性以及分区信息等。udev 设备管理器的服务会一直以守护进程的形式运行并侦听内核发出的信号来管理/dev 目录下的 设备文件
![image-20230510092702855](https://i-blog.csdnimg.cn/blog_migrate/ea66e000ff5d0fc7c383b65e3caee142.png)
硬盘分区编码
- 主分区或扩展分区的编号为1~4
- 逻辑分区从编号5开始
设备文件名称(/dev/sda5)
/dev/目录中保存的应当是硬件设备文件;其次,sd 表示的是存储设备;然后,a 表示系统中同类接口中第一个被识别到的设备;最后,5 表示这个设备是一个逻辑分区。一言 以蔽之,“/dev/sda5”表示的就是“这是系统中第一块被识别到的硬件设备中分区编号为 5 的 逻辑分区的设备文件”
![image-20230510093043619](https://i-blog.csdnimg.cn/blog_migrate/a964ac51e421c7712a76c964ede0b202.png)
-
扇区
- 硬盘设备是由大量的扇区组成的,每个扇区的容量为 512 字节。
- 第一个扇区最重要,它里面保存着主引导记录与分区表信息。
- 解决每块硬盘只能创建4个分区的问题:可以将第一个扇区的分区表中 16 字节(原本要写入 主分区信息)的空间(称之为扩展分区)拿出来指向另外一个分区。也就是说,扩展分区其 实并不是一个真正的分区,而更像是一个占用 16 字节分区表空间的指针—一个指向另外一 个分区的指针。这样一来,用户一般会选择使用 3 个主分区加 1 个扩展分区的方法,然后在 扩展分区中创建出数个逻辑分区,从而来满足多分区(大于 4 个)的需求。
3 文件系统与数据资料
用户在硬件存储设备 中执行的文件建立、写入、读取、修改、转存与控制等操作都是依靠文件系统来完成的。文 件系统的作用是合理规划硬盘,以保证用户正常的使用需求。
常见文件系统
-
文件系统类型
-
Ext2:不包含日志读写功能,数据丢失的可能性很大
-
Ext3:是一款日志文件系统,它会把整个硬盘的每个写入动作的细节都预先记录下来, 然后再进行实际操作,以便在发生异常宕机后能回溯追踪到被中断的部分。当硬盘容量较大时,所需的修复时间也会很长,而且也不能 100%地保证资料不会丢失。
-
Ext4:RHEL 6 默认的文件管理系统,它支持的存储容量高达 1EB(1EB=1,073,741,824GB),且能够有无限多的子目录。另外,Ext4 文件系 统能够批量分配 block(块),从而极大地提高了读写效率。
-
XFS:一种高性能的日志文件系统,RHEL 7/8 中默认的文件管理系统。的优势在发生意外宕机后尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的日志功能只需花费极低的计算和存储性能。它支持的最大存储容量为 18EB。
-
-
拿到一块新的硬盘存储设备后,先需要分区,然后再格式化文件系统,最后才能挂载 (分区->格式化->挂载)并正常使用。硬盘的分区操作取决于您的需求和硬盘大小;也可以选择不进行分区,但是必须对硬盘进行格式化处理。
-
Linux 把每个文件的权限与属性记录在 inode中,而且每个文件占用一个独立的 inode 表格,该表格的大小默认为 128 字节,里面记录着如下信息
- 该文件的访问权限(read、write、execute);
- 该文件的所有者与所属组(owner、group);
- 该文件的大小(size);
- 该文件的创建或内容修改时间(Ctime);
- 该文件的最后一次访问时间(Atime);
- 该文件的修改时间(Mtime);
- 文件的特殊权限(SUID、SGID、SBIT);
- 该文件的真实数据地址(point)。
文件的实际内容则保存在 block 块中(大小一般是 1KB、2KB 或 4KB),记录一个 block 则消耗 4 字节。
虚拟文件系统(VFS)
为了使用户在读取或写入文件时不用 关心底层的硬盘结构,Linux 内核中的软件层为用户程序提供了一个虚拟文件系统(Virtual File System,VFS)接口,这样用户实际上在操作文件时就是统一对这个虚拟文件系统进行操作 了。实际文件系统在 VFS 下隐藏了自己的特性和细节,这样用户在日常使用时会觉得“文件系统都是一样的”,也就可以随意使用各种命令 在任何文件系统中进行各种操作了(比如使用 cp 命令来复制文件)
![image-20230510100021360](https://i-blog.csdnimg.cn/blog_migrate/f6de2928c71e20671443ed7fbdf23088.png)
4 挂载硬件设备
- 挂载:当用户需要使用硬盘设备或分区中 的数据时,需要先将其与一个已存在的目录文件进行关联,而这个关联动作就是“挂载”。
mount
mount 命令用于挂载文件系统,格式为“mount 文件系统 挂载目录”。
![image-20230510100204578](https://i-blog.csdnimg.cn/blog_migrate/51f4cfca727529df66a31e2b502a415f.png)
对于比较新的 Linux 系统来讲,一般不需要使用-t 参数来指定文件系统的类型, Linux 系统会自动进行判断。而 mount 中的-a 参数则厉害了,它会在执行后自动检查/etc/fstab 文件中有无被疏漏挂载的设备文件,如果有,则进行自动挂载操作。
-
要把设备/dev/sdb2 挂载到/backup 目录
[root@linuxprobe ~]# mount /dev/sdb2 /backup
-
blkid:blkid 命令用于显示设备的属性信息,英文全称为“block id”,语法格式为“blkid [设备名]”。
- 使用 blkid 命令来查询设备 UUID
[root@linuxprobe~]# blkid /dev/sdb1: UUID="2db66eb4-d9c1-4522-8fab-ac074cd3ea0b" TYPE="xfs" PARTUUID="eb23857a-01" /dev/sdb2: UUID="478fRb-1pOc-oPXv-fJOS-tTvH-KyBz-VaKwZG" TYPE="ext4" PARTUUID="eb23857a-02" #有了设备的 UUID 值,可以挂载 [root@linuxprobe~]# mount UUID=478fRb-1pOc-oPXv-fJOS-tTvH-KyBz-VaKwZG /backup
-
永久挂载(未写入配置文件,则每次系统重启后需要重新挂载)
如 果想让硬件设备和目录永久地进行自动关联,就必须把挂载信息按照指定的填写格式“设备文件 挂载目录 格式类型 权限选项 是否备份 是否自检”写 入到**/etc/fstab 文件**中。
![image-20230510100548888](https://i-blog.csdnimg.cn/blog_migrate/d5dabf1e9ef0ecb673601ccecd839d74.png)
![image-20230510100559598](https://i-blog.csdnimg.cn/blog_migrate/e75be4c6a38cfb00ebcddce66fb3a839.png)
- 将文件系统为 Ext4 的硬件设备/dev/sdb2 在开机后自动挂载到/backup 目录上,并 保持默认权限且无须开机自检
![image-20230510100646769](https://i-blog.csdnimg.cn/blog_migrate/82a9290ecebbca1963f3c230d3eed7f6.png)
写入到/etc/fstab 文件中的设备信息并不会立即生效,需要使用 mount -a 参数进行自动 挂载
[root@linuxprobe~]# mount -a
df
df 命令用于查看已挂载的磁盘空间使用情况,英文全称为“disk free”,语法格式为 “df -h”。用-h 参数便捷地对存储容量进行“进位”操作。
![image-20230510100753134](https://i-blog.csdnimg.cn/blog_migrate/ca14c5dc927040c24852d27e52552d9a.png)
- 对网络存储设备,您在 fstab 文件挂载信息中加上_netdev 参数。加上后系 统会等联网成功后再尝试挂载这块网络存储设备,从而避免了开机时间过长或失败的情况。
![image-20230510100837006](https://i-blog.csdnimg.cn/blog_migrate/1edccbcc087f0f1ecd34014e0f99667a.png)
umount
umount 命令用于卸载设备或文件系统,英文全称为“un mount”,语法格式为“umount [设 备文件/挂载目录]”。
[root@linuxprobe~]# umount /dev/sdb2
#如果我们当前就处于设备所挂载的目录,系统会提示该设备繁忙,此时只需要退出到其他目录后再尝试一次就行了。
[root@linuxprobe~]# cd /media/cdrom/
[root@linuxprobe cdrom]# umount /dev/cdrom
umount: /media/cdrom: target is busy.
[root@linuxprobe cdrom]# cd~
[root@linuxprobe~]# umount /dev/cdrom
- lsblk
lsblk 命令用于查看已挂载的磁盘的空间使用情况,英文全称为“list block id”
[root@linuxprobe~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─rhel-root 253:0 0 17G 0 lvm /
└─rhel-swap 253:1 0 2G 0 lvm [SWAP]
sr0 11:0 1 6.6G 0 rom /media/cdrom
5 添加硬盘设备
fdisk
fdisk 命令用于新建、修改及删除磁盘的分区表信息,英文全称为“format disk”,语法格 式为“fdisk 磁盘名称”。管理硬盘设备最常用的方法,提供了集添加、删 除、转换分区等功能于一身的“一站式分区服务”。
![image-20230510101318231](https://i-blog.csdnimg.cn/blog_migrate/26b0d3605777a1c6ac6f20ef2179cea5.png)
![image-20230510101331107](linux就该这么学.assets/image-20230510101331107.png)
分区
- 使用 fdisk 命令来尝试管理/dev/sdb(新添加硬盘)硬盘设备
#硬盘设备内已有的分区信息:硬盘的容量大小、扇区个数
[root@linuxprobe~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x88b2c2b0.
Command (m for help): p
Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x88b2c2b0
#n添加新分区,p关键主分区,e创建扩展分区
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
#创建一个容量为2G的硬盘分区
Partition number (1-4, default 1): 1
First sector (2048-41943039, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039): +2G
Created a new partition 1 of type 'Linux' and of size 2 GiB.
#重新查看信息
Command (m for help): p
Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x88b2c2b0
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 4196351 4194304 2G 83 Linux
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
在上述步骤执行完毕之后,Linux 系统会自动把这个硬盘主分区抽象成/dev/sdb1 设备文 件。可以使用 file 命令查看该文件的属性,些时候系统并没有 自动把分区信息同步给 Linux 内核,可以输入 partprobe 命令手动将分区信息同步到内核。
格式化
mkfs
Linux 系统中用于格式化操作的命令是 mkfs。
![image-20230510102130958](https://i-blog.csdnimg.cn/blog_migrate/30021cc805905ab810688836134f4905.png)
- 要将分区为 XFS 的文件系统进行格式化
[root@linuxprobe~]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=131072 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=524288, imaxpct=25
= sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1realtime =none extsz=4096 blocks=0, rtextents=0
挂载
[root@linuxprobe~]# mkdir /newFS
[root@linuxprobe~]# mount /dev/sdb1 /newFS
#挂在后可以用df -h命令查看挂载状态和硬盘使用量信息
- 挂载硬盘永久有效设置
![image-20230510102612999](https://i-blog.csdnimg.cn/blog_migrate/4205ec7a5cf44a728dbb5505638a8df1.png)
du
du 命令用查看分区或目录所占用的磁盘容量大小,英文全称为“disk usage”,语法格式 为“du -sh 目录名称”。
- 以使用 du -sh /*命令来查看在 Linux 系统根目录下所有一级目录分别 占用的空间大小
[root@linuxprobe~]# du -sh /*
0 /bin
113M /boot
0 /dev
29M /etc
12K /home
0 /lib
0 /lib64
6.7 G /media
0 /mnt
0 /newFS
0 /opt
0 /proc
8.6 M /root
9.6 M /run
0 /sbin
0 /srv
0 /sys
12K /tmp
3.5 G /usr
155M /var
6 添加交换分区
交换分区
交换(SWAP)分区是一种通过在硬盘中预先划分一定的空间,然后把内存中暂时不常 用的数据临时存放到硬盘中,以便腾出物理内存空间让更活跃的程序服务来使用的技术,其 设计目的是为了解决真实物理内存不足的问题。通过硬盘设备读写数据的,速度肯定要比物理内存慢,所以只有当真实的物理内存耗尽后才会调用交换分区的资源。
- :在生产环境中,交换分区 的大小一般为真实物理内存的 1.5~2 倍。
分区
#取出一个大小为 5GB 的主分区作为交换分区资源
[root@linuxprobe~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): n
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 回车
First sector (4196352-41943039, default 4196352): 回车
Last sector, +sectors or +size{K,M,G,T,P} (4196352-41943039, default 41943039): +5G
Created a new partition 2 of type 'Linux' and of size 5 GiB.
#修改硬盘的标识码,这里将其改成 82(Linux swap) t为改变某个分区类型
Command (m for help): t
Partition number (1,2, default 2): 2
Hex code (type L to list all codes): 82
Changed type of partition 'Linux' to 'Linux swap / Solaris'.
Command (m for help): p
Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x88b2c2b0
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 4196351 4194304 2G 83 Linux
/dev/sdb2 4196352 14682111 10485760 5G 82 Linux swap /Solaris
#保存退出
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
格式化
mkswap
mkswap 命令用于对新设备进行交换分区格式化,英文全称为“make swap”,语法格式为 “mkswap 设备名称”。
[root@linuxprobe~]# mkswap /dev/sdb2
Setting up swapspace version 1, size = 5 GiB (5368705024 bytes)
no label, UUID=45a4047c-49bf-4c88-9b99-f6ac93908485
挂载
swapon
swapon 命令用于激活新的交换分区设备,英文全称为“swap on”,语法格式为“swapon 设备名称”。使用 swapon 命令把准备好的 SWAP 硬盘设备正式挂载到系统中。
[root@linuxprobe~]# free -m
total used free shared buff/cache available
Mem: 1966 1391 105 12 469 384
Swap: 2047 9 2038
[root@linuxprobe~]# swapon /dev/sdb2
[root@linuxprobe~]# free -m
total used free shared buff/cache available
Mem: 1966 1395 101 12 469 380
Swap: 7167 9 7158
- 配置挂载永久生效
![image-20230510103359086](https://i-blog.csdnimg.cn/blog_migrate/36ede1d121cea3eccdee9dd419811fb2.png)
7 磁盘容量配额
描述
使用磁盘容量配额服务来限制某位用户或某个用户组针对特定文件夹可以使用 的最大硬盘空间或最大文件个数,一旦达到这个最大值就不再允许继续使用。可以使用 quota 技术进行磁盘容量配额管理,从而限制用户的硬盘可用容量或所能创建的最大文件个数。quota 技术还有软限制和硬限制的功能。
软限制:当达到软限制时会提示用户,但仍允许用户在限定的额度内继续使用。
硬限制:当达到硬限制时会提示用户,且强制终止用户的操作。
-
软限制数值可以小于等于硬限制数值。
-
存储设备默认没有开启quota技术,需要手动配置文件并重启来开启quota技术
-
让系统中的启动目录 (/boot)能够支持 quota 磁盘配额技术。(vim /etc/fstab)
-
-
重启系统后使用 mount 命令查看, 即可发现/boot 目录已经支持 quota 磁盘配额技术
#字段usrquota表示支持quota技术
[root@linuxprobe~]# mount | grep boot
/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,usrquota)
xfs_quota
xfs_quota 命令用于管理设备的磁盘容量配额,语法格式为“xfs_quota [参数] 配额文件系统”。一个专门针对 XFS 文件系统来管理 quota 磁盘容量配额服务而设计的命令。其中, -c 参数用于以参数的形式设置要执行的命令;-x 参数是专家模式,让运维人员能够对 quota 服务进行更多复杂的配置。
- 来使用 xfs_quota 命令来设置用户 tom 对/boot 目录的 quota 磁 盘容量配额。具体的限额控制包括:硬盘使用量的软限制和硬限制分别为 3MB 和 6MB;创 建文件数量的软限制和硬限制分别为 3 个和 6 个
[root@linuxprobe~]# xfs_quota -x -c 'limit bsoft=3m bhard=6m isoft=3 ihard=6 tom' /boot
[root@linuxprobe~]# xfs_quota -x -c report /boot
User quota on /boot (/dev/sda1)
Blocks
User ID Used Soft Hard Warn/Grace
---------- --------------------------------------------------
root 114964 0 0 00 [--------]
tom 0 3072 6144 00 [--------]
# Linux 系统中每个文件都会使用一个独立的 inode 信息块来保存属性信息,一个文件对应一个 inode 信息块,所以 isoft 和 ihard 就是通过限制系统最大使用的 inode个数来限制了文件数量。bsoft 和 bhard 则是代表文件所占用的 block 大小,也就是文件占用的最大容量的总统计。
#soft 是软限制,超过该限制后也只是将操作记录写到日志中,不对用户行为进行限制。而 hard 是硬限制,一旦超过系统就会马上禁止,用户再也不能创建或新占任何的硬盘容量。
edquota
edquota 命令用于管理系统的磁盘配额,英文全称为“edit quota”,语法格式为“edquota [参 数] 用户名”。在为用户设置了 quota 磁盘容量配额限制后,可以使用 edquota 命令按需修改限额的数值。
![image-20230510104316293](https://i-blog.csdnimg.cn/blog_migrate/9fa6faf50f99c4f321ec61371e7e06f2.png)
- 把用户 tom 的硬盘使用量的硬限额从 5MB 提升到 8MB:
![image-20230510104405710](linux就该这么学.assets/image-20230510104405710.png)
![image-20230510104415754](linux就该这么学.assets/image-20230510104415754.png)
8 VDO(虚拟数据优化) —留坑
VDO(Virtual Data Optimize,虚拟数据优化)是一种通过压缩或删除存储设备上的数据 来优化存储空间的技术。的关键就是对硬盘内原有的数据进行删重操作,可以对日志和数据库进行自动压缩,进一步减少存储浪费的情况。
9 软硬方式链接
描述
-
软链接
也叫符号链接(symbolic link),仅仅包含所链接文件的名称和路 径,很像一个记录地址的标签。当原始文件被删除或移动后,新的链接文件也会随之 失效,不能被访问。可以针对文件、目录设置软链接,跨文件系统进行链接也不是问 题。
-
硬链接
可以将它理解为一个“指向原始文件 block 的指针”,系统会创 建出一个与原来一模一样的 inode 信息块。所以,硬链接文件与原始文件其实是一模 一样的,只是名字不同。每添加一个硬链接,该文件的 inode 个数就会增加 1;而且 只有当该文件的 inode 个数为 0 时,才算彻底将它删除。换言之,由于硬链接实际上是指向原文件 block 的指针,因此即便原始文件被删除,依然可以通过硬链接文件来访问。需要注意的是,由于技术的局限性,不能跨分区对目录文件进行硬链接。
![image-20230510104917159](https://i-blog.csdnimg.cn/blog_migrate/b3d254f556dc0cb8e6ee4be02f1ace83.png)
ln
ln 命令用于创建文件的软硬链接,英文全称为“link”,语法格式为“ln [参数]原始文件 名 链接文件名”
![image-20230510104952436](https://i-blog.csdnimg.cn/blog_migrate/1a2d0795655a14974c02f2d3519b7977.png)
- 示例
#创建一个软链接
[root@linuxprobe~]# echo "Welcome to linuxprobe.com" > old.txt
[root@linuxprobe~]# ln -s old.txt new.txt
[root@linuxprobe~]# cat old.txt
Welcome to linuxprobe.com
[root@linuxprobe~]# cat new.txt
Welcome to linuxprobe.com
[root@linuxprobe~]# ls -l old.txt
-rw-r--r-- 1 root root 26 Jan 11 00:08 old.txt
#原始文件名为 old,新的软链接文件名为 new。删掉原始文件后,软链接文件立刻就无法读取
[root@linuxprobe~]# rm -f old.txt
[root@linuxprobe~]# cat new.txt
cat: readit.txt: No such file or directory