对于很多人来说,硬盘就是一个“黑匣子”,可以将其看作是以某种方式存储数据、程序和/或操作系统的小型设备。当然,只要您关心的就是这些,此种看 法并没有什么不妥。但作为系统管理员,您关心的一个主要问题应该是数据保护。另一个优先考虑的问题应该是,如何有效地在内存和物理磁盘之间移动数据。在本 文中,我将详细介绍一个可在 Solaris 操作系统中使用的基本实用程序:format。

    format 实用程序用于管理磁盘上的分片,它最初是为了管理与 SCSI 连接的磁盘而编写的,因此,如果磁盘是通过 IDE 连接的,其性能可能会有所不同。如果已安装并正确配置了相应的驱动程序,您应该可以管理光纤通道连接的驱动器以及 RAID 引擎提供的 LUN。

      除了 format 以外,我还介绍了一些其他命令,它们分为两种类型:非破坏性和破坏性。我始终以粗斜体显示破坏性命令,并在这些命令前面加上 Warning(警告)一词。例如:如果以超级用户身份运行 ?Warning: cd / ; rm –r * ?,实际上会破坏系统磁盘。

     尽管非破坏性命令应该是没有破坏性的,但是否在系统中运行这些命令完全由您决定。破坏性命令将破坏磁盘上的数据,因此,只有在您确实了解所执行的操作时,才能运行这些命令。

     以下是在本文中使用的命令:format、prtvtoc、dd、od、cat 和 fmthard。首先,我希望定义一些本文中使用的磁盘术语。

磁盘标签:
该特殊区域包含磁盘的相关信息,例如,几何参数和分片。它还称为卷目录 (Volume Table Of Contents, VTOC)。磁盘标签是磁盘上的前 512 个字节。目前,大多数磁盘在出厂时都已加上了标签。

缺陷列表:
这是无法执行写入或读取操作的磁盘区域列表。制造商总是会提供一个缺陷列表,而且我们将会看到,这是一个“增长型”(grown)列表,即它会随着时间的推移而不断变大。

分区表:
分区表是磁盘 VTOC 的一部分,其中包含磁盘上的分片(亦称分区)、分片边界以及分片大小。分片由磁盘上一系列连续的块组成。磁盘上有 8 个分片 [0-7],但使用可扩展固件接口标签 (Extensible Firmware Interface Label, EFI) 标记磁盘时除外;我们将在后面对此稍加说明。在大多数情况下,我们不使用第 2 个分片,因为它表示整个磁盘。

阅读本文时,请记住以下几点:

  • 每个磁盘分片只能存储一个文件系统。
  • 一个文件系统不能跨多个分片(假定未使用逻辑卷管理器)。
  • 在创建文件系统后,除非对整个磁盘进行重新分区,否则无法更改文件系统的大小。
  • 分片不能跨多个磁盘。(对于使用 n 个磁盘并在系统中将其表示为一个磁盘的 RAID 引擎,format 实用程序只能看到一个磁盘。)

我希望您在系统中挂接了一个可以对其执行本文中各项操作的磁盘,因为我想使本文成为一篇互动性的文章。首先,选择要使用 format 执行操作的磁盘:

r_gps@holstein: format
Searching for disks...done

AVAILABLE DISK SELECTIONS:
0.c0t0d0 <SUN36G cyl 24620 alt 2 hd 27 sec 107> boot
/pci@1f,4000/scsi@3/sd@0,0
1.c0t1d0 <SUN36G cyl 24620 alt 2 hd 27 sec 107> home
/pci@1f,4000/scsi@3/sd@1,0
2.c2t1d0 <SUN36G cyl 24620 alt 2 hd 27 sec 107> trashme
/pci@1f,4000/pci@5/SUNW,isptwo@4/sd@1,0
Specify disk (enter its number):

您可以键入 'quit' 退出或返回上一级菜单,或者按 <Ctrl-D> 彻底退出 format 实用程序。在本例中,我将使用 "AVAILABLE DISK SELECTION 2"。正如以前提到的,如果从 Sun 或出售 Sun 设备的第三方供应商处购买磁盘,则购买的磁盘上应该已带有 Sun 标签。但是,如果在异构环境中挪用 SCSI 磁盘,则很明显,用在 HP、AIX 或 Windows 服务器中的 36 GB 驱动器会具有无法识别的标签(至少对 Solaris 操作系统来说是这样),这时您需要添加一个标签。从最基本的操作入手会比较有趣一些,因此我打算先删除所使用的磁盘上的标签:

? Warning: echo "adios data" | dd of=/dev/dsk/c2t1d0s2 bs=1 count=512 ?

现在,format 命令将显示以下内容:

r_gps@holstein: format
Searching for disks...done

c2t1d0: configured with capacity of 33.92GB

AVAILABLE DISK SELECTIONS:
0. c0t0d0 <SUN36G cyl 24620 alt 2 hd 27 sec 107> boot
/pci@1f,4000/scsi@3/sd@0,0
1. c0t1d0 <SUN36G cyl 24620 alt 2 hd 27 sec 107> home
/pci@1f,4000/scsi@3/sd@1,0
2. c2t1d0 <SUN36G cyl 24620 alt 2 hd 27 sec 107>
/pci@1f,4000/pci@5/SUNW,isptwo@4/sd@1,0
Specify disk (enter its number): 2
selecting c2t1d0
[disk formatted]
Disk not labeled. Label it now?

如果要标记磁盘,请在此处键入 'y',这是一种很好的做法,因为可使磁盘能够用于 Solaris 操作系统。然后,退出 format 命令,并使用 prtvtoc 查看磁盘几何参数和分区的相关信息:

r_gps@holstein: prtvtoc /dev/dsk/c2t1d0s2
* /dev/dsk/c2t1d0s2 partition map
*
* Dimensions:
* 512 bytes/sector
* 107 sectors/track
* 27 tracks/cylinder
* 2889 sectors/cylinder
* 24622 cylinders
* 24620 accessible cylinders
*
* Flags:
* 1: unmountable
* 10: read-only
*
* First Sector Last
* Partition Tag Flags Sector Count Sector Mount Directory
0 2 00 0 262899 262898
1 3 01 262899 262899 525797
2 5 01 0 71127180 71127179
6 4 00 525798 70601382 71127179

您可以通过 format 命令了解上述一些信息,但从该输出中我们可以看到存在四个分区。Tag(标记)列显示存在根 (2)、交换 (3)、备份 (5) 以及用户 (4) 分区。Flags(标志)列显示存在两个可挂载(可读写)的分区 (00) 和两个无法挂载的分区 (01)。对于每个分区,First Sector(第一个扇区)列显示分区的起始位置;Sector Count(扇区数)显示扇区的数量;Last Sector(最后一个扇区)显示分区中最后一个扇区的位置。如果挂载了一个文件系统,Mount Directory(挂载目录)将显示分区的挂载位置。在继续执行一些修改操作之前,让我们先看一下,format 命令会显示新标记的磁盘的哪些信息。运行以下命令:

r_gps@holstein: format /dev/rdsk/c2t1d0s2

在 format 提示符下键入 partition,然后在分区菜单中键入 print。这将显示下表:

Current partition table (original):
Total disk cylinders available: 24620 + 2 (reserved cylinders)

Part Tag Flag Cylinders Size Blocks
0 root wm 0 - 90 128.37MB (91/0/0) 262899
1 swap wu 91 - 181 128.37MB (91/0/0) 262899
2 backup wu 0 - 24619 33.92GB (24620/0/0) 71127180
3 unassigned wm 0 0 (0/0/0) 0
4 unassigned wm 0 0 (0/0/0) 0
5 unassigned wm 0 0 (0/0/0) 0
6 usr wm 182 - 24619 33.67GB (24438/0/0) 70601382
7 unassigned wm 0 0 (0/0/0) 0

partition&gt;

其中的一些信息与使用 prtvtoc 命令显示的信息相同。但是,格式略有不同,我们看到其中显示了未使用的分区。您可能已注意到,我是在通知 format 我所使用的磁盘。这样做是为了避免导致所试验的系统上的某个其他磁盘意外地出现问题。另一种查看磁盘标签的方法是,使用 dd 命令转储标签:

r_gps@holstein: dd if=/dev/dsk/c2t1d0s2 of=wart.bin bs=512 count=1
1+0 records in
1+0 records out

这会生成一个二进制文件,可以使用 od 命令来显示该文件内容。

r_gps@holstein: od -x wart.bin
0000000 5355 4e33 3647 2063 796c 2032 3436 3230
0000020 2061 6c74 2032 2068 6420 3237 2073 6563
0000040 2031 3037 0000 0000 0000 0000 0000 0000
0000060 0000 0000 0000 0000 0000 0000 0000 0000
*
0000200 0000 0001 0000 0000 0000 0000 0008 0002
0000220 0000 0003 0001 0005 0001 0000 0000 0000
0000240 0000 0000 0000 0004 0000 0000 0000 0000
0000260 0000 0000 0000 0000 0000 0000 600d deee
0000300 0000 0000 0000 0000 0000 0000 0000 0000
*
0000640 0000 0000 2729 602e 0000 0000 0000 0001
0000660 602c 0002 001b 006b 0000 0000 0000 0000
0000700 0004 02f3 0000 005b 0004 02f3 0000 0000
0000720 043d 508c 0000 0000 0000 0000 0000 0000
0000740 0000 0000 0000 0000 0000 0000 0000 00b6
0000760 0435 4aa6 0000 0000 0000 0000 dabe 4297
0001000

八进制转储中包含很多信息,有一篇非常棒的 Sun 文档对其进行了介绍,因此我不想再进行赘述。请在 SunSolve 中搜索文档 ID 74087。需要注意的一点是:od 始终跳过重复的行(带有 * 的行);VTOC_SANE 在偏移 0xbc 位置始终是 0x600ddeee;DKL_MAGIC 在紧靠校验和前面的偏移 0x1fc 位置始终是 0xdabe。现在,我们已经标记了磁盘,接下来可通过 format 命令对其执行哪些操作呢?请先看一看下面列出的菜单。我将先介绍非破坏性格式化菜单选项,但 volname 选项除外。下面以粗体文本显示了这些选项。

r_gps@holstein: format /dev/rdsk/c2t1d0s2
selecting /dev/rdsk/c2t1d0s2
[disk formatted]

FORMAT MENU:
disk - select a disk
type - select (define) a disk type
partition - select (define) a partition table
current - describe the current disk
format - format and analyze the disk
repair - repair a defective sector
label - write label to the disk
analyze - surface analysis
defect - defect list management
backup - search for backup labels
verify - read and display labels
save - save new disk/partition definitions
inquiry - show vendor, product and revision
volname - set 8-character volume name
!<cmd> - execute <cmd>, then return
quit
format&gt;

我总是喜欢为每个磁盘指定卷名称,因为这可使系统变得更加人性化。如果多个系统查看相同的磁盘驱动器(在高可用性的群集中,可能会出现这种情况),这也是 非常有帮助的。我见过一对 RAID 引擎提供了 120 多个磁盘,VERITAS 群集中的 15 个系统都能看到它们。通过为每个磁盘指定卷名称,可以帮助识别已使用的磁盘。没有卷名称的磁盘是未使用的磁盘。在使用 volname 菜单选项时,有一个注意事项,如以下示例中所示:

format&gt; volname
Enter 8-character volume name (remember quotes)[""]:"pigsnot"
Ready to label disk, continue? y

format&gt;

volname 选项会将信息写出到磁盘标签中。我曾经在挂载了文件系统并包含有效数据的磁盘上执行过此操作。第一次 执行此操作时,纯属偶然。好在天没有塌下来,地球也照转不误。因此,我在磁盘驱动器上进行了一些测试,分别在挂载了文件系统和未挂载文件系统的磁盘上更改 了卷名称。虽然更改了标签,但并没有丢失任何数据。当然,标准免责声明同样适用:“您的情况可能会有所不同 -- 继续操作所产生的后果由您自己承担 -- 对于因输入错误等产生的结果概不负责。”

disk 选项允许在 format 实用程序中更改磁盘;但由于我已经选择了要使用的磁盘,因此它仅显示该磁盘。

format&gt; disk

AVAILABLE DISK SELECTIONS:
0. /dev/rdsk/c2t1d0s2 <SUN36G cyl 24620 alt 2 hd 27 sec 107> pigsnot
/pci@1f,4000/pci@5/SUNW,isptwo@4/sd@1,0
Specify disk (enter its number)[0]:

current 选项显示在启动 format 命令后选择的当前磁盘。本文一直使用第 2 个磁盘,因此 current 选项将显示以下信息:

Current Disk = c2t1d0: pigsnot
<SUN36G cyl 24620 alt 2 hd 27 sec 107>
/pci@1f,4000/pci@5/SUNW,isptwo@4/sd@1,0

current 选项在最后一行中显示该磁盘的物理位置。您需要将 /devices 放在物理位置前面,并使用一个字母来表示分区号。

r_gps@holstein: ls /devices/pci@1f,4000/pci@5/SUNW,isptwo@4/sd@1,0*

/devices/pci@1f,4000/pci@5/SUNW,isptwo@4/sd@1,0:a
/devices/pci@1f,4000/pci@5/SUNW,isptwo@4/sd@1,0:a,raw
/devices/pci@1f,4000/pci@5/SUNW,isptwo@4/sd@1,0:b
/devices/pci@1f,4000/pci@5/SUNW,isptwo@4/sd@1,0:b,raw
/devices/pci@1f,4000/pci@5/SUNW,isptwo@4/sd@1,0:c
/devices/pci@1f,4000/pci@5/SUNW,isptwo@4/sd@1,0:c,raw
/devices/pci@1f,4000/pci@5/SUNW,isptwo@4/sd@1,0:d
/devices/pci@1f,4000/pci@5/SUNW,isptwo@4/sd@1,0:d,raw
/devices/pci@1f,4000/pci@5/SUNW,isptwo@4/sd@1,0:e
/devices/pci@1f,4000/pci@5/SUNW,isptwo@4/sd@1,0:e,raw
/devices/pci@1f,4000/pci@5/SUNW,isptwo@4/sd@1,0:f
/devices/pci@1f,4000/pci@5/SUNW,isptwo@4/sd@1,0:f,raw
/devices/pci@1f,4000/pci@5/SUNW,isptwo@4/sd@1,0:g
/devices/pci@1f,4000/pci@5/SUNW,isptwo@4/sd@1,0:g,raw
/devices/pci@1f,4000/pci@5/SUNW,isptwo@4/sd@1,0:h
/devices/pci@1f,4000/pci@5/SUNW,isptwo@4/sd@1,0:h,raw

带有 "raw" 字样的物理设备名称指的是字符设备,其他名称指的是块设备。字母 'a' 指的是分区 0;字母 'b' 指的是分区 1,依此类推。

defect 选项可打开 Defect Menu(缺陷菜单),该菜单用于查看磁盘出厂时的缺陷数目。请使用 primary 选项来查看此信息。我的台式计算机具有三个磁盘,它们的主要缺陷数从 72 到 2922 不等。不过,我们更感兴趣的是 grown 选项。磁盘上的 "grown" 缺陷会随着时间的推移而增加,我们所关心的是其增加速率。显然,如果缺陷以较高的速率增加,则磁盘很快就会出现故障。

print 选项显示缺陷及其在磁盘上的位置的列表。您还可以将磁盘缺陷列表转储(保存)到文件中。我曾经在一个怀疑有缺陷的磁盘上执行了此操作,只花了很少一点时间。

verify 选项显示的很多信息与前面 prtvtoc 命令显示的信息相同,并且使用 format 命令显示分区时也会显示这些信息。

format&gt; verify

Primary label contents:

Volume name = < pigsnot>
ASCII name = <SUN36G cyl 24620 alt 2 hd 27 sec 107>
pcyl = 24622
ncyl = 24620
acyl = 2
nhead = 27
nsect = 107
Part Tag Flag Cylinders Size Blocks
0 root wm 0 - 90 128.37MB (91/0/0) 262899
1 swap wu 91 - 181 128.37MB (91/0/0) 262899
2 backup wu 0 - 24619 33.92GB (24620/0/0) 71127180
3 unassigned wm 0 0 (0/0/0) 0
4 unassigned wm 0 0 (0/0/0) 0
5 unassigned wm 0 0 (0/0/0) 0
6 usr wm 182 - 24619 33.67GB (24438/0/0) 70601382
7 unassigned wm 0 0 (0/0/0) 0

save 选项将信息写出到一个 format.dat 文件(或指定的任意名称)中。format 命令可以使用此 dat 文件中的信息来配置驱动器。(有关该文件的详细信息,请参见 man -s4 format.dat。)如果使用 cat 在一个窗口中显示新创建的 format.dat 文件,然后在另一个窗口中执行 verify 命令,则会显示很多相同的信息,但格式有所不同或可读性更好(对于某些信息)。使用 save 选项创建的 format.dat 文件中还包含其他一些信息,即磁盘的 rpm。

#
# New disk/partition type saved on Fri Aug 6 06:34:05 2004
#
disk_type = "SUN36G" \
: ctlr = SCSI : ncyl = 24620 : acyl = 2 : pcyl = 24622 \
: nhead = 27 : nsect = 107 : rpm = 10025
...

最后,用于收集磁盘相关信息的选项列表中还包括 inquiry 选项。它显示一些非常基本的信息,如下所示。

format&gt; inq
Vendor: FUJITSU
Product: MAN3367M SUN36G
Revision: 1502
format&gt;

需要注意的一点是修订级别。对于磁盘驱动器,确实发布了一些固件更新。通过使用该选项,您可以将磁盘的修订级别与磁盘供应商提供的修订级别进行比较。我曾 经让供应商更新其大型 RAID 阵列中的磁盘上的驱动器固件,但他们是在不停机的情况下进行更新的。很久以前,我曾经将 SCSI 磁盘上的固件更新过一两次。现在,我不再自找麻烦了;主要是因为目前环境中的磁盘数量太大,并且所需的停机时间也太长。(还是老话说得好,“东西还没坏, 就别急着修”,有时看来确实不无道理。)我一直没有想出如何在不停机的情况下进行升级。现在仍然没有。

format 命令的一个优点是,您可以为其提供命令文件。例如,我们可以使用以下命令文件,将缺陷列表转储到文件中:

defect
both
dump /disks/c2t1d0-defect.dat

r_gps@holstein: format -f c2t1d0.cmd /dev/rdsk/c2t1d0s2

但是,由于 format 命令具有很强的破坏力,因此如果磁盘挂载了分区,便不能为其传递命令文件。如果您认为上述操作确实有用的话,我建议您使用 Perl 和 Expect 来获取此信息。

警告:我已复制了 format 菜单,如果看一下其余选项,您便会发现这些选项可能会破坏磁盘上的数据。切记,一定要小心使用这些选项,因为破坏的可是您自己的数据。

r_gps@holstein: format /dev/rdsk/c2t1d0s2
selecting /dev/rdsk/c2t1d0s2
[disk formatted]

FORMAT MENU:
disk - select a disk
type - select (define) a disk type
partition - select (define) a partition table
current - describe the current disk
format - format and analyze the disk
repair - repair a defective sector
label - write label to the disk
analyze - surface analysis
defect - defect list management
backup - search for backup labels
verify - read and display labels
save - save new disk/partition definitions
inquiry - show vendor, product and revision
volname - set 8-character volume name
!<cmd> - execute <cmd>, then return
quit
format&gt;

现在,已经很少有人使用 type 选项了。人们过去经常使用该选项,当时磁盘(主要是非 SCSI 磁盘)并非始终包含有关其自身的信息。较旧系统的管理员需要记得输入以下信息:柱面数、替代柱面数、物理柱面数、磁头数、物理磁头数、每个磁道的数据扇区 数以及很多其他项。对于其中的许多信息,我们使用缺省值,因为有时根本找不到这些信息。以前,磁盘供应商的数目众多,他们对自己的专有信息采取了严格的保 护措施。有时,我们需要不断地对这些值进行试验,直到找到正确的值。您可以尝试修改这些值,但在执行此操作之前,应保存前面收集的所有磁盘相关信息。的 确,这些信息应该存储在磁盘上的某种只读设备中,保证安全比加班加点工作要重要得多。您可能需要使用这些信息将磁盘参数设回到正确值,特别是在使用旧磁盘 执行本文的操作时。

过去,我们必须为称作 IPI 和 SMD 的驱动器执行上述操作。如果您感兴趣的话,请尝试在 Google 上搜索 'ipi smd disk' 驱动器,以了解有关这些驱动器的一些历史信息,从而查明仍然可以在哪里买到这些类型的驱动器。

partition 选项可能是 format 实用程序中使用最多的选项。选择该选项时将启动 Partition Menu(分区菜单),我们可以从中修改磁盘上的分区。切记,第二个分区(分区编号为 2)称为备份分区,它是整个磁盘。我们不希望修改备份分区。但是,在极少数情况下,您需要在备份分区上创建文件系统,并且只挂载该文件系统(通常还包含数 据库)。然而,要注意的是,这并非是一种好的做法。如果使用的软件将其自身绑定到磁盘上的某个分区,则可能会出现问题。我使用的一个应用程序就是这样的, 要对其进行维护和升级等操作,简直是难上加难。如果供应商考虑不周,而要求其产品使用第 2 个分片,则该软件可能会破坏 VTOC。

下面介绍的内容是我与 Sun 的观点大不一致的地方。例如,最近 Sun 和我熟悉的一些 Sun 系统工程师 (System Engineer, SE) 建议使用一个根分区,并通过另一个分区来存储系统磁盘的所有其他内容。简直是一派胡言!操作系统将磁盘上的每个分片都看作是单独的磁盘,因此,在测试磁盘 上创建分片之前,让我们看一下我在这一点上为什么与 Sun 存在分歧。如果您愿意,您可以不同意我的观点,但最好写文章反驳我!

如果由于应用程序发生故障而导致填满 /(根目录),进而又填充 /var/tmp,那该怎么办呢?这不会损坏操作系统,甚至也不会对发生故障的应用程序造成破坏。但在另一方面,它可能会阻止任何程序继续进行任何处理,直到纠正了发生故障的应用程序。因此,我们需要使用一个分区来建立文件系统和挂载 /。在这一点上,Sun 与我的看法是一致的:使用一个分区。但是,我们还需要将 /var 放在单独的文件系统中。因此,我们需要使用另一个分区来放置 /var。现在有两个分区。我还要将 /usr 放在单独的分区中。/usr 文件系统应该只包含可执行文件和 ASCII 文件。现在有三个分区。由于运行系统时并不需要 /opt 中存储的信息,因此,我也将其设置为单独的文件系统。现在有四个分区。我还要为 /tmp 创建一个文件系统,它应该只包含系统生成的临时文件。现在有五个分区。由于这是系统磁盘,因此需要创建一个交换分区。现在有六个分区。这样还剩下一个分区,可以将其用于任何用途。当出于安全方面的原因而将系统锁定时,我会将 /tmp 和 /var/tmp 之外的所有文件系统都设置为只读。

操作系统将每个分区视为一个单独的文件系统。这意味着,操作系统为其中的每个文件系统都创建高速缓存和缓冲区。这些额外的高速缓存和缓冲区会略微增 大 I/O 负载。当然,您还会受到备份、互连速度和磁盘控制器的限制。但在进行大量 I/O 操作时,出现问题的可能性会有所减少。

好了,这个主题先告一段落,下面继续介绍 Partition Menu(分区菜单)。它将打开另一个菜单,如下所示:

PARTITION MENU:
0 - change `0' partition
1 - change `1' partition
2 - change `2' partition
3 - change `3' partition
4 - change `4' partition
5 - change `5' partition
6 - change `6' partition
7 - change `7' partition
select - select a predefined table
modify - modify a predefined partition table
name - name the current table
print - display the current table
label - write partition map and label to the disk
!<cmd> - execute <cmd>, then return
quit

我发现使用分区的最简便方法是:在进入 Partition Menu(分区菜单)后,只需按 'P' 键即可显示 print 选项。我们可以从中了解执行操作前的情况。它提供了以下输出内容,我们在前面也看到过这些信息。

Current partition table (original):
Total disk cylinders available: 24620 + 2 (reserved cylinders)

Part Tag Flag Cylinders Size Blocks
0 root wm 0 - 90 128.37MB (91/0/0) 262899
1 swap wu 91 - 181 128.37MB (91/0/0) 262899
2 backup wu 0 - 24619 33.92GB (24620/0/0) 71127180
3 unassigned wm 0 0 (0/0/0) 0
4 unassigned wm 0 0 (0/0/0) 0
5 unassigned wm 0 0 (0/0/0) 0
6 usr wm 182 - 24619 33.67GB (24438/0/0) 70601382
7 unassigned wm 0 0 (0/0/0) 0

这是缺省分区表,我们需要对其进行更改,回想一下,我们的确不希望分区发生重叠。修改分区的最安全方法是,使用 modify 选项进行修改。这需要使用一个称为“浮动片”的分区,它是一个临时分区,可以神奇地自动扩大和缩小以满足分区选项的需要。只有在运行 format 实用程序时,浮动片才会存在。

输入 modify 后,将显示选择分区基准的选项,您可以对当前分区或 All Free Hog(所有浮动)分区进行修改。

partition&gt; modify
Select partitioning base:
0. Current partition table (original)
1. All Free Hog
Choose base (enter number) [0]?

缺省情况下,将对当前分区进行修改,这样做是可以的。事实上,执行操作后,结果并没有多大差别。如果选择 Current partition table(当前分区表),format 实用程序将先显示当前分区。如果选择 All Free Hog(所有浮动),您会发现备份分区是唯一分配了空间的分区。使用 modify 选项时,您可以选择修改备份分区之外的所有分区。modify 选项有一个令人不太满意的地方:无法为创建的分区指定标记或设置标志。不过,随后可通过分别选择各个分区来完成上述操作,但这对我来说似乎是多余的。

如果选择不使用 modify 选项,则可以分别更改每个分区。由于我使用的是 36 GB 驱动器,因此,不妨将根分区设置得大一些。我首先选择要修改的分区,设置分区权限,然后指定其起始柱面,最后设置分区大小。

partition&gt; 0
Part Tag Flag Cylinders Size Blocks
0 root wm 0 - 90 128.37MB (91/0/0) 262899

Enter partition id tag[root]:
Enter partition permission flags[wm]:
Enter new starting cyl[0]:
Enter partition size [262899b, 91c, 90e, 128.37mb, 0.13gb]: 256mb

您还可以在出现分区 ID 标记和权限标志问题提示时输入 '?',然后获得可以接受的响应。如果再次按 'P' 键,则会发现存在一个需要解决的问题。

Part Tag Flag Cylinders Size Blocks
0 root wm 0 - 181 256.74MB (182/0/0) 525798
1 swap wu 91 - 181 128.37MB (91/0/0) 262899
...
分区 0 与分区 1 重叠。在创建分区的过程中,请确保不要与创建的任何分区发生重叠。事实上,创建的分区数和分区大小取决于您所在的位置、您的需求和经验等。完成操作后,将显示以下内容: Current partition table (original):
Total disk cylinders available: 24620 + 2 (reserved cylinders)

Part Tag Flag Cylinders Size Blocks
0 root wm 0 - 181 56.74MB (182/0/0) 525798
1 swap wu 182 - 272 128.37MB (1452/0/0) 4194828
2 backup wu 0 - 24619 33.92GB (24620/0/0) 71127180
3 unassigned wm 3540 - 4265 1.00GB (726/0/0) 2097414
4 unassigned wm 0 0 (0/0/0) 0
5 unassigned wm 4266 - 4991 1.00GB (726/0/0) 2097414
6 usr wm 273 - 2087 2.50GB (1815/0/0) 5243535
7 var wm 2088 - 3539 2.00GB (1452/0/0) 4194828

我们仍需将分区表写出。只需键入 label,然后使用 'Y' 回答后续问题即可完成此操作。您可能想知道 /home 位于什么位置。我很少会将用户资料存储在系统磁盘上。这样,在从一个操作系统级别切换到另一个操作系统级别时会更方便一些。

事实上,如果是从 Sun 购买的磁盘,则不需要使用 format 选项。如果您购买的是旧磁盘或要转换磁盘中的操作系统,或者缺陷列表很大,则可以在磁盘中使用 format 选项进行 Solaris 操作系统的安装准备。如果缺陷列表很大,它可能会对磁盘执行一些清理操作。您可能需要使用该选项的一个原因是:系统连接到 RAID 引擎,而这些引擎无法“智能地”提供创建的 LUN,以使 Solaris 操作系统能够识别它们。如果使用这样的硬件,您应该尽可能寻找较新的设备。根据磁盘大小,您可以在下班回家之前或是上班伊始开始格式化磁盘。我的 Ultra Enterprise 工作站 (UE-60) 上的驱动器为 36 GB,大约需要 332 分钟才能完成此操作。

repair 选项可用于修复磁盘上有缺陷的块(可能会成功,也可能不会)。我已经很多年没有使用这个选项了。事实上,直到开始撰写本文时,我才想起这个选项来。现在, 磁盘驱动器的成本都很低,与花上几个小时摆弄磁盘,尝试恢复这个块、那个块的做法相比,更换磁盘要更加安全,而且可能还更加划算一些。我要提醒您的是,这 样做虽然少了几分乐趣,但可能更加安全。

对于 label 选项,我想前面已经介绍得够详尽了,因此我将略过该选项,而直接介绍 analyze 选项。analyze 选项与 defect 选项类似,它也会打开另一个菜单。除了进行一些试验或是写文章,我平常很少使用 analyze 选项。当然,您可以使用 Analyze Menu(分析菜单)上的项来分析磁盘。您会注意到,某些选项指出它们会破坏数据。

backup 选项将搜索备份标签。但是,它会首先检查主标签,如果找到主标签,format 将询问您是否继续。如果继续,这将导致 backup 选项将主标签替换为找到的备份标签。我从未遇到过必须执行此操作的情况,并且我也想知道如何使用此选项;据我所知,如果没有主标签,则无法在 format 命令中使用 backup 选项。我想 Sun 支持人员可以告诉您如何使用 dd 命令,以便将备份标签移到磁盘上的主标签位置,但这仅仅是我的猜测而已。

这的确很有意思,您说是不是?在几个磁盘上进行格式化和设置分区并不难;它需要键入一些信息,但这在可以忍受的范围内。然而,如果是配置大型 RAID 阵列,并且需要对 10 个磁盘甚至 200 个磁盘进行完全相同的配置,那该怎么办呢?我的一位好朋友曾经需要为一个大型映像项目执行这样的操作。她使用 fmthard 和一些脚本进行处理,三下五除二就弄完了。

通常,man -s1m fmthard 可提供更多的信息,但简而言之,fmthard 的使用方法是这样的。首先,您需要创建一个 ASCII 数据文件,指示 fmthard 如何在目标磁盘上设置分区。您可以使用自已喜欢的编辑器或 fmthard 命令本身创建一个文件。通过查看该文本文件,您会注意到需要为每个磁盘上的各个分区指定第一个扇区以及扇区数。回想一下前面的内容,我们绝对不希望分区发生重叠。

* Partition Tag Flag First Sector Sector Count
0 2 00 4194828 1048707
1 7 00 5243535 4145715
2 5 00 0 71127180
3 3 01 0 4194828
4 0 00 9389250 2097414
5 0 00 11486664 8389656
6 4 00 19876320 6292242

因此,最好的办法是:使用 format 实用程序对其中的一个磁盘进行分区以获得所需的配置,然后使用 fmthard 命令创建数据文件,用于对其余磁盘进行分区。

fmthard -i -n "" /dev/rdsk/c2t1d0s2 &gt; ./mypartition.dat

上述命令将 c2t1d0 上的磁盘分区写出到 mypartition.dat 文件中。对于要以类似方式进行分区的所有磁盘,可随后使用该 dat 文件向 fmthard 命令“提供”信息。

? fmthard -s mypartition.dat -n "volumename" /dev/rdsk/cxtydzs2 ?

fmthard 命令的缺点是,它会更新 VTOC。因此,如果磁盘开头没有有效的标签,fmthard 将无法正常运行。如果打算通过 fmthard 命令来使用或设置卷名称,则脚本可能会达到 200 行(或包含很多要修改的磁盘)。尽管如此,与通过 format 实用程序在多个磁盘上缓慢地设置分区相比,采用这种方法还是会好些。

现在,如果您确实阅读了 format 手册页,您会注意到以下内容:

-e Enable SCSI expert menu. Note this option is not
recommended for casual use.

我并不了解您那边的情况,但我必须试一试这个选项。进入 format 实用程序后,菜单中将显示额外两行:

scsi - independent SCSI mode selects
cache - enable, disable or query SCSI disk cache

输入 scsi 选项后,甚至会显示一段简明的警告信息!事实上,如果您不熟悉 SCSI 协议,您可能需要找一本介绍 SCSI 协议的好书,尤其是要了解可以在 format 实用程序的 scsi 选项中更改的模式选项。我在此向您推荐一本书:由 Friedhelm Schmidt 编写的《The SCSI Bus and IDE Interface: Protocols, Applications, and Programming》(SCSI 总线与 IDE 接口:协议、应用程序以及编程)。我试过这个选项,但从未将我所做的修改应用于生产服务器。有时,能不改最好还是别改。

如果打算试一试 scsi 选项,我要提醒您的是:先使用日志选项 (-l c2t1d0.log) 启动 format 实用程序,然后执行 format 实用程序中显示的各项操作,这样会将所有信息保存到日志文件中。此外,scsi 选项下面的 format 选项不同于上一级菜单中的 format 选项。

现在,cache 选项显示了磁盘读写高速缓存菜单。并非所有 SCSI 磁盘都使用高速缓存,而且并非所有使用高速缓存的 SCSI 磁盘都允许更改 cache 选项。这里的高速缓存是指磁盘上的少量存储器,它与系统内存无关。这意味着,每个磁盘可能会略有不同,因而在执行操作时,每个磁盘的行为也会随之有所差 异。我发现读高速缓存通常是处于打开状态的,这样设置不无道理,因为在读取操作过程中即使断电也不会丢失任何内容。数据仍然会保存在磁盘上。同样,我还发 现写高速缓存通常是处于关闭状态的。这样设置也是有道理的,因为如果断电,写高速缓存中的所有数据将会丢失。我曾经将写高速缓存打开并使用 IOzone 比较 I/O 负载,写入操作提高的幅度从非常小到很显著,不一而足。这种提高因磁盘型号和供应商而异。

由于使用的 format 实用程序带有 -e 选项,因此,还可以看到另一项内容。键入 label 时,将会获得以下响应:

format&gt; label
[0] SMI Label
[1] EFI Label
Specify Label type[0]:

我确信 SMI 表示 Sun Microsystems。这是缺省选项,如果进入的 format 实用程序不带有 -e 选项,则会看到该选项。SMI 选项将显示 8 个分区的标准分区配置,其中第 2 个分区为备份分区。

如果选择 EFI(Extensible Firmware Interface,可扩展固件接口)标签,则会显示另一个分区,如下所示。

ascii name = <FUJITSU MAN3367M SUN36G 1502 43d671f>
bytes/sector = 512
sectors = 71132958
accessible sectors = 71132925
Part Tag Flag First Sector Size Last Sector
0 root wm 34 128.35MB 262898
1 swap wu 262899 128.37MB 525797
2 unassigned wm 0 0 0
3 unassigned wm 0 0 0
4 unassigned wm 0 0 0
5 unassigned wm 0 0 0
6 usr wm 525798 33.66GB 71116540
7 unassigned wm 0 0 0
8 reserved wm 71116541 8.00MB 71132924

format&gt;

您可以在 Intel Web 站点的 Extensible Firmware Interface(可扩展固件接口)页中找到有关 EFI 的更多信息。