磁盘管理与文件系统
# 概念
一个没有分区的 (MBR) 硬盘可划分:
- 主分区(primary partition)
- 扩展分区(extended)
- 扩展分区又可再划分逻辑分区(Logical)
目前主流使用的 GPT 分区表,不再区分主分区、扩展分区、逻辑分区,所有分区都是等价的。
Linux 一切皆文件,磁盘设备在系统中以文件形式展示:
设备 | 设备在 Linux 的文件名 |
---|---|
IDE 接口硬盘 | /dev/hd[a-d] |
SCSI/SATA/USB 接口硬盘 | /dev/sd[a-p] |
NVMe 固态硬盘 | /dev/nvme0n1 |
U 盘 | /dev/sd[a-p] |
软盘 | dev/fd[0-1] |
分区文件
/dev/sda1 # 第1(a)个硬盘的分区1
/dev/sda2 # 第1(a)个硬盘的分区2
系统默认分区 1-4 留给了主分区和扩展分区, 4个主分区
或 3主+1扩展
# fdisk 命令 (<2TB)
下文基于一块 PCIE 的 NVME 固态硬盘,在 Ubuntu24.04 中实践,与网上教程在出入,未知是硬盘不同还是操作系统不同导致。
# 打印磁盘列表
fdisk -l
# 操作磁盘 /dev/sdb
fdisk /dev/sdb
# 进入操作页面后 按 m 获取帮助
Help:
GPT
M enter protective/hybrid MBR
Generic
d delete a partition # 删除一个分区
F list free unpartitioned space
l list known partition types
n add a new partition # 创建一个分区
p print the partition table
t change a partition type
v verify the partition table
i print information about a partition # 打印当前分区信息
Misc
m print this menu # 打印帮助
x extra functionality (experts only)
Script
I load disk layout from sfdisk script file
O dump disk layout to sfdisk script file
Save & Exit
w write table to disk and exit # 写入并退出
q quit without saving changes # 放弃修改退出
Create a new label
g create a new empty GPT partition table # 创建一个GPT格式的分区
G create a new empty SGI (IRIX) partition table
o create a new empty MBR (DOS) partition table # 创建一个MBR格式的分区
s create a new empty Sun partition table
# 创建分区 - n
- 这视乎磁盘的格式(MBR、GPT)显示的操作流程不同
- 根据
fdisk -l
中显示的Disklabel type
决定创建的是 MBR 分区还是 GPT 分区。
# MBR
主分区
# 输入要创建的分区类型:p-主分区 e-扩展分区
p # 创建主分区
# 输入分区号 1-4
回车 # 默认1
# 输入起始扇区,默认2048
回车 # 默认2048
# 输入扇区大小
回车 # 方式1:使用最后一个扇区(可用全部扇区)
+1G # 方式2:指定大小 (K,M,G)
p # 打印当前分区信息,检查创建的分区是有无误
w # 保存并退出
扩展分区
只能创建 1 个扩展分区
# 输入要创建的分区类型:p-主分区 e-扩展分区
e # 创建扩展分区
# 输入分区号 2-4(前面已创建分区1)
回车 # 默认2
# 输入起始扇区,默认前一个分区结束扇区的后一个扇区
回车 # 默认
# 输入扇区大小
回车 # 方式1:使用最后一个扇区(可用全部扇区)
+1G # 方式2:指定大小 (K,M,G)
p # 打印当前分区信息,检查创建的分区是有无误
w # 保存并退出
逻辑分区
只有创建了扩展分区后,才可以创建逻辑分区。逻辑分区在扩展分区内。
# 输入要创建的分区类型:p-主分区 l-逻辑分区
l # 创建逻辑分区
# 输入分区号 逻辑分区从5开始
回车 # 默认 5
# 输入起始扇区,默认前一个分区结束扇区的后一个扇区
回车 # 默认
# 输入扇区大小
回车 # 方式1:使用最后一个扇区(可用全部扇区)
+1G # 方式2:指定大小 (K,M,G)
p # 打印当前分区信息,检查创建的分区是有无误
w # 保存并退出
# parted 命令 (>2TB)
# 操作磁盘 /dev/sdb
parted /dev/sdb
帮助
align-check TYPE N check partition N for TYPE(min|opt) alignment
help [COMMAND] print general help, or help on COMMAND
mklabel,mktable LABEL-TYPE create a new disklabel (partition table) # 创建一个新的disklabel(分区表)
mkpart PART-TYPE [FS-TYPE] START END make a partition # 创建分区
name NUMBER NAME name partition NUMBER as NAME
print [devices|free|list,all] display the partition table, or available devices, or free space, or all
found partitions
quit exit program
rescue START END rescue a lost partition near START and END
resizepart NUMBER END resize partition NUMBER
rm NUMBER delete partition NUMBER
select DEVICE choose the device to edit
disk_set FLAG STATE change the FLAG on selected device
disk_toggle [FLAG] toggle the state of FLAG on selected device
set NUMBER FLAG STATE change the FLAG on partition NUMBER
toggle [NUMBER [FLAG]] toggle the state of FLAG on partition NUMBER
type NUMBER TYPE-ID or TYPE-UUID type set TYPE-ID or TYPE-UUID of partition NUMBER
unit UNIT set the default unit to UNIT
version display the version number and copyright information of GNU Parted
# 切换磁盘格式
# 切换gpt格式
mklabel gpt
# 打印磁盘信息
print
# or
p
# 创建分区
mkpart [part-type name fs-type] start end
# 创建一个主分区,从0到500扇区
mkpart primary 0 500
# 软硬链接
# 软链接(快捷方式)
类似于 Windows 的快捷方式,可以快捷的指向另一个文件的特殊文件 (夹)
ln -s 源文件绝对路径 快捷方式绝对路径
- 生成的链接文件,通过
ls -l
查看标识为lrwxrwxrwx
,其中第一位l
表示链接文件 - 删除快捷方式,不影响原文件
- 当原文件被删除时,访问快捷方式会提示
没有那个文件或目录
- 场景:
- 起别名:原文件名过长,在同目录链接一个简写名字的快捷方式
- 链接到 bin 目录
# 查看快捷方式文件存储的内容:为目标文件路径
readlink 快捷方式路径
# 硬链接
文件系统有一个名为 inode区域
的地方,中文叫索引节点,里面存储了文件的元信息,如:创建信息、修改信息、文件大小…… 但不包括文件名,而是通过 Inode
作为唯一标识。
# 查看文件元信息
stat README.md
# ———————————— output start ————————————
文件:README.md
大小:4791 块:16 IO 块大小:4096 普通文件
设备:259,2 Inode: 27321233 硬链接:1
权限:(0644/-rw-r--r--) Uid: ( 1000/nipgeihou) Gid: ( 1000/nipgeihou)
访问时间:2025-03-13 01:39:05.618190787 +0800
修改时间:2024-08-08 14:13:05.000000000 +0800
变更时间:2025-03-13 01:39:05.618190787 +0800
创建时间:2025-03-13 01:39:05.618190787 +0800
# ———————————— output end ————————————
一般情况下,一个 inode 对应一个文件名,而硬链接则将同一个 inode 对应多个文件名。
硬链接的特点
- 目录文件夹,不支持硬链接(软链接支持)
- 不得跨文件系统
- 硬链接数据量的增加,回增加 inode 号码的计数
- 删除源文件,不会导致链接文件失效
ln 源文件绝对路径 硬链接文件绝对路径
软硬链接区别
- 软链接是一个特殊的文件,文件内容为源文件的路径,因此源文件不见了自然就失效了。
- 硬链接更像是多个变量(文件)指向同一个指针,只有所有变量都被删除了,才会释放文件。
# 文件系统格式化
# VFS - 抽象类
这并不是一个具体的文件系统,而是一个接口,通过调用接口的方式,实现不同文件系统之间的交互。
# 文件系统
Linux:
- ext2
- ext3:centos 5
- ext4:centos 6
- xfs:centos 7 网络共享文件系统
- nfs:network file system
- smb:server message block 服务消息块 集群文件系统
- gfs:google file system
- ocfs:oracle cluster file system 分布式文件系统
- ceph:为了存储的可靠性喝扩展性的分布式文件系统 交换文件系统
- swap
# 日志文件系统
日志文件系统(英语:Journaling file system)是一种文件系统。在发生变化时,它先把相关的信息写入一个被称为日志的区域,然后再把变化写入主文件系统。在文件系统发生故障(如内核崩溃或突然停电)时,日志文件系统更容易保持一致性,并且可以较快恢复。
# mkfs - 格式化
针对磁盘分区进行格式化文件系统
mkfs.ext4 分区路径
# fsck - 修复文件系统
默认读取 /etc/fstab
开机挂载文件中每行最后一位,是 1
时检查
fsck -t 文件系统类型 设备名
# dumpe2fs、xfs_info - 查看文件系统属性
dumpe2fs
:适用于ext2、ext3、ext4
xfs_info
:适用于xfs
# tune2fs - 开机检查系统文件
# 关闭sdb分区文件系统自检
tune2fs -c -1 /dev/sdb
# lsblk - 列出所有设备及文件系统信息
lsblk -f # 列出分区的文件系统类型
# 最佳实践
# 前置:已创建磁盘分区
# 列出分区的文件系统类型
lsblk -f
# 格式化nvme1n1p1分区为ext4
mkfs.ext4 /dev/nvme1n1p1
# 检查
lsblk -f
# 关闭文件系统自检
tune2fs -c -1 /dev/nvme1n1p1
# 文件系统挂载
Linux 下设备不挂载的话,无法使用。
# 临时挂载
# 前置:磁盘已分区、格式化,针对已格式化的分区操作
# 显示系统所有挂载设备信息
mount -l
# 挂载
mount 设备路径 挂载路径
#mount /dev/sdb5 /mnt
# 查看挂载的磁盘使用情况
df -hT
# 取消挂载(必须没有人在使用时才可取消)
umount 挂载路径
# umount /mnt
# 挂载,只读方式
mount -o ro /dev/sdb5 /mnt
# 挂载,禁止执行二进制文件
mount -o noexec /dev/sdb5 /mnt
-o
参数详解
async 以异步方式处理文件IO,加速写入,数据会先写入缓冲区,提高系统性能,存在数据丢失风险。
sync 所有IO操作同步处理,数据同步写入磁盘,性能较弱,提高数据读写安全性
atime/noatime 文件被访问时,是否修改其时间戳,否时可提高磁盘IO速度
defaults 默认参数,覆盖了 rw,suid,dev,exec,auto,nouser,async等
exec/noexec 是否允许执行挂载点内的可执行命令,使用了noexec,提升磁盘安全性
ro 只读
rw 读写
att2 在磁盘上存储内连扩展属性,提升磁盘性能
inode64 允许在文件系统的任意位置创建inode
noquota 强制关闭文件系统的限额功能
# 开机挂载
mount 命令只会临时生效,系统重启后失效,配置 /etc/fstab
文件可实现永久挂载。
nano /etc/fstab
# 追加
设备路径 挂载路径 分区格式 defaults 0 0
# /dev/sdb5 /mnt xfs defaults 0 0
# 第一列:设备的名字,设备名称,可以是文件系统,也可以是设备名称,NFS远程网络文件系统
mount /dev/sdb5 /mnt
mount 192.168.1.15:/home/nfs /mnt -o nolock # 挂载nfs文件系统,且不加锁
# 第二列:挂载点
# 第三列:Linux支持的文件系统类型
ext3 ext4 nfs swap
# 第四列:挂载的功能选项(-o),默认是用defaults
# 第五列:dump
表示将整个文件夹内容备份,一般不对挂载点备份,默认为0
# 第六列:fsck 磁盘检查
默认都是0,不对磁盘检查,根文件系统,默认是检查的
# 读取/etc/fstab,使其生效
mount -a
# df - 检查挂载点使用情况
df
-i 显示已inode数量
# du - 显示磁盘空间大小,文件大小
Linux 文件存储最小单位是 4k
,也就是 8
个扇区
# 显示文件大小,以kb mb显示单位
du -h
# 显示当前目录所有的文件大小
du -h *
# 显示目录中所有文件大小
du -a
# 指定文件夹深度
du -ah --max-depth=1 /opt/
# 显示当前目录下所有文件,除.pyc文件外
du -ah --exclude='*.pyc' /opt/
# buff 和 cache
- buffers:缓冲区,加速写入数据;写入时先将数据存储到内存中,达到一定量时再写入磁盘。
- cached:缓存,加速读取数据;读取时,会存储数据到内存,再次读取时直接从内存读取。
# 查看buff/cache
free -m
# !!仅做演示,一般情况下无需释放、清除
# 释放cache
echo 1 > /proc/sys/vm/drop_caches
# 等效
sysctl -w vm.drop_caches=1
# 清除目录缓存和inodes
echo 2 > /proc/sys/vm/drop_caches
# 等效
sysctl -w vm.drop_caches=2
# 清除内存页的缓存
echo 3 > /proc/sys/vm/drop_caches
# 等效
sysctl -w vm.drop_caches=3
# 将内存缓冲区的数据写到磁盘中,也可用作释放缓存
sync
# swap 交换分区
swap 是 Linux 系统磁盘管理的一块特殊的分区,当实际的物理内存不足时,操作系统从整个内存中,取出一部分暂时没在使用的内存,拿出来放到交换分区,从而提供给当前正在使用的程序,可以使用更多的内存。
# 以合适的单位显示内存使用情况
free -h
# 创建一个分区;略
# 将分区改为swap类型 fdisk下操作
t # 修改分区类型
1 # 选择分区
82 # 要更改的类型
w # 写入
# 检查
lsblk -f
# 设置swap
mkswap swap分区路径
# mkswap /dev/sdc1
# 检查
free -m
# 关闭swap分区
swapoff swap分区路径
# swapoff /dev/sdc1
# 检查
free -m
# RAID
独立硬盘冗余阵列(RAID, Redundant Array of Independent Disks),简称磁盘阵列。利用虚拟化存储技术把多个硬盘组合起来,成为一个或多个硬盘阵列组,目的为提升性能或资料冗余,或是两者同时提升。
饮水机和磁盘的关系
- Standalone 独立模式:一个
模式 | 饮水机 | 磁盘 |
---|---|---|
Standalone 独立模式 | 1 台饮水机,1 桶水,提供服务 | 1 台服务器,1 块硬盘,提供服务 |
hot swap 热备份模式 | 1 台饮水机,2 桶水,水桶 1 污染、损坏时,水桶 2 随时接替工作 | 1 台服务器,2 块硬盘,硬盘 1 损坏时,硬盘 2 接替工作 |
cluster 集群模式 | 多台饮水机,多个水桶,1 对 1,同时提供服务,坏了一台,还有其他可用 | 多台服务器,多个硬盘,1 对 1,同时提供服务,坏了一台,还有其他可用,提高读写效率 |
# 概念
# RAID 0
- 原理:将数据分割,依次写入到多个磁盘
- 优点:写入速度翻倍
- 缺点:任意一个硬盘坏了,因数据不完整,变相导致全部数据丢失。
- 场景:适用于追求极致性能,不关注数据安全,如游戏、电影等可重复下载的资源。
# RAID 1
- 原理:将同一份数据存储到多个磁盘中
- 优点:数据冗余,数据安全
- 缺点:磁盘利用率低,成本高
- 场景:注重数据安全,如商业数据、高价值数据
# RAID 3
- 异或
^
操作:数字相同则为 0,数字不同则为 1。 - 只要知道异或结果,任何一个值都能被反推出来
- 原理:至少需要 3 块硬盘,其中一块用于存储异或结果,任意一个盘故障,都可以通过其他盘 + 异或结果反推出该盘的数据。
- 优点:具备 RAID 0 的优点,同时具备一点的安全冗余
- 缺点:最多同时损坏 1 个硬盘,超出时数据无法恢复
# RAID 5
- 原理:与 RAID 3 类似,但校验码不是存储在同一块硬盘,而是分散存储在每块硬盘中。
- 优点:与 RAID 3 类似
- 缺点:与 RAID 3 类似
# RAID 10(企业方案)
- 原理:先做镜像卷 RAID 1 将所有硬盘分为两组,再做 RAID 0 执行条带化操作分割数据
- 优点:同时具备 RAID 0 和 RAID 1 的优点,读写快、安全
- 缺点:成本高
# 硬 RAID 与软 RAID
硬 RAID 是通过硬件实现的磁盘阵列,软 RAID 则为软件实现的。
区别
- 软 raid 会额外消耗 CPU 资源,造成服务器压力
- 硬 raid 更稳定,软 raid 可能会造成磁盘发热过量,造成损毁
- 硬 raid 兼容性更好,软 raid 兼容性依赖于操作系统
- 硬 raid 完胜
# 硬 RAID
需要 RAID 阵列卡,todo
# 软 RAID
搭建 RAID 10 实践:
# 创建 - RAID 10
# 前置:插入4块硬盘
# 检查
fdisk -l
# 创建raid
mdadm -Cv /dev/md0 -a yes -n 4 -l 10 /dev/sdb /dev/sdc /dev/sdd /dev/sde
# -C 创建RAID阵列
# -v 显示创建过程
# /dev/md0 标识raid阵列的名字
# -a yes 自动创建阵列名字
# -n 4 使用4块硬盘创建
# -l 10 表示raid级别
# 至此多了一个/dev/md0磁盘,之后的操作当普通磁盘分区使用即可
# 格式化
mkfs.xfs /dev/md0
# 挂载
mkdir /myraid
mount /dev/md0 /myraid
# 检查挂载
mount -l
# 检查挂载空间使用情况
df -hT
# 检查raid阵列信息
mdadm -D /dev/md0
# 故障修复
# 模拟挂掉一块硬盘
mdadm /dev/md0 -f /dev/sdd
# 检查raid阵列信息
mdadm -D /dev/md0
# 即使挂掉一个硬盘 也不会影响阵列的使用,只需重新购买一块新的硬盘加入阵列
# 新硬盘加入前,需要先取消挂载
umount /dev/md0
# 将新磁盘添加到阵列中
mdadm /dev/md0 -a /dev/sdd
# 检查raid阵列信息,可以看到备份进度(rebuild status)
mdadm -D /dev/md0
# 重启
# 创建raid配置文件,保存raid配置
echo DEVICE /dev/sb[b-e] > /etc/mdadm.conf
cat /etc/mdadm.conf
# 扫描磁盘阵列信息,追加到这个文件
mdadm -Ds >> /etc/mdadm.conf
cat /etc/mdadm.conf
# 取消raid10的挂载
umcount /myraid
# 暂停raid10
mdadm -S /dev/md0
# 检查磁盘阵列是否还存在
mdadm -D /dev/md0
# 再次启动raid10
mdadm -A /dev/md0
# 此时可以正常看到raid10的信息
mdadm -D /dev/md0
# 卸载(删除)
# 取消raid10的挂载
umcount /myraid
# 停止raid服务
mdadm -S /dev/md0
# 卸载raid10中所有的磁盘信息
mdadm --misc --zero-superblock /dev/sdb
mdadm --misc --zero-superblock /dev/sdc
mdadm --misc --zero-superblock /dev/sdd
mdadm --misc --zero-superblock /dev/sde
# 删除raid的配置文件
rm /etc/mdadm.conf
# 删除开机自动挂载配置
nano /etc/fstab
# 创建备份盘
备份盘会在工作盘出现故障时,替换其位置
mdadm -Cv /dev/md0 -n 3 -l 5 -x 1 /dev/sdb /dev/sdc /dev/sdd /dev/sde
# -n 指定3块硬盘
# -l 指定raid级别为 raid 5
# -x 1 指定一个备份盘
# /dev/sd[b-e] 代表指定使用的四块硬盘
# 检查
mdadm -D /dev/md0
# 格式化
mfs.xfs -f /dev/md0
# 挂载
mount /dev/md0 /myraid
# 模拟挂掉一块硬盘
mdadm /dev/md0 -f /dev/sdb
# 检查:可见正在rebuild到备份盘
mdadm -D /dev/md0
# LVM
# RAID 的缺点
- 配置好的磁盘阵列组,容量大小就固定下来了,出现磁盘容量不够用时,扩容磁盘空间比较麻烦,需要先卸载再操作。
- 不同的磁盘分区,相对独立,空间利用率低
- 某个分区满了,无法直接扩容,需要重新分区,分配容量
- 合并分区,需要格式化存盘,需要数据备份
逻辑卷管理器(英语:Logical Volume Manager,缩写为 LVM),是 Linux 核心所提供的逻辑卷管理(Logical volume management)功能。它在硬盘的硬盘分区之上,又建立一个逻辑层,以方便系统管理硬盘分割系统。
# 常见名词
- PP(physical partition),物理分区,lvm 直接创建在物理分区之上
- PV(physical volume),物理卷,处于 lvm 的最底层,一般一个 PV 对应一个 PP
- PE(physical extends),物理区域,PV 中可以用于分配的最小存储单位,同一个 VG 所有的 PV 中 PE 大小相同,例如 1M、2M
- VG(volume group),卷组,卷组创建在 PV 之上,可以划分为多个 PV
- LE(logical extends),逻辑扩展单元,LE 是组成 LV 的基本单元,一个 LE 对应一个 PE
- LV(logical volume),逻辑卷,创建在 VG 之上,是一个可以动态扩容的分区概念
# 原理
- LVM 动态扩容大小,其实就是通过互相交换 PE 的过程,达到能够弹性扩容分区大小
- 想要减少容量,就是剔除 PE 的大小
- 想要扩大容量,就是把其他的 PE 添加到自己的 LV 当中
- PE 默认大小一般都是 4M,LVM 最多可创建 65534 个 PE,因此 LVM 最大的 VG 卷组单位是 256G
- LV 逻辑卷的概念,可理解为普通的分区概念,
/dev/sda
# 常用命令
# pv 物理卷
pvcreate 创建物理卷
pvscan 扫描物理卷信息
pvdispaky 显示各个物理卷详细参数
pvremove 删除物理卷
# vg 卷组
vgcreate
vgscan
vgdisplay
vgreduce 缩小卷组,把物理卷从卷组中移除
vgextend 扩大卷组,把新的物理卷加入到卷组中
vgremove 删除整个卷组
# lv 逻辑卷
lvcreate
lvscan
lvs
lvdisplay 扩容
lvextend 缩小
lvremove 删除逻辑卷
# 创建
# 创建pv,创建/dev/sdb、/dev/sdc物理卷
pvcreate /dev/sdb /dev/sdc
# 创建卷组,创建vg1卷组,添加/dev/sdb、/dev/sdc进入
vgcreate vg1 /dev/sdb /dev/sdc
# 扫描pv(打印列表)
pvs
pvdispaky
# 扫描vg(打印列表)
vgs
vgdisplay
# 扩容
# 再创建一个物理卷
pvcreate /dev/sdd
# 卷组添加物理卷(扩容)
vgextend vg1 /dev/sdd
# 打印,查看容量
vgdisplay
# 卷组移除物理卷(缩容)
vgreduce vg1 /dev/sdd
# 删除物理卷(不用)
pvremove /dev/sdd
# 创建lv逻辑卷
lvcreate -n lv1 -L +500M vg1
# 扫描逻辑卷
lvs
lvdisplay
# 格式化逻辑卷
mkfs.xfs /dev/vg1/lv1
# 查看分区
lsblk -f
# 之后就可以当作一个普通分区使用
# 挂载
mkdir /vg1_vl1
mount /dev/vg1/lv1 /vg1_vl1
# 永久挂载
略
# lvm扩容
# 卸载设备
unmount /vg1_vl1
# lvm扩容
lvextend -L +10G /dev/vg1/lv1
# 重新挂载
mount /dev/vg1/lv1 /vg1_vl1
# 调整xfs文件大小,否则读取不到扩容后的容量
xfs_growfs /dev/vg1/lv1
# 检查容量大小
df -hT
# 卸载
# 卸载设备
unmount /vg1_vl1
# 删除lv逻辑卷
lvremove /dev/vg1/lv1
# 删除vg卷组
vgremove vg1
# 删除pv物理卷
pvs # 扫描有哪些物理卷
pvremove /dev/sdb /dev/sdc