日常记录

群晖的磁盘管理初探

存储架构

自从玩了群晖,实际探索了解群晖的存储管理,才知道原来就是Raid+LVM部署的存储。而存储里面SHR用得最多,这个结构实际上还是raid1。用于存放共享文件夹的存储空间,实际上就是LVM上面的逻辑分区。

群晖在创建存储池支持SHR、Basic、JBOD,在Linux层面,它们都是raid技术,就是Raid Level的区别,它们在底层存储上的区别如下:

格式级别
SHRRaid1,驱动盘至少1个,多于1个可以转换为镜像或者复制,带有冗余数据
BasicRaid1,但驱动盘只有一个,无冗余数据
JBODlinear(连续存储),合并多个驱动盘为一个逻辑卷,每个盘连接存储,无数据冗余
正常使用群晖默认的类型就足够了,一般默认使用SHR,或者Basic,Basic可以转换为SHR。

而存储池,实际上就是LVM,在群晖中,LVM中的PV由软RAID形成的设备来承担,形成了RAID+LVM的存储架构。

一些群晖存储概念

名称英文名 & 术语对应Linux文件群晖存储信息
存储空间storage space / space/volumeXspace到pool的对应关系(每个vgX对应volumeX (存储于vg meta中)
存储池storage pool / pool/dev/mdX & /dev/vgXpool的LVM、RAID信息(存储于space map中)
磁盘disk/dev/sdX存储上层信息(具体格式未明)

存储应用

在群晖中与数据相关的是存储空间,存储空间就是LVM上的LV(逻辑分区),而存储池就是LVM上的VG(存储组),LVM中的PV由mdadm生成的md设备(软raid设备)。

熟悉linux的大佬,可以使用mdadm命令行工具直接操作raid设备,如删减软raid的分区,加入或者删除硬盘,而且这些操作都可以在线操作,不需要关机。

典型的应用

  1. 扩容存储空间以及存储池
  2. 修复存储管理器的一些报错,如原来存储池由两块硬盘承担存储任务,现在想减到一块盘,只能使用mdadm命令来处理,当然如果不减也可以,就是存储管理器会报存储池堪用状态。
  3. 精细化调节各数据的分布,可惜了,群晖的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观察到的日志,其实也是sfdiskmdadmlvm命令的综合运用。

创建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

以上两条命令的前期是sde1sde2这两个新分区的大小比原有的分区大,其中md0为群晖root分区所在,md1swap设备。

从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平台一些局限

  1. 不支持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
  1. 想到再补

群晖自带的高级磁盘命令

群晖在/usr/syno/sbin下放了大量管理命令,其中有一部分为存储管理命令

  • synodisk:管理底层物理磁盘
  • synostgdisk:管理存储池中,disk的激活与否(对应菜单停用磁盘)
  • synostgpool:新建存储池
  • synostgreclaim:空间回收
  • synostgtask:存储空间任务管理,应该可以用来暂停一些任务
  • synostgvolume:优雅版存储空间卸载工具
  • synostorage:核心回调
  • synospace:存储空间管理

参考资料

  1. sfdisk(scripted fdisk): 与fdisk的功能一致,但前者设计于脚本化处理的硬盘工具,后者设计于命令行交互式处理的硬盘工具
  2. mdadm:一个命令行工具,用于管理和配置软件 RAID(Redundant Array of Independent Disks)阵列。提供了一系列命令和选项,用于执行各种管理和维护操作,如创建 RAID 阵列、添加和删除磁盘、监控和故障排除、数据恢复。
  3. LVM:用于在 Linux 系统上管理磁盘空间的技术
Exit mobile version