第二十章 存储20.1. 简介20.2. 添加磁盘20.3. 调整磁盘大小和扩展磁盘20.4. USB存储设备20.4.1. 设备配置20.4.2. 自动装载可移动介质20.5. 创建和使用CD介质20.5.1. 支持设备20.5.2. 烧录CD20.5.3. 将数据写入ISO文件系统20.5.4. 使用数据CD20.5.5. 复制音频CD20.6. 创建和使用DVD介质20.6.1. 配置20.6.2. 刻录数据DVDs20.6.3. 刻录DVD视频20.6.4. 使用DVD+RW20.6.5. 使用DVD-RW20.6.6. 多会话20.6.7. 更多的信息20.6.8. 使用DVD-RAM20.7. 创建和使用软盘20.8. 备份基础知识20.8.1. 文件系统备份20.8.2. 目录备份20.8.3. 使用数据磁带进行备份20.8.4. 第三方备份工具20.8.5. 紧急恢复20.9. 内存磁盘20.9.1. 附加和分离现有映像20.9.2. 创建文件或内存备份的内存磁盘20.10. 文件系统快照20.11. 磁盘配额20.11.1. 启用磁盘配额20.11.2. 设置配额限制20.11.3. 检查配额限制和磁盘使用情况20.11.4. NFS配额20.12. 加密磁盘分区20.12.1. 使用gbde进行磁盘加密步骤:使用gbde加密分区20.12.2. 使用geli进行磁盘加密步骤:使用geli加密分区20.13. 加密Swap20.13.1. 配置加密Swap20.13.2. 加密Swap验证20.14. 高可用存储(HAST)20.14.1. HAST操作20.14.2. HAST配置20.14.2.1. 故障切换配置20.14.3. 故障排除20.14.3.1. 从Split-brain状态中恢复
本章介绍FreeBSD中磁盘和存储介质的使用。这包括SCSI和IDE磁盘、CD和DVD介质、内存备份磁盘和USB存储设备。
阅读本章以了解:
• 如何在FreeBSD系统中添加额外的硬盘。 • 如何在FreeBSD上增加磁盘分区的大小。 • 如何配置FreeBSD以使用USB存储设备。 • 如何在FreeBSD系统上使用CD和DVD介质。 • 如何使用FreeBSD下可用的备份程序。 • 如何设置内存磁盘。 • 什么是文件系统快照以及如何有效地使用它们。 • 如何使用配额限制磁盘空间使用。 • 如何加密磁盘并交换以保护其免受攻击者的攻击。 • 如何配置高可用存储网络。
在阅读本章之前:
• 知道如何 【10. 配置和安装新的FreeBSD内核】。
本节介绍如何向当前只有一个驱动器的机器添加新的SATA磁盘。首先,关闭计算机,按照计算机、控制器和驱动器制造商的说明在计算机中安装驱动器。重新启动系统并成为root用户。
检查 /var/run/dmesg.boot 以确保找到了新磁盘。在此示例中,新添加的SATA驱动器将显示为 ada1 。
对于这个例子,将在新磁盘上创建一个大分区。GPT分区方案将优先于旧的、通用性较低的MBR方案使用。
如果要添加的磁盘不是空的,则可以使用gpart delete删除旧的分区信息。详见gpart(8) 。创建分区方案,然后添加单个分区。为了提高具有较大硬件块大小的较新磁盘的性能,分区与一兆字节的边界对齐:
xxxxxxxxxx# gpart create -s GPT ada1# gpart add -t freebsd-ufs -a 1M ada1根据使用情况,可能需要几个较小的分区。有关创建小于整个磁盘的分区的选项,请参阅 gpart(8) 。
磁盘分区信息可以通过 gpart show 查看:
xxxxxxxxxx% gpart show ada1=> 34 1465146988 ada1 GPT (699G) 34 2014 - free - (1.0M) 2048 1465143296 1 freebsd-ufs (699G)1465145344 1678 - free - (839K)在新磁盘的新分区中创建文件系统:
xxxxxxxxxx# newfs -U /dev/ada1p1将创建一个空目录作为装载点,即在原始磁盘的文件系统中装载新磁盘的位置:
xxxxxxxxxx# mkdir /newdisk最后,在 /etc/fstab 中添加一个条目,这样新磁盘将在启动时自动挂载:
xxxxxxxxxx/dev/ada1p1 /newdisk ufs rw 2 2新磁盘可以手动挂载,无需重新启动系统:
xxxxxxxxxx# mount /newdisk磁盘的容量可以增加,而不会对现有的数据进行任何更改。这通常发生在虚拟机上,当虚拟磁盘太小并被放大时。有时,磁盘映像会写入USB记忆棒,但不会使用全部容量。在这里,我们描述了如何调整或增加(grow)磁盘内容以利用增加的容量。
通过检查 /var/run/dmesg.boot 来确定要调整大小的磁盘的设备名称。在此示例中,系统中只有一个SATA磁盘,因此驱动器将显示为ada0。
列出磁盘上的分区以查看当前配置:
xxxxxxxxxx# gpart show ada0=> 34 83886013 ada0 GPT (48G) [CORRUPT] 34 128 1 freebsd-boot (64k) 162 79691648 2 freebsd-ufs (38G) 79691810 4194236 3 freebsd-swap (2G) 83886046 1 - free - (512B)xxxxxxxxxx如果磁盘是用GPT分区方案格式化的,它可能会显示为 "corrupted"(已损坏),因为GPT备份分区表不再位于驱动器的末尾。使用gpart修复备份分区表: # gpart recover ada0 ada0 recovered现在,磁盘上的额外空间可供新分区使用,或者可以扩展现有分区:
xxxxxxxxxx# gpart show ada0=> 34 83886013 ada0 GPT (48G) 34 128 1 freebsd-boot (64k) 162 79691648 2 freebsd-ufs (38G) 79691810 4194236 3 freebsd-swap (2G) 83886046 18513921 - free - (8.8G)分区只能调整为连续的可用空间。这里,磁盘上的最后一个分区是交换分区,但第二个分区需要调整大小。交换分区只包含临时数据,因此可以安全地卸载、删除它,然后在调整第二个分区的大小后重新创建第三个分区。
禁用交换分区:
xxxxxxxxxx# swapoff /dev/ada0p3从磁盘 ada0 中删除由 -i 标志指定的第三个分区。
xxxxxxxxxx# gpart delete -i 3 ada0ada0p3 deleted# gpart show ada0=> 34 102399933 ada0 GPT (48G) 34 128 1 freebsd-boot (64k) 162 79691648 2 freebsd-ufs (38G) 79691810 22708157 - free - (10G)xxxxxxxxxx修改已装载文件系统的分区表时,存在数据丢失的风险。从活动CD-ROM或USB设备运行时,最好在未安装的文件系统上执行以下步骤。但是,如果绝对必要,可以在禁用GEOM安全功能后调整已挂载文件系统的大小: # sysctl kern.geom.debugflags=16调整分区大小,留出空间重新创建所需大小的交换分区。要调整大小的分区用 -i 指定,新的所需大小用 -s 指定。可选地,分区的对齐用 -a 控制。这只会修改分区的大小。分区中的文件系统将在单独的步骤中展开。
xxxxxxxxxx# gpart resize -i 2 -s 47G -a 4k ada0ada0p2 resized# gpart show ada0=> 34 102399933 ada0 GPT (48G) 34 128 1 freebsd-boot (64k) 162 98566144 2 freebsd-ufs (47G) 98566306 3833661 - free - (1.86G)重新创建交换分区并激活它。如果未使用-s指定大小,则使用所有剩余空间:
xxxxxxxxxx# gpart add -t freebsd-swap -a 4k ada0ada0p3 added# gpart show ada0=> 34 102399933 ada0 GPT (48G) 34 128 1 freebsd-boot (64k) 162 98566144 2 freebsd-ufs (47G) 98566306 3833661 3 freebsd-swap (1.86G)# swapon /dev/ada0p3扩展UFS文件系统以使用调整大小的分区的新容量:
xxxxxxxxxx# growfs /dev/ada0p2Device is mounted read-write; resizing will result in temporary write suspension for /.It's strongly recommended to make a backup before growing the file system.OK to grow file system on /dev/ada0p2, mounted on /, from 38GB to 47GB? [Yes/No] Yessuper-block backups (for fsck -b #) at:80781312, 82063552, 83345792, 84628032, 85910272, 87192512, 88474752,89756992, 91039232, 92321472, 93603712, 94885952, 96168192, 97450432如果文件系统是ZFS,则通过使用 -e 运行 online 子命令来触发调整大小:
xxxxxxxxxx# zpool online -e zroot /dev/ada0p2现在,分区及其上的文件系统都已调整大小,以使用新的可用磁盘空间。
许多外部存储解决方案,如硬盘驱动器、USB拇指驱动器以及CD和DVD刻录机,都使用通用串行总线(USB)。FreeBSD支持USB 1.x、2.0和3.0设备。
xxxxxxxxxxUSB 3.0支持与某些硬件不兼容,包括Haswell(Lynx point)芯片组。如果FreeBSD启动失败并显示 failed with error 19 消息,请在系统BIOS中禁用xHCI/USB3。GENERIC内核内置了对USB存储设备的支持。对于自定义内核,请确保内核配置文件中存在以下行:
xxxxxxxxxxdevice scbus # SCSI bus (required for ATA/SCSI)device da # Direct Access (disks)device pass # Passthrough device (direct ATA/SCSI access)device uhci # provides USB 1.x supportdevice ohci # provides USB 1.x supportdevice ehci # provides USB 2.0 supportdevice xhci # provides USB 3.0 supportdevice usb # USB Bus (required)device umass # Disks/Mass storage - Requires scbus and dadevice cd # needed for CD and DVD burnersFreeBSD使用 umass(4) 驱动程序,该驱动程序使用SCSI子系统访问USB存储设备。由于任何USB设备都会被系统视为SCSI设备,如果USB设备是CD或DVD刻录机,请不要在自定义内核配置文件中包含 device atapicam 。
本节的其余部分将演示如何验证USB存储设备是否被FreeBSD识别,以及如何配置该设备以便使用。
要测试USB配置,请插入USB设备。使用 dmesg 确认驱动器出现在系统消息缓冲区中。它应该看起来像这样:
xxxxxxxxxxumass0: <STECH Simple Drive, class 0/0, rev 2.00/1.04, addr 3> on usbus0umass0: SCSI over Bulk-Only; quirks = 0x0100umass0:4:0:-1: Attached to scbus4da0 at umass-sim0 bus 0 scbus4 target 0 lun 0da0: <STECH Simple Drive 1.04> Fixed Direct Access SCSI-4 deviceda0: Serial Number WD-WXE508CAN263da0: 40.000MB/s transfersda0: 152627MB (312581808 512 byte sectors: 255H 63S/T 19457C)da0: quirks=0x2<NO_6_BYTE>品牌、设备节点(da0)、速度和大小将因设备而异。
由于USB设备被视为SCSI设备,因此可以使用 camcontrol 列出连接到系统的USB存储设备:
xxxxxxxxxx# camcontrol devlist<STECH Simple Drive 1.04> at scbus4 target 0 lun 0 (pass3,da0)或者,可以使用 usbconfig 列出设备。有关此命令的更多信息,请参阅 usbconfig(8) 。
xxxxxxxxxx# usbconfigugen0.3: <Simple Drive STECH> at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON (2mA)如果设备尚未格式化,请参阅【20.2. 添加磁盘】,了解如何在USB驱动器上格式化和创建分区的说明。如果驱动器附带文件系统,则可以由root用户使用【3.7. 安装和卸载文件系统】中的说明进行安装。
xxxxxxxxxx从安全的角度来看,允许不受信任的用户通过启用 vfs.usermount 来挂载任意媒体是不安全的,如下所述。大多数文件系统都不是为了防御恶意设备而构建的。为了使设备可作为普通用户安装,一种解决方案是使用 pw(8) 使设备的所有用户成为 operator 组的成员。接下来,通过在 /etc/devfs.rules 中添加以下行来确保 operator 能够读写设备:
xxxxxxxxxx[localrules=5]add path 'da*' mode 0660 group operatorxxxxxxxxxx如果系统中还安装了内部SCSI磁盘,请按如下方式更改第二行: add path 'da[3-9]*' mode 0660 group operator这将使前三个SCSI磁盘(da0到da2)不属于operator组。将3替换为内部SCSI磁盘的数量。有关此文件的更多信息,请参阅devfs.rules(5)。接下来,在 /etc/rc.conf 中启用规则集:
xxxxxxxxxxdevfs_system_ruleset="localrules"然后,通过在 /etc/sysctl.conf 中添加以下行来指示系统允许普通用户挂载文件系统:
xxxxxxxxxxvfs.usermount=1由于这仅在下次重新启动后生效,请立即使用 sysctl 设置此变量:
xxxxxxxxxx# sysctl vfs.usermount=1vfs.usermount: 0 -> 1最后一步是创建一个要挂载文件系统的目录。此目录需要由要装载文件系统的用户拥有。一种方法是让root创建该用户拥有的子目录 /mnt/username 。在以下示例中,将 username 替换为用户的登录名,将 usergroup 替换为用户主组:
xxxxxxxxxx# mkdir /mnt/username# chown username:usergroup /mnt/username假设插入了USB拇指驱动器,并且出现了设备 /dev/da0s1 。如果设备使用FAT文件系统格式化,用户可以使用以下方式安装:
xxxxxxxxxx% mount -t msdosfs -o -m=644,-M=755 /dev/da0s1 /mnt/username在拔下设备之前,必须先将其卸载:
xxxxxxxxxx% umount /mnt/username设备移除后,系统消息缓冲区将显示类似以下内容的消息:
xxxxxxxxxxumass0: at uhub3, port 2, addr 3 (disconnected)da0 at umass-sim0 bus 0 scbus4 target 0 lun 0da0: <STECH Simple Drive 1.04> s/n WD-WXE508CAN263 detached(da0:umass-sim0:0:0:0): Periph destroyed通过在 /etc/auto_master 中取消注释此行,可以自动挂载USB设备:
xxxxxxxxxx/media -media -nosuid然后将这些行添加到 /etc/devd.conf 中:
xxxxxxxxxxnotify 100 { match "system" "GEOM"; match "subsystem" "DEV"; action "/usr/sbin/automount -c";};如果 autofs(5) 和 devd(8) 已在运行,请重新加载配置:
xxxxxxxxxx# service automount restart# service devd restart通过在 /etc/rc.conf 中添加以下行,可以将 autofs(5) 设置为在启动时启动:
xxxxxxxxxxautofs_enable="YES"autofs(5) 要求启用 devd(8) ,默认情况下是这样。
立即通过以下方式启动服务:
xxxxxxxxxx# service automount start# service automountd start# service autounmountd start# service devd start每个可以自动挂载的文件系统都显示为 /media/ 中的一个目录。目录以文件系统标签命名。如果缺少标签,则目录以设备节点命名。
文件系统在首次访问时透明地挂载,并在一段时间不活动后卸载。自动装载的驱动器也可以手动卸载:
xxxxxxxxxx# automount -fu这种机制通常用于存储卡和USB记忆棒。它可以与任何块设备一起使用,包括光盘驱动器或iSCSILUN。
光盘(CD)介质提供了许多区别于传统磁盘的功能。它们的设计使其可以连续读取,而不会延迟,从而在轨道之间移动磁头。虽然CD介质确实有轨道,但这些轨道是指要连续读取的数据段,而不是磁盘的物理属性。ISO 9660文件系统旨在处理这些差异。
FreeBSD Ports Collection提供了几个用于刻录和复制音频和数据CD的实用程序。本章演示了几个命令行实用程序的使用。对于带有图形实用程序的CD刻录软件,请考虑安装 sysutils/xcdroast 或 sysutils/k3b 软件包或ports。
GENERIC内核支持SCSI、USB和ATAPIC读卡器和刻录机。如果使用自定义内核,则内核配置文件中需要存在的选项因设备类型而异。
对于SCSI刻录机,请确保存在以下选项:
xxxxxxxxxxdevice scbus # SCSI bus (required for ATA/SCSI)device da # Direct Access (disks)device pass # Passthrough device (direct ATA/SCSI access)device cd # needed for CD and DVD burners对于USB刻录机,请确保存在以下选项:
xxxxxxxxxxdevice scbus # SCSI bus (required for ATA/SCSI)device da # Direct Access (disks)device pass # Passthrough device (direct ATA/SCSI access)device cd # needed for CD and DVD burnersdevice uhci # provides USB 1.x supportdevice ohci # provides USB 1.x supportdevice ehci # provides USB 2.0 supportdevice xhci # provides USB 3.0 supportdevice usb # USB Bus (required)device umass # Disks/Mass storage - Requires scbus and da对于ATAPI燃烧器,请确保存在以下选项:
xxxxxxxxxxdevice ata # Legacy ATA/SATA controllersdevice scbus # SCSI bus (required for ATA/SCSI)device pass # Passthrough device (direct ATA/SCSI access)device cd # needed for CD and DVD burnersxxxxxxxxxx在10.x之前的FreeBSD版本上,如果刻录机是ATAPI设备,则内核配置文件中也需要此行: device atapicam或者,可以在引导时通过在/boot/loader.conf中添加以下行来加载此驱动程序: atapicam_load="YES"这将需要重新启动系统,因为此驱动程序只能在启动时加载。要验证FreeBSD是否识别该设备,请运行 dmesg 并查找该设备的条目。在10.x之前的系统上,输出第一行中的设备名称将是acd0而不是cd0。
xxxxxxxxxx% dmesg | grep cdcd0 at ahcich1 bus 0 scbus1 target 0 lun 0cd0: <HL-DT-ST DVDRAM GU70N LT20> Removable CD-ROM SCSI-0 devicecd0: Serial Number M3OD3S34152cd0: 150.000MB/s transfers (SATA 1.x, UDMA6, ATAPI 12bytes, PIO 8192bytes)cd0: Attempt to query device size failed: NOT READY, Medium not present - tray closed在FreeBSD中,cdrecord 可用于刻录CD。此命令与 sysutils/cdrtools 包或端口一起安装。
虽然 cdrecord 有很多选项,但基本用法很简单。指定要刻录的ISO文件的名称,如果系统有多个刻录机设备,请指定要使用的设备的名称:
xxxxxxxxxx# cdrecord dev=device imagefile.iso要确定燃烧器的设备名称,请使用 -scanbus ,这可能会产生如下结果:
xxxxxxxxxx# cdrecord -scanbusProDVD-ProBD-Clone 3.00 (amd64-unknown-freebsd10.0) Copyright (C) 1995-2010 Jörg SchillingUsing libscg version 'schily-0.9'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) *找到CD刻录机的条目,并使用逗号分隔的三个数字作为 dev 的值。在这种情况下,雅马哈刻录机设备为 1,5,0 ,因此指定该设备的适当输入为 dev=1.5,0 。有关指定此值的其他方法以及有关写入音轨和控制写入速度的信息,请参阅 cdrecord 手册页。
或者,运行以下命令以获取燃烧器的设备地址:
xxxxxxxxxx# camcontrol devlist<MATSHITA CDRW/DVD UJDA740 1.00> at scbus1 target 0 lun 0 (cd0,pass0)使用 scbus 、 target 和 lun 的数值。对于这个例子, 1,0,0 是要使用的设备名称。
为了制作数据CD,必须先准备好组成CD上轨道的数据文件,然后才能将其刻录到CD上。在FreeBSD中, sysutils/cdrtools 安装 mkisofs ,可用于生成ISO 9660文件系统,该系统是UNIX®文件系统中目录树的映像。最简单的用法是指定要创建的ISO文件的名称以及要放入ISO 9660文件系统的文件路径:
xxxxxxxxxx# mkisofs -o imagefile.iso /path/to/tree此命令将指定路径中的文件名映射到符合标准ISO 9660文件系统限制的名称,并将排除不符合ISO文件系统标准的文件。
有许多选择可以克服标准施加的限制。特别是, -R 启用UNIX®系统通用的Rock Ridge扩展, -J 启用Microsoft®系统使用的Joliet扩展。
对于仅在FreeBSD系统上使用的CD, -U 可用于禁用所有文件名限制。当与 -R 一起使用时,它会生成一个与指定的FreeBSD树相同的文件系统映像,即使它违反了ISO 9660标准。
最后一个常用选项是 -b 。这用于指定用于生成“El Torito”可引导CD的引导映像的位置。此选项接受一个参数,该参数是从写入CD的树顶部到引导映像的路径。默认情况下, mkisofs 在 "floppy disk emulation"(软盘模拟)模式下创建ISO映像,因此期望引导映像的大小恰好为1200、1440或2880 KB。一些引导加载程序,如FreeBSD发行版所使用的,不使用模拟模式。在这种情况下,应使用 -no-emul-boot 。因此,如果 /tmp/myboot 包含一个引导映像在 /tmp/myboot/boot/cdboot 中的可引导FreeBSD系统,则此命令将生成 /tmp/bootable.iso :
xxxxxxxxxx# mkisofs -R -no-emul-boot -b boot/cdboot -o /tmp/bootable.iso /tmp/myboot生成的ISO映像可以安装为具有以下功能的存储磁盘:
xxxxxxxxxx# mdconfig -a -t vnode -f /tmp/bootable.iso -u 0# mount -t cd9660 /dev/md0 /mnt然后可以验证 /mnt 和 /tmp/myboot 是否相同。
mkisofs 还有许多其他选项可用于微调其行为。详见 mkisofs(8) 。
xxxxxxxxxx可以将数据CD复制到功能上与使用mkisofs创建的图像文件等效的图像文件中。为此,使用dd,设备名称作为输入文件,ISO名称作为输出文件: # dd if=/dev/cd0 of=file.iso bs=2048生成的映像文件可以按照刻录CD中的说明刻录到CD。ISO刻录到CD后,可以通过指定文件系统类型、包含CD的设备名称和现有装载点来装载:
xxxxxxxxxx# mount -t cd9660 /dev/cd0 /mnt由于 mount 假定文件系统为 ufs 类型,因此如果在挂载数据CD时不包含 -t cd9660 ,则会出现 Incorrect super block(不正确的超级块)错误。
虽然任何数据CD都可以通过这种方式安装,但具有某些ISO 9660扩展名的磁盘可能会表现得很奇怪。例如,Joliet磁盘以两字节Unicode字符存储所有文件名。如果某些非英语字符显示为问号,请使用 -C 指定本地字符集。有关更多信息,请参阅 mount_cd9660(8) 。
xxxxxxxxxx为了在-C的帮助下进行字符转换,内核需要加载cd9660_iconv.ko模块。这可以通过在loader.conf中添加以下行来完成: cd9660_iconv_load="YES"然后重新启动机器或直接用kldload加载模块。在尝试装载数据CD时,偶尔会显示 Device not configured (未配置的设备)。这通常意味着CD驱动器未检测到托盘中的磁盘,或者驱动器在总线上不可见。CD驱动器可能需要几秒钟才能检测到介质,所以请耐心等待。
有时,SCSICD驱动器可能会丢失,因为它没有足够的时间来响应总线重置。为了解决这个问题,可以创建一个自定义内核,增加默认的SCSI延迟。将以下选项添加到自定义内核配置文件中,并使用【10.5. 构建和安装自定义内核】中的说明重建内核:
xxxxxxxxxxoptions SCSI_DELAY=15000这告诉SCSI总线在引导过程中暂停15秒,以使CD驱动器有机会回答总线复位。
xxxxxxxxxx可以直接将文件刻录到CD,而无需创建ISO 9660文件系统。这被称为刻录原始数据CD,有些人这样做是为了备份。这种类型的磁盘不能作为普通数据CD装载。为了检索刻录到这种CD上的数据,必须从原始设备节点读取数据。例如,此命令将把位于第二个CD设备上的压缩tar文件提取到当前工作目录中: # tar xzvf /dev/cd1为了装载数据CD,必须使用mkisofs写入数据。要复制音频CD,请将CD中的音频数据提取为一系列文件,然后将这些文件写入空白CD。
复制音频CD描述了如何复制和刻录音频CD。如果FreeBSD版本低于10.0并且设备是ATAPI,则必须首先使用支持的设备中的说明加载 atapicam 模块。
步骤:复制音频CD
sysutils/cdrtools 软件包或port安装 cdda2wav 。此命令可用于提取所有音轨,每个音轨都写入当前工作目录中的单独WAV文件:
xxxxxxxxxx% cdda2wav -vall -B -Owav如果系统上只有一个CD设备,则不需要指定设备名称。有关如何指定设备的说明以及了解此命令可用的其他选项的更多信息,请参阅 cdda2wav 手册页。
使用 cdrecord 写入.wav文件:
xxxxxxxxxx% cdrecord -v dev=2,0 -dao -useinfo *.wav确保 2,0 设置正确,如【20.5.2. 刻录CD】中所述。
与CD相比,DVD是下一代光介质存储技术。DVD可以容纳比任何CD更多的数据,是视频发布的标准。
可录制DVD可以定义五种物理可录制格式:
单层可记录DVD最多可容纳470000000字节,实际上是4.38 GB或4485 MB,因为1千字节等于1024字节。
xxxxxxxxxx必须区分物理介质和应用程序。例如,DVD-Video是一种特定的文件布局,可以写入任何可记录的DVD物理介质,如DVD-R、DVD+R或DVD-RW。在选择介质类型之前,请确保刻录机和DVD-Video播放器与所考虑的介质兼容。要执行DVD录制,请使用 growisofs(1) 。此命令是支持所有dvd介质类型的 sysutils/dvd+rw-tools 实用程序的一部分。
这些工具使用SCSI子系统访问设备,因此必须将ATAPI/CAM支持加载或静态编译到内核中。如果燃烧器使用USB接口,则不需要此支持。有关USB设备配置的更多详细信息,请参阅【20.4. USB存储设备】。
还必须通过在 /boot/loder.conf 中添加以下行来为ATAPI设备启用DMA访问:
xxxxxxxxxxhw.ata.atapi_dma="1"在尝试使用dvd+rw-tools之前,请参阅硬件兼容性说明。
xxxxxxxxxx对于图形用户界面,可以考虑使用sysutils/k3b,它为growisofs(1)和许多其他刻录工具提供了用户友好的界面。由于 growisofs(1) 是 mkisofs 的前端,它将调用 mkisofs(8) 来创建文件系统布局并在DVD上执行写入。这意味着在刻录过程之前不需要创建数据的映像。
要将 /path/To/data 中的数据刻录到DVD+R或DVD-R,请使用以下命令:
xxxxxxxxxx# growisofs -dvd-compat -Z /dev/cd0 -J -R /path/to/data在这个例子中, -J -R 被传递给 mkisofs(8) ,以创建具有Joliet和Rock Ridge扩展名的ISO 9660文件系统。有关更多详细信息,请参阅 mkisofs(8) 。
对于初始会话录制,-Z 用于单会话和多会话。将 /dev/cd0 替换为DVD设备的名称。使用 -dvd-compat 表示磁盘将被关闭,录制将无法播放。这也应该提供与DVDROM驱动器更好的介质兼容性。
要刻录预处理的图像,如 imagefile.iso ,请使用:
xxxxxxxxxx# growisofs -dvd-compat -Z /dev/cd0=imagefile.iso应检测写入速度,并根据所使用的介质和驱动器自动设置写入速度。要强制写入速度,请使用 -speed= 。有关示例用法,请参阅 growisofs(1) 。
xxxxxxxxxx为了支持大于4.38GB的工作文件,必须通过将 -udf -iso-level 3 传递给mkisofs(8)和所有相关程序(如growisofs(1))来创建UDF/ISO-9660混合文件系统。仅当创建ISO映像文件或将文件直接写入磁盘时,才需要这样做。由于以这种方式创建的磁盘必须使用mount_UDF(8)作为UDF文件系统挂载,因此它只能在支持UDF的操作系统上使用。否则,它看起来就像包含损坏的文件。要创建此类ISO文件,请执行以下操作: % mkisofs -R -J -udf -iso-level 3 -o imagefile.iso /path/to/data要将文件直接刻录到磁盘,请执行以下操作: # growisofs -dvd-compat -udf -iso-level 3 -Z /dev/cd0 -J -R /path/to/data当ISO映像已经包含大文件时,growisofs(1)不需要额外的选项就可以将该映像刻录到磁盘上。一定要使用最新版本的sysutils/cdrtools,其中包含mkisofs(8),因为旧版本可能不包含大文件支持。如果最新版本不起作用,请安装sysutils/cdrtools-devel并读取其mkisofs(8)。DVD视频是基于ISO 9660和微UDF(M-UDF)规范的特定文件布局。由于DVD-Video呈现了特定的数据结构层次结构,因此需要特定的程序(multimedia/dvdauthor)来创作DVD。
如果DVD-Video文件系统的映像已经存在,则可以以与任何其他映像相同的方式进行刻录。如果使用 dvdauthor 制作DVD,结果在 /path/to/video 中,则应使用以下命令刻录DVD视频:
xxxxxxxxxx# growisofs -Z /dev/cd0 -dvd-video /path/to/video-dvd-video 被传递给 mkisofs(8) ,以指示它创建DVD-Video文件系统布局。此选项意味着 -dvd-compat growisofs(1) 选项。
与CD-RW不同,原始DVD+RW在首次使用前需要格式化。建议在适当的时候让 growisofs(1) 自动处理此问题。但是,可以使用 dvd+rw-format 来格式化DVD+RW:
xxxxxxxxxx# dvd+rw-format /dev/cd0只执行一次此操作,并记住只需要格式化原始DVD+RW介质。格式化后,DVD+RW可以像往常一样刻录。
要刻录一个全新的文件系统,而不仅仅是将一些数据附加到DVD+RW上,不需要先清空介质。相反,请这样重写之前的录音:
xxxxxxxxxx# growisofs -Z /dev/cd0 -J -R /path/to/newdataDVD+RW格式支持将数据附加到之前的记录中。此操作包括将新会话合并到现有会话,因为它不被视为多会话写入。growisofs(1) 将扩展介质上存在的ISO 9660文件系统。
例如,要将数据附加到DVD+RW,请使用以下命令:
xxxxxxxxxx# growisofs -M /dev/cd0 -J -R /path/to/nextdata在下次写入时,应使用用于刻录初始会话的相同 mkisofs(8) 选项。
xxxxxxxxxx使用-dvd-compat可获得与DVD-ROM驱动器更好的介质兼容性。使用DVD+RW时,此选项不会阻止添加数据。要清空媒体,请使用:
xxxxxxxxxx# growisofs -Z /dev/cd0=/dev/zeroDVD-RW接受两种光盘格式:增量顺序和限制重写。默认情况下,DVD-RW光盘采用顺序格式。
原始DVD-RW可以直接写入而无需格式化。然而,在写入新的初始会话之前,顺序格式的非原始DVD-RW需要被消隐。
要在顺序模式下清空DVD-RW:
xxxxxxxxxx# dvd+rw-format -blank=full /dev/cd0xxxxxxxxxx在1x介质上使用 -blank=full 进行完全消隐大约需要一个小时。如果DVD-RW将以一次磁盘(DAO)模式记录,则可以使用 -blank 执行快速消隐。要在DAO模式下刻录DVD-RW,请使用以下命令: # growisofs -use-the-force-luke=dao -Z /dev/cd0=imagefile.iso由于growisofs(1)会自动尝试检测快速消隐的介质并进行DAO写入,因此不需要 -use-the-force-luke=DAO。相反,应该对任何DVD-RW使用限制覆盖模式,因为这种格式比默认的增量顺序格式更灵活。要在顺序DVD-RW上写入数据,请使用与其他DVD格式相同的说明:
xxxxxxxxxx# growisofs -Z /dev/cd0 -J -R /path/to/data要将一些数据附加到之前的记录中,请在 growisofs(1) 中使用 -M 。但是,如果以增量顺序模式将数据附加到DVD-RW上,则将在光盘上创建新的会话,结果将是多会话光盘。
限制重写格式的DVD-RW在新的初始会话之前不需要被消隐。相反,用 -Z 覆盖光盘。也可以用 -M 扩展写入光盘上的现有ISO 9660文件系统。结果将是一个单会话DVD。
要将DVD-RW设置为受限覆盖格式,必须使用以下命令:
xxxxxxxxxx# dvd+rw-format /dev/cd0要更改回顺序格式,请使用:
xxxxxxxxxx# dvd+rw-format -blank=full /dev/cd0很少有DVD-ROM驱动器支持多会话DVD,而且大多数时候只读取第一个会话。顺序格式的DVD+R、DVD-R和DVD-RW可以接受多个会话。DVD+RW和DVD-RW限制重写格式不存在多个会话的概念。
在DVD+R、DVD-R或DVD-RW上以顺序格式进行初始非关闭会话后,使用以下命令将向光盘添加新会话:
xxxxxxxxxx# growisofs -M /dev/cd0 -J -R /path/to/nextdata将此命令与DVD+RW或限制覆盖模式下的DVD-RW一起使用,将在将新会话合并到现有会话时附加数据。结果将是一张单会话光盘。使用此方法在这些类型的介质上进行初始写入后添加数据。
xxxxxxxxxx由于在每个会话之间使用媒体上的一些空间来标记会话的结束和开始,因此应该添加具有大量数据的会话以优化媒体空间。DVD+R的会话数量限制为154个,DVD-R的会话数量约为2000个,DVD+R双层的会话数量为127个。要获取有关DVD的更多信息,请在指定驱动器中的光盘中使用 dvd+rw-mediainfo /dev/cd0 。
有关 dvd+rw-tools 的更多信息,请参阅 growisofs(1) 、dvd+rw-tools网站 和 cdwrite邮件列表档案。
xxxxxxxxxx在创建与dvd+rw-tools使用相关的问题报告时,始终包含dvd+rw-mediainfo的输出。DVD-RAM刻录机可以使用SCSI或ATAPI接口。对于ATAPI设备,必须通过在 /boot/loader.conf 中添加以下行来启用DMA访问:
xxxxxxxxxxhw.ata.atapi_dma="1"DVD-RAM可以被视为可移动硬盘。与任何其他硬盘驱动器一样,DVD-RAM必须先格式化才能使用。在这个例子中,整个磁盘空间将使用标准的UFS2文件系统进行格式化:
xxxxxxxxxx# dd if=/dev/zero of=/dev/acd0 bs=2k count=1# bsdlabel -Bw acd0# newfs /dev/acd0DVD设备acd0必须根据配置进行更改。
格式化DVD-RAM后,可以将其作为普通硬盘挂载:
xxxxxxxxxx# mount /dev/acd0 /mnt一旦挂载,DVD-RAM将可读写。
本节介绍如何在FreeBSD中格式化3.5英寸软盘。
程序:格式化软盘的步骤
软盘需要低级格式化才能使用。这通常由供应商完成,但格式化是检查媒体完整性的好方法。要在FreeBSD上对软盘进行低级格式化,请使用 fdformat(1) 。使用此实用程序时,请记下任何错误消息,因为这些消息可以帮助确定磁盘是好是坏。
要格式化软盘,请将一张新的3.5英寸软盘插入第一个软盘驱动器,然后发出:
xxxxxxxxxx# /usr/sbin/fdformat -f 1440 /dev/fd0在对磁盘进行低级格式化后,根据系统的需要创建磁盘标签,以确定磁盘的大小及其几何形状。支持的几何值列在 /etc/disktab 中。
要写入磁盘标签,请使用bsdlabel(8):
xxxxxxxxxx# /sbin/bsdlabel -B -w /dev/fd0 fd1440软盘现在已准备好使用文件系统进行高级格式化。软盘的文件系统可以是UFS或FAT,其中FAT通常是软盘的更好选择。
要使用FAT格式化软盘,请发出:
xxxxxxxxxx# /sbin/newfs_msdos /dev/fd0磁盘现在已准备好使用。要使用软盘,请使用 mount_msdosfs(8) 将其挂载。还可以从Ports Collection安装和使用 emulators/mtools 。
实施备份计划至关重要,以便能够从磁盘故障、意外文件删除、随机文件损坏或完全机器破坏(包括现场备份的破坏)中恢复。
备份类型和时间表会有所不同,具体取决于数据的重要性、文件恢复所需的粒度以及可接受的停机时间。一些可能的备份技术包括:
net/rsync 与网络上的另一个系统同步的整个文件系统或磁盘的副本。通常,会使用多种备份技术。例如,可以创建一个计划来自动化存储在异地的每周完整系统备份,并用每小时的ZFS快照补充此备份。此外,在编辑或删除文件之前,可以手动备份单个目录或文件。
本节介绍一些可用于在FreeBSD系统上创建和管理备份的实用程序。
用于备份文件系统的传统UNIX®程序是创建备份的 dump(8) 和恢复备份的 restore(8) 。这些实用程序在磁盘块级别工作,位于文件系统创建的文件、链接和目录的抽象之下。与其他备份软件不同, dump 备份整个文件系统,无法仅备份文件系统的一部分或跨多个文件系统的目录树。dump 不是写入文件和目录,而是写入包含文件和目录的原始数据块。
xxxxxxxxxx如果在根目录上使用dump,它将不会备份/home、/usr或许多其他目录,因为这些目录通常是其他文件系统的挂载点或指向这些文件系统的符号链接。当用于还原数据时,默认情况下,restore 会将临时文件存储在 /tmp/ 中。使用具有小 /tmp 的恢复磁盘时,将 TMPDIR 设置为具有更多可用空间的目录,以便还原成功。
使用 dump 时,请注意,大约在1975年,AT&T UNIX®版本6的早期仍然存在一些怪癖。默认参数假定备份到9磁道磁带,而不是另一种类型的介质或目前可用的高密度磁带。必须在命令行上覆盖这些默认值。
可以通过网络将文件系统备份到另一个系统或连接到另一台计算机的磁带驱动器。虽然 rdump(8) 和 rrestore(8) 实用程序可用于此目的,但它们被认为是不安全的。
相反,可以通过SSH连接更安全地使用 dump 和 restore 。此示例创建 /usr 的完整压缩备份,并通过SSH连接将备份文件发送到指定的主机。
例26. 在ssh上使用dump
xxxxxxxxxx# /sbin/dump -0uan -f - /usr | gzip -2 | ssh -c blowfish \ targetuser@targetmachine.example.com \ dd of=/mybigfiles/dump-usr-l0.gz此示例设置RSH,以便通过SSH连接将备份写入远程系统上的磁带驱动器:
例27. 使用ssh dump 和RSH集
xxxxxxxxxx# env RSH=/usr/bin/ssh /sbin/dump -0uan -f targetuser@targetmachine.example.com:/dev/sa0 /usrxxxxxxxxxx使用Z文件系统(ZFS)的系统可以利用zfs(8)创建快照,以及向远程系统发送快照和从远程系统接收快照。有几个内置实用程序可用于根据需要备份和还原指定的文件和目录。
对目录中的所有文件进行备份的一个好选择是 tar(1) 。此实用程序可追溯到AT&T UNIX®的版本6,默认情况下假定对本地磁带设备进行递归备份。开关可用于指定备份文件的名称。
此示例创建当前目录的压缩备份并将其保存到 /tmp/mybackup.tgz 。创建备份文件时,请确保备份未保存到正在备份的同一目录中。
例28. 使用tar备份当前目录
xxxxxxxxxx# tar czvf /tmp/mybackup.tgz .要还原整个备份,请使用 cd 命令进入要还原的目录中,并指定备份的名称。请注意,这将覆盖还原目录中任何较新版本的文件。如有疑问,请还原到临时目录或指定要还原的备份中的文件名。
例29. 使用tar还原当前目录
xxxxxxxxxx# tar xzvf /tmp/mybackup.tgztar(1) 中描述了数十种可用的开关(switches)。此实用程序还支持使用排除模式来指定在备份指定目录或从备份中还原文件时不应包含哪些文件。
要使用指定的文件和目录列表创建备份,cpio(1) 是一个不错的选择。与 tar 不同, cpio 不知道如何遍历目录树,必须向其提供要备份的文件列表。
例如,可以使用 ls 或 find 创建文件列表。此示例创建了当前目录的递归列表,然后通过管道将其传输到 cpio ,以创建名为 /tmp/mybackup.cpio 的输出备份文件。
示例30. 使用 ls 和 cpio 对当前目录进行递归备份
xxxxxxxxxx# ls -R | cpio -ovF /tmp/mybackup.cpiopax(1) 是一个备份实用程序,它试图桥接 tar 和 cpio 提供的功能。多年来,tar 和 cpio 的各种版本变得有些不兼容。POSIX®创建了 pax ,它试图读写许多不同的 cpio 和 tar 格式,以及它自己的新格式。
与前面的示例等效的 pax 为:
示例31. 使用 pax 备份当前目录
xxxxxxxxxx# pax -wf /tmp/mybackup.pax .虽然磁带技术不断发展,但现代备份系统往往将异地备份与本地可移动介质相结合。FreeBSD支持任何使用SCSI的磁带驱动器,如LTO或DAT。对SATA和USB磁带驱动器的支持有限。
对于SCSI磁带设备,FreeBSD使用 sa(4) 驱动程序和 /dev/sa0 、/dev/nsa0 和 /dev/esa0 设备。物理设备名称为 /dev/sa0 。当使用 /dev/nsa0 时,备份应用程序在写入文件后不会倒带(not rewind),这允许将多个文件写入磁带。使用 /dev/esa0 在设备关闭后弹出(ejects)磁带。
在FreeBSD中, mt 用于控制磁带驱动器的操作,例如在磁带上查找文件或将磁带控制标记写入磁带。例如,在写入新文件之前,可以跳过磁带上的前三个文件来保存它们:
xxxxxxxxxx# mt -f /dev/nsa0 fsf 3此实用程序支持许多操作。详见 mt(1) 。
要使用 tar 将单个文件写入磁带,请指定磁带设备的名称和要备份的文件:
xxxxxxxxxx# tar cvf /dev/sa0 file要将磁带上的 tar 存档中的文件恢复到当前目录中,请执行以下操作:
xxxxxxxxxx# tar xvf /dev/sa0要备份UFS文件系统,请使用 dump 。此示例在完成时备份 /usr 而不倒带:
xxxxxxxxxx# dump -0aL -b64 -f /dev/nsa0 /usr要交互式地将文件从磁带上的 dump 文件还原到当前目录中,请执行以下操作:
xxxxxxxxxx# restore -i -f /dev/nsa0FreeBSD Ports Collection提供了许多第三方实用程序,可用于安排备份的创建,简化磁带备份,使备份更容易、更方便。其中许多应用程序是基于客户端/服务器的,可用于自动备份单个系统或网络中的所有计算机。
流行的实用程序包括:
• Amanda(misc/amanda-server 和 misc/amanda-client), • Bacula(sysutils/bacula13-server 和 sysutils/bacula13-client), • Bareos(sysutils/bareos-server 和 sysutils/bareos-client), • net/rsync, • sysutils/duply • sysutils/duplicity
除了定期备份外,建议执行以下步骤作为应急准备计划的一部分。
创建以下命令输出的打印副本:
• gpart show • more /etc/fstab • pkg prime-list • dmesg
将此打印输出和安装介质的副本存储在安全位置。如果需要紧急恢复,请启动安装介质并选择Live CD以访问救援shell。此救援模式可用于查看系统的当前状态,并在需要时重新格式化磁盘和从备份中还原数据。
接下来,测试救援shell和备份。记下程序。将这些笔记与媒体、打印输出和备份一起存储。这些注释可以防止在执行紧急恢复的压力下无意中破坏备份。
为了增加安全性,请将最新备份存储在与计算机和磁盘驱动器物理上相隔很远的远程位置。
除了物理磁盘,FreeBSD还支持创建和使用内存磁盘。内存盘的一个可能用途是访问ISO文件系统的内容,而无需首先将其刻录到CD或DVD,然后安装CD/DVD介质。
在FreeBSD中,md(4) 驱动程序用于为内存磁盘提供支持。GENERIC内核包含此驱动程序。使用自定义内核配置文件时,确保它包含以下行:
xxxxxxxxxxdevice md要挂载现有的文件系统映像,请使用 mdconfig 指定ISO文件的名称和空闲单元号。然后,参考该单元编号将其挂载在现有的挂载点上。挂载后,ISO中的文件将出现在挂载点。此示例将 diskimage.iso 附加到内存设备 /dev/md0 ,然后将该内存设备挂载到 /mnt 上:
xxxxxxxxxx# mdconfig -f diskimage.iso -u 0# mount -t cd9660 /dev/md0 /mnt请注意,-t cd9660 用于挂载ISO格式。如果未使用 -u 指定单元号, mdconfig 将自动分配一个未使用的内存设备,并输出所分配单元的名称,如md4。有关此命令及其选项的更多详细信息,请参阅 mdconfig(8) 。
当内存磁盘不再使用时,应将其资源释放回系统。首先,卸载文件系统,然后使用 mdconfig 将磁盘与系统分离并释放其资源。继续这个例子:
xxxxxxxxxx# umount /mnt# mdconfig -d -u 0要确定是否仍有任何内存磁盘连接到系统,请键入 mdconfig -l 。
FreeBSD还支持从硬盘或内存区域分配存储空间的内存磁盘。第一种方法通常称为文件备份文件系统,第二种方法称为内存备份文件系统。这两种类型都可以使用 mdconfig 创建。
要创建新的内存备份文件系统,请指定 swap 类型和要创建的内存磁盘的大小。然后,用文件系统格式化内存磁盘,并像往常一样挂载。本例在第一单元上创建一个5M内存磁盘。然后,在挂载之前,使用UFS文件系统对内存磁盘进行格式化:
xxxxxxxxxx# mdconfig -a -t swap -s 5m -u 1# newfs -U md1/dev/md1: 5.0MB (10240 sectors) block size 16384, fragment size 2048 using 4 cylinder groups of 1.27MB, 81 blks, 192 inodes. with soft updatessuper-block backups (for fsck -b #) at: 160, 2752, 5344, 7936# mount /dev/md1 /mnt# df /mntFilesystem 1K-blocks Used Avail Capacity Mounted on/dev/md1 4718 4 4338 0% /mnt要创建新的文件备份内存磁盘,请先分配要使用的磁盘区域。此示例创建了一个名为 newimage 的5MB空文件:
xxxxxxxxxx# dd if=/dev/zero of=newimage bs=1k count=5k5120+0 records in5120+0 records out接下来,将该文件附加到内存磁盘,标记内存磁盘并用UFS文件系统格式化,挂载内存磁盘,并验证文件备份磁盘的大小:
xxxxxxxxxx# mdconfig -f newimage -u 0# bsdlabel -w md0 auto# newfs -U md0a/dev/md0a: 5.0MB (10224 sectors) block size 16384, fragment size 2048 using 4 cylinder groups of 1.25MB, 80 blks, 192 inodes.super-block backups (for fsck -b #) at: 160, 2720, 5280, 7840# mount /dev/md0a /mnt# df /mntFilesystem 1K-blocks Used Avail Capacity Mounted on/dev/md0a 4710 4 4330 0% /mnt使用 mdconfig 创建文件或内存支持的文件系统需要几个命令。FreeBSD还附带了 mdmfs ,它可以自动配置内存磁盘,用UFS文件系统格式化并挂载它。例如,在用 dd 创建 newimage 后,这个命令相当于运行上面显示的 bsdlabel 、 newfs 和 mount 命令:
xxxxxxxxxx# mdmfs -F newimage -s 5m md0 /mnt要使用 mdmfs 创建新的基于内存的内存磁盘,请使用以下命令:
xxxxxxxxxx# mdmfs -s 5m md1 /mnt如果未指定单元号, mdmfs 将自动选择一个未使用的内存设备。有关 mdmfs 的更多详细信息,请参阅 mdmfs(8) 。
FreeBSD提供了一个与软更新相结合的功能:文件系统快照。
UFS快照允许用户创建指定文件系统的映像,并将其视为文件。使用 Z文件系统(ZFS) 时,请参阅管理快照以了解如何使用快照。
必须在执行操作的文件系统中创建快照文件,每个文件系统最多只能创建20个快照。活动快照记录在超级块中,因此它们在卸载和重新挂载操作以及系统重新启动时都是持久的。当不再需要快照时,可以使用 rm(1) 将其删除。虽然快照可以按任何顺序删除,但可能无法获取所有已使用的空间,因为另一个快照可能会占用一些已释放的块。
不可更改的快照文件标志由 mksnap_ffs(8) 在初始创建快照文件后设置。 unlink(1) 对快照文件进行了例外处理,因为它允许删除快照文件。
使用 mount(8) 创建快照。要在 /var/snapshot/snap 文件中放置 /var 的快照,请使用以下命令:
xxxxxxxxxx# mount -u -o snapshot /var/snapshot/snap /var或者,使用 mksnap_ffs(8) 创建快照:
xxxxxxxxxx# mksnap_ffs /var /var/snapshot/snap可以使用 find(1) 在文件系统上查找快照文件,例如 /var :
xxxxxxxxxx# find /var -flags snapshot创建快照后,它有几个用途:
一些管理员会使用快照文件进行备份,因为快照可以传输到CD或磁带上。
文件系统完整性检查器 fsck(8) 可以在快照上运行。假设文件系统在挂载时是干净的,这应该始终提供干净且不变的结果。
在快照上运行 dump(8) 将生成一个与快照的文件系统和时间戳一致的转储文件。 dump(8) 还可以拍摄快照,创建转储映像,然后使用-L在一个命令中删除快照。
快照可以作为文件系统的冻结映像挂载。要 mount(8) 快照 /var/snapshot/snap ,请运行:
xxxxxxxxxx# mdconfig -a -t vnode -o readonly -f /var/snapshot/snap -u 4# mount -r /dev/md4 /mnt冻结的 /var 现在可以通过 /mnt 获得。所有内容最初都将处于与快照创建时相同的状态。唯一的例外是,任何早期的快照都将显示为零长度文件。要卸载快照,请使用:
xxxxxxxxxx# umount /mnt# mdconfig -d -u 4有关 softupdates 和文件系统快照的更多信息,包括技术论文,请访问Marshall Kirk McKusick的网站 http://www.mckusick.com/ 。
磁盘配额可用于限制用户或组成员在每个文件系统基础上分配的磁盘空间量或文件数量。这可以防止一个用户或一组用户消耗所有可用磁盘空间。
本节介绍如何为UFS文件系统配置磁盘配额。要在ZFS文件系统上配置配额,请参阅【22.4.8. 数据集、用户和组配额】。
要确定FreeBSD内核是否支持磁盘配额:
xxxxxxxxxx% sysctl kern.features.ufs_quotakern.features.ufs_quota: 1在这个例子中,1 表示配额支持。如果该值改为 0 ,请将以下行添加到自定义内核配置文件中,并使用【10. 配置FreeBSD内核】中的说明重建内核:
xxxxxxxxxxoptions QUOTA接下来,在 /etc/rc.conf 中启用磁盘配额:
xxxxxxxxxxquota_enable="YES"通常在启动时,每个文件系统的配额完整性由 quotacheck(8) 检查。此程序确保配额数据库中的数据正确反映文件系统上的数据。这是一个耗时的过程,将显著影响系统启动所需的时间。要跳过此步骤,请将此变量添加到 /etc/rc.conf :
xxxxxxxxxxcheck_quotas="NO"最后,编辑 /etc/fstab 以在每个文件系统的基础上启用磁盘配额。要在文件系统上启用每用户配额,请将 userquota 添加到 /etc/fstab 条目中的选项字段,以便在文件系统中启用配额。例如:
xxxxxxxxxx/dev/da1s2g /home ufs rw,userquota 1 2要启用组配额,请改用 groupquota 。要启用用户和组配额,请用逗号分隔选项:
xxxxxxxxxx/dev/da1s2g /home ufs rw,userquota,groupquota 1 2默认情况下,配额文件作为 quota.user 和 quota.group 存储在文件系统的根目录中。有关更多信息,请参阅 fstab(5) 。不建议为配额文件指定其他位置。
配置完成后,重新启动系统, /etc/rc 将自动运行相应的命令,为 /etc/fstab 中启用的所有配额创建初始配额文件。
在正常操作过程中,不需要手动运行 quotacheck(8) 、quotaon(8) 或 quotaoff(8) 。但是,应该阅读这些手册页以熟悉其操作。
要验证是否启用了配额,请运行:
xxxxxxxxxx# quota -v对于启用配额的每个文件系统,应该有一行磁盘使用情况和当前配额限制的摘要。
系统现在已准备好使用 edquota 分配配额限制。
有几个选项可以强制限制用户或组可以分配的磁盘空间量,以及他们可以创建多少文件。可以根据磁盘空间(block quotas,块配额)、文件数量(inode quotas,索引节点配额)或两者的组合来限制分配。每个限制进一步分为两类:硬限制和软限制。
不得超过硬性限制。一旦用户达到硬限制,该用户就无法在该文件系统上进行进一步的分配。例如,如果用户在文件系统上有500千字节的硬限制,并且当前正在使用490千字节,则用户只能分配额外的10千字节。尝试分配额外的11KB将失败。
可以在有限的时间内超过软限制,称为宽限期(grace period),默认为一周。如果用户超过其限制的时间超过宽限期,则软限制将变为硬限制,不允许进一步分配。当用户回落到软限制以下时,宽限期将重置。
在以下示例中,正在编辑 test 帐户的配额。当调用 edquota 时,将打开 EDITOR 指定的编辑器以编辑配额限制。默认编辑器设置为vi。
xxxxxxxxxx# edquota -u testQuotas for user test:/usr: kbytes in use: 65, limits (soft = 50, hard = 75) inodes in use: 7, limits (soft = 50, hard = 60)/usr/var: kbytes in use: 0, limits (soft = 50, hard = 75) inodes in use: 0, limits (soft = 50, hard = 60)每个启用了配额的文件系统通常有两行。一行表示块限制,另一行表示索引节点限制。更改该值以修改配额限制。例如,要将 /usr 上的块限制提高到软限制500和硬限制600,请按如下方式更改该行中的值:
xxxxxxxxxx/usr: kbytes in use: 65, limits (soft = 500, hard = 600)新的配额限制在退出编辑器时生效。
有时,对一定范围的用户设置配额限制是可取的。这可以通过首先为用户分配所需的配额限制来实现。然后,使用 -p 将该配额复制到指定的用户ID(UID)范围内。以下命令将复制UID 10000 到 19999 的配额限制:
xxxxxxxxxx# edquota -p test 10000-19999有关更多信息,请参阅 edquota(8) 。
要检查单个用户或组配额和磁盘使用情况,请使用 quota(1) 。用户只能检查自己的配额和他们所属组的配额。只有超级用户可以查看所有用户和组配额。要获取启用配额的文件系统的所有配额和磁盘使用情况的摘要,请使用 repquota(8) 。
通常,即使用户为该文件系统分配了 quota 限制,用户未使用任何磁盘空间的文件系统也不会显示在配额的输出中。使用 -v 显示这些文件系统。以下是 quota -v 为在两个文件系统上有配额限制的用户提供的示例输出。
xxxxxxxxxxDisk quotas for user test (uid 1002): Filesystem usage quota limit grace files quota limit grace /usr 65* 50 75 5days 7 50 60 /usr/var 0 50 75 0 50 60在这个例子中,用户当前在 /usr 上的软限制为50k字节,超出15k字节,还有5天的宽限期。星号 * 表示用户当前已超过配额限制。
配额由NFS服务器上的配额子系统强制执行。 rpc.rquotad(8) 守护进程使配额信息可用于NFS客户端上的 quota ,允许这些计算机上的用户查看其配额统计信息。
在NFS服务器上,通过删除 /etc/inetd.conf 中此行的 # 来启用 rpc.rquotad :
xxxxxxxxxxrquotad/1 dgram rpc/udp wait root /usr/libexec/rpc.rquotad rpc.rquotad然后重启 inetd :
xxxxxxxxxx# service inetd restartFreeBSD提供了出色的在线保护,防止未经授权的数据访问。文件权限和强制访问控制(【18. MAC】)有助于防止未经授权的用户在操作系统处于活动状态且计算机通电时访问数据。但是,如果攻击者可以物理访问计算机,并可以将计算机的硬盘驱动器移动到另一个系统以复制和分析数据,则操作系统强制执行的权限是无关紧要的。
无论攻击者是如何获得硬盘驱动器或关闭计算机电源的,FreeBSD内置的基于GEOM的加密子系统都能够保护计算机文件系统上的数据,即使是拥有大量资源的动机很强的攻击者。与加密单个文件的加密方法不同,内置的 gbde 和 geli 实用程序可用于透明地加密整个文件系统。明文永远不会碰到硬盘的盘片。
本章演示如何在FreeBSD上创建加密文件系统。它首先使用 gbde 演示了该过程,然后使用 geli 演示了相同的示例。
gbde(4) 设施的目标是为攻击者提供一个艰巨的挑战,以获取对 cold 设备内容的访问权限。但是,如果计算机在启动和运行时受到攻击,并且存储设备处于活动连接状态,或者攻击者可以访问有效的密码,则无法对存储设备的内容提供保护。因此,在系统运行时提供物理安全并保护加密机制使用的密码非常重要。
该设施提供了几个屏障来保护存储在每个磁盘扇区中的数据。它在CBC模式下使用128位AES加密磁盘扇区的内容。磁盘上的每个扇区都使用不同的AES密钥进行加密。有关加密设计的更多信息,包括如何从用户提供的密码中导出扇区密钥(sector keys),请参阅 gbde(4) 。
FreeBSD为gbde提供了一个内核模块,可以用以下命令加载:
xxxxxxxxxx# kldload geom_bde如果使用自定义内核配置文件,请确保它包含以下行:
xxxxxxxxxxoptions GEOM_BDE以下示例演示了向系统中添加一个新的硬盘驱动器,该硬盘驱动器将保存一个加密分区,该分区将作为 /private 挂载。
添加新硬盘
按照【20.2. 添加磁盘】中的说明将新驱动器安装到系统中。为了本例的目的,添加了一个新的硬盘分区 /dev/ad4s1c ,/dev/ad0s1* 表示现有的标准FreeBSD分区。
xxxxxxxxxx# ls /dev/ad*/dev/ad0 /dev/ad0s1b /dev/ad0s1e /dev/ad4s1/dev/ad0s1 /dev/ad0s1c /dev/ad0s1f /dev/ad4s1c/dev/ad0s1a /dev/ad0s1d /dev/ad4创建保存 gbde 锁定文件的目录
xxxxxxxxxx# mkdir /etc/gbdegbde锁文件包含gbde访问加密分区所需的信息。如果不访问锁文件,gbde将无法解密加密分区中包含的数据,除非有软件不支持的大量手动干预。每个加密分区都使用一个单独的锁文件。
初始化gbde分区
gbde分区必须先初始化才能使用。此初始化只需要执行一次。此命令将打开默认编辑器,以便在模板中设置各种配置选项。要与UFS文件系统一起使用,请将sector_size设置为2048:
xxxxxxxxxx# gbde init /dev/ad4s1c -i -L /etc/gbde/ad4s1c.lock## Sector size is the smallest unit of data which can be read or written.# Making it too small decreases performance and decreases available space.# Making it too large may prevent filesystems from working. 512 is the# minimum and always safe. For UFS, use the fragment size#sector_size = 2048[...]保存编辑后,将两次要求用户键入用于保护数据的密码。两次密码必须相同。gbde保护数据的能力完全取决于密码的质量。有关如何选择易于记忆的安全密码的提示,请参阅 http://world.std.com/~reinhold/diceware.htm 。
此初始化将为gbde分区创建一个锁文件。在这个例子中,它被存储为 /etc/gbde/ad4s1c.lock 。锁文件必须以 .Lock 结尾,才能被 /etc/rc.d/gbde 启动脚本正确检测到。
xxxxxxxxxx锁文件必须与任何加密分区的内容一起备份。没有锁文件,合法所有者将无法访问加密分区上的数据。将加密分区附加到内核
xxxxxxxxxx# gbde attach /dev/ad4s1c -l /etc/gbde/ad4s1c.lock此命令将提示输入在初始化加密分区期间选择的密码。新的加密设备将以 /dev/device_name.bde 的形式出现在 /dev 中:
xxxxxxxxxx# ls /dev/ad*/dev/ad0 /dev/ad0s1b /dev/ad0s1e /dev/ad4s1/dev/ad0s1 /dev/ad0s1c /dev/ad0s1f /dev/ad4s1c/dev/ad0s1a /dev/ad0s1d /dev/ad4 /dev/ad4s1c.bde在加密设备上创建文件系统
一旦加密设备连接到内核,就可以在设备上创建文件系统。此示例创建了一个启用了软更新的UFS文件系统。请确保指定扩展名为 *.bde 的分区:
xxxxxxxxxx# newfs -U /dev/ad4s1c.bde装载加密分区
创建装载点并装载加密文件系统:
xxxxxxxxxx# mkdir /private# mount /dev/ad4s1c.bde /private验证加密文件系统是否可用
加密文件系统现在应该可见并可供使用:
xxxxxxxxxx% df -HFilesystem Size Used Avail Capacity Mounted on/dev/ad0s1a 1037M 72M 883M 8% //devfs 1.0K 1.0K 0B 100% /dev/dev/ad0s1f 8.1G 55K 7.5G 0% /home/dev/ad0s1e 1037M 1.1M 953M 0% /tmp/dev/ad0s1d 6.1G 1.9G 3.7G 35% /usr/dev/ad4s1c.bde 150G 4.1K 138G 0% /private每次启动后,必须手动将任何加密的文件系统重新连接到内核,检查错误并挂载,然后才能使用这些文件系统。要配置这些步骤,请在 /etc/rc.conf 中添加以下行:
xxxxxxxxxxgbde_autoattach_all="YES"gbde_devices="ad4s1c"gbde_lockdir="/etc/gbde"这要求在启动时在控制台输入密码。键入正确的密码后,加密分区将自动挂载。其他gbde引导选项可用,并在 rc.conf(5) 中列出。
xxxxxxxxxxsysinstall与gbde加密设备不兼容。在启动sysinstall之前,必须将所有*.bde设备从内核中分离出来,否则它将在首次探测设备时崩溃。要分离示例中使用的加密设备,请使用以下命令: # gbde detach /dev/ad4s1c使用 geli 可以提供另一种加密GEOM类。此控制实用程序添加了一些功能,并使用不同的方案进行加密工作。它提供了以下功能:
crypto(9) 框架,并在可用时自动使用加密硬件。更多功能和使用示例可以在 geli(8) 中找到。
以下示例描述了如何生成一个密钥文件,该文件将用作挂载在 /private 下的加密提供程序的主密钥的一部分。密钥文件将提供一些用于加密主密钥的随机数据。主密钥也将受到密码保护。提供商的扇区大小将为4kB。该示例描述了如何附加到 geli 提供程序,在其上创建文件系统,挂载它,使用它,以及最后如何分离它。
加载 geli支架
对 geli 的支持可作为可加载的内核模块提供。要配置系统在启动时自动加载模块,请在 /boot/loader.conf 中添加以下行:
xxxxxxxxxxgeom_eli_load="YES"现在加载内核模块:
xxxxxxxxxx# kldload geom_eli对于自定义内核,请确保内核配置文件包含以下行:
xxxxxxxxxxoptions GEOM_ELIdevice crypto生成主密钥
以下命令生成一个主密钥,所有数据都将使用该密钥进行加密。此密钥永远不能更改。它不是直接使用它,而是用一个或多个用户密钥加密。用户密钥由文件中的随机字节、 /root/da2.key 和/或密码的可选组合组成。在这种情况下,密钥文件的数据源是 /dev/random 。此命令还将提供程序的扇区大小( /dev/da2.eli )配置为4kB,以获得更好的性能:
xxxxxxxxxx# dd if=/dev/random of=/root/da2.key bs=64 count=1# geli init -K /root/da2.key -s 4096 /dev/da2Enter new passphrase:Reenter new passphrase:不必同时使用密码和密钥文件,因为保护主密钥的任何一种方法都可以单独使用。
如果密钥文件为“-”,则将使用标准输入。例如,此命令生成三个密钥文件:
xxxxxxxxxx# cat keyfile1 keyfile2 keyfile3 | geli init -K - /dev/da2将生成的密钥附加到提供者
要附加提供程序,请指定密钥文件、磁盘名称和密码:
xxxxxxxxxx# geli attach -k /root/da2.key /dev/da2Enter passphrase:这将创建一个扩展名为 .eli 的新设备:
xxxxxxxxxx# ls /dev/da2*/dev/da2 /dev/da2.eli创建新文件系统
接下来,使用UFS文件系统格式化设备,并将其挂载到现有的挂载点上:
xxxxxxxxxx# dd if=/dev/random of=/dev/da2.eli bs=1m# newfs /dev/da2.eli# mount /dev/da2.eli /private加密文件系统现在应该可以使用了:
xxxxxxxxxx# df -HFilesystem Size Used Avail Capacity Mounted on/dev/ad0s1a 248M 89M 139M 38% //devfs 1.0K 1.0K 0B 100% /dev/dev/ad0s1f 7.7G 2.3G 4.9G 32% /usr/dev/ad0s1d 989M 1.5M 909M 0% /tmp/dev/ad0s1e 3.9G 1.3G 2.3G 35% /var/dev/da2.eli 150G 4.1K 138G 0% /private一旦加密分区的工作完成,并且不再需要 /private 分区,谨慎的做法是通过卸载并从内核中分离 geli 加密分区将设备放入冷存储中:
xxxxxxxxxx# umount /private# geli detach da2.eli提供了一个rc.d脚本,以简化启动时 geli 加密设备的挂载。对于这个例子,将以下行添加到 /etc/rc.conf 中:
xxxxxxxxxxgeli_devices="da2"geli_da2_flags="-k /root/da2.key"这将 /dev/da2 配置为具有 /root/da2.key 主密钥的 geli 提供程序。在系统关闭之前,系统会自动将提供程序与内核分离。在启动过程中,脚本将在附加提供程序之前提示输入密码。其他内核消息可能会在密码提示前后显示。如果启动过程似乎停滞,请仔细查看其他消息中的密码提示。输入正确的密码后,将附加提供者。然后,通常通过 /etc/fstab 中的条目挂载文件系统。有关如何配置文件系统以在启动时装载的说明,请参阅【3.7. 装载和卸载文件系统】。
与磁盘分区的加密一样,交换空间的加密用于保护敏感信息。考虑一个处理密码的应用程序。只要这些密码保留在物理内存中,它们就不会写入磁盘,并在重新启动后被清除。但是,如果FreeBSD开始将内存页交换为可用空间,密码可能会以未加密的方式写入磁盘。加密交换空间可能是这种情况的解决方案。
本节演示如何使用 gbde(8) 或 geli(8) 加密配置加密交换分区。它假设 /dev/ada0s1b 是交换分区。
默认情况下,交换分区不加密,在继续之前应清除任何敏感数据。要用随机垃圾覆盖当前交换分区,请执行以下命令:
xxxxxxxxxx# dd if=/dev/random of=/dev/ada0s1b bs=1m要使用 gbde(8) 加密交换分区,请在 /etc/fstab 中的交换行后添加 .bde 后缀:
xxxxxxxxxx# Device Mountpoint FStype Options Dump Pass#/dev/ada0s1b.bde none swap sw 0 0默认情况下,geli(8) 使用密钥长度为128位的AES算法。通常默认设置就足够了。如果需要,可以在 /etc/fstab 的选项字段中更改这些默认值。可能的标志有:
aalgo
数据完整性验证算法,用于确保加密数据未被篡改。有关支持的算法列表,请参阅 geli(8) 。
ealgo
用于保护数据的加密算法。有关支持的算法列表,请参阅 geli(8) 。
keylen
用于加密算法的密钥长度。关于每种加密算法支持的密钥长度,请参见 geli(8) 。
sectorsize
块数据的大小在加密之前被分解。更大的扇区大小以更高的存储开销为代价提高了性能。建议大小为4096字节。
此示例使用密钥长度为128位、扇区大小为4千字节的AES-XTS算法配置加密交换分区:
xxxxxxxxxx# Device Mountpoint FStype Options Dump Pass#/dev/ada0s1b.eli none swap sw,ealgo=AES-XTS,keylen=128,sectorsize=4096 0 0系统重新启动后,可以使用 swapinfo 验证加密交换的正确操作。
如果启用了 gbde(8) :
xxxxxxxxxx% swapinfoDevice 1K-blocks Used Avail Capacity/dev/ada0s1b.bde 542720 0 542720 0如果启用了 geli(8) :
xxxxxxxxxx% swapinfoDevice 1 K-blocks Used Avail Capacity/dev/ada0s1b.eli 542720 0 542720 0高可用性是严肃业务应用程序的主要要求之一,高可用存储是此类环境中的关键组成部分。在FreeBSD中,高可用存储(Highly Available Storage,HAST)框架允许在通过TCP/IP网络连接的几个物理上分离的机器上透明地存储相同的数据。HAST可以理解为基于网络的RAID1(镜像),类似于GNU/Linux®平台中使用的DRBD®存储系统。结合FreeBSD的其他高可用性特性,如CARP,HAST可以构建一个能够抵抗硬件故障的高可用存储集群。
HAST的主要特征如下:
阅读本章以了解:
devd(8) 以构建一个强大的存储系统。在阅读本节之前:
HAST项目由FreeBSD基金会赞助,并得到了 http://www.omc.net/ 和 http://www.transip.nl/ 的支持
HAST在两台物理机器(primary 节点和 secondary 节点)之间提供同步块级复制。这两台机器统称为集群。
由于HAST在主从配置中工作,因此在任何给定时间只允许一个集群节点处于活动状态。主节点也称为 active(活动)节点,它将处理对HAST管理设备的所有I/O请求。辅助节点会自动与主节点同步。
HAST系统的物理组件是主节点上的本地磁盘和远程辅助节点上的磁盘。
HAST在块级别上同步运行,使其对文件系统和应用程序透明。HAST在 /dev/hast/ 中提供常规的GEOM提供程序,供其他工具或应用程序使用。使用HAST提供的设备和原始磁盘或分区之间没有区别。
每次写入、删除或刷新操作都会通过TCP/IP发送到本地磁盘和远程磁盘。每次读取操作都从本地磁盘提供,除非本地磁盘不是最新的或发生I/O错误。在这种情况下,读取操作被发送到辅助节点。
HAST试图提供快速的故障恢复。因此,减少节点中断后的同步时间非常重要。为了提供快速同步,HAST管理脏盘区的ondisk位图,并且仅在常规同步期间同步这些盘区,初始同步除外。
处理同步的方法有很多。HAST实现了多种复制模式来处理不同的同步方法:
memsync
当本地写入操作完成并且远程节点确认数据到达时,但在实际存储数据之前,此模式报告写入操作已完成。发送确认后,远程节点上的数据将直接存储。此模式旨在减少延迟,但仍提供良好的可靠性。此模式为默认模式。
fullsync
当本地写入和远程写入都完成时,此模式报告写入操作已完成。这是最安全和最慢的复制模式。
async
此模式在本地写入完成时报告写入操作已完成。这是最快、最危险的复制模式。它只应在复制到其他模式延迟过高的远程节点时使用。
HAST框架由几个组件组成:
hastd(8) 守护进程。启动此守护进程时,它将自动加载 geom_gate.ko 。hastctl(8) 。hast.conf(5) 配置文件。在启动hastd之前,此文件必须存在。喜欢在内核中静态构建 GEOM_GATE 支持的用户应将此行添加到自定义内核配置文件中,然后使用【10. 配置FreeBSD内核】中的说明重建内核:
xxxxxxxxxxoptions GEOM_GATE以下示例描述了如何使用HAST在主从操作中配置两个节点,以在两者之间复制数据。这些节点将被称为 hasta ,IP地址为 172.16.0.1 ,以及 hastb ,IP地址是 172.16.0.2 。两个节点都将有一个大小相同的专用硬盘驱动器 /dev/ad6 ,用于HAST操作。HAST池,有时也称为 /dev/hast/ 中的资源或GEOM提供者,将被称为 test 。
HAST的配置是使用 /etc/hast.conf 完成的。此文件在两个节点上应该相同。最简单的配置是:
xxxxxxxxxxresource test { on hasta { local /dev/ad6 remote 172.16.0.2 } on hastb { local /dev/ad6 remote 172.16.0.1 }}有关更高级的配置,请参阅 hast.conf(5) 。
xxxxxxxxxx如果主机是可解析的,并且在/etc/hosts或本地DNS中定义,也可以在远程语句中使用主机名。一旦两个节点上都存在配置,就可以创建HAST池。在两个节点上运行这些命令,将初始元数据放置在本地磁盘上并启动 hastd(8) :
xxxxxxxxxx# hastctl create test# service hastd onestartxxxxxxxxxx无法将GEOM提供程序与现有文件系统一起使用,也无法将现有存储转换为HAST管理的池。此过程需要在提供程序上存储一些元数据,现有提供程序上将没有足够的可用空间。HAST节点的 primary 或 secondary 角色由管理员或Heartbeat等软件使用 hasctl(8) 选择。在主节点 hasta 上,发出以下命令:
xxxxxxxxxx# hastctl role primary test在辅助节点 hastb 上运行此命令:
xxxxxxxxxx# hastctl role secondary test通过在每个节点上运行 hasctl 来验证结果:
xxxxxxxxxx# hastctl status test检查输出中的 status 行。如果它显示 degraded ,则配置文件有问题。它应该说每个节点都 complete ,这意味着节点之间的同步已经开始。当 hasttl status态报告0字节的 dirty 数据块时,同步完成。
下一步是在GEOM提供程序上创建一个文件系统并挂载它。这必须在 primary 节点上完成。创建文件系统可能需要几分钟,具体取决于硬盘的大小。此示例在 /dev/hast/test 上创建了一个UFS文件系统:
xxxxxxxxxx# newfs -U /dev/hast/test# mkdir /hast/test# mount /dev/hast/test /hast/test一旦正确配置了HAST框架,最后一步是确保HAST在系统引导期间自动启动。将此行添加到 /etc/rc.conf :
xxxxxxxxxxhastd_enable="YES"本示例的目标是构建一个健壮的存储系统,该系统能够抵抗任何给定节点的故障。如果主节点发生故障,辅助节点将无缝接管,检查并装载文件系统,并继续工作而不会丢失任何数据。
为了完成这项任务,使用公共地址冗余协议(Common Address Redundancy Protocol,CARP)在IP层提供自动故障转移。CARP允许同一网段上的多个主机共享一个IP地址。根据【34.11. 公共地址冗余协议(CARP)】中提供的文档在集群的两个节点上设置CARP。在这个例子中,每个节点都有自己的管理IP地址和一个共享IP地址 172.16.0.254 。集群的主HAST节点必须是主CARP节点。
上一节中创建的HAST池现在可以导出到网络上的其他主机。这可以通过使用共享IP地址 172.16.0.254 通过NFS或Samba导出来实现。唯一未解决的问题是主节点发生故障时的自动故障转移。
如果CARP接口上升或下降,FreeBSD操作系统会生成一个 devd(8) 事件,从而可以监视CARP接口上的状态变化。CARP接口上的状态变化表示其中一个节点发生故障或重新联机。这些状态更改事件使运行一个脚本成为可能,该脚本将自动处理HAST故障转移。
要捕获CARP接口上的状态更改,请将此配置添加到每个节点上的 /etc/devd.conf 中,同时将 <vhid> 替换为虚拟主机id,将 <ifname> 替换为关联的接口名称:
xnotify 30 { match "system" "CARP"; match "subsystem" "<vhid>@<ifname>"; match "type" "MASTER"; action "/usr/local/sbin/carp-hast-switch primary";};notify 30 { match "system" "CARP"; match "subsystem" "<vhid>@<ifname>"; match "type" "BACKUP"; action "/usr/local/sbin/carp-hast-switch secondary";};在两个节点上重新启动 devd(8) 以使新配置生效:
xxxxxxxxxx# service devd restart当指定的接口状态上升或下降时,系统会生成一个通知,允许 devd(8) 子系统运行指定的自动故障转移脚本 /usr/local/sbin/carp-hast-switch 。有关此配置的进一步说明,请参阅 devd.conf(5) 。
以下是一个自动故障转移脚本的示例:
xxxxxxxxxx# Original script by Freddie Cash <fjwcash@gmail.com># Modified by Michael W. Lucas <mwlucas@BlackHelicopters.org># and Viktor Petersson <vpetersson@wireload.net># The names of the HAST resources, as listed in /etc/hast.confresources="test"# delay in mounting HAST resource after becoming primary# make your best guessdelay=3# logginglog="local0.debug"name="carp-hast"# end of user configurable stuffcase "$1" in primary) logger -p $log -t $name "Switching to primary provider for ${resources}." sleep ${delay} # Wait for any "hastd secondary" processes to stop for disk in ${resources}; do while $( pgrep -lf "hastd: ${disk} \(secondary\)" > /dev/null 2>&1 ); do sleep 1 done # Switch role for each disk hastctl role primary ${disk} if [ $? -ne 0 ]; then logger -p $log -t $name "Unable to change role to primary for resource ${disk}." exit 1 fi done # Wait for the /dev/hast/* devices to appear for disk in ${resources}; do for I in $( jot 60 ); do [ -c "/dev/hast/${disk}" ] && break sleep 0.5 done if [ ! -c "/dev/hast/${disk}" ]; then logger -p $log -t $name "GEOM provider /dev/hast/${disk} did not appear." exit 1 fi done logger -p $log -t $name "Role for HAST resources ${resources} switched to primary." logger -p $log -t $name "Mounting disks." for disk in ${resources}; do mkdir -p /hast/${disk} fsck -p -y -t ufs /dev/hast/${disk} mount /dev/hast/${disk} /hast/${disk} done ;; secondary) logger -p $log -t $name "Switching to secondary provider for ${resources}." # Switch roles for the HAST resources for disk in ${resources}; do if ! mount | grep -q "^/dev/hast/${disk} on " then else umount -f /hast/${disk} fi sleep $delay hastctl role secondary ${disk} 2>&1 if [ $? -ne 0 ]; then logger -p $log -t $name "Unable to switch role to secondary for resource ${disk}." exit 1 fi logger -p $log -t $name "Role switched to secondary for resource ${disk}." done ;;esac简而言之,当节点变为主节点时,脚本会执行以下操作:
当节点变为次要节点时:
xxxxxxxxxx这只是一个作为概念证明的示例脚本。它不能处理所有可能的情况,并且可以以任何方式进行扩展或更改,例如启动或停止所需的服务。xxxxxxxxxx对于这个例子,使用了一个标准的UFS文件系统。为了减少恢复所需的时间,可以使用启用日志的UFS或ZFS文件系统。除了在本地使用高可用存储外,还可以通过NFS、iSCSI、 sshfs(1) 或ports中的程序(即 net/samba419 )将其共享给网络上的其他计算机。
更多详细信息和其他示例可以在以下网址找到 http://wiki.FreeBSD.org/HAST 。
HAST通常可以正常工作。然而,与任何其他软件产品一样,有时它可能无法按预期工作。问题的来源可能不同,但经验法则是确保集群节点之间的时间同步。
在对HAST进行故障排除时,应通过以 -d 开头hastd 来提高 hastd(8) 的调试级别。可以多次指定此参数以进一步提高调试级别。还可以考虑使用 -F ,它从前台开始。
当集群的节点无法相互通信,并且两者都被配置为主要节点时,就会发生 Split-brain 。这是一种危险的情况,因为它允许两个节点对数据进行不兼容的更改。此问题必须由系统管理员手动更正。
管理员必须决定哪个节点有更重要的更改,或者手动执行合并。然后,让HAST执行具有损坏数据的节点的完全同步。为此,在需要重新同步的节点上发出以下命令:
xxxxxxxxxx# hastctl role init test# hastctl create test# hastctl role secondary test