RAID - 磁盘阵列,是一种将多个硬盘组成具有冗余能力的阵列设备进行使用的技术。磁盘阵列有软硬之分,通过操作系统中的软件实现的称为软阵列(Soft-RAID),由外置卡管理的称为硬阵列(RAID)。通常有以下几种模式:
- RAID 0:由 2 块以上的硬盘组成,容量为所有硬盘的容量之和,没有冗余和错误修复能力,磁盘性能和吞吐量最佳,阵列中任何一块硬盘发生损坏,整个阵列设备中的数据都将丢失。这种形式的磁盘阵列只适合存储那些安全要求最低的数据。
- RAID 1:由 2 块以上硬盘组成,最高可用容量为磁盘总容量的 50%,每块硬盘之间互做镜像,任何数据都会在阵列中的每一块硬盘上存取。磁盘利用率较低,性能和吞吐量较差,但冗余能力最佳。适合存储安全要求较高的重要数据。
- RAID 5:由 3 块以上硬盘组成,每块硬盘都有一部分空间被用户数据校验,实际会有一块硬盘容量的空间被用作数据校验,剩余的容量为可用存储,任何一块硬盘损坏不会丢失数据。这种模式兼顾了冗余和性能,适合存储安全性要求较高的数据。
- RAID 10:是由 2 个 RAID 1 组成的 RAID 0。这种形式即能获得 RAID 1 的冗余能力,又能获得 RAID 0 磁盘性能,可用容量为磁盘总容量的 50%。
配置磁盘阵列的过程中我们需要用到 parted
分区工具,和 mdadm
磁盘阵列管理工具,使用以下命令安装:
getnas@getnas:~$ sudo apt install parted mdadm
为了让系统能够妥善的识别我们创建的磁盘阵列,在开始之前应该先对磁盘进行分区。可以使用 parted
也可以使用 gdisk
。
以 /dev/sda
为例:
getnas@getnas:~$ sudo parted /dev/sda
GNU Parted 3.2
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted)
首先使用 p
命令查看该设备下是否存在旧分区,如果存在,使用 rm
命令将其删除。
(parted) p
Model: ATA ST1000DM003-9YN1 (scsi)
Disk /dev/sda: 1000GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
(parted)
确认设备中没有旧分区,使用 mkpart
命令创建新分区,在交互过程中使用采用以下设置,创建一个占用整个磁盘容量的新分区:
- Partition name:留空;
- File system type:输入
ext4
; - Start:分区的起始位置,输入
2048
; - End:分区的结束位置,输入
-1
代表硬盘的最末端;
(parted) mkpart
Partition name? []?
File system type? [ext2]? ext4
Start? 2048
End? -1
(parted)
分区完成后可以再次使用 p
命令,查看是否创建成功。以此类推,重复上述步骤为 /dev/sdb
等硬盘创建新分区。输入 q
退出程序。
接下来我们将 /dev/sda1
和 /dev/sdb1
这两个均为 1TB 的分区组成 RAID 1 磁盘阵列。
创建磁盘阵列使用 mdadm
命令附加必要的参数:
--create /dev/md0
:创建名为md0
的磁盘阵列设备;--level
:磁盘阵列类型raid1
或1
;--raid-devices
:指定该磁盘阵列由几个磁盘设备组成;/dev/sdX
:组成阵列的各个磁盘分区;
getnas@getnas:~$ sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1
mdadm: Note: this array has metadata at the start and
may not be suitable as a boot device. If you plan to
store '/boot' on this device please ensure that
your boot-loader understands md/v1.x metadata, or use
--metadata=0.90
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
看到 Continue creating array?
交互信息时输入 y
或 yes
确认。
这样就完成了 RAID 1 磁盘阵列的创建。
mdadm
命令后跟磁盘阵列设备名,即可查看最基本的设备信息:
getnas@getnas:~$ sudo mdadm /dev/md0
/dev/md0: 931.39GiB raid1 2 devices, 0 spares. Use mdadm --detail for more detail.
如果想查看更详尽的信息,可以在命令中添加 --detail
参数:
getnas@getnas:~$ sudo mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Wed Sep 13 22:02:33 2017
Raid Level : raid1
Array Size : 974630912 (929.48 GiB 998.02 GB)
Used Dev Size : 974630912 (929.48 GiB 998.02 GB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Intent Bitmap : Internal
Update Time : Wed Sep 13 22:02:43 2017
State : clean, resyncing
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Resync Status : 0% complete
Name : getnas:0 (local to host getnas)
UUID : 7ab3a467:4d1f7403:a38385b4:eca86e95
Events : 2
Number Major Minor RaidDevice State
0 8 1 0 active sync /dev/sda1
1 8 17 1 active sync /dev/sdb1
从输出的信息中可以看到,磁盘阵列的名称(Name)为 getnas:0
,你的磁盘阵列名称可能与此处的不同,请使用实际的名称。
目前设备的路径名仍然为 /dev/md0
,但当我们重新启动系统以后,设备名就会变成 /dev/md/getnas:0
。此处,我们以重启之前进行格式化和挂载举例。
第一步 格式化分区
使用 mkfs.ext4
命令格式化分区:
getnas@getnas:~$ sudo mkfs.ext4 /dev/md0
创建含有 243657728 个块(每块 4k)和 60915712 个inode的文件系统
文件系统UUID:a80571bc-345c-4a62-9dd3-22f98c63f679
超级块的备份存储于下列块:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000, 214990848
正在分配组表: 完成
正在写入inode表: 完成
创建日志(262144 个块)完成
写入超级块和文件系统账户统计信息: 已完成
第二步 创建挂载目录
在挂载分区之前,先确认是否创建了 /mnt/storage
目录,如果没有请执行以下命令创建:
getnas@getnas:~$ sudo mkdir /mnt/storage
第三步 手动挂载分区
getnas@getnas:~$ sudo mount /dev/md0 /mnt/storage
第四步 设置目录所有权
使用 chown
命令,将 /mnt/storage
目录的所有者指定为 getnas
。请使用你在安装系统时实际创建的账户名替换该用户名:
getnas@getnas:~$ sudo chown getnas /mnt/storage
使用 nano
编辑器打开配置文件 /etc/fstab
:
getnas@getnas:~$ sudo nano /etc/fstab
在配置文件的最后添加一行:
/dev/md/getnas:0 /mnt/storage ext4 auto 0 0
注意:请将分区名称中的
getnas:0
替换成你真实的磁盘阵列名。
编辑完成以后,配置文件开起来应该类似这样,其中 #
开头的行为注释:
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/sda1 during installation
UUID=a915e0e5-6249-42ec-8be0-2624f3511275 / ext4 errors=remount-ro 0 1
/dev/sr0 /media/cdrom0 udf,iso9660 user,noauto 0 0
/dev/md/getnas:0 /mnt/storage ext4 auto 0 0
重新启动系统,使用 df -h
命令即可查看分区挂载情况。
这里我们额外增加了两块 1TB 硬盘,NAS 服务器上现在有 4 块容量相同的硬盘,使用 fdisk
命令查看:
getnas@getnas:~$ sudo fdisk -l
Disk /dev/sda: 7.5 GiB, 8004304896 bytes, 15633408 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x77d811ad
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 13537279 13535232 6.5G 83 Linux
Disk /dev/sdb: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 809807E5-A4BA-4CD7-B9C7-7C1707EE9229
Device Start End Sectors Size Type
/dev/sdb1 2048 1953525134 1953523087 931.5G Linux RAID
Disk /dev/sdc: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 4336065F-D40A-4683-A837-B854017AC3CF
Device Start End Sectors Size Type
/dev/sdc1 2048 1953525134 1953523087 931.5G Linux RAID
Disk /dev/sdd: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: A3858B91-4DD2-4E7B-8D35-C495261CAEF6
Device Start End Sectors Size Type
/dev/sdd1 2048 1953525134 1953523087 931.5G Linux RAID
Disk /dev/sde: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 8AFB74C8-204E-44D9-926E-C9D8F8E3DDFD
Device Start End Sectors Size Type
/dev/sde1 2048 1953525134 1953523087 931.5G Linux RAID
注意,从 /dev/sdb
到 /dev/sde
这四个硬盘都按照前面的要求进创建了 Linux RAID
类型的分区。
创建 RAID 5 磁盘阵列同样要使用 mdadm
命令:
--create
:指定要创建的磁盘阵列设备路径名/dev/md0
;--level
:磁盘阵列级别,输入raid5
或5
;--raid-devices
:指定磁盘阵列由几块硬盘组成;/dev/sdX1
:组成磁盘阵列个各个硬盘分区;
getnas@getnas:~$ sudo mdadm --create /dev/md0 --level=5 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
查看磁盘阵列详细信息:
getnas@getnas:~$ sudo mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Mon Sep 18 21:47:42 2017
Raid Level : raid5
Array Size : 2929890816 (2794.16 GiB 3000.21 GB)
Used Dev Size : 976630272 (931.39 GiB 1000.07 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent
Intent Bitmap : Internal
Update Time : Mon Sep 18 21:52:43 2017
State : clean, degraded, recovering
Active Devices : 3
Working Devices : 4
Failed Devices : 0
Spare Devices : 1
Layout : left-symmetric
Chunk Size : 512K
Rebuild Status : 3% complete
Name : getnas:0 (local to host getnas)
UUID : ac9b5a09:b9f60a20:6eaf053f:01cb1080
Events : 61
Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 33 1 active sync /dev/sdc1
2 8 49 2 active sync /dev/sdd1
4 8 65 3 spare rebuilding /dev/sde1
从输出可以看到,我们创建的 RAID 5 级别的磁盘阵列,可用容量为 3000 GB,已用容量为 1000 GB。从最下方的设备列表中也可以看到,最后一块硬盘状态为 spare rebuilding
即用于磁盘阵列数据冗余的。
这里创建的 RAID 5 级别磁盘阵列与前面创建的 RAID 1 磁盘阵列设备名称,格式化方式和自动挂载方式完全相同,此处不再重复介绍。