本家様 https://github.com/bcpierce00/unison
2つのストレージにあるファイル・フォルダを一致させたい.同期させたい.
大抵はrsycを使うか、より瞬時に同期させるならlsyncdを使うか、DRBDを使う.
ここではunisonを使ってみる.
利用シーンとしては研究室のオンプレミス計算機にあるデータを aws に運び、そこで計算してまたオンプレミスに戻したいとか.
unisonは双方のストレージを見比べて双方同じファイル・フォルダにしてしまう
例として下記のような /A と /B があったとして. 双方のコンテンツを一致させてみる
[root@rockylinux ~]# ls -lRF /A/ [root@rockylinux ~]# ls -lRF /B/
/A/: /B/:
total 12 total 12
-rw-r--r--. 1 root root 7 Feb 26 15:42 abc <- new -rw-r--r--. 1 root root 4 Feb 26 14:37 abc
-rw-r--r--. 1 root root 4 Feb 26 14:41 def new -> -rw-r--r--. 1 root root 7 Feb 26 15:42 def
-rw-r--r--. 1 root root 0 Feb 26 14:42 g -rw-r--r--. 1 root root 0 Feb 26 14:42 g
-rw-r--r--. 1 root root 2 Feb 26 14:42 h
-rw-r--r--. 1 root root 2 Feb 26 14:42 i
drwxr-xr-x. 2 root root 6 Feb 26 14:42 J/
drwxr-xr-x. 2 root root 6 Feb 26 14:43 K/
drwxr-xr-x. 2 root root 24 Feb 26 15:42 L/ drwxr-xr-x. 2 root root 24 Feb 26 14:45 L/
/A/L: /B/L:
total 4 total 4
-rw-r--r--. 1 root root 3 Feb 26 15:42 m <- new -rw-r--r--. 1 root root 2 Feb 26 14:44 m
-rw-r--r--. 1 root root 0 Feb 26 14:45 n
-rw-r--r--. 1 root root 0 Feb 26 14:45 o
[root@rockylinux ~]# [root@rockylinux ~]#
コマンドインストール †
[root@rockylinux ~]# cat /etc/redhat-release
Rocky Linux release 8.7 (Green Obsidian)
[root@rockylinux ~]# wget https://github.com/bcpierce00/unison/releases/download/v2.53.0/unison-v2.53.0+ocaml-4.14.0+x86_64.linux.tar.gz
[root@rockylinux ~]# mkdir /usr/local/unison/
[root@rockylinux ~]# tar xf unison-v2.53.0+ocaml-4.14.0+x86_64.linux.tar.gz -C /usr/local/unison/
[root@rockylinux ~]# chown -R root. /usr/local/unison/
[root@rockylinux ~]# ls -l /usr/local/unison/
total 772
drwxr-xr-x. 2 root root 62 Nov 7 20:41 bin
-rw-r--r--. 1 root root 35147 Nov 7 20:41 LICENSE
-rw-r--r--. 1 root root 6781 Nov 7 20:41 README.md
-rw-r--r--. 1 root root 216796 Nov 7 20:41 unison-manual.html
-rw-r--r--. 1 root root 366963 Nov 7 20:41 unison-manual.pdf
-rw-r--r--. 1 root root 157472 Nov 7 20:41 unison-manual.txt
[root@rockylinux ~]#
使ってみる †
前段の /A と /B に対して実行してみる
[root@rockylinux ~]# /usr/local/unison/bin/unison /A /B -batch -ignorearchives
Unison 2.53.0 (ocaml 4.14.0): Contacting server...
Looking for changes
Reconciling changes
file <-?-> file L/m
A : file modified on 2023-02-26 at 15:42:33 size 3 rw-r--r--
B : file modified on 2023-02-26 at 14:44:37 size 2 rw-r--r--
file <-?-> file abc
A : file modified on 2023-02-26 at 15:42:10 size 7 rw-r--r--
B : file modified on 2023-02-26 at 14:37:53 size 4 rw-r--r--
file <-?-> file def
A : file modified on 2023-02-26 at 14:41:25 size 4 rw-r--r--
B : file modified on 2023-02-26 at 15:42:17 size 7 rw-r--r--
dir ----> J
A : dir modified on 2023-02-26 at 14:42:59 size 0 rwxr-xr-x
B : absent
<---- dir K
A : absent
B : dir modified on 2023-02-26 at 14:43:06 size 0 rwxr-xr-x
file ----> L/n
A : file modified on 2023-02-26 at 14:45:17 size 0 rw-r--r--
B : absent
<---- file L/o
A : absent
B : file modified on 2023-02-26 at 14:45:38 size 0 rw-r--r--
file ----> h
A : file modified on 2023-02-26 at 14:42:38 size 2 rw-r--r--
B : absent
<---- file i
A : absent
B : file modified on 2023-02-26 at 14:42:46 size 2 rw-r--r--
Propagating updates
Unison 2.53.0 (ocaml 4.14.0) started propagating changes at 17:35:44.51 on 26 Feb 2023
[CONFLICT] Skipping L/m
contents changed on both sides
[CONFLICT] Skipping abc
contents changed on both sides
[CONFLICT] Skipping def
contents changed on both sides
[BGN] Copying J from /A to /B
[END] Copying J
[BGN] Copying K from /B to /A
[END] Copying K
[BGN] Copying L/n from /A to /B
[END] Copying L/n
[BGN] Copying L/o from /B to /A
[END] Copying L/o
[BGN] Copying h from /A to /B
[END] Copying h
[BGN] Copying i from /B to /A
[END] Copying i
Unison 2.53.0 (ocaml 4.14.0) finished propagating changes at 17:35:44.51 on 26 Feb 2023, 0.001 s
Saving synchronizer state
Synchronization complete at 17:35:44 (6 items transferred, 3 skipped, 0 failed)
skipped: L/m (contents changed on both sides)
skipped: abc (contents changed on both sides)
skipped: def (contents changed on both sides)
[root@rockylinux ~]#
どこをどのようにコピーしたのかが表示される. また既に同じファイルが存在している場合は、該当品を示してくれます
っで結果ですが、
[root@rockylinux ~]# ls -lRF /A/ [root@rockylinux ~]# ls -lRF /B/
/A/: /B/:
total 16 total 16
-rw-r--r--. 1 root root 7 Feb 26 15:42 abc <- skipped -> -rw-r--r--. 1 root root 4 Feb 26 14:37 abc
-rw-r--r--. 1 root root 4 Feb 26 14:41 def <- skipped -> -rw-r--r--. 1 root root 7 Feb 26 15:42 def
-rw-r--r--. 1 root root 0 Feb 26 14:42 g -rw-r--r--. 1 root root 0 Feb 26 14:42 g
-rw-r--r--. 1 root root 2 Feb 26 14:42 h copy --> -rw-r--r--. 1 root root 2 Feb 26 17:35 h
-rw-r--r--. 1 root root 2 Feb 26 17:35 i <-- copy -rw-r--r--. 1 root root 2 Feb 26 14:42 i
drwxr-xr-x. 2 root root 6 Feb 26 14:42 J/ drwxr-xr-x. 2 root root 6 Feb 26 17:35 J/
drwxr-xr-x. 2 root root 6 Feb 26 17:35 K/ drwxr-xr-x. 2 root root 6 Feb 26 14:43 K/
drwxr-xr-x. 2 root root 33 Feb 26 17:35 L/ drwxr-xr-x. 2 root root 33 Feb 26 17:35 L/
/A/J: /B/J:
total 0 total 0
/A/K: /B/K:
total 0 total 0
/A/L: /B/L:
total 4 total 4
-rw-r--r--. 1 root root 3 Feb 26 15:42 m <- skipped -> -rw-r--r--. 1 root root 2 Feb 26 14:44 m
-rw-r--r--. 1 root root 0 Feb 26 14:45 n copy --> -rw-r--r--. 1 root root 0 Feb 26 17:35 n
-rw-r--r--. 1 root root 0 Feb 26 17:35 o <-- copy -rw-r--r--. 1 root root 0 Feb 26 14:45 o
[root@rockylinux ~]# [root@rockylinux ~]#
と一見双方同じように見えます。ですが、同名のファイルに置いて時間差による上書きは行わないみたい.
あと非常に残念だが、コピー品はオリジナルのtimestampを保持しない. unisonを実行した時間が記録される...
正直微妙...だけど、双方のコンテンツを同一にできる代物です.
もしこれをrsyncで行うとなると下記コマンドを実施します
[root@rockylinux ~]# rsync -r --times /A/ /B/
[root@rockylinux ~]# rsync -r --times /B/ /A/
とすると
[root@rockylinux ~]# ls -lRF /A/ [root@rockylinux ~]# ls -lRF /B/
/A/: /B/:
total 16 total 16
-rw-r--r--. 1 root root 7 Feb 26 15:42 abc -rw-r--r--. 1 root root 7 Feb 26 15:42 abc
-rw-r--r--. 1 root root 4 Feb 26 14:41 def -rw-r--r--. 1 root root 4 Feb 26 14:41 def
-rw-r--r--. 1 root root 0 Feb 26 14:42 g -rw-r--r--. 1 root root 0 Feb 26 14:42 g
-rw-r--r--. 1 root root 2 Feb 26 14:42 h -rw-r--r--. 1 root root 2 Feb 26 14:42 h
-rw-r--r--. 1 root root 2 Feb 26 14:42 i -rw-r--r--. 1 root root 2 Feb 26 14:42 i
drwxr-xr-x. 2 root root 6 Feb 26 14:42 J/ drwxr-xr-x. 2 root root 6 Feb 26 14:42 J/
drwxr-xr-x. 2 root root 6 Feb 26 14:43 K/ drwxr-xr-x. 2 root root 6 Feb 26 14:43 K/
drwxr-xr-x. 2 root root 33 Feb 26 15:42 L/ drwxr-xr-x. 2 root root 33 Feb 26 15:42 L/
/A/J: /B/J:
total 0 total 0
/A/K: /B/K:
total 0 total 0
/A/L: /B/L:
total 4 total 4
-rw-r--r--. 1 root root 3 Feb 26 15:42 m -rw-r--r--. 1 root root 3 Feb 26 15:42 m
-rw-r--r--. 1 root root 0 Feb 26 14:45 n -rw-r--r--. 1 root root 0 Feb 26 14:45 n
-rw-r--r--. 1 root root 0 Feb 26 14:45 o -rw-r--r--. 1 root root 0 Feb 26 14:45 o
[root@rockylinux ~]# [root@rockylinux ~]#
となる.
sshを噛ますなら †
オンプレミスとawsの間で使うなら
unison /nfs/aws/share ssh://<EC2のグローバルIP>//nfs/share -sshargs " -l ec2-user -i chaperone.pem " -batch
これで2つのフォルダが同期されます