Статическая запись ARP FreeBSD при циклах ссылок

Последовательность

mount ... | logger
rc=$?

работает не так, как вы ожидали: возвращаемое значение канала - это возвращаемое значение последнего элемента в этом конвейере.

$> false | true; echo $?
0

Если вы используете bash, попробуйте PIPESTATUS :

$> false | true; echo $? ${PIPESTATUS[0]}
0 1
$> true | false; echo $? {PIPESTATUS[0]}
1 0

PIPESTATUS - это переменная массива. Подробности на странице руководства bash. В других оболочках может быть что-то похожее на PIPESTATUS

5
14.01.2019, 00:05
1 ответ

Подружиться с FreeBSD

Вы, кажется, на частично правильном пути. Я предполагаю, что вы хорошо разбираетесь в Unix, но не в реальной системе FreeBSD. Я предполагаю, что причина этого в том, что вы подошли к этому несколько иначе, чем типичный пользователь rc.d в FreeBSD.

Я нахожу этот вопрос несколько поверхностным, так как лично я предпочел бы выяснить, почему пропадает арп. Но нам дают очень мало информации. Вместо этого мы делаем поспешные выводы. Однако они задают несколько интересных вопросов о том, как что-то делать во FreeBSD. Просто имейте в виду огромное предупреждение о том, что мы можем в конечном итоге использовать гаечный ключ в качестве молотка.

Написание rc-скриптов

Сценарии запуска FreeBSD находятся в /etc/rc.d, но вы никогда не должны создавать там ничего, кроме как оставить этот каталог операционной системе. В противном случае вы рискуете перезаписать свои вещи во время обновления. Если вы хотите написать свои собственные сценарии запуска/демона/службы, лучшим местом будет/usr/local/etc/rc.d

Рекомендуемое расположение файлов описано в выше

.

И вместо того, чтобы писать все с нуля, вы можете получить множество вспомогательных функций, прочитав Практические сценарии rc.d в BSD

/etc/rc.conf.d/*

Вы спрашиваете в комментарии, можете ли вы использовать его в скрипте в /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_<element> 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 <interface>

Честно говоря, я не проверял, приводит ли это также к статическому _арпеджиатору. Или что-то вроде:

service netif stop <interface>
...
service netif start <interface>
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
  • Если вы хотите иметь свои собственные сценарии rc, поместите их в /usr/local/etc/rc.d
  • Если вам нужен простой сценарий запуска, поместите его в /etc/rc.local(вы можете использовать источник rc, если хотите)
  • Если вам нужен по-настоящему общий сценарий при запуске, используйте @reboot с crontab
  • Использовать sysrc при редактировании/etc/rc.conf
  • Использовать службу при взаимодействии с rc-скриптами
  • Используйте devd , воздействуя на изменения состояния устройства
6
27.01.2020, 20:39

Теги

Похожие вопросы