linux/存储管理.md
2025-03-25 20:10:28 +08:00

24 KiB
Raw Blame History

存储管理


一:基本分区

1. 分区方式

  • MBR分区主引导记录MBRMaster Boot Record
    1. 支持最大的磁盘容量 < 2TB
  • GPT分区全局唯一标识分区表GUID Partition Table

2. 创建分区

MBR 分区方式

工具:fdisk

# 查看磁盘列表
[root@wxin ~]# fdisk -l

# 创建分区:
[root@wxin ~]# fdisk /dev/sdb         # 启动分区工具
命令(输入 m 获取帮助)n                # 新建分区
Partition type:
   p   primary (0 primary, 0 extended, 4 free)   # 主分区
   e   extended                                  # 扩展分区
Select (default p): p                  # 选择主分区
分区号 (1-4默认 1)                  # 默认回车
起始 扇区 (2048-10485759默认为 2048) # 默认回车
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-10485759默认为 10485759)+1G                         # 输入分区大小
分区 1 已设置为 Linux 类型,大小设为 1 GiB

命令(输入 m 获取帮助)w                 # 保存分区信息
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@wxin ~]# partprobe /dev/sdb      # 刷新分区表
[root@wxin ~]# fdisk -l /dev/sdb       # 查看分区结果

磁盘 /dev/sdb5368 MB, 5368709120 字节10485760 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理)512 字节 / 512 字节
I/O 大小(最小/最佳)512 字节 / 512 字节
磁盘标签类型dos
磁盘标识符0x7ebdf7b5

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     2099199     1048576   83  Linux

常用命令:
n - 创建新分区
d - 删除分区
p - 查看分区表
t - 修改分区类型例如将分区设为Linux swap的82
w - 保存并退出

GPT 分区方式

工具gdisk

[root@wxin ~]# gdisk /dev/sdc                  # 启动分区工具
Command (? for help): n                        # 创建新分区
Partition number (1-128, default 1):           # 默认回车
First sector (34-10485726, default = 2048) or {+-}size{KMGTP}:   # 默认回车 
Last sector (2048-10485726, default = 10485726) or {+-}size{KMGTP}: +2G # 输入磁盘大小
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300):          # 默认回车
Changed type of partition to 'Linux filesystem'

Command (? for help): p                        # 查看磁盘信息
Disk /dev/sdc: 10485760 sectors, 5.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 33461B34-CB6D-4B38-B148-E2FC057F30BF
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 10485726
Partitions will be aligned on 2048-sector boundaries
Total free space is 6291389 sectors (3.0 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         4196351   2.0 GiB     8300  Linux filesystem

Command (? for help): w                       # 保存分区信息

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdc.
The operation has completed successfully.
[root@wxin ~]# partprobe /dev/sdc   # 刷新分区表


常用命令:
n - 新建分区
w - 保存退出

3. 格式化与挂载分区

格式化分区

# 格式化为xfsCentOS 7默认
[root@wxin ~]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=65536 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=262144, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0


# 格式化为ext4
[root@wxin ~]# mkfs.ext4 /dev/sdb2
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 262144 blocks
13107 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376

Allocating group tables: 完成                            
正在写入inode表: 完成                            
Creating journal (8192 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

手动挂载分区

# 创建挂载点目录
[root@wxin ~]# mkdir /mnt/sdb1

# 临时挂载
[root@wxin ~]# mount /dev/sdb1 /mnt/sdb1

# 卸载分区
[root@wxin ~]# umount /mnt/sdb1

永久挂载

获取分区的UUID

[root@wxin ~]# blkid /dev/sdb1
/dev/sdb1: UUID="52cd25d2-fc4f-4c9a-a9ab-18c86391f8ce" TYPE="xfs"

编辑/etc/fstab,添加以下行:

[root@wxin ~]# vim /etc/fstab
UUID=52cd25d2-fc4f-4c9a-a9ab-18c86391f8ce /mnt/sdb1 xfs defaults 0 0

应用配置:

[root@wxin ~]# mount -a

二:逻辑卷 LVM

逻辑卷管理Logical Volume Manager, LVM 是一种灵活的存储管理方式,允许动态调整磁盘空间、合并多个物理磁盘的容量,并支持快照和卷扩展等高级功能。

1. LVM 核心概念

术语:

  • 物理卷PVPhysical Volume物理磁盘或分区/dev/sdb1),需初始化为 LVM 可用的物理卷。
  • 卷组VGVolume Group有多个物理卷PV组成的存储池VG 的容量是所有 PV 的总合。
  • 逻辑卷LVLogical Volume从卷组VG中划分的逻辑存储单元可动态调整大小类似传统分区。
  • 物理扩展PEPhysical ExtentLVM 管理的最小存储单元(默认 4MB用于分配和扩展逻辑卷。

2. LVM 基本操作

创建逻辑卷

# 初始化物理卷将分区或磁盘设为PV
[root@wxin ~]# pvcreate /dev/sdb4

# 查看物理卷
[root@wxin ~]# pvs
  PV         VG     Fmt  Attr PSize   PFree 
  /dev/sdb4         lvm2 ---   <2.00g <2.00g

[root@wxin ~]# pvscan
  PV /dev/sda2   VG centos          lvm2 [<19.00 GiB / 0    free]
  PV /dev/sdb4                      lvm2 [<2.00 GiB]
  Total: 2 [<21.00 GiB] / in use: 1 [<19.00 GiB] / in no VG: 1 [<2.00 GiB]

[root@wxin ~]# pvdisplay
  "/dev/sdb4" is a new physical volume of "<2.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb4
  VG Name               
  PV Size               <2.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               VENObl-2fk8-vQf3-3xyE-aNJK-I5LZ-RHX7iC

# 创建卷组VG将PV加入VG
[root@wxin ~]# vgcreate vg /dev/sdb4
  Volume group "vg" successfully created

# 查看卷组
[root@wxin ~]# vgs
  VG     #PV #LV #SN Attr   VSize   VFree 
  vg       1   0   0 wz--n-  <2.00g <2.00g

[root@wxin ~]# vgscan
  Reading volume groups from cache.
  Found volume group "vg" using metadata type lvm2

[root@wxin ~]# vgdisplay
  --- Volume group ---
  VG Name               vg
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <2.00 GiB
  PE Size               4.00 MiB
  Total PE              511
  Alloc PE / Size       0 / 0   
  Free  PE / Size       511 / <2.00 GiB
  VG UUID               ahZ9N2-U8vr-fX8R-n9Xl-bPVe-kQmo-o7E2uP

# 从VG中创建逻辑卷LV
[root@wxin ~]# lvcreate -n lv -L 1G vg
  Logical volume "lv" created.

# 或使用剩余所有空间:
[root@wxin ~]# lvcreate -n lv2 -l 100%Free vg
  Logical volume "lv2" created.

# 查看逻辑卷
[root@wxin ~]# lvs
  LV   VG     Attr       LSize    Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv   vg     -wi-a-----    1.00g                                                    
  lv2  vg     -wi-a----- 1020.00m                                                    

[root@wxin ~]# lvscan
  ACTIVE            '/dev/vg/lv' [1.00 GiB] inherit
  ACTIVE            '/dev/vg/lv2' [1020.00 MiB] inherit

[root@wxin ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/vg/lv
  LV Name                lv
  VG Name                vg
  LV UUID                j5RSvc-2aSh-1GN2-JKOf-LPyg-R6n4-cqodjy
  LV Write Access        read/write
  LV Creation host, time wxin, 2025-03-25 13:25:54 +0800
  LV Status              available
  # open                 0
  LV Size                1.00 GiB
  Current LE             256
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2
   
  --- Logical volume ---
  LV Path                /dev/vg/lv2
  LV Name                lv2
  VG Name                vg
  LV UUID                hPMJg9-ZWDM-xzvE-tFfG-KDPe-x2KZ-zjzPUp
  LV Write Access        read/write
  LV Creation host, time wxin, 2025-03-25 13:26:24 +0800
  LV Status              available
  # open                 0
  LV Size                1020.00 MiB
  Current LE             255
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:3


# 格式化逻辑卷如XFS
[root@wxin ~]# mkfs.xfs /dev/vg/lv
meta-data=/dev/vg/lv             isize=512    agcount=4, agsize=65536 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=262144, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

# 挂载逻辑卷
[root@wxin ~]# mkdir /mnt/lv
[root@wxin ~]# mount /dev/vg/lv /mnt/lv

删除逻辑卷

# 查看所有逻辑卷
[root@wxin ~]# lvs

# 或查看详细信息
[root@wxin ~]# lvdisplay

# 检查挂载点
[root@wxin ~]# mount | grep <LV名称或挂载点>

# 卸载
[root@wxin ~]# umount /mnt/vg-lv 

# 删除指定逻辑卷
[root@wxin ~]# lvremove /dev/vg/lv

# 查看卷组详细信息
[root@wxin ~]# vgdisplay vg

# 删除卷组
[root@wxin ~]# vgremove vg

# 删除物理卷
[root@wxin ~]# pvremove /dev/sdb4

扩展逻辑卷

# 添加物理卷
[root@wxin ~]# pvcreate /dev/sdb3

# 扩展卷组
[root@wxin ~]# vgextend vg /dev/sdb3

# 查看卷组
[root@wxin ~]# vgs
  VG     #PV #LV #SN Attr   VSize   VFree
  vg       2   1   0 wz--n-   2.99g 1.99g
  
# 扩展逻辑卷
[root@wxin ~]# lvextend -L +1G /dev/vg/lv 

[root@wxin ~]# df -hT
文件系统                类型      容量  已用  可用 已用% 挂载点
/dev/mapper/vg-lv       ext4      976M  2.6M  907M    1% /mnt/vg-lv

# 扩展文件系统
[root@wxin ~]# resize2fs /dev/vg/lv

[root@wxin ~]# df -hT
文件系统                类型      容量  已用  可用 已用% 挂载点
/dev/mapper/vg-lv       ext4      2.0G  3.0M  1.9G    1% /mnt/vg-lv

三:交换分区 SWAP

1. 交换分区的类型

类型 说明
交换分区 独立的磁盘分区(类型为828200
交换文件 文件形式的虚拟交换空间,无需分区
LVM逻辑卷 将逻辑卷LV格式化为交换空间灵活性更高

2. 创建交换空间

创建交换分区

# 创建分区
[root@wxin ~]# fdisk /dev/sdc

# 格式化交换分区
[root@wxin ~]# mkswap /dev/sdc1

# 激活交换分区
[root@wxin ~]# swapon /dev/sdc1

# 永久挂载
[root@wxin ~]# blkid /dev/sdc1
[root@wxin ~]# vim /etc/fstab
UUID=3a412f3b-3877-4984-b9c0-2464f047c65e none swap defaults 0 0

创建交换文件

# 生成交换文件
[root@wxin ~]# fallocate -l 4G /swapfile

[root@wxin ~]# dd if=/dev/zero of=/swapfile bs=1M count=4096

# 设置权限并格式化
[root@wxin ~]# chmod 600 /swapfile
[root@wxin ~]# mkswap /swapfile

# 激活并永久挂载
[root@wxin ~]# swapon /swapfile
[root@wxin ~]# echo "/swapfile none swap defaults 0 0" | sudo tee -a /etc/fstab

使用 LVM 逻辑卷

# 创建逻辑卷
[root@wxin ~]# pvcreate /dev/sdb2
[root@wxin ~]# vgcreate vg2 /dev/sdb2
[root@wxin ~]# lvcreate -n lv_swap -L 500M vg2

# 格式化为交换空间
[root@wxin ~]# mkswap /dev/vg2/lv_swap
[root@wxin ~]# swapon /dev/vg2/lv_swap

# 永久挂载
[root@wxin ~]# blkid /dev/vg2/lv_swap
[root@wxin ~]# vim /etc/fstab
UUID=7d7b8efd-2009-4e6b-8d78-03aab7097460 none swap defaults 0 0

3. 禁用或删除交换分区

临时禁用

[root@wxin ~]# swapoff /dev/sdb1   # 分区或逻辑卷
[root@wxin ~]# swapoff /swapfile   # 交换文件

永久删除

  • 禁用交换分区:

    [root@wxin ~]# swapoff /swapfile
    
  • 删除文件或分区:

    [root@wxin ~]# rm -f /swapfile                # 删除交换文件
    [root@wxin ~]# lvremove /dev/vg_data/lv_swap  # 删除逻辑卷
    
  • 清理/etc/fstab中的对应条目。

4. 查看交换空间状态

# 查看所有交换设备/文件
free -h
swapon -s
cat /proc/swaps

四:文件系统

EXT4 文件系统

EXT4Fourth Extended File System 是 Linux 系统中最广泛使用的日志文件系统。支持最大单个文件为16TB。

名词

组块Block Groups是Ext4文件系统的核心管理单元将整个存储空间划分为多个逻辑分区每个组块独立管理元数据和数据块旨在提升性能、减少碎片并增强可靠性。

组块的结构

  • 超级快Superblock存储全局文件系统信息如总块数、块大小、Inode总数、挂载状态等。
  • 组描述符Group Descriptor记录组块内部资源分配状态如空闲块数、空闲Inode数、块位图位置等。
  • 快位图Block Bitmap标记组块内每个数据块的使用状态1位表示1个块0=空闲1=已用)。
  • 索引节点Inode存储文件的元数据权限、时间戳、大小、数据块指针等
  • 数据块Block存储文件的实际内容(二进制数据、目录条目等)
# 查看索引节点
[root@wxin ~]# df -i

# 查看数据块
[root@wxin ~]# df -k

一个文件或目录占用一个inode一个文件占用一个或多个block

五:文件链接

1. 定义

特性 硬链接Hard Link 软链接Symbolic Link
本质 直接指向文件的 Inode 指向文件的 路径名(类似快捷方式)
创建命令 ln 源文件 硬链接名 ln -s 源文件 软链接名
Inode 关系 与原文件 共享同一 Inode 独立 Inode,存储源文件路径字符串
文件类型 普通文件(ls -l 显示无特殊标记) 特殊文件(ls -l 显示 l 类型,如 lrwxrwxrwx

2. 关键区别

1. 跨文件系统支持

  • 硬链接仅限同一文件系统同一块磁盘分区。原因为Inode编号仅在文件系统内唯一。
  • 软连接:可跨文件系统(甚至指向网络路径)

2. 目录链接

  • 硬链接:不允许用户创建目录的硬链接
  • 软连接:可指向目录

3. 源文件删除的影响

  • 硬链接:删除原文件后,硬链接仍可访问数据(只要存在至少一个硬链接)。
  • 软连接原文件删除后软链接变为“悬空链接”Dangling Link访问报错。

4. 文件属性同步

  • 硬链接:所有硬链接共享同一 Inode修改权限、时间戳等属性会同步。
  • 软连接:自身属性(如权限、时间戳)独立,与目标文件无关。

3. 示例

创建与验证

# 创建原文件
[root@wxin ~]# echo "hello world" > original.txt

# 创建硬链接
[root@wxin ~]# ln original.txt hardlink.txt

# 创建软链接
[root@wxin ~]# ln -s original.txt softlink.txt

# 查看 Inode 和链接数
[root@wxin ~]# ls -li
35586588 -rw-r--r--. 2 root root         12 3月  25 19:47 hardlink.txt
35586588 -rw-r--r--. 2 root root         12 3月  25 19:47 original.txt
33830562 lrwxrwxrwx. 1 root root         12 3月  25 19:48 softlink.txt -> original.txt

观察点:硬链接与原文件 Inode 相同1050323链接数均为 2软链接有独立 Inode1050324

删除原文件

[root@wxin ~]# rm -rf original.txt 

# 访问硬链接(正常)
[root@wxin ~]# cat hardlink.txt 
hello world

# 访问软链接(报错)
[root@wxin ~]# cat softlink.txt 
cat: softlink.txt: 没有那个文件或目录

RAID独立磁盘冗余阵列

RAIDRedundant Array of Independent Disks通过组合多个物理磁盘提升存储系统的性能、容量和可靠性。

1. 常见 RAID 对比

RAID 级别 最小磁盘数 容错能力 存储利用率 读写性能 典型应用场景
RAID 0 2 无冗余 100% 读写性能最优 临时数据、高速缓存
RAID 1 2 允许1块磁盘故障 50% 读性能优,写性能一般 关键数据镜像(如系统盘)
RAID 5 3 允许1块磁盘故障 (N1)/N(N1)/N 读优,写需计算奇偶校验 通用文件存储、数据库
RAID 6 4 允许2块磁盘故障 (N2)/N(N2)/N 读优,写性能较差 大容量归档存储
RAID 10 4 每组镜像允许1块故障 50% 读写性能优 高并发事务处理、虚拟化

2. 核心原理

1. RAID 0条带化

  • 原理数据分块Striping后轮询写入多个磁盘。
  • 优势:最大化吞吐量(理论速度 = 单盘速度 × 磁盘数)。
  • 风险:任一磁盘故障导致全部数据丢失。
  • 示例4 块磁盘的 RAID 0存储利用率 100%,容量 = 4×单盘容量。

2. RAID 1镜像

  • 原理数据完全复制到所有成员盘Mirroring
  • 优势:高可靠性,读操作可并行(多副本)。
  • 缺点存储效率低50%),写性能受限于最慢磁盘。
  • 变体RAID 1E支持奇数磁盘的镜像

3. RAID 5分布式奇偶校验

  • 原理数据与奇偶校验块Parity分布式存储在所有磁盘。
    1. 奇偶校验块位置轮换如磁盘1存块1的校验磁盘2存块2的校验等
  • 校验计算异或XOR或更复杂的算法如 Reed-Solomon
  • 重建:故障盘数据通过剩余磁盘的校验和数据恢复。
  • 缺点写惩罚Write Penalty每次写入需更新校验块。

4. RAID 6双分布式奇偶校验

  • 原理:类似 RAID 5但使用两种独立校验如 P+Q 校验)。
  • 优势:容忍双盘故障,适合大容量磁盘(降低重建失败风险)。
  • 缺点:存储利用率更低,写性能进一步下降。

5. RAID 10条带化镜像

  • 原理先镜像RAID 1再条带化RAID 0
    • 磁盘分为多组镜像对,数据条带化写入各组。
  • 优势:高读写性能与容错能力的平衡。
  • 示例4 块磁盘的 RAID 10 分为两组镜像每组2块容量 = 2×单盘容量。

3. 软 RAID 示例

[root@wxin ~]# ll /dev/sd*
brw-rw----. 1 root disk 8,  0 3月  25 17:03 /dev/sda
brw-rw----. 1 root disk 8,  1 3月  25 17:03 /dev/sda1
brw-rw----. 1 root disk 8,  2 3月  25 17:03 /dev/sda2
brw-rw----. 1 root disk 8, 16 3月  25 17:03 /dev/sdb
brw-rw----. 1 root disk 8, 32 3月  25 17:03 /dev/sdc
brw-rw----. 1 root disk 8, 48 3月  25 17:03 /dev/sdd
brw-rw----. 1 root disk 8, 64 3月  25 17:03 /dev/sde

# 创建RAID
[root@wxin ~]# mdadm -C /dev/md0 -l5 -n3 -x1 /dev/sd{b,c,d,e}
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

# 格式化
[root@wxin ~]# mkfs.ext4 /dev/md0
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=128 blocks, Stripe width=256 blocks
655360 inodes, 2618880 blocks
130944 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=2151677952
80 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: 完成                            
正在写入inode表: 完成                            
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成 

# 挂载
[root@wxin ~]# mkdir /mnt/raid5
[root@wxin ~]# mount /dev/md0 /mnt/raid5/

# 查看RAID 信息
[root@wxin ~]# mdadm -D /dev/md0 
/dev/md0:
           Version : 1.2
     Creation Time : Tue Mar 25 20:04:36 2025
        Raid Level : raid5
        Array Size : 10475520 (9.99 GiB 10.73 GB)
     Used Dev Size : 5237760 (5.00 GiB 5.36 GB)
      Raid Devices : 3
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Tue Mar 25 20:05:53 2025
             State : clean 
    Active Devices : 3
   Working Devices : 4
    Failed Devices : 0
     Spare Devices : 1

            Layout : left-symmetric
        Chunk Size : 512K

Consistency Policy : resync

              Name : wxin:0  (local to host wxin)
              UUID : 2cd876a1:70d7ba7a:efd30b04:a91143c0
            Events : 20

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       4       8       48        2      active sync   /dev/sdd

       3       8       64        -      spare   /dev/sde