Понадобилось мне при запуске OS X добавить статический маршрут. И всё бы хорошо, но сколько не бился – всё без толку, испытываю очередной вариант, перезапускаю сервер, проверяю – маршрута нет.
Уже начал думать, что в Lion поменялись механизмы работы с StartupItems. Но тут в Console.app заметил сообщение “add net 10.0.0.0: gateway 192.168.98.9: Network is unreachable” и всё стало на свои места.
Всё дело в том, что сетевые интерфейсы подымаются не сразу (что при DHCP, что при ручной установке адреса), а для добавления статического маршрута шлюз должен быть доступен. Добавил в скрипт задержку 10 секунд перед выполнением команды route – и всё получилось.
При прописывании StartupItems я отталкивался от статьи “
StartupItems
Создаю каталог для нового StartupItem
$ sudo mkdir /Library/StartupItems/ctrld_boot
Делаю описание скрипта (без него работать не будет)
$ sudo vim /Library/StartupItems/ctrld_boot/StartupParameters.plist { Description = "Ctrld Boot Script"; Provides = ("ctrld_boot"); OrderPreference = "None"; Messages = { start = "Starting ctrld Boot Script"; stop = "Stoping ctrld Boot Script"; restart = "Restarting ctrld Boot Script"; }; }
Пишу скрипт (обратите внимание на sleep 10 – не будет работать, замените 10 секунд, например, на 20):
$ sudo vim /Library/StartupItems/ctrld_boot/ctrld_boot #!/bin/sh . /etc/rc.common case "$1" in start) ConsoleMessage "Starting ctrld Boot: adding static route" sleep 10 route add -net 10.0.0.0 -netmask 255.0.0.0 192.168.98.9 ;; esac exit 0
Делаю скрипт исполняемым:
$ sudo chmod 755 /Library/StartupItems/ctrld_boot/ctrld_boot
Перезапускаюсь – работает.
LaunchDaemons
Если бы не задержка с активацией интерфейсов, то можно было бы сделать запуск и через механизм LaunchDaemons.
$ cd /Library/LaunchDaemons
Создаю plist:
$ sudo vim me.ctrld.route.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>Label</key> <string>me.ctrld.route</string> <key>ProgramArguments</key> <array> <string>route</string> <string>add</string> <string>-net</string> <string>10.0.0.0</string> <string>-netmask</string> <string>255.0.0.0</string> <string>192.168.98.9</string> </array> <key>RunAtLoad</key> <true/> </dict> </plist>
Выставляю права (они и так нормальные):
$ sudo chmod 644 me.ctrld.route.plist
Этот способ я продемонстрировал для полноты, как можно выполнить нужную операцию при старте системы.