LoginSignup
8
10

More than 5 years have passed since last update.

netatalk を docker コンテナ化して TimeMachine バックアップ先にしてみた

Last updated at Posted at 2016-11-08

netatalk を docker コンテナ化して TimeMachine バックアップ先にしてみた

目的

  • macOS Sierra にしてから netatalk ごしの TimeMachine バックアップが取れてないような感じ…
    • 正確に書くと、最初の FullBackup は取れるが、その後の 差分バックアップ が取れない
  • 現在 Host OS は Ubuntu14.04 ちょっと古いがすぐに Host 上の netatalk のバージョンアップはしづらい
  • docker で最新バージョンにして試してみよう(切り分け)

netatalk とは

  • 簡単に言うと Unixマシン(Linuxなど) を TimeMachine のバックアップ先として利用できるようにするソフト

対象

  • netatalk を TimeMachine バックアップ先として利用されてる方、したい方
  • Host と netatalk 部分をコンテナで分離して管理したい方
    • たぶん samba とか他のサービスにも応用可能と思われる

環境

HostOS:

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.3 LTS"

$ uname -r
3.13.0-24-generic
$ docker version
Client:
 Version:      1.12.3
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   6b644ec
 Built:        Wed Oct 26 21:44:32 2016
 OS/Arch:      linux/amd64

Server:
 Version:      1.12.3
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   6b644ec
 Built:        Wed Oct 26 21:44:32 2016
 OS/Arch:      linux/amd64
$ sudo dpkg -l netatalk
[sudo] password for hirofumi:
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                 Version         Architecture    Description
+++-====================-===============-===============-==============================================
ii  netatalk             2.2.2-1ubuntu2  amd64           AppleTalk user binaries

リファレンス

手順

0. 事前情報収集

  • ポート確認
$ sudo su -
root# cat /etc/services | grep afpovertcp
afpovertcp      548/tcp                         # AFP over TCP
afpovertcp      548/udp
root# lsof -iTCP -P | grep afpd
afpd      11498            root    4u  IPv4 207626697      0t0  TCP *:548 (LISTEN)
afpd      11502        hirofumi    4u  IPv6 207632827      0t0  TCP localhost:56018->localhost:4700 (ESTABLISHED)
afpd      11502        hirofumi   11u  IPv4 207625023      0t0  TCP fs1:548->mba:51302 (ESTABLISHED)
  • IPv6 forwarding enabled (issues/2174)
root# grep forward /etc/sysctl.conf | grep -v ^#
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
  • コンテナ名のユニーク確認
root# docker ps -a | grep netatalk
root#

1. ホストOS 上の netatalk をいったん止めます

root# service netatalk stop
Stopping Netatalk Daemons: afpd cnid_metad papd timelord atalkd.

2. 最新の ubuntu コンテナを立てる

  • ホストOS 上の /mnt/export/Timemachine99 を コンテナ 上の /Timemachine99 にマウントします
root# mkdir /mnt/export/TimeMachine99
  • クライアントから接続するユーザ権限に付け替えます
root# chown hirofumi: /mnt/export/TimeMachine99
  • コンテナの作成
root# docker pull ubuntu:latest

root# docker images ubuntu
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              latest              88f79970fa20        3 weeks ago         127.2 MB

root# container_name='netatalk01'
root# echo $container_name
netatalk01

root# docker network ls | grep isolated_nw
23f5539f9f5e        isolated_nw         bridge              local

root# docker run -itd --name $container_name \
-v /mnt/export/TimeMachine99:/TimeMachine99 \
-p 0.0.0.0:548:548 \
--network=isolated_nw \
-t ubuntu:latest /bin/bash

root# # docker network inspect isolated_nw | jq .[].Containers | less
{
  "cfa8fff637853d3ea4f7822951355a2f06a2c020d3c62377cf3a40451cf59c4f": {
    "IPv6Address": "",
    "IPv4Address": "172.19.0.2/16",
    "MacAddress": "02:42:ac:13:00:02",
    "EndpointID": "31823ae5ee8da43dfc3b8bc52c752d4589af4419099b914cfb124e055c196d3b",
    "Name": "netatalk01"
  }
}

root# ping -w 3  172.19.0.2
PING 172.19.0.2 (172.19.0.2) 56(84) bytes of data.
64 bytes from 172.19.0.2: icmp_seq=1 ttl=64 time=0.093 ms
64 bytes from 172.19.0.2: icmp_seq=2 ttl=64 time=0.065 ms
64 bytes from 172.19.0.2: icmp_seq=3 ttl=64 time=0.067 ms
64 bytes from 172.19.0.2: icmp_seq=4 ttl=64 time=0.065 ms

root# docker attach netatalk01

root@cfa8fff63785:/# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS"

root@cfa8fff63785:/# apt-get update -y
root@cfa8fff63785:/# apt-get upgrade -y
  • コンテナ内に OS 展開するところまでは終わりました

3. コンテナ内に netatalk をいれる

root@cfa8fff63785:/# apt-get install vim -y
root@cfa8fff63785:/# apt-get install netatalk -y
  • 若干新しくなりましたね
root@cfa8fff63785:/# dpkg -l netatalk
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                       Version            Architecture       Description
+++-==========================-==================-==================-==========================================================
ii  netatalk                   2.2.5-1            amd64              AppleTalk user binaries
  • 最終行に足す
root@cfa8fff63785:/# vim /etc/netatalk/AppleVolumes.default

/TimeMachine99  "TM-for-MBA-on-docker"      options:usedots,upriv,tm ea:ad allow:hirofumi volsizelimit:300000
  • 最終行に足す
root@cfa8fff63785:/# vim /etc/netatalk/afpd.conf

- -tcp -noddp -uamlist uams_guest.so,uams_dhx.so,uams_dhx2.so -nosavepassword
  • マウントポイント/バックアップ保存先の確認
root@cfa8fff63785:/# ls -al /TimeMachine99
total 8
drwxr-xr-x  2 1002 1002 4096 Nov  8 14:38 .
drwxr-xr-x 45 root root 4096 Nov  8 16:14 ..
  • Host 上のユーザの UID GID の確認
root# grep hirofumi /etc/passwd
hirofumi:x:1002:1002::/home/hirofumi:/bin/bash

root# grep 1002 /etc/group
hirofumi:x:1002

UID: 1002
GID: 1002

  • コンテナ内にユーザの追加
    • ホスト上の netatalk 運用とユーザを合わせました
root@cfa8fff63785:/# groupadd -g 1002 hirofumi

root@cfa8fff63785:/# useradd -m -u 1002 -g hirofumi hirofumi

root@cfa8fff63785:/# passwd hirofumi
New password:
Retype new password:
passwd: password updated successfully

root@cfa8fff63785:/# ls -al /TimeMachine99
total 8
drwxr-xr-x  2 hirofumi hirofumi 4096 Nov  8 14:38 .
drwxr-xr-x 46 root     root     4096 Nov  8 16:21 ..

4. コンテナ内で netatalk サービスの開始

root@cfa8fff63785:/# service netatalk start
Starting Netatalk services (this will take a while):  cnid_metad afpd.

5. バックアップ先の登録 on mac

% sudo tmutil setdestination -p afp://hirofumi@192.168.100.5/TM-for-MBA-on-docker
Password:
Destination password:
% tmutil destinationinfo
====================================================
Name          : TM-for-MBA-on-docker
Kind          : Network
URL           : afp://hirofumi@192.168.100.5/TM-for-MBA-on-docker
ID            : BDD304C8-5B3A-40F4-BF9A-45B3E1BA1357

6. バックアップ開始、ステータス確認

% tmutil startbackup --auto
% tmutil status
Backup session status:
{
    BackupPhase = MountingBackupVol;
    ClientID = "com.apple.backupd";
    DateOfStateChange = "2016-11-08 17:09:50 +0000";
    DestinationID = "BDD304C8-5B3A-40F4-BF9A-45B3E1BA1357";
    Percent = "-1";
    Running = 1;
    Stopping = 0;
}
% tmutil status
Backup session status:
{
    BackupPhase = Copying;
    ClientID = "com.apple.backupd";
    DateOfStateChange = "2016-11-08 17:11:56 +0000";
    DestinationID = "BDD304C8-5B3A-40F4-BF9A-45B3E1BA1357";
    DestinationMountPoint = "/Volumes/Time Machine Backups";
    FirstBackup = 1;
    Percent = "7.019195447394897e-07";
    Progress =     {
        "_raw_totalBytes" = 95890477056;
        bytes = 74786;
        files = 1;
        totalBytes = 105479524761;
        totalFiles = 2007952;
    };
    Running = 1;
    Stopping = 0;
    "_raw_Percent" = "7.799106052660996e-07";
}
  • とりあえずバックアップは始まりました。

7. コンテナからデタッチしてイメージとして保存する

  • コンテナを起動したままデタッチしてホストOSのシェルに戻るには

ctrl + p => ctrl +q

を押下します

  • イメージに保存しておくと後で再利用が容易になります
root# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
cfa8fff63785        ubuntu:latest       "/bin/bash"         49 minutes ago      Up 21 minutes       0.0.0.0:548->548/tcp   netatalk01

root# docker commit netatalk01 hirofumi/netatalk01-20161109
sha256:df1c3ae87e9fce88bc0c74959fff2f3a8538d3177447f61ee4ee02aa61ebc92e

root# docker images | grep netatalk
hirofumi/netatalk01-20161109   latest              df1c3ae87e9f        12 seconds ago      375.6 MB

8. いったん終了

9. P.S.

  • MBA は朝になったら持ち出すので最初の Full Backup を取るには土日を待つしかないんでした。
  • 据え置きの Mac Mini でもバックアップ先にすべく作ったイメージで別コンテナを立てることにします。

9-1. 既存のコンテナを止めます

root# docker stop netatalk01

9-2. ホスト上に新たなバックアップ先ディレクトリを作成

root# mkdir /mnt/export/TimeMachine98
root# chown hirofumi: /mnt/export/TimeMachine98

9-3. イメージから追加で TimeMachine98 をマウントしたコンテナを起動

root# docker run -itd --name netatalk02 \
-v /mnt/export/TimeMachine99:/TimeMachine99 \
-v /mnt/export/TimeMachine98:/TimeMachine98 \
-p 0.0.0.0:548:548 \
--network=isolated_nw \
-t hirofumi/netatalk01-20161109 /bin/bash
root# docker ps
CONTAINER ID        IMAGE                          COMMAND             CREATED             STATUS              PORTS                  NAMES
1aec5fd3ad73        hirofumi/netatalk01-20161109   "/bin/bash"         5 seconds ago       Up 3 seconds        0.0.0.0:548->548/tcp   netatalk02
root# docker network inspect isolated_nw | jq .[].Containers
{
  "1aec5fd3ad7307503a106a91d0670e0773f0ee582360094717819d2b5236b761": {
    "IPv6Address": "",
    "IPv4Address": "172.19.0.2/16",
    "MacAddress": "02:42:ac:13:00:02",
    "EndpointID": "6d0e555acd84965a156da02ad51026ed5923941bec9ea524fcd5b106c63d4e83",
    "Name": "netatalk02"
  }
}

9-4. アタッチします

root# docker attach netatalk02

9-5. netatalk の設定を追加します

root@1aec5fd3ad73:/# vi /etc/netatalk/AppleVolumes.default

/TimeMachine98  "TM-for-macmini-on-docker"      options:usedots,upriv,tm ea:ad allow:hirofumi volsizelimit:300000

9-6. サービス再起動

root@1aec5fd3ad73:/# service netatalk restart

9-7. バックアップ開始

macOS% sudo tmutil setdestination -p afp://hirofumi@192.168.100.5/TM-for-macmini-on-docker

macOS% tmutil destinationinfo
====================================================
Name          : TM-for-macmini-on-docker
Kind          : Network
URL           : afp://hirofumi@192.168.100.5/TM-for-macmini-on-docker
ID            : 234C7FCE-7C9D-4975-9226-58113E2EDCB9
macOS% tmutil startbackup --auto

macOS% tmutil status
Backup session status:
{
    BackupPhase = Starting;
    ClientID = "com.apple.backupd";
    DateOfStateChange = "2016-11-10 15:08:02 +0000";
    DestinationID = "234C7FCE-7C9D-4975-9226-58113E2EDCB9";
    Percent = "-1";
    Running = 1;
    Stopping = 0;
}
tmutil status
Backup session status:
{
    BackupPhase = Copying;
    ClientID = "com.apple.backupd";
    DateOfStateChange = "2016-11-10 15:08:49 +0000";
    DestinationID = "234C7FCE-7C9D-4975-9226-58113E2EDCB9";
    DestinationMountPoint = "/Volumes/Time Machine Backups";
    FirstBackup = 1;
    Percent = 0;
    Progress =     {
        "_raw_totalBytes" = 109091217408;
        bytes = 0;
        files = 0;
        totalBytes = 120000339148;
        totalFiles = 939306;
    };
    Running = 1;
    Stopping = 0;
    "_raw_Percent" = 0;
}

9-8. 様子見

  • これでだめなら最新の netatalk をソースからインストールですかね。。
8
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
10