本家様 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つのフォルダが同期されます


トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS
Last-modified: 2023-02-26 (日) 17:45:19 (103d)