Изменение некоторых настроек системы

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

Все они проверены на RedHat 4.1, в вашем дистрибутиве пути к файлам конфигурации могут отличаться. (если так, дайте мне знать.)

Демон crond и atrun

Проверьте файл /etc/crontab и убедитесь в том, что он запускается каждую минуту. Часто здесь можно найти atrun.

С помощью команды at реализуется отложенный запуск команд. Некоторые системы Linux используют для этого выделенный демон atd, другие (например RedHat) используют crond для запуска раз в минуту atrun.

На большинстве систем не требуется запуск команд at точно в определенное время. Поэтому, если в вашем /etc/crontab есть строки

# Запускаем задания at каждую минуту
* * * * * root [ -x /usr/sbin/atrun ] && /usr/sbin/atrun

то можно смело изменить их на

# Запускаем задания at каждый час
00 * * * * root [ -x /usr/sbin/atrun ] && /usr/sbin/atrun

Для получения более подробной информации читайте man 5 crontab. Некоторые могут нормально работать вообще без демона crond, так что, если вы знаете, что делаете, то можете вообще его выключить.

Демон update / bdflush

Linux работает со множеством одновременно открытых файлов, поэтому система должна быть уверена, что изменения, произведенные в них, будут сохранены на жесткий диск, как можно быстрее. В случае аварии системы эти изменения будут потеряны.

Этим занимается демон update / bdflush. (Это имена одной программы, для запуска демона можно использовать и то, и другое.) По умолчанию flush вызывается каждые 5 секунд и sync - каждые 30 секунд.

Это приводило к постоянному доступу к моему диску Fujitsu. (Похоже, этот жесткий диск сбрасывает (записывает) свой кэш даже при отсутствии в нем каких-либо изменений. Впрочем, это зависит от производителя - по сообщениям других некоторые диски переходят в режим ожидания даже без нижеприведенных изменений.)

Сбои Linux теперь - это не такое уж частое явление, поэтому я сменил оба значения на 3600 секунд (= один час), что не вызвало никаких проблем и остановило постоянный доступ к диску. (Но если сейчас моя система аварийно завершит работу, то испорченных файлов будет, конечно, больше)

RedHat 4.1: B /etc/inittab, измените вызов update на:

ud::once:/sbin/update -s 3600 -f 3600

Suse 4.4.1: update вызывается из /sbin/init.d/boot.

Slackware: update вызывается из /etc/rc.d/rc.S.

Если хотите углубиться в подробности - читайте man update.

Демон syslogd

Демон syslogd отвечает за различные файлы системных журналов Linux, находящихся в каталоге /var/log/. По умолчанию syslogd сбрасывает на диск (sync) файлы журналов всякий раз после записи в них системного сообщения.

Вы можете отключить сброс, поставив перед именем файла в файле /etc/syslog.conf знак "минус". Вот пример syslog.conf из моей системы:

# Ведем журнал всех сообщений (кроме почтовых) уровня info и выше.
# Не включаем в журнал сообщения об аутентификации!
*.info;mail.none;authpriv.none                  -/var/log/messages

Опять таки, в случае аварии системы, сообщение о возникшей проблеме, скорее всего, не будет записано на диск. Дилемма...

Команда init

Во время загрузки начальные процессы и демоны запускаются командой init. Эта команда (опять таки) вызывает sync перед созданием любого нового процесса.

Это можно изменить, убрав вызов sync() в исходных текстах и перекомпилировав init.

Чтобы избежать проблемы с потерянными файловыми буферами, следует добавить в скрипт /etc/rc.d/init.d/halt перед отключением файловых систем вызов sync.

Раздел подкачки

Раздел подкачки Linux используется для увеличения размера физической памяти за счет виртуальной памяти, что, опять-таки, может послужить причиной доступа к диску. Если на вашем лэптопе много памяти, или используемые вами приложения довольно просты (подумайте о vi),то, возможно, вам стоит подумать об отключении этого раздела.

Само собой, решение должно зависеть от того, что вы собираетесь делать. 4 - 8 Мб памяти однозначно недостаточно для работы без раздела подкачки. 8 - 16 Мб достаточно для работы текстовых консольных приложений, если вы, конечно, не используете активно многозадачность. Работа в X-Windows требует большого количества памяти - если размер памяти вашего компьютера не намного превышает 16 мб, то отключать раздел подкачки не следует.

(Отступление: Мой лэптоп с 16 мб и отключенным разделом подкачки одновременно работал с emacs, четырьмя оболочками bash и компилировал ядро, не испытывая недостатка в памяти. Этого для меня достаточно.)

Если вы уже установили раздел подкачки, то можете отключить его, поставив символ решетки перед командой командой swapon, вызываемой из /etc/rc.d/rc.sysinit. Если вы не хотите насовсем отключать раздел подкачки, то можно заставить систему спрашивать вас во время загрузки, следует ли использовать подкачку. В файле /etc/rc.d/rc.sysinit (RedHat 4.1) или /sbin/init.d/boot (Suse 4.4.1):

echo "Должна ли система использовать подкачку?"
echo "  0: Нет."
echo "  1: Да."
/bin/echo "Ваш выбор: \c"
read SWAPCHOICE

case "$SWAPCHOICE" in
    0)
        # Ничего не делаем.
        echo "(Разделы подкачки отключены)"
        ;;
    *)
        # Включаем подкачку.
        echo "Подключение разделов подкачки"
        swapon -a
esac

В этом случае можно включать подкачку при работе от сети и не использовать при работе на батареях.

Демон apache httpd

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

Просто смените в файле httpd.conf значения MinSpareServers и StartServers на 1. Этого вполне достаточно для локального тестирования.

Если вы хотите выключить ведение веб-сервером журнала, то перекомпилируйте демон httpd. За подробностями обращайтесь к документации.

Grant Taylor перекомпилировал ведение журнала и обнаружил, что от этого apache не перестал "дергать" диск. Поэтому я нашел, как мне кажется, лучшее решение - запуск apache не демоном, а через inetd." Читайте man inetd.

Пакет XFree86

Настройка XFree86 для лэптопов - это отдельная история. Я, опять таки, отсылаю вас к Linux Laptop page, где можно найти помощь по этому вопросу.

Гашение экрана X консоли всего лишь очищает его (делает черным), но не выключает. Как было отмечено в "Примечании о выключении консоли" , для настройки гашения можно использовать опцию dpms команды xset Впрочем, эта возможность зависит от графического адаптера и bios вашего лэптопа.

Grant Taylor использовал следующие настройки для выключения экрана своего лэптопа, с помощью apmd и хранителя экрана:

# Запускаем xscreensaver, с помощью программы APM

xscreensaver -timeout 5 \
             -xrm xscreensaver.programs:apm_standby \ 
             -xrm xscreensaver.colorPrograms:apm_standby &

где apm_standby - это suid perl скрипт, позволяющий лишь некоторым пользователям запускать apm -S.

Редактор emacs

Ладно, emacs - это не редактор, а стиль жизни. Вот подсказка Florent Chabaud: "Если вы использовали emacs, то, может быть, заметили, что этот редактор кое-что сохраняет автоматически. Эта возможность, конечно, очень полезна и не должна быть выключена, но ее параметры могут быть немного подстроены под лэптоп.

Я добавил в файл /usr/share/emacs/site-lisp/site-start.el следующие две строки:

(setq auto-save-interval 2500)
(setq auto-save-timeout nil)

При этом выключается автосохранение по времени, и включается автосохранение по количеству нажатий (2500) на клавиши. Если вы набираете текст, то можно уменьшить количество нажатий; для программирования же это в самый раз. Так как считается любое нажатие (вверх, вниз, влево, удаление символа, вставка из буфера, и т. д.), то лимит в 2500 нажатий достигается довольно быстро."

Как найти другие пути оптимизации

Если ваша система Linux все равно слишком часто обращается к диску, то с помощью команды ps ax можно выяснить, что происходит внутри. Она выводит список процессов с полным именем каждого, иногда даже хватает места для аргументов командной строки.

После этого прочитайте руководство (man) по каждому процессу, с целью найти способ, изменить его поведение. Так вы наверняка обнаружите процесс, виновный в частом обращении к диску. Команда strace также может пригодиться.

Пожалуйста, пошлите мне письмо, если найдете что-то новое.