FreeBSD 中文社区 2025 第二季度问卷调查
FreeBSD 中文社区(CFC)
VitePress 镜像站QQ 群 787969044视频教程Ⅰ视频教程Ⅱ
  • FreeBSD 从入门到追忆
  • 中文期刊
  • 状态报告
  • 发行说明
  • 手册
  • 网络文章集锦
  • 笔记本支持报告
  • Port 开发者手册
  • 架构手册
  • 开发者手册
  • 中文 man 手册
  • 文章
  • 书籍
  • FreeBSD 中文期刊
  • 编辑日志
  • 2025-123 下游项目
    • FreeBSD 发布工程:新主管上任
    • GhostBSD:从易用到挣扎与重生
    • BSD Now 与将来
    • 字符设备驱动教程(第三部分)
    • 学会走路——连接 GPIO 系统
    • FreeBSD 中对 SYN 段的处理
    • FreeBSD 2024 年秋季峰会
  • 2024-1112 虚拟化
    • 字符设备驱动程序教程(第二部分)
    • 面向 Linux 和 Windows 用户的 bhyve
    • Xen 与 FreeBSD
    • Wifibox:一种嵌入式虚拟化无线路由器
    • 嵌入式 FreeBSD:Fabric——起步阶段
    • DGP:一种新的数据包控制方法
    • 会议报告:我在都柏林的 EuroBSDCon 体验
  • 2024-0910 内核开发
    • 字符设备驱动程序教程
    • VPP 移植到了 FreeBSD:基础用法
    • 利用 Kyua 的 Jail 功能提升 FreeBSD 测试套件的并行效率
    • FreeBSD 上的 Valgrind
    • 嵌入式 FreeBSD:探索 bhyve
    • TCP/IP 历险记:FreeBSD TCP 协议栈中的 Pacing
    • 实用软件:实现无纸化(Paperless)
  • 2024-0708 存储与文件系统
    • FreeBSD 中的 NVMe-oF
    • FreeBSD iSCSI 入门
    • 使用 ZFS 原生加密保护数据
    • 嵌入式 FreeBSD:打造自己的镜像
    • TCP LRO 简介
    • 基于 Samba 的时间机器备份
  • 2024-0506 配置管理对决
    • 基本系统中的 mfsBSD
    • rdist
    • Hashicorp Vault
    • 在 GitHub 上向 FreeBSD 提交 PR
    • 悼念 Mike Karels
    • 2024 年 5-6 月来信
    • 嵌入式 FreeBSD 面包板
    • TCP/IP 历险记:TCP BBLog
    • 实用软件:开发定制 Ansible 模块
  • 2024-0304 开发工作流与集成
    • FreeBSD 内核开发工作流程
    • FreeBSD 与 KDE 持续集成(CI)
    • 更现代的内核调试工具
    • 从零开始的 ZFS 镜像及 makefs -t zfs
    • 提升 Git 使用体验
  • 2024-0102 网络(十周年)
    • FreeBSD 中的 RACK 栈和替代 TCP 栈
    • FreeBSD 14 中有关 TCP 的更新
    • if_ovpn 还是 OpenVPN
    • SR-IOV 已成为 FreeBSD 的重要功能
    • FreeBSD 接口 API(IfAPI)
    • BATMAN:更优的可移动热点网络方式
    • 配置自己的 VPN——基于 FreeBSD、Wireguard、IPv6 和广告拦截
    • 实用软件:使用 Zabbix 监控主机
  • 2023-1112 FreeBSD 14.0
    • LinuxBoot:从 Linux 启动 FreeBSD
    • FreeBSD 容器镜像
    • 现在用 Webhook 触发我
    • 新的 Ports 提交者:oel Bodenmann (jbo@freebsd.org)
  • 2023-0910 Port 与软件包
    • 回忆录:与 Warner Losh(@imp)的访谈
    • 在你自己的仓库中定制 Poudriere 源
    • Wazuh 和 MITRE Caldera 在 FreeBSD Jail 中的使用
    • PEP 517
    • CCCamp 2023 旅行报告
  • 2023-0708 容器与云
    • 在 Firecracker 上的 FreeBSD
    • 使用 pot 和 nomad 管理 Jail
    • 会议报告:C 与 BSD 正如拉丁语与我们——一位神学家的旅程
    • 抒怀之旅:与 Doug Rabson 的访谈
    • 基于 Jail 的广告拦截教程
    • 我们收到的来信
  • 2023-0506 FreeBSD 三十周年纪念特刊
    • CheriBSD 近十多年的历程
    • AArch64:成为 FreeBSD 新的一级架构
    • 岁月如梭:我个人的时间线
    • 安装 FreeBSD 1.0:回顾 30 年前
    • ZFS 是如何进入 FreeBSD 的呢?
    • 我不是来自约克郡的,我保证!
    • 回忆录:采访 David Greenman Lawrence
    • FreeBSD 和早期的 Unix 社区
    • 早期的 FreeBSD 移植
    • FreeBSD 30 周年:成功的秘诀
    • FreeBSD 在日本:回忆之旅与今日之实
  • 2023-0304 嵌入式
    • CheriBSD port 和软件包
    • 让我们来试试 ChatGPT
    • GPU 直通
  • 2023-0102 构建 FreEBSD Web 服务器
    • ZFS 的原子 I/O 与 PostgreSQL
    • 虚拟实验室——BSD 编程研讨会
    • ZFS 简介
    • 会议报告:落基山庆祝女性计算机科学家
    • 进行中的工作/征求反馈:数据包批处理
    • 基金会与 FreeBSD 桌面
  • 2022-1112 可观测性和衡量标准
    • 在 FreeBSD 的 DDB 内核调试器中编写自定义命令
    • DTrace:老式跟踪系统的新扩展
    • 基于证书的 Icinga 监控
    • 活动监控脚本(activitymonitor.sh)
    • 实用 IPv6(第四部分)
    • EuroBSDCon 会议报道
    • 实用 Port:Prometheus 的安装与配置
    • 书评:《用火解决问题:管理老化的计算机系统(并为现代系统保驾护航)》Kill It with Fire: Manage Aging Computer Systems (and Future Proof Modern Ones)
  • 2022-0910 安全性
    • CARP 简介
    • 重构内核加密服务框架
    • PAM 小窍门
    • SSH 小窍门
    • 实用 IPv6(第三部分)
    • 书评:Understanding Software Dynamics(深入理解软件性能——一种动态视角)—— Richard L. Sites 著
    • 访谈:保障 FreeBSD 安全性
    • MCH 2022 会议报告
  • 2022-0708 科研、系统与 FreeBSD
    • 在 FreeBSD 上构建 Loom 框架
    • 教授本科生 Unix 课程
    • FreeBSD 入门研讨会
    • 实用 IPv6(第二部分)
    • 在 2022 年及以后推广 FreeBSD
    • 进行中的工作/征求反馈:Socket 缓冲区
    • FreeBSD 开发者峰会报告
    • 支持 Electromagnetic Field 2022
  • 2022-0506 灾难恢复
    • 使用 FreeBSD 构建高弹性的私有云
    • LLDB 14 —— FreeBSD 新调试器
    • 实用 IPv6(第一部分)
    • 利用 netdump(4) 进行事后内核调试
    • 进行中的工作/征求反馈:FreeBSD 启动性能
    • 实用 Port:在 OpenZFS 上设置 NFSv4 文件服务器
  • 2022-0304 ARM64 是一级架构
    • FreeBSD/ARM64 上的数据科学
    • Pinebook Pro 上的 FreeBSD
    • 嵌入式控制器的 ACPI 支持
    • 进行中的工作/征求反馈:Lumina 桌面征集开发人员
    • 实用 Port:如何设置 Apple 时间机器
  • 2022-0102 软件与系统管理
    • 为 FreeBSD Ports 做贡献
    • 使用 Git 贡献到 FreeBSD Ports
    • CBSD:第一部分——生产环境
    • 将 OpenBSD 的 pf syncookie 代码移植到 FreeBSD 的 pf
    • 进行中的工作/征求反馈:mkjail
    • 《编程智慧:编程鬼才的经验和思考》(The Kollected Kode Vicious)书评
    • 会议报告:EuroBSDCon 2021 我的第一次 EuroBSDCon:一位新组织者的视角
  • 2021-1112 存储
    • 开放通道 SSD
    • 构建 FreeBSD 社区
    • 与完美操作系统同行 27 年
    • 进行中的工作/征求反馈:OccamBSD
    • 通过 iSCSI 导入 ZFS ZIL——不要在工作中这样做——就像我做的那样
  • 2021-0910 FreeBSD 开发
    • FreeBSD 代码审查与 git-arc
    • 如何为 FreeBSD 实现简单的 USB 驱动程序
    • 内核开发技巧
    • 程序员编程杂谈
  • 2021-0708 桌面/无线网
    • 通往 FreeBSD 桌面的直线路径
    • FreeBSD 13 中的人机接口设备 (HID) 支持
    • Panfrost 驱动程序
    • 用 Git 更新 FreeBSD
    • FreeBSD 的新面孔
    • 想给你的桌面加点佐料?
  • 2021-0506 安全
    • 七种提升新安装 FreeBSD 安全性的方法
    • copyinout 框架
    • 使用 TLS 改善 NFS 安全性
    • Capsicum 案例研究:Got
    • 对 Jail 进行安全扫描
  • 2021-0304 FreeBSD 13.0
    • 展望未来
    • FreeBSD 13.0 工具链
    • FreeBSD 13.0 中有新加载器吗?
    • TCP Cubic 准备起飞
    • OpenZFS 中的 Zstandard 压缩
    • 会议报告:FreeBSD 供应商峰会
    • Git 不够吗?
  • 2021-0102 案例研究
    • Tarsnap 的 FreeBSD 集群
    • BALLY WULFF
    • Netflix Open Connect
    • FreeBSD 的新面孔
    • 写作学者的 FreeBSD
    • 在世界之巅
  • 2020-1112 工作流/持续集成(CI)
    • FreeBSD Git 快速入门
    • 使用 syzkaller 进行内核 Fuzzing
    • Mastering Vim Quickly 书评
    • 线上会议实用技巧
    • 在控制台上进行网络监控
  • 2020-0910 贡献与入门
    • 采访:Warner Losh,第 2 部分
    • 代码审查
    • 撰写良好的提交消息
    • 如何在不是程序员的情况下做出贡献——成为 FreeBSD 译者
    • 如何成为文档提交者
    • 谷歌编程之夏
    • 为 FreeBSD 期刊撰写文章
    • 你为什么使用 FreeBSD
    • FreeBSD 的新面孔
  • 2020-0708 基准测试/调优
    • FreeBSD Friday
    • 采访:Warner Losh,第 1 部分
    • 构建和运行开源社区
    • 在 FreeBSD 上轻松搭建我的世界(Minecraft)服务器
    • FreeBSD 的新面孔
  • 2020-0506 网络性能
    • 内核中的 TLS 卸载
    • 访谈:Michael W Lucas
    • FreeBSD 桌面发行版
    • 使用 Poudriere 进行 Port 批量管理
    • FreeBSD 的新面孔
由 GitBook 提供支持
LogoLogo

FreeBSD 中文社区(CFC) 2025

在本页
  • 系统要求
  • 配置备份服务器
  • Avahi 配置
  • Samba 配置
  • 启动
  • 总结
  • 参考文献和来源
在GitHub上编辑
导出为 PDF
  1. 2024-0708 存储与文件系统

基于 Samba 的时间机器备份

上一页TCP LRO 简介下一页基本系统中的 mfsBSD

最后更新于1个月前

  • 原文链接:

  • 作者:Benedict Reuschling

“我真希望我能把带宽节省下来做备份之类的有用事情,因为我永远不会需要它们”——从未有人这么说过。在发生灾难时——而灾难总是不期而至——备份是 IT 弹性的重要组成部分。硬盘故障、笔记本电脑被盗、固件驱动程序损坏导致数据不可读等等,都是备份所要应对的情况。定期备份并确保其可用性对于持续的业务运营至关重要,而测试备份的可恢复性同样重要。但如果备份解决方案不再受支持,并且无法在较新的系统上工作该怎么办?新的系统如何备份,又如何与现有的解决方案集成?

我在《FreeBSD 期刊》2022 年 3/4 月号中写了一篇关于如何设置 FreeBSD 苹果时间机器的文章。这个设置我已经运行了很久,没有遇到问题——无论是在备份方面,还是在我需要恢复数据时。随着时间的推移,苹果改变了底层的 Apple 文件协议(AFP)。在更新的 macOS 版本中(我一直定期升级以获得安全和功能增强),该协议经历了一些变化,使得我原来的设置不再适用了。如上所述,当前的设置仍然有效,但对于新的时间机器系统,我再也无法使用它了。从 macOS 10.9(Mavericks)开始,Apple 将 SMB(Samba 更广为人知)集成到协议中。此次迁移在 macOS 11(Big Sur)完成,该版本移除了 AFP 服务器部分,改为将 SMB 作为新的标准,时间机器也开始内部使用 SMB。

当我设置新的时间机器备份系统时,我发现了这一点。许多年前,我将我在 2022 年的文章中的设置写成了一个 Ansible playbook 以便更轻松地部署。这个 playbook 仍然有效,但它导致新版本的 macOS 无法将导出的驱动器挂载为时间机器的存储位置。幸运的是,我发现其他人碰到了同样的问题,并且已经找到了相应的解决方案。哪怕这些说明并不像我希望的那样简洁,但它们已经解决了问题。以下的设置结合了不同的来源——Reddit、个人博客、FreeBSD 论坛以及 Samba 文档。我已经在两台不同的机器上进行了测试,补充了一些说明,并添加了缺失的命令以确保它按预期工作。我保留了早期的“基于 ZFS”,因为那是我用来存储重要数据的系统。你可以选择不使用 ZFS,去用别的文件系统,但如果没成功,也别怪我!

系统要求

为了设置此备份系统,你需要一台机器(在我的例子中是 FreeBSD)来存储备份。它应该有良好的网络连接和快速的存储。存储还需要以某种方式实现冗余,比如 RAID1 及更高等级的 RAID。存储容量取决于两个因素:备份数据的人数和他们的数据量。时间机器配置对话框允许你设置磁盘配额和加密,这两者都是不错的选择。ZFS 支持配额和保留空间,因此我在文件系统层面上设置了相同的值。时间机器会自动删除较旧的备份,当可用存储空间不足以容纳新的备份数据时。存储越多,你可以恢复的备份历史也就越长。

加密功能也很有用,特别是当我们将数据通过可能未加密或者经 VPN 网络传输时。在接收系统上,可以为静态数据添加加密的 ZFS 数据集。但是,值得注意的是,当备份目标需要重新启动时,除非有人输入用于挂载数据集的密码,否则加密的数据集将不会被挂载。你可以配置 ZFS 从某个文件获取密码,但我将其作为一个安全访问的练习,来保障存储密码的文件不被泄露。

在发送端,所有 macOS 系统都能够挂载、配置该驱动器,并通过个别用户凭证进行保护。这能让多人向同一时间机器备份。考虑到可能同时进行多个备份,因此有足够带宽的服务器变得尤为重要。当在 Mac 上配置多个时间机器备份位置时,系统会智能地避免同时备份到两个位置,从而防止系统 I/O 被长时间的备份任务所阻塞。

配置备份服务器

首先安装你选择的 FreeBSD 版本(理想情况下仍在支持范围内),并确保安装了最新的安全补丁。我们在这里不选择使用 jail,但我们用 jail 也没问题。首先安装 Samba 包:

# pkg install samba419

接下来,我们为 ZFS 配置备份存储。在我的例子中,我有一个专门的池,命名为 backup,并挂载在目录 /backup。我为时间机器创建了一个单独的数据集,并设置了配额和保留空间,因为我还在其中存储其他数据,并且希望为这些文件保留一定的空间。

# zfs create -o quota=1.5T -o reservation=1.5T backup/timemachine

我知道会有两个用户(Tammy 和 Tim;Alice 和 Bob 在度假)将他们的 Mac 备份到该位置。我平等地对待他们,因此我为两者设置了相同的空间保留和配额。请记住,数据集上的配额和保留空间也会应用于其下的所有数据集。1.5 TB 也将应用于他们的数据集,已对其进行了限制。但每人 500GB 是足够的,因此我为每个数据集分别设置了 refquota 和 refreservation。

# zfs create -o refquota=500g -o refreservation=500g backup/timemachine/tammy
# zfs create -o refquota=500g -o refreservation=500g backup/timemachine/tim

他们两人都永远无法登录到我的备份服务器(他们也不在乎),但他们仍然需要在系统上拥有一个用户来挂载时间机器的存储。我为他们两人都运行了 adduser,不给他们家目录(/var/empty),也不给他们 shell 访问权限(/usr/sbin/nologin)。

运行命令 chmod 和 chown 来保护他们的数据集挂载点,防止外部窥探。

chmod -R 0700 /backup/timemachine/tammy
chmod -R 0700 /backup/timemachine/tim
chown -R tim /backup/timemachine/tim
chown -R tammy /backup/timemachine/tammy

最后,设置 Samba 端的密码,供这两个用户使用。这就是在 macOS 中挂载时间机器备份时的密码提示。

# smbpasswd -a tim
# smbpasswd -a tammy

Avahi 配置

到此为止,所需的软件已经安装完毕——简单易行。接下来,我们需要创建两个配置文件,一个是时间机器服务的配置,另一个是 Samba 配置。时间机器服务通过 Avahi 运行——不是来自《马达加斯加》的狐猴,而是这个软件。Avahi 是一款 Zeroconf 网络实现,允许程序在本地网络中发布和发现服务(比如我们的时间机器)。配置文件是基于 XML 格式的,位于 /usr/local/etc/avahi/services/timemachine.service(如果该文件不存在,需要创建),文件内容如下:

<?xml version=”1.0” standalone='no'?>
<!DOCTYPE service-group SYSTEM “avahi-service.dtd”>
<service-group>
<name replace-wildcards=”yes”>%h</name>
<service>
<type>_smb._tcp</type>
<port>445</port>
</service>
<service>
<type>_device-info._tcp</type>
<port>0</port>
<txt-record>model=RackMac</txt-record>
</service>
<service>
<type>_adisk._tcp</type>
<txt-record>sys=waMa=0,adVF=0x100</txt-record>
<txt-record>dk0=adVN=FreeBSD TimeMachine,adVF=0x82</txt-record>
</service>
</service-group>

该文件定义了监听 Samba 服务端口(445),挂载驱动器的图标样式(RackMac)和显示名称(FreeBSD TimeMachine)。你可以更改显示名称,以便为其指定一个更具陈述性的名称。我未更改文件中的其他部分。

Samba 配置

Samba 是 SMB 协议的开源实现,已经有 32 年历史。最初,它的主要目的是实现 Unix 系统与 Windows 之间的兼容性。随着 Windows 添加了更多附加功能,Samba 也加入了 Active Directory(AD,活动目录)集成、域控制器等功能。由于此设置中不涉及任何 Windows 系统(你能听到松了一口气的声音),我们在这里使用 Samba 的文件共享功能来代替 AFP。

Samba 的配置文件位于 /usr/local/etc/smb4.conf,内容如下:

[global]
workgroup = WORKGROUP
security = user
passdb backend = tdbsam
fruit:aapl = yes
fruit:model = MacSamba
fruit:advertise_fullsync = true
fruit:metadata = stream
fruit:veto_appledouble = no
fruit:nfs_aces = no
fruit:wipe_intentionally_left_blank_rfork = yes
fruit:delete_empty_adfiles = yes

[TimeMachine]
path = /backup/timemachine/%U
valid users = %U
browseable = yes
writeable = yes
vfs objects = catia fruit streams_xattr zfsacl
fruit:time machine = yes
create mask = 0600
directory mask = 0700

两个部分(global 和 TimeMachine)定义了备份目标所需的参数。以 fruit: 为前缀的行用于与 macOS 的兼容性。有关这些行的详细文档,请参见 Samba 文档(见文章末尾的参考文献)。在 [TimeMachine] 部分中,将路径行更改为之前在 FreeBSD 上创建的路径。%U 部分是一个占位符,表示个别用户名(在我们的例子中是 tammy 和 tim)进行文件备份。这样,当以后添加另一个用户时,我们就不需要更改此行了。create mask 和 directory mask 确保正确的权限,避免文件被混合,且用户无法看到和更改其他用户的备份。

启动

剩下的步骤就是启用并启动 dbus(avahi)和 samba 服务。

# service dbus enable
# service dbus start
# service samba_server enable
# service samba_server start

在 macOS 端(备份客户端),打开 Finder 并按下 CMD-K(“连接到服务器”的快捷键)。输入 smb://server.ip.or.dns。若一切顺利,输入用户名和密码。这就是我们之前在 smbpasswd 对话框中为 tim 和 tammy 设置的密码。如果成功,共享目录将挂载到系统中。接下来,进入时间机器配置对话框,再添加新的 Time Machine 卷。记得点击其中的选项按钮,再勾选加密备份框。此设置只能在初次备份之前设置,之后无法更改。你还可以限制备份占用的磁盘空间,但这不是强制的,因为我们已经在 ZFS 层面上设置了。然后,首次备份将开始进行。当完成后,时间机器将自动挂载和卸载该共享,进行定期的备份。

总结

就这样,Samba 配置相当简单,用户应该能够根据自己的需求进行调整。我发现这个新解决方案和旧的解决方案一样可靠。我已经调整了我的 Ansible playbook,以便使用新的基于 Samba 的设置。我依然喜欢那种“一键备份”的方式,知道在需要时,我能恢复单个文件和整个系统,恢复的文件都是我最近使用的最新文件。

参考文献和来源


BENEDICT REUSCHLING 是 FreeBSD 项目的文档提交者,也是文档工程团队的成员。过去,他曾两次担任 FreeBSD 核心团队成员。他在德国达姆施塔特应用技术大学管理一个大数据集群,并为本科生开设了“开发者的 Unix”课程。Benedict 也是每周 播客的主持人之一。

Samba-based Time Machine Backups
Samba 文档
Reddit 帖子
FreeBSD 论坛帖子
Dan Langille 的博客
bsdnow.tv