Библиотека сайта rus-linux.net
Обратная прокрутка текста в консоли Линукс
Оригинал: Linux Console Scrollback
Дата: октябрь 2007
Автор: Anonymous
Свободный перевод: Алексей Дмитриев
Дата перевода 19 ноября 2007
Мы говорим здесь о GNU/Linux текстовой консоли - а не о том, что появляется в окне терминала, или X-window менеджера, или рабочего стола. По этому поводу столько всякой неразберихи, что я вынужден тривиально сказать: - "Если вы, находясь в графическом режиме, нажимаете 'Alt-Ctrl-F1' (или 'F2'и т.д.), то вы попадаете в текстовую консоль".
0. О чем идет речь?
Происходит загрузка компьютера. Вы в текстовой консоли, наблюдаете за быстро проплывающим вниз текстом. Вы хотите просмотреть уже промелькнувший кусок этого текста. Вы нажимаете 'Shift-PgUp' или 'Shift-PgDn', а если раньше уже изменяли сочетания клавиш по умолчанию (нет-нет, не раскладку клавиатуры в Иксах), то какие-либо другие клавиши. Этими клавишами вы заставляете текст перемещаться вверх-вниз по экрану. В данный момент вы используете буфер обратной прокрутки (назовем его буфер прокрутки для краткости).
Когда начинаешь вовсю пользоваться этим буфером, то очень скоро выясняются две вещи:
Только часть текста, сопровождавшего загрузку, может быть возвращена.
Файл '/var/log/messages' фиксирует гораздо меньше того, что вы хотели увидеть.
Вы начинаете прочесывать Интернет, и вскоре предварительные результаты появляются: публикации по обратной прокрутке в Линуксе весьма древние и прослеживаются до ранних 90х годов. Однако обо всем, что было до ядра версии 2.6.x следует забыть.
В самом деле, следует быть избирательным в том, что читаешь: большинство советов, относящихся к версиям прежде 2.6.x, скорее всего запутают вас и уведут по ложному пути. Поверьте мне - я убил на это дело много времени. Поведение обратной прокрутки определяется в файле 'vc.c', противном маленьком файлике в исходниках ядра, причем 'vc' обозначает 'virtual console' (виртуальная консоль).
Заметьте, что при переключении консолей, буфер прокрутки теряется - таким образом, в текущей консоли доступен полный объем этого буфера. (Здесь особенно много завалов информационного мусора со времен до ядра 2.6.x ).
По умолчанию, размер буфера равен 32K. Этого хватает на 4 нажатия клавиш обратной прокрутки - каждое нажатие прокручивает половину экрана, 25 строчек на экран. Выходит около 50 строк. И больше вы не получите, даже еcли у вас 30 или 50 строк на экран. Нужно сказать, что 50 строк - это малая толика того, что пролетает по экрану за время загрузки. В связи с вышеизложенным, встают два вопроса:
Как увеличить буфер прокрутки?
Почему логи не фиксируют некоторые сообщения, которые вы видели во время загрузки?
1. Как увеличить буфер обратной прокрутки?
Первым решением будет увеличить дефолтный (умолчальный) размер буфера в исходниках ядра и перекомпилировать его. Позвольте предположить, что вы столь же не склонны заниматься этим, как и я, и поискать средство более гибкое.
И такое средство есть, а называется оно 'framebuffer console', для краткости 'fbcon'. Это устройство имеет файл документации 'fbcon.txt'; если вы устанавливали документацию к ядру, то он у вас есть. Выискивайте его где-то в районе '/usr/share' ветви (я не могу указать точный путь из-за разницы в дистрибутивах). Всегда можно скачать его как одиночный файл здесь.
На этом месте прошу прощения: мы должны сделать небольшое отступление и немного поговорить о видеобуфере (framebuffer).
Видеобуфер - это буфер между дисплеем и видеоадаптером. Его прелесть в том, что им можно манипулировать: он позволяет трюки, которые не прошли бы, будь адаптер связан напрямую с дисплеем.
Один из таких трюков связан с буфером прокрутки; оказывается, вы можете "попросить" видеобуфер выделить больше памяти буферу прокрутки. Достигается это через загрузочные параметры ядра. Сначала вы требуете framebuffer (видеобуфер); Затем запрашиваете больший буфер прокрутки.
Нижеследующий пример касается GRUB, но может быть легко адаптирован к LILO. В файле настройки GRUB - 'menu.lst'- найдите соответствующую ядру строчку, и затем:
Удалите опцию 'vga=xxx', если таковая присутствует.
Добавьте опцию 'video=vesabf' или то, что соответствует вашему "железу".
Добавьте опцию 'fbcon=scrollback:128'.
После этой процедуры, строка параметров ядра должна выглядеть приблизительно так:
'kernel /vmlinuz root=/dev/sdb5 video=radeonfb fbcon=scrollback:128'.
Спрашивается, зачем удалять опцию 'vga=xxx'? Из-за возможных конфликтов с видео-опцией. На своем ATI адаптере, я не могу изменить буфер прокрутки, если 'vga=xxx' присутствует в списке. Возможно в вашем случае это не так. Если вышеперечисленные опции работают - хорошо; но что, если вы хотите увеличить число строк, или установить более мелкий шрифт на экране? Вы всегда делали это при помощи опции 'vga=xxx' - а она-то и исчезла. Не переживайте - то же самое может быть достигнуто изменением параметров fbcon, как описано в файле 'fbcon.txt' (но не описано в данной статье). В Ubuntu и Debian есть более удобный способ: 'dpkg-reconfigure console-setup'. Эту команду стоит использовать также и потому, что она еще и корректирует 'initrd' на ваши новые настройки.
2. Расширение пределов
Опция 'fbcon=scrollback:128' дает вам возможность перемещения по буферу прокрутки на 12-13 экранов. Это приблизительно 150 строк - вполне неплохо, Но, возможно, еще недостаточно для просмотра всех загрузочных сообщений. Можно ли поставить больше 128, скажем, 256? Предел 128 заложен в 'vc.c'. Если хотите больше, редактируйте и компилируйте. Для себя я решил, что игра не стоит свеч.
Когда я уже совсем решил, что достиг наивысшего предела - я цитирую из 'fbcon.txt':
fbcon=scrollback:<value>[k]
...
The 'k' suffix is optional, and will multiply the 'value' by 1024.
(Суффикс 'k' является опциональным, и умножит значение 'value' в 1024 раза).
Я бросился проверять,.. и, что бы ни думал по этому поводу автор, убедился, что 128 и 128k дают абсолютно одинаковый результат. Предел по умолчанию равен 128KB памяти, вот и весь сказ.
Напоследок заметьте, что применение расширенного буфера прокрутки использует как память графического адаптера, так и буфер в оперативной памяти. Если вы довольствуетесь умолчальными 32KB, вы используете только память видеоадаптера. На практике, однако, я не заметил ни малейшего замедления.
3. Что отсутствует в логах?
В Ubuntu и Debian и других дистрибутивах все системные сообщения сохраняются в файле '/var/log/messages'. Это применимо, даже если сервис (daemon) протоколирования не старый 'syslog', а 'syslog-ng' ('ng': "new generation" /новое поколение/).
В обоих случаях, вы можете просмотреть сообщения, набрав 'dmesg' в командной строке. Это не помогает: вы ясно видели во время загрузки сообщения, которых нет в выводе команды 'dmesg'. Как же так?
Это свойство, а не ошибка! Сообщения, протоколируемые в файле, приходят от различных субсистем ОС. Субсистемы, выдающие сообщения в файл протокола, в терминологии syslog обозначаются как 'facilities' ("средства" или "услуги"), их всего 8 штук. В процессе загрузки работают программы и скрипты, которые могут и не принадлежать ни к одному из 8 "средств". Мы видим их сообщения, пробегающими по экрану, но ничего не будет зафиксировано в лог-файле!
Например вы не увидите сообщений от программ 'loadkeys' (openSUSE) или 'consolechars' (Ubuntu и Debian), когда происходит загрузка раскладки клавиатуры во время загрузки системы. Другой пример: когда пользуетесь консольным текстовым редактором, вы можете прокручивать дисплей назад (включая цвета), пользуясь при этом буфером прокрутки. Но то, что производит редактор, никогда не попадет ни в один системный протокол. Причина, разумеется, в том, что ни 'loadkeys', ни 'consolechars', ни редактор, не принадлежат ни к одному из 8 "средств".
Можно ли изменить ситуацию? Конечно - "просто" переделайте и перекомпилируйте те приложения, которые вы хотите протоколировать. Допишите или перепишите загрузочные скрипты. Или заставьте систему фиксировать сообщения извне 8 системных "средств".
Держу пари, что вы не станете этим заниматься. И даже знаю ваш вероятный ответ:
- "Из моих логов ничего не пропадает". Да-да, конечно...