Часто трапляється, що система Linux перезавантажується незаплановано або через невідомі видимі причини. Пошук і усунення першопричини може допомогти запобігти повторенню таких проблем і уникнути незапланованих простоїв.
Є кілька способів дізнатися, що спровокувало перезавантаження. У цій статті ми обговоримо ці способи та те, як ви можете використовувати доступні утиліти та журнали в системі Linux для усунення таких сценаріїв.
Перевірте час перезавантаження
Ви можете перевірити, коли відбулося перезавантаження системи за допомогою команд who і last
$ who -b system boot 2021-02-13 20:51 $ last -x | head | tac abhishek pts/0 192.168.1.16 Sat Feb 13 19:53 - 19:55 (00:02) reboot system boot 3.10.0-1160.11.1 Sat Feb 13 19:55 - 20:54 (00:58) runlevel (to lvl 3) 3.10.0-1160.11.1 Sat Feb 13 19:55 - 20:04 (00:08) abhishek pts/0 192.168.1.16 Sat Feb 13 19:56 - 20:04 (00:07) reboot system boot 3.10.0-1160.11.1 Sat Feb 13 20:04 - 20:54 (00:49) runlevel (to lvl 3) 3.10.0-1160.11.1 Sat Feb 13 20:04 - 20:51 (00:46) abhishek pts/0 192.168.1.16 Sat Feb 13 20:04 - 20:50 (00:46) reboot system boot 3.10.0-1160.11.1 Sat Feb 13 20:51 - 20:54 (00:03) runlevel (to lvl 3) 3.10.0-1160.11.1 Sat Feb 13 20:51 - 20:54 (00:02) abhishek pts/0 192.168.1.16 Sat Feb 13 20:51 still logged in $
Перевірте системні повідомлення
Ви можете додатково співвіднести перезавантаження, яке ви хочете діагностувати, із системними повідомленнями.
Для систем CentOS/RHEL ви знайдете журнали в /var/log/messages, тоді як для систем Ubuntu/Debian вони реєструються в /var/log/syslog. Ви можете просто скористатися командою tail або вашим улюбленим текстовим редактором, щоб відфільтрувати або знайти певні дані.
Як можна зробити висновок із наведених нижче журналів, такі записи свідчать про завершення роботи/перезавантаження, ініційоване адміністратором або користувачем root. Ці повідомлення можуть відрізнятися залежно від типу ОС і способу запуску перезавантаження/вимкнення, але ви завжди знайдете корисну інформацію, переглянувши системні журнали, хоча вона може бути недостатньою чіткою, щоб щоразу точно вказувати причину.
Feb 13 19:56:20 centos7vm chronyd[637]: Source 72.30.35.89 replaced with 142.147.92.5 Feb 13 20:00:40 centos7vm chronyd[637]: Selected source 162.159.200.123 Feb 13 20:01:01 centos7vm systemd: Created slice User Slice of root. Feb 13 20:01:01 centos7vm systemd: Started Session 2 of user root. Feb 13 20:04:09 centos7vm systemd-logind: System is powering down. Feb 13 20:04:09 centos7vm systemd: Closed LVM2 poll daemon socket. Feb 13 20:04:09 centos7vm systemd: Stopped target Multi-User System.
Нижче наведено одну з таких команд, яку можна використовувати для фільтрації системних журналів:
sudo grep -iv ': starting|kernel: .*: Power Button|watching system buttons|Stopped Cleaning Up|Started Crash recovery kernel' /var/log/messages /var/log/syslog /var/log/apcupsd* | grep -iw 'recover[a-z]*|power[a-z]*|shut[a-z ]*down|rsyslogd|ups'
Зафіксовані події не завжди можуть бути конкретними. Завжди відстежуйте події, які дають ознаки попереджень або помилок, які можуть призвести до вимкнення/збою системи.
Перевірте журнали auditd
Для систем із auditd це чудове місце для перевірки різних подій за допомогою інструменту ausearch. Використовуйте наведену нижче команду, щоб перевірити останні два записи з журналів аудиту.
$ sudo ausearch -i -m system_boot,system_shutdown | tail -4
Це повідомить про два останніх вимкнення або перезавантаження. Якщо це повідомляє про SYSTEM_SHUTDOWN, а потім SYSTEM_BOOT, все повинно бути добре. Але якщо він повідомляє про два рядки SYSTEM_BOOT поспіль або лише про один рядок SYSTEM_BOOT, то, швидше за все, система не завершила роботу належним чином. Звичайний вихід має виглядати приблизно так:
$ sudo ausearch -i -m system_boot,system_shutdown | tail -4 ---- type=SYSTEM_SHUTDOWN msg=audit(Saturday 13 February 2021 A.852:8) : pid=621 uid=root auid=unset ses=unset subj=system_u:system_r:init_t:s0 msg=' comm=systemd-update-utmp exe=/usr/lib/systemd/systemd-update-utmp hostname=? addr=? terminal=? res=success' ---- type=SYSTEM_BOOT msg=audit(Saturday 13 February 2021 A.368:8) : pid=622 uid=root auid=unset ses=unset subj=system_u:system_r:init_t:s0 msg=' comm=systemd-update-utmp exe=/usr/lib/systemd/systemd-update-utmp hostname=? addr=? terminal=? res=success' $
У наведених нижче результатах перелічено два послідовних повідомлення SYSTEM_BOOT, які можуть вказувати на некоректне завершення роботи, хоча це потрібно пов’язати з системними журналами.
$ sudo ausearch -i -m system_boot,system_shutdown | tail -4 ---- type=SYSTEM_BOOT msg=audit(Saturday 13 February 2021 A.852:8) : pid=621 uid=root auid=unset ses=unset subj=system_u:system_r:init_t:s0 msg=' comm=systemd-update-utmp exe=/usr/lib/systemd/systemd-update-utmp hostname=? addr=? terminal=? res=success' ---- type=SYSTEM_BOOT msg=audit(Saturday 13 February 2021 A.368:8) : pid=622 uid=root auid=unset ses=unset subj=system_u:system_r:init_t:s0 msg=' comm=systemd-update-utmp exe=/usr/lib/systemd/systemd-update-utmp hostname=? addr=? terminal=? res=success' $
Проаналізуйте журнал systemd
Ви повинні мати постійний журнал systemd, щоб зберігати постійний журнал на диску, інакше журнали не зберігатимуться після перезавантаження. Для цього ви можете внести зміни в /etc/systemd/journald.conf або створити каталог самостійно за допомогою наведених нижче команд:
$ sudo mkdir /var/log/journal $ sudo systemd-tmpfiles --create --prefix /var/log/journal 2>/dev/null $ sudo systemctl -s SIGUSR1 kill systemd-journald
Після цього ви можете додатково перезавантажити систему, щоб записати більше одного запису про перезавантаження в журналі, хоча це не обов’язково.
Скористайтеся наведеною нижче командою, щоб отримати список зареєстрованих завантажень із журналу:
$ journalctl --list-boots
Ось його вихід на моєму сервері:
$ journalctl --list-boots -15 8a7c8034da804ebb9cb063a7553ed0bf Wed 2020-11-18 23:09:05 IST—Wed 2020-11-18 23:17:10 IST -14 7bbb9542778a4057a91b9d22fcf91735 Wed 2020-11-18 23:17:22 IST—Wed 2020-11-18 23:20:08 IST -13 f2ee8a61bf4c4f67a12e012855d8b1c3 Wed 2020-11-18 23:20:17 IST—Wed 2020-11-18 23:23:01 IST -12 1277d19a959f4c33ba944a68c5874d2a Fri 2020-12-11 10:32:44 IST—Fri 2020-12-11 10:43:39 IST -11 eb4ff97f112445888a5946d1155de1b8 Fri 2020-12-11 10:43:55 IST—Fri 2020-12-11 10:48:18 IST -10 bf46eff3f9a344d2b28a03ffbf7fff32 Fri 2020-12-11 19:04:30 IST—Fri 2020-12-11 19:31:01 IST -9 2acf08368667423c89086579f98efd82 Tue 2020-12-15 17:36:52 IST—Tue 2020-12-15 19:13:10 IST -8 b826f223a67d454b94d4413678870f08 Sat 2020-12-19 00:31:54 IST—Sat 2020-12-19 00:44:52 IST -7 011e1b29339041b0ae48bbb93fce792f Wed 2020-12-23 23:01:15 IST—Wed 2020-12-23 23:02:44 IST -6 f41f5880572e4394938c6dcb4a8b683c Mon 2020-12-28 16:54:11 IST—Mon 2020-12-28 22:54:22 IST -5 a2e638dc292a4db2b0a50dd442129c28 Tue 2020-12-29 17:02:16 IST—Tue 2020-12-29 19:39:38 IST -4 f6c738df872a48d48daee1962727cca5 Wed 2020-12-30 19:09:30 IST—Wed 2020-12-30 19:20:23 IST -3 c876e60ea371460b94e247b40270b18f Thu 2020-12-31 14:36:07 IST—Thu 2020-12-31 15:45:36 IST -2 a23c70804ec243f7868c18737f4b7e55 Sat 2021-02-13 20:09:30 IST—Sat 2021-02-13 20:10:44 IST -1 94b604a6bf75462dac8c4a4576fdc863 Sat 2021-02-13 20:10:59 IST—Sat 2021-02-13 20:23:18 IST 0 3ff7e29fa0a34878b7574b7d4d3ccfb5 Sat 2021-02-13 20:24:57 IST—Sat 2021-02-13 21:13:15 IST $
Як бачите, список триває кілька завантажень. Для подальшого аналізу конкретного перезавантаження використовуйте:
$ journalctl -b {num} -n
Тут {num} буде індексом, указаним у команді journalctl –list-boots у першому стовпці.
$ journalctl -b -1 -n -- Logs begin at Wed 2020-11-18 23:09:05 IST, end at Sat 2021-02-13 21:13:39 IST. -- Feb 13 20:23:18 ubuntumate20vm systemd[1]: lvm2-monitor.service: Succeeded. Feb 13 20:23:18 ubuntumate20vm systemd[1]: Stopped Monitoring of LVM2 mirrors, snapshots etc. using dmeventd or progress polling. Feb 13 20:23:18 ubuntumate20vm systemd[1]: Reached target Shutdown. Feb 13 20:23:18 ubuntumate20vm systemd[1]: Reached target Final Step. Feb 13 20:23:18 ubuntumate20vm systemd[1]: systemd-poweroff.service: Succeeded. Feb 13 20:23:18 ubuntumate20vm systemd[1]: Finished Power-Off. Feb 13 20:23:18 ubuntumate20vm systemd[1]: Reached target Power-Off. Feb 13 20:23:18 ubuntumate20vm systemd[1]: Shutting down. Feb 13 20:23:18 ubuntumate20vm systemd-shutdown[1]: Syncing filesystems and block devices. Feb 13 20:23:18 ubuntumate20vm systemd-journald[304]: Journal stopped $
Ви можете спостерігати за повідомленнями, зареєстрованими в журналі, у вихідних даних вище та відстежувати аномалії, якщо такі є.
Висновок
Не завжди можливо точно визначити причину перезавантаження Linux за допомогою однієї команди або з одного файлу журналу. Таким чином, завжди корисно знати команди та журнали, які фіксують системні події та можуть скоротити час, необхідний для пошуку першопричини.
Наведені вище приклади є відправною точкою для початку усунення несправностей. Використовуючи комбінацію таких інструментів і журналів, ви можете з упевненістю знати, що сталося і як ваша система перезавантажилася.
Далі дізнайтеся про деякі з легких програм моніторингу для Linux.