Namensauflösung

Bei mir ist es bei mehreren Installationen (einmal Debian Lenny und einmal Ubuntu 10.04) aufgetreten, dass ich bestimmte Hosts aus internen Netzwerken nicht per Ping oder http erreichen konnte. Die Namensauflösung per nslookup oder dig war aber in Ordnung.

Durch einen Interneteintrag kam ich auf die Lösung. In der Konfigurationsdatei für den „Name Service Switch“ /etc/nsswitch.conf war die Auflösung per DNS für Hostnamen erst nach einer Abbruchbedingung angegeben:

Server:~# cat /etc/nsswitch.conf
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.
 
passwd: compat
group: compat
shadow: compat
 
hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4
networks: files
 
protocols: db files
services: db files
ethers: db files
rpc: db files
 
netgroup: nis

Kaum hatte ich die entsprechende Zeile abgeändert, funktionierte es tadellos.

hosts: files dns mdns4_minimal [NOTFOUND=return] mdns4

Netzwerkkarte(n) konfigurieren

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
 
# The loopback network interface
auto lo
iface lo inet loopback
 
# The primary network interface
allow-hotplug eth0
iface eth0 inet dhcp
 
# The secondary network interface
auto eth1
iface eth1 inet static
    address 192.168.0.10
    netmask 255.255.255.0
    gateway 192.168.0.254
    broadcast 192.168.0.255
    network 192.168.0.0

Windows IconCache neu aufbauen

Bei mir ist es inzwischen mehrfach vorgekommen, dass ein Programm vom Explorer nicht mehr mit dem originalen Symbol angezeigt wurde, sondern mit dem von Windows für unbekannte Symbole. Es schien einfach defekt zu sein.

Eine gute Anleitung in Englisch habe ich im WinHelpOnlineBlog gefunden. Das hier ist nur die deutsche Übersetzung und mein Cache der Information.

Hier die Vorgehensweise:

  • Alle Datei-Explorer-Fenster schließen
  • Taskmanager starten (Strg-Alt-Entf oder Rechtsklick auf Taskleiste)
  • Im Reiter „Prozesse“ den „Explorer.exe“-Prozess markieren und „Prozess beenden“ drücken und Abfrage bestätigen
  • Im Task-Manager-Menü über Datei-> „Neuer Task (Ausführen)“ eine Kommandozeile starten (cmd.exe)
  • In der Kommandozeile dann ins lokale AppData-Verzeichnis wechseln und die IconCache.db löschen:
    • CD /d %userprofile%AppDataLocal
    • DEL IconCache.db /a
    • EXIT
  • Dann im Task-Manager-Menü über Datei-> „Neuer Task (Ausführen)“ wieder einen Task „explorer.exe“ starten

Das wars. Danach wird das Icon wieder angzeigt.

warnung   Wichtig ist, das vorher alle Explorer-Prozesse beendet wurden.

Versteckte Hardware im Gerätemanager anzeigen

Um versteckte Hardware zu deinstallieren, muss man sie erst sichtbar machen. Dazu muss eine Umgebungsvariable gesetzt werden.

Die Umgebungsvariable wird eingetragen über

Systemsteuerung -> System -> Register:Erweitert -> Umgebungsvariablen -> Bereich:Systemvariablen -> Neu

Dort eine neue Variable mit dem Namen

devmgr_show_nonpresent_devices

und dem Wert „1“ anlegen. Jetzt muss der Gerätemanager und der Eigenschaften-Dialog des PCs/Servers nur geschlossen und neu geöffnet werden.

Jetzt kann man sich im Geräte-Manager unter

Systemsteuerung -> System -> Register:Hardware -> Geräte-Manager

die versteckten Geräte anzeigen lassen

Menü:Ansicht -> Ausgeblendete Geräte anzeigen

Jetzt erscheinen in den entsprechenden Bereichen (z.B. Netzwerkkarten) zusätzliche Einträge, die etwas milchig aussehen. Diese können jetzt über die rechte Maustauste und „Deinstallieren“ entfernt werden.

Listen zeilenweise verarbeiten

Manchmal möchte man einfach eine Liste von Hosts in irgendwelchen Befehlen verarbeiten. Dann hilft diese einfache Schleife:

SET host=Clients.txt
for /f %%i in (%host%) do echo %%i

In der „host“-Datei Clients.txt sind die Rechnernamen enthalten, die in der for-Schleife verarbeitet werden sollen. Das Beispiel-echo ist durch den gewünschten Befehl zu ersetzen.

Inhalt der Datei Clients.txt:

Rechnername1
Rechnername2
Rechnername3
Rechnername4

apt-get / aptitude

Steuerung über die APT-Konfiguration

Wie der lokale Paket-Manager funktioniert kann man nicht nur per Script und Cronjobs sondern auch über die umfangreiche APT-Konfigurations-Syntax steuern. Die wichtigsten Parameter sind direkt im standardmäßig angelegten Cronjob „/etc/cron.daily/apt“ beschrieben.

Konfiguration eines Apt-Proxys

Dazu einfach unter

/etc/apt/apt.conf.d/

eine Konfigurations-Datei anlegen:

vi /etc/apt/apt.conf.d/01proxy

und in diese den folgenden Inhalt schreiben:

Acquire::http::Proxy "http://[[user][:pass]@]host[:port]/";

Hier z.B. die Konfiguration wenn lokal der apt-cacher installiert wurde:

Acquire::http::Proxy "http://localhost:3128/";

Automatische Installation von Sicherheits-Updates

Dafür ist erst einmal das zusätzliche Paket „unattended-upgrades“ notwendig.

aptitude install unattended-upgrades

Mit der Installation wird die notwendige Konfigurationsdatei „/etc/apt/apt.conf.d/50unattended-upgrades“ (beschrieben für Debian)

// Automatically upgrade packages from these (origin, archive) pairs
Unattended-Upgrade::Allowed-Origins {
 "${distro_id} stable";
 "${distro_id} ${distro_codename}-security";
// "${distro_id} ${distro_codename}-updates";
// "${distro_id} ${distro_codename}-proposed-updates";
};

// List of packages to not update
Unattended-Upgrade::Package-Blacklist {
// "vim";
// "libc6";
// "libc6-dev";
// "libc6-i686";
 "^linux-image.*";
};

// Send email to this address for problems or packages upgrades
// If empty or unset then no email is sent, make sure that you
// have a working mail setup on your system. The package 'mailx'
// must be installed or anything that provides /usr/bin/mail.
//Unattended-Upgrade::Mail "root@localhost";

// Do automatic removal of new unused dependencies after the upgrade
// (equivalent to apt-get autoremove)
//Unattended-Upgrade::Remove-Unused-Dependencies "false";

// Automatically reboot *WITHOUT CONFIRMATION* if a
// the file /var/run/reboot-required is found after the upgrade
//Unattended-Upgrade::Automatic-Reboot "false";

// Use apt bandwidth limit feature, this example limits the download
// speed to 70kb/sec
//Acquire::http::Dl-Limit "70";

installiert. Hier wird bestimmt, welche Pakete automatisch installiert bzw. von der automatischen Installation ausgenommen werden. Man kann sich auch per Email bei Fehlern benachrichtigen lassen.

Damit sind die automatischen Updates aber noch nicht aktiv!

Dafür müssen erst die folgenden drei Zeilen

APT::Periodic::Enable "1";
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

in die Datei „/etc/apt/apt.conf.d/10periodic“ geschrieben/angehängt werden. Durch diese zwei Zeilen werden die Paket-Listen einmal täglich aktualisiert und die Pakete, die in „/etc/apt/apt.conf.d/50unattended-upgrades“ konfiguriert sind, installiert.

Für die Benamung der Datei habe ich bisher noch keine Beschreibung gefunden. Da diese für die Funktion aber ohne Bedeutung ist, habe ich mich nach dem Eintrag im Ubuntu-Wiki gerichtet, in dem ich diese Konfiguration auch gefunden habe.

Die Ausführung erfolgt dann durch das vorhandene APT-Script „/etc/cron.daily/apt“, das täglich ausgeführt wird.

Update-Download

Wer möchte kann sich die anstehenden Updates ja bereits downloaden. Dann braucht es bei der Installation nicht so lange. Dazu muss man einfach eine Zeile der umfangreichen APT-Konfiguration aktivieren, in dem man sie in eine Datei unterhalb von „/etc/apt/apt.conf.d/“ schreibt.

Hat man es z.B. wie oben bei den automatischen Updates eingerichtet, kann man die folgende Zeile in die Datei „/etc/apt/apt.conf.d/10periodic“ eintragen:

APT::Periodic::Download-Upgradeable-Packages "1";

Damit werden die anstehenden Update-Dateien einmal täglich heruntergeladen, aber nicht installiert.

Cache aufräumen

Damit das standardmäßig vorhandene Script „/etc/cron.daily/apt“ auch das Aufräumen übernimmt, braucht man nur eine Zeile aktivieren.

APT::Periodic::AutocleanInterval "7";

Damit wird „apt-get autoclean“ alle 7 Tage ausgeführt.

Logs rotieren

Ich richte immer noch eine erweiterte Konfiguration für logrotate ein.

Fehlerbehebung

Wer seine anstehenden Linux-Updates per Nagios/Icinga überwacht, kann nach dem manuellen Neuanlegen der o.g. Dateien auf folgenden Fehler treffen:

'/usr/bin/apt-get -o 'Debug::NoLocking=true' -s -qq upgrade' exited with non-zero status.
APT WARNING: 0 packages available for upgrade (0 critical updates). warnings detected, errors detected. run with -v for information

Beim Testen des angezeigten Befehls treten wie immer keine Fehler auf. Man ist ja root. Also sollte der Befehl als der Benutzer ausgeführt werden, unter dem die Monitoring-Software läuft:

su <monitoringbenutzer> -s /bin/bash

Der Parameter -s für die Shell ist optional, aber bei Systembenutzern ohne Shell notwendig. Danach sieht man dann erst den eigentlichen Fehler:

/usr/bin/apt-get -o 'Debug::NoLocking=true' -s -qq upgrade
E: Konfigurationsdatei /etc/apt/apt.conf.d/10periodic wird geöffnet - ifstream::ifstream (13: Keine Berechtigung)

Einfach Leseberechtigungen für „Others“ auf die gemeldete Datei setzen und schon klappt’s mit dem Nachbarn ;-). Bei mir war die Ursache die restriktiv gesetzte UMASK im Profil.

logrotate Konfiguration unattended-upgrades

Diese Konfiguration nutze ich für die automatischen Updates unter Debian/Ubuntu. Dabei liegen die angelegten Logfiles standardmäßig unter „/var/log/unattended-upgrades/“. Die Konfiguration des Speicherortes passiert in der APT-Konfigurationsdatei „/etc/apt/apt.conf.d/50unattended-upgrades“ über den Parameter „APT::UnattendedUpgrades::LogDir“. Der Pfad ist in der Logrotate-Konfiguration also entsprechend zu setzen:

/var/log/unattended-upgrades/unattended-upgrades.log {
monthly
missingok
rotate 24
compress
dateext
notifempty
olddir /var/log/unattended-upgrades/old/
}

/var/log/unattended-upgrades/unattended-upgrades-dpkg*.log {
daily
missingok
rotate 92
compress
dateext
olddir /var/log/unattended-upgrades/old/
}

Die Konfiguration sollte vor dem ersten Einsatz getestet werden:

logrotate -d /etc/logrotate.d/<ConfigDatei>

Dabei kommt dann in etwa so etwas heraus:

reading config file /etc/logrotate.d/unattended-upgrades
reading config info for /var/log/unattended-upgrades/unattended-upgrades.log
olddir is now /var/log/unattended-upgrades/old/
reading config info for /var/log/unattended-upgrades/unattended-upgrades-dpkg*.log
olddir is now /var/log/unattended-upgrades/old/

Handling 2 logs

rotating pattern: /var/log/unattended-upgrades/unattended-upgrades.log monthly (24 rotations)
olddir is /var/log/unattended-upgrades/old/, empty log files are not rotated, old logs are removed
considering log /var/log/unattended-upgrades/unattended-upgrades.log
log does not need rotating

rotating pattern: /var/log/unattended-upgrades/unattended-upgrades-dpkg*.log after 1 days (92 rotations)
olddir is /var/log/unattended-upgrades/old/, empty log files are rotated, old logs are removed
considering log /var/log/unattended-upgrades/unattended-upgrades-dpkg*.log
log /var/log/unattended-upgrades/unattended-upgrades-dpkg*.log does not exist -- skipping

Zeitstempel formatieren

Ich verwende häufig Zeitstempel für die Benamung von Logdateien. Da der original Zeitwert von Windows dafür nicht brauchbar ist, formatiere ich ihn mir um.

Windows-Zeitstempel zerlegen

REM Erstmal den Originalwert vom System aufnehmen, ...
SET zeit=%time%
REM ... dann die Stunde extrahieren, ...
SET stunde=%time:~0,2%
REM ... die evtl. vorhandenen Leerzeichen durch eine Null ersetzen, ...
SET stunde=%stunde: =0%
REM ... dann die Minuten extrahieren, ...
SET minute=%time:~3,2%
REM ... und wieder die evtl. vorhandenen Leerzeichen durch eine Null ersetzen
SET minute=%minute: =0%

Zeitstempel neu zusammensetzen

Dadurch, dass man die einzelnen Bestandteile der Zeit jetzt in separaten Variablen hat, kann man diese nach eigenen Wünschen wieder zusammensetzen.

Z.B.

SET Zeit=%stunde%-%minute%.

Dateinamen zerlegen

Für die folgenden beispielhaften Ergebnisse:

Laufwerk: D:
Dateipfad: TestProbe
Dateiname: Versuch
Dateierweiterung: .bak

benötigt man folgende Zeilen:

for %%f in (*.bak) do echo Laufwerk: %%~df
for %%f in (*.bak) do echo Dateipfad: %%~pf
for %%f in (*.bak) do echo Dateiname: %%~nf
for %%f in (*.bak) do echo Dateierweiterung: %%~xf

 

awk – Auswertung von Textdateien

Was Awk ist, kann man auf Wikipedia nachlesen. Ich schreibe mir hier Zusammenstellungen auf, die mir merkenswert erscheinen.

Deinstallations-Liste aus Paketmanager dpkg erstellen

Manchmal muss man auch mal aufräumen. Dann hilft es schon, wenn man sich die Liste seines lokalen Paketmanagers (dpkg) für sein Online-Paketverwaltungstool (apt-get, aptitude) aufbereiten kann.

dpkg -l | grep lxde | awk '{progs=progs$2" "} END {print progs}'

Damit wird mit dpkg eine Liste der installierten Programme erzeugt und diese auf den Begriff lxde gefiltert. Das Ergebnis wird an awk per Pipe weitergegeben. Awk verarbeitet aus allen Zeilen die Spalte 2 ($2) und speichert diese zusammen mit einem Leerzeichen in der Variable progs. Zum Schluss (END) wird die Variable progs ausgegeben.

Jetzt kann man noch die Paketverwaltung seiner Wahl mit dem entsprechenden Deinstallations-Befehl (remove, purge) davorsetzen und die Programme werden entfernt.

Ein erweitertes Suchergebnis erhält man mit egrep, so dass man auch nach mehreren Begriffen suchen kann:

dpkg -l | egrep '(lxde|gnome|gdm)' | awk '{progs=progs$2" "} END {print progs}'

Hier muss man nur beachten, dass die Regular Expressions in Anführungszeichen stehen müssen. Im hier gezeigten Beispiel werden von alle Zeilen an awk übergeben, die „lxde“ oder „gnome“ oder „gdm“ enthalten.