printk - отображается в журнале сообщений, но не отображается в терминале для любого уровня журнала ядра

Я делаю некоторую модификацию ядра и пытаюсь заставить printk выводить информацию обратно на консоль. Я передаю с ним любой уровень журнала ядра и не получаю должного ответа на консоль даже для самых высоких уровней журнала.

Я проверил, и текущая конфигурация журнала для printk — 4 4 1 7.

Он правильно печатает каждый раз в журналы. Я могу использовать dmesg | less и увидеть его добавленным в журнал. Но я не могу правильно вернуть его на консоль с помощью printk.

Я не уверен, что это имеет значение, но я использую SSH для подключения к удаленной машине, на которой существует модифицированное ядро.

Я пробовал SSH с терминала gnome и с замазки в Windows. Ни изменить ничего. По-прежнему показывает printk в журналах сервера, но не на моей консоли.

Есть ли способ вывести его на консоль? Что может быть не так, учитывая, что я пробовал каждый уровень журнала, и ни один из них не работает? СПАСИБО!


person Zach    schedule 31.01.2010    source источник
comment
stackoverflow.com/questions/27903915/   -  person Punit Vara    schedule 14.12.2015


Ответы (6)


Я считаю, что prink регистрирует только физические консоли, если вы хотите отслеживать вывод ядра через произвольный ttys, вам нужно будет использовать tail для отслеживания файла, в который записывается syslog, или приложение, такое как xconsole, которое специально отслеживает / dev/console для сообщений.

person caskey    schedule 31.01.2010
comment
Можно поподробнее про хвост? Я видел, как это упоминалось где-то еще, но не уверен, как я мог вызвать это через код c. По сути, я создал новый системный вызов в Linux и использую пользовательское приложение для вызова системного вызова. Системный вызов использует printk для вывода. Можно ли вызвать хвостовую функцию, которую вы упомянули, через мое приложение после выполнения системного вызова? Спасибо еще раз. - person Zach; 31.01.2010
comment
хвост не функция, это команда оболочки. Попробуйте открыть другое соединение (или экранное окно, или как вы это делаете) и используйте 'tail -f /var/log/dmesg' - person Kevin Lacquement; 31.01.2010

Просто чтобы убедиться, что вы находитесь на уровне инициализации 3 (текстовый режим), не так ли? Если вы запустили startx и работаете в графическом режиме, вы ничего не увидите в терминале.

person Swapnesh    schedule 24.04.2012

Я считаю, что некоторые варианты syslog поддерживают это без внесения изменений в ядро, возможно, путем входа в /dev/ приставка. Есть ли какая-то особая причина, по которой вы пытаетесь изменить ядро ​​для этого? Я думаю, есть более простой способ.

person Steven Schlansker    schedule 31.01.2010
comment
Я делаю новый системный вызов в Linux, и часть его работы будет заключаться в выводе информации на консоль. Я использую printk для вывода информации, и здесь я застрял. printk нужно отправить на консоль, так как я не могу получить доступ к обычному printf - person Zach; 31.01.2010

Некоторые дистрибутивы исправляют printk, чтобы он не отображался (Red Hat был первым, Ubuntu тоже делает это, если честно) - вы, вероятно, попали в это.

person Ana Betts    schedule 31.01.2010

Если это для отладки - просто добавьте /var/log/messages. Если вам нужен стабильный вывод из вашего модуля ядра - создайте символьное устройство или файл под /proc и пусть пользовательский процесс читает оттуда.

person Nikolai Fetissov    schedule 01.02.2010

Попробуйте использовать

dmesg -wH &

чтобы заставить все ваши сообщения ядра, которые печатаются в dmesg (а также виртуальные терминалы, такие как Ctrl+Alt+F1 , в зависимости от вашего уровня журнала /proc/sys/kernel/printk и уровня вашего сообщения), чтобы также появиться на вашей консоли SSH или GUI: Konsole, Terminal или что-то еще, что вы используете! И, если вам нужно отслеживать только определенные сообщения:

dmesg -wH | grep ERR &

Я использую его для отслеживания сообщений «ОШИБКА», например

printk(KERN_EMERG "ERROR!\n");

что я печатаю из своего драйвера

person Mike Banon    schedule 10.08.2018