Linux 磁盘管理补充与网络基础实战:RAID、inode、fsck 与 TCP/IP 全链路
上一期《Linux 磁盘管理与 LVM 实战》我们把存储链路打通了:分区、LVM、文件系统、挂载。
这一期先补三个磁盘"深水区"话题——RAID 到底怎么保护数据、挂载点已有内容怎么搬家、空间满了却发现 inode 爆了,外加两个救火技能(文件系统只读体检、已删除文件仍占空间)。
然后正式进入网络:同网段怎么通、跨网段怎么通、OSI/TCP-IP 分层与 PDU、一个数据包跨网段的完整旅程,最后落到ip命令与 Netplan 实战。全程命令可复制,建议边看边敲。
文章目录
- Linux 磁盘管理补充与网络基础实战:RAID、inode、fsck 与 TCP/IP 全链路
- 一、RAID 工作原理:数据到底是怎么被保护的
- 1.1 五种 RAID 级别对比
- 1.2 各级别详解
- 1.3 软件 RAID 实战(mdadm)
- 二、挂载时遇到"有内容"的目录怎么办
- 2.1 先说清楚为什么不能直接挂
- 2.2 正确做法:临时目录搬家法
- 三、空间满了?别只看 df -h,还有 inode 这个坑
- 3.1 block 和 inode 是两个东西
- 3.2 两个命令分清是谁满了
- 3.3 inode 满了会怎样
- 四、文件系统只读检查:e2fsck 与 xfs_repair
- 4.1 ext4:e2fsck
- 4.2 XFS:xfs_repair
- 4.3 铁律与解读
- 五、已删除文件仍占空间:lsof 抓"鬼"
- 5.1 灵异现象
- 5.2 原理
- 5.3 揪出元凶并释放
- 六、网络基础:从分层到一个数据包的旅程
- 6.1 网络到底是怎么传输的
- 6.2 OSI 七层与 TCP/IP 四层
- 6.3 一个数据包跨网段的完整旅程
- 6.4 查看接口与 MAC 地址
- 6.5 临时启停接口(重启网络不丢配置)
- 6.6 地址、前缀与"同网段"判断
- 6.7 配置主机地址:Netplan(Ubuntu 22.04+)
- 6.8 配置主机名
- 总结
一、RAID 工作原理:数据到底是怎么被保护的
RAID(Redundant Array of Independent Disks,独立磁盘冗余阵列)的核心思想一句话:把多块物理磁盘拼成一个逻辑磁盘,用"条带化"换性能,用"冗余"换安全。
先建立三个概念,后面所有级别都绕不开:
- 条带化(Striping):把一份数据切成小块,轮流写到不同盘上,多盘并行读写 → 快
- 镜像(Mirroring):同一份数据写两遍到两块盘 → 安全但费容量
- 校验(Parity):用异或算法算出校验块,某块盘挂了能用其余盘+校验把数据算回来 → 折中方案
1.1 五种 RAID 级别对比
| 级别 | 最少盘数 | 可用容量 | 容错 | 读性能 | 写性能 | 一句话原理 |
|---|---|---|---|---|---|---|
| RAID 0 | 2 | 100%(N) | 无 | 很快 | 很快 | 纯条带化,一块坏全盘丢 |
| RAID 1 | 2 | 50%(N/2) | 坏 1 块 | 快 | 一般 | 纯镜像,两盘一模一样 |
| RAID 5 | 3 | (N-1)/N | 坏 1 块 | 快 | 一般(写要算校验) | 分布式单校验 |
| RAID 6 | 4 | (N-2)/N | 坏 2 块 | 快 | 更慢(双校验开销) | 分布式双校验 |
| RAID 10 | 4 | 50%(N/2) | 每组坏 1 块 | 很快 | 很快 | 先镜像,再条带 |
1.2 各级别详解
RAID 0:只要快,不要命
磁盘1: [数据块A][数据块C][数据块E] 磁盘2: [数据块B][数据块D][数据块F] ↑ 一份文件被切成条带,轮流写- 优点:读写速度约等于单盘 × 盘数,容量也不浪费
- 缺点:没有任何冗余,任何一块盘损坏 = 整个阵列数据全毁
- 适用:临时盘、编译缓存、可随时重建的数据。生产重要数据别用
RAID 1:安全第一
磁盘1: [A][B][C][D] 磁盘2: [A][B][C][D] ← 一模一样- 优点:坏一块盘,另一块顶上,数据零丢失,业务不中断
- 缺点:容量利用率只有 50%,两块 1T 只能用 1T
- 适用:系统盘、数据库日志盘、小容量但高可靠的场景
RAID 5:容量与安全的折中(最常用)
磁盘1: [D1][D4][D7][P3] 磁盘2: [D2][D5][P2][P4] 磁盘3: [D3][P1][D6][D8] ↑ 校验块 P 轮流放,不固定占一块盘- 3 块盘能存 2 块的量((N-1)/N),坏任意一块都能用剩余盘+校验算回来
- 缺点:写性能有开销(读-改-写校验);重建期间再坏一块就全完
- 适用:文件服务器、通用存储
RAID 6:RAID 5 的加强版
- 两组独立校验,允许同时坏两块盘
- 大容量盘时代重建慢,RAID 5 重建窗口风险高,所以大容量阵列推荐 RAID 6
- 代价:可用容量再少一块,写开销更大
RAID 10:先组镜像,再拼条带
镜像组1: 盘1 + 盘2 镜像组2: 盘3 + 盘4 [A1][A2][A3][A4] 条带化横跨两个镜像组- 先两两做 RAID 1,再把镜像组做 RAID 0 条带
- 优点:读飞快、写也快,坏盘最多坏每组一块,重建快(只需同步组内一块)
- 缺点:容量利用率 50%,盘数要求偶数且 ≥4
- 适用:数据库、虚拟化等高并发随机读写场景
口诀:0 是速度、1 是保险、5 是折中、6 是双保险、10 是既要又要。
1.3 软件 RAID 实战(mdadm)
生产上可能是硬件 RAID 卡(系统看到的是一块逻辑盘),但云主机/物理机没有 RAID 卡时,用 Linux 内核自带的mdadm做软件 RAID。
# 先看现有阵列状态cat/proc/mdstat lsblk# 用 3 块盘组 RAID 5(演示环境请确认 /dev/sdb1 等无重要数据)sudomdadm--create/dev/md0\--level=5--raid-devices=3\/dev/sdb1 /dev/sdc1 /dev/sdd1# 创建是后台异步的,看同步进度(等待 sync 完成再用)watch-n2cat/proc/mdstat格式化、挂载、持久化:
sudomkfs.ext4 /dev/md0sudomkdir-p/datasudomount/dev/md0 /data# 把阵列配置写进配置文件,重启不丢sudomdadm--detail--scan|sudotee-a/etc/mdadm.conf# fstab 持久挂载echo'/dev/md0 /data ext4 defaults 0 2'|sudotee-a/etc/fstab模拟坏盘与恢复(演练必备):
# 标记一块盘故障sudomdadm/dev/md0--fail/dev/sdb1# 热拔出sudomdadm/dev/md0--remove/dev/sdb1# 物理换一块新盘后,加回阵列,自动开始重建sudomdadm/dev/md0--add/dev/sdb1watch-n2cat/proc/mdstat# rebuild 进度注意:RAID 不是备份!RAID 防的是"磁盘损坏",防不了误删、逻辑错误和勒索病毒。重要数据仍要异地备份。
二、挂载时遇到"有内容"的目录怎么办
2.1 先说清楚为什么不能直接挂
mount 只是把新文件系统"盖"在挂载点上。原来目录里的文件并没有被删,只是被遮住了——卸载后它们还在。问题是:只要挂着,原内容就访问不到,业务大概率出错。
错误做法:
# 假设 /srv/ruoyi/data 里已有应用数据sudomount/dev/vg_ruoyi/lv_data /srv/ruoyi/data# 原内容被遮住!2.2 正确做法:临时目录搬家法
思路:先把新文件系统挂到一个临时空目录 → 把原目录内容整体搬进去 → 再卸下临时挂载,正式挂到目标点。
# ① 建一个临时挂载点sudomkdir-p/srv/ruoyi/data_old# ② 新文件系统先挂到临时点sudomount/dev/vg_ruoyi/lv_data /srv/ruoyi/data_old# ③ 把原目录内容整体拷进去(. 结尾 = 含隐藏文件;-a 保留权限/属主/时间戳)sudocp-a/srv/ruoyi/data/. /srv/ruoyi/data_old/ 或sudorsync-a/srv/ruoyi/data/. /srv/ruoyi/data_old/# ④ 人工核对内容无误、且已有备份后,再清空原目录sudorm-rf/srv/ruoyi/data/*# ⑤ 卸下临时点,正式挂到目标点sudoumount/srv/ruoyi/data_oldsudomount/dev/vg_ruoyi/lv_data /srv/ruoyi/data# ⑥ 验证ls-la/srv/ruoyi/data findmnt /srv/ruoyi/data几个容易踩的坑:
cp -a 源/. 目标/:.结尾才能连隐藏文件(如.env)一起拷;cp -a 源/*会漏掉隐藏文件- 不要跳过核对直接
rm -rf:先ls、diff -r或du -sh两边对比,确认搬家成功再删原内容 - 原内容只是被"遮住"不是消失,所以哪怕操作错了,
umount之后数据还能捞回来——但别赌,动手前备份 - 如果原目录内容极大,临时挂载点所在盘要放得下
三、空间满了?别只看 df -h,还有 inode 这个坑
磁盘空间报满,99% 的人第一反应是df -h看 block 用量。但有一种诡异情况:df -h显示还有好几个 G,却提示 “No space left on device”,新文件死活建不了。这时候多半是inode 满了。
3.1 block 和 inode 是两个东西
一个文件在磁盘上由两部分组成:
- inode:文件的"身份证",记录权限、属主、时间戳、数据块位置指针。每个文件(不管多大)都占 1 个 inode
- block(数据块):真正存文件内容的地方,常见 1K/2K/4K 一块
格式化时这两者的总量就固定了。正常情况下 block 先满,但海量小文件的场景(缓存目录、会话文件、邮件池)会先把 inode 耗尽。
3.2 两个命令分清是谁满了
# block 使用率:看 Use%df-Th# inode 使用率:看 IUse%df-i文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/vg_data-lv_data 50G 48G 2G 96% /data 文件系统 Inode IUse% 已用(I) 可用(I) 挂载点 /dev/mapper/vg_data-lv_data 3276800 3276800 100% 0 /data第二个输出就是典型inode 100% 爆满——block 明明还有 2G,但 inode 一个不剩。
3.3 inode 满了会怎样
- 创建新文件 → 报
No space left on device(哪怕 block 富余) - 往已有文件里追加内容 → 正常(老文件的 inode 已分配,追加只是补数据块)
- 表现很分裂:老日志还能继续写,新文件一个建不了,服务半死不活
口诀:block 满用
df -Th,inode 满用df -i;新建不行、追加可以,九成是 inode。
四、文件系统只读检查:e2fsck 与 xfs_repair
文件系统偶尔会因为掉电、强制关机出现不一致,表现是:分区变成只读、日志里刷I/O error/EXT4-fs error、或者启动卡在emergency mode。这时要用文件系统专属工具体检。
4.1 ext4:e2fsck
# 目标:/dev/vg_ruoyi/lv_data(ext4)sudoumount/srv/ruoyi/data# -n = 只检查不修改(对每个"要修吗"都回答 no),先摸清伤情sudoe2fsck-fn/dev/vg_ruoyi/lv_data# 确认检查结果可接受、且已备份后,真正去修sudoe2fsck-f-y/dev/vg_ruoyi/lv_data# 修完再挂回去sudomount/srv/ruoyi/data4.2 XFS:xfs_repair
XFS 的工具叫xfs_repair,没有-f(它默认全量检查),只读模式用-n:
sudoumount/var/log/ruoyisudoxfs_repair-n/dev/vg_ruoyi/lv_logsudomount/var/log/ruoyi4.3 铁律与解读
- 检查必须 umount(或系统未挂载该分区)!对已挂载的文件系统跑 fsck 等于边跑边改,神仙难救
-n只读体检先看报告:清不清楚Inode ... block bitmap differs、Checksum ... does not match这类条目,心里有数再决定修不修- ext4 元数据干净时默认跳过检查,想强制全量要加
-f - 根分区出问题进不了系统:开机 GRUB 界面按
e,linux行尾加init=/bin/bash(或rd.break)进救援,mount -o remount,rw /后再跑工具——启动恢复专题单独讲 - 修之前备份、修之前备份、修之前备份
五、已删除文件仍占空间:lsof 抓"鬼"
5.1 灵异现象
# 造一个 64M 的日志文件sudoddif=/dev/zeroof=/var/log/ruoyi/deleted-lab.logbs=1Mcount=64status=progress# tail -f 后台持续持有这个文件(模拟写日志的应用进程)sudotail-f/var/log/ruoyi/deleted-lab.log>/dev/null&# 删掉文件sudorm/var/log/ruoyi/deleted-lab.log# 诡异的事情发生了:空间没释放!df-h/var/log5.2 原理
Unix 删除文件的本质是断开目录项引用(unlink)。只要还有进程打开着这个文件(持有 fd),内核就不会真正释放它的数据块——文件从目录里"消失"了,但块还挂在进程身上,直到进程关闭句柄或退出。
5.3 揪出元凶并释放
# lsof +L1:列出"链接数小于 1"的已删除文件sudolsof+L1|grepdeleted-lab# 输出示例:# tail 1234 root 3w REG 253,0 67108864 12345 /var/log/ruoyi/deleted-lab.log (deleted)# ↑ PID ↑ fd# 处理方式一:重启/杀掉持有进程sudokill1234# 处理方式二:进程不能杀,就手动清空它的内容# sudo truncate -s 0 /proc/1234/fd/3 # Linux 可行# 或 > /proc/1234/fd/3# 处理完再看,空间回来了df-h/var/log常见场景:应用写日志,运维按老习惯
rm删日志腾空间,但应用还开着句柄继续写——空间永远不降。正确姿势是轮转/truncate,或者重启应用。所以上一期讲的 logrotatecopytruncate/postrotate才那么重要。
误删文件想恢复(ext 系列)可以提一句debugfs/extundelete,但生产环境别乱试——备份才是正经出路。
六、网络基础:从分层到一个数据包的旅程
前面磁盘告一段落。接下来正式进入网络。先建立世界观,再动手敲命令。
6.1 网络到底是怎么传输的
网络通信的本质:把数据切成小块(封包),每层协议往上面"贴标签"(封装),最后一层层撕掉(解封装)。
- 同一网段相通:两台主机 IP 前缀相同(如都在
192.168.1.0/24),中间经过交换机就能直达。发送方先ARP广播问出对方 MAC 地址,再把帧直接甩过去 - 不同网段相通:网络前缀不同(如
192.168.1.x找192.168.2.x),必须借道网关(路由器)。数据先送到网关,网关查路由表决定下一跳,一跳一跳接力到对端
# 看本机路由表:默认走哪个网关一目了然iproute show# default via 192.168.1.1 dev ens33 ← 不同网段的数据都交给它6.2 OSI 七层与 TCP/IP 四层
| OSI 七层 | TCP/IP 四层 | 典型协议 | PDU(协议数据单元) |
|---|---|---|---|
| 7 应用层 | 应用层 | HTTP、SSH、DNS、FTP | 数据 Data |
| 6 表示层 | (并入应用层) | TLS/SSL、编码加密 | 数据 Data |
| 5 会话层 | (并入应用层) | 会话管理 | 数据 Data |
| 4 传输层 | 传输层 | TCP、UDP | 段 Segment(TCP)/ 数据报(UDP) |
| 3 网络层 | 网际层 | IP、ICMP、ARP | 包 Packet |
| 2 数据链路层 | 网络接口层 | Ethernet、WiFi、PPP | 帧 Frame |
| 1 物理层 | 网络接口层 | 网线、光纤、电信号 | 比特 Bit |
记忆锚点:比特 → 帧 → 包 → 段 → 数据,从下往上念一遍就顺了。排错时按层自检:网线通不通(物理)→ MAC 通不通(链路)→ IP 通不通(网络)→ 端口通不通(传输)。
6.3 一个数据包跨网段的完整旅程
场景:主机 A(192.168.1.10/24)访问主机 B(192.168.2.20/24),网关是192.168.1.1。
① A 的应用层生成数据(比如一个 HTTP 请求) ↓ 每往下走一层,加一个"头" ② 传输层:加 TCP 头(源端口:随机,目的端口:80) → 段 Segment ③ 网络层:加 IP 头(源 192.168.1.10,目的 192.168.2.20)→ 包 Packet ④ A 判断:192.168.2.0 ≠ 192.168.1.0,不同网段! → 下一跳 = 默认网关 192.168.1.1 ⑤ 链路层:ARP 问出网关的 MAC,加帧头(源MAC:A,目的MAC:网关)→ 帧 Frame ⑥ 网卡把帧变成比特流 → 交换机 → 网关路由器 ⑦ 网关撕掉帧头、拆开 IP 包,查自己的路由表: "去 192.168.2.0/24 从 2 号口出去,下一跳是 ..." 重新封装(目标 MAC 换成 B 的 MAC 或下一跳 MAC),继续转发 ⑧ B 收到,逐层解封装: 链路层(MAC 是我)→ 网络层(IP 是我)→ 传输层(端口 80) → 应用层把数据交给 Web 服务 ⑨ B 的响应原路逆向返回 A关键理解:MAC 地址每一跳都换(变),IP 地址从头到尾不变(定)。这就是"逐跳寻址"与"端到端寻址"的分工。
6.4 查看接口与 MAC 地址
# 简洁版:一眼看所有接口和 IPip-bra# 看链路详情(含 MAC 地址、状态、MTU)iplinkshow ens33# 完整地址信息ipaddr show ens33[root@web ~]# ip -br a lo UNKNOWN 127.0.0.1/8 ens33 UP 192.168.1.10/24 [root@web ~]# ip link show ens33 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT link/ether 00:0c:29:8f:2a:1b brd ff:ff:ff:ff:ff:ff ↑ 这就是网卡的 MAC 地址(物理地址,出厂烧录)6.5 临时启停接口(重启网络不丢配置)
# 关闭接口sudoiplinksetens33 down# 启动接口sudoiplinksetens33 up# 顺手配个临时 IP(重启失效,测试用)sudoipaddradd192.168.1.100/24 dev ens33sudoiprouteadddefault via192.168.1.1⚠️SSH 远程操作千万别 down 自己的网卡,down 的瞬间 SSH 就断了,而且云主机 down 后你可能再也连不上。上面命令请在本地终端或带外管理口执行。
6.6 地址、前缀与"同网段"判断
IPv4 地址 32 位 =网络位 + 主机位,/24表示前 24 位是网络位、后 8 位是主机位(掩码255.255.255.0)。
判断两台主机是否同网段:各自算一遍"网络地址"(IP 与掩码做按位与),相等即同网段。
A: 192.168.1.10/24 → 网络地址 192.168.1.0/24 B: 192.168.1.200/24 → 网络地址 192.168.1.0/24 → 同网段,直连可达 C: 192.168.2.20/24 → 网络地址 192.168.2.0/24 → 不同网段,必须走网关一个 /24 网段的构成:192.168.1.0(网络地址,不可用)~192.168.1.255(广播地址,不可用),可用主机192.168.1.1 ~ 192.168.1.254。
6.7 配置主机地址:Netplan(Ubuntu 22.04+)
Ubuntu 从 18.04 之后用Netplan管理网络,配置写在/etc/netplan/下的 YAML 文件里。Netplan 只是"翻译官",底层交给systemd-networkd或NetworkManager执行。
# 看现有配置文件(文件名各机不同,常见 01-netcfg.yaml / 50-cloud-init.yaml)ls/etc/netplan/sudovim/etc/netplan/01-netcfg.yaml配置静态地址:
network:version:2renderer:networkdethernets:ens33:dhcp4:no# 关掉 DHCP,改静态addresses:-192.168.2.10/24# 静态 IP + 前缀routes:-to:default# 默认路由via:192.168.2.1# 网关nameservers:addresses:[223.5.5.5,114.114.114.114]# DNS应用配置(先用 try 再 apply,YAML 写错能自动回滚):
sudochmod600/etc/netplan/01-netcfg.yaml# 权限不对 netplan 会拒绝执行# try:应用后给 120 秒确认,没确认自动回滚——防配错把自己关外面sudonetplan try# 确认没问题sudonetplan apply# 验证ip-braiproute showping192.168.2.1YAML 对缩进极其敏感,只能空格不能 Tab。
netplan generate可以先做语法检查不实际应用。
6.8 配置主机名
# 查看当前主机名hostnamehostnamectl status# 设置(立即生效且持久化)sudohostnamectl set-hostname ruoyi-prod-01# 顺手更新 /etc/hosts,避免 sudo 执行时主机名解析慢sudovim/etc/hosts# 127.0.1.1 ruoyi-prod-01# 新开终端验证hostname集群/生产环境主机名要有规律(如
role-区域-序号),日志排查、监控告警都靠它认机器。
总结
这一期补完磁盘、开完网络的头:
- RAID:0 条带要快、1 镜像要稳、5 单校验折中、6 双校验更稳、10 镜像+条带;软件 RAID 用
mdadm管理,坏了--fail/--remove/--add走一遍重建流程。RAID 不是备份。 - 挂载有内容的目录:别直接盖!
mkdir临时点 → 先挂临时点 →cp -a 原/. 临时/搬家 → 核对备份后清空原目录 → 卸临时点、正式挂载。 - 空间满先分清楚:block 用
df -Th,inode 用df -i;inode 爆了会"新建不行、追加可以",定位小文件聚集地,格式化时用-N/-i预留。 - 文件系统只读检查:ext4 用
e2fsck -fn,XFS 用xfs_repair -n;必须 umount,先-n体检、备份后再真修。 - 已删除文件占空间:
rm只解引用,进程持句柄块就不释放;lsof +L1抓出来,杀进程或 truncate 释放。日志轮转/truncate 才是正确姿势。 - 网络分层:OSI 七层对 TCP/IP 四层,PDU 从下到上"比特→帧→包→段→数据";同网段 ARP 直连,跨网段交网关逐跳转发,MAC 每跳变、IP 不变。
- 网络命令:
ip -br a/ip link show看接口 MAC,ip link set up/down启停接口,同网段靠"IP 与掩码"判断,Ubuntu 用 Netplan 配静态 IP(netplan try防翻车),hostnamectl设主机名。
本文命令在 Rocky 9 / Ubuntu 22.04 思路一致,RAID 与网络部分各发行版通用。动手前对数据做备份,生产操作先演练。