☰
Day 12 Linux磁盘补充与网络基础实战
2026/10/14 19:16:48 网站建设 项目流程

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 02100%(N)无很快很快纯条带化,一块坏全盘丢
RAID 1250%(N/2)坏 1 块快一般纯镜像,两盘一模一样
RAID 53(N-1)/N坏 1 块快一般(写要算校验)分布式单校验
RAID 64(N-2)/N坏 2 块快更慢(双校验开销)分布式双校验
RAID 10450%(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/data

4.2 XFS:xfs_repair

XFS 的工具叫xfs_repair,没有-f(它默认全量检查),只读模式用-n:

sudoumount/var/log/ruoyisudoxfs_repair-n/dev/vg_ruoyi/lv_logsudomount/var/log/ruoyi

4.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/log

5.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.1

YAML 对缩进极其敏感,只能空格不能 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-区域-序号),日志排查、监控告警都靠它认机器。


总结

这一期补完磁盘、开完网络的头:

  1. RAID:0 条带要快、1 镜像要稳、5 单校验折中、6 双校验更稳、10 镜像+条带;软件 RAID 用mdadm管理,坏了--fail/--remove/--add走一遍重建流程。RAID 不是备份。
  2. 挂载有内容的目录:别直接盖!mkdir临时点 → 先挂临时点 →cp -a 原/. 临时/搬家 → 核对备份后清空原目录 → 卸临时点、正式挂载。
  3. 空间满先分清楚:block 用df -Th,inode 用df -i;inode 爆了会"新建不行、追加可以",定位小文件聚集地,格式化时用-N/-i预留。
  4. 文件系统只读检查:ext4 用e2fsck -fn,XFS 用xfs_repair -n;必须 umount,先-n体检、备份后再真修。
  5. 已删除文件占空间:rm只解引用,进程持句柄块就不释放;lsof +L1抓出来,杀进程或 truncate 释放。日志轮转/truncate 才是正确姿势。
  6. 网络分层:OSI 七层对 TCP/IP 四层,PDU 从下到上"比特→帧→包→段→数据";同网段 ARP 直连,跨网段交网关逐跳转发,MAC 每跳变、IP 不变。
  7. 网络命令: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 与网络部分各发行版通用。动手前对数据做备份,生产操作先演练。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询