Mac
OSX

MacをPXEサーバーにする

More than 3 years have passed since last update.

この記事について

タイトルの通り、MacをPXEサーバーにします。
別筐体へのLinuxインストールのときなどに、ブートメディアを用意する必要が無くなるので便利です。

Macを使うと何が嬉しいのか

Macのインターネット共有機能を使うと、DHCP(bootpd)がついてきます。(過去記事参照)
さらに、TFTPサーバーも最初からついてきます。

また、インターネット共有機能のおかげで、PXEでのブート後はそのままインターネットにも到達できます。つまり、ネットインストールのイメージでもOK。

環境

  • MacBookAir 13 Mid 2011
    • Thunderbolt Ethernet付き
  • OS X Yosemite
  • tftpd (OSX標準)
  • bootpd (OSX標準)

構成図

+----------+  Wi-Fi  +---------+  Ethernet  +--------+
| Wi-Fi AP | ------> | MacBook | ---------> | Server |
+----------+         +---------+            +--------+

ServerはPXEで立ち上がってくるマシン。
今回使ったのはALIX.2D13っていうワンボードx86機ですが、PXE対応していれば機種は選ばないはず。

だいたいの手順

  1. tftpdのルートパスにファイル配置
    • 初期状態だと/private/tftpboot/
  2. tftpd有効化
  3. bootpd設定変更
    • /etc/bootpd.plist オプション66・67の設定
    • /etc/bootptab 固定アサインしたいなら
  4. インターネット共有を有効にする

tftpd

特に設定は必要なし。
/private/tftpboot/配下がルートパスになります。

ルートパスを変更したい場合は、/System/Library/LaunchDaemons/tftp.plistを変更してください。

tftpd有効化

$ sudo launchctl load -w /System/Library/LaunchDaemons/tftp.plist

無効にするときはlaunchctl unloadで。

動作確認

$ tftp localhost
tftp>
tftp> quit

プロンプトが出てくればOK。quitで終了。

bootpd

インターネット共有を有効にすれば勝手に立ち上がりますが、何点か変更が必要です。

DHCP オプション66,67の設定を追加

/etc/bootpd.plistにオプションを2つ追加。

  • 66 ftp_server_name
    • 例では192.168.2.1
  • 67 boot_file_name
    • 例ではpxelinux.0
bootpd.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Subnets</key>
    <array>
        <dict>
            <key>_creator</key>
            <string>com.apple.NetworkSharing</string>
            <key>allocate</key>
            <true/>
            <key>dhcp_domain_name_server</key>
            <array>
                <string>192.168.2.1</string>
            </array>
〜中略〜
            <key>net_range</key>
            <array>
                <string>192.168.2.2</string>
                <string>192.168.2.254</string>
            </array>
            <key>dhcp_option_66</key>
            <string>192.168.2.1</string>
            <key>dhcp_option_67</key>
            <data>cHhlbGludXguMAA=</data>
        </dict>
    </array>
    <key>bootp_enabled</key>
    <false/>
〜中略〜
    <key>use_server_config_for_dhcp_options</key>
    <false/>
</dict>
</plist>

ちょっとハマったこと

後述のbootptubで指定するからって、オプション67を端折ってはいけません。
OSXのbootpdは、bootpd.plistに66・67両方が書かれていないと、両方ともDHCP_OFFERに流してくれないようです。

固定アサインの設定

/etc/bootptubを作成・編集。
必須じゃないけど、固定の方があとで楽なことが多いので。

# hostname      hwtype  hwaddr              ipaddr          bootfile
client1         1       01:02:03:04:05:06   192.168.2.11    pxelinux.0

bootpd有効化

インターネット共有機能を有効にすれば勝手に有効になります。
手動で立ち上げたいときは以下。

sudo launchctl load -w /System/Library/LaunchDaemons/bootps.plist

tftpdと同じく、無効にするときはunload

そういえば、何でここだけ「bootps」なんだろう。

動作確認

何か繋いでみる。

$ tail -f /var/log/system.log | grep DHCP

とかやって見ていると、払い出されたログが見れます。