0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

おうちサーバー構築報告:バックアップ・Raspberry Pi 5 でNAS構築

Posted at

能書き

おうちサーバー構築報告:予告の流れとは違う、我が家のラズパイNASです。

今回は、大きなストレージデバイス(4TB)を用意して、そこにラズパイNAS内の全データをバックアップします。

参考文献

import

以前、4TBのデバイスを購入して使ったので、それを流用します。

まずはハードウェア的に接続。USB接続です。

それからzpool importします。

$ sudo zpool import
   pool: extra1
     id: 10279878555798217878
  state: ONLINE
status: The pool was last accessed by another system.
 action: The pool can be imported using its name or numeric identifier and
        the '-f' flag.
   see: https://openzfs.github.io/openzfs-docs/msg/ZFS-8000-EY
 config:

        extra1      ONLINE
          sdf       ONLINE

   pool: tank
     id: 18233389827505880159
  state: DEGRADED
status: One or more devices contains corrupted data.
 action: The pool can be imported despite missing or damaged devices.  The
        fault tolerance of the pool may be compromised if imported.
   see: https://openzfs.github.io/openzfs-docs/msg/ZFS-8000-4J
 config:

        tank                                            DEGRADED
          mirror-0                                      DEGRADED
            ata-Hitachi_HTS723232A7A364_E3834263EDYUAD  UNAVAIL
            zd0                                         ONLINE

もうすっかり忘れてしまったのですが、extra1tankの2つのストレージプールを作成していたようです。特にtankの方は、何かのデバイスとミラーリングしていたようですな。その内容確認とサルベージは後日ということで。

extra1の方がバックアップだったはず。と言う訳でetra1zpool importします。

sudo zpool import extra1 -R /mnt

インポートに失敗しました。(下記メッセージ中のhostmachineとhostidは適当に変更しています)

$ sudo zpool import extra1 -R /mnt
cannot import 'extra1': pool was previously in use from another system.
Last accessed by hostmachine (hostid=290000d8) at Sun Mar  9 00:32:10 2025
The pool can be imported, use 'zpool import -f' to import the pool.

前回最後にzpool exportしなかったのかも知れません。メッセージ通りに-fオプションを付けてみます。

sudo zpool import extra1 -R /mnt -f

今度は上手くいきました。

$ zpool list
NAME     SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
extra1  3.62T  1.84T  1.79T        -         -    28%    50%  1.00x    ONLINE  /mnt
tank    2.26T  1.33T   951G        -        8G    37%    58%  1.00x    ONLINE  -
$ ls -l /mnt
total 1
drwxr-xr-x 5 root root 5 Feb 15  2025 extra1

不要物の削除

かつてバックアップに失敗した時の残骸が残っていました。削除。

実行コマンドは省略。普通にsudo rm -rfコマンドを実行しただけ…なのですが、これでは一部ファイルがなぜかOperation not permittedになったのでCopilotに相談。どうやらimmutable属性とかいうものが付いていたらしい。immutable属性を外したら削除できました。

sudo chattr -iR *
sudo rm -rf *

そして/mnt/extra1/bak_tankはただのディレクトリではなくデータセットだったので、zfs destroyしました。

sudo zfs destroy extra1/bak_tank

バックアップ

ただのディレクトリではなく、専用データセットを作ります。普通のディレクトリでも良かったんですけどね。

名前は、上記と同じbak_tankにします。

sudo zfs create extra1/bak_tank

確認。

ls -dl /mnt/extra1/bak_tank

ちゃんと出来ていますね。

$ ls -dl /mnt/extra1/bak_tank
drwxr-xr-x 2 root root 2 Sep 15 17:02 /mnt/extra1/bak_tank

今回はrsyncコマンドでバックアップを取ってみます。

sudo rsync -a /tank /mnt/extra1/bak_tank/ &

動き出した事を確認します。

ps -ax | grep rsync

動いている内は下記のような結果になります。

$ ps -ax | grep rsync
   8191 pts/0    S      0:00 sudo rsync -a /tank /mnt/extra1/bak_tank/
   8192 pts/1    Ss+    0:00 sudo rsync -a /tank /mnt/extra1/bak_tank/
   8193 pts/1    D      0:00 rsync -a /tank /mnt/extra1/bak_tank/
   8194 pts/1    S      0:00 rsync -a /tank /mnt/extra1/bak_tank/
   8195 pts/1    S      0:00 rsync -a /tank /mnt/extra1/bak_tank/
   8204 pts/0    S+     0:00 grep --color=auto rsync

外付けUSB接続ストレージが止まったのを見計らって確認。下記のように、rsyncプロセスが無くなったらrsync完了です。

$ ps -ax | grep rsync
  52395 pts/0    S+     0:00 grep --color=auto rsync

一応zpool listしてみます。

zpool list

バックアップディレクトリのサイズを比較してみます。前のマシンでは大量コピーすると不具合が発生したので、少々慎重になりました。

sudo du -hs /mnt/extra1/bak_tank/
sudo du -hs /tank/

ちょっとサイズがずれてますね。ディレクトリのサイズが違うのかな…?

$ sudo du -hs /mnt/extra1/bak_tank/
707G    /mnt/extra1/bak_tank/
$ sudo du -hs /tank/
712G    /tank/

ファイルだけのサイズを合計して表示するようCopilotにお願いしてみたら、いい感じのワンライナーを提示してくれました。それにディレクトリ指定の手を入れたのがこちら:

sudo find /tank/ -type f -exec du -b {} + | awk '{sum += $1} END {print sum}'
sudo find /mnt/extra1/bak_tank/ -type f -exec du -b {} + | awk '{sum += $1} END {print sum}'

実行してみたら、なんと!バックアップの方がサイズがでかい…orz
どうしてピッタリ一致しないんですかねぇ。

$ sudo find /tank/ -type f -exec du -b {} + | awk '{sum += $1} END {print sum}'
1094160680239
$ sudo find /mnt/extra1/bak_tank/ -type f -exec du -b {} + | awk '{sum += $1} END {print sum}'
1102580651063

ファイル名の差分を取ってみました。

diff -s <(cd /mnt/extra1/bak_tank; sudo find tank -type f -print | sort) <(cd /; sudo find tank -
type f -print | sort)

今度はピタリ一致しました!よかったよかった。これで安心です。

$ diff -s <(cd /mnt/extra1/bak_tank; sudo find tank -type f -print | sort) <(cd /; sudo find tank -type f -print | sort)
Files /dev/fd/63 and /dev/fd/62 are identical

export

バックアップ完了を確認できたので、外付けUSB接続ストレージをexportします。

sudo zpool export extra1

一応確認。

zpool list

はい、exportされた事を確認できました。

$ zpool list
NAME   SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
tank  2.26T  1.33T   951G        -        8G    37%    58%  1.00x    ONLINE  -

そうしたら電源を切って、バックアップ用の外付けUSB接続ストレージを物理的に取り外します。

sudo shutdown -h now

仕舞い

我が家のNASも、やっとバックアップできました。これで一安心です。ふぅ。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?