Linux 存储系统:LVM 与直接分区

Linux 存储系统:LVM 与直接分区


〇、先建立一个整体认知:数据是如何落到磁盘上的

在深入细节之前,先记住 Linux 存储的"四层栈"。无论是直接分区还是 LVM,本质都是在这几层之间做排列组合:

复制代码
┌─────────────────────────────┐
│  应用层:你看到的目录 / /data │  ← 挂载点(Mount Point)
├─────────────────────────────┤
│  文件系统层:ext4 / xfs       │  ← 组织文件和目录的规则
├─────────────────────────────┤
│  逻辑层(可选):LVM 逻辑卷    │  ← LVM 就插在这一层
├─────────────────────────────┤
│  分区层:/dev/sda1 /dev/sda3 │  ← 分区表切出来的"段"
├─────────────────────────────┤
│  物理层:/dev/sda 整块硬盘    │  ← 真实的磁盘硬件
└─────────────────────────────┘
  • 直接分区:跳过"逻辑层",文件系统直接建在分区上。结构简单,但被物理边界锁死。
  • LVM:启用"逻辑层",文件系统建在逻辑卷上,与物理盘解耦。多一层抽象,换来极大的灵活性。

一、传统存储方式:直接使用分区

1. 工作原理详解

操作系统启动后,通过驱动识别到物理硬盘(如 /dev/sda),然后读取硬盘开头的分区表 ,分区表记录了"哪段扇区属于哪个分区"。内核根据分区表生成块设备节点(如 /dev/sda1/dev/sda2),管理员对分区格式化 (写入文件系统元数据)后挂载到某个目录,即可使用。

完整链路:

复制代码
识别硬盘 → 读取分区表 → 生成 /dev/sdXN → mkfs 格式化 → mount 挂载 → 写入 fstab 实现开机自动挂载

2. 分区表的两种格式:MBR 与 GPT

这是直接分区方案里必须了解的背景知识,它直接决定了分区的数量和容量上限:

对比项 MBR(传统) GPT(现代,UEFI 标配)
单盘最大容量 2TB(超出部分无法识别) 理论上 9.4ZB,实际无限制
主分区数量 最多 4 个(想多分区需用"扩展分区+逻辑分区"绕路) 通常 128 个,无需主/扩展之分
分区表位置 磁盘最开始的 512 字节,无备份 头部一份 + 尾部一份冗余备份
引导方式 传统 BIOS UEFI(也兼容 BIOS)
校验机制 CRC32 校验,分区表损坏可自愈

实践建议:新装机、新虚机一律用 GPT。云厂商的镜像默认也基本都是 GPT。

3. 典型结构

以一块 20G 的虚拟磁盘为例,Ubuntu Server 经典的手动分区方案:

复制代码
/dev/sda (物理硬盘 20G)
├── /dev/sda1 (1M,   BIOS Boot)   ← GPT 在 BIOS 引导下的兼容分区
├── /dev/sda2 (1G,   /boot)       ← 内核和引导文件
└── /dev/sda3 (19G,  /)           ← 根目录,存放系统和所有数据

查看这套结构最常用的三个命令:

bash 复制代码
lsblk                  # 树状展示磁盘与分区结构(最直观)
sudo fdisk -l          # 查看分区表详情(类型、起始扇区)
df -h                  # 查看各文件系统的容量使用情况

4. 局限性(为什么需要 LVM)

直接分区的所有痛点,都源于**"文件系统被焊死在物理分区上"**:

  • 僵化 :分区大小在创建时就定死了。想扩大 /dev/sda3?前提是其紧邻的后面恰好有空闲空间;否则只能备份数据 → 删除分区 → 重建 → 恢复数据,任何一步出错都是灾难。
  • 隔离 :多块硬盘的空间在逻辑上互不相通。假设 /data 在 sdb 上且已满,即使 sdc 还有 500G 空闲,也无法"借"给 /data 用。
  • 缺乏高级特性:没有快照(Snapshot),做备份只能整盘拷贝;无法在线把数据从一块旧盘迁移到新盘。
  • 扩容必须停机:多数调整操作需要卸载文件系统甚至进救援模式,对生产服务器不友好。

二、LVM(逻辑卷管理)核心概念

LVM(Logical Volume Manager)在物理存储和文件系统之间插入了一个"逻辑管理层",把物理盘变成可随意切割、合并、搬运的"空间池",从而打破物理边界的限制。

1. 三大核心组件(必记)

层级 名称 英文 角色比喻 对应设备 关键命令前缀
底层 物理卷 PV (Physical Volume) 砖头/土地 整块盘或分区(如 /dev/sda3/dev/sdb pv*(pvcreate / pvs)
中层 卷组 VG (Volume Group) 仓库/水池 存储池(如 ubuntu-vg vg*(vgcreate / vgs)
上层 逻辑卷 LV (Logical Volume) 房间/隔断 最终格式化使用的卷(如 ubuntu-lv lv*(lvcreate / lvs)

数据流向

复制代码
物理盘/分区 --(pvcreate)--> PV --(加入)--> VG(空间池) --(切割)--> LV --(mkfs+mount)--> 可用目录

2. 补充概念:PE(Physical Extent,物理扩展块)

原笔记没有提到这一点,但它是理解 LVM 的"计量单位":

  • VG 的空间并不是连续管理的,而是被切成一个个固定大小的小块,叫 PE ,默认大小通常是 4MB
  • 创建 LV 时,本质上就是"分配 N 个 PE 给这个 LV"。
  • 命令 lvcreate -L 10G 是"按容量分";lvcreate -l 2560 是"按 PE 个数分"(2560 × 4MB = 10G)。
  • 这就是为什么扩容命令里 -l +100%FREE 用的是小写 l------它的含义是"把 VG 里 100% 的空闲 PE 都加进来"。

3. 结合实例解析(来自你的系统)

在你的 Ubuntu 系统中,实际结构如下:

复制代码
/dev/sda (20G)
├── /dev/sda1 (1M,  BIOS Boot)
├── /dev/sda2 (1G,  /boot)          ← 独立分区,不在 LVM 里
└── /dev/sda3 (20G, PV)             ← 物理卷(砖头)
     └── ubuntu-vg (VG)             ← 卷组(仓库,容量约20G)
          └── ubuntu-lv (LV)        ← 逻辑卷(房间,目前只划了1G)
               └── / (挂载点)       ← 根目录
  • 关键点sda3 是"原材料",被 pvcreate 初始化并交给 ubuntu-vg 接管后,sda3 本身不再直接挂载 ,只作为空间提供者存在。你在 df -h 里永远看不到 sda3,只能看到映射后的 /dev/mapper/ubuntu--vg-ubuntu--lv
  • 现象解释lsblk 看到 sda3 有 20G,但 df -h / 只有 1G------这不是矛盾,而是因为剩下的 19G 还躺在卷组(VG)的**空闲空间(VFree)**里,没有被分配给任何逻辑卷。这是 Ubuntu Server 安装的默认行为(故意不把空间分完,留给管理员按需分配),也是新手最常困惑的地方。
进阶形态:第二块盘的分区也并入同一个卷组

场景 :根目录空间不够了,新加一块硬盘 /dev/sdb(30G),在其上建分区 sdb1,把 sdb1 也划给现有的 ubuntu-vg,让两块盘的空间汇进同一个"仓库"。

操作只需三条命令(详细流程见第三章"场景 B"):

bash 复制代码
sudo fdisk /dev/sdb                # 先在 sdb 上创建分区 sdb1(n → p → 回车到底 → w)
sudo pvcreate /dev/sdb1            # 1. sdb1 初始化为 PV
sudo vgextend ubuntu-vg /dev/sdb1  # 2. 把这块"新砖头"并入 ubuntu-vg 仓库
sudo vgs                           # 3. 验证:VSize 应从 20G 变成约 50G

扩容后的结构变为:

复制代码
/dev/sda (20G)
├── /dev/sda1 (1M,  BIOS Boot)
├── /dev/sda2 (1G,  /boot)          ← 独立分区,不在 LVM 里
└── /dev/sda3 (20G, PV) ───────┐
                               ├──→ ubuntu-vg (VG)   ← 仓库变大:20G + 30G ≈ 50G
/dev/sdb (30G)                 │        └── ubuntu-lv (LV)  ← 房间现在最多可隔到 50G
└── /dev/sdb1 (30G, PV) ───────┘             └── / (挂载点)
  • 核心变化ubuntu-vg 这个"仓库"里现在有两块砖sda3sdb1),总容量约 50G。对上层来说完全无感------LV 和文件系统看到的依然是一个整体空间。
  • LV 可以跨盘 :如果执行 sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv 把根目录扩到 50G,这个 LV 就会同时占用 sda 和 sdb 两块盘的空间。这正是直接分区做不到的事(一个分区永远无法跨越物理盘的边界)。
  • 风险提示:LV 跨盘后,两块盘变成了"一条绳上的蚂蚱"------任意一块盘损坏,整个 LV 的数据都可能受损。生产环境跨盘使用 LVM 时,底层通常先做 RAID 兜底。
  • 如何确认 LV 是否跨盘 :用 sudo lvdisplay -m /dev/ubuntu-vg/ubuntu-lv 查看 LV 的段(segment)分布,或更直观地:
bash 复制代码
sudo pvs -o+lv_name,seg_size     # 显示每个 PV 被哪些 LV 占用了多少空间

4. LVM 在系统中的设备路径

LV 有三个等价的路径,记住任何一个都能用:

复制代码
/dev/ubuntu-vg/ubuntu-lv                    ← 按 VG/LV 命名,最常用
/dev/mapper/ubuntu--vg--ubuntu--lv          ← Device Mapper 的实际节点
/dev/dm-0                                   ← 内核内部编号(不推荐手写)

注意 /dev/mapper/ 下名字里的双连字符 -- 是对原名单连字符的转义,不是笔误。


三、LVM 操作命令详解

1. 查看状态(诊断必备)

排查存储问题的"三板斧":lsblk 看结构 → vgs 看池子余量 → df -h 看实际用量。

功能 命令 重点关注列 说明
查看块设备树 lsblk SIZE、MOUNTPOINTS 最直观,先看这个建立全局观
查看物理卷 sudo pvs / sudo pvdisplay PV、VG、PFree 确认哪些盘/分区已被 LVM 接管
查看卷组 sudo vgs / sudo vgdisplay VSize、VFree VFree 就是还没分出去的空间
查看逻辑卷 sudo lvs / sudo lvdisplay LV、VG、LSize 看每个 LV 分到了多少
文件系统用量 df -h Use%、Avail 用户视角的实际可用空间
文件系统类型 lsblk -fblkid FSTYPE、UUID 决定扩容第二步用哪个命令

sudo vgs 的典型输出:

复制代码
  VG        #PV #LV #SN Attr   VSize   VFree
  ubuntu-vg   1   1   0 wz--n- <20.00g <19.00g

读法:这个卷组由 1 个 PV 组成,里面有 1 个 LV,总容量 20G,还有 19G 空闲

2. 从零创建一套 LVM(新加一块盘的完整流程)

场景 :给服务器新加了一块硬盘 /dev/sdb(50G),要挂载到 /data 使用。

bash 复制代码
# 第 0 步(可选):先在 sdb 上建一个占满整盘的分区 sdb1
# 也可以跳过分区,直接对整盘做 pvcreate /dev/sdb
sudo fdisk /dev/sdb        # 交互式:n → p → 回车到底 → w

# 第 1 步:把分区初始化为物理卷(盖个"LVM 专用"的章)
sudo pvcreate /dev/sdb1

# 第 2 步:创建卷组,把这个 PV 放进池子
sudo vgcreate data-vg /dev/sdb1

# 第 3 步:从池子里切一块 40G 出来做逻辑卷(故意留 10G 余量)
sudo lvcreate -L 40G -n data-lv data-vg

# 第 4 步:格式化文件系统
sudo mkfs.ext4 /dev/data-vg/data-lv

# 第 5 步:挂载
sudo mkdir -p /data
sudo mount /dev/data-vg/data-lv /data

# 第 6 步:写入 /etc/fstab,实现开机自动挂载(否则重启后丢失挂载)
echo '/dev/data-vg/data-lv /data ext4 defaults 0 2' | sudo tee -a /etc/fstab

为什么要留 10G 余量? 这正是 LVM 的优势:留着的空间不占地方、随时可追加。将来 /data 不够了,一条 lvextend 就能在线扩容,比一开始就分光更灵活。

3. 扩容流程(日常最高频操作)

场景 A:卷组里本来就有空闲空间(最常用)

ubuntu-vg 里的空闲空间全部分配给根目录:

bash 复制代码
# 1. 扩展逻辑卷 LV:把 VG 里 100% 的空闲 PE 加给这个 LV
sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv

# 2. 扩展文件系统:让 ext4 识别新增的容量(关键!漏了这步 df 不会变)
sudo resize2fs /dev/ubuntu-vg/ubuntu-lv

# 3. 验证
df -h /

重要:扩容永远是两步。 第一步 lvextend 扩的是"容器"(LV),第二步扩的是"容器里的文件系统"。只扩容器不扩文件系统,df -h 看到的还是旧容量。

场景 B:卷组没空间了,需要新加一块盘来扩

场景/data(在 data-vg 里)快满了,新加一块硬盘 /dev/sdc(100G)补充进去。

bash 复制代码
# 1. 新盘初始化为 PV(整盘直接用,不分区)
sudo pvcreate /dev/sdc

# 2. 把新 PV 加入已有的卷组 ------ 卷组容量立刻 +100G
sudo vgextend data-vg /dev/sdc

# 3. 把新增的空间扩给逻辑卷
sudo lvextend -l +100%FREE /dev/data-vg/data-lv

# 4. 扩展文件系统
sudo resize2fs /dev/data-vg/data-lv      # ext4 用这个
# sudo xfs_growfs /data                  # 如果是 xfs,用这个(参数是挂载点!)

全程在线完成,不需要卸载、不需要停机------这就是 LVM 对生产环境最大的价值。

对应到本笔记的实例 :第二章"进阶形态"一节演示的就是这个流程的变体------把新盘 /dev/sdb 上的分区 sdb1 通过 pvcreate + vgextend ubuntu-vg /dev/sdb1 并入系统自带的 ubuntu-vg,再将根目录 ubuntu-lv 扩容到吃满两块盘的空间。结构图和验证命令见该节。

文件系统扩容命令对照
文件系统 扩容命令 注意
ext4 resize2fs /dev/vg/lv 参数是设备路径,可在线扩
xfs xfs_growfs /挂载点 参数是挂载点 ;xfs 只支持扩容,不支持缩容

4. 缩容流程(高风险,谨慎操作)

缩容比扩容危险得多,因为必须先缩文件系统、再缩 LV,顺序不能反 ,且 ext4 缩容必须卸载(无法在线进行),xfs 干脆不支持。操作前务必备份:

bash 复制代码
# 1. 卸载
sudo umount /data
# 2. 强制检查文件系统(resize2fs 缩容前的硬性要求)
sudo e2fsck -f /dev/data-vg/data-lv
# 3. 先把文件系统缩到 30G(目标容量,不是减少量)
sudo resize2fs /dev/data-vg/data-lv 30G
# 4. 再把 LV 缩到 30G(必须与上一步一致)
sudo lvreduce -L 30G /dev/data-vg/data-lv
# 5. 重新挂载
sudo mount /dev/data-vg/data-lv /data

5. 数据在线迁移:pvmove

场景 :旧盘 /dev/sdb 快坏了/要淘汰,买了新盘 /dev/sdc,要求业务不中断地把数据搬过去。

bash 复制代码
sudo pvcreate /dev/sdc                    # 1. 新盘变 PV
sudo vgextend data-vg /dev/sdc            # 2. 加入同一个卷组
sudo pvmove /dev/sdb /dev/sdc             # 3. 在线搬运所有 PE(耗时长,但业务无感)
sudo vgreduce data-vg /dev/sdb            # 4. 把旧盘移出卷组
sudo pvremove /dev/sdb                    # 5. 擦掉 LVM 标签,旧盘可下架

6. 快照(Snapshot):秒级备份与回滚

场景:升级系统或动数据库前,先拍个快照,搞砸了一键还原。

bash 复制代码
# 1. 为 data-lv 创建一个 5G 的快照(COW 机制,只存变化的数据,秒级完成)
sudo lvcreate -L 5G -s -n data-snap /dev/data-vg/data-lv

# 2. 需要回滚时:卸载 → 合并快照 → 重新挂载
sudo umount /data
sudo lvconvert --merge /dev/data-vg/data-snap
sudo mount /dev/data-vg/data-lv /data

注意 :经典快照不是"另一份完整拷贝",它只记录原卷被改动的数据块。快照空间被写满后会自动失效,所以它适合短期保护(升级窗口期),不能替代真正的备份。

7. 删除流程(顺序与创建完全相反)

bash 复制代码
sudo umount /data                          # 1. 卸载(并删掉 fstab 里对应行!)
sudo lvremove /dev/data-vg/data-lv         # 2. 删 LV
sudo vgremove data-vg                      # 3. 删 VG
sudo pvremove /dev/sdb1                    # 4. 擦除 PV 标签

删 LV 前一定要记得清理 /etc/fstab,否则系统重启后可能因挂载失败而进入 emergency 模式。


四、LVM 与直接分区的核心区别

维度 直接分区 (Direct Partition) LVM (Logical Volume Manager)
灵活性 :分区大小固定,修改需重分区 :LV 大小随意调整,支持在线扩容
存储池 :一个分区绑定一块盘的一段 有 (VG):多块硬盘/分区可合并成一个大池子
跨盘能力 一个分区无法跨越多块物理盘 一个 LV 可以横跨多块盘(VG 里有多块 PV 时)
文件系统 直接位于分区之上 位于 LV 之上,屏蔽底层物理差异
扩容方式 依赖相邻空闲空间,常需停机 在线扩容,空间不足时可加盘再扩
缩容 几乎不可行(需重建) 可行但高风险(ext4 需离线,xfs 不支持)
快照 不支持(除非文件系统自身支持,如 btrfs/ZFS) 原生支持,秒级创建,便于备份回滚
数据迁移 难:需停机拷贝数据 pvmove 可在服务运行时迁移数据
复杂度 简单:结构扁平,排错容易 较高:涉及 PV/VG/LV 三层概念
启动依赖 极少,GRUB 直接识别 需要 Initramfs 加载 LVM 驱动才能挂载根分区
性能损耗 极微小(映射层开销可忽略)
适用场景 桌面系统、简单服务器、/boot 分区 服务器、虚拟化环境、云主机、数据库

五、常见故障排查手册

1. df -h 显示满了,但 vgs 还有大量 VFree

原因 :LV 没把 VG 的空间用完(Ubuntu 默认只分一小部分)。

解决 :执行"场景 A"扩容流程,一条 lvextend + 一条 resize2fs 搞定,不需要加硬盘。

2. df -h 满了,vgs 的 VFree 也是 0

原因 :物理空间真的用完了。

排查顺序

bash 复制代码
sudo du -xh --max-depth=1 / 2>/dev/null | sort -rh | head -20   # 找哪个目录最大
sudo lsof +L1                    # 找"已删除但仍被进程占用"的文件(日志常见)

解决:先清理(日志、apt 缓存、旧内核);确需扩容则走"场景 B"加盘流程。

3. 重启后进入 emergency mode,提示挂载失败

高频原因/etc/fstab 里写了已经删除的 LV,或某块盘没识别到。

解决 :输入 root 密码进入救援 shell,编辑 /etc/fstab 注释掉问题行,重启后再修复。

4. 云主机控制台扩容了磁盘,但系统里看不到新容量

云平台的"磁盘扩容"只扩大了底层设备,系统内还有三层要手动跟上:

bash 复制代码
# 1. 让分区吃到新增的空间(假设 sda 从 20G 扩到 50G,LVM 在 sda3 上)
sudo growpart /dev/sda 3
# 2. 让 PV 识别分区的新大小
sudo pvresize /dev/sda3
# 3. 扩 LV + 扩文件系统
sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
sudo resize2fs /dev/ubuntu-vg/ubuntu-lv

六、关键知识点总结(FAQ)

  1. 逻辑卷(LV)能脱离卷组(VG)存在吗?

    • 不能。LV 必须从 VG 中分配空间,就像房间必须从仓库里隔出来一样。LV 的大小上限就是所属 VG 的可用空间。
  2. 一个分区(PV)能属于多个卷组吗?

    • 不能 。一个分区(如 /dev/sda3)初始化为 PV 后,只能加入一个 VG。想换 VG,必须先用 pvmove 把数据迁走,再用 vgreduce 将其移出原 VG。
  3. 一个 LV 可以横跨多块硬盘吗?

    • 可以,而且这正是 LVM 的招牌能力。只要 VG 里有多个 PV,LV 就可以占用来自不同盘的空间。代价是:其中任何一块盘损坏,整个 LV 都可能受损(除非配合 RAID 使用)。
  4. 为什么 /boot 分区通常不放在 LVM 里?

    • 历史原因和启动简化。早期的 GRUB 不支持从 LVM 读取内核文件,引导程序必须能"裸读"内核。虽然新版 GRUB2 已支持,但为了兼容性和简化救援流程(进 LiveCD 后直接挂载就能修),Ubuntu 依然习惯将 /boot 设为独立的标准分区。
  5. LVM 会损失性能吗?

    • 极微小。LVM 的映射层只是查一张"逻辑块 → 物理块"的对照表,在现代 CPU 下开销几乎可以忽略,远低于它带来的灵活性收益。真正影响性能的是底层磁盘本身和是否做了条带化/RAID。
  6. lvextend-L-l 有什么区别?

    • -L(大写)按容量 指定:-L +10G(增加 10G)或 -L 50G(扩到 50G)。
    • -l(小写)按 PE 个数/百分比 指定:-l +100%FREE(吃光 VG 空闲空间)------最常用,不用自己算还剩多少。
  7. LVM 和 RAID 是一回事吗?

    • 不是 ,两者解决不同问题且经常组合使用。RAID 解决"冗余与性能"(坏一块盘数据不丢),LVM 解决"灵活管理"(空间随意切割分配)。典型生产架构:多块盘先做 RAID 组成 /dev/md0,再把 /dev/md0 做成 PV 建 LVM。
  8. 根分区用 LVM 后,进救援模式找不到卷怎么办?

    • LiveCD/救援环境里 LVM 卷组默认可能未激活,手动激活即可:
    bash 复制代码
    sudo vgscan            # 扫描所有卷组
    sudo vgchange -ay      # 激活(activate)所有 VG
    sudo mount /dev/ubuntu-vg/ubuntu-lv /mnt

七、学习路径与动手实验建议

循序渐进的实验清单(全部在虚拟机里完成,随便折腾):

阶段 实验内容 验证命令
① 观察 装好 Ubuntu Server(选 LVM 方案),观察默认结构 lsblksudo vgssudo lvs
② 基础扩容 把 VG 空闲空间扩给根目录 lvextend + resize2fs + df -h
③ 加盘入池 虚拟机设置里加一块新盘,加入现有 VG 再扩容 pvcreatevgextendlvextend
④ 独立卷组 再加一块盘,新建独立 VG/LV 挂到 /data,写 fstab 重启后 df -h 确认自动挂载
⑤ 快照演练 拍快照 → 故意删掉一些文件 → 合并快照回滚 文件回来了即成功
⑥ 迁移演练 模拟换盘:pvmove 把数据从旧盘搬到新盘 pvs 确认旧盘已空

日常养成的三个习惯:

  • lsblk 再动手 :对存储做任何操作前,先看清楚当前的树状结构,确认设备名没搞错(sdbsda 一字之差就是数据灾难)。
  • lsblkdf -h 分工:前者看"物理/逻辑结构"(空间属于谁),后者看"文件系统使用情况"(空间用了多少)。
  • 看到磁盘满先想 VFreedf -h 报满时,先 sudo vgs 看有没有空闲空间------有的话说明只是 LVM 没分配,一条命令就能解决,不必慌着加硬盘。
相关推荐
xexpertS3 小时前
CI/CD 熔断机制:如何通过编排级熔断器提升开发者效率
java·linux·运维
带娃的IT创业者3 小时前
突破内存瓶颈:利用 Nvidia GPU 显存作为 Linux Swap 空间的深度实践
linux·运维·服务器·nvidia·swap·gpu显存
zy happy4 小时前
VMware虚拟机添加新的硬盘
java·linux·jvm·docker
LCG元4 小时前
嵌入式开发踩坑排查实战:从 STM32 外设初始化到 Linux SPI 驱动的 15 类硬件疑难故障深度复盘
linux·stm32·单片机
FoldWinCard4 小时前
云原生 --- lvs
运维·服务器·lvs
代码AC不AC4 小时前
【Linux】Socket编程TCP
linux·tcp·socket编程
扛枪的书生4 小时前
SeaweedFS 学习总结
linux
minglie14 小时前
香橙派zero3配个iic屏显示ip
linux·学习
MXsoft6184 小时前
成熟的自动化运维平台是什么样的?
运维·数据库·自动化