<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>http://lorwiki.zhbert.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9A%D0%B0%D0%BA_%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C_%D1%81%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%BC%D0%BE%D0%B5_%D0%B1%D1%83%D1%84%D0%B5%D1%80%D0%B0_%D1%8F%D0%B4%D1%80%D0%B0_%D1%81_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D1%88%D0%B5%D0%B9_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B</id>
	<title>Как получить содержимое буфера ядра с зависшей системы - История изменений</title>
	<link rel="self" type="application/atom+xml" href="http://lorwiki.zhbert.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9A%D0%B0%D0%BA_%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C_%D1%81%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%BC%D0%BE%D0%B5_%D0%B1%D1%83%D1%84%D0%B5%D1%80%D0%B0_%D1%8F%D0%B4%D1%80%D0%B0_%D1%81_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D1%88%D0%B5%D0%B9_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B"/>
	<link rel="alternate" type="text/html" href="http://lorwiki.zhbert.ru/index.php?title=%D0%9A%D0%B0%D0%BA_%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C_%D1%81%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%BC%D0%BE%D0%B5_%D0%B1%D1%83%D1%84%D0%B5%D1%80%D0%B0_%D1%8F%D0%B4%D1%80%D0%B0_%D1%81_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D1%88%D0%B5%D0%B9_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B&amp;action=history"/>
	<updated>2026-10-12T23:48:22Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.39.0</generator>
	<entry>
		<id>http://lorwiki.zhbert.ru/index.php?title=%D0%9A%D0%B0%D0%BA_%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C_%D1%81%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%BC%D0%BE%D0%B5_%D0%B1%D1%83%D1%84%D0%B5%D1%80%D0%B0_%D1%8F%D0%B4%D1%80%D0%B0_%D1%81_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D1%88%D0%B5%D0%B9_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B&amp;diff=297&amp;oldid=prev</id>
		<title>Admin: 1 версия импортирована</title>
		<link rel="alternate" type="text/html" href="http://lorwiki.zhbert.ru/index.php?title=%D0%9A%D0%B0%D0%BA_%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C_%D1%81%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%BC%D0%BE%D0%B5_%D0%B1%D1%83%D1%84%D0%B5%D1%80%D0%B0_%D1%8F%D0%B4%D1%80%D0%B0_%D1%81_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D1%88%D0%B5%D0%B9_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B&amp;diff=297&amp;oldid=prev"/>
		<updated>2023-02-27T18:39:17Z</updated>

		<summary type="html">&lt;p&gt;1 версия импортирована&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 21:39, 27 февраля 2023&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://lorwiki.zhbert.ru/index.php?title=%D0%9A%D0%B0%D0%BA_%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C_%D1%81%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%BC%D0%BE%D0%B5_%D0%B1%D1%83%D1%84%D0%B5%D1%80%D0%B0_%D1%8F%D0%B4%D1%80%D0%B0_%D1%81_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D1%88%D0%B5%D0%B9_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B&amp;diff=296&amp;oldid=prev</id>
		<title>lor&gt;Cetjs2: Откат правок Abc123456 (обсуждение) к версии Cetjs2</title>
		<link rel="alternate" type="text/html" href="http://lorwiki.zhbert.ru/index.php?title=%D0%9A%D0%B0%D0%BA_%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C_%D1%81%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%BC%D0%BE%D0%B5_%D0%B1%D1%83%D1%84%D0%B5%D1%80%D0%B0_%D1%8F%D0%B4%D1%80%D0%B0_%D1%81_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D1%88%D0%B5%D0%B9_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B&amp;diff=296&amp;oldid=prev"/>
		<updated>2018-05-04T11:20:34Z</updated>

		<summary type="html">&lt;p&gt;Откат правок &lt;a href=&quot;/index.php/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Abc123456&quot; title=&quot;Служебная:Вклад/Abc123456&quot;&gt;Abc123456&lt;/a&gt; (&lt;a href=&quot;/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Abc123456&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Обсуждение участника:Abc123456 (страница не существует)&quot;&gt;обсуждение&lt;/a&gt;) к версии &lt;a href=&quot;/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Cetjs2&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Участник:Cetjs2 (страница не существует)&quot;&gt;Cetjs2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Введение =&lt;br /&gt;
&lt;br /&gt;
Когда происходит неисправимая ошибка в ядре, оно переходит в состояние, называемое kernel panic. Стандартный обработчик выводит на экран информацию, которая должна помочь в решении проблемы, и входит в бесконечный цикл. Зачастую этой информации недостаточно для идентификации проблемы, а буфер ядра (dmesg) оказывается потерян. Кроме того, в силу различных причин, стандартный обработчик не всегда может переключить видеоадаптер в текстовый режим, и из той информации не видно вообще ничего.&lt;br /&gt;
&lt;br /&gt;
В этой ситуации обычно советуют использовать консоль, подключенную последовательному порту (COM), так как это единственный надёжный способ получить сообщение от запаниковавшего ядра. В зависимости от характера бага, к моменту вызова ''panic()'' &amp;lt;ref&amp;gt;функция реализующая состояние kernel panic&amp;lt;/ref&amp;gt; прерывания могут быть блокированы и отсылка сообщения по сети (удалённый syslog), может быть невозможна. Однако не всегда есть второй компьютер для отладки и не всегда есть COM-порт (большинство ноутбуков). В этом случае поможет использование метода &amp;quot;crash kernel&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем команды будут указаны для Debian. Предполагается, что на машине установлены пакеты ''fakeroot'', ''kernel-package''. &amp;lt;ref&amp;gt;Возможно понадобится что-то ещё, не могу сразу вспомнить. Правки приветствуются.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= crash kernel =&lt;br /&gt;
&lt;br /&gt;
Вкратце метод состоит в следующем: подготавливаются два ядра, system kernel &amp;amp;mdash; основное и dump kernel &amp;amp;mdash; ядро для сбора дампа памяти. При загрузке основного ядра резервируется память, куда впоследствии загружается dump kernel. В функции panic() есть код, загружающий dump kernel с помощью kexec. Так как память под dump kernel резервируется заранее, при загрузке оно не трогает память основного ядра, но имеет к нему доступ через специальный файл /proc/vmcore.&lt;br /&gt;
&lt;br /&gt;
System- и dump- ядра могут быть одним и тем же ядром. &lt;br /&gt;
&lt;br /&gt;
== Требования к system kernel ==&lt;br /&gt;
&lt;br /&gt;
Нужно включить:&lt;br /&gt;
# &amp;quot;kexec system call&amp;quot; в разделе &amp;quot;Processor type and features.&amp;quot; (CONFIG_KEXEC=y)&lt;br /&gt;
# &amp;quot;sysfs file system support&amp;quot; в разделе &amp;quot;Filesystem&amp;quot; &amp;amp;rarr; &amp;quot;Pseudo filesystems&amp;quot; (CONFIG_SYSFS=y)&lt;br /&gt;
# &amp;quot;Compile the kernel with debug info&amp;quot; в разделе &amp;quot;Kernel hacking&amp;quot; (CONFIG_DEBUG_INFO=Y)&lt;br /&gt;
&lt;br /&gt;
== Требования к dump kernel ==&lt;br /&gt;
&lt;br /&gt;
Нужно включить:&lt;br /&gt;
# поддержку high memory в разделе &amp;quot;Processor type and features&amp;quot; (CONFIG_HIGHMEM64G=y или CONFIG_HIGHMEM4G)&lt;br /&gt;
# &amp;quot;Build a relocatable kernel&amp;quot; в разделе &amp;quot;Processor type and features&amp;quot; (CONFIG_RELOCATABLE=y)&lt;br /&gt;
# &amp;quot;kernel crash dumps&amp;quot; в разделе &amp;quot;Processor type and features&amp;quot; (CONFIG_CRASH_DUMP=y)&lt;br /&gt;
# &amp;quot;/proc/vmcore support&amp;quot; в разделе &amp;quot;Filesystems&amp;quot; &amp;amp;rarr; &amp;quot;Pseudo filesystems&amp;quot; (CONFIG_PROC_VMCORE=y)&lt;br /&gt;
&lt;br /&gt;
По желанию, можно выключить SMP (CONFIG_SMP=n). Можно не выключать, а загружать dump ядро с параметром maxcpus=1. &amp;quot;high memory&amp;quot; для x86_64 не нужно.&lt;br /&gt;
&lt;br /&gt;
= Сборка ядра =&lt;br /&gt;
&lt;br /&gt;
В некоторых дистрибутивах эти параметры задействованы по умолчанию, и всё работает из коробки &amp;lt;ref&amp;gt;вроде бы, в RHEL&amp;lt;/ref&amp;gt;, но в Debian это не так, ядро нужно компилировать вручную. Два ядра собирать не обязательно, будем собирать одно.&lt;br /&gt;
&lt;br /&gt;
Желательно использовать максимально близкую версию ядра, либо взять версию из дистрибутива, конфигурацию взять текущую. Далее, как обычно:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ make menuconfig&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
устанавливаем параметры, указанные и для system и для dump ядер. Собираем собственно ядро:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ CONCURRENCY_LEVEL=3 make-kpkg --revision 1 --append-to-version -crsh --initrd --rootcmd fakeroot kernel_image kernel_headers&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если нет необходимости собирать сторонние модули под новое ядро, параметр ''kernel_headers'' можно опустить. После запуска компиляции можно расслабиться, откинуться на кресле и наблюдать за процессом компиляции. Через некоторое время рядом с директорией с исходниками ядра будет сформировано два (один, если опущено ''kernel_headers'') .deb файла. Это ядро с модулями и заголовки ядра. Оба нужно установить. Из директории, в которой проходила сборка, для отладки могут понадобиться: файл vmlinux &amp;amp;mdash; несжатое ядро с отладочными символами, файлы модулей &amp;amp;mdash; модули с отладочными символами. &amp;lt;ref&amp;gt;Мой опыт закончился на вытаскивании буфера ядра, поэтому что с ними делать, в подробностях я не знаю.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Настройка загрузки =&lt;br /&gt;
&lt;br /&gt;
Dump ядро загружается в специальную область памяти, которую нужно специально выделить при загрузке основного ядра. Это можно сделать, указав в параметрах ядра (в загрузчике)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
crashkernel=128M&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Эта опция откусывает 128 МиБ оперативной памяти, резервируя её для dump ядра. Опыт показывает, что указывать значения, меньшие 128 МиБ для x86_64 не имеет смысла, так как при меньшем объёме (проверялось =64 МиБ) и на стабильном железе ядро может выдать несколько oops'ов ввиду нехватки памяти. Через @ можно указать точное место, куда будет грузиться ядро, но с включенной опцией CONFIG_RELOCATABLE в этом нет необходимости.&lt;br /&gt;
&lt;br /&gt;
После того, как память выделена, нужно настроить загрузку ядра и сохранение дампа. Большинство действий автоматизируется с использованием пакетов ''kexec-tools'' и ''kdump-tools'', их нужно установить:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install kexec-tools kdump-tools&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''kexec-tools'' содержит ''/sbin/kexec'', используемую для загрузки ядер и как бонус &amp;amp;mdash; возможность быстрой перезагрузки (без запуска BIOS POST). В ''kdump-tools'' есть всё необходимое для снятия дампа памяти и автоматической загрузки dump ядра в зарезервированную память.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы всё это заработало, нужно в файле ''/etc/default/kdump'' заменить ''USE_KDUMP=0'' на ''USE_KDUMP=1''.&lt;br /&gt;
&lt;br /&gt;
Перезагрузиться. Теперь при падении ядра в панику будет загружаться dump ядро, в котором автоматически будет производиться сохранения дампа памяти в ''/var/crash''.&lt;br /&gt;
&lt;br /&gt;
= Особые настройки =&lt;br /&gt;
&lt;br /&gt;
Настройки по умолчанию - это скучно. К тому же не всегда нужно сохранять всю память, даже в сжатом виде это может занять много места.&lt;br /&gt;
Мне нужно было сохранять только буфер ядра, причём делать это в автоматическом режиме &amp;amp;mdash; видеоадаптер не инициализируется, ничего не видно и приходится действовать вслепую.&lt;br /&gt;
&lt;br /&gt;
Для реализации этого нужно в /etc/default/kdump-tools дописать:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
KDUMP_CMDLINE_APPEND=&amp;quot;irqpoll maxcpus=1 nousb panicreboot 4 &amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
а в ''/etc/rc.local'' добавить:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if grep panicreboot /proc/cmdline &amp;gt; /dev/null 2&amp;gt;&amp;amp;1 ; then&lt;br /&gt;
    echo &amp;quot;panic reboot at `date`&amp;quot; &amp;gt;&amp;gt; /var/log/panic.log&lt;br /&gt;
    LOGDIR=/var/crash/`date +%Y-%m-%d_%H-%M-%S`&lt;br /&gt;
    mkdir -p $LOGDIR&lt;br /&gt;
    /usr/bin/makedumpfile --dump-dmesg /proc/vmcore $LOGDIR/dmesg.log&lt;br /&gt;
    /bin/sync&lt;br /&gt;
    echo panic logging done&lt;br /&gt;
    /sbin/poweroff&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
код в ''/etc/rc.local'' проверяет, есть ли в параметрах ядра строка panicreboot и если есть, сохраняет буфер ядра и выключает компьютер. Добавленная в ''/etc/default/kdump-tools'' строчка передаёт dump ядру параметр panicreboot и устанавливает целевой runlevel 4. Польза от загрузки в runlevel отличный от основного состоит в возможности отключить все ненужные для сброса дампа сервисы. Это можно сделать при помощи утилиты ''sysv-rc-conf''.&lt;br /&gt;
= Возможные ошибки =&lt;br /&gt;
&lt;br /&gt;
В некоторых версиях (обнаружено в 3.2.x) CONFIG_DEBUG_PAGEALLOC=y приводит к неработоспособности panic kexec. Обычная перезагрузка через kexec работает.&lt;br /&gt;
&lt;br /&gt;
= Что делать дальше =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если всё сделано правильно, у вас на руках есть буфер ядра со всеми сообщениями вплоть до вызова ''panic()''. В большинстве случаев это указывает на непосредственную причину неисправности. Если вы сохранили дамп памяти, можно загрузить его в gdb как обычный core файл (для этого и понадобится vmlinux с символами) и посмотреть backtrace всех нитей. Возможно это даст более подробную картину.&lt;br /&gt;
&lt;br /&gt;
= Альтернативный вариант (Если нужно только текст падения - регистр и стек) =&lt;br /&gt;
&lt;br /&gt;
Можно воспользоваться ramoops (начиная с 3.10)&lt;br /&gt;
&lt;br /&gt;
Настройка проста&lt;br /&gt;
&lt;br /&gt;
1) Конфигурация ядра&lt;br /&gt;
(в Miscellaneous filesystems )&lt;br /&gt;
&lt;br /&gt;
'''CONFIG_PSTORE_CONSOLE=y'''&lt;br /&gt;
&lt;br /&gt;
'''CONFIG_PSTORE_RAM=m|y'''&lt;br /&gt;
&lt;br /&gt;
2) Параметры ядра&lt;br /&gt;
&lt;br /&gt;
'''memmap=256K$0xfc0000 ramoops.mem_address=0xfc0000 ramoops.mem_size=0x40000'''&lt;br /&gt;
&lt;br /&gt;
Если используется grub или grub2, то не забывайте экранировать «$»&lt;br /&gt;
&lt;br /&gt;
3) При старте системы&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[ -d /dev/pstore ] || mkdir /dev/pstore || exit 1&lt;br /&gt;
mount -t pstore none /dev/pstore&lt;br /&gt;
#если ramoops модуль то&lt;br /&gt;
modprobe ramoops mem_address=0xfc0000 mem_size=0x40000&lt;br /&gt;
&lt;br /&gt;
#получаем старые сообщения с консоли и если был дамп, то его сообщения&lt;br /&gt;
D=&amp;quot;`date +%Y%m%d%H%M%S`&amp;quot;&lt;br /&gt;
[ -f /dev/pstore/console-ramoops ] &amp;amp;&amp;amp; cp /dev/pstore/console-ramoops /var/log/ramoops.$D.console-ramoops&lt;br /&gt;
for i in /dev/pstore/dmesg-ramoops-* ; do&lt;br /&gt;
    [ -n &amp;quot;$i&amp;quot; -a -f &amp;quot;$i&amp;quot; ] || continue&lt;br /&gt;
    cp &amp;quot;$i&amp;quot; /var/log/ramoops.$D.${i##*/} &amp;amp;&amp;amp; rm &amp;quot;$i&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
#включаем &amp;quot;kernel panic&amp;quot;&lt;br /&gt;
echo 30 &amp;gt;/proc/sys/kernel/panic&lt;br /&gt;
# паника при первом oops (нужна не всем)&lt;br /&gt;
echo 1 &amp;gt;/proc/sys/kernel/panic_on_oops&lt;br /&gt;
echo 1 &amp;gt;/proc/sys/kernel/panic_on_io_nmi&lt;br /&gt;
echo 1 &amp;gt;/proc/sys/kernel/panic_on_unrecovered_nmi&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ссылки =&lt;br /&gt;
&lt;br /&gt;
# http://www.opennet.ru/base/sys/rhel_kdump_kexec.txt.html&lt;br /&gt;
# http://www.mjmwired.net/kernel/Documentation/kdump/&lt;br /&gt;
&lt;br /&gt;
= Сноски =&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Kernel]]&lt;/div&gt;</summary>
		<author><name>lor&gt;Cetjs2</name></author>
	</entry>
</feed>