第12章 存 储
12.1概要
这章介绍了FreeBSD中磁盘的使用方法。包括后备存储磁盘,网络附属磁盘和标准的SCSI/IDE存储设备。
读完这章,你将了解到这些:
FreeBSD中用来描述数据组织的术语(partition和slice)。
如何挂上和卸载文件系统。
如何在你的系统上增加硬盘。
如何设置虚拟文件系统。
如何使用配额来限制磁盘空间的使用。
如何刻录CD和DVD。
用于备份的多种存储媒介选项。
如何在FreeBSD上使用备份程序。
如何备份到软磁盘。
12.2 设备命名
下面是FreeBSD支持的物理存储设备列表:
表12-1. 物理驱动器命名规则
驱动器类型 |
驱动设备命名 |
IDE hard
drives |
ad |
IDE CDROM
drives |
acd |
SCSI hard
drives and USB Mass storage devices |
da |
SCSI CDROM
drives |
cd |
Assorted
non-standard CDROM drives |
mcd for
Mitsumi CD-ROM,scd for Sony CD-ROM,matcd for
Matsushita/Panasonic CD-ROM |
Floppy
drives |
fd |
SCSI tape
drives |
sa |
IDE tape
drives |
ast |
Flash
drives |
fla for
DiskOnChip Flash device |
RAID drives |
myxd for
Mylex,and amrd for AMI MegaRAID,idad for Compaq Smart
RAID. |
12.3添加磁盘
假设我们要给一台只有一个磁盘的机器增加一个新的SCSI磁盘。首先,需要关掉计算机,然后按操作规程来安装驱动器,控制器和驱动程序。
以root登陆计算机。安装完驱动器后,检查一下/var/run/dmesg.boot有没有找到新的磁盘。新增加的磁盘就是da1,我们在/1挂上它。(如果你正添加一个IDE驱动器,在4.0版以前的系统就是wd1,而4.0和以后的版本的系统就是ad1)。
因为FreeBSD运行在IBM-PC兼容机上,它必须遵循PC BIOS的分区规范。这与传统的BSD分区是不同的。一个PC的磁盘最高只能有四个BIOS(主)分区。如果磁盘只安装FreeBSD,你可以使用一种模式。另外,FreeBSD必须安装在PC
BIOS支持的分区内。FreeBSD把分区叫做slice,这可能会把人搞糊涂。你可以在只安装FreeBSD的磁盘上使用slice,也可以在安装有其他操作系统的磁盘上使用slice。这不会搞乱其他操作系统的Fdisk分区工具。
在slice这个例子中,驱动器被添加到/dev/da1s1e。这被读作:SCSI磁盘,编号为1(第二个SCSI磁盘),slice
1和e BSD分区。在有些例子中,也可以简化为/dev/da1e。
12.3.1使用sysinstall
1. 使用Sysinstall
你可以使用/stand/sysinstall命令,选择它的使用菜单来分区和标签一个新的磁盘(需要有root权限)。运行/stand/sysinstall,然后选择配置菜单。根据配置菜单,上下滚动,选择分区条目。接下来你会看到一个安装在你系统上的硬盘的列表。如果没有看到da1,你需要重新检查你的硬件安装,在/var/run/dmesg.boot文件中检查dmesg输出信息。
2. FDISK分区编辑器
选择da1,键入FDISK分区编辑器。选择A,为FreeBSD使用全部的磁盘。当被告知你是否要“remain cooperative with any
future possible operating systems”时,回答YES。使用W保存刚才的修改。现在使用q退出FDISK编辑器。下面是你会看到的有关主引导区的信息。现在你已在运行的系统上添加了一个磁盘,就选择None。
3. DiskLabel编辑器
接下来是键入磁盘标签编辑器(Disk label Editor)。这就是你要创建的BSD分区。一个磁盘最高可以有8个分区,标记为a-h。有几个分区标签有特殊的用途。有的分区被用作root分区(/)。你的系统磁盘(你从它那儿启动的分区)必须有一个a分区。B分区被用作交换分区,你可以用很多磁盘用作交换分区。
Sysinstall的标签编辑器支持非root和非swap分区。在标签编辑器中,可以使用C创建一个文件系统。当提示这是否是一个FS(文件系统)或swap时,选择FS,然后给出一个加载点(如:/mnt)。当在post-install模式时添加一个磁盘,sysinstall不会为你在/etc/fstab中创建,所以你指定的加载点并不重要。
你现在已经准备把新标签写到磁盘上,然后创建一个文件系统,可以按下W来实现。出现任何错误都会使它不能创建新的分区。可以退出标签编辑器然后重新执行sysinstall。
4. 完成
下面一步就是编辑/etc/fstab,为你的新磁盘添加一个记录。
12.3.2使用命令行工具
使用Slice
这步安装将允许你的磁盘与可能安装在你计算机上的其他操作系统一起正确工作,而不会搞乱其他操作系统的分区。强烈推荐使用这种方法来安装新磁盘。
# dd if=/dev/zero of=/dev/rda1 bs=1k count=1
# fdisk -BI da1 #初始化你的新磁盘
# disklabel -B -w -r da1s1 auto #加上标签
# disklabel -e da1s1 #现在编辑你刚才创建的磁盘分区
# mkdir -p /1
# newfs /dev/da1s1e # 为你创建的每个分区重复这个操作
# mount -t ufs /dev/da1s1e /1 # 挂上分区
# vi /etc/fstab # 完成之后,添加合适的记录到你的/etc/fstab文件
如果你有一个IDE磁盘,记得要用ad来替换da,4.x以前的系统要用wd来替换。
专用的
如果你并没有安装其他的操作系统,你可以使用专用模式。记住这种模式可能会弄乱microsoft的操作系统;但不会对它进行破坏。
# dd if=/dev/zero of=/dev/rda1 bs=1k count=1
# disklabel -Brw da1 auto
# disklabel -e da1
#创建'e'分区
# newfs -d0 /dev/rda1e
# mkdir -p /1
# vi /etc/fstab
# 为/dev/da1e添加一条记录
# mount /1
另外一种方法:
# dd if=/dev/zero of=/dev/rda1 count=2
# disklabel /dev/rda1 | disklabel -BrR da1 /dev/stdin
# newfs /dev/rda1e
# mkdir -p /1
# vi /etc/fstab
# add an entry for /dev/da1e
# mount /1
12.4 网络,内存和基本文件系统
除了安装在你计算机上的物理硬件:软盘驱动器,CD,硬盘等,其他形式的磁盘——虚拟磁盘也能被FreeBSD认出来。这些包括网络文件系统和coda,象md(memory disk)这样的内存文件系统,还有vnconfig或mdconfig创建的后备文件系统。
12.4.1 vnconfig: 后备文件系统
Vnconfig可以配置和启用vnode伪磁盘设备。一个vnode是一个文件的描述,是文件活动的中心。这是说vnconfig使用文件来创建和操作一个文件系统。
挂上一个存在的文件系统的映像:
例12-1.使用vnconfig挂上一个存在的文件系统的映像
# vnconfig vn0 diskimage
# mount /dev/vn0c /mnt
使用vnconfig创建一个新的文件系统映像:
例12-2.使用vnconfig创建一个新的后备磁盘
# dd if=/dev/zero of= newimage bs=1k count= 5k
5120+0 records in
5120+0 records out
# vnconfig -s labels -c vn 0 newimage
# disklabel -r -w vn 0 auto
# newfs vn 0c
Warning: 2048 sector(s) in last cylinder unallocated
/dev/rvn0c: 10240 sectors in 3 cylinders of 1 tracks, 4096 sectors
5.0MB in 1 cyl groups (16 c/g, 32.00MB/g, 1280 i/g)
super-block backups (for fsck -b #) at:
32
# mount /dev/vn 0c /mnt
# df /mnt
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/vn0c 4927 1 4532 0% /mnt
12.4.2 md: 内存文件系统
md是一个简单,高效创建内存文件系统的方法。
例如:
例12-3. md memory disk
# dd if=newimage of=/dev/md0
5120+0 records in
5120+0 records out
# mount /dev/md0c /mnt
# df /mnt
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/md0c
4927 1 4532 0% /mnt
12.5文件系统配额
配额是操作系统的一个可选择的特性,它允许你限制用户使用的磁盘空间大小或是使用的文件数量。这可以防止某个用户强占所有的磁盘空间。
12.5.1配置你的系统来启用磁盘配额
在决定使用磁盘配额前,确信磁盘配额已经在你的内核中配置好了。只要在你的内核配置文件中添加下面一行就行了:
options QUOTA
在默认情况下,GENERIC内核是不会启用这个功能的,所以你必须配置,重建和安装一个定制的内核。请参考FreeBSD内核配置这章了解更多有关内核配置的信息。
接下来,你需要在/etc/rc.conf中启用磁盘配额。可以通过添加下面这行来完成:enable_quotas=“YES”
很好的控制你的配额启动情况,这是另外一个可利用的变量。通常启动时,集成在每个文件系统上的配额会被配额检查程序自动检查。配额检查功能能够确保在配额数据库中的数据正确地反映了文件系统的数据情况。这是一个很耗时间的处理进程,它会影响你系统的启动时间。如果你想跳过这一步,可以加入下面这一行:
check_quotas=“NO”
如果你运行的是3.2-RELEASE以前的版本,配置比较简单,只需要配置一个选项。在你的/etc/rc.conf中设置下面这行:
check_quotas=“YES”
最后,你要编辑/etc/fstab文件,在每一个文件系统基础上启用磁盘配额。这是你可以启用用户和组配额,或启用你的所有文件系统的地方。要在一个文件系统上启用每个用户的配额,可以在/etc/fstab记录中为你要启用配额的文件系统添加下面一行。例如:
/dev/da1s2g /home ufs rw,userquota
1 2
同样的,要启用组配额,使用组配额选项来代替用户配额关键字。要同时启用用户和组配额,可以这样做:
/dev/da1s2g /home ufs rw,userquota,groupquota 1 2
默认情况下,配额文件是存放在文件系统的以quota.user和quota.group命名的根目录下。可以看看fstab的联机手册了解更多信息。即使联机手册说你可以为配额文件指定一个可改变的区域,这里并不推荐这样做,因为不同的配额工具不一定遵循这样的规则。到这儿,你可以用你的新内核重新启动你的系统。/etc/rc将自动运行适当的命令来创建最初的配额文件,所以并不需要手动来创建任何零长度的配额文件。
在通常的操作过程中,你并不要求手动运行quotacheck,quotaon,quotaoff命令。然而,你可能需要阅读与他们的操作相似的联机手册。
12.5.2设置配额限制
一旦你配置好了启用配额的系统,可以检查一下它们是否真的有用。可以这样做:
# quota -v
你应当为启用配额的每个文件系统看看一个磁盘使用和当前配额限制的在线摘要。你现在可以使用edquota命令准备启用配额限制。
你有几个有关如何强迫限制用户或组可以分配到的磁盘空间大小的选项。你可以限制磁盘空间的分配,或文件的数量,或两者都有。这些限制中的每一个最终可分为两类:硬限制和软限制。
一个硬限制可能无法被超越。一旦一个用户访问到了他们的硬限制,他们无法在文件系统中得到任何分配。例如,如果用户在文件系统上有一个500 blocks的硬限制,而当前已经分派了490个blocks,用户就只能分派剩下的10个blocks。如果硬是要分派11个blocks将会失败。
软限制可以被有时间限制性地超越。这段时间可以被理解为宽限期,默认是一个星期。如果一个用户延缓时间太长的话,软限制将会变成硬限制,根本就不允许被指派。当用户在软限制延后时,宽限期将会被重新安排。
下面是一个当你运行edquota命令时看到的例子。当edquota命令被调用时,你会被转移进EDITOR环境变量指派的编辑器中,允许你编辑配额限制。
# edquota -u test
Quotas for user test:
/usr: blocks in use: 65, limits (soft
= 50, hard = 75)
inodes in use: 7, limits (soft
= 50, hard = 60)
/usr/var: blocks in use: 0, limits (soft
= 50, hard = 75)
inodes in use: 0, limits (soft
= 50, hard = 60)
在每一个文件系统上,你通常会看到两行。一行是block限制,另一行是inode限制。简单地改变你要修改的配额限制的值。例如,提高这个用户软限制的数值到500,硬限制的数值到600。
/usr: blocks in use: 65, limits (soft
= 50, hard = 75)
到:
/usr: blocks in use: 65, limits (soft
= 500, hard = 600)
当你离开编辑器的时候,新的配额限制设置将会被保存。
12.5.3检查配额限制和磁盘使用
你既可以使用quota也可以使用requota命令来检查配额限制和磁盘使用情况。Quota命令能够检查单个用户和组的配额和磁盘使用情况。只有超级用户才可以检查其他用户的配额和磁盘使用情况。requota命令可以用来了解所有配额和磁盘的使用情况。
下面是一个使用quota -v命令后的输出情况。
Disk quotas for user test (uid 1002):
Filesystem blocks
quota limit grace files
quota limit grace
/usr 65* 50 75 5days 7 50 60
/usr/var 0 50 75
0
50 60
上面的例子中,在/usr文件系统中,这个用户超越了软限制(50 blocks)15个blocks,而且它有5天的宽限期。
注意*号表示用户当前超过了他的配额限制。
通常用户没有在上面使用任何磁盘空间的文件系统不会在quota命令的输出中显示,即使他有一个针对文件系统的配置限制。-v选项将显示那些文件系统,如上一个例子中的/usr/var文件系统。
12.5.4通过NFS进行配额
配额能够在NFS服务器上被配额子系统强迫使用。在NFS客户端,rpc.rquotad命令可以使quota信息用于quota命令,可以允许用户察看它们的quota统计信息。
可以这样在/etc/inetd.conf中启用rpc.rquotad:
rquotad/1 dgram rpc/udp wait root
/usr/libexec/rpc.rquotad rpc.rquotad
现在重起inetd:
# kill -HUP 'cat /var/run/inetd.pid'
12.6创建和使用光学设备(CD和DVD)
12.6.1介绍
CD与普通的磁盘相比有很多不同的特性。最初,它们是不能被用户写入的。CD有磁道(track),要在FreeBSD中制作一个CD,你要准备将要写到CD上的数据文件,然后根据每个track写入到CD。
ISO9660文件系统被设计用来处理这些差异。它通常不会对文件系统作限制。幸运的是,它提供了一个可扩展的机制允许在制作CD时超越这些限制。
mkisofs程序能用来生成一个包含一个ISO9660文件系统的数据文件。它有很多支持的扩展选项,下面会具体描述。你可以从/usr/ports/sysutils/mkisofs port中安装它。
使用哪个工具来刻录CD依赖于你的CD刻录机是ATAPI的还是其他类型的。ATAPI CD刻录器使用burncd程序,可以在基本系统中找到。SCSI和USB
CD刻录机使用cdrecord程序,可以在/sysutils/cdrtools中找到。
12.6.2 mkisofs
mkisofs制作一个ISO9660的文件系统,简单用法如下:
# mkisofs -o imagefile.iso /path/to/tree
这个命令将创建一个包含ISO9660文件系统的imagefile文件,它是目录树/path到/tree的一个拷贝。在处理过程中,它将文件名称映射为标准的ISO 9660文件系统的文件名,它将排除那些不典型的ISO文件系统的文件。
有很多选项能够用来克服那些限制。特别的,-R选项能够启用Rock Ridge扩展,-J选项能启用用于Microsoft系统的Joliet扩展,-hfs能用来创建用于MAC的HFS文件系统。
对于那些即将要在FreeBSD系统中使用CD的来说,-U能用来消除所有文件名的限制。当使用-R选项时,它会产生一个文件系统映像,它与你从那儿启动FreeBSD树是一样的,虽然它在许多方面违反了ISO9660的标准。
最后一个通常使用的选项是-b。这可以用来指定启动映像的位置,以产生一个叫做“El Torito”的启动光盘。这个选项给出了一个参数,这个参数是指向已被写入到CD的目录树顶部的启动映像的路径。所以,/tmp/myboot保存了一个可启动的FreeBSD系统,它的启动映像放在/tmp/myboot/boot/cdboot中,你应当像这样在/tmp/bootable.iso中生成一个ISP9660文件系统的映像。
# mkisofs -U -R –b boot/cdboot –o
/tmp/bootable.iso /tmp/myboot
完成之后,如果你在内核中已经配置了vn,你可以挂上文件系统:
# vnconfig –e vn0c /tmp/bootable.iso
# mount -t cd9660 /dev/vn0c /mnt
你可以检查在哪个点上/mnt和/tmp/myboot是一样的。
你还可以使用mkisofs的其他选项来很好地调整它的行为。特别是,修改ISO9660的划分格式,创建Joilet和HFS格式的盘片。
12.6.3 burncd
如果你用的是ATAPI的CD
刻录机,你可以使用burncd命令来刻录ISO映像到CD上。Burncd是基本系统的一部分,可以使用/usr/sbin/burncd来安装。用法很简单,如下:
# burncd -f cddevice data imagefile.iso
fixate
在cddevice上刻录imagefile.iso的一个拷贝。默认的设备是/dev/acd0c。看看burncd的联机手册的参考选项来设置写入速度,刻完之后退出CD,然后写入声音数据。
12.6.4 cdrecord
如果你没有一个ATAPI的CD刻录机,你必须使用cdrecord来刻录你的CD。Cdrecord不是基本系统的一部分;你必须从sysutils/cdrtools或适当的package安装它。基本系统的变化可能会引起这个程序的错误,可能是由“coaster”引起的。当你升级系统时,你需要升级port,或者如果你已升级到-STABLE,你使用新版本时也要升级port。
Cdrecord有很多选项,基本用法与burncd相似。刻录一个ISO9660映像文件只需这样做:
# cdrecord dev=device imagefile.iso
使用cdrecord的比较巧妙的方法是找到使用的dev。要找到正确的设置,可以使用cdrecord的-scanbus标记,这会产生这样的结果:
# cdrecord -scanbus
Cdrecord 1.9 (i386-unknown-freebsd4.2) Copyright (C) 1995-2000 J?rg Schilling
Using libscg version
'schily-0.1'
scsibus0:
0,0,0 0) 'SEAGATE ' 'ST39236LW ' '0004'
Disk
0,1,0 1) 'SEAGATE ' 'ST39173W '
'5958' Disk
0,2,0 2) *
0,3,0 3) 'iomega ' 'jaz 1GB ' 'J.86' Removable
Disk
0,4,0 4) 'NEC ' 'CD-ROM DRIVE:466' '1.26' Removable
CD-ROM
0,5,0 5) *
0,6,0 6) *
0,7,0 7) *
scsibus1:
1,0,0 100)
*
1,1,0 101)
*
1,2,0 102)
*
1,3,0 103)
*
1,4,0 104)
*
1,5,0 105)
'YAMAHA ' 'CRW4260
' '1.0q' Removable CD-ROM
1,6,0 106)
'ARTEC ' 'AM12S '
'1.06' Scanner
1,7,0 107)
*
这个列表列出了设备的适当的dev值。在这个例子中,CRW是1,5,0,所以正确的输入应是dev=1,5,0。有一个很容易的方法可以指定这个值;看看cdrecord的介绍。在那儿也可以找到有关音轨,控制速度和其他的东西。
12.7 ccd(连接磁盘配置)
今天几乎每个人都收集了很多的多媒体文件。从mp3到视频文件。我也有很多转换过的mp3音乐文件。我现在面临一个问题是如何存储这些文件。
选择一个比较好的解决方案,最重要的是产品的速度,性能和成本。通常这三者不可能都满足,要获得比较快和大容量的存储设备,就比较昂贵。但如果将成本降下来,那它的速度或可靠性就会打折扣。我在设计系统时,希望在两者之间达到一个平衡。对我来说,速度不是非常重要的,因为绝大多数的使用是通过百兆以太网来完成的。通过几个磁盘来传输文件要快得多。最后,还要考虑可靠性。存放在这个大容量存储设备上的所有数据都被备份到了CD-R盘上了。这个驱动器主要充当实时存储的功能,所以如果一个驱动器坏了,我就可以换掉它,重建文件系统,把数据从CD-R上拷回来。
总的计算一下,我需要在有限的成本下得到最大的存储容量。大型的IDE磁盘现在是一天比一天便宜。我发现Western Digital 30.7gb 5400 RPM硬盘只需要130美元。我买了三个,加起来足有90GB的存储容量。
12.7.1 安装硬件
我在一个已安装有一个IDE硬盘的系统上再安装一个磁盘。最好是每个IDE磁盘都使用一个自己的IDE控制器,但要求有两个IDE控制器可能成本比较高。所以,我把两个磁盘一个设置成主盘,一个设置成从盘。一个放在第一个IDE控制器上作为系统磁盘,其他两个放在第二个控制器上。
重启动后,系统BIOS被配置成自动检测硬盘。FreeBSD检测到了它们:
ad0: 19574MB <WDC
WD205BA> [39770/16/63] at ata0-master UDMA33
ad1: 29333MB <WDC
WD307AA> [59598/16/63] at ata0-slave UDMA33
ad2: 29333MB <WDC WD307AA> [59598/16/63] at
ata1-master UDMA33
ad3: 29333MB <WDC
WD307AA> [59598/16/63] at ata1-slave UDMA33
如果FreeBSD没有检测到它们,请确定它们的跳线是否正确。我已经听说了使用线缆选择代替实际的slave/master配置的问题报告。
接下来要考虑的是,如何创建文件系统。我对vinum和ccd有一些研究。在一些特殊的配置中,ccd是比较好的选择,因为它比较简单。Vinum显得有点超出了我的需要。
12.7.2 安装CCD
CCD允许我将几个相同的磁盘通过一个逻辑文件系统连接起来。要使用ccd,需要在内核中配置ccd支持选项。我把这行加入到我的内核配置文件中,然后重建内核:
pseudo-device ccd 4
在FreeBSD 4.0和以后版本中,ccd可以作为一个内核模块来加载。
要安装ccd,首先需要disklabel磁盘。这儿是我如何给磁盘做标记的:
disklabel -r -w ad1 auto
disklabel -r -w ad2 auto
disklabel -r -w ad3 auto
这儿把整个硬盘创建成ad1c,ad2c和ad3c。下一步是改变disklabel的类型。
disklabel -e ad1
disklabel -e ad2
disklabel -e ad3
这儿在每个已经设置了EDITOR环境变量的磁盘上打开了disklabel,在我的例子中,是vi。你可以看到:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
c:
60074784
0 unused 0 0 0 # (Cyl. 0 - 59597)
我需要添加一个“e”分区给ccd用。这可以是“c”分区的一个拷贝,但fstype必须是4.2BSD。做完之后,你会看到下面这些:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
c: 60074784 0 unused 0 0 0 # (Cyl. 0 - 59597)
e:
60074784
0 unused
0 0 0 # (Cyl. 0 - 59597)
12.7.3建立文件系统
现在,我已给每个磁盘都加上了标签,我需要建立ccd。要这样做,我需要一个叫ccdconfig的工具,需要配置的设备的第一个参数,在这儿是/dev/ccd0c。ccd0c的设备节点可能不存在,所以你需要创建它,执行下面的命令:
cd /dev
sh MAKEDEV ccd0
ccdconfig需要的下一个参数是文件系统的插入页(interleave)。插入页定义了在磁盘块中一个分段/条带(stripe)的大小,通常是512个字节。所以,一个32的插入页将是16384字节。
插入页为ccdconfig附带了标记。如果你要启用驱动器镜象,你需要在这儿指定它。在这个配置中,我没有做ccd的镜象,所以我把它设为0。
ccdconfig的最后配置是设备的排列问题。执行下面的命令:
ccdconfig ccd0 32 0
/dev/ad1e /dev/ad2e /dev/ad3e
这样就配置好了ccd。我现在要重新创建(newfs)文件系统了。
newfs /dev/ccd0c
12.7.4自动创建
最后,如果我要挂上ccd,我需要先配置它。我把当前的配置文件写入/etc/ccd.conf中:
ccdconfig -g >
/etc/ccd.conf
当我重新启动系统时,如果/etc/ccd.conf存在,脚本/etc/rc就运行ccdconfig -C。这样就能自动配置ccd,以至它能被挂上。
如果你启动进入了单用户模式,你在挂上ccd之前,你需要执行下面的命令来配置队列:
ccdconfig -C
然后,我们需要为ccd在/etc/fstab中配置一个记录,以便在启动时它能被挂上。
/dev/ccd0c
/media
ufs
rw
2
2
12.8步步为营: 建立一个可靠的服务器系统
在通常的概念中,要达到这一步,需要拥有一对磁盘,这样即使其中有一个坏了,也不会影响服务器的正常运行。如果它们工作正常,那一切都会很好,除非你的服务器的两个磁盘都坏掉了,否则你的服务器是不会死的。如果你要构建一个相当坚固的服务器的话,可能需要使用很多的磁盘驱动器,以达到你想象中的可靠性。
12.8.1 介绍
任何需要提供可靠服务的机器都需要许多额外的实时备件,或是许多离线的备用设备,以便于出现问题时及时更换。一般的PC硬件对于一些小型组织来说很容易备齐。在很多组织中,一旦电源,网卡,内存或主板坏掉了,可以很容易地在几分钟内得到更换,这样可以及时地将机器放回到生产中去。
如果一个磁盘坏掉了,那它上面的数据可以从磁带备份中恢复过来。这可能要花好几个小时。由于带有多个磁盘的阵列要比磁带机运行得快得多,所以用它来恢复数据要快得多。
Vinum是一个针对FreeBSD的卷管理工具(Volume
manager),它提供了一个连接到文件系统代码的标准块I/O层接口。它通过管理vinum类型的分区来允许你在这样的分区上细分和组织叫做卷(volume)的逻辑设备。卷可以配置得很有弹性,高性能或两者都具备。在某些方面,Vinum与ccd很相似,但是它在实际运作中更加可靠。它只是比ccd设置稍微困难些。如果你只对串联感兴趣,ccd可能更适合你的需要。
术语
因为这中间包含了很多的术语,所以存储管理的讨论可能会有点难以理解。正如我们将在下面看到的,术语disk, slice, partition,
subdisk和volume都是指不同的东西,但它们可能呈现出与内核一样的接口。因为这些术语所表现出来的目标互相之间是嵌套的,所以互相之间可能会存在混淆。
我会将一个物理磁盘看作是一个spindle的。这儿的partition是指由disklabel划分的BSD分区。它不是指由Fdisk划分的slice或BIOS
partition。
Vinum目标
Vinum定义了一个用来管理存储的包含四个目标的层次结构(看图12-1)。这些不同的组合可以用来完成错误恢复,提升性能或其他额外的功能。你可以看看Vinum的网站(http://www.vinumvm.org/)深入了解一下它的详细功能。
图12-1.
Vinum目标与结构
最顶层,一个vinum volume,主要提供与一个内核其他部分的标准块I/O层接口,从而充当一个虚拟磁盘的功能。最底层,一个vinum drive,使用这个同样的接口从下面的物理设备请求I/O。在它们中间的两个,我们把它们叫做vinum plex和vinum subdisk。正如你可以从它的名字猜到的那样,vinum subdisk是一个在vinum驱动器上可用空间的相应子集。它可以让你细分一个vinum驱动器,就像一个BSD分区可以细分一个BIOS slice一样。
Plex允许你把所有的subdisk空间组织成一个简单的目标。一个plex可以用串联或条状分割把subdisk组织起来。这两个组织方式被用来通过spindle发布I/O请求。一个分段的plex每次会根据分段的大小而交换spindle。一个相连的plex将只会在一个subdisk到达终点时才会交换spindle。
一个Vinum卷的重要特性是它是由不止一个plex组成的。在不同的spindle上配置两个或更多的plex可能会产生一个会导致错误的卷。
Vinum保持着一个定义了上面的目标和它们互相之间方法的情况的配置。无论什么时候它发生了变化,这个配置都会被自动地写入到所有在Vinum管理下的spindle。
Vinum卷/Plex组织
虽然Vinum可以管理许多spindle,但这儿我只介绍特定的两个简化的spindle。看看表12-2了解一下,用Vinum组织的两个spindle与没有用Vinum组织的两个spindle有何不同:
表12-2.用Vinum 组织的两个spindle的特性
组织 |
全部容量 |
失败恢复 |
最高读性能 |
最高写性能 |
串联的Plexes |
没有变化,但只作为一个简单的驱动器出现 |
No |
没有变化 |
没有变化 |
分段状的Plexes (RAID-0) |
没有变化,但只作为一个简单的驱动器出现 |
No |
2x |
2x |
镜象卷 (RAID-1) |
1/2, 作为一个简单的驱动器出现 |
Yes |
2x |
没有变化 |
表12-2显示了使用分段的情况下,它的容量并没有多大变化,但它的读写性能变得更好了。因此,我们在这儿将不使用串联作为例子。镜象卷提供了提高读性能和失败恢复的功能,但这样会牺牲一些磁盘容量。
注意:由于现在有不止一个spindle连在一起,所以串联和分段在增加失败可能性的情况下,给它们带来了超越一个简单spindle的好处。
当出现三个或更多的spindle时,Vinum也支持旋转(rotate),块交叉存取的奇偶校验功能(也叫做RAID-5),它提供了比镜象更多的容量(但不完全跟分段一样),比镜象和分段更好的读性能和失败恢复的机会。但RAID-5会降低写入的性能。RAID-5需要有5个或更多的spindle。
上面提到的各种组织结构可以结合起来提供更好的性能。例如,将镜象和分段结合起来可以提供带有非常快读性能的失败恢复功能。
Vinum历史
Vinum是一个“最小”的FreeBSD发行的一个标准组成部分,从3.0-RELEASE以来已经是一个标准组件了。
这个名字的官方读音是VEE-noom。
Vinum来自于Veritas Volume Manager的灵感,但不是起源于它。历史上这个名称是一个故事和拉丁格言In Vino Veritas(Vino是Vinum的宾语形式)。照字面翻译,就是“Truth lies in wine”,酒后吐真言。
我已经在过去的两年中把它使用在了六个不同的服务器上而没有数据丢失。就像FreeBSD其他功能一样,Vinum提供了“坚如磐石的功能”。(在个人的笔记中,当我配置错了某些东西时,我看到过Vinum的混乱,但我从来没有在普通的操作中遇到过麻烦)。Greg Lehey为 FreeBSD写了Vinum,而且他正在试图把它移植到NetBSD和OpenBSD。
警告:就像FreeBSD其他功能一样,Vinum正在不断地发展。几个隐藏的,但很重要的错误在最近的发布版中得到了修复。最好使用最近发布的代码以满足你对稳定性的要求。
Vinum部署策略
Vinum,加上谨慎的分区管理,你可以实时地"warm-spare" spindle,以便用户能很清晰地了解错误情况。损坏的spindle在维护期间或方便的时候可以及时地被更换。
当所有的spindle都在工作的时候,服务器可以得到更好的性能和存储容量。如果spindle中包含root,/usr或swap,那你的主目录中所有多余的拷贝都会增加服务器失败的可能性。因此,我在这儿提醒一下,在构建一个包含root,/usr,/home和swap分区的具有失败恢复功能的服务器时要特别小心。
警告:Vinum镜象不允许删除备份!镜象不会帮助你从站点灾难或使用rm -r -f /命令后产生的错误中恢复。
为什么启动Vinum?
可以在实际的生产使用中添加Vinum给一个服务器配置,但这在机器启动后再来配置就比较困难。具有讽刺意味的是/stand/sysinstall不支持Vinum的安装,因此,你不能通过/stand/sysinstall来直接安装一个卷。
注意:Vinum当前不支持root文件系统(这个特性正在开发中)。
因此使用Vinum来启动就有些困难,虽然你打算使用Vinum,但建议你在安装FreeBSD时不要用Vinum,等安装之后再使用。
我把这个过程叫做“Vinum步步为营法”。也就是Vinum安装和操作达到你所要求的可恢复性或高性能目标的全过程。我的目的只是想证明我已经使用Vinum的步步为营方法能够很好地为我工作。
Vinum 的好处
我在这里选择的服务器建立方法允许我为你展示在/usr和/home上可恢复性配置的范例。然而,Vinum所提供的好处要远远超出可恢复性——也就是,高性能,高容量和可管理性。
它能够很好地提高磁盘的性能(特别是在多用户负载的情况下)。Vinum能很容易地将许多小容量的磁盘连接起来组合成一个简单的大容量磁盘(但在这里的服务器建立方法中不允许我介绍这种方法)。
对于带有很多spindle的服务器,Vinum在卷管理中提供了非常好的优势,特别是加上了热插拔的硬件时。当系统在运行时,数据可以从一个spindle移到另一个spindle而不会浪费生产(工作)时间。另外,这儿并没有给出具体细节,但你可以从其他文档中得到帮助。看看针对Vinum的技术介绍“The Vinum
Volume Manager 4”,vinum的联机手册中关于vinum命令,vinum设备驱动和vinum目标命名方法的介绍。
注意:把你的磁盘空间分割的越小越好,这可以让你调整到磁盘访问的最普通类型,以便于提高磁盘的性能。然而,它也可能由于分区的太小而损失一些磁盘空间。
在降级模式下的服务器操作
在这里的两个spindle例子中,一些磁盘的损坏都会导致Vinum自动将所有磁盘的I/O转给那个好的spindle。其他的要求在控制台手动操作用降级模式来配置服务器,然后做一个快速的重启动。不同于平常的硬件修理,当服务器在多用户的降级模式下运行时,绝大多数的恢复工作就开始工作,以至尽可能地减少对实际生产的影响。
在第12.8.7节,我将告诉你在Vinum不能自动工作的情况下,需要为降级模式操作配置服务器的方法。我也给出一旦损坏的硬件修复后回到普通操作模式的方法。你可以看看这些Vinum失败恢复的方法。
我建议使用这些方法从模拟的失败中进行练习。对于每一个失败的情况,即使当你的硬件工作得很好的时候,我也会在下面为模拟一个失败给出提示。就像下面12.8.1.10节描述的,一个很小的Vinum系统仍然可以在没有实际生产设备的情况下进行恢复技术的实验。
硬件RAID vs.
Vinum (软件RAID)
在降级模式下,有时需要用手工方式才能配置服务器,因为Vinum是一种软件的执行机制,是在FreeBSD内核的调用下运行的。这样一个软件RAID解决方案的不利之处是无法从BIOS或FreeBSD启动过程中隐藏损坏的spindle。因此,服务器的手工重新配置会告诉BIOS和启动过程损坏的spindle。硬件RAID解决方案通常有一个优势,就是它们不要求重新配置,因为损坏的spindle是被隐藏的,BIOS和启动进程无法发现。
硬件RAID,也可能会有一些缺点:
硬件RAID控制器它自己可能会成为系统的一个简单的失败点。
数据通常是用一种私有的格式来保存,以至一个磁盘驱动器不可能简单地插进另外一个主板然后启动。
你经常不能区分和匹配不同大小和接口的驱动器。
硬件RAID驱动器经常被限制在一定的数目之内(通常是只有4个或8个)。
另外,Vinum提供的好处是,它不会有一个简单的失败点,驱动器可以在很多主板上启动,你很容易地区分和匹配驱动器使用的接口。
提示:确保你的内核是普通的(或至少是/kernel.GENERIC)。这将提高你更快速地支持硬件的机会。
上面从正反两方面讨论的建议,对于硬件RAID来说,root文件系统和swap分区是非常好的选择。这对于很难进行控制台访问的服务器管理员来说尤其实际(回想起有时为了降级模式操作需要配置服务器)。一个只有软RAID的服务器比较适合于办公和家庭环境使用,这样管理员就在眼前。
注意:通常,硬件RAID总是比软件RAID快。因为它运行在主机的CPU上,vinum会比硬件RAID使用更多的CPU和内存。如果性能很重要的话,在你做决定之前先在使用硬件RAID和软件RAID的系统上进行应用程序的基准测试。
Vinum使用的硬件
这些用法可能很合适,因为普通的PC硬件现在能够很容易地支持低成本而又高性能的几百兆磁盘空间。许多磁盘驱动器制造商现在开始出售7200RPM的磁盘,而且寻道时间更短,有更高的数据传输速率,使用ATA-100的接口,具有很吸引人的价格。四个这样的驱动器,加上一个合适的主板,用Vinum进行配置,然后进行合理地分区,就可以建立一个具有失败恢复,低成本的高性能磁盘服务器。
然而,你可能确实想简单地使用Vinum。一个小的系统可能只需要老的CPU(甚至一个486就可以了),一对500MB或更大的磁盘驱动器。它们不一定需要同样的大小,甚至也不需要同样的接口(例如,可以混合使用ATAPI和SCSI)。所以今天可以试一试!你将在一小时内建立起一台具有失败恢复功能的服务器!
12.8.2 步步为营方法的各个阶段
Greg Lehey给我们提供了步步为营方法的建议。它很清楚Vinum内部如何分配磁盘空间而避免拷贝数据。而是,配置Vinum目录,以便它们在/stand/sysinstall建立文件系统的地方占用同样的磁盘空间。文件系统不需要拷贝就可以被嵌入到Vinum目标中。
Vinum启动过程有好几个不同的阶段。每个阶段都将在下面的各个章节中描述。这节将介绍一个通常的过程和它的目标。接着会给出带有两个spindle的操作步骤,以及建议如何调整这两个spindle以适应服务器的要求。(如果你已经理解了Vinum的启动过程,那下面每一阶段的示例你可以跳过去)。这节的其余部分给出了一个整个启动过程的概况。
阶段1是计划和准备阶段。我们将根据可用的资源平衡要求,然后作折中的设计。我们将计划从没有Vinum到有一个spindle的Vinum,再到有两个spindle的Vinum不断变换。
阶段2,我们将在使用4.2BSD文件系统(UFS文件系统)分区的一个简单spindle上安装一个小的FreeBSD系统。
阶段3将在Vinum目标中插入来自阶段2的非root文件系统。注意Vinum将在这时启动和运行,但它还不能提供失败恢复的功能,因为它只有一个spindle存储数据。
最后阶段4,我们在第2个spindle上配置Vinum,然后作一个root文件系统的备份。这将在所有的文件系统上提供失败可恢复功能。
第1步:计划和作准备
在这个阶段我们的目标是定义我们需要的不同分区和检查它们的要求。我们也将考察可用的磁盘驱动器和控制器,并给它们分配分区。最后,我们将在启动过程中决定每个分区的大小和它的用处。这个规划完成之后,我们可以随意使用一些可以使启动Vinum更容易的工具。
在这个规划工程中,有几个关键的问题必须要回答:
需要什么文件系统和分区?
它们将如何使用?
我们如何命名每个spindle?
如何为每个spindle排列分区?
分区是如何被指派到spindle的?
分区是如何配置的?可恢复性还是高性能?
什么技术将被用来完成可恢复性的功能?
将使用什么spindle?
它们将如何被配置在可用的控制器上?
每个分区需要多少空间?
阶段1 举例
在这个例子中,我假设我们将建立一个很小的失败可恢复服务器。
因此,我们将至少需要root,/usr,/home和swap分区。root,/usr和/home文件系统都需要有失败可恢复功能,因为服务器没有它们就无法正常工作。交换分区首先需要高性能,通常不需要可恢复功能,因此它没有包含任何重新启动后需要恢复的东西。
Spindle命名
内核将在主和副ATA控制器上像/dev/ad0和/dev/ad2这样分别地读取主spindle。(注)但Vinum也需要给每个spindle一个名字,无论它如何访问CPU,它都会保留同样的名字。(也就是,如果驱动器移动了,Vinum名称也会随着驱动器一起移动)。
(注)这里假设你没有从内核配置中删除ATA_STATIC_ID选项。
下面会讲到的一些可恢复技术建议把一个spindle从第2个ATA控制器移到主ATA控制器。(当然,作这样移动的灵活性对Vinum是有好处的,特别是如果你正在管理许多spindle)。这样交换了驱动器/控制器之后,内核将把/dev/ad2看作是/dev/ad0,但当它被连接到/dev/ad2 时,Vinum不管它的名字是什么仍将会呼叫它。(也就是说,当它被创建或第一次被Vinum认出时)。
既然连接已经改变了,最好给每个spindle一个唯一的,抽象的名字,以便无论它如何接法都不会被混淆。建议使用制造厂商,型号,物理位置或在顺序中的成员关系作为名字。(避免使用下面这些名字:upper, lower, etc., alpha, beta, etc., SCSI1, SCSI2, etc.
Seagate1,Seagate2 etc.)。
这样的名字可能会丢失它的唯一性,或即使现在看起来好像是很好的名字,有朝一日也可能会混淆顺序。
提示:一旦你为你的spindle指定了名字,给它们做了一个永久的标签。如果你有热交换设备,建议在每个被挂上的spindle上记下它的名字。当你以后移动spindle进行失败恢复或常规的系统管理时,这将减少发生错误的可能性,
在下面的介绍中,Vinum将命名root spindle YouCrazy和rootback
spindle UpWindow。当我要将当前连接的两个spindle参考为/dev/ad0时,我将只使用/dev/ad0。
分区排序
现代的磁盘驱动器使用统一的磁盘密度来操作磁盘表面。这意味着磁头从外磁道读取的数据要比从内磁道读取的数据来得多。我们将根据系统性能的要求从这些外磁道来分配分区,如通常使用的/stand/sysinstall。
Root文件系统通常在最外面,虽然它并没有与其他文件系统一样的性能要求。(然而,如果在这个例子中包含了/tmp和/var,root可能就会有一个比较大的性能提升)。
FreeBSD启动管理器假设root文件系统位于a分区。a分区就不一定需要在最外面的磁道上,但这个惯例可以使得它更容易地管理磁盘标签。
交换分区的性能要求比较高,所以它就紧跟在后面。这儿的I/O操作将非常巨大和连续不断。当交换数据时,这样可以减少磁头的搜索时间。
对于所有不显眼的比较小的分区,我们就放在/home和/usr中。这儿的访问没有其他文件系统来得频繁(特别是如果有很多的RAM和读取缓存,读取率将会更高)。
如果你有的spindle对非常巨大,需要你提供更多的容量超过了/home和/usr,最好在这儿添加额外的文件系统。
给spindle分配分区
我们将给这些spindle分配分区,以便在配置支持可恢复特性的文件系统上哪一个的损坏都不会丢失数据。
/home和/usr的可靠性可以使用Vinum镜象来完成。然而,对于root文件系统,可恢复性将会有点不同,因为Vinum不是FreeBSD启动进程的一部分。这我们将必须满足于两个同样的分区从主分区到备份分区的周期拷贝。
内核现在已经支持了通过所有可用分区的交叉存取的交换分区,所以这就不需要来自Vinum的帮助。/stand/sysinstall将自动地为所有给定的交换分区配置/etc/fstab。
下面给出的Vinum启动方法要求有一对spindle,以便我可以呼叫root spindle和rootback
spindle。
重要点:rootback spindle必须与root
spindle一样或稍大一点。这些用法是先在root spindle上分配所有的空间,然后在rootback spindle上分配正确大小的空间。(Vinum启动后,不需要指定哪一个spindle——它们是可互换的)。你以后可以把rootback
spindle上剩下的空间用作其他文件系统。
如果有不止两个spindle,bootvinum Perl脚本和下面的方法将帮助你用Vinum初始化它们。然而,你将必须指出如何给它们指派分区。
给分区指派空间
对于这个例子,我将使用两个spindle:一个在/dev/ad0,有4,124,673 blocks (大约2 GB),一个在/dev/ad2,有8,420,769 blocks (大约4 GB)。
最好配置这两个spindle在不同的控制器上,以便两个可以并行操作,以至于无论哪个控制器坏掉,都可以进行失败恢复。在这个例子中两个spindle共享一个控制器,这就要求它们连续地操作,注意镜象卷写入性能将减半。一个spindle是在主ATA控制器上的主盘,其他的是在副ATA控制器上的主盘。
回想一下,我们先在比较小的spindle分配空间,然后在比较大的spindle上分配空间。
在root spindle上分配分区
我们将在每个spindle上给一个root文件系统分配200,000 blocks (大约93 MB)(/dev/ad0s1a和/dev/ad2s1a)。在每个spindle上初始分配200,265 blocks给一个交换分区,大约186MB的空间(/dev/ad0s1b和/dev/ad2s1b)。
注意:作为启动进程的一部分,我们将在每个交换分区上用掉265 blocks。这些空间通常是Vinum用来存储配置信息的。减少的空间可以用作一个Vinum分区,但不能用作Vinum subdisk。
注意:如果你觉得用MB来分配空间更方便,那也没什么问题。
这样将在root spindle上为Vinum分区(/dev/ad0s1e和ad2s1f)留下4,124,673 - 200,000 - 200,265 = 3,724,408 blocks (大约1,818 MB)。这里,给Vinum配置信息分配265 blocks,给/home分配1,000,000 blocks (大约488 MB),余下的给/home
2,724,408 blocks (大约1,330 MB)。看下面的图12-2。
图12-2的左边显示了spindle
ad0是处于阶段2的结尾,右边显示了它处于阶段3的结尾。
图12-2.
Vinum 配置前和配置后的Spindle
ad0
在rootback spindle上分配分区
在rootback spindle上/rootback和swap分区的大小必须与root spindle的root和swap分区大小相匹配。那为Vinum分区留下了8,420,769
- 200,000 - 200,265 = 8,020,504 blocks。/home和/usr的镜象在root
spindle上获得了同样的空间。这样就剩下了2 GB空间,我们以后可以使用它。看下面图12-3的图形。
图12-3左边显示了spindle
ad2是阶段4的开始。右边是它的结束。
图12-3.
Vinum配置前后的Spindle
ad2
准备工具
下面第12.8.8.1节给出的bootvinum Perl脚本,如果在机器一启动时就运行,将使Vinum的启动过程更加容易。它可能会超过200行,你不想亲自输入这些脚本。基于这点,我建议你把它拷贝到一个软盘或想一个办法使它更容易读取,以便以后需要时,它能够很容易地使用。例如:
# fdformat
-f 1440 /dev/fd0
# newfs_msdos
-f 1440 /dev/fd0
# mount
/dev/fd0 /mnt
# cp
/usr/share/examples/vinum/bootvinum /mnt
12.8.3 阶段2:最小OS安装
在这个阶段我们的目标是完成最小化的FreeBSD安装,使用这种方法是为了我们可以在以后安装Vinum。我们将只使用4.2BSD(也就是UFS)的分区,因为那是/stand/sysinstall唯一支持的分区类型。
阶段2 举例
1.
从安装设备上通过运行/stand/sysinstall来启动FreeBSD安装进程。
2.
根据需要Fdisk所有的spindle分区。
重要点:确信为所有spindle选择了BootMgr。
3.
正如上面第12.8.2.1.1.5节描述的,用适当的block分配方案来给root
spindle分区。例如在一个2GB的spindle上,我给root使用200,000 blocks,给swap使用200,265 blocks,给/home使用1,000,000 blocks,把余下的部分(2,724,408
blocks)给/usr。(默认的,/stand/sysinstall将自动地把这些指定为/dev/ad0s1a,/dev/ad0s1b,/dev/ad0s1e和/dev/ad0s1f。)
注意:如果你更喜欢软升级(soft updates),你可以使用4.4-RELEASE或以后的版本,这是启用它们的很好机会。
4.
正如上面第12.8.2.1.1.6节描述的,用适当的block分配方案来给rootback
spindle分区。
例如在一个4GB的spindle上,我给/rootback使用200,000 blocks,给swap使用200,265 blocks,把余下的部分(8,020,504
blocks)给/NOFUTURE。(默认的,/stand/sysinstall将自动地把这些指定为/dev/ad2s1e,/dev/ad2s1b和/dev/ad2s1f。)
注意:我们实际上并不需要一个/NOFUTURE UFS文件系统(我们需要一个vinum分区),但那是给定的/stand/sysinstall空间限制的最好选择。以NOFUTURE和rootback开始的加载点名称将给下面12.8.8.1节出现的启动脚本提供指示。
5.
给其他的spindle划分想要的swap和一个简单的/NOFUTURExx文件系统。
6.
即使你想以后终止已经加载的很多组件,也可以现在选择一个小的系统安装。
提示:在这一点上不要担心系统配置选项——先安装好Vinum,然后在适当的地方获得分区。
7.
退出/stand/sysinstall,然后重新启动。作一个快速的测试以判断最小化安装已经成功了。
在上面图12-2的左边和图12-3的左边显示了磁盘的状况。
12.8.4 阶段3: 配置Root
Spindle
在这阶段,我们的目标是安装Vinum,然后在root spindle运行。我们将把存在的/usr和/home文件系统嵌入一个Vinum分区。注意已创建的Vinum卷将不具备失败恢复功能,因为我们现在只使用了一个Vinum驱动器。当这个系统启动进入多用户模式时,将自动启动Vinum。
阶段3 举例
1.
以root登陆。
2.
我们将在root文件系统中需要一个目录,在这个目录中保存Vinum启动过程中需要用到的几个文件。
# mkdir
/bootvinum
# cd
/bootvinum
3.
准备Vinum启动过程中需要用到的几个文件。我已经写了一个Perl脚本,可以为你准备所有需要的文件。把这些脚本通过软盘、磁带、网络或其他可行的方法拷贝到/bootvinum(如果在启动时你不能把这个脚本拷贝到机器上,那看看下面第12.8.8.2节用手工的方法完成)。
# cp /mnt/bootvinum .
# ./bootvinum
注意:当成功运行的时候,bootvinum不会产生输出。如果你遇到一些错误,当你在用/stand/sysinstall创建分区的时候,有一些东西会出错。
运行bootvinum将:
根据在你的/etc/fstab中找到的配置情况创建/etc/fstab.vinum。
在/etc/fstab中为上面提到的每一个spindle创建新的磁盘标签,保存几份当前磁盘标签的拷贝。
为了在每个spindle上建立Vinum目标,创建必须的作为输入到vinum create的文件。
创建许多迟早用得上的/etc/fstab.vinum预备文件,以防spindle出现错误。
你可以看看这些文件学习给Vinum磁盘分区的情况,或学习创建Vinum目标需要的命令。
4.
我们现在必须为/dev/ad0安装新的spindle分区。这要求/dev/ad0s1b没有被用作交换,所以我们必须在单用户模式下重新启动。
a.
首先,重新启动系统。
# reboot
b.
接着,进入单用户模式。
Hit [Enter] to boot immediately, or
any other key for command prompt.
Booting [kernel] in 8 seconds...
Type ’?’ for a list of commands,
’help’ for more detailed help.
ok boot -s
5.
在单用户模式,安装上面创建的新分区。
# cd /bootvinum
# disklabel -R ad0s1 disklabel.ad0s1
# disklabel -R ad2s1 disklabel.ad2s1
注意:如果你有额外的spindle,用适合它们的相应命令重复一遍。
6.
我们将第一次启动Vinum。它将在/dev/vinum下创建几个设备节点,所以我们必须挂上root文件系统为可读/写访问。
# fsck -p /
# mount /
7.
现在是创建Vinum目标的时候了,这将在一个Vinum分区中在root spindle上嵌入一个存在的非root文件系统。这将加载Vinum内核模块,然后启动Vinum。
# vinum create create.YouCrazy
你将看到像下面一样的你创建的Vinum目标列表:
1 drives:
D
YouCrazy State:
up Device /dev/ad0s1h Avail: 0/1818 MB (0%)
2
volumes:
V
home State:
up Plexes: 1 Size: 488
MB
V
usr State: up Plexes: 1 Size: 1330
MB
2
plexes:
P
home.p0 C State: up Subdisks: 1 Size: 488
MB
P
usr.p0 C
State: up Subdisks: 1 Size: 1330
MB
2
subdisks:
S
home.p0.s0 State: up PO: 0 B Size: 488
MB
S
usr.p0.s0 State: up PO: 0 B Size: 1330
MB
你也将看到几个描述了你已经创建的Vinum目标的内核信息。
8.
我们的非root文件系统现在将嵌入到一个Vinum分区,因此可以通过Vinum卷来使用。测试一下这个嵌入的系统工作是否正常很重要。
# fsck -n /dev/vinum/home
# fsck -n /dev/vinum/usr
这不会产生错误。如果它产生了错误,不需要修复它们。而是,回去,检查一下配置Vinum前后的root spindle分区表,看看你是否能找出一些错误。你可以通过使用disklabel –R回到分区表修改disklabel.*.b4vinum文件。
9.
当我们挂上了可读写的root文件系统,就可以安装/etc/fstab了。
# mv /etc/fstab /etc/fstab.b4vinum
# cp /etc/fstab.vinum /etc/fstab
10. 我们现在的工作是在单用户模式下做的,所以现在也可以很安全地回到多用户模式。
# ^D
11. 以root登陆。
12. 编辑/etc/rc.conf,添加下面这行:
start_vinum="YES"
12.8.5 阶段4: 配置Rootback
Spindle
在这个阶段,我们的目标是获得从root spindle到rootback spindle的所有数据的多余拷贝。我们将先在rootback spindle上创建必须的Vinum目标。然后,我们将要求Vinum从root spindle到rootback spindle拷贝数据。最后,我们使用dump和restore命令拷贝root文件系统。
阶段4 举例
1.
现在Vinum正运行在root spindle上,我们可以把它调用到rootback
spindle,以便我们的Vinum卷可以具备失败可恢复的功能。
# cd /bootvinum
# vinum create create.UpWindow
你将看到像下面一样的你创建的Vinum目标列表:
2 drives:
D YouCrazy State:
up Device
/dev/ad0s1h Avail: 0/1818 MB (0%)
D UpWindow State:
up Device
/dev/ad2s1h Avail: 2096/3915 MB (53%)
2 volumes:
V home State:
up Plexes:
2
Size: 488 MB
V usr State:
up Plexes:
2
Size: 1330
MB
4 plexes:
P home.p0 C State: up Subdisks:
1
Size: 488
MB
P usr.p0 C State: up Subdisks:
1
Size: 1330
MB
P home.p1 C State: faulty Subdisks: 1
Size: 488
MB
P usr.p1 C State: faulty Subdisks: 1
Size: 1330
MB
4 subdisks:
S home.p0.s0 State:
up PO: 0
B Size: 488
MB
S usr.p0.s0 State: up PO: 0
B Size: 1330
MB
S home.p1.s0 State:
stale PO: 0
B Size: 488
MB
S usr.p1.s0 State: stale PO: 0
B Size: 1330
MB
你将看到几个描述了你已经创建的Vinum目标的内核信息,虽然有些不太完善或有点陈旧。
2.
现在,我们告诉Vinum拷贝驱动器YouCrazy到驱动器UpWindow上的每一个subdisk。这将修改新创建的Vinum subdisk的状态从stale到up。它也将修改新创建的Vinum plex的状态从stale到up。
首先,我们执行已经添加到/home的新subdisk。
# vinum start -w home.p1.s0
reviving home.p1.s0
(time passes . . . )
home.p1.s0 is up by force
home.p1 is up
home.p1.s0 is up
注意:我的5,400 RPM EIDE spindle拷贝速度大概是3.5 MBytes/sec。你的速度可能不太一样。
3.
接着,我们执行已经添加到/usr的新subdisk。
# vinum -w start usr.p1.s0
reviving usr.p1.s0
(time passes . . . )
usr.p1.s0 is up by force
usr.p1 is up
usr.p1.s0 is up
所有的Vinum目标将在这点上正式地启用。Vinum列表的输出是这样的:
2 drives:
D YouCrazy State:
up Device
/dev/ad0s1h Avail: 0/1818 MB
(0%)
D UpWindow State:
up Device /dev/ad2s1h Avail: 2096/3915
MB (53%)
2 volumes:
V home State:
up Plexes:
2 Size: 488
MB
V usr State:
up Plexes:
2 Size: 1330
MB
4 plexes:
P home.p0 C State: up Subdisks:
1 Size:
488 MB
P usr.p0 C State: up Subdisks:
1 Size: 1330
MB
P home.p1 C State: up Subdisks:
1 Size: 488
MB
P usr.p1 C State: up Subdisks:
1 Size: 1330
MB
4 subdisks:
S home.p0.s0 State: up PO: 0
B Size: 488
MB
S usr.p0.s0 State: up PO:
0 B
Size: 1330
MB
S home.p1.s0 State: up PO:
0 B
Size: 488
MB
S usr.p1.s0 State: up PO:
0 B
Size: 1330
MB
4.
拷贝root文件系统,以便你能得到一个备份。
# cd /rootback
# dump 0f - / | restore rf -
# rm restoresymtable
# cd /
注意:你可能会看到像这样的错误:
./tmp/rstdir1001216411: (inode 558)
not found on tape
cannot find directory inode 265
abort? [yn] n
expected next file 492, got 491
它们看起来不会带来什么影响。我怀疑它们使用了包含/tmp的文件系统或是连接到dump和restore的管道。
5.
在恢复的过程中创建一个在它上面可以挂上一个已损坏的root文件系统的目录。
# mkdir /rootbad
6.
删除现在不使用的加载点。
# rmdir /NOFUTURE*
7.
在剩下的spindle上创建空Vinum驱动器。
# vinum create create.ThruBank
# ...
在这点上,建立可靠的服务器的工作已经完成了。上面图12-2的右边和图12-3的右边显示了磁盘的情况。
你可能想做一个快速的重启动切换到多用户状态,然后给它一个快速的试验驱动器。这也是一个完成其他组件安装的好方法。添加package,port和需要的用户。根据要求配置/etc/rc.conf。
提示:你完成了服务器的配置之后,在把服务器放到实际的生产中去时,记住要像上面指出的那样多做几个root到/rootback的拷贝。
制定一个周期更新/rootback的时间表。
在普通的服务器操作中,将/rootback加载为只读是个好主意。然而,这会使周期性地更新变得更复杂。
不要忘记仔细检查/var/log/messages中的错误。Vinum可能会自动消除用户没有注意到的硬件错误。你必须监视这样的错误,在再次发生错误导致丢失数据前,及时给它们修复。你也可以在服务器启动时看看Vinum没有被损坏的目标。
12.8.6 从这里去哪儿?
现在你已经建立好了一个可靠的服务器,接下来你需要做几件事情。
用剩下的空间创建一个Vinum卷
下面几步将在rootback
spindle上用余下的空间创建另一个Vinum卷:
注意:这个卷不具备失败可恢复的功能,因为它在一个简单的spindle上只有一个plex。
1.
用下面的内容创建一个文件:
volume hope
plex name hope.p0 org concat volume hope
sd name hope.p0.s0 drive UpWindow plex
hope.p0 len 0
注意:为hope.p0.s0 subdisk指定长度为0,表示要Vinum使用下面驱动器上剩下的所有空间。
2.
把这些命令转给vinum
create。
# vinum create filename
3.
现在我们newfs卷,然后挂上它。
# newfs -v /dev/vinum/hope
# mkdir /hope
# mount /dev/vinum/hope /hope
4.
如果你想在启动时就挂上/hope,需要编辑/etc/fstab。
试试更多Vinum命令
你可能已经熟悉了使用vinum list命令得到所有Vinum目标的列表。使用加上-v选项可以得到更多的细节描述。
如果你有很多spindle,你想把它们组织起来进行连接,镜象或分段卷,那可以试试这些命令vinum concat drivelist,vinum
mirror drivelist或vinum stripe drivelista。
在为你的其他spindle决定最后的组织情况以前,看看vinum的联机手册了解一下配置的例子和重要的性能参考。
下面要介绍的失败恢复方法将给你一些使用更多Vinum命令的经验。
12.8.7 失败设想
这节包含了几个可能的失败情况描述。对于每一种失败的情况,都有一小段关于如何在降级模式操作配置你的服务器,如何从失败中恢复,如何退出降级模式和如何模拟失败的介绍。
提示:对这些用法作一个硬拷贝,并把它们驻留在CPU中,小心不要干扰数据的流通。
在不能用的ad0上的root文件系统,驱动器的其余部分很好
注意:我们假设在/dev/ad0上的启动块和磁盘标签都很好。如果你的BIOS能从一个驱动器启动而不是C:,你可以在多处应用这个限制。
为降级模式配置服务器
1.
使用bootmgr从/dev/ad2s1a加载内核。
a.
在BootMgr中键入F5选择Drive 1。
b.
键入F1选择FreeBSD。
2.
内核加载以后,键入任何一个除enter以外的键打断启动进程。进入单用户模式,直接使用一个root文件系统的记录。
Hit [Enter] to boot immediately, or any
other key for command prompt.
Booting [kernel] in 8 seconds...
Type ’?’ for a list of commands, ’help’ for
more detailed help.
ok boot
-as
3.
选择/rootback作为你的root文件系统。
Manual root file system specification:
_fstype>:_device> Mount
_device> using filesystem _fstype>
e.g. ufs:/dev/da0s1a
? List valid disk boot devices
_empty line> Abort manual input
mountroot> ufs:/dev/ad2s1a
4.
现在你已经在单用户模式下了,修改/etc/fstab去掉坏的root文件系统。
提示:如果你使用下面第12.8.8.1节介绍的bootvinum Perl脚本,需要使用下面这些命令来为降级模式配置服务器。
# fsck -p /
# mount /
# cd /etc
# mv fstab fstab.bak
# cp fstab_ad0s1_root_bad fstab
# cd /
# mount -o ro /
# vinum start
# fsck -p
# ^D
恢复
1.
从备份中恢复/dev/ad0s1a,或用这些命令拷贝/rootback到那儿:
# umount /rootbad
# newfs /dev/ad0s1a
# tunefs -n enable /dev/ad0s1a
# mount /rootbad
# cd /rootbad
# dump 0f - / | restore rf -
# rm restoresymtable
退出降级模式
1.
进入单用户模式。
# shutdown now
2.
把/etc/fstab换回普通形式,然后重新启动。
# cd /rootbad/etc
# rm fstab
# mv fstab.bak fstab
# reboot
3.
重新启动,然后当出现BootMgr提示符时,键入F1从/dev/ad0启动。
模拟
这种失败可以通过关闭单用户模式来模拟,然后像上面第12.8.7.1.1节显示的那样启动。
驱动器ad2失败
这节将处理/dev/ad2的整个失败情况。
为降级模式配置服务器
1.
内核加载后,键入除enter以外的任何键打断启动进程。进入单用户模式。
Hit [Enter] to boot immediately, or any
other key for command prompt.
Booting [kernel] in 8 seconds...
Type ’?’ for a list of commands, ’help’ for
more detailed help.
ok boot -s
2.
修改/etc/fstab以去掉坏的驱动器。如果你使用下面第12.8.8.1节介绍的bootvinum
Perl脚本,使用这些命令将为降级模式配置你的服务器。
# fsck -p /
# mount /
# cd /etc
# mv fstab fstab.bak
# cp fstab_only_have_ad0s1 fstab
# cd /
# mount -o ro /
# vinum start
# fsck -p
# ^D
如果你不修改准备使用的/etc/fstab,可以使用ed命令来做一个。另外,可以用fsck和mount命令,然后使用你喜欢的编辑器。
恢复
我们假设你的服务器启动了,并且只在/dev/ad0上以降级模式的形式运行多用户模式,你现在在/dev/ad2上有一个新的spindle。
你将需要一个新的spindle,有足够的空间来包含root和swap分区加上一个巨大的足够包含/home和/usr的Vinum分区
1.
在新的spindle上创建一个BIOS分区(slice)。
# /stand/sysinstall
a.
选择Custom。
b.
选择Partition。
c.
选择ad2。
d.
创建一个足够包含上面提到的每一件东西的FreeBSD
slice(类型165)。
e.
写入修正。
f.
是的,你完全确定。
g.
选择BootMgr。
h.
退出Partitioning。
i.
退出/stand/sysinstall。
2.
在当前的分区上创建磁盘标签分区。
# disklabel ad0 > /tmp/ad0
# disklabel -e ad2
这将带你进入你喜欢的编辑器。
a.
从/tmp/ad0到ad2的disklabel为a和b分区拷贝几行。
b.
添加a和b分区的大小为h分区寻找适当的偏移量。
c.
从c分区的大小中减去这个偏移量以便为h分区找到正确的大小。
d.
用上面计算出的大小和偏移量定义一个h分区。
e.
给vinum设置fstype列。
f.
保存文件然后退出你的编辑器。
3.
告诉Vinum有关你的新驱动器的信息。
a.
告诉Vinum用一个当前配置信息的拷贝启动一个编辑器。
# vinum
create
b.
参考驱动器UpWindow加上驱动器,设置设备为/dev/ad2s1h。
c.
保存文件然后退出你的编辑器。
4.
现在,Vinum又有了两个spindle,重新激活镜象。
# vinum start -w usr.p1.s0
# vinum start -w home.p1.s0
5.
现在我们必须把/rootback恢复到一个当前的root文件系统的拷贝。这些命令将完成这个工作。
# newfs /dev/ad2s1a
# tunefs -n enable /dev/ad2s1a
# mount /dev/ad2s1a /mnt
# cd /mnt
# dump 0f - / | restore rf -
# rm restoresymtable
# cd /
# umount /mnt
退出降级模式
1.
进入单用户模式。
# shutdown now
2.
返回/etc/fatab到普通的形式,然后重新启动。
# cd /etc
# rm fstab
# mv fstab.bak fstab
# reboot
模拟
你可以通过拔去/dev/ad2,写保护它,或通过下面这个过程模拟这种失败:
1.
关机进入单用户模式。
2.
卸下所有非root文件系统。
3.
弄乱/dev/ad2上的所有已存在Vinum配置和分区。
# vinum stop
# dd if=/dev/zero of=/dev/ad2s1h count=512
# dd if=/dev/zero of=/dev/ad2 count=512
驱动器ad0的失败
一些BIOS可以从驱动器1或2启动(经常叫C: 或D:),而其他的可能只能从驱动器1启动。如果你的BIOS都能从这两种模式启动,恢复的最快路径可能是直接在单用户模式从/dev/ad2回复,然后安装/etc/fstab_only_have_ad2s1作为/etc/fstab。你必须根据第12.8.7.2.2介绍的方法对/dev/ad2进行失败恢复。
如果你的BIOS只能从驱动器1启动,那你必须为/dev/ad2从控制器上拔掉驱动器YouCrazy,然后把它插入/dev/ad0的控制器。接着,根据第12.8.7.2.2节介绍的方法对/dev/ad2进行错误恢复。
12.8.8 Vinum附录
bootvinum Perl脚本
下面的bootvinum Perl脚本会读取/etc/fstab文件和当前的驱动器分区。它接着就在当前目录和/etc中的几种不同的/etc/fstab写入几个文件。这些文件简化了Vinum的安装和从spindle的失败恢复。
#!/usr/bin/perl -w
use strict;
use FileHandle;
my $config_tag1 = ’$Id: vb.sgml,v 1.28
2001/10/14 14:08:39 bob Exp bob $’;
# Copyright (C) 2001 Robert A. Van Valzah
#
# Bootstrap Vinum
#
# Read /etc/fstab and current partitioning
for all spindles mentioned there.
# Generate files needed to mirror all file
systems on root spindle.
# A new partition table for each spindle
# Input for the vinum create command to
create Vinum objects on each spindle
# A copy of fstab mounting Vinum volumes
instead of BSD partitions
# Copies of fstab altered for server’s
degraded modes of operation
# See handbook for instructions on how to
use the the files generated.
# N.B. This bootstrapping method shrinks
size of swap partition by the size
# of Vinum’s on-disk configuration (265
sectors). It embeds existing file
# systems on the root spindle in Vinum
objects without having to copy them.
# Thanks to Greg Lehey for suggesting this
bootstrapping method.
# Expectations:
# The root spindle must contain at least
root, swap, and /usr partitions
# The rootback spindle must have matching
/rootback and swap partitions
# Other spindles should only have a
/NOFUTURE* file system and maybe swap
# File systems named /NOFUTURE* will be
replaced with Vinum drives
# Change configuration variables below to
suit your taste
my $vip = ’h’; # VInum Partition
my @drv = (’YouCrazy’, ’UpWindow’, ’ThruBank’,
# Vinum DRiVe names
’OutSnakes’, ’MeWild’, ’InMovie’,
’HomeJames’, ’DownPrices’, ’WhileBlind’);
# No configuration variables beyond this
point
my %vols; # One entry per Vinum volume to
be created
my @spndl; # One entry per SPiNDLe
my $rsp; # Root SPindle (as in /dev/$rsp)
my $rbsp; # RootBack SPindle (as in
/dev/$rbsp)
my $cfgsiz = 265; # Size of Vinum on-disk
configuration info in sectors
my $nxtpas = 2; # Next fsck pass number for
non-root file systems
# Parse fstab, generating the version we’ll
need for Vinum and noting
# spindles in use.
my $fsin = "/etc/fstab";
#my $fsin = "simu/fstab";
open(FSIN, "$fsin") ||
die("Couldn’t open $fsin: $!\n");
my $fsout = "/etc/fstab.vinum";
open(FSOUT, ">$fsout") ||
die("Couldn’t open $fsout for writing: $!\n");
while (_FSIN>) {
my ($dev, $mnt, $fstyp, $opt, $dump,
$pass) = split;
next if $dev =~ /^#/;
if ($mnt eq ’/’ || $mnt eq
’/rootback’ || $mnt =~ /^\/NOFUTURE/) {
my $dn = substr($dev, 5,
length($dev)-6); # Device Name without /dev/
push(@spndl, $dn) unless grep($_ eq
$dn, @spndl);
$rsp = $dn if $mnt eq ’/’;
next if $mnt =~ /^\/NOFUTURE/;
}
# Move /rootback from partition e to
a
if ($mnt =~ /^\/rootback/) {
$dev =~ s/e$/a/;
$pass = 1;
$rbsp = substr($dev, 5,
length($dev)-6);
print FSOUT
"$dev\t\t$mnt\t$fstyp\t$opt\t\t$dump\t$pass\n";
next;
}
# Move non-root file systems on
smallest spindle into Vinum
if (defined($rsp) && $dev =~
/^\/dev\/$rsp/ && $dev =~ /[d-h]$/) {
$pass = $nxtpas++;
print FSOUT
"/dev/vinum$mnt\t\t$mnt\t\t$fstyp\t$opt\t\t$dump\t$pass\n";
$vols{$dev}->{mnt} = substr($mnt, 1);
next;
}
print FSOUT $_;
}
close(FSOUT);
die("Found more spindles than we have
abstract names\n") if $#spndl > $#drv;
die("Didn’t find a root
partition!\n") if !defined($rsp);
die("Didn’t find a /rootback
partition!\n") if !defined($rbsp);
# Table of server’s Degraded Modes
# One row per mode with hash keys
# fn FileName
# xpr eXPRession needed to convert fstab
lines for this mode
# cm1 CoMment 1 describing this mode
# cm2 CoMment 2 describing this mode
# FH FileHandle (dynamically initialized
below)
my @DM = (
{ cm1 => "When we only have
$rsp, comment out lines using $rbsp",
fn =>
"/etc/fstab_only_have_$rsp",
xpr =>
"s:^/dev/$rbsp:#\$&:",
},
{ cm1 => "When we only have
$rbsp, comment out lines using $rsp and",
cm2 => "rootback becomes
root",
fn =>
"/etc/fstab_only_have_$rbsp",
xpr => "s:^/dev/$rsp:#\$&: ||
s:/rootback:/\t:",
},
{ cm1 => "When only $rsp root is
bad, /rootback becomes root and",
cm2 => "root becomes
/rootbad",
fn =>
"/etc/fstab_${rsp}_root_bad",
xpr => "s:\t/\t:\t/rootbad: ||
s:/rootback:/\t:",
},
);
# Initialize output FileHandles and write
comments
foreach my $dm (@DM) {
my $fh = new FileHandle;
$fh->open(">$dm->{fn}")
|| die("Can’t write $dm->{fn}: $!\n");
print $fh "# $dm->{cm1}\n" if
$dm->{cm1};
print $fh "# $dm->{cm2}\n" if
$dm->{cm2};
$dm->{FH} = $fh;
}
# Parse the Vinum version of fstab written
above and write versions needed
# for server’s degraded modes.
open(FSOUT, "$fsout") ||
die("Couldn’t open $fsout: $!\n");
while (_FSOUT>) {
my $line = $_;
foreach my $dm (@DM) {
$_ = $line;
eval $dm->{xpr};
print {$dm->{FH}} $_;
}
}
# Parse partition table for each spindle
and write versions needed for Vinum
my $rootsiz; # ROOT partition SIZe
my $swapsiz; # SWAP partition SIZe
my $rspminoff; # Root SPindle MINimum OFFset
of non-root, non-swap, non-c parts
my $rspsiz; # Root SPindle SIZe
my $rbspsiz; # RootBack SPindle SIZe
foreach my $i (0..$#spndl) {
my $dlin = "disklabel $spndl[$i]
|";
# my $dlin =
"simu/disklabel.$spndl[$i]";
open(DLIN, "$dlin") ||
die("Couldn’t open $dlin: $!\n");
my $dlout =
"disklabel.$spndl[$i]";
open(DLOUT, ">$dlout") ||
die("Couldn’t open $dlout for writing: $!\n");
my $dlb4 = "$dlout.b4vinum";
open(DLB4, ">$dlb4") ||
die("Couldn’t open $dlb4 for writing: $!\n");
my $minoff; # MINimum OFFset of non-root,
non-swap, non-c partitions
my $totsiz = 0; # TOTal SIZe of all
non-root, non-swap, non-c partitions
my $swapspndl = 0; # True if SWAP partition
on this SPiNDLe
while (_DLIN>) {
print DLB4 $_;
my ($part, $siz, $off, $fstyp, $fsiz,
$bsiz, $bps) = split;
if ($part && $part eq ’a:’
&& $spndl[$i] eq $rsp) {
$rootsiz = $siz;
}
if ($part && $part eq ’e:’
&& $spndl[$i] eq $rbsp) {
if ($rootsiz != $siz) {
die("Rootback size ($siz) !=
root size ($rootsiz)\n");
}
}
if ($part && $part eq ’c:’)
{
$rspsiz = $siz if $spndl[$i] eq
$rsp;
$rbspsiz = $siz if $spndl[$i] eq
$rbsp;
}
# Make swap partition $cfgsiz sectors
smaller
if ($part && $part eq ’b:’) {
if ($spndl[$i] eq $rsp) {
$swapsiz = $siz;
} else {
if ($swapsiz != $siz) {
die("Swap partition sizes
unequal across spindles\n");
}
}
printf DLOUT
"%4s%9d%9d%10s\n", $part, $siz-$cfgsiz, $off, $fstyp;
$swapspndl = 1;
next;
}
# Move rootback spindle e partitions to a
if ($part && $part eq ’e:’
&& $spndl[$i] eq $rbsp) {
printf DLOUT
"%4s%9d%9d%10s%9d%6d%6d\n", ’a:’, $siz, $off, $fstyp,
$fsiz, $bsiz, $bps;
next;
}
# Delete non-root, non-swap, non-c
partitions but note their minimum
# offset and total size that’re needed
below.
if ($part && $part =~ /^[d-h]:$/) {
$minoff = $off unless $minoff;
$minoff = $off if $off _ $minoff;
$totsiz += $siz;
if ($spndl[$i] eq $rsp) { # If doing
spindle containing root
my $dev = "/dev/$spndl[$i]" .
substr($part, 0, 1);
$vols{$dev}->{siz} = $siz;
$vols{$dev}->{off} = $off;
$rspminoff = $minoff;
}
next;
}
print DLOUT $_;
}
if ($swapspndl) { # If there was a swap
partition on this spindle
# Make a Vinum partition the size of all
non-root, non-swap,
# non-c partitions + the size of Vinum’s
on-disk configuration.
# Set its offset so that the start of the
first subdisk it contains
# coincides with the first file system
we’re embedding in Vinum.
printf DLOUT "%4s%9d%9d%10s\n",
"$vip:", $totsiz+$cfgsiz, $minoff-$cfgsiz,
’vinum’;
} else {
# No need to mess with size size and offset
if there was no swap
printf DLOUT "%4s%9d%9d%10s\n",
"$vip:", $totsiz, $minoff,
’vinum’;
}
}
die("Swap partition not found\n")
unless $swapsiz;
die("Swap partition not larger than
$cfgsiz blocks\n") unless $swapsiz>$cfgsiz;
die("Rootback spindle size not >=
root spindle size\n") unless $rbspsiz>=$rspsiz;
# Generate input to vinum create command
needed for each spindle.
foreach my $i (0..$#spndl) {
my $cfn = "create.$drv[$i]"; #
Create File Name
open(CF, ">$cfn") ||
die("Can’t open $cfn for writing: $!\n");
print CF "drive $drv[$i] device
/dev/$spndl[$i]$vip\n";
next unless $spndl[$i] eq $rsp ||
$spndl[$i] eq $rbsp;
foreach my $dev (keys(%vols)) {
my $mnt = $vols{$dev}->{mnt};
my $siz = $vols{$dev}->{siz};
my $off =
$vols{$dev}->{off}-$rspminoff+$cfgsiz;
print CF "volume $mnt\n" if
$spndl[$i] eq $rsp;
print CF __EOF;
plex name $mnt.p$i org concat volume $mnt
sd name $mnt.p$i.s0 drive $drv[$i] plex
$mnt.p$i len ${siz}s driveoffset ${off}s
EOF
}
}
手工进行Vinum配置
在第12.8.8.1的bootvinum Perl脚本将使工作变得更容易,但它可能也需要手动执行一些或全部配置。这个附录描述你如何手工地来模仿使用这个脚本。
1.
对/etc/fstab作一个拷贝进行定制。
# cp
/etc/fstab /etc/fstab.vinum
2.
编辑/etc/fstab.vinum。
a. 修改root spindle上的非root分区的device列为/dev/vinum/mnt。
b. 修改root spindle上的非root分区的pass列为2, 3, etc。
c. 删除任何加载点与/NOFUTURE*匹配的行。
d. 从e到a修改/rootback的device列。
e. 修改/rootback的pass列为1。
3.
为进行编辑准备disklabel:
# cd /bootvinum
# disklabel ad0s1 > disklabel.ad0s1
# cp disklabel.ad0s1
disklabel.ad0s1.b4vinum
# disklabel ad2s1 > disklabel.ad2s1
# cp disklabel.ad2s1 disklabel.ad2s1.b4vinum
4.
编辑/etc/disklabel.ad?s1文件。
a. 在root
spindle上:
i. 减少b分区的大小到265 blocks
ii. 注意a和b分区的大小和偏移量。
iii. 注意分区d-h的最小的偏移量。
iv. 注意所有非root,非swap分区的大小和偏移量(/home大概是在e上,而/usr大概是在f上)。
v. 删除分区d-h
vi. 用比上面介绍的分区d-h的最小的偏移量还少265 blocks的偏移量创建一个新的h分区。设置它的大小为比上面提到的分区d-h的最小偏移量还小的c分区加上+265 blocks。
注意:Vinum可以使用任何除c之外的分区。它不一定要为你的所有Vinum分区使用h。
vii. 设置这个新的分区的fstype为vinum。
b. 在rootback
spindle上:
i. 把e分区移到a。
ii. 检验一下a和b分区的大小是否与root spindle的匹配。
iii. 注意分区d-h的最小的偏移量。
iv. 删除分区d-h。
v. 用比上面介绍的分区d-h的最小的偏移量还少265 blocks的偏移量创建一个新的h分区。设置它的大小为比上面提到的分区d-h的最小偏移量还小的c分区加上+265 blocks。
vi. 设置这个新分区的fstype为vinum。
5.
创建一个名叫create.YouCrazy的包含下面这些行的文件:
drive
YouCrazy device /dev/ad0s1h
volume home
plex
name home.p0 org concat volume home
sd
name home.p0.s0 drive YouCrazy plex home.p0 len $hl
driveoffset $ho
volume usr
plex
name usr.p0 org concat volume usr
sd
name usr.p0.s0 drive YouCrazy plex usr.p0 len $ul driveoffset
$uo
这里:
• $hl是上面提到的/home的长度。
• $ho是上面提到的/home的比上面提到的最小偏移量还小的偏移量加上265 blocks。
• $ul是上面提到的/usr的长度。
• $uo是上面提到的/usr的比上面提到的最小偏移量还小的偏移量加上265 blocks。
6.
创建一个叫做create.UpWindow的包含下面这些行的文件:
drive UpWindow device /dev/ad2s1h
plex name home.p1 org concat volume home
sd name home.p1.s0 drive
UpWindow plex home.p1 len $hl driveoffset $ho
plex name usr.p1 org concat volume usr
sd name usr.p1.s0 drive
UpWindow plex usr.p1 len $ul driveoffset $uo
Where $hl, $ho, $ul, and $uo are set as
above.
感谢
我非常感谢Greg Lehey写了Vinum,而且在每一部分都提供了非常有帮助的注释。另外,也要感谢Dag-Erling Smørgrav, Michael Splendoria, Chern Lee, Stefan Aeschbacher,
Fleming Froekjaer, Bernd Walter, Aleksey Baranov和Doug
Swarin,是他们给出了一些有帮助的建议和意见。
12.9 硬件RAID
FreeBSD支持很多硬件RAID控制器,如:Adaptec,3Ware,Mylex,DPT,AMI,Dell,HP,IBM等。而且,FreeBSD支持的硬件RAID控制器也在不断地增长,所以你最好检查一下FreeBSD发行版本的参考信息。
12.10 用磁带机备份
主要的磁带机有4mm,8mm,QIC,mini-cartridge和DLT。
12.10.1 4mm(DDS: Digital Data Storage)
在Conner买下Archive(主要的QIC制造商)之后,4mm磁带机取代了QIC而成为工作站备份数据的设备,而停止了QIC设备的生产。4mm的驱动器更加小和安静,但对于数据保存的可信度仍不及8mm驱动器。它要比8mm的便宜和小得多(3 x 2 x 0.5 inches, 76 x 51 x 12
mm)。和8mm的一样,读写头的寿命都不长,因为它们同样是用螺旋式的方式来读写的。
数据传输的速度,约在150 KB/s到500
KB/s之间,可存储的空间从1.3 GB到2.0 GB,硬件压缩可使空间加倍。磁带库单元可以有6台磁带机,120个磁带匣,以自动切换的方式使用同一个磁带柜,磁带库的容量可达240 GB 。DDS-3标准现在支持的磁带机容量最高可达到12GB(或压缩的24GB)。
4mm和8mm的同样都是使用螺旋式读写的方式,所有螺旋式读写的优点及缺点,都可在4mm和8mm磁带机上看到。磁带在经过2000次的使用或100次的满载后,就该退休了。
12.10.2 8mm(Exabyte)
8mm磁带机是最常见的SCSI磁带机,也是磁带交换的最佳选择。几乎每个工作站都有一台exabyte 2 GB 8mm磁带机。8mm磁带机可信度高,方便,且安静。卡匣小(4.8 x 3.3 x 0.6 inches,122
x 84 x 15 mm)而且不贵。8mm磁带机的下边是一个短短的读写头,而读写头的寿命取决于磁带经过读写头时,高速的相对运动情况。数据传输的速度,约在250 KB/s到500 KB/s之间,可存储的空间从300 MB到7 GB,硬件压缩可使空间加倍。磁带库单元可以有6台磁带机,120个磁带匣,以自动切换的方式使用同一个磁带柜,磁带库的容量可达840 GB 。
数据是使用螺旋式读写的方式记录在磁带上的,读写头和磁带约相差6度,磁带以270度缠绕着轴,并抵住读写头,轴适时地旋转,使得磁带具有高密度,并可使磁道紧密地分布,从一端到另一端。
12.10.3 QIC
QIC-150是最常见的磁带机。和4 mm及8
mm比较,QIC磁带机比较贵,最高可能要5倍的价钱(每GigaByte)。假如你需要的是六台左右的磁带机,那么QIC将是正确的选择。QIC是最常见的磁带机,每个工作站都会有一台QIC磁带机。QIC磁带机具有几种不同的存储密度。QIC磁带机并不“安静”,读写时的声音都可清淅地听到。QIC磁带机的规格:6 x 4 x 0.7 inches,15.2 x 10.2 x 1.7 mm。Mini-cartridges用的同样是1/4"宽的磁带,将在后面讨论到。QIC不具有磁带库及切换的功能。
数据传输的速度介于150 KB/s和500
KB/s之间,可存储的空间从40 MB到15 GB。较新的QIC磁带机具有硬件压缩的功能。QIC的使用率愈来愈低,渐渐被DAT所取代。
数据以磁道的方式记录在磁带上,磁道数及磁道的宽度会根据容量而有所不同。通常新的磁带机具有向后兼容(backward-compatibility)的读取功能(通常也具备写入的功能)。对于数据的安全性,QIC具有不错的评价。磁带在经过5000次的使用后,就该退休了。
12.10.4 DLT
在这一章列出的磁带机中,DLT具有最快的数据传输速率。1/2”(12.5 mm)的磁带包含在单轴的磁带匣(4 x 4 x 1 inches,100 x 100 x 25 mm)中。磁带匣的一边是一个旋转匣道,通过匣道的开合,可以让磁带卷动。磁带匣内只有一个轴,而本章中所提到的其他磁带匣都是有两个轴的(9 磁道磁带机例外)。
数据传输的速度约1.5 MB/s,是4mm,8mm和QIC磁带机的三倍,可存储的空间从10 GB到20
GB,具有磁带机数据库。磁带机数据库单元可以有1到20台磁带机,5到900个磁带匣,磁带机数据库的容量可达50 GB到9 TB。如果要压缩的话,DLT IV型磁带机最高可支持70GB的存储容量。
数据存储在平行于磁带运行方向的磁道上(就像QIC磁带),一次写入两个磁道。读写头的寿命相当长,每当磁带停止前进,磁带与读写头之间没有相对运动。
12.10.5 AIT
AIT是sony开发的一种新格式,每个磁带最高可以存储50GB。磁带机使用内存芯片来保存磁带上的索引内容。这个索引能够被磁带机驱动器快速阅读来搜索磁带机上文件所处的位置,而不像其他的磁带机需要化几分钟的时间才能找到文件。像SAMS:Alexandria这样的软件:能够操作四十或者更多的AIT磁带库,直接使用内存芯片来进行通信把内容显示在屏幕上,以决定把什么文件备份到哪个磁带上,加载,恢复数据。
像这样的库成本大概在20000美元左右,零售市场可能还要贵一点。
12.10.6第一次使用新的磁带
当你在一块完全空白的磁带上尝试写入数据时,你会得到类似下面这样的错误信息:
sa0(ncr1:4:0): NOT READY asc:4,1
sa0(ncr1:4:0): Logical unit is in process of becoming
ready
信息指出这块磁带没有块编号(Identifier Block)(block编号0)。在QIC-525之后的所有QIC磁带,都采用QIC-525标准,必须写入一个Identifier Block。对于这种问题,有以下两种解决的办法:
用mt fsf 1可以让磁带机对磁带写入Identifier Block。
使用面板上的按钮退出磁带。
再插入一次,并存储(dump)数据到磁带上。
这时dump会传回DUMP:
End of tape detected,然后你会得到这样的错误信息:
HARDWARE FAILURE
info:280 asc:80,96
这时用mt rewind来倒转磁带,磁带操作的后续操作就完成了。
12.11备份程序
有三个主要的备份程序:dump,tar,cpio。
12.11.1 Dump和Restore
dump和restore是UNIX传统的备份程序。它以block为单位来备份数据,而不是以文件,链接或目录来备份数据。dump备份的是设备上的整个文件系统,不能只备份一个文件系统的部分或是用到两个以上文件系统的目录树。dump不会写文件和目录到磁带机,而是写入包含文件和目录的原始数据块。
注意:如果你在你的root目录使用dump,你将不需要备份/home,/usr或其他目录,因为这些是典型的其他文件系统或符号连接到那些文件系统的加载点。
Dump最早出现于AT&T UNIX的Version
6(约1975)。默认的参数适用于9-track磁带(6250 bpi),所以如果要用高密度的磁带(最高可达62.182 ftpi),就不能用默认的参数,而要另外指定参数。 这些默认值必须在命令行被修改以更好地利用当前磁带机的功能。
rdump和rrestore可以通过网络,在另一台计算机的磁带机上备份数据。这两个程序都是依靠rcmd和ruserok来访问远程的磁带机。因此,运行备份的用户必须要有远程主机的rhosts访问权。rdump和rrestore的参数必须适用于远程主机(例如,当你从FreeBSD连到一台Sun工作站komodo去使用磁带机时,使用/sbin/rdump 0dsbfu 54000 13000 126
komodo:/dev/nrsa8 /dev/rda0a 2>&1)。要注意的是:你必须检查你的情况,因为执行远程命令会牵涉到“安全”(security)的问题(指数据的安全性)。也可以通过ssh用一个更安全的方式来使用rdump和rrestore。
例12-4. 通过ssh使用rdump
# /sbin/dump -0uan -f -
/usr | gzip -2 | ssh1 -c blowfish \
[email protected]
dd of=/mybigfiles/dump-usr-l0.gz
12.11.2 tar
tar同样是在AT&T
Unix Version 6(约1975)中出现的。tar可以直接对文件系统操作。它直接将文件和目录写到磁带上,tar不支持像cpio那样多的选项,但tar不需要用像cpio那样奇怪的命令行管道。
许多版本的tar不支持通过网络备份,而GNU版的tar(FreeBSD用的就是GNU版的) 提供与rdump相同的语法来使用远程的设备。例如要tar Sun工作站komodo上一台Exabyte磁带机,就使用:/usr/bin/tar cf komodo:/dev/nrsa8 . 2>&1。对于不支持远程设备的tar,可以使用一个管道(pipeline)和rsh来传送数据给远程的磁带机。
# tar cf - . | rsh hostname dd of=tape-device
obs=20b
如果你担心通过网络备份会有安全问题,你应当使用ssh,而不是使用rsh.
12.11.3 cpio
cpio是Unix最早用来作文件交换的磁带机程序。它有执行字节交换(byte-swapping)的选项,可以用几种不同的格式写入,并且可以将数据用管道传(pipe)给其他程序。cpio没办法自动查找目录树内的文件列表,必须通过标准输入(stdin)来指定。
cpio不支持通过网络的备份方式。你可以使用pipeline和rsh来传送数据给远程的磁带机。
# for f in directory_list; do
find $f >> backup.list
done
# cpio -v -o --format=newc < backup.list |
ssh user@ host "cat > backup_device
这里的directory_list是你要备份的目录列表,user@host结合了将要执行备份的用户名和主机名,backup_device是写入备份的设备(如/dev/nrsa0)。
12.11.4 pax
pax是IEEE/POSIX标准的程序。多年来各种不同版本的tar和cpio间有些不兼容。为了防止这种情况,并使其标准化,POSIX出了这套新的工具程序。pax尝试可以读写各种cpio和tar的格式,并可以自己增加新的格式。它的命令集比tar更接近cpio。
12.11.5 Amanda
Amanda(Advanced Maryland Network Disk
Archiver)并非单一的程序,而是一个客户机/服务器(client/server)模式的备份系统。一台Amanda服务器可以备份任意数量执行Amanda的客户机,或是连上Amanda服务器的计算机上的数据到一台磁带机上。一个常见的问题是,将数据写入磁带机的时间,超过取得数据的时间,而Amanda解决了这个问题。它使用一个“holding disk”来同时备份几个文件系统。Amanda建立“archive sets”:一组磁带,用来备份在Amanda的配置文件中所列出的完整的文件系统。
Amanda配置文件提供完整的备份控制及Amanda产生的网络传输。Amanda可以使用上述任何一个备份程序来向磁带写入数据。Amanda可以从port或package取得,它并非系统默认安装的。
12.11.6 Do Nothing备份策略
“Do nothing”不是一个程序,而是最被广泛使用的备份策略。不需要预算,不需要备份的计划表,全部都不用。如果你的数据发生了什么问题,忽略它!
假如你的时间和数据不值得你做这些事,那么“Do nothing”将是你最好的备份程序。要注意的是,Unix是相当好用的工具,你可能在几个月内,就发现你已经收集了不少,对你来说,那是相当具有价值的东西。
“Do nothing”对于像/usr/obj或其他可由你的计算机产生的文件来说,是最好的方法。例如这本手册包含有HTML或Postscript格式的文件。这些文档格式是从SGML输入文件创建的。创建HTML或Postscript格式的文件的备份就没有必要了。SGML文件会很有规律地被恢复。
12.11.7哪个备份程序最好?
在dump时期,Elizabeth
D. Zwicky测试了所有以上所列出的备份程序。在各种各样怪异的文件系统中,dump是你明智的选择。Elizabeth建立起各种各样,奇怪,正常的文件系统,并用各种备份程序,测试在各种文件系统上备份及恢复数据。这些怪异之处包括:具有hole和一个null
block的文件,文件名具有有趣字符(funny character),无法读写的文件及设备,在备份时改变文件大小,在备份时建立或删除的文件。她将结果刊在
LISA V in Oct. 1991. torture-testing
Backup and Archive Programs(http://reality.sgi.com/zwicky_neu/testdump.doc.html)。
12.11.8紧急恢复程序
在出现灾难前
在遇到任何的灾难前,你只需要执行以下四个步骤:
第一,打出你的每个磁盘驱动器的磁盘标签(disklabel)(例如: disklabel da0 | lpr),文件系统表(/etc/fstab),以及所有的启动信息,并每个拷贝两份。
第二,确定遇到情况时,用来启动及修复的软盘(boot.flp,fixit.flp)具有你所有的设备代号(并且能够使用)。最简单的方法是用软盘启动,然后检查启动信息,如果你的设备都有被列出,并且可以正常使用,就可以跳到第三步。
否则,你必须建立两张传统的可启动软盘,并包含fdisk,disklabel,newfs,mount以及你所使用的备份程序。这些程序必需被静态连接。如果你使用的是dump,那么这张软盘就必须包含restore。
第三,定期将数据备份到磁带。任何在你上次备份后的改变都无法恢复。记得将磁带写保护。
第四,测试你在第二步所建立的软盘及备份的磁带,将过程记录下来,并和这张可启动的软盘,磁带放在一起。也许你在恢复时会想要,而这份记录将防止你破坏你的磁带(怎么说呢?因为你可能将tar xvf /dev/rsa0打成tar cvf /dev/rsa0而重写了你的备份磁带)。
为了安全,你可以每次都做两份备份磁带及一张启动磁盘,并将其中一份备份磁带存放在远方。远方不是指同一栋办公大楼的地下室 (世贸中心的一些公司应该学到了一些教训),而是真的要让你的磁带离你的计算机远远的。
例12-5. 一个建立启动磁盘的shell 脚本例子:
#!/bin/sh
#
# create a restore floppy
#
# format the floppy
#
PATH=/bin:/sbin:/usr/sbin:/usr/bin
fdformat -q fd0
if [ $? -ne 0 ]
then
echo “Bad floppy,
please use a new one”
exit 1
fi
# place boot blocks on the
floppy
#
disklabel -w -B /dev/fd0c
fd1440
#
# newfs the one and only
partition
#
newfs -t 2 -u 18 -l 1 -c 40
-i 5120 -m 5 -o space /dev/fd0a
#
# mount the new floppy
#
mount /dev/fd0a /mnt
#
# create required
directories
#
mkdir /mnt/dev
mkdir /mnt/bin
mkdir /mnt/sbin
mkdir /mnt/etc
mkdir /mnt/root
mkdir /mnt/mnt # for the
root partition
mkdir /mnt/tmp
mkdir /mnt/var
#
# populate the directories
#
if [ ! -x
/sys/compile/MINI/kernel ]
then
cat << EOM
The MINI kernel does not
exist, please create one.
Here is an example config
file:
#
# MINI -- A kernel to get
FreeBSD on onto a disk.
#
machine “i386”
cpu “I486_CPU”
ident MINI
maxusers 5
options INET
# needed for _tcp _icmpstat _ipstat
# udpstat _tcpstat _udb
options FFS
#Berkeley Fast File System
options FAT_CURSOR #block cursor in syscons or
pccons
options SCSI_DELAY=15 #Be pessimistic about Joe SCSI
device
options NCONS=2
#1 virtual consoles
options USERCONFIG #Allow user configuration
with -c XXX
config kernel root on da0 swap on da0 and da1 dumps
on da0
controller isa0
controller pci0
controller fdc0 at isa? port “IO_FD1” bio irq 6 drq 2 vector
fdintr
disk fd0
at fdc0 drive 0
controller ncr0
controller scbus0
device sc0 at isa?
port “IO_KBD” tty irq 1 vector scintr
device npx0 at isa? port “IO_NPX” irq
13 vector npxintr
device da0
device da1
device da2
device sa0
pseudo-device loop # required by INET
pseudo-device gzip # Exec gzipped a.out's
EOM
exit 1
fi
cp -f
/sys/compile/MINI/kernel /mnt
gzip -c -best /sbin/init
> /mnt/sbin/init
gzip -c -best /sbin/fsck
> /mnt/sbin/fsck
gzip -c -best /sbin/mount
> /mnt/sbin/mount
gzip -c -best /sbin/halt
> /mnt/sbin/halt
gzip -c -best /sbin/restore
> /mnt/sbin/restore
gzip -c -best /bin/sh >
/mnt/bin/sh
gzip -c -best /bin/sync
> /mnt/bin/sync
cp /root/.profile /mnt/root
cp -f /dev/MAKEDEV /mnt/dev
chmod 755 /mnt/dev/MAKEDEV
chmod 500 /mnt/sbin/init
chmod 555 /mnt/sbin/fsck
/mnt/sbin/mount /mnt/sbin/halt
chmod 555 /mnt/bin/sh
/mnt/bin/sync
chmod 6555
/mnt/sbin/restore
#
# create the devices nodes
#
cd /mnt/dev
./MAKEDEV std
./MAKEDEV da0
./MAKEDEV da1
./MAKEDEV da2
./MAKEDEV sa0
./MAKEDEV pty0
cd /
#
# create minimum 文件系统 table
#
cat > /mnt/etc/fstab
<<EOM
/dev/fd0a / ufs rw 1 1
EOM
#
# create minimum passwd
file
#
cat > /mnt/etc/passwd
<<EOM
root:*:0:0:Charlie
&:/root:/bin/sh
EOM
cat > /mnt/etc/master.passwd
<<EOM
root::0:0::0:0:Charlie
&:/root:/bin/sh
EOM
chmod 600
/mnt/etc/master.passwd
chmod 644 /mnt/etc/passwd
/usr/sbin/pwd_mkdb
-d/mnt/etc /mnt/etc/master.passwd
#
# umount the floppy and
inform the user
#
/sbin/umount /mnt
echo “The floppy has been
unmounted and is now ready.”
出现灾难之后
主要的问题在于:你的硬件还能用吗?由于你已经做好定期的备份工作,所以你不必担心软件的问题。
假如你的硬件已经损坏,首先,你必须先将已损坏的硬件换掉。
如果你的硬件没有问题,再检查一下你的软盘。如果你用的是传统的启动磁盘,以single-user(在出现boot: 后键入
-s),并跳过下面这段。
如果你使用的是具有boot.flp和fixit.flp的启动磁盘,把这段看完。首先,用这张磁盘启动。当屏幕出现安装选单时,选择Fixit-Repair mode with CDROM or
floppy.。根据屏幕的提示,插入有fixit.flp的磁盘,restore,其他你需要用到的程序就会出现在/mnt2/stand。
分别修复每一个文件系统。
试着挂上(mount)你的第一个磁盘的root分区(例如:mount /dev/da0a /mnt)。假如这个磁盘标签已经损坏,使用disklabel来重新分割并重新分配磁盘标签(利用你以前保留下来的数据)。使用newfs来建立文件系统,并重新挂上软盘读写的root分区(mount
-u -o rw /mnt)。然后使用你的备份程序及备份磁带来修复文件系统(例如:restore vrf /dev/sa0)。unmount这个文件系统(例如:umount /mnt)。对于每个损坏的文件系统都重复一次。
当你的系统正常打开后,将你的数据备份到新的磁带。任何造成数据丢失的灾难都可能再次发生。现在花一些时间,也许可以使你免于下次的灾难。
12.12用软盘备份
12.12.1我能够使用软盘来备份数据吗?
软磁盘通常是用来备份的设备中不太适当的设备:
这种设备不太可靠,特别是长期使用。
备份和恢复都很慢。
他们只有非常有限的存储容量。
然而,如果你没有其他的备份数据的方法,那软盘备份总比没有备份要好。
如果你必须使用软盘的话,你必须确保盘片的质量。软盘在办公室中使用已经有许多年了。最好使用一些名牌厂商的新产品,以确保质量。
12.12.2那我如何备份我的数据到软盘呢?
最好的备份数据到软盘的方法是使用tar程序加上-M选项,它可以允许将数据备份到多张软盘上。
要备份当前目录和子目录中所有的文件可以使用这个命令(需要有root权限):
# tar Mcvf /dev/rfd0 *
当第一张盘满的时候,tar会指示你插入下一张盘,插入第二张盘之后就打回车。这个步骤可能需要重复很多次,直到这些文件备份完为止。
12.12.3我可以压缩我的备份吗?
不幸的是,tar在为多卷文件作备份时是不允许使用-z选项的。当然,你可以用gzip压缩所有的文件,把他们打包到软盘,以后在用gunzip解开。
12.12.4我如何恢复我的备份?
要恢复使用的所有文件:
# tar Mxvf /dev/rfd0
要恢复第一张软盘起始使用的特殊文件:
# tar Mxvf /dev/rfd0 filename
tar程序会提示你插入后面的软盘,直到它找到所需要的文件。
如果你知道哪个文件在哪个盘上,你就可以插入那张盘,然后使用上面同样的命令。如果软盘上的第一个文件与前面的文件是连续的,那tar命令会警告你它无法恢复,即使你不要求它这样做!