Я предполагаю, что вы имеете в виду 11-минутный обновления часов в Linux . Если вы хотите, чтобы ntpd
работал без обновления аппаратных часов, похоже, единственный жизнеспособный вариант - перестроить ядро без параметра RTC_SYSTOHC
:
Установите время RTC на основе Синхронизация NTP
Если вы здесь ответите утвердительно, системное время (настенные часы) будет сохраняться в RTC, указанном RTC_HCTOSYS_DEVICE, примерно каждые 11 минут, если пользовательское пространство сообщает о состоянии синхронизации NTP.
Это требует перестройки, параметр не может быть изменен с помощью флагов загрузки.
В качестве альтернативы, согласно информации сравнения Chrony , openntpd
не активирует синхронизацию ядра.
В конце концов, я немного упростил свою настройку, чтобы действовать при изменении IP-адресов.
Internet NAT был изменен на MASQUERADE, поэтому мне не нужно его использовать; правила iptables
оставили dhclient-exit-hooks.d
, установив iptables-persistent
.
iptables -A POSTROUTING -o eth0.101 ! -p esp -j MASQUERADE
apt-get install iptables-persistent
iptables-save > /etc/iptables/rules.v4
BIND перестал давать сбой при загрузке, потому что теперь он распознает зависимости от iptables.
Я тоже сейчас не перезапускаю BIND. Более того, BIND теперь зависит от крипты dnscrypt-proxy
для передачи в Интернет, поэтому он привязан только к внутренним интерфейсам (которые не меняются).
В то время как переменная exit_status
упоминается в документации dhclient-exit-hooks.d
, очевидно, есть некоторая путаница, и она используется только для передачи статуса выхода в DHCP, и не получить.
Итак, окончательный сценарий:
#!/bin/bash
PATH=$PATH:/usr/bin
IP=`ip addr show eth0.101 | grep inet | awk ' { print $2 } ' | cut -f1 -d "/"`
OLDIP=`awk ' /xxxx.mooo.com/ { print $1 } ' /etc/hosts`
# if reboot or IP changed
if [ $reason = "REBOOT" ] || [ $reason = "BOUND" ] || [ $IP != $OLDIP ]
then
# put it in hosts
sed -i "s/^[0-9\.]* xxxx.mooo.com/$IP xxxx.mooo.com/g" /etc/hosts
timeout 60 /etc/init.d/ipsec restart
timeout 60 /etc/init.d/asterisk restart
# update FreeDNS service
timeout 60 /usr/bin/wget -O - http://freedns.afraid.org/dynamic/update.php?XXXX > /dev/null
fi
Что касается отсутствия exit_status
, это переменные, представленные в dhclient-exit-hooks.d
при загрузке:
requested_broadcast_address=1
new_network_number=95.94.xx.0
new_ip_address=95.94.xx.xx
new_dhcp_message_type=5
pid=1100
new_time_offset=0
new_routers=95.94.xx.xx
new_expiry=1462482903
new_subnet_mask=255.255.240.0
interface=eth0.101
requested_time_offset=1
new_domain_name=netcabo.pt
reason=REBOOT
new_time_servers=212.113.176.129 212.113.176.65
requested_routers=1
PATH=/usr/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/bin
requested_subnet_mask=1
new_log_servers=212.113.188.209
new_dhcp_server_identifier=79.169.255.254
new_domain_name_servers=0.0.0.0 8.8.8.8
new_broadcast_address=95.94.xx.255
new_dhcp_renewal_time=7200
new_dhcp_rebinding_time=12600
PWD=/
new_next_server=0.0.0.0
new_dhcp_lease_time=14400
Как Wouter прокомментировал, ваша существующая установка уже выглядит довольно приличной.
Если вы хотите что-то менее зависимое от dhclient
, вы можете посмотреть на множество динамических DNS клиентов, упакованных в Debian.
Например, ddclient
может реагировать на изменения DHCP или просто следить за интерфейсом Ethernet; когда IP-адрес меняется (и только тогда), он может обновить запись динамического DNS (на любом количестве провайдеров), а также запустить отдельный скрипт (который покроет оба ваших случая использования).
Предлагаю еще больше упростить/разделить ваше решение по принципу разделения задач:
/etc/dhcp/dhclient-exit-hooks.d/trigger_on_ip_change
должен только решить, нужно ли предпринимать действие, и отложить действие до отдельного скрипта /usr/local/bin/act_on_ip_change
/usr/local/bin/act_on_ip_change
должен выполнять только необходимые измененияПричины разделения этих проблем:
dhclient
(фактически не изменяя ничего в вашей системе во время отладки)/usr/local/bin/act_on_ip_change
вручную в случае необходимостиКороче говоря, d/trigger_on_ip_change[trigger_on_ip_change должны только решить, нужно ли выполнять действие до отдельного действия
Я бы предложил иметь это в /etc/dhcp/dhclient-exit-hooks.d/trigger_on_ip_change_action
:
# based on /etc/dhcp/dhclient-exit-hooks.d/debug
if [ "$reason" = "BOUND" -a "$old_ip_address" != "$new_ip_address" ]; then
/usr/local/bin/act_on_ip_change
fi