首页 > 代码库 > 14.文件系统——软RAID的实现(一)(mdadm,RAID0,主次设备号)
14.文件系统——软RAID的实现(一)(mdadm,RAID0,主次设备号)
前文中介绍过,软RAID其实是通过md来实现的,它本质上是一个程序,用来模拟RAID。它依赖于CPU完成,需要占用大量的CPU时钟周期,所以性能不会太好;并且它完全依赖于当前操作系统,所以一旦操作系统损坏,则很有可能影响到该RAID的使用,因此在生产环境中,不建议使用软RAID。这里仅对软RAID的实现方式作一些简单的介绍。
md模块可以基于任何块设备来创建,也就意味着它可以使用一个完整的分区来创建,例如使用/dev/sdb5和/dev/sdb6来实现RAID1;它可以在/dev/md0和/dev/md1上实现RAID0。但是需要注意的是,在生产环境中不建议使用同一个块设备来实现软RAID,因为如果该块设备坏了,整个RAID就坏了。
一、mdadm使用的模式
创建软RAID需要使用到mdadm这个命令,它是一个模式化的命令,通过不同的选项它可以工作在不同模式下。
我们可以使用man命令来查看一下mdadm的使用方法:
[root@localhost ~]# man mdadm
MDADM(8) MDADM(8)
NAME
mdadm - manageMD devices aka Linux Software RAID
SYNOPSIS
mdadm [mode]<raiddevice> [options] <component-devices>
DESCRIPTION
RAID devicesare virtual devices created from two or more real block devices.
OPTIONS
Options for selecting a mode are:
-A, --assemble Assemble apre-existing array.
#装配模式——从其他设备上拆卸下来,然后装备到当前系统上
-B, --build Build a legacy arraywithout superblocks.
#在一个没有superblocks的阵列上构建RAID
-C, --create Create a new array.
#创建模式——创建一个软RAID
-F, --follow, --monitor SelectMonitor mode.
#监控模式——如果RAID设备发生了故障,就会通过邮件等手段进行通知
-G, --grow Change the size orshape of an active array.
#增长RAID的空间,比如原来是三块磁盘做成的RAID,现在新增了一块磁盘,总磁盘空间变大了
-I, --incremental Add/remove a single device to/from anappropriate array, and possibly start the array.
#通过增加设备的方式增加RAID的大
-D, --detail Print details of one or more md devices.
#监控某个RAID设备的详细信息
If a device is given before any options, or if the firstoption is --add, --fail, or --remove, then the MANAGE mode is assumed.
#管理模式——默认工作在管理模式下
mdadm命令的基本格式为:
mdadm /dev/md# option /dev/DEVICE_NAME
它在-C创建模式下还可以一些选项:
-a{yes|no}:表示是否为新建的RAID设备自动创建设备文件/dev/md#
-l #:指定RAID级别
-n #:指定用于创建Raid的块设备的个数(不包括备盘)
-c #:指定chunck大小,如64k,32k等,它是数据块的大小
-x #:指定备盘的个数
注意RAID0不支持备盘,因此如果-l选项后面跟了0,则不能指定备盘。
二、创建RAID实例演示
例1. 创建一个大小为10G的RAID0:
上文提到过,不建议在同一个设备上模拟软RAID,因此我们可以在虚拟机上再挂载两块新磁盘,每一块大小为10G,于是通过fdisk命令可以看到当前系统上有4个设备:/dev/sda,/dev/sdb, /dev/sdc和/dev/sdd:
[root@localhost~]# fdisk -l
—————————————运行结果—————————————
Disk/dev/sda: 26.8 GB, 26843545600 bytes 255heads, 63 sectors/track, 3263 cylinders Disk/dev/sdb: 102.0 GB, 102005473280 bytes 255heads, 63 sectors/track, 12401 cylinders Disk/dev/sdc: 10.7 GB, 10737418240 bytes 255heads, 63 sectors/track, 1305 cylinders Disk/dev/sdd: 10.7 GB, 10737418240 bytes 255heads, 63 sectors/track, 1305 cylinders
现在分别让 /dev/sdc 和 /dev/sdd各提供5G的磁盘,来创建这个10G的RAID0。
[root@localhost~]# fdisk /dev/sdc
#在/dev/sdc上创建一个5G的分区 Devicecontains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Buildinga new DOS disklabel with disk identifier 0xb8ee6343. Changeswill remain in memory only, until you decide to write them. Afterthat, of course, the previous content won‘t be recoverable. Warning:invalid flag 0x0000 of partition table 4 will be corrected by w(rite) WARNING:DOS-compatible mode is deprecated. It‘s strongly recommended to switch off the mode (command ‘c‘) andchange display units to sectors (command ‘u‘). Command(m for help): n Commandaction e extended p primary partition (1-4) p Partitionnumber (1-4): 1 Firstcylinder (1-1305, default 1): Usingdefault value 1 Lastcylinder, +cylinders or +size{K,M,G} (1-1305, default 1305): +5G Command(m for help): p Disk/dev/sdc: 10.7 GB, 10737418240 bytes 255heads, 63 sectors/track, 1305 cylinders Units= cylinders of 16065 * 512 = 8225280 bytes Sectorsize (logical/physical): 512 bytes / 512 bytes I/Osize (minimum/optimal): 512 bytes / 512 bytes Diskidentifier: 0xb8ee6343 Device Boot Start End Blocks Id System /dev/sdc1 1 654 5253223+ 83 Linux Command(m for help): l # 查看一下可支持的文件系统的编号 0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris 1 FAT12 39 Plan 9 82 Linux swap / So c1 DRDOS/sec(FAT- 2 XENIXroot 3c PartitionMagic 83 Linux c4 DRDOS/sec (FAT- 3 XENIXusr 40 Venix 80286 84 OS/2 hidden C: c6 DRDOS/sec (FAT- 4 FAT16<32M 41 PPC PReP Boot 85 Linux extended c7 Syrinx 5 Extended 42 SFS 86 NTFS volume set da Non-FSdata 6 FAT16 4d QNX4.x 87 NTFS volume set db CP/M / CTOS /. 7 HPFS/NTFS 4e QNX4.x 2nd part 88 Linux plaintext de Dell Utility 8 AIX 4f QNX4.x 3rd part 8e Linux LVM df BootIt 9 AIXbootable 50 OnTrack DM 93 Amoeba e1 DOS access a OS/2Boot Manag 51 OnTrack DM6 Aux 94 Amoeba BBT e3 DOS R/O b W95FAT32 52 CP/M 9f BSD/OS e4 SpeedStor c W95FAT32 (LBA) 53 OnTrack DM6 Aux a0 IBM Thinkpad hi eb BeOS fs e W95FAT16 (LBA) 54 OnTrackDM6 a5 FreeBSD ee GPT f W95Ext‘d (LBA) 55 EZ-Drive a6 OpenBSD ef EFI (FAT-12/16/ 10 OPUS 56 Golden Bow a7 NeXTSTEP f0 Linux/PA-RISC b 11 Hidden FAT12 5c Priam Edisk a8 Darwin UFS f1 SpeedStor 12 Compaq diagnost 61 SpeedStor a9 NetBSD f4 SpeedStor 14 Hidden FAT16 <3 63 GNU HURD or Sys ab Darwin boot f2 DOS secondary 16 Hidden FAT16 64 Novell Netware af HFS / HFS+ fb VMware VMFS 17 Hidden HPFS/NTF 65 Novell Netware b7 BSDI fs fc VMware VMKCORE 18 AST SmartSleep 70 DiskSecure Mult b8 BSDI swap fd Linux raid auto # 必须使用fd才能支持软RAID,故需要使用t进行调整 1b Hidden W95 FAT3 75 PC/IX bb Boot Wizard hid fe LANstep 1c Hidden W95 FAT3 80 Old Minix be Solaris boot ff BBT 1e Hidden W95 FAT1 Command(m for help): t # 使用t进行调整 Selectedpartition 1 Hexcode (type L to list codes): fd # 调整为fd Changedsystem type of partition 1 to fd (Linux raid autodetect) Command(m for help): p # 使用p查看设备信息 Disk/dev/sdc: 10.7 GB, 10737418240 bytes 255heads, 63 sectors/track, 1305 cylinders Units= cylinders of 16065 * 512 = 8225280 bytes Sectorsize (logical/physical): 512 bytes / 512 bytes I/Osize (minimum/optimal): 512 bytes / 512 bytes Diskidentifier: 0xb8ee6343 Device Boot Start End Blocks Id System /dev/sdc1 1 654 5253223+ fd Linux raid autodetect # 可以看到新建的分区id已经改成了fd Command(m for help): w # 保存退出 Thepartition table has been altered! Callingioctl() to re-read partition table. Syncingdisks.
注意,保存退出后不要格式化该设备,因为不能对一个软RAID设备进行格式化。
[root@localhost~]# partx -a /dev/sdc
BLKPG:Device or resource busy erroradding partition 1
[root@localhost~]# partx -a /dev/sdc1 /dev/sdc
# 同步新分区到内核中
[root@localhost~]# cat /proc/partitions
# 查看是否同步成功 majorminor #blocks name 8 0 26214400 sda 8 1 512000 sda1 8 2 25701376 sda2 8 16 99614720 sdb 8 19 10490413 sdb3 8 20 1 sdb4 8 21 5253223 sdb5 8 22 1060258 sdb6 8 32 10485760 sdc 8 33 5253223 sdc1 # 已经能够识别新分区sdc1了 8 48 10485760 sdd 253 0 23633920 dm-0 253 1 2064384 dm-1
下面重复上述步骤,在/dev/sdd上创建一个5G的分区,创建过程不加赘述。
[root@localhost~]# partx -a /dev/sdd1 /dev/sdd
[root@localhost~]# cat /proc/partitions
majorminor #blocks name 8 0 26214400 sda 8 1 512000 sda1 8 2 25701376 sda2 8 16 99614720 sdb 8 19 10490413 sdb3 8 20 1 sdb4 8 21 5253223 sdb5 8 22 1060258 sdb6 8 32 10485760 sdc 8 33 5253223 sdc1 8 48 10485760 sdd 8 49 5253223 sdd1 # 两个分区sdc1和sdd1都已经创建好了 253 0 23633920 dm-0 253 1 2064384 dm-1
下面将sdc1和sdd1这两个分区创建成一个RAID0:
首先,通过查看/proc/mdstat这个文件来确认当前的md设备状态
[root@localhost~]# cat /proc/mdstat
Personalities: unuseddevices: <none> # 结果显示当前没有md设备
也可以通过ls命令来查看/dev目录来获取md设备的信息:
[root@localhost~]# ls /dev/md*
ls:cannot access /dev/md*: No such file or directory # 说明还没有md设备,因此可以从md0开始创建
[root@localhost~]# mdadm -C /dev/md0 -a yes -l 0 -n 2 /dev//sd{c,d}1
# -C选项用来指定要创建的RAID设备为/dev/md0; # -a yes 用来指定自动为RAID设备创建/dev/md0; # -l 选项用来指定RAID级别为0; # -n 选项用来指定使用2个设备,分别是/dev/sdc1和/dev/sdd1 # 注意,这里没有使用-x选项指定备盘,因为RAID0没有备盘 mdadm:Defaulting to version 1.2 metadata mdadm:array /dev/md0 started. # 提示创建了/dev/md0
[root@localhost~]# cat /proc/mdstat
Personalities: [raid0] md0 :active raid0 sdd1[1] sdc1[0] 10506240 blocks super 1.2 512k chunks # 可以看到md0的信息了:md0的RAID级别是0,使用了两个设备sdc1和sdd1; # md0 一共有10G,每个数据块是512K unuseddevices: <none> [root@localhost~]# ls /dev/md* /dev/md0 /dev/md: md-device-map # 使用ls命令同样也能查看到md0设备
[root@localhost~]# cd /dev/md
[root@localhostmd]# ls
md-device-map
[root@localhostmd]# file md-device-map
md-device-map:ASCII text # /dev/md目录下的文件md-device-map是个ASCII文件 # 该文件用来保存当前系统上md设备的映射关系等相关信息
[root@localhostmd]# cat md-device-map
md01.2 390f891c:f51051a2:ef0711d8:7573eabc /dev/md0 # md-device-map文件是md0设备,版本号为1.2,ID号为390f891c:f51051a2:ef0711d8:7573eabc
当md设备创建完成后,可以开始对其进行格式化了:
[root@localhostmd]# mke2fs -t ext4 /dev/md0
# 注意,格式化时不要对/dev/sdc1和/dev/sdd1进行,而要对/dev/md0进行格式化 mke2fs1.41.12 (17-May-2010) Filesystemlabel= OStype: Linux Blocksize=4096 (log=2) Fragmentsize=4096 (log=2) Stride=128blocks, Stripe width=256 blocks 657072inodes, 2626560 blocks 131328blocks (5.00%) reserved for the super user Firstdata block=0 Maximumfilesystem blocks=2692743168 81block groups 32768blocks per group, 32768 fragments per group 8112inodes per group Superblockbackups stored on blocks: 32768, 98304, 163840, 229376, 294912,819200, 884736, 1605632 Writinginode tables: done Creatingjournal (32768 blocks): done Writingsuperblocks and filesystem accounting information: done Thisfilesystem will be automatically checked every 20 mounts or 180days, whichever comes first. Use tune2fs-c or -i to override.
[root@localhostmd]# mount /dev/md0 /backup
# 将/dev/md0挂载到/backup下
[root@localhostmd]# cd /backup
[root@localhostbackup]# ls
lost+found # 能够查看到lost+found,说明挂载成功了
[root@localhostbackup]# mount
/dev/mapper/VolGroup-lv_rooton / type ext4 (rw) procon /proc type proc (rw) sysfson /sys type sysfs (rw) devptson /dev/pts type devpts (rw,gid=5,mode=620) tmpfson /dev/shm type tmpfs(rw,rootcontext="system_u:object_r:tmpfs_t:s0") /dev/sda1on /boot type ext4 (rw) /dev/sdb3on /mydata type ext4 (rw,noatime) noneon /proc/sys/fs/binfmt_misc type binfmt_misc (rw) /dev/md0on /backup type ext4 (rw) # 使用mount命令可以查看到当前系统已经挂载了/dev/md0了
命令mdadm如果使用-D选项,可以监控某个md设备:
[root@localhostbackup]# mdadm -D /dev/md0
/dev/md0: Version : 1.2 Creation Time : Tue Aug 12 18:49:21 2014 # 创建时间 Raid Level : raid0 Array Size : 10506240 (10.02 GiB 10.76 GB) # 注意,创建后的大小在给定大小20%左右浮动均为合理 Raid Devices : 2 # RADI设备的个数 Total Devices : 2 # 总共设备的个数 Persistence : Superblock is persistent # 持久与否 Update Time : Tue Aug 12 18:49:21 2014 # 更新时间 State : clean # 数据是否完整 Active Devices : 2 WorkingDevices : 2 Failed Devices : 0 Spare Devices : 0 Chunk Size : 512K # chunk大小 Name : localhost.localdomain:0 (local to host localhost.localdomain) # 当前主机的主机名,冒号后面的数字表示第几个设备 UUID :1c890f39:a25110f5:d81107ef:bcea7375 Events : 0 Number Major Minor RaidDevice State # 第几号设备 主设备号 次设备号 在RADI阵列中的标号 当前状态(已同步) 0 8 33 0 active sync /dev/sdc1 1 8 49 1 active sync /dev/sdd1
三、主次设备号
一个设备的主设备(major)号用于区分设备类别,比如/dev/sd*这样的设备是同一种类型的设备,故主设备号相同;再比如硬盘盒键盘是两种不同的设备,其主设备号必然不同。
一个设备的次设备(minor)号用于区分同一种类别的设备下不同的具体设备。比如用ls命令查看/dev:
[root@localhostbackup]# ls -l /dev/sd*
brw-rw----.1 root disk 8, 0 Aug 12 18:07 /dev/sda brw-rw----.1 root disk 8, 1 Aug 12 18:07 /dev/sda1 brw-rw----.1 root disk 8, 2 Aug 12 18:07 /dev/sda2 brw-rw----.1 root disk 8, 16 Aug 12 18:07 /dev/sdb # 由于fdisk支持的磁盘分区只到15个,故从编号3到15都预留给了第一块磁盘/dev/sda brw-rw----.1 root disk 8, 19 Aug 12 18:07 /dev/sdb3 brw-rw----.1 root disk 8, 20 Aug 12 18:07 /dev/sdb4 brw-rw----.1 root disk 8, 21 Aug 12 18:07 /dev/sdb5 brw-rw----.1 root disk 8, 22 Aug 12 18:07 /dev/sdb6 # 分区编号23到31都预留给了前一块磁盘/dev/sdb brw-rw----.1 root disk 8, 32 Aug 12 18:34 /dev/sdc brw-rw----.1 root disk 8, 33 Aug 12 18:49 /dev/sdc1 brw-rw----.1 root disk 8, 48 Aug 12 18:40 /dev/sdd brw-rw----.1 root disk 8, 49 Aug 12 18:49 /dev/sdd1 # 可以看到所有/dev/sd*设备的主设备号都是8,但是每一个具体的设备编号都不一样
本文出自 “重剑无锋 大巧不工” 博客,请务必保留此出处http://wuyelan.blog.51cto.com/6118147/1539718