はじめに
昨年の11月、NTT-Xストアでセールで売られていたNASがHDD付のLinuxとして運用できるのでないかと書かれた記事を見てほしいとおもいポチった。買った当初は普通にNASとして運用していたが、そろそろ普通の使い方に飽きたのでハックしようとggった結果rootでsshログイン方法を見つけた。
SSHとLuCIログイン
WEBの情報を漁っていく内にこのNASはOpenwrtと呼ばれるオープンソースのルータOSを搭載してることがわかった。普通のNASのWEB管理ページとは別にOS用のWEB管理ページがあることがわかった。これは市販のルータのWEB管理ページと似たものだがより高度な設定が可能となっている。ここのログインもSSHログインと同じパスワードをつかう。
拡張パッケージの管理
さて、このOpenwrtと呼ばれるOSはLinuxベースだが機能を拡張できるルータ用OSとして開発された。NASなのになぜこのOSが載っているか、LANポートがいくつか余っているのとネットワーク関連であることからルータ用のボードを流用してストレージをつけてNASとして開発されたのではないかと推察する。
本題だが、Openwrtはパッケージシステムで機能を追加・削除を行えるが動く機能はそのシステム用のものでなくてはならない。このNASは一般的なPCのCPUではなく携帯にも載っているARMと呼ばれるCPUで動いている、当然このARM用のプログラムしか動かせない。
パッケージのダウンロードURLの喪失とバックアップ
このNASはARMv7のデュアルコアでg2とよばれるアーキテクチャで動いているようである。
そしてパッケージをダウンロードできるURLがすでに設定されているが、すでに喪失しているようである。つまりこのg2用のパッケージが二度と手に入らないのである。
しかし、パッケージは一般的なdpkgと似たopkgと呼ばれるパッケージシステムで管理されていてパッケージであるipkファイルはdebファイルと同じファイル形式である。
パッケージの中身は展開されてインストールされているが、逆にこれを集めることにより元のパッケージをサルベージできるのではないかと考えた。幸い、debファイルのcontrolファイルやpostinst,prermスクリプトをシステム内より探しだすことができたのでほぼ完全な状態のパッケージを復元できた。
バックアップスクリプト
/usr/local/bin/mkPkg
#!/bin/sh
# start script use busybox.
# set env
#PKGINFO=/var/lib/dpkg/info
PKGINFO=/usr/lib/opkg/info
PKGNAME=$1.pkg
PKGVER=_$3
[ $PKGVER != _ ] && PKGNAME=$1$PKGVER.pkg
WORK=/tmp/$1.work
# mkdir work dir
mkdir -p $WORK/control.d
mkdir -p $WORK/data.d
# copy control and script
for file in $(ls $PKGINFO/$1.*) ; do
cp $file $WORK/control.d/${file##*.}
done
# copy files from list
while read line ; do
[ -d $line ] && continue
[ ! -d $WORK/data.d${line%/*} ] && mkdir -p $WORK/data.d${line%/*}
cp $line $WORK/data.d$line
done < $WORK/control.d/list
# pack data.tar.gz
tar -C $WORK/data.d -czf $WORK/data.tar.gz .
rm -rf $WORK/data.d
# pack control.tar.gz
rm $WORK/control.d/list
tar -C $WORK/control.d -czf $WORK/control.tar.gz .
rm -rf $WORK/control.d
# make package
echo '2.0' > $WORK/debian-binary
cd $WORK && ar -r $PKGNAME debian-binary control.tar.gz data.tar.gz && cd $OLDPD
# copy package to current
cp $WORK/$PKGNAME $PWD/
# delete work dir
rm -rf $WORK
# end script
exit 0
Howtouse
root@NAS:~# which sh
/usr/local/xbin/sh
root@NAS:~# sh --help
BusyBox v1.28.1 (2018-02-15 14:34:02 CET) multi-call binary.
Usage: sh [-/+OPTIONS] [-/+o OPT]... [-c 'SCRIPT' [ARG0 [ARGS]] / FILE [ARGS]]
Unix shell interpreter
root@NAS:~# opkg list-installed | xargs -n 3 mkPkg
(省略)
root@NAS:~# ls nasmiru*
nasmiruagentD_1.0-1.pkg
root@NAS:~#