syslog.warten.de

Backup/Restore Mit Dd Oder Tar über SSH

Die Festplatte einer Workstation machte Zicken. S.M.A.R.T. und dmesg bestätigten einen Hardwaredefekt des Mediums.

# smartctl -a /dev/sdb
smartctl version 5.37 [i686-pc-linux-gnu] Copyright (C) 2002-6 Bruce Allen
Home page is http://smartmontools.sourceforge.net/
=== START OF INFORMATION SECTION ===
Model Family:     Maxtor MaXLine III family (SATA/300)
Device Model:     Maxtor 7V300F0
Serial Number:    V605EYSG
Firmware Version: VA111630
User Capacity:    300.090.728.448 bytes
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   7
ATA Standard is:  ATA/ATAPI-7 T13 1532D revision 0
Local Time is:    Sun Sep 28 14:09:35 2008 CEST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: FAILED!
Drive failure expected in less than 24 hours. SAVE ALL DATA.
See vendor-specific Attribute list for failed Attributes.
[...]
SMART Attributes Data Structure revision number: 32
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
[...]
5 Reallocated_Sector_Ct   0x0033   016   016   063    Pre-fail  Always   FAILING_NOW 3003
[...]
SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Extended offline    Completed: read failure       20%      7576         420064150
[...]
# dmesg
[...]
[25722.726055] ata3.01: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x0
[25722.726105] ata3.01: BMDMA stat 0x64
[25722.726170] ata3.01: cmd 25/00:f8:50:ab:09/00:00:19:00:00/f0 tag 0 dma 126976 in
[25722.726201]          res 51/40:f8:96:ab:09/40:00:19:00:00/f0 Emask 0x9 (media error)
[25722.726247] ata3.01: status: { DRDY ERR }
[25722.726270] ata3.01: error: { UNC }
[25722.852221] ata3.00: configured for UDMA/133
[25722.868931] ata3.01: configured for UDMA/133
[25722.869026] ata3: EH complete
[...]
[25739.235989] sd 2:0:1:0: [sdb] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE,SUGGEST_OK
[25739.236049] sd 2:0:1:0: [sdb] Sense Key : Medium Error [current] [descriptor]
[25739.236107] Descriptor sense data with sense descriptors (in hex):
[25739.236141]         72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00
[25739.236266]         19 09 ab 96
[25739.236316] sd 2:0:1:0: [sdb] Add. Sense: Unrecovered read error - auto reallocate failed
[25739.236381] end_request: I/O error, dev sdb, sector 420064150
[25739.236423] Buffer I/O error on device sdb, logical block 52508018
[25739.236472] Buffer I/O error on device sdb, logical block 52508019
[25739.236515] Buffer I/O error on device sdb, logical block 52508020
[25739.236553] Buffer I/O error on device sdb, logical block 52508021
[25739.236595] Buffer I/O error on device sdb, logical block 52508022
[25739.236637] Buffer I/O error on device sdb, logical block 52508023
[25739.236683] Buffer I/O error on device sdb, logical block 52508024
[25739.236721] Buffer I/O error on device sdb, logical block 52508025
[25739.236760] Buffer I/O error on device sdb, logical block 52508026
[25739.236805] Buffer I/O error on device sdb, logical block 52508027
[25739.237034] ata3: EH complete
[25739.322135] sd 2:0:1:0: [sdb] 586114704 512-byte hardware sectors (300091 MB)
[25739.332778] sd 2:0:1:0: [sdb] Write Protect is off
[25739.332823] sd 2:0:1:0: [sdb] Mode Sense: 00 3a 00 00
[25740.201637] sd 2:0:1:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[25740.212284] sd 2:0:0:0: [sda] 312500000 512-byte hardware sectors (160000 MB)
[25740.212482] sd 2:0:0:0: [sda] Write Protect is off
[25740.212516] sd 2:0:0:0: [sda] Mode Sense: 00 3a 00 00
[25740.212767] sd 2:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA

Es sollte eine komplette Sicherung des Datenträgers erstellt werden. Zunächst wurden alle Partitionen des Device ausgehängt, um jede weitere Veränderung der Daten möglichst zu vermeiden. Auf einen Dateisystemcheck wurde deshalb vorerst verzichtet. Danach wurde eine 1:1-Kopie der Festplatte als Image auf den Fileserver verschoben. Mit dd und ssh ist das einfach über eine Pipe zu realisieren. Da auf dem defekten Medium mit Lesefehlern zu rechnen ist, wird dd angewiesen, Fehler zu ignorieren.

# dd if=/dev/sdb conv=noerror,sync | ssh user@hostname "dd of=/data/hostname-device-date.img"

Alternativ kann eine direkte Sicherung der Dateien bei gemounteten Dateisystem erstellt werden. In diesem Fall ist das jedoch nicht zu empfehlen.

# tar czf - /media/sdb1 | ssh user@hostname "cat > /data/hostname-device-date.tar.gz"

Als das so erstellte Image gesichert war, konnte die Wiederherstellung der Daten beginnen. Um einen Datenverlust zu vermeiden, sollte das Image nur read-only verwendet werden. Besser ist mit Kopien der Sicherung zu arbeiten.

# losetup --read-only /dev/loop0 /data/hostname-device-date.img
# fdisk -l /dev/loop0
Disk /dev/loop0: 226.2 GB, 226256034816 bytes
255 heads, 63 sectors/track, 27507 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x9badd7b7
Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1               1       36483   293049666    c  W95 FAT32 (LBA)

Um nun eine Partition mounten zu können, muss ermittelt werden, ab welchem Byte die Partition im Image beginnt. Dieses Offset ist das Produkt aus der Anzahl der Köpfe (heads), den Sektoren pro Track (sectors/track), der Größe eines Blocks in Byte und der Nummer des ersten Zylinders der zu mountenden Partition:

255 heads * 63 sectors/track * 512 bytes * 1 = 8225280

Das Ergebnis wird als Offset an losetup übergeben.

# losetup -d /dev/loop0
# losetup -o8225280 /dev/loop0 /data/hostname-device-date.img

Nun lässt sich mit dem Device /dev/loop0 wie mit der ursprünglichen Partition umgehen. Es kann nun beispielsweise ein Dateisystemcheck durchgeführt und danach die Partition gemountet werden.

# fsck.vfat /dev/loop0
# mount /dev/loop0 /mnt/mountpoint

Wurde die defekte Festplatte ersetzt, kann die Sicherung auch einfach zurückkopiert werden.

# ssh user@hostname "dd if=/data/hostname-device-date.img" | dd of=/dev/sdb
# ssh user@hostname "cat /data/hostname-device-date.tar.gz" | tar xzf -

VMware vs. Ntpd

Die Kombination VMware Server und ntpd in der virtual machine ist nicht zu empfehlen. VMware fängt die timer interrupts ab und manipuliert sie zur Lastverteilung zwischen den virtuellen Maschinen. Der ntpd kommt dadurch gehörig aus dem Takt und VMware hat Last, wo es eigentlich keine gibt.

Bug Im Perl-RPM Von RHEL5

Durch einen Blog-Artikel kam ich einem ungewöhnlichen Verhalten einiger Perl-Skripte auf unseren Servern auf die Spur. Das Perl-Paket von RHEL5 hat einen Bug, der zur Folge hat, dass Prozesse, die bless und overload benutzen, ausgebremst werden. Red Hat bietet derzeit kein offizielles Bugfix an. Über unseren Hoster stellte Red Hat uns dennoch ein Bugfix zur Verfügung, das das Performance-Problem löst.

Perl: Daten Nach Häufigkeit Sortieren

Die Aufgabe war, eine Liste von IP-Adressen einzulesen und nach Häufigkeit (numerisch) absteigend zu sortieren. Wie man hash values sortiert, wollte mir im entscheidenen Augenblick nicht einfallen und so hat die Lösung eine Viertelstunde auf sich warten lassen. Soll nicht wieder vorkommen.

#!/usr/bin/perl
my %counter;
while () {
    chomp( my $ip_address = $_ );
    $counter{$ip_address}  = 1;
}
for my $ip_address ( sort { $counter{$b}  $counter{$a} } keys %counter ) {
    print "$ip_address: $counter{$ip_address}n";
}

Pimp My Prompt

Bei der Arbeit auf einem managed server fand ich eine vergessene screen-Session des Hosters. Ich habe bisher nie die command prompts meiner Systeme angepasst, weil die diesbezüglichen Voreinstellungen der verschiedenen Linux-Distributionen meinen Anforderungen genügten. Nun, als ich diese screen-Session durchsah, bemerkte ich, was den Eingabeaufforderungen meiner Systeme fehlte, ohne dass ich es mir bewußt war: die Uhrzeit!

database ~ # export PS1='[h A w]# '; alias ls='ls --color=no -F'; export LANG=en_US
[database 10:18 ~]# mysql -u admin -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 2063
Server version: 5.0.45-community-log MySQL Community Edition (GPL)
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
mysql> R [u@h|R:m|d]>_
PROMPT set to '[u@h|R:m|d]>_'
[admin@localhost|10:18|(none)]>

Um die Eingabeaufforderung beim Login automatisch anzupassen, kann man die Änderung in ~/.bashrc respektive ~.my.cnf vornehmen.

$ cat ~/.bashrc | grep PS1
export PS1='[h A w]$ '
$ cat ~/.my.cnf
[mysql]
prompt='[u@h|R:m|d]>_'

Domain-Weiterleitung Nach Spracheinstellung Im Webbrowser

Es soll beim Aufruf von http://example.com/ basierend auf den Webbrowser-Einstellungen die Homepage des jeweiligen Landes aufgerufen werden. Der Browser übermittelt die bevorzugte Anzeigesprache im HTTP request im header field Accept-Language. Das Modul rewrite des Apache kann den HTTP header auswerten, also kann die Anforderung direkt in der Konfiguration des Webservers umgesetzt werden.

RewriteEngine on
RewriteCond %{HTTP:Accept-Language} ^de.* [NC]
RewriteRule (.*) http://de.example.com/$1 [L,R=permanent]

Sendet der Browser beim Aufruf des vhosts den Wunsch mit, Seiten in deutscher Sprache (de) zu erhalten, wird er in obigem Beispiel mittels HTTP response 301 (permanent redirect) auf http://de.example.com/ weitergeleitet. Ein eventuell angegebener Pfad in der URL bleibt erhalten.

Aufbau Eines Fileservers Mit RAID-5 (Mdadm)

Der Aufbau des Fileserver geschah mit der Zielsetzung, Daten ausfallsicher verfügbar zu machen und zu lagern. Beim Ausfall einer Festplatte sollte es nicht zu einem Datenverlust kommen und das System sollte weiterhin einsatzfähig sein. Eine leichte Erweiterbarkeit war gewünscht. Zudem sollte der Preis pro nutzbarem GB günstig sein.

Zum Einsatz kommen vier 1000 GB Festplatten, auf denen je identische Partitionen für /boot, /, /data und swap angelegt wurden.

# fdisk -l
Disk /dev/sda: 1000 GB, 1000202273280 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1          32      257008   83  Linux
/dev/sda2              33      121601   976494960    f  Extended LBA
/dev/sda5              33          64      249007   82  Linux swap
/dev/sda6              65        1088     8217247   83  Linux
/dev/sda7            1089      121601   968012640   83  Linux
Disk /dev/sdb: 1000 GB, 1000202273280 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1          32      257008   83  Linux
/dev/sdb2              33      121601   976494960    f  Extended LBA
/dev/sdb5              33          64      249007   82  Linux swap
/dev/sdb6              65        1088     8217247   83  Linux
/dev/sdb7            1089      121601   968012640   83  Linux
Disk /dev/sdc: 1000 GB, 1000202273280 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1          32      257008   83  Linux
/dev/sdc2              33      121601   976494960    f  Extended LBA
/dev/sdc5              33          64      249007   82  Linux swap
/dev/sdc6              65        1088     8217247   83  Linux
/dev/sdc7            1089      121601   968012640   83  Linux
Disk /dev/sdd: 1000 GB, 1000202273280 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot      Start         End      Blocks   Id  System
/dev/sdd1               1          32      257008   83  Linux
/dev/sdd2              33      121601   976494960    f  Extended LBA
/dev/sdd5              33          64      249007   82  Linux swap
/dev/sdd6              65        1088     8217247   83  Linux
/dev/sdd7            1089      121601   968012640   83  Linux

Die identischen Partitionen der verschiedenen Festplatten wurden dann mittels Software-RAID verknüpft. Wegen der oben beschriebenen Zielsetzung wurde ein RAID-5 zur Datenhaltung ausgewählt. Es bietet die geforderte Redundanz, die den Ausfall einer Festplatte unbeschadet übersteht sowie eine gute Ausnutzung der Speicherkapazität und Leistung. Allein aus technischen Gründen musste für die Boot-Partition auf ein anderes RAID-Level zurückgegriffen werden: Weil kein Bootloader auf ein Software-RAID-5-Device zugreifen kann, wurde ein RAID-1 ausgewählt. Hier werden die Daten in lesbarer Form auf alle Partitionen gespiegelt.

# mdadm --create --verbose /dev/md0 --level=1 --raid-device=4 /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1
# mdadm --create --verbose /dev/md1 --level=5 --raid-device=4 /dev/sda5 /dev/sdb5 /dev/sdc5 /dev/sdd5
# mdadm --create --verbose /dev/md2 --level=5 --raid-device=4 /dev/sda6 /dev/sdb6 /dev/sdc6 /dev/sdd6
# mdadm --create --verbose /dev/md3 --level=5 --raid-device=4 /dev/sda7 /dev/sdb7 /dev/sdc7 /dev/sdd7

Die Herstellung des RAIDs läuft im Hintergrund und dauert eine Weile. Nutzbar ist es schon.

# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid10] [multipath] [raid6] [raid5] [raid4]
md3 : active raid5 sdd7[4] sdc7[2] sdb7[1] sda7[0]
2904061824 blocks level 5, 64k chunk, algorithm 2 [4/3] [UUU_]
[=>...................]  recovery =  5.7% (55536696/968020608) finish=202.3min speed=75137K/sec
md2 : active raid5 sdd6[3] sdc6[2] sdb6[1] sda6[0]
24675456 blocks level 5, 64k chunk, algorithm 2 [4/4] [UUUU]
md1 : active raid5 sdd5[3] sdc5[2] sdb5[1] sda5[0]
770688 blocks level 5, 64k chunk, algorithm 2 [4/4] [UUUU]
md0 : active raid1 sdd1[3] sdc1[2] sdb1[1] sda1[0]
256896 blocks [4/4] [UUUU]
unused devices: 

Danach kann mit der Installation des Betriebssystems begonnen werden. Auf Details soll hier nicht näher eingegangen werden; es wird auf die Dokumenationen verwiesen.

# mke2fs -j /dev/md0
# mkswap /dev/md1
# mke2fs -j /dev/md2
# mke2fs -j /dev/md3
# sync
# swapon /dev/md1
# mkdir /mnt/debinst
# mount /dev/md2 /mnt/debinst
# mkdir /mnt/debinst/boot
# mkdir /mnt/debinst/proc
# mkdir /mnt/debinst/dev
# mount /dev/md0 /mnt/debinst/boot
# mount --bind /dev /mnt/debinst/dev
# mount --bind /proc /mnt/debinst/proc
# debootstrap --arch amd64 lenny /mnt/debinst http://ftp.de.debian.org/debian

Zum Abschluss wurde der Bootloader in den MBR aller Festplatten installiert, damit beim Ausfall der ersten Festplatte gegebenenfalls von einer anderen gebootet werden kann.

# /usr/sbin/grub-install /dev/sda
# /usr/sbin/grub-install /dev/sdb
# /usr/sbin/grub-install /dev/sdc
# /usr/sbin/grub-install /dev/sdd
Searching for GRUB installation directory ... found: /boot/grub
Installation finished. No error reported.
This is the contents of the device map /boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.
(hd0)   /dev/sda
(hd1)   /dev/sdb
(hd2)   /dev/sdc
(hd3)   /dev/sdd
# update-grub
Searching for GRUB installation directory ... found: /boot/grub
Searching for default file ... found: /boot/grub/default
Testing for an existing GRUB menu.lst file ...
Generating /boot/grub/menu.lst
Searching for splash image ... none found, skipping ...
Found kernel: /vmlinuz-2.6.25-2-amd64
Updating /boot/grub/menu.lst ... done

Sollte der verfügbare Speicher knapp werden, kann das hier vorgestellt System leicht erweitert werden. Durch den Einbau einer oder mehrerer Festplatten gleicher Kapazität und bei identischer Partitionierung können die einzelnen RAIDs jeweils wie folgt vergrößert werden. Der obligatorische Hinweis zur Datensicherung vor solchen Änderungen sei hiermit erfolgt.

mdadm --add /dev/md3 /dev/sde7
mdadm --grow /dev/md3 --raid-devices=5
fsck.ext3 /dev/md3
resize2fs /dev/md3

Bernsteins Daemontools Installieren

Die daemontools (in Version 0.76) lassen sich auf Systemen mit der glibc 2.3.x oder später nicht mehr ohne Änderung compilieren. Das musste ich heute auf einem CentOS 5.2 feststellen. Der Installationsversuch wurde mit den folgenden Zeilen erfolglos beendet.

/usr/bin/ld: errno: TLS definition in /lib64/libc.so.6 section .tbss mismatches non-TLS reference in envdir.o
/lib64/libc.so.6: could not read symbols: Bad value
collect2: ld returned 1 exit status
make: *** [envdir] Error 1
Copying commands into ./command...
cp: cannot stat `compile/svscan': No such file or directory

Ursache für die Fehlermeldung ist die zur aktuellen glibc inkompatible Deklaration von errno in den daemontools. Glücklicherweise lässt sich diese Einschränkung leicht durch einen Patch lösen.

Der Weg zur erfolgreichen Installation sieht dann Schritt für Schritt etwa wie folgt aus:

cd /tmp
wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
wget ftp://moni.csi.hu/pub/glibc-2.3.1/daemontools-0.76.errno.patch
mkdir -p /package
chmod 1755 /package
cd /package/
tar xzpf /tmp/daemontools-0.76.tar
cd admin/daemontools-0.76
patch -p1 < /tmp/daemontools-0.76.errno.patch
package/install

Wer nicht patchen möchte, kann den Compiler (hier gcc) explizit anweisen, /usr/include/errno.h zu inkludieren.

# vi src/conf-cc
gcc -include /usr/include/errno.h -O2 -Wimplicit -Wunused -Wcomment -Wchar-subscripts -Wuninitialized -Wshadow -Wcast-qual -Wcast-align -Wwrite-strings

Geocaching Mit Garmin eTrex H Und Linux

Mein Bruder hat mich besucht und bei mehreren Spaziergängen fürs Geocaching begeistern können. Zum Abschied hat er mir sein Garmin eTrex H geschenkt. Dazu auch ein in Deutschland unverschämt teures USB-to-Serial-Adapterkabel zum Anschluss des GPS-Empfänger an den PC. Doch wie greift man mit Linux auf den eTrex H zu? Das soll nun geklärt werden.

Wird der GPS-Empfänger mit dem Adapterkabel am PC angeschlossen, werden die folgenden Kernelmeldungen ausgegeben.

[  221.546821] usb 4-1: new full speed USB device using uhci_hcd and address 2
[  221.701877] usb 4-1: configuration #1 chosen from 1 choice
[  222.199965] usbcore: registered new interface driver usbserial
[  222.201199] /build/buildd/linux-2.6.24/drivers/usb/serial/usb-serial.c: USB Serial support registered for generic
[  222.203032] usbcore: registered new interface driver usbserial_generic
[  222.203042] /build/buildd/linux-2.6.24/drivers/usb/serial/usb-serial.c: USB Serial Driver core
[  222.213108] /build/buildd/linux-2.6.24/drivers/usb/serial/usb-serial.c: USB Serial support registered for pl2303
[  222.214970] pl2303 4-1:1.0: pl2303 converter detected
[  222.216137] usb 4-1: pl2303 converter now attached to ttyUSB0
[  222.217288] usbcore: registered new interface driver pl2303
[  222.217299] /build/buildd/linux-2.6.24/drivers/usb/serial/pl2303.c: Prolific PL2303 USB to serial adaptor driver

Es werden die Kernelmodule usb-serial und pl2303 nachgeladen. Erfolgt dies nicht automatisch kann mit modprobe pl2303 manuell nachgeholfen werden. Sollten diese Module nicht zur Verfügung stehen (und nicht fest einkompiliert sein), müssen distributionsabhängig entweder die Module nachinstalliert oder der Kernel mit den aktivierten Modulen neu kompiliert werden. Das Garmin-Gerät sollte nun über /dev/ttyUSB0 erreichbar sein.

Um Waypoints, Routen und Tracks übertragen zu können, gibt es für Linux GPSBabel. Die Software kann die vielen gebräuchlichen Formate umwandeln und dabei vom PC auf den GPS-Empfänger (oder umgekehrt) übertragen.

Die Koordinaten eines Geocaches von Geocaching.com als Waypoint an den Garmin eTrex H zu senden ist einfach. Es wird das “LOC Waypoint File” (geocaching.loc) heruntergeladen und mit dem folgenden Kommando übertragen:

$ gpsbabel -i geo -f geocaching.loc -o garmin -F /dev/ttyUSB0

Placemarks aus GoogleEarth lassen sich ebenfalls umwandeln. Sollen Plätze aus GoogleEarth auf den Garmin übernommen werden, sind diese zuerst in der Keyhole Markup Language (Datei mit Endung KML) zu speichern. Liegen die Daten als KMZ-Datei vor, können diese mit unzip entpackt werden. Zum Vorschein kommt eine KML-Datei.

$ unzip GoogleEarth.kmz
Archive:  GoogleEarth.kmz
inflating: doc.kml
$ gpsbabel -i kml -f doc.kml -o garmin -F /dev/ttyUSB0

Sollen alle im Garmin gespeicherten Waypoints (Parameter -w; default), Routen (-r) und Tracks (-t) in GoogleEarth übernommen werden, müssen sie ins KML-Format umgewandelt werden. Das geht ganz einfach mit dem folgenden Kommando:

$ gpsbabel -w -r -t -i garmin -f /dev/ttyUSB0 -o kml -F garmin.kml

Danach kann man die Daten in GoogleEarth laden und visualisieren lassen.
Eine ausführliche Anleitung, wie man die Daten des Garmin mit Perl auswertet, ist im Perl-Snapshot des Linux Magazins zu finden.

Updates Im Griff Mit Cron-apt

Mit cron-apt lassen sich Systeme, die die Paketverwaltung von Debian nutzen, leicht automatisch aktuell halten. In der Standardkonfiguration aktualisiert cron-apt die in der Datei /etc/apt/sources.list eingetragenen Repositories und verschickt bei verfügbaren Updates eine E-Mail an den Administrator. Aufgerufen wird es dabei — wie der Name vermuten lässt — als Cron-Job. Die Benachrichtigung sieht wie im folgenden Beispiel aus:

CRON-APT RUN [/etc/cron-apt/config]: Tue May 13 14:00:01 CEST 2008
CRON-APT SLEEP: 2558, Tue May 13 14:42:40 CEST 2008
CRON-APT ACTION: 3-download
CRON-APT LINE: /usr/bin/aptitude dist-upgrade -d -y -o APT::Get::Show-Upgraded=true
Reading package lists...
Building dependency tree...
Reading extended state information...
Initializing package states...
Building tag database...
The following packages will be upgraded:
libssl0.9.8 openssl
2 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 3718kB of archives. After unpacking 0B will be used.
Writing extended state information...
Get:1 http://security.debian.org etch/updates/main libssl0.9.8 0.9.8c-4etch3 [2717kB]
Get:2 http://security.debian.org etch/updates/main openssl 0.9.8c-4etch3 [1001kB]
Fetched 3718kB in 4s (908kB/s)

Wer es sich traut, kann die verfügbaren Updates automatisch einpflegen lassen. Hierzu muss allein eine neue Action erstellt werden. (Alternativ kann der Parameter -d aus der zweiten Zeile in der Datei /etc/cron-apt/action.d/3-download entfernt werden. Der Parameter sorgt dafür, dass die Updates lediglich heruntergeladen und nicht installiert werden.) Die neue Action kann zum Beispiel so aussehen:

# cat /etc/cron-apt/action.d/9-safe-upgrade
upgrade -y -o Aptitude::CmdLine::Show-Versions=true -o APT::Get::Show-Upgraded=true

Es sei davor gewarnt, Updates automatisch installieren zu lassen. Durch diesen Eingriff kann ein System unerwünschte oder unerwartete Veränderungen erfahren. Im Beispiel oben (dem Debian-OpenSSL-Fiasko) hätte sich ein Benutzer mit verwundbarem SSH-Key möglicherweise nicht mehr auf dem System anmelden können.

Sollen nur bestimmte Updates berücksichtigt werden, kann man die Auswahl auf ausgewählte Repositories beschränken. So werden nur Security-Updates automatisch eingespielt, wenn cron-apt eine Datei nur mit dem entsprechenden Repository übergeben wird. Eine paketbasierende Auswahl ist nicht möglich.

# cat /etc/cron-apt/config
[...]
OPTIONS="-o quiet=1 -o Dir::Etc::SourceList=/etc/apt/security.sources.list"
[...]