Почему мой системный журнал не сохраняется после перезагрузки?

8

У меня очень странная проблема со свежим изображением Fedora 21 на экземпляре Linode. Я не могу воспроизвести это за пределами Линоде. Проблема в том, что мой журнал systemd не сохраняется после перезагрузок. Согласно документации :

По умолчанию журнал хранит данные журнала в / run / log / journal /. Поскольку / run / является изменчивым, данные журнала теряются при перезагрузке. Чтобы сделать данные постоянными, достаточно создать / var / log / journal /, где systemd-journald будет хранить данные.

Я проверил, что / var / log / journal существует, и я также установил Storage=persistentв /etc/systemd/journald.conf. Каталог журнала содержит кучу данных:

$ du -sh /var/log/journal/
89M /var/log/journal/

Журнал, однако, содержит только записи журнала с момента последнего перезапуска системы:

$ journalctl --list-boots
 0 9f6a5a789dd64ec0b067140905e6da86 Thu 2015-03-19 15:08:48 GMT—Thu 2015-03-19 22:14:37 GMT

Даже если я journalctl --flushдо перезагрузки логи потеряны. Я подозреваю, что это проблема с изображением Linode's Fedora 21, и я открыл с ними заявку в службу поддержки. Тем временем я продолжаю искать причину этой проблемы.

Как я могу отладить это? Что может вызвать это? Что я могу сделать, чтобы это исправить?

hedgie
источник

Ответы:

14

Причиной такого поведения является то, что идентификатор машины /etc/machine-idизменяется при каждой перезагрузке. Это запускает новый каталог журналирования в /var/log/journal. Старые журналы можно просмотреть с помощью следующей команды:

journalctl --merge

Я все еще выясняю причину смены идентификатора машины. Поддержка Linode знает о проблеме. Я обновлю этот ответ, когда узнаю больше.


ОБНОВЛЕНИЕ - Основная причина проблемы заключается в том, что Линод обнуляет содержимое /etc/machine-idсвоих файловых систем. Результатом является следующая цепочка событий:

  1. Ядро загружает и монтирует корневую файловую систему только для чтения
  2. systemd, запущенный с исходного виртуального диска, пытается прочитать /etc/machine-idиз корневой файловой системы (файл существует, но имеет нулевое содержимое)
  3. systemd не может прочитать идентификатор машины, но также не может записать новый, поскольку корневая файловая система монтируется только для чтения
  4. Systemd монтирует tmpfsна /etc/machine-id(Да, по- видимому , можно смонтировать файловую систему на файл )
  5. systemd вызывает systemd-machine-id-setup, который генерирует случайный идентификатор машины и сохраняет его в энергонезависимой версии/etc/machine-id
  6. Система загружается с идентификатором энергозависимой машины

Вы можете проверить, имеет ли ваша система энергозависимый, а не постоянный идентификатор машины, посмотрев результат mount:

$ mount | grep machine-id
tmpfs on /etc/machine-id type tmpfs (ro,mode=755)

Эту проблему легко решить: просто напишите постоянный идентификатор машины для реального /etc/machine-id . Однако это легче сказать, чем сделать, потому что вы не можете отключиться tmpfsот /etc/machine-idработающей системы. Вот шаги, которые я предпринял, чтобы исправить это на Линоде:

  1. cp /etc/machine-id /etc/machine-id.copyзатем выключите систему
  2. В Linode Manager перейдите на вкладку Rescue и загрузитесь в режим восстановления
  3. Доступ к системе через консоль Lish
  4. Смонтируйте корневую файловую систему: mount /dev/xvda /mnt
  5. Переместите копию, созданную на шаге 1, к реальному идентификатору машины: mv /etc/machine-id.copy /etc/machine-id
  6. перезагрузка

Таковы последствия отсутствия идентификатора машины при загрузке. Я надеюсь, что это поможет случайному прохожему в будущем.

hedgie
источник
5
Вы можете изменить / etc / machine-id без спасения / перезагрузки, используя привязку /:mkdir /tmp/mnt; mount --bind / /tmp/mnt; cp -a /etc/machine-id /tmp/mnt/etc/; umount /tmp/mnt
rudimeier