Top > ZakkiCho > PogoPlug2OpenPogo
Table of Contents

目的

  • 既存の各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アクセスできるようにする

  1. Pogoplugのセキュリティ設定から「このPogplug機器へのSSH接続を有効にする」をチェック。
  2. 続いて「パスワードを変更」(これがSSHでログインする際のrootのパスワードになる)

以後の作業は特記なき限りSSHでPogoplugのrootユーザにログインして行なう。

(2011-06-01)

(非必須)作業を便利にするためのTips

  1. ルートパーティションを書き込み可能にする。
     mount -o remount,rw /
  2. いつも使っている環境から次のファイルを~root下に転送 (これはお好みで自由に。多少は修正する必要があるだろう)
    • ~/.ssh/authorized_keys
    • ~/.inputrc
    • ~/.bashrc
    • ~/.profile
    • ~/.bash_profile
    • ~/.bash_logout
    • ~/lib/
    • ~/.environ
    • /etc/profile
    • /etc/profile.d/
  3. .bashrcを有効にするにはPogoplug上で
     echo . .bashrc>~root/.profile
     chmod 700 .profile
    を実行し、一旦ログアウトしてから再びログインすること。
  4. プロクシなどを介さないとHTTP接続できない場合は (主としてwgetなどの為に)次の設定をしておく。
     http_proxy=http://プロクシホスト名:プロクシポート番号/
    (自分用メモ:/etc/profile.d/environ.shに置く)
  5. Pogoplug Bizにはbashが入っていなかった。私は簡単にPogoplugからコピーした。あとでipkgでインストールすることもできる。
  6. /etc/passwdでbashをログインシェルにするとログインできなくなる場合がある(ここらの設定を変更したらログアウトしないで二重ログオンしてログオンできることを必ず確認すること)。そういう時には.profileの冒頭に次の1行を書く。
     test -z "$BASH" && exec bash

USBメモリとHDDだけを接続

OpenPogoのインストール先となるUSBフラッシュメモリとUSB HDD以外の、 通常のHDDなどは外しておく。どんな影響があるか分からないからだ。

具体的には、

  1. Pogoplugのwebインタフェイスから、すべてのドライブについて 「このドライブを安全に取り外す」(ドライブ名の右のイジェクトマーク)を実行。
  2. USBメモリとUSB HDDだけを接続。
  3. Pogoplugをリブート:
     sync
     sync
     sync
     /sbin/reboot
    ※PogoPlug Bizでは一旦電源プラグを抜かないと正常に起動しなかった。 (2011-06-06)

mke2fsを取ってくる

  1. ルートパーティションを書き込み可能に
     mount -o remount,rw /
    ※PogoPlug Bizでは不要だった(既にrwマウントされていた)。
  2. 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のデバイス名を確認

  1. ディスクのデバイス名を確認
     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であると同定)。
  2. なお、/tmp/.cemnt/~ がリストにない場合は、 PogoplugがそれらUSB機器を認識していないとおもわれるのでPogoplugをリブート。
     sync
     sync
     sync
     /sbin/reboot

以下、特記なき限り、 sdaやsdbという文字列は上で同定したデバイス名に置き換えること。

余談だが、このデバイス名の割り当てを「自然」にまかせずにコントロールするには、 何も挿さずにPogoplugをリブートし、その後にUSBデバイスを挿せばよい。 最初に挿したものがsda、次がsdb、などとなる。

USBメモリにパーティションを切る

  1. my.pogoplug.com(Pogoplugのwebインタフェイス)の機能を一時的に止める
     killall hbwd
  2. fdiskコマンドを起動する。
     /sbin/fdisk /dev/sda
    以下この節ではfdiskコマンドへの入力をBoldのように斜体で示す。 それ以外はfdiskの出力である。
  3. とりあえず今あるパーティションを表示してみる。

    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)
  4. 普通は上記のとおりFAT32パーティションがあると思うのでそれを削除

    Command (m for help): d

    Selected partition 1
     
  5. 削除されたかを確認

    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
     
  6. パーティションを作成

    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。
  7. これまでの結果を実際にディスクに書き込む(wコマンドでfdiskは終了する)。

    Command (m for help): w

  8. パーティションテーブルを確認

    /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メモリにファイルシステムを作る

  1. ファイルシステムはext2で。ext3でもフォーマットできるが、 それではPogoplugは自動的にマウントしてくれない。 (2012-05-20追記: と思ったが、後でやってみるとext3でもマウントできた。ext4はだめ)
     mke2fs -T ext2 /dev/sda1
    ※そこでPogoPlug Bizでは
     mke2fs -T ext3 /dev/sda1
    とした。
  2. Pogoplugを再起動
     sync
     sync
     sync
     /sbin/reboot
    ※PogoPlug Bizでは、一旦電源プラグを抜かないとHDDが認識されなかった。

(2011-06-08)

OpenPogoのインストール

OpenPogoをダウンロード

http://openpogo.com/base/openpogo-usb.tar.gz はホストが無くなっているようなので、

  1. 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を展開

  1. USBフラッシュメモリのルートにtarballを展開
     cd /tmp/.cemnt/mnt_sda1
     tar -xzf /tmp/opt.tar.gz
    tarballの内容はすべて /tmp/.cemnt/mnt_sda1/.opt/ の下に展開される。

起動スクリプトを作成

  1. ルートパーティションを書き込み可能に
     mount -o remount,rw /
    ※PogoPlug Bizでは不要だった(既にrwマウントされていた)。
  2. ここで編集するファイルのオリジナルをバックアップ
     cd /etc/init.d
     mv rcS rcS.org
     cp rcS.org rcS
    ファイルの編集にはviが使える。
  3. /etc/init.d/rcSの末尾に次の各行を追加
     # initializing OpenPogo /opt on USB
     /etc/init.d/mount_opt
     /opt/etc/init
  4. /etc/profile(ない場合は作る)に次の各行を追加
     #!/bin/bash
     # profile for OpenPogo /opt on USB
     export PATH=/opt/bin:/opt/sbin:/usr/bin:/usr/sbin:/bin:/sbin
  5. /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
  6. このオリジナルの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,...についても同じ)は 同じデバイスを指している。
  7. さきに、USBフラッシュのファイルシステムをext3で作成した場合は、 このスクリプト中の変数FSTYPEの値を「ext2」から「ext3」に置き換えておく。
  8. /etc/init.d/mount_optでマウントする先のディレクトリをシンボリックリンク。
     ln -s /tmp/mnt_opt/.opt /opt
  9. 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コマンドをちゃんとしたやつに置き換え

  1. /tmpへ移動しtarballをダウンロード。
     cd /tmp
     wget http://ipkg.nslu2-linux.org/feeds/optware/cs08q1armel/cross/stable/wget_1.12-2_arm.ipk 
  2. tarballを展開。
     tar -xzvf wget_1.12-2_arm.ipk
     tar -xvzf data.tar.gz
  3. 展開した中のwgetのバイナリを既存のと置き換え。
     cd /usr/bin
     mv wget wget.old
     cp /tmp/opt/bin/wget /usr/bin/
  4. パーミッションをちゃんとする。
     chmod 755 wget
     chown root:root wget

(2011-10-13)

ipkgのリポジトリの記述

OpenPogoで使うツールのインストールにはipkgコマンドを使う。 ipkgでインストールするパッケージのリポジトリを次の通り記述しておく。

  1. /opt/etc/ipkg/armel-feed.confの内容を次のようにする。
    src cross http://ipkg.nslu2-linux.org/feeds/optware/cs08q1armel/cross/stable 

各種パッケージのインストール

  1. Pogoplugを再起動(大丈夫かな)。
     sync
     sync
     sync
    /sbin/reboot
  2. パッケージリストのアップデート。
    ipkg update
  3. less
    ipkg install less
  4. bash Pogoplug標準のbashではジョブコントロールが有効になっていないので これに置き換えたかったのだが...
    ipkg install bash
    いまんとこ、ログインシェルをこのbashに置き換えると rootにログオンできなくなるので注意。解決方法模索中。
  5. busybox
    ipkg install busybox
    ※PogoPlug Bizではこれは必要ない(既に入っているしそっちの方が新しい)。
  6. vim
    ipkg install vim
    ln -sf /opt/bin/vim /opt/bin/vi
    お好みでalias vi=vim
  7. man
    ipkg install man
    ipkg install man-pages
  8. Sambaサーバ
    ipkg install samba36
    ipkg install samba36-swat
  9. lynx
    ipkg install lynx
  10. w3m
    ipkg install w3m
    ここまでやった(2012-05-19現在)。
  11. WebDAVサーバ
    ipkg install apache
    とか、
    ipkg install nginx
    とか、
    ipkg install lighttpd
    とか(WebDAVモジュール入ってるかなぁ)。

(2012-04-01)

(2012-05-18)

(Sambaを動かすための)準備

  1. xinetd.conf内のlocalhostが解決できなくてxinetdがエラーを吐いてたので、 /etc/hostsを作って
    127.0.0.1 localhost
    ::1       localhost
    を記入。
  2. /opt/etc/xinetd.d/swatにprotocal or socket typeがないとxinetdが文句をいうので /opt/etc/xinetd.d/swatに
    protocol = tcp
    の一行を加える。
  3. /etc/protocolsがないとxinetdが不平を言うので手近のunix(私の場合はVine Linux)に入ってるのを持ってくる。
  4. /etc/servicesがなくてxinetdからswatが起動しないので手近のunixに入ってるのを持ってくる。

これでxinetdからswatが起動するはず。 うまくいかないときは、rootのコマンドラインから

/opt/sbin/xinetd -d

を実行するとエラーメッセージなどを見ることができる。

(2012-05-20)

Pogoplug Bizでは、

  1. うまくxinetdが起動しない対策のためにsyslog-ngをインストール。
    ipkg install syslog-ng
    ipkg install libnsl
  2. /opt/var のファイルを全部/varに移す。
    mv /opt/var/* /var/
    rmdir /opt/var
    ln -s /var /opt/var
  3. なぜか/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のフォーマット

  1. Pogoplugのプロセスを止める
    killall hbwd
  2. HDDがどこにマウントされているか確認
    fdisk -l
    リブートごとに変わるので注意。以下、/dev/sdbだったと仮定する。
  3. 必要ならfdiskでパーティションを作成したりパーティションタイプを変えたり。
  4. ファイルシステムをext3とする。
    mke2fs -t ext3 /dev/sdb1

/varと/homeをUSB-HDDに置く

  1. /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
  2. USB HDDのルートに.varと.homeを作成
  3. テストラン
    ./mount_opt.new
  4. USBメモリとUSB HDDが/tmp/mnt/sdXNにマウントされていることを確認
  5. /tmp/lnkの下にシンボリックリンクoptやvarやhomeができており、 それぞれが、マウントされたUSBメモリやUSB HDD上の.optや.varや.homeを 指していることを確認
  6. /のリンクを作成or置換
    ln -sf /tmp/lnk/home /
    ln -sf /tmp/lnk/var /
    ln -sf /tmp/lnk/opt /
  7. 旧mount_optと置換え
    cd /etc/init.d
    mv mount_opt mount_opt.old
    ln -s mount_opt.new mount_opt
  8. リブート
    sync
    sync
    sync
    /sbin/reboot

USB-HDDにswapを

※mkswap, swaponは/opt/bin/busyboxにある。

  1. スワップファイルを作る
    dd if=/dev/zero of=/var/swap bs=1M count=1024
    mkswap /var/swap
  2. スワッピングを始める
    swapon /var/swap
  3. リブートしてもスワップが行われるように、/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から マウントするために導入したテクニックを若干拡張して、 決まったディスクドライブを一定のパスに対応させるために用いることにする。

  1. /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
  2. データ用HDD(仮にhd1,hd2と名付ける)のルートに 例えば.hd1とか.hd2というディレクトリを作成
  3. テストラン
    ./mount_opt.new
  4. データ用HDDが/tmp/mnt/sdXNにマウントされていることを確認
  5. /tmp/lnkの下にシンボリックリンクhd1とかhd2ができており、 それがデータ用HDDにある.hd1とか.hd2とかの 親ディレクトリを指していることを確認
  6. Sambaの、共有ごとに指定するパラメタpathの指定を例えば次のようにする。
    • 共有hd1に対するpath: /tmp/lnk/hd1
    • 共有hd2に対するpath: /tmp/lnk/hd2

共有のパーミッション

いろいろ方法はあると思うが、ここではグループベースの方法をとる。 共有はこれまでの例に倣ってhd1とhd2を作成するものとする。

  1. グループsmbshareを作成(/etc/groupをエディット)
  2. 共有のトップディレクトリのグループをsmbshareにする(パス末尾の / は必須)。
    chgrp smbshare /tmp/lnk/hd1/
    chgrp smbshare /tmp/lnk/hd2/
  3. 共有のトップディレクトリのパーミッションにg+rwsを追加する。
    chmod g+rws /tmp/lnk/hd1/
    chmod g+rws /tmp/lnk/hd2/
  4. Sambaの[global]セクション(あるいは共有ごとのセクションでも良い)のパラメタを 次のとおり設定。
    create mask = 0774 (デフォルトは0744)
    directory mask = 0775 (デフォルトは0755)
    あるいは上記の代わりに
    inherit permissions = yes
    でもよいと思う。
  5. すでにデータHDD上に共有対象の(=PogoPlugが作成したものでない) ファイルやディレクトリがある場合は、それらについても
    chgrp smbshare hoge hoga
    chmod g+rws hoge hoga
    を実施する(chgrp, chmod の-Rオプションを利用するのが楽)。
  6. 共有への書き込み権限を与えたいユーザをsmbshareグループに追加する (/etc/groupをエディット)。

(2012-07-30)

Tag: Pogoplug OpenPogo Linux Samba WebDAV