funcスクリプトが使えるようになったので、LS420Dでの本来の目的を実現できる様にする。
当家のLS420DはDTCP-IPデータの保存用HDDを作成する事を目的にしています。
(LS410Dは1HDDでHDD交換が面倒、LS420Dは2HDDでHDD交換が簡単)
LS-WXL,LS-WVL等の従来機種とDTCP-IPキーデータの使われ方が違うので、LS420DでのDTCP-IPキーデータのバックアップとリストアの方法も変わってくる。
従来機種ではDTCP-IPキーデータ部分の4KBで済んだが、LS420DではDTCP-IPキーデータ部分とDTCP-IP機能のチェック用ワークエリア部分だけをバックアップする。
…何か問題が発生しそうな予感がします。
たとえば、FWのVerアップ等で(mtdblock内のワークエリアが広いので)チェック用ワークエリアのアドレスが変更がされるとかです。
と言うわけでLS420DのDTCP-IP関連のバックアップはmtdblock0を丸々行う事にします。
はじめはLS420Dの再起動・電源OFF時にバックアップを行おうと考えましたが、DTCP-IP機能チェック用ワークエリアに変更がかかるのがDTCP-IPデータの増減時のため再起動・電源OFF時に毎回バックアップを行う必要はない。
(HDDフォーマット・RAID0再構築ではDTCP-IPデータが無い、システム初期化・RAID1の再構築ではDTCP-IPデータの増減が無い)
DTCP-IPデータの増減時にバックアップを行えば良いのでfuncスクリプトでバックアップを行う様にする。
DTCP-IPデータが入っているHDDに交換した時にリストアを行う。
バックアップの手順
1.LS420Dにtelnet接続またはssh接続でrootでログインする。
2.共有ディレクトリに移動する。
3.dd if=/dev/mtdblock0 of=ファイル名 を行う。
4.どのLS420Dかわかるようにメモをとる。
リストアの手順
1.LS420DのHDDをDTCP-IPデータが入っているHDDと交換し電源を入れる。
2.LS420Dにtelnet接続またはssh接続でrootでログインする。
3.共有ディレクトリに移動する。
4.HDDにLS420DのDTCP-IPデータが入っているか確認する。
5.dd if=バックアップした時のファイル名 of=/dev/mtdblock0 を行う。
6.LS420Dを再起動する。
上記手順は手動でやるときの手順です、この手順をスクリプトにしてfuncスクリプトで動かすと楽ちん。
mtdblock-backup.sh:mtdblockのバックアップ・リストアを行う。
#!/bin/sh
#
# filename : mtdblock-backup.sh
#
# funcスクリプトでfuncボタンが押された時にroot権限で起動されるスクリプトです。
# LS420DはDTCP-IPデータの増減・FWアップデート・HDD交換時にDTCP-IPキーデータ
# 参照アドレスが変わるので、HDD交換等を行うと参照アドレスが変わってDTCP-IP機能
# がとまってしまう。対策として使用中のHDDにDTCP-IPキーデータ参照アドレスの
# 最終状態のmtdblock0をバックアップまたはリストアします。
#
# 注意事項
# ・本スクリプトはLinkStationの 共有ディレクトリ/hack 配下に置く事。
# ・共有ディレクトリ/hack/mtd_backrest ディレクトリを作成し、その配下に
# ホスト名_mtdblock0.dump、mtdbackup.log を作成します。
# ・バックアップとリストアを間違えるとHDD内のDTCP-IPデータは永久に再生不可能となります。
# ・LS420Dでしか動作確認していません。
#
# Copyright (C) 2009-2013 Nekoshin. All Rights Reserved.
#
#===============================================================================
#-------------------------------------------------------------------------------
# 変数宣言
# バックアップフラグ
# yes : バックアップを行う no : バックアップを行わない
BACKUP=no
# リストアフラグ
# yes : リストアを行う no : リストアを行わない
RESTORE=no
# シリアル番号
# Web設定画面でステータス情報をクリックしシステム情報を開きシリアル番号を設定する。
# または
# 初めて実行するとmtdbackup.logにunmatchedとして出力されるシリアル番号を設定する。
# 設定後はコメントを消し実行できるようにする。
#WSERIALNO=xxxxxxxxxxxxxx
# 対象PRODUCTID
OPRODUCTID=0x0000300B
# 上位スクリプトで共有ディレクトリshareに来ているのでワークディレクトリはpwdで取得。
# hackディレクトリは既に在る。
WORK=$(pwd)
WORKSHARE=${WORK}/hack/mtd_backrest
# ホスト名を取得。
HOSTSNAME=`hostname`
# mtdblockの設定。
DEVMTDBLOCK=/dev/mtdblock0
# バックアップファイル名設定。
MTDBLOCKF=${WORKSHARE}/${HOSTSNAME}_mtdblock0.dump
# ログファイル
LOGFILE=${WORKSHARE}/mtdbackup.log
# 実行ファイル
EXEFILE=${WORK}/hack/mtdblock-backup.sh
#-------------------------------------------------------------------------------
# メイン
# バックアップ・リストアのディレクトリチェック
if [ ! -d ${WORKSHARE} ]
then
# ディレクトリが存在しない。
mkdir -m 777 ${WORKSHARE}
echo $(date) creat ${LOGFILE} > ${LOGFILE}
chmod 666 ${LOGFILE}
fi
# PRODUCTID から機種を特定する。
# /proc/buffalo/firmware から PRODUCTID を取得する。
PRODUCTID=`sed -n -e 's/^PRODUCTID=\(.*\)$/\1/p' /proc/buffalo/firmware`
if [ ! ${PRODUCTID} = ${OPRODUCTID} ]
then
# 対象外のLinkStationのため処理終了。
echo $(date) PRODUCTID = "${PRODUCTID}" not supported. ERR 1 >> ${LOGFILE}
exit 1
fi
# HDD誤挿入チェック
# シリアル番号取得。
MSERIALNO=`nvram -c get SerialNo 2>/dev/null | sed -e 's/SerialNo=//'`
if [ ! ${MSERIALNO} = "${WSERIALNO}" ]
then
# HDD誤挿入、バックアップ・リストアするLinkStationではないため処理終了。
echo $(date) SerialNo = ${MSERIALNO} unmatched. ERR 2 >> ${LOGFILE}
exit 2
fi
#-------------------------------------------------------------------------------
# バックアップを行うか判定する。
if [ ${BACKUP} = yes -a ${RESTORE} = no ]
then
#-----------------------------------------------------------------------
# バックアップ
# バックアップを行う。
echo $(date) backup start >> ${LOGFILE}
dd if=${DEVMTDBLOCK} of=${MTDBLOCKF}
echo $(date) backup end >> ${LOGFILE}
#-------------------------------------------------------------------------------
# リストアを行うか判定する。
elif [ ${BACKUP} = no -a ${RESTORE} = yes ]
then
#-----------------------------------------------------------------------
# リストア
# バックアップファイルの存在確認。
if [ ! -f ${MTDBLOCKF} ]
then
# バックアップファイル無し。
echo $(date) ${MTDBLOCKF} no file. ERR 10 >> ${LOGFILE}
exit 10
fi
# リストアを行う。
echo $(date) restore start >> ${LOGFILE}
dd if=${MTDBLOCKF} of=${DEVMTDBLOCK}
echo $(date) restore end >> ${LOGFILE}
# リストアフラグをnoにする。
cp ${EXEFILE} ${EXEFILE}.work
sed -e 's/^RESTORE=yes/RESTORE=no/' ${EXEFILE}.work > ${EXEFILE}
rm -fr ${EXEFILE}.work
# リストア後はmtdblockを反映させる為リブートする。
reboot
#-------------------------------------------------------------------------------
# バックアップ・リストアを行う条件ではない。
else
#-----------------------------------------------------------------------
# その他
# 何もしない。
echo $(date) BACKUP=${BACKUP} RESTORE=${RESTORE} no action >> ${LOGFILE}
fi
exit 0
私が個人的に調べたものであり、正確ではありません、私は保障しませんし責任も負いません、また動作保障もしません、ここにはメモとして残しているだけです。
このメモを見て何かやり装置が壊れたり不具合が発生しても、私は一切関知しません、あくまでも自己責任でやってください。