能書き
おうちサーバー構築報告:予告の流れとは違う、我が家のラズパイNASです。
今回は、大きなストレージデバイス(4TB)を用意して、そこにラズパイNAS内の全データをバックアップします。
参考文献
- バックアップ - インストールの準備 - 私的サーバー構築日誌:Ubuntu 24.04 LTS in MicroServer N54L - Qiitams/bd96a26e0a65ceb28ff7#%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97)
- バックアップ - 作業準備 - 私的サーバー構築日誌:ZFS HDD交換・Ubuntu 24.04 LTS in MicroServer N54L - Qiita
- Ubuntuでrsyncを使いこなす!ファイル同期・バックアップ完全ガイド【初心者向け】 - オープンソースの力を活用する方法~Ubuntuの世界へようこそ~
- ZFS ストレージプールをインポートする - ZFS ストレージプールを移行する - 第 4 章 Oracle Solaris ZFS ストレージプールの管理 - Oracle Solaris ZFS 管理ガイド
- データセットの作成 - How to ZFS
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
もうすっかり忘れてしまったのですが、extra1
とtank
の2つのストレージプールを作成していたようです。特にtank
の方は、何かのデバイスとミラーリングしていたようですな。その内容確認とサルベージは後日ということで。
extra1
の方がバックアップだったはず。と言う訳でetra1
をzpool 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も、やっとバックアップできました。これで一安心です。ふぅ。