borg でバックアップとリストア検証

# borgって何　

有償のバックアップソフト並みに、バックアップ履歴の管理が出来る事と、
重複排除機能があるフリーソフトです。
oracleやvmwareのような有償ソフトのバックアップとし使わない限り、
borgが機能的には一番（今の所）優れています。（他があったら教えてください）

https://www.borgbackup.org/


# 検証方針
他のブログでもインストールから、バックアップとリストアまで紹介されていますが、
私の方では、実際の運用に役立つように、フルバックアップ、増分バックアップ、
世代管理による古い世代の削除まで行います。

# データの保全設計
- １週間以内であれば24H前のファイルまで復元可能
- １ヶ月以内であれば１週間単位の状態でファイル復元が可能
- １ヶ月以上であれば月初の状態でファイル復元が可能６ヶ月前まで（６世代）

## 保全対象
- /home/data

##　テストファイル

バックアップ用にテストファイルを作成します。
テストファイルは以下の要件で作成しています。

基本pythonがインストールされていれば動くハズです。

・ファイルは１MBをランダムな英文字と定型文２０％を混ぜて作成しています。
・ファイルはdic01からdic10までの１０フォルダ毎に１万ファイルずつ作成しています。
・ファイル名はfile_nnnnnn.txtの形式です。
・ファイル作成は１０並列で作成します。

```python:create_1m_files.py
import os
import random
import string
import time
from concurrent.futures import ProcessPoolExecutor

# 1MB = 10 * 1024 bytes
FILE_SIZE = 1024 * 1024
NUM_FILES_PER_DIR = 1000
BASE_DIR = './'
DIRS = [f'dic{i:02}' for i in range(1, 11)]  # dic01 - dic10

def generate_compressible_content(size, common_pattern, unique_pattern_ratio=0.8):
    """
    重複排除のために一部は共通パターンを持ち、一部はディレクトリごとに異なるデータにする
    unique_pattern_ratio: 固有データ部分の割合（0.8 = 80%はディレクトリ固有）
    """
    unique_size = int(size * unique_pattern_ratio)
    common_size = size - unique_size

    unique_part = ''.join(random.choices(string.ascii_letters, k=unique_size))
    common_part = common_pattern * (common_size // len(common_pattern))  # 共通パターンを繰り返す

    return unique_part + common_part

def create_directories():
    for dir_name in DIRS:
        dir_path = os.path.join(BASE_DIR, dir_name)
        os.makedirs(dir_path, exist_ok=True)

def create_files_in_directory(directory, num_files, common_pattern):
    for i in range(1, num_files + 1):
        file_name = f'file_{i:06}.txt'  # ファイル名をfile_000001.txtの形式に
        file_path = os.path.join(directory, file_name)
        with open(file_path, 'w') as f:
            content = generate_compressible_content(FILE_SIZE, common_pattern)
            f.write(content)

def main():
    create_directories()

    # 共通パターン: 全ディレクトリで20%程度がこのデータと重複する
    common_pattern = "COMMON_PATTERN_" * 10  # 長さは約150文字の共通パターン

    start_time = time.time()  # 開始時間を記録

    # ProcessPoolExecutorを使用して並列処理を実行
    with ProcessPoolExecutor(max_workers=10) as executor:
        futures = [executor.submit(create_files_in_directory, os.path.join(BASE_DIR, directory), NUM_FILES_PER_DIR, common_pattern)
                   for directory in DIRS]
        
        # 全ての処理が完了するのを待つ
        for future in futures:
            future.result()

    end_time = time.time()  # 終了時間を記録
    elapsed_time = end_time - start_time  # 経過時間を計算
    print(f'Total time to create files: {elapsed_time:.2f} seconds')

if __name__ == '__main__':
    main()

```

以下のように実行してください。
作成は少し時間が掛かるので、バックグランドで実行します。

```bash
#　/home/data/create_1m_files.pyにファイルがある前提
cd /home/data
sudo nohup python3 ./create_1m_files.py &
```


### インストール

インストールは簡単でubuntuやcentos,rockyなどにはパッケージが用意されています。

https://borgbackup.readthedocs.io/en/1.4-maint/installation.html

```bash
# redhat / centos / rocky linux系
sudo dnf -y install borgbackup

# debian系　/ ubuntu
sudo apt -y install borgbackup
```

実行結果はこんな感じです
```bash
[testuser@host01 ~]#sudo  dnf -y install borgbackup
依存関係が解決しました。
====================================================================================================================
 パッケージ                       アーキテクチャー      バージョン                   リポジトリー             サイズ
====================================================================================================================
インストール:
 borgbackup                       x86_64                1.1.18-2.el8                 epel                     1.1 M
依存関係のインストール:
 libb2                            x86_64                0.98.1-6.el8                 epel                      23 k
 python3-llfuse                   x86_64                1.3.6-1.el8                  epel                     382 k
 python3-packaging                noarch                16.8-9.el8                   devel                     46 k
 xxhash-libs                      x86_64                0.8.2-1.el8                  appstream                 37 k

トランザクションの概要
====================================================================================================================
インストール  5 パッケージ

ダウンロードサイズの合計: 1.6 M
インストール後のサイズ: 6.5 M
パッケージのダウンロード:
(1/5): python3-packaging-16.8-9.el8.noarch.rpm                                      1.3 MB/s |  46 kB     00:00    
(2/5): libb2-0.98.1-6.el8.x86_64.rpm                                                808 kB/s |  23 kB     00:00    
(3/5): xxhash-libs-0.8.2-1.el8.x86_64.rpm                                           555 kB/s |  37 kB     00:00    
(4/5): borgbackup-1.1.18-2.el8.x86_64.rpm                                            12 MB/s | 1.1 MB     00:00    
(5/5): python3-llfuse-1.3.6-1.el8.x86_64.rpm                                         11 MB/s | 382 kB     00:00    
--------------------------------------------------------------------------------------------------------------------
合計                                                                                1.3 MB/s | 1.6 MB     00:01     
トランザクションを確認しています
トランザクションの確認に成功しました。
トランザクションをテストしています
トランザクションのテストに成功しました。
トランザクションを実行しています
  準備中           :                                                                                            1/1 
  インストール中   : python3-llfuse-1.3.6-1.el8.x86_64                                                          1/5 
  インストール中   : libb2-0.98.1-6.el8.x86_64                                                                  2/5 
  インストール中   : python3-packaging-16.8-9.el8.noarch                                                        3/5 
  インストール中   : xxhash-libs-0.8.2-1.el8.x86_64                                                             4/5 
  インストール中   : borgbackup-1.1.18-2.el8.x86_64                                                             5/5 
  scriptletの実行中: borgbackup-1.1.18-2.el8.x86_64                                                             5/5 
  検証中           : xxhash-libs-0.8.2-1.el8.x86_64                                                             1/5 
  検証中           : python3-packaging-16.8-9.el8.noarch                                                        2/5 
  検証中           : borgbackup-1.1.18-2.el8.x86_64                                                             3/5 
  検証中           : libb2-0.98.1-6.el8.x86_64                                                                  4/5 
  検証中           : python3-llfuse-1.3.6-1.el8.x86_64                                                          5/5 

インストール済み:
  borgbackup-1.1.18-2.el8.x86_64          libb2-0.98.1-6.el8.x86_64          python3-llfuse-1.3.6-1.el8.x86_64    
  python3-packaging-16.8-9.el8.noarch     xxhash-libs-0.8.2-1.el8.x86_64    

完了しました!

[testuser@host bin]# borg --version
borg 1.1.18

```

ただしパッケージは結構古いバージョンが多いようです。
最新版をインストールする方としてpipを使う事が出来ます。
今回はborg 1.4をpipを使ってインストールします。

```bash
sudo yum install lz4-devel
sudo yum install pkg-config
sudo yum install xxhash-devel
sudo yum install libacl
sudo yum install libacl-devel

pip3 install --upgrade borgbackup

/usr/local/bin/borg --version  
borg 1.4.0  

# .bashrcなどにも記述を追加しておいてください。
export PATH=/usr/local/bin:$PATH
```

インストール後の操作はlinux共通です。

### リポジトリの作成

borg backupではバックアップの保存先をリポジトリという単位で管理します。

リポジトリは１つでも良いですし、複数作成することが出来ます。
今回は検証のため1つしか作成しませんが、/home以下に数百人のユーザーディレクトリがあり、数TBあるような使われ方をしている場合は、ヘビーユーザー数人分のリポジトリとそれ以外のリポジトリに分けて管理することで、borg backupを並列実行出来ます。
(私はparallellで並列化しています）

保存先のリポジトリを暗号化することも出来ますが、今回は暗号化はなしで行います。
個人的には業務上秘匿が必要な情報（ファイル）のバックアップはフリーソフトでしない方がよいです。

```bash

# リポジトリパスは、バックアップを保存先のディレクトリを指定します

#borg init encryption=<暗号化タイプ> <リポジトリパス>
borg init --encryption=none /share/backup
```
暗号化にはいくつか種類がありますので、暗号化したい場合は公式サイトを見ながら設定してください
https://borgbackup.readthedocs.io/en/1.4-maint/usage/init.html

### 最初のフルバックアップ(スナップショット）作成

IT系用語でややこしいのは、ソフトウェア間で用語の意味が若干違うことです。
borg backupではフルバックアップでも増分バックアップでもスナップショットと言っているようです。
厳密には特定のタイミングの状態（スナップショット）でのバックアップにはなっていませんのでご注意ください。

```bash
# --compression 圧縮機能　 lz4(default),zstd,zlib,lzmaがある
# lz4が一番バックアップ速度が速いがその分圧縮効率は悪い、逆にlzmaは一番圧縮効率は良いが速度が一番遅い。
# 今回は圧縮はlz4で行います

# スナップショット名はリポジトリの中で一意の名前で作成します。

# borg create <リポジトリパス＞::<スナップショット名> バックアップ元
borg create --compression lz4 /share/backup::data-1st /home/data --verbose --stats --progress


# --verbose　バックアップ処理中の詳細な情報を出力します。
#　　--stats バックアップ取得後に圧縮効率、重複排除に関するバックアップの統計情報を出力します。
#　　--progress　バックアップ処理中の進捗バーを表示します。

```
バックアップ対象：/home/dataを、リポジトリ：/share/backupにスナップショット名：data-1stとして、バックアップを取得しました。

```bash
[testuser@host01 ~]#sudo borg create --compression lz4  
Creating archive at "/share/backup::data-1st"
------------------------------------------------------------------------------                                      
Archive name: data-1st
Archive fingerprint: 063c9fb8a4467815624f819b72c9b0707070fbe100fbffa8b6033d29aadea34d
Time (start): Sat, 2024-08-24 16:26:21
Time (end):   Sat, 2024-08-24 16:27:11
Duration: 49.62 seconds
Number of files: 10041
Utilization of max. archive size: 0%
------------------------------------------------------------------------------
                       Original size      Compressed size    Deduplicated size
This archive:               10.49 GB              8.44 GB              8.44 GB
All archives:               10.49 GB              8.44 GB              8.44 GB

                       Unique chunks         Total chunks
Chunk index:                   11480                11480
------------------------------------------------------------------------------
```
lz4ではざっくり２０％ぐらい圧縮出来ました。これはファイル内容によるので
ファイルによっては圧縮が思ったよりも効果がない場合があります。
その場合は圧縮オプションを変更してみてください。

https://borgbackup.readthedocs.io/en/1.4-maint/usage/create.html


### バックアップ取得後の確認

```bash
# リポジトリに保存されているスナップショットのリストを取得
# borg list <リポジトリパス>
borg list /share/backup

# スナップショットの詳細情報を取得
# borg info <リポジトリパス>：：＜スナップショット名＞
borg info /backup::home-1st

# スナップショットに保存されているファイルを表示
# borg list <リポジトリパス>：：＜スナップショット名＞
borg list /backup::home-1st

```

```bash
[testuser@host01 ~]# sudo borg list /share/backup
data-1st                             Sat, 2024-08-24 16:26:21 [063c9fb8a4467815624f819b72c9b0707070fbe100fbffa8b6033d29aadea34d]

[testuser@host01 ~]# sudo borg info /share/backup::data-1st
Archive name: data-1st
Archive fingerprint: 063c9fb8a4467815624f819b72c9b0707070fbe100fbffa8b6033d29aadea34d
Comment: 
Hostname: host01
Username: testuser
Time (start): Sat, 2024-08-24 16:26:21
Time (end): Sat, 2024-08-24 16:27:11
Duration: 49.62 seconds
Number of files: 10041
Command line: /usr/bin/borg create --compression lz4 /share/backup::data-1st /home/data --verbose --stats --progress
Utilization of maximum supported archive size: 0%
------------------------------------------------------------------------------
                       Original size      Compressed size    Deduplicated size
This archive:               10.49 GB              8.44 GB              8.44 GB
All archives:               10.49 GB              8.44 GB              8.44 GB

                       Unique chunks         Total chunks
Chunk index:                   11480                11480

[testuser@host01 ~]# sudo borg list /share/backup::data-1st | more
drwxr-xr-x root   root          0 Sat, 2024-08-24 12:44:22 home/data
-rw-r--r-- root   root       2367 Sat, 2024-08-24 12:43:40 home/data/create_1mfiles.py
drwxr-xr-x root   root          0 Sat, 2024-08-24 12:45:43 home/data/dic02
-rw-r--r-- root   root    1048560 Sat, 2024-08-24 12:44:22 home/data/dic02/file_000001.txt
-rw-r--r-- root   root    1048560 Sat, 2024-08-24 12:44:23 home/data/dic02/file_000002.txt
-rw-r--r-- root   root    1048560 Sat, 2024-08-24 12:44:23 home/data/dic02/file_000003.txt
-rw-r--r-- root   root    1048560 Sat, 2024-08-24 12:44:23 home/data/dic02/file_000004.txt
-rw-r--r-- root   root    1048560 Sat, 2024-08-24 12:44:23 home/data/dic02/file_000005.txt
-rw-r--r-- root   root    1048560 Sat, 2024-08-24 12:44:23 home/data/dic02/file_000006.txt
-rw-r--r-- root   root    1048560 Sat, 2024-08-24 12:44:23 home/data/dic02/file_000007.txt
-rw-r--r-- root   root    1048560 Sat, 2024-08-24 12:44:23 home/data/dic02/file_000008.txt
-rw-r--r-- root   root    1048560 Sat, 2024-08-24 12:44:23 home/data/dic02/file_000009.txt
-rw-r--r-- root   root    1048560 Sat, 2024-08-24 12:44:23 home/data/dic02/file_000010.txt
-rw-r--r-- root   root    1048560 Sat, 2024-08-24 12:44:24 home/data/dic02/file_000011.txt
-rw-r--r-- root   root    1048560 Sat, 2024-08-24 12:44:24 home/data/dic02/file_000012.txt

〜〜〜〜〜〜〜〜〜〜〜　省略　〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

```

### 増分バックアップの取得

今後cronで増分バックアップを行うので、スクリプトで作成します。
下記スクリプトには検証用にファイルの修正、追加、削除をいれています。

```bash:borg_backup.sh
#!/bin/bash

# 現在の時間 (HHMM形式) を取得 (例: 14:05の場合は 1405)
current_time=$(date +"%H%M")

# スナップショット名は時間ベースで変更 (例: data-1405)
snapshot_name="data-${current_time}"

# dic01 の file_00<HHMM>.txt を修正 (例: file_001405.txt)
echo  "update file # ${snapshot_name} >> /home/data/dic01/file_00${current_time}.txt" >> /root/backup.log
echo "update file # ${snapshot_name}" >> /home/data/dic01/file_00${current_time}.txt

# dic02 に file_append<HHMM>.txt を追加 (例: file_append1405.txt)
echo "append file # ${snapshot_name} > /home/data/dic02/file_append${current_time}.txt" >> /root/backup.log
echo "append file # ${snapshot_name}" > /home/data/dic02/file_append${current_time}.txt

# dic03 の file_append<HHMM>.txt を削除 (例: file_append1405.txt)
echo "rm /home/data/dic03/file_00${current_time}.txt" >> /root/backup.log
rm /home/data/dic03/file_00${current_time}.txt

# 時間ベースのスナップショットを作成 (例: data-1405)
sudo borg create --compression lz4 /share/backup::${snapshot_name} /home/data --verbose --stats --progress 2>&1 >>/root/backup.log

# スナップショットのリストと詳細情報を表示
sudo borg list /share/backup >>/root/backup.log
sudo borg info /share/backup::${snapshot_name} >>/root/backup.log

```
#増分としては２ファイル（３ファイルの変更・追加・削除）なので一瞬で終わります。

```bash
[testuser@host01 ~]# ./borg_backup.sh 

data-1st                             Sat, 2024-08-24 16:26:21 [063c9fb8a4467815624f819b72c9b0707070fbe100fbffa8b6033d29aadea34d]
data-1635                            Sat, 2024-08-24 16:35:26 [5045fbed445cc59a711de781eb90dc98ae23ca8994ad94404f23e9335bc3c68b]

Creating archive at "/share/backup::data-1635"
------------------------------------------------------------------------------  
Archive name: data-1635
Archive fingerprint: 5045fbed445cc59a711de781eb90dc98ae23ca8994ad94404f23e9335bc3c68b
Time (start): Sat, 2024-08-24 16:35:26
Time (end):   Sat, 2024-08-24 16:35:26
Duration: 0.31 seconds
Number of files: 10043
Utilization of max. archive size: 0%
------------------------------------------------------------------------------
                       Original size      Compressed size    Deduplicated size
This archive:               10.49 GB              8.44 GB            322.05 kB
All archives:               20.98 GB             16.88 GB              8.44 GB

                       Unique chunks         Total chunks
Chunk index:                   11487                22963
------------------------------------------------------------------------------

```
バックアップ全体としては２世代分のような見え方(All archivesと Chunk indexが倍）になっています。

では複数、増分バックアップを作成するためにcronで５分置きに実行する設定を行います。
本来のバックアップ設計では毎日バックアップ取得して１ヶ月分のバックアップを行う必要があるのですがこの段階では検証なので、擬似的にファイル更新・追加・削除をバックアップ前に行うスクリプトを作成しました。
(borg pruneで古い世代を削除する検証を行うため）

```bash
# crontab -e で以下のように追記してください。

[testuser@host01 ~]# crontab -l
*/5 * * * * /root/borg_backup.sh

```

１時間ぐらい放置したらこんな感じになっています。

```bash
[testuser@host01 ~]# borg list /share/backup
data-1st                             Sat, 2024-08-24 16:26:21 [063c9fb8a4467815624f819b72c9b0707070fbe100fbffa8b6033d29aadea34d]
data-1635                            Sat, 2024-08-24 16:35:26 [5045fbed445cc59a711de781eb90dc98ae23ca8994ad94404f23e9335bc3c68b]
data-1645                            Sat, 2024-08-24 16:45:01 [fad46b98c06d3c27c8f4272c5c8dec645856cd63baa748cc8c0a33afddfa131e]
data-1650                            Sat, 2024-08-24 16:50:01 [d3157d465954f548132d52a9b53c58ff0945b102d94f12e99adfb5a5eecaf5f0]
data-1655                            Sat, 2024-08-24 16:55:01 [ea61a9cf9f87d5cab7c301a8bd5e8d977e05874e78cfe77f35bcb1ada13fc9ac]
data-1700                            Sat, 2024-08-24 17:00:02 [55f3fa2e1da959c713e62c3ecf26ac8fd08f1ca05149dcfe3b9ba4a6c57ed09c]
data-1705                            Sat, 2024-08-24 17:05:01 [eee6fccc4553e69a05f6d87e0c53c8405d6277f79fbe3bd912947149fe7347b2]
data-1710                            Sat, 2024-08-24 17:10:01 [2f78d03a0b6e5f30b72f34f942056fbedc939d207c3908caa88e48e457752033]
data-1715                            Sat, 2024-08-24 17:15:01 [690ba89882bb66c047292d899cc812bba1bdaa4fdf91b9622061d1ba6eb890d1]
data-1720                            Sat, 2024-08-24 17:20:01 [c3f9b2f3de3efb9164e8a7d3b2948280f0c7daec1cb7fc31e0d1cb662599782e]
data-1725                            Sat, 2024-08-24 17:25:01 [57b149192a6b14b955585ad432752689c7535746e8fdd8f0ddb0e4c033849d3b]
data-1730                            Sat, 2024-08-24 17:30:01 [51fe5e7613bd79d23b0cec8499eabe00cbf43b1848f7bb0c9d8ff65a2bc9acbc]
data-1735                            Sat, 2024-08-24 17:35:02 [9fccc900cad6ff835f84b410e30afa1b35c36f30575ad3859bd8d233f835ea60]
data-1740                            Sat, 2024-08-24 17:40:01 [d2efd59420bbaeb76536e36f6fd1359fcc6b68fcf356b0e5607e0a79216e1b30]
data-1745                            Sat, 2024-08-24 17:45:01 [93ab8a108e57f86912f784b4af51e9fa0cd666cc0e4d0dae88c31e2b89ece3c6]
data-1750                            Sat, 2024-08-24 17:50:01 [7d2cf3b1352ec3a1e54d7c009ad81397d7d187b0dc292ebb38e01680f4d88cc0]
data-1755                            Sat, 2024-08-24 17:55:01 [8078e05541f33f40f74c8d9f1f2980b7f411ffae668aaa19fe0d6901f34466ba]
data-1800                            Sat, 2024-08-24 18:00:01 [0125aef4ad5a8026b6400082c464339a33a5d213549bc55072a6ea52b00e13d2]
```

これでようやくリストアテスト出来る環境が出来ました。

### １時間前のファイル/ディレクトリ単位を復元

borg backup のファイル復元は癖があり、最初の頃戸惑いました。
気をつける点は以下の通りです。
- 元々ファイルがあったパスではなく、borg list　で出力されるパスとファイル名を指定する必要がある
- リストアされるファイルは、borg extractを実行したディレクトリに、borgで管理されているパスで復元される。（最初気付かず、リストア失敗したと勘違いしていました）

```bash
# リストアするときに指定するパスとファイル名
#　元々のパスは/home/data/dic02ですが、最初のスラッシュ(/)が削除されています。  
#
[testuser@host01 ~]# sudo borg list /share/backup::data-1st | more
drwxr-xr-x root   root          0 Sat, 2024-08-24 12:44:22 home/data
-rw-r--r-- root   root       2367 Sat, 2024-08-24 12:43:40 home/data/create_1mfiles.py
drwxr-xr-x root   root          0 Sat, 2024-08-24 12:45:43 home/data/dic02
-rw-r--r-- root   root    1048560 Sat, 2024-08-24 12:44:22 home/data/dic02/file_000001.txt
-rw-r--r-- root   root    1048560 Sat, 2024-08-24 12:44:23 home/data/dic02/file_000002.txt
-rw-r--r-- root   root    1048560 Sat, 2024-08-24 12:44:23 home/data/dic02/file_000003.txt
-rw-r--r-- root   root    1048560 Sat, 2024-08-24 12:44:23 home/data/dic02/file_000004.txt
-rw-r--r-- root   root    1048560 Sat, 2024-08-24 12:44:23 home/data/dic02/file_000005.txt
-rw-r--r-- root   root    1048560 Sat, 2024-08-24 12:44:23 home/data/dic02/file_000006.txt
-rw-r--r-- root   root    1048560 Sat, 2024-08-24 12:44:23 home/data/dic02/file_000007.txt
```
```bash
# バックアップ全体を復元します。　
borg extract /share/backup::data-1st

# ディレクトリ単位で復元します
borg extract /share/backup::data-1st　home/data/dic01

# ファイル単位で復元します
borg extract /share/backup::data-1st　home/data/dic01/file_000001.txt

```

```bash

[testuser@host01 ~]#borg extract /share/backup::data-1st
[testuser@host01 ~]# pwd 
/root
# borg extractを実行したカレントディレクトリに復元される
[testuser@host01 ~]# ls -al | grep home
drwx------   3 root    root          18  8月 24 20:10 home

[testuser@host01 ~]# ls -al home/data/dic01

〜〜〜〜〜〜〜〜〜〜〜〜　　　　　　省略　　　　　　　　　　　　　　　　　　〜〜〜〜〜〜〜〜〜〜〜〜〜〜
-rw-r--r-- 1 root root 1048560  8月 24 14:39 file_000991.txt
-rw-r--r-- 1 root root 1048560  8月 24 14:39 file_000992.txt
-rw-r--r-- 1 root root 1048560  8月 24 14:39 file_000993.txt
-rw-r--r-- 1 root root 1048560  8月 24 14:39 file_000994.txt
-rw-r--r-- 1 root root 1048560  8月 24 14:39 file_000995.txt
-rw-r--r-- 1 root root 1048560  8月 24 14:39 file_000996.txt
-rw-r--r-- 1 root root 1048560  8月 24 14:39 file_000997.txt
-rw-r--r-- 1 root root 1048560  8月 24 14:39 file_000998.txt
-rw-r--r-- 1 root root 1048560  8月 24 14:39 file_000999.txt
-rw-r--r-- 1 root root 1048560  8月 24 14:39 file_001000.txt

```

実運用では、ファイル削除してから１週間後に気付いて連絡を受けるような事はよくあります。
ファイル名もあやふやだったりすることがあるので、borg listで複数のスナップショットの
出力結果を元にdiffやgrepで対象のファイルを探すことになります。

### バックアップ履歴の整理

borg backupは差分バックアップが存在しないため、全て増分バックアップになります。
ただし、古い増分を削除するborg prune で --keep-weekly=4を指定することで、擬似的に週間の差分バックアップになります。
しかし今回の検証では、そこまで長期間の準備は出来ないため、５分単位で増分バックアップを取得しました。

5時間以内のスナップショットのみキープしそれ以外を削除するコマンドは以下のように実行します。



```bash
# まず失敗し必要なバックアップを削除しないように --dry-runで検証します。
#
# --dry-run 実際の削除はしない実証モード
# --list 削除対象のスナップショットのリスト
# --keep-hourly　時間単位でキープする世代数 検証では１（時間以内）
# --keep-weekly 週単位でキープする世代数　今回の設計なら４
# --keep-monthly　月単位でキープする世代数　今回の設計なら6
# --keep-yearly　年単位でキープする世代数

borg prune --dry-run --list /share/backup --keep-hourly=5　--keep-weekly=4 --keep-monthly=6

```

本来時間単位が最小の管理単位にもかかわらず５分間隔で取得したので、ちょっと特殊な状態になっています。

要点をまとめると

data-1800は 18:00用のスナップとしてキープ
data-1755は 17:00用のスナップとしてキープ
data-1655は 16:00用のスナップとしてキープ
として「Keeping archive」が表示されています。

--keep-hourly=5により本来は５世代（５時間分）がキープされるハズが、
各時間内で複数のバックアップを取得した場合、その時間帯の最新以外が削除対象になりました。
今回は時間で言えば３時間分のみのため３世代のみがキープされます。

```bash
[testuser@host01 ~]# borg prune --dry-run --list /share/backup --keep-hourly=4
Keeping archive: data-1800                            Sat, 2024-08-24 18:00:01 [0125aef4ad5a8026b6400082c464339a33a5d213549bc55072a6ea52b00e13d2]
Keeping archive: data-1755                            Sat, 2024-08-24 17:55:01 [8078e05541f33f40f74c8d9f1f2980b7f411ffae668aaa19fe0d6901f34466ba]
Would prune:     data-1750                            Sat, 2024-08-24 17:50:01 [7d2cf3b1352ec3a1e54d7c009ad81397d7d187b0dc292ebb38e01680f4d88cc0]
Would prune:     data-1745                            Sat, 2024-08-24 17:45:01 [93ab8a108e57f86912f784b4af51e9fa0cd666cc0e4d0dae88c31e2b89ece3c6]
Would prune:     data-1740                            Sat, 2024-08-24 17:40:01 [d2efd59420bbaeb76536e36f6fd1359fcc6b68fcf356b0e5607e0a79216e1b30]
Would prune:     data-1735                            Sat, 2024-08-24 17:35:02 [9fccc900cad6ff835f84b410e30afa1b35c36f30575ad3859bd8d233f835ea60]
Would prune:     data-1730                            Sat, 2024-08-24 17:30:01 [51fe5e7613bd79d23b0cec8499eabe00cbf43b1848f7bb0c9d8ff65a2bc9acbc]
Would prune:     data-1725                            Sat, 2024-08-24 17:25:01 [57b149192a6b14b955585ad432752689c7535746e8fdd8f0ddb0e4c033849d3b]
Would prune:     data-1720                            Sat, 2024-08-24 17:20:01 [c3f9b2f3de3efb9164e8a7d3b2948280f0c7daec1cb7fc31e0d1cb662599782e]
Would prune:     data-1715                            Sat, 2024-08-24 17:15:01 [690ba89882bb66c047292d899cc812bba1bdaa4fdf91b9622061d1ba6eb890d1]
Would prune:     data-1710                            Sat, 2024-08-24 17:10:01 [2f78d03a0b6e5f30b72f34f942056fbedc939d207c3908caa88e48e457752033]
Would prune:     data-1705                            Sat, 2024-08-24 17:05:01 [eee6fccc4553e69a05f6d87e0c53c8405d6277f79fbe3bd912947149fe7347b2]
Would prune:     data-1700                            Sat, 2024-08-24 17:00:02 [55f3fa2e1da959c713e62c3ecf26ac8fd08f1ca05149dcfe3b9ba4a6c57ed09c]
Keeping archive: data-1655                            Sat, 2024-08-24 16:55:01 [ea61a9cf9f87d5cab7c301a8bd5e8d977e05874e78cfe77f35bcb1ada13fc9ac]
Would prune:     data-1650                            Sat, 2024-08-24 16:50:01 [d3157d465954f548132d52a9b53c58ff0945b102d94f12e99adfb5a5eecaf5f0]
Would prune:     data-1645                            Sat, 2024-08-24 16:45:01 [fad46b98c06d3c27c8f4272c5c8dec645856cd63baa748cc8c0a33afddfa131e]
Would prune:     data-1635                            Sat, 2024-08-24 16:35:26 [5045fbed445cc59a711de781eb90dc98ae23ca8994ad94404f23e9335bc3c68b]
Would prune:     data-1st                             Sat, 2024-08-24 16:26:21 [063c9fb8a4467815624f819b72c9b0707070fbe100fbffa8b6033d29aadea34d]
```

では--dry-runを外して、実際に削除してみましょう。

```bash
[testuser@host01 ~]# borg prune --list /share/backup --keep-hourly=5 --keep-weekly=4 --keep-monthly=6
Keeping archive: data-1800                            Sat, 2024-08-24 18:00:01 [0125aef4ad5a8026b6400082c464339a33a5d213549bc55072a6ea52b00e13d2]
Keeping archive: data-1755                            Sat, 2024-08-24 17:55:01 [8078e05541f33f40f74c8d9f1f2980b7f411ffae668aaa19fe0d6901f34466ba]
Pruning archive: data-1750                            Sat, 2024-08-24 17:50:01 [7d2cf3b1352ec3a1e54d7c009ad81397d7d187b0dc292ebb38e01680f4d88cc0] (1/15)
Pruning archive: data-1745                            Sat, 2024-08-24 17:45:01 [93ab8a108e57f86912f784b4af51e9fa0cd666cc0e4d0dae88c31e2b89ece3c6] (2/15)
Pruning archive: data-1740                            Sat, 2024-08-24 17:40:01 [d2efd59420bbaeb76536e36f6fd1359fcc6b68fcf356b0e5607e0a79216e1b30] (3/15)
Pruning archive: data-1735                            Sat, 2024-08-24 17:35:02 [9fccc900cad6ff835f84b410e30afa1b35c36f30575ad3859bd8d233f835ea60] (4/15)
Pruning archive: data-1730                            Sat, 2024-08-24 17:30:01 [51fe5e7613bd79d23b0cec8499eabe00cbf43b1848f7bb0c9d8ff65a2bc9acbc] (5/15)
Pruning archive: data-1725                            Sat, 2024-08-24 17:25:01 [57b149192a6b14b955585ad432752689c7535746e8fdd8f0ddb0e4c033849d3b] (6/15)
Pruning archive: data-1720                            Sat, 2024-08-24 17:20:01 [c3f9b2f3de3efb9164e8a7d3b2948280f0c7daec1cb7fc31e0d1cb662599782e] (7/15)
Pruning archive: data-1715                            Sat, 2024-08-24 17:15:01 [690ba89882bb66c047292d899cc812bba1bdaa4fdf91b9622061d1ba6eb890d1] (8/15)
Pruning archive: data-1710                            Sat, 2024-08-24 17:10:01 [2f78d03a0b6e5f30b72f34f942056fbedc939d207c3908caa88e48e457752033] (9/15)
Pruning archive: data-1705                            Sat, 2024-08-24 17:05:01 [eee6fccc4553e69a05f6d87e0c53c8405d6277f79fbe3bd912947149fe7347b2] (10/15)
Pruning archive: data-1700                            Sat, 2024-08-24 17:00:02 [55f3fa2e1da959c713e62c3ecf26ac8fd08f1ca05149dcfe3b9ba4a6c57ed09c] (11/15)
Keeping archive: data-1655                            Sat, 2024-08-24 16:55:01 [ea61a9cf9f87d5cab7c301a8bd5e8d977e05874e78cfe77f35bcb1ada13fc9ac]
Pruning archive: data-1650                            Sat, 2024-08-24 16:50:01 [d3157d465954f548132d52a9b53c58ff0945b102d94f12e99adfb5a5eecaf5f0] (12/15)
Pruning archive: data-1645                            Sat, 2024-08-24 16:45:01 [fad46b98c06d3c27c8f4272c5c8dec645856cd63baa748cc8c0a33afddfa131e] (13/15)
Pruning archive: data-1635                            Sat, 2024-08-24 16:35:26 [5045fbed445cc59a711de781eb90dc98ae23ca8994ad94404f23e9335bc3c68b] (14/15)
Pruning archive: data-1st                             Sat, 2024-08-24 16:26:21 [063c9fb8a4467815624f819b72c9b0707070fbe100fbffa8b6033d29aadea34d] (15/15)

```

 スナップショットが３つだけになりました。
 
```bash
[testuser@host01 ~]# borg list /share/backup
data-1655                            Sat, 2024-08-24 16:55:01 [ea61a9cf9f87d5cab7c301a8bd5e8d977e05874e78cfe77f35bcb1ada13fc9ac]
data-1755                            Sat, 2024-08-24 17:55:01 [8078e05541f33f40f74c8d9f1f2980b7f411ffae668aaa19fe0d6901f34466ba]
data-1800                            Sat, 2024-08-24 18:00:01 [0125aef4ad5a8026b6400082c464339a33a5d213549bc55072a6ea52b00e13d2]
```

他のスナップショットから参照されるデータは残る。そのため削除してもストレージ領域が思ったほど解放されない場合があります。
不要なストレージ領域を開放するためにborg pruneを行ったら、
borg compactを実行します。

```bash
# compactはバージョン1.2以降にしかないので、事前にバージョンを確認してください。
borg compact /share/backup

```

###　 フルバックアップを複数世代持ちたい場合のやり方

先程もお伝えしたように、borg backupはフルバックアップを同一リポジトリでは出来ません。
その代わりリポジトリを分ける事で、世代管理は出来ます。
もしフルバックアップを複数セット保存しておく必要がある場合は、
新しくリポジトリを作成します。

ちゃんとフルバックアップを世代管理する場合は以下を行います。
一般的には月一フルバックアップを取るので１２世代もしくは半年の６世代分リポジトリを作成します。

```bash
borg init /share/backup_2nd 
borg init /share/backup_3rd
borg init /share/backup_4th
```

世代を切り替えてバックアップを行う場合はcronに仕掛けるスクリプトで制御は可能です。
以下はフルバックアップを６世代持つためのcron設定例です。
```bash
#crontab -e
0 0 * 1,7 *  /path/to/backup_repo_1_7.sh
0 0 * 2,8 *  /path/to/backup_repo_2_8.sh
0 0 * 3,9 *  /path/to/backup_repo_3_9.sh
0 0 * 4,10 * /path/to/backup_repo_4_10.sh
0 0 * 5,11 * /path/to/backup_repo_5_11.sh
0 0 * 6,12 * /path/to/backup_repo_6_12.sh

```

以上でborgの検証を終えます。
tarやrsyncよりも面倒な点もありますが、慣れれば管理とストレージ容量の節約の観点でも
borg backupはお勧め出来ます。

後日は大規模バックアップ用に、parallelを使ってborgを並列バックアップすることで、
どのくらいバックアップ速度が向上するのかも載せたいと思います。
（圧縮オプションについても）