2012年04月01日

Mac OSX LionでSMB over SSH

Mac OSX Lion 10.7.3のMac Book Airから、sambaが動いているリモートのLinuxマシンにsmbプロトコルでファイル共有をした時の設定メモです。

設定の流れとしては、ローカルマシンのループバックデバイス(lo0)にエイリアスでポートフォワード用のIPアドレスを設定し、sshでトンネルを掘ります。

エイリアスの設定

エイリアスの設定は、起動時にifconfigを1行書くだけです。
個人的に絶対に使わなさそうなネットワークを振りました。今回は、192.168.100.0/24のネットワークを設定します。

ifconfig lo0 alias 192.168.100.100 255.255.255.0

問題は、この1行をどこに書くかです。MacOSXは、Unix系のOSなので/etc/rcスクリプトのどれかに一行書きたいところですが、/etc/rc系のスクリプトはlaunchdに統合されてしまったので使えません。launchdから起動時に呼び出されるSystemStarterを利用します。SystemStarterが呼び出す/Library/StartupItemsディレクトリにスクリプト追加をしました。追加する起動スクリプトの名前は安易に「BootScript」にしてます。
なお、SystemStarterは今後無くなる可能性があります。後方互換性の為に残されている機能です。launchdの使い方を勉強して、LaunchAgentを使ったほうが良いと思われます。

まず、スクリプトを格納するディレクトリの作成をし、スクリプトを記述します。
ifconfigを書くBootScriptファイルには、起動時や停止時、再実行時の内容をそれぞれ記載します。なお、/etc/rc.commonは必須とのこと。

$ sudo mkdir /Library/StartupItems/BootScript
$ sudo vi /Library/StartupItems/BootScript/BootScript
#!/bin/sh

. /etc/rc.common

StartService () {
  ifconfig lo0 alias 192.168.100.100 255.255.255.0
}

StopService () {
  ifconfig lo0 -alias 192.168.100.100
}

RestartService () { 
  StopService
  StartService
}

RunService "$1"

スクリプトに実行権限を与えます。
念のため、スクリプトが正常に動作することを確認するために、以下のコマンドを実行し手動でスクリプトを動かします。

$ sudo chmod 755 /Library/StartupItems/BootScript/BootScript
$ sudo /sbin/SystemStarter start BootScript
$ sudo /sbin/SystemStarter stop BootScript
$ sudo /sbin/SystemStarter restart BootScript

次にスクリプトのプロパティを書きます。書く内容は、参考文献のサンプルをもとに作成しました。

$ sudo vi /Library/StartupItems/BootScript/StartupParameters.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
<plist version="0.9">
    <dict>
        <key>Description</key>
        <string>BootScript</string>
        <key>OrderPreference</key>
        <string>Late</string>
        <key>Provides</key>
        <array>
                <string>BootScript</string>
        </array>
        <key>Require</key>
        <array>
                <string>Network</string>
        </array>
        <key>Uses</key>
        <array>
                <string>Network</string>
        </array>
    </dict>
</plist>

sshコマンド

sshのコマンドは、昔ながらのポートフォワーディングのやりかたで問題ありません。今回は、エイリアスに設定したローカルの192.168.100.100の1139ポートをリモート先にあるLinuxサーバの192.168.1.2の139ポートにフォワードします。

ssh -L 192.168.100.100:1139:192.168.1.2:139 username@smbserver.example.com

ファイル共有

後は、Finderの「サーバに接続」を選んで「smb://192.168.100.100:1139」に接続すれば、ローカルマシンと同じように参照できます。

参考文献

[Daemons and Services Programming Guide] Startup Items