首页 > 代码库 > 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大小,如64k32k等,它是数据块的大小

-x #:指定备盘的个数

注意RAID0不支持备盘,因此如果-l选项后面跟了0,则不能指定备盘

 

二、创建RAID实例演示

1. 创建一个大小为10GRAID0

上文提到过,不建议在同一个设备上模拟软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的磁盘,来创建这个10GRAID0

 

[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

 

下面将sdc1sdd1这两个分区创建成一个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