4

Мне просто нужно временно установить дату. Я бегу это

date 051918002010.00

и он держится всего 5 секунд или около того. Затем он синхронизируется с сервером времени. Я пытался:

ps aux | grep ntp

но там ничего нет.

Мне нужен правильный ответ сейчас, более подробный ответ позже :)

Изменить: Как быстро обнаружили ответчики, мой Ubuntu работает в VirtualBox, который оказался актуальным для некоторых версий ответа. Спасибо всем.

5 ответов5

7

Похоже, вы действительно ищете способ запустить программу, чтобы программа думала, что она работает с другой датой и временем.

Ранее задавался вопрос об этом: аналог Linux RunAsDate? Ниже приведен ответ, который я дал там. Обратите внимание, что вы, кажется, пытаетесь вариант 3.

Пакет ntpdate не является демоном и не должен обновлять системное время автоматически (он должен запускаться один раз при загрузке и не более). Я не слишком знаком с VirtualBox, но я предполагаю, что у вас либо установлен ntpd либо гостевые дополнения VirtualBox синхронизируют время напрямую с хост-ОС, и в этом случае вам нужно отключить их или использовать один из них. библиотек-оболочек, указанных ниже в варианте 2.

Обновление: похоже на то, что VirtualBox Guest Additions устанавливает /usr/sbin/vboxadd-timesync - я предполагаю, что это исполняемый файл, который синхронизирует гостевые часы с часами хоста. Проверьте, установлен ли сценарий запуска (возможно, /etc/init.d/vboxadd-timesync); если это так, вы можете остановить синхронизацию с помощью sudo /etc/init.d/vboxadd-timesync stop . Если нет сценария запуска, вы можете просто kill процесс.


Что RunAsDate делает следующее:

RunAsDate перехватывает вызовы API ядра, которые возвращают текущую дату и время (GetSystemTime, GetLocalTime, GetSystemTimeAsFileTime), и заменяет текущую дату / время указанной вами датой / временем.

Под Linux у вас есть несколько вариантов, чтобы выполнить то же самое:

  1. Если вы можете получить версию программы для Windows, вы можете запустить RunAsDate под Wine (но следите за недавней ошибкой).

  2. Найдите для этого библиотеку-обертку или напишите свою. Некоторые варианты приведены ниже.

  3. Используйте виртуальную машину. Это излишне, но, поскольку ОС в гостевой виртуальной машине полностью отделена от базового хоста, вы можете установить системное время на что-то совершенно другое. Это может быть быстрее настроить, чем другие параметры.


Вариант 2 может быть реализован разными способами, в зависимости от того, что вы пытаетесь запустить. Ответ DaveParillo ниже ссылается на самодельный подход, который объясняет различные методы и включает в себя код для исполняемого файла. Некоторые другие варианты включают в себя:

  • datefudge, доступный в репозиториях Debian/Ubuntu и других местах.

  • Perl-модуль Time-Fake, также в репозиториях Debian как пакет libtime-fake-perl.

  • Библиотека предварительной загрузки FakeTime (также известная как libfaketime , ссылка на freshmeat), библиотека, которая может перехватывать системные вызовы в динамически связанных двоичных файлах. Доступно в репозиториях Debian для Squeeze и Sid.

5

Поскольку ваш комментарий к Дэну МакГу, кажется, указывает на то, что вы используете Ubuntu в качестве гостя VirtualBox, если вы установили гостевые дополнения VirtualBox, они автоматически синхронизируют время гостя с временем хоста.

ps -ef | grep VBoxService

должен показать запущенную службу дополнений гостя VirtualBox.

Вы можете попробовать:

sudo /etc/init.d/vboxadd-service stop

остановить его до перезагрузки.

3

Быстрый ответ: отключите сетевое соединение :)

3

Вы также можете посмотреть на libfaketime , который упакован в Ubuntu/Debian.

Это позволяет вам подделывать системное время для программы без необходимости изменять системное время (перехватывая системные вызовы с помощью LD_PRELOAD)

2

Вы можете запустить VBoxManage setextradata <guest-vm-name> "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled" 1 в операционной системе своего хоста, чтобы отключить автоматическую синхронизацию времени.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .