8/25/2008

Ускорение загрузки Linux: отключение неиспользуемых сервисов в Linux

В деле настройки своей системы под себя бывает желание уменьшить время загрузки. Для этого есть много разных средств, но одно из самых доступных и простых - отключение неиспользуемых сервисов в Linux. И для этого совсем не нужно часами править конфиги, ибо есть и графические конфигураторы. Главное - не навредить, как завещал отец медицины.

Итак, после того, как загрузчик
Linux найдёт и загрузит ваше ядро, в дело вступает запуск сервисов. Запускается Samba, которая делает ваши директории видимыми по сети (в том числе для пользователей альтернативных систем), CUPS - чтобы вы могли печатать на принтеры, SSHd - чтобы можно было принимать удалённое управление. В общем, всё то, что обеспечивает нам удобную работу, не отвлекая нас от более важных дел.

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

ПРЕДУПРЕЖДЕНИЕ!!!
СДЕЛАЙТЕ РЕЗЕРВНУЮ КОПИЮ ВСЕГО КАТАЛОГА /ETC НА ВСЯКИЙ СЛУЧАЙ!!! В СЛУЧАЕ НЕУДАЧИ ВЫ МОЖЕТЕ ПОЛУЧИТЬ СИСТЕМУ, КОТОРАЯ НЕ ЗАГРУЖАЕТСЯ!!!


И ещё одно предупреждение
Здесь главное не перестараться и отключать только те сервисы в
Linux, назначение которых вы знаете и точно уверены, что они вам не потребуются в ближайшем обозримом будущем. Скорее всего, вам всё-таки потребуются такие сервисы, как login и cron, так что будьте аккуратны.


Управление сервисами
Для того, чтобы долго не елозить напильником по конфигурационным файлам, ставим графический конфигуратор. Поискав по несметным сокровищницам репозиториев Debian GNU/Linux, находим:
# apt-cache search boot up manager
bum - graphical runlevel editor
Собственно, программа маленькая, ставим:
aptitude install bum
Программа при запуске ожидаемо требует рутовых привилегий:
sudo bum
Появится красивая и удобная графическая оболочка, по умолчанию в "простом" варианте:



Удобно, что о каждом сервисе сказано, что он делает. Так же показано текущее состояние сервиса - работает, неактивен или информация о его состоянии недоступна. Включаем или выключаем соответствующие сервисы, и нажимаем "Применить" - изменения вступят в силу после перезагрузки или сразу же.



В "продвинутом" варианте вы получаете не только управление сервисами, но и включением \ отключением самих скриптов конфигурирования отдельных сервисов. Как и прежде, будьте аккуратны - я не несу ответственности за порушенные "ынтырпрайзы" и отказывающиеся загружаться "продакшны" :-)

Если руки тянутся к напильнику...
На всякий случай напомню, что в Debian стартовые скприты аккуратно сложены в директории /etc/init.d/ а в каталогах
/etc/rc0.d
......
/etc/rc6.d

содержатся ссылки на соответствующие скрипты в /etc/init.d/
Соответственно, в Debian GNU/
Linux номера runlevels распределены следующим образом:
  • 0 System Halt
  • 1 Single user
  • 2 Full multi-user mode (по умолчанию)
  • 3-5 То же что и 2
  • 6 System Reboot

И наконец несколько слов об асинхронной загрузке
Linux. Это технически можно сделать, поправив конфиг /etc/init.d/rc до такого состояния:
# Specify method used to enable concurrent init.d scripts.
# Valid options are 'none', 'shell' and 'startpar'
CONCURRENCY=shell
Конкретно в моём случае ускорение составило около 2-3 секунд, что в общем меньше ожидаемого. А вариант "startpar" вообще привёл к тому, что система отказалась загружаться. Имея под рукой Knoppix Linux я, конечно, всё быстро поправил, но тем не менее.

Есть и более радикальные методы ускорения загрузки, такие как initNG. Но об этом в другой раз.

Ссылки
Как всегда, по теме очень толково пишут аксакалы из IBM здесь. А так же в генту-вики очень хорошее руководство тут (пользуясь случаем, в очередной раз зеленею от зависти к гентушным вики). Описание сервисов на примере Fedora 8 приведено здесь (Tigro, спасибо за ссылку!).

21 комментарий:

  1. rcconf для тех, кто не в иксах.

    ОтветитьУдалить
  2. Не, вот тут доступнее всего написано что и зачем, правда с уклоном на Fedora, но в Lenny они явно будут очень похожи.

    Когда поедем на Линукс-Поинт?

    ОтветитьУдалить
  3. insserv ?
    кстате давненько им пользуюсь, пока особых нареканий нет.

    ОтветитьУдалить
  4. Спасибо за статью! Недавно начал задумываться об ускорении системы, почитал в интернете и выяснилось, что для этого надо отключать сервисы и пересобирать ядро. Сервисы я отключать побоялся, т.к. не знаю, какие за что отвечают (за исключением login, cron и ещё парочки, назначение которых я уже откуда-то знаю), а ядро пересобирать... Вобщем-то, не так уж и страшно (уже пробовал, кстати - но оно не загрузилось) - просто считаю себя не готовым к этому, т.к. в железе своём (да и в не своём тоже :) ) ничего не смыслю, и боюсь отключить в ядре поддержку чего-то важного.

    Но Ваша статья, virens, воодушевила меня на оптимизацию! Есть у меня какой-то кнопикс, сейчас выясню, как им пользоваться (а то валяется без толку), забекаплю etc и - в бой! :)

    ОтветитьУдалить
  5. 2 Анонимный пишет...
    sysvconfig ?
    Да, но народ хочет с графикой :-)

    2 Warderer пишет...
    rcconf для тех, кто не в иксах.
    Спасибо, надо было бы его упомянуть. Сделаю это.

    2 Tigro пишет...
    Не, вот тут доступнее всего написано
    Не сказал бы, что доступно, но определённо полезно. Спасибо, добавил ссылку в пост.

    Когда поедем на Линукс-Поинт?
    Пока не знаю, у меня конференция в Питере в середине сентября. Думаю, к концу сентября соберёмся.

    2 Evgen пишет...
    insserv ?
    Возможно. Кстати, ещё раз спасибо - я только rcconf пользовал, а тут столько альтернатив. :-)

    2 Programmaster пишет...
    Спасибо за статью!
    Пожалуйста. Приходите к нам ещё :-)


    Недавно начал задумываться об
    ускорении системы, почитал в интернете и выяснилось, что для этого надо отключать сервисы и пересобирать ядро.

    Пересборка ядра на это повлияет слабо - вырубайте всякие ненужные сервисы (я сразу выключаю exim4).

    Сервисы я отключать побоялся, т.к. не знаю, какие за что отвечают
    В boom всё прокомментировано, собственно, поэтому я про него и написал.

    железе своём (да и в не своём тоже :) ) ничего не смыслю, и боюсь отключить в ядре поддержку чего-то важного.
    Я, проработав на своёй первой линуксовой машине 4 года, думал, что знаю о её железе всё. Я горько заблуждался :-)
    Эти знания набираются только опытом и покорёженными ядрами. :-)

    Есть у меня какой-то кнопикс, сейчас выясню, как им пользоваться
    Сойдёт любой кноппикс, а как пользоваться - тык! :-)

    забекаплю etc и - в бой! :)
    И это правильно! Дабы не жалеть о содеянном...

    ОтветитьУдалить
  6. Думаю, что гораздо действеннее будет отключитить все в чем не уверен, что нужно. Тем более все, что не знаешь.
    И потом включать назад по мере надобности.
    За одно узнаешь много интересного...

    ОтветитьУдалить
  7. > Пересборка ядра на это повлияет слабо - вырубайте всякие ненужные сервисы (я сразу выключаю exim4).

    Пересборку ядра советовали делать для оптимизации по памяти - дабы сэкономить память за счёт вещей, которые у меня использоваться не будут. Да и вообще, это полезно для приобретения познаний о железе. Как Вы очень интересно подметили, "эти знания набираются только опытом и покорёженными ядрами. :-)"

    ОтветитьУдалить
  8. Пока не знаю, у меня конференция в Питере в середине сентября. Думаю, к концу сентября соберёмся.

    А в каких числах если не секрет?

    ОтветитьУдалить
  9. 2 librarian пишет...
    А в каких числах если не секрет?
    15-16 сентября. В принципе, 16 сентября во второй половине можем встретиться и попить вашего замечательного Невского пива. :-)

    ОтветитьУдалить
  10. А нельзя чем-нибудь заменить X-ы? Или пересобрать?

    ОтветитьУдалить
  11. Давным-давно ускоряю систему ещё на этапе установки: ставлю "базовую" систему, вырезаю всё, что мне в ней не нужно, а уже после устанавливаю свой любимый набор пакетов.

    ОтветитьУдалить
  12. > Анонимный пишет...
    > А нельзя чем-нибудь заменить X-ы? Или пересобрать?
    > 29.08.2008 0:35:00

    Можно заменить DE каким-нибудь лёгковесным WM. Это тоже обеспечивает неслабый прирост в скорости.

    ОтветитьУдалить
  13. > Df_Yz комментирует...
    > Давным-давно ускоряю систему ещё на этапе установки: ставлю "базовую" систему, вырезаю всё, что мне в ней не нужно, а уже после устанавливаю свой любимый набор пакетов.
    > 31.08.2008 15:26:00

    Долгое время ускоряю всё ещё на этапе установки: ставлю "базовую" систему, вырезаю то, что мне в ней не нужно а уже после устанавливаю свой любимый набор пакетов.

    Selffix.

    ОтветитьУдалить
  14. Можно заменить DE каким-нибудь лёгковесным WM. Это тоже обеспечивает неслабый прирост в скорости.
    ---------------
    Пользую fluxbox, но скорости много не бывает...

    ОтветитьУдалить
  15. Еще немного про напильники. При concurrency=shell вывод скриптов превращается в кашу, и я не знаю простого способа исправить это, поэтому я отказался от режима shell в пользу startpar. Чтобы startpar не выводил "0" в консоль, изменил /etc/init.d/rc следующим образом (строка 157):

    - [ -n "$scripts" ] && startup_progress $debug startpar -a $action $scripts
    + [ -n "$scripts" ] && startup_progress $debug startpar -a $action $scripts > /dev/null

    на вывод скриптов это не влияет.
    Действительно, при concurrency=startpar система останавливается на загрузке S05keymap.sh, и продолжает при нажатии ctrl-c. Чтобы этого избежать, нужно чтобы на одном уровне с S05keymap.sh больше ничего не запускалось (т.е. не было команд с таким же префиксом SNN). Я назначил этому скрипту уровень S06:

    sudo update-rc.d -f keymap.sh remove
    sudo update-rc.d keymap.sh start 6 S .

    Т.к. при startpar (и shell) параллельно запускаются команды с одинаковым SNN (здесь я называю это уровнем), то для ускорения загрузки также стоит посмотреть, нельзя ли назначить одинаковый уровень как можно бОльшему количеству скриптов.

    ОтветитьУдалить
  16. Кстати некоторые сервисы не обязательно отключать. Их можно просто запускать позже, по мере необходимости. К примеру сервис bluetooth стартовать только тогда, когда подключается соотв. устройство (у меня в etch-е он стартовал сразу при загрузке). Делается это при помощи udev. Я создал файл следующего содержания:

    $cat /usr/local/etc/udev/rules.d/z50_bluez.rules
    SUBSYSTEM=="bluetooth", ACTION=="add", RUN+="/etc/init.d/bluetooth start &"
    SUBSYSTEM=="bluetooth", ACTION=="remove", RUN+="/etc/init.d/bluetooth stop &"

    а затем создал для этого файла симлинк в /etc/udev/rules.d:

    $sudo ln -s /usr/local/etc/udev/rules.d/z50_bluez.rules /etc/udev/rules.d/z50_bluez.rules

    после этого можно убрать запуск сервиса со 2-го runlevel-а:
    $sudo update-rc.d -f bluetooth remove
    $sudo update-rc.d bluetooth start 20 3 4 5 . stop 50 0 1 6 .

    ОтветитьУдалить
  17. Кроме того ряд сервисов можно запускать при помощи inetd. Так я отключил запуск своего почтовика (masqmail) и dictd при загрузке ОС, а взамен добавил в /etc/inetd.conf следующее:

    127.0.0.1:25 stream tcp nowait mail /usr/sbin/masqmail masqmail -bd -q -bs
    127.0.0.1:2628 stream tcp nowait dictd /usr/sbin/dictd dictd -i

    Теперь эти сервисы запускаются только тогда, когда к ним обращаются. И раз уж я написал про inetd.conf, пожалуй следует упомянуть следующее:

    $cat /etc/hosts.deny
    ALL: ALL

    $cat /etc/hosts.allow
    25: 127.0.0.1
    2628: 127.0.0.1

    Пока что все :).

    ОтветитьУдалить
  18. 2 Kirill Zabarniuk пишет...

    Кирилл, спасибо за такой развёрнутый комментарий, я постараюсь его включить в пост при следующих правках.

    ОтветитьУдалить
  19. > назначить одинаковый уровень как можно бОльшему количеству скриптов.

    Кстати, интересно сделано в testing-е. Там в начале init-скриптов есть строки такого вида:

    ### BEGIN INIT INFO
    # Provides: networking
    # Required-Start: mountkernfs ifupdown $local_fs
    # Required-Stop: ifupdown $local_fs
    # Default-Start: S
    # Default-Stop: 0 6
    # Short-Description: Raise network interfaces.
    ### END INIT INFO

    И есть пакет insserv, который на основании этих данных сам перегруппирует скрипты. В тонкости не вдавался, и время не мерял, но факт есть факт

    ОтветитьУдалить
  20. Еще один подход - Поменять BIOS.
    Например Linux Bios.
    http://ru.wikipedia.org/wiki/Linux_BIOS
    Конечно, есть некоторая неуверенность и опасения от такой задумки. Но, думаю, скоро на это решусь.

    ОтветитьУдалить