码迷,mamicode.com
首页 > 其他好文 > 详细

服务器软硬磁盘阵列

时间:2017-04-20 14:18:28      阅读:281      评论:0      收藏:0      [点我收藏+]

标签:基于   一半   highlight   mini   class   连接器   devices   合成   crt   

概述:

  RAID( Redundant Array of Inexpensive Disks)称为廉价磁盘冗余阵列。 RAID 的基本思想是把多个便宜的小磁盘组合到一起,组合为一个大磁盘组,使性能达到或超过一个容量巨大、价格昂贵、读写速度快的磁盘。

  目前 RAID 技术主要分为两种:基于硬件(服务器 RAID 控制器)的技术和基于软件的RAID 技术。在 Linux 系统中通过自带的软件就能模拟实现 RAID 功能,这样可省去购买昂贵的硬件 RAID 控制器的费用,便可极大地增强磁盘的 IO 性能和可靠性。由于是用软件去模拟实现的 RAID 功能,所以它的配置灵活、管理方便。同时使用软件 RAID,还可以实现将几个物理磁盘合并成一个更大的虚拟设备,从而达到性能改进和数据冗余的目的。当然基于硬件的 RAID 解决方案比基于软件 RAID 技术在性能上会胜一筹,具体表现在检测和修复多位错误的能力、错误磁盘自动检测和阵列重建等方面。在本章将详细讲述如何在Linux 服务器上创建及维护软 RAID。

RAID 级别介绍

  随着 RAID 技术经过不断的发展,现已有 RAID 0 到 RAID 6 七种基本的 RAID 级别,同时还有 RAID 0+RAID 1 的组合形式,称为 RAID10,还有 RAID 0+RAID 5 的组合形式,称为 RAID50。当然级别并不能代表技术的高低,其中 RAID 2-RAID 4 基本上不再使用了。目前这些常用的 RAID 级别 Linux 内核都能够支持,本节以 Linux 2.6 以上的内核为例,在 Linux 2.6 内核中的软 RAID 可支持以下级别: RAID 0、 RAID 1、RAID 4、 RAID 5以及 RAID 6 等。 Linux 2.6 的内核除支持以上几种 RAID 级别外,还可支持 LINEAR(线性模式)的软 RAID,线性模式是将两个或更多的磁盘组合到一个物理设备中,磁盘不必具有相同的大小,在写入 RAID 设备时会首先填满磁盘 A,然后是磁盘 B,以此类推。

RAID 0

  也称为条带模式(striped),即把连续的数据分散到多个磁盘上存取。当系统有数据请求就可以被多个磁盘并行的执行,每个磁盘执行属于它自己的那部分数据请求。这种数据上的并行操作可以充分利用磁盘总线的带宽,显著提高磁盘整体存取性能。因为读取和写入是在设备上并行完成的,读取和写入性能将会增加,这通常是运行 RAID 0 的主要原因。但RAID 0 没有数据冗余,如果其中一个硬盘出现故障,那么将无法恢复任何数据。

技术分享

RAID 1

  RAID 1 又称为镜像( Mirroring),一个具有全冗余的模式。 RAID 1 可以用于两个或2xN 个磁盘,并使用 0 块或更多的备用磁盘,每次写数据时会同时写入镜像盘。这种阵列可靠性很高,但其有效容量会减小到总容量的一半, 同时这些磁盘的大小应该相等,否则总容量只具有最小磁盘的大小。

技术分享

RAID 4

  创建 RAID 4 需要三块或更多的磁盘,它在一个磁盘上保存校验信息,并以 RAID 0 方式将数据写入其它磁盘。因为一块磁盘是为校验信息保留的,所以阵列的空间大小是( N-l)*S,其中 S 是阵列中最小磁盘的大小。就像在 RAID 1 那样,磁盘的大小应该相等。如果一个磁盘出现故障,那么可以使用校验信息及另一个磁盘来重建数据。如果两个磁盘出现故障,那么所有数据都将丢失。不经常使用这个级别的原因是校验信息存储在一个磁盘上。每次写入其它磁盘时,都必须更新这些信息。因此,在大量写入数据时很容易造成校验磁盘的瓶颈,所以目前这个级别的 RAID 很少使用了。

技术分享

RAID 5

  在希望结合大量物理磁盘并且仍然保留一些冗余时, RAID 5 可能是最有用的 RAID 模式。 RAID 5 可以用在三块或更多的磁盘上,并使用 0 块或更多的备用磁盘。就像 RAID 4一样,RAID5 设备的大小是(N-1)*S。RAID5 与 RAID4 之间最大的区别就是校验信息均匀分布在各个驱动器上,这样就避免了 RAID 4 中出现的瓶颈问题。如果其中一块磁盘出现故障,那么由于有校验信息,所以所有数据仍然可以保持不变。如果可以使用备用磁盘,那么在设备出现故障之后,将立即开始往备用磁盘上同步数据。如果两块磁盘同时出现故障,那么所有数据都会丢失。

技术分享

RAID 6

  RAID 6 是在 RAID 5 基础上扩展而来的。与 RAID 5 一样,数据和校验码都是被分成数据块然后分别存储到磁盘阵列的各个硬盘上。只是 RAID 6 中多增加一块校验磁盘,用于备份分布在各个磁盘上的校验码,这样 RAID 6 磁盘阵列就允许两个磁盘同时出现故障,所以 RAID 6 的磁盘阵列最少需要四块硬盘。

技术分享

RAID1+0

  N(偶数,N>=4)块盘两两镜像后,在组合成一个 RAID 0。容量为 N/2,N/2 块盘同时写入,写速度一般,N 快盘同时读取,读速度较快。性能高,可靠性高。

技术分享

创建软 RAID

  在 Linux 服务器中可通过 mdadm 工具来创建和维护软 RAID 的, mdadm 在创建和管理软 RAID 时非常方便,而且很灵活。 mdadm 常用的参数有如下:

  -C --create:创建一个软 RAID,后面需要标识 RAID 设备的名称。例如,/dev/md0,/dev/md1
  -A --assemble:加载一个已存在的 RAID,后面跟 RAID 以及设备的名称。
  -D --detail:输出指定 RAID 设备的详细信息。
  -S --stop:停止指定的 RAID 设备。
  -l --level:指定 RAID 配置级别,例如,设置“--level=5”则表示创建阵列的级别是 RAID 5。
  -n --raid-devices:指定 RAID 中活动磁盘的数目。
  -r --remove:删除 RAID 中的某个磁盘
  -a --add:向 RAID 中添加磁盘-s --scan:扫描配置文件/proc/mdstat 来搜索软 RAID 的配置信息,该参数不能单独使用,需要配合其它参数才能使用。


  在实际生产环境中,系统硬盘与数据库和应用是分开的,这样有利于系统的维护和对数据应用的使用,磁盘阵列可以在安装系统之前或之后产生,系统会视之为一个(大型)硬盘,而它具有容错及冗余的功能。磁盘阵列不单只可以加入一个现成的系统,它更可以支持容量扩展,方法也很简单,只需要加入一个新的硬盘并执行一些简单的指令,系统便可以实时利用这新加的容量。

RAID 的种类及应用

  IDE 和 SCSI 是计算机的两种不同的接口,前者普遍用于 PC 机,后者一般用于服务器。基于这两种接口,RAID 分为两种类型:基于 IDE 接口的 RAID 应用,称为 IDE RAID;而基于 SCSI接口的 RAID 应用则相应称为 SCSI RAID。

基于不同的架构,RAID 又可以分为:
  ● 软件 RAID (软件 RAID)
  ● 硬件 RAID (硬件 RAID)
  ● 外置 RAID (External RAID)

  软件 RAID 很多情况下已经包含在系统之中,并成为其中一个功能,如 Windows、Netware及 Linux。软件 RAID 中的所有操作皆由中央处理器负责,所以系统资源的利用率会很高,从而使系统性能降低。软件 RAID 是不需要另外添加任何硬件设备,因为它是靠你的系统,主要是中央处理器的功能提供所有现成的资源。

  硬件 RAID 通常是一张 PCI 卡,你会看到在这卡上会有处理器及内存。因为这卡上的处理器已经可以提供一切 RAID 所需要的资源,所以不会占用系统资源,从而令系统的表现可以大大提升。硬件 RAID 可以连接内置硬盘、热插拔背板或外置存储设备。无论连接何种硬盘,控制权都是在 RAID 卡上,亦即是由系统所操控。在系统里,硬件 RAID PCI 卡通常都需要安驱动程序,否则系统会拒绝支持。

  外置式 RAID 也是属于硬件 RAID 的一种,区别在于 RAID 卡不会安装在系统里,而是安装在外置的存储设备内。而这个外置的储存设备则会连接到系统的 SCSI 卡上。系统没有任何的 RAID 功能,因为它只有一张 SCSI 卡;所有的 RAID 功能将会移到这个外置存储里。好处是外置的存储往往可以连接更多的硬盘,不会受系统机箱的大小所影响。而一些高级的技术,如双机容错,是需要多个服务器外连到一个外置储存上,以提供容错能力。

环境描述:

技术分享

 

  LINUX 服务器中添加 1 块 100G 空闲的硬盘,划分 4 个 20G 的分区用来练习创建一个RAID 5 及其后期维护操作。

配置过程:

安装前准备配置:

[root@Crushlinux ~]# cat /etc/redhat-release
CentOS release 6.6 (Final)
[root@localhost ~]# uname -r
2.6.32-504.el6.x86_64
[root@Crushlinux ~]# uname -m
x86_64
[root@Crushlinux ~]# rpm -q mdadm
mdadm-3.3-6.el6.x86_64

创建 4 个 个 20G  的分区:

  首先使用“fdisk”命令在硬盘上创建 4 个分区,操作如下:

[root@Crushlinux ~]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x8f67b364.
Changes will remain in memory only, until you decide to write them.
After that, 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‘) and change display units to
sectors (command ‘u‘).
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-13054, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-13054, default 13054): +20G
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (2613-13054, default 2613):
Using default value 2613
Last cylinder, +cylinders or +size{K,M,G} (2613-13054, default 13054): +20G
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 3
First cylinder (5225-13054, default 5225):
Using default value 5225
Last cylinder, +cylinders or +size{K,M,G} (5225-13054, default 13054): +20G
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Selected partition 4
First cylinder (7837-13054, default 7837):
Using default value 7837
Last cylinder, +cylinders or +size{K,M,G} (7837-13054, default 13054): +20G
Command (m for help): p
Disk /dev/sdb: 107.4 GB, 107374182400 bytes
255 heads, 63 sectors/track, 13054 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x8f67b364
Device Boot Start End Blocks Id System
/dev/sdb1 1 2612 20980858+ 83 Linux
/dev/sdb2 2613 5224 20980890 83 Linux
/dev/sdb3 5225 7836 20980890 83 Linux
/dev/sdb4 7837 10448 20980890 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]# partprobe /dev/sdb

创建 RAID5

  创建完/dev/sdb1、 /dev/sdb2、 /dev/sdb3、 /dev/sdb4 四个分区后,下面就可以创建RAID 5 了,其中设定/dev/sdb4 作为备用磁盘,其余为活动磁盘,备用磁盘的作用是一旦某一设磁盘损坏可以立即使用备用磁盘替换。操作命令如下:

[root@Crushlinux ~]# mdadm --create /dev/md5 --level=5 --raid-devices=3 --spare-devices=1 /dev/sdb[1-4]
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md5 started.

  其中“--spare-devices=1”表示当前阵列中备用设备只有一块,即作为备用设备的“/dev/sdb4”,若有多块备用设备,则将“--spare-devices”的值设置为相应的数目。成功创建完成 RAID 设备后,通过如下命令可以查看到 RAID 的详细信息:

[root@Crushlinux ~]# mdadm --detail /dev/md5
/dev/md5:
              Version : 1.2
    Creation Time : Tue Oct 18 22:59:32 2016
          Raid Level : raid5
           Array Size : 41928704 (39.99 GiB 42.93 GB)
    Used Dev Size : 20964352 (19.99 GiB 21.47 GB)
       Raid Devices : 3
      Total Devices : 4
         Persistence : Superblock is persistent
        Update Time : Tue Oct 18 23:01:01 2016
                    State : clean, degraded, recovering

        Active Devices : 2
    Working Devices : 4
        Failed Devices : 0
        Spare Devices : 2
                    Layout : left-symmetric
             Chunk Size : 512K
        Rebuild Status : 14% complete
                      Name : localhost.localdomain:5 (local to host localhost.localdomain)
                        UUID : 307f1234:08c3d0ec:c31390d1:cbbecfc9
                     Events : 3
    Number Major Minor   RaidDevice     State
    0             8     17         0                 active sync /dev/sdb1
    1             8     18         1                 active sync /dev/sdb2
    4             8     19         2                 spare rebuilding /dev/sdb3
    3             8     20         -                  spare /dev/sdb4                                                                       

创建 RAID 的配置文件

  RAID 的配置文件名为“mdadm.conf”,默认是不存在的,所以需要手工创建,该配置文件存在的主要作用是系统启动的时候能够自动加载软 RAID,同时也方便日后管理。“mdadm.conf”文件内容包括:由 DEVICE 选项指定用于软 RAID 的所有设备,和 ARRAY 选项所指定阵列的设备名、 RAID 级别、阵列中活动设备的数目以及设备的 UUID 号。生成RAID 配置文件操做如下:

[root@Crushlinux ~]# mdadm --detail --scan > /etc/mdadm.conf

  但是当前生成“mdadm.conf”文件的内容并不符合所规定的格式,所以也是不生效的,这时需要手工修改该文件内容为如下格式:

[root@Crushlinux ~]# vim /etc/mdadm.conf
DEVICE /dev/sdb1 /dev/sdb2 /dev/sdb3 /dev/sdb4
ARRAY /dev/md5 metadata=1.2 spares=1 name=localhost.localdomain:5
UUID=307f1234:08c3d0ec:c31390d1:cbbecfc9

  如果没有创建 RAID 的配置文件,那么在每次系统启动后,需要手工加载软 RAID 才能使用,手工加载软 RAID 的命令是:

[root@Crushlinux ~]# mdadm --assemble /dev/md5 /dev/sdb1 /dev/sdb2 /dev/sdb3 /dev/sdb4

创建文件系统

  接下来就只需要在 RAID 设备上创建文件系统就可使用了,在 RAID 设备上创建文件系统和在分区或磁盘上创建文件系统的方法一样。在设备“/dev/md5”上创建 ext4 的文件系统命令如下:

[root@Crushlinux ~]# mkfs.ext4 /dev/md5
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=128 blocks, Stripe width=256 blocks
2621440 inodes, 10482176 blocks
524108 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
320 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:

  创建完文件系统后,将该设备挂载上就可正常的使用了。如果要创建其它级别的 RAID,其步骤和创建 RAID 5 基本都一样,区别在于指定“--level”值的时候,需要将该值设置为相应的级别。

  设置开机自动挂载,在/etc/fstab 中加入下面一行:

/dev/md5 /data ext4 defaults 0 0

  挂载测试

[root@Crushlinux ~]# umount /dev/md5
[root@Crushlinux ~]# mount /dev/md5
[root@Crushlinux ~]# mount | tail -1
/dev/md5 on /data type ext4 (rw)

维护软RAID

  软 RAID 虽然很大程度上能保证数据的可靠性,但是在日常的工作中,有时可能需要对 RAID进行调整以及不排除 RAID 设备物理介质损坏的可能等相关问题,当遇到这些情况时,那么同样可以通过“mdadm”命令来完成这些操作。下面也将通过一个实例来介绍更换 RAID 故障磁盘的完整过程。


1、模拟故障磁盘
  假设其中的“/dev/sdb2”设备出现故障时,更换一个新的磁盘,整个过程的详细说明如下:
  在实际中,当软 RAID 检测到某个磁盘有故障时,会自动标记该磁盘为故障磁盘,并停止对故障磁盘的读写操作,所以这里需要将/dev/sdb2 标记为出现故障的磁盘,命令如下:

[root@Crushlinux ~]# mdadm /dev/md5 --fail /dev/sdb2
mdadm: set /dev/sdb2 faulty in /dev/md5

  由于 RAID 5 设置了一个备用设备,所以当有标记为故障磁盘的时候,备用磁盘会自动顶替故障磁盘工作,阵列也能够在短时间内实现重建。通过“/proc/mdstat”文件可查看到当前阵列的状态,如下:

[root@Crushlinux ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md5 : active raid5 sdb3[4] sdb4[3] sdb2[1](F) sdb1[0]
41928704 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [U_U]
[==>..................] recovery = 11.9% (2503664/20964352) finish=10.0min
speed=30455K/sec
unused devices: <none>

  以上信息表明阵列正在重建, 当一个设备出现故障或被标记故障时,相应设备的方括号后将被标以(F),如“sdc1[4](F)”,其中“[3/2]”的第一位数表示阵列所包含的设备数,第二位数表示活动的设备数,因为目前有一个故障设备,所以第二位数为 2;这时的阵列以降级模式运行,虽然该阵列仍然可用,但是不具有数据冗余;而“[U_U]”表示当前阵列可以正常使用的设备是/dev/sdb1 和/dev/sdb3,如果是设备“/dev/sdb1”出现故障时,则将变成[_UU]。

  重建完数据后,再次查看阵列状态时,就会发现当前的 RAID 设备又恢复了正常,如下:

[root@Crushlinux ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md5 : active raid5 sdb3[4] sdb4[3] sdb2[1](F) sdb1[0]
41928704 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
unused devices: <none>

移除故障磁盘

  既然“/dev/sdb2”出现了故障,当然要移除该设备,移除故障磁盘的操作如下:

[root@Crushlinux ~]# mdadm /dev/md5 --remove /dev/sdb2
mdadm: hot removed /dev/sdb2 from /dev/md5

  其中“--remove”表示移除指定 RAID 设备中的某个磁盘,也可用“-r”来代替该参数。

添加新硬盘

  在添加新的硬盘前,同样需要对新硬盘进行创建分区的操作,例如,添加新硬盘的设备名为“/dev/sdb2”,则具体操作如下:

[root@Crushlinux ~]# mdadm /dev/md5 --add /dev/sdb2
mdadm: added /dev/sdb2

  其中“--add”与前面的“--remove”其义刚好相反,用于将某个磁盘添加到指定的设备中,也可用“-a”代替该参数。

  由于 RAID 5 设置了一个备用设备,所以不需要做任何操作 RAID 5 也能正常运行,但是如果这时某块磁盘再出现故障的话,会导致 RAID 5 没有数据冗余功能,这对于存放重要的数据的设备来说显得太不安全了。那么这时增加到 RAID 5 中的“/dev/sdb2”则作为备用设备出现在阵列中,如下:

[root@Crushlinux ~]# mdadm --detail /dev/md5
/dev/md5:
Version : 1.2
Creation Time : Tue Oct 18 22:59:32 2016
Raid Level : raid5
Array Size : 41928704 (39.99 GiB 42.93 GB)
Used Dev Size : 20964352 (19.99 GiB 21.47 GB)
Raid Devices : 3
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Tue Oct 18 23:45:36 2016
State : clean
Active Devices : 3
Working Devices : 4
Failed Devices : 0
Spare Devices : 1
Layout : left-symmetric
Chunk Size : 512K
Name : localhost.localdomain:5 (local to host localhost.localdomain)
UUID : 307f1234:08c3d0ec:c31390d1:cbbecfc9
Events : 39
Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
3 8 20 1 active sync /dev/sdb4
4 8 19 2 active sync /dev/sdb3
5 8 18 - spare /dev/sdb2

测试:

[root@Crushlinux ~]# hdparm -t /dev/md5
/dev/md5:
Timing buffered disk reads: 1314 MB in 3.00 seconds = 437.64 MB/sec
[root@Crushlinux ~]# hdparm -t /dev/sda
/dev/sda:
Timing buffered disk reads: 58 MB in 3.00 seconds = 19.32 MB/sec

阵列卡介绍(raid 控制器 )

  阵列卡就是用来实现 RAID 功能的板卡,通常是由 I/O 处理器、硬盘控制器、硬盘连接器和缓存等一系列零组件构成的。

  不同的 RAID 卡支持的 RAID 功能不同,例如支持 RAID 0、RAID 1、RAID 5、RAID 6、RAID10 等,RAID 卡的接口类型:IDE 接口、SCSI 接口、SATA 接口和 SAS 接口。

  缓存(Cache)是 RAID 卡与外部总线交换数据的场所,RAID 卡先将数据传送到缓存,再由缓存和外边数据总线交换数据。它是 RAID 卡电路板上的一块存储芯片,与硬盘盘片相比,具有极快的存取速度。

  缓存的大小与速度是直接关系到 RAID 卡的实际传输速度的重要因素,大缓存能够大幅度地提高数据命中率从而提高 RAID 卡整体性能。不同的 RAID 卡出厂时配置的内存容量不同,一般为几兆到数百兆容量不等

硬 RAID 创建 步骤

DELL 0 R710 服务器案例 :
1、开机等待出现以下界面后看屏幕提示,准备按组合键(DELL :Crtl+R IBM:Crtl+H)进入raid 配置界面

技术分享

2、当 dell 界面过去后屏幕会有相关组合键提示,同时按下 ctrl + r 进入 raid 配置界面,根据经验建议多按几次,进入到如下的配置界面,在图的右侧可以看到默认为 raid 5,磁盘大小等信息。

技术分享

3、使用上下键移动到第二行的位置按下 F2,出现以下窗口,选择第二项( Delet Disk Group)然后回车,删除 raid5

技术分享

出现确认窗口,选择 yes 确认。

技术分享

4、删除 raid 5 后的状态:

技术分享

5、然后按 F2 选择第一项(Create New VD)创建新的 RAID

技术分享

6、进入到下面的界面,蓝色体的为选中状态,此时光标移动到 RAID level 那一栏,继续回车

技术分享

7、此时出现三个选项,分别是 RAID-0 RAID-1 RAID-5 说明只能做 raid 0 和 raid1 和 raid5 ,raid10 需要至少 4 块磁盘,所以这里没有 raid10 的选项。

技术分享

8、选择需要做的选项比如 RAID-0 ,然后在三块硬盘中选择需要做的硬盘, tab 键移动到该位置选择用空格键就可以,最后选择 ok

技术分享

RAID-1 只能选择两块硬盘,如下图 ( raid-0 和 raid-5 都可以选择 3 块)

技术分享

然后再选择 ok

技术分享

然后按 ctrl + n 可以翻屏查看其他信息

技术分享

技术分享

最后按 esc 准备保存退出,弹出下图窗口选择 ok

技术分享

出现以下界面后,根据提示操作就可以了

技术分享

 

服务器软硬磁盘阵列

标签:基于   一半   highlight   mini   class   连接器   devices   合成   crt   

原文地址:http://www.cnblogs.com/crushlinux/p/6738123.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!