2020年7月30日木曜日

MyDNSへのIPアドレス通知をWindowsのバッチファイルでする方法

MyDNSへのIPアドレス通知をWindowsのバッチファイルでする方法

WindowsのバッチファイルでMyDNSへのIPアドレスを通知するには。
FTPコマンドとHTTT-BASICを使って簡単なバッチファイルで通知する方法を紹介しています。

前提とする環境

mydns.jp ダイナミックDNSサイト

Windows10 (Windows7以降かな)

IPv4/IPv6 デュアルスタック IPv4シングルスタック


以下の記事で説明されているバッチファイルを置く場所は、自身のアクセス権のある場所に配置してください。
オススメは、ご自分のアカウントフォルダーの直下です。トラブルなく動作するのでちょっと幸せになれます。
例えば、
C:\USERS\<user name>\scripts

のような場所になります。以下の説明では 

 C:\USERS\Owner\scripts

であるとして説明しています。適宜読み替えてご利用ください。scriptsフォルダは最初は有りませんので自分で作ります。説明のためのスクリーンショット上では、当方の環境のためC:\USERS\Owner\scripts\mydns-ftpとなっていたりします。スクリプトの配置場所に読み替えてください。

 

■気がつけばMyDNSへのIP通知が止まっていた

Diceは設定ファイルが消えるらしい

いたって面倒くさがりなので、いままでMyDNSへのIPアドレスの通知はDiceというソフトを使っていた。しかし、あるときから通知されなくなっていたようで、MyDNSから『IPアドレスの通知がありません』とメールが来ていた。では、とDiceを見ると通知設定が消えているではありませんか。ネットで調べてみたところ、Diceには設定が消えてしまう不具合があるということでした。いや、たしかに実家PCに入れていたDiceの設定も消えていて、通知が滞るようになっていた。そのたびに再設定していたので、さもありなん。。。と振り返って。いやいや。。。そいつは困るでねーか。と他のアプリに依存しない方法を考えた。
 MyDNSにはPOPやFTP、HTTPでも通知が可能なので、今回バッチファイルで実現できそうなFTPとHTTPS-BASICを使ってMyDNSへのIP通知を実現することにした。

Dice設定が消えた。。。
Dice 設定が消えてるよ!もー

■MyDNSとは(一応)

国内有数のダイナミック・ドメイン・サーバーを提供する無料サイトです。
本来、自宅のサーバーを建てたり自宅へのVPN接続をするために固定IPアドレスを取得したほうが簡単に構築接続できるのですが、固定IPアドレスは別料金であったり、高額化してきています。
そこで、MyDNSを使い固定IPを取得せずにルーターに割り当てられたIPアドレスをMyDNSへ通知することでドメイン名で安価(無料)に接続できるようになります。IPアドレス変動に注意しなくてもWebサーバーを公開したりVPNにドメイン名で接続できるのでより簡単、楽に接続できるのでとても便利です。
とくにMyDNSが優秀なのは、いろいろな方法でIPアドレスを通知することができ、環境に合わせて通知方法を選択できることです。

■MyDNSへIPアドレスを通知する方法

・ソフトを使って通知する DiCEを使う

通知方法で便利で有名なのがDiCEというソフトです。ずっとこれを使っていたのですがコレに設定が消えてしまうという不具合があったのでした。他のPCに設定を移すのも意外と面倒なんです。それなら、バッチファイルを作りそれを他のPCにコピーすれば通知設定が完了するので、バッチファイルの方が融通が効くような気がしてきた。

・POPアクセスを使う メールソフトを使う

他にもメールでIPアドレスを通知する方法があるのですが、いやこれ、Windows10になってから付属の『メール』も設定時にちゃんと暗号化での接続ができないと設定が完了しなくなっています。Office2019等のOffice製品のOutlookでも同様で、暗号化設定ができないと設定が完了しません。
(回避方法はあるので気が向いたら記事書きます)

・FTPを使う

Windows標準のFTPクライアントはコマンドラインから操作できるので、今回はこれを使用しています。 
 
 

・HTTP-BASICを使う <オススメ>

URLに含める形でユーザー名とパスワードを指定できるのでこちらも簡単に通知できます。動作結果がわかるのでこちらのほうがいいかもしれません。

・HTTP-DIRECTを使う

スクリプト言語をつかえばできるのですが、別にインストールする必要があります。他にはPowerShellでできるかな?ただ、PowerShellは実行時にサクッと実行できなくてタスクスケジューラーに登録とかスタートアップに登録でよくハマるであまり好きではありませんw。
 
WindowsにはFTPコマンドがあり、コマンドからサーバーへ接続、ファイルの送信、ファイルの取得ができます。ただ、コマンドラインからの操作では、ユーザー名パスワードで手動で入力する必要があるのですが、今回ユーザー名、パスワードは別ファイルに記載したものをリダイレクトし入力する方式にしました。

バッチファイル ソースコード

FTP接続するバッチファイルとユーザーIDとパスワードを記載したファイル2つのファイルで構成されます。

[mydnsftp2.bat] 

REM mydnsftp2.bat for IPv4 & IPv6 
echo %~dp0
cd /d %~dp0
ftp ipv4.mydns.jp < mydnsftpuser.txt

ftp ipv6.mydns.jp < mydnsftpuser.txt

exit 0

 

[mydnsftpuser.txt] 

mydns1234567
aNatanOPaSSword4

  
1行目 ユーザID
2行目 パスワード
mydnsftpuser.txtは各自のアカウントに合わせて変更してください。

このバッチファイルを適当なフォルダ(C:\USERS\<user name>\scriptsがオススメ)に置いて、スタートアップフォルダにバッチファイルのショートカットを置いたり。タスクスケジューラーで1時間おきに通知とかすれば完成です。

実行結果 

上記のファイルを実行すると次のようになります。 
C:\Users\Owner\Scripts\mydns-ftp>mydnsftp2.bat

C:\Users\Owner\Scripts\mydns-ftp>REM mydnsftp2.bat for IPv4 & IPv6

C:\Users\Owner\Scripts\mydns-ftp>echo C:\Users\Owner\Scripts\mydns-ftp\
C:\Users\Owner\Scripts\mydns-ftp\

C:\Users\Owner\Scripts\mydns-ftp>cd /d C:\Users\Owner\Scripts\mydns-ftp\

C:\Users\Owner\Scripts\mydns-ftp>ftp ipv4.mydns.jp  0<mydnsftpuser.txt
ユーザー (ipv4.mydns.jp:(none)): パスワード:
OOPS: cannot locate user entry:mydns1234567
接続がリモート ホストによって閉じられました。

C:\Users\Owner\Scripts\mydns-ftp>ftp ipv6.mydns.jp  0<mydnsftpuser.txt
ユーザー (ipv6.mydns.jp:(none)): パスワード:
OOPS: cannot locate user entry:mydns1234567
OOPS: priv_sock_get_cmd
接続がリモート ホストによって閉じられました。
C:\Users\Owner\Scripts\mydns-ftp>
  
FTPサーバーは実際に動作していないのでエラーが出て停止していますが、これで正常にIPアドレスが通知されています。
たまに、そのFTPサーバーが動作していないときに通知ができないことがあります。

https://<MyDNS ID>:<MyDNS PassWord>@ipv4.mydns.jp/login.html
https://<MyDNS ID>:<MyDNS PassWord>@ipv6.mydns.jp/login.html
で通知ができるので。簡単なバッチファイルで通知が出来ます。


[mydnshttpbasic.bat]  
REM mydnshttpbasic.bat 
echo %~dp0
cd /d %~dp0
curl https://mydns1234567:aNatanOPaSSword4@ipv4.mydns.jp/login.html
curl https://mydns1234567:aNatanOPaSSword4@ipv6.mydns.jp/login.html

exit 0
 

のようなバッチファイルで通知が出来ます。

実行結果 

上記のバッチファイルを実行すると次のようになります。
C:\Users\Owner\Scripts\mydns-ftp>mydnshttpbasic.bat

C:\Users\Owner\Scripts\mydns-ftp>REM mydnshttpbasic.bat

C:\Users\Owner\Scripts\mydns-ftp>echo C:\Users\Owner\Scripts\mydns-ftp\
C:\Users\Owner\Scripts\mydns-ftp\

C:\Users\Owner\Scripts\mydns-ftp>cd /d C:\Users\Owner\Scripts\mydns-ftp\

C:\Users\Owner\Scripts\mydns-ftp>curl https://mydns1234567:aNatanOPaSSword4@ipv4.mydns.jp/login.html
<html>
<head>
<title>Free Dynamic DNS (DDNS) for Home Server and VPS etc  | MyDNS.JP</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<LINK href="./site.css" rel=stylesheet type=text/css>

</head>
<BODY BGCOLOR="#FFFFFF"
      TEXT="#304040"
      leftmargin="0" topmargin="0" marginwidth="0" marginheight="0"
>
Login and IP address notify OK.<BR>
login_status = 1.<BR>
<BR>
<DT>MASTERID :</DT><DD>mydns1234567</DD>
<DT>REMOTE ADDRESS:</DT><DD>111.202.123.144</DD>
<DT>ACCESS DAYTIME:</DT><DD>2021/09/29 00:48:03 UTC</DD>
<DT>SERVER ADDRESS:</DT><DD>210.197.74.212</DD>
<BR>

</body>
</html>

C:\Users\Owner\Scripts\mydns-ftp>curl https://mydns1234567:aNatanOPaSSword4@ipv6.mydns.jp/login.html
<html>
<head>
<title>Free Dynamic DNS (DDNS) for Home Server and VPS etc  | MyDNS.JP</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<LINK href="./site.css" rel=stylesheet type=text/css>

</head>
<BODY BGCOLOR="#FFFFFF"
      TEXT="#304040"
      leftmargin="0" topmargin="0" marginwidth="0" marginheight="0"
>
Login and IP address notify OK.<BR>
login_status = 1.<BR>
<BR>
<DT>MASTERID :</DT><DD>mydns1234567</DD>
<DT>REMOTE ADDRESS:</DT><DD>2422:4123:4fc4:3d00:ff1d:3cf2:72a9:ff7a</DD>
<DT>ACCESS DAYTIME:</DT><DD>2021/09/29 00:48:04 UTC</DD>
<DT>SERVER ADDRESS:</DT><DD>2604:180:f4::1e8</DD>
<BR>

</body>
</html>
C:\Users\Owner\Scripts\mydns-ftp>
 


■IPアドレスを更新時だけ通知する - HTTP Basic -

ほとんどのプロバイダーが付与するGlobalIPは、ほどんど変更されることは有りません。なので、上記の方法では無用な通知が多数を占め、MyDNSさんの貴重なサーバーリソースを無駄遣いしてしまうことになります。そこで、懸命なユーザーならIPアドレスが変更されたときだけ通知しようと考えると思います。
Windowsのバッチファイルだけで変更通知のみを行うスクリプトがなかなか見つけられなかったので作成しました。
以下のバッチファイルを置く場所は、自身のアクセス権のある場所に配置してください。
オススメは、ご自分のアカウントフォルダーの直下です。トラブルなく動作するのでちょっと幸せになれます。
例えば、
C:\USERS\<user name>\scripts
のようなところです。

[mydnsupdater.bat]  

REM mydnsupdater.bat
echo %~dp0
cd /d %~dp0

curl https://domains.google.com/checkip -4 > gipv4_curr.txt
fc /a gipv4_prev.txt gipv4_curr.txt


rem echo %ERRORLEVEL%
IF NOT %ERRORLEVEL%==0 (

echo [MyDNSUpdater] Updating IPv4 and IPv6 addresses
curl https://mydns1234567:aNatanOPaSSword4@ipv4.mydns.jp/login.html
curl https://mydns1234567:aNatanOPaSSword4@ipv6.mydns.jp/login.html


copy gipv4_curr.txt gipv4_prev.txt) ELSE (
REM echo NOUPDATE
)

exit 0


 


■自動実行するには スタートアップへ登録する

Windows起動時に一度だけ実行することが出来ます。
スタートアップフォルダーを開くにはファイルエクスプローラーのアドレスバーに

shell:startup

と入力すると開きます。



手動で開く時のスタートアップのフォルダーはこちらです。

C:\Users\<User Name>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

<User Name>はご自分のWindowsへ登録されている名前です。フォルダーが表示になっているとエクスプローラーで表示されないので隠しファイルを表示するよう設定が必要です。

エクスプローラーのメニュー [表示]-[v]隠しファイル


このフォルダーに先程作成したバッチファイルのショートカットをコピーします。


■自動実行するには タスクスケジューラに登録する

タスクスケジューラーなら自分の意図した時間に実行することが出来ます。
スタート横の検索窓からタスクスケジューラと入力して検索すると表示されます。
以下、使用するバッチファイルは適時ご自分が利用するバッチファイルに読み替えてください。

基本タスクを追加します。

以下、
先程のHTTP-BASICを使用した[mydnshttpbasic.bat]をスケジューリングしてみます。  
今後管理しやすいように名前をつけます。
名前には、MyDNS-HTTPBASICのようにします。

とりあえず
(●)コンピューターの起動時
としておきます。これで起動時に通知されるようになります。



[参照]ボタンを押しバッチファイルの場所を指定します。

[mydnshttpbasic.bat]を指定します。

一応ここまででWindows起動時にMyDNSへ通知できるようになりました。
1時間毎に通知等さらに細かい設定を行います。

MyDNS-HTTPBASIC
というスケジュールが追加されたので、これを編集します。
[MyDNS-HTTPBASIC][右クリック]-[プロパティー]

[v]最上位の特権で実行する
もし、パソコンがスリープ時にログアウトしパスワードが必要な設定なら
 ●ユーザーがログオンしているかにどうかに関わらず実行する
に丸をつけてパスワードを入力してください。PINでは認証通りません。

タブ[トリガー]をクリックする

[編集]をクリック
トリガーの編集
[v]繰り返し間隔 チェックを入れる
間隔[1時間] を選ぶ
継続時間[無制限]を選ぶ
[OK]

他の項目はとくにイジる必要はありません。

[OK]を押す
以上です。
1時間ごとに黒いコマンドプロンプト画面が表示されて、通知するようになります。
最初はちょっとびっくりします。

■コマンドプロンプト窓を非表示にする
@タスクケジューラ

タスクスケジューラーで実行させるとほぼ希望したとおりの動作をします。しかし、やっぱり黒いコマンドプロンプトが表示されるとびっくりします。それに、作業中ならフォーカスが外れることで編集ミスや作業に支障をきたすことがあります。

そこで黒い窓を表示しないように、タスクスケジューラで実行するコマンドを工夫します。
すでにタスクを追加されていたら、
そのタスクの上で[右クリック]-[プロパティー]


タブ[操作]
[プログラムの開始]をクリックして[編集...]

[プログラム/スクリプト(P):]に次のコマンドをペーストします。

%comspec% /c start "" /min "C:\Users\Owner\Scripts\mydns-ftp\mydnsupdater.bat"  ^& exit

 


引数が[プログラム]ボックスに含まれているように見えます
と表示されたら、[はい(Y)]を押します。正しい記述に修正してくれます。
[Ok][Ok]で閉じます。
タスクの動作確認は、右クリック[実行]で今すぐ実行出来ます。
C:\USERS\Owner\scriptsフォルダー内に
gipv4_curr.txt
gipv4_prev.txt
が作成されているか。内容が正しいか。MyDNS内マイページでIPアドレスが更新されているかを確認してみてください。


先の項目で説明した"mydnsupdater.bat"バッチファイルを使った例です。
Ownerとなっているところは、それぞれのユーザー名に合わせて適宜修正してください。
startのあとの "" は必須です。削除すると動作しません。
各バッチファイル末に"exit 0"が必要になります。



    各バッチファイルの最後に"exit 0"を追加 2021.10.10
コマンドプロンプト窓を非表示にする@タスクケジューラ追記 2021.10.10
タスクスケジューラ・スタートアップについて追記 2021.10.02
FTP通知スクリプトを簡略化 HTTP-BASIC追加 2021.09.28


2020年7月22日水曜日

CentOSを使って壊れたSynology NAS DS418 HDDのデータを取り出してみた RAID1

以下の記事はデータやシステムを破損する可能性のある操作を含んでおります。
自己責任でご参考にしてください。
また、発生したいかなる損害においても当方は責任を負いかねますm(_ _)m

■この記事にかかれていること


破損したSynologyのNAS DS418から取り出したハードディスクのデータを取り出す話です。
すでにSynologyのNASが使用できなくなり、CentOSなPCからデータを取り出す手順を解説しています。
NASがまだ起動する状況ならNASをつかって取り出せます。
NASが起動できないなら新ハードディスクを追加しDSMをインストールし直して取り出したほうがはるかに簡単です。Synologyのホームページから手順を確認できます。
NASが壊れて電源も入らないような故障の時は以下の記事が役に立つと思います。
今回使用しているPCのOSはCentOS7.5です。
Ubuntu等他のLinuxでも同等の手順で取り出しが可能だと思われます。


■Synology NASを買ってみたらいきなりハードディスクに故障メッセージが


今人気のSynologyのNASですが、なかなか優秀です。国産のNASもいくつかありはしますが、海外系NASをいじるとその高機能、扱いやすさ、安定性、いずれをとっても国産NASにないものがあります。そんなSynologyのNASをついに入手したのですが、早々取り付けた新品HDDが破損。いや、破損クラスタが8個ほど出ただけなのですが、『故障が進行しています』とメッセージが出て交換することにしました。
別に保存したデータはまだテスト運用中だったこともあり必要なデータでもないのですが、この際、検証と手順の確認も含めて取り出したハードディスクからのデータのサルベージ作業を行ってみました。


■Synology DS418 RAID NAS


4ドライブのNASです。メディアサーバーとしても利用できます。
とくに、気に入ったのがボリュームタイプのSHRが使えるところです。これは、RAIDの自動構成で、取り付けられたハードディスクの容量に合わせてRAIDを自動選択し最適なRAIDを使用し柔軟に容量アップができます。ドライブを適切に勝手に切り分けRAID1-RAID5を自動構成しつつ一つのボリュームとして扱えるので便利です。
ハードディスク1台から運用でき、ハードディスク2個でミラーリング、3個でRAID5に移行できます。容量が不足すれば随時ハードディスクを追加・容量アップできるので2ベイよりも4ベイのほうが融通がききそうです。

今回接続しているハードディスクは4Tバイト2個でRAID1を構成しています。

実は、DS420よりもDS418のほうがコア数が多くて性能が高いという。。。

■ストレージプールが劣化しています

ことの始まりは。。。ストレージマネージャのメッセージ。

ストレージマネージャー
ボリューム1(劣化)
アドバイス 関連のストレージプールは劣化しています。[ストレージプール]タブに進み[ストレージプール1]を修復してください


(参考)キャプチャしてなかったので別の画像です

それとSynologyからのメールです。


お客様各位、

DS418 上のドライブ 1 はひどく損傷し故障しかけています。データを直ちにバックアップして、次にドライブを交換してください。

ドライブ情報:
製造元:TOSHIBA
モデル:DT02ABA400
容量:3.6 TB
シリアル番号:Y123456789H
ファームウェア:KQ000A

S.M.A.R.T. ステータス: 失敗
不良セクター数: 1
ディスク再接続数: 0
ディスク再識別数: 0

詳細情報は DS418 にログインしてください。


お客様各位、

DS418 上のドライブ 1 の不良セクターが増加しました。統計は、不良セクターのあるドライブが、不良セクターのないドライブに比べて破損する可能性が高いことを示しました。データの完全性を保証するためにデータのバックアップを直ちに実行することを推奨します。その後、[ストレージ
マネージャ] > [HDD/SSD] > [S.M.A.R.T.]
の順に進んで、拡張テストを実行し、テスト結果で推奨アクションを参照してください。

ドライブ情報:
製造元:TOSHIBA
モデル:DT02ABA400
容量:3.6 TB
シリアル番号:Y123456789H
ファームウェア:KQ000A

S.M.A.R.T. ステータス: ノーマル
不良セクター数: 8
ディスク再接続数: 0
ディスク再識別数: 0

詳細情報は DS418 にログインしてください。

送信元 DS418


SMARTの詳細スキャンも失敗するようなのでもうどうしようもありません。


■Synology NASのOSとRAIDのファイルシステム

データのサルベージを行う前に事前知識が必要です。
SynologyのNASで使用されているOSはDSMというオリジナルOSですが、これはLinuxベースのOSです。LVM(Logical Volume Manager)を使用し物理ドライブを隠蔽した上で、
RAIDを構成することで、RAIDの構成の変更と柔軟な容量のボリュームを提供しています。なのでLinux系統のOSを使用することで、RAIDを再構成すれば比較的容易にデータの吸い出しが可能となるのです。
また、SynologyのNASで使用されているボリュームのファイルシステムはbtrfsです。耐障害性が高く障害時のデータの取り出しが容易といった特徴があります。ただ、このファイルシステムはRedHat Enterprise Linux7でサポート終了となっているため、この記事が新CentOSではそのまま使えなくなるかもしれません。。。


■CentOSでSynology NASのハードディスクをサルベージする

ここからが本題です。実際にサルベージする手順とコマンドを説明します。

この記事で扱われるシステム構成

NAS Synology DS418 SHR(RAID1構成)
  + Drive1 4T TOSHIBA DT02ABA400    ←故障 ここからの取り出しを試みる
  + Drive2 4T HGST HDN724040ALE640

PC CentOS Linux release 7.5.1804 (Core)

2ドライブモデルのSynology NASもRAID1のミラーリングで動作していると思われるので同じ操作でデータのサルベージが可能だと思われます。

NASからTOSHIBA DT02ABA400を取り出し、CentOSのインストールされたPCに接続します。以下すべてRootログインしてからの操作です。 自分の環境に合わせて適宜読み替えてください。

ドライブの確認

#dmesg
ハードディスクTOSHIBA 4Tバイト関連のメッセージ
TOSHIBA DT02ABA400はsdb

[    2.681029] ata6: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
[    2.682649] ata6.00: ATA-10: TOSHIBA DT02ABA400, KQ000A, max UDMA/100
[    2.682652] ata6.00: 7814037168 sectors, multi 1: LBA48 NCQ (depth 31/32), AA
[    2.682656] ata6.00: SB600 AHCI: limiting to 255 sectors per cmd
[    2.683989] ata6.00: configured for UDMA/100
[    2.842624] scsi 5:0:0:0: Direct-Access     ATA      TOSHIBA DT02ABA4 0A   PQ: 0 ANSI: 5
[    2.892896] sd 5:0:0:0: [sdb] 7814037168 512-byte logical blocks: (4.00 TB/3.63 TiB)
[    2.892901] sd 5:0:0:0: [sdb] 4096-byte physical blocks
[    2.892973] sd 5:0:0:0: [sdb] Write Protect is off
[    2.892976] sd 5:0:0:0: [sdb] Mode Sense: 00 3a 00 00
[    2.894221] sd 5:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[    2.902172]  sda: sda1 sda2
[    2.902744] sd 2:0:0:0: [sda] Attached SCSI disk
[    2.958311]  sdb: sdb1 sdb2 sdb5
[    2.958893] sd 5:0:0:0: [sdb] Attached SCSI disk

認識されているドライブの確認

データをサルベージするパーティーションはsdb5
# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0  1.8T  0 disk
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0  1.8T  0 part
  ├─centos-root 253:0    0   50G  0 lvm  /
  ├─centos-swap 253:1    0  3.8G  0 lvm  [SWAP]
  └─centos-home 253:2    0  1.8T  0 lvm  /home
sdb               8:16   0  3.7T  0 disk
├─sdb1            8:17   0  2.4G  0 part
├─sdb2            8:18   0    2G  0 part
└─sdb5            8:21   0  3.6T  0 part


1 つまたは複数のデバイスの md スーパブロックの内容を表示する


#mdadm -E /dev/sdb5
/dev/sdb5:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x0
     Array UUID : 2e890fa3:4c304fc5:3f648e73:80b4b820
           Name : DiskStation:2
  Creation Time : Sat Jul 11 20:56:29 2020
     Raid Level : raid1
   Raid Devices : 2

Avail Dev Size : 7804374912 (3721.42 GiB 3995.84 GB)
     Array Size : 3902187456 (3721.42 GiB 3995.84 GB)
    Data Offset : 2048 sectors
   Super Offset : 8 sectors
   Unused Space : before=1968 sectors, after=0 sectors
          State : clean
    Device UUID : 591f71ad:4e2d6d10:980b782b:a9ad48eb

    Update Time : Fri Jul 17 19:30:12 2020
       Checksum : f4eb4723 - correct
         Events : 1245


   Device Role : Active device 0
   Array State : AA ('A' == active, '.' == missing, 'R' == replacing)

すべてのRAID関連のサービスを停止する

これをしないと次のRAIDの構成に失敗するので必ず行います
# mdadm --stop --scan

RAIDの再構成を行いRAIDサービスを開始する

RAIDのボリュームは/dev/md0に割り当てる
# mdadm --assemble --verbose /dev/md0 /dev/sdb5 --run
mdadm: looking for devices for /dev/md0
mdadm: /dev/sdb5 is identified as a member of /dev/md0, slot 0.
mdadm: no uptodate device for slot 1 of /dev/md0
mdadm: added /dev/sdb5 to /dev/md0 as 0
mdadm: /dev/md0 has been started with 1 drive (out of 2).

再構成されたRAIDの動作状態を確認する

# cat /proc/mdstat
Personalities : [raid1
md0 : active raid1 sdb5[0]
      3902187456 blocks super 1.2 [2/1] [U_]

再構成されたRAIDのボリュームの状態を表示する      

# mdadm --detail /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Sat Jul 11 20:56:29 2020
        Raid Level : raid1
        Array Size : 3902187456 (3721.42 GiB 3995.84 GB)
     Used Dev Size : 3902187456 (3721.42 GiB 3995.84 GB)
      Raid Devices : 2
     Total Devices : 1
       Persistence : Superblock is persistent

       Update Time : Fri Jul 17 19:30:12 2020
             State : clean, degraded
    Active Devices : 1
   Working Devices : 1
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : resync

              Name : DiskStation:2
              UUID : 2e890fa3:4c304fc5:3f648e73:80b4b820
            Events : 1245

    Number   Major   Minor   RaidDevice State
       0       8       21        0      active sync   /dev/sdb5
       -       0        0        1      removed

存在するVolumeGroupを有効にする

# vgchange -ay
  1 logical volume(s) in volume group "vg1000" now active
  3 logical volume(s) in volume group "centos" now active

ボリュームをマウントする

# mount /dev/vg1000/lv /mnt/md0 -o ro

/mnt/md0は存在していなければ
md /mnt/md0 で作成しておく

マウント作業はここで完了
/mnt/md0からNASのハードディスク内に保存されていたファイルが見えるようになります。以降データバックアップも可能です。

■再構成したRAIDデータの確認と取り出し

RAIDのマウント位置に移動

# cd /mnt/md0
# ll
合計 316
drwxr-xr-x. 1 root root      24  7月 11 20:56 @S2S
drwx------. 1 root users     12  7月 11 21:30 @SynoDrive
drwxr-xr-x. 1 root root     122  7月 16 11:28 @SynoFinder-log
drwxr-xr-x. 1 root root      24  7月 11 21:28 @SynologyApplicationService
drwxr-xr-x. 1 root root      32  7月 11 21:29 @SynologyDriveShareSync
drwxr-xr-x. 1 root root     256  7月 12 20:27 @appstore
drwxr-xr-x. 1 1024 users     76  7月 11 20:56 @database
drwxrwxrwx. 1 root root      92  7月 12 20:32 @eaDir
-rw-------. 1 root root  191356  7月 17 15:05 @synocrond.core.gz
-rw-------. 1 root root  128626  7月 16 10:19 @synologrotated.core.gz
drwxr-xr-x. 1 root root      62  7月 11 21:33 @synologydrive
drwxrwxrwt. 1 root root      90  7月 17 18:16 @tmp
drwxr-xr-x. 1 root root      52  7月 12 03:02 homes
drwxr-xr-x. 1 root root      12  7月 11 21:33 music
drwxr-xr-x. 1 root root      12  7月 12 20:24 photo
drwxr-xr-x. 1 root root      28  7月 17 16:16 pictures
drwxr-xr-x. 1 root root      50  7月 17 18:38 public
drwxr-xr-x. 1 root root      12  7月 12 20:25 video

homesフォルダを覗いてみる

# cd homes
# ll
合計 0
drwxrwxrwx. 1 root root  42  7月 17 15:06 @eaDir
drwxr-xr-x. 1 1024 users  0  7月 11 21:26 admin
drwxr-xr-x. 1 1026 users 10  7月 11 21:28 owner
drwxr-xr-x. 1 1027 users 18  7月 12 03:34 david
   :

■NAS用HDDのおすすめ

NASに使うハードディスクは何がいいのか。目的によりハードディスクを選定する必要があります。高速性を望むのか、安定性を望むのか、データの永続性を望むのか。

高速性重視

同一メーカー同一機種2台でストライピングを構成すると非常に高速になります。しかし、ストライピングはハードディスク一台が故障するとすべてのデータが消えてしまいます。しかも、故障確率はその2乗になります。3台のストライピングなら3乗。データの損失を防ぐためにミラーリングのような構成が必要になりますが非常に高価なものになります。高速性を重視したときにここで疑問が湧きます。そんなに高速性が必要ならネットワーク越しに使わなくてもいいのじゃないかと。少人数利用で、そんなにデータの移動を伴わなければ、ローカルのSSDに置けば遥かに高速になりますし、SSDの方が対故障性が良くなります。編集が終わった時点でNASに戻せば十分でしょう。たしかに、動画編集をチームで行うような使い方や高負荷なサーバー用途なら高速性能が問題になるのでしょうが、高速性が本当に必要なのかよく考えてみましょう。ハードディスクは必ず壊れます。より高性能より高安定なハードディスクを使用しましょう。

NAS用HDDといえば定番はこちらになるでしょう。ストレージメーカーはWesternDigitaが吸収合併してほぼ1社独占状態です。コスパ最高の容量がコレです。


安定性重視

高速性を重視すれば同一機種で揃えるのが一番ですが、高速性を犠牲にすれば同一機種にする必要はありません。同一機種同一ロットの場合、そのロットに問題があれば同じように壊れます。製造過程の問題、設計上の問題いずれもありえます。ある条件で壊れる不具合ならばその条件が発生したとき同時に壊れます。同時に壊れればミラーリングしていてもデータ損失は免れません。なので、他のロット・機種・ブランドをミックスすれば、その機種・ロット固有の問題を回避できます。新製品よりも発売から時間が経った『こなれた』製品が安心です。設計上の問題が製品に反映されるのに3ヶ月から半年かかるとして、それ以降のものがより安心です。ハードディスクは必ず壊れるものと考えれば、その壊れるタイミングさえずれていれば大丈夫なのでより安価なデスクトップ用のハードディスクを使用することも考えられます。いずれもRAID用よりも安くなっています。

 

データの永続性を重視

『データ消えては困る、ずっと残したい。』これ。。。社内や自宅で実現することは非常に難しいです。
なぜなら、壊れない機械はないからです。いずれは壊れる。いずれはデータが消える。データの永続性を考えればNASのバックアップを取るしかないのです。じゃあそのバックアップしたものは壊れないのか?じゃあ、バックアップのバックアップ?どう管理する?それも問題になります。NASの話をしていてNAS自体のバックアップが最終的に必要になるというのもなんとも悲しい話ではあります。
より安定した永続性が必要ならクラウドを使うしかないでしょう。多重にバックアップされたクラウドならその消失の心配が極限まで減少できます。費用対効果も良いでしょう。ただし、そのトレードオフとしてデータの流出漏洩の問題が浮上してきます。あと、クラウドで問題になるのはその会社の安定性でしょうか。クラウドに保存して安心していたら、その会社が消失してしまった。では笑い話にもなりません。
クラウドといえば次の3つが定番ではないでしょうか。

 

■最後に

さて、データのサルベージはうまくいきましたでしょうか。参考になりましたら幸いです。今まで、RAIDなNASは、破損・障害時のデータのサルベージが怖くて手を出せずにいましたが、なんとかなりそうな感触を得られました。

今回この記事を書くに至ったのは、ネット上にあまたある情報のなかからこのような情報に至るのに意外と時間がかかったためです。私と同じようにネットで徘徊せざるを得なくなった方のためにも記事といたしました。専門の方々からすると間違った表現が多々あるとは思いますがご容赦ください。

ご参考:各ボリュームとマウント位置の構成

# df -T
ファイルシス            タイプ   1K-ブロック     使用     使用可 使用% マウント位置
/dev/mapper/centos-root xfs         52403200 52339604      63596  100% /
devtmpfs                devtmpfs      945344        0     945344    0% /dev
tmpfs                   tmpfs         958740        0     958740    0% /dev/shm
tmpfs                   tmpfs         958740     9012     949728    1% /run
tmpfs                   tmpfs         958740        0     958740    0% /sys/fs/cgroup
/dev/sda1               xfs          1038336   171268     867068   17% /boot
/dev/mapper/centos-home xfs       1895169916    33108 1895136808    1% /home
tmpfs                   tmpfs         191752        0     191752    0% /run/user/1000
/dev/mapper/vg1000-lv   btrfs     3902185472 89191448 3810207096    3% /mnt/md0
tmpfs                   tmpfs         191752        0     191752    0% /run/user/0