Вы, кажется, на частично правильном пути. Я предполагаю, что вы хорошо разбираетесь в Unix, но не в реальной системе FreeBSD. Я предполагаю, что причина этого в том, что вы подошли к этому несколько иначе, чем типичный пользователь rc.d в FreeBSD.
Я нахожу этот вопрос несколько поверхностным, так как лично я предпочел бы выяснить, почему пропадает арп. Но нам дают очень мало информации. Вместо этого мы делаем поспешные выводы. Однако они задают несколько интересных вопросов о том, как что-то делать во FreeBSD. Просто имейте в виду огромное предупреждение о том, что мы можем в конечном итоге использовать гаечный ключ в качестве молотка.
Сценарии запуска FreeBSD находятся в /etc/rc.d
, но вы никогда не должны создавать там ничего, кроме как оставить этот каталог операционной системе. В противном случае вы рискуете перезаписать свои вещи во время обновления. Если вы хотите написать свои собственные сценарии запуска/демона/службы, лучшим местом будет/usr/local/etc/rc.d
Рекомендуемое расположение файлов описано в выше
.
И вместо того, чтобы писать все с нуля, вы можете получить множество вспомогательных функций, прочитав Практические сценарии rc.d в BSD
Вы спрашиваете в комментарии, можете ли вы использовать его в скрипте в /etc/rc.conf.d/*
. Пожалуйста пожалуйста не делайте этого. Файлы отсюда загружаются при запуске -, но цель этого каталога — иметь небольшие фрагменты с настройками конфигурации (, см. rc.conf). Большинство людей просто используют файл /etc/rc.conf
для настройки параметров системы -, но вы можете разбить их на небольшие сегменты и поместить в /etc/rc.conf.d
, хотя это и не так часто.
Было бы лучше поместить ваш более общий сценарий запуска в /etc/rc.local , который все еще поддерживается.Но я бы все же рекомендовал создать правильный rc-скрипт и поместить его в/usr/local/etc/rc.d
Если вы хотите полностью игнорировать rc-скрипты, другим распространенным способом запуска универсального скрипта при загрузке является использование ключевого слова @reboot в crontab
Однако я бы сказал, что вам не нужно создавать новый скрипт rc, так как функциональность уже есть.
Статический arp на самом деле хорошо документирован -, однако он очень прост. «Отсутствующая» документация может заключаться в том, как обрабатываются rc-скрипты. Он задокументирован в rc.conf :
.
static_arp_pairs
(str) Set to the list of static ARP pairs that are to be
added at system boot time. For each whitespace separated
element in the value, a static_arp_ variable is
assumed to exist whose contents will later be passed to a
``arp -S'' operation. For example
static_arp_pairs="gw"
static_arp_gw="192.168.1.1 00:01:02:03:04:05"
Это означает, что вы можете добавить 3 статические записи arp, которые сохранятся после перезагрузки, добавив эти строки в /etc/rc.conf (Я рекомендую использовать команду sysrc ):
static_arp_pairs="a b c"
static_arp_a="1.2.3.4 11:22:33:44:55:66"
static_arp_b="1.2.3.5 22:33:44:55:66:77"
static_arp_c="1.2.3.6 33:44:55:66:77:88"
Или в вашем конкретном случае:
static_arp_pairs="myarp"
static_arp_myarp="172.16.16.9 11:54:33:A8:B2:6B"
Скрипт, обрабатывающий это, является частью ОС и находится в /etc/rc.d/static_arp
и очень прост. Он поддерживает только команды «старт» и «стоп».
Вы можете вызвать его из любого места, используя:
/etc/rc.d/static_arp start
Но я бы предпочел использовать команду service :
service static_arp start
Если по какой-то причине вы чувствуете искушение отредактировать/изменить /etc/rc.d/static_arp
, пожалуйста, не делайте этого! Root всемогущ, и вы можете делать все, что хотите -, но вы рискуете, что его заменят. Что вам нужно сделать, так это cp /etc/rc.d/static_arp /usr/local/etc/rc.d/mystatic_arp
и разместить там измененную версию. Обратите внимание на изменение имени и убедитесь, что оно отражено в сценарии!
Если вы привыкли к другим системам, возможно, вы просто поднимаете/отключаете интерфейс с помощью ifconfig. Но во FreeBSD вам следует рассмотреть возможность использования:
service netif restart
Честно говоря, я не проверял, приводит ли это также к статическому _арпеджиатору. Или что-то вроде:
service netif stop
...
service netif start
service routing restart
service static_arp start
Но зацикливание физического соединения может быть (и )подключением кабеля? Опять же, я не уверен, что тогда происходит с таблицей arp.Я ожидаю, что он все еще будет на месте, поскольку мы не отключили интерфейс административно.
ОБНОВЛЕНИЕ:@namezero подтвердил в комментарии, что целые arp-файлы, установленные со статическим _arp, выдерживают физические разъединения.
Но нам следует изучить это немного подробнее, чтобы полностью понять ваш случай. Тогда это максимально близко к ответу «а. Хороший способ предотвратить это»
.
Если мы не получаем уведомления о физической ссылке -, то я не вижу лучшего способа, чем отслеживать ее. Если мы сохраним скрипт простым -, мы можем оставить его для обычного cron.
Если мы сможем увидеть изменения в ОС, то у нас будет хороший путь вперед. Демон изменения состояния устройства devd пригодится. Ваше описание отсутствует, поэтому я предположу, что у нас есть либо ССЫЛКА _ВВЕРХ, либо ССЫЛКА _ВНИЗ, чтобы действовать.
Создайте файл /etc/devd/interface.conf с содержимым:
notify 0 {
match "system" "IFNET";
match "subsystem" "(em0|em1)";
match "type" "LINK_DOWN";
action "/usr/local/sbin/alertme.sh $subsystem"
}
Это уведомит вас о сетевых интерфейсах em0 и em1.
Так что это может быть так же просто, как:
notify 0 {
match "system" "IFNET";
match "subsystem" "(em0|em1)";
match "type" "LINK_UP";
action "/etc/rc.d/static_arp start"
}
Тем не менее, это кажется мне чем-то вроде тупиковой ситуации, поскольку я бы потратил больше времени на выяснение того, почему отсутствуют записи arp. Но я надеюсь, что эти разные указатели могут привести вас в «некоторое» направление.
Это подводит нас к этому краткому списку, в котором описывается, как вы можете жить более счастливой жизнью с FreeBSD:
/etc/rc.conf
Лучший способ поиска файлов — команда find
. Например:
for file in $(find / -type f -iname "*.pid"); do echo "$file = `cat $file | tr -d '\n'`"; done
Для отображения содержимого строковой переменной необходимо использовать двойные кавычки. В противном случае любые специальные символы (, такие как операторы )или строки, напоминающие команды Shell, могут рассматриваться как настоящие команды Shell и, конечно же, будут «выполняться» в Shell.
В первом случае вы искали каталог, где найденные файлы «.pid» содержали один специальный символ (Код новой строки Unix, код перевода строки, известный также как код LF ). Однако во втором случае вашего поиска файлы «.pid» не содержат специального символа новой строки в конце (файлы содержат только число в виде строки -и без окончания новой строки ). Попробуйте найти и открыть указанные файлы ".pid" в шестнадцатеричном редакторе и проверить последний символ. Содержимое ваших файлов может отличаться LF-кодом в конце(0A
в шестнадцатеричном формате ).
Некоторые файлы ".pid" содержат этот код LF, а некоторые нет. Это зависит от того, как были созданы файлы. Например, стандартная команда echo
обычно также добавляет этот LF-код в конец строки. Однако вы также можете использовать аргумент -n
, который не добавляет этот LF-код в конец вывода команды echo :
root@formuler3ip:~# echo "666" > /tmp/test1
root@formuler3ip:~# echo -n "666" > /tmp/test2
root@formuler3ip:~# xxd -g 1 /tmp/test1
00000000: 36 36 36 0a 666.
root@formuler3ip:~# xxd -g 1 /tmp/test2
00000000: 36 36 36 666