目的
- 既存の各PCのファイルシステムの一定部分のミラーリングを行いたい。
- Pogoplugの提供するファイルシステム(PogoDriveなど)だと、
ファイルの最終更新時刻が正しく保持されないため、
ファイルの最終更新時刻をみてコピーが必要かどうかを判断するミラーリングツール
(realsyncやrobocopyなど)では不要なコピーが多数回発生してしまう。
- このため、PogoplugにSambaサーバを導入し、
これを介してミラーリングツールを実行する。
- Sambaサーバを導入する手段としてOpenPogoを導入する。
- おまけにWebDAVサーバも導入して、
パフォーマンスの出ない(と2ちゃんねるで話題の)
デフォルトPogoplugの機能を置き換えたい。
参考ページ
この作業は次のページを参考におこなった。
前提条件
- Pogoplugがセットアップできていること。
- USBフラッシュメモリ(今回は16GB,4GBでも余裕っぽい)が一本あること。
Pogoplugの内部メモリには余裕がないのでここにOpenPogoを置く。
- USB HDD(今回は余りものの20GBを利用)がひとつあること。
フラッシュメモリの書き換え回数を減らすために使う。
システム構成
- Pogoplugにいま直接繋がっている2TB HDD × 2は
セルフパワーのUSBハブを介して繋げるように変更。
- USBフラッシュメモリとUSB HDDはPogoplugのUSBポートに直接接続する。
- USBフラッシュメモリには頻繁には書き換えの発生しない
OpenPogoのシステムファイルを、
USB HDDには頻繁に書き換える必要のあるファイルを置く。
手順
この項の内容は未検証(近日検証予定)現在検証中です。確実にまだ誤りが含まれています。
PogoplugにSSHアクセスできるようにする
- Pogoplugのセキュリティ設定から「このPogplug機器へのSSH接続を有効にする」をチェック。
- 続いて「パスワードを変更」(これがSSHでログインする際のrootのパスワードになる)
以後の作業は特記なき限りSSHでPogoplugのrootユーザにログインして行なう。
(2011-06-01)
(非必須)作業を便利にするためのTips
- ルートパーティションを書き込み可能にする。
mount -o remount,rw /
- いつも使っている環境から次のファイルを~root下に転送
(これはお好みで自由に。多少は修正する必要があるだろう)
- ~/.ssh/authorized_keys
- ~/.inputrc
- ~/.bashrc
- ~/.profile
- ~/.bash_profile
- ~/.bash_logout
- ~/lib/
- ~/.environ
- /etc/profile
- /etc/profile.d/
- .bashrcを有効にするにはPogoplug上で
echo . .bashrc>~root/.profile
chmod 700 .profile
を実行し、一旦ログアウトしてから再びログインすること。
- プロクシなどを介さないとHTTP接続できない場合は
(主としてwgetなどの為に)次の設定をしておく。
http_proxy=http://プロクシホスト名:プロクシポート番号/
(自分用メモ:/etc/profile.d/environ.shに置く)
- Pogoplug Bizにはbashが入っていなかった。私は簡単にPogoplugからコピーした。あとでipkgでインストールすることもできる。
- /etc/passwdでbashをログインシェルにするとログインできなくなる場合がある(ここらの設定を変更したらログアウトしないで二重ログオンしてログオンできることを必ず確認すること)。そういう時には.profileの冒頭に次の1行を書く。
test -z "$BASH" && exec bash
USBメモリとHDDだけを接続
OpenPogoのインストール先となるUSBフラッシュメモリとUSB HDD以外の、
通常のHDDなどは外しておく。どんな影響があるか分からないからだ。
具体的には、
- Pogoplugのwebインタフェイスから、すべてのドライブについて
「このドライブを安全に取り外す」(ドライブ名の右のイジェクトマーク)を実行。
- USBメモリとUSB HDDだけを接続。
- Pogoplugをリブート:
sync
sync
sync
/sbin/reboot
※PogoPlug Bizでは一旦電源プラグを抜かないと正常に起動しなかった。
(2011-06-06)
mke2fsを取ってくる
- ルートパーティションを書き込み可能に
mount -o remount,rw /
※PogoPlug Bizでは不要だった(既にrwマウントされていた)。
- mke2fsを取ってくる
cd /usr/bin
wget http://plugapps.com/os/pogoplug/mke2fs
chmod 755 mke2fs
cd
※PogoPlug Bizでは不要だった(busyboxに組み込まれていた)。と思ったが、busybox組み込みのmke2fsでは -T ext3 オプションを指定してもext2ファイルシステムが作られた。ext3を使いたくてやっぱりこのコマンドを取ってきた。
USBフラッシュメモリとUSB HDDのデバイス名を確認
- ディスクのデバイス名を確認
df -h
で
Filesystem Size Used Available Use% Mounted on
/dev/mtdblock2 32.0M 14.7M 17.3M 46% /
none 125.0M 12.0k 125.0M 0% /tmp
/tmp/.cemnt/sdb1 18.6G 381.9M 18.2G 2% /tmp/.cemnt/mnt_sdb1
/tmp/.cemnt/sda1 14.9G 256.0k 14.9G 0% /tmp/.cemnt/mnt_sda1
などと表示されるので、
容量などからUSBフラッシュメモリとUSB HDDのデバイス名を確認
(今回は16GBのUSBフラッシュメモリと20GBのUSB HDDを使っているので
フラッシュメモリがsdaでHDDがsdbであると同定)。
- なお、/tmp/.cemnt/~ がリストにない場合は、
PogoplugがそれらUSB機器を認識していないとおもわれるのでPogoplugをリブート。
sync
sync
sync
/sbin/reboot
以下、特記なき限り、
sdaやsdbという文字列は上で同定したデバイス名に置き換えること。
余談だが、このデバイス名の割り当てを「自然」にまかせずにコントロールするには、
何も挿さずにPogoplugをリブートし、その後にUSBデバイスを挿せばよい。
最初に挿したものがsda、次がsdb、などとなる。
USBメモリにパーティションを切る
- my.pogoplug.com(Pogoplugのwebインタフェイス)の機能を一時的に止める
killall hbwd
- fdiskコマンドを起動する。
/sbin/fdisk /dev/sda
以下この節ではfdiskコマンドへの入力をBoldのように斜体で示す。
それ以外はfdiskの出力である。
- とりあえず今あるパーティションを表示してみる。
Command (m for help): p
Disk /dev/sda: 16.0 GB, 16013852672 bytes
78 heads, 14 sectors/track, 28641 cylinders
Units = cylinders of 1092 * 512 = 559104 bytes
Device Boot Start End Blocks Id System
/dev/sda1 8 28642 15634496 c Win95 FAT32 (LBA)
- 普通は上記のとおりFAT32パーティションがあると思うのでそれを削除
Command (m for help): d
Selected partition 1
- 削除されたかを確認
Command (m for help): p
Disk /dev/sda: 16.0 GB, 16013852672 bytes
78 heads, 14 sectors/track, 28641 cylinders
Units = cylinders of 1092 * 512 = 559104 bytes
Device Boot Start End Blocks Id System
- パーティションを作成
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-28641, default 1): (何も入力せず[Enter])
Last cylinder or +size or +sizeM or +sizeK (1-28641, default 28641): (何も入力せず[Enter])
スタートとエンドシリンダ番号はデフォルトでok。
- これまでの結果を実際にディスクに書き込む(wコマンドでfdiskは終了する)。
Command (m for help): w
- パーティションテーブルを確認
/sbin/fdisk -l /dev/sda
Disk /dev/sda: 16.0 GB, 16013852672 bytes
78 heads, 14 sectors/track, 28641 cylinders
Units = cylinders of 1092 * 512 = 559104 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 28641 15637979 83 Linux
USBメモリにファイルシステムを作る
- ファイルシステムはext2で。ext3でもフォーマットできるが、
それではPogoplugは自動的にマウントしてくれない。
(2012-05-20追記: と思ったが、後でやってみるとext3でもマウントできた。ext4はだめ)
mke2fs -T ext2 /dev/sda1
※そこでPogoPlug Bizでは
mke2fs -T ext3 /dev/sda1
とした。
- Pogoplugを再起動
sync
sync
sync
/sbin/reboot
※PogoPlug Bizでは、一旦電源プラグを抜かないとHDDが認識されなかった。
(2011-06-08)
OpenPogoのインストール
OpenPogoをダウンロード
http://openpogo.com/base/openpogo-usb.tar.gz
はホストが無くなっているようなので、
- webブラウザの使えるマシンで
http://www.pogoplugged.com/download/list?cat=36
の中の
Create an openpogo base system on a USB drive
からtarball(opt.tar.gz)をダウンロードし、そのマシンから
scp -p opt.tar.gz pogoplug:/tmp/
を実行してPogoplugへコピーしておく(ホスト名pogoplugは環境にあわせて変えること)。
OpenPogo Base System on a USB Driveを展開
- USBフラッシュメモリのルートにtarballを展開
cd /tmp/.cemnt/mnt_sda1
tar -xzf /tmp/opt.tar.gz
tarballの内容はすべて /tmp/.cemnt/mnt_sda1/.opt/ の下に展開される。
起動スクリプトを作成
- ルートパーティションを書き込み可能に
mount -o remount,rw /
※PogoPlug Bizでは不要だった(既にrwマウントされていた)。
- ここで編集するファイルのオリジナルをバックアップ
cd /etc/init.d
mv rcS rcS.org
cp rcS.org rcS
ファイルの編集にはviが使える。
- /etc/init.d/rcSの末尾に次の各行を追加
# initializing OpenPogo /opt on USB
/etc/init.d/mount_opt
/opt/etc/init
- /etc/profile(ない場合は作る)に次の各行を追加
#!/bin/bash
# profile for OpenPogo /opt on USB
export PATH=/opt/bin:/opt/sbin:/usr/bin:/usr/sbin:/bin:/sbin
- /etc/init.d/rcSで起動する予定の初期化スクリプトmount_optをコピー
cp -p /tmp/.cemnt/mnt_sda1/.opt/mount_opt /etc/init.d/
chmod 755 /etc/init.d/mount_opt
- このオリジナルのmount_optスクリプトは
/dev/sda~/dev/sddまでの4つのデバイスについて順にマウントを試みて、
先ほど展開した.optディレクトリを探すものだが、
タイミングの関係でうまくマウントしてくれないことがあるらしい。
さらにmount_optスクリプトのアルゴリズムはちょっとエレガントでないこともあるので、
mount_optの内容を次のスクリプトに置き換える。
#!/bin/sh
DEVIDS="sda1 sdb1 sdc1 sdd1"
FSTYPE=ext2
RETRIES=5
[ ! -d /tmp/mnt_opt ] && mkdir /tmp/mnt_opt || umount /tmp/mnt_opt
for i in `seq 1 $RETRIES`; do
for dev in $DEVIDS; do
echo "Mounting $dev..."
mount -t $FSTYPE -o rw,nosuid,nodev,exec,noatime,sync /dev/$dev /tmp/mnt_opt
if [ -d /tmp/mnt_opt/.opt ]; then
break 2
fi
umount /tmp/mnt_opt
done
sleep 3
done
ちなみに、/dev/sda1と/dev/.cemnt/sda1(sdb,sdc,...についても同じ)は
同じデバイスを指している。
- さきに、USBフラッシュのファイルシステムをext3で作成した場合は、
このスクリプト中の変数FSTYPEの値を「ext2」から「ext3」に置き換えておく。
- /etc/init.d/mount_optでマウントする先のディレクトリをシンボリックリンク。
ln -s /tmp/mnt_opt/.opt /opt
- Pogoplugをリブート。
sync
sync
sync
/sbin/reboot
(2011-06-11)
(2011-10-12修正)
(2012-04-01修正)
(2012-05-07修正)
解説:mount_optスクリプトの内容
- /dev/sd[abcd]1を順に($FSTYPEで)マウントしてみて...
- そのファイルシステムのルートにディレクトリ.optがあれば...
- マウントしたまま直ちにスクリプト終了
- 以後のトライはしない
- .optがなければ...
これを5回繰り返す。
/optはシンボリックリンクで、マウントポイント/.optを指している。
(2012-05-18)
wgetコマンドをちゃんとしたやつに置き換え
- /tmpへ移動しtarballをダウンロード。
cd /tmp
wget http://ipkg.nslu2-linux.org/feeds/optware/cs08q1armel/cross/stable/wget_1.12-2_arm.ipk
- tarballを展開。
tar -xzvf wget_1.12-2_arm.ipk
tar -xvzf data.tar.gz
- 展開した中のwgetのバイナリを既存のと置き換え。
cd /usr/bin
mv wget wget.old
cp /tmp/opt/bin/wget /usr/bin/
- パーミッションをちゃんとする。
chmod 755 wget
chown root:root wget
(2011-10-13)
ipkgのリポジトリの記述
OpenPogoで使うツールのインストールにはipkgコマンドを使う。
ipkgでインストールするパッケージのリポジトリを次の通り記述しておく。
- /opt/etc/ipkg/armel-feed.confの内容を次のようにする。
src cross http://ipkg.nslu2-linux.org/feeds/optware/cs08q1armel/cross/stable
各種パッケージのインストール
- Pogoplugを再起動(大丈夫かな)。
sync
sync
sync
/sbin/reboot
- パッケージリストのアップデート。
ipkg update
- less
ipkg install less
- bash
Pogoplug標準のbashではジョブコントロールが有効になっていないので
これに置き換えたかったのだが...
ipkg install bash
いまんとこ、ログインシェルをこのbashに置き換えると
rootにログオンできなくなるので注意。解決方法模索中。
- busybox
ipkg install busybox
※PogoPlug Bizではこれは必要ない(既に入っているしそっちの方が新しい)。
- vim
ipkg install vim
ln -sf /opt/bin/vim /opt/bin/vi
お好みでalias vi=vim
- man
ipkg install man
ipkg install man-pages
- Sambaサーバ
ipkg install samba36
ipkg install samba36-swat
- lynx
ipkg install lynx
- w3m
ipkg install w3m
ここまでやった(2012-05-19現在)。
- WebDAVサーバ
ipkg install apache
とか、
ipkg install nginx
とか、
ipkg install lighttpd
とか(WebDAVモジュール入ってるかなぁ)。
(2012-04-01)
(2012-05-18)
(Sambaを動かすための)準備
- xinetd.conf内のlocalhostが解決できなくてxinetdがエラーを吐いてたので、
/etc/hostsを作って
127.0.0.1 localhost
::1 localhost
を記入。
- /opt/etc/xinetd.d/swatにprotocal or socket typeがないとxinetdが文句をいうので
/opt/etc/xinetd.d/swatに
protocol = tcp
の一行を加える。
- /etc/protocolsがないとxinetdが不平を言うので手近のunix(私の場合はVine Linux)に入ってるのを持ってくる。
- /etc/servicesがなくてxinetdからswatが起動しないので手近のunixに入ってるのを持ってくる。
これでxinetdからswatが起動するはず。
うまくいかないときは、rootのコマンドラインから
/opt/sbin/xinetd -d
を実行するとエラーメッセージなどを見ることができる。
(2012-05-20)
Pogoplug Bizでは、
- うまくxinetdが起動しない対策のためにsyslog-ngをインストール。
ipkg install syslog-ng
ipkg install libnsl
- /opt/var のファイルを全部/varに移す。
mv /opt/var/* /var/
rmdir /opt/var
ln -s /var /opt/var
- なぜか/opt/etc/initの改行が\r\nになっていたので\rを削除。
(2012-07-14)
Sambaの設定1
smb.conf:
[global]
dos charset = CP932
workgroup = hoge
netbios name = foobar
interfaces = eth0
idmap config * : range =
idmap config * : backend = tdb
hosts allow = 192.168.0.0/255.255.248.0
このほかadduserでunixユーザを追加し、その後にsmbpasswdでパスワードを設定
(同じことはswatからでもできそう)。
(2012-07-16)
残りの設定は後述のmount_opt.newの導入を必要とするので、後でおこなう。
(2012-07-30)
USB-HDDの諸設定
USB-HDDのフォーマット
- Pogoplugのプロセスを止める
killall hbwd
- HDDがどこにマウントされているか確認
fdisk -l
リブートごとに変わるので注意。以下、/dev/sdbだったと仮定する。
- 必要ならfdiskでパーティションを作成したりパーティションタイプを変えたり。
- ファイルシステムをext3とする。
mke2fs -t ext3 /dev/sdb1
/varと/homeをUSB-HDDに置く
- /etc/init.d/mount_opt.newスクリプトを以下の内容で作成。
#!/bin/sh
RETRIES=5
DEVIDS="sda1 sdb1 sdc1 sdd1"
FSTYPES="ext3 ext2"
DIRS="opt var home"
MOUNTOPT="-o rw,nosuid,nodev,exec,noatime,sync"
[ ! -d /tmp/mnt ] && mkdir /tmp/mnt
[ ! -d /tmp/lnk ] && mkdir /tmp/lnk
for dev in $DEVIDS; do
[ ! -d /tmp/mnt/$dev ] && mkdir /tmp/mnt/$dev || umount /tmp/mnt/$dev
eval success_$dev=false
done
for i in `seq 1 $RETRIES`; do
for dev in $DEVIDS; do
for fstype in $FSTYPES; do
eval \${success_$dev} && continue
echo "Mounting $dev as $fstype ..."
mount -t $fstype $MOUNTOPT /dev/$dev /tmp/mnt/$dev && {
eval success_$dev=true
linked=false
for dir in $DIRS; do
if [ -d /tmp/mnt/$dev/.$dir ]; then
ln -sf /tmp/mnt/$dev/.$dir /tmp/lnk/$dir && linked=true
fi
done
$linked && break
$linked || umount /tmp/mnt/$dev
}
done
done
sleep 3
done
- USB HDDのルートに.varと.homeを作成
- テストラン
./mount_opt.new
- USBメモリとUSB HDDが/tmp/mnt/sdXNにマウントされていることを確認
- /tmp/lnkの下にシンボリックリンクoptやvarやhomeができており、
それぞれが、マウントされたUSBメモリやUSB HDD上の.optや.varや.homeを
指していることを確認
- /のリンクを作成or置換
ln -sf /tmp/lnk/home /
ln -sf /tmp/lnk/var /
ln -sf /tmp/lnk/opt /
- 旧mount_optと置換え
cd /etc/init.d
mv mount_opt mount_opt.old
ln -s mount_opt.new mount_opt
- リブート
sync
sync
sync
/sbin/reboot
USB-HDDにswapを
※mkswap, swaponは/opt/bin/busyboxにある。
- スワップファイルを作る
dd if=/dev/zero of=/var/swap bs=1M count=1024
mkswap /var/swap
- スワッピングを始める
swapon /var/swap
- リブートしてもスワップが行われるように、/etc/init.d/rcSの、
mount_optを呼び出している行より下(そうでないと/varがHDD上にならない)に、
次の2行を付け加える。
test -f /var/swap || dd if=/dev/zero of=/var/swap bs=1M count=1024
swapon /var/swap
(2012-05-20)
(2012-07-30)
Sambaの設定2
定まったドライブを指す固定パスの取得
Sambaで共有ディレクトリ(shares)を作成するためには、
共有をどこにおくか、をunixパスで指定する必要があるが、
PogoPlugがディテクションするデバイス名と
それをそのまま使ったマウントポイント名(を含むunixパス)は、
タイミング等によって変化することがあるので共有のパス指定に用いるには向かない。
そこで、前述のmoount_opt.newで、/optや/varや/homeを決まったHDDから
マウントするために導入したテクニックを若干拡張して、
決まったディスクドライブを一定のパスに対応させるために用いることにする。
- /etc/init.d/mount_opt.newスクリプトを以下の内容で作成。
#!/bin/sh
RETRIES=5
DEVIDS="sda1 sdb1 sdc1 sdd1"
FSTYPES="ext3 ext2"
DIRS="opt var home"
LABELS="hd1 hd2"
MOUNTOPT="-o rw,nosuid,nodev,exec,noatime,sync"
[ ! -d /tmp/mnt ] && mkdir /tmp/mnt
[ ! -d /tmp/lnk ] && mkdir /tmp/lnk
for dev in $DEVIDS; do
[ ! -d /tmp/mnt/$dev ] && mkdir /tmp/mnt/$dev || umount /tmp/mnt/$dev
eval success_$dev=false
done
for i in `seq 1 $RETRIES`; do
for dev in $DEVIDS; do
for fstype in $FSTYPES; do
eval \${success_$dev} && continue
echo "Mounting $dev as $fstype ..."
mount -t $fstype $MOUNTOPT /dev/$dev /tmp/mnt/$dev && {
eval success_$dev=true
linked=false
for dir in $DIRS; do
if [ -d /tmp/mnt/$dev/.$dir ]; then
ln -sf /tmp/mnt/$dev/.$dir /tmp/lnk/$dir && linked=true
fi
done
for label in $LABELS; do
if [ -d /tmp/mnt/$dev/.$label ]; then
ln -sf /tmp/mnt/$dev /tmp/lnk/$label && linked=true
fi
done
$linked && break
$linked || umount /tmp/mnt/$dev
}
done
done
sleep 3
done
- データ用HDD(仮にhd1,hd2と名付ける)のルートに
例えば.hd1とか.hd2というディレクトリを作成
- テストラン
./mount_opt.new
- データ用HDDが/tmp/mnt/sdXNにマウントされていることを確認
- /tmp/lnkの下にシンボリックリンクhd1とかhd2ができており、
それがデータ用HDDにある.hd1とか.hd2とかの
親ディレクトリを指していることを確認
- Sambaの、共有ごとに指定するパラメタpathの指定を例えば次のようにする。
- 共有hd1に対するpath: /tmp/lnk/hd1
- 共有hd2に対するpath: /tmp/lnk/hd2
共有のパーミッション
いろいろ方法はあると思うが、ここではグループベースの方法をとる。
共有はこれまでの例に倣ってhd1とhd2を作成するものとする。
- グループsmbshareを作成(/etc/groupをエディット)
- 共有のトップディレクトリのグループをsmbshareにする(パス末尾の / は必須)。
chgrp smbshare /tmp/lnk/hd1/
chgrp smbshare /tmp/lnk/hd2/
- 共有のトップディレクトリのパーミッションにg+rwsを追加する。
chmod g+rws /tmp/lnk/hd1/
chmod g+rws /tmp/lnk/hd2/
- Sambaの[global]セクション(あるいは共有ごとのセクションでも良い)のパラメタを
次のとおり設定。
create mask = 0774 (デフォルトは0744)
directory mask = 0775 (デフォルトは0755)
あるいは上記の代わりに
inherit permissions = yes
でもよいと思う。
- すでにデータHDD上に共有対象の(=PogoPlugが作成したものでない)
ファイルやディレクトリがある場合は、それらについても
chgrp smbshare hoge hoga
chmod g+rws hoge hoga
を実施する(chgrp, chmod の-Rオプションを利用するのが楽)。
- 共有への書き込み権限を与えたいユーザをsmbshareグループに追加する
(/etc/groupをエディット)。
(2012-07-30)
Tag: Pogoplug OpenPogo Linux Samba WebDAV