Mengapa jurnal systemd saya tidak persisten di seluruh reboot?

8

Saya mengalami masalah yang sangat aneh dengan gambar Fedora 21 baru pada contoh Linode. Saya tidak dapat mereproduksi di luar Linode. Masalahnya adalah bahwa jurnal systemd saya tidak persisten di seluruh reboot. Menurut dokumentasi :

Secara default, jurnal menyimpan data log di / run / log / jurnal /. Karena / run / volatile, data log hilang saat reboot. Untuk membuat data tetap, cukup untuk membuat / var / log / jurnal / di mana systemd-journald kemudian akan menyimpan data.

Saya telah memeriksa bahwa / var / log / jurnal ada dan saya juga telah menetapkan Storage=persistentdi /etc/systemd/journald.conf. Direktori log berisi banyak data:

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

Jurnal, bagaimanapun, hanya berisi entri log sejak sistem restart terakhir:

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

Bahkan jika saya journalctl --flushsebelum saya me-reboot log hilang. Saya menduga ini adalah masalah dengan gambar Fedora 21 Linode, dan saya telah membuka tiket dukungan bersama mereka. Sementara itu, saya terus mencari penyebab masalah ini.

Bagaimana saya bisa men-debug ini? Apa yang bisa menyebabkan ini? Apa yang bisa saya lakukan untuk memperbaikinya?

hedgie
sumber

Jawaban:

14

Alasan untuk perilaku ini adalah bahwa pengidentifikasi mesin /etc/machine-idberubah setiap kali reboot. Ini memulai direktori logging baru di bawah /var/log/journal. Log lama dapat dilihat dengan perintah berikut:

journalctl --merge

Saya masih mencari penyebab id-mesin yang berubah. Dukungan Linode mengetahui masalahnya. Saya akan memperbarui jawaban ini ketika saya tahu lebih banyak.


UPDATE - Akar penyebab masalah adalah karena Linode mem-nolkan konten dari /etc/machine-idgambar sistem file mereka. Hasilnya adalah rangkaian acara berikut:

  1. Kernel memuat dan me-mount sistem file root read-only
  2. systemd, jalankan dari ramdisk awal, mencoba membaca /etc/machine-iddari sistem file root (file ada tetapi isinya nol)
  3. systemd tidak dapat membaca pengenal mesin, tetapi juga tidak dapat menulis yang baru karena sistem file root di-mount hanya-baca
  4. gunung systemd tmpfspada /etc/machine-id(Ya, tampaknya Anda dapat me-mount filesystem ke file )
  5. systemd memanggil systemd-machine-id-setup yang menghasilkan mesin-id acak dan menyimpannya di volatile sekarang/etc/machine-id
  6. Sistem melakukan booting dengan pengidentifikasi mesin yang mudah menguap

Anda dapat memeriksa apakah sistem Anda memiliki volatile, daripada id mesin permanen dengan melihat output dari mount:

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

Masalahnya mudah untuk diperbaiki: cukup tulis mesin-id persisten ke yang asli /etc/machine-id . Ini lebih mudah diucapkan daripada dilakukan, karena Anda tidak dapat melepas tmpfsdari /etc/machine-idpada sistem yang sedang berjalan. Ini adalah langkah-langkah yang saya ambil untuk memperbaikinya di Linode:

  1. cp /etc/machine-id /etc/machine-id.copy, lalu matikan sistem
  2. Di Linode Manager, buka tab Rescue dan boot ke mode rescue
  3. Akses sistem melalui konsol Lish
  4. Pasang sistem file root: mount /dev/xvda /mnt
  5. Pindahkan salinan yang dibuat pada langkah 1 ke mesin-id nyata: mv /etc/machine-id.copy /etc/machine-id
  6. Mulai ulang

Itulah konsekuensi dari id mesin yang hilang saat boot. Saya harap ini akan membantu orang yang lewat secara acak di masa depan.

hedgie
sumber
5
Anda dapat mengubah / etc / machine-id tanpa penyelamatan / reboot menggunakan bind mount dari /:mkdir /tmp/mnt; mount --bind / /tmp/mnt; cp -a /etc/machine-id /tmp/mnt/etc/; umount /tmp/mnt
rudimeier