After I got Linux up and running on my laptop, I found it accessing the harddisk every few seconds, even when there was no user logged in to the system. The harddisk could never enter its power saving mode. Reducing harddisk activity can greatly increase the battery runtime, so this is why I collected the following recipes.
I tested all this with RedHat 4.1, the locations of some configuration settings may be different for your distribution. (If so, please let me know.)
Check your /etc/crontab
file if it starts a process
every minute. You will often find atrun
there.
With the at
command, you can spool commands that must be
invoked some time in the future. Some Linux systems use a
dedicated atd
daemon to take care of this, others
(e. g. RedHat) let the crond
daemon run atrun
once every
minute.
This is not really necessairy on most systems, since at
commands rarely depend upon being invoked on exact time. So
if you find a line like this in your /etc/crontab
:
# Run any at jobs every minute
* * * * * root [ -x /usr/sbin/atrun ] && /usr/sbin/atrun
Then you can safely change this to:
# Run any at jobs every hour
00 * * * * root [ -x /usr/sbin/atrun ] && /usr/sbin/atrun
Read man 5 crontab
for details. Some folks can even
work fine without the crond
daemon, so you might want
to consider disabling it completely.
Linux deals with a lot of open file buffers at any given moment, so the system must make sure that file changes are saved to the harddisk as soon possible. Otherwise, those changes will be lost after a system crash.
The update
/ bdflush
daemon takes care of this. (These
are two names for the same program, so you can use either
name to start the daemon). The default settings will make
this daemon call flush
every 5 seconds and sync
every
30 seconds.
It seems to depend on your harddisk's firmware, but on my machine this caused non-stop harddisk access. (Some harddisks seem to flush their cache ram even if nothing has changed.)
Since Linux does not crash very often anymore, I have changed both values to 3600 seconds (= one hour). This caused no problems at all and the constant disk access has stopped. (But if my system crashes now, there will be more broken files, of course.)
RedHat 4.1: In /etc/inittab
, change the update call to:
ud::once:/sbin/update -s 3600 -f 3600
Suse 4.4.1: update
is called in /sbin/init.d/boot
.
Slackware: update
is called in /etc/rc.d/rc.S
.
See man update
for details.
The syslogd
daemon is responsible for the various Linux
system log files that are found in the
/var/log/
directory. By default syslogd
will
sync the log file each time after logging a system message.
You can turn that off by preceding the filename with a dash
in /etc/syslog.conf
. Here's an example as found in
my system's syslog.conf
:
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none -/var/log/messages
This again means that if the system crashes, the message that reported the problem may not have been stored to disk. Dilemma...
During the bootup, the initial processes and daemons will be
started using the init
command. This command (yet again)
calls sync
before each process it creates.
You can change this by removing the sync()
call in the
source code and recompiling the command.
To avoid problems with lost file buffers, you should add a
call to sync
in your system's
/etc/rc.d/init.d/halt
script, right before the script
unmounts the file systems.
The Linux swap partition is used to increase the physical ram space
with virtual memory. This again is a possible reason for harddisk
access. If your laptop already has a lot of ram or if
the applications that you use are quite simple
(think of vi
), you might want to consider turning it off.
This of course depends on what you plan to do. 4 to 8 megs are not enough, you must use a swap partition then. With 8 to 16 megs, text console applications will work fine and if you can avoid using a lot of multitasking features, you can safely disable swap. The X-Windows enviroment requires a lot of ram and you should not use it without a swap partition unless you really have a lot more than 16 megs.
(Sidenote: My laptop with 16 megs and disabled swap partition can run
an emacs
session, four bash
shells and compile a
kernel without running out of memory. That's enough for me.)
If you already have installed a swap partition, you can disable
it by preceding the swapon
command that is called in /etc/rc.d/rc.sysinit
with
a hash mark. If you don't want to make it a permanent move, let
the system ask during boot if you want to use the swap
partition. In /etc/rc.d/rc.sysinit
(RedHat 4.1) or
/sbin/init.d/boot
(Suse 4.4.1):
echo "Should the system use swap?"
echo " 0: No."
echo " 1: Yes."
/bin/echo "Your choice: \c"
read SWAPCHOICE
case "$SWAPCHOICE" in
0)
# Do nothing.
echo "(Swap partitions disabled)"
;;
*)
# Start up swapping.
echo "Activating swap partitions"
swapon -a
esac
Then you can use the swap partition while on ac power and drop it while on battery.
I am using my laptop to develop and test cgi scipts for websites, that is why I am running a local webserver on it. The standard configuration is a bit too much if all you want to do is just test a script or check a page from time to time.
In httpd.conf
, just change the values of
MinSpareServers
and StartServers
to 1
. This
will be enough for a local test site.
If you wish to turn off the webserver's logging, you must
recompile the httpd
daemon. Read the documentation for
details.
If your Linux system still seems to access the harddisk too
often, you can find out what is going on inside by using
the ps ax
command. This will show all running processes
and their full name, sometimes it also reveals the command
line arguments of each process.
Now read the man
page of each process to find out what
it does and how to change its behaviour. With this
method, you will most likely find the process that is
responsible. You may also find strace
helpful.
Please send me an email if you found something new.