Linux搭建TimeMachine备份服务器

上了pdd的车,最终还是入手了一台丐版mbp,256G的存储空间使用起来让人心疼,Time Machine本来是一款很不错的备份工具,然而有限的空间经不起它无止境扩大的备份策略的折腾了。备份不做,十恶不赦,好在实验室的服务器最近一直闲置,在网上看了几套方案之后就准备开始了。

开始之前

在开始之前,首先最好选择一个合适的账户登录主机,这个账户将在之后被用来进行远程登录获取服务。

安装Netatalk和Avahi

Netatalk是一个开源的协议,支持类Unix系统为Mac提供文件服务,安装Netatalk:

sudo apt install Netatalk

Avahi允许程序在本地网络环境中分发与提供服务,同样通过apt安装Avahi:

sudo apt avahi

创建文件 /etc/avahi/services/afpd.service来配置 avahi,写入如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
<service-group>
<name replace-wildcards="yes">%h</name>
<service>
<type>_afpovertcp._tcp</type>
<port>548</port>
</service>
<service>
<type>_device-info._tcp</type>
<port>0</port>
<txt-record>model=Xserve</txt-record>
</service>
</service-group>

挂载硬盘

参考博客的作者采用了HFS+来对硬盘进行处理(格式化?),通过apt install hfsplus即可成功安装,博客中由于是安装的精简系统,在使用modprobe hfsplus之后报错,需要打官方补丁才能解决这个坑,而我们不需要。

由于在当初安装192.168.1.253机器的时候,将Samsung 970 evo 1T单独放在一边,未在其中初始化分区,因此这块硬盘上还是windows的分区格式,通过fdisk -l查询到这块硬盘的名称为/dev/nvme0n1,将它格式化为ext4

sudo mkfs.ext4 /dev/nvme0n1

不知道从哪看的规矩,说是挂在硬盘要放在/media下,不过这也无关紧要,mkdir /media/nvme0n1,再将硬盘挂载到该目录上:

mount -t hfsplus -o force,rw /dev/nvme0n1 /media/nvme0n1

由于mount命令在重启服务器之后会失效,所以将分区信息写入文件中:

sudo vi /etc/fstab

1
/dev/nvme0n1    /media/nvme0n1   ext4    defaults     0	 2

这句中2代表在系统开机时会对该分区进行快速检测,如果你不希望这么做,可以把它改成0跳过开机检测。

权限问题

如果是按照顺序来的话,应该此处不会遇到权限问题,但我当时没有。

比较严谨的方法

挂载成功后你的非 root 用户可能是无法写入的,这是由于磁盘内容自有用户造成的,最简单的办法可能就是欺骗文件让它以为你还是原来的用户。mac 中默认用户 UID 是 501,那么我们就把跑 netatalk 的用户id改为 501:

1
2
3
sudo groupadd admin //创建管理组
sudo useradd -d /home/tempuser -m -s /bin/bash -G admin tempuser //创建一个临时用户
sudo passwd tempuser //给用户一个密码,别忘记了

做完之后退出当前用户,然后用这个临时用户进去,如果你用的是 ssh,那么就退出来,用 ssh tempuser@xxx.xxx.xxx.xxx 重新登录。登录之后继续:

1
sudo usermod --uid 501 yourusername //改你刚才用户的uid

这时候你可能会收到提示说还有进程在占用,不能改。这很好办,根据提示的pid,干掉那个进程即可: sudo kill <pid> 然后重复执行上面的命令,没关系,有多少个占用就干多少个……

1
2
sudo chown -R 501:yourusername /home/yourusername 
//上边这行两处都要改成你自己的用户名,这个是改目录所有权的

接下来,你就可以退出然后用你原来的用户登录了,这时候再去挂载的目录看看,已经可写。别忘了删除那个临时用户:

1
sudo userdel -r tempuser

比较粗暴的方法

之后用哪个用户登录,直接把对应文件夹及子文件的所有者全改了

1
chown -R username:usergroup /media/

简单粗暴,配合更高权限的用户,先解决问题再说,反正只是内网。

配置Netatalk

创建Time Machine的备份文件夹:

1
2
3
mkdir /media/nvme0n1/TimeMachine

sudo vi /etc/netatalk/AppleVolumes.default

大写G直接跳到文件末尾,加上:

1
2
3
4
5
6
# The line below sets some DEFAULT, starting with Netatalk 2.1.
:DEFAULT: options:upriv,usedots
/media/nvme0n1/TimeMachine "TimeMachine" options:tm
/media/nvme0n1/NAS "NAS"
# By default all users have access to their home directories.
#~/ "Home Directory"

重点就是第三行末尾的 options:tm 标记这一句让对应的目录对 TimeMachine 可见。

最后,我们重启对应的服务:

1
2
sudo service netatalk restart
sudo service avahi-daemon restart

Mac端设置

在Mac终端中执行这条命令让tm发现网络备份位置:

1
defaults write com.apple.systempreferences TMShowUnsupportedNetworkVolumes 1

这下你就应该已经能够在 tm 配置中发现你的网络位置了!

给服务器添加 windows 共享

win 使用的共享协议叫做 samba,协议的名字叫 smb,mac其实能够支持smb,这样的话我们就可以让 tm 走 afp,另外来一个目录专门跑 smb,用来 mac 和 win 共享文件了。 使用如下命令来安装 samba:

1
2
3
sudo apt-get install samba

sudo apt-get install smbclient # Linux客户端测试用

备份原配置文件:

1
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak

编辑配置文件: vim /etc/samba/smb.conf,在末尾追加如下内容:

1
2
3
4
5
6
[share]
path = /home/share
browseable = yes
writable = yes
comment = smb share test
public = no //避免匿名登录

这个share就是之后的地址了,这里等于做了个地址映射。然后为 samba 创建一个用户,这个用户必须是已经存在的用户:

1
sudo smbpasswd -a smbuser

创建的密码就是你要登录 samba 的密码,别记错了。最后重启服务:

1
sudo service smbd restart

之后windows上连接到服务器就只需要在网络映射配置中加上\\192.168.1.253\share,再输入对应密码,就可以像访问本地磁盘一样访问服务器上的磁盘了。