FreeBSD通过设备点(device node)和各种共享通用名称(share common name)的实用程序来管理磁盘,Unix基本上都是这样。
这些操作系统中的每一个对磁盘的管理都略有不同,所以AIX、Xenix或Linux上的经验不一定适用于FreeBSD。操作系统供应商的磁盘管理程序是分散的。
分区时存储设备的逻辑细分。分区允许用户为特定目的分配空间块。比如这个空间用于数据、这个空间用于操作系统、这个空间用于虚拟内存等等。
分区可以具有不同的权限、特权、文件系统和设置。可以在每个分区的基础上更改文件系统行为,甚至可以在不同分区上使用不同的文件系统。有些文件系统功能(如快照)是在分区的基础上工作的。
分区还可以保护系统。如果没有分区,一个失控的进程可能会填满整个硬盘。
比如,如果将日志放在独立的分区中,程序只能填充一个分区。
磁盘爆满会损坏东西。没有空间添加数据的数据库将无法允许。无法写入日志的web服务器会崩溃。关键是,爆满的磁盘也会阻止修复问题。
强烈建议对服务器文件系统进行分区。
GEOM是一个非常灵活的磁盘基础架构系统,位于设备节点(如/dev/da0)和磁盘的设备驱动程序之间,处理它们之间交换的数据。
从这个位置,GEOM可以任意转换输入/输出请求。
GEOM是disk geometry(磁盘几何形状)的缩写。
GEOM包括用于数据转换的内核模块,称为GEOM类(GEOM classes)。每个GEOM类都以某种方式转换或操纵存储。FreeBSD将所有存储转换都实现为GEOM类,比如加密、软RAID。
GEOM类是可以堆叠的——它们可以将一个类的输出用作另一个类。加密后的硬盘可以加入到软RAID中。
当FreeBSD发现一个新的存储设备时,GEOM子系统会检查该设备上的已知格式,如主引导记录、磁盘标签或磁盘上的其他元数据。GEOM还会检查物理标识符,如磁盘序列号。这个过程被称为tasting(品尝)。
当GEOM找到标识信息时,它会按照元数据的指示配置设备。
如果磁盘的元数据显示“我是名为mystuff的镜像的一部分,还有另外两个磁盘”,GEOM会查找其他磁盘并将其组装成镜像。
如果GEOM可以通过格式、GEOM类或其他信息识别存储设备,它将启动设备,启动GEOM类的实例,创建适当的设备节点,并执行它理解的任何其他必要配置。
如果内核无法识别磁盘上的任何元数据,GEOM会为存储设备创建设备节点,并让它保持原样。这通常是一个未格式化、未分区的磁盘。
GEOM类的一个实例称为geom。gmirror类镜像磁盘,但特定的镜像mystuff是geom。
GEOM比卷管理更具灵活性。GEOM类可以轻松地将新的数据转换插入到存储中。
无法在商业卷管理器中添加加密层。
FreeBSD包括两个看起来像卷管理器的软件套件:gvinum和ZFS。
gvinum是1990年代基于GEOM的vinum卷管理器版本,虽然没有被弃用,但不建议使用。
可以使用GEOM部署ZFS,以更适合实际环境。
虽然理论上可以一直堆叠GEOM模块,但必须考虑硬件的局限性。
在网络上镜像繁忙的磁盘可能需要一个专用的网络接口和一个空的交叉连接。
加密和解密数据会消耗处理器的时间和内存。
每个geom要么是提供者、要么是消费者,或者两个都是。
提供者像另一个geom提供服务。如果要镜像两个硬盘驱动器,硬盘驱动器的geom将磁盘提供给镜像。提供者通常有一个设备节点,例如/dev/ada0p4。
消费者使用提供者的服务。镜像geom会消耗底层磁盘设备。geom的消费者部分不需要设备节点。
一个geom既可以是提供者也可以是消费者——事实上,位于geom堆栈中间的任何geom都是提供者和消费者。
磁盘镜像geom消耗底层物理存储介质,但它提供了一个带有分区、文件系统和所有这些东西的镜像磁盘。
FreeBSD对所有提供者和消费者一视同仁。物理硬盘只是另一个提供者,就像镜像、加密层或网络导出一样。此特性允许任意堆叠GEOM类。
细分另一个类的GEOM类称为切片器,通常负责管理分区。处理主引导记录(Master Boot Record——MBR)的GEOM类是一个切片器,GUID分区表(GUID Partitio Table——GPT)类也是如此。虽然大多数GEOM类几乎可以做任何事情,但切片器必须确保磁盘分区不重叠,并且分区符合分区方案的规则。
许多GEOM类都有某种控制程序,可以用来管理模块。
以下示例查询系统的基本存储信息:
xxxxxxxxxx
# geom disk list
Geom name: ada0
Providers:
1 1. Name: ada0
Mediasize: 1000204886016 (932G)
2 Sectorsize: 512
3 Mode: r2w2e4
4 descr: WDC WD1003FBYZ-010FB0
5 lunid: 50014ee2090bab1c
6 ident: WD-WCAW36478129
7 fwsectors: 63
fwheads: 16
此GEOM命令专门列出系统最底层的提供者,即实际的存储介质。该驱动器提供了一个名为ada0的设备。
此磁盘声称具有512字节的扇区大小(Sectorsize)。
GEOM类的Mode看起来很像文件系统权限。但实际上是从设备读取和向设备写入的GEOM类数量加上请求独占访问设备的GEOM类别数量。
descr行描述驱动器的型号。
lunid是逻辑单元号(Logical Unit Number——LUN)标识符,描述系统如何连接到此驱动器。
ident行是驱动器的唯一标识符。
fwsector标识磁盘的几何信息(geometry)。大多数系统管理员不再需要了解磁盘几何形状,但这对从事存储工作的FreeBSD开发人员很有用。
磁盘类不消耗任何资源。
FreeBSD内核不能理解或解析XML。它只讲XML。
每个geom都可以以XML格式输出器配置,内核可以将实例化的geom的输出组合成一个连贯的整体。
具有XML专业知识的人可以使用此输出为他们的存储阵列创建漂亮的图表。
运行sysctl kern.geom.confxml以获得所有geom的当前配置。每个GEOM类都可以定义和使用自己的模式,但这些模式与从命令行检索的信息有很多共同之处。
设备节点是一个特殊的文件,表示硬件或内核的接口。程序将它们用作设备驱动程序、物理设备或内核功能的逻辑接口。
通过向物理设备的设备节点发送数据或从其接收收据,可以告诉内核对物理设备做些什么。
并非所有操作对所有设备都有意义,相同的软件操作可能会使某些设备的行为与其他设备非常不同。
将数据写入磁盘设备会改变底层磁盘,而将数据写入扬声器会产生噪音。
设备节点通常属于/dev,尽管可以在jail和chroot容器的其他地方拥有设备节点。
FreeBSD有一个专门用于管理设备节点的特殊文件系统devfs。参阅FreeBSD Mastery: Specialty Filesystems。
当FreeBSD内核识别出一个新设备时,它会自动创建所需的设备节点,不需要手动创建设备节点。
代表硬件的设备节点后面有一个数字,表示该节点代表该类设备的哪个单元。假设有两个硬盘,每个都使用ada驱动程序。一个具有设备节点/dev/ada0,另一个具有/dev/ada1。
每种类型的设备节点在手册第四节中都有一个条目。通过man 4 ada命令,可以获得ada设备的手册。
内核为每个文件系统分配其自己的唯一设备节点,表示文件系统所在的物理或逻辑存储设备。
如果服务器为/、/usr、/var和交换空间有单独的文件系统,它会为每个文件系统创建一个设备节点。
要使用文件系统,必须找到其设备节点。它将基于磁盘或GEOM设备名称。
在使用磁盘或磁盘分区之前,必须找到磁盘的设备节点。
FreeBSD以磁盘类型或驱动程序命名磁盘设备。设备驱动程序名称通常来自于磁盘的连接类型。最常见的磁盘设备名称是/dev/ada、/dev/cd、/dev/da、/dev/vtbd。
许多RAID控制器将磁盘表示为SCSI设备,因此它们显示为/dev/da。其他控制器将磁盘显示为RAID plus special vendor gravy。因此它们会得到特殊的设备节点名称,如/dev/RAID(ATA RAID)、/dev/mfi(一些LSI MegaRAID卡)等。
设备过多无法列出,但可以通过本书后面介绍的方法快速找到它们。
如果所有其他操作都失败,请查看控制台引导消息、dmesg输出或/var/run/dmesg.boot。
每个GEOM模块在/dev中都有自己的目录。目录中的设备节点表示该模块提供的提供者。
磁盘标签类glabel创建的提供者的名称类似于diskid/DISK-WD-WCAW36478129。这是/dev下的一个位置。此磁盘的标签位于/dev/diskid/DISK-WD-WCAW36478129。gnop类将此设备节点放在/dev/gnop目录中。gmerror类将使用/dev/mirror中,以此类推。
该目录通常(但并非总是)以使用它的GEOM模块命名,例如,GPT标识符分区的设备节点位于/dev/gptid中。查看GEOM模块的手册页可以了解设备节点的位置。
FreeBSD(和大多数其他类Unix系统)使用文件系统表/etc/fstab将磁盘分区映射到文件系统和交换空间。
/etc/fstab可以包含任何支持的文件系统,从FAT16到ZFS。
每一行显示一个分区,以及分区的挂载和管理说明。
xxxxxxxxxx
/dev/mirror/gm0s1a / ufs rw 1 1
/dev/mirror/gm0s1b none swap sw 0 0
/dev/mirror/gm0s1d /tmp ufs rw 2 2
每个条目的第一项给出了GEOM提供者名称。这可能是一个物理磁盘,如/dev/ada0s1a,或者更复杂的东西,比如以上示例中的mirror。
第二项列出文件系统可用的目录或挂载点。可以读取或写入文件的每个分区都附加到一个挂载点,如/usr、/var等。一些特殊分区,如交换分区,没有挂载点。上面示例的第二个条目就是交换分区。无法读取或写入可用文件到交换空间,部分原因是它没有挂载到目录树里。
接下来是文件系统的类型。第一个和第三个条目中是ufs类型,即Unix文件系统。还可以使用其他类型,比如swap(交换空间)、cd9660(CD或映像)、nfs(网络文件系统)、或ext2/3/4fs(linux文件系统)。文件系统告诉FreeBSD如何安装这种类型的文件系统。所有文件系统都有特殊的要求,FreeBSD有单独的进程来正确挂载不同的文件系统。
第四项显示了每个文件系统上使用挂载选项。常见的选项有三种:
第五项告诉转储程序是否应该备份这个文件系统。如果设置为0,dump将不会备份此文件系统。否则,此数字给出触发此文件系统备份所需的最小转储基本。如果不会使用dump,可以忽略此字段。
最后一项告诉FreeBSD引导过程合适检验文件系统的完整性。FreeBSD在所有具有相同编号的UFS分区上并运行fsck。跟文件系统设置为1,因此FreeBSD会优先检查它。/tmp文件系统编号为2,因此会放在第二位进行检查。交换空间、只读和非UFS文件系统设置为0,将禁用fsck检查。
虽然默认的FreeBSD安装为分区分配的fsck顺序只有1或2,但顺序可以更高。引导过程将在3s开始之前完成fsck顺序2的所有分区,在4s开始之前完成所有的3s,以此类推。通过在分区上仔细安排fsck顺序,可以确保一次只有一个fsck进程,从而加速引导过程。
mount命令可以查看当前已经挂载的文件系统:
xxxxxxxxxx
# mount
/dev/mirror/gm0s1a on / (ufs, local)
devfs on /dev (devfs, local, multilabel)
/dev/mirror/gm0s1d on /tmp (ufs, local, soft-updates)
/dev/mirror/gm0s1f on /usr (ufs, local, soft-updates)
/dev/mirror/gm0s1e on /var (ufs, local, soft-updates)
fdescfs on /dev/fd (fdescfs)
每一行开始于设备节点。大多数文件系统都位于/dev/mirror/gm0设备的一个子部分上。
还有两个逻辑文件系统devfs和fdescfs。这实际上并不存储文件,但提供系统功能。
设备节点后面是挂载点。上面例子表示,该系统为根分区、/tmp、/usr、/var提供了单独的文件系统。
挂载点后面的括号里,有文件系统类型和关于该文件系统的注释。实际挂载的文件系统大多使用UFS文件系统,带有软更新(soft-updates),而且是本地的(local)。也就是说,它们不是通过网络挂载的。网络文件系统也显示在这里。
xxxxxxxxxx
# mount
/dev/vtbd0p2 on / (ufs, local, journaled soft-updates)
devfs on /dev (devfs, local, multilabel)
这是一个具有未分区磁盘的微型虚拟机。它只有一个磁盘支持的文件系统,以及所有FreeBSD系统上的设备文件系统。
使用mount -p命令可以查看当前挂载的文件系统,显示格式类似于/etc/fstab文件里的样式。可以将需要的内容直接复制到/etc/fstab文件中使用。
引导加载程序(boot loader)告诉硬件如何加载操作系统。当计算机找到引导加载程序时,它会执行加载程序以启动操作系统。
所有操作系统都有自己的引导加载程序,根据该操作系统的需求量身定制。
术语boot loader、boot block、boot manager通常可以互换使用。启动管理器通常允许在多个操作系统之间进行选择。
引导加载程序必须位于磁盘上的指定位置,由硬件平台决定,但通常在开头的位置附近。
使用官方媒体安装操作系统时,该软件会自动将引导加载程序放置在磁盘的位置。如果要手动分区磁盘并从中启动,则必须根据硬件需要为引导加载程序分配空间。
引导加载程序需要不同数量的空间,这取决于磁盘上的分区方案和文件系统。
所有操作系统和硬件平台都可以将硬盘划分为分区。
分区方案是用于组织磁盘上分区的系统。传统的方案是MBR,苹果和SPARC系统有自己的方案,目前最常用的是GPT方案。每种方案对引导块、硬件架构和分区都有自己的要求。
以下是FreeBSD支持的方案。
Master Boot Record——MBR,主引导记录,是一个占用传统磁盘前512字节(0扇区)的文件。
MBR起源于IBM PC。包含磁盘上分区的信息和引导加载程序,允许系统BIOS找到操作系统。
术语MBR可能指磁盘上实际的第一个扇区或该格式支持的分区方案。
MBR描述了四个主分区,还有二十个可能通过链表扩展的分区。
每个分区描述都包括分区中包含的磁盘扇区和该分区上预期的文件系统。
如果一个磁盘上只有一个分区,MBR仍然会列出四个主分区——只是其中三个分区没有分配扇区。MBR的最新版本包括对扩展和嵌套分区的支持,但由于磁盘标签分区,它们不适用于FreeBSD。
除了四个分区的限制外,MBR格式最多只支持2TB的磁盘。
MBR分区磁盘可以有一个活动分区,当系统开机时,引导代码会查找活动分区并尝试引导它。
MBR扇区还包含引导代码。不需要专门为引导加载程序分配空间。在FreeBSD中,引导代码负责查找和执行操作系统内核。FreeBSD包括两个不同的引导加载程序:mbr和boot0。
如果MBR分区磁盘上只安装了一个操作系统,请使用mbr引导加载程序。此引导加载程序在磁盘上查找活动分区并尝试引导它。
如果有多个操作系统,可以使用boot0引导加载程序。此引导加载程序允许您在引导时选择要引导的分区。安装多个操作系统时,将每个操作系统放在不同的MBR分区上。
现代标准是GPT——GUID Partition Table。
这是新安装的推荐方法。
GPT支持9.4ZB的磁盘。
GPT磁盘上可以放置任意数量的分区,每个分区都会分配一个全局唯一的标识符(GUID——Globally Uniquie Identifier)。GUID是一个128位的数字,通常显示为32个十六进制数字,对于这个特定的文件系统是唯一的。
在MBR分区的硬盘上,主引导记录占用磁盘上的第一个扇区。如果系统只支持MBR,但磁盘的第一个扇区包含非MBR的内容,系统将变得混乱并拒绝运行。
GPT分区磁盘将保护性主引导记录(PMBR——protective-MasterBootRecord)放在第一个扇区中。PMBR表示磁盘包含一个GPT类型的MBR分区。第二个扇区包含实际的GUID分区表。
GPT将分区表的备份副本放在磁盘的最后一个扇区上。如果磁盘的前几个扇区损坏了,则可以从备份中恢复分区表。
必须为引导代码分配一个分区。PMBR中的引导代码在磁盘中搜索FreeBSD引导分区。引导分区必须大于引导代码,小于545K,并且为FreeBSD引导加载程序保留。
FreeBSD包括两个GPT引导加载程序:gptboot和gptzfsboot。必须在启动分区上安装其中一个。
gptboot用于引导加载程序加载UFS分区,系统启动时,gptboot会查找标记有bootme或bootonce属性的FreeBSD分区。
gptzfsboot用于ZFS系统,参阅FreeBSD Mastery: ZFS。
BSD方案是一个直接应用于磁盘的原始BSD分区表(disklabel),而不是MBR分区。
FreeBSD通常将磁盘标签分区放在MBR分区内。
BSD分区方案被称为“危险专用(dangerously dedicated)”模式。因为其他操作系统的磁盘管理工具无法识别BSD分区。
FreeBSD8.0版以后放弃了对安装BSD方案磁盘的支持。
苹果分区图(Apple Partition Map——APM)方案用于PowerPC硬件。
PowerPC是第二层平台(Tier 2 platform),这意味着它不完全受支持。可以使用标准的gpart程序使用APM方案对FreeBSD的PowerPC磁盘进行分区。创建分区,非常类似GPT方案。
APM方案需要一个800K的启动分区。在此分区上使用boot1.hfs引导加载程序。
Sparc64和UltraSPARC硬件使用VOTC8方案。Sparc64是一个二级平台,FreeBSD项目并不完全支持这种硬盘。
对这些系统上的磁盘使用VTOC8分区方案,然后可以使用gpart在磁盘内创建分区。
VTOC8磁盘的引导加载程序boot1只有8KB,但必须将其写入磁盘上的所有分区。以下命令在VTOC8磁盘上安装引导加载程序:
xxxxxxxxxx
# gpart bootcode -p /boot/boot1 da0
要将引导代码只写入一个分区,就像在更常见的硬件上使用那样,可使用-i标志和分区号指定要写入的分区。
PC98方案是IBM PC架构的变体,主要在日本使用。虽然FreeBSD多年来一直很好地支持PC98,但他被降级为Tier2状态。
PC98分区方案与MBR格式非常相似,并使用相同的引导代码。
逻辑磁盘管理(Logical Disk Manager——LDM)是微软 Windows GPT分区方案。
虽然gpart使用LDM方案识别磁盘,但不要使用FreeBSD工具来管理Windows磁盘。不要尝试使用此方案将FreeBSD安装到磁盘上。
如果使用具有特定方案要求的硬件,如UltraSPARC或PC98,请使用该硬盘的分区方案。大多数人是在MBR和GPT之间做出选择。
仅当硬件特别需要MBR时,才使用MBR。
能使用GPT方案就不要考虑其他方案。
GEOM是独立于硬件的,这意味FreeBSD机器可以识别硬件无法使用的磁盘方案。
根据每个硬件平台的具体情况,机器可能无法读取文件系统,但它会识别分区方案。
在最底层,操作系统通过磁盘与系统的物理连接来识别磁盘。传统上,磁盘由文件系统表管理,该表类似于“将连接到SATA端口3的磁盘用作/var/log文件系统”。
根据物理连接分配驱动器角色的问题是,有时连接会发生变化,比如更换主板时可能打乱硬盘数据线顺序。
在FreeBSD的旧版本中,需要“连接”设备,以便特定磁盘始终显示为特定设备节点。
标记磁盘可以通过物理附件以外的其他方式引用磁盘。
FreeBSD安装程序使用GEOM的label类磁盘标记一个唯一的标识符,以便更高级的类使用。
FreeBSD默认情况下会使用磁盘、分区或文件系统的固有特性创建许多标签。
大多数标签类型在专用于该类型标签的目录中创建设备节点。每个GPT分区都有一个GUID,可以在/dev/gptid中找到基于它们的标签。
磁盘根据其序列号具有唯一的磁盘ID,该ID在/dev/diskid中获取条目。
镜像磁盘在/dev/mirror中获取条目。
依此类推。
标签标识一个GEOM,可以像使用设备的任何其他名称一样使用该标签。如果将磁盘ada5标记为stuff,则可以对磁盘stuff进行分区,在配置文件中使用stuff。
并非所有标签都来自GEOM,ZFS对文件系统和池使用内部标签方法,可以向UFS文件系统添加标签。
建议给所有东西贴标签,并尽可能使用标签。
使用glabel访问标签。glabel命令是geom label的简写。以下是FreeBSD11机器的完整标签:
xxxxxxxxxx
# glabel list
Geom name: ada0
Providers:
1. Name: diskid/DISK-WD-WCAW36478129
Mediasize: 1000204886016 (932G)
Sectorsize: 512
Mode: r2w2e3
secoffset: 0
offset: 0
1 seclength: 1953525168
2 length: 1000204886016
index: 0
Consumers:
1. Name: ada0
Mediasize: 1000204886016 (932G)
Sectorsize: 512
Mode: r2w2e4
这个特定的geom消耗了前一个示例中的磁盘ada0。它提供设备diskid/DISK-WD-WCAW36478129。
这些条目中的大多数都是刚刚看到的geom磁盘输出中熟悉的。这个geom从底层磁盘继承了许多属性。以上有两个新值:
再以上面的例子来看,这个标签提供(与提供者一样)GEOM DISK-WD-WCAW26478129。
磁盘在硬盘驱动器的序列号后标记。你可以从这台机器上删除磁盘,将其连接到完全不同的FreeBSD机器上,它将使用相同的磁盘ID。通过在配置中使用diskid而不是连接点,这可以保证系统将按预期使用磁盘。
这是一个使用磁盘ID标签的/etc/fstab条目:
xxxxxxxxxx
/dev/diskid/DISK-WD-WCAW36477352p5 /usr/local ufs rw 2 2
这个磁盘可以作为ada0或ada100连接到这个系统,FreeBSD仍然会通过磁盘标识它并正确使用分区。
如果磁盘ID仅在FreeBSD10及以后版本可用,那么旧版会是什么情况?下面是一个来自FreeBSD9系统的标签:
xxxxxxxxxx
# glabel list
Geom name: raid/r0p1
Providers:
1. Name: gptid/f7f5a823-6fac-11e3-afc9-002590dbd594
此特定分区用GPT的GUID。这不会标识磁盘,只标识一个GPT分区。通过在/etc/fstab等配置中使用此标签名称,可以确保FreeBSD使用此特定分区,而不是在该设备节点上连接的任何物理磁盘。
另一方面,此分区位于RAID设备上。这里的GPT标签属于RAID设备上的一个分区,这是一个位于其他设备上的GEOM。如果该RAID设备构建在不使用GTP或磁盘ID的GEOM之上,而是使用诸如ada0或da1之类的设备名称,那么物理更改驱动器附件将破坏RAID及其上的所有内容。
如果复制在其配置文件中使用基于磁盘ID的标签和机器,则副本将无法正确启动。副本将开始启动,在/etc/fstab中查找其根文件系统,查看系统上不存在具有该ID的磁盘,然后死机。
但是,假设复制了一个使用GPT GUID的磁盘。当完成复制时,机器将有两个附加了相同的GUID的磁盘。没有一个操作系统喜欢这样。
哪个更好?选择会带来最少麻烦的那个。
所有FreeBSD文件系统和分区类型都允许手动分配标签名称。强烈建议设置个性化的标签。
xxxxxxxxxx
# glabel list
…
Geom name: vtbd0p2
Providers:
Name: gpt/swap0 u
…
此处,我们有标签gpt/swap0,由磁盘分区vtbd0p2提供。在创建分区时,分配了一个标签。它实际上是写在磁盘上的。
可以在配置中使用它,就像使用其他任何设备名称一样。以下是一个使用此标签的/etc/fstab条目:
xxxxxxxxxx
/dev/gpt/swap0 none swap sw 0 0
这更有可读性。像swap0这样的标签比冗长的序列号或GUID更人性化。
如果有选择的话,建议使用GPT标记分区。
一些老鸟习惯于使用/dev/ada0s4或/dev/da0p3这样的设备名称,他们不关心内核创建的明确但难以读取的磁盘ID和GUID设备名称。
由于GEOM枯萎(withering),你可能为分区使用一种类型的设备名称。可以通过分区的原始设备名称、GUID ID、磁盘ID或其他任何其他单一类型的设备标识符来挂载分区。
使用设备名称后,内核会删除其他名称。
在管理很多系统时,建议制订一套单一的标准,并将其用于所有系统。
完全禁用GUID ID标签的创建是有意义的,或者,使用GUID ID,而不使用磁盘ID。
可调的kern.geom.label.disk_ident.enable控制磁盘ID标签;
而kern.geom.label.gptid.enable控制GPT ID标签。
在/boot/loader.conf中将适当的可调参数设置为0,然后重新启动以禁用这些标签。
如果/etc/fstab按磁盘ID描述分区,而你删除了磁盘ID,将丢失文件系统。所以在禁用标签之前一定要验证没有使用任何类型的标签。
通用访问方法是一种标准化的设备驱动程序架构,最初是为了支持SCSI-2磁盘上的复杂命令集而编写的。
其设计思路是,基于这种架构的标准化将简化设备驱动程序的编写。然而,实际上只有FreeBSD和DEC OSF/1附带了CAM,并且每个都以不同的方式填补了规范的空白。(也就是各家实现的方式有差异)
FreeBSD9以及更高版本在CAM界面中整合了所有物理磁盘管理。使用camcontrol命令从磁盘收集信息并向其发出命令。早期版本的FreeBSD使用atacontrol管理ATA硬盘,使用camcontrol管理SCSI设备。
拥有一组管理程序和一组供程序使用API,可以简化系统管理。
为了标记ATA特定访问和新CAM方法之间的更改,更改了ATA设备的设备节点名称。旧设备名称/dev/ad(用于ATA磁盘)和/dev/acd(用于ATA光驱)被临时保留为新设备名称的别名,以帮助迁移和升级。在/dev、配置文件或文档中看到这些旧名称。FreeBSD在未来版本中将丢弃这些旧名称,因此请习惯/dev/ada和/dev/cd。
为什么需要更改设备节点名称?没有CAM,你需要单独的软件工具管理SCSI和非SCSI磁盘。使用CAM,相同的管理软件可以在两种类型的磁盘上运行。
如果一些/dev/ad设备使用CAM,而另一些没有,那么系统将很难决定是需要使用atacontrol还是camcontrol。更改名称可以防止这种混淆。
并非所有磁盘类设备都支持CAM。最常见的非CAM存储设备是硬件RAID控制器。一些硬件RAID严格在CAM中工作,而另一些RAID则有自己的协议扩展集。这些RAID设备通常有自己的控制软件。MFI MegaRAID SAS控制器mfi,使用mfiutil控制器程序管理。
使用vtbd的虚拟磁盘无法获得CAM。虚拟磁盘没有智能,只是分散在另一个操作系统实例硬盘上的块。CAM对这些磁盘没有意义。
以下是mfiutil命令的一些子命令:
xxxxxxxxxx
# mfiutil show adapter (查看阵列卡信息)
mfi0 Adapter:
Product Name: PERC 6/i Integrated
Serial Number: 1122334455667788
Firmware: 6.1.1-0047
RAID Levels: JBOD, RAID0, RAID1, RAID5, RAID6, RAID10, RAID50
Battery Backup: present
NVRAM: 32K
Onboard Memory: 256M
Minimum Stripe: 8K
Maximum Stripe: 1M
# mfiutil show battery (查看电池信息)
mfi0: Battery State:
Manufacture Date: 11/12/2016
Serial Number: 1144
Manufacturer: SMP-SDI2.0
Model: DLFR463
Chemistry: LION
Design Capacity: 1800 mAh
Full Charge Capacity: 1342 mAh
Current Capacity: 1340 mAh
Charge Cycles: 29
Current Charge: 100%
Design Voltage: 3700 mV
Current Voltage: 4025 mV
Temperature: 22 C
Autolearn period: 90 days
Next learn time: Fri Nov 22 18:10:57 2024
Learn delay interval: 0 hours
Autolearn mode: enabled
Status: normal
State of Health: good
# mfiutil show config (查看配置)
mfi0 Configuration: 1 arrays, 1 volumes, 0 spares
array 0 of 2 drives:
drive 0 ( 1863G) ONLINE <SEAGATE ST2000NM0023 D007 serial=S1X0CZ1D> SCSI-6
drive 1 ( 1863G) ONLINE <SEAGATE ST2000NM0023 D007 serial=Z1X3GY7Y> SCSI-6
volume mfid0 (1863G) RAID-1 64K OPTIMAL <0> spans:
array 0
# mfiutil show drives (查看设备)
mfi0 Physical Drives:
0 ( 1863G) ONLINE <SEAGATE ST2000NM0023 D007 serial=S1X0CZ1D> SCSI-6 E1:S0
1 ( 1863G) ONLINE <SEAGATE ST2000NM0023 D007 serial=Z1X3GY7Y> SCSI-6 E1:S1
2 ( 559G) UNCONFIGURED GOOD <SEAGATE ST3600057SS 0008 serial=6SL8P5LM> SAS E1:S2
3 ( 559G) UNCONFIGURED GOOD (FOREIGN) <SEAGATE ST3600057SS ES64 serial=6SL1K331> SAS E1:S3
4 ( 559G) UNCONFIGURED GOOD (FOREIGN) <SEAGATE ST3600057SS ES64 serial=6SL1M640> SAS E1:S4
5 ( 559G) UNCONFIGURED GOOD (FOREIGN) <SEAGATE ST3600057SS ES64 serial=6SL1M65G> SAS E1:S5
在/var/run/dmesg.boot中搜索磁盘设备节点,或者查看已挂载的文件系统并从那里回溯。
但简单的方法是使用camcontrol命令询问CAM系统看到了什么磁盘。
camcontrol可以使用各种子命令检查和更改磁盘特性,camcontrol devlist命令可以查看现有的CAM设备:
xxxxxxxxxx
# camcontrol devlist
<WDC WD200EB-00CPF0 06.04G06> at scbus0 target 0 lun 0 (ada0,pass0)
<WDC WD800BB-08JHC0 06.01C06> at scbus0 target 1 lun 0 (ada1,pass1)
<WDC WD800BB-08JHC0 06.01C06> at scbus1 target 0 lun 0 (ada2,pass2)
以上信息显示这台机器有三个磁盘。可以看到磁盘体统的磁盘型号和每个磁盘的SCSI连接信息。
检查实际磁盘或搜索这些磁盘型号,会发现这些是ATA磁盘。SCSI总线信息没有描述实际的SCSI纵线。它们是通过CAM管理的ATA连线。但如果知道哪个磁盘插入了哪个ATA总线和哪个端口。
对于更现代的东西,可能会有如下显示信息:
xxxxxxxxxx
# camcontrol devlist
<ATA WDC WD1003FBYZ-0 1V03> at scbus0 target 0 lun 0 (pass0,da0)
<ATA WDC WD1003FBYZ-0 1V03> at scbus0 target 1 lun 0 (pass1,da1)
<ATA WDC WD1003FBYZ-0 1V03> at scbus0 target 2 lun 0 (pass2,da2)
<ATA WDC WD1003FBYZ-0 1V03> at scbus0 target 3 lun 0 (pass3,da3)
<WDC WD1003FBYZ-010FB0 01.01V03> at scbus1 target 0 lun 0 (ada0,pass4)
<WDC WD1003FBYZ-010FB0 01.01V03> at scbus2 target 0 lun 0 (ada1,pass5)
<WDC WD1003FBYZ-010FB0 01.01V03> at scbus3 target 0 lun 0 (ada2,pass6)
<WDC WD1003FBYZ-010FB0 01.01V03> at scbus4 target 0 lun 0 (ada3,pass7)
<InnoLite SATADOM D150QV 120319> at scbus5 target 0 lun 0 (ada4,pass8)
<InnoLite SATADOM D150QV 120319> at scbus6 target 0 lun 0 (ada5,pass9)
<AHCI SGPIO Enclosure 1.00 0001> at scbus7 target 0 lun 0 (pass10,ses0)
前面四个是SAS磁盘,然后是4个SATA磁盘,两个SATADOM闪存盘和一个SATA机柜。
使用geom disk list命令可以了解硬件的更多详细信息。输出与glabel list非常相似,但会得到一些磁盘的几何信息。
如果是由硬件RAID卡来管理磁盘,可以用以下方式查看驱动器信息:
xxxxxxxxxx
# mfiutil show drives
mfi0 Physical Drives:
44 ( 68G) ONLINE <FUJITSU MAY2073RCSUN72G 0401 serial=0619S02KLN> SCSI-4 E2:S1
46 (931G) ONLINE <SAMSUNG HD103UJ 1113 serial=S13PJ9DS302010> SATA E1:S0
47 (372G) UNCONFIGURED GOOD <SAMSUNG HD403LJ 0-10 serial=S0NFJ1NP201231> SATA E1:S1
…
这将显示每个驱动的状态,比如ONLINE、HOT SPARE等等。还将获得驱动器大小、型号名称及其连接的端口。将端口信息映射到机柜或驱动器上的端口是硬件手册或硬件技术人员的任务。
大多数虚拟机中只有一个驱动器/dev/vtbd0。如果需要更多的虚拟驱动器,它们可能会以/dev/vtbd*显示。或使用glabel status查看正在使用的虚拟驱动器。
使用geom disk list命令查看stripesize(扇区大小)值:
xxxxxxxxxx
…
1. Name: ada0
Mediasize: 640135028736 (596G)
Sectorsize: 512
Stripesize: 4096
Stripeoffset: 0
…
你可能熟悉RAID中的“条带大小(stripesize)”和“条带偏移(stripeoffset)”,但它们不是RAID专有的。条带大小和偏移是指示最佳对齐参数的一般机制。这个磁盘有4096字节的“条带”,所以这个驱动器有4KB的扇区。
还可以使用camcontrol查询驱动器:
xxxxxxxxxx
# camcontrol identify ada0 | grep physical
sector size logical 512, physical 4096, offset 0
camcontrol identify命令列出指定的物理磁盘中FreeBSD能读取的信息。这个磁盘是4KB扇区。此驱动器可以寻址的最小单位是512字节。
扇区大小和分区边界结合在一起,形成了一系列可能的问题,只有通过重新分区磁盘才能解决。
仔细放置分区并不总是必要的,但始终仔细放置分区可以防止出现问题。
操作系统必须将文件系统分区与磁盘的扇区对齐。如果你有一个4KB扇区的磁盘,而你的文件系统使用4KB扇区,这不一定是完美的。
假设磁盘上的第一个分区用于引导块,并使用512B,第二个分区从磁盘的第513个字节开始,即一个扇区的八分之一。如果在磁盘上防止一个4KB的文件系统块,则该文件系统块将存在于两个物理磁盘块上。
文件系统的逻辑块与磁盘的物理扇区存在偏差。每次读取或写入一个文件系统块时,系统必须接触两个物理扇区。这直接降低了性能。
无法将对齐方式改装到现有分区中。只能从新分区。以下演示一些简单的方法,以确保在整个分区过程中正确对齐分区。
486级别的硬件存储系统通常完全依赖于柱面、磁头和扇区寻址(Cylinder Head Sector——CHS)。一些供应商声称它们有512B扇区,但实际上时4KB扇区,并隐藏了第一个扇区。将扇区分组为八个一组,会产生一个偏离物理块的逻辑块。
如果使用这类驱动器,不要使用MBR分区,它没有任何补偿方法解决磁头和柱面对齐问题。FreeBSD的GPT分区可以识别并补偿这一点。
当创建MBR分区时,gpart会创建符合CHS寻址要求的分区。这些要求与现代磁盘无关,但如果把一个现代磁盘放在需要CHS寻址的硬件中,磁盘最好使用CHS分区。
CHS分区的规则之一是分区必须在圆柱体边界上结束。创建分区时,gpart会自动对分区大小进行舍入,使其符合CHS要求。这意味着分区可能比请求的小或大几兆字节。
考虑到现代磁盘的巨大尺寸,这通常不是问题,然而,这可能会损害使文件系统块与磁盘扇区对齐的努力。
一些FreeBSD开发人员正在讨论删除FreeBSD11及更新版本中的CHS要求,或者通过sysctl将其设置为可选。
总之,必须将文件系统块与磁盘扇区对齐,即使分区工具在被要求它们以所需的方式对齐时,也会悄无声息地创建未对齐地分区。
使用mount命令可以查看机器上当前挂载的文件系统,但mount的主要功能是将文件系统附加到目录层次结构。
虽然FreeBSD在启动时挂载/etc/fstab中列出的所有文件系统,但仍需要能够随时挂载和卸载任意文件系统。
了解挂载和卸载文件系统的最佳方法是将具有多个分区的及其引导到单用户模式,以便可以挂载和卸载实际的分区。
在单用户模式下,FreeBSD以只读方式挂载根分区。如果进行默认安装,这可能是唯一的分区。如果有一个分区更正确的磁盘,根分区只有足够的软件来启动和运行核心系统。
手动挂载/etc/fstab中列出的文件系统,比如/var或/usr,使用mount命令:
xxxxxxxxxx
# mount /usr
可以使用以下命令挂载/etc/fstab中列出的所有分区,除了标记为noauto的:
xxxxxxxxxx
# mount -a
你可能需要在非标准位置挂载磁盘,或临时挂载某些东西。要在任意位置挂载文件系统,请提供设备名称和所需的挂载点。例如:
xxxxxxxxxx
# mount /dev/vtbd0p1 /mnt
然后就可以访问这个分区上的文件了。
使用umount命令卸载指定的分区:
xxxxxxxxxx
# umount /mnt
不能卸载正在使用的文件系统。
使用df命令可以查看每个分区有多少可用空间。这列出了系统上的分区、每个分区上使用的空间量以及它的挂载位置。
df命令的恼人之处在于,它默认以512B的块提供信息。默认的shell配置文件.profile和.cshrc将$BLOCKSIZE环境变量设置为1K,这使得这些程序显示千字节。
df命令提供了-h和-H标志来提供人性化的输出。-h使用基数2来计算兆字节和千兆字节;-H使用基数10来计算兆字节和千兆字节。这就是网络管理员和磁盘制造商计算这些单位的方式。
例如:
xxxxxxxxxx
# df -h
Filesystem Size Used Avail Capacity Mounted on
/dev/mirror/gm0s1a 989M 909M 1.3M 100% /
devfs 1.0K 1.0K 0B 100% /dev
/dev/mirror/gm0s1d 989M 44K 910M 0% /tmp
/dev/mirror/gm0s1f 59G 24G 30G 45% /usr
/dev/mirror/gm0s1e 9.7G 3.9G 5.0G 43% /var
在这里,我们可以看到分区设备、分区大小、已使用和可用空间量以及挂载点。
使用du命令可以显示当前目录下每个文件和每个目录使用的空间量。
默认情况下,du递归显示每个目录,这是压倒性的,但不是非常有用。它还以512B的块显示目录的大小——同样,这对人类来说并不友好。
这里,-h可以将输出转换为人类可读的格式;-x可以之查看当前文件系统;-d可以指定深度:
xxxxxxxxxx
# du -xhd1 /
2.0K ./.snap
512B ./dev
…
1.2M ./bin
866M ./boot
9.5M ./lib
…
/boot目录占用了866MB,有啥?看看:
xxxxxxxxxx
# du -xhd1 /boot
26K ./defaults
2.0K ./firmware
445M ./kernel
2.0K ./modules
2.0K ./zfs
418M ./kernel.old
866M .
当前内核为445MB,旧内核为418MB。这占据了根分区的绝大多数。
如果有一个大型的文件系统,并且不想递归查找大型文件或目录,可以运行类似du -x | sort -n的命令,sort命令也有一个-h标志,可以正确地对人类可读地数字进行排序,比如正确识别M和G。
计算机有四种资源:处理器、网络、内存、输入/输出。
如果工作负载使其中任何一个饱和,那么随着积压工作的堆积,计算机会变慢。使用gstat可以查看磁盘有多忙,使用top查看原因。
默认情况下,gstat显示所有GEOM提供者上活动的不断更新显示。每个系统都有舞曲的数据存储设备。使用-a标志将gstat输出缩减到只有哪些活动的提供者。
xxxxxxxxxx
# gstat -a
dT: 1.002s w: 1.000s
L(q) ops/s r/s kBps ms/r w/s kBps ms/w %busy Name
0 26 26 116 12.7 0 0 0.0 14.1| ada0
0 15 15 72 15.4 0 0 0.0 10.9| ada1
0 26 26 116 12.7 0 0 0.0 14.1| ada0p3
0 15 15 72 15.4 0 0 0.0 10.9| ada1p3
0 26 26 116 12.7 0 0 0.0 14.1| gpt/disk0
0 15 15 72 15.4 0 0 0.0 10.9| gpt/disk1
此命令不会影响磁盘的休眠状态。
下一个问题是,哪个进程导致了所有磁盘的活动?
top命令可以显示进程的CPU占用量,也可以显示存储的I/O模式。在运行top命令的会话中,按m键可以切换到I/O模式,或运行top -mio。
在I/O模式下,标头信息不会改变,但进程列表会显示每个进程正在使用的磁盘I/O百分比。这些百分比值得总和为100%,但不意味着磁盘的I/O总是饱和的。所以这里的百分比只是显示了每个进程占当前总使用量的百分比。
比如,gstat显示系统的磁盘有40%繁忙,而top中显示MySQL使用了90%的磁盘I/O,这意味着MySQL使用了40%的90%。
知道系统的瓶颈在哪里,有助于解决瓶颈。如果有一个始终繁忙的磁盘,并且活动在两个分区之间分配,请将其中一个区移动到另一个磁盘以分担负载。
如果磁盘不忙,瓶颈可能会在其他地方。
如果想在磁盘、控制器和互连之间进行I/O测量,可以使用pmcstat和iostat等程序。
以下是iostat命令的输出:
xxxxxxxxxx
$ iostat
tty da0 cd0 pass0 cpu
tin tout KB/t tps MB/s KB/t tps MB/s KB/t tps MB/s us ni sy in id
0 0 8.4 0 0.00 17.2 0 0.00 0.0 0 0.00 0 0 0 0 100
也可以使用systat -ostat命令查看实时信息。