WebOS Goodies

WebOS の未来を模索する、ゲームプログラマあがりの Web 開発者のブログ。

WebOS Goodies へようこそ! WebOS はインターネットの未来形。あらゆる Web サイトが繋がり、共有し、協力して創り上げる、ひとつの巨大な情報システムです。そこでは、あらゆる情報がネットワーク上に蓄積され、我々はいつでも、どこからでも、多彩なデバイスを使ってそれらにアクセスできます。 WebOS Goodies は、さまざまな情報提供やツール開発を通して、そんな世界の実現に少しでも貢献するべく活動していきます。
Subscribe       

NetWalker のシステム全体をバックアップ・リストアする

相変わらず NetWalker にハマっています。 NetWalker の大きな魅力のひとつが Ubuntu Linux を採用したことによる柔軟性の高さ。オープンソースソフトをインストールしたり、設定を変更したりして、自由に環境を構築できます。しかし、柔軟性の高さ故にシステムの重要な部分の変更も容易にできてしまい、動作がおかしくなるようなこともあります。そこまでいかなくても、なんらかの理由で変更前の状態に戻したいと思うことは多々あるでしょう。

そのようなときのため、システムをまるごとバックアップするスクリプトを作ってみました。 Ubuntu Linux のバックアップ・ツールとしては SBackup などが有名ですが、このスクリプトはシステムのスナップショットの保存に重点を置いており、 mtd3 のカーネルイメージも含めた完全なクローンを microSD に作成します。あまり使いやすいものではありませんが、バックアップした時点の状態を完全に復元できるのは大きなメリットだと思います。

ということで、本日は、そのバックアップ・スクリプトをご紹介します。皆さんの NetWalker ライフに、ぜひお役立てください!

バックアップ方法の概要

最初に、どういう仕組みでバックアップをとっているかを簡単に説明しておきます。

今回のバックアップ・スクリプトはシステム全体の確実なバックアップに重点をおいているので、動作中のシステムのライブバックアップはサポートしません。 microSD に最低限の Linux システムを構築し、そちらを起動した上で本体内のフラッシュメモリを microSD にコピーします。

具体的には、 microSD から Linux を起動した後、シェルスクリプトで以下の処理を実行します。

  • カーネル用のデバイス (/dev/ubi3) をバイトイメージとして保存。
  • ルートファイルシステム (/dev/ubi4) の内容を rsync によりファイル単位で保存

ルートファイルシステムのバックアップ方法をどうするかは悩みどころだったのですが、必要なファイルのみを手動で取り出せること、 microSD の容量消費が少ない(実際に使っている容量しか消費しない)ことなどから、 rsync を使ってファイル単位で保存することにしました。

ルートファイルシステムもバイトイメージで保存したいという方は、 /dev/ubi3 と同じ方法でいけるはずなので、そのようにスクリプトを変更してみてください。

注意点

バックアップ・リストア時にはシステムの重要なファイルを操作しますので、以下の点にご注意ください。

  • 万が一のため、バックアップとは別に再インストール用の microSD も必ず用意しておいてください
  • 本体のファイルシステム自体がダメージを受けていると(起動不能、頻繁に OS ごと落ちるなど)正常にリストアできません。そのようなときは、いったん再インストールを行って正常な状態に復帰してから、リストアしてください。
  • このスクリプトはシステムのスナップショットをとることを重視しており、データ保護の目的には不向きです。失うと取り返しがつかないようなデータは、別の方法で重ねてバックアップをとってください。
  • その他あらゆる点に関して、このスクリプトは無保証です。あくまで自己責任でご利用ください。

最後の項目がある意味すべてなわけですが、実際にスクリプトの処理内容を確認していただいて、納得の上でご利用ください。差し当たりうまく動いてはいるのですが、デバイスファイルを保存・復元すべきかなど、私自身でもまだ迷っている部分があります。改善点などありましたら、ぜひご指摘ください。

バックアップ用の microSD カードを準備する

それでは、まずは準備としてバックアップ用の microSD カードを作成します。少々手間がかかりますが、最初に一回やれば済むのでご勘弁を。

バックアップ用の microSD カードは容量 8GB 以上のものを使ってください。バックアップ・リストア時に使う Linux システムも同じカードに保存するので、 4GB では容量が不足する恐れがあります。余った分は普通にファイル保存用として利用することも可能です(あまりお勧めしませんが)。

microSD を再インストール用に初期化する

microSD を用意したら、そこに最低限の Linux システムを構築し、起動できるようにします。なんとなく大変そうですが、実は再インストール用のシステムが Linux そのものなので、それを利用すれば簡単に Linux の起動ディスク(というか起動 microSD カード)が作成できます。

再インストール用 microSD カードの作成方法はこちらのページにありますので、それを参考にして再インストール用 microSD カードを作成してください。

再インストールスクリプト起動の抑制など

再インストール用の microSD カードは起動と同時に再インストール処理を開始するので、そのままではシェルにログインして作業することができません。そこで、再インストール処理の起動スクリプトとデータを削除します。具体的には、 microSD カードを NetWalker に挿入後、以下のコマンドを実行してください。

sudo rm /media/disk/etc/rc2.d/S01upfirm
sudo rm /media/disk/os.tar.bz2

さらに、起動時に本体のルートファイルシステムを /mnt/root にマウントするため、以下の内容を /media/disk/etc/rc2.d/S01mountroot というファイル名で保存します。

#! /bin/sh
/usr/local/bin/ubiattach /dev/ubi_ctrl -m 4
/bin/mount -t ubifs ubi0 /mnt/root

そして上記スクリプトに実行属性を付加し、ルートファイルシステムのマウントポイントを作成します

sudo chmod 755 /media/disk/etc/rc2.d/S01mountroot
sudo mkdir /media/disk/mnt/root

以上でバックアップに必要な環境が構築できました。この microSD から起動して root でログインすると、 /mnt/root に本体のルートファイルシステムをマウントした状態で各種操作が行えます。

スクリプトファイルの作成

最後に、バックアップ・リストア処理を行うシェル・スクリプトを microSD に保存します。以下のスクリプトをダウンロードし、 /media/disk/usr/local/bin に保存してください。

各スクリプトの内容は以下のとおりです。

backup.sh

#! /bin/bash

if [ -z $1 ]; then
    echo "usage: backup.sh dir"
    exit 1
fi

if ! [ -d $1 ]; then
    echo "$BACKUP_DIR is not exist or not a directory."
    exit 2
fi

SRC_DIR=/mnt/root
BACKUP_DIR=`dirname $1/a`
KERNEL_DEV=/dev/mtd3
KERNEL_IMG=$BACKUP_DIR/kernel.bin
RSYNC_CMD=rsync
RSYNC_OPTS="-aAX --delete --force --numeric-ids --progress"

nanddump -o -b $KERNEL_DEV -f $KERNEL_IMG
$RSYNC_CMD $RSYNC_OPTS $SRC_DIR $BACKUP_DIR

restore.sh

#! /bin/bash

if [ -z $1 ]; then
    echo "usage: backup.sh dir"
    exit 1
fi

if ! [ -d $1 ]; then
    echo "$BACKUP_DIR is not exist or not a directory."
    exit 2
fi

SRC_DIR=/mnt/root
BACKUP_DIR=`dirname $1/a`
KERNEL_DEV=/dev/mtd3
KERNEL_IMG=$BACKUP_DIR/kernel.bin
RSYNC_CMD=rsync
RSYNC_OPTS="-aAX --delete --force --numeric-ids --progress"

$RSYNC_CMD $RSYNC_OPTS $BACKUP_DIR/root/ $SRC_DIR

flash_eraseall $KERNEL_DEV
nandwrite -p $KERNEL_DEV $KERNEL_IMG
nandverify -o -b $KERNEL_DEV -f $KERNEL_IMG

その後、以下のコマンドを実行し、上記スクリプトへの実行属性の付加、バックアップ用のディレクトリ作成、スクリプトの実行に必要な rsync コマンドのコピーを行います。

sudo chmod 755 /media/disk/usr/local/bin/backup.sh
sudo chmod 755 /media/disk/usr/local/bin/restore.sh
sudo mkdir /media/disk/backup
sudo cp /usr/bin/rsync /media/disk/usr/local/bin

ここではバックアップ用のディレクトリを /backup にしていますが、別の場所でもかまいません(ただし、パスに空白や記号は含めないでください)。 microSD の容量が許せば、複数のバックアップを保存することも可能です。

バックアップする

バックアップ用の microSD カードができたら、さっそくバックアップしてみましょう。 microSD から起動するのが少々面倒ですが、作業自体はとても簡単です。

まずは NetWalker をいったんシャットダウンしてください。ご存知かと思いますが、右上のユーザー名が表示されている部分を左クリックして、メニューから「シャットダウン」を選択すれば OK です。

シャットダウンが完了したら、マウス左右ボタンを押しながら電源スイッチを長押しして、 microSD の Linux を起動します。起動にはかなり時間がかかるので、気長に待ってください。画面に以下のように表示されたら、起動完了です。

Ubuntu Jaunty (development branch) qemu-arm tty1
qemu-arm login:

あとは root ユーザーでログインし(パスワードは聞かれないはず)、以下のコマンドを実行すればバックアップが行えます。

backup.sh /backup

初回は全ファイルをコピーするため時間がかかりますが、 2 回目以降はだいぶ短くなるはずです。終了したら、 reboot コマンドで通常のシステムを再起動してください。

リストアする

リストアもバックアップと同様に microSD で起動し、以下のコマンドを実行してください。

restore.sh /backup

ただし、上述のとおりルートファイルシステムに大きなダメージがあるとリストアできないことがあります。そのような場合は事前に再インストールしてからリストアを実行してください。

以上、本日は NetWalker のシステム全体をバックアップする方法をご紹介しました。作成したバックアップ用 microSD は障害時の起動ディスクとしても使えるので、バックアップが必要なくても作っておくと安心だと思います。ぜひ活用してください!

関連記事

この記事にコメントする

Recommendations
Books
「Closure Library」の入門書です。
詳しくはこちらの記事をどうぞ!
Categories
Recent Articles