Pull to refresh

Ureadahead и самосборное ядро

Reading time2 min
Views7.5K
Начать, пожалуй, стоит с того, что начиная с Karmic Koala в Ubuntu для ускорения загрузки стала использоваться программа über-readahead или просто ureadahead. До этого, насколько я смог узнать из обрывков информации, использовалась похожая разработка из дистрибутива Fedora — sreadahead. Ureadahead же — это уже разработка самих убунтоидов. Описания конкретных преимуществ ureadahead перед sreadahead я найти нигде не смог, так что причины перехода остались для меня тайной.

Каким образом это работает: при первой загрузке программа отслеживает все файлы, которые ubuntu читает с диска. По окончании процесса запуска графического окружения, список этих файлов записывается в специальные файлы (паки) в директории "/var/lib/ureadahead/". Мне кажется, что они также содержат данные об расположении отслеживаемых файлов на диске, но точно сказать не могу (информации о ureadahead очень мало и она разрознена). В дальнейшем, программа использует эти данные, чтобы заранее считывать файлы в кэш, тем самым ускоряя запуск ОС.

Проблема в том, что для работы ureadahead требуется его поддержка в ядре. Патчи для ureadahead убунтушники в апстрим не отправляют, поскольку «it will need to be rebased onto the syscall trace events whenever that gets merged, and is a stop-gap.» Насколько я понял, идеологически правильнее будет сделать патч по-другому, но нужные функции в ядро пока не включили.

Так вот. Обычно я беру исходники ядра в ppa убунтушных разработчиков ядра, т.к. там лежат самые свежие ядра с наложенными патчами убунтоидов. Но вот поддержка ureadahead в них не включена! И это неприятно, т.к. без этой поддержки ureadahead может только использовать уже готовые паки, но новые создавать не может. Отсюда имеем потери в скорости загрузки.

Патч для включения поддержки ureadahead можно взять в исходниках самой программы. Добыть их можно командой «apt-get source ureadahead» или скачать с ланчпада. Патч лежит в корневой директории исходников. Накладываем его и собираем ядро. При конфигурировании проследите, чтобы была включена опция «Kernel hacking -> Tracers -> Support for tracing block io actions». В остальном компилируем как обычно.

После установки ядра и проверки его работы нужно обновить паки ureadahead. Обновляются они в следующих случаях:
  • По прошествии месяца с момента создания
  • После установки пакета, который добавляет либо изменяет init-скрипты или конфиги
  • При отсутствии готовых паков в /var/lib/ureadahead/

Нам лучше всего подойдёт последний способ обновления: удаляем из директории "/var/lib/ureadahead/" всё, кроме папки debugfs. Дальше перезагружаемся и ждём, пока запустится десктоп. Лучше подождать пару минут, для верности. Если после этого в "/var/lib/ureadahead/" появились файл «pack» и несколько файлов с расширением ".pack", то всё получилось. Следующая загрузка будет гораздо быстрее.

Ну и последнее: на ванильное ядро патч тоже накладывается (я пробовал 2.6.32.8), так что пользователи других дистрибутивов тоже могут попробовать ureadahead в действии. ;)
Tags:
Hubs:
+3
Comments14

Articles

Change theme settings