Синхронизация времени и даты двух компьютеров Ubuntu, не подключенных к Интернету
у меня две машины
- машина А с ip 192.168.0.2
- машина B с назначенным IP 192.168.0.3
Они оба подключены к локальной сети, и я хотел бы установить дату и время машины A так, чтобы они соответствовали дате и времени машины B.
Для аналогичной проблемы я бы использовал решение, представленное в этом ответе.
sudo date -s "$(wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-8)Z"
Однако это сработает только в том случае, если у меня будет подключение к Интернету.
Что такое команда для синхронизации времени и даты двух операционных систем Ubuntu без использования Интернета?
Кандидат 1 Спасибо @Joe за его вклад. Как насчет настройки веб-сервера на машине B, запроса к нему с машины A и получения времени и даты из ответа? Это выглядит довольно четко.. есть ли более простое решение?
Кандидат 2 Спасибо @matigo за это. Настройка NTP-сервера в локальной сети. Проверка документов NTP для реализации этого решения
4 ответа
Если бы у вас было подключение к Интернету, вы могли бы войти вwgetкоманда, заданная внутриdateкоманду и убедитесь, что она дает строку времени, подобную этой:
25 Apr 2023 13:20:23Z
Он делает это, беря дату из заголовка HTTP, удаляя слово «Дата:» и добавляяZв конце. Таким образом, вы можете установить время вручную, используя этот формат:
sudo date -s "25 Apr 2023 13:20:23Z"
Возможно, вам потребуется перевести «Апр» в сокращенное название месяца в вашем регионе.
Настройка NTP-сервера (насколько я знаю, текущие версии Ubuntu используютchronydв качестве NTP-сервера) на одном компьютере и с помощью NTP-клиента (chronyc, наоборот) с другой синхронизировать машину с сервером вроде как лучший способ.
Другой вариант — использовать «старый добрый» Daytime Protocol. Вам нужно установитьxinetdна серверной машине (той, с которой вы будете синхронизироваться) и включите дневную службу в ее конфигурации (вот некоторая информация о том, как ее включить). Служба дневного времени возвращает текущую дату и время в виде строки, поэтому вам, вероятно, придется написать некоторый скрипт на клиентской машине (той, которую вы хотите синхронизировать с клиентской машиной), чтобы получить эту информацию и установить часы в соответствии с ней (я не знаю ни одного готового клиента для дневного протокола). Но использование NTP все же кажется лучше...
Хорошо, спасибо за ценную информацию, которую вы предоставили. После небольшого исследования и тестирования вот решение, которое я использую.
Как Canonical заявил
Начиная с Ubuntu 16.04, timedatectl/timesyncd (которые являются частью systemd) заменяют большую часть ntpdate/ntp.
[...]
ntpdate теперь считается устаревшим в пользу timedatectl (или chrony) и больше не устанавливается по умолчанию. timesyncd обычно делает правильные вещи, синхронизируя ваше время, а chrony поможет в более сложных случаях.
Поэтому я дал Хрони шанс. Я также проверил:
- эта ссылка здесьздесь
- Стековой вопрос ,
- Красной шляпыСтраница
- Этот урок
Итак, короче говоря...
Машина А — настроена как NTP-сервер.
Настройте NTP-сервер, обязательно добавьтеlocal stratum 10и разрешите 192.168.0.0/24 заставить сервер работать нормально, даже если он отключен от Интернета, и чтобы клиентам в этой сети было разрешено подключаться к нашему NTP-серверу Chrony для синхронизации времени.
confdir /etc/chrony/conf.d
pool ntp.ubuntu.com iburst maxsources 4
pool 0.ubuntu.pool.ntp.org iburst maxsources 1
pool 1.ubuntu.pool.ntp.org iburst maxsources 1
pool 2.ubuntu.pool.ntp.org iburst maxsources 2
allow 192.168.0.0/24
sourcedir /run/chrony-dhcp
sourcedir /etc/chrony/sources.d
keyfile /etc/chrony/chrony.keys
driftfile /var/lib/chrony/chrony.drift
ntsdumpdir /var/lib/chrony
logdir /var/log/chrony
maxupdateskew 100.0
rtcsync
makestep 1 3
leapsectz right/UTC
Перезапустите службу Chrony, проверьте, работает ли она, и включите ее запуск при загрузке.
Машина Б — настроена как клиент Chrony
Синхронизируйте дату и время с пулом серверов и установите 192.168.0.1 или любой другой IP-адрес в качестве предпочтительного сервера.
sudo apt update && sudo apt upgrade
sudo apt install chrony
sudo vim /etc/chrony/chrony.conf
Добавьте в пул свой локальный NTP-сервер.
pool 192.168.0.1 iburst prefer
keyfile /etc/chrony/chrony.keys
driftfile /var/lib/chrony/chrony.drift
logdir /var/log/chrony
log measurements statistics tracking
maxupdateskew 100.0
rtcsync
makestep 1.0 3
Перезагрузите, проверьте службу и включите ее при запуске.
sudo systemctl restart chrony
sudo systemctl status chrony
CTRL+C
sudo systemctl enable chrony
Наконец, проверьте, получает ли он обновление из правильного источника.
chronyc tracking
chronyc sources
Заключение
Рок-н-ролл и продолжай!
Я проведу краткое тестирование и буду обновлять этот пост, сообщая о любых проблемах, с которыми я столкнусь.
Я предполагаю, что 192.168.0.* должен оставаться недоступным откуда-либо еще из соображений безопасности. Чтобы получить внешнее время без особых усилий, как насчет:
- установите гипервизор на другую машину с доступом в Интернет. (Было бы идеально, если бы на этой машине было 2 подключения Ethernet, одно из которых выходило в Интернет, а другое не использовалось или использовалось только для локальных сетей)
- сделайте эту машину клиентом времени какого-либо сервера времени (NTP, домен Windows и т. д.).
- установить гостевую ОС, которая представляет собой встроенное серверное устройство NTP
- дайте гостевому устройству адрес моста в пределах 192.168.0.*
- Синхронизируйте это время гостя со временем хоста с помощью гипервизора.
- Сделайте этого гостя автономным корневым источником времени NTP.
- Сделайте все машины с адресом 192.168.0.* NTP-клиентами этого гостевого устройства.
Поскольку внутренний механизм гипервизора (а не сетевой маршрут) является средством передачи привязки времени к гостевому устройству NTP, 192.168.0.* не имеет маршрута наружу, но все же имеет хорошую привязку ко времени. Если у хоста гипервизора есть сетевой кабель, используемый только для локальных сетей, даже перехват внешнего провода в неразборчивом режиме не будет иметь никакого общего доступа к 192.168.0.*