本章节主要内容为:文件系统基础和相关操作、文件系统管理实例、磁盘分区管理、交换空间、RAID 管理、逻辑卷管理器(LVM)、设备映射多路径(DM-Multipath)。
注:本Linux新人培训教程以中兴新支点服务器操作系统(CGSL)为例。
对于任何一个成熟的操作系统而言,文件系统管理都是一个十分重要的部分。文件系统管理的好坏直接影响到操作系统的性能和安全。
4.1.文件系统基础和相关操作 文件系统是操作系统在硬盘或者分区上保存文件信息的方法和数据结构,也就是文件在硬盘或分区上的组织方式。CGSL 系统的一个重要特征之一就是支持多种文件系统,更为灵活并可以和许多其他种类的操作系统交换数据,其中最常用的是以下几种: 1、XFS:XFS 是 CGSL V5 默认文件系统并在所有架构中支持。XFS 是一个具有非常高性能且可扩展的文件系统,同时在大多数要求的应用程序中都会进行常规部署。XFS提供了一种健壮的、优秀的以及功能丰富的文件系统,它具有的可伸缩性能够满足最苛刻的存储需求。 2、ext4:ext3 的升级版本,ext4 对 ext3 做了很多深层次的改进,设计更合理、性能更好、更可靠,同时还引入了一些新功能。 3、ext3:ext2 的升级版本,其主要优点是在 ext2 的基础上加入了记录数据的日志功能。 4、ext2:支持标准 Unix 文件类型,可用于多种存储介质,向上兼容性好。 5、vfat:Windows 9x/2000 及 NT 操作系统使用的扩展 DOS 文件系统,提供了对长文件名的支持。 6、Btrfs :Btrfs 是下一代 Linux 文件系统,可提供高级管理、可靠性和可扩展性功能。Btrfs 为文件和元数据提供 checksum 确认。它还提供快照和压缩功能以及整合的设备管理。 7、NFS:允许在多台计算机之间共享文件系统的网络文件系统。 8、iso9660:标准的 CD-ROM 文件系统。 4.1.1.建立文件系统 一个分区或磁盘在作为文件系统被使用之前,先要初始化将记录数据的结构写入磁盘,这个过程叫做建立文件系统。 命令 mkfs 用于创建文件系统。用 mkfs 命令可以在任何指定的块设备上建立不同类型的文件系统。mkfs 命令的语法格式如下: #mkfs [-V] [-t fstype] [fs-options] device [size] mkfs 命令中各项参数的意义如下: -V:强迫产生长格式输出; -t fstype:选择文件系统的类型; fs-option:将要建立的文件系统选项,它可以是以下的选项: device:将创建文件系统所在设备的设备号; size:文件系统的大小: 例如:要在硬盘上创建一个 ext4 的文件系统,用以下命令: #mkfs -t xfs /dev/sdb1 4.1.2.挂载文件系统 成功地建立了文件系统后,还需要将文件系统挂载或称安装(mount)到 Linux 目录树的某个位置才能使用。文件系统所连接到的目录被称为挂载点或安装点。对于系统硬件设备,Linux 并不使用设备号或驱动器来访问,而是将他们对应为/dev 目录下的一个(也可能是多个)文件。 文件系统的挂载,可以在系统引导过程中自动挂载,也可以使用命令手工挂载。 加载文件系统的命令为 mount ,该命令的语法格式如下: #mount [-fnrsvw] [-t vfstype] [-o options] device | dir 其中:device 代表文件系统的存储设备;dir代表文件系统将要被放置在目录系统中的位置,即挂载点。 mount 命令常用如下几个选项: -a:加载符合要求的所有文件系统,如果不加其他参数,将加载/etc/fstab 文件中列出的所有文件系统。 -o:用于确定文件系统的读/写限制,ro(只读)、rw(读写)等。 -f:完成操作步骤,并不真正安装文件系统。 例如:把/dev/sda8 上类型为 xfs 的文件系统挂载到目录/mnt/tmp 下,并使之按只读方式被安装。 #mount -t xfs -o ro /dev/sda8 /mnt/tmp 提示:文件系统的加载位置必须是系统中已存在的目录,否则,需要在挂载前创建这个目录。 4.1.3.卸载文件系统 除了根文件系统之外,其他文件系统都是可以拆卸的。卸载文件系统的命令是 umount , 其格式如下: #umount [-dflnrv] dir | device […] 该命令使用设备名或挂载点为参数,用于卸载与设备名或是挂载点对应的文件系统。 例如,需要卸载已挂载在/mnt 目录的/dev/sdb1 文件系统,可使用以下命令: #umount /dev/sdb1 或者: #umount /mnt 警告:不能卸载当前正在使用的文件系统,这样系统会报错,正确的方法是完全退出挂载点所在目录后再执行卸载命令。 4.1.4.用 fstab 文件配置文件系统 一般来说,用户经常使用的文件系统是比较固定的,如果每次使用时都进行挂载是很麻烦的,而且有时候需要一次安装很多的文件系统,可以考虑定义一个在系统引导时自动安装文件系统的方法。 Linux 中使用/etc/fstab 文件能够完成这一功能,fstab 文件中列出了引导时需安装的文件系统的类型、挂载点及可选参数。fstab 文件是一个文本文件,可以方便地通过编辑工具进行修改。 警告:请在安装前备份原来的/etc/fstab 文件,以防修改出错导致下次系统引导时文件系统不能正确加载。 以下给出一个实际的/etc/fstab 文件(您的系统不一定与之相同):
图 4-1 /etc/fstab 文件 /etc/fstab 文件也称为文件系统安装表,它的每一行代表一个需要安装的文件系统,其格式如下: device mountpoint fstype options dump passno 其中: device:指定要加载的文件系统设备 mountpoint:指定文件系统的加载点 fstype:指定安装文件系统的类型 options:使用逗号隔开的安装参数列表 dump:确定文件系统两次备份之间的时间 passno:指定系统引导时检查文件系统的顺序,根文件系统为 1,其余值为 2,如果没有指定,表示引导时文件系统不被检查。 4.1.5.检查和修复文件系统 文件系统是系统数据和资源的存储位置,所以应定期检查文件系统以发现损坏的文件并及时加以修补。 对文件系统进行检查可以通过使用 fsck 工具来完成,该命令的格式为: #fsck [options] filesystem fsck 的 -ap 选项是最常用的参数组合,能满足大部分情况下的修复需求,且修复后不会丢失数据,例如,要对/dev/sda1 进行文件系统的扫描和修复,常使用以下命令(该命令修复不会丢失数据): #fsck -ap /dev/sda1 当上述命令修复失败时,可以使用如下命令进行强制修复,此命令可能会丢失数据,请考虑后执行。 #fsck -y /dev/sda1 警告:用 fsck 检查文件系统时,必须先卸载该文件系统,否则可能导致不可修复的文件系统损坏。 4.1.6.常用文件系统管理命令 df 命令 使用 df 命令可以检查文件系统的磁盘空间占用情况,提供所有映射文件系统的空闲空间信息,其命令的语法格式为: #df [OPTION]… [FILE]… 该工具默认以 KB 为单位显示已用的和可用的磁盘空间,查看以 MB 和 GB 为单位的信息,使用 df -h 命令。 du 命令 使用 du 命令可以显示被目录占用的空间的信息,此命令可以进入被统计目录的子目录中,并显示出子目录的统计信息,常用的选项如下: -a:同时显示出目录和文件的磁盘使用情况; -s:只显示磁盘的总体使用情况; 使用不加目录名的 du 命令将会显示出当前目录下的所有信息。 4.1.7.使用设备 在 CGSL 中,可以方便地使用各种驱动器、文件系统和网络设备,包括 Linux 分区、MS DOS 和 Windows 分区、USB 存储设备以及 CD-ROM 文件系统。 使用 CD-ROM 将光盘放入光盘驱动器中,在 Shell 提示符下键入以下命令: #mount /dev/cdrom /mnt/cdrom 它通知操作系统自动探测文件系统并安装它,被安装的设备为/dev/cdrom,安装点为/mnt/cdrom。如果命令生效,光盘中的内容将出现在目录/mnt/cdrom 下。 如果安装命令失败,首先要确认/dev/cdrom 设备存在。如果使用的是 IDE CD-ROM,对应设备文件名可能是/dev/hdb、/dev/hdc 等;如果使用 SCSI CD-ROM,对应设备文件名可能为/dev/sda,/dev/sdb… 假设/dev/cdrom 不存在,而 CD-ROM 设备文件名为/dev/hdb,可以使用如下命令创建一个到/dev/cdrom 的符号链接。 #ln -s /dev/hdb /dev/cdrom 如果系统提示“设备已经安装(mounted)或目录忙”,可能是由于当前目录是加载点/mnt/cdrom 造成的,必须切换到其它目录才能进行。 执行完对光盘的操作后,在 Shell 提示符下键入以下命令卸载它。 #umount /mnt/cdrom 关于 mtools 工具 安装了系统中提供的 mtools 工具后,就可以使用 m 系列命令实现对 DOS/Windows 格式软盘的快速访问了。这一系列命令包括: 表 4-1 mtools 命令
4.2.文件系统管理实例 4.2.1.添加新硬盘 如果您给 CGSLV5 系统添加了一个新的硬盘,您可能想给这个磁盘驱动器分区,并使用 xfs(或 ext4)文件系统,则通常按如下步骤操作: 1.使用 parted 或 fdisk 来创建分区。 2.使用 mkfs 来把分区格式化为 xfs(或 ext4)文件系统。 3.使用 e2label 给分区标签。 4.创建挂载点。 5.把分区添加到/etc/fstab 文件中。 4.2.2.ext4 转换成 xfs 将 ext4 文件系统转换为 xfs 文件系统,可以提升文件系统性能以及使用 xfs 文件系统的新功能。具体步骤如下: (1)确认 xfsprogs 和 xfsdump 两个软件包已经正常安装: # rpm -qi xfsprogs # rpm -qi xfsdump (2)执行命令: #fsck -fp <设备名> 4.2.3.ext3 转换为 ext4 将 ext3 文件系统转换为 ext4 文件系统,可以提升文件系统性能以及使用 ext4 文件系统的新功能。使用 tune2fs 程序可以将 ext3 文件系统分区转换为 ext4 文件系统,转换过程必须在分区没有被挂载前提下进行。此操作过程不可逆(ext4 分区无法被“降级”到 ext3),转换后无法用 ext3 驱动读写此文件系统。步骤如下: (1)对于每个需要转换的分区,确保分区没有被挂载,执行命令: #tune2fs -O extents,uninit_bg,dir_index <设备名> (2)执行命令: #fsck -fp <设备名> 提示:如果不执行 fsck,分区将不可读! 使用 fsck 检测磁盘能够让文件系统回到一般状态。这个过程将在 group descriptors 找到 checksum 错误,这个是被预料到的。'f'参数要求磁盘检测一定要检查,哪怕文件系统标记是正常的。'p'参数要求检测的时候能够自动修复。 上述命令中,<设备名>为要转换的设备(分区)名称,如/dev/sdb1。 提示:以上命令执行完毕后,请确定把/etc/fstab 文件中的文件系统类型从 ext3 改成 ext4。 4.2.4.ext2 转换为 ext3 tune2fs 程序能够不改变分区上的已存数据来给现存的 ext2 文件系统添加日志。如需将 ext2 文件系统转换成 ext3,以 root 用户登录后执行如下命令: #/sbin/tune2fs -j <设备名> 其中,<设备名>要操作的设备(分区)名称,如/dev/sdb1。 提示:以上命令执行完毕后,请确定把/etc/fstab 文件中相应设备的对应行中的文件系统类型从 ext2 改为 ext3。 如果被转换的文件系统为根文件系统,则需要一个 initrd 映像(或 RAM 磁盘)来引导,需要使用 mkinitrd 命令创建。关于如何使用 mkinitrd 命令,可查阅该命令的 man 手册,另外,还需确定 GRUB 或 LILO 的相关 配置会载入新的 initrd。 4.2.5.ext3 还原为 ext2 从 ext3 文件系统还原为 ext2 文件系统的具体步骤如下:(以/dev/hdb1 为例) 1、要还原分区,必须首先卸载分区。是登录为 root 用户,然后键入: #umount /dev/hdb1 2、执行以下命令,从文件系统的超级块中清理文件系统特性: #/sbin/tune2fs -O ^has_journal /dev/hdb1 3、执行以下命令来检查分区的错误: #/sbin/e2fsck -y /dev/hdb1 4、执行以下命令将分区重新挂载为ext2 文件系统: #mount -t ext2 /dev/hdb1 /mount/point 其中,把 /mount/point 为分区的挂载点。 5、切换到分区的挂载目录中(上述的示例中为/mount/point)执行如下命令,删除根目录下的.journal 文件。 #cd /mount/point #rm -f .journal 提示:如果想要永久地把分区改换成 ext2,请记住更新 /etc/fstab 文件。
4.3.磁盘分区管理 警告:改变系统的硬盘分区是件非常危险的事情,即使对于经验非常丰富的管理员,我们仍建议您在改变磁盘分区前先进行磁盘的数据备份。 4.3.1.Parted 工具 利用 parted 程序可以方便地进行磁盘分区的管理和定制,如查看现存的分区表、改变分区的大小、删除分区或创建新分区。 在 Shell 提示符下以超级用户身份键入如下命令(/dev/sdb 表示要定制的设备名)。 #parted /dev/sdb 启动 parted 后,在(parted)提示下键入 help 将显示可用命令的列表。下表列出的是用户最常用的 parted 命令。
表 4-2 parted 命令 提示:要新建、删除分区或重新划分分区大小,分区所在设备不能被正在使用,即分区不能被挂载,且交换空间不能被启用。如果分区中不包括正在被使用的文件,可以用 umount 命令来卸载分区,使用 swapoff 命令来关闭交换分区。 4.3.1.1.查看分区表 启动 parted 后,键入 print 命令来查看分区表,屏幕输入信息如下:
图 4-2 查看分区表信息 第一行显示了磁盘的大小,第二行显示磁盘标签类型,后面部分为分区表,其中: Number 域表示分区设备名中的数字,例如数字 1 代表/dev/sda1;Start 和 End 分别表示对应分区在硬盘上的起止位置,以 MB 为单位;Type 代表分区类型,可以是 primary 、extended 和 logical 之一;Filesystem 是文件系统的类型,可以是 ext4、ext3、ext2、FAT、Linux -swap 等等;Flags 域列出了分区被设置的标准,可用的标志有:boot、root、swap、hidden、raid、lvm 等。 提示:要不重新启动 parted 来选择不同的设备,使用 select 命令,再紧跟设备名,如/dev/hdb。然后,您便可以查看或配置它的分区表。 4.3.1.2.创建分区 如果我们要在/dev/sdb 上创建一个新分区,那么输入以下命令启动 parted: #parted /dev/sdb 然后用 print 命令查看当前的分区表,确认磁盘上是否有足够的空闲空间可用于新分区。 提示:不要试图在正在使用的视图上创建新分区。 根据分区表决定新分区的起止点和分区类型,每个硬盘上只能有四个主分区,如果想拥有四个以上的分区,则必须先划出一个扩展分区,再在扩展分区内创建多个逻辑分区。 例如,要在/dev/sda1 上从 18000MB 到 21000 MB创建一个文件系统为 ext2 的主分区,键入以下命令: #mkpart primary ext2 18000 21000 如果使用 mkpartfs 命令,分区创建后文件系统也会被创建。只要一按下<Enter>键,对分区的改变就会生效,因此在执行前请仔细检查一下命令。 创建了分区后,使用 print 命令来确认所建分区已加入分区表中,并具有正确的分区类型、文件系统类型和大小。记住新分区的设备名中的数字以方便后续操作。 使用 mkpart 划分的分区还没有格式化,用下面的命令为分区创建文件系统: #mkfs -t ext4 /dev/sdb3 接下来,可以为新分区注明标签、在目录树中为它创建加载点,使用 mount 命令加载并使用它。还可以把它的信息添加到/etc/fstab 文件中。 提示:parted 尚不支持创建 ext3、ext4 文件系统。因此,如果想创建一个 ext3、ext4 文件系统,先使用 part 划分分区,然后使用 mkfs 来创建。 4.3.1.3.删除分区 如果要删除/dev/sdb 上的一个分区,首先输入如下命令启动 parted: #parted /dev/sdb 然后用 print 命令查看当前的分区表,确认要删除的分区。 使用 rm 来删除分区,例如,要删除分区设备名为 sdb3 ,则在(parted)提示符下键入: (parted)rm 3 只要一按下<Enter>键,分区就会被删除,请在命令执行前仔细检查一下! 分区删除后,使用 print 命令可以看到分区已经被从分区表删除。最后要把它从/etc/fstab 文件中删除,找到与被删除的分区相应的行,从文件中删除它。 提示:不要视图删除正在使用的设备上的分区。 4.3.2.Fdisk 工具 fdisk 也是 CGSL 系统所常用的磁盘分区管理工具,以下介绍 fdisk 的基本用法。 4.3.2.1.查看分区情况 使用 fdsik -l filesystem 命令来查看分区情况,例如以下,以 root 用户执行: #fdisk -l /dev/sdb Disk /dev/sdb: 2147 MB, 2147483648 bytes 255 heads, 63 sectors/track, 261 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: 0x00000000 Disk /dev/sdb doesn't contain a valid partition table 4.3.2.2.创建分区 对磁盘进行操作,以 root 用户执行:fdisk filesystem,例如: #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 0x2dfa2374. 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 //使用命令n新建分区 Command action e extended p primary partition (1-4) p //按照提示输入p新建一个主分区 Partition number (1-4): 1 //选择分区号 First cylinder (1-261, default 1): Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-261, default 261): +1G //分区大小 Command (m for help): w //写入分区结果并退出 The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. 4.3.2.3.删除分区 #fdisk /dev/sdb WARNING: DOS-compatible mode is deprecated. It's strongly recommended toswitch off the mode (command 'c') and change display units tosectors (command 'u'). Command (m for help): p //查看现在的分区情况 Disk /dev/sdb: 2147 MB, 2147483648 bytes 255 heads, 63 sectors/track, 261 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: 0x2dfa2374 Device Boot Start End Blocks Id System /dev/sdb1 1 132 1060258+ 83 Linux /dev/sdb2 133 197 522112+ 83 Linux Command (m for help): d //删除分区 Partition number (1-4): 2 //选择分区号 Command (m for help): p //再次查看分区情况,是否已删除 Disk /dev/sdb: 2147 MB, 2147483648 bytes 255 heads, 63 sectors/track, 261 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: 0x2dfa2374 Device Boot Start End Blocks Id System /dev/sdb1 1 132 1060258+ 83 Linux Command (m for help): w //写入分区结果并退出 The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.
4.4.交换空间 4.4.1.交换空间是什么 交换空间(Swap Space)作为物理内存的后援存储,当系统的物理内存不够用的时,会将物理内存中最近较少被访问的非关键页面交换到交换空间中去,从而释放出一部分物理内存空间,以供当前运行的程序使用。待需要访问被交换出去的页面时,再从交换空间中换入相应的数据到物理内存中。 虽然交换空间可以为带有少量内存的机器提供帮助,但是这种方法不应该被当做是对内存的取代。交换空间位于硬盘驱动器上,其访问效率比物理内存要低很多。交换空间可以是一个专用的交换分区(推荐的方法),也可以是一个交换文件,或是两者的结合。 4.4.2.添加交换空间 添加交换空间有两种方法:添加交换分区或添加交换文件。 4.4.2.1.添加交换分区 请参照 4.3 节进行分区,但需将分区的文件类型改为 82(即 SWAP 格式)。 使用 mkswap 命令来设置交换分区。在 Shell 提示下以根用户身份键入以下命令(假设 swap 分区是/dev/sdb2): #mkswap /dev/sdb2 要立即启用交换分区,键入以下命令: #swapon /dev/sdb2 要在引导时启用,编辑/etc/fstab 文件来包含以下行: /dev/sdb2 swap swap defaults 0 0 在系统下次引导时,它就会启用新建的交换分区。 新添了交换分区并启用它之后,请查看 cat /proc/swaps 或 free 命令的输出来确保交换分区已被启用了。 4.4.2.2.添加交换文件 请参照以下方法: 在 Shell 提示下以根用户身份键入以下命令,其中的 count 为需要的交换文件大小(单位为 KB): #dd if=/dev/zero of=/swapfile bs=1024 count=65536 使用以下命令来设置交换文件: #mkswap /swapfile 要立即启用交换文件而不是在引导时自动启用,使用以下命令: #swapon /swapfile 要在引导时启用,编辑/etc/fstab 文件来包含以下行: /swapfile swap swap defaults 0 0 系统下次引导时,它就会启用新建的交换文件。 新添了交换分区并启用它之后,请查看 cat /proc/swaps 或 free 命令的输出来确保交换分区已被启用了。 4.4.3.删除交换空间 要删除交换分区: 1、硬盘驱动器不能再被使用(分区不能被挂载,交换分区不能被启用)。如果确认驱动器不包含任何被使用的分区,可以直接卸载(umount)这些分区,使用 swapoff 命令来关闭硬盘驱动器上的所有交换空间(以/dev/sdb2 为例): #swapoff /dev/sdb2 2、从/etc/fstab 中删除交换分区相关的条目。 3、删除分区(以 parted 工具为例): 在 Shell 提示下以根用户身份键入命令:parted /dev/sdb。这里的 /dev/sdb 是您要删除其中的交换空间的硬盘驱动器的设备名称。 在(parted)提示下,键入 print 来查看现存的分区并判定您想删除的交换分区的次要号码。 在(parted)提示下,键入 rm MINOR,这里的 MINOR 是您想删除的分区的次要号码。 警告:改变会立即发生,您必须键入正确的次要号码。 键入 quit 来退出 parted。 要删除交换文件: (1)在 Shell 提示下以 root 身份执行以下命令来禁用交换文件(这里的/swapfile 是交换文件): #swapoff /swapfile (2)从/etc/fstab 中删除该项目。 (3)删除实际文件: #rm /swapfile 4.4.4.移动交换空间 要把交换空间从某处移到另一处,请首先遵循删除交换空间的说明,再遵循添加交换空间的说明。
4.5.RAID 管理 4.5.1.RAID 是什么? RAID(独立磁盘冗余阵列)的基本目的是把多个磁盘驱动器结合成一组虚拟大容量的驱动器阵列使用,其特色是提升设备的访问性能和提供容错功能。这个驱动器阵列从用户角度看就如同一个单一的逻辑贮存单元或驱动器。 RAID 是一种在多个磁盘上分散信息的方法。它使用磁盘分条(disk striping,RAID 级别 0)、磁盘镜像(disk mirroring,RAID 级别 1)、和带有奇偶校验的磁盘分条(disk striping with parity,RAID级别 5)之类的技术来达到冗余性,降低潜伏时间,并且(或者)增加磁盘读写的带宽,提高从硬盘崩溃中恢复的能力。 RAID 的基本原理是:数据必须使用一致的形式被分散到阵列中的驱动器上。要达到这个目的,数据必须被分割成大小一致的“块”(大小通常是 32K 或 64K,也可使用不同大小)。每一块都会根据所用的RAID级别而写入其中的一个硬盘驱动器。当数据要被读取时,这个进程就会反过来进行,造成多个驱动器好象是一个大驱动器的假象。 4.5.2.谁应该使用 RAID 任何需要使大量数据便于存取的用户(如一般的系统管理员)都可以从 RAID 技术中受益。使用RAID的主要原因包括: 加快速度 增加贮存容量 减少磁盘失效带来的不利影响 4.5.3.硬件 RAID 和软件 RAID RAID 技术有两种:硬件 RAID 和软件 RAID。 4.5.3.1.硬件 RAID 基于硬件的系统从主机之外独立地管理 RAID 子系统,并且它在主机处把每一组 RAID 阵列只显示为一个磁盘。硬件 RAID 对于操作系统来说是透明的,操作系统层识别到的就是一个普通的硬盘,其管理方法与普通硬盘一致,不在此赘述。 4.5.3.2.软件 RAID 软件 RAID 由操作系统实现,因为它不需要昂贵的磁盘控制器卡或热交换底盘,软件RAID 提供了最廉价的解决方法。它还可以用在较便宜的 IDE 盘以及 SCSI 磁盘。 CGSL 内核的 MD 驱动程序是完全独立于硬件的RAID解决方案的范例。基于软件的阵列性能独立于服务器 CPU 的性能和载量之外。以下列举软件 RAID 的一些最重要的特性: 使用线程的进程重建 基于内核的配置 不必重建而可在 Linux 机器间迁移阵列 使用空闲的系统资源在后台重建阵列 对可热交换的驱动器的支持 对 CPU 的自动检测以便利用某些 CPU 优化功能 提示:热交换底盘允许您不必给系统断电而移除硬盘驱动器。 4.5.3.3.RAID 级别和线形支持 RAID 支持各类配置,包括级别 0、1、4、5 和线形。这些RAID类型的定义如下: 级别 0 —RAID 级别 0,经常被称作“分条”,它是面向性能的分条数据映射技术。这意味着被写入阵列的数据被分割成条,然后被写入阵列中的其它磁盘成员,从而允许低费用的高度 I/O 性能,但是它不提供冗余性。级别 0 阵列的贮存能力等于硬件 RAID 所有成员磁盘的总能力或软件 RAID 中所有成员分区的总能力。 级别 1 —RAID 级别 1,或“镜像”,被使用的时期长于任何其它形式的 RAID。级别 1 通过在阵列中的每个成员磁盘上写入相同的数据(在磁盘上留一个“镜像”副本)来提供冗余性。由于镜像的简单性和高度的数据可用性,它目前仍然很流行。使用两个以上磁盘操作的级别 1 可能会在读取时使用并行访问来获得高速数据传输,但是它更常用的是独立操作以提供高速 I/O 传输率。级别 1 提供了极佳的数据可靠性,并提高了读取任务繁重的程序的执行性能,但是它相对的费用也较高。级别 1 阵列的贮存能力与硬件 RAID 中被镜像的硬盘之一或软件 RAID 中被镜像的分区之一的贮存能力相同。 级别 4 —级别 4 使用集中到单个磁盘驱动器上的奇偶校验来保护数据。它更适合于事务性的 I/O 而不是大型文件传输。由于专职的奇偶校验磁盘代有固有瓶颈,级别 4 极少在没有写回缓存之类技术陪同的情况下使用。虽然 RAID 级别 4 在某些分区方案中是一种可选项目,它在 CGSL RAID 安装中却不是一个允许的选项。硬件级别 4 的贮存能力相当于所有成员磁盘去掉一个后的贮存能力。软件级别 4 的贮存能力相当于所有成员分区去掉一个后的贮存能力(如果它们的大小相同的话)。 级别 5 —这是最普遍的 RAID 类型。通过在某些或全部阵列成员磁盘驱动器中分布奇偶校验,RAID 级别 5 避免了级别4中固有的写入瓶颈。唯一的性能瓶颈是奇偶计算进程。 使用现代的 CPU 和软件 RAID,这种情况通常不是什么大问题。与级别 4 一样,其结果是非对称性能,读取大大地超过了写入性能。级别 5 经常与写回缓存一起使用来降低这种非对称性。硬件级别 5 的贮存能力相当于所有成员磁盘去掉一个后的贮存能力。软件 RAID 级别 5 的贮存能力相当于所有成员分区去掉一个后的贮存能力(如果它们的大小相同)。 线形 RAID —线形 RAID 是一种用简单的驱动器聚组来创建一个较大的虚拟驱动器的方法。在线形 RAID 中,区块从一个成员驱动器到另一个成员驱动器被依次分配,只有在第一个驱动器被完全填充后,才转到下一个驱动器。这种聚组没有提供任何性能方面的利益,因为 I/O 操作不太可能在成员驱动器间被分开。线形 RAID 也没有提供任何冗余性,事实上,它降低了可靠性 — 如果任何一个成员驱动器失效了,整个阵列都不能被使用。它的贮存能力是所有成员磁盘的总和。 提示:RAID 级别 1 的代价很高,因为您把相同的信息写入阵列中的所有磁盘,这浪费了驱动器空间。譬如,如果您设立了 RAID 级别 1,因而您的根分区(/)存在于两个大小各为 40G 的驱动器上,您虽然总共有 80G 空间,却只能实际利用其中的 40G,因为另外的 40G 就如同前 40G 的镜像一样。 提示:奇偶校验的信息是基于阵列中的其它磁盘成员的内容来计算的。当阵列中的某个磁盘上的数据失效时,这则信息就会被用来重建数据。然后,在替换失效磁盘之前,被重建的数据可以用来满足失败磁盘上的 I/O 请求;在替换失效磁盘之后,它可以用来在新磁盘上重建数据。 提示:RAID 级别 4 与级别 5 所占空间相同,但是级别5却优于级别 4。由于这个原因,级别 4 不被支持。 4.5.4.mdadm 管理软 RAID 阵列 4.5.4.1.创建新的阵列 mdadm 使用--create(或其缩写 -C)参数来创建新的阵列,并且将一些重要阵列的标识信息作为元数据可以写在每一个底层设备的指定区间。--level(或者其缩写 -l)表示阵列的 RAID 级别,--chunk(或者其缩写 -c)表示每个条带单元的大小,以 KB 为单位,默认为 64KB,条带单元的大小配置对不同负载下的阵列读写性能有很大影响。--raid-devices(或者其缩写 -n)表示阵列中活跃的设备个数,而--spare-devices(或者其缩写 -x)表示阵列中热备盘的个数,一旦阵列中的某个磁盘失效,MD内核驱动程序自动将热备磁盘加入到阵列,然后重构丢失磁盘上的数据到热备磁盘上。 创建一个 RAID 0 设备: #mdadm --create /dev/md0 --level=0 --chunk=32 --raid-devices=3 /dev/sd[i-k]1 使用阵列: MD 设备可以像普通块设备那样直接读写,也可以做文件系统格式化。 #mkfs.ext4 /dev/md0 #mkdir -p /mnt/md-test #mount /dev/md0 /mnt/md-test 停止正在运行的阵列: 当阵列没有文件系统或者其他存储应用以及高级设备使用的话,可以使用--stop(或者其缩写-S)停止阵列;如果命令返回设备或者资源忙类型的错误,说明/dev/md0 正在被上层应用使用,暂时不能停止,必须要首先停止上层的应用,这样也能保证阵列上数据的一致性。 #mdadm --stop /dev/md0 4.5.4.2.组装曾创建过的阵列 模式--assemble 或者其缩写(-A)主要是检查底层设备的元数据信息,然后再组装为活跃的阵列。如果我们已经知道阵列由那些设备组成,可以指定使用那些设备来启动阵列。 #mdadm -A /dev/md0 /dev/sd[b-h] 配置文件: /etc/mdadm.conf 作为默认的配置文件,主要作用是方便跟踪软 RAID 的配置,尤其是可以配置监视和事件上报选项。Assemble 命令也可以使用--config(或者其缩写-c)来指定配置文件。我们通常可以如下命令来建立配置文件。 #echo DEVICE /dev/sd[b-h] /dev/sd[i-k]1 > /etc/mdadm.conf #mdadm -Ds >>/etc/mdadm.conf #cat /etc/mdadm.conf 4.5.4.3.查询阵列的状态 我们可以通过 cat /proc/mdstat 信息查看所有运行的 RAID 阵列的状态,在第一行中首先是MD的设备名,active 和 inactive 选项表示阵列是否能读写,接着是阵列的 RAID 级别,后面是属于阵列的块设备,方括号[]里的数字表示设备在阵列中的序号,(S)表示其是热备盘,(F)表示这个磁盘是 faulty 状态。在第二行中首先是阵列的大小,单位是 KB,接着是 chunk-size 的大小,然后是 layout 类型,不同 RAID 级别的 layout 类型不同,[6/6]和[UUUUUU]表示阵列有 6 个磁盘并且 6 个磁盘都是正常运行的,而[5/6]和[_UUUUU] 表示阵列有 6 个磁盘中 5 个都是正常运行的,下划线对应的那个位置的磁盘是 faulty 状态的。 #cat /proc/mdstat 4.5.4.4.管理阵列 mdadm 可以在 Manage 模式下,对运行中的阵列进行添加及删除磁盘。常用于标识 failed 磁盘,增加 spare(热备)磁盘,以及从阵列中移走已经失效的磁盘等等。使用--fail(或者其缩写-f)指定磁盘损坏。 # mdadm /dev/md0 --fail /dev/sdb 当磁盘已经损坏时,使用--remove(或者其缩写--f)参数将这个磁盘从磁盘阵列中移走;但如果设备还正在被阵列使用,则不能从阵列中移走。 # mdadm /dev/md0 --remove /dev/sdb 4.5.4.5.监控阵列 可以使用 mdadm 对 RAID 阵列进行监控,监控程序定时查询指定的事件是否发生,然后根据配置来妥善处理。 #mdadm --monitor --mail=root@localhost --program=/root/md.sh --syslog --delay=300 /dev/md0 --daemonise 查看系统日志信息,可以看到哪个阵列或者阵列中的哪个设备发生过的哪些事件。 #mdadm -f /dev/md0 /dev/sdb 4.5.4.6.扩展阵列 如果在创建阵列时不想使用整个块设备,可以指定用于创建 RAID 阵列每个块设备使用的设备大小。 #dadm -CR /dev/md0 -l5 -n6 /dev/sd[b-g] -x1 /dev/sdh --size=102400 然后在阵列需要扩展大小时,使用模式--grow(或者其缩写-Q)以及--size 参数(或者其缩写-z) 在加上合适的大小数值就能分别扩展阵列所使用每个块设备的大小。 [root@fc5 mdadm-2.6.3]#./mdadm -Q /dev/md0 /dev/md0: 500.00MiB raid5 6 devices, 1 spare. Use mdadm --detail for more detail. [root@fc5 mdadm-2.6.3]#./mdadm --grow /dev/md0 --size=204800 [root@fc5 mdadm-2.6.3]#cat /proc/mdstat Personalities : [raid0] [raid10] [raid6] [raid5] [raid4] md0 : active raid5 sdh[6](S) sdg[5] sdf[4] sde[3] sdd[2] sdc[1] sdb[0] 1024000 blocks level 5, 64k chunk, algorithm 2 [6/6] [UUUUUU] [======>......] resync = 69.6% (144188/204800) finish=0.0min speed=10447K/sec unused devices: <none> [root@fc5 mdadm-2.6.3]#./mdadm -Q /dev/md0 /dev/md0: 1000.00MiB raid5 6 devices, 1 spare. Use mdadm --detail for more detail. 4.5.4.7.Bitmap 记录 使用 bitmap 模式记录 RAID 阵列有多少个块已经同步(resync)。参数--bitmap(或者其缩写-b)指定记录 bitmap 信息的文件名,如果是 interval 参数表示 bitmap 记录在每个设备的元数据区。--bitmap-chunk 表示每个 bit 位代表 RAID 设备多大的数据块,单位是 KB;而--delay(或者其缩写-d)指定多长事件同步 bitmap 信息到文件或者设备上,单位是秒,默认是 5 秒。--force(或者其缩写)表示覆盖掉已经存在 bitmap 文件。而且使用参数--examine-bitmap(或者其缩写-X)能够查看存储在文件或者设备元数据中的 bitmap 记录的信息。 #mdadm -CR /dev/md1 -l1 -n2 /dev/sdi1 /dev/sdj1 --bitmap=internal
4.6.逻辑卷管理器(LVM) LVM 是一种把硬盘驱动器空间分配成逻辑卷的方法。使用 LVM,硬盘驱动器或硬盘驱动器集合会分配给一个或多个物理卷(physical volumes)。物理卷无法跨越一个以上驱动器。 物理卷被合并成逻辑卷组(logical volume group),如 图 4-3 ,唯一的例外是/boot/分区。/boot/ 分区不能位于逻辑卷组,因为引导装载程序无法读取它。如果您想把/分区放在逻辑卷上,您需要创建一个分开的/boot/ 分区,它不属于卷组的一部分。
图 4-3 逻辑卷组 逻辑卷组被分成逻辑卷(logical volumes,相当于无LVM环境中的“分区”),如 图 4-4 ,它们被分配了挂载点(如/home 和/),以及文件系统类型(如 ext4)。当“分区”达到了它们的极限,逻辑卷组中的空闲空间就可以被添加给逻辑卷来增加分区的大小。当某个新的硬盘驱动器被添加到系统上,它可以被添加到逻辑卷组中,逻辑卷是可以扩展的分区。
图 4-4 逻辑卷 CGSL 默认支持 LVM,LVM 命令摘要、用法说明及示例如下:
4.6.1.LVM 创建及配置示例 1、使用 fdisk 创建分区: #fdisk /dev/sdb 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-261, default 1): Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-261, default 261): +500M Command (m for help): t Selected partition 1 Hex code (type L to list codes): 8e // 8e为LVM格式的代码 Changed system type of partition 1 to 8e (Linux LVM) Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 2 First cylinder (66-261, default 66): Using default value 66 Last cylinder, +cylinders or +size{K,M,G} (66-261, default 261): +500M Command (m for help): t Partition number (1-4): 2 Hex code (type L to list codes): 8e Changed system type of partition 2 to 8e (Linux LVM) Command (m for help): p Disk /dev/sdb: 2147 MB, 2147483648 bytes 255 heads, 63 sectors/track, 261 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: 0x2dfa2374 Device Boot Start End Blocks Id System /dev/sdb1 1 65 522081 8e Linux LVM /dev/sdb2 66 130 522112+ 8e Linux LVM Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. 2、将分区转换为 PV(物理卷): #pvcreate /dev/sdb1 Writing physical volume data to disk "/dev/sdb1" Physical volume "/dev/sdb1" successfully created #pvcreate /dev/sdb2 Writing physical volume data to disk "/dev/sdb2" Physical volume "/dev/sdb2" successfully created 3、将 PV 组合成卷组 VG(卷组) #vgcreate myvg1 /dev/sdb1 /dev/sdb2 Volume group "myvg1" successfully created 4、创建逻辑卷 LV #lvcreate -L 800M -n mylv1 myvg1 Logical volume "mylv1" created 5、vgdisplay 及 lvdisplay 的相关信息 #vgdisplay --- Volume group --- VG Name myvg1 System ID Format lvm2 Metadata Areas 2 Metadata Sequence No 2 VG Access read/write VG Status resizable MAX LV 0 Cur LV 1 Open LV 0 Max PV 0 Cur PV 2 Act PV 2 VG Size 1016.00 MiB PE Size 4.00 MiB Total PE 254 Alloc PE / Size 200 / 800.00 MiB Free PE / Size 54 / 216.00 MiB VG UUID 622JHS-61WH-VtKK-29i0-Ef0D-Icar-dBn83k #lvdisplay --- Logical volume --- LV Name /dev/myvg1/mylv1 VG Name myvg1 LV UUID IdqHyQ-cEkp-Hz4X-ulPv-kvY3-nmTi-uRmGqw LV Write Access read/write LV Status available # open 0 LV Size 800.00 MiB Current LE 200 Segments 2 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:2 6、格式化 LVM 分区并挂载分区: #mkfs.ext4 /dev/mapper/myvg1-mylv1 #mkdir /mylv1 #mount /dev/mapper/myvg1-mylv1 /mylv1 7、对已挂载的 LVM 文件系统进行扩容: 未扩容前: /dev/mapper/myvg1-mylv1 788M 17M 731M 3% /mylv1 使用 lvextend 和 resize2fs 进行在线扩容: #lvextend -L +100M /dev/mapper/myvg1-mylv1 Extending logical volume mylv1 to 900.00 MiB Logical volume mylv1 successfully resized # resize2fs /dev/mapper/myvg1-mylv1 resize2fs 1.41.12 (17-May-2017) Filesystem at /dev/mapper/myvg1-mylv1 is mounted on /mylv1; on-line resizing required old desc_blocks = 1, new_desc_blocks = 1 Performing an on-line resize of /dev/mapper/myvg1-mylv1 to 230400 (4k) blocks. The filesystem on /dev/mapper/myvg1-mylv1 is now 230400 blocks long. 扩容后: /dev/mapper/myvg1-mylv1 886M 17M 829M 3% /mylv1
4.7.设备映射多路径(DM-Multipath) 4.7.1.DM-Multipath 概述 device-mapper-multipath(简称 DM-Multipath)是 CGSL 系统自带的多路径软件,可让您将服务器节点和存储阵列间的多个 I/O 路径配置为一个单一设备。这些 I/O 路径是可包含独立电缆、交换机以及控制器的物理 SAN 连接。多路径集合了 I/O 路径,并生成由这些整合路径组成的新设备。 可使用 DM-Multipath 提供: 冗余功能:DM-Multipath 可在主动/被动配置中提供出错冗余。在主动/被动配置中,只有一半的路径在每次 I/O 时都使用。如果 I/O 路径的任意元素(电缆、交换机或者控制器)出现故障,就会将 DM-Multipath 切换到备用路径。 性能提高:可将 DM-Multipath 配置为主动/主动模式,其中将 I/O 以轮叫调度算法方式分布到所有路径中。在有些配置中,DM-Multipath 可在 I/O 路径中检测负载并动态重新平衡负载。 4.7.2.DM-Multipath 配置及管理示例 手动加载 multipath 模块 # modprobe dm-multipath # modprobe dm-round-robin 使用 mpathconf 程序设置多路径,它可创建多路径配置文件/etc/multipath.conf。使用以下步骤为基本故障切换配置设置 DM-Multipath: 1、运行带 --enable 选项的 mpathconf 命令: # mpathconf –enable 2、编辑/etc/multipath.conf 文件,设置相关的特性,编辑完成保存配置文件并退出。如果不清楚阵列的特性,可以使用 path_grouping_policy 的默认值 failover(倒换)。 3、重启服务: # service multipathd start 4、清空已有的 multipath 记录 # mutilpath -F 5、重新扫描设备 # mutilpath -v2 6、查看所有设备(举例) # mutilpath -ll 36001438002a56fd60000600001c60000 dm-250 HP,HSV450 [size=5.0G][features=1 queue_if_no_path][hwhandler=0] \_ round-robin 0 [prio=10][enabled] \_ 2:0:5:4 sdck 69:128 [active][ready] \_ 5:0:5:4 sdhz 134:128 [active][ready] \_ round-robin 0 [prio=50][enabled] \_ 2:0:0:4 sdz 69:14 [active][ready] \_ 5:0:0:4 sdhk 134:44 [active][ready] 360060e801439ba00000139ba00002209 dm-62 HP,OPEN-V [size=8.0G][features=1 queue_if_no_path][hwhandler=0] \_ round-robin 0 [prio=2][active] \_ 5:0:4:9 sdlv 128:27 [active][ready] \_ 2:0:2:9 sdaq 134:0 [active][ready] \_ 5:0:7:9 sdnv 128:272 [active][ready] \_ 2:0:11:9 sdhq 134:0 [active][ready] 以上是 device-mapper-mulitpath 生成的设备,分别为 dm-250 和 dm-62 其中 dm-250 对应的物理设备是 sdck、sdhz、sdz、sdhk dm-62 对应的物理设备是 sdlv、sdag、sdnv、sdhq
相关主题 |