--------------------------------------------------------------------------------
目录
14.1 - 使用OpenBSD的disklabel(8)
14.2 - 使用OpenBSD的fdisk(8)
14.3 - 在OpenBSD中增加磁盘
14.4 - 如何处理交换
14.5 - Soft Updates
14.6 - OpenBSD/i386如何启动?
14.7 - 在OpenBSD中使用大磁盘有哪些问题?
14.8 - 安装引导块-i386/amd64特定
14.9 - 准备应对灾难:用磁带备份和恢复
14.10 - 在OpenBSD中挂接磁盘镜像文件
14.11 - 帮帮忙! 我遇到了IDE DMA错误!
14.13 - OpenBSD的RAID
14.14 - 为什么df(1)告诉我磁盘使用率超过100%?
14.15 - 在删除disklabel之后恢复分区
14.16 - 我能访问非FFS文件系统中的数据吗?
14.16.1 - 我的disklabel里没有那个分区! 我应该怎么办?
14.17 - 我能在OpenBSD中使用闪存吗?
14.18 - 优化磁盘性能
14.19 - 为什么不用异步挂载?
--------------------------------------------------------------------------------
14.1 - 使用OpenBSD的disklabel(8)
什么是disklabel(8)?
首先, 请先阅读 disklabel(8) 用户手册。
在不同平台上进行OpenBSD分区细节上稍有差异。对i386, amd64, macppc, zaurus 和 armish 来说, 磁盘分区分为两个步骤, 首先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 的技巧和提示
获得帮助: 在disklabel命令行模式下, 键入"?" 将显示一个可用命令清单, "M"会显示disklabel的用户手册。
重新设定成默认值: 在一些情况下, 您可能希望重新进行分区并删除所有的现存分区。 "D" 命令可以帮助您将磁盘label成最初的状态, 就好像硬盘上从未存在过分区。
复制磁盘分区: 有时候您希望将一块磁盘上的分区复制到另一块磁盘上, 但并非正合适(例如您想让两块不同大小的磁盘都有一个同样的分区)。使用disklabel(8)的 "-e" (全屏幕编辑器)模式来获得源硬盘上的分区, 然后将其粘贴到新硬盘上, 删除新硬盘上的源硬盘的'c'分区, 保存, 这样您就在不改变新硬盘基本参数的情况下复制了源硬盘的磁盘布局。
(sparc/sparc64) 不要把swap放在磁盘非常靠近开始的位置上。
(i386, amd64) 不要使用第一条磁道: 在一些平台上, 一条准则就是您使用disklabel(8)和fdisk(8)时不应该占用第一条逻辑磁道。 这条准则有时会和另一条准则"分区从第63号扇区开始"相矛盾, 但是后者仅在您的硬盘每磁道包含63个扇区的情况下才正确(译者注:扇区编号从0开始)。您不要假设硬盘每条磁道就是包含63个扇区, 这并非永远正确, disklabel会告诉您每条磁道包含的扇区数量。许多其它的平台允许OpenBSD的分区从0扇区开始。
硬盘没有disklabel: 如果一块硬盘上目前没有一个OpenBSD的分区, 但有一个其它的文件系统(例如, 磁盘上预先有一个FAT32的文件系统), OpenBSD内核会先在内存中"创建"一个, 这个在内存中"创建"的OpenBSD分区是硬盘上正式的OpenBSD分区的基础, 但是如果先在硬盘上创建并保存了一个OpenBSD分区, 然后再添加一个非OpenBSD操作系统, 这时这个OpenBSD分区不会自动更新, 如果您想要在这台计算机可以访问新的操作系统您必须自己调整。 更详尽的信息请参阅下面。
"q" 与 "x": 因为历史原因, 当您使用disklabel的命令行模式时, "q" 是保存更改并退出disklabel程序, 而 "x" 则是不保存更改的内容仅退出disklabel程序。但是至今仍有很多人使用时混淆这两个含义相反的命令。尽管使用 "x" 会快速安静地退出, 但是如果您使用"q" 命令时, disklabel(8)在保存前会有一个警告信息。
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
上例中我们只是查看了信息, 怎样编辑分区表呢? 要编辑分区表我们要使用 -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 选项后的可用命令列表。
help 显示交互模式下可以使用的fdisk命令。
reinit 初始化选择的硬盘, 内存中的启动块。这是将整个磁盘分配给OpenBSD分区的快捷的方法, 更新启动代码, 让系统为安装OpenBSD做好准备(仅仅是为OpenBSD)。
disk 显示fdisk探测的磁盘几何。如果您需要您可以修改它。
setpid 更改分区表中的分区标识符。当您想重新分配现有的OpenBSD系统分区时此命令是特别有用。
edit 在内存中编辑当前启动块中给定表项的副本。您既可以编辑BISO几何模式, 也可以编辑扇区的偏移量和大小。
flag 指定启动分区。仅可指定一个启动分区。如果您想指定一个扩展分区为启动分区, 您需要指定它为启动分区。(OpenBSD仅能从基本分区启动, 但是您可以把任何分区设定为启动分区。)
update 在内存中当前选择启动块拷贝里更新机器代码。
select 选择当前启动块中的扩展分区表项目指向的启动块并载入内存。
swap 交换两个MBR项目, 这样您可以重新排列MBR。
print 将选择的当前启动块和它的主引导记录在内存中的拷贝打印到终端上。
write 将启动块在内存中的拷贝写入磁盘。执行此操作时会要求您进行确认。
exit 退出当前fdisk操作层, 无论是退到先前选择的启动块在内存中的拷贝或没有选择直接退出程序, 不保存修改结果。
quit 退出当前fdisk操作层, 无论是退到先前选择的启动块在内存中的拷贝或没有选择直接退出程序, 保存修改结果。
abort 退出程序, 不保存当前更改。
fdisk 技巧和提示
fdisk(8) 提供编辑分区的功能, 无论是原始扇区还是柱面/头/扇区的格式。提供这两个选择是为了同一个目的——有些工作用其中一种方式更容易, 而另一些则需用另一种方式。别在一棵树上吊死。
一块完全空白的磁盘需要在上面写入主引导记录的启动代码才能启动, 您可以用 "reinit" 或者 "update"选项来完成这个工作。如果不成功, 即使没有一块可启动磁盘, 您也可以用fdisk写入一个有效的分区表。无论什么原因, 如果您无法确认原始的启动代码是否有效, 您都可以更新它。
如果您的系统有"维护"或"诊断"分区, 我们建议您保留它(们), 或者在安装OpenBSD之前创建它(们)。
因为历史原因, "q" 保存更改并退出disklabel程序, 而 "x" 则是不保存更改的内容仅退出disklabel程序。但是至今仍有很多人使用时混淆这两个含义相反的命令。在您保存更改前fdisk(8)不会警告, 所以请谨慎使用。
14.3 - 在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
上面已经进行很多操作了, 但是没结束, 最后, 您还需要用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.4 - 如何处理交换
14.4.1 - 关于交换
以前有各种矛盾的规则告诉计算机管理员应该给他们的计算机配置多大的分区。可问题是一般情况下只有少量的"通用" 应用程序。
很多类型的系统甚至不需要交换, 例如, 正常运行的防火墙就不需要交换。带有flash存储的计算机通常不需要交换。尽管在很多情况下分配分配一个不大的交换分区对系统并没有损害, 但是如果你的防火墙是基于flash的, 你会受益(稍微)于不指派一个交换分区; 很多磁盘有足够的空间指派一个小的交换分区。
有各种有关优化交换分区的技巧 (在磁盘的什么位置上, 设置在单独的磁盘上等。), 但是当你发现你在优化交换遇到问题时, 也许你只是需要更多的内存。通常情况下, 最优化的交换方式是不设置它。
在OpenBSD中使用 swapctl(8) 程序管理交换, 它可以添加、删除、列出以及优先排列交换设备和文件。
14.4.2 - 交换到一个分区
在OpenBSD中, 启动磁盘的 'b' 分区自动设置为默认的交换分区。无需对其进行配置。如果你不希望在启动磁盘上交换, 就不要定义"b"分区。如果你希望在别的分区或磁盘上交换, 你可以在 /etc/fstab 里进行定义, 像这样:
代码: 全选
/dev/sd3b none swap sw 0 0 /dev/sd3d none swap sw 0 0
(注意: 如果你因为看到了 "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.5 - 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.6 - OpenBSD/i386如何启动?
OpenBSD/i386的启动过程并非是区区小事, 并且清楚他是如果工作的是很有用的, 它可以帮助您在系统出现问题时进行排查。这里列出了启动过程中的四个关键点:
主引导记录(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开始引入。
分区引导记录(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..."。
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的内核尚未加载)探(检)测系统硬件 。上面您可以看见它寻找和发现了一些东西:
pc0 - 代表i386系统的标准的键盘和视频显示。
com0, com1 - 两个串口。
apm - BIOS高级电源管理功能。
636k 190M - BIOS发现的常规内存数量(636K)和扩展内存数量 (190M)。(译者注:关于常规内存和扩展内存看这里。)
fd0 hd0+ - BIOS发现的磁盘设备, 本例中, 一个软盘驱动器和 一个硬盘。
这个"hd0" 后面的 '+' 号是BIOS告诉 /boot 这块磁盘可以通过LBA寻 址方式访问。当您执行首次安装时, 您有时可能会看见硬盘 后面有一个'*'——它表示这块硬盘上没有有效的OpenBSD标签。
内核: /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. [URL]http://www.OpenBSD.org[/URL]
OpenBSD 4.5 (GENERIC) #1749: Sat Feb 28 14:51:18 MST 2009
[EMAIL="[email protected]:/usr/src/sys/arch/i386/compile/GENERIC"][email protected]:/usr/src/sys/arch/i386/compile/GENERIC[/EMAIL]
...
可能的错误
损坏的/无效的/不兼容的 MBR: 通常, 一个用过的硬盘上有某种MBR代码, 但是如果是新硬盘或者从一个不同平台移过来的硬盘, 还有就是您在安装过程中回答"Use entire disk?"这个问题时没有选择"Yes", 以上这些硬盘可能没有有效的MBR, 这种情况下即使这些硬盘的分区表是有效的也无法启动。
您可以使用fdisk程序在您的硬盘上安装OpenBSD的MBR。用您的安装介质启动, 选择 "Shell"得到一个命令行提示符:
代码: 全选
# fdisk -u wd0
您也可以用fdisk给硬盘安装一个指定的MBR:
代码: 全选
# fdisk -u -f /usr/mdec/mbr wd0
这个命令将把 /usr/mdec/mbr 文件安装为您系统的MBR。这个特定的文件在标准安装中作为OpenBSD的标准MBR内嵌于fdisk, 但是您也可以在这里指定任何其它的MBR。
PBR内 /boot 位置无效的: 当installboot(8)安装分区引导记录时, 它将 /boot 的inode的区块号和偏移量写入PBR, 因此, 删除后更换 /boot 而没有重新运行installboot(8) 将会导致您的系统无法启动, 因为PBR会从已经写入的inode的指定位置进行引导, 而此时这个位置已经不再是启动第二阶段 boot loader的所在位置了! 因为 /boot 是通过BIOS调用被读取, 所以旧版本(OpenBSD 3.5以前版本的)的PBR对BIOS的磁盘转换模式很敏感, 如果您改变了磁盘的几何(例如将磁盘从一台使用CHS转换的计算机上移到一台使用LBA转换的计算机上, 或者甚至是在您的BIOS上更改了转换方式), 看起来似乎BIOS到了一个不同的位置(实际是原先的数据移动到不同的数字块上了), 所以您必须先运行 installboot(8)系统才可能重新启动。新(OpenBSD3.5及以后)版本的PBR对转换模式的改变要宽容得多。
因为PBR很小, 它的能提供错误信息非常有限, 甚至在某种程度上说晦涩难懂, 多数的信息像这样:
ERR R -- 当BIOS尝试读取磁盘上的一个数据块时返回的错误信息, 通常情况下这个信息是告诉您:您的磁盘不可读。
ERR M -- 从第二阶段boot loader的头文件里读到了一个无效的 magic(5)数字, 通常这条信息的意思是:BIOS读取的位置并非/boot, 通常意味着没有正确运行installboot(8), 还有可能就是 /boot 文件被改变了, 或者您的BIOS不能读取一块大硬盘。
其它错误信息的详细解释在biosboot(8)用户手册里。
有关 i386 启动过程更详尽的信息, 看:
boot_i386(8)
http://www.ata-atapi.com/hiw.htm Hale Landis' "How it Works" documents.
14.7 - 在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, 您觉得自己已经成功地突破了上面所说的限制, 然而, 这些讨厌的限制可能会神不知鬼不觉地又回到您的身边:
您将系统安装在一个40G的 / 分区上。它看起来工作很正常, 因为基本的OS和其所有文件(包含 /bsd)全在分区最前面的504M范围内。
您使用这个系统, 最终系统所包含的文件总大小超过了504M。
您升级系统, 构建自己的内核, 不管怎样您要拷贝新 /bsd 覆盖旧的。
您重新启动。
您在启动时看到了一个诸如"ERR M"或其它问题的信息。
为什么呢?因为当您使用新的 /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.8 - 安装引导块-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.9 - 准备应对灾难:用磁带备份和恢复
介绍:
如果您计划在一台可能被称为生产型服务器的计算机上运行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) 的用户手册以精确地掌握每个命令行的作用, 这里简要解释一下上面使用的参数:
0 - 执行一个0级dump, 获得所有。
a - 尝试自动检测磁带长度。
u - 更新文件 /etc/dumpdates 到最后一次执行备份时指定的位置。
f - 使用哪种磁带设备 (本例中是 /dev/nrst0 )
最后是备份哪些分区(/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 安装/启动 软盘已经包含了所需的还原工具, 同时分区和新硬盘启动所需的二进制文件也包含在里面。多数情况下您只需这张软盘和最近的备份磁带就可以将备份数据还原并运行它。
更换掉损坏的硬盘后, 还原系统的基本步骤如下:
从安装软盘启动, 在菜单处选择shell。设置好写保护并将您最近的备份磁带插入磁带机内。
使用fdisk(8) 命令在新硬盘上创建一个基本的OpenBSD分区。例如:
代码: 全选
# fdisk -e sd0
更多信息请参看fdisk FAQ。
用disklabel命令在您刚用fdisk创建的OpenBSD基本分区上创建OpenBSD分区表, 例如:
代码: 全选
# disklabel -E sd0
(别忘了交换分区swap, 更详尽的信息请参看disklabel FAQ)
用newfs命令在您上步刚创建的各个OpenBSD分区上建立干净的文件系统, 例如:
代码: 全选
# newfs /dev/rsd0a
# newfs /dev/rsd0h
将刚准备好的根(/)文件系统挂载到 /mnt, 例如:
代码: 全选
# mount /dev/sd0a /mnt
进入您挂载的那个根文件系统, 然后开始还原。例如:
代码: 全选
# cd /mnt
# restore -rs 1 -f /dev/rst0
用下面的命令将MBR写入新硬盘使其可启动, 例如:
代码: 全选
# fdisk -i sd0
除了向硬盘写入一个新的MBR, 您还要安装启动块以便它可以启动, 下面是一个简单的例子:
代码: 全选
# cp /usr/mdec/boot /mnt/boot
# /usr/mdec/installboot -v /mnt/boot /usr/mdec/biosboot sd0
您硬盘的新根文件系统已经准备好了, 接下来您可以用它启动并继续还原剩下的文件系统, 因为此时您的操作系统不完整, 所以您需要进入单用户模式来还原。在shell提示符下运行如下命令, 卸掉挂载的文件系统并停止系统运行:
代码: 全选
# umount /mnt
# halt
取出安装软盘并重新启动计算机, 在 boot> 提示符下, 运行如下命令:
代码: 全选
boot> bsd -s
bsd -s命令会使计算机进入单用户模式, 此模式仅需要根(/)文件系统。
我们假设您上面的操作步骤全正确无误, 并且没有出现其它问题, 您现在应该看加一个让您输入shell或键入return的提示, 您只需回车使用sh。接下来您用可读写模式(而非仅是只读模式)挂载根分区。运行下面的命令:
代码: 全选
# mount -u -w /
一旦您用可读写模式挂载了根分区, 就可以继续还原剩下的文件系统了。例如: (简单的挂载表)
代码: 全选
# mount /dev/sd0h /usr; cd /usr; restore -rs 2 -f /dev/rst0
(复杂的挂载表)
代码: 全选
# mount /dev/sd0d /var; cd /var; restore -rs 2 -f /dev/rst0
# mount /dev/sd0e /home; cd /home; restore -rs 3 -f /dev/rst0
# mount /dev/sd0h /usr; cd /usr; restore -rs 4 -f /dev/rst0
您可以使用 "restore rvsf" 替代仅有 rsf 的选项以便在还原过程中查看从备份设备中提取的文件名称。
最后当您将所有的文件系统恢复到硬盘后, 重新启动至多用户模式。如果一切顺利您的系统将恢复到您最近的磁带备份时的状态, 又可以使用了。
14.10 - 在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.11 - 帮帮忙! 我遇到了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模式, 您可以通过使用 UKC 或 config(8) 命令修改 wd(4) 设备的标记来完成这一工作。
14.13 - OpenBSD的RAID
RAID(廉价冗余磁盘阵列)提供了一个使用多个磁盘以获得比单一磁盘更好的性能、容量及/或冗余的机会。然而关于RAID的优缺点的完整讨论超出了本文范围。我们仅罗列一些重点:
RAID和备份毫无关系。
RAID并不会消除停机时间。
如果这些事您头一次听说, 这可不是您探索RAID的好起点。
选择软件
OpenBSD包含了RAIDframe, 一个软件RAID解决方案。有关文档可在下列地方找到:
Disk Optimization, RAID
RAIDframe Homepage
man page for raidctl(8)
man page for raid(4)
OpenBSD可以通过RIADframe的 "Autoconfiguration" 选项直接为根分区做镜像。
OpenBSD 3.7稳定版或更高的版本也将 ccd(4) 驱动的镜像功能做位一个特性。这个系统特性已经被内置于GENERIC内核中并且在某些平台(amd64, hppa, hppa64, i386)上也包含在bsd.rd内核中, 所以使用它很简单, 尽管就重建阵列来说它还有一定的局限性, 请参阅:
ccd(4) man page
ccdconfig(8) man page
选择硬件
许多OpenBSD平台支持各种各样的硬件RAID产品。每个平台不同, 要找支持的RAID硬件可以看 这里。
另一个许多平台可选择的方案就是将许多磁盘绑定在一起作为一块单独的IDE或SCSI硬盘, 然后接入一个标准的IDE或SCSI适配器。这些设备几乎可以运行在所有的支持IDE或SCSI的平台上。
下面列出了一些该类产品的制造商:
Arco
Accusys
Maxtronic
Infortrend
(注意:这些仅仅是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*
. . .
从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的disklabel 和 disklabel(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。
一些说明:
速度: 通常情况下, 闪存设备比硬盘慢很多, 特别是对其进行写操作时。使用 soft updates 将会有很大改善, 因为将使用mount的"noatime"选项。
"写疲劳": 已经有很多关于单独的闪存单元损坏前可重写次数的报道。实际上, 闪存盘损坏有很多可能性, 写疲劳恰恰是其中之一。现代的闪存设备需要校验写入的数据, 一旦出现写入坏快, 将自动将坏快的地址重映射到剩余的好的扇区。用户使用的多数闪存设备不必担心"写疲劳"。如果您没有使用一些"聪明的"花招来避免对闪存进行写操作, 而是像正常情况下那样读写, 您会发现您的停机时间会更多。
可靠性: 因为闪存盘没有运动部件以致很多人假设它理所应当地比硬盘更稳定。那些认为从使用硬盘转到使用闪存盘数据就可以避免数据丢失和磁盘损坏的想法可能是很不明智的。根据用户的报告闪存盘存在相当大的质量差异, 所以相对传统硬盘来说闪存盘仅具有安静、低功耗等特性, 但并非是一个永远用不坏的储存介质。
制作一个可启动的USB闪存盘: 尽管只能在支持USB启动的计算机使用USB闪存盘来启动系统, 但是您可以在任何支持USB设备的计算机上制作您的可启动USB闪存盘。当然, 可启动USB闪存盘制作完成后仅能在支持USB启动的计算机上进行测试。
从IDE接口到USB接口: 因为闪存盘可以通过IDE或USB两种适配器进行读写操作, 您可以使用闪存盘通过IDE适配器启动一台计算机, 也可以在另一台计算机上通过USB接口维护这个闪存盘。(或反之)
OpenBSD与其它OS的分区共享一个闪存盘: OpenBSD将闪存盘视为普通的磁盘, 所以您可以用 fdisk(8) 对一个闪存盘进行分区, 就像您在任何硬盘上一样。您可以将OpenBSD的文件系统放在一个分区上, 其余的分区则留给其他的文件系统, 例如, FAT32。然而并非所有的OS全将闪存盘视为普通磁盘, 至少Windows操作系统就是这样, 它仅允许在闪存盘开始位置建立分区, 尽管Windows不干涉已经存在的分区, 但是也不提供闪存盘的分区工具, 所以, 如果您想制作一个可启动OpenBSD的闪存盘, 同时也希望它可用于FAT32的操作系统, 您应该想这样做:
使用OpenBSD的fdisk工具对闪存盘进行分区, 在闪存盘的开始处划分出一个准备给Windows使用的分区, 然后将后面的空间划分成一个OpenBSD分区。
想往常一样在OpenBSD的分区上安装OpenBSD系统, 别忘了激活OpenBSD分区。
格式化其它分区。在Windows上格式化前面的widnows分区。
注意:如果第二个分区的类型选择得合适, 就可以让OpenBSD访问这个闪存盘上的所有分区。所以如果您使用Windows在FAT32分区上存放了一些MP3文件, 当您从OpenBSD分区启动后仍然可以播放这些文件。
14.17.3 - 我怎样制作一个可启动的"Live" USB设备?
如果不把OpenBSD安装在机器上的硬盘上,你可以很简单地制作出一个可启动的USB闪存(或其它!)驱动器,将其作为一个"live"的OpenBSD系统。当然, 你的计算机必须支持从USB设备启动, 但初始化引导实际上可以在任何带有usb接口的机器上完成。
你要这样做有几个理由:
你可以将一个便携、安全的"机器" 随身携带。
用bsd.rd里未包含的一些工具修正OpenBSD系统的错误并安装其它内容。
在准备付款时评估硬件对OpenBSD的兼容性。
收集你朋友计算机内的 dmesg 输出信息! (因为OpenBSD的dmesg信息对鉴定硬件很有帮助, 这对在一台计算机上准备再安装其它的OS也很有帮助-- 它可以让你确认在安装前所需要的所有驱动程序)。
制作这样一个"live OpenBSD drive" 很简单。
将你的USB驱动器挂载到计算机上。
启动OpenBSD安装介质。
像通常那样进行安装, 注意将你的USB设备作为安装目标。
用你新创建USB设备启动。
没了!
安装后你需要做几件事以便更加完善:
安装你自己需要的所有packages和软件。
不同的主机极可能有不同的网卡。你将为可能碰上的所有的网卡(fxp0, re0, rl0, bge0, bnx0, em0等)在/etc目录内的创建大量的 hostname.if(5) 文件, 每个文件仅包含了 dhcp。同样在这块可启动的USB启动器上添加简单的无线网卡配置文件。在启动时OpenBSD会忽略所有那些不存在设备的hostname.if(5)文件。
你可能需要一份安装文件的拷贝,以及一些所需的package .tgz文件,这样你可以将此USB设备作为一个安装介质(启动bsd.rd而不是像常规那样的启动方式)。
在很多的机器上, X无需配置即可正常工作, 但是你要准备一些必须进行X配置的系统所需的配置文件。
你可能喜欢使用Soft updates 。
灵活起见, 你最好使用 i386 而不是 amd64。当然了,如果作为安装介质,除了i386的文件,你最好还有一个amd64的bsd.rd和安装文件。
如果你的目标计算机有 ahci(4) 或者SCSI接口, 你可能会发现你的USB驱动器的设备号有变化。如果你有多个版本的 /etc/fstab 文件,则出现这种情况时可以更方便地"修正" (在单用户模式下)。
你会发现最好在usb驱动器上有一个FAT分区, 创建的细节请参阅 上面.
你可能想使用 softraid(4) 来加密一个数据分区。
14.18 - 优化磁盘性能
磁盘性能是衡量计算机整体速度的重要因素, 当计算机处于多用户使用环境时(所有类型的用户、从可以交互式登录的用户到使用文件或web服务器的一般用户)磁盘性能变得越来越重要, 存储数据需要持续的关注, 尤其是您的硬盘空间不足或磁盘快要坏掉时。OpenBSD提供几种方案来提升您的磁盘速度和容错能力。
CCD - 连接磁盘驱动器。
RAID
Soft Updates
Size of the namei() cache
14.18.1 - CCD
第一个选择是使用ccd(4), 连接磁盘驱动器。它允许您将几个分区合成一个虚拟磁盘(因而, 您可以让几个磁盘看起来像一块磁盘)。这个概念类似于许多商业的Unix版本中使用的 LVM (逻辑卷管理)。
如果您运行的是标准内核, ccd 已经启用了(标准内核位于 /usr/src/sys/conf/GENERIC)。如果您是使用自己的定制内核, 您至少需要在您的内核配置文件中包含类似下面这行:
代码: 全选
pseudo-device ccd 4 # concatenated disk devices
上面是提供了4个 ccd 设备(虚拟磁盘)的例子, 现在您需要根据自己的实际情况判断将哪些分区划分给ccd。用disklabel将这些分区的类型设置成 'ccd'。在一些平台上disklabel不让您这样做, 这种情况下您可以将这些分区的类型设置成'ffs'。
如果您使用ccd通过数据分割提升磁盘性能, 请注意了, 您不会获得最佳的磁盘性能, 除非您使用一些相同型号的磁盘并在这些磁盘上进行同样的disklabel设置。
编辑 /etc/ccd.conf 像这样: (关于配置ccd的更多信息请参看 ccdconfig(8))
代码: 全选
# Configuration file for concatenated disk devices
#
# ccd ileave flags component devices
ccd0 16 none /dev/sd2e /dev/sd3e
为了修改生效, 运行
代码: 全选
# ccdconfig -C
只要 /etc/ccd.conf 文件存在, ccd 会在启动后自动配置自己。现在, 您有一个新的磁盘, ccd0, 它由 /dev/sd2e 和 /dev/sd3e 组成。您可以在这个新磁盘上正常的使用disklabel命令建立分区。再次强调一下, 不要将 'c' 分区作为一个可使用的真实分区。确认您的有效分区的起始处在第一条磁道外。
14.18.2 - RAID
另一个解决方案是raid(4), 您可以使用 raidctl(8) 来配置您的raid设备。 OpenBSD的RAID是基于 Greg Oster 的 NetBSD port 中的 CMU RAIDframe 软件。OpenBSD支持RAID 0, 1, 4, 和 5 。
raid和ccd同样, 必须内核提供支持。但与ccd不不同的是默认内核GENERIC并不支持RAID, 所以您必须加入下面这行然后重新编译您的内核(提供RAID支持会使i386内核增加500K左右的大小)。
代码: 全选
pseudo-device raid 4 # RAIDframe disk device
请阅读 raid(4) 和 raidctl(8) 的用户手册以获得全部细节。那里提供了丰富的选项和可能的配置, 并且有详细的解释, 这些不属于本文档的范围。
14.18.3 - Soft updates
另一个可以提升您系统速度的工具是softupdates。在传统的BSD文件系统中一个最慢的操作就是更新metainfo(它发生在当您创建或删除文件或目录时)。Softupdates 尝试在内存中更新metainfo, 而不是每一个及所有的metainfo全在硬盘上更新。Soft updates的另一个作用是让磁盘上的metainfo永远保持完整, 尽管有时候metainfo没有及时更新, 因此, 当系统崩溃时不需要启动后进行 fsck(8) , 而仅是一个后台版本的fsck在内存中更新metainfo(按softupdates的方式)。这意味着一台服务器的启动将快很多, 因为您不必等fsck!(OpenBSD还没有这个特性), 您可以到 Softupdates FAQ 上了解更多有关Softupdates的细节。
14.18.4 - 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) 分区是采用异步挂载的, 因为反正它们在重新启动后会被擦除和重新建立。