云计算基础-7:Linux存储管理-2

发布时间:2026/6/30 13:43:40
云计算基础-7:Linux存储管理-2 博客原文链接Breeze存储管理是 Linux 系统运维的核心技能之一。无论是日常的文件操作、磁盘分区还是企业级的 RAID 配置都离不开对存储机制的深入理解。很多初学者对存储管理感到困惑是因为没有建立起 “inode - block - 文件系统” 之间的关联。本文将通过层层拆解的方式先讲透核心概念再逐一演示实战操作帮你构建完整的 Linux 存储知识体系内容有点难理解很正常可以先做个了解。对前文的补充解释-Linux 挂载点与磁盘数据的完整关系详解核心结论操作/mnt/disk1 目录可见内容数据实际存储位置数据是否丢失占用空间位置正常挂载 sdb1sdb1 磁盘中的数据sdb1 磁盘否sdb1 磁盘卸载 sdb1 / 拔掉磁盘根文件系统中 /mnt/disk1 目录原本的内容根文件系统磁盘否sdb1 数据仍在磁盘上根文件系统磁盘原目录内容重新挂载 sdb1再次显示 sdb1 磁盘中的数据sdb1 磁盘否sdb1 磁盘删除 /mnt/disk1 目录后再插磁盘目录不存在无法直接访问sdb1 磁盘否数据仍在磁盘上无目录已删除一句话挂载只是 “嫁接”不是 “复制”数据永远在磁盘上挂载只是建立访问路径。举个简单的例子我们图书馆比喻加入挂载的概念根文件系统 (/)主图书馆大楼建在第一块磁盘 (sda) 上/mnt/disk1 目录主图书馆里预先留好的一个空房间这个房间本身属于主图书馆sdb1 磁盘分区一个独立的移动图书馆车里面有自己的书架 (block)、图书卡 (inode) 和管理员 (superblock)挂载操作 (mount)把移动图书馆车整个推进主图书馆的那个空房间里并且把房间门和移动图书馆的门合二为一卸载操作 (umount)把移动图书馆车从房间里推出去恢复主图书馆那个空房间的原样往 /mnt/disk1 写数据影响的是哪里的空间当 sdb1 正常挂载在 /mnt/disk1 上时你所有对 /mnt/disk1 目录的增删改查操作全部作用在 sdb1 磁盘上这些操作不会影响根文件系统 (sda) 的任何空间就像你把书放进了推进房间的移动图书馆车里而不是主图书馆的房间里拔掉 sdb1 或取消挂载后/mnt/disk1 的数据还在吗还在但不是你之前看到的那些数据。这是 Linux 挂载最容易让人误解的地方挂载会 “遮盖” 挂载点目录原本的内容。在你挂载 sdb1 之前/mnt/disk1 是根文件系统里的一个普通空目录它本身存在于 sda 磁盘上当你挂载 sdb1 后原来的空目录被 “遮盖” 了你看到的是 sdb1 里的内容当你卸载 sdb1 或拔掉磁盘后“遮盖” 效果消失你看到的又变回了根文件系统里那个原本的空目录所以你之前写入 sdb1 的数据没有丢失它们仍然完整地保存在 sdb1 磁盘上你现在在 /mnt/disk1 看到的是根文件系统中这个目录原本的内容通常是空的如果里面挂载之前有文件你会看到这些文件这些内容不占用系统内存它们占用的是根文件系统 (sda) 的磁盘空间重新插上磁盘数据还在吗100% 还在。数据从来没有离开过 sdb1 磁盘。你只需要重新执行挂载命令mount/dev/sdb1 /mnt/disk1挂载成功后你之前写入的所有数据都会原封不动地出现在 /mnt/disk1 目录中。这就像你把移动图书馆车推出去又推回来车里的书一本都不会少。如果先删除 /mnt/disk1 目录再插上磁盘数据还在吗数据仍然完整地保存在 sdb1 磁盘上一点都不会少。你删除的只是主图书馆里的那个空房间而不是移动图书馆车里的书。移动图书馆车本身是独立存在的和主图书馆的房间没有任何关系。你只需要重新创建那个目录然后再次挂载即可# 重新创建挂载点目录mkdir-p/mnt/disk1# 重新挂载sdb1mount/dev/sdb1 /mnt/disk1所有数据都会立刻恢复访问。完整的实验演示你可以自己动手验证# 1. 先查看挂载状态df-h/mnt/disk1# 输出/dev/sdb1 20G 45M 19G 1% /mnt/disk1# 2. 在挂载的磁盘中创建一个测试文件echo这是sdb1磁盘里的数据/mnt/disk1/sdb1_data.txtls/mnt/disk1# 输出sdb1_data.txt# 3. 卸载sdb1umount/mnt/disk1# 4. 再次查看/mnt/disk1目录ls/mnt/disk1# 输出空因为现在看到的是根文件系统里的空目录# 5. 在根文件系统的/mnt/disk1目录中创建一个文件echo这是根文件系统里的数据/mnt/disk1/root_data.txtls/mnt/disk1# 输出root_data.txt# 6. 重新挂载sdb1mount/dev/sdb1 /mnt/disk1# 7. 再次查看/mnt/disk1目录ls/mnt/disk1# 输出sdb1_data.txtroot_data.txt被遮盖了看不到了# 8. 再次卸载sdb1umount/mnt/disk1# 9. 查看/mnt/disk1目录ls/mnt/disk1# 输出root_data.txt被遮盖的文件又出现了生产环境最常见的挂载大坑这是 90% 的 Linux 初学者都会踩的坑也是很多生产事故的根源我们要查看挂载点是否真的挂载成功场景你配置了开机自动挂载 sdb1 到 /mnt/disk1但是某次服务器重启后sdb1 因为故障没有挂载成功。你不知情继续往 /mnt/disk1 里写数据。后果这些数据全部写到了根文件系统 (sda) 的磁盘上占用了根分区的空间。当根分区被写满后系统会崩溃。更危险的是当你后来发现 sdb1 没有挂载手动挂载上去后之前写的数据会突然 “消失”被遮盖了你会以为数据丢了。总结一下挂载的本质是建立访问路径不是复制数据。数据永远存储在对应的物理磁盘上。挂载点目录本身属于根文件系统挂载会遮盖它原本的内容卸载后恢复。卸载或拔掉磁盘不会删除磁盘上的数据只是暂时无法访问。删除挂载点目录不会影响磁盘上的数据重新创建目录并挂载即可恢复。永远不要在未挂载的挂载点目录中写入数据这会占用根分区空间也容易误导自己数据丢失。文件系统详解EXT4 文件系统EXT4是第四代扩展文件系统Fourth extended filesystem是 Linux 系统中最常用的文件系统之一。XFS 文件系统XFS是一种高性能的日志文件系统由 Silicon Graphics 开发特别适合处理大文件和高并发 I/O 场景。文件系统对比文件系统类型最大容量限制特点EXT3日志文件系统16TB第三代扩展文件系统稳定性好EXT4日志文件系统16TB第四代扩展文件系统性能更好XFS日志文件系统100TB高性能适合大数据场景如何选择日常使用EXT4 是默认选择稳定可靠大容量存储、数据库服务器推荐 XFS性能更优核心概念inode、block、superblockinode索引节点inode是文件系统中最重要的概念之一它记录了文件的元数据metadata。inode 记录的信息文件的属性大小、权限、属主、属组连接数有多少个文件名指向这个 inode块数量、块的编号数据存储在哪些 block 中时间戳创建时间、修改时间、访问时间关键特性一个文件占用一个 inodeinode 大小为 128 bytesEXT4inode 决定了文件系统中可以创建的文件数量block数据块block是存储文件实际数据的单位。关键特性存储文件的实际内容大文件会占用多个 blockblock 大小默认为 4Kblock 决定了文件系统的存储容量superblock超级块superblock是文件系统的总管理员记录了整个文件系统的整体信息。记录的信息block 与 inode 的总量未使用与已使用的 inode / block 数量block 的大小文件系统的状态block group块组EXT4 文件系统将磁盘划分为多个 block group每个 block group 包含自己的 inode table、block bitmap 和 data blocks。这种设计提高了文件系统的性能和可靠性。这里还是举个简单例子吧如果把整个EXT4 文件系统比作一座现代化的大型图书馆超级块 (superblock)是图书馆的总管理处墙上挂着全馆的总览图记录着全馆共有多少个书架格子、多少张图书卡、已经用了多少、还剩多少以及图书馆的开放状态和基本规则。块组 (block group)是图书馆的一个个独立楼层。为了提高效率图书馆没有把所有书架和图书卡都堆在一个地方而是按楼层划分每个楼层都有自己的图书卡柜、空卡登记表、空格子登记表和书架。inode (索引节点)是每本书专属的目录卡片。每张卡片上只记录这本书的关键信息书名、作者、页数、借阅权限、存放位置在哪个楼层的哪个书架的哪些格子里、被多少人同时借阅过以及创建、修改和最后被人翻阅的时间。卡片本身不包含书的任何内容。block (数据块)是书架上一个个标准大小的格子。所有书的内容都存放在这些格子里薄书可能只占 1 个格子厚书会连续或分散占用多个格子。inode 位图 (inode bitmap)是每个楼层的空卡登记表用打勾 / 打叉的方式快速标记哪些图书卡已经被使用哪些还是空的。块位图 (block bitmap)是每个楼层的空格子登记表同样用打勾 / 打叉的方式快速标记哪些书架格子已经放了书哪些还是空的。inode 表 (inode table)是每个楼层存放所有图书卡的卡片柜。完整的 “取书” 流程对应文件读取过程当你操作系统来到图书馆想要借一本名叫《Linux 内核设计与实现》的书读取一个文件第一步查总目录找卡片位置你先去图书馆的总目录目录项 dentry它记录了文件名和 inode 号的对应关系查找《Linux 内核设计与实现》这本书总目录告诉你这本书对应的图书卡编号是12345存放在3 楼的卡片柜里。第二步去对应楼层取图书卡你来到 3 楼从3 楼的卡片柜 (inode 表)中取出编号为 12345 的那张inode 卡片。第三步查看卡片上的存放信息你仔细阅读这张卡片上面写着这本书共 1200 页文件大小内容存放在 3 楼书架的第 1024、1025、1026、1027 号格子里数据块编号这本书只能被管理员修改文件权限最后一次被人翻阅是昨天访问时间第四步按卡片指引去书架取书你按照卡片上的指引依次走到 3 楼书架的 1024、1025、1026、1027 号格子前把每个格子里的书页都取出来按顺序拼在一起就得到了完整的《Linux 内核设计与实现》这本书。实战inode 与 block 的关系问题一新分区中文件的数量和什么有关系答案inode 数量决定了文件系统中可以创建的文件数量。验证实验# 1. 观察某个分区中的 inode 节点数df-i输出示例[rootlocalhost ~]# df -i文件系统 Inode 已用(I)可用(I)已用(I)% 挂载点 /dev/mapper/centos-root891084812833887825102% / devtmpfs1202214051198161% /dev tmpfs12448611244851% /dev/shm tmpfs1244869141235721% /run tmpfs124486161244701% /sys/fs/cgroup /dev/sda15242883405239481% /boot tmpfs12448691244771% /run/user/42 tmpfs12448611244851% /run/user/0 /dev/sdb15120011511891% /mnt/disk1# 这里我们着重看sdb1这块磁盘# 在sdb1上创建一个文件[rootlocalhost ~]# touch /mnt/disk1/1.txt[rootlocalhost ~]# df -i文件系统 Inode 已用(I)可用(I)已用(I)% 挂载点 /dev/sdb15120012511881% /mnt/disk1你会发现IUsed已用I增加了 1说明创建一个文件会消耗一个 inode。# 4. 创造大量文件观察 inode 使用情况[rootlocalhost ~]# touch /mnt/disk1/file{1..51188}[rootlocalhost ~]# df -i文件系统 Inode 已用(I)可用(I)已用(I)% 挂载点 /dev/sdb151200512000100% /mnt/disk1# 请问写满之后还能否创建新文件呢[rootlocalhost ~]# touch /mnt/disk1/txttouch: 无法创建/mnt/disk1/txt:设备上没有空间# 能否向已存在的文件中写入内容呢答案是[rootlocalhost ~]# echo 666 /mnt/disk1/file1[rootlocalhost ~]# cat /mnt/disk1/file1666结论inode 决定了文件系统中文件的数量即使还有磁盘空间如果 inode 用完了也无法创建新文件inode消耗的是文件数量并非空间存储大小可以继续存储内容问题二当分区空间大小消耗完毕还能否新增文件答案不能block 用完后无法存储新数据。验证实验# 1. 向目标分区写入大量数据填满磁盘[rootlocalhost ~]# dd if/dev/zero of/mnt/disk1/file1 bs1k count100000000dd: 写入/mnt/disk1/file1出错: 设备上没有空间 记录了1871250 的读入 记录了1871240 的写出191614976字节(192MB)已复制0.457181 秒419 MB/秒# 2. 查看目标sdb1分区容量已满[rootlocalhost ~]# df -hT文件系统 类型 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root xfs 17G3.6G 14G21% / devtmpfs devtmpfs 470M0470M0% /dev tmpfs tmpfs 487M0487M0% /dev/shm tmpfs tmpfs 487M8.3M 478M2% /run tmpfs tmpfs 487M0487M0% /sys/fs/cgroup /dev/sda1 xfs 1014M 166M 849M17% /boot tmpfs tmpfs 98M 12K 98M1% /run/user/42 tmpfs tmpfs 98M098M0% /run/user/0 /dev/sdb1 ext4 190M 186M0100% /mnt/disk1# 3. 尝试创建新文件[rootlocalhost ~]# touch /mnt/disk1/txttouch: 无法创建/mnt/disk1/txt:设备上没有空间# 4.留出一个inode创建文件并写入数据[rootlocalhost ~]# rm -rf /mnt/disk1/file2[rootlocalhost ~]# touch /mnt/disk1/txt[rootlocalhost ~]# echo 1111 /mnt/disk1/txt-bash: echo: 写错误: 设备上没有空间结论磁盘空间的限制根据 inode 和 block 两方面inode决定文件数量却不会影响存储block也决定存储空间却不会影响文件数量如果存储用完可以创建文件却不能写入数据而文件数量用完却可以在已有的文件中写入数据。限制因素决定内容inode文件数量上限block存储空间上限提示请定期清理磁盘空间避免 inode 或 block 耗尽导致系统报错。文件链接文件链接是 Linux 系统中非常重要的概念它允许我们为一个文件创建多个入口。Linux 支持两种类型的链接软链接和硬链接。符号链接软连接软链接symbolic link类似于 Windows 中的快捷方式它记录的是源文件的路径。创建软链接# 1. 创建一个文件并输入内容[rootlocalhost ~]# echo 123456789 /aaa# 2. 创建一个软连接rootlocalhost ~]# ln -s /aaa aaa# -s 表示创建软连接# 3. 观察软连接[rootlocalhost ~]# ll aaalrwxrwxrwx.1root root45月1815:23 aaa -/aaa# 注意开头的 l 表示这是一个链接文件查看源文件和软链接# 4. 观察软连接和源文件[rootlocalhost ~]# ll aaa /aaalrwxrwxrwx.1root root45月1815:23 aaa -/aaa -rw-r--r--.1root root105月1815:23 /aaa# 5. 查看两个文件内容一致[rootlocalhost ~]# cat aaa123456789[rootlocalhost ~]# cat /aaa123456789删除源文件# 6. 删除源文件软连接失效[rootlocalhost ~]# rm -rf /aaa[rootlocalhost ~]# ll aaalrwxrwxrwx.1root root45月1815:23 aaa -/aaa[rootlocalhost ~]# cat aaacat: aaa: 没有那个文件或目录# 软连接仍然存在但指向的路径已经不存在变成死链接软链接的特点特性说明类似快捷方式软链接就像 Windows 的快捷方式可跨分区可以对任何文件和目录做软连接不受分区限制记录路径软链接记录的只是源文件的路径源文件删除后失效失去源文件后软连接不可用独立 inode软链接有自己独立的 inode硬链接硬链接是指多个文件名指向同一个 inode。它与软链接有本质的区别。创建硬链接# 1. 创建一个文件[rootlocalhost ~]# echo 222 /file2# 2. 在同分区创建硬链接成功[rootlocalhost ~]# ln /file2 /file2-h1# 3. 尝试跨分区在sdb1上创建硬链接失败[rootlocalhost ~]# ln /file2 /mnt/disk1/file2-h2ln: 无法创建硬链接/mnt/disk1/file2-h2/file2:无效的跨设备连接注意硬链接只能在同一个分区内创建不能跨分区。删除源文件# 4. 删除源文件硬链接依然可用[rootlocalhost ~]# rm -rf /file2[rootlocalhost ~]# cat /file2-h1222# 硬链接不受源文件删除的影响目录不允许创建硬链接[rootlocalhost ~]# ln /home/ /mntln:/home/:不允许将硬链接指向目录硬链接的特点特性说明只能针对文件不能对目录创建硬链接只能同分区硬链接只能在同一个文件系统内创建共享 inode硬链接和源文件共享同一个 inode源文件删除不影响删除源文件后硬链接依然可用软链接 vs 硬链接对比项软链接硬链接本质记录源文件路径与源文件共享 inode跨分区✅ 可以❌ 不可以目录链接✅ 可以❌ 不可以源文件删除❌ 失效✅ 依然可用inode独立 inode共享 inode文件大小存储路径的长度与源文件相同类似概念Windows 快捷方式文件的别名RAID 磁盘阵列RAID 简介RAID全称是廉价磁盘冗余阵列Redundant Array of Independent Disks。作用容错某块硬盘损坏时数据不会丢失提升读写速率多块硬盘同时工作提高 I/O 性能常见 RAID 类型RAID 0条带集特性说明磁盘数量2 块及以上读写性能100% × N最快容错能力❌ 不容错空间利用率100%特点数据分散存储在多块磁盘上读写速度最快但任何一块磁盘损坏都会导致数据丢失。怎么运作数据拆开平均分到每块盘同时读写。文件 1 前一半放 A 盘后一半放 B 盘文件 2 前一半放 B 盘后一半放 A 盘两块盘同时干活速度翻倍举例你有 2 个抽屉把一本书撕成两半左边放抽屉 1右边放抽屉 2。拿书时两个抽屉同时拿速度更快。故障会怎样只要坏 1 块盘全部数据直接没了。抽屉 1 坏了左边书页全丢整本书报废。能不能换盘救数据❌不能。坏一块全盘报废换新盘也救不回来数据直接丢失。RAID 1镜像集特性说明磁盘数量2 块读写性能一般容错能力✅ 容错空间利用率50%特点数据完整复制到两块磁盘上一块损坏不影响数据读取但存储空间只有一半可用。怎么运作每块盘存一模一样完整数据互相备份。A 盘存文件 1、文件 2、文件 3B 盘也完整存文件 1、文件 2、文件 3举例2 个抽屉两本一模一样的书抽屉 1 一本抽屉 2 一本。不管拿哪个抽屉都能拿到完整的书。故障会怎样坏任意 1 块盘数据完全没事。抽屉 1 坏了抽屉 2 还有完整的书正常使用。能不能换盘救数据✅可以数据不丢拔掉坏盘插上新硬盘系统自动把好盘的数据完整复制到新盘阵列恢复正常全程数据不丢缺点2 块盘只能用 1 块盘的容量100G100G 只能用 100G。RAID 5带奇偶校验条带集特性说明磁盘数量3 块及以上读写性能快容错能力✅ 容错允许 1 块磁盘损坏空间利用率(n-1)/n特点数据和校验信息分散存储在所有磁盘上兼顾性能和容错是最常用的 RAID 级别。怎么运作数据 校验信息分开存在所有盘不单独放一块盘最少需要3 块盘。A 盘文件 1B 盘文件 2C 盘文件 1 文件 2 的校验码用来恢复数据下一轮轮换A 盘校验码B 盘文件 3C 盘文件 4举例3 个抽屉2 本不同的书 1 张 “复原笔记”笔记可以根据两本书算出任意一本丢了的内容。也可以理解为123每个数字代表一个磁盘代号,有一天2坏了变成了13插上新磁盘后阵列会自动算出2这个数字。故障会怎样最多允许坏 1 块盘坏 2 块直接报废。坏任意一块靠另外两块盘的数据 校验码算出丢失内容正常读写。能不能换盘救数据✅可以数据不丢拔掉坏盘插入新硬盘RAID 自动用剩下两块盘算出丢失数据同步到新盘阵列修复完成继续正常使用特点3 块盘用 2 块容量100100100 可用 200G企业最常用。硬 RAID vs 软 RAID对比项硬 RAID软 RAID实现方式需要 RAID 卡通过操作系统实现处理速度有独立 CPU速度快依赖系统 CPU成本较高较低适用场景企业级服务器个人电脑、测试环境软 RAID 实战示例准备磁盘# 查看系统中的磁盘[rootlocalhost ~]# ll /dev/sd*brw-rw----.1root disk8,325月1911:37 /dev/sdc brw-rw----.1root disk8,485月1911:37 /dev/sdd brw-rw----.1root disk8,645月1911:37 /dev/sde brw-rw----.1root disk8,805月1911:37 /dev/sdf我们准备了 4 块磁盘/dev/sdc、/dev/sdd、/dev/sde、/dev/sdf使用RAID 管理工具创建 RAID 5# RAID5: (3块数据盘) (1块热备硬盘)[rootlocalhost ~]# mdadm -C /dev/md0 -l5 -n3 -x1 /dev/sd{c,d,e,f}参数说明参数说明-C创建 RAID/dev/md0第一个 RAID 设备-l5RAID 5-n3RAID 成员的数量3 块-x1热备磁盘的数量1 块格式化并挂载# 格式化[rootlocalhost ~]# mkfs.ext4 /dev/md0# 创建挂载点[rootlocalhost ~]# mkdir /mnt/raid5# 挂载[rootlocalhost ~]# mount /dev/md0 /mnt/raid5# 测试写入数据[rootlocalhost ~]# cp -rf /etc /mnt/raid5/etc1查看 RAID 信息[rootlocalhost ~]# mdadm -D /dev/md0/dev/md0:# 软RAID设备名称Version:1.2# RAID元数据版本Creation Time:Wed May2010:33:572026# 创建时间Raid Level:raid5# RAID级别RAID5Array Size:41908224(39.97GiB42.91GB)# 阵列总可用容量Used Dev Size:20954112(19.98GiB21.46GB)# 每块盘实际使用容量Raid Devices:3# 正常工作的RAID成员盘数量RAID5需要3块Total Devices:4# 阵列中总磁盘数3个工作 1个热备Persistence:Superblock is persistent# 超级块持久化重启不丢配置Update Time:Wed May2010:35:292026# 最后更新时间State:active# 阵列状态正常活跃Active Devices:3# 活跃工作的磁盘数Working Devices:4# 正常运行的磁盘总数Failed Devices:0# 损坏磁盘数0无坏盘Spare Devices:1# 热备盘数量1块Layout:left-symmetric# RAID5数据布局方式默认Chunk Size:512K# 数据块大小条带大小Consistency Policy:resync# 一致性策略同步Name:localhost.localdomain:0(local tohostlocalhost.localdomain)# 阵列名称UUID:6ef1a84e:c593e6b3:01ca15fa:fe5b7711# 阵列唯一IDEvents:19# 阵列事件计数操作次数Number Major Minor RaidDevice State08320activesync/dev/sdc# 活跃成员盘18481activesync/dev/sdd# 活跃成员盘48642activesync/dev/sde# 活跃成员盘3880- spare /dev/sdf# 热备盘空闲待命模拟硬盘损坏# 终端一持续查看 RAID 状态[rootlocalhost ~]# watch -n 0.5 mdadm -D /dev/md0 | tail# 终端二模拟一块硬盘损坏并移除[rootlocalhost ~]# mdadm /dev/md0 -f /dev/sde -r /dev/sde# -f: 标记为失败 (fail)# -r: 移除 (remove)观察结果热备磁盘/dev/sdf会自动顶替损坏的磁盘RAID 5 继续正常工作。总结通过本文的学习你应该掌握了理解 EXT4 和 XFS 文件系统的特点和适用场景掌握 inode、block、superblock 的核心概念理解 inode 决定文件数量block 决定存储容量的原理掌握软链接和硬链接的区别和使用场景了解 RAID 0、RAID 1、RAID 5 的特点和适用场景能够使用 mdadm 创建和管理软 RAID学习建议存储管理是 Linux 运维的核心技能之一建议在自己的虚拟机上多练习这些命令通过实际操作来加深理解。特别是 inode 和 block 的关系、软链接和硬链接的区别建议动手实验来加深印象。