文章目录
- 场景1:LVM(dm-linear,最常用本地存储路由)
- [场景2:DM-Multipath 多路径存储路由(SAN存储,重点)](#场景2:DM-Multipath 多路径存储路由(SAN存储,重点))
-
- 完整部署(Ubuntu/CentOS通用)
-
- [1. 安装multipath工具](#1. 安装multipath工具)
- [2. 生成multipath主配置文件](#2. 生成multipath主配置文件)
- [3. 加载内核模块,启动服务](#3. 加载内核模块,启动服务)
- [4. 扫描存储LUN,生成多路径虚拟设备](#4. 扫描存储LUN,生成多路径虚拟设备)
- [5. 查看存储路由信息](#5. 查看存储路由信息)
- 场景3:纯dmsetup手动自定义DM映射(原生底层,不推荐生产,适合学习)
- 存储路由常用排查命令汇总
前置概念回顾
DM在内核块层拦截bio块IO请求,查询映射表,转发到后端物理块设备。
查看DM设备基础命令:
bash
lsblk
dmsetup ls
dmsetup table
场景1:LVM(dm-linear,最常用本地存储路由)
LVM底层就是dm-linear,把多个物理磁盘PV组织成VG卷组,再划分LV逻辑卷(DM虚拟设备 /dev/mapper/vgname-lvname)。
IO路由:应用→文件系统→LV(dm) →映射到多个PV磁盘。
步骤
- 准备裸磁盘,例如
/dev/sdb /dev/sdc(无分区、无文件系统)
bash
# 创建PV(物理卷)
pvcreate /dev/sdb
pvcreate /dev/sdc
# 创建VG卷组,把2块盘加入
vgcreate vg_data /dev/sdb /dev/sdc
# 创建LV逻辑卷(例如20G)
lvcreate -L 20G -n lv_data vg_data
生成虚拟块设备:
/dev/mapper/vg_data-lv_data
- 查看DM底层存储路由映射表
bash
dmsetup table vg_data-lv_data
输出示例:
0 41943040 linear 8:16 0
含义:从逻辑块0开始,总41943040块,线性映射到设备主从号8:16(/dev/sdb),偏移0。如果跨多块盘,会有多条映射条目。
- 格式化+挂载使用
bash
mkfs.ext4 /dev/mapper/vg_data-lv_data
mkdir /data
mount /dev/mapper/vg_data-lv_data /data
-
开机自动挂载(写入/etc/fstab)
/dev/mapper/vg_data-lv_data /data ext4 defaults 0 0
扩容场景:新增磁盘做成PV,
vgextend加到VG,lvextend扩容LV,DM会自动更新存储路由映射表。
场景2:DM-Multipath 多路径存储路由(SAN存储,重点)
适用:服务器HBA卡连SAN,同一个存储LUN,多条光纤链路,系统识别出多个sd设备(/dev/sdb /dev/sdc),实际是同一个LUN 。
multipath内核模块dm-multipath:多条物理路径合并为1个虚拟设备 /dev/mapper/mpathX,配置路径调度策略(轮询/主备)实现存储路由负载均衡、链路故障自动切换。
完整部署(Ubuntu/CentOS通用)
1. 安装multipath工具
bash
# Ubuntu
apt install multipath-tools -y
# CentOS/RHEL
dnf install device-mapper-multipath -y
2. 生成multipath主配置文件
bash
# CentOS
mpathconf --enable
# Ubuntu默认自带 /etc/multipath.conf,如不存在手动新建
编辑配置文件 /etc/multipath.conf
conf
defaults {
user_friendly_names yes # 使用mpathX友好命名
path_selector "round-robin 0" # 路由策略:round-robin轮询;failover主备
path_grouping_policy multibus
failback immediate
no_path_retry fail
}
# 识别你的存储厂商LUN,可添加blacklist屏蔽本地磁盘,防止本地盘被误纳入multipath
blacklist {
devnode "^(sr|hd|vd|nvme)"
}
path_selector存储路由策略:round-robin 0:轮询,IO请求轮流分发所有可用链路,存储负载均衡;failover:主备,只用优先级最高主路径,主链路断,自动切备用链路(数据库SAN常用)。
3. 加载内核模块,启动服务
bash
modprobe dm-multipath
modprobe dm-round-robin
systemctl enable --now multipathd
4. 扫描存储LUN,生成多路径虚拟设备
bash
multipath -v2
5. 查看存储路由信息
bash
# 查看多路径拓扑(重点,查看每条路径状态)
multipath -ll
# 查看dm-multipath底层映射表
dmsetup table mpath0
输出可以看到:虚拟设备mpath0,后端多条路径,IO按照path_selector策略路由分发。
之后,使用/dev/mapper/mpath0作为存储设备 ,不要直接使用底层/dev/sdb、/dev/sdc。
可以在mpath之上继续做LVM:pvcreate /dev/mapper/mpath0,叠加多层存储路由。
场景3:纯dmsetup手动自定义DM映射(原生底层,不推荐生产,适合学习)
直接用dmsetup手动编写存储路由映射表,不依赖LVM工具。
示例:把/dev/sdb前10G映射为虚拟设备myvol
bash
# 创建映射:起始块0,块数量20971520,linear映射 /dev/sdb,偏移0
echo "0 20971520 linear /dev/sdb 0" | dmsetup create myvol
# 查看路由表
dmsetup table myvol
# 删除映射
dmsetup remove myvol
这种方式配置不会持久化,重启失效;生产用LVM/multipath,自动管理dm映射。
存储路由常用排查命令汇总
bash
lsblk # 查看块设备拓扑,识别dm虚拟设备
dmsetup ls # 列出所有dm设备
dmsetup table [设备名] # 查看底层IO映射路由(最重要)
multipath -ll # 查看SAN多路径路由状态
cat /proc/dmstats # DM IO统计
iostat /dev/mapper/xxx # 查看虚拟设备IO负载
blktrace # 抓底层bio请求,追踪IO路由链路