Как мне диагностировать зависание при выключении?
Так как один или два месяца назад мой ноутбук с Ubuntu 12.10x64 зависает во время выключения. Там просто черный экран, нет активности жесткого диска, он просто сидит там. Я чувствую, что это происходит в конце нормального цикла выключения, судя по прошедшему времени.
Только разрешение - принудительное отключение питания (удерживая кнопку питания в течение нескольких секунд) - ни Ctrl-Alt-Backspace (который обычно работает, я его включил в настройках), ни Ctrl-Alt-Del не помогают, и я не могу войти в текст консоль с Ctrl-Alt-F1.
Как мне это диагностировать? Это происходит не при каждом отключении, но достаточно часто, чтобы раздражать (поскольку, конечно, оно вызывает проверку диска при перезагрузке).
Какие файлы журнала могут сказать мне, что идет не так? Более или менее слепой поиск в программе просмотра журнала sys напоминает мне иголки в стоге сена.
Я полагаю, что могу точно определить время, когда это происходит, с помощью временных меток журнала, но как мне прочитать метки времени, например, в kern.log
: [36169.146130]
? Как мне получить это читаемым человеком?
Наконец, немного кстати, мне никогда не удавалось выполнить Alt-Sysrq-REISUB для принудительного более полного отключения, но это, вероятно, потому что я на ноутбуке, PrintScr доступен только через Fn
ключ, и я не уверен, какая именно последовательность клавиш мне нужна. Есть ли "безвредная", но видимая пользователем магическая команда, с которой я мог бы практиковать это (во время нормальной работы), чтобы я мог узнать, как сделать REISUB в следующий раз?
Спасибо всем! Прокомментируйте, если вам нужны дополнительные данные...
3 ответа
Вы должны выключиться без заставки и из командной строки, чтобы увидеть, что происходит. Сначала вам нужно отключить всплеск через GRUB (см. Подробное отключение)
Загрузитесь и удерживайте SHIFT, чтобы войти в Grub. Нажмите в то время как над записью Linux, чтобы редактировать ее. Затем перейдите к строке ядра (нажмите END, чтобы перейти к концу строки) и удалите аргументы "quiet" и "splash". Фактически, для этого теста пропустите GUI вместе и добавьте аргумент "текст". (Без этого вы можете попасть в командную строку с помощью CTRL+ALT+F1)
Войдите, затем введите:
sudo shutdown -v -h now
(-v для многословия, -h для остановки.)
Файлы журнала ядра в /var/log/kern.log должны содержать удобочитаемые метки времени. Откройте их с помощью программы просмотра файлов журнала.
gnome-system-log
(Файл> открыть) И вы должны увидеть удобочитаемую отметку времени слева. Если вы до сих пор не видите удобочитаемых человеком, этот парень создал несколько сценариев Python/ Perl для их анализа.
Отвечу на ваши вопросы в порядке возрастания сложности/подробности.
Какие файлы журналов могут сказать мне, что происходит не так?
Извините за расплывчатость, но это действительно зависит. Причин различных типов зависаний может быть множество. Например: ошибки драйвера графического процессора, нехватка памяти, места на диске или подкачке, форк-бомбы и перегрузки процессора, ошибки ядра, зависание процесса завершения работы и т. д.
Вы можете сузить список вещей, на которые следует обратить внимание, узнав больше о симптомах и конкретной проблеме (например, зависаниях, связанных с завершением работы), а также о том, какие подсистемы, процессы и журналы связаны с этой конкретной проблемной областью. Например, при зависаниях, связанных с завершением работы, посмотрите:
- Журналы ядра (,
/var/log/kern.log
,journalctl --dmesg --boot[=[ID][±offset]|all]
) - Плимутские бревна (
/var/boot/log
) - SystemD (в частности:
systemd-shutdown
) (journalctl --boot[=[ID][±offset]|all]_PID=1
,journalctl --list-boots
для удостоверений личности, а иногда/var/log/syslog
) - (также должен выводиться в кольцевой буфер ядра)
как мне прочитать временные метки, например, в kern.log: [36169.146130]? Как мне сделать это понятным для человека?
Чтобы просмотреть журналы ядра (для текущей загрузки) с удобочитаемыми временными метками:
sudo dmesg -H
sudo journalctl -b 0 -xn10000 --dmesg
Чтобы просмотреть журналы ядра последней загрузки (текущая загрузка0
минус1
):
sudo journalctl -b -1 -xn10000 --dmesg
Временные метки в журнале ядра указаны в секундах с момента последней загрузки. Вы заметите на равнинеsudo dmesg
вывод, что временная метка всегда начинается с[ 0.000000]
с линиейLinux version x.x.x-x
, и оттуда увеличивается. Причина, по которой временные метки по умолчанию устанавливаются таким образом, заключается в том, что во время загрузки ядра Linux многие события происходят очень быстро. Скорость процессора позволяет выполнять множество команд за микросекунды. На этом уровне детализации времени печать полной даты/временной метки была бы довольно бессмысленной.
Вы всегда можете попросить распечатать в удобочитаемом виде с помощью-H
/--human
флаг, который является псевдонимом для --color
,--reltime
и--pager
.
Как мне это диагностировать?
Существует несколько способов устранения проблем с выключением, зависанием и зависанием. Файлы журналов, которые нужно просмотреть, будут зависеть от того, где находится основная причина проблемы:
- Проблемы с ядром (графический процессор или другие драйверы, ошибки ядра)
- Проверьте вывод в конце загрузки, где он висит.
- Либо отключите заставку, удалив параметры загрузки, либо переключите текстовую загрузку , нажав стрелку вправо.
→
илиEscape
- Если у вас есть
plymouth
заставка работает(quiet splash
в/etc/default/grub
по умолчанию) - Бегать:
sudo update-grub
после изменения этого файла, чтобы применить изменения в сгенерированном/boot/grub
конфиги.
- Если у вас есть
- Если вы используете SystemD, вы можете оставить здесь скрипт, который будет выполняться при завершении работы:
/usr/lib/systemd/system-shutdown/debug.sh
Этот совет указан на странице FreeDesktop.org: Отладка SystemD.
Установите и загрузитесь с параметрами отладки:
systemd.log_level=debug systemd.log_target=kmsg log_buf_len=1M printk.devkmsg=on enforcing=0
Рекомендуемый пример сценария для устранения проблем с завершением работы ядра:
#!/bin/sh mount -o remount,rw / dmesg > /shutdown-log.txt mount -o remount,ro /
Возможно, вы захотите заменить
dmesg
сdmesg --human --nopager
для удобочитаемых временных меток.Примечание. Временные метки будут отображаться каждые несколько секунд, а остальные сообщения быстрой загрузки под каждой полной временной меткой по-прежнему будут иметь наносекундное разрешение, обозначаемое следующим образом:
+0.002567
например.
- Перезагрузитесь и найдите таймауты, записанные в результирующем файле:
/shutdown-log.txt
Наконец, содержит полезную информацию о различных уровнях зависаний, с которыми вы можете столкнуться. В нем также перечислены некоторые другие методы извлечения сообщений ядра Linux, которые являются более продвинутыми, поскольку для них могут потребоваться два компьютера (netconsole
, SSH) или соединение IEEE1394 Firewire (firescope
), либо RS-232 или другая последовательная консоль. SSH также является немного более простым вариантом, который я не перечислил, потому что SSH отключается во время завершения работы, он не всегда доступен в зависимости от уровня зависания, а также требует двух компьютеров (настройте сервер OpenSSH на целевом сервере, подключите к нему удаленный SSH). использование другого компьютера в качестве клиента).
Отладочная оболочка SystemD
Следуйте инструкциям, чтобы включить оболочку отладки, затем нажмите
Ctrl+Alt+F9
чтобы переключиться на него.Обратите внимание: если вы сделаете это во время завершения работы, вы можете повлиять на файлы, используемые в корневой или поворотной корневой точке монтирования. Просто имейте в виду, что вы можете вызвать появление сообщений, которые в противном случае не появились бы, и они могут быть отвлекающим маневром (или Heisenbug... поскольку вы вызываете их, будучи наблюдателем и удерживая оболочку открытой во время выключения, тыкая что-то) .
Обязательно отключите это, когда закончите! Если этот параметр включен, он создает угрозу безопасности, поскольку любому, у кого есть физический доступ, не нужен пароль root:
systemctl disable debug-shell
Скрипты Finalrd Hook
- Видеть:
man finalrd
(или Finalrdдокументацию Ubuntu здесь) - Чтобы использовать этот метод, поместите скрипт в
/etc/finalrd/
с любым именем, если оно заканчивается на.finalrd
суффикс. - Вы можете комбинировать этот метод с «
/shutdown-log.txt
" метод из №1 выше, чтобы просмотреть выходные данные позже. (Это может быть полезно, если буфер прокрутки не включен во время выключения...Shift+PgUp
не всегда работает). - Примечание: вам придется создать сценарий таким образом, чтобы «загружать» любые двоичные файлы, которые вы хотите запустить в сценарии во время
setup
фазовый крючок.Это означает, что, поскольку во время завершения работы корневая точка монтирования перемонтируется как
/oldroot
Другими словами: инициализация SystemD переходит в новое место и перемещает старую корневую файловую систему в другое место (также известное как « основной корень »).
По этой причине любые двоичные файлы, которые вы ожидаете увидеть в сценарии оболочки,
PATH
их больше нет.Например:: Чтобы запустить несколько инструментов, покажите, какие процессы используют файлы в
/
root и показать точки монтирования, создайте такой скрипт:#!/bin/sh # SPDX-License-Identifier: GPL-3.0-only # Copy executables during finalrd setup phase if [ "$1" = "setup" ] then . /usr/share/initramfs-tools/hook-functions copy_exec /usr/bin/lsof copy_exec /usr/bin/mount copy_exec /usr/bin/grep exit 0 fi echo '------------ WHAT ELSE IS USING OLDROOT? ------------' echo '' # List everything except filter out kworker tasks lsof . | grep -v kworker echo '------------ WHAT IS MOUNTED? ------------' mount exit 0
- Видеть:
Мне никогда не удавалось выполнить Alt-Sysrq-REISUB для принудительного завершения работы, но, вероятно, это потому, что я работаю на ноутбуке.
Да, вы, вероятно, правы. На многих современных клавиатурах этой клавиши больше нет... к большому неудовольствию пользователей Linux и разработчиков ядра. Я бы посоветовал найти дополнительную клавиатуру с этой клавишей. Я использую старую клавиатуру PS/2, которую оставляю подключенной к задней панели HTPC, а кабель прокладываю в ящик под подставкой телевизора. Вероятно, вы сможете найти такую клавиатуру на гаражной распродаже или в Интернете по очень доступной цене. Для ноутбука вам понадобится разъем USB-PS/2 или встроенная USB-клавиатура с ключом.
Почему PS/2?: Эти старые порты нечасто встречаются на ноутбуках, однако на современных ПК они все еще часто есть. Если вы можете использовать порт PS/2 для комбинаций волшебных клавиш, сделайте это! Причина проста: PS/2 надежнее , а USB часто может не работать во время зависаний из-за особенностей опроса. PS/2 обрабатывается на уровне прерываний и часто может вытеснять другие задачи, что особенно полезно в ядрах Linux реального времени. К сожалению, для ноутбуков USB часто является единственным вариантом, а адаптеры USB-PS/2 по-прежнему представляются системе как стандартные USB-HID и опрашиваются.
Когда что-то зависает, я открываю ящик с клавиатурой PS/2 и используюAlt+SysRq+
r
,e
,i
,s
,u
,b
в этом порядке, возможно, нажимая каждую кнопку несколько раз, просматривая журналы ядра, чтобы увидеть, реагирует ли ядро на команды. Я заметил, что некоторые драйверы ядра зависают, ядро сильно нагружает процессор, и иногда нажатия клавиш не вызывают ответа с первого раза.
Есть ли «безобидная», но видимая пользователю магическая команда, с которой я мог бы попрактиковаться в этом (во время нормальной работы), чтобы узнать, как выполнить REISUB в следующий раз?
Большинство команд в целом безобидны, за исключением случаев, когда вы цените свои данные и нажимаетеAlt+SysRq+b
перед синхронизацией всех дисковых кешей на диск с помощьюAlt+SysRq+s
. Большинство команд обычно отключены по умолчанию через/proc/sys/kernel/sysrq
биты маски. Если вы знаете, что одна из этих комбинаций клавиш замаскирована, вы можете нажимать ее сколько угодно, и ядро просто выведет это сообщение:
sysrq: эта операция sysrq отключена.
Чтобы использовать это, просто проверьтеcat /proc/sys/kernel/sysrq
выход. В Ubuntu установлено следующее:244
. Итак, в этих системах команда замаскирована:
256 = 0x100 - allow nicing of all RT tasks
Источник: Документы ядра Linux: Magic SysRq Key.
Итак, в системе с этой битовой маской я могу нажать все, что захочу, а ядро просто скажет, что операция отключена. Вероятно, это самый надежный способ проверить, реагирует ли ядро на комбинацию клавиш.
В одном терминале запустите:
sudo dmesg -H --nopager --follow
Нажмите отключенную ключевую команду (например:
Alt+SysRq+n
)Ищите "
sysrq: This sysrq operation is disabled.
" выход.
Если ядро не отвечает, то либо:
-
CONFIG_MAGIC_SYSRQ
опция ядра была отключена во время компиляции - Клавиатура не имеет
SysRq
ключ, не подключен или не отправляет правильный код ключа - Ядро зависло на «уровне 8» или выше (согласно системе классификации страница HangDiagnosis FreeDesktop.orgFreeDesktop HangDiagnosis ).
У меня есть эта проблема. Отключение 3D-ускорения в Bios, похоже, решает проблему.
Нажмите F1 или F2 при запуске (или в системных настройках в grub) и отключите 3D-ускорение. Дайте мне знать, если это решит проблему. Я пробовал три или четыре отключения без проблем, но проблема может вернуться.