前言

实验室最近又新添置了两台服务器,一台偏向计算,一台偏向存储。存储的这台服务器,出厂竟然还没装系统,机房服务器上架的时候问安装人员,说忘了……索性就自己研究了一下 IPMI 远程装机的操作方式,装了个 Ubuntu 20.04 上去,鉴于网络认证之类的东西还需要 GUI,就没有装服务器版。另外由于还有三块 16T 机械硬盘,ZFS 这个东西不熟就没折腾,在安装的时候选择了 LVM。

一、LVM 简介

逻辑卷管理(Logical volume management,LVM),为电脑中的大量存储设备(Mass storage devices)提供更有弹性的硬盘分割方式。它是一种抽象化存储技术,实现的方式,根据操作系统而有所不同。基本上,它是在驱动程序与操作系统之间增加一个逻辑层,以方便系统管理硬盘分割系统。

(摘自Wikipedia 逻辑卷管理

二、磁盘维护

考虑到服务器后续还要继续加装硬盘,先组 raid 后挂载 lvm 的方式扩展起来麻烦一点,单纯做存储也不是很考虑存储速度,所以就采用了在 lvm 的基础上做 raid 的方案。

  1. 硬盘分区

    传统的fdisk命令仅支持最大 2T 分区的创建,16T 硬盘分区需要使用parted命令。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # 查询硬盘信息,默认情况下新硬盘应该是 sdb、sdc、sdd依次排列
    lsblk -o name,size,fstype,type,mountpoint
    # 查询硬盘挂载点,默认情况下应该是/dev/sdb、/dev/sdc、/dev/sdd依次排列
    sudo fdisk -l
    # 使用parted进行分区(其他两块硬盘同理)
    sudo parted /dev/sdb
    > GNU Parted 3.3
    > Using /dev/sdb
    > Welcome to GNU Parted! Type 'help' to view a list of commands.
    > (parted) mklabel gpt # 设置为GPT分区表
    > (parted) mkpart p 0% 100% # 全盘设置一个分区,不要使用"mkpart p 0 -1",会提示分区未对齐
    > (parted) print # 检查分区情况,默认分区标号应该是1
    > Model: ATA TOSHIBA MG08ACA1 (scsi)
    > Disk /dev/sdb: 16.0TB
    > Sector size (logical/physical): 512B/4096B
    > Partition Table: gpt
    > Disk Flags:
    >
    > Number Start End Size File system Name Flags
    > 1 1049kB 16.0TB 16.0TB p
    > (parted) toggle 1 lvm # 将当前分区标记为lvm

    其余硬盘也进行相同操作,最后使用partprobe命令使系统重新识别分区表。

  2. 物理卷(PV)创建

    分区完成后,使用pvcreate命令创建用于 lvm 管理的基本物理卷。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    sudo pvcreate /dev/sdb1
    > Physical volume "/dev/sdb1" successfully created.
    sudo pvcreate /dev/sdc1
    > Physical volume "/dev/sdc1" successfully created.
    sudo pvcreate /dev/sdd1
    > Physical volume "/dev/sdd1" successfully created.
    sudo pvscan # 检查物理卷创建情况
    > PV /dev/sda2 VG vgubuntu lvm2 [893.75 GiB / 0 free]
    > PV /dev/sdb1 lvm2 [14.55 TiB]
    > PV /dev/sdc1 lvm2 [14.55 TiB]
    > PV /dev/sdd1 lvm2 [14.55 TiB]
    > Total: 4 [44.53 TiB] / in use: 1 [893.75 GiB] / in no VG: 3 [<43.66 TiB]
  3. 卷组(VG)创建

    基于物理卷,将三块硬盘构建为卷组

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    sudo vgcreate vg_data /dev/sdb1 /dev/sdc1 /dev/sdd1 # 创建卷组
    > Volume group "vg_data" successfully created
    sudo vgdisplay vg_data # 检查卷组信息
    > --- Volume group ---
    > VG Name vg_data
    > System ID
    > Format lvm2
    > Metadata Areas 3
    > 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 3
    > Act PV 3
    > VG Size <43.66 TiB
    > PE Size 4.00 MiB
    > Total PE 11444733
    > Alloc PE / Size 0 / 0
    > Free PE / Size 11444733 / <43.66 TiB
    > VG UUID 4ism44-rf5M-IfNk-ZhVs-dmjb-bQAf-nV1QsH
  4. 逻辑卷(LV)创建

    这一步将进行逻辑卷和 raid 的创建,在 lvm 中创建 raid 只需要通过--type指定 raid 类型即可。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    sudo lvcreate -n lv_data -l 100%FREE --type=raid5 vg_data
    > Using default stripesize 64.00 KiB.
    > Rounding size (11444733 extents) down to stripe boundary size (11444732 extents)
    > Logical volume "lv_data" created.
    sudo lvdisplay vg_data/lv_data #检查逻辑卷信息
    > --- Logical volume ---
    > LV Path /dev/vg_data/lv_data
    > LV Name lv_data
    > VG Name vg_data
    > LV UUID Pqmdyk-zkzE-TvjZ-1N6U-fsf5-S01p-mUCr8L
    > LV Write Access read/write
    > LV Creation host, time node02, 2023-03-30 21:52:14 +0800
    > LV Status available
    > # open 0
    > LV Size <29.11 TiB
    > Current LE 7629820
    > Segments 1
    > Allocation inherit
    > Read ahead sectors auto
    > - currently set to 768
    > Block device 253:8
  5. 文件系统创建与自动挂载

    文件系统的选择一般有 ext4 和 xfs 两种,可以根据生成需求自行确定,这里选择 zfs 作为文件系统。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    sudo apt install xfsprogs # 安装zfs工具
    sudo mkfs.xfs /dev/vg_data/lv_data # 该步骤等待时间较长,30t空间耗时在5分钟左右
    > meta-data=/dev/vg_data/lv_data isize=512 agcount=32, agsize=244154224 blks
    > = sectsz=4096 attr=2, projid32bit=1
    > = crc=1 finobt=1, sparse=1, rmapbt=0
    > = reflink=1
    > data = bsize=4096 blocks=7812935168, imaxpct=5
    > = sunit=16 swidth=32 blks
    > naming =version 2 bsize=4096 ascii-ci=0, ftype=1
    > log =internal log bsize=4096 blocks=521728, version=2
    > = sectsz=4096 sunit=1 blks, lazy-count=1
    > realtime =none extsz=4096 blocks=0, rtextents=0
    sudo mkdir /mnt/data # 创建挂载点,可根据需求进行修改
    sudo mount /dev/vg_data/lv_data /mnt/data # 挂载
    df -h # 检查挂载结果
    > /dev/mapper/vg_data-lv_data 30T 208G 29T 1% /mnt/data

    mount命令挂载的硬盘会在重启后失效,开机自动挂载需要修改/etc/fstab文件,添加挂载信息如下。

    • 第一个参数 /dev/vg_data/lv_data 是要挂载的分区或存储设备,这里是一个逻辑卷的内核名称。
    • 第二个参数 /mnt/data 是挂载位置,也就是分区或存储设备在文件系统中的路径。
    • 第三个参数 xfs 是文件系统类型,也就是分区或存储设备使用的格式。
    • 第四个参数 defaults 是挂载选项,表示使用文件系统的默认参数,例如 rw, suid, dev, exec, auto, nouser, async 等。
    • 第五个参数 0 是 dump 参数,表示是否使用 dump 工具备份该分区或存储设备,0 表示不备份,1 表示备份。
    • 第六个参数 2 是 pass 参数,表示是否使用 fsck 工具检查该分区或存储设备,0 表示不检查,1 表示优先检查,2 表示次优先检查。
    1
    /dev/vg_data/lv_data /mnt/data xfs defaults 0 2
  6. 性能测试

    最后使用dd命令对磁盘性能进行了测试,结果不是很理想,不过能用就行。

    1
    2
    sudo dd if=/dev/vg_data/lv_data of=/dev/null bs=1M count=1024
    > 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 16.8916 s, 63.6 MB/s

三、杂记

在之前的博客服务器操作指北(1)DenyHosts中提过通过 denyhost 工具进行恶意访问屏蔽,但是该工具很长时间未更新了,目前从网上找到使用定时脚本进行屏蔽的方式,原文在参考链接中,记录脚本内容如下。

1
2
3
4
5
6
7
8
#!/bin/bash
#set -x
list=$(sudo lastb |awk '{print $3}'|sort |uniq -c|awk '{if ($1 > 4) print $2}')
for ip in ${list}
do
echo ALL: ${ip} >> /etc/hosts.deny #加入黑名单
echo > /var/log/btmp #清空失败记录,防止脚本下次执行重复统计IP
done

后续只需要配合定时任务即可。

1
2
3
crontab -e
#内容为每1小时执行一次脚本
* */1 * * * sudo bash /home/ubuntu/ssh_deny.sh

参考文档