Linux:FAQ
Datenschutz
********************************************************************* * * * THIS FILE MAY CONTAIN CONFIDENTIAL, PRIVILEGED OR OTHER LEGALLY * * PROTECTED INFORMATION. YOU ARE PROHIBITED FROM COPYING, * * DISTRIBUTING OR OTHERWISE USING IT WITHOUT PERMISSION FROM * * ALSO SCHWEIZ AG SWITZERLAND. * * * ********************************************************************* "Die in diesen Artikeln enthaltenen Informationen sind vertraulich und dürfen ohne schriftliche Zustimmung von der ALSO Schweiz AG gegenüber Dritt-Unternehmen nicht bekannt gemacht werden"
FAQ - Fragen und Antworten fuer Linux
Wo finde ich mehr Informationen ueber die "Filesystem Hierarchy"?
Filesystem Hierarchy Standard http://www.pathname.com/fhs/pub/fhs-2.3.html
Wie mounte ich einen USB Stick/Device?
Grundsaetzlich muss man wissen das ein USB Stick unter Linux als "SCSI" Device erkannt wird. Folgender Befehl zeigt welche "SCSI" Devices bereits auf dem System erkannt wurden:
# cat /proc/scsi/scsi
Sollte das System keine anderen SCSI Geräte erkennen so ist der Mount Point folgender Device:
/dev/sda1
NOTE
Wenn das System bereits über SCSI Geräte verfügt, kann das Device entsprechend anders Nummeriert sein zB. /dev/sda2, sdb1, etc.
Der USB Stick kann über den Mount Befehl als Filesystem gemountet werden. Als erstes erstellen wir einen "mount point" dh. ein Verzeichnis zB. /usb_stick:
# mkdir /usb_stick # mount /dev/sd[scsi device number] /usb_stick
Wie wechsle ich auf der Kommandozeile in den "background" oder "forderground"?
Unter Linux ist es moeglich zur gleichen Zeit indem ein Script laeuft in den "background" zu wechseln dh. wenn zB ein Script eine spezielle Angabe wuenscht, man diese jedoch momentan nicht weiss und man sich in einer seriellen "session" befindet, muesste man theoretisch das Script beenden und danach auf der "shell" die gewuenschte Angabe suchen und wiederum das Script erneut starten nachdem die gewuenschten Angaben auf der "shell" gefunden worden sind Das Ganze kann umgangen werden indem man in den "background" wechselt oder in den "forderground" dh. wenn wir ein Script starten und nun befinden wir uns zB in einem Dialog innerhalb des Scriptes, jedoch wissen wir die Angaben nicht ausser wir koennten kurz zurueck auf dies "shell", kann nun in den "background" gewechselt werden mit folgender Tasten-Kombination:
Ctrl+z
Nach der Tasten-Kombination befinden wir uns im "background" dh. das "shell" Script laeuft immer noch weiter im "forderground". Da wir uns nun auf der "shell" befinden koennen wir die gesuchten Angaben suchen. Haben wir diese gefunden wechseln wir wieder zurueck in den "forderground" dh. in das Script resp. in den Dialog des Scriptes zurueck. Gebe folgendes auf der Kommandozeile ein um in den "forderground" zu wechseln:
# fg
Wie partitioniere ich eine Festplatte?
Bei einer Partitionieren einer Festplatte ist als erstes zu identifizieren um welches Devices es sich handelt zB "/dev/hdb" usw. Ist dies festgestellt so kann mit dem Tool "fdisk" die Partitionierung vorgenommen werden:
# fdisk /dev/hdb
NOTE
In unserem Beispiel wurde die ganze Festplatte als "primary partition" angelegt und nur 1 Partition angelegt!
Wurde die Festplatte paritioniert so kann ein Filesystem angelegt werden zB "ext3":
# mke2fs -j /dev/hdb1
NOTE
Der Befehl "mke2fs" ist zwar zustaendig fuer das Anlegen eines "ext2" Filesystem jedoch durch die Angaben der Option "-j" fuer "journaling" wird ein "ext3" Filesystem angelegt.
Nach erfolgreichen anlegen des Filesystems kann die Festplatte zB ueber die Einstellungen in "/etc/fstab" gemountet werden dh.:
# vi /etc/fstab --------------- /etc/fstab --------------- /dev/hdb1 /export/bab_disk ext3 defaults 1 1 --------------- /etc/fstab --------------- # mount /dev/hdb1
Wie Finde ich das neuste File und zeige dieses oder dessen Inhalt an?
Wenn man vor dem Problem steht ein File in einem Verzeichnis anzeigen zu lassen wobei man wirklich das "neuste" File will so kann man dies folgendermassena auf Kommandozeile bewerkstelligen:
Print the newest file-name: --------------------------- # find ./ -type f -exec ls -l --time-style=long-iso --time=ctime {} \; | \ awk '{ printf("%s %s %s\n", $6, $7, $8) }' | \ sort | \ tail -1 | \ awk '{ print $3 }'
To cat the newest file: ----------------------- # cat ` find ./ -type f -exec ls -l --time-style=long-iso --time=ctime {} \; | \ awk '{ printf("%s %s %s\n", $6, $7, $8) }' | \ sort | \ tail -1 | \ awk '{ print $3 }'`
Wie ueberpruefe ich die Limitationen auf dem System?
Um auf einem Linux System die Limitationen zu ueberpruefen betreffed System dh. inkl. CPU und Filesystem (2GB) fuehre folgendes aus:
# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited file size (blocks, -f) unlimited max locked memory (kbytes, -l) unlimited max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 stack size (kbytes, -s) 1 0240 cpu time (seconds, -t) unlimited max user processes (-u) 16367 virtual memory (kbytes, -v) unlimited
Je nach situation kann dann mit der entsprechenden Option die Limitation erhoeht oder ausgeschaltet werden zB wuerde man erreichen wollen das "nur" max. 20 Prozesse aktiv sind muesste man folgenden Befehl geben:
# ulimit -u 40
ACHTUNG
Diese "tunings" und Eingriffe sind sehr gut zu ueberlegen da die Prozesse die ueber das Limit gehen rigoros beendet werden und es zu einem Datenverlust kommen kann!
Wie benutze ich tcpdump und seine Optionen?
Der Befehl "tcpdump" ist maechtig und besitzt "sehr" viele Optionen. Einige die nuetzlich und alltaeglich sind werden hier aufgefuehrt:
Filtere alle Packete von "Source" 192.168.101.11:
# tcpdump -i eth0 ip src 192.168.101.11
Filtere alle Packete von "Destination" 192.168.101.15:
# tcpdump -i eth0 ip dst 192.168.100.115
Filtere alle Packete fuer port "http":
# tcpdump -i eth0 port http
Filtere alle Packete fuer port "443":
# tcpdump -i eth0 port 443
Filtere alle Packete fuer die "Source" 192.168.101.11 mit port "443":
# tcpdump -i eth0 ip src 192.168.100.101 port 443
Filtere alle Packete fuer die "Destination" 192.168.101.11 mit port "http":
# tcpdump -i eth0 ip dst 192.168.100.115 port http
Filtere alle Packete fuer "Source Network" 192.168.3.0 mit Netmaske 255.255.255.0:
# tcpdump -i eth0 src net 192.168.3.0 mask 255.255.255.0
Filtere alle Packete fuer "Destination Network" 192.168.3.0 mit Netmaske 255.255.255.0:
# tcpdump -i eth0 dst net 192.168.3.0 mask 255.255.255.0
Filtere alle Packete fuer "Source Network" 192.168.3.0 mit Netmaske 255.255.255.0 und port 443:
# tcpdump -i eth0 src net 192.168.3.0 mask 255.255.255.0 and port 443
Filtere alle Packete fuer "Destination Network" 192.168.3.0 mit Netmaske 255.255.255.0 und port http:
# tcpdump -i eth0 dst net 192.168.3.0 mask 255.255.255.0 and port http
Filtere alle Packete fuer einen bestimmten "host" zB 192.168.3.1:
# tcpdump -i eth0 host 192.168.3.1
Filtere alle Packete fuer einen bestimmten "host" zB 192.168.3.1 sowie schreibe die Information in ein File "-w":
# tcpdump -i eth0 -w test.cap host 192.168.3.1
Um die Capture Size zu vergrösseren benutze die Option -s sowie um die Information in ein File zu schreiben benütze die Option -w:
# tcpdump -i eth0 -w test.cap host 192.168.3.1 --> capture size 96byte # tcpdump -i eth0 -s 0 -w test.cap host 192.168.3.1 --> capture size 65kb
Eine Kurzreferenz ueber andere Moeglichkeiten finden man unter:
http://taviso.decsystem.org/files/tcpdump_quickref.pdf
Wie bekomme ich unter Linux Zugriff auf ein NTFS Systeme?
Per Standard ist ein Linux System nicht faehig NTFS Systeme anzusprechen dh. um dies zu erreichen benoetigt das System einen Kernel Driver der dem Kernel die noetigen Informationen mitteilt! Dieser Kernel Treiber ist nicht Bestandteil der Linux Distribution sondern ist ein seperates Projekt das unter folgender URL zu finden ist:
http://www.linux-ntfs.org/
Ebenfalls sollte man sich die FAQ Seite ansehen die viele nuetzliche Infos enthaelt:
http://wiki.linux-ntfs.org/doku.php?id=ntfs-de
Auf nachfolgender Seite sind die einzelnen RPM der Distributionen zu finden:
http://www.linux-ntfs.org/content/view/128/64/
Um das RPM zu installieren benutze folgenden Befehl:
# rpm -ivh [rpm]
Nach der Installation muss das neue Module geladen werden:
# /sbin/modprobe ntfs
Um eine Kontrolle durchzufuehren ob das Module ordnungsgemaess geladen wurde benuetze folgendes Kommando:
# dmesg | grep NTFS und/oder # cat /proc/filesystems
Um eine NTFS Partition zu mounten benuetze:
# mount /dev/[ntfs device] /mnt/[mountdir] -t ntfs -r
Es stehen verschiedene Optionen zur Verfuegung:
-t ntfs Spezifiert das zu verwendende Dateisystem. Diese Option ist eigentlich nicht nötig, da mount intern einen Scan-Modus enthält, der das entsprechende Dateisystem automatisch erkennt: -r Mounted die Partition im Nur-Lese Modus. Normalerweise versucht mount die Partition im Schreib-Lese-Zugriff einzuhängen (Was meistens aufgrund von möglichen eingedrungenen Hackern etc. nicht empfehlenswert ist) - sofern nicht durch diese Option ausgedrücklich gewünscht. -o ro dasselbe wie Option -r. -o umask={WERT} Die voreingestellten Zugriffsrechte auf einer NTFS-Partition sind rwx—— (D.h. nur Root kann Dateien lesen, schreiben und ausführen - aus Sicherheitsgründen). Der umask Parameter kontrolliert nun diese Zugriffsrechte. -o uid={USERID} Normalerweise gehört eine NTFS-Partition und deren Dateien nach dem mounten (einhängen) dem Eigner Root. Wenn man nun den uid Parameter angibt, kann man den Eigner ändern. Als UserId kann man jeden aus /etc/passwd nehmen, oder irgendeine Nummer, die diesen neuen Eigner eindeutig kennzeichnet. -o gid={GROUPID} Wie zuvor für den Eigner bzw. UserId beschrieben kann man ähnlich dazu auch die Gruppe ändern - die ebenfalls auf Gruppe Root voreingestellt ist. -o utf8=true Sollte Ihr Kernel nicht utf8 unterstützen, können Sie diese Option verwenden, damit der Treiber utf8 unterstützt. Sie sollten - wann immer möglich - die Option -o iocharset=utf8 verwenden!. -o posix={BOOL} Windows behält die Groß-/Kleinschreibung von Datei- und Verzeichnisnamen, aber es unterscheidet NICHT dazwischen - d.h. MyFileName ist GLEICH zu myfilename. Was daraus folgt, wenn Sie den Namen “MyFileName” zum löschen einer Datei verwenden, wird myfilename gelöscht (und umgekehrt) Linux hingegen UNTERSCHEIDET zwischen Groß- und Kleinschreibung, so das myfilename eine andere Datei ist als MyFileName. Soll nun Linux innerhalb des Zugriffs auf eine NTFS-Partition sich gleich zu Windows verhalten, so müssen Sie die posix auf true (bzw. 1) setzen. -o show_sys_files={BOOL} Wenn diese Option auf true gesetzt ist, werden die NTFS Dateisystem Metadaten sichtbar. Ansonsten muß man sie explizit angeben, um sie zu sehen: ls -l \$MFT zum Darstellen der Master File Table
NOTE Aufrgund einer Restriktion der glibc (einer Bibliothek zum Erstellen/Ausfrühren des NTFS-Treibers) wird die $MFT nicht in Listings erscheinen, da ihre Inode-Nummer 0 ist.
Wenn man den NTFS Treiber sowie Partition automatisch mit Linux laden moechte so ist folgender zusaetzlicher Eintrag im Bootloader (grub) noetig:
# vi /boot/grub/grub.conf --------------- /boot/grub/grub.conf --------------- title Windows root (hd0,0) makeactive chainloader +1 --------------- /boot/grub/grub.conf ---------------
Wie kann ich ein RPM installieren ohne RPM Manager oder RPM Package?
Wenn das RPM package rpm-4.3.1-0.3.i386.rpm auf einer Linux Distribution deinstalliert wurde koennen keine RPM Kommandos mehr abgesetzt werden wie zB. "rpm -ivh [package] das zB fuer die Installation eines RPM Packages zustaendig ist. Um den Package Manager dh. das rpm package wieder zu installieren muss ein Workaround angewandt werden dh. erstelle folgendes Script im "/":
# vi /rpm2cpio --------------- /rpm2cpio --------------- #!/usr/bin/perl # Copyright (C) 1997,1998,1999, Roger Espel Llima # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and any associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # SOFTWARE'S COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE # (whew, that's done!) # why does the world need another rpm2cpio? because the existing one # won't build unless you have half a ton of things that aren't really # required for it, since it uses the same library used to extract RPM's. # in particular, it won't build on the HPsUX box i'm on. # sw 2002-Mar-6 Don't slurp the whole file # add a path if desired $gzip = "gzip"; sub printhelp { print <<HERE; rpm2cpio, perl version by orabidoo <odar\@pobox.com> +sw dumps the contents to stdout as a cpio archive use: rpm2cpio [file.rpm] > file.cpio Here's how to use cpio: list of contents: cpio -t -i < /file/name extract files: cpio -d -i < /file/name HERE exit 0; } if ($#ARGV == -1) { printhelp if -t STDIN; $f = "STDIN"; } elsif ($#ARGV == 0) { open(F, "< $ARGV[0]") or die "Can't read file $ARGV[0]\n"; $f = 'F'; } else { printhelp; } printhelp if -t STDOUT; # gobble the file up ##undef $/; ##$|=1; ##$rpm = <$f>; ##close ($f); read $f,$rpm,96; ($magic, $major, $minor, $crap) = unpack("NCC C90", $rpm); die "Not an RPM\n" if $magic != 0xedabeedb; die "Not a version 3 or 4 RPM\n" if $major != 3 && $major != 4; ##$rpm = substr($rpm, 96); while (!eof($f)) { $pos = tell($f); read $f,$rpm,16; $smagic = unpack("n", $rpm); last if $smagic eq 0x1f8b; # Turns out that every header except the start of the gzip one is # padded to an 8 bytes boundary. if ($pos & 0x7) { $pos += 7; $pos &= ~0x7; # Round to 8 byte boundary seek $f, $pos, 0; read $f,$rpm,16; } ($magic, $crap, $sections, $bytes) = unpack("N4", $rpm); die "Error: header not recognized\n" if $magic != 0x8eade801; $pos += 16; # for header $pos += 16 * $sections; $pos += $bytes; seek $f, $pos, 0; } if (eof($f)) { die "bogus RPM\n"; } open(ZCAT, "|gzip -cd") || die "can't pipe to gzip\n"; print STDERR "CPIO archive found!\n"; print ZCAT $rpm; while (read($f, ($_=), 16384) > 0) { print ZCAT; } close ZCAT; --------------- /rpm2cpio --------------- # chmod 700 /rpm2cpio
Das Script bewirkt das ein orginales RPM package manuell entpackt werden kann und anhand der Angaben im RPM Packages installiert wird! Um dies auszufuehren gebe folgendes ein:
# ./rpm2cpio rpm-4.3.1-0.3.i386.rpm | cpio -dimv
Nach der Installation durch rpm2cpio steht der Package Manager rpm wieder zur Verfuegung und es wird empfohlen das orginale rpm Package nochmals im normalen Modus zu installieren dh:
# rpm -ivh rpm-4.3.1-0.3.i386.rpm
Ich moechte anhand Rsynch eine Disk/Filesystem lokal kopieren?
Rsynch kann auf verschiedene Arten und Weisen genutzt werden dh. ueber SSH Remote etc. Wenn rsynch eingesetzt wird lokal um von Disk zu Disk zu kopieren dann benuetze:
# rsynch -av [source dir]/* [destination dir]/
Durch diesen Befehl werden alle Files auf die Disk kopiert. Loescht man ein File im "source dir" und nachtraeglich wird wieder ein rsynch ausgefuehrt wird dieses auch im "destination dir" geloescht.
Die Option -av bedeutet: -v Verbose -a Beinhaltet folgende Optionen "rlptgoD"
Um ein Backup durchzufuehren kann auch die Option "-b" (Backup) benuetzt werden.
Fehlermeldung: EXT3-fs error (device): ext3_journal_start_sb?
Wenn eine Festplatte das Journal verliert oder dieses Korrupt wird kommt es zu folgender Fehlermeldung:
Sep 5 07:08:29 kolab2 kernel: EXT3-fs error (device md0): ext3_free_blocks_sb: bit already cleared for block 8192 Sep 5 07:08:29 kolab2 kernel: Aborting journal on device md0. Sep 5 07:08:29 kolab2 kernel: EXT3-fs error (device md0) in ext3_reserve_inode_write: Journal has aborted Sep 5 07:08:29 kolab2 kernel: EXT3-fs error (device md0) in ext3_truncate: Journal has aborted Sep 5 07:08:29 kolab2 kernel: EXT3-fs error (device md0) in ext3_reserve_inode_write: Journal has aborted Sep 5 07:08:30 kolab2 kernel: EXT3-fs error (device md0) in ext3_orphan_del: Journal has aborted Sep 5 07:08:30 kolab2 kernel: EXT3-fs error (device md0) in ext3_reserve_inode_write: Journal has aborted Sep 5 07:08:30 kolab2 kernel: EXT3-fs error (device md0) in ext3_delete_inode: Journal has aborted Sep 5 07:08:30 kolab2 kernel: __journal_remove_journal_head: freeing b_committed_data Sep 5 07:08:30 kolab2 kernel: ext3_abort called. Sep 5 07:08:30 kolab2 kernel: EXT3-fs error (device md0): ext3_journal_start_sb: Detected aborted journal Sep 5 07:08:30 kolab2 kernel: Remounting filesystem read-only
Dies bedeutet das die Partition auf "read-only" gesetzt wird um weiteren Schaden zu verhindern! Um das Journal zu korrigieren oder zu loeschen muss dieses im ersten Schritt geloescht werden. Um dies durchzufuehren muss die Partition abgehaengt werden (umount). Dies kann unter Umstaenden nur ueber eine Serielle Verbindung durchgefuehrt werden.
# debugfs -w -R "feature ^has_journal,^needs_recovery" /dev/md0 # e2fsck /dev/md0 e2fsck 1.38 (30-Jun-2005) Superblock doesn't have has_journal flag, but has ext3 journal inode. Clear<y>? yes /dev/md0 contains a file system with errors, check forced. Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information Block bitmap differences: -(1557--8191) # tune2fs -j /dev/md2
NOTE
Wenn der Befehl in diesem Sinne abgesetzt wird und bei der Frage im Context kein Zeitraum angegeben wird stellt die Anzahl "0" der maximalen Mountvorgaenge zwischen zwei Dateisystemchecks keine Ueberpruefung dar dh. e2fsck(8) und der Kernel ignorieren die Anzahl der Mountvorgaenge.
Wie kann ich Yum-Priority sowie FreshRPM installieren und nutzen?
Linux:Yum-Priority-FreshRPM
Wie konfiguriere ich eine NTP Client Funktion?
Um einen Linux Server betreffend Zeit auf den neusten Stand zu halten benutzt man die NTP Client Funktion dh. der Linux Server aktuallisiert seine Zeit anhand eines NTP Servers. Dazu bötigt man die Binaries des NTP Packetes dh. konkret "ntpdate". Um das Packet zu installieren benütze folgnden Befehl:
# yum install ntp
Danach wird das betreffende und benütze Repository abgefragt und das entsprechende NTP Package zum Download zur Verfügung gestellt. Wenn das Package installiert ist kann im "cron" Job folgendes konfiguriert werden:
# crontab -e --------------- crontab -e --------------- 0 0,6,12,18 * * * /usr/sbin/ntpdate ch.pool.ntp.org --------------- crontab -e ---------------
Danach sollte der "cron" Job aktualisiert werden:
# /etc/init.d/crond restart
Das Kommando kann auch auf der Kommandozeile ausgeführt werden. Wenn die Zeit anhand des Befehls im "cron" Job aktualisiet wird wird im "/var/log/messages" ein entsprechender Log Eintrag generiert.
Wie benutze ich "nmap" auf Linux?
Wenn das "nmap" Package installiert ist (yum install nmap) kann "nmap" folgendermassen benutzt werden:
Full Scan # nmap -sSUV -O -P0 -T5 -p1-65535 192.168.100.0/24
Full TCP Scan # nmap -sSV -O -P0 -T5 -p1-65535 192.168.100.0/24
Full UDP Scan # nmap -sUV -O -P0 -T5 -p1-65535 192.168.100.0/24
Range of IP # nmap 192.168.100.1-10
Range of ports # nmap -p 1-1024 192.168.100.1
Service Version Detection # nmap -sV 192.168.100.1
OS Version Detection # nmap -A 192.168.100.1
External Script Checks # nmap -sC 192.168.100.1
Scan without ping check (sometimes ping is blocked but you still want to scan) # nmap -PN 192.168.100.1
Scan only scanning known ports (fast scan) # nmap -F 192.168.100.1
Reverse Lookup Scan # nmap -sL -P0 192.168.100.0/24
Wie kann ich basierend auf einem Cron Job und eine Shell Script zeitlich Terminierte Nachrichten versenden?
Wenn man zB unter Linux einen Notification alle 45 Tage versenden möchte kann dies anhand eines Cron Jobs und einem Linxu Script bewerkstelligt werden. Als Erstes erstellen wir das nötige Shell Script.
# mkdir /opt/scripts # chmod 700 /opt/scripts # chown root:root /opt/scripts # vi /opt/scripts/45dayjob-cron.sh NOTE In diesem Beispile wird ein File als Counter angelegt "/opt/scripts/45dayjob-counter". Dieser Counter zählt jeden Tag +1 bis der Wert erreicht ist. Danach wird das Mail ausgelöst. Ist Der Counter erreicht wird er mit "echo +1 überschrieben und beginnt von Neuem. Der Text der im Mail erscheint wird im File "/opt/scripts/45dayjob-mail.txt" abgelegt. --------------- /opt/scripts/45dayjob-cron.sh --------------- #!/bin/sh OLDCOUNT=`cat /opt/scripts/45dayjob-counter` if [ -z $OLDCOUNT ] then OLDCOUNT=1 fi MODULO=$[OLDCOUNT%43] if [ $MODULO -gt '0' ] then echo $[OLDCOUNT+1] > /opt/scripts/45dayjob-counter else echo 1 > /opt/scripts/45dayjob-counter cat /opt/scripts/45dayjob-mail.txt | nail -s "[Place your Mail Subject here]" -r [Mailaddress from] [Mailaddress to] fi --------------- /opt/scripts/45dayjob-cron.sh ---------------
# vi /opt/scripts/45dayjob-mail.txt --------------- //opt/scripts/45dayjob-mail.txt --------------- Dear Sir The counter reached 45 Days! Your Crontab --------------- /opt/scripts/45dayjob-mail.txt ---------------
Nun fehlt nur noch einen Cron-Job der das Ganze Täglich kontrolliert dh.:
# crontab -e --------------- crontab -e --------------- 0 8 * * * /opt/scripts/45dayjob-cron.sh --------------- crontab -e ---------------
Wie kann ich ein Linux System betreffend RAM Benützung überprüfen?
Wenn man rausfinden will wie die RAM Benützung inkl. SWAP etc. auf einem Linux System ist können vers. Befehle und Files auskunft geben zB:
Nachfolgender Befehl listet alle Prozesse auf nach Ihrer RAM Benützung: # ps -e -orss=,args= | sort -b -k1,1n | pr -TW$COLUMNS
Nachfolgender Befehl zeigt die RAM Benutztung sowie SWAP Benützung im Gesamten sowie die CPU Auslastung pro Prozess: # top # vmstat 3
Die Memory Benützung wird ebenfalls im folgenden File aufgelistet: # cat /proc/meminfo
Was sind die minimalen Services die ich unter CentOS benötige?
Unter folgenden Link findet man eine Liste mit Kurzbeschreiben welcher Services für WAS benötigt wird:
http://magazine.redhat.com/2007/03/09/understanding-your-red-hat-enterprise-linux-daemons/ oder http://www.hscripts.com/tutorials/linux-services/index.php
Ueberprüfe als Erstes welche Services momentan aktiv sind:
# chkconfig --list |grep "3:on" |awk '{print $1}' |sort
Speicher diese Informationen in einem File "before"
# chkconfig --list |grep "3:on" |awk '{print $1}' |sort > before
Folgende Services können unter normalen Umständen deaktiviert werden:
# chkconfig anacron off # chkconfig apmd off # chkconfig atd off # chkconfig autofs off # chkconfig cpuspeed off # chkconfig cups off # chkconfig cups-config-daemon off # chkconfig gpm off # chkconfig isdn off # chkconfig netfs off # chkconfig nfslock off # chkconfig openibd off # chkconfig pcmcia off # chkconfig portmap off # chkconfig rawdevices off # chkconfig readahead_early off # chkconfig rpcgssd off # chkconfig rpcidmapd off # chkconfig smartd off # chkconfig xfs off # chkconfig ip6tables off # chkconfig iptables off # chkconfig avahi-daemon off # chkconfig firstboot off # chkconfig yum-updatesd off # chkconfig sendmail off # chkconfig mcstrans off # chkconfig pcscd off # chkconfig bluetooth off # chkconfig hidd off # chkconfig restorecond off NOTE "anacron" und "kudzu" werden nur beim Start ausgeführt und sobald diese Ihre Aufgaben nach dem Start durchgeführt haben werden die Services beendet!
Folgende Services sollten "nur" dann deaktiviert werden, wenn sichergestellt ist das diese nicht benutzt werden:
# chkconfig xinetd NOTE Wird für einige Server benötigt!
# chkconfig acpid NOTE Wird benötigt für den "power button" um den Server/Maschine ordnungsgemäss runterzufahren!
# chkconfig microcode_ctl NOTE Wird nicht benötigt auf einer AMS basierenden Server/Maschine!
# chkconfig irqbalance NOTE Wir nicht benötigt sofern SMP, Mutiple Cores, Multiple Processors oder Hyperthreading nicht benutzt wird!
# chkconfig haldaemon # chkconfig messagebus NOTE Wird benötigt für Plug + Play Geräte/Devices!
# chkconfig mdmonitor NOTE Wird nicht benötigt sofern kein Software Raid benutzt wird!
Nachdem die Services deaktiviert wurden kann der Status wiederum in ein File geschrieben werden "after":
# chkconfig --list |grep "3:on" |awk '{print $1}' |sort > after
Mit folgenden Befehl sieht man nun den Unterschied von "before" und "after":$
# diff before after
Führe nachder Modifikationen der Services einen Neustart aus:
# reboot
Wie konfiguriere ich "Source Policy Based Routing"?
Wenn man auf einem Server mehrere Interfaces hat stellt sich die Problematik, dass zwar die Anfragen ueber das entsprechende Interface reinkommt zB eth1 jedoch die Antwort über das Interface rausgeht über dieses der Default Gateway gesetzt ist dh. eth0. Speziell wenn eth0 und eth1 im gleichen Subnet sind. Um wirklich das System zu zwingen Anfragen uber eth1 und/oder eth0 auch über das jeweilige Interface zu beantworten muss "Source Policy Based Routing" implementiert werden (iproute). In unserem Beispiel gehen wir davon aus, dass folgende Konstellation existiert:
eth0 = 192.168.100.125 Subnet 255.255.255.0 eth1 = 192.168.100.123 Subnet 255.255.255.0 Default Gateway 192.168.100.120
Als Erstes erstelle die entsprechende Rule im File "rt_tables" und zwar fuer jedes Interface seperate:
# vi /etc/iproute2/rt_tables --------------- /etc/iproute2/rt_tables --------------- # # reserved values # 255 local 254 main 253 default 0 unspec # # local # 200 rule-eth1 201 rule-eth0 --------------- /etc/iproute2/rt_tables ---------------
Danach definiere die Rule's:
# /etc/sysconfig/network-scripts/rule-eth0 --------------- /etc/sysconfig/network-scripts/rule-eth0 --------------- from 192.168.100.125/32 table rule-eth0 --------------- /etc/sysconfig/network-scripts/rule-eth0 ---------------
# /etc/sysconfig/network-scripts/rule-eth1 --------------- /etc/sysconfig/network-scripts/rule-eth1 --------------- from 192.168.100.123/32 table rule-eth1 --------------- /etc/sysconfig/network-scripts/rule-eth1 ---------------
Nun die Rule's wurden definiert nun definiere die Routing Policy fuer die jeweilige Rule:
# vi /etc/sysconfig/network-scripts/route-eth0 --------------- /etc/sysconfig/network-scripts/route-eth0 --------------- default table rule-eth0 via 192.168.100.120 dev eth0 --------------- /etc/sysconfig/network-scripts/route-eth0 ---------------
# vi /etc/sysconfig/network-scripts/route-eth1 --------------- /etc/sysconfig/network-scripts/route-eth1 --------------- default table rule-eth1 via 192.168.100.120 dev eth1 --------------- /etc/sysconfig/network-scripts/route-eth1 ---------------
Nun muss das Ganze aktualisiert werden indem der Service "network" neu gestartet wird:
# service network restart
Nachträglich kann das "Source Policy Based Routing" mit folgendem Befehl kontrolliert werden:
# ip route show
Nun kann zB anhand SCP ein Test durchgeführt werden um so zu kontrolliere ob wirklich für einen Transfer auf eth1 auch eth1 benutzt wird sowie für eth0.
Wie konfiguriere ich ein Linux Backup anhand "rsync"?
Wenn man von einem Linux Server aus von anderen Linux Server ein Backup ziehen möchte, so kann dies anhand "rsync" geschehen. Dies bedeutet eigentlich nimmt man folgende Komponenten zur Hilfe:
rsync rsnapshot ssh
Dabei wird über einem SSH Tunnel rsync ausgeführt und lokal für die sogenannte "Rotation" rsnapshot benutzt. Um dies einzurichten installiere auf dem Linux Backup Server die oben angegebenen Komponenten anhand:
yum install rsync yum install rsnapshot
Nun führe folgendes durch:
# mkdir /backup # mkdir /backup-data # mkdir /backup/bin # mkdir /backup/etc # mkdir /backup/log # mkdir /backup/run # chmod -R 755 /backup # chmod 755 /backup-data
# vi /backup/bin/rsnapshot.host --------------- /backup/bin/rsnapshot.host --------------- #!/bin/sh ############################################################################## # # rsnapshot.host # version 0.3 # 2009-05-26 # # This script checks whether the host is online or not before it performs an # rsnapshot backup. # # The once option performs monthly, weekly, and daily rsnapshot runs, but # only if it hasn't already done a monthly run this month, a weekly run this # week, or a daily run today. # # Copyright (c) 2009 Michael Nordstrom # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # ############################################################################## if [ $# -ne 2 ] && [ $# -ne 3 ]; then echo "usage: $(basename $0) <host> {hourly|daily|weekly|monthly|once|du [dir]}" exit fi HOST=$1 OPTION=$2 ########################## USER DEFINES ######################### # Location of rsnapshot application RSNAPSHOT="/usr/bin/rsnapshot" # Location of configuration file RSNAPSHOT_CONF_FILE="/backup/etc/rsnapshot.conf.$HOST" # Path to lock-files used by the once option LOCKFILE_PATH="/backup/run" # Location of rsnapshot's lock-file RSNAPSHOT_LOCKFILE="$LOCKFILE_PATH/rsnapshot.pid.$HOST" ################################################################# # Set global variable used to initialize configuration file for given host export HOST # Check that rsnapshot isn't already running if [ -f $RSNAPSHOT_LOCKFILE ]; then echo "rsnapshot is already running." exit fi # It should be possible to check the size of the backup even if the given # host is down. if [ $OPTION = "du" ]; then # Check specified directory or all if [ $# -eq 3 ]; then DIR=$3 $RSNAPSHOT -c $RSNAPSHOT_CONF_FILE du $DIR else $RSNAPSHOT -c $RSNAPSHOT_CONF_FILE du fi exit fi # Check if host is up and running; ping will return 1 if host is online, # 0 if down online=$(ping -c 1 $HOST | grep -c 'time=') if [ $online -eq 0 ]; then echo "$HOST is down." exit fi # run rsnapshot case $OPTION in hourly) $RSNAPSHOT -c $RSNAPSHOT_CONF_FILE hourly ;; daily) $RSNAPSHOT -c $RSNAPSHOT_CONF_FILE daily ;; weekly) $RSNAPSHOT -c $RSNAPSHOT_CONF_FILE weekly ;; monthly) $RSNAPSHOT -c $RSNAPSHOT_CONF_FILE monthly ;; once) # Location of daily, weekly, and monthly lock-files DAILY_LOCKFILE="$LOCKFILE_PATH/rsnapshot.daily.$HOST" WEEKLY_LOCKFILE="$LOCKFILE_PATH/rsnapshot.weekly.$HOST" MONTHLY_LOCKFILE="$LOCKFILE_PATH/rsnapshot.monthly.$HOST" # Monthly backup if [ ! -f $MONTHLY_LOCKFILE ]; then $RSNAPSHOT -c $RSNAPSHOT_CONF_FILE monthly touch $MONTHLY_LOCKFILE fi # Weekly backup if [ ! -f $WEEKLY_LOCKFILE ]; then $RSNAPSHOT -c $RSNAPSHOT_CONF_FILE weekly touch $WEEKLY_LOCKFILE fi # Daily backup if [ ! -f $DAILY_LOCKFILE ]; then $RSNAPSHOT -c $RSNAPSHOT_CONF_FILE daily touch $DAILY_LOCKFILE fi ;; esac --------------- /backup/bin/rsnapshot.host --------------- # chmod 775 /backup/bin/rsnapshot.host
Diese Datei "rsnapshot.host" steuer die generelle Ausführung der Backup Host Dateien die nun erstellt werden. Dies bedeutet für jeden Host der ins Backup einbezogen wird muss ein File erstellt werden. Dieses File wird dann über die vorgängig erstelltes Script "rsnapshot.host" ausgeführt:
# vi /backup/etc/rsnapshot.conf.example ACHTUNG Jeder Abstand in diesem File MUSS zwingend mit einem TABULATOR erstellt werden! --------------- /backup/etc/rsnapshot.conf.example --------------- config_version 1.2 snapshot_root /backup-data/dev cmd_cp /bin/cp cmd_rm /bin/rm cmd_rsync /usr/bin/rsync cmd_ssh /usr/bin/ssh cmd_du /usr/bin/du ssh_args -l 18000 -o BatchMode=yes -F /root/.ssh/config link_dest 1 verbose 2 loglevel 2 logfile /backup/log/rsnapshot.dev lockfile /backup/run/rsnapshot.pid.dev exclude_file /backup/etc/exclude.dev #retain hourly 4 retain daily 14 retain weekly 4 retain monthly 2 backup root@dev:/opt/ dev/ backup root@dev:/root/ dev/ backup root@dev:/export/ dev/ backup root@dev:/etc/ dev/ backup root@dev:/var/spool/cron/ dev/ backup root@dev:/var/log/ dev/ --------------- /backup/etc/rsnapshot.conf.example --------------- NOTE Die Option "ssh_args 18000" bestimmt die verwendete Bandbreite innerhalb des SSH Tunnels dh. 18000 entspricht ungfähr 54 Mbit. Dies gewährleistet, dass nicht die ganze Bandbreite für das Backup belegt wird! # chmod 644 /backup/etc/rsnapshot.conf.example
Das erstellte File wird -wie schon erwähnt- über das Script "rsnapshot.host" aufgerufen und ist die Steuerdatei des Hosts oder auch einfach die Konfig Datei. Dies bedeutet dort wird definiert WAS ins Backup einbezogen werden soll, Wie die Rotation ausgeführt werden soll, Wo geloggt werden soll etc. Um nun einzelne Files oder Verzeichnisse aus dem Backup auszuschliessen erstelle folgende Datei mit dem gewünschten Inhalt:
# vi /backup/etc/exclude.dev --------------- /backup/etc/exclude.dev --------------- /opt/scripts/* /root/.ssh --------------- /backup/etc/exclude.dev --------------- # chmod 644 /backup/etc/rsnapshot.conf.example
Wie schon erwähnt ist das File "rsnapshot.host" ein Script, dass die Konfig Dateien aufruft und das durchführt was definiert wurde. Um dieses Script automatisiert aufzurufen erstelle einen Cron Job:
# crontab -e --------------- crontab -e --------------- # Rotate data from backup 0 0 * * * rm -f /backup/run/rsnapshot.daily.* > /dev/null 2>&1 0 0 * * mon rm -f /backup/run/rsnapshot.weekly.* > /dev/null 2>&1 0 0 1 * * rm -f /backup/run/rsnapshot.monthly.* > /dev/null 2>&1 # # Backup data from hosts with rsnapshot 0 1 * * * /backup/bin/rsnapshot.host dev once > /dev/null 2>&1 --------------- crontab -e ---------------
Nach jedem Job wird im "/backup/run" Verzeichnis ein File angelegt. Dieses gilt als sogenanntes "lock" File dh. wenn dieses File existiert wird KEIN Backup Job ausgeführt. Aus diesem Grund läuft in den entsprechenden Abständen dh. daily, weekly, monthly ein Cron Job der diese Files entfernt um die Freigabe zu erteilen, dass daily, weekly oder monthly Backup durchzuführen.
Nun muss nur noch auf den Linux Server auf denen ein Backup durchgeführt wird eine "Public Key" Authentication etabliert werden damit über den SSH Tunnel das Backup durchgeführt werden kann:
--> Auf dem Backup Server durchzuführen: # vi /root/.ssh/config --------------- /root/.ssh/config --------------- Host * UserKnownHostsFile /root/.ssh/known_hosts IdentityFile /root/.ssh/id_rsa --------------- /root/.ssh/config --------------- # chmod 644 /root/.ssh/config # cd /root # mkdir /root/.ssh # chmod 700 /root/.ssh # chown root:root /root/.ssh # ssh-keygen -t rsa -f /root/.ssh/id_rsa Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: f8:8f:c9:ef:42:17:8d:6d:5b:5a:95:24:47:03:55:49 root@[FQDN des Primary Servers] NOTE Gebe keine "passphrase" dh. gehe einfach mit Enter weiter! # chmod 600 /root/.ssh/id_rsa
--> Auf dem Linux Server durchzuführen: # cd /root # mkdir /root/.ssh # chmod 700 /root/.ssh # chown root:root /root/.ssh Kontrolliere das folgende Konfiguration besteht: # vi /etc/ssh/sshd_config --------------- /etc/ssh/sshd_config --------------- # Are root logins permitted using sshd. # Note that sshd uses pam_authenticate(3PAM) so the root (or any other) user # maybe denied access by a PAM module regardless of this setting. # Valid options are yes, without-password, no. PermitRootLogin without-password # Only specific User or Host is allowed AllowUsers root@[FQDN des Replica Servers] emcsrv # PubkeyAuthentication is available PubkeyAuthentication yes --------------- /etc/ssh/sshd_config --------------- # service sshd restart
--> Auf dem Backup Server durchzuführen: Kopiere nun den Public Key vom Backup Server über "scp" auf den Linux Server: # ssh-copy-id -i /root/.ssh/id_rsa.pub root@[FQDN des Servers]
--> Auf dem Linux Server durchzuführen: Kontrolliere ob der Public Key korrekt kopiert wurde und vergebe die korrekten Rechte: # chmod 600 /.ssh/authorized_keys
--> Auf dem Backup Server durchzuführen: Teste nun ob die Etablierung der Public Key Authentication erfolgreich war:
# ssh root@[FQDN des Servers]
Was kann ich tun wenn "yum update" nicht mehr funktioniert (Segmentation fault)?
Nun wenn "yum update" ausgeführt ist kann es aus verschiedenen Gründen zu Fehlermeldungen kommen wie:
Segmentation fault Transaction Error
Nun um den Prozess von Grund auf neu zu Starten (Caching) kann folgendes ausgeführt werden:
# yum clean all
Dieses Kommando kann helfen muss aber nicht. Wenn Script Fehlermeldungen kommen oder sonstige Fehlermeldungen ist es ratsam die gesamte Datenbank von "yum" zu löschen. Diese Files der Datenbank befinden sich im Verzeichnis "/var/lib/rpm". Um die Informationen von "yum" Vollständig zu löschen führen folgendes aus:
# cd /var/lib/rpm # rm -f __db*
Nun sind die Informationen entfernt sowie die Datenbank. Um diese jedoch neu zu indizieren führe folgendes aus:
# rpm -qa -vv
Nachdem der Prozess durchgelaufen ist führe erneut zur Kontrolle folgendes aus:
# yum clean all
Nun sollte der Befehl sauber durchlaufen. Ist dies der Fall kann "yum update" wie gewohnt ausgeführt werden.
Auf meiner CentOS Installation existieren die Files /dev/urandom /dev/ptmx /dev/null sowie /dev/random nicht?
Es kann vorkommen das die genannten Files auf einer CentOS Installation nicht existieren. Wenn dem so ist können diese anhand des "mknod" Befehls angelegt werden:
# mknod /dev/random c 1 9 # mknod /dev/urandom c 1 9 # mknod /dev/ptmx c 5 2 # mknod /dev/null c 1 3 # chmod +666 /dev/null