このあたりのシリーズに書いた通り、ASUSTORの茄子・・・じゃなかった、NASには結構イラついているのだ。だけどモノとしては悪くないし、2TBの内蔵用ハードディスク2台と合わせて約3万円の投資をしてるので、おいそれと捨てるわけにもいかず、使い続けるしかないのだ。
使い続けるためには、またランサムウェアとかウィルスとかに感染して保存されているデータが消えたり使い物にならなくなっても困らないようにしないといけない。だからNASのデータを別の場所にもバックアップしておかないといけないよね。
バックアップ方式
ASUSTORのNASの管理ツールでもあるADMのApp Centralを見ると「バックアップと同期」カテゴリにたくさんのツールが入ってる。今見てみると17個もある。
このApp Centralの各ツールの説明って本当に意味がないといつも思ってるんだけど、まず中国語のやつは全く読めないからやめてほしいよね。英語のやつもあるけど、ほとんどはスクショととても簡単な説明だけで、何ができるのかすら分からないものも結構多い。日本語のホームページもあって日本向けに販売してる製品なんだから、ちゃんと日本語化しておいてほしい。日本のサポートデスクもあるし日本語がちゃんとできる人がコメントしてるみたいなので、日本語化するのは出来ないはずがないんだよね。手抜かりが多すぎるでしょ。
まあでも今回はこれらのツールを使うわけではないのだ。だってそもそもが信用ならないNASだよ?特に開発者がASUSTORとかASUSCLOUDとかの怪しい会社名のやつなんて絶対に使用状況とかを収集してるし、場合によってはファイルの中身を読み取って機密情報を取り出そうとしているかもしれない。バックドアがどこに仕掛けられてるかも分からないから、こんな怪しいものは使わないに限るのだ。
仮に信用できるツールがあったとしても、バックアップ先のストレージがASUSTORのOSから見えるようになっちゃってたら、簡単にランサムウェアの餌食になるよね。だからこれらの危ないツールは使えない。
じゃあどうするのか?って、そりゃ別の端末でバックアップ用のツールを動かしてバックアップするしかないのだ。
今回はNASと同じネットワーク内にあるRaspberryPiを使う。このラズパイにはUbuntuが入ってるから、Ubuntuでバックアップツールを動かしてバックアップしようと思うのだ。
Ubuntuにハードディスクをマウント
ここから先はもし同じような環境の人がいたら参考になるかもしれないので、少々詳しく書いておこうと思う。
まず、ラズパイだろうがDOS/VだろうがUbuntuにハードディスクをマウントするところから始めるのではないかと思う。いや、そもそも大容量ディスクが付いててそこにバックアップしようとしてる場合はこの章は読み飛ばしても良いけど。
ハードウェアの調達
今回俺の場合はRaspberryPiにUSB接続の外付けハードディスクをつないでそこにバックアップしようとしてるのだ。
つないだやつはこれ。
正確に言えばこれと同型のロジテック公式オンラインショップ限定モデルなんだけどね。
そしてこのハードディスクケースに入れたハードディスクはこれかな?
ハードディスクって型番が微妙に違うのとかがたくさんあったりするから正確にこれかどうかは分からない。でも違ったとしてもこれに近いヤツで、東芝の4TBのヤツ。もちろんバルク品を買ったのだ。
ハードディスクケースへの組み入れは簡単。ケースのネジを外して、それっぽい所にハードディスクをセットして付属のネジで留めたらケースに入れて外したネジを締めて終わり。
ラズパイをシャットダウンしてからUSB端子につないで、ラズパイ起動!
つないだディスクを確認
UbuntuにUSBハードディスクをつないだ時に確認するコマンドは sudo fdisk -l ということらしい。・・・らしいってのは俺はLinuxはあまり詳しくないから。大抵Linuxの作業をするときはググって複数のサイトで同じようなことが書かれてるかを確認したらその情報を信用して実行・・・って感じにやってる。う~ん、かれこれ20年くらいLinux絡みの仕事をしてるんだけどね。まあそんな感じでもあまり困らないみたい。
このコマンドを実行したらこんな感じになった。途中は省略してあるけど。
ディスク /dev/loop0: 45.94 MiB, 48152576 バイト, 94048 セクタ 単位: セクタ (1 * 512 = 512 バイト) セクタサイズ (論理 / 物理): 512 バイト / 512 バイト I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト (中略) ディスク /dev/mmcblk0: 28.91 GiB, 31016878080 バイト, 60579840 セクタ 単位: セクタ (1 * 512 = 512 バイト) セクタサイズ (論理 / 物理): 512 バイト / 512 バイト I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト ディスクラベルのタイプ: dos ディスク識別子: 0x3dcbbbc4 デバイス 起動 開始位置 最後から セクタ サイズ Id タイプ /dev/mmcblk0p1 * 2048 526335 524288 256M c W95 FAT32 (LBA) /dev/mmcblk0p2 526336 60579839 60053504 28.7G 83 Linux ディスク /dev/sda: 3.65 TiB, 4000787030016 バイト, 7814037168 セクタ Disk model: 単位: セクタ (1 * 512 = 512 バイト) セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト ディスクラベルのタイプ: gpt ディスク識別子: 339D2776-8D84-4EAB-BE83-017A7F56AA4F デバイス 開始位置 最後から セクタ サイズ タイプ /dev/sda1 34 32767 32734 16M Microsoft 予約領域 /dev/sda2 32768 7814033407 7814000640 3.7T Microsoft 基本データ パーティション 1 は物理セクタの境界で始まっていません。
最初の「ディスク /dev/loop0」ってのは何か知らない。とりあえず放置。他にloop1とかloop2もあったみたい。
「ディスク /dev/mmcblk0:」ってのは容量が28.91 GiBとなってるので、多分これはOSを入れてある32GBのマイクロSDカードだと思う。これもとりあえず放置。
最後の「ディスク /dev/sda: 3.65 TiB」ってやつがUSBで繋いだ4TBのハードディスクなのだ。「パーティション 1 は物理セクタの境界で始まっていません。」ってなってるのもよく分からないけど、そもそもこのハードディスクは一旦WindowsPCに繋いでNTFSでフォーマットしてみて使えるかどうか確認したから「Microsoft 予約領域」とか「Microsoft 基本データ」ってなってると思われる。
なぜWindowsPCでフォーマットしたか?って、そりゃちゃんと使えるか確認するためだよね。あんま分かってないLinuxにいきなり繋いでなんかおかしくても、何がおかしいかとか判断つかないし。だからまずは多少わかるWindowsに繋いでハードディスクとケースがちゃんと使えるかを確認してみたのだ。
いよいよマウント?
どうやらUbuntuから見えてるようなので、マウントしてみるのだ。
Ubuntuで外付けディスクを繋ぐときはまずディレクトリを切るらしい。・・・らしいってのは先に書いたのと同じ理由。これWindowsとは考え方が違う気がするよね。Windowsのディレクトリってハードディスクとかのストレージの中に作るもんでしょ?Linuxの場合ハードディスクの中にディレクトリを切るんじゃなくて、OSがアクセスするための場所というかエントリーポイントとしてディレクトリを切るということなんじゃないかと思ってる。詳しくないけど。で、ディレクトリを切るときのコマンドは sudo mkdir /hdd とか。最後の/hddってのがエントリーポイントになるってことかな。ここは好きな名前を付ければ良いと思う。
そしてマウントするコマンドを打ってみる。 sudo mount -t ntfs /dev/sda /hdd ・・・すると。
NTFS signature is missing. Failed to mount '/dev/sda': 無効な引数です The device '/dev/sda' doesn't seem to have a valid NTFS. Maybe the wrong device is used? Or the whole disk instead of a partition (e.g. /dev/sda, not /dev/sda1)? Or the other way around?
う~ん、よく分からない。どうもこれだとマウントできないっぽい。適当に訳してみると「/dev/sdaはNTFSじゃないよ。もしかして、間違ったデバイスを使ってる?それともパーティションじゃなくてディスク全体とかそんな感じ?」確かに、よく考えると「NTFSですよ」と指定してるのに、パーティションじゃなくてドライブ全体を指定してる。だけど実際に指定したいのはドライブ全体であって、それをフォーマットしたいんだよね。う~ん、パーティションを削除しないとダメかもねー-ってことで、少し調べたらdfiskコマンドでパーティションを削除したり作ったりできることが分かった。
sudo fdisk /dev/sda と入れてfdiskを起動。
ここで設定した内容は、書き込みコマンドを実行するまでメモリのみに保持されます。 書き込みコマンドを使用する際は、注意して実行してください。 コマンド (m でヘルプ):
fdiskは対話モードで
fdiskは対話モードで使えるツールなのだ。だから「コマンド (m でヘルプ):」のプロンプトが出たらコマンドを入れる必要がある。
まずはmを入力してみる
ヘルプ: GPT M 保護/ハイブリッド MBR に入ります 一般 d パーティションを削除します F パーティションのない領域を一覧表示します l 既知のパーティションタイプを一覧表示します n 新しいパーティションを追加します p パーティション情報を表示します t パーティションタイプを変更します v パーティション情報を検証します i パーティションの情報を表示します その他 m このメニューを表示します x 特殊機能に移動します (熟練者向け機能) スクリプト I ディスクのレイアウトを sfdisk 互換のスクリプトから読み込みます O ディスクのレイアウトを sfdisk 互換のスクリプトに書き出します 保存と終了 w パーティション情報をディスクに書き込んで終了します q 変更点を保存せずに終了します 新しいラベルを作成します g 新しい (何もない) GPT パーティションテーブルを作成します G 新しい (何もない) SGI (IRIX) パーティションテーブルを作成します o 新しい (何もない) DOS パーティションテーブルを作成します s 新しい (何もない) Sun パーティションテーブルを作成します
fdiskでパーティション削除
次にp(パーティション情報を表示します)を入力してみる。
ディスク /dev/sda: 3.65 TiB, 4000787030016 バイト, 7814037168 セクタ Disk model: 単位: セクタ (1 * 512 = 512 バイト) セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト ディスクラベルのタイプ: gpt ディスク識別子: 339D2776-8D84-4EAB-BE83-017A7F56AA4F デバイス 開始位置 最後から セクタ サイズ タイプ /dev/sda1 34 32767 32734 16M Microsoft 予約領域 /dev/sda2 32768 7814033407 7814000640 3.7T Microsoft 基本データ パーティション 1 は物理セクタの境界で始まっていません。
あー、なんかこれ見たことある。さっき「sudo fdisk -l」を入力したときに似たようなのが出たよ。
続いてd(パーティションを削除します)を入力してみる
パーティション番号 (1,2, 既定値 2):
2を入力してみる
パーティション番号 (1,2, 既定値 2): 2 パーティション 2 を削除しました。 コマンド (m でヘルプ):
パーティション削除できたみたい。じゃあ、またdを入力してみる
コマンド (m でヘルプ): d パーティション 1 を選択 パーティション 1 を削除しました。 コマンド (m でヘルプ):
できたかもしれないから確認。pを入力してみる
ディスク /dev/sda: 3.65 TiB, 4000787030016 バイト, 7814037168 セクタ Disk model: 単位: セクタ (1 * 512 = 512 バイト) セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト ディスクラベルのタイプ: gpt ディスク識別子: 339D2776-8D84-4EAB-BE83-017A7F56AA4F
うん。できたっぽい。反映させたいからw(パーティション情報をディスクに書き込んで終了します)を入力してみる
コマンド (m でヘルプ): w パーティション情報が変更されました。 ioctl() を呼び出してパーティション情報を再読み込みします。 ディスクを同期しています。
fdiskでパーティション作成
パーティション削除できたっぽいので、こんどはパーティションを作らないといけない。NTFSにする必要はないからLinux向けにext4にするのだ。 sudo fdisk /dev/sda 。
fdisk (util-linux 2.34) へようこそ。 ここで設定した内容は、書き込みコマンドを実行するまでメモリのみに保持されます。 書き込みコマンドを使用する際は、注意して実行してください。 コマンド (m でヘルプ): n パーティション番号 (1-128, 既定値 1): 最初のセクタ (34-7814037134, 既定値 2048): Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-7814037134, 既定値 7814037134): 新しいパーティション 1 をタイプ Linux filesystem、サイズ 3.7 TiB で作成しました。 コマンド (m でヘルプ): p ディスク /dev/sda: 3.65 TiB, 4000787030016 バイト, 7814037168 セクタ Disk model: 単位: セクタ (1 * 512 = 512 バイト) セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト ディスクラベルのタイプ: gpt ディスク識別子: 339D2776-8D84-4EAB-BE83-017A7F56AA4F デバイス 開始位置 最後から セクタ サイズ タイプ /dev/sda1 2048 7814037134 7814035087 3.7T Linux ファイルシステム コマンド (m でヘルプ): w パーティション情報が変更されました。 ioctl() を呼び出してパーティション情報を再読み込みします。 ディスクを同期しています。
さて、パーティションができたので、もういちどマウントしてみる。 sudo mount /dev/sda1 /hdd 。
mount: /hdd: wrong fs type, bad option, bad superblock on /dev/sda1, missing codepage or helper program, or other error.
あれ???タイプが違うって。どうやらパーティションを作るだけじゃダメでファイルシステムを作る(?)必要があるらしい。
sudo mkfs.ext4 /dev/sda1
mke2fs 1.45.5 (07-Jan-2020) Creating filesystem with 976754385 4k blocks and 244195328 inodes Filesystem UUID: bb927693-86c8-4890-a652-45e87dd4a30c Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 102400000, 214990848, 512000000, 550731776, 644972544 Allocating group tables: done Writing inode tables: done Creating journal (262144 blocks): done Writing superblocks and filesystem accounting information: done
できたかな?もう一度 sudo fdisk -l で確認してみる。
ディスク /dev/loop0: 45.94 MiB, 48152576 バイト, 94048 セクタ 単位: セクタ (1 * 512 = 512 バイト) セクタサイズ (論理 / 物理): 512 バイト / 512 バイト I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト (中略) ディスク /dev/sda: 3.65 TiB, 4000787030016 バイト, 7814037168 セクタ Disk model: 単位: セクタ (1 * 512 = 512 バイト) セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト ディスクラベルのタイプ: gpt ディスク識別子: 339D2776-8D84-4EAB-BE83-017A7F56AA4F デバイス 開始位置 最後から セクタ サイズ タイプ /dev/sda1 2048 7814037134 7814035087 3.7T Linux ファイルシステム
こんどこそマウントできるか?
あ~~「3.7T Linux ファイルシステム」ってなってる。
ようやく、マウントできるのか? sudo mount /dev/sda1 /hdd ??何もエラーが出ないみたい。
ってことで、 df -h で見てみると
Filesystem Size Used Avail Use% Mounted on udev 414M 0 414M 0% /dev tmpfs 93M 3.9M 89M 5% /run /dev/mmcblk0p2 29G 4.4G 23G 17% / (中略) /dev/sda1 3.6T 89M 3.4T 1% /hdd
うん。/hddで見えてるね。
NASの共有フォルダをマウント
CIFS
NASではファイル共有のプロトコルはSMBしか動いてないのだ。だからUbuntuでもSMBの共有フォルダを参照できるようにCIFSをインストールする。 sudo apt install cifs-utils 。
パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 提案パッケージ: keyutils smbclient 以下のパッケージが新たにインストールされます: cifs-utils アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 5 個。 78.6 kB のアーカイブを取得する必要があります。 この操作後に追加で 214 kB のディスク容量が消費されます。 取得:1 http://ports.ubuntu.com/ubuntu-ports focal-updates/main armhf cifs-utils armhf 2:6.9-1ubuntu0.1 [78.6 kB] 78.6 kB を 2秒 で取得しました (49.6 kB/s) 以前に未選択のパッケージ cifs-utils を選択しています。 (データベースを読み込んでいます ... 現在 150150 個のファイルとディレクトリがインストールされています。) .../cifs-utils_2%3a6.9-1ubuntu0.1_armhf.deb を展開する準備をしています ... cifs-utils (2:6.9-1ubuntu0.1) を展開しています... cifs-utils (2:6.9-1ubuntu0.1) を設定しています ... update-alternatives: /etc/cifs-utils/idmap-plugin (idmap-plugin) を提供するために自動モードで /usr/lib/arm-linux-gnueabihf/cifs-utils/idmapwb.so を使います man-db (2.9.1-1) のトリガを処理しています ...
NAS上の共有フォルダをマウント
NASのIPアドレスは192.168.1.3で、ホスト名はeggplantにしてある。そしてHomeという共有フォルダがあるのだ。それを/nas/eggplant/Homeにマウントしたいのだ。
まずはディレクトリを切る。
sudo mkdir -p /nas/eggplant/Home
次にマウントする。
sudo mount -t cifs -o noperm,username=admin,password=P@ssw0rd //192.168.1.3/Home /nas/eggplant/Home
lsコマンドで見てみたら見えたのでOK。 ls -la /nas/eggplant/Home/ 。
バックアップ
バックアップ方式
バックアップ用のツールは何が良いだろうかと思って探してたら、案外バックアップツールじゃなくてrsyncコマンドでやってる人も多いみたいで、しかも削除されたら別ディレクトリに退避しつつ増分をバックアップしてくれるコマンドを開発してる人がいたのでHACKER’S HIGHというブログのrsyncだけで実現する!ファイルのバックアップ手法6選 【コマンド例編】という記事を参考にさせてもらったのだ。
この記事の中の「逆増分バックアップ」ってのが何とも素晴らしい。
rsync -avh --delete --backup --backup-dir="../backup-$(date +%Y%m%d-%H%M%S)" /test/src/ /test/dst/backup-latest
このコマンド一発で、増分バックアップをしつつ、削除されたファイルは退避してくれるみたいなんだよね。
ランサムウェアで拡張子が勝手に書き換えられたような場合は、このrsyncコマンドだとbackup-latestには書き換えられたファイルがコピーされちゃうけど、書き換えられる前のファイルは退避ディレクトリに移動しておいてくれて、なんなら元に戻せる・・・はず。
まあ、拡張子を替えずに読めなくしちゃうようなウィルスとかだと通用しないけどね。
バックアップ用シェルコマンド作成
というわけで、 sudo mkdir /root/backup/ でバックアップ用のシェルを保存するディレクトリを切ったら sudo vi /root/backup/backup.sh でシェルファイルを作成するのだ。
rsync -avh --delete --backup --backup-dir="../backup-$(date +%Y%m%d-%H%M%S)" /nas/eggplant/Home/ /hdd/Home/backup-latest
こんな感じにコマンドを入れたら保存して、 sudo chmod 744 /root/backup/backup.sh で実行できるようにしておく。
自動実行
cronで自動実行されるように設定ファイルを作るのだ。
sudo vi /etc/cron.d/nasbackup
0 0 * * * root /root/backup/backup.sh
さて、ちゃんとバックアップできるかな。