Too young, too simple. Sometimes, naive & stupid

Linux存储管理

安装期间的存储注意事项

许多存储设备和文件系统设置只能在安装时进行配置。其他设置(如文件系统类型)只能在不需要重新格式化的情况下进行修改。因此,在安装红帽企业版Linux 7之前,谨慎的规划您的存储配置。

特别注意事项

列举了特定存储配置需要考虑的几个问题和因素。

单独分区为 /home, /opt, /usr/local

If it is likely that you will upgrade your system in the future, place /home, /opt, and /usr/local on a separate device. This will allow you to reformat the devices/file systems containing the operating system while preserving your user and application data.

IBM System Z 上的 DASD和zFCP设备

在IBM System Z平台上, DASD 和 zFCP 设备通过 Channel Command Word (CCW) 机制进行配置. CCW路径必须显式添加到系统中,然后才能联机。 对于DASD设备, 这只是意味着列出设备号码(或设备号码范围), DASD= 参数在引导命令行或CMS配置文件中。

对于zFCP设备,必须列出设备号, 逻辑单元号 (LUN), and 全球端口名 (WWPN). 一旦zFCP设备被初始化,它被映射到CCW路径。 The FCP_x= 启动命令行(或在CMS配置文件)上线,您可以指定该信息的安装程序。

使用LUKS加密块设备

使用LUKS /格式化块设备进行加密dm-crypt将会破坏该设备上的任何现有格式。因此,在新系统的存储配置作为安装过程的一部分被激活之前,您应该决定要加密哪些设备(如果有的话)。

陈旧的BIOS RAID元数据

从配置为固件RAID的系统移动磁盘而不从磁盘中移除RAID元数据可能会阻止Anaconda正确检测磁盘。

从磁盘删除/删除RAID元数据可能会破坏任何存储的数据。红帽建议您在继续之前备份您的数据。

要从磁盘删除RAID元数据,请使用以下命令:

dmraid -r -E /*device*/

iSCSI检测和配置

对于iSCSI驱动器的即插即用检测,请将其配置在具有iBFT启动功能的网络接口卡(NIC)的固件中。在安装过程中支持iSCSI目标的CHAP身份验证。但是,安装期间不支持iSNS发现。

FCoE检测和配置

对于以太网光纤通道(FCoE)驱动器的即插即用检测,请在具有EDD引导功能的NIC的固件中对其进行配置。

DASD

直接访问存储设备(DASD)不能在安装过程中添加/配置。这些设备在CMS配置文件中指定。

块设备启用DIF/DIX

DIF/DIX 是某些SCSI主机总线适配器和块设备提供的硬件校验和功能. 启用 DIF/DIX 时, 如果块设备用作通用块设备,则会发生错误。 缓冲的 I/O 或 mmap(2)-基于 I/O 将无法可靠地工作,因为在缓冲写入路径中没有互锁,以防止在计算了 DIF/DIX 校验和之后缓冲的数据被覆盖。

这将导致 I/O 稍后失败并出现校验和错误。这个问题对所有块设备(或基于文件系统)缓冲的 I/O 或 mmap(2) I/O, 都很常见,所以不可能解决这些由覆盖造成的错误。

因此,启用了 DIF/DIX 的块设备只能与使用的应用程序一起使用 O_DIRECT. 这样的应用程序应该使用原始块设备。或者,只要在文件系统中只发出 O_DIRECT I/O . 在启用了DIF/DIX的块设备上使用XFS文件系统也是安全的。XFS是唯一一个在执行某些分配操作时不会回退到缓冲I/O的文件系统。

在计算完 DIF/DIX 校验和之后,确保I/O数据不会改变的责任始终在于应用程序,因此只有为 O_DIRECT I/O 和 DIF/DIX 硬件设计的应用程序才能使用 DIF/DIX.

文件系统检查

可以使用文件系统特定的用户空间工具检查文件系统的一致性,并可以选择修复。这些工具通常被称为fsck工具,其中fsck是缩短版本的文件系统检查

注意

文件系统不一致可能由于各种原因而发生,包括但不限于硬件错误,存储管理错误和软件错误。

这些文件系统检查程序只保证整个文件系统的元数据一致性; 他们没有意识到文件系统中包含的实际数据,而不是数据恢复工具。

在现代元数据记录文件系统变得普遍之前,系统崩溃或断电时都需要进行文件系统检查。这是因为文件系统更新可能被中断,导致状态不一致。因此,文件系统检查通常/etc/fstab在引导时列出的每个文件系统上运行。对于日志文件系统,这通常是非常短的操作,因为文件系统的元数据日志记录即使在崩溃之后也能确保一致性。

但是,即使对于日志记录文件系统,有时甚至可能发生文件系统不一致或损坏。发生这种情况时,必须使用文件系统检查程序修复文件系统。以下内容将提供执行此过程时的最佳实践和其他有用信息。

除非计算机无法启动,文件系统非常大或者文件系统位于远程存储中,否则Red Hat不建议使用此功能。通过将/etc/fstab中的第六个字段设置为0,可以在启动时禁用文件系统检查。

fsck最佳实践

一般来说,运行文件系统检查和修复工具可以自动修复至少一些找到的不一致之处。在某些情况下,严重损坏的索引节点或目录如果无法修复,可能会被丢弃。文件系统的重大更改可能会发生。为确保不会永久性发生意想不到的变化,请执行以下预防措施:

  • 演习

    大多数文件系统检查程序有一个操作模式,可以检查文件系统,但不会修复文件系统。在这种模式下,检查器将打印它找到的任何错误和应该采取的操作,而不实际修改文件系统。

    一致性检查的后续阶段可能会打印额外的错误,因为它发现了不一致的情况,如果在修复模式下运行,它们在早期阶段就会被修复。

  • 首先在文件系统映像上运行

    大多数文件系统都支持创建元数据映像,这是一个只包含元数据的文件系统的稀疏副本。由于文件系统检查程序仅对元数据进行操作,因此可以使用此映像执行实际文件系统修复的空运行,以评估实际进行的更改。如果更改是可接受的,则修复可以在文件系统上执行。

    严重损坏的文件系统可能会导致元数据映像创建出现问题。

  • 保存文件系统映像以进行支持调查

    修复前的文件系统元数据映像通常可以用于支持调查,如果有可能是由于软件错误引起的。修复前图像中存在的腐败模式可能有助于根源分析。

  • 仅在卸载的文件系统上运行

    文件系统的修复只能在未安装的文件系统上运行。该工具必须能够唯一访问文件系统,否则可能会导致进一步的损坏。大多数文件系统工具在修复模式下强制执行此要求,尽管某些文件系统仅支持在已安装的文件系统上进行只检查模式。如果在已安装的文件系统上运行只检查模式,则可能会发现在卸载的文件系统上运行时不会发现的虚假错误。

  • 磁盘错误

    文件系统检查工具不能修复硬件问题。如果修复成功,文件系统必须完全可读写。如果文件系统由于硬件错误而损坏,则必须首先将文件系统移动到合适的磁盘上,例如使用 dd(8) 实用程序.

FSCK的文件系统特定信息

ext2, ext3, 和 ext4

所有这些文件系统都使用 e2fsck 二进制来执行文件系统检查和修复. 文件名 fsck.ext2, fsck.ext3, 和 fsck.ext4 都硬链接到这个相同的二进制文件. 这些二进制文件在启动时自动运行,其行为根据被检查的文件系统和文件系统的状态而不同。

对ext2(不是元数据日志文件系统)和ext4文件系统(不带日志)调用完整的文件系统检查和修复.

对于具有元数据日记功能的ext3和ext4文件系统,将在用户空间中重播日志,并退出二进制文件。这是默认操作,因为日志重播确保崩溃后的文件系统一致

如果这些文件系统在挂载时遇到元数据不一致的情况,他们会将这个事实记录在文件系统超级块中。 如果 e2fsck 发现文件系统标有这样的错误 e2fsck 将在重播日志(如果存在)后执行完整检查。

e2fsck 如果没有指定-p选项 ,则可以在运行期间询问用户输入。 -p项告诉 e2fsck 自动执行所有可能安全完成的修理。如果需要用户干预, e2fsck 将在其输出中指示未固定的问题,并在退出代码中反映此状态。

常用的 e2fsck 运行时选项包括:

  • -n

    无修改模式。只检查操作。

  • -b superblock

    如果主要的损坏,指定一个备用的suprerblock的块号。

  • -f

    即使超级块没有记录错误,也强制进行全面检查。

  • -j journal-dev

    指定外部日志设备(如果有)。

  • -p

    在没有用户输入的情况下自动修复或“修改”文件系统。

  • -y

    对所有问题都回答“是”。

    e2fsck所有选项都在 e2fsck(8) 手册页中。

e2fsck 运行时 执行以下五个基本阶段:

  1. Inode, block,和大小检查。
  2. 目录结构检查。
  3. 目录连接检查。
  4. 引用计数检查。
  5. 小组汇总信息检查。

    e2image(8) 在修复之前, 该实用程序可用于创建元数据映像以用于诊断或测试目的。 -r 选项应该用于测试目的,以创建一个与文件系统本身相同大小的稀疏文件。 e2fsck 然后可以直接对结果文件进行操作。 如果要将图像归档或提供用于诊断,应指定-Q选项 ,这创建了一个适合传输的更紧凑的文件格式。

XFS

在启动时不会自动执行修复。要启动文件系统检查或修复,使用 xfs_repair 工具。

注意

尽管xfsprogs包中有一个二进制文件 fsck.xfs ,但它只是为了满足在启动时查找二进制文件 fsck.*filesystem*的初始化脚本 . fsck.xfs 立即退出,退出代码为0.

另一件需要注意的是旧的xfsprogs包包含一个 xfs_check 工具。这个工具非常慢,对于大型文件系统来说效果不好。因此, 它已被弃用,推荐使用xfs_repair -n`.

xfs_repair 操作,文件系统上必须是干净的日志, 如果文件系统没有完全卸载, 在使用 xfs_repair之前应该挂载和卸载. 如果日志损坏且无法重播, 可以使用 -L 选项将日志归零.

重要

-L 选项 只有在日志无法重播的情况下才能使用. 该选项会丢弃日志中的所有元数据更新,并将导致进一步的不一致.

可以在演习运行 xfs_repair , 运行check-only模式通过 -n 选项. 不会对文件系统进行更改。

xfs_repair 需要很少的选项。常用的选项包括:

  • -n

    没有修改模式。只检查操作。

  • -L

    零元数据日志。只有在日志不能用mount重放时才使用。

  • -m maxmem

    将运行期间使用的内存限制为 maxmem MB. 可以指定0来获得所需最小内存的粗略估计。

  • -l logdev

    指定外部日志设备(如果存在)。

    xfs_repair 的所有选项都在 xfs_repair(8) 手册页中指定.

xfs_repair 运行时 执行以下八个基本阶段:

  1. Inode 和 inode 块映射 (寻址) 检查.
  2. Inode 分配映射检查.
  3. Inode 大小检查.
  4. 目录检查.
  5. 路径名检查.
  6. 链接计数检查.
  7. Freemap检查.
  8. 超级块检查.

xfs_repair 不是交互的. 所有的操作都是在没有用户输入的情况下自动执行的.

如果希望在修复之前创建元数据映像以用于诊断或测试目的,可以使用xfs_metadump(8)xfs_mdrestore(8)

Btrfs

btrfsck 工具用于检查和修复btrfs文件系统。此工具仍处于早期开发阶段,可能无法检测或修复所有类型的文件系统损坏。

默认情况下, btrfsck 不对文件系统进行更改; 也就是说,它默认运行只检查模式。如果需要修复,必须指定 --repair 选项。

btrfsck运行时 执行以下三个基本阶段 :

  1. 范围检查。
  2. 文件系统根检查。
  3. 根引用计数检查。

在修复之前btrfs-image(8) 可用于创建元数据映像以用于诊断或测试目的。

分区

使用 parted 程序,您可以:

  • 查看现有的分区表。
  • 改变现有分区的大小。
  • 从可用空间或其他硬盘添加分区。

Parted软件包默认安装在Red Hat Enterprise Linux 7上. 启动 parted, 以root身份登录 ,在shell下运行 parted */dev/sda*

其中 /dev/sda 是要配置的驱动器设备名称。

在正在使用的设备上操作分区

对于不使用的设备,不能使用设备上的分区进行挂载,也不能使能设备的交换空间。

如果要删除或调整分区的大小,则不得使用该分区所在的设备。

在正在使用的设备上创建新分区是可能的,但不推荐使用。

修改分区表

通常不建议在同一磁盘上的另一个分区正在使用的同时修改分区表,因为内核无法重新读取分区表。因此,更改不适用于正在运行的系统。在描述的情况下,重新启动系统,或使用以下命令使系统注册新的或修改的分区:

1
# partx --update --nr partition-number disk

修改当前正在使用的磁盘的最简单方法是,如果无法卸载磁盘上的分区(例如在系统磁盘的情况下),则以救援模式引导系统。当提示安装文件系统时,请选择跳过

如果驱动器不包含任何正在使用的分区,也就是没有使用或锁定文件系统的系统进程被卸载,则可以使用umount命令卸载分区,并使用swapoff命令关闭硬盘上的所有交换空间。

不要使用parted实用程序来创建文件系统。改用mkfs工具。

parted Commands

Command Description
check minor-num 执行文件系统的简单检查
cp from to 从一个分区复制文件系统到另一个分区; 是分区的次要数字
help 显示可用命令的列表
mklabel label 为分区表创建一个磁盘标签
mkfs minor-num file-system-type 创建一个文件系统类型的文件系统
mkpart part-type [fs-type] start-mb**end-mb 创建一个分区而不创建新的文件系统
mkpartfs part-type fs-type start-mb end-mb 创建一个分区并创建指定的文件系统
move minor-num start-mb end-mb 移动分区
name minor-num name 只为Mac和PC98磁盘标签命名分区
print 显示分区表
quit 退出 parted
rescue start-mb end-mb start-mbend-mb挽救一个丢失的分区
resize minor-num start-mb end-mb 调整分区从start-mbend-mb的大小
rm minor-num 删除分区
select device 选择一个不同的设备进行配置
set minor-num flag state 在分区上设置标志; 状态是打开还是关闭
toggle [NUMBER [FLAG] NUMBER分区上切换FLAG的状态
unit UNIT 将默认单位设置为UNIT

查看分区表

启动parted, 使用 print 命令来查看分区表。出现类似如下的表格:

分区表

1
2
3
4
5
6
7
8
9
10
11
12
13
Model: ATA ST3160812AS (scsi)
Disk /dev/sda: 160GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number Start End Size Type File system Flags
1 32.3kB 107MB 107MB primary ext3 boot
2 107MB 105GB 105GB primary ext3
3 105GB 107GB 2147MB primary linux-swap
4 107GB 160GB 52.9GB extended root
5 107GB 133GB 26.2GB logical ext3
6 133GB 133GB 107MB logical ext3
7 133GB 160GB 26.6GB logical lvm

第一行包含磁盘类型,制造商,型号和接口,第二行显示磁盘标签类型。第四行下面的剩余输出显示分区表。

在分区表中, 次要号码是分区 number. 例如,次号为1的分区对应于 /dev/sda1. StartEnd 值以MB为单位。 有效的 Type 是元数据, free(空闲), primary(主), extended(扩展), or logical(逻辑). Filesystem 是文件系统的类型,其可以是任何以下的:

  • ext2
  • ext3
  • fat16
  • fat32
  • hfs
  • jfs
  • linux-swap
  • ntfs
  • reiserfs
  • hp-ufs
  • sun-ufs
  • xfs

如果某个Filesystem设备没有显示任何值,则表示其文件系统类型未知。

标志列列出了分区被设置的标志。可用的标志有 boot, root, swap, hidden, raid, lvm, or lba.

要选择不同的设备而不必重新启动parted,请使用select命令后跟设备名称(例如/dev/sda)。这样做可以让您查看或配置设备的分区表。

创建分区

==不要尝试在正在使用的设备上创建分区。==

创建分区

  1. 在创建分区之前,启动进入救援模式(或卸载设备上的任何分区,并关闭设备上的交换空间)。

  2. 开始parted,在哪里创建分区的设备: /dev/sda

1
# parted /dev/sda
  1. 查看当前分区表以确定是否有足够的可用空间:
1
# print

如果没有足够的可用空间,则可以调整现有分区的大小。

分区

从分区表中,确定新分区的起点和终点以及它应该是什么分区类型。设备上只能有四个主分区(没有扩展分区)。如果您需要四个以上的分区,则扩展中可以有三个主分区,一个扩展分区和多个逻辑分区。

例如,要创建一个ext3文件系统从1024兆字节到2048兆字节的硬盘上的主分区,请键入以下命令:

1
# mkpart primary 1024 2048

注意

如果使用该mkpartfs命令,则在创建分区后创建文件系统。但是,parted不支持创建ext3文件系统。因此,如果您希望创建一个ext3文件系统,请按照稍后所述使用mkpart和创建文件系统mkfs

Enter键后,所做的更改就会开始,因此在执行命令之前先查看命令。

创建分区后,使用该print命令确认它在正确的分区类型,文件系统类型和大小的分区表中。还要记住新分区的次要号码,以便您可以在其上标记任何文件系统。您还应该查看cat /proc/partitions关闭后的输出,以确保内核识别新分区。

分区分区的最大数量将为128.尽管GUID分区表(GPT)规范允许通过增加为分区表保留的区域来增加分区,但分区使用的常见做法是将其限制为足够的区域用于128个分区。

格式化和标记分区

要格式化和标记分区,请使用以下过程:

格式化和标记分区

  1. 该分区没有文件系统。要创建ext4文件系统,请使用:
1
# mkfs.ext4 /dev/sda6

警告

格式化分区将永久销毁分区上当前存在的任何数据。

  1. 接下来,给分区上的文件系统一个标签。例如,如果新分区上的文件系统是/dev/sda6并且要标记它/work,请使用:

    1
    # e2label /dev/sda6 /work

默认情况下,安装程序使用分区的挂载点作为标签来确保标签是唯一的。你可以使用任何你想要的标签。

之后,以root身份创建一个安装点(例如/work)。

添加/etc/fstab

以root /etc/fstab身份,使用分区的UUID 编辑文件以包含新的分区。使用该命令blkid -o list可以获得分区UUID的完整列表,也可以blkid device查看各个设备的详细信息。

第一列应该包含UUID=文件系统的UUID。第二列应包含新分区的挂载点,下一列应为文件系统类型(例如,ext3或swap)。如果您需要更多关于格式的信息,请使用该命令阅读手册页man fstab

如果第四列是该字defaults,则在引导时挂载分区。要挂载分区而不重新启动,请以超级用户身份键入以下命令:

mount /work

删除分区

==不要尝试删除正在使用的设备上的分区。==

删除分区

  1. 在删除分区之前,启动进入救援模式(或卸载设备上的任何分区,并关闭设备上的交换空间).

  2. 启动 parted, 删除sda设备上的分区。

​```bash

parted /dev/sda

1
2
3
4
5

3. 查看当前分区表以确定要删除的分区的次号码:

```bash
# print
  1. 用命令rm删除分区 . 例如,要删除次编号为3的分区:
1
# rm 3

Enter键,所做的更改就会开始,因此在提交之前先查看命令。

  1. 删除分区后,使用 print 命令确认它已从分区表中删除。您还应该查看输出/proc/partitions以确保内核知道分区已被删除。
1
# cat /proc/partitions
  1. 最后一步是从/etc/fstab文件中删除它。找到声明已删除分区的行,并将其从文件中删除。

设置分区类型

分区类型,不要与文件系统类型混淆,很少被运行的系统使用。但是,分区类型对即时生成器很重要,例如systemd-gpt-auto-generator使用分区类型来自动识别和挂载设备。

您可以启动该fdisk实用程序并使用该t命令来设置分区类型。以下示例显示如何将第一个分区的分区类型更改为0x83,在Linux上是default:

1
2
3
4
5
# fdisk /dev/sdc
Command (m for help): t
Selected partition 1
Partition type (type L to list all types): 83
Changed type of partition 'Linux LVM' to 'Linux'.

parted 程序通过尝试将分区类型映射到“标志”来提供对分区类型的一些控制,这对最终用户不方便。该parted实用程序只能处理某些分区类型,例如LVM或RAID。例如,要删除第一个分区的lvm标志parted,使用:

1
2
parted
# parted /dev/sdc 'set 1 lvm off'

使用FDISK调整分区大小

fdisk实用程序允许您创建和操作GPT,MBR,Sun,SGI和BSD分区表。在具有GUID分区表(GPT)的磁盘上,parted建议使用该实用程序,因为fdiskGPT支持处于试验阶段。

在调整分区大小之前,备份存储在文件系统的数据并测试过程,因为使用的唯一方法是更改分区大小,方法fdisk是删除并重新创建分区。

重要

您正在调整大小的分区必须是特定磁盘上的最后一个分区。

红帽只支持扩展和调整LVM分区的大小。

调整分区大小

以下程序仅供参考。要使用fdisk以下命令调整分区大小:

  1. 卸载设备:
1
# umount /dev/vda
  1. 运行 fdisk *disk_name*. 例如:
1
2
3
4
5
6
# fdisk /dev/vda
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them. Be careful before using the write command.

Command (m for help):
  1. 使用 p 选项确定要删除的分区的行号。
1
2
3
4
5
6
7
8
9
10
11
Command (m for help): p
Disk /dev/vda: 16.1 GB, 16106127360 bytes, 31457280 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
Disk label type: dos
Disk identifier: 0x0006d09a

Device Boot Start End Blocks Id System
/dev/vda1 * 2048 1026047 512000 83 Linux
/dev/vda2 1026048 31457279 15215616 8e Linux LVM
  1. 使用 d 选项删除分区. 如果有多个可用的分区,fdisk则会提示您提供一个要删除的分区的编号:

    1
    2
    3
    Command (m for help): d
    Partition number (1,2, default 2): 2
    Partition 2 is deleted
  1. 使用 n 选项创建分区并按照提示进行操作。留出足够的空间用于将来调整大小. fdisk 默认行为 (输入 Enter) 是使用设备上的所有空间. 您可以按扇区指定分区的末尾, 也可以使用 +*<size>**<suffix>*, 例如 +500M, 或者 +10G.

    如果您不想使用全部可用空间,则Red Hat建议使用可读大小的规范fdisk,将分区的末尾与物理扇区对齐。如果通过提供确切的数字(扇区)来指定大小,fdisk则不会对齐分区的末尾。

1
2
3
4
5
6
7
8
9
10
11
Command (m for help): n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): *Enter*
Using default response p
Partition number (2-4, default 2): *Enter*
First sector (1026048-31457279, default 1026048): *Enter*
Using default value 1026048
Last sector, +sectors or +size{K,M,G} (1026048-31457279, default 31457279): +500M
Partition 2 of type Linux and of size 500 MiB is set
  1. 将分区类型设置为LVM:
1
2
3
4
Command (m for help): t
Partition number (1,2, default 2): *Enter*
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'
  1. 如果确定所做的更改是正确的 请使用w选项编写更改 , 因为错误可能会导致所选分区不稳定。

  2. 运行 e2fsck 在设备上 运行以检查一致性:

1
2
3
4
5
6
7
8
e2fsck /dev/vda
e2fsck 1.41.12 (17-May-2010)
Pass 1:Checking inodes, blocks, and sizes
Pass 2:Checking directory structure
Pass 3:Checking directory connectivity
Pass 4:Checking reference counts
Pass 5:Checking group summary information
ext4-1:11/131072 files (0.0% non-contiguous),27050/524128 blocks
  1. 挂载设备:
1
mount /dev/vda

使用快照程序创建和维护快照

快照卷是目标卷的时间点副本,它提供了将文件系统恢复到早期状态的方法。Snapper是一个命令行工具,用于为Btrfs和精简配置的LVM文件系统创建和维护快照。

创建初始快照程序配置

Snapper需要为其运行的每个卷设置独立的配置文件。您必须手动设置配置文件。默认情况下,只有root用户才能执行snapper命令。

Red Hat建议在Red Hat Enterprise Linux 7上使用带有Snapper的ext4文件系统。只有在监视池中的可用空间量时,才能在lvm-thin卷上使用XFS文件系统,以防止出现空间不足的问题导致失败。

请注意,Btrfs工具和文件系统是作为技术预览提供的,这使得它们不适用于生产系统。

虽然可以允许用户或根以外的组使用某些命令鲷鱼,红帽建议您不要提升的权限添加到非特权否则用户或组。这样的配置绕过SELinux,可能会造成安全风险。红帽建议您与安全团队一起审核这些功能,并考虑使用sudo基础架构。

创建快照程序配置文件

  1. 创建或选择:

    • 一个配置了红帽支持文件系统的精简配置逻辑卷,或者
    • Btrfs子卷.
  2. 安装文件系统.

  3. 创建定义这个卷的配置文件.

    对于 LVM2:

1
# snapper -c config_name create-config -f "lvm(fs_type)" /mount-point

对于 Btrfs:

1
# snapper -c config_name create-config -f btrfs /mount-point
  • -c config_name 选项指定配置文件的名称.
  • create-config 选项告诉 snapper创建一个配置文件.
  • -f file_system 选项告诉 snapper 所使用的文件系统;如果省略将尝试检测文件系统
  • /mount-point 是安装子卷或精简配置的LVM2文件系统的位置

    例如,要创建lvm_config在具有ext4文件系统的LVM2子卷上调用的配置文件(安装在)/lvm_mount,请使用:

    1
    # snapper -c lvm_config create-config -f "lvm(ext4)" /lvm_mount

    或者,要创建名为的配置文件btrfs_config,请在挂载的Btrfs子卷上/btrfs_mount使用:

    1
    # snapper -c btrfs_config create-config -f btrfs /btrfs_mount

配置文件存储在/etc/snapper/configs/目录中。

创建快照程序快照

Snapper可以创建以下类型的快照:

  • 快照前

    预先快照作为发布后快照的起点。两者紧密联系,旨在跟踪两点之间的文件系统修改。必须在发布快照之前创建预先快照。

  • 张贴快照

    后快照被用作快照的终点。快照结合前后快照定义了一个比较范围。默认情况下,每个新的快照程序卷都被配置为在成功创建相关的快照后创建背景比较。

  • 单一快照

    单个快照是在特定时刻创建的独立快照。这些可以用来跟踪修改的时间线,并有一个普遍的观点返回到稍后。

创建前置和后置快照对

使用Snapper创建前期快照

要创建预览快照,请使用:

1
# snapper -c config_name create -t pre

-c *config_name* 选项根据指定配置文件中的规范创建快照。

create -t 选项指定要创建的快照类型。接受条目 pre, post, 或 single.

例如, ,使用lvm_config 配置文件创建一个快照前,使用:

1
2
# snapper -c SnapperExample create -t pre -p
1

-p 选项将打印创建的快照的编号,并且是可选的。

使用Snapper创建帖子快照

创建一个快照

  1. 确定快照编号:

    1
    # snapper -c config_name list

例如,要显示使用配置文件创建的快照列表lvm_config, 请使用以下命令:

1
2
3
4
5
# snapper -c lvm_config list
Type | # | Pre # | Date | User | Cleanup | Description | Userdata
-------+---+-------+-------------------+------+----------+-------------+---------
single | 0 | | | root | | current |
pre | 1 | | Mon 06<...> | root | | |

上面的输出显示前快照是编号1。

  1. 创建链接到先前创建的预先快照的后快照:
1
# snapper -c config_file create -t post --pre-num pre_snapshot_number
  • -t post 选项指定创建快照类型.
  • --pre-num 选项指定相应的预先快照.

    例如,要使用 lvm_config 配置文件创建后期快照并将其链接到预先快照编号1,请使用:

    1
    2
    # snapper -c lvm_config create -t post --pre-num 1 -p
    2

    -p 选项将打印创建的快照的编号,并且是可选的。

  1. 快照1和快照2现在已创建并配对。验证这个list命令:

    1
    2
    3
    4
    5
    6
    # snapper -c lvm_config list
    Type | # | Pre # | Date | User | Cleanup | Description | Userdata
    -------+---+-------+-------------------+------+----------+-------------+---------
    single | 0 | | | root | | current |
    pre | 1 | | Mon 06<...> | root | | |
    post | 2 | 1 | Mon 06<...> | root | | |

在快照前后包装一个命令

您也可以在快照之前和之后包装一个命令,这在测试时很有用。这是以下步骤的快捷方式:

  1. 运行snapper create pre snapshot命令。
  2. 运行命令或命令列表来执行可能影响文件系统内容的操作。
  3. 运行snapper create post snapshot命令。

在快照前后包装一个命令

  1. 在前后快照中包装命令:
1
# snapper -c lvm_config create --command "command_to_be_tracked"

例如,要跟踪 /lvm_mount/hello_file 文件的创建:

1
# snapper -c lvm_config create --command "echo Hello > /lvm_mount/hello_file"
  1. 要验证这一点,请使用 status 命令:
1
# snapper -c config_file status first_snapshot_number..second_snapshot_number

例如,要跟踪第一步中所做的更改:

1
2
# snapper -c lvm_config status 3..4
+..... /lvm_mount/hello_file

如果需要, 使用list命令验证快照的编号。

请注意,不能保证上述示例中的命令是快照捕获的唯一内容。Snapper还记录系统修改的任何内容,而不仅仅是用户修改的内容。

创建单个快照程序快照

创建单个快照快照与创建快照前或快照后类似,只有create -t选项指定single。单个快照用于创建一个单一的快照,而不会与任何其他快照相关联。但是,如果您有兴趣直接创建LVM2精简卷的快照,而无需自动生成比较或列出附加信息,则红帽建议使用系统存储管理器而不是Snapper来实现此目的,

要创建单个快照,请使用:

1
# snapper -c config_name create -t single

例如,以下命令使用lvm_config配置文件创建单个快照。

1
# snapper -c lvm_config create -t single

虽然单个快照并非专为跟踪变化,您可以使用snapper diffxadiffstatus命令任何两个快照进行比较.

配置快照程序以获取自动快照

拍摄自动快照是Snapper的主要功能之一。默认情况下,当为Snapper配置卷时,Snapper将开始每小时拍摄卷的快照。

在默认配置下,Snapper保留:

  • 每小时10张快照,最终每小时快照保存为“每日”快照。
  • 10个每日快照,并且一个月的最终每日快照被保存为“每月”快照。
  • 每月10次快照,最终每月快照保存为“年度”快照。
  • 每年10个快照。

请注意,Snapper默认保持不超过50个快照。但是,Snapper会默认保留不到1800秒前创建的所有快照。

默认配置在/etc/snapper/config-templates/default文件中指定。使用该snapper create-config命令创建配置时,将根据默认配置设置任何未指定的值。您可以编辑文件中任何定义的卷的配置。 /etc/snapper/configs/*config_name*

跟踪SNAPPER快照之间的更改

使用 status, diff, 和 xadiff 指令跟踪快照之间的子卷所做的更改:

  • status

    status 命令显示在两个快照之间创建,修改或删除的文件和目录的列表,这是两个快照之间更改的完整列表。您可以使用此命令来获取更改的概述,而不会有过多的细节。

  • diff

    如果至少检测到一个修改,则 diff 命令显示从 status 命令接收到的两个快照之间的已修改文件和目录的差异。

  • xadiff

    xadiff 命令比较文件或目录的扩展属性在两个快照之间的变化。

比较变更与status命令

status 命令显示在两个快照之间创建,修改或删除的文件和目录的列表。

要显示两个快照之间的文件状态,请使用:

1
# snapper -c config_file status first_snapshot_number..second_snapshot_number

如果需要,使用 list 命令确定快照编号。

例如,以下命令使用配置文件lvm_config显示快照1和2之间所做的更改 .

1
2
3
4
5
6
7
snapper -c lvm_config status 1..2
tp.... /lvm_mount/dir1
-..... /lvm_mount/dir1/file_a
c.ug.. /lvm_mount/file2
+..... /lvm_mount/file3
....x. /lvm_mount/file4
cp..xa /lvm_mount/file5

在输出的第一部分中以字母的形式读取字母和圆点:

1
2
3
+..... /lvm_mount/file3
||||||
123456

列1指示文件(目录条目)类型的任何修改。可能的值是:

Column 1

输出 含义
. 什么也没有变.
+ 创建文件.
- 文件已删除.
c 内容已更改.
t 目录条目的类型已更改。例如,以前的符号链接已经更改为具有相同文件名的常规文件.

列2指示文件权限的任何更改。可能的值是:

Column 2

输出 含义
. 没有权限更改.
p 权限已更改.

第3列表示用户所有权的任何变化。可能的值是:

Column 3

输出 含义
. 没有用户所有权更改.
u 用户所有权已更改.

第4列表示组所有权的任何变化。可能的值是:

Column 4

输出 含义
. 没有组的所有权改变.
g 集体所有权已经改变.

列5指示扩展属性中的任何更改。可能的值是:

Column 5

输出 含义
. 没有扩展的属性改变.
x 扩展属性已更改.

列6指示访问控制列表(ACL)中的任何更改。可能的值是:

Column 6

输出 含义
. 没有ACL改变。
a ACL被修改。

比较变更与diff命令

diff 命令显示两个快照之间修改的文件和目录的更改。

1
# snapper -c config_name diff first_snapshot_number..second_snapshot_number

如果需要 ,使用list 命令确定快照的编号。

例如,要比较使用lvm_config配置文件创建的快照1和快照2之间的文件更改,请使用:

1
2
3
4
5
# snapper -c lvm_config diff 1..2
--- /lvm_mount/.snapshots/13/snapshot/file4 19<...>
+++ /lvm_mount/.snapshots/14/snapshot/file4 20<...>
@@ -0,0 +1 @@
+words

上面的输出显示file4已被修改为将“单词”添加到文件中。

比较变更与xadiff命令

xadiff 命令比较文件或目录的扩展属性在两个快照之间的变化情况:

1
# snapper -c config_name xadiff first_snapshot_number..second_snapshot_number

如果需要, 使用list命令确定快照的编号。

例如,要显示使用lvm_config配置文件创建的快照号码1和快照号码2之间的xadiff输出,请使用:

1
# snapper -c lvm_config xadiff 1..2

反转快照之间的更改

要反转两个现有Snapper快照之间所做的更改,请使用undochange以下格式的命令,其中1第一个快照2是第二个快照:

1
snapper -c config_name undochange 1..2

Important

使用 undochange 命令不会将Snapper卷恢复到其原始状态,也不会提供数据一致性。发生在指定范围之外的任何文件修改(例如,在快照2之后)将在恢复之后保持不变,例如,恢复到快照1的状态。例如,如果undochange运行以撤消创建用户,则拥有的任何文件由用户仍然可以保持。

在创建快照时也没有确保文件一致性的机制,所以当使用undochange命令时,任何已经存在的不一致都可以传回快照。

不要使用 Snapper undochange 命令 在根文件系统中, 否则可能会导致失败。

下图演示了该undochange命令的工作原理:

mark

快照状态随着时间的推移

该图显示了snapshot_1创建,file_a创建和file_b删除的时间点。Snapshot_2然后创建,然后file_a编辑和file_c创建。这是现在系统的当前状态。目前的系统有一个编辑版本file_a,不file_b,和一个新创建的file_c

undochange调用该命令时,Snapper将生成第一个列出的快照和第二个快照之间的已修改文件的列表。在该图中,如果使用该snapper -c SnapperExample undochange 1..2命令,Snapper将创建一个修改文件列表(即已创建file_a;将file_b被删除)并将其应用于当前系统。因此:

  • 目前的系统将不会有file_a,因为它创建时还snapshot_1没有创建。
  • file_b将存在,从snapshot_1当前系统复制而来。
  • file_c 将会存在,因为它的创造超出了规定的时间。

请注意,如果file_bfile_c冲突,系统可能会损坏。

您也可以使用该snapper -c SnapperExample undochange 2..1命令。在这种情况下,当前的系统会用file_a从中复制的一个版本替换编辑后的版本,而这个编辑版本是在创建snapshot_1之后取消该文件的编辑snapshot_2

使用挂载和卸载命令来反转更改

undochange命令并不总是恢复修改的最佳方式. 使用statusdiff命令,您可以做出合格的决定, and use the mount and unmount 而不是 Snapper. 在 mount and unmount 命令仅在您要装载快照并独立于Snapper工作流程浏览其内容时才有用。

如果需要,该mount命令将在安装之前激活相应的LVM Snapper快照。例如,使用mountunmount命令(例如,有兴趣加载快照并手动提取几个文件的旧版本)。要手动还原文件,请将其从装入的快照复制到当前文件系统

system. The current file system, snapshot 0, is the live file system created in Procedure 14.1, “Creating a Snapper Configuration File”. Copy the files to the subtree of the original /mount-point.

使用 mount and unmount 命令显式的客户端请求 文件

/etc/snapper/configs/*config_name* 包含 ALLOW_USERS= and ALLOW_GROUPS= variables 您可以在其中添加用户和组. 然后snapperd ,允许您为添加的用户和组执行安装操作

删除快照程序快照

删除快照:

1
# snapper -c config_name delete snapshot_number

您可以使用 list 命令来验证快照是否已成功删除。

交换空间

Linux中的交换空间在物理内存(RAM)数量已满时使用。如果系统需要更多的内存资源并且RAM已满,则内存中的不活动页面将移至交换空间。虽然交换空间可以帮助具有少量RAM的机器,但不应该被视为更多RAM的替代品。交换空间位于硬盘上,其访问时间比物理内存慢。交换空间可以是专用交换分区(推荐),交换文件或交换分区和交换文件的组合。需要注意的是增加了Btrfs没有支持的交换空间。

过去几年,交换空间的建议数量随着系统内存量的增加而线性增加。但是,现代系统通常包含数百GB的RAM。因此,建议的交换空间被视为系统内存工作负载的函数,而不是系统内存。

交换分区的推荐大小,具体取决于系统中RAM的数量,以及是否需要足够的内存供系统休眠。建议的交换分区大小在安装过程中自动建立。但是,要允许休眠,您需要在自定义分区阶段编辑交换空间。

建议在系统低内存(1 GB以下)尤其重要。未能在这些系统上分配足够的交换空间可能会导致问题,如不稳定甚至导致安装的系统无法启动。

推荐的系统交换空间

系统中的RAM数量 建议交换空间 如果允许休眠,建议使用交换空间
⩽ 2 GB RAM的2倍 RAM数量的3倍
> 2 GB – 8 GB 等于RAM的数量 RAM的2倍
> 8 GB – 64 GB 至少4 GB RAM的1.5倍
> 64 GB 至少4 GB 不建议休眠

列出的每个范围的边界处(例如具有2 GB,8 GB或64 GB系统RAM的系统),可以选择交换空间和休眠支持。如果您的系统资源允许,增加交换空间可能会导致更好的性能。对于超过140个逻辑处理器或超过3 TB RAM的系统,建议至少100 GB的交换空间。

请注意,通过多个存储设备分配交换空间也会提高交换空间性能,特别是在具有快速驱动器,控制器和接口的系统上。

分配为交换空间的文件系统和LVM2卷在修改时不应使用。如果系统进程或内核正在使用交换空间,则任何修改交换的尝试都将失败。使用freecat /proc/swaps命令来验证多少和交换在哪里使用。

您应修改交换空间,而系统在引导rescue模式下,当提示安装文件系统时,请选择跳过

添加交换空间

有时需要在安装后添加更多的交换空间。例如,您可以将系统中的RAM数量从1 GB升级到2 GB,但只有2 GB的交换空间。如果执行内存密集型操作或运行需要大量内存的应用程序,则将交换空间量增加到4 GB可能会有所帮助。

您有三种选择:创建新的交换分区,创建新的交换文件或在现有的LVM2逻辑卷上扩展交换。建议您扩展现有的逻辑卷。

在LVM2逻辑卷上扩展交换

默认情况下,红帽企业版Linux 7在安装过程中使用所有可用的空间。如果系统出现这种情况,则必须先将新的物理卷添加到交换空间使用的卷组中。

向交换空间的卷组添加额外的存储之后,现在可以扩展它。为此,请执行以下步骤(假定/dev/VolGroup00/LogVol01是要扩展2 GB的卷):

在LVM2逻辑卷上扩展交换

  1. 禁用相关逻辑卷的交换:
1
# swapoff -v /dev/VolGroup00/LogVol01
  1. 将LVM2逻辑卷调整大小2 GB:
1
# lvresize /dev/VolGroup00/LogVol01 -L +2G
  1. 格式化新的交换空间:
1
# mkswap /dev/VolGroup00/LogVol01
  1. 启用扩展逻辑卷:
1
# swapon -v /dev/VolGroup00/LogVol01

要测试逻辑卷是否成功扩展,请使用 cat /proc/swapsfree 检查交换空间。

为交换创建一个LVM2逻辑卷

要添加交换卷组(假设/dev/VolGroup00/LogVol02是要添加的交换卷):

  1. 创建大小为2 GB的LVM2逻辑卷:
1
# lvcreate VolGroup00 -n LogVol02 -L 2G
  1. 格式化新的交换空间:
1
# mkswap /dev/VolGroup00/LogVol02
  1. 将以下条目添加到 /etc/fstab 文件中:
1
# /dev/VolGroup00/LogVol02 swap swap defaults 0 0
  1. 启用扩展逻辑卷:
1
# swapon -v /dev/VolGroup00/LogVol02

要测试逻辑卷是否成功创建,请使用cat /proc/swapsfree检查交换空间。

创建一个交换文件

要添加交换文件:

添加一个交换文件

  1. 以兆字节确定新的交换文件的大小并乘以1024来确定块的数量。例如,一个64 MB交换文件的块大小是65536。

  2. 在shell中,输入以下命令,count并等于所需的块大小:

1
# dd if=/dev/zero of=/swapfile bs=1024 count=65536
  1. 使用以下命令设置交换文件:
1
# mkswap /swapfile
  1. 更改交换文件的安全性,使其不是世界上可读的。
1
# chmod 0600 /swapfile
  1. 要在启动时立即启用交换文件,但不能自动启用:
1
# swapon /swapfile
  1. 要在引导时启用它,请编辑/etc/fstab以包含以下条目:

    /swapfile swap swap defaults 0 0

    系统下次启动时,将启用新的交换文件。

要测试新的交换文件是否成功创建,请使用cat /proc/swapsfree检查交换空间。

删除交换空间

有时在安装之后可以谨慎的减少交换空间。例如,假设您将系统中的RAM数量从1 GB降级到512 MB,但仍有2 GB的交换空间仍在分配。将交换空间量减少到1 GB可能是有利的,因为较大的2 GB可能会浪费磁盘空间。

您有三种选择:删除用于交换的整个LVM2逻辑卷,删除交换文件或减少现有LVM2逻辑卷上的交换空间。

减少LVM2逻辑卷上的交换

减少LVM2交换逻辑卷(假定/dev/VolGroup00/LogVol01是要减少的卷):

减少LVM2交换逻辑卷

  1. 禁用相关逻辑卷的交换:
1
# swapoff -v /dev/VolGroup00/LogVol01
  1. 将LVM2逻辑卷减少512 MB:
1
# lvreduce /dev/VolGroup00/LogVol01 -L -512M
  1. 格式化新的交换空间:
1
# mkswap /dev/VolGroup00/LogVol01
  1. 启用扩展逻辑卷:
1
# swapon -v /dev/VolGroup00/LogVol01

要测试交换的逻辑卷大小是否成功减少,请使用cat /proc/swapsfree检查交换空间。

删除交换的LVM2逻辑卷

要除去交换卷组(假设/dev/VolGroup00/LogVol02是要除去的交换卷):

删除交换卷组

  1. 禁用相关逻辑卷的交换:
1
# swapoff -v /dev/VolGroup00/LogVol02
  1. 删除大小为512 MB的LVM2逻辑卷:
1
# lvremove /dev/VolGroup00/LogVol02
  1. /etc/fstab文件中删除以下条目:

    /dev/VolGroup00/LogVol02 swap swap defaults 0 0

要测试逻辑卷大小是否已成功删除,请使用cat /proc/swapsfree检查交换空间。

删除交换文件

删除交换文件

  1. 在shell提示下,执行以下命令来禁用交换文件(其中/swapfile是交换文件):
1
# swapoff -v /swapfile
  1. /etc/fstab文件中删除它的条目。

  2. 删除实际的文件:

1
# rm /swapfile

移动交换空间

要将交换空间从一个位置移动到另一个位置,请执行删除交换空间的步骤,然后按照添加交换空间的步骤进行操作。

SSM后端

SSM使用ssmlib/main.py符合设备,池和卷抽象的核心抽象层,忽略底层技术的细节。后端可以被注册在ssmlib/main.py处理特定的存储技术方法,如createsnapshot或到remove卷和池。

SSM已经有多个后端注册。以下部分将提供关于它们的基本信息以及如何处理池,卷,快照和设备的定义。

Btrfs后端

注意

Btrfs在红帽企业版Linux 7中作为技术预览功能提供,但自从红帽企业版Linux 7.4发行版以来已经被弃用了。它将在未来的红帽企业Linux主要版本中被删除。

Btrfs是一个具有许多高级功能的文件系统,在SSM中用作卷管理后端。可以使用Btrfs后端创建池,卷和快照。

Btrfs池

Btrfs文件系统本身就是池。可以通过添加更多设备来扩展,也可以通过删除设备来缩小。创建Btrfs池时,SSM将创建一个Btrfs文件系统。这意味着每个新的Btrfs池都有一个与池相同的卷,如果不删除整个池,则不能删除该卷。默认的Btrfs池名称是btrfs_pool

池的名称用作文件系统标签。如果系统中已经存在一个没有标签的Btrfs文件系统,则Btrfs池将以格式生成一个内部使用的名称 btrfs_device_base_name

Btrfs卷

在池中的第一个卷之后创建的卷与子卷相同。如果未安装Btrfs文件系统以创建子卷,SSM将临时安装Btrfs文件系统。

卷的名称用作Btrfs文件系统中的子卷路径。例如,一个子卷显示为/dev/lvm_pool/lvol001。该路径中的每个对象都必须存在才能创建卷。卷也可以用它的挂载点来引用。

Btrfs快照

可以使用SSM在系统中的任何Btrfs卷上拍摄快照。请注意,Btrfs不会区分子卷和快照。虽然这意味着SSM无法识别Btrfs快照目标,但它会尝试识别特殊的名称格式。如果创建快照时指定的名称执行了特定的模式,则快照将不会被识别,而是被列为常规Btrfs卷。

Btrfs设备

Btrfs不需要创建任何特殊的设备。

LVM后端

可以使用LVM创建池,卷和快照。以下定义来自LVM的观点。

LVM池

LVM池与LVM卷组相同。这意味着可以在LVM池外创建分组设备和新逻辑卷。默认的LVM池名称是lvm_pool

LVM卷

LVM卷与普通逻辑卷相同。

LVM快照

当从LVM卷创建快照时,会创建一个新snapshot卷,然后可以像处理其他任何LVM卷一样处理该卷。与Btrfs不同的是,LVM能够区分常规卷的快照,因此不需要快照名称来匹配特定的模式。

LVM设备

SSM使得需要在对用户透明的物理设备上创建LVM后端。

Crypt 后端

SSM中的隐藏后端使用cryptsetupdm-crypt target管理加密卷。加密后端可用作常规后端,用于在常规块设备(或其他卷(如LVM或MD卷)上)上创建加密卷,或者在一个步骤中创建加密的LVM卷。

只有卷可以用隐藏后端创建; 不支持共享,不需要特殊的设备。

以下几节从crypt的角度定义了卷和快照。

地穴容积

dm-crypt加密 卷由未加密的形式创建并代表原始加密设备上的数据。它不支持RAID或任何设备连接。

支持两种模式或扩展:luks和plain。Luks默认使用。有关扩展的更多信息,请参阅man cryptsetup

Crypt 快照

虽然crypt后端不支持快照,但如果在LVM卷上创建加密卷,则卷本身可以被快照。快照可以通过使用打开cryptsetup

多个设备(MD)后端

MD后端目前仅限于收集有关系统中MD卷的信息。

常见的SSM任务

以下部分将介绍基本用例,介绍如何安装SSM,然后显示有关所有检测到的设备,池和卷的信息。接下来,将使用两个卷和一个XFS文件系统创建一个池。然后将检查文件系统的一致性,然后卷的大小将会增加。然后创建一个快照。最后其中一卷将被删除。

安装 SSM

要安装SSM,请使用以下命令:

1
# yum install system-storage-manager

只有在安装了支持包的情况下,才会启用多个后端:

  • LVM后端需要lvm2包。
  • Btrfs后端需要btrfs-progs包。
  • Crypt后端需要device-mappercryptsetup包装。

显示有关所有检测到的设备的信息

使用该list命令显示有关所有检测到的设备,池,卷和快照的信息。运行ssm list没有选项将显示以下输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# ssm list
----------------------------------------------------------
Device Free Used Total Pool Mount point
----------------------------------------------------------
/dev/sda 2.00 GB PARTITIONED
/dev/sda1 47.83 MB /test
/dev/vda 15.00 GB PARTITIONED
/dev/vda1 500.00 MB /boot
/dev/vda2 0.00 KB 14.51 GB 14.51 GB rhel
----------------------------------------------------------
------------------------------------------------
Pool Type Devices Free Used Total
------------------------------------------------
rhel lvm 1 0.00 KB 14.51 GB 14.51 GB
------------------------------------------------
---------------------------------------------------------------------------------
Volume Pool Volume size FS FS size Free Type Mount point
---------------------------------------------------------------------------------
/dev/rhel/root rhel 13.53 GB xfs 13.52 GB 9.64 GB linear /
/dev/rhel/swap rhel 1000.00 MB linear
/dev/sda1 47.83 MB xfs 44.50 MB 44.41 MB part /test
/dev/vda1 500.00 MB xfs 496.67 MB 403.56 MB part /boot
---------------------------------------------------------------------------------

通过使用参数来指定显示内容,可以进一步缩小显示范围。可用的选项列表可以通过ssm list --help命令找到。

根据给出的参数,SSM可能不会显示所有内容。

  • 运行devicesdev参数将省略一些设备。例如,CDRoms和DM / MD设备被故意隐藏,因为它们被列为卷。
  • 某些后端不支持快照,无法区分快照和常规卷。snapshot在其中一个后端运行参数将导致SSM尝试识别卷名以识别快照。如果SSM正则表达式与快照模式不匹配,则不会识别快照。
  • 除了主Btrfs卷(文件系统本身)外,任何未安装的Btrfs卷都不会显示.

创建新池,逻辑卷和文件系统

在本节中,将使用默认名称创建一个新池。它将具有1G 的设备/dev/vdb/dev/vdc逻辑卷以及XFS文件系统。

创建这个场景的命令是ssm create --fs xfs -s 1G /dev/vdb /dev/vdc。使用以下选项:

  • --fs 选项指定所需的文件系统类型。当前支持的文件系统类型是:
    • ext3
    • ext4
    • xfs
    • btrfs
  • 所述-s指定逻辑卷的大小。定义单位支持以下后缀
    • K or k 千字节
    • M or m 兆字节
    • G or g 千兆字节
    • T or t TB
    • P or p PB
    • E or e EB字节
  • 这两个列出的设备,/dev/vdb并且/dev/vdc,是我希望创建的两个设备。
1
2
3
4
5
# ssm create --fs xfs -s 1G /dev/vdb /dev/vdc
Physical volume "/dev/vdb" successfully created
Physical volume "/dev/vdc" successfully created
Volume group "lvm_pool" successfully created
Logical volume "lvol001" created

还有其他两个 ssm command 可能有用的选项. 第一个是 -ppool . 这指定了要在其上创建卷的池。如果还不存在,那么SSM将创建它. 在上面的例子中这被省略了,导致SSM使用默认名称 lvm_pool. 但是,要使用特定的名称来适应任何现有的命名约定,应该使用该选项 -p .

第二个有用的选项是 -n name. 这将命名新创建的逻辑卷. 与之一样 -p, 为了使用特定的名称来适应现有的命名约定,这是必要的。

以下是这两个选项的一个例子:

1
2
3
~]# ssm create --fs xfs -p new_pool -n XFS_Volume /dev/vdd
Volume group "new_pool" successfully created
Logical volume "XFS_Volume" created

现在SSM已经创建了两个物理卷,一个池和一个逻辑卷,只需要一个命令。

检查文件系统的一致性

ssm check 命令检查卷上的文件系统一致性。可以指定多个卷来检查。如果卷上没有文件系统,则该卷将被跳过。

要检查卷中的所有设备lvol001,请运行。 ssm check /dev/lvm_pool/lvol001.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# ssm check /dev/lvm_pool/lvol001
Checking xfs file system on '/dev/mapper/lvm_pool-lvol001'.
Phase 1 - find and verify superblock...
Phase 2 - using internal log
- scan filesystem freespace and inode maps...
- found root inode chunk
Phase 3 - for each AG...
- scan (but don't clear) agi unlinked lists...
- process known inodes and perform inode discovery...
- agno = 0
- agno = 1
- agno = 2
- agno = 3
- agno = 4
- agno = 5
- agno = 6
- process newly discovered inodes...
Phase 4 - check for duplicate blocks...
- setting up duplicate extent list...
- check for inodes claiming duplicate blocks...
- agno = 0
- agno = 1
- agno = 2
- agno = 3
- agno = 4
- agno = 5
- agno = 6
No modify flag set, skipping phase 5
Phase 6 - check inode connectivity...
- traversing filesystem ...
- traversal finished ...
- moving disconnected inodes to lost+found ...
Phase 7 - verify link counts...
No modify flag set, skipping filesystem flush and exiting.

增加卷的大小

ssm resize 命令将更改指定的卷和文件系统的大小。如果没有文件系统,那么只有卷本身将被调整大小。

对于这个例子, 我们目前有一个逻辑卷 /dev/vdb , 900MB 命令为 lvol001.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# ssm list
-----------------------------------------------------------------
Device Free Used Total Pool Mount point
-----------------------------------------------------------------
/dev/vda 15.00 GB PARTITIONED
/dev/vda1 500.00 MB /boot
/dev/vda2 0.00 KB 14.51 GB 14.51 GB rhel
/dev/vdb 120.00 MB 900.00 MB 1.00 GB lvm_pool
/dev/vdc 1.00 GB
-----------------------------------------------------------------
---------------------------------------------------------
Pool Type Devices Free Used Total
---------------------------------------------------------
lvm_pool lvm 1 120.00 MB 900.00 MB 1020.00 MB
rhel lvm 1 0.00 KB 14.51 GB 14.51 GB
---------------------------------------------------------
--------------------------------------------------------------------------------------------
Volume Pool Volume size FS FS size Free Type Mount point
--------------------------------------------------------------------------------------------
/dev/rhel/root rhel 13.53 GB xfs 13.52 GB 9.64 GB linear /
/dev/rhel/swap rhel 1000.00 MB linear
/dev/lvm_pool/lvol001 lvm_pool 900.00 MB xfs 896.67 MB 896.54 MB linear
/dev/vda1 500.00 MB xfs 496.67 MB 403.56 MB part /boot
--------------------------------------------------------------------------------------------

逻辑卷需要增加500MB。要做到这一点,我们需要添加一个额外的设备到池中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# ssm resize -s +500M /dev/lvm_pool/lvol001 /dev/vdc
Physical volume "/dev/vdc" successfully created
Volume group "lvm_pool" successfully extended
Phase 1 - find and verify superblock...
Phase 2 - using internal log
- scan filesystem freespace and inode maps...
- found root inode chunk
Phase 3 - for each AG...
- scan (but don't clear) agi unlinked lists...
- process known inodes and perform inode discovery...
- agno = 0
- agno = 1
- agno = 2
- agno = 3
- process newly discovered inodes...
Phase 4 - check for duplicate blocks...
- setting up duplicate extent list...
- check for inodes claiming duplicate blocks...
- agno = 0
- agno = 1
- agno = 2
- agno = 3
No modify flag set, skipping phase 5
Phase 6 - check inode connectivity...
- traversing filesystem ...
- traversal finished ...
- moving disconnected inodes to lost+found ...
Phase 7 - verify link counts...
No modify flag set, skipping filesystem flush and exiting.
Extending logical volume lvol001 to 1.37 GiB
Logical volume lvol001 successfully resized
meta-data=/dev/mapper/lvm_pool-lvol001 isize=256 agcount=4, agsize=57600 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0
data = bsize=4096 blocks=230400, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal bsize=4096 blocks=853, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 230400 to 358400

SSM在设备上运行检查,然后按指定的数量扩展音量。这可以通过ssm list命令来验证.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# ssm list
------------------------------------------------------------------
Device Free Used Total Pool Mount point
------------------------------------------------------------------
/dev/vda 15.00 GB PARTITIONED
/dev/vda1 500.00 MB /boot
/dev/vda2 0.00 KB 14.51 GB 14.51 GB rhel
/dev/vdb 0.00 KB 1020.00 MB 1.00 GB lvm_pool
/dev/vdc 640.00 MB 380.00 MB 1.00 GB lvm_pool
------------------------------------------------------------------
------------------------------------------------------
Pool Type Devices Free Used Total
------------------------------------------------------
lvm_pool lvm 2 640.00 MB 1.37 GB 1.99 GB
rhel lvm 1 0.00 KB 14.51 GB 14.51 GB
------------------------------------------------------
----------------------------------------------------------------------------------------------
Volume Pool Volume size FS FS size Free Type Mount point
----------------------------------------------------------------------------------------------
/dev/rhel/root rhel 13.53 GB xfs 13.52 GB 9.64 GB linear /
/dev/rhel/swap rhel 1000.00 MB linear
/dev/lvm_pool/lvol001 lvm_pool 1.37 GB xfs 1.36 GB 1.36 GB linear
/dev/vda1 500.00 MB xfs 496.67 MB 403.56 MB part /boot
----------------------------------------------------------------------------------------------

只能降低LVM卷的大小; 其他卷类型不支持。这是通过使用一个-而不是一个+。例如,要将LVM卷的大小减小50M,该命令将是:

1
2
3
4
5
6
7
~]# ssm resize -s-50M /dev/lvm_pool/lvol002
Rounding size to boundary between physical extents: 972.00 MiB
WARNING: Reducing active logical volume to 972.00 MiB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lvol002? [y/n]: y
Reducing logical volume lvol002 to 972.00 MiB
Logical volume lvol002 successfully resized

没有+或者-,被视为绝对的。

快照

要获取现有卷的快照,请使用该ssm snapshot命令。

如果后端卷所属的卷不支持快照,则该操作将失败。

要创建快照lvol001,请使用以下命令:

1
2
# ssm snapshot /dev/lvm_pool/lvol001
Logical volume "snap20150519T130900" created

要验证这一点,使用ssm list,并注意额外的快照部分。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# ssm list
----------------------------------------------------------------
Device Free Used Total Pool Mount point
----------------------------------------------------------------
/dev/vda 15.00 GB PARTITIONED
/dev/vda1 500.00 MB /boot
/dev/vda2 0.00 KB 14.51 GB 14.51 GB rhel
/dev/vdb 0.00 KB 1020.00 MB 1.00 GB lvm_pool
/dev/vdc 1.00 GB
----------------------------------------------------------------
--------------------------------------------------------
Pool Type Devices Free Used Total
--------------------------------------------------------
lvm_pool lvm 1 0.00 KB 1020.00 MB 1020.00 MB
rhel lvm 1 0.00 KB 14.51 GB 14.51 GB
--------------------------------------------------------
----------------------------------------------------------------------------------------------
Volume Pool Volume size FS FS size Free Type Mount point
----------------------------------------------------------------------------------------------
/dev/rhel/root rhel 13.53 GB xfs 13.52 GB 9.64 GB linear /
/dev/rhel/swap rhel 1000.00 MB linear
/dev/lvm_pool/lvol001 lvm_pool 900.00 MB xfs 896.67 MB 896.54 MB linear
/dev/vda1 500.00 MB xfs 496.67 MB 403.56 MB part /boot
----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------
Snapshot Origin Pool Volume size Size Type
----------------------------------------------------------------------------------
/dev/lvm_pool/snap20150519T130900 lvol001 lvm_pool 120.00 MB 0.00 KB linear
----------------------------------------------------------------------------------

删除一个项目

ssm remove用于删除的项目,或者是设备,游泳池或体积。

如果某个设备在移除时正在被池使用,则会失败。这可以被迫使用-f参数。

如果在卸下卷时安装,则会失败。与设备不同,它不能被强制使用-f

要删除其中的lvm_pool所有内容,请使用以下命令:

1
2
3
4
5
6
7
# ssm remove lvm_pool
Do you really want to remove volume group "lvm_pool" containing 2 logical volumes? [y/n]: y
Do you really want to remove active logical volume snap20150519T130900? [y/n]: y
Logical volume "snap20150519T130900" successfully removed
Do you really want to remove active logical volume lvol001? [y/n]: y
Logical volume "lvol001" successfully removed
Volume group "lvm_pool" successfully removed

磁盘配额

磁盘空间可以通过在用户占用太多磁盘空间或分区变满之前实现提醒系统管理员的磁盘配额来限制。

可以为个人用户和用户组配置磁盘配额。这使得可以与分配给用户工作的项目的空间(假设项目被赋予它们自己的组)分开管理分配给用户特定文件(例如电子邮件)的空间。

另外,可以设置配额,不仅可以控制所使用的磁盘块数量,还可以控制inode数量(包含UNIX文件系统中的文件信息的数据结构)。由于inode用于包含与文件相关的信息,因此可以控制可以创建的文件的数量。

quota必须安装RPM来实现磁盘配额。

配置磁盘配额

要实施磁盘配额,请使用以下步骤:

  1. 通过修改/etc/fstab文件来启用每个文件系统的配额。
  2. 重新安装文件系统。
  3. 创建配额数据库文件并生成磁盘使用情况表。
  4. 分配配额策略。

以下各节将详细讨论这些步骤。

启用配额

以root身份使用文本编辑器编辑/etc/fstab文件。

编辑/etc/fstab

例如,要使用文本编辑器,vim键入以下内容:

1
# vim /etc/fstab

添加usrquota/grpquota选项到需要配额的文件系统:

添加配额

1
2
3
4
5
6
7
8
/dev/VolGroup00/LogVol00 /         ext3    defaults        1 1 
LABEL=/boot /boot ext3 defaults 1 2
none /dev/pts devpts gid=5,mode=620 0 0
none /dev/shm tmpfs defaults 0 0
none /proc proc defaults 0 0
none /sys sysfs defaults 0 0
/dev/VolGroup00/LogVol02 /home ext3 defaults,usrquota,grpquota 1 2
/dev/VolGroup00/LogVol01 swap swap defaults 0 0 . . .

在本例中,/home文件系统同时启用了用户和组配额。

以下示例假定/home在安装红帽企业版Linux期间创建了单独的分区。root(/)分区可用于在/etc/fstab文件中设置配额策略。

重新挂载文件系统

在添加usrquota和/或grpquota选项后,重新装入其fstab条目已被修改的每个文件系统。如果文件系统未被任何进程使用,请使用以下方法之一:

  • 发出umount命令后再执行该mount命令以重新挂载文件系统。请参阅man这两个页面umount以及mount有关安装和卸载各种文件系统类型的特定语法。
  • mount -o remount file-system 命令 (其中 file-system 是文件系统的名称) 来挂载文件系统. 例如, 要重新挂载 /home 文件系统, 要使用命令 mount -o remount /home.

如果文件系统当前正在使用,则重新安装文件系统的最简单方法是重新引导系统。

创建配额数据库文件

在每个启用配额的文件系统重新安装后,运行该quotacheck命令。

quotacheck命令检查启用配额的文件系统,并构建每个文件系统当前磁盘使用情况的表。该表然后用于更新操作系统的磁盘使用情况的副本。另外,文件系统的磁盘配额文件也被更新。

quotacheck命令对XFS没有影响,因为磁盘使用情况在安装时自动完成。xfs_quota(8)有关更多信息,请参阅手册页。

要在文件系统上创建配额文件(aquota.useraquota.group) , 使用 quotacheck -c

创建配额文件

例如,如果为 /home 文件系统启用了用户和组配额, 请在/home目录中创建文件:

1
# quotacheck -cug /home

-c 项指定应为每个启用了配额的文件系统创建配额文件, -u o选项指定检查用户配额, -g 选项指定检查组配额。

如果没有指定 -u-g 选项,则只创建用户配额文件。 如果仅指定 -g ,则只创建组配额文件。

创建文件后,运行以下命令以生成启用了配额的每个文件系统的当前磁盘使用情况表:

1
# quotacheck -avug

使用的选项如下:

  • a

    检查所有配额启用的本地安装的文件系统

  • v

    随着配额检查的进行,显示详细的状态信息

  • u

    检查用户磁盘配额信息

  • g

    检查组磁盘配额信息

    quotacheck 运行完毕后, 对应于启用配额(用户和/或组)被填充以用于每个启用了配额的本地安装的文件系统,例如数据配额文件 /home.

为每个用户分配配额

最后一步是用edquota命令分配磁盘配额。

要为用户配置配额,请以root用户身份在shell提示符下执行以下命令:

1
# edquota username

为需要配额的每个用户执行此步骤。例如, 如果 /etc/fstab/home 分区启用了配额 (/dev/VolGroup00/LogVol02在下面的示例中) 并且执行edquota testuser命令 ,则以下内容将显示在配置为系统默认值的编辑器中:

1
2
3
Disk quotas for user testuser (uid 501):   
Filesystem blocks soft hard inodes soft hard
/dev/VolGroup00/LogVol02 440436 0 0 37418 0 0

EDITOR环境变量定义的文本编辑器被使用edquota。要更改编辑器,请将文件中的EDITOR环境变量设置为所选~/.bash_profile编辑器的完整路径。

第一列是启用了配额的文件系统的名称。第二列显示用户当前使用的块数。接下来的两列用于为文件系统上的用户设置软硬限制。该inodes列显示用户当前使用了多少个inode。最后两列用于设置文件系统上用户的软硬节点限制。

硬块限制是用户或组可以使用的绝对最大磁盘空间量。达到此限制后,不能使用其他磁盘空间。

软块限制定义了可以使用的最大磁盘空间量。但是,与硬限制不同,软限制可以超过一定的时间。那个时候被称为宽限期。宽限期可以用秒,分,小时,天,星期或月来表示。

如果任何值被设置为0,则不设置该限制。在文本编辑器中,更改所需的限制。

更改所需限制

例如:

1
2
3
Disk quotas for user testuser (uid 501):   
Filesystem blocks soft hard inodes soft hard
/dev/VolGroup00/LogVol02 440436 500000 550000 37418 0 0

要验证是否已设置用户的配额,请使用以下命令:

1
2
3
4
# quota username
Disk quotas for user username (uid 501):
Filesystem blocks quota limit grace files quota limit grace
/dev/sdb 1000* 1000 1000 0 0 0

为每组分配配额

配额也可以按组分配。例如,要为组设置组配额devel(该组必须在设置组配额之前存在),请使用以下命令:

1
# edquota -g devel

该命令在文本编辑器中显示组的现有配额:

1
2
3
Disk quotas for group devel (gid 505):   
Filesystem blocks soft hard inodes soft hard
/dev/VolGroup00/LogVol02 440400 0 0 37418 0 0

修改限制,然后保存文件。

要验证组配额是否已设置,请使用以下命令:

1
# quota -g devel

设置软极限的宽限期

如果给定的配额具有软限制,则可以使用以下命令编辑宽限期(即,可以超过软限制的时间量):

1
# edquota -t

此命令适用于用户或组的inode或块的配额。

当其他edquota命令对特定用户或组执行配额操作时,该-t选项将在启用配额的每个文件系统上运行。

管理磁盘配额

如果实施配额,他们需要一些维护 - 主要是看配额是否超出,并确保配额是准确的形式。

当然,如果用户反复超出配额或一直达到软限制,系统管理员可以根据他们的用户类型以及磁盘空间的多少来影响他们的工作。管理员可以帮助用户确定如何使用更少的磁盘空间或增加用户的磁盘配额。

启用和禁用

可以禁用配额而不将其设置为0.要关闭所有用户和组配额,请使用以下命令:

1
# quotaoff -vaug

如果没有指定-u-g选项, 则只有用户配额被禁用。如果仅-g指定,则仅禁用组配额。当-v命令执行时,交换机会导致详细的状态信息显示。

要再次启用配额,请使用quotaon具有相同选项的命令。

例如,要为所有文件系统启用用户和组配额,请使用以下命令:

1
# quotaon -vaug

要为特定文件系统启用配额/home,请使用以下命令:

1
# quotaon -vug /home

如果没有指定-u-g选项,则只启用用户配额。如果仅-g指定,则只启用组配额。

quotaonXFS并不总是需要 该命令,因为它在安装时自动执行

报告磁盘配额

创建磁盘使用情况报告需要运行该repquota实用程序。

repquota命令的输出

例如,该命令repquota /home产生这个输出:

1
2
3
4
5
6
7
8
*** Report for user quotas on device /dev/mapper/VolGroup00-LogVol02 
Block grace time: 7days; Inode grace time: 7days
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 36 0 0 4 0 0
kristin -- 540 0 0 125 0 0
testuser -- 440400 500000 550000 37418 0 0

要查看所有(可选-a)启用配额的文件系统的磁盘使用情况报告,请使用以下命令:

1
# repquota -a

报告很容易阅读,应该解释几点。在--每个用户之后显示是一个快速的方法来确定块或i节点限制是否已经被超过。如果超出软限制,+则会出现a 代替相应的代码-; 第一个-表示块限制,第二个表示inode限制。

grace栏目是空白正常。如果软限制已超出,则该列包含的时间规格等于宽限期内剩余的时间量。如果宽限期已经过期,则none出现在其位置上。

保持配额准确

当文件系统无法完全卸载(例如,由于系统崩溃),则需要运行quotacheck。但是,quotacheck即使系统没有崩溃,也可以定期运行。定期运行的安全方法quotacheck包括:

确保在下次重新启动时运行quotacheck

以root用户身份,将一个shell脚本放到/etc/cron.daily//etc/cron.weekly/目录中 - 或者使用crontab -e包含该touch /forcequotacheck命令的命令来安排一个shell脚本。这将forcequotacheck在根目录中创建一个空文件,系统启动脚本将在启动时查找该文件。如果找到,则运行init脚本quotacheck。之后,init脚本删除/forcequotacheck文件; 因此,调度此文件定期创建,以cron确保quotacheck在下次重新启动时运行。

Refer to man cron for more information about configuring cron.

在单用户模式下运行quotacheck

另一种安全运行的方法quotacheck是将系统引导到单用户模式,以防止配额文件中数据损坏的可能性并运行以下命令:

1
# quotaoff -vug /file_system
1
# quotacheck -vug /file_system
1
# quotaon -vug /file_system

在正在运行的系统上运行quotacheck

如果有必要,可以quotacheck在没有用户登录的时间在机器上运行,因此在被检查的文件系统上没有打开的文件。运行命令; 如果无法将给定的file_system重新挂载为只读,则此命令将失败。请注意,在检查之后,文件系统将被重新读写。 quotacheck -vug*file_system*``quotacheck**

警告

quotacheck由于配额文件损坏的可能性,建议不要使用挂载的读写方式 运行实时文件系统。

磁盘配额参考

有关磁盘配额的更多信息,请参阅

  • quotacheck
  • edquota
  • repquota
  • quota
  • quotaon
  • quotaoff

独立磁盘冗余阵列(RAID)

RAID背后的基本思想是将多个小型,廉价的磁盘驱动器组合成一个阵列,以实现一个大而昂贵的驱动器无法实现的性能或冗余目标。该驱动器阵列在计算机上显示为单个逻辑存储单元或驱动器。

RAID允许信息分布在多个磁盘上。RAID使用诸如磁盘分条(RAID 0级),磁盘镜像(RAID 1)和带有奇偶校验(RAID Level 5)的磁盘分条等技术来实现冗余,更低的延迟,增加的带宽以及最大限度地从硬盘崩溃中恢复的能力。

RAID通过将数据分解成一致大小的块(通常为256K或512k,尽管其他值是可接受的)来将数据分布到阵列中的每个驱动器上。然后根据所使用的RAID级别将每个块写入RAID阵列中的硬盘驱动器。当数据被读取时,这个过程被颠倒过来,给出这样的错觉:阵列中的多个驱动器实际上是一个大驱动器。

系统管理员和其他管理大量数据的人员将从使用RAID技术中受益。部署RAID的主要原因包括:

  • 提高速度
  • 使用单个虚拟磁盘提高存储容量
  • 最大限度减少磁盘故障造成的数据丢失

RAID类型

有三种可能的RAID方法:固件RAID,硬件RAID和软件RAID。

固件RAID

固件RAID(也称为ATARAID)是一种软件RAID,可以使用基于固件的菜单对RAID集进行配置。这种类型的RAID所使用的固件也会挂接到BIOS中,允许您从RAID设置中进行引导。不同的供应商使用不同的磁盘元数据格式来标记RAID组成员。Intel Matrix RAID是固件RAID系统的一个很好的例子。

硬件RAID

基于硬件的阵列独立于主机管理RAID子系统。它为主机提供每个RAID阵列的单个磁盘。

硬件RAID设备可以在系统的内部或外部,内部设备通常由专用控制器卡组成,该卡对操作系统透明地处理RAID任务,并且通常通过SCSI,光纤通道,iSCSI等连接到系统的外部设备。 InfiniBand或其他高速网络互连,并向系统呈现逻辑卷。

RAID控制卡的功能类似于操作系统的SCSI控制器,并处理所有实际的驱动器通信。用户将驱动器插入RAID控制器(就像普通的SCSI控制器一样),然后将它们添加到RAID控制器配置中。操作系统将无法区分。

软件RAID

软件RAID实现内核磁盘(块设备)代码中的各种RAID级别。它提供了最便宜的解决方案,因为不需要昂贵的磁盘控制器卡或热插拔机箱

软件RAID也适用于更便宜的IDE磁盘以及SCSI磁盘。有了如今更快的CPU,软件RAID通常也比硬件RAID更好。

Linux内核包含一个多磁盘(MD)驱动程序,使RAID解决方案完全独立于硬件。基于软件的阵列的性能取决于服务器的CPU性能和负载。

以下是Linux软件RAID堆栈的一些主要特性:

  • 多线程设计
  • Linux机器之间的阵列可移植性,无需重建
  • 使用空闲系统资源的背景阵列重建
  • 支持热插拔驱动器
  • 自动CPU检测,以利用某些CPU功能,如流SIMD支持
  • 自动更正阵列中磁盘上的坏扇区
  • 定期对RAID数据进行一致性检查,以确保阵列的健康
  • 通过电子邮件警报主动监控阵列,将其发送到重要事件的指定电子邮件地址
  • 写意图位图通过允许内核精确地知道磁盘的哪些部分需要重新同步而不必重新同步整个阵列,从而大大提高了重新同步事件的速度
  • 重新同步点校验,以便在重新同步期间重新启动计算机时,在启动时,重新同步将会停止,并且不会重新开始
  • 安装后更改数组参数的功能。例如,当您添加新磁盘时,可以将4磁盘RAID5阵列增长为5磁盘RAID5阵列。这种增长操作是实时完成的,不需要您在新阵列上重新安装。

RAID级别和线性支持

RAID支持各种配置,包括级别0,1,4,5,6,10和线性。这些RAID类型定义如下:

  • 0级

    RAID级别0通常称为“分条”,是一种面向性能的分条数据映射技术。这意味着写入阵列的数据被分解为条带并写入阵列的成员磁盘,从而以较低的固有成本实现高I / O性能,但不提供冗余。许多RAID级别0的实现将只将成员设备上的数据分条到阵列中最小的设备的大小。这意味着,如果您有多个尺寸略有不同的设备,则每个设备都将被视为与最小驱动器的尺寸相同。因此,0级阵列的公共存储容量等于硬件RAID中最小成员磁盘的容量,或软件RAID中最小成员分区的容量乘以阵列中磁盘或分区的数量。

  • 1级

    RAID级别1(或“镜像”)的使用时间比任何其他形式的RAID都要长。级别1通过将相同的数据写入阵列的每个成员磁盘来提供冗余,在每个磁盘上留下“镜像”副本。由于其简单和高水平的数据可用性,镜像依然流行。级别1使用两个或更多磁盘运行,并提供非常好的数据可靠性,并提高读取密集型应用程序的性能,但成本相对较高。级别1阵列的存储容量等于硬件RAID中最小镜像硬盘的容量或软件RAID中最小镜像分区的容量。在所有RAID类型中,1级冗余是最高的可能性,阵列只能在单个磁盘上运行。

  • 4级

    级别4使用奇偶校验集中在单个磁盘驱动器上来保护数据。由于专用奇偶校验磁盘代表了对RAID阵列的所有写入事务的固有瓶颈,因此级别4很少没有附带的技术(如回写缓存)使用,或者在系统管理员有意用此设计软件RAID设备的特定情况下记住瓶颈(例如,一旦阵列填充数据,将会有几乎没有写入事务的数组)。RAID级别4很少使用,因此在Anaconda中不可用。但是,如果真的需要,可以由用户手动创建。硬件RAID级别4的存储容量等于最小成员分区的容量乘以分区数减一。RAID级别4阵列的性能总是不对称的,这意味着读取将优于写入。这是因为在产生奇偶校验时,写入操作会消耗额外的CPU和主存储器带宽,并且在将实际数据写入磁盘时也消耗额外的总线带宽,因为您不仅正在写入数据,而且正在写入奇偶校验。除非阵列处于降级状态,否则只需要读取数据而不是奇偶校验。因此,在正常操作条件下,读取操作产生的驱动器和计算机总线上的流量减少了相同的数据传输量。

  • 5级

    这是最常见的RAID类型。通过在阵列的所有成员磁盘驱动器中分配奇偶校验,RAID级别5消除了级别4固有的写入瓶颈。唯一的性能瓶颈是奇偶校验计算过程本身。随着现代CPU和软件RAID,这通常不是一个瓶颈,因为现代的CPU可以非常快速地产生奇偶校验。但是,如果软件RAID5阵列中的成员设备数量足够多,以至于所有设备的汇总数据传输总速度足够高,则此瓶颈可能开始起作用。与第4级一样,第5级的表现也是不对称的,读取效果明显优于写入。RAID级别5的存储容量的计算方式与级别4相同。

  • 6级

    当数据冗余和保存(而不是性能)是最重要的问题时,这是RAID的普通级别,但是级别1的空间低效率是不可接受的。级别6使用复杂的奇偶校验方案能够从阵列中任何两个驱动器的丢失中恢复。这种复杂的奇偶校验方案在软件RAID设备上造成了显着更高的CPU负担,并且在写入事务期间也增加了负担。因此,6级在性能上比4级和5级更为不对称。除了必须从额外奇偶校验存储空间的设备计数中减去2个设备(而不是1个)之外,RAID级别6阵列的总容量的计算与RAID级别5和4相似。

  • 10级

    此RAID级别尝试将级别0的性能优势与级别1的冗余相结合。它还有助于减轻2级以上设备在1级阵列中浪费的部分空间。通过级别10,可以创建一个3驱动器阵列,每个数据只能存储2个副本,然后允许整个阵列大小为最小器件大小的1.5倍,而不是等于最小值设备(就像3设备,1级阵列一样)。创建10级阵列时可用的选项数量(以及为特定用例选择正确选项的复杂性)使安装过程中创建不切实际。可以使用命令行mdadm工具手动创建一个。有关选项及其各自性能折衷的详细信息,请参阅man md

  • 线性RAID

    线性RAID是一个简单的驱动器分组来创建一个更大的虚拟驱动器。在线性RAID中,块是从一个成员驱动器中顺序分配的,只有当第一个完全填满时才会进入下一个驱动器。这个分组没有提供性能优势,因为任何I / O操作都不太可能在成员驱动器之间进行分割。线性RAID也不提供冗余,实际上降低了可靠性 - 如果任何一个成员驱动器发生故障,整个阵列将无法使用。容量是所有成员磁盘的总和。

LINUX RAID子系统

Linux中的RAID由以下子系统组成:

Linux硬件RAID控制器驱动程序

硬件RAID控制器在Linux中没有特定的RAID子系统。由于他们使用特殊的RAID芯片组,硬件RAID控制器带有自己的驱动程序; 这些驱动程序允许系统将RAID设置检测为常规磁盘。

mdraid

mdraid子系统被设计为Linux的软件RAID解决方案; 它也是Linux下软件RAID的首选解决方案。该子系统使用其自己的元数据格式,通常称为本地mdraid元数据。

mdraid还支持其他元数据格式,称为外部元数据。红帽企业Linux 7使用mdraid外部元数据来访问ISW / IMSM(英特尔固件RAID)集。mdraid套件通过mdadm电力公司进行配置和控制。

dmraid的

设备映射程序RAIDdmraid指设备映射程序内核代码,它提供了将磁盘组合成RAID组的机制。相同的内核代码不提供任何RAID配置机制。

dmraid完全在用户空间中配置,使得支持各种磁盘上的元数据格式变得容易。因此,dmraid用于各种固件RAID实现。dmraid也支持英特尔固件RAID,尽管红帽企业Linux 7使用mdraid英特尔固件RAID集。

ANACONDA安装程序中的RAID支持

Anaconda安装程序会自动检测系统中的任何硬件和固件的RAID集,使其可用于安装。Anaconda还支持使用软件RAID mdraid,并可以识别现有的mdraid设置。

Anaconda提供了用于在安装期间创建RAID集的实用程序; 但是,这些实用程序只允许分区(而不是整个磁盘)成为新集的成员。要将整个磁盘用于集合,只需在整个磁盘上创建一个分区,然后将该分区用作RAID集成员。

当根文件系统使用RAID集时,Anaconda会在启动加载程序配置中添加特殊的内核命令行选项,告诉initrd在搜索根文件系统之前要激活哪个RAID集。

安装后将根磁盘转换为RAID1

在PowerPC(PPC)体系结构上,执行以下附加步骤:

  1. 将PowerPC参考平台(PReP)引导分区的内容复制/dev/sda1/dev/sdb1
  1. 1
    # dd if=/dev/sda1 of=/dev/sdb1
  2. 更新两个磁盘上第一个分区上的准备和启动标志:

1
2
3
4
5
$ parted /dev/sda set 1 prep on
$ parted /dev/sda set 1 boot on

$ parted /dev/sdb set 1 prep on
$ parted /dev/sdb set 1 boot on

请注意,grub2-install /dev/sda 在PowerPC机器上运行该命令不起作用,并返回一个错误,但是系统按预期方式启动。

配置RAID集

大多数RAID组在创建时都会配置,通常通过固件菜单或安装程序进行配置。在某些情况下,您可能需要在安装系统后创建或修改RAID集,最好不必重新启动机器并进入固件菜单。

某些硬件RAID控制器允许您即时配置RAID集,甚至可以在添加额外的磁盘后定义全新的集。这需要使用驱动程序特定的实用程序,因为没有标准的API。有关这方面的信息,请参阅您的硬件RAID控制器的驱动程序文档。

mdadm的

mdadm命令行工具来管理Linux软件RAID,即mdraid。有关不同mdadm模式和选项的信息,请参阅man mdadm。该man页面还包含常用操作的有用示例,如创建,监视和组装软件RAID阵列。

dmraid的

顾名思义,dmraid用于管理设备映射器RAID集。该dmraid工具使用多个元数据格式处理程序查找ATARAID设备,每个处理程序支持各种格式。有关支持的格式的完整列表,请运行dmraid -l

创建高级RAID设备

在某些情况下,您可能希望将操作系统安装在安装完成后无法创建的阵列上。通常,这意味着/boot在一个复杂的RAID设备上设置或根文件系统阵列; 在这种情况下,您可能需要使用Anaconda不支持的数组选项。要解决此问题,请执行以下步骤:

创建高级RAID设备

  1. 像平常一样插入安装盘。
  2. 在初始启动过程中,请选择“ 救援模式”,而不是“ 安装”或“ 升级”。当系统完全进入Rescue模式时,用户将会看到一个命令行终端。
  3. 从此终端上,使用parted在目标硬盘驱动器上创建RAID分区。然后,使用mdadm任何和所有可用的设置和选项,从这些分区手动创建RAID阵列。
  4. 一旦创建了数组,您也可以选择在数组上创建文件系统。
  5. 重新启动计算机,这次选择安装升级以正常安装。当Anaconda搜索系统中的磁盘时,它将找到预先存在的RAID设备。
  6. 当询问如何使用系统中的磁盘时,请选择“ 自定义布局”,然后单击“ 下一步”。在设备列表中,将列出预先存在的MD RAID设备。
  7. 选择一个RAID设备,单击编辑并配置其安装点和(可选)它应该使用的文件系统的类型(如果您以前没有创建),然后单击完成Anaconda将执行安装到这个预先存在的RAID设备,保留您在救援模式下创建它时选择的自定义选项。

注意

安装程序 的有限救援模式不包括man页面。无论是man mdadmman md包含用于创建自定义RAID阵列的有用信息,并且可能需要在整个解决方法。因此,可以访问带有这些man页面的机器,或者在启动进入救援模式并创建自定义阵列之前将其打印出来。

使用MOUNT命令

在Linux,UNIX和类似操作系统上,可以将不同分区和可移动设备(例如CD,DVD或USB闪存驱动器)上的文件系统附加到目录树中的某个点(装入点),然后分离再次。要附加或分离文件系统,请分别使用mountumount命令。本章介绍这些命令的基本用法,以及一些高级主题,如移动挂载点或创建共享子树。

列出当前已安装的文件系统

要显示所有当前连接的文件系统,mount不带其他参数运行该命令:

1
mount

该命令显示已知挂载点的列表。每行提供有关设备名称,文件系统类型,安装目录以及相关安装选项的重要信息,格式如下:

device on directory type type (options)

The findmnt u工具允许用户以树状形式列出已安装的文件系统, 要显示所有当前连接的文件系统,findmnt不带其他参数运行该命令

1
findmnt

指定文件系统类型

缺省情况下,输出mount命令包括各种虚拟文件系统,如sysfstmpfs。要仅显示具有特定文件系统类型的设备,请-t在命令行上提供该选项:

1
mount -t type

同样,要使用该findmnt命令仅显示具有特定文件系统类型的设备,请键入

1
findmnt -t type

列出当前已安装的ext4文件系统

通常情况下,这两个//boot分区格式化使用ext4。要仅显示使用此文件系统的安装点,请在shell提示符处键入以下内容:

1
2
3
$ mount -t ext4
/dev/sda2 on / type ext4 (rw)
/dev/sda1 on /boot type ext4 (rw)

要使用该findmnt命令列出此类安装点,请键入:

1
2
3
4
$ findmnt -t ext4
TARGET SOURCE FSTYPE OPTIONS
/ /dev/sda2 ext4 rw,realtime,seclabel,barrier=1,data=ordered
/boot /dev/sda1 ext4 rw,realtime,seclabel,barrier=1,data=ordered

挂载文件系统

要附加某个文件系统,请使用mount以下形式的命令:

1
mount [option…] device directory

设备可以通过以下方式识别:

  • 块设备 的完整路径:例如,/dev/sda3
  • 一个通用唯一标识符(UUID):例如,UUID=34795a28-ca6d-4fd8-a347-73671d0c19cb
  • 一个卷标:例如,LABEL=home

请注意,挂载文件系统时,不能访问目录的原始内容。

Linux不阻止用户将文件系统挂载到已连接文件系统的目录。要确定一个特定的目录是否作为挂载点,运行findmnt该目录作为参数的实用程序并验证退出代码:

1
findmnt directory; echo $?

如果没有文件系统连接到目录,则上述命令返回1

如果运行mount命令时没有提供所有必需信息(即没有设备名称,目标目录或文件系统类型),则mount读取/etc/fstab文件的内容以检查是否列出了给定的文件系统。该/etc/fstab文件包含设备名称的列表以及所选文件系统设置为要装入的目录以及文件系统类型和装入选项。因此,在安装指定的文件系统时/etc/fstab,可以选择以下选项之一:

1
2
mount [option…] directory
mount [option…] device

请注意,除非命令运行为root,否则安装文件系统需要权限。

注意

要确定UUID并且(如果设备使用它)特定设备的标签,请使用blkid以下形式的命令:

1
blkid device

例如,要显示有关的信息/dev/sda3,请键入:

1
2
# blkid /dev/sda3
/dev/sda3: LABEL="home" UUID="34795a28-ca6d-4fd8-a347-73671d0c19cb" TYPE="ext3"

指定文件系统类型

在大多数情况下,mount自动检测文件系统。但是,某些文件系统(例如NFS(网络文件系统)或CIFS(通用Internet文件系统))无法识别,需要手动指定。要指定文件系统类型,请使用mount以下形式的命令:

1
mount -t type device directory

通用文件系统类型

类型 描述
ext2 ext2文件系统。
ext3 ext3文件系统。
ext4 ext4文件系统。
btrfs btrfs文件系统。
xfs xfs文件系统。
iso9660 ISO 9660文件系统。它通常被光学媒体使用,通常是CD。
jfs JFS由IBM创建的文件系统。
nfs NFS文件系统。它通常用于通过网络访问文件。
nfs4 NFSv4文件系统。它通常用于通过网络访问文件。
ntfs NTFS文件系统。它通常用于运行Windows操作系统的机器上。
udf UDF文件系统。它通常用于光学媒体,通常是DVD。
vfat FAT文件系统。它通常用于运行Windows操作系统的机器,以及某些数字媒体,如USB闪存驱动器或软盘。

挂载USB闪存驱动器

较旧的USB闪存驱动器通常使用FAT文件系统。假设这样的驱动器使用该/dev/sdc1设备并且该/media/flashdisk/目录存在,请通过在shell提示符处键入以下命令将其挂载到此目录root

1
# mount -t vfat /dev/sdc1 /media/flashdisk

指定挂载选项

要指定其他挂载选项,请使用以下形式的命令:

1
mount -o options device directory

提供多个选项时,不要在逗号后面插入空格,否则mount会错误地将空格后面的值解释为附加参数

常见的安装选项

选项 描述
async 允许在文件系统上进行异步输入/输出操作。
auto 允许使用该mount -a命令自动安装文件系统。
defaults 提供一个别名async,auto,dev,exec,nouser,rw,suid
exec 允许在特定文件系统上执行二进制文件。
loop 将图像作为循环设备装入。
noauto 默认行为禁止使用该mount -a命令自动安装文件系统。
noexec 不允许在特定文件系统上执行二进制文件。
nouser 不允许普通用户(即非root)挂载和卸载文件系统。
remount 重新装入文件系统,以防已安装。
ro 将文件系统安装为只读。
rw 安装文件系统进行读取和写入。
user 允许普通用户(即非root)挂载和卸载文件系统。

挂载 ISO 镜像

可以使用循环设备挂载ISO映像(或通常的磁盘映像)。假设Fedora 14安装光盘的ISO映像存在于当前工作目录中,并且该/media/cdrom/目录存在,请通过运行以下命令将映像挂载到此目录root

1
# mount -o ro,loop Fedora-14-x86_64-Live-Desktop.iso /media/cdrom

请注意,ISO 9660设计为只读文件系统。

共享挂载

偶尔,某些系统管理任务需要从目录树中的多个位置(例如,在准备chroot环境时)访问同一个文件系统。这是可能的,并且Linux允许您根据需要将相同的文件系统安装到多个目录。另外,该mount命令实现了--bind提供复制特定坐骑的方法的选项。其用法如下:

1
mount --bind old_directory new_directory

尽管此命令允许用户从两个位置访问文件系统,但它不适用于原始目录中安装的文件系统。要包括这些安装,请输入:

1
mount --rbind old_directory new_directory

另外,为了提供尽可能大的灵活性,红帽企业版Linux 7实现了被称为共享子树的功能。该功能允许使用以下四种安装类型:

共享挂载

共享挂载允许创建给定挂载点的精确副本。当挂载点被标记为共享挂载时,原始挂载点内的任何挂载都会反映在其中,反之亦然。要将安装点的类型更改为共享安装,请在shell提示符处键入以下内容:

1
mount --make-shared mount_point

或者,要更改所选安装点和其下的所有安装点的安装类型,请键入:

1
mount --make-rshared mount_point

创建共享安装点

其他文件系统通常挂载在两个位置:/media/可移动介质的/mnt/目录以及临时挂载的文件系统的目录。通过使用共享挂载,可以使这两个目录共享相同的内容。为此root,将/media/目录标记为共享:

1
2
# mount --bind /media /media
# mount --make-shared /media

然后/mnt/使用以下命令创建它的重复项:

1
# mount --bind /media /mnt

现在可以验证在一个挂载/media/也出现在/mnt/。例如,如果CD-ROM驱动器包含非空媒体并且该/media/cdrom/目录存在,请运行以下命令:

1
2
3
4
5
# mount /dev/cdrom /media/cdrom
# ls /media/cdrom
EFI GPL isolinux LiveOS
# ls /mnt/cdrom
EFI GPL isolinux LiveOS

同样,也可以验证安装在/mnt/目录中的任何文件系统是否被反映/media/。例如,如果/dev/sdc1插入了使用该设备的非空USB闪存驱动器并且该/mnt/flashdisk/目录存在,请键入:

1
2
3
4
5
# mount /dev/sdc1 /mnt/flashdisk
# ls /media/flashdisk
en-US publican.cfg
# ls /mnt/flashdisk
en-US publican.cfg

从属挂载

从属安装允许创建给定挂载点的有限副本。当挂载点被标记为从属挂载时,原始挂载点内的任何挂载都会反映到挂载点中,但挂载挂载中的挂载不会反映在其原始映像中。要将挂载点的类型更改为从属安装,请在shell提示下键入以下内容:

1
mount --make-slave mount_point

或者,也可以通过输入以下命令来更改所选安装点及其下的所有挂载点的挂载类型:

1
mount --make-rslave mount_point

创建一个从站挂载点

这个例子展示了如何让/media/目录的内容也出现在目录中/mnt/,但是没有在/mnt/目录中的任何坐标被反映到/media/。因为root,首先将该/media/目录标记为共享:

1
2
#mount --bind /media /media
#mount --make-shared /media

然后创建它的副本/mnt/,但将其标记为“slave”:

1
2
#mount --bind /media /mnt
#mount --make-slave /mnt

现在验证一个挂载/media/也出现在/mnt/。例如,如果CD-ROM驱动器包含非空媒体并且该/media/cdrom/目录存在,请运行以下命令:

1
2
3
4
5
mount /dev/cdrom /media/cdrom
ls /media/cdrom
#EFI GPL isolinux LiveOS〜
ls /mnt/cdrom
#EFI GPL isolinux LiveOS

还要验证/mnt/目录中装载的文件系统没有被反映到/media/。例如,如果/dev/sdc1插入了使用该设备的非空USB闪存驱动器并且该/mnt/flashdisk/目录存在,请键入:

1
2
3
4
#mount /dev/sdc1 /mnt/flashdisk
#ls /media/flashdisk
#ls /mnt/flashdisk
en-US publican.cfg

私有挂载

私有挂载是挂载的默认类型,与共享或从属挂载不同,它不接收或转发任何传播事件。要明确地将安装点标记为私有安装,请在shell提示符处输入以下内容:

1
mount --make-private mount_point

或者,可以更改所选安装点的装载类型及其下的所有装入点:

1
mount --make-rprivate mount_point

创建一个私有安装点

假定共享挂载点先前是通过使用以下命令创建的root

1
2
3
#mount --bind /media /media
#mount --make-shared /media
#mount --bind /media /mnt

要将该/mnt/目录标记为私有,请输入:

1
# mount --make-private /mnt

现在可以确认没有内的坐骑/media/出现在/mnt/。例如,如果CD-ROM驱动器包含非空媒体并且该/media/cdrom/目录存在,请运行以下命令:

1
2
3
4
5
#mount /dev/cdrom /media/cdrom
ls /media/cdrom
#EFI GPL isolinux LiveOS〜
#ls /mnt/cdrom

也可以验证安装在/mnt/目录中的文件系统没有被反映/media/。例如,如果/dev/sdc1插入了使用该设备的非空USB闪存驱动器并且该/mnt/flashdisk/目录存在,请键入:

1
2
3
4
#mount /dev/sdc1 /mnt/flashdisk
#ls /media/flashdisk
#ls /mnt/flashdisk
en-US publican.cfg

不可绑定的挂载点

为了防止给定的挂载点被复制,使用一个不可绑定的挂载点。要将安装点的类型更改为不可绑定安装,请在shell提示符处键入以下内容:

1
mount --make-unbindable mount_point

或者,可以更改所选安装点的装载类型及其下的所有装入点:

1
mount --make-runbindable mount_point

创建一个不可绑定的挂载点

要防止/media/共享目录root,请在shell提示符处键入以下内容:

1
2
# mount --bind /media /media
# mount --make-unbindable /media

这样,任何后续尝试重复此挂载将失败并出现错误:

1
2
3
4
5
# mount --bind /media /mnt
mount: wrong fs type, bad option, bad superblock on /media,
missing codepage or helper program, or other error
In some cases useful info is found in syslog - try
dmesg | tail or so

移动一个挂载点

要更改安装文件系统的目录,请使用以下命令:

1
mount --move old_directory new_directory

移动现有的NFS挂载点

一个NFS存储包含用户目录,并已被挂载/mnt/userdirs/。作为root/home通过使用以下命令移动此安装点:

1
# mount --move /mnt/userdirs /home

要验证装入点已被移动,请列出两个目录的内容:

1
2
3
#ls /mnt/userdirs
ls /home
jill joe

设置只读权限root

有时,您需要以只读权限安装根文件系统。示例用例包括增强安全性或在系统意外断电后确保数据完整性。

配置root为在引导时使用只读权限进行挂载

  1. /etc/sysconfig/readonly-root 文件中, 更改 READONLYyes:
1
2
3
# Set to 'yes' to mount the system file systems read-only.
READONLY=yes
[output truncated]
  1. /etc/fstab文件的根条目(/)中将缺省值 defaults 更改为 ro
1
/dev/mapper/luks-c376919e... / ext4 ro,x-systemd.device-timeout=0 1 1
  1. /etc/default/grub中,添加ro 到文件中的 GRUB_CMDLINE_LINUX 指令 并确保它不包含 rw:
1
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet ro"
  1. 重新创建 GRUB2 配置文件:
1
# grub2-mkconfig -o /boot/grub2/grub.cfg
  1. 如果需要在tmpfs文件系统中添加要以写入权限挂载的文件和目录,请在该/etc/rwtab.d/目录中创建一个文本文件,并将配置置于该文件中。例如,要/etc/example/file使用写入权限进行挂载,请将以下行添加到文件中:/etc/rwtab.d/example
1
files /etc/example/file

对文件和目录所做的更改tmpfs不会保留在各个引导程序中.

  1. 重启操作系统

root立即重新挂载

如果root(/)在系统引导时以只读权限挂载,则可以使用写入权限重新挂载:

1
# mount -o remount,rw /

/使用只读权限重新装入,请运行:

1
# mount -o remount,ro /

这个命令装载整个 /只读权限。更好的方法是通过将某些文件和目录复制到RAM中来保留写入权限

保留写权限的文件和目录

为了使系统正常工作,某些文件和目录需要保留写权限。root在只读模式下,它们被安装在tmpfs临时文件系统的RAM中。从/etc/rwtab文件读取这些文件和目录的默认设置,其中包含:

1
2
3
4
5
6
7
8
9
dirs	/var/cache/man
dirs /var/gdm
[output truncated]
empty /tmp
empty /var/cache/foomatic
[output truncated]
files /etc/adjtime
files /etc/ntp.conf
[output truncated]

/etc/rwtab文件中的 条目遵循以下格式:

1
how the file or directory is copied to tmpfs       	path to the file or directory

文件或目录可以通过tmpfs三种方式复制,因此有三种类型的条目:

  • empty path: 空的路径被复制到 tmpfs. 例如: empty /tmp
  • dirs path: 目录树被复制到 tmpfs, 为空. 例如: dirs /var/run
  • files path: 文件或目录被 tmpfs 完整复制. 例如: files /etc/resolv.conf

添加自定义路径时适用相同的格式/etc/rwtab.d/

卸载文件系统

要分离先前安装的文件系统,请使用以下任一种umount命令:

1
2
umount directory
umount device

当一个文件系统正在使用(例如,当一个进程正在读取这个文件系统上的一个文件,或者当它被内核使用的时候),运行这个umount命令将会失败并报错。要确定哪些进程正在访问文件系统,请使用fuser以下形式的命令:

1
fuser -m directory

例如,要列出正在访问挂载到/media/cdrom/目录的文件系统的进程,请键入:

1
2
$ fuser -m /media/cdrom
/media/cdrom: 1793 2013 2022 2435 10532c 10672c

卸载CD

要卸载先前安装到该/media/cdrom/目录的CD,请在shell提示符处键入以下内容:

1
$ umount /media/cdrom

VOLUME_KEY函数

volume_key 函数提供了两个工具, libvolume_key and volume_key. libvolume_key 是一个用于处理存储卷加密密钥并将其与卷分开存储的库。volume_key是一个相关的命令行工具,用于提取密钥和密码以恢复对加密硬盘的访问。

当主要用户忘记密钥和密码,员工突然离职后,或者在硬件或软件故障破坏加密卷的标题后提取数据时,这一点很有用。在公司设置中,IT帮助台可以volume_key在将计算机交付给最终用户之前用于备份加密密钥。

目前volume_key只支持LUKS卷加密格式。

volume_key` 命令

volume_key 格式是:

1
volume_key [OPTION]... OPERAND

volume_key通过指定以下选项之一来确定 操作数和操作模式:

  • --save

    该命令期望操作数 [ ]。如果提供了数据包,volume_key则会从中提取密钥和密码。如果没有提供数据包volume_key则会从卷中提取密钥和密码,在必要时提示用户。这些密钥和密码将被存储在一个或多个输出数据包中。

  • --restore

    该命令期望操作数卷数据包。然后,它会打开音量,并使用密钥和密码短语中的数据包,使音量再次访问,提示用户在必要时,例如允许用户输入新的密码,例如。

  • --setup-volume

    该命令期望操作数 volume packet name. 然后打开 volume 并使用 packet t中的密钥和密码设置 volume 来解密数据 ,name.Name 是 dm-crypt volume的名称. 此操作是解密卷可用例如 /dev/mapper/*name*.此操作不会通过添加新的密码来永久性更改 volume for example. 用户可以访问和修改解密卷,修改过程中的劵.

  • --reencrypt, --secrets, and --dump

    这三个命令使用不同的输出方法执行类似的功能。他们每个都需要操作数数据包,每个都打开数据包,在必要时解密数据包--reencrypt然后将信息存储在一个或多个新的输出分组中。--secrets输出包中包含的密钥和密码短语。--dump输出数据包的内容,尽管默认情况下不输出密钥和密码。这可以通过追加--with-secrets命令来改变。也可以通过使用--unencrypted命令转储数据包的未加密部分(如果有的话)。这不需要任何密码或私钥访问。

每个这些可以附加以下选项:

  • -o, --output packet

    该命令将默认密钥或密码写入数据包。默认密钥或密码短语取决于音量格式。确保它不可能过期,并允许--restore恢复对卷的访问。

  • --output-format format

    此命令对所有输出数据包使用指定的格式。目前,格式可以是以下之一:

    • asymmetric:使用CMS来加密整个数据包,并且需要一个证书
    • asymmetric_wrap_secret_only:只包装秘密,或密钥和密码,并且需要证书
    • passphrase:使用GPG加密整个数据包,并需要密码
  • --create-random-passphrase packet

    此命令会生成一个随机的字母数字密码,将其添加到音量(不影响其他密码),然后将此随机密码存储到数据包中

使用VOLUME_KEY作为个人用户

作为个人用户,volume_key可以使用以下过程来保存加密密钥。

对于这个文件中的所有例子, /path/to/volume 是一个LUKS设备, 而不是其中包含的纯文本设备. blkid -s type /path/to/volume 应该报告 type `="crypto_LUKS".

使用独立volume_key

  1. 运行:
1
volume_key --save /path/to/volume -o escrow-packet

随后会出现提示,要求托管数据包密码来保护密钥。

  1. 保存生成的escrow-packet文件,确保密码不会被遗忘。

如果忘记密码短语,请使用保存的托管数据包恢复对数据的访问。

使用托管数据包恢复对数据的访问

  1. volume_key可以运行的环境中启动系统,并且托管数据包可用(例如救援模式)。

  2. 运行:

1
volume_key --restore /path/to/volume escrow-packet

在创建托管数据包时使用的托管数据包密码以及卷的新密码会显示提示。

  1. 使用所选密码安装音量。

要释放加密卷的LUKS标头中的密码槽,请使用该命令删除旧的,被遗忘的密码cryptsetup luksKillSlot

在较大的组织中使用VOLUME_KEY

在一个更大的组织中,使用每个系统管理员都知道的单个密码并且为每个系统记录一个单独的密码是不切实际的和安全的风险。为了解决这个问题,volume_key可以使用非对称加密技术来减少知道在任何计算机上访问加密数据所需的密码的人数。

本节将介绍在保存加密密钥,如何保存加密密钥,恢复对卷的访问以及设置紧急密码之前所需的准备步骤。

准备保存加密密钥

为了开始保存加密密钥,需要做一些准备。

准备

  1. 创建一个X509证书/私人对.

  2. 指定值得信任的可信用户不要危及私钥。这些用户将能够解密托管数据包。

  3. 选择将使用哪些系统来解密托管数据包。在这些系统上,建立一个包含私钥的NSS数据库。

    如果私钥没有在NSS数据库中创建,请按照下列步骤操作:

    • 将证书和私钥存储在一个PKCS#12文件中。

    • 运行:

1
certutil -d /the/nss/directory -N

此时可以选择NSS数据库密码。每个NSS数据库可以有不同的密码,因此如果每个用户使用一个单独的NSS数据库,指定的用户不需要共享一个密码。

  • 运行:
1
pk12util -d /the/nss/directory -i the-pkcs12-file
  1. 将证书分发给任何安装系统或在现有系统上保存密钥的人员。

  2. 对于保存的专用密钥,请准备存储空间,以便通过机器和音量来查找。例如,这可以是一个简单的目录,每个机器有一个子目录,也可以是用于其他系统管理任务的数据库。

保存加密密钥

完成所需的准备工作后,现在可以使用以下步骤保存加密密钥。

保存加密秘钥

  1. 运行:
1
volume_key --save /path/to/volume -c /path/to/cert escrow-packet
  1. 将生成的escrow-packet文件保存在准备好的存储中,将其与系统和卷相关联.

这些步骤可以手动执行,或者作为系统安装的一部分编写脚本。

恢复对卷的访问

加密密钥保存后,可以根据需要将访问权恢复到驱动程序。

恢复对卷的访问

  1. 从数据包存储器获取卷的托管数据包,并将其发送给指定用户之一进行解密。

  2. 指定的用户运行:

1
volume_key --reencrypt -d /the/nss/directory escrow-packet-in -o escrow-packet-out

提供NSS数据库密码后,指定用户选择密码进行加密escrow-packet-out。该密码可以每次都不同,只有在密钥从指定用户移动到目标系统时才能保护密码。

  1. escrow-packet-out从指定的用户 获取文件和密码。

  2. 在可运行的环境中启动目标系统,volume_key并使escrow-packet-out文件可用,例如在救援模式下。

  3. 运行:

1
volume_key --restore /path/to/volume escrow-packet-out

将出现提示,指定用户选择的数据包密码以及该卷的新密码。

  1. 使用所选的卷密码安装卷。

例如,可以使用 cryptsetup luksKillSlot删除忘记的旧密码, 以释放加密卷的LUKS标头中的密码插槽。这是用命令完成的。cryptsetup luksKillSlot device key-slot.

设置紧急密码

在某些情况下(如出差旅行),系统管理员直接与受影响的系统协作是不切实际的,但用户仍然需要访问其数据。在这种情况下,volume_key可以使用密码和加密密钥。

在系统安装过程中,运行:

1
volume_key --save /path/to/volume -c /path/to/ert --create-random-passphrase passphrase-packet

这将生成一个随机密码,将其添加到指定的卷,并将其存储到passphrase-packet 。也可以将选项--create-random-passphrase-o选项组合在一起生成两个数据包。

如果用户忘记了密码,指定的用户运行:

1
volume_key --secrets -d /your/nss/directory passphrase-packet

这显示了随机密码。将此密码提供给最终用户。

固态硬盘部署指南

固态硬盘(SSD)是使用NAND闪存芯片来持久存储数据的存储设备。这使得它们与上一代磁盘存储器不同,磁盘存储旋转磁盘中的数据。在SSD中,整个逻辑块地址(LBA)范围内的数据访问时间不变; 而使用旋转媒体的较旧的磁盘,跨越大地址范围的访问模式会招致成本。因此,SSD设备具有更好的延迟和吞吐量。

随着使用块的数量接近磁盘容量,性能下降。供应商对性能的影响程度差异很大。但是,所有设备都会经历一些降级。

为了解决退化问题,主机系统(例如,Linux内核)可以使用丢弃请求来通知存储器给定范围的块不再被使用。SSD可以使用这些信息来释放内部空间,使用空闲块进行磨损平衡。只有当存储广告支持存储协议(不管是ATA还是SCSI)时才会发放丢弃。丢弃请求使用特定于存储协议协商的丢弃命令发布到存储装置(TRIM用于ATA命令,和WRITE SAMEUNMAP一组,或UNMAP用于SCSI命令)。

discard当满足以下两点时, 启用支持是最有用的:

  • 文件系统上的可用空间仍然可用。
  • 底层存储设备上的大多数逻辑块已被写入。

并非市场上所有的固态器件都有discard支持。要确定您的固态设备是否discard支持,请检查/sys/block/sda/queue/discard_granularity

部署注意事项

由于SSD的内部布局和操作,最好在内部擦除块边界上对器件进行分区。如果SSD导出拓扑信息,红帽企业版Linux 7中的分区工具会选择合理的默认值。

然而,如果该设备不会导出拓扑信息,红帽建议的第一个分区在1MB边界创建。

逻辑卷管理器(LVM),设备映射程序(DM)目标以及LVM使用支持丢弃的MD(软件RAID)目标。唯一不支持丢弃的DM目标是dm-snapshot,dm-crypt和dm-raid45。在Red Hat Enterprise Linux 6.1中添加了对dm-mirror的支持,从7.0开始,MD支持丢弃。

如果SSD不能discard正确处理,则在SSD上使用RAID级别5会导致性能低下。您可以在raid456.conf文件中或在GRUB2配置中设置放弃。有关说明,请参阅以下过程。

在raid456.conf中设置放弃

devices_handle_discard_safely模块参数的设定中的raid456模块。要在raid456.conf文件中启用丢弃:

  1. 确认您的硬件支持丢弃:
1
# cat /sys/block/disk-name/queue/discard_zeroes_data

如果返回值是1,则支持丢弃。如果命令返回0,则RAID代码必须将磁盘清零,这需要更多的时间。

  1. 创建该/etc/modprobe.d/raid456.conf文件,并包含以下行:
1
options raid456 devices_handle_discard_safely = Y
  1. 使用该dracut -f命令重建初始ramdisk(initrd)。

  2. 重新启动系统以使更改生效。

在GRUB2配置中设置放弃

devices_handle_discard_safely模块参数的设定中的raid456模块。要在GRUB2配置中启用丢弃,请执行以下操作:

  1. 确认您的硬件支持丢弃:
1
# cat /sys/block/disk-name/queue/discard_zeroes_data

如果返回值是1,则支持丢弃。如果命令返回0,则RAID代码必须将磁盘清零,这需要更多的时间。

  1. 将以下行添加到/etc/default/grub文件中:
1
raid456.devices_handle_discard_safely = Y
  1. 在具有BIOS固件的系统和具有UEFI的系统上,GRUB2配置文件的位置不同。使用以下命令之一重新创建GRUB2配置文件。

    • 在具有BIOS固件的系统上,使用:
1
# grub2-mkconfig -o /boot/grub2/grub.cfg
  • 在具有UEFI固件的系统上,使用:
1
# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
  1. 重新启动系统以使更改生效。

注意

在红帽企业版Linux 7中,只有ext4和XFS文件系统完全支持丢弃。

在Red Hat Enterprise Linux 6.3及更早版本中,只有ext4文件系统完全支持丢弃。从红帽企业版Linux 6.4开始,ext4和XFS文件系统完全支持丢弃。要在设备上启用丢弃命令,请使用discardmount命令的选项。例如,安装/dev/sda2/mnt与丢弃启用,使用:

1
# mount -t ext4 -o discard /dev/sda2 /mnt

默认情况下,ext4不会发出discard命令,主要是避免可能无法正确执行丢弃的设备上的问题。Linux swap代码发出discard命令丢弃启用设备,并没有选项来控制这种行为。

写障碍

一个写屏障是用来确保文件系统元数据被正确地写入,并下令永久存储内核机制,即使与性写高速缓存存储设备断电。启用了写入屏障的文件系统还确保通过传输的数据fsync()在整个功率损耗期间保持不变。

启用写入障碍会对某些应用程序造成显着的性能损失。特别是,fsync()大量使用或者创建和删除很多小文件的应用程序可能运行速度要慢得多。

写障碍的重要性

文件系统非常谨慎地安全地更新元数据,确保一致性。已记录的文件系统将元数据更新绑定到事务中,并按以下方式将其发送到永久存储:

  1. 首先,文件系统将事务主体发送给存储设备。
  2. 然后,文件系统发送一个提交块。
  3. 如果将事务及其相应的提交块写入磁盘,则文件系统假定事务将在任何电源故障之后存活。

但是,对于具有额外缓存的存储设备,断电期间的文件系统完整性会变得更加复杂。存储目标设备(如本地S-ATA或SAS驱动器)的写入缓存范围可以从32MB到64MB(使用现代驱动器)。硬件RAID控制器通常包含内部写入缓存。而且,高端阵列(如NetApp,IBM,Hitachi和EMC等)也拥有大量缓存。

当数据处于缓存时,具有写入缓存的存储设备将I / O报告为“完成”; 如果缓存失去能力,它也会丢失数据。更糟糕的是,当缓存取消暂存到永久性存储时,它可能会更改原始的元数据排序。发生这种情况时,提交块可能存在于磁盘上,而没有完整的关联事务。结果,日志可能会在断电恢复期间将这些未初始化的事务块重放到文件系统中; 这将导致数据不一致和腐败。

如何写障碍的工作

写入障碍在Linux内核中通过在I / O之前和之后的存储写入缓存刷新来实现,这对订单来说至关重要。事务写入后,刷新存储缓存,写入提交块,并重新刷新缓存。这确保:

  • 该磁盘包含所有的数据。
  • 没有重新排序发生。

启用屏障后,fsync()调用也将发出存储缓存刷新。这可以确保文件数据在磁盘上保留,即使在fsync()返回后不久也会发生掉电。

启用/禁用写障碍

为了降低掉电时数据损坏的风险,一些存储设备使用电池供电的写缓存。通常,高端阵列和一些硬件控制器使用电池供电的写入缓存。但是,由于内核不可见缓存的波动性,红帽企业版Linux 7默认在所有支持的日志文件系统上启用了写障碍。

注意

写高速缓存旨在提高I / O性能。但是,启用写屏障意味着不断刷新这些缓存,这会显着降低性能。

对于具有非易失性,电池支持的写入缓存和禁止写入缓存的设备,可以使用-o nobarrier选项在安装时安全地禁用写入屏障mount。但是,有些设备不支持写入屏障; 这些设备将记录一条错误消息/var/log/messages

为每个文件系统写入屏障错误消息

文件系统 错误信息
EXT3 / EXT4 JBD: barrier-based sync failed on *device* - disabling barriers
XFS Filesystem *device* - Disabling barriers, trial barrier write failed
BTRFS btrfs: disabling barriers on dev *device*

写入障碍注意事项

一些系统配置不需要写入屏障来保护数据。在大多数情况下,其他方法比写障碍更好,因为写障碍会导致显着的性能损失。

禁用写入缓存

避免数据完整性问题的一种方法是确保写入缓存在电源故障时不会丢失数据。如果可能的话,配置这个的最好方法是简单地禁用写缓存。在具有一个或多个SATA驱动器的简单服务器或台式机(不包括本地SATA控制器Intel AHCI部分)上,可以使用以下hdparm命令禁用目标SATA驱动器上的写入缓存:

1
#hdparm -W0 / device /

电池支持的写入缓存

只要系统使用硬件RAID控制器和带有电池供电的写缓存,写屏障也是不必要的。如果系统配备了这样的控制器,并且如果其组件驱动器禁止了写入缓存,则控制器将宣告自己为直写式缓存; 这将通知内核写入缓存数据将在掉电时存活。

大多数控制器使用特定于供应商的工具来查询和操作目标驱动器。例如,LSI Megaraid SAS控制器使用电池支持的写入缓存; 这种类型的控制器需要该MegaCli64工具来管理目标驱动器。要显示LSI Megaraid SAS所有后端驱动器的状态,请使用:

1
#MegaCli64 -LDGetProp -DskCache -LAll -aALL

要禁用LSI Megaraid SAS所有后端驱动器的写缓存,请使用:

1
#MegaCli64 -LDSetProp -DisDskCache -Lall -aALL

注意

硬件RAID卡在系统运行时为电池充电。如果系统长时间关闭电源,电池将会失去充电功能,在电源出现故障时,储存的数据会变得易受攻击。

高端数组

高端阵列在发生电源故障时有多种保护数据的方式。因此,不需要验证外部RAID存储器中的内部驱动器的状态。

NFS

NFS客户端不需要启用写入障碍,因为数据完整性是由NFS服务器端处理的。因此,应该配置NFS服务器以确保在整个电力损失期间(无论是通过编写屏障还是通过其他方式)数据持久化。

存储I/O对齐和大小

最近对SCSI和ATA标准的增强允许存储设备指示其首选(并且在某些情况下是所需的)I/O对齐I/O大小。此信息对于较新的磁盘驱动器特别有用,可将物理扇区大小从512字节增加到4k字节。此信息对于RAID设备也可能是有益的,其中块大小和条带大小可能会影响性能。

在Linux I/O栈已经增强处理供应商提供的 I/O 对齐和 I/O 大小信息, 从而允许存储管理工具 (parted, lvm, mkfs.*, 等等) 以优化数据放置和访问。如果传统设备不能导出I / O对齐和大小数据,那么红帽企业版Linux 7中的存储管理工具将在4k(或2的更大幂)边界上保守地对齐I / O。这将确保4k扇区设备即使没有指示任何所需的/首选的I / O对齐和尺寸,也能正常工作.

红帽企业版Linux 7的IO调度程序已更改。默认IO调度程序现在是截止日期,SATA驱动器除外。CFQ是SATA驱动器的默认IO调度程序。为了更快速的存储,截止日期优于CFQ,并且在使用时可以提高性能,而不需要特殊的调整。

如果某些磁盘(例如SAS旋转磁盘)的默认值不正确,则将IO调度程序更改为CFQ。这个实例将取决于工作量。

存储访问参数

操作系统使用以下信息来确定I/O对齐和大小:

  • physical_block_size

    设备可以运行的最小的内部单元

  • logical_block_size

    用于外部寻址设备上的某个位置

  • alignment_offset

    Linux块设备(partition/MD/LVM device)开始的字节数与基础物理对齐偏移量

  • minimum_io_size

    该设备的首选最小单位为随机I/O

  • optimal_io_size

    该设备的流式 I/O的首选单位

例如,某些4K扇区设备可能会在physical_block_size内部使用4K,但会logical_block_size向Linux发布更细粒度的512字节。这种差异引起了I/O错位的可能性。为了解决这个问题,红帽企业Linux 7 I/O堆栈将尝试启动自然对齐的边界上的所有数据区域(physical_block_size),如果块设备的开始偏离底层物理,确保它占到任何alignment_offset对准。

存储供应商还可以提供有关设备的随机 *I/O 和流 I/O (minimum_io_size) 的首选最小单位的 I/O (optimal_io_size) . 例如, minimum_io_sizeoptimal_io_size 可能分别对应于RAID设备的块大小和条带大小.

用户空间访问

始终注意使用正确对齐和大小的I/O。这对于直接I/O访问尤为重要。直接I/O应该在一个logical_block_size边界上对齐,并在多个边界上对齐logical_block_size

对于原生4K设备(即logical_block_size是4K),应用程序执行多个设备的直接I/O现在至关重要logical_block_size。这意味着应用程序将会失败,原生4k设备执行512字节对齐的I/O而不是4k对齐的I/O。

为避免这种情况,应用程序应该查询设备的I/O参数,以确保使用正确的I/O对齐和大小。如前所述,I/O参数通过两个sysfs和块设备ioctl接口公开。

有关更多详细信息,请参阅man libblkid。该man页面由libblkid-devel软件包提供。

sysfs Interface

  • /sys/block/disk/alignment_offset

    或者

    /sys/block/disk/partition /alignment_offset

    文件位置取决于磁盘是物理磁盘(是本地磁盘,本地RAID还是多路径LUN)还是虚拟磁盘。第一个文件位置适用于物理磁盘,而第二个文件位置适用于虚拟磁盘。这是因为virtio-blk将始终报告分区的对齐值。物理磁盘可能会或可能不会报告对齐值。

  • /sys/block/*disk*/queue/physical_block_size

  • /sys/block/*disk*/queue/logical_block_size

  • /sys/block/*disk*/queue/minimum_io_size

  • /sys/block/*disk*/queue/optimal_io_size

内核仍将sysfs为不提供I / O参数信息的“传统”设备导出这些属性,例如:

sysfs Interface

1
2
3
4
5
alignment_offset:    0
physical_block_size: 512
logical_block_size: 512
minimum_io_size: 512
optimal_io_size: 0

Block Device ioctls块设备ioctls

  • BLKALIGNOFF: alignment_offset
  • BLKPBSZGET: physical_block_size
  • BLKSSZGET: logical_block_size
  • BLKIOMIN: minimum_io_size
  • BLKIOOPT: optimal_io_size

I/O标准

本节介绍ATA和SCSI设备使用的I/O标准。

ATA

ATA设备必须通过IDENTIFY DEVICE命令报告适当的信息。ATA设备只报告I / O参数physical_block_sizelogical_block_sizealignment_offset。额外的I / O提示超出了ATA命令集的范围。

SCSI

红帽企业版Linux 7中的I / O参数支持至少需要版本3SCSI主命令(SPC-3)协议。内核只会发送一个扩展查询(可以访问该BLOCK LIMITS VPD页面),并READ CAPACITY(16)命令那些声称符合SPC-3的设备。

READ CAPACITY(16)命令提供块大小和对齐偏移:

  • LOGICAL BLOCK LENGTH IN BYTES 被用来派生 /sys/block/*disk*/queue/physical_block_size
  • LOGICAL BLOCKS PER PHYSICAL BLOCK EXPONENT 被用来派生 /sys/block/*disk*/queue/logical_block_size
  • LOWEST ALIGNED LOGICAL BLOCK ADDRESS 用来派生:
    • /sys/block/*disk*/alignment_offset
    • /sys/block/*disk*/*partition*/alignment_offset

BLOCK LIMITS VPD页面(0xb0)提供了I/O提示。它也使用OPTIMAL TRANSFER LENGTH GRANULARITYOPTIMAL TRANSFER LENGTH导出:

  • /sys/block/*disk*/queue/minimum_io_size
  • /sys/block/*disk*/queue/optimal_io_size

sg3_utils软件包提供了sg_inq可用于访问该BLOCK LIMITS VPD页面的实用程序。为此,请运行:

1
# sg_inq -p 0xb0 disk

堆叠I/O参数

Linux I/O堆栈的所有层都被设计为将各种I/O参数传播到堆栈中。当一个图层消耗一个属性或聚合很多设备时,该图层必须公开适当的I/O参数,以便上层设备或工具在转换后可以准确查看存储。一些实际的例子是:

  • I/O堆栈中只有一层应该调整为非零值alignment_offset; 一旦相应地调整一层,它将输出一个alignment_offset零的设备。
  • 使用LVM创建的条纹设备映射(DM)设备必须导出minimum_io_sizeoptimal_io_size相对于所述条纹计数(盘数)和用户提供的块大小。

在红帽企业版Linux 7中,Device Mapper和Software Raid(MD)设备驱动程序可以用来任意组合具有不同I / O参数的设备。内核的块层将尝试合理地组合各个设备的I / O参数。内核不会阻止组合异构设备; 但是,请注意与此相关的风险。

例如,一个512字节的设备和一个4K设备可以组合成一个逻辑DM设备,其具有logical_block_size4K的。分布在这种混合设备上的文件系统假设4K将被原子写入,但实际上,当发送到512字节的设备时,它将跨越8个逻辑块地址。logical_block_size如果系统崩溃,则使用4K 更高级DM设备可能会增加对512字节设备的部分写入的可能性。

如果组合多个设备的I/O参数导致冲突,则块层可以发出设备容易受到部分写入和/或未对准的警告。

逻辑卷管理器

LVM提供用于管理内核DM设备的用户空间工具。LVM将移动数据区的开始(给定的DM设备将使用)来说明alignment_offset与由LVM管理的任何设备相关的非零值。这意味着逻辑卷将正确对齐(alignment_offset=0)。

默认情况下,LVM将调整为任何alignment_offset,但是可以通过设置data_alignment_offset_detection0in 来禁用此行为/etc/lvm/lvm.conf。不建议禁用此功能。

LVM还将检测设备的I/O提示。设备数据区域的开始将是sysfs中的一个倍数minimum_io_sizeoptimal_io_size暴露的数量。LVM将使用minimum_io_sizeif optimal_io_size是未定义的(即0)。

默认情况下,LVM将自动确定这些I/O提示,但是可以通过设置data_alignment_detection0in 来禁用此行为/etc/lvm/lvm.conf。不建议禁用此功能。

分区和文件系统工具

本节介绍不同的分区和文件系统管理工具如何与设备的I/O参数进行交互。

util-linux-ng的libblkid和fdisk

libblkid设置有库util-linux-ng包包括一个编程API来访问设备的I/O参数。libblkid允许应用程序(尤其是使用Direct I/O的应用程序)正确调整I/O请求的大小。在fdisk从公用util-linux-ng的用途libblkid来确定用于所有分区的最佳放置的设备的I/O参数。该fdisk实用程序将对齐1MB边界上的所有分区。

分开和libparted

libpartedparted也使用I/O参数API libblkid。红帽企业Linux 7安装程序(Anaconda)使用libparted,这意味着由安装程序创建的所有分区或parted将被正确对齐。对于似乎不提供I/O参数的设备上创建的所有分区,默认对齐将为1MB。

启发式parted使用如下:

  • 始终使用报告alignment_offset作为第一个主分区启动的偏移量。

  • 如果optimal_io_size定义(即不是0),则对齐optimal_io_size边界上的所有分区。

  • 如果optimal_io_size是未定义的(即0),alignment_offset0minimum_io_size是2的幂,使用默认1MB对准。

    对于那些看似不提供I / O提示的“传统”设备来说,这是最好的办法。因此,默认情况下,所有分区将在1MB边界上对齐。


    红帽企业版Linux 7无法区分不提供I/O提示的设备,以及使用alignment_offset=0和提供此功能的设备optimal_io_size=0。这样的设备可能是一个单一的SAS 4K设备; 因此,在磁盘启动时,最坏的情况是1MB的空间丢失。

文件系统工具

不同的 mkfs.*filesystem*实用程序也被增强以消耗设备的I/O参数. 这些实用程序将不允许将文件系统格式化为使用logical_block_size小于底层存储设备的块大小

除了 mkfs.gfs2, 所有 mkfs.*filesystem* 实用程序还使用 I/O 提示布局相对于minimum_io_size 磁盘上的数据结构和数据区optimal_io_size 和底层存储设备 ,这使得文件系统可以针对各种RAID(条纹)布局进行最佳格式化。

远程无盘系统

要设置通过PXE引导的基本远程无盘系统,需要以下软件包:

  • tftp-server

  • xinetd

  • dhcp

  • syslinux

  • dracut-network

    注意

    安装dracut-network包后,将以下行添加到/etc/dracut.conf

1
add_dracutmodules+="nfs"

远程无盘系统启动需要tftp服务(由提供tftp-server)和DHCP服务(由提供dhcp)。该tftp服务用于initrd通过PXE加载程序检索内核映像并通过网络进行检索。

SELinux仅支持NFSv4.2。要使用SELinux,必须/etc/sysconfig/nfs通过添加以下行来显式启用NFS :

RPCNFSDARGS="-V 4.2"

然后,在/var/lib/tftpboot/pxelinux.cfg/default, 更改 root=nfs:server-ip:/exported/root/directoryroot=nfs:server-ip:/exported/root/directory,vers=4.2.

最后,重新启动NFS服务器。

以下各节概述了在网络环境中部署远程无盘系统的必要步骤。

些RPM软件包已经开始使用文件功能(比如setcapgetcap)。但是,NFS目前不支持这些,所以试图安装或更新任何使用文件功能的软件包将会失败。

为无盘客户机配置tftp服务

tftp服务默认是禁用的。要启用它并允许通过网络启动PXE,请将该Disabled选项设置/etc/xinetd.d/tftpno。要进行配置tftp,请执行以下步骤:

配置tftp

  1. tftp根目录 (chroot) 位于 /var/lib/tftpboot. 复制 /usr/share/syslinux/pxelinux.0/var/lib/tftpboot/, 例如:

    cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/

  2. 在tftp根目录下创建目录 pxelinux.cfg :

    mkdir -p /var/lib/tftpboot/pxelinux.cfg/

还需要正确配置防火墙规则以允许tftp通信; 作为tftp对TCP封装器的支持,你可以配置主机对tftpvia的访问/etc/hosts.allow

为无盘客户机配置DHCP

配置好tftp服务器后,需要在同一台主机上设置DHCP服务。有关如何设置DHCP服务器的说明,请参阅“Red Hat Enterprise Linux 7 部署指南”。另外,您应该在DHCP服务器上启用PXE引导; 为此,请将以下配置添加到/etc/dhcp/dhcp.conf

1
2
3
4
5
6
7
allow booting;
allow bootp;
class "pxeclients" {
match if substring(option vendor-class-identifier, 0, 9) = "PXEClient";
next-server server-ip;
filename "pxelinux.0";
}

替换*server-ip*tftpDHCP服务所在主机的IP地址。现在,tftp配置了DHCP,剩下的就是配置NFS和导出的文件系统。

为无盘客户机配置导出的文件系统

导出文件系统的根目录(由网络中的无盘客户机使用)通过NFS共享。配置NFS服务以将其添加到根目录/etc/exports

为了适应完全无盘的客户端,根目录应该包含完整的红帽企业Linux安装。您可以通过以下方式将其与正在运行的系统rsync同步:

1
#rsync -a -e ssh --exclude ='/ proc / *'--exclude ='/ sys / *' hostname.com:/ / exported / root / directory

替换为要hostname.com与之同步的正在运行的系统的主机名rsync/exported/root/directory是导出文件系统的路径。

另外,您还可以使用yum--installroot选项来安装Red Hat Enterprise Linux的特定位置。例如:

1
yum groupinstall Base --installroot=/exported/root/directory --releasever=/

要导出的文件系统在无盘客户机可以使用之前,仍然需要进一步配置。为此,请执行以下步骤:

配置文件系统

  1. 配置导出的文件系统/etc/fstab包含(至少)以下配置
1
2
3
4
none		/tmp		tmpfs	defaults	0 0
tmpfs /dev/shm tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
  1. 选择无盘客户机应该使用的内核 (vmlinuz-*kernel-version*) 并将其复制到

    tftp启动目录:

1
# cp /boot/vmlinuz-kernel-version /var/lib/tftpboot/
  1. 创建 initrd (即, initramfs-kernel-version.img) 与网络支持:
1
# dracut initramfs-kernel-version.img kernel-version
  1. initrd的文件权限需要更改为600或pxelinux.0引导加载程序将失败,并出现“文件未找到”错误。使用以下命令执行此操作:
1
# chmod go-r initramfs-kernel-version.img
  1. 将结果复制到引导目录中initramfs-kernel-version.img到 tftp启动目录.

  2. 编辑默认的启动配置以使用initrd里面的内核/var/lib/tftpboot。此配置应该指示无盘客户机的root用户将导出的文件系统(/exported/root/directory)挂载为读写。为此,请/var/lib/tftpboot/pxelinux.cfg/default使用以下配置:

1
2
3
4
5
default rhel7

label rhel7
kernel vmlinuz-kernel-version
append initrd=initramfs-kernel-version.img root=nfs:server-ip:/exported/root/directory rw

替换 server-iptftp and DHCP 服务器地址.

NFS共享现在已准备好导出到无盘客户端。这些客户端可以通过PXE通过网络启动。