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

    Начать, пожалуй, стоит с того, что начиная с 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 в действии. ;)
    Share post

    Similar posts

    Comments 14

      0
      спасибо за информацию, у меня есть вопрос.

      У меня установлено ядро .32.8 из ppa убунту. Это ядро скомпилировано с поддержкой Support for tracing block io actions пакет ureadahead тоже установлен. Но есть одно но, папка /var/lib/ureadahead/ пуста, в ней есть только пустая папка debugfs. Собственно вопрос нужно ли выполнять apt-get source ureadahead до компиляции ядра или можно включить Ureadahead на уже установленом ядре?
        0
        Нет, без наложения патча ничего не выйдет. То есть, вам понадобится скачать исходники ядра, скачать исходники ureadahead, наложить на ядро патч, лежащий в папке с исходниками ureadahead и собрать ядро. Я процесс наложения патча и сборки ядра не стал расписывать подробно, руководств вроде бы много.
          0
          опишите пожалуйста, буквально в 2 консольных командах, как наложить патч на исходники ядра.
            0
            1. Переходим в директорию с исходниками ядра («cd /usr/src/linux-source-2.6.32», к примеру).
            2. Вводим «patch -i путь_к_патчу -p1 --dry-run»

            Если не выдало ошибок (надписи «HUNK succeded» и «offset бла-бла» ошибками не являются), то вводим то же самое, но без опции "--dry-run".

            Я как-то не подумал, что может понадобиться пошаговое руководство, извините. Чуть позже дополню статью.
              0
              Спасибо за помощь! Теперь загрузка длится 35 секунд вместо 45.
                0
                Пожалуйста. Рад, что статья оказалась кому-то полезна. =)
        0
        ха, а я его (ureadahead) просто снёс, грузиться стало намного быстрее…
          0
          У меня с монтированием семи разделов разделов и средне нагруженными двумя гном-панелями система грузится за 35-40 секунд. После обновлений — за минуту. UA работает из коробки без всяких плясок.
            0
            А какое у вас ядро, можно поинтересоваться?
              0
              Вчера обновился до 2.6.32-19-generic. И, да, у меня Lucid:
                0
                Статья была предназначена для тех, кто по какой-либо причине собирал ядро сам из исходников.
            0
            Надеюсь, Вы это прочтёте.
            Мне удалось завести эту штуку, загрузка действительно ускорилась секунд на 15, но меня смущает одна вещь: из 45 секунд загрузки, 18 секунд грузится сам ureadahead (если верить bootchart). Так и должно быть?
              0
              Я так подозреваю, что да. Видимо, сначала он считывает все данные с винчестера, а потом уже отдаёт их из памяти.
                0
                Спасибо, понял

            Only users with full accounts can post comments. Log in, please.