linkstation ls-hgl を MacOSX Lion のTimeMachineに対応させよう


はじめに

MacOSX 10.7になり、TimeMachineのバックアップ先にsambaで接続したNAS(Linkstation ls-hgl)が使用できなくなってしまいました。さらにAFPによる接続も、セキュリティの高い認証を行う新しいバージョンのプロトコルのみ有効となり、古いAFPプロトコルにしか対応していないls-hglはバックアップ先に指定してもエラーが出てバックアップが始まりません。

既に販売終了のうえ、ファームウェアも2008年の年末を最後に更新が止まっているls-hglでは、メーカーのアクションは期待できそうにもありません。自力でなんとかするとしましょう。

今回は、ARMアーキテクチャのlinuxマシンであるls-hglにnetatalk2.2.xの最新版をインストールしてみます。 製品オリジナルの機能と設定インターフェースをそのままにした上で機能追加したいので、オリジナルの環境を削除してdebianやgentooをインストールしたりはしません。

ssh接続をできるようにする

まずは、linux PCからリモートログインとファイルの転送を可能にするため、ls-hglへのssh接続を可能にします。

以下の手順は、http://blog.sakatam.net/2009/04/linkstation-ls-whgl-shell-connection-setting/をまるまるトレースしたものです。

  1. acp_commander.jarをダウンロードする
    % wget http://downloads.buffalo.nas-central.org/TOOLS/ALL_LS_KB_ARM9/ACP_COMMANDER/acp_commander.jar

  2. acp_commander.jarを起動する
    % java -jar acp_commander.jar -t X.X.X.X -o (X.X.X.Xはls-hglのIPアドレス)

  3. 「パスワードなしのrootユーザーとしてtelnetできるようになったよ」という旨のメッセージが表示される。
    % telnet X.X.X.X (そのままroot ユーザーとしてls-hglにログインする)

  4. passwdコマンドで、rootユーザーのパスワードを設定する。
    # passwd

  5. viで、起動スクリプトに眠っていたsshdを追記する(実は、ls-hglのシステムにはもとからsshdがインストールされています。)
    # vi /etc/init.d/rcS (最終行に "/usr/local/sbin/sshd" を追記する。)

  6. ls-hglからログアウトする
    # exit

  7. WEB設定ページのメンテナンスメニューから再起動する。

  8. sshでログインしてみる。初回で見知らぬマシンに接続した事を警告されるがyesと答える
    % ssh root@X.X.X.X
    % sftp root@X.X.X.X

クロスコンパイル環境を構築する

ここからの作業は、http://home1.catvmics.ne.jp/~kanemoto/linux/index.htmlの手順を参考にしています。

この工程では、linux PC上で動作するls-hgl(ARM)用コンパイラを作成します。

クロスコンパイル環境を構築するLinux環境は、gentoo linux (~x86_64)をインストールしたMacmini(Mid 2010)です。

arm-linux用のクロスコンパイラを作成

  1. 以下の作業用ディレクトリを作成する。
    ~/ls-hgl/CROSS (クロスコンパイル環境のインストール先)
    ~/ls-hgl/build (ビルドディレクトリ)
    ~/ls-hgl/rootfs (ls-hgl本体にインストールするファイルは一度このディレクトリにインストールする)
    ~/ls-hgl/src (ソース置き場)

  2. http://opensource.buffalo.jp/gpl_storage.html の LS-HGL series -> Firmware version 1.00 or later から
    binutils-2.17pre-1.src.rpm
    gcc-2005q3-2.src.rpm
    glibc-devel-arm_trg-2005q3-2.arm.rpm
    をダウンロードする。

  3. rpm2tbz2コマンドで、ダウンロードしたrpmファイルからアーカイブファイルを取り出す。取り出したファイルは、 ~/ls-hgl/src に置く。

  4. ~/ls-hgl/src の アーカイブを解凍し、binutilsとgccのソースにパッチを当てる
    binutils-2.17pre-missing-makeinfo.patch (texinfoの最近のバージョンをconfigureが認識できない)
    gcc-2005q3-c-parse.patch (bisonの最近のバージョンでは記述が厳格になり、一部の古いソースでエラーを出す )

  5. ~/ls-hgl/CROSS に glibc-devel-arm_trg-2005q3-2.arm.rpmから取り出した include と lib を 置く
    ~/ls-hgl/CROSS/include
    ~/ls-hgl/CROSS/lib

  6. ssh でls-hglにログインし、/lib以下と/usr/lib以下をtarで固める。ファイル名はそれぞれ lib.tar, usrlib.tarとする。

  7. sftpで、ls-hgl上の lib.tar, usrlib.tarをPC上の ~/ls-hgl/src以下に転送する。

  8. 転送した本体の/libと/usr/libを ~/ls-hgl/CROSS以下に展開し、include ディレクトリを作成しておく。
    ~/ls-hgl/CROSS/include
    ~/ls-hgl/CROSS/lib   (本体の/libで上書きする)
    ~/ls-hgl/CROSS/usr/lib (本体から持ってきた/usr/lib)

  9. binutilsのビルド
    binutils_cross.sh を~/ls-hgl/build に置き実行する。

  10. crt1.oが見つけられずに gcc のビルドが中断してしまうのでその対策
    1. ~/ls-hgl/CROSS/usr/lib/ldscripts を削除し、~/ls-hgl/CROSS/arm-none-linux-gnueabi/lib/ldscripts をコピーする
    2. ~/ls-hgl/CROSS/arm-none-linux-gnueabi/libを削除し、~/ls-hgl/CROSS/usr/lib へのシンボリックリンクと置き換える

  11. libcのパス記述により gcc のビルドが中断してしまうのでその対策
    ~/ls-hgl/CROSS/usr/lib/libc.so をエディタで編集する
    GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a ) となっている箇所を
    GROUP ( libc.so.6 libc_nonshared.a )       に修正
    ~/ls-hgl/CROSS/usr/lib/libpthread.soをエディタで編集する
    GROUP ( /lib/libpthread.so.6 /usr/lib/libpthread_nonshared.a ) となっている箇所を
    GROUP ( libpthread.so.6 libpthread_nonshared.a ) に修正

  12. gccのビルド
    gcc_cross.shを~/ls-hgl/build に置き実行する。

ネイティブコンパイル環境を作成

クロスコンパイル環境の作成で、PCで動作しls-hgl(ARM)のバイナリを出力するクロスコンパイラが完成しました。つぎは、このコンパイラを使って、ls-hgl(ARM)で動作しls-hgl(ARM)のバイナリを出力するネイティブコンパイラを作成します。

  1. binutilsのビルド
    binutils.sh を~/ls-hgl/build に置き実行する。

  2. gccのビルド
    gcc.sh を~/ls-hgl/build に置き実行する。

  3. makeのビルド( http://ftp.gnu.org/gnu/make/ )
    make.sh を~/ls-hgl/build に置き実行する。

  4. gawkのビルド( http://ftp.gnu.org/gnu/gawk/ )
    gawk.sh を~/ls-hgl/build に置き実行する。

  5. sedのビルド( http://ftp.gnu.org/gnu/sed/ )
    sed.sh を~/ls-hgl/build に置き実行する。

  6. BerkelayDBのビルド( Berkeley DB 4.8.30.tar.gz )
    db.sh を~/ls-hgl/build に置き実行する。

ネイティブコンパイル環境をインストール

  1. ~/ls-hgl/rootfs をtarで固める (TOOLCHAIN.tarとします)

  2. sftpでls-hglに転送する

  3. ls-hglにsshログインし、TOOLCHAIN.tarを展開する

  4. 展開されたrootfs以下をls_hglの/以下に配置する
    # mv rootfs/include / (includeディレクトリは/に置く)
    # mv rootfs/usr/local/develop /usr/local/

  5. パスを通す
    # cd
    # vi .bashrc (以下の行を書き込み、$PATHに/usr/local/develop/binを追加する)
    export PATH=/usr/local/develop/bin:$PATH
    # vi /etc/ld.so.conf (/usr/local/develop/libを追加する)
    # ldconfig
    # source .bashrc

ls-hgl上でビルドする

  1. libgpg-errorのビルド( http://www.ring.gr.jp/pub/net/gnupg/libgpg-error/ )
    CFLAGS=”-O2” ./configure --prefix=/usr/local/develop/
    make
    make install

  2. Libgcryptのビルド( http://www.ring.gr.jp/pub/net/gnupg/libgcrypt/ )
    CFLAGS=”-O2” ./configure --prefix=/usr/local/develop/
    make
    make install

  3. opensslをビルド( http://www.openssl.org/source/ )
    ./config shared threads -L/usr/lib -ldl --prefix=/usr/local/develop
    make
    make install

  4. linuxpamのヘッダ取り出し
    http://opensource.buffalo.jp/gpl_storage.html の LS-HGL series -> Firmware version 1.00 or later から
    linux-pam-0.81_arm.tgz をダウンロードし、展開
    cd Linux-PAM-0.81
    make FAKEROOT=/tmp install
    mv /tmp/usr/include/security /usr/include

  5. cp /usr/local/develop/lib/libpthread_nonshared.a /usr/lib

  6. netatalkをビルド( http://netatalk.sourceforge.net/ )
    LDFLAGS=”-L/usr/lib -ldl” CFLAGS=”-O2 -I/include” ./configure --prefix=/usr/local/develop --with-bdb=/usr/local/develop --without-ldap --with-ssl-dir=/usr/local/develop

設定ファイルの変更

  1. netatalkの起動ファイルをバックアップします
    mv /etc/rc.d/init.d/atalk.sh ~/atalk_old.sh

  2. 以下のファイルに更新します
    atalk.sh

  3. 以下のファイルを設定します。
    /usr/local/develop/etc/netatalk/afpd.conf
    /usr/local/develop/etc/netatalk/netatalk.conf
    /TOP/