存储架构
自从玩了群晖,实际探索了解群晖的存储管理,才知道原来就是Raid+LVM部署的存储。而存储里面SHR用得最多,这个结构实际上还是raid1。用于存放共享文件夹的存储空间,实际上就是LVM上面的逻辑分区。
群晖在创建存储池支持SHR、Basic、JBOD,在Linux层面,它们都是raid技术,就是Raid Level的区别,它们在底层存储上的区别如下:
格式 | 级别 |
SHR | Raid1,驱动盘至少1个,多于1个可以转换为镜像或者复制,带有冗余数据 |
Basic | Raid1,但驱动盘只有一个,无冗余数据 |
JBOD | linear(连续存储),合并多个驱动盘为一个逻辑卷,每个盘连接存储,无数据冗余 |
而存储池,实际上就是LVM,在群晖中,LVM中的PV由软RAID形成的设备来承担,形成了RAID+LVM的存储架构。
一些群晖存储概念
名称 | 英文名 & 术语 | 对应Linux文件 | 群晖存储信息 |
存储空间 | storage space / space | /volumeX | space到pool的对应关系(每个vgX对应volumeX (存储于vg meta中) |
存储池 | storage pool / pool | /dev/mdX & /dev/vgX | pool的LVM、RAID信息(存储于space map中) |
磁盘 | disk | /dev/sdX | 存储上层信息(具体格式未明) |
存储应用
在群晖中与数据相关的是存储空间,存储空间就是LVM上的LV(逻辑分区),而存储池就是LVM上的VG(存储组),LVM中的PV由mdadm生成的md设备(软raid设备)。
熟悉linux的大佬,可以使用mdadm
命令行工具直接操作raid设备,如删减软raid的分区,加入或者删除硬盘,而且这些操作都可以在线操作,不需要关机。
典型的应用
- 扩容存储空间以及存储池
- 修复存储管理器的一些报错,如原来存储池由两块硬盘承担存储任务,现在想减到一块盘,只能使用
mdadm
命令来处理,当然如果不减也可以,就是存储管理器会报存储池堪用
状态。 - 精细化调节各数据的分布,可惜了,群晖的lvm不能使用
pvmove
,使得一些空间数据迁移任务处理不了。
管理命令
在存储的处理中,当一块新的硬盘插入硬盘笼开始,群晖调用sfdisk
处理分区的划分,调用mdadm
生成raid1设备,调用lvm
生成PV,再生成VG,再生成LV,最终形成可用的存储空间用于共享文件夹、软件管理器以及各种应用的存储需要。
上面的过程,可以查看/var/log/space_operation.log
典型应用
列举Raid状态信息
root:~# cat /proc/mdstat
Personalities : [raid1] [linear]
md2 : active raid1 sde5[0]
1948683456 blocks super 1.2 [1/1] [U]
md1 : active raid1 sdb2[0]
2097088 blocks [6/1] [U_____]
md0 : active raid1 sdb1[0]
8388544 blocks [6/1] [U_____]
unused devices: <none>
root:~# mdadm -D /dev/md2
/dev/md2:
Version : 1.2
Creation Time : Fri Mar 29 22:39:43 2019
Raid Level : raid1
Array Size : 1948683456 (1858.41 GiB 1995.45 GB)
Used Dev Size : 1948683456 (1858.41 GiB 1995.45 GB)
Raid Devices : 1
Total Devices : 1
Persistence : Superblock is persistent
Update Time : Fri Jun 30 18:38:17 2023
State : clean
Active Devices : 1
Working Devices : 1
Failed Devices : 0
Spare Devices : 0
Name : XF_NAS:2
UUID : f71342c7:7103fb6c:96a35f3e:8f21894c
Events : 16293
Number Major Minor RaidDevice State
0 8 69 0 active sync /dev/sde5
列举LVM状态信息
root:~# lvm pvs
PV VG Fmt Attr PSize PFree
/dev/md2 vg2 lvm2 a-- 1.81t 404.00m
root:~# lvm vgs
VG #PV #LV #SN Attr VSize VFree
vg2 1 2 0 wz--n- 1.81t 404.00m
root:~# lvm vgs
VG #PV #LV #SN Attr VSize VFree
vg2 1 2 0 wz--n- 1.81t 404.00m
消除存储池堪用警报
当所创建的存储池使用两块硬盘承载的时候,从硬盘笼中抽出其中一块,这个时候就会看到以下的报错。
如果这个存储池以后只想使用一块硬盘来承载,那就需要对存储池进行降级。命令如下
mdadm --grow --raid-devices=1 --force /dev/md2
# 我的存储池2由md2承载,可以使用lvm vgs列出
# lvm pvs
PV VG Fmt Attr PSize PFree
/dev/md2 vg2 lvm2 a-- 1.81t 404.00m
这个mdadm降级命令实际上就是强制设置/dev/md2设备的硬盘数为1,这样群晖中的存储池状态就变成良好。
创建与移除存储分区
从群晖硬盘操作日志文件/var/log/space_operation.log
观察到的日志,其实也是sfdisk
、mdadm
、lvm
命令的综合运用。
创建Basic类型的MD设备
mdadm --create /dev/md4 --run --level=1 --raid-devices=1 /dev/sdc5
创建存储区
/sbin/sfdisk --fast-delete 3:128 /dev/sdb
/sbin/sfdisk --fast-delete 3:128 /dev/sdb
/sbin/sfdisk -N3 -uS -q -f -j262144 -z9830560 -tfd -F /dev/sdb
/sbin/mdadm --zero-superblock /dev/sdb3
/sbin/mdadm -C /dev/md3 -e 1.2 -amd --assume-clean -R -l1 -f -n1 -x0 /dev/sdb3
/bin/dd if=/dev/zero of=/dev/md3 bs=512 count=1 status=none
/sbin/pvcreate -ff -y --metadatasize 512K /dev/md3
/sbin/vgcreate --physicalextentsize 4m /dev/vg1 /dev/md3
/sbin/lvcreate /dev/vg1 -n syno_vg_reserved_area --size 12M
移除存储区
/sbin/vgremove -f /dev/vg1
/sbin/pvremove -ff -y /dev/md3
/sbin/mdadm -S /dev/md3
/sbin/mdadm --zero-superblock /dev/sdb3
向md设备添加硬盘分区
mdadm管理的粒度其实是以分区为主的,如想指定两个分区来当系统分区和swap分区的镜像与复制,命令如下:
# 创建两个新的分区,需要加入raid,则使用以下命令
# mdadm --add /dev/md0 /dev/sde1
# mdadm --add /dev/md1 /dev/sde2
以上两条命令的前期是sde1
、sde2
这两个新分区的大小比原有的分区大,其中md0
为群晖root
分区所在,md1
为swap
设备。
从md设备里面移除指定的某个硬盘
先向软raid设备md指定坏盘,然后再移除坏盘
手工指定坏盘
# ./mdadm /dev/md2 --fail /dev/sdb
手工移盘
# ./mdadm /dev/md2 --remove /dev/sdb
两条命令合并在一起
# ./mdadm /dev/md2 --fail /dev/sdb --remove /dev/sdb
缩容存储空间与存储池
有一个用例,当新的硬盘的分区布局与原来组raid的那个硬盘不一致导致其中一个盘最大的空间比原来raid里面的分区空间要小,这样的一个新的分区就加入不了raid,解决方法,要么就换个更大的硬盘,要么原来raid的空间要缩容。
这次记录一下一次尝试缩容,切记数据一定要备份好,数据一定要备份好,数据一定要备份好,重要的事说三次。
由于群晖基于Raid+Lvm,那么一般的缩容思路:缩小数据分区大小(btrfs filesystem resize) > 缩小LV大小 > 缩小PV大小 > 缩小MD设备大小,大概的命令以下
列出btrfs的devid: btrfs filesystem show
缩小btrfs大小:btrfs filesystem resize 1:-100G /volume2 # 其中1为devid
缩小LVM LV大小:sudo lvm lvresize -L 50G /dev/vg2/volume_2
缩小MD大小:mdadm --grow /dev/md2 -z 1896254656 # 这个大小是byte单位 这是1.8T
移动LVM PV数据:sudo lvm pvmove /dev/md3 /dev/md4
删除VG中的PV:sudo vgreduce vg2 /dev/md3
群晖Linux平台一些局限
- 不支持pvmove,导致vg里面的pv数据无法移动到另一个md,如果想移动数据,只能借助完整的lvm软件,lvresize也没有独立的命令,不过这些命令确实都是高危操作。
# lvm pvmove
/bin/modprobe: execvp failed: No such file or directory
/bin/modprobe failed: 2
Required device-mapper target(s) not detected in your kernel
- 想到再补
群晖自带的高级磁盘命令
群晖在/usr/syno/sbin下放了大量管理命令,其中有一部分为存储管理命令
synodisk
:管理底层物理磁盘synostgdisk
:管理存储池中,disk的激活与否(对应菜单停用磁盘)synostgpool
:新建存储池synostgreclaim
:空间回收synostgtask
:存储空间任务管理,应该可以用来暂停一些任务synostgvolume
:优雅版存储空间卸载工具synostorage
:核心回调synospace
:存储空间管理
参考资料
- sfdisk(scripted fdisk): 与fdisk的功能一致,但前者设计于脚本化处理的硬盘工具,后者设计于命令行交互式处理的硬盘工具
- mdadm:一个命令行工具,用于管理和配置软件 RAID(Redundant Array of Independent Disks)阵列。提供了一系列命令和选项,用于执行各种管理和维护操作,如创建 RAID 阵列、添加和删除磁盘、监控和故障排除、数据恢复。
- LVM:用于在 Linux 系统上管理磁盘空间的技术
Pingback: 群晖的SSD Cache原理 - 日常记录