Запуск клієнта VPN — це зручна позначка часу, а не причина, і саме ця відмінність визначає, що станеться далі. Коли Oops ядра виникає поблизу цього моменту, вибір — між збором придатного звіту про збій і провокуванням того самого збою ще п'ять разів на бойовій машині. Збережіть чотири речі до перезавантаження: точну збірку ядра, першу трасу збою, стан taint і короткий опис усього іншого, що змінилося тієї ж хвилини. Решта — інтерпретація, і вона може зачекати, доки докази не опиняться в безпечному місці.

Упіймайте перший збій, а не останній рядок

Перший Oops у журналі — той, що має значення, бо кожен наступний збій може бути побічною шкодою від уже нездорового ядра. Скопіюйте заголовок разом із трасою викликів, оскільки заголовок несе збійну інструкцію та стан регістрів, що визначає шлях коду. Звіт, який починається з останнього рядка, мало чого вартий для того, хто прочитає його через тиждень.

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

Зафіксуйте збірку, перш ніж читати будь-який символ

Імена функцій і зсуви мають сенс лише щодо бінарного файлу, який їх створив, тому запишіть рядок випуску ядра та ідентифікатор збірки дистрибутива разом. Файл символів з іншої збірки з повною певністю вказує на неправильний рядок, що гірше, ніж зовсім не мати символу. Зберігайте версію пакунка ядра, а не лише номер upstream, бо дистрибутиви багато переносять назад.

Модулі поза деревом заслуговують на окремий рядок у записі, оскільки ядро з taint обмежує те, що супроводжувач має право виснувати. Читайте значення taint, а не виводьте його зі списку модулів.

Ненульовий taint — це не обвинувачення і не робить звіт марним. Він повідомляє читачеві, які компоненти були завантажені в момент збою, і деякі прапорці призводять до того, що звіт знижується в пріоритеті за політикою, а не за рішенням. Запишіть значення, імена модулів і те, чи запускалися колись те саме обладнання й навантаження на ядрі без них. Саме це останнє порівняння відокремлює нову регресію від давньої помилки.

Відокремте тригер від дефекту

Запуск тунелю зазвичай задіює шлях, який уже існував: мережевий драйвер, дисципліну черги, функцію offload або стан живлення. Тригер пояснює, коли збій з'являється, а не який код неправильний, і ставлення до тригера як до причини веде до низки змін конфігурації, які нічого не виправляють.

Робочий попередній образ — це доказ, а не доведення. Під час порівняння змінюйте один компонент на завантаження і зберігайте результати там, де вони переживуть машину.

Перевірте, що супроводжувач справді може використати

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

uname -r
cat /proc/sys/kernel/tainted
journalctl -k -b -1 --no-pager | sed -n '/BUG:/,/Call Trace/p'
dmesg -T | grep -A 40 'RIP:'

Кожна команда вище лише читає стан, і перші дві слід виконати до наступного перезавантаження, якщо машина ще може на них відповісти. Там, де журнал не зберігається, саме ці дві — єдині, що колись знову працюватимуть.

Вилучіть ключі, паролі та сторонній трафік, але збережіть імена функцій і зсуви, потрібні комусь для читання траси. Надсилайте матеріал шляхом звітності, що стосується дистрибутива або ядра, а не через публічну вставку з доданим іменем хоста. Потім чекайте на запитання, а не збирайте нові збої, бо локалізований збій проти відповідної збірки — єдиний результат, який рухає звіт уперед. Якщо нічого не повернеться, запасний варіант — контрольоване відтворення на резервному обладнанні, ніколи на машині, від якої залежать інші люди.

Схожі статті