[OpenBSD]

[索引] [第十三章 - 多媒体] [第十五章 - Packages 和 Ports]

14 - 配置磁盘


目录


14.1 - 磁盘和分区

在OpenBSD里设置磁盘不同平台之间有很大的区别, 所以你应该阅读自己 平台 下的 INSTALL.<arch> 文件里的安装说明内容以了解所需的步骤。

有些程序,例如 fdisk(8), disklabel(8) 以及其它一些程序允许你使用 简写方式来表示,例如用 "sd0" 表示第一个 SCSI 驱动器,或者用 "wd0" 表示第一个 IDE 驱动器。这些程序可以将这些简写方式扩展到正确的设备上。

由于历史原因, 术语 "partition" (分区)一般用于表达Unix世界中两个完全 不同的事物,而这可能令你有些迷惑。 起初, 操作系统定义一个 "partition" 的目的是将文件系统从磁盘上分离出来。 后来, 其它的平台,例如i386在也用这个术语来表达它们所需的分区表 "Partition Table" 的名字,而后,这种新的叫法在平时使用的越来越多,也 逐渐被大家接受而代替了原先的定义。

这两类 "partitions" 是:

几乎所有的的OpenBSD平台都使用 disklabel(8) 作为首要方式来管理filesystem partitions, 但是也有少量的平台还需要使用 fdisk(8) 来管理 Partition Table partitions.

14.2 - 使用OpenBSD的fdisk(8)

确保您阅读了fdisk(8) 用户手册。

fdisk(8)在一些平台(i386, amd64, macppc, zaurus 和 armish)上被用来产生一个可被boot ROM识别的分区, 这个分区用来存放OpenBSD的disklabel分区。其它平台不需要或不使用fdisk(8)。fdisk(8)还可用来控制影响计算机上所有操作系统的主引导纪录(MBR)。不像其它操作系统上类fdisk命令, OpenBSD上的fdisk认为您自己知道您在干什么, 并且在很大程度上允许您利用它强大的功能根据需求进行磁盘分区。同样它也可能允许您的误操作, 所以使用时谨慎一些。

一般, 在一块磁盘上只需建立一个OpenBSD的fdisk分区, 然后再使用disklabel将这个fdisk分区划分成OpenBSD的文件系统分区。

如果仅想用fdisk查看您的分区表, 用:

# fdisk sd0
它会产生一个如下的输出:
Disk: sd0       geometry: 553/255/63 [8883945 Sectors]
Offset: 0       Signature: 0xAA55
         Starting       Ending       LBA Info:
 #: id    C   H  S -    C   H  S [       start:      size   ]
------------------------------------------------------------------------
*0: A6    3   0  1 -  552 254 63 [       48195:     8835750 ] OpenBSD     
 1: 12    0   1  1 -    2 254 63 [          63:       48132 ] Compaq Diag.
 2: 00    0   0  0 -    0   0  0 [           0:           0 ] unused      
 3: 00    0   0  0 -    0   0  0 [           0:           0 ] unused     

本例中我们看的是第一块SCSI硬盘的fdisk输出, 我们可以看到OpenBSD的分区(A6)和其容量。* 表示这个OpenBSD分区被设定为启动分区。

上例中我们只是查看了信息, 怎样编辑分区表呢? 要编辑分区表我们要使用 -e 选项, 它可以提供一个命令行提示符下的fdisk交互式操作。

# fdisk -e wd0
Enter 'help' for information
fdisk: 1> help
        help            Command help list
        manual          Show entire OpenBSD man page for fdisk
        reinit          Re-initialize loaded MBR (to defaults)
        setpid          Set the identifier of a given table entry
        disk            Edit current drive stats
        edit            Edit given table entry
        flag            Flag given table entry as bootable
        update          Update machine code in loaded MBR
        select          Select extended partition table entry MBR
        swap            Swap two partition entries
        print           Print loaded MBR partition table
        write           Write loaded MBR to disk
        exit            Exit edit of current MBR, without saving changes
        quit            Quit edit of current MBR, saving current changes
        abort           Abort program without saving current changes
fdisk: 1>   

上面提供了一个使用 -e 选项后的可用命令列表。

fdisk 技巧和提示

14.3 - 使用OpenBSD的disklabel(8)

什么是disklabel(8)?

首先, 请先阅读 disklabel(8) 用户手册。

在不同平台上进行OpenBSD分区细节上稍有差异。对i386, amd64, macppc, zaurusarmish 来说, 磁盘分区分为两个步骤, 首先OpenBSD用fdisk(8)划分出一块磁盘空间供自己使用, 然后再用disklabel(8)将这块空间细分成不同的OpenBSD分区。

所有的OpenBSD平台全使用disklabel(8)来管理OpenBSD分区, 而OpenBSD平台也使用fdisk把所有的disklabel(8)分区放到一个fdisk分区上。

标签包含了您磁盘的特定信息, 像您的硬盘布局和上面文件系统的信息, 也包含了这块硬盘的信息, 例如转速、交错存取等。由于历史原因, 这些信息经常是错的, 不过不要担心, disklabel能够通过引导程序访问磁盘, 并且可以知道这个磁盘上文件系统的位置。更多关于disklabel的信息请阅读disklabel(5)的用户手册。

在一些平台上, disklabel破除计算机体系对磁盘分区的限制, 例如在i386平台上您只可以有4个基本分区, 但是使用disklabel(8), 您可以把所有的OpenBSD分区(例如:'swap', '/', '/usr', '/var'等)放在一个基本分区内。这样您就可以保留另外的3个基本分区给其它的操作系统使用。

在OpenBSD安装时使用disklabel(8)

OpenBSD安装中的一个主要任务是构建您的磁盘标签(labels)。安装过程中您用disklabel(8)来创建不同的分区。作为安装过程的一部分, 您可以使用disklabel(8)定义您的挂载点, 但您还可以在后续安装过程或安装完成后改变这个挂载点。

不能说哪种磁盘分区的方法是最"合理"的, 但也存在很多错误的分区方式。您进行磁盘分区前请先阅读关于磁盘分区和分区大小的讨论

下面是在安装过程中使用disklabel(8)的一个实例, 请参看安装指南那一章的设置磁盘的内容。

安装后使用disklabel(8)

安装后, 通常使用disklabel(8)的原因是想检查您的磁盘分区设定。下面的命令将显示您目前的磁盘分区情况, 不要改动它:

# disklabel wd0    <<-- 这里的wd0是您的磁盘设备名, 您可以改成自己需要的
# Inside MBR partition 3: type A6 start 63 size 29880837
# /dev/rwd0c:
type: ESDI
disk: ESDI/IDE disk
label: Maxtor 51536H2  
flags:
bytes/sector: 512
sectors/track: 63
tracks/cylinder: 16
sectors/cylinder: 1008
cylinders: 16383
total sectors: 29888820
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0           # microseconds
track-to-track seek: 0  # microseconds
drivedata: 0 
16 partitions:
#             size        offset  fstype [fsize bsize  cpg]
  a:        614817            63  4.2BSD   2048 16384  328 # Cyl     0*-   609 
  b:        409248        614880    swap                   # Cyl   610 -  1015 
  c:      29888820             0  unused      0     0      # Cyl     0 - 29651*
  d:       6291936       1024128  4.2BSD   2048 16384  328 # Cyl  1016 -  7257 
  e:        409248       7316064  4.2BSD   2048 16384  328 # Cyl  7258 -  7663 
  f:       1024128       9822960  4.2BSD   2048 16384  328 # Cyl  9745 - 10760 
  h:       2097648       7725312  4.2BSD   2048 16384  328 # Cyl  7664 -  9744   

注意为什么现在这里只分配了部分磁盘空间, Disklabel提供两种不同的方式编辑磁盘分区, 一种是内建的命令行式编辑器(就像安装OpenBSD时用到了), 还有一个全屏幕编辑器, 如vi(1)。您可能会觉得命令行方式简单一些, 因为它能指导您逐步完成分区工作并提供帮助信息.但是全屏幕编辑器方式也肯定会用不上。

我们来为上面的系统添加分区。

警告:分区时的任何误操作都可能导致您的重要数据丢失, 请在使用disklabel前先备份您的重要数据!

我们这里将使用内建的命令行式编辑器, 您可以通过使用disklabel(8)+ "-E"参数的方式调用它。

# disklabel -E wd0
...
> a k
offset: [10847088]Enter
size: [19033812] 2g
Rounding to nearest cylinder: 4194288
FS type: [4.2BSD] Enter
> p m
device: /dev/rwd0c
type: ESDI
disk: ESDI/IDE disk
label: Maxtor 51536H2  
bytes/sector: 512
sectors/track: 63
tracks/cylinder: 16
sectors/cylinder: 1008
cylinders: 16383
total bytes: 14594.2M
free bytes: 7245.9M
rpm: 3600
16 partitions:
#             size        offset  fstype [fsize bsize  cpg]
  a:        300.2M          0.0M  4.2BSD   2048 16384  328 # Cyl     0*-   609 
  b:        199.8M        300.2M    swap                   # Cyl   610 -  1015 
  c:      14594.2M          0.0M  unused      0     0      # Cyl     0 - 29651*
  d:       3072.2M        500.1M  4.2BSD   2048 16384  328 # Cyl  1016 -  7257 
  e:        199.8M       3572.3M  4.2BSD   2048 16384  328 # Cyl  7258 -  7663 
  f:        500.1M       4796.4M  4.2BSD   2048 16384  328 # Cyl  9745 - 10760 
  h:       1024.2M       3772.1M  4.2BSD   2048 16384  328 # Cyl  7664 -  9744 
  k:       2048.0M       5296.4M  4.2BSD   2048 16384   16 # Cyl 10761 - 14921 
> q
Write new label?: [y]  

在这个例子中, disklabel很人性化地帮助我们计算了分区起始偏移量。在很多情况下disklabel可以自动完成这个工作, 但是如果分区有"错误"时(例如:您删除了一个分区, 或者您想自虐一下), 您就需要坐下来拿一张纸和铅笔自己计算出合适的偏移量。注意disklabel(8)计算的偏移量更权威一些, 极有可能您的计算是错误的, 仔细一点, 在您输入数值前请先搞清楚这些数字的含义。

在绝大多数OpenBSD平台上您可以有16个分区 (一些特殊的平台可能只能有8个分区). 每个系统必须包含一个 'c' 分区, 它覆盖了整个OpenBSD分区, 它的 "fstype" (文件系统类型)是 "unused" , 如果您的不是这样, 那它肯定被改动过, "D" 选项(参看下面)可以帮助您修正这个问题。除非要访问raw扇区否则不要使用 "c" 分区, 不要尝试在 "c" 分区上建立文件系统, 在根磁盘上 "a" 分区是留给 "/" 分区专用的, "b" 分区是留给swap(交换)分区专用的, 但是只有根磁盘上的 "a" 、 "b" 分区具有此特性, 您的其它磁盘可以使用除 "c" 外的所有其它15个分区作为文件系统。

Disklabel 的技巧和提示

14.4 - 在OpenBSD中增加磁盘

如果您的系统已经正常安装完毕, 一旦您想为系统增加磁盘, 您需要使用 fdisk(8) (仅i386) 和 disklabel(8) 来设定OpenBSD的磁盘。

对i386用户来说, 首先需要使用fdisk, 其它平台可忽略这一步。下例中我们为系统增加第三块SCSI磁盘。

# fdisk -i sd2
这将会为了OpenBSD专用而初始化这块磁盘的"真正"分区表, 接下来您需要为建立一个disklabel。这里读者可能有些迷惑。
# disklabel -e sd2
(screen goes blank, your $EDITOR comes up)
type: SCSI
...bla...
sectors/track: 63
total sectors: 6185088
...bla...
16 partitions:
#        size   offset    fstype   [fsize bsize   cpg]
  c:  6185088        0    unused        0     0         # (Cyl.    0 - 6135)
  d:  1405080       63    4.2BSD     1024  8192    16   # (Cyl.    0*- 1393*)
  e:  4779945  1405143    4.2BSD     1024  8192    16   # (Cyl. 1393*- 6135)  

首先, 忽略 'c' 分区, 它应该永远在那里, 因为这个分区是留给像disklabel这类的程序操作的!OpenBSD的文件系统是4.2BSD, total sectors(总扇区数)代表了磁盘的大小, 也就是说这块磁盘的容量是3G, 在工厂计算的3G实际上只有3000兆。所以6185088/3000=2061 扇区/兆(用 bc(1)), 所以确定disklabel各分区a, d, e, f, g, ... 的大小, 仅需要用X*2061就能得到X兆的分区空间。您第一个新分区的偏移地址应该和每条磁道上的扇区数相同, 我们这里是63个扇区/磁道, 所以第一个分区的偏移地址是63, 而后面每个分区的偏移地址是前面所有分区的大小与偏移量之和。(这里"c"分区除外, 因为其代表整个OpenBSD占用的分区)

(译者注:说明一下, "the offset for partition" 我翻译成"分区偏移地址", 也就是该分区的实际起始位置——该分区的起始扇区号, 而"the offset of partition"我翻译成"分区的偏移量"。前文已经说过, i386不能占用第一条磁道(0磁道), 因为扇区编号从0开始, 第一条磁道上包含了0号~62号扇区, 所以新分区只能从第二条磁道上的63号扇区开始, 所以第一个分区的偏移地址是第63号扇区, 而所有分区的偏移量全是63。如果读者难以理解请自行参照原文, 同时欢迎指正!)

或者, 如果您想在新磁盘上只建立一个分区, 假设您想用整个硬盘做为web的存储或home目录或其它什么用途, 只需用所有扇区数减去第一条磁道的扇区数, 6185088-63 = 6185025, 您的分区是

    d:  6185025       63    4.2BSD     1024  8192    16 

如果所有上面这些看起来太复杂了, 您也可以使用 disklabel -E 命令使用和您安装系统时同样的分区模式! 那种情况下, 您只需输入"96M"指定"96 megabytes"的分区, 或96G指定一个96 gigs。

上面已经进行很多操作了, 但是没结束, 最后, 您还需要用newfs(8)命令在这块新磁盘上建立文件系统

# newfs sd2d

或者不管OpenBSD磁盘数字方案给您新磁盘起个什么名字(请查阅dmesg(8)的输出文件看OpenBSD是怎样命名您的磁盘的。)

现在我们要决定将这个新分区挂载到哪里, 假设您想把它挂载到 /u, 首先创建 /u 目录, 然后挂载这个新分区。

# mount /dev/sd2d /u

最后把它加入到

/dev/sd2d /u ffs rw 1 1 

怎样做您才能迁移一个已经存在的目录? 您应该挂载这个新硬盘到/mnt, 然后用cpio -pdum将/usr/local 拷贝到 /mnt 目录, 编辑/etc/fstab(5)文件可以看见 /usr/local partition 现在是 /dev/sd2d (您刚格式化的分区)。 例如:

/dev/sd2d /usr/local ffs rw 1 1

boot -s启动至单用户模式, 将现有的 /usr/local 目录移动到 /usr/local-backup (或者如果您觉得自己有福气, 删除它) 并建立一个空目录 /usr/local。然后重新启动系统, 瞧, 这些文件还在那里!

14.5 - 如何处理交换

14.5.1 - 关于交换

以前有各种矛盾的规则告诉计算机管理员应该给他们的计算机配置多大的分区。可问题是一般情况下只有少量的"通用" 应用程序。

很多类型的系统甚至不需要交换, 例如, 正常运行的防火墙就不需要交换。带有flash存储的计算机通常不需要交换。尽管在很多情况下分配分配一个不大的交换分区对系统并没有损害, 但是如果你的防火墙是基于flash的, 你会受益(稍微)于不指派一个交换分区; 很多磁盘有足够的空间指派一个小的交换分区。

有各种有关优化交换分区的技巧 (在磁盘的什么位置上, 设置在单独的磁盘上等。), 但是当你发现你在优化交换遇到问题时, 也许你只是需要更多的内存。通常情况下, 最优化的交换方式是不设置它。

在OpenBSD中使用 swapctl(8) 程序管理交换, 它可以添加、删除、列出以及优先排列交换设备和文件。

14.5.2 - 交换到一个分区

在OpenBSD中, 启动磁盘的 'b' 分区自动设置为默认的交换分区。无需对其进行配置。如果你不希望在启动磁盘上交换, 就不要定义"b"分区。如果你希望在别的分区或磁盘上交换, 你可以在 /etc/fstab 里进行定义, 像这样:

/dev/sd3b none swap sw 0 0  
/dev/sd3d none swap sw 0 0

14.5.3 - 交换到一个文件

(注意: 如果你因为看到了 "virtual memory exhausted"错误想交换到一个文件, 你应该先用 csh的 unlimit(1) 或 sh的 ulimit(1) 放宽对每个程序的限制)

有时, 你最初设想的分区大小有问题, 你不得不增加额外的交换空间, 偶然地紧急情况(as in, "Geez, at the rate it is burning swap, we'll be wedged in five minutes"). 如果你处于这种情况下, 在一个存在的文件系统上添加一块交换空间作为一个文件可以快速地解决。

这个文件不能在一个启用了SoftUpdate的分区上(默认情况下分区的SoftUpdate并未开启)。 开始时, 您可以用swapctl(8) 工具看一下当前有多少交换空间以及您使用了多少。您可以用这样的命令:

$ swapctl -l
Device      512-blocks     Used    Avail Capacity  Priority
swap_device      65520        8    65512     0%    0

这个命令将显示当前使用的交换空间和其统计。上例中仅有一个命名为"swap_device"的设备用于交换, 这是一个在磁盘上预先定义的用于交换的空间。(使用disklabel的查看命令查阅 b 分区)正如上例中您所看到的情况, 此时这个设备并未被充分使用, 但是为了告诉用户如何操作, 我们假设需要额外增加32M的交换空间。

将一个文件设置为交换设备的第一个步骤就是先创建这个文件, 最好的办法是使用 dd(1) 工具创建它。这里有一个例子就是创建一个 /var/swap 文件, 它的大小是32M:

$ sudo dd if=/dev/zero of=/var/swap bs=1k count=32768
32768+0 records in
32768+0 records out
33554432 bytes transferred in 20 secs (1677721 bytes/sec) 

上步完成后, 我们可以开启这个设备的交换功能, 使用如下命令:

$ sudo swapctl -a /var/swap 

现在我们查看一下它是否已经被正确地添加到交换设备的清单里了。

$ swapctl -l
Device      512-blocks     Used    Avail Capacity  Priority
swap_device      65520        8    65512     0%    0
/var/swap        65536        0    65536     0%    0
Total           131056        8   131048     0%  

现在您可以看见这个设备已经设置成功并且已经开始工作了, 您需要在 /etc/fstab 文件内添加一行以便在下次启动后系统配置这个设备。如果您没有添加这行, 下次启动后则系统不会配置这个交换设备

$ cat /etc/fstab
/dev/wd0a / ffs rw 1 1
/var/swap /var/swap swap sw 0 0

(说明:如果您因为得到了"virtual memory exhausted"这样的错误信息而期待交换一个文件, 您应该首先用csh的 unlimit(1) 或 sh的ulimit(1) 来尝试提高预处理的限制。)

尽管定制内核也可以完成这个任务, 但交换到一个文件并非一定需要一个定制构建的内核, 本faq将告诉您如何在这两种情况下怎样增加交换空间。

交换到一个文件。

交换到一个文件是得到额外交换空间的最简单最快速的途径。这个文件不能在一个启用了SoftUpdate的分区上(默认情况下分区的SoftUpdate并未开启)。开始时, 您可以用swapctl(8) 工具看一下当前有多少交换空间以及您使用了多少。您可以用这样的命令:

$ swapctl -l
Device      512-blocks     Used    Avail Capacity  Priority
swap_device      65520        8    65512     0%    0

这个命令将显示当前使用的交换空间和其统计。上例中仅有一个命名为"swap_device"的设备用于交换, 这是一个在磁盘上预先定义的用于交换的空间。(使用disklabel的查看命令查阅 b 分区)正如上例中您所看到的情况, 此时这个设备并未被充分使用, 但是为了告诉用户如何操作, 我们假设需要额外增加32M的交换空间。

将一个文件设置为交换设备的第一个步骤就是先创建这个文件, 最好的办法是使用 dd(1) 工具创建它。这里有一个例子就是创建一个 /var/swap 文件, 它的大小是32M:

$ sudo dd if=/dev/zero of=/var/swap bs=1k count=32768
32768+0 records in
32768+0 records out
33554432 bytes transferred in 20 secs (1677721 bytes/sec)  

上步完成后, 我们可以开启这个设备的交换功能, 使用如下命令:

$ sudo chmod 600 /var/swap
$ sudo swapctl -a /var/swap  

现在我们查看一下它是否已经被正确地添加到交换设备的清单里了。

$ swapctl -l
Device      512-blocks     Used    Avail Capacity  Priority
swap_device      65520        8    65512     0%    0
/var/swap        65536        0    65536     0%    0
Total           131056        8   131048     0%  

现在您可以看见这个设备已经设置成功并且已经开始工作了, 您需要在 /etc/fstab 文件内添加一行以便在下次启动后系统配置这个设备。如果您没有添加这行, 下次启动后则系统不会配置这个交换设备

$ cat /etc/fstab
/dev/wd0a / ffs rw 1 1
/var/swap /var/swap swap sw 0 0 

下面保留的是此FAQ修改前的内容———1..

通过一个vnode设备进行交换

这是增加更多交换空间的更永久性的解决方案。要永久地使用一个文件进行交换, 首先定制一个带有vnd0c做为交换空间的内核。如果您用wd0a作为您的根文件系统。那么wd0b就是以前的交换分区, 将下面的内容应用到内核配置文件上(如果您有什么疑问请参阅编译新内核的相关内容):

config          bsd     root on wd0a swap on wd0b and vnd0c dumps on wd0b 

做完上面这步, 这个用于交换的文件就可以被创建了。您还应该做与上例同样的步骤。

$ sudo dd if=/dev/zero of=/var/swap bs=1k count=32768
32768+0 records in
32768+0 records out
33554432 bytes transferred in 20 secs (1677721 bytes/sec)

现在您的文件已经就位了, 您需要将它加入 /etc/fstab 。 下面是一个范例, 这个设备作为交换随系统启动。

$ cat /etc/fstab
/dev/wd0a / ffs rw 1 1
/dev/vnd0c none swap sw 0 0

这时您的计算机需要重新启动以便应用内核的更改。重新启动后就是就是配置这个设备进行交换了。您要使用vnconfig(8)

$ sudo vnconfig -c -v vnd0 /var/swap
vnd0: 33554432 bytes on /var/swap

现在进行最后一步, 开启此设备的交换功能。我们还和上面的例子一样使用swapctl(8), 接着我们将检查它是否被正确地添加进交换设备列表中了。

$ sudo swapctl -a /dev/vnd0c
$ swapctl -l
Device      512-blocks     Used    Avail Capacity  Priority
swap_device      65520        8    65512     0%    0
/dev/vnd0c       65536        0    65536     0%    0
Total           131056        8   131048     0%  

14.6 - Soft Updates

Soft Update是由 Greg Ganger and Yale Patt 提出的想法, 并由 Kirk McKusick 在FreeBSD上进行了发展。SoftUpdates在buffer cache操作时强制采用一个部分按顺序的方式, 这样就允许从FFS代码中删除对目录项执行同步写操作的请求。因此, 在磁盘写操作时的性能表现有很高的提升。

要在分区上启用soft update功能, 必须在挂载分区使用mount-time选项。当您用 mount(8) 工具挂载分区时, 您可以指定在这个分区上启用soft updates功能。下例中是一个 /etc/fstab(5) 的条目, 我们希望在这个条目中指定一个 sd0a 分区在挂载时启用soft update功能。

/dev/sd0a / ffs rw, softdep 1 1 

注意, 对sparc用户: 不要在sun4 或 sun4c计算机上启用这个功能, 这类构 架仅支持非常有限的内核内存并且无法使用这个功能, 然而soft update在s un4m计算机上工作的很好。

14.7 - OpenBSD/i386如何启动?

OpenBSD/i386的启动过程并非是区区小事, 并且清楚他是如果工作的是 很有用的, 它可以帮助您在系统出现问题时进行排查。这里列出了启动过程 中的四个关键点:

  1. 主引导记录(MBR): 主引导记录是在硬盘上第一个物理 扇区(512 bytes)。它包含了基本分区表和加载分区引导记录(PBR)的一小 段程序代码。这里请注意, 在某些环境中提到的"MBR"是仅指磁盘上第一扇区的代码部分, 而不是包含了第一扇区的全部内容(还包含分区表)。理解"初始化MBR"是十分重要的——在OpenBSD的中这个术语的含义是指重写所有的MBR扇区, 而不是像某些操作系统那样仅仅重新写入程序代码。您很少需要初始化MBR, 相反您可能会在命令行经常用到fdisk(8)的"-u"选项 (例如:"fdisk -u wd0")。

    尽管OpenBSD包含一个MBR, 但是您不一定非要使用它, 因为几乎所有的MBR全可以启动OpenBSD。控制MBR的是 fdisk(8) 工具, 它既可以编辑分区表也可以在磁盘上安装MBR程序代码。

    OpenBSD's MBR会显示如下信息:

    Using drive 0, partition 3
    
    这表明从drive0的partition 3加载PBR。 除了这些明显的信息, 他还在后面显示了一个句号 ("."), 它表示这台 计算机可以使用LBA转换来启动, 如果这台计算机不能使用LBA转换, 上面的句号将会被分号(";")取代, 表明使用CHS转换:
    Using Drive 0, Partition 3; 
    
    注意:这个句号或分号表明这是一个"新"的OpenBSD MBR, 这个特性从OpenBSD 3.5开始引入。
  2. 分区引导记录(PBR): 分区引导记录也称为 PBR 或 biosboot(8) (来自其保存的代码名称), 它是在磁盘上OpenBSD分区的第一个物理扇区, 加载PBR是OpenBSD的 "第一阶段 boot loader"。它是被MBR程序加载的, PBR的任务是加载OpenBSD "boot loader"的第二阶段 boot(8)。和MBR一样, PBR也是一个非常小的区域, 它包含了代码和数据的, 仅有512 bytes。 它不能放入一个文件系统可识别的完整的应用程序, 所以它仅用来定位磁盘上的 /boot目录, 在安装的系统时可被BIOS访问的 /boot目录的位置被编码到PBR代码。

    PBR是被程序 installboot(8) 安装的, 这篇文章后面会对installboot(8)有更详尽的描述, PBR会显示如下信息:

    Loading...
    
    当每一个文件系统拒绝其加载时就会在屏幕上输出一个句号。和MBR一样, PBR 也可以表明它是使用LBA或CHS模式转换, 如果它使用CHS转换加载, 会显示一个 分号:
    Loading;...
    
    3.5以前的版本biosboot(8)显示的信息是 "reading boot..."。
  3. Boot Loader的第二阶段, /boot: /boot被PBR加载, 它的任务是通过计算的BIOS访问OpenBSD的文件系统并定位和加载实际使用的内核。 boot(8)还向内核传递不同的选项和信息。

    boot(8) 是一个交互式的程序, 它被加载后会尝试定位并读取 /etc/boot.conf 文件, 如果这个文件存在(默认安装并不生成这个文件), 除非 /etc/boot.conf 文件有其它指令, 否则boot会执行它的所有命令, 然后给用户一个提示符:

    probing: pc0 com0 com1 apm mem[636k 190M a20=on]
    disk: fd0 hd0+
    >> OpenBSD/i386 BOOT 3.02
    boot>  
    
    它在 "boot>"提示符这里会默认等待用户5秒钟, 以便让用户给它其它指令, 如果用户在超时前未提供指令, 它 才会执行默认操作: 从计算机的第一个磁盘内的root分区加载内核bsd。boot loader的第二阶段是通过BIOS(因为目前OpenBSD的内核尚未加载)探(检)测系统硬件 。上面您可以看见它寻找和发现了一些东西: 这个"hd0" 后面的 '+' 号是BIOS告诉 /boot 这块磁盘可以通过LBA寻 址方式访问。当您执行首次安装时, 您有时可能会看见硬盘 后面有一个'*'——它表示这块硬盘上没有有效的OpenBSD标签。
  4. 内核: /bsd: 启动过程的目标就是将OpenBSD内核 加载进RAM并正确地运行。一旦内核被加载, OpenBSD就可以不用再通过BIOS而直接 访问硬件了。
所以, 最开始的启动过程可能看起来像这样:
Using drive 0, partition 3.                      <- MBR
Loading....                                      <- PBR
probing: pc0 com0 com1 apm mem[636k 190M a20=on] <- /boot
disk: fd0 hd0+
>> OpenBSD/i386 BOOT 3.02
boot>
booting hd0a:/bsd 4464500+838332 [58+204240+181750]=0x56cfd0
entry point at 0x100120
[ using 386464 bytes of bsd ELF symbol table ]
Copyright (c) 1982, 1986, 1989, 1991, 1993       <- Kernel
        The Regents of the University of California.  All rights reserved.
Copyright (c) 1995-2008 OpenBSD.  All rights reserved.  http://www.OpenBSD.org
OpenBSD 4.5 (GENERIC) #1749: Sat Feb 28 14:51:18 MST 2009
    deraadt@i386.openbsd.org:/usr/src/sys/arch/i386/compile/GENERIC
   ...

可能的错误

因为PBR很小, 它的能提供错误信息非常有限, 甚至在某种程度上说晦涩难懂, 多数的 信息像这样: 其它错误信息的详细解释在biosboot(8)用户手册里。

有关 i386 启动过程更详尽的信息, 看:

14.8 - 在OpenBSD中使用大磁盘有哪些问题?

OpenBSD支持 FFS 和 FFS2 (也被称为 UFS 和 UFS2)文件系统。4.3以前版本采用 FFS文件系统, 从4.3版本开始采用FFS2文件系统。在讨论每个文件系统的限制之 前, 我们先看一些更常见的硬件系统的限制。

当然, 文件系统的能力和特定硬件的能力是两回事。一个新的250G的IDE硬盘可能用在一个老的(最大仅识别137G的BIOS)接口上会出问题, 一些非常老式的SCSI适配器在连接新硬盘时会有一些问题, 当您将一块新容量的硬盘接到一台很老的计算机上时, 它的BIOS可能会停止响应。您需要考虑自己硬件的能力。

分区大小和位置的限制

非常遗憾, 在OS被装入内存以后才能完全发挥OS所有的功能, 在此之前启动过 程仅能利用(这也是限制所在)系统的启动只读存储器。

因为这个原因, 全部 /bsd 文件必须位于启动只读存储器可寻址的范围内, 这 意味着在一些老的i386系统上root分区必须完全位于前面的504M, 但是新一些的 计算机可能限制为2G, 8G, 32G, 128G或更多。值得提醒的是许多相对较新支持 128G以上硬盘的计算机实际上也有启动分区必须在前面128G的限制。您可以让这 些系统使用大硬盘, 但是您的驱动分区必须在启动只读存储器所支持的范围内。

注意有可能您在一台旧的486电脑上安装了一个40G的硬盘, 并且将它做为一个大 分区装入OpenBSD, 您觉得自己已经成功地突破了上面所说的限制, 然而, 这些讨厌 的限制可能会神不知鬼不觉地又回到您的身边:

为什么呢?因为当您使用新的 /bsd 文件"覆盖"老文件时, 实际系统并不是在原来的位置上重写了旧文件, 而是将新文件部署在磁盘上的一个新位置, 可能这个位置正好在BIOS支持的504M以外, 重新启动后因为驱动引导器(boot loder)无法找到 /bsd 文件, 所以系统挂起。

要想让OpenBSD启动, 启动引导器(biosboot(8)和i386/amd64中的 /boot文件)和内核(/bsd文件)必须位于启动只读存储器所支持并力所能及的范围内。安全的运行规则很简单:

整个的root分区必须在计算机的BIOS(或启动只读存储器)可寻址的范围内。

一些非i386用户可能会觉得他们不存在此问题, 然而大多数平台全有启动只读存储器对磁盘的某种使用限制。请您自行找出自己平台的这些限制, 尽管这可能有些难度。

这就是为什么您应该在硬盘上建立不同的分区, 而不应该把您的系统安装在一个大分区内。

fsck(8)所需的时间和内存

另一个大文件系统需要考虑的是当系统崩溃或断电后fsck(8)文件系统所需的时间和内存。不要奢望一个120G的硬盘装在仅有32M内存的系统可以在崩溃后成功地进行fsck(8), 一条粗略的准则是如果要成功运行fsck, 每1G磁盘空间至少需要1M内存。虽然这种情况下可以使用交换, 但是系统性能会急剧下降, 除极其特殊的情况外这种性能下降是令人无法忍受的。

如果文件系统容量过大, fsck磁盘的时间就会变成一个问题, 但是您只需fsck那些已被分配用来挂载文件系统的空间, 所以这也是不要将大磁盘所有的空间都分配给系统的另一个原因。保持文件系统以只读方式挂接或不挂接可以让您踢掉电源线后不必fsck它们。

别忘了, 如果您的系统有多块磁盘, 一旦系统崩溃需要同时fsck全部硬盘, 所以这会比fsck单块硬盘需要更多的内存。

当您在1T的硬盘上采用默认的碎片或数据块大小时, 因OpenBSD系统的限制, 需要1G的内存才能运行fsck。大的碎片和(或者或)大的数据块可以减少inodes的数量, 并且允许更大的文件系统。

FFS 和 FFS2

使用FFS时, OpenBSD最大支持的单独文件系统为231-1, 或者说2, 147, 483, 647个扇区, 因为每个扇区是512个字节, 所以这是一个远小于1T的数值。FFS2就可以提供大得多的文件系统, 一般在远没有没有到FFS2文件系统的极限时已经超出了其它系统限制的范围。

启动或安装内核仅支持FFS文件系统, 不支持FFS2, 所以关键的系统分区(/, /usr, /var, /tmp)不应该采用FFS2文件系统, 还有就是可能出现严重维护问题的分区也应避免采用FFS2文件系统(这些分区通常没有理由分配的过大)。基于这个原因, 非常大的分区应该是"非系统"分区, 例如, /home, /var/www/, /bigarray等分区。

升级系统前, 您需要将所有的FFS2分区标记为"noauto", 以避免被安装内核(安装内核不识别FFS2分区)错误处理。

注意并非所有的控制器和驱动都支持大硬盘, 例如, ami(4)仅支持最大2TB的逻辑卷, 还有很多尚未完成测试, 例如, 在写这篇文章时, 还没有大于1TB的IDE或SATA硬盘的驱动可用于测试, 所以我们目前不能说所有事情全不会出问题。

14.9 - 安装引导块-i386/amd64特定

现代版本的OpenBSD(3.5及以后)有一个强劲的启动引导器, 与老版本相比, 磁盘几何对新的启动引导器来说更加无关紧要, 然而, 新启动引导器对 /boot 文件在磁盘上的位置却很敏感。如果您做了什么导致boot(8)移动到一个磁盘上的新位置(实际上是一个新的inode), 您就"破坏"了您的系统——阻碍它正确的引导。为了修复您的引导块以便系统可以正常启动, 您只需将启动软盘放在驱动器内(或启动光盘)并在出现boot提示符时键入"b hd0a:/bsd", 这样可以强制它从第一块硬盘(而不是软盘)启动。您的系统会正常启动的。现在您需要基于/boot文件的位置重新用 installboot(8) 程序安装第一阶段启动引导器(biosboot(8))。

我们的例子假设您的启动磁盘是sd0(IDE硬盘应该是wd0等):

# cd /usr/mdec; ./installboot /boot biosboot sd0

如果需要一个新版本的引导块, 您需要自己编译它们, 很简单:

# cd /sys/arch/i386/stand/
# make && make install
# cd /usr/mdec; cp ./boot /boot
# ./installboot /boot biosboot sd0 (或您自己的设备号)

14.10 - 准备应对灾难:用磁带备份和恢复

介绍:

如果您计划在一台可能被称为生产型服务器的计算机上运行OpenBSD, 在您的硬盘可能出现问题前有某种形式的备份是很明智的。

这个介绍将帮助您使用OpenBSD自带的标准 dump(8)restore(8) 工具进行这项工作, 一个更高级的备份工具被称为 "Amanda", 也可以通过 packages 得到, 它可以将多台服务器备份到一个磁带机上。多数环境下 dump(8)restore(8) 工具已经足够了, 但是如果您需要备份多台服务器, Amanda值得您研究一番。

本例中需要配置的设备包含SCSI硬盘和磁带机。生产环境中更推荐使用SCSI硬盘而非IDE硬盘是因为它们处理坏块的方式不同。这并不是说如果您使用IDE硬盘或其它的磁带机本文档对您就没有用处了, 而是您的设备名称可能会稍微有些差异, 例如在IDE环境中sd0a可能换成wd0a。

备份到磁带:

备份到磁带您需要知道您的文件系统挂载到哪里。您可以在shell提示符下使用 mount(8) 命令来确定您的文件系统是怎样挂载的。您应该获得类似的输出信息:

# mount
/dev/sd0a on / type ffs (local)
/dev/sd0h on /usr type ffs (local) 

本例中, root (/) 文件系统实际位于sd0a, 这说明 / 在0号SCSI硬盘的a分区上。/usr 文件系统位于sd0h, 也就是在0号SCSI硬盘h分区上。

另一个更复杂的挂载表也许是这样的:

# mount
/dev/sd0a on / type ffs (local)
/dev/sd0d on /var type ffs (local)
/dev/sd0e on /home type ffs (local)
/dev/sd0h on /usr type ffs (local)

这个更复杂的例子中, root (/) 文件系统位于sd0a. /var 文件系统位于sd0d, /home 文件系统位于sd0e 还有 /usr 位于 sd0h。

为了备份您的系统您要告诉dump您需要备份分区的名称, 下面的命令是备份上面列出的那个较简单的挂载表中的分区:

# /sbin/dump -0au -f /dev/nrst0 /dev/rsd0a
# /sbin/dump -0au -f /dev/nrst0 /dev/rsd0h
# mt -f /dev/rst0 rewind

对那个比较复杂的挂载表, 您可以使用类似的命令:

# /sbin/dump -0au -f /dev/nrst0 /dev/rsd0a
# /sbin/dump -0au -f /dev/nrst0 /dev/rsd0d
# /sbin/dump -0au -f /dev/nrst0 /dev/rsd0e
# /sbin/dump -0au -f /dev/nrst0 /dev/rsd0h
# mt -f /dev/rst0 rewind

您可以复习一下 dump(8) 的用户手册以精确地掌握每个命令行的作用, 这里简要解释一下上面使用的参数:

最后是备份哪些分区(/dev/rsd0a等)

mt(1) 命令用于设备倒带结束时, 更多的选项请复习mt的用户手册(像弹出)。

如果您不确定您的磁带设备名称, 请使用dmesg定位它。例如磁带设备的条目看起来像这样:

st0 at scsibus0 targ 5 lun 0: <ARCHIVE, Python 28388-XXX, 5.28>

您可能已经注意到了当备份时磁带机用"nrst0"名称替代了dmesg里面我们看到的"st0"的名称。当您用nrst0的名称访问st0时, 您访问的实际上是同一台物理磁带机, 但是等于告诉磁带机不要在工作结束时倒带, 并且是以原始模式进行访问。如果要将多个文件系统备份到单一的磁带上, 您需要确保您使用的是不倒带的设备, 如果您使用的是倒带的设备(rst0)来备份多个文件系统, 早晚后面的备份的文件系统会覆盖前面已经备份的文件系统。您可以在dump的用户手册上发现更详尽的描述。

如果您想写一个叫"backup"的脚本, 它可能看起来像这样:

echo "  Starting Full Backup..."
/sbin/dump -0au -f /dev/nrst0 /dev/rsd0a
/sbin/dump -0au -f /dev/nrst0 /dev/rsd0d
/sbin/dump -0au -f /dev/nrst0 /dev/rsd0e
/sbin/dump -0au -f /dev/nrst0 /dev/rsd0h
echo
echo -n "  Rewinding Drive, Please wait..."
mt -f /dev/rst0 rewind
echo "Done."
echo  

如果您希望夜间定时备份, 可以用 cron(8) 来自动运行您的备份脚本。

同样将每个文件系统需要多大的空间记录下来(写在一张纸上)也是很有用处的。您可以使用 "df -h" 来测定当前正在使用的各个分区占用多少空间, 这在硬盘发生故障或需要在一个新的硬盘上重新创建您的分区表是很方便的。

还原数据还可以帮助您减少磁盘碎片。确保可以备份所有的数据的最好方式是重新启动计算机并进入单用户模式。文件系统不需要挂载就可备份。但重新启动至单用户模式时别忘记用可读/写的方式挂载根分区(/), 否则您的当您的dump尝试写出dumpdate时会失败。当出现boot>提示符时键入"bsd -s"就可以进入单用户模式。

校验一个备份磁带的内容:

当您第一次完成文件系统备份时, 简单测试一下您的磁带以确保您所需备份的数据已经被写入是一个好想法, 您可以用下例给备份磁带上的文件编目录:

# /sbin/restore -tvs 1 -f /dev/rst0

这条命令会列出备份磁带上存储的第一个分区 1 上的文件列表。根据上面的例子, 分区 1 应该是您的 根(/)文件系统。

要查看磁带上第二个分区的内容并输出到一个文件, 您可以使用类似下面的命令:

# /sbin/restore -tvs 2 -f /dev/rst0 > /home/me/list.txt

如果您的挂载表如前所述是一个简单的挂载表, 分区 2 应该是 /usr, 如果您的挂载表更复杂, 分区 2 可能是 /var 或其它的文件系统。这里的系列号取决于该文件系统写入磁带的顺序。

从磁带还原:

当您的硬盘完全损坏了时下面例子中的情况对您会有用处。在这个例子中您想从磁带上还原一个单独的文件, 请复习一下restore的用户手册注意一下交换模式下的指令。

如果您完全准备妥当, 换一个硬盘并还原您备份的数据是一个很快的过程。标准的OpenBSD 安装/启动 软盘已经包含了所需的还原工具, 同时分区和新硬盘启动所需的二进制文件也包含在里面。多数情况下您只需这张软盘和最近的备份磁带就可以将备份数据还原并运行它。

更换掉损坏的硬盘后, 还原系统的基本步骤如下:

14.11 - 在OpenBSD中挂接磁盘镜像文件

在OpenBSD中挂载一个磁盘镜像文件(ISO 镜像, 用dd命令生成的磁盘镜像等)您必须配置一个 vnd(4) 设备。例如, 您的一个ISO镜像文件在 /tmp/ISO.image, 您需要参照如下步骤来挂载。

# vnconfig svnd0 /tmp/ISO.image
# mount -t cd9660 /dev/svnd0c /mnt 

注意, 因为这是一个用于CD和DVD的ISO-9660镜像, 您挂载时必须指定它的类型为cd9660。没错任何镜像类型全需要指定, 例如, 您想挂载一个Linux磁盘镜像文件, 您就需要将它的类型指定为ext2fs

挂载这个镜像文件用如下命令。

# umount /mnt
# vnconfig -u svnd0

更多的信息请参考 vnconfig(8) 的用户手册。

14.12 - 救命! 我遇到了IDE DMA错误!

pciide(4)支持DMA IDE传输, 但pciide(4)在很多硬件组合环境中不可靠, 就在最近那些宣称支持IDE DMA传输的大多数"主流"操作系统默认并没有打开这项功能, 这就是因为不可靠的硬件。现在许多这些计算机使用OpenBSD系统。

OpenBSD尽力尝试使用它能配置的最高的DMA模式。这样做在某些配置条件下可能会导致传输能力恶化, 原因就是有瑕疵的主板芯片组、驱动程序以及(或或者)电缆上的噪声。幸运的是, Ultra-DMA模式通过一个循环冗余校验(CRC)检测数据传输恶化以保证数据传输。当Ultra-DMA的CRC失败时, OpenBSD会打印一条错误信息并再次尝试操作。

wd2a:  aborted command, interface CRC error reading fsbn 64 of 64-79
(wd2 bn 127; cn 0 tn 2 sn 1), retrying  
经过一定次数的失败后, OpenBSD会将传输模式降为一个较慢的(希望更可靠)Ultra-DMA模式。如果已经降为Ultra-DMA模式0了, 则驱动降级为PIO模式。

低质量或损坏的线缆常常会导致UDMA错误。如果您看到许多DMA错误或者比正常情况下低很多的DMA性能那么通常值得怀疑的是线缆出问题了。同样将一个CD-ROM和一个硬盘放在同一个通道内也是一个坏主意。

如果您更换了电缆仍不能解决问题并且通过OpenBSD也不成功地降级, 或者这个过程导致硬盘更卡了, 或者控制台或log文件里有大量的警告信息, 那么您可能希望强制系统使用一个低水平的DMA或系统默认的UDMA模式, 您可以通过使用 UKCconfig(8) 命令修改 wd(4) 设备的标记来完成这一工作。

14.13 - OpenBSD的RAID

RAID(廉价冗余磁盘阵列)提供了一个使用多个磁盘以获得比单一磁盘更好的性能、容量及/或冗余的机会。然而关于RAID的优缺点的完整讨论超出了本文范围。我们仅罗列一些重点:

如果这些事您头一次听说, 这可不是您探索RAID的好起点。

选择软件

OpenBSD包含了RAIDframe, 一个软件RAID解决方案。有关文档可在下列地方找到:

OpenBSD可以通过RIADframe的 "Autoconfiguration" 选项直接为根分区做镜像。

OpenBSD 3.7稳定版或更高的版本也将 ccd(4) 驱动的镜像功能做位一个特性。这个系统特性已经被内置于GENERIC内核中并且在某些平台(amd64, hppa, hppa64, i386)上也包含在bsd.rd内核中, 所以使用它很简单, 尽管就重建阵列来说它还有一定的局限性, 请参阅:

选择硬件

许多OpenBSD平台支持各种各样的硬件RAID产品。每个平台不同, 要找支持的RAID硬件可以看 这里

另一个许多平台可选择的方案就是将许多磁盘绑定在一起作为一块单独的IDE或SCSI硬盘, 然后接入一个标准的IDE或SCSI适配器。这些设备几乎可以运行在所有的支持IDE或SCSI的平台上。

下面列出了一些该类产品的制造商:

(注意:这些仅仅是OpenBSD用户报告的他们正在使用的产品——这并非意味着我们对这些产品有任何认可, 而且这份清单也不详尽。)

非选项

一个在邮件列表中经常被问到的问题是 "OpenBSD支持廉价的IDE 或 SATA RAID 控制器(诸如Highpoint, Promise 或者Adaptec HostRAID chips)吗 ?", 答案是"不支持"。这些卡或者芯片组并非真正的硬件RAID控制器, 而仅仅是通过BIOS协助启动的软件RAID。因为OpenBSD 已经提供了与硬件无关的软件RAID方式, 所以没有必要让OpenBSD的开发人员再为这些卡提供特殊的支持。

几乎所有的板载SATA 或 IDE "RAID" 控制器全是这种基于软件的RAID设计, 通常情况下这些控制器被当作SATA 或 IDE 控制器, 并且在标准的 IDE 驱动程序 (pciide(4))下工作良好, 但是不是像OpenBSD下的硬件RAID控制器那样工作的。

14.14 - 为什么df(1)告诉我磁盘使用率超过100%?

用户有时会吃惊地发现他们的可用磁盘空间是负数或一个文件系统的使用率超过了100%, 就像用 df(1)显示的那样。

当用newfs(8)创建一个新的文件系统时, 占用了一些普通用户不能使用的系统保留空间。当您意外地将数据它拷入该的文件系统时它提供了一定的容错率, 这样可以将您的磁盘碎片保持在最低水平。

默认情况下磁盘还有5%的余量, 所以如果root用户小心地向这个磁盘拷贝数据, 您会发现系统使用了105%的磁盘空间。

如果5%的余量对您来说不合适, 您可以通过 tunefs(8) 命令修改这一数值。

14.15 - 在删除disklabel之后恢复分区

如果您的分区表损坏了, 您可以通过各种途径尝试进行修复。

首先是恐慌, 反正您经常这样, 索性就先恐慌完好了。 只是别作愚蠢的事情, 不要在您的计算机前面恐慌, 然后放松下来, 想想下面这些步骤可否帮助您摆脱困境。

每个磁盘的disklabel的作为日常的系统维护保存在 /var/backups 下, 这里假设您的 /var 分区还在, 您可以简单地阅读一下输出文件, 并将它们放回到disklabel中。

如果您找不到 /var 分区了, 有两个选择:尽量地修复磁盘找回分区, 或者尽量地修复磁盘拷贝出您的数据。根据发生的具体情况做出选择(如果硬盘要坏了优先抢救数据, 如果只是误操作, 您只恢复分区就可以了。)

第一个您需要的工具就是 scan_ffs(8) (注意这里有一个下划线, 不是"scanffs")。scan_ffs(8)将会彻底审查一块磁盘, 并且尝试并寻找分区, 并告诉您它发现的关于这些分区的信息。您可以使用这些信息来重建您的disklabel。如果您只希望 /var 恢复原状, 您只需为 /var 重新建立分区, 然后用备份覆盖它并从备份向分区添加其它的项目。

disklabel(8) 即能更新disklabel使内核可以识别, 也可以将卷标(label)写入磁盘(disk)。所以即使磁盘上有一块区域包含的disklabel不可读, 您也可以 mount(8) 它直到下次启动。

14.16 - 我能访问非FFS文件系统中的数据吗?

是的, 其它的文件系统包含:ext2 (Linux), ISO9660 和 UDF (CD-ROM, DVD 介质), FAT (MS-DOS 和 Windows), NFS, NTFS (Windows), AmigaDOS。它们中一些是有限制的, 例如支持只读。注意不支持FreeBSD的UFS2文件系统。

我们将提供一个怎样在OpenBSD中使用这些文件系统的概览。要使用一个文件系统必须先挂载它。更多关于挂载的选项请参阅 mount(8) 的用户手册和您将要挂载的系统使用的命令, 例如: mount_msdos, mount_ext2fs, ...

首先您需要知道您的文件系统位于哪个设备上, 它可能是您的第一块硬盘, wd0或sd0, 但它也可能没那样明显。所有您系统上被识别和配置的设备全可以用 dmesg(1) 命令输出成:一个设备名称, 后面跟着这个设备的描述。例如我的第一个CD-ROM驱动器被识别如下:

cd0 at scsibus0 targ 0 lun 0: <COMPAQ, DVD-ROM LTD163, GQH3> SCSI0 5/cdrom removable  

将所有有效的磁盘列成一个名称更短的清单, 您可以使用 sysctl(8) 命令

# sysctl hw.disknames
它会显示您系统目前知道的所有磁盘, 例如:
hw.disknames=cd0, cd1, wd0, fd0, cd2 

到这一步, 是搞定在这个设备上有哪些分区以及哪个分区上是您想访问的文件系统的时候了。因此, 我们用 disklabel(8) 检测这个设备。disklabel包含了一个分区的清单, 最多可以有16个分区。分区 c 永远代表整个设备。分区a-b和d-p被OpenBSD使用。分区i-p可以自动被分配成其它操作系统的文件系统, 这个例子中我们将查看我硬盘上的disklabel, 它包含了一系列不同的文件系统。

注意: 在这台计算机上的OpenBSD是在其它操作系统后面安装的, 并且安装disklabel时不但包含了OpenBSD的自己的分区也包含已经在此计算机上安装的其它文件系统。然而如果您先安装了OpenBSD的disklabel, 再安装其它的文件系统, 您需要以后手动添加或更改这些文件系统。这种情况在 这小节 有说明。

# disklabel wd0
# using MBR partition 2: type A6 off 20338290 (0x1365672) size 29318625 (0x1bf5de1)
# /dev/rwd0c:
type: ESDI
disk: ESDI/IDE disk
label: ST340016A       
flags:
bytes/sector: 512
sectors/track: 63
tracks/cylinder: 16
sectors/cylinder: 1008
cylinders: 16383
total sectors: 78165360
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0           # microseconds
track-to-track seek: 0  # microseconds
drivedata: 0 
16 partitions:
#             size        offset  fstype [fsize bsize  cpg]
  a:        408366      20338290  4.2BSD   2048 16384   16 # Cyl 20176*- 20581 
  b:       1638000      20746656    swap                   # Cyl 20582 - 22206 
  c:      78165360             0  unused      0     0      # Cyl     0 - 77544 
  d:       4194288      22384656  4.2BSD   2048 16384   16 # Cyl 22207 - 26367 
  e:        409248      26578944  4.2BSD   2048 16384   16 # Cyl 26368 - 26773 
  f:      10486224      26988192  4.2BSD   2048 16384   16 # Cyl 26774 - 37176 
  g:      12182499      37474416  4.2BSD   2048 16384   16 # Cyl 37177 - 49262*
  i:         64197            63 unknown                   # Cyl     0*-    63*
  j:      20274030         64260 unknown                   # Cyl    63*- 20176*
  k:       1975932      49656978   MSDOS                   # Cyl 49262*- 51223*
  l:       3919797      51632973 unknown                   # Cyl 51223*- 55111*
  m:       2939832      55552833  ext2fs                   # Cyl 55111*- 58028*
  n:       5879727      58492728  ext2fs                   # Cyl 58028*- 63861*
  o:      13783707      64372518  ext2fs                   # Cyl 63861*- 77535*

正如您所见, 上面的输出中首先列出了所有的OpenBSD分区。下面的是一些ext2分区和一个MSDOS分区, 同时还有一些不可识别的分区。在i386和amd64系统上, 您通常可以使用 fdisk(8) 工具看到更多的信息。为了满足那些有好奇心的读者, 我在这里解释一下: 分区 i 是一个电脑商家建立的维护分区, 分区 j 是一个NTFS分区, 而分区 l 是Linux的交换分区。

一旦您检测到您要使用的是哪一个分区, 您就可以进行最后一个步骤了:挂载包含这些您想访问的文件系统的分区。标准的GENERIC内核支持多数文件系统:您只需看一下内核配置文件, 它位于 /usr/src/sys/arch/<arch>/conf 目录。然而, 有些文件系统则不然, 例如对NTFS的支持是实验性的, 所以未包含在标准的内核GENERIC里。如果您想使用未被GENERIC支持的文件系统, 您需要构建一个定制的内核

当我们获得了如上所述的所需信息后, 现在是挂载文件系统的时间了。我们假设存在一个目录 /mnt/otherfs , 我们将把它作为一个挂载点来挂载所需的文件系统。在这个例子中我们将挂载位于分区 m 的ext2文件系统:

# mount -t ext2fs /dev/wd0m /mnt/others

如果您要经常使用这个文件系统, 您可以在 /etc/fstab 里加入一行以便节省您一些时间, 例如像这样:

/dev/wd0m /mnt/otherfs ext2fs rw, noauto, nodev, nosuid 0 0 

注意上面第五和第六小段上的0, 它们意味着我们不需要openBSD来dump和用fsck检查这个文件系统。通常情况下, 这些操作您希望由该文件系统的宿主操作系统来处理。

14.16.1 - 我的disklabel里没有那个分区!我应该怎么办?

如果您在OpenBSD安装后在您爹系统上安装了其它的文件系统(这中情况经常是增加了一个新操作系统), disklabel将维持现状, 它并不会自动升级去包含新的文件系统分区。如果您想使用这些新的文件系统, 您需要用 disklabel(8) 手动添加更改这些分区。

作为例子, 我们手动更改一个已经存在的ext2分区:我们使用Linux的fdisk程序把分区'o'(请参看上面的disklabel输出)的大小减少为1G, 我们可以很容易地知道它的起始位置(offset:64372518)和大小(13783707)。注意这些数值是扇区编号, 而且使用扇区编号(而非M或其它测量单位)是读取这些信息更精确和最安全的途径。

改变之前, 我们先用OpenBSD的 fdisk(8) 工具查看一下这个分区, 结果像这样(此处仅提供与该分区有关的输出):

# fdisk wd0
. . .
Offset: 64372455        Signature: 0xAA55
         Starting       Ending       LBA Info:
 #: id    C   H  S -    C   H  S [       start:      size   ]
------------------------------------------------------------------------
 0: 83 4007   1  1 - 4864 254 63 [    64372518:    13783707 ] Linux files*
. . .
如您所见, 这个分区的起始位置和大小是正确的, 正好与disklabel先前探测的一样。(不要对偏移地址("Offset")的确切含义感到迷惑:它也是用来指出这个包含了ext2分区的扩展分区的起始位置的。)

从Linux改变了分区的大小后, 看起来像这样:

# fdisk wd0
. . .
Offset: 64372455        Signature: 0xAA55
         Starting       Ending       LBA Info:
 #: id    C   H  S -    C   H  S [       start:      size   ]
------------------------------------------------------------------------
 0: 83 4007   1  1 - 4137 254 63 [    64372518:     2104452 ] Linux files*
. . .  

现在需要用disklabel(8)进行更改。例如, 您可以运行命令disklabel -e wd0, 它将调用一个被EDITOR环境变量指定的编辑器(默认情况下是vi)。在编辑器中更改disklabel的

最后一行来匹配新的分区大小:

  o:       2104452      64372518  ext2fs  
结束后将disklabel保存在磁盘上。现在disklabel又被更新了, 您有可以像以前一样的挂载所需分区了。

如果您是添加了一个新分区, 调整步骤与此类似。

14.17 - 我能在OpenBSD中使用闪存吗?

14.17.1 - 将闪存当成一个便携的设备

一般情况下, 您将闪存插入计算机后它应该被识别出来, 很快内核就会在控制台上输出一系列信息。例如, 我插上我的USB闪存设备, 在我的控制台上就看见了如下显示:

umass0 at uhub1 port 1 configuration 1 interface 0
umass0: LEXR PLUG DRIVE LEXR PLUG DRIVE, rev 1.10/0.01, addr 2
umass0: using SCSI over Bulk-Only
scsibus2 at umass0: 2 targets
sd0 at scsibus2 targ 1 lun 0: <LEXAR, DIGITAL FILM, /W1.> SCSI2 0/direct removable
sd0: 123MB, 123 cyl, 64 head, 32 sec, 512 bytes/sec, 251904 sec total

这些信息说明 umass(4) (USB mass storage)驱动被加载到闪存设备上, 并且它使用的是SCSI系统。最后两行是很重要的:它们说明了闪存设备被加载到哪个设备节点上, 以及所有的储存容量是多少。如果您不知何故没有这些行, 您以后还能用 dmesg(1) 命令看到它们。这个报告的中CHS磁盘几何模式是虚构的, 因为闪存一般被系统当作常规的SCSI磁盘。

我们将讨论下面两种情形。

这是一个新或者空的设备并且它仅在OpenBSD下使用

您需要在闪存上初始化一个disklabel, 并至少建立一个分区。请阅读 使用OpenBSD的disklabeldisklabel(8) 的用户手册疑惑的更详尽的信息。

这个例子中, 我仅创建一个分区 a , 并置入FFS文件系统:

# newfs sd0a
Warning: inode blocks/cyl group (125) >= data blocks (62) in last
    cylinder group. This implies 1984 sector(s) cannot be allocated.
/dev/rsd0a:     249856 sectors in 122 cylinders of 64 tracks, 32 sectors
        122.0MB in 1 cyl groups (122 c/g, 122.00MB/g, 15488 i/g)
super-block backups (for fsck -b #) at:
 32, 
我们将在闪存上创建的 a 分区挂载到 /mnt/flashmem 。如果这个挂载点不存在请先创建它。
# mkdir /mnt/flashmem
# mount /dev/sd0a /mnt/flashmem 

这是别人的闪存盘, 您只是用它来交换数据

很有可能那个人不使用OpenBSD, 所以闪存盘上是其它的文件系统。所以我们要先确定闪存盘上采用的是哪种分区, 就像 FAQ 14 - 其它文件系统 描述的那样。

# disklabel sd0
# /dev/rsd0c:
type: SCSI
disk: SCSI disk
label: DIGITAL FILM    
flags:
bytes/sector: 512
sectors/track: 32
tracks/cylinder: 64
sectors/cylinder: 2048
cylinders: 123
total sectors: 251904
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0           # microseconds
track-to-track seek: 0  # microseconds
drivedata: 0 
16 partitions:
#             size        offset  fstype [fsize bsize  cpg]
  c:        251904             0  unused      0     0      # Cyl     0 -   122 
  i:        250592            32   MSDOS                   # Cyl     0*-   122*  
如您所见的上面disklabel的输出, 只有一个分区 i, 包含了一个Windows计算机上创建的FAT文件系统。通常 c 分区表示所有的磁盘空间。

我们将这个 i 分区的文件系统挂载到 /mnt/flashmem.

# mount -t msdos /dev/sd0i /mnt/flashmem
现在您就可以像其它磁盘一样的使用它了。

警告: 您应该永远在拔掉闪存盘unmount这个文件系统。如果您不这样做, 这个文件系统会处在一个混乱的状态, 这种状态可能会导致数据损坏。

从您的计算机上拔掉闪存盘。内核同样会在控制台上输出提示信息:

umass0: at uhub1 port 1 (addr 2) disconnected
sd0 detached
scsibus2 detached
umass0 detached

14.17.2 - 闪存盘做为可启动存储

闪存盘同样可以做为各种形式的OpenBSD的启动盘。您可以把它当作USB设备(如果您的计算机支持从USB闪存盘启动, 并非所有的计算机全能这样。), 或把它当作Non-USB设备(例如像CF)带一个IDE或SATA适配器。(Non-USB设备连接一个USB适配器会被当作USB设备)。某些情况下您可以同时用两种方式使用闪存盘(从USB适配器上引导, 但在IDE适配器上使用它)。

闪存盘连接到USB接口将会被视为是一个 sd(4) 的类SCSI设备。当它连接到IDE适配器上会被当作一个 wd(4) 设备。

当闪存盘连接到IDE适配器上时, 它可以从任何支持IDE启动的系统上启动。从某种程度上说系统将这个闪存盘看作一个IDE磁盘。您只需简单地进行一下硬件设置, 就可以像通常情况下一样将OpenBSD安装在闪存盘上。

从USB设备启动, 您的系统必须没有其它硬件干扰并具备从USB设备启动的能力。注意如果您打算制作一个便携的可启动USB设备, 这个USB设备会被当成是SCSI磁盘, 通常是sd0, 然而如果您的系统上已经有了类SCSI设备, 他可能是一个不同的标识符, 这将使在不同的系统上使用这个闪存盘变得很复杂, 因为您不得不更新/etc/fstab。

一些说明:

14.17.3 - 我怎样制作一个可启动的"Live" USB设备?

如果不把OpenBSD安装在机器上的硬盘上,你可以很简单地制作出一个可启动的USB闪存(或其它!)驱动器,将其作为一个"live"的OpenBSD系统。 当然, 你的计算机必须支持从USB设备启动, 但初始化引导实际上可以在任何带有usb接口的机器上完成。

你要这样做有几个理由:

制作这样一个"live OpenBSD drive" 很简单。 没了!

安装后你需要做几件事以便更加完善:

14.18 - 优化磁盘性能

磁盘性能是衡量计算机整体速度的重要因素, 当计算机处于多用户使用环境时(所有类型的用户、从可以交互式登录的用户到使用文件或web服务器的一般用户)磁盘性能变得越来越重要, 存储数据需要持续的关注, 尤其是您的硬盘空间不足或磁盘快要坏掉时。OpenBSD提供几种方案来提升您的磁盘速度和容错能力。

14.18.1 - Soft updates

另一个可以提升您系统速度的工具是softupdates。在传统的BSD文件系统中一个最慢的操作就是更新metainfo(它发生在当您创建或删除文件或目录时)。Softupdates 尝试在内存中更新metainfo, 而不是每一个及所有的metainfo全在硬盘上更新。Soft updates的另一个作用是让磁盘上的metainfo永远保持完整, 尽管有时候metainfo没有及时更新, 因此, 当系统崩溃时不需要启动后进行 fsck(8) , 而仅是一个后台版本的fsck在内存中更新metainfo(按softupdates的方式)。这意味着一台服务器的启动将快很多, 因为您不必等fsck!(OpenBSD还没有这个特性), 您可以到 Softupdates FAQ 上了解更多有关Softupdates的细节。

14.18.2 - namei() cache的大小

name-to-inode 转换(也被称为 namei())缓存用来控制到 inode(5) 的路径名的转换速度。大的namei()缓存值会被诸如 systat(1) 这样的工具忽略, 一个获得缓存值的合理方式是用sysctl(8)检查系统当前计算的数值(sysctl(8)调用参数"kern.maxvnodes"), 然后增加这个数值直到namei()缓存的命中率提高或者确定继续增加namei()缓存对系统已无本质性的作用时。这个数值被确定后, 您可以通过 sysctl.conf(5) 设定它随系统启动。

14.19 - 为什么不用异步挂载?

问题: "我用"mount -u -o async /", 想使用我的一个package(我用它来不停地touch几百次)。 为什么不允许异步挂载或将异步挂载设定成默认值呢(因为其它的unixen就是这样的)? 它是不是更简单, 因此, 是一个提升某些应用程序性能的更安全的方式?"

回答: "异步挂载确实比同步挂载快, 但是它同时降低了安全性。如果断电了会发生什么? 或者一个硬件出问题了? 不能因为追求速度牺牲系统的稳定性和可靠性。请查阅 mount(8) 的用户手册。"

             async   所有的文件系统输入输出全采用异方式。这是一个危险的设置, 因为它不能确保磁盘上文件系统结构的一致性, 您不应该使用这
                     个设置, 除非您准备重新安装您的文件系统或您的系统崩溃了。
                     这个设定一般用于加速restore(8), 它的速度可以提升为原来的
                     两倍。

另一方面, 如果您在处理那些临时数据, 例如可以在系统崩溃后从头再来的, 您可以设置让这些数据使用单独的异步挂载分区以获得速度, 再强调一次, 这样做 仅在如果 发生了什么问题后您不在意这个异步挂载分区的全部数据丢失时才可行。基于此原因, mfs(8) 分区是采用异步挂载的, 因为反正它们在重新启动后会被擦除和重新建立。

[索引] [第十三章 - 多媒体] [第十五章 - Packages 和 Ports]


[back] www@openbsd.org
$OpenBSD: faq14.html, v 1.183 2010/11/01 88:88:88 1.. Exp $