- Русские Блоги
- Используйте инструмент Crash для анализа файлов дампа Linux
- предисловие
- Механизм дампа памяти ядра
- LKCD
- Diskdump
- Netdump
- Kdump
- MKdump
- Различные инструменты анализа дампов памяти
- Lcrash
- Alicia
- Crash
- Пример использования Crash для анализа файлов дампа памяти
- Настройки установки Kdump
- Установить kexec
- Настройте параметры ядра, необходимые для ядра системы и ядра захвата:
- Настройте независимые от архитектуры параметры для ядра захвата:
- Настройте связанные с архитектурой параметры ядра захвата:
- Загрузите новое системное ядро
- Загрузите ядро захвата
- Запустить панику ядра
- Настройки установки аварийного инструмента
- Создать файл дампа памяти
- Анализ файлов дампа памяти
- постскриптум
Русские Блоги
Используйте инструмент Crash для анализа файлов дампа Linux
предисловие
Ядро Linux (в дальнейшем именуемое ядром) представляет собой набор функций, которые не связаны с конкретным процессом, и код ядра сложно выполнить и отследить в отладчике. Разработчики считают, что если в ядре возникает ошибка, она не должна продолжать работать. Поэтому при возникновении ошибки ядра его поведение обычно устанавливается как сбой системы и перезагрузка компьютера. Исходя из электрических характеристик динамической памяти, после перезапуска машины сцена, в которой произошла последняя ошибка, будет уничтожена, что очень затрудняет поиск ошибки ядра.
Сообщество ядра и некоторые коммерческие компании разработали для этой цели множество технологий и инструментов отладки, надеясь упростить отладку ядра. Одним из них является одноэтапный метод отладки отслеживания, то есть использование отладчика кода для поэтапного отслеживания исполняемого кода и анализа причины ошибки путем просмотра значений переменных и регистров. Отладчиками этого типа являются gdb, kdb, kgdb. Другой способ — сохранить память при сбое системы для последующего анализа. В большинстве случаев одношаговая трассировка может удовлетворить потребности, но у одношаговой отладки отслеживания также есть недостатки. Если вы столкнулись со следующими ситуациями:
- Ошибка произошла на машине клиента.
- Ошибка произошла на критической рабочей машине.
- Ошибки трудно воспроизвести.
Одношаговый метод отслеживания отладки ничего не даст. В этих ситуациях особенно важно выгрузить память для последующего анализа при сбое или сбое ядра. В этой статье будет представлен механизм дампа памяти ядра и его анализ.
Механизм дампа памяти ядра
Из-за открытости Linux в Linux существует несколько механизмов дампа памяти. Следующее кратко представит их соответственно.
LKCD
LKCD (Linux Kernel Crash Dump) — это первый проект дампа памяти аварийного отказа ядра под Linux, который изначально разрабатывался и поддерживался инженерами SGI. Это обеспечивает надежный метод для обнаружения, сохранения и проверки системных сбоев. Как патч ядра Linux, LKCD не был принят в основную линию ядра. В настоящее время проект полностью остановлен в разработке.
Diskdump
Diskdump — это еще одно исправление ядра для дампов памяти ядра, которое было разработано Takao Indoh в 2004 году. По сравнению с LKCD, Diskdump проще. Когда система падает, Diskdump имеет полный контроль над системой. Чтобы избежать путаницы, он сначала отключает все прерывания, а в системах SMP он также отключает другие процессоры. Затем он проверяет свой собственный код, если код отличается от инициализации. Он будет думать, что он был уничтожен, и откажется продолжать бежать. Затем Diskdump выбирает место для сохранения дампа памяти. Diskdump как патч ядра не был принят в основную ветку ядра. Во многих дистрибутивах он поддерживается только RedHat.
Netdump
RedHat предоставляет свой первый механизм дампа памяти для аварийного отказа ядра в своем расширенном сервере Linux версии 2.1: Netdump. В отличие от LKCD и Diskdump, которые хранят дампы памяти на локальных дисках, при сбое системы Netdump сохраняет файлы дампов памяти на удаленном компьютере через сеть. RedHat считает, что использовать сетевой метод проще, чем использовать метод защиты диска, потому что при сбое системы вы можете использовать режим запроса сетевой карты для передачи данных по сети без прерывания. В то же время сетевой метод обеспечивает лучшую поддержку управления файлами дампа памяти. Как и Diskdump, Netdump не был принят в основную линию ядра, и в настоящее время только дистрибутивы RedHat поддерживают Netdump.
Kdump
Kdump — это инструмент дампа памяти, основанный на kexec. В настоящее время он был получен основной веткой ядра и стал частью ядра. Таким образом, он поддерживается большинством дистрибутивов Linux. В отличие от традиционного механизма дампа памяти, системе на основе Kdump для работы требуется два ядра: одно называется системным ядром, то есть ядром, которое работает, когда система работает нормально, другое называется ядром захвата, то есть когда происходит сбой нормального ядра. Ядро используется для дампов памяти. Позже в этой статье будет рассказано, как настроить kump.
MKdump
MKdump (мини-дамп ядра) — это еще один инструмент для дампа памяти ядра, разработанный NTT data и VA Linux. Он похож на Kdump и основан на kexec. Для работы обоих необходимо использовать два ядра. Одно из них — системное ядро, другое — мини-ядро, которое используется для дампа памяти. По сравнению с Kdump он имеет следующие характеристики:
- Сохранить память на диск.
- Вы можете преобразовать образ дампа памяти в поддерживаемый формат lcrash.
- При загрузке через kexec мини-ядро перезаписывает первое ядро.
Различные инструменты анализа дампов памяти
Как и во многих механизмах дампа памяти, в Linux также есть много инструментов анализа дампа памяти, которые будут кратко описаны ниже.
Lcrash
Lcrash — это инструмент для анализа внутренней памяти, выпущенный вместе с LKCD. Поскольку развитие LKCD прекратилось, развитие lcrash также прекратилось. В настоящее время его код был включен в инструмент Crash.
Alicia
Alicia (Advanced Linux Crash-dump Interactive Analyzer) — это инструмент анализа дампа памяти, созданный на основе инструментов lcrash и Crash. Он использует язык Perl для инкапсуляции команд низкого уровня Lcrash и Crash, предоставляя пользователям более дружественный интерактивный режим и интерфейс. Текущее развитие Алисии также остановилось.
Crash
Crash — это инструмент анализа дампа памяти, разработанный и поддерживаемый Дейвом Андерсоном, и его последняя версия в настоящее время 5.0.0. В отсутствие единого стандартного формата файла дампа памяти инструмент Crash поддерживает множество форматов файлов дампа памяти, включая:
- Live Linux система
- Нормальные и сжатые файлы дампа памяти, сгенерированные kdump
- Файл дампа сжатой памяти, сгенерированный командой makedumpfile
- Файл дампа памяти, созданный Netdump
- Файл дампа памяти, созданный Diskdump
- Файл дампа памяти Xen, сгенерированный Kdump
- Файл дампа памяти IBM 390 / 390x
- Файл дампа памяти, сгенерированный LKCD
- Файл дампа памяти, сгенерированный Mcore
Пример использования Crash для анализа файлов дампа памяти
Благодаря предыдущему исследованию вы можете попробовать. Следующая часть этой статьи будет использовать kdump в качестве примера, чтобы показать вам, как настроить систему, как сгенерировать файл дампа памяти и как проанализировать файл дампа памяти.
Настройки установки Kdump
Как упоминалось ранее, системы, поддерживающие kdump, работают с двумя ядрами. В настоящее время некоторые дистрибутивы, такие как RedHat и SUSE Linux, скомпилировали и настроили эти два ядра. Если вы используете другие дистрибутивы Linux или хотите скомпилировать ваше ядро для поддержки kdump, вы можете продолжить, как описано ниже.
Установить kexec
- Войдите в систему как пользователь root.
- Используйте wget для загрузки kexec из Интернета.
1 2 wget http://www.kernel.org/pub/linux/kernel/people/horms/kexec-tools/\ kexec-tools.tar.gz - Разархивируйте и установите kexec в систему.
1 2 3 4 # tar xvpzf kexec-tools.tar.gz # cd kexec-tools-VERSION # ./configure # make && make install
Настройте параметры ядра, необходимые для ядра системы и ядра захвата:
Настройте независимые от архитектуры параметры для ядра захвата:
Настройте связанные с архитектурой параметры ядра захвата:
Ядро Linux поддерживает несколько архитектур процессоров, здесь представлена только конфигурация ядра захвата под i386
- Включить поддержку высокого класса памяти в разделе «Тип процессора и функции».
1 CONFIG_HIGHMEM64G=y - Отключите поддержку многопроцессорных систем в разделе «Тип и функции процессора».
1 CONFIG_SMP=n - Включите «Построить перемещаемое ядро» в «Тип и функции процессора».
1 CONFIG_RELOCATABLE=y - В «Тип и функции процессора» -> «Физический адрес, куда загружено ядро», задайте начальный адрес загрузки для ядра. На большинстве машин 16M является подходящим значением.
1 CONFIG_PHYSICAL_START=0x1000000
Загрузите новое системное ядро
- Скомпилируйте ядро системы и запишите ядро.
- Добавьте перекомпилированное ядро в загрузочную загрузку, стараясь не добавлять ядро захвата в загрузочное меню загрузки.
- Добавьте параметр запуска «crashkernel = Y @ X» в ядро системы, где Y — это память, зарезервированная для дампа для захвата ядра, а X — начальная позиция зарезервированной памяти. На компьютере i386 установите «crashkernel = 64M @ 16M».
- Перезагрузите компьютер и выберите вновь добавленный элемент автозагрузки в меню автозагрузки, чтобы запустить новое ядро системы.
Загрузите ядро захвата
После загрузки ядра системы ядро захвата необходимо загрузить в память. Используйте инструмент kexec для загрузки ядра захвата в память:
Запустить панику ядра
После загрузки ядра захвата в память, если сработал переключатель сбоя системы, система автоматически переключится на ядро захвата. Переключатели, вызывающие сбой системы, включают функции ядра panic (), die (), die_nmi () и события триггера sysrq. Вы можете использовать любой из них для запуска паники ядра. Однако, прежде чем вывести ядро из строя, нам нужно выполнить некоторые установки.
Настройки установки аварийного инструмента
Последняя версия Crash 5.0.0, вы можете скачать последнюю версию с ее официального сайта. После загрузки распакуйте и установите его.
Создать файл дампа памяти
Теперь, когда Kdump и crash установлены, вы можете использовать любой из описанных выше переключателей сбоя системы, чтобы вызвать сбой системы, чтобы сгенерировать файл дампа памяти, и вы можете использовать crash для его анализа.
Во-первых, чтобы вызвать сбой системы, здесь мы используем sysrq для запуска события.
Сразу после этого система автоматически запустит ядро захвата. После полной загрузки ядра захвата сохраните файл дампа памяти с помощью следующей команды.
Файл mydumpfile будет создан в текущем каталоге.
Анализ файлов дампа памяти
Теперь, когда у вас есть файл дампа памяти, используйте crash для его анализа
Здесь vmlinux — ядро с отладочной информацией. Если все в порядке, произойдет сбой, как показано на рисунке 1.
Рисунок 1. Сбой командной строки
В этом приглашении вы можете выполнить внутренние команды сбоя. Через внутреннюю команду crash вы можете просмотреть значение регистра, стек вызовов функции и другую информацию. На рисунке 2 показано выполнение bt Информация о стеке вызова функции, полученная после команды.
Рисунок 2. Информация о стеке вызовов функций
crash использует gdb в качестве внутреннего движка, и многие команды и синтаксис в crash такие же, как gdb. Если вы использовали GDB раньше, вы обнаружите, что падение не является незнакомым. Если вы хотите получить более подробные инструкции о сбое и связанных с ним командах, вы можете использовать внутренние команды сбоя help Получить.
постскриптум
Эта статья знакомит с различными механизмами дампа памяти в Linux и с тем, как инструмент аварийного завершения анализирует файлы дампа памяти. Хотя ядро является сложным, с помощью файла дампа памяти и инструмента анализа сбоев вы легко можете найти проблему с ядром. Изучая эту статью, я считаю, что вы также можете отслеживать и исправлять ошибки ядра, как профессиональный разработчик ядра.