Prüfungsvorbereitung für die LPI 201-Prüfung

Auf dieser Seite habe ich meine prüfungsvorbereitenden Notizen für die LPI 201-Prüfung niedergeschrieben. Dieses soll natürlich keinen Online-Lern-Kurs repräsentieren, sondern nur den Überblick verschaffen, welche Themen in der LPI 201 Prüfung vorkommen können. Natürlich kann diese Notizen hervorragend dazu nutzen, um das angelernte Wissen zu überprüfen oder die Programme und Parameter noch mal ins Gedächtnis zu rufen

Prüfungsvorbereitende Notizen

Inhaltsverzeichnis

LPI 201 1

LPI 2.201.1 Kernel-Komponenten 1

LPI 2.201.3 Patchen eines Kernels 1

LPI 2.202.1 Systemstart 1

LPI 2.203.1 Dateisystem 1

LPI 2.203.2 Linux-Dateisysteme verwalten [4] 1

LPI 2.203.3 Erstellen und Konfiguration von Dateisystemoptionen [3] 1

LPI 2.204.1 RAID-Konfiguration [2] 1

LPI 2.204.2 Neue Hardware hinzufügen [3] 1

LPI 2.204.3 Software- und Kernelkonfiguration [2] 1

LPI 2.204.4 Konfiguration von PCMCIA-Karten [1] 1

LPI 2.209.1 Konfiguration eines Samba-Server 1

LPI 2.211.1 Systemausgaben protokollieren 1

LPI 2.211.2 Softwarepakete erstellen 1

LPI 2.211.3 Datensicherung 1

LPI 2.213.1 Tätigkeiten durch Skripte automatisieren 1

LPI 2.214.2 Rettungsmedien erzeugen 1

LPI 2.214.5 Allgemeine Probleme lösen 1

LPI 2.214.8 Probleme bei Umgebungskonfigurationen lösen 1



LPI 201

LPI 2.201.1 Kernel-Komponenten

Kernel-Images werden mit gzip als zImage und bzImage (big zImage) nach /boot komprimiert. Es enthält den komprimierten Betriebssystemkern. Beide Versionen unterscheiden sich in der Art und Weise, wie sie geladen werden.

insmod ne io=0x300 irq=5 // lädt das Modul mit Optionen
insmod -f oder --force modul // Erzwingen des Ladens
i
nsmod -k oder --autoclean modul // Modul wird mit autoclean-Flag gestartet
modprobe ppa  // lädt zuerst parport (abhängig) und dann ppa
modprobe -r ppa // entfernt das Modul aus dem Kernel
rmmod -r printer // entfernt erst die abhängigen Module, dann das printer-Modul
rmmod -a // Entlädt alle nicht gebrauchten Module. 2x ausführen!
lsmod // zeigt geladene Module an. Liest im Prinzip die Datei /proc/modules aus
autoclean // zeigt lsmod ein Modul als autoclean an, so wird es bei “unused” automatisch entladen

uname – Anzeigen der Kernelinformationen

-s / --kernelname = Kernelname anzeigen
-n / --nodename = Hostname anzeigen
-r / --kernel-release = vollständige Versionsnummer anzeigen
-v / --kernel-version = Kernelversion anzeigen
-m / --machine = Hardwareplattform anzeigen (Bsp. I386)
-p / --processor = Prozessorname anzeigen
-i / --hardware-platform = Prozessorfamilie anzeigen
-o / --operating-system = Betriebssystem anzeigen

kerneld bzw. kmod
Automatisches (Ent)Laden von Modulen: Die Arbeitsweise von
kerneld und kmod sind identisch; beide werden, wenn der Kernel ein Modul benötigt, von diesem geweckt und versuchen ihrerseits das angeforderte Modul mit Hilfe von modprobe zu laden. Dieser kerneld wurde ab Kernel 2.2 durch den nun direkt im Kernel integrierten kmod ersetzt.

/lib/modules/KERNELVERSION/modules.dep enthält die Abhängigkeitsinformationen. Diese Datei wird mittels depmod erstellt.
depmod -a / --all durchsucht alle in modules.conf angegebenen Verzeichnisse.
depmod -A // --quick aktualisiert nur, wenn sich der Zeitstempel geändert hat.
depmod -n // --show zeigt an, was in die Datei modules.dep geschrieben wird.
depmod -s // --syslog schreibt Meldungen in das Syslog

/etc/modules.conf
In der Datei
/etc/modules.conf werden hauptsächlich die Parameter für die einzelnen Module festgelegt, welche dann von modprobe vor dem Laden abgearbeitet werden:
options acx io=0x320 irq=7
Dieser Eintrag sorgt dafür, dass das Modul acx automatisch mit diesen Parametern geladen wird.

alias eth0 acx  // lädt tatsächlich das Modul acx
alias eth1 off // kann nicht geladen werden, da OFF

Des Weiteren können Befehle vor/nach dem Laden und vor/nach und nach dem Entladen ausgeführt werden:

pre-install Modul Kommando // Vor dem Laden
post-install Modul Kommando // Nach dem Laden
pre-remove Modul Kommando // Vor dem Entfernen
post-remove Modul Kommando // Nach dem Entfernen

Übersetzung des Kernels

Konfiguration des Kernels

make config = Textbasiertes Abfragen der Kerneloptionen
make menuconfig = Textmenü zum Konfigurieren des Kernels
make xconfig = Grafisches Menü, benötigt Xserver und QT-Bibliothek
make oldconfig = versucht aus alter Config eine Config für neuen bzw. gepatchten Kernel zu erstellen.
make cloneconfig = Konfiguration des aktuell geladenen Kernel wird nach .config kopiert (/proc/config.gz)

1. Schritt - Vorbereiten der Kernelübersetzung

make dep = Erstellt die Abhängigkeitsinformationen. Wird nur bei der 1. Übersetzung verwendet
make clean = Entfernt die Objektdateien (.o), ansonsten werden nur Module kompiliert, die geändert wurden
make mrproper = Wie clean, zusätzlich werden die Konfigurationsdateien (u.a. .config) gelöscht
make distclean = Entsorgt neben »make mrproper« die Rückstände von Patchvorgängen 

2. Schritt - Übersetzung des Kernels
make zImage = (Alt) komprimiert den Kernel nach /usr/src/linux/arch/i386/boot/zImage
make zdisk
= (Alt) Compiliert den Kernel und kopiert ihn auf eine Diskette --> Bootdisk
make bzImage = Erstellt und komprimiert Kernel nach /usr/src/linux/arch/i386/boot/bzImage
make bzdisk
= Die neue Methode, eine Bootdisk mit großem (big) Kernel zu erstellen.

3. Schritt - Übersetzung der Module
make modules = Übersetzt die ladbaren Module. Die Module liegen noch in /usr/src/linux

4. Schritt - Installieren des Kernels und der Module
a) Kernel installieren
/usr/src/linux/arch/i386/boot/bzImage nach /boot kopieren
/usr/src/linux/System.map nach /boot/System.map.Kernelversion kopieren

b) Module installieren
make modules_install = kopiert (installiert) die Module in die Verzeichnisse in /lib/modules/Kernelversion. Dieser Befehl startet gleichzeitig depmod, um die Module in /lib/modules/Kernelversion/modules.dep einzutragen.

Initial RAMDISK
Ist ein komprimiertes Dateisystem-Image, welche dazu benötigt wird, um vorm Booten bestimmte Module zu laden, die benötigt werden.
linuxrc = ausführbare Datei (Shellskript), welches mittels insmod die Module lädt
mkinitrd-Skripte = werden benötigt, um eine initrd zu erstellen. Von Distri zu Distri unterschiedlich

/etc/mkinitrd/exe =
/etc/mkinitrd/files = enthält vollständigen Pfad der Dateien, die eingebunden werden sollen
/etc/mkinitrd/mkinitrd.conf = Standard-Einstellungen der RAMDISK
/etc/mkinitrd/modules = definiert die Module, die durch linuxrc geladen werden sollen
/etc/initrd/scripts/ = enthält beliebige Shellskripte, die vorm Image-Laden durchgeführt werden

Bootloader LILO

Globale Einstellungen

timout= 80 // Nach 8 Sekunden wird automatisch gebootet
lba32 // Booten von über 1024 Zylinder ist möglich
read-only // Root-System wird nur lesend gebootet (und durch Skript neu gemountet)
prompt // kein automatisches Laden, Anwender muss “drücken”
default=name // Standard Default-Boot-Image
boot=/dev/hda // Device, was den Bootsektor enthält

Einstellungen für die einzelnen Images

image=/boot/bzImage // Pfad zum Kernel-Image
label=Linux Gentoo // Bootname
vga=0x318 // VGA-Modus beim Booten, Modi durch
vga=ask ansehbar
initrd=/boot/initrd // Pfad zum Initial RAMDISK
root=/dev/hda2 // Angabe der Root-Partition
bitmap=DATEI // Hintergrundbild (640x480, 16 Bit)
delay=
tsecs // Zeit zum automatischem Laden des Kernelimages
lock //
map=/PFAD/zur Datei // Wird von lilo auto. Erzeugt. Enthält Taballe mit HDD-Sektoren
menu-title=Meiks Lilo // Ändern des Titels für das Boot-Menü
menu-scheme // Farb-Schema des Bootloaders
message=/boot/message // Inhalt der Datei wird im Bootmenü angezeigt (bitmap darf nicht gesetzt sein)
password=geheim // Passwort im Klartext
restricted // Mit password wird PW-Abfrage erreicht, wenn Kerneloptionen angegeben wurd.
Bypass // Einzelnes Kernelimage wird ohne PW-Abfrage gestartet

other=/dev/hda3 // Booten eines anderen Betriebssystems (Windows)
table=/dev/hda3 // Partition, welches die Partitionstabelle enthält

Bootloader GRUB
(hd0,0) = hda1
(hd0,2) = hda2
(hd1,0) = hdb1

hd = Harddisk
fd = FloppyDisk
nd = network disk

tux-laptop chef # ls /boot/grub/

default fs_stage1_5 stage1
device.map menu.lst stage2
e2fs_stage1_5 stage2_eltorito
fat_stage1_5 minix_stage1_5 xfs_stage1_5
grub.conf reiserfs_stage1_5 splash.xpm.gz

grub.conf

chainloader +1 = Hierdurch kann der Windows-Kernel gebootet werden
rootnoverify = Die Root-Partition wird nicht gemountet (Für Windows notwendig)
password –md5 xxxyyyzzz = Passwortabfrage, Passwort mittels grub-md5-crypt erstellt

device.map

Eine Beispieldatei device.map für ein Beispielsystem – angenommen wird eine im BIOS eingestellte Bootreihenfolge von IDE vor SCSI – sieht so aus:

(fd0) /dev/fd0
(hd0) /dev/hda
(hd1) /dev/hdb
(hd2) /dev/sda
(hd3) /dev/sdb

Da die Reihenfolge von IDE, SCSI und anderen Festplatten abhängig von verschiedenen Faktoren ist und Linux die Zuordnung nicht erkennen kann, besteht die Möglichkeit, die Reihenfolge in der device.map manuell festzulegen.

/proc/sys/kernel/

tux-laptop chef # cat /proc/sys/kernel/

acpi_video_flags msgmax printk_ratelimit_burst
bootloader_type msgmnb pty/
cad_pid msgmni random/
cap-bound ngroups_max randomize_va_space
core_pattern osrelease real-root-dev
core_uses_pid ostype sem
ctrl-alt-del overflowgid sg-big-buff
domainname overflowuid shmall
fbsplash panic shmmax
hostname panic_on_oops shmmni
hotplug panic_on_unrecovered_nmi tainted
kstack_depth_to_print pid_max threads-max
max_lock_depth printk version
modprobe printk_ratelimit

LPI 2.201.3 Patchen eines Kernels

Kernel-Patches einspielen

diff DATEI_01 DATEI_02 = Zeigt die Unterschiede zwischen beiden Dateien an
patch-2.6.16.gz = Patch von Kernel 2.6.15 auf 2.6.16

cd /usr/src/ && patch -p0 < patch-2.6.16 = -pZAHL legt Pfadtiefe fest.
cd /usr/src/linux && patch -p1 < patch-2.6.16
*.rej = Dateien die angelegt werden, wenn Fehler beim Patchen auftreten

Optimale Vorgehensweise
cd /usr/src; tar czvf old-linux.tgz linux //alten Kernel sichern
make clean // Generierte Kernelquellen entfernen ==> Reinigung
gunzip patch-2.6.16.gz // Patch entpacken
patch -p0 < patch-2.6.16 oder zcat patch-2.6.16 | patch -p0

patch --reverse / -R = Patch rückgängig machen
patch --dry-run = Patchen simulieren
patch -b / --backup = Backupdateien (.orig) werden erstellt
patch -f / --force = Patchen erzwingen

gzip und bzip2

gzip bzw. gunzip akzeptiert nur .gz bzw .tgz

gzip -9 / --best = Höchster Kompressionsgrad
gzip -1 / --fast = Schnellste Kompression (Standard ist 6)
gzip -c datei > datei.gz = Mithilfe der Pipe bleibt die Originaldatei erhalten. gzip datei löscht das Original
cat datei | gzip > datei.gz = Mithilfe der Pipe bleibt die Originaldatei erhalten. gzip datei löscht das Original

gunzip datei.gz = Entpackt das Archiv
gzip -d datei.gz = Entpackt das Archiv

bzip2 verwendet einen anderen, besseren Algorithmus als gzip

bzip2 datei = Komprimiert datei zum Archiv datei.bz2
bzip2 -c datei > datei.bz2 = Komprimiert datei zum Archiv datei.bz2 ohne Originaldatei zu löschen
bunzip2 datei.bz2 = bzip2-Archiv entpacken
bzip2 -d datei.bz2 = bzip2-Archiv entpacken

LPI 2.202.1 Systemstart

Runlevel

Symbolischer Name:Liste der Runlevels:Art der Aktion:Befehl

Symbolischer Name = ID
Liste der Runlevels = Eine einfache Liste der Runlevels, in denen diese Zeile ausgeführt werden soll. Der Eintrag 234 bedeutet also, dass diese Zeile im Runlevel 2, 3 und 4 gültig ist.
Art der Aktion = Dieser Eintrag beschreibt, auf welche Art der folgende Befehl gestartet werden soll.
Befehl = Der Befehl (bzw. das Shellscript), der abgearbeitet werden soll.

Art der Aktion

respawn Der Prozess wird jedesmal neu gestartet, sobald er beendet ist. (Typisches Beispiel ist Getty)

wait Der Prozess wird einmal gestartet, wenn in den spezifizierten Runlevel gewechselt wird. Init wartet auf seine Abarbeitung und setzt erst dann seine Arbeit fort.

Once Der Prozess wird genau einmal gestartet, wenn in den spezifizierten Runlevel gewechselt wird.

boot Der Befehl wird beim Booten des Systems abgearbeitet. Das Feld mit den Runleveln wird ignoriert.

bootwait Wie boot, jedoch wartet init auf die Abarbeitung des Befehls, bevor die Arbeit fortgesetzt wird.

initdefault Standard-Runlevel. Das Runlevel-Feld darf nur einen Runlevel enthalten. Fehlt dieser Eintrag, so fragt der Init-Prozess beim Start, welcher Runlevel aktiviert werden soll.

powerwait Der genannte Befehl wird ausgeführt, wenn die Spannungsversorgung abfällt. Init wird darüber von einem Prozeß informiert, der mit der USV verbunden ist. Init wartet, bis der Prozess abgearbeitet ist.

powerfail Wie Powerwait, nur wartet init nicht auf die Abarbeitung, sondern fährt gleich fort.

powerokwait Der Prozess, der abgearbeitet wird, sobald init darüber informiert ist, dass die Spannung wieder da ist.

powerfailnow Dieser Prozess wird abgearbeitet, wenn init gemeldet bekommt, dass die Batterie der USV so gut wie leer ist und die Spannung trotzdem noch nicht wieder da ist. (Funktioniert natürlich nur, wenn die USV das mitteilen kann.)

ctrlaltdel Legt fest, was passieren soll, wenn Strg-Alt-Entf gedrückt wurde.

Beispiel /etc/inittab

# Voreingestellter Runlevel ist 3 
id:3:initdefault:
# Systemcheck beim Starten
# Für einen speziellen Notfall-Runlevel (I) wird das Programm
# /sbin/init.d/boot gestartet und init wartet auf seine Abarbeitung
# (bootwait)
si:I:bootwait:/sbin/init.d/boot
# Die grundlegenden Scripts, die im jeweiligen Runlevel gestartet werden
# sollen. Das heißt in diesem Fall, dass jeweils das Programm /etc/init.d/rc
# gestartet wird. Als Parameter bekommt es den aktuellen Runlevel mit. 
# Das ist Linux spezifisch. In anderen Unix-Systemen werden einfach
# verschiedene Scripts gestartet.
l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
#l4:4:wait:/etc/init.d/rc 4
#l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
# Was soll im Single-User-Modus passieren
# Zunächst wird wieder das Programm /etc/init.d/rc mit dem Parameter S
# gestartet und auf seine Abarbeitung gewartet.
ls:S:wait:/etc/init.d/rc S
# Dann wird das Programm /sbin/sulogin aufgerufen und jedesmal wieder
# gestartet, sobald es beendet ist. (respawn)
~~:S:respawn:/sbin/sulogin
# Was passiert wenn Strg-Alt-Entf gedrückt wird
ca::ctrlaltdel:/sbin/shutdown -r -t 4 now
# Die Einstellungen für die Zusammenarbeit mit USVs 
pf::powerwait:/etc/init.d/powerfail    start
pn::powerfailnow:/etc/init.d/powerfail now
pn::powerfail:/etc/init.d/powerfail now
po::powerokwait:/etc/init.d/powerfail  stop
# für ARGO USV
sh:12345:powerfail:/sbin/shutdown -h now THE POWER IS FAILING
# Die Getty-Programme für die normalen Runlevel
1:123:respawn:/sbin/mingetty --noclear tty1
2:123:respawn:/sbin/mingetty tty2
3:123:respawn:/sbin/mingetty tty3
4:123:respawn:/sbin/mingetty tty4
5:123:respawn:/sbin/mingetty tty5
6:123:respawn:/sbin/mingetty tty6

ls -l /etc/init.d/rc1.d/

Im init.d Verzeichnis befinden sich die Skripte. In den Unterverzeichnissen befinden sich die Runlevels, welche symbolische Links auf Skripte beinhalten.

S
= Startskript
K = Bei Wechsel des Runlevels

        .../init.d/WHATEVERd
Symlinks:
        .../init.d/rc0.d/KxxWHATEVER
        .../init.d/rc1.d/K02sambad --> ../samba
        .../init.d/rc2.d/K10network -> ../network
        .../init.d/rc3.d/SxxWHATEVER --> ../WHATEVERd
        .../init.d/rc4.d/KxxWHATEVER --> ../WHATEVERd
        .../init.d/rc5.d/KxxWHATEVER --> ../WHATEVERd
        .../init.d/rc6.d/KxxWHATEVER --> ../WHATEVERd

Unter Suse Runlevel editieren

insserv = Setzt Runlevel.Links
insserv apache2 = Setzt symbolischen Link auf /etc/init.d/apache2
insserv -r apache2 = Entfernt apache2 aus Runlevel

chkconfig = zeigt alle vorhandenen Startskripte an und ob diese in Runlevel-Vrz. gesetzt sind.
chkonfig --add apache2 = Hinzufügen zum Runlevel.
chkonfig apache2 5 = Fügt Apache2 zum Runlevel 5 hinzu
chkonfig -l / --list apache2 = Infos zum Runlevel-Eintrag von Apache2
chkonfig -d / --del / off = Aus Runlevel entfernen

Unter Debian Runlevel editieren

update-rc.d -n apache2 defaults = Apache2 zum Default-Runlevel hinzufügen
update-rc.d apache2 remove = Apache2 aus dem Runlevel entfernen

Init-Skripte

startproc = Wird dazu genutzt, um Dienste zu starten. Sucht vorher nach PID des Dienstes und startet erst dann, wenn der Dienst noch nicht gestartet ist.
killproc = wird dazu genutzt, um Dienste zu beenden
chckproc = Such nach laufenden Prozessen, die das Programm verwendet

LILO

LILO boot: linuxneu root=/dev/hda7

In diesem Fall wäre also die Angabe root=/dev/hda7 ein Kernelparameter. Diese Methode ist natürlich nur geeignet, um bestimmte Dinge auszuprobieren oder Parameter einzugeben.

/etc/lilo.conf

append = Kernelparameter
  image = /boot/bzImage_2
  label = linuxneu
  root = /dev/hdc1
  append = "ne=0x320,5 mem=96M"

password= Entweder in der globalen Sektion von /etc/lilo.conf stehen (dann gilt es für alle Images) oder es wird für jedes Image extra angegeben, dann gilt es für das Image, in dessen Kontext die Anweisung steht. mandatory Steht dieser Schlüsselbegriff in einer Image-Sektion der Datei /etc/lilo.conf, so muß zum Booten dieses Images ein Passwort eingegeben werden.
restricted Ein Passwort wird nur dann gefordert, wenn das Image mit zusätzlichen Kernelparametern aufgerufen werden soll. Normales Booten funktioniert ohne Passwort. Diese Angabe wird am häufigsten verwendet.
bypass Kein Passwort wird verlangt. Diese Angabe kann notwendig sein, wenn wir ein globales Passwort setzen, aber ein bestimmtes Image (etwa Windows) ohne Passwort bootbar machen wollen.

  boot=/dev/hda
  lba32
  prompt
  timeout = 80
  message = /boot/message
  password = wrdlbrnft
  image = /boot/bzImage_2
  label = linuxneu
  root = /dev/hdc1
  restricted
  image = /boot/bzImage
  label = linuxorg
  root = /dev/hdc1
  restricted
  other  = /dev/hda1
  label  = windows
  bypass

LILO Fehlercodes
(nichts) Kein Teil von LILO wurde geladen. Entweder LILO ist gar nicht installiert, oder es wurde nicht die Partition mit dem LILO-Bootsektor gestartet.
`L' FirstStageLoader wurde geladen, aber sie konnte die zweite Stufe (/boot/boot.b) nicht laden. Wahrscheonlich physikalischer Fehler des Boot-Datenträagers oder eine fehlerhafte Platten-Geometrie.
'LI' SecondStageLoader konnte aber nicht gestartet werden
`LIL' Die zweite Stufe von LILO wurde gestartet, konnte aber die nötigen Daten (Zeiger usw.) nicht aus der Map-Datei laden. Dies wird typischerweise verursacht durch einen physikalischen Fehler des Boot-Datenträgers oder eine fehlerhafte Platten-Geometrie.
`LIL?' Die zweite Stufe von LILO wurde an eine falsche Speicheradresse geladen.
`LIL-' Die Daten in der Map-Datei sind ungültig.
`LILO' Alle Teile von LILO wurden erfolgreich geladen.

00 = no error, alles OK
01 = invalid disk command
0A = bad sector flag
0B = bad track flag
20 = controller failure
40 = seek failure (BIOS), fehlerhafte Festplattenadressierung
99 = invalid second stage index sector, nicht lesbare map-Datei
9A = no second stage loader signature, nicht lesbare map-Datei
AA = Drive Not Ready
FF = sense operation failed, Lese-/Schreiboperation schlägt fehl aufgrund defekter Hardware

Manuell Booten

# Grub manuell booten
grub> kernel (hd0,0)/kernel-2.6.2 root=/dev/hda3

grub> initrd (hd0,0) /initrd
grub> boot

linux 3 = Bootet den Eintrag Linux in den Runlevel 3
linux root=/dev/hda3 = bindet hda3 als Root ein.

Kernel-Parameter

Mögliche Parameter können unter /usr/src/linux/Documentation/kernel-parameters.txt angesehen werden.

cat /proc/cmdline = Auslesen der aktuell gesetzten Kernel-Parameter

acpi=on/off = ACPI aktivieren/deaktivieren
apci=on/off = Advanced Programmable Interrupt Controler aktivieren
apm=on/off = Advanced Power Management aktivieren
maxcpus=zahl = Festlegen der maximalen CPUs, die durch SMP-Kernel genutzt werden können
mem=128K/256M/1G = Speichermenge festlegen
noapic = deaktiviert apci
nosmp = deaktiviert smp
vga=VIDEO-MODUS = Videomodus setzen
vga=
ask = Mögliche Video-Modi beim Booten zur auswahl geben

Dateisystem checken mit FSCK

fsck = wertet alle Dateisysteme, die in /etc/fstab angegeben sind
fsck -A = wertet alle Dateisysteme in einem “Rutsch”. Wird von Bootskripten genutzten.
fsck -P = When the -A flag is set, check the root filesystem in parallel with the other filesystems.
fsck -b = Erstellt neuen Superblock

LPI 2.203.1 Dateisystem

/etc/fstab
# Device Mountpoint Fstype Options Dump Pass
/dev/hda1 / ext2 rw,users 0 0

Mountoptionen

atime Immer wenn auf eine Datei zugegriffen wird, die atime auf die aktuelle Zeit setzen (Standard)
auto Partition automatisch mounten
async Schreibvorgänge werden gepuffert udn nicht direkt geschrieben
defaults Benutzt automatisch die Optionen dev,suid,rw,exec,auto,nouser
dev Gerätedateien werden interpretiert (d.h. sind echte Geräte)
exec Starten von Programmen erlauben
noatime Die Zugriffszeit nicht updaten (Geschwindigkeitsgewinn)
noauto Die Partition wird nicht automatisch gemountet (das Gegenteil zu auto)
nodev Gegenteil zu dev
noexec Gegenteil zu exec
suid erlaubt das Setzen von suid-Bits
nosuid Das Gegenteil zu suid
nouser Die Partition darf nur von root gemountet werden
user Die Partition darf von jedem gemountet werden
users Alle User können wieder umounten, nicht nur von dem User selbst
owner Nur Besitzer der Gerätedatei darf mounten
remount gemountetes Dateisystem u- und wieder mounten, für Ändern von Optionen
ro Die Partition wird nur lesbar gemountet
rw Die Partition kann auch beschrieben werden

Dateisysteme

ext3 Ext3-Dateisystem
ext2
Second Extended Filesystem
minix Wird selten noch auf Disketten verwendet.
romfs Read-Only-Dateisystem, welches auf Rettungsdisks eingesetzt werden kann
umsdos Ist das UMSDOS-Dateisystem
fat Normale Dateizuordnungstabelle, in der steht, welche Datei sich an welcher Adresse befindet
msdos Ist die FAT (Dateizuordnungstabelle), die von Microsoft DOS verwendet wird
vfat Weiterentwicklung von FAT hinsichtlich der Dateinamenslänge. Zu VFAT zählt auch FAT32
proc Status des Systems, Kernel-Parameter ändern. Keine realen Dateien
nfs NFS (network file system) Dateisystem
smbfs Samba-Dateisystem
iso9660 Das Dateisystem vom CD-ROMs
hpfs Das "High Performance File System" von OS/2
ntfs Ist das Dateisystem vom Windows NT

/etc/mtab – welche Dateisysteme sind gemountet?

Jedes Mounten zieht einen Eintrag in /etc/mtab und /proc/mounts mit sich.
user@sonne> cat /etc/mtab
/dev/hda5 / ext2 rw,noexec,user=tux 0 0

mount

mount -n = Kein Eintrag in /etc/mtab
mount -a = Alle Einträge in fstab mounten
mount -w = read/write mounten
mount -o option1,option2 = Optionen angeben
mount -t = Dateisysten angeben

mount -o loop datei.iso /mnt/cdrom = ISO-Image mounten

fuser & lsof – Zugriffe auf gemountete Laufwerke anzeigen

fuser /media/cdrom = Zugriffe auf das Laufwerk anzeigen
fuser -k /media/cdrom = beendet alle Zugriffe auf das Laufwerk
lsof /media/cdrom = List Open Files

Swap-Datei / -Partition erstellen

1.) Swap-Partition erstellen
mkswap /dev/hda2
swapon /dev/hda2

2.) Swap-Datei erstellen
dd if=/dev/zero of=swapfile bs=1024 count=1000000
mkswap swapfile
swapon swapdatei

tune2fs wird benutzt, um einstellbare Parameter eines Linux Second Extended Dateisystems zu verändern.

Superblock

Jedes Dateisystem enthält einen Superblock. Er enthält folgende Verwaltungsinformationen des Dateisystems:

* Größe des Dateisystems
* Anzahl freier Blöcke
* Liste der freien Blöcke
* Zeiger auf den ersten freien Block in der Liste der freien Blöcke
* Größe der Inode-Liste
* Anzahl freier Inodes
* Liste der freien Inodes
* Zeiger auf den nächsten freien Inode in der Liste der freien Inodes
* „Sperr-Felder“ für Liste der freien Blöcke / Inodes (z.B. für defekte Blöcke)
* Anzeigefeld, ob Superblock verändert wurde

Blockgröße 1 Kbyte = Lage des 1. Superblocks in Block 8193
Blockgröße 2 Kbyte
= Lage des 1. Superblocks in Block 16384
Blockgröße 4 Kbyte
= Lage des 1. Superblocks in Block 32768

dumpe2fs /dev/hda2 = Liest u.A. die Lage der Superblöcke aus.
e2fsck -b 32768 /dev/hda2 = Aktualisiert den Superblock.

LPI 2.203.2 Linux-Dateisysteme verwalten [4]

mknod

mknod erzeugt ein FIFO, Gerätedatei für ein zeichenorientiertes Gerät (character device) oder für ein blockorientiertes Gerät (block-device).

Major Device Number = Hauptgerätenummer, verbindet Gerätedatei Treiber im Kernel.
Minor Device Number = Unterscheidet Geräte der gleichen Art
..
/src/linux/Documentation/devices.txt = vollständige Liste aller Gerätenummern
linux/major.h = verbindliche Liste aller registrierten Hauptgerätenummern

mknod NAME typ major minor

p (pipe) erzeugt eine FIFO Spezialdatei (wie mkfifo,)
b (block) erzeugt eine Gerätedatei für ein (gepuffertes) blockorientiertes Gerät
c (character) erzeugt eine ungepufferte Gerätedatei für ein zeichenorientiertes Gerät
u (unbuffered) das Gleiche wie c
m=755 Berechtigungen setzen

mknod dev/hda5 b 3 7

badblocks – Festplatte physikalisch prüfen

fsck = filesystem check, Dateisystem prüfen
badblocks = physikalische Fehler der Festplatte finden/reparieren

-b Blockgröße = Spezifiziert die Größe der Blöcke in Bytes.
-c ANZAHL = Gibt an, wieviel Blöcke auf einmal überprüft werden sollen.
-f = force, Test erzwingen
-i DATEI = Ließt Liste von bereits existierenden badblocks aus Datei. badblocks überspringt diese Blöcke
-o Ausgabedatei = Liste aller gefundenen fehlerhaften Blöcke erstellen
-p Anzahl = Anzahl der Durchgänge
-n = Der nicht zerstörerische Read-Write Test wird durchgeführt.
-s = Statusbalken
-w = Der Read-Write Test wird durchgeführt.

reiserfsck --badblocks/-B badblocks.log = Liste der fehlerhaften Blöcke reiserfsck übergeben.
e2fsck -l badblocks.log = Liste der fehlerhaften Blöcke e2fsck übergeben.

Ext2-Dateistruktur

Das Dateisystem besteht aus so genannten Blöcken, welche bsp. 1 Kbyte, 2 Kbyte oder 4 Kbyte groß sein können. Sie legt die kleinste Dateigröße fest. Block besteht aus folgenden Komponenten:

Superblock – Gruppenbeschreibung – Blockbitmap – Inode-Bitmap – Inode-Tabelle – Datenblöcke

Inode = wird identifiziert über eine eindeutige Nummer für genau die Datei, die er verwaltet.
Inode-Bitmap
= zeigt freie freie Inodes an
Inode-Tabelle (128 Byte)
= Verweise auf Datenblöcke und Metadaten:

- Datei-Typ
- Dateigröße
- Besitzer und Gruppe
- link-counter (wie viele Namen hat eine Datei)
- access time (atime, letzter Dateizugriff)
- modification time (mtime, letzte Änderung)
- change time (ctime, letzte Änderung an den Metadateien der inode)

Gruppenbeschreibung = verrät für jeden Block, wo die weiteren Bestandteile (Inode-Tabelle, etc) sind
superblock = Zeigt freie Blöcke und Inodes im Dateisystem an, wann es gemountet und überprüft wurde.
Valid Bit = 1 => Dateisystem gemountet
Valid Bit = 0 => Dateisystem ausgehangen

stat DATEI = Metadaten der inode dieser DATEI anzeigen

dumpe2fs – Infos zum Ext2-Dateisystem

dumpe2fs -h /dev/hda2 = Infos zum Dateisystem
dumpe2fs -b = Listet alle Blöcke auf, die als “Bad” markiert sind

debugfs – Interaktiver Zugriff auf das Dateisystem

debugfs -w /dev/hda2 # -w um schreibbar zu verwenden, ansonsten nur Read-Only
>
stat # Infos aus Inode auslesen
>
freeb # Blöcke freigeben
>
undel # Löschen rückgängig machen


Ext3-Dateisystem

Ist ein Journaling Filesystem, d.h. Alle Änderungen, etc werden in einem Journal (index) geschrieben, so dass Dateisystemüberprüfungen deutlich schneller sind.

mk2fs -j bzw. mkfs.ext3 – Ext3-Dateisystem anlegen

-b 1024/2048/4096 = Blockgröße definieren
-i 1024/2048/4096 = Bytes-Pro-Inode, sollte nicht kleiner als Blockgröße sein, da sonst zu viele Inodes
-j = Ext3-Dateisystem erstellen
-L LABEL = dem Dateisystem Namen (Label) zuweisen
-m % = Standardmäßig sind 5% der Datenblöcke für root reserviert
-N ZAHL= Legt die Zahl der Inodes fest.
-l DATEI = Badblocks b. Anlegen d. Dateisystems übergehen (Blockgröße muss bei badblocks gleich sein)
-S = Letzter Rettungsversuch, nur superblock und Gruppenbeschreibung neu schreiben, Inodes, Inode-Tabelle und Inodebitmap unverändert lassen.

-T news = Voreingestelltes Profil: 1 Inode pro 4-KByte, newssystems
-T largefile = Voreingestelltes Profil: 1 Inode pro Mbyte
-T largefile4 = Voreingestelltes Profil: 1 Inode pro 4 Mbytes

ReiserFS, mkfs.reiserfs, mkreiserfs

- Journaling Filesystem
- Baumstruktur (B*-Trees), nicht liniear aufgebaut. Ähnlich von Datenbanken
- Keine festen Bereiche für Datenblöcke und Inodes (Wird Inode gebraucht, wird sie erstellt)
- Feste Blockgröße von 4096 Byte für die Datenblöcke
- Jeder Datenblock lässt sich mehrfach addressieren (anders als bei Ext2)

mkreiserfs

-b 512/1024/2048/4096/8192 = Blockgröße festlegen
-h r5/rupasov/tea = Hashfunktion definieren
-l “label” = Label des Dateisystems bestimmen
-j device-datei = Das Journal von ReiserFS kann auf einer anderen Partition liegen
-s 8139 = Größe des Journals in Blöcken, max. 32749, mind. 513
-B datei = Badblocks-Datei einlesen

debugreiserfs

debugreiserfs = Infos zum ReiserFS-Dateisystem anzeigen
debugreiserfs -j /dev/hda1 = Ausgabe des Journals
debugreiserfs -b badblocks = Badblocks werden in Datei geschrieben
debugreiserfs -1 BLOCKNUMMER = Gibt Inhalt des Blocks aus
debugreiserfs -p /dev/hda1 | gzip -c > bla.gz = Metadaten extrahieren und speichern

tunefs – Ändern von Dateisystenparametern

-c 10 = Dateisystem wird nach dem 10. Mounten überprüft
-C 5 = Ändern der Anzahl der bereits durchgeführten Mount-Vorgänge
-i 5d / 3w / 1m = Läuft Syste durch, wird Check nach 5 Tagen / 3 Wochen / 1 Monat durchgeführt
-j = wandelt ein Ext2 in ein Ext3 Dateisystem durch Hinzufügen eines Journals um
-T DATUM = Ändern des letzten Checks
-e continue / remount-ro / panic = Nach Finden von Fehlern wird fortgefahren / Read-Only neu gemountet / ein Kernel-Panic ausgeführt
-m % = Ändern reservierten Blöcke für Root (in Prozent)
-r ZAHL = Ändern reservierten Blöcke für Root (in Blöcken)
-u BENUTZER = Dieser Benutzer darf die reservierten Blöcke nutzen
-g GRUPPE = Diese Gruppe darf die reservierten Blöcke nutzen
-L “Label” = Label ändern
-M = Last-Mounted-Verzeichnis ändern

reisertunefs – Parameter des Reiser-Dateisystems ändern

-j | --journal-device = Das Journal von ReiserFS kann auf einer anderen Partition liegen
--no-journal-available = allows reiserfstune to continue when the current journal's block device is no longer available. This might happen if a disk goes bad and you remove it (and run fsck).
--journal-new-device FILE = FILE is the file name of the block device which will contain the new journal for the file system. If you don't specify this, reiserfstune supposes that journal device remains the same.
-s | --journal-new-size N Größe des neuen Journals in Blöcken
-b = Angabe der Badblocks-Datei
-l LABEL = Label ändern

LPI 2.203.3 Erstellen und Konfiguration von Dateisystemoptionen [3]

Automounter

Dienst: autofs
Konfig-Datei: /etc/auto.master
Konfig-Datei für Zugriff: /etc/auto.[VRZ]

Auszug /etc/auto.master

Überwachtes VRZ Was soll wie gemountet werden Nach 120 Sek auto. umount
/media /etc/auto.media --time-out 120

Auszug /etc/auto.media

# Wenn Zugriff auf /media/cdrom, dann mount /dev/cdrom mit den entsprechenden Optionen
cdrom -fstype=iso9660,ro,nodev,nosuid :/dev/cdrom
# Wenn Zugriff auf usb-pladde, dann Gerät /dev/sda1 mounten
usb-pladde -fstype=auto,defaults :/dev/sda1

Erstellen eines ISO9660-Dateisystems

ISO9660-Level 1:

- Nicht Case-Sensitiv
- 8.3-Regel (max 8+3 Zeichen)
- Nur 1 Punkt im Dateinamen erlaubt
- Es gibt keine Dateiattribute

RockRidge-Format

- Unix-ähnliche Rechte möglich.

Joliet-Erweiterung

- von M$ entwickelt worden
- Dateinamen bis 64 Zeichen
- Pfadnamen bis 120 Zeichen
- Groß-/Kleinschreibung möglich

ISO9660-Level 2

- 31 ISO-Zeichen im Dateinamen

Erstellen eines Images mit mkisofs

mkisofs -o image vrz_mit_zu_brennenden_dateien
mkisofs -R = Image mit RockRidge-Erweiterung anlegen
mkisofs -T = Rückwärtskompatibiltät gewähren (TRANS.TBL wird in jedem Vrz angelegt)

Images von Datenträgern erstellen

cat /dev/fd0 > datei
dd if=/dev/fd0 of=datei

dd if=input of=output conv=KODIERUNG

ascii = Umkodierung von ebcdic nach ascii
ebcdic = Umkodierung von ascii nach ebcdic
lcase = Umkodierung in Kleinbuchstaben
upcase = Umkodierung in Großbuchstaben

Image-Dateien mounten

mount -o loop datei /mnt

losetup /dev/loop0 datei # Image-Datei mit loop-back-device verknüpfen
mount /dev/loop0 /mnt # Mounten
losetup -d /dev/loop0 # Am Ende Datei vom Loop-Device trennen

UDF-Dateisystem – Universal Disk Format

- Dateinamen können bis 255 Zeichen lang sein
- keine Beschränkung der Verzeichnistiefe auf 8 Ebenen
- 8- und 16 Bit Zeichensätze werden unterstützt
- Case-Sensitiv
- Speicherattribute werden gespeichert
- Maximale Größe des Dateisystems im Terybyte-Bereich
- Packet-Writing = optisches Medium als wiederbeschreibbares Medium a la Wechselfestplatte nutzen

mkisofs -dvd-video = DVD-Video-kompatibles UDF-Dateisystem erstellen
mkisofs -udf = UDF-Dateisystem erstellen

Packet-Writing

Hierfür muss man die udftools installieren, welches die Tools pktsetup, mkudffs und cdrwtools enthält.

1.) CD-RW für Packet-Writing benutzen
cdrwtool -d /dev/hdc -q #
CD-RW formatieren
pktsetup dev_name /dev/hdc # Datei mit CD-RW verknüpfen
mount /dev/pktcdvd/dev_name /mnt/CD-RW -t udf -o rw,noatime

2.)
DVD-RW für Packet-Writing benutzen
dvd+rw /dev/hdc # DVD formatieren
mkudffs /dev/hdc # UDF-Dateisystem erzeugen
mount /dev/hdc /cdrom -t udf -o rw,noatime

LPI 2.204.1 RAID-Konfiguration [2]

Raid-0 = Striping, Steigerung der Performance
Raid-1 = Spiegelung
Raid-3 = Striping mit Paritätsinformationen auf separater Festplatte
Raid-4 = Wie Raid-3, nur größere Datenblöcke
Raid-5 = Striping mit Paritätsinformationen auf allen Festplatten verteilt

mkraid (veraltet)

Konfigurationsdatei = /etc/raidtab

Die Raidtools bzw. mkraid greifen auf einen persistenten Superblock zu, der sich auf allen Devices befinden. So kann das Raid initialisiert werden, wenn der Zugriff auf /etc/raidtab nicht möglich ist.

mkraid /dev/md0 = Raid initialisieren
mkraid -C datei = Andere Konfigdatei nutzen
mkraid -o / --upgrade = älteres Array ohne Datenverlust auf die aktuelle Version des Kernels upgraden

raidstart = Raid manuell aktivieren
raidstop = Raid manuell deaktivieren

/proc/mdstat = Raid-Status auslesen

Voraussetzung, das Kernel Raid erkennt:

- Kernel muss Raid-Autodetection aktiviert haben
- Raid-Devices müssen persistenten Superblock haben
- Der Partitionstyp muss 0xFD bzw. fd sein

mke2fs -b 4096 -R stride=8 /dev/md0 = Spezielles Ext2 für Raid benutzen

Beispiel Raid-0

raiddev /dev/md0
  raid-level            0		# Raid-Level definieren
  nr-raid-disks         2		# Anzahl der eingesetzten Devices 
  chunk-size            4
  persistent-superblock 1
  device                /dev/sdb6
  raid-disk             0		# sdb6 ist 1. Device im Array
  device                /dev/sdc5
  raid-disk             1		# sdc5 ist 2. Device im Array

Beispiel Raid-1

raiddev /dev/md0
  raid-level            linear
  nr-raid-disks         2
  nr-spare-disks        1		# Anzahl Ersatz-Festplatten
  chunk-size            32		# Blockgröße der Datenblöcke
  persistent-superblock 1
  device                /dev/sdb6
  raid-disk             0
  device                /dev/sdc5
  raid-disk             1
  device                /dev/sdd5
  spare-disk            0

Beispiel Raid-5

raiddev /dev/md0
  raid-level            5
  nr-raid-disks         3
  nr-spare-disks        1
  persistent-superblock 1
  parity-algorithm      left-symmetric # Speicherung der Paritätsinformationen 
  chunk-size            32
  device                /dev/sda3
  raid-disk             0
  device                /dev/sdb1
  raid-disk             1
  device                /dev/sdc1
  raid-disk             2
  device                /dev/sdd1
  spare-disk            0



mdadm

Konfigurationsdatei: /etc/mdadm/mdadm.conf

Modi
:

assemble = bereits initialisiertes RAID zu einem neuen RAID zusammenfügen
build = Legacy RAID ohne superblock erstellen
create = neues Array mit superblock erstellen
misc = diverse Aktionen auf einzelnen Devices durchführen (Bsp. Auslesen superblock)
follow / monitor = Überwachen der RAID-Devices

mdadm --create --verbose /dev/md1 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1
mdadm -c /dev/md1 -l 1 -n 2 /dev/sda1 /dev/sdb1

mdadm -S /dev/md0 ==> Raid stoppen
mdadm -R /dev/md0 ==> Raid starten

Wichtige Optionen in Verbindung mit mdadm –create

-c | --chunk=GRÖßE = Angabe der Chunk-Größe
-l | --level=RAIDLEVEL = Raidlevel definieren
-p | --parity=Left-Symmetric|Left-Asymmetric|Right-Symmetric
-n | --raid-devices=
ANZAHL = Festlegen der eingesetzten Raid-Devices im Array
-x | --spare-devices=ZAHL = Festlegen der eingesetzten Ersatz-Devices

LPI 2.204.2 Neue Hardware hinzufügen [3]

Xfree86 / Xorg

xf86config = Einfaches, textbasiertes Tool zum Erstellen der xorg.conf
XF86Setup = Grafisches Werkzeug
xf86cfg = Grafisches Werkzeug, stellt Komponenten Blockweise dar
xvidtune = verändert im Nachinhein den Video-Modus

lsdev

Liefert Informationen über die I/O-Adressen, IRQ's und DMA-Kanälen der eingesetzten Hardware.

lspci – PCI-Bus auslesen

# lspci
bus:slot.func
01:00.0 VGA compatible controller: ATI Technologies Inc RV350 [Mobility Radeon 9600 M10]
02:05.0 Ethernet controller: Broadcom Corporation BCM4401 100Base-T (rev 01)
02:06.0 Network controller: Intel Corporation PRO/Wireless 2200BG Network Connection (rev 05)
02:09.0 CardBus bridge: Ricoh Co Ltd RL5c476 II (rev ac)
02:09.1 CardBus bridge: Ricoh Co Ltd RL5c476 II (rev ac)
02:09.2 FireWire (IEEE 1394): Ricoh Co Ltd R5C552 IEEE 1394 Controller (rev 04)

# lspci -n

00:00.0 0600: 8086:3340 (rev 21)
00:01.0 0604: 8086:3341 (rev 21)
00:1d.0 0c03: 8086:24c2 (rev 03)

-v, -vv = mehr Infos ausgeben
-t = als Baumstruktur anzeigen
-n = gibt die ermittelten Werte (Hersteller, Devices, etc) als Zahlen aus
-b = liefert Bus-abhängige Darstellung durch direkte Abfrage des PCI-Busses
-i DATEI = andere Datei anstelle von /usr/share/pci.ids auslesen
-p VERZEICHNIS = wertet anderes Vrz anstelle von /proc/bus/pci aus
-m = Daten ist maschinen-lesbarer Form ausgeben
-M = Bus-Mapping-Modus (für Debugging-Zwecke)

lspci -s bus:slot.func

lspci -s 0: = Alle Devices an Bus 0 anzeigen
lspci -s 0 = Alle Funktionen von Device 0 an jedem Bus anzeigen
lspci -s 0.3 = Die dritte Funktion von Device 0 an jedem Bus anzeigen
lspci -s .4 = Die dritte Funktion von Device 0 an jedem Bus anzeigen

lspci -d vendor:device = Auslesen von Infos mittels Angabe von Vendor- und Device-ID

setserial – Serielle Schnittstelle manipulieren

uart = Universal Asynchronous Receiver Transmitter

setserial /dev/ttyS0 uart 16550A port 0x2F8 irq3
setserial /dev/ttyS0 uart 16550A port 0x3F8 irq4
setserial GERÄTEDATEI auto.irq autoconfig

stty – Terminaleinstellungen manipulieren

Ändert und zeigt Zeileneinstellungen des Terminals an

stty -a = Terminaleinstellungen anzeigen
stty -F /dev/ttyS1 -a = Einstellungen eines bestimmten Terminals anzeigen
stty -g | --save = Einstellungen speichern

Konfiguration von USB-Geräten

usb-ohci.o = USB 1.1-Modul
usb-uhci.o = USB 1.1-Modul
usb-ehci.o = USB 2.0-Modul

usbmodules --device DEVICE = Listet alle verfügbaren Treiber für das USB-Gerät auf

/proc/bus/usb = Existiert ab dem Zeitpunkt, ab dem das usbcore Modul geladen wurde.
usbdevfs = Das usbfs-Dateisystem hilft bei der Verwaltung von USB-Geräten (Verzeichnis /proc/bus/usb).

lsusb -v | --verbose = ausführliche Infos über USB-Geräte
lsusb -d bus:devnum = Infos über bestimmte USB-Geräte am Bus
lsusb -D device = nur Infos zum USB-Gerät anzeigen
lsusb -t = Infos in einer Baustruktur anzeigen
lsusb -S 001 = Infos zu allen Devices mit der Nummer 001

# cat /proc/bus/usb/devices
T: Bus=04 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2
B: Alloc= 0/900 us ( 0%), #Int= 0, #Iso= 0
D: Ver= 1.10 Cls=09(hub ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=0000 ProdID=0000 Rev= 2.06
S: Manufacturer=Linux 2.6.20-gentoo-r7 uhci_hcd
S: Product=UHCI Host Controller
S: SerialNumber=0000:00:1d.2
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mA
I: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 2 Ivl=255ms

LPI 2.204.3 Software- und Kernelkonfiguration [2]

tune2fs wird benutzt, um einstellbare Parameter eines Linux Second Extended Dateisystems zu verändern.

ATAPI & SATA

ATAPI = Parallele Schnittstelle (P-ATA) für Festplatte und CD-Laufwerke. Übertragung in 16 Bit Worten (“Blöcken”). Den ATA-Standard bezeichnet man auch als IDE.
SATA = Serielle Schnittstelle, direkten Datenaustausch zwischen Prozessor und Festplatte, Bit-für-Bit-Übertragung. Vorteile: höhere Datenübertragung, Hot-Plug wird unterstützt.

hdparm – Lesen und Ändern von Festplatteneinstellungen

Wichtige Optionen

hdparm -i /dev/hda = Festplatteninformationen aus dem Kernel auslesen
hdparm -I /dev/hda = Informationen direkt vom Gerät lesen
hdparm -d /dev/hda = DMA-Informationen auslesen
hdparm -d1 / -d0 /dev/hda = DMA aktivieren (d1) und deaktivieren (d0)
hdparm -c1 /dev/hda = 32 Bit Modus aktivieren

Usage:  hdparm  [options] [device] ..
Options:
-a   get/set fs readahead
-A   set drive read-lookahead flag (0/1)
-b   get/set bus state (0 == off, 1 == on, 2 == tristate)
-B   set Advanced Power Management setting (1-255)
-c   get/set IDE 32-bit IO setting
-C   check IDE power mode status
-d   get/set using_dma flag
-D   enable/disable drive defect-mgmt
-E   set cd-rom drive speed
-f   flush buffer cache for device on exit
-g   display drive geometry
-h   display terse usage information
-i   display drive identification
-I   detailed/current information directly from drive
-Istdin  similar to -I, but wants /proc/ide/*/hd?/identify as input
-k   get/set keep_settings_over_reset flag (0/1)
-K   set drive keep_features_over_reset flag (0/1)
-L   set drive doorlock (0/1) (removable harddisks only)
-M   get/set acoustic management (0-254, 128: quiet, 254: fast)
                (EXPERIMENTAL)
-m   get/set multiple sector count
-n   get/set ignore-write-errors flag (0/1)
-p   set PIO mode on IDE interface chipset (0,1,2,3,4,...)
-P   set drive prefetch count
-q   change next setting quietly
-Q   get/set DMA tagged-queuing depth (if supported)
-r   get/set readonly flag (DANGEROUS to set)
-R   register an IDE interface (DANGEROUS)
-S   set standby (spindown) timeout
-t   perform device read timings
-T   perform cache read timings
-u   get/set unmaskirq flag (0/1)
-U   un-register an IDE interface (DANGEROUS)
-v   defaults; same as -mcudkrag for IDE drives
-V   display program version and exit immediately
-w   perform device reset (DANGEROUS)
-W   set drive write-caching flag (0/1) (DANGEROUS)
-x   tristate device for hotswap (0/1) (DANGEROUS)
-X   set IDE xfer mode (DANGEROUS)
-y   put IDE drive in standby mode
-Y   put IDE drive to sleep
-Z   disable Seagate auto-powersaving mode
-z   re-read partition table

PIO-Mode (0-4) = Übertragungsrate 3,33 bis 16,66 MB/s
MDMA-Mode (0-2) = MultiWord DMA, ermöglicht es, mehr als nur einen Sektor pro Interrupt zu lesen und zu schreiben
UDMA-Mode (0-5) = Direkter Zugriff auf Festplatte (DMA), benötigt keine CPU-Last, benötigt DMA-Controller

Modus Wert Übertragungsrate
PIO 0 8 (8+0) 3,33 Mbyte/s
PIO 1 9 (8+1) 5,22 Mbyte/s
PIO 2 10 (8+2) 8,33 Mbyte/s
PIO 3 11 (8+3) 11,11 Mbyte/s
PIO 4 12 (8+4) 16,66 Mbyte/s

MDMA-0 32 (32+0) 4,2 Mbyte/s
MDMA-1 33 (32+1) 8,3 Mbyte/s
MDMA-2 34 (32+2) 16,67 Mbyte/s

UDMA-0 64 (64+0) 16,7 Mbyte/s UDMA16
UDMA-1 65 (64+1) 25,0 Mbyte/s UDMA25
UDMA-2 66 (64+2) 33,3 Mbyte/s UDMA33
UDMA-3 67 (64+3) 44,4 Mbyte/s UDMA44
UDMA-4 68 (64+4) 66,7 Mbyte/s UDMA66
UDMA-5 69 (64+5) 100,0 Mbyte/s UDMA100
UDMA-6 70 (64+6) 133,3 Mbyte/s UDMA133

hdparm -d1 -X34 /dev/hda = MDMA-2-Modus für hda festlegen

Einbinden eines IDE-CD-Brenners

Bis einschließlich Kernel 2.2 muss SCSI-Emulation aktiviert sein.

- Kernel-Modul ide-scsi laden
- Bootparameter setzen. Lilo: append=”hdX=ide-scsi”, Grub: hdc=ide-scsi

sysctl – Kernelparameter zur Laufzeit ändern

Bei Benutzung von sysctl wird relativer Pfad ausgehend von /proc/sys benutzt.

sysctl kernel/domainname = Ausgabe des Inhalts von /proc/sys/kernel/domainname
sysctl kernel.domainname = Wie oben, der . entspricht /
sysctl -w net.ipv4.ip_forward=1 = Wert ip_forward in /proc/sys/net/ipv4 in 1 ändern
sysctl -a | -A = Auflistung aller möglichen Paramtereinstellungen
sysctl -p KONFIG-FILE = Konfigurationsdatei für sysctl angeben/nutzen

Da das Proc-Filesystem nach jedem Neustart neu generiert wird, muss man eine Konfig-Datei einrichten:

/etc/sysctl.conf
net.ipv4.ip_forward = 1

Logical Volume Manager (LVM)

Partitionierung in Logical Volumes
Bsp.: /dev/vg1/lv2

Logical Volume 1 (lv1)

lv2

Zusammenfassung aller Pvs
Bsp.: /dev/vg1

Volume Group 1 (vg1)

Echte Partitionen” (PV)

Physical Volume 1

Physical Volume 2

Raid-Arrays

md0

md1

Einzelne Partitionen

sda1

sdb1

sda2

sdb2


- LVM's bieten keine Datensicherheit, sondern lediglich Flexibilität. Daher setzen sie auf Raid-Arrays auf.
- Die Größe von LVM's können während des Betriebs angepasst werden

1.) Der LVM nutzt Partitionen, ganze Festplatten oder Raid-Arrays als Physical Volumes
2.) Die Physcal Volumes werden zu einer Volume Group zusammengefasst
3.) In der Volume-Group werden Partitionen, die Logical Volumes, eingerichtet und formatiert.

Physical Extent (PE) = Datenblöcke von Logical Volumes, Standard 4 MB, max. 65.000 PEs = 256 GB
- Ext2 als Dateisystem für LVM ist gut geeignet, da die Größe immer geändert werden kann
8e, Linux LVM = Logical Volumes müssen mittels fdisk als Linux LVM (8e) definiert werden
- Bei ganzen Festplatten muss mittels dd der MBR gelöscht werden.

Befehle zur LVM-Konfiguration

LVM durchsuchen
pvscan
= durchsucht alle Festplatten nach Physical Volumes
vgscan = durchsucht alle Festplatten nach Volume Groups, erzeugt /etc/lvmtab
lvscan
= durchsucht alle Festplatten nach Logical Volumes

LVM erstellen
pvcreate
= erzeugt Physical Volumes aus Partitionen des Typs 8e Linux LVM (pvcreate /dev/hda)
pvcreate /dev/md0 /dev/md1 = Physical Volume aus md0 und md1 erstellen
vgcreate = erzeugt Volume Groups aus Physical Volumes (vgcreate vg-name /dev/hda)
lvcreate = erzeugt Logical Volumens, die bei fehlender Namensangabe lvol1, lvol2, etc heißen:

lvcreate -L größe_in_MByte -n lv-name -i stripes-anzahl vg-name
lvcreate -l anz_logical_extents -n lv-name vg-name

LVM bearbeiten
pvchange
= verändert die Attribute eine Physical Volumes
vgchange = verändert die Attribute einer Volume Group
lvchange = verändert Attribute eines Logical Volumes

LVM-Attribute anzeigen
pvdisplay = zeigt Attribute von Physical Volumes (Größe, PE-Größe, etc) an
vgdisplay = zeigt Attribute von VolumeGroups (Physical/Logical Volumes mit Größe, etc) an
lvdisplay = zeigt Attribute von Logical Volumes (Größe, Read/Write-Status, Snapshot, etc) an

LVM ändern / erweitern / verkleinern
pvmove = verschiebt Physical Extents von einem Physical Volume zum anderen
vgextend = fügt PEs zu einer exisitierenden VolumeGroup hinzu (vgextend vg-name /dev/hda)
lvextend = vergrößert Logical Volumes.
lvextend -L größe lvname = Größe des Logical Volumes auf neue Größe setzen
lvextend -L +ZAHL lvname = Größe um den Wert ZAHL erweitern

vgreduce = entfernt ungenutzte Physical Volumes aus VolumeGroup (vgreduce vg-name /dev/hda)
lvreduce = verkleinert Logical Volumes
lvreduce -L größe lv-name = Größe des LV auf gewünschte Größe reduzieren
lvreduce -L -größe lv-name = Größe des LV um angegebene Größe verkleinern

LVM löschen
pvremove = löscht ein Physical Volume. Dieses darf keiner VolumeGroup mehr angehören
vgremove = löscht eine Volume Group, welche keine Logical Volumes enthalten dürfen
lvremove = entfernt Logical Volumes

LVM umbenennen
vgrename = benennt Volume Groups um
lvrename = nennt Logical Volumes um

LVM Sonstiges
vgexport = exportiert eine Volume Group, so dass vgscan sie nicht mehr findet.
vgimport = importiert eine zuvor exportierte Volume Group
vgmerge = fasst mehrere Volume Groups zu einer einzigen zusammen.
vgsplit = verschiebt Physical Volumes aus einer Volume Group in eine andere.

vgconvert -M2 vg1 = LVM1 in aktuelle LVM2-Version umwandeln.

Vorgehensweise
1.) Physical Volume erstellen
pvcreate /dev/md0 /dev/md1

2.) Zusammenfassen der Physical Volumes zu einer Volume Group
vgcreate vg1 /dev/hda1 /dev/sdb /dev/md0

3.) Die virtuelle Festplatte (Volume Group) in Logical Volumes einteilen
lvcreate -L 40G -n lv1 /dev/vg1 oder lvcreate -l 1000 -n lv1 /dev/vga1

Beispiel Volume verkleinern
1.) Partition auf 500 MB verkleinern
resize2fs /dev/vg1/vl1 500M

2.) Volume verkleinern
lvreduce -L 500 /dev/vg1/lv1

e2fsadm = Vergrößert und verkleinert Logical Volumes mitsamt Ext2-Dateisystem

LPI 2.204.4 Konfiguration von PCMCIA-Karten [1]

- PCMCIA steht für Personal Computer Memory Card International Association
- stromsparend
- Hot-Plug
- PPCard 16 (8-/16-Bit Datenbus), PCCard 32 (32-Bit), Cardbay (integriert USB und FireWire)

cardmgr = Dämon-Prozess, der die PCMCIA-Sockets überwacht
/etc/pcmcia/config = Konfigurationsdatenbank, Zuordnung von Modulen und Konfigdateien (*.opts)

Auszug /etc/pcmcia/config
device “3c589_cs”
class “network” module “3c589_cs” # Geräte gehärt zur Klasse Network und nutzt Modul 3c589_cs

- Für jede Geräteklasse (network, scsi, etc) exisitiert eine ausführbare und *.opts-Datei
- In networks.opts werden bsp. Das Setzen von IP-Adressen definiert
- Außerdem können Schemata eingerichtet werden

cardctl scheme ZuHause = Wechseln des Schemas der PCMCIA-Karte

cardctl Parameter
cardctl status = gibt den Status der PCMCIA-Karte aus
cardctl config = gibt die Socketkonfiguration inkl. Interrupts, I/O-Adressen, etc aus
cardctl ident = gibt Karten-Infos aus
cardctl suspend = deaktiviert den Socket
cardctl resume = aktiviert den Socket
cardctl reset = Socket zurücksetzen
cardctl eject = signalisiert dem System, dass die Karte eingesteckt wurde
cardctl insert = signalisiert dem System, dass die Karte entfernt wurde

LPI 2.209.1 Konfiguration eines Samba-Server [5]

nmbd = Verwaltung der Namensauflösung, Umsetzung NetBIOS-Namen in IP-Adressen
smbd = Verwaltung der Drucker- und Verzeichnisfreigabe

name resolve order = lmhosts hosts wins bcast // Suchreihenfolge für Namensauflösung
password server = TUX-PDC // Anderen Server für Authentifizierung nutzen
local master = Yes = Samba-Server ist Master Browser für Arbeitsgruppe
preferred master = Yes = Erzwingt beim Starten von nmbd eine Neuwahl -> Besser Chance Mastert zu werden
domain master = Yes = Samba soll Domain Master Browser sein

map to guest - Einstellungen
Diese Option wird immer ausgeführt, wenn der Login fehlschlägt

map to guest = Never = Alle fehlgeschlagenen Logins abweisen
map to guest = Bad User = Wenn Benutzer NICHT exisistiert, wird der Fehlversuch als Gastzugriff gewertet.
map to guest = Bad Password = Alle falschen Passworteingaben werden als Gastzugriff gewertet
map to guest = Bad UiD = User, die keinen Unix-Login haben, werden als Gastzugriff gewertet (nur bei ads)

security-Einstellungen des Samba-Servers
security = share = Geringste Sicherheitsstufe (wie Windows)
security = user = Mittlerweile Standard, User Level Security, User muss sich authentifizieren
security = server = Authentifizierung an anderem Server, wo security = user gesetzt ist
security = domain = Samba versucht über PDC bzw. BDC Authentifizierung durchzuführen
security = ads = Kerberos ähnliche Authentifizierung

# smb.conf
realm = kerberos-REALM
security = ADS
password server = kerberos-server

smbpasswd – Samba-Benutzer anlegen
Da Windows andere Passwort-Hashes benutzt, muss man mittels smbpasswd die Samba-Benutzer anlegen.

1.) Unix-Benutzer anlegen: useradd tux
2.) Samba-Benutzer anlegen:
smbpasswd -a tux

Optionen von smbpasswd
smbpasswd -x USER = User wird aus Samba-Benutzerdatenbank gelöscht
smbpasswd -d USER = Benutzer wird deaktiviert
smbpasswd -e USER = Benutzer wird aktiviert
smbpasswd -m NAME = Maschinenaccount hinzufügen
smbpasswd -j DOMAIN = Samba-Server wird in Domäne aufgenommen

cat /var/lib/samba/private/smbpasswd
user:uid:Passwort-Hash:Windows-Hash:[Parameter]:LastChangeTime
nobody:65534:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:[DU ]:LCT-00000000:
chef:1000:4CA3BC6D0F2088E3AAD3B435B51404EE:9D31C5A780215DD7F0B91AAC42B9624C:[U ]:LCT-46B6FAA4:
winxppro$:1001:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:56C7C96B83607AFB871F38AD1511A2F9:[W ]:LCT-46B71082:
ballack:1002:5038C87BEF4EC2EAAAD3B435B51404EE:9BAB97657A8C905566F4E119D6F5A9BE:[U ]:LCT-46B70FA5:

Optionen smbpasswd-Datei
U
= User, Benutzeraccount
W = Workstation, Maschinenaccount
N = Benutzer kann sich ohne Passwort anmelden
D = Account ist deaktiviert

SAMBA als WINS-SERVER

wins server = 192.168.0.88 // SAMBA nutzt 192.168.0.88 als WINS-SERVER
wins support = Yes // SAMBA ist selbst WINS-SERVER

max ttl = Sekunden Gibt die maximale Gültigkeit eines NetBIOS Namens an (SAMBA ist kein WINS)
max wins ttl = Sekunden Gibt die maximale Gültigkeit eines NetBIOS Namens an (SAMBA ist WINS)
min wins ttl = Sekunden Gibt die minimale Gültigkeit eines NetBIOS Namens an, (SAMBA ist WINS)

os level – Wahl zum Master-Browser

Die Server im Netzwerk bieten sich in der Regel für die Wahl zum Master Browser der Arbeitsgruppe an.
Hierfür gibt es eine interne Nummer, den os level, welche eine Zahl zwischen 0 und 255 ist.
Die höchste Zahl gewinnt.

1 = Windows für Workgroups / Windows 95/98
16 = NT Workstation 3.51
17 = NT Workstation 4.0
17 = Windows 2000 Workstation
32 = NT Server 3.51, NT Server 4.0, Windows 2000 Server

SAMBA als Primary Domain Controller

1.)
Maschinen-Account anlegen

groupadd computers

# Um Rechner in Domäne aufnehmen zu können
# muss ein Maschinenaccount angelegt sein.
# Dieser wird durch $ am Ende definiert.
useradd -g computers -s /bin/false NAME$

# Maschinenaccount in Samba-Benutzerdatenbank
# einrichten. Wichtig die Option -m
smbpasswd -a -m NAME$

2.)
Benutzeraccount anlegen
# Unix Account anlegen
useradd -g users -s /bin/false -d /home/USER USER

# Samba-Account anlegen
linux:/#smpasswd -a USER
New SMB password: PASSWORT
retype new SMB password: PASSWORT
Added user USER


# Samba-Account aktvieren
linux:/#smbpasswd -e USER
Enabled user USER


3.)
Samba als Primary Domain Controller aktivieren
/etc/samba/smb.conf
# Die Definition des PDC's
domain master = yes
prefered domain = yes
domain logons = yes
os level = 65
security = user

# LogON Einstellungen für Windows 9x/NT/2000/ME
logon drive = Z:
logon path = \\SAMBA_PDC\profiles\%U.pds
logon home = \\SAMBA_PDC\profiles\%U
logon script = %U.bat

Wichtige Optionen
domain logons = Yes|No
= Domain-Anmeldungen sind möglich Ja / Nein
domain groups = root, samba = Unix-Benutzergruppen, die sich an Domain anmelden dürfen
domain admin group = root = Unix-Benutzergruppe, deren Mitglieder Administrator-Rechte haben
domain admin users = root = Angabe der Unix-User, die Administrator-Rechte haben

logon home = \\%L\Profiles\%U = Home-Verzeichnis, %L=Servername, %U=Session-Benutzername
logon path = \\server\profile-vrz = Vrz., in dem die Profile und benutzerbezogene Registry liegen
logon drive = Z: = Laufwerksbuchstaben für Win-Clients für das logon home Verzeichnis
logon script = %U.bat = Login-Skript, welches bei der Anmeldung abgearbeitet wird.

Beispiel: login.bat
NET USE D: \\server\DATA
NET USE I: \\server\Install

/etc/samba/smb.conf

[global]

netbios name = TUX-LAPTOP-PDC
server string = Samba %v
comment = Laptop Schmidt, Samba %v

workgroup = TUX-NET
browsable = yes

# Lof-File festlegen
log file = /mnt/samba/samba_%L.log

guest account = nobody
keepalive = 60
kernel oplocks = false

# Die Definition des PDC's
security = user
domain master = yes
prefered domain = yes
domain logons = yes
os level = 65

# Die Administratoren des PDC
domain admin users = root
logon drive = Z:
logon path = \\TUX-LAPTOP-PDC\profiles\%U.pds
logon home = \\TUX-LAPTOP-PDC\profiles\%U
logon script = %U.bat

hosts allow = 192.168.
socket options = TCP_NODELAY
map to guest = Bad User
wins support = no

load printers = Yes
printing = cups
printcap name = cups

# Home-Laufwerke freigeben
[homes]
comment = Home-Laufwerke
browseable = Yes
read only = No
create mask = 0750

[incoming]
comment = Upload Verzeichnis
path = /mnt/samba/incoming/
# writable = yes ist invertiertes Synonym fuer Read Only
# Yes = Nur Leserechte, No = Read/Write/Delete

read only = No
# Anzeigen im Explorer Ja/Nein
browsable = Yes
# Yes = Ermoeglicht Gastzugriff, No = Passwortabfrage
guest ok = Yes
# Synonym fuer guest ok
public = Yes

[Music]
comment = Meiks Incoming Vrz
path = /mnt/usb_pladde/musik/incoming/
public = yes
writable = yes
browsable = yes
guest ok = Yes

# Standard-Druckerfreigabe
# Drucker müssen in /etc/printcap eingerichtet sein

[printers]
comment = All Printers
browseable = no
printable = yes
public = yes
read only = yes
create mode = 0700
directory = /tmp

# Diese Freigabe muss vorhanden sein, da
# sich Win-Clients stand. damit verbinden

[netlogon]
path = /mnt/samba/netlogon/
writeable = no
public = Yes

[profiles]
path = /mnt/samba/profiles/
browseable = no
writeable = yes
comment = Benutzerprofile

LMHOST-DATEI
ip-adresse netbios-name#netbios-typ
192.168.200.1 TESTPC
192.168.200.20 NTSERVER#20
192.168.200.21 SAMBASERVER


00 = Standard Workstation
03 = Win-Popup-Dienst
06 = RAS-Server
1B = Domain Master Browser
1D = Lokaler Master Browser
1C = Domain Logon Server
1F = NetDDE-Dienst
20 = Datei-/Druckerdienst
21 = RAS-Client

nmblookup linux = nslookup, NetBIOS-Namensauflösung
nmblookup -B 192.168.2.255 linux = Angabe der Broadcast-Adresse
nmblookup -S linux = Detaillierte Anzeige
nmblookup -M = ermittelt den lokalen Master Browser
nmblookup linux#20

smbstatus = Status des SAMBA-Servers anzeigen lassen
smbclient
smbmount //Servername/Freigabename Mounverzeichnis [ -o Optionen]
testparm = Samba-Konfiguration auf Syntax-Fehler überprüfen
testparm -s smb.conf = Samba-Konfiguration auf Syntax-Fehler überprüfen

NFS – Network File System

- läuft über die sogenannten Remote-Procedure-Calls (RPC), also Prozeduraufrufe auf anderen Rechnern.
- Jeder Aufruf erfolgt über Ports
- Der Portmapper ist zentrale Verwaltung der Portnummern des RPC

Dienste, die laufen müssen (werden mittels /etc/init.d/nfs gestartet):
rpc.nfsd
rpc.mountd


tux-laptop chef #
rpcinfo -p

program vers proto port
100000 2 tcp 111 portmapper
100003 2 udp 2049 nfs
100021 1 udp 32863 nlockmgr
100005 2 tcp 608 mountd
100005 3 udp 605 mountd
100005 3 tcp 608 mountd

nfsstat = zeigt Statistiken zum NFS-Server an ==> /proc/net/rpc/nfsd
exportfs = macht die NFS-Freigaben bekannt

/etc/exports
Freizugebendes_Verzeichnis Client(Optionen) Client2(Optionen2) ...
/usr einstein.bar.com(rw) // Lese-/Schreibrechte für PC einstein.bar.com
/usr *.bar.com(rw) // Lese-/Schreibrechte für alle PCs von bar.com
/usr 192.168.100.0/24(rw) *(ro) // READ für Others
/usr 192.168.100.0/255.255.255.0(rw) // RW für PC von 192.168.100.xxx
/public (ro) // READ für alle
/usr @gruppe1(rw) // Netzgruppennamen

Wichtige Optionen
rw = Lese-/Schreibrechte
ro = Read Only
sync = Änderungen werden sofort geschrieben (langsamer, dafür sicherer). Gegenteil: async
root_squash
= die Root ID wird auf Nobody umgestellt. Gegenteil: no_root_squash
anonuid=512
= Benutzerzugriff erfolgt unter UID 512
anonguid=512 = Benutzerzugriff erfolgt unter GID 512
subtree_check = Zugriff nur auf Dateien, die sich im Vrz befinden (Stichwort Symlinks). no_subtree_check
nohide
= Auch Unterverzeichnisse werden angezeigt

tux-laptop chef #
showmount tux-laptop // Zeigt an, welche Hosts Freigaben gemountet haben
Hosts on tux-laptop:
192.168.1.1

showmount -a = zeigt Rechner und Verzeichnisse an
showmount -d = zeigt Verzeichnisse an
showmount -e = zeigt die verfügbaren exports des Servers an

TCP-Wrapper - tcpd
cat /etc/hosts.allow
# Mail ist jedem gestattet
in.smtpd: ALL
# Telnet und FTP wird nur Hosts derselben Domain und dem Rechner tuxhausen erlaubt.
telnetd, ftpd: LOCAL, tuxhausen.outside.all
# Finger ist jedem erlaubt, aber root wird per Mail darüber informiert
fingerd: ALL: (finger @%h | mail -s "finger from %h" root)
# Die Nutzer "user" und "newbie" haben von Rechner "erde" aus Zugang
erde.galaxis.de user
erde.galaxis.de newbie
# Alle verbieten, außer lokalen Zugriff
in.telnetd : ALL DENY LOCAL : ACCEPT

LPI 2.211.1 Systemausgaben protokollieren

Sysklogd

Bestehend aus syslogd (Systemmeldungen) und klogd (Kernelmeldungen).

syslogd -a socket = Angabe zusätzlicher Sockets auf denen gelaucht wird
syslogd -f datei = Angabe einer anderen Konfig-Datei
syslogd -h = Meldungen von Remote-PCs werden an einen Log-Host übergeben
syslogd -m intervall = Stand. schreibt Syslog alle 20 Min ein Lebenszeichen ins Log. Ändern des Intervalls
syslogd -r = Meldungen von Remote-Rechnern akzeptieren

/etc/syslog.conf

kategorie.priorität aktion (facility = Kategorie)

mail,news.warn /var/log/newslog // Mehrere Kateg, gleiche Priorität => Komma-Separiert
kern.warn;*err -/var/log/fehlerlog // Mehrere Paare => Semikolon ( - HDD-Sync aus)
*.*;mail.none /var/log/messages // Alles loggen außer Mail
*.* @Logserver // Alle Meldungen an Remote-Server weiterleiten
*.emerge * //Alle angemeldeten User informieren
*.alert chef,root,tux //Infos an diese User

Syslogd-Kategorien

auth = Meldungen von Sicherheitsdiensten wie login
authpriv = vertrauliche Meldungen interner Sicherheitsdienste
cron = Meldungen von at und cron
daemon = Meldungen anderer System-Daemons
kern = Kernel-Meldungen
lpr = Meldungen des Drucksystems
mail = Meldungen des Mailsystems
news = Meldungen des Newssystems
syslog = interne Meldungen des Syslog-Daemons
user = Meldungen aus Benutzerprogrammen
uucp = Meldungen des UUCP-Systems
* = Alle Kategorien

Prioritätsstufen

emerge =
alert =
crit =
err =
warning =
notice =
info =
debug =

none = Meldungen dieser Kategorie weren nicht geloggt

Syslog-NG (Syslog Next Generation)

1.) SOURCEDRIVER – Über welchen Weg kommen die Meldungen?

Internal () = interne Meldungen des Syslog-NG
file (/var/log/messages) = Auslesen der Nachrichten aus Datei
unix-stream(“/dev/log”) = Unix-Socket öffnen und daraus lesen
udp (ip(“0.0.0.0”) port(514)) = Empfangen der Meld. über Netzwerk. 0.0.0.0 = Alle Lan-Devices lauschen
tcp (ip(“0.0.0.0”) port(514)) = Wie udp, nur über tcp-Protokoll
pipe (Dateiname)/fifo (Dateiname) = Lesen aus einer Pipe

Beispieleintrag für SOURCE/Quelle

source
Bekannte_Meldungen {

internal();
unix-stream (“/dev/log”);
file (“/var/log/messages”);

};

2.) Filterregeln – Unnötiges herausfiltern

facility(kategorie) = Komma-separierte Liste der Log-Kategorien
level(priority) = Komma-separierte Liste der Prioritätsstufen
priority(priority) = wie level()
program(regex) = wird auf das Feld der Meldung des Programms angewendet
host (regex) = Wird auf des Feld mit dem Hostnamen angewendet
match (regex) = Wird auf beliebigen Bestandteil der Meldung angewendet
filter(filtername) = Einbinden einer anderen Filterregel
netmask (ip/netmask) = Prüfen des Herkunftsnetz des PCs, von dem die Meldung stammt

and = Und-Verknüpfung
or = Oder-Verknüpfung
not = Verneinung

Beispieleinträge für Filter

filter f_news { facility(news); };
filter
f_newserror { level(err) and facility(news); };
filter
f_messages { not filter (f_newserror) or level(warn); };

3.) Destination – Wohin wird geloggt?

file(/var/log/messages) = Meldungen werden in Datei geloggt
fifo(DATEI) oder pipe(DATEI) = Meldungen landen in der Datei
unix-stream(DATEINAME) = Nachrichten über den Socket senden
udp(192.168.0.1 port(514)) = Meldungen per UDP über Port 514 an 192.168.0.1 senden
tcp(192.168.0.1 port(514)) = Meldungen per TCP über Port 514 an 192.168.0.1 senden
usertty(root) = Meldungen an das Terminal des User schicken
program(programm) = Meldung an Programm übergeben

Beispieleinträge für Destination

destination message { file(“/var/log/messages”); };
destination
root {usertty(“root”); };
destination console { file(“/dev/tty10” group(tty) perm(0620)); };

4.) Log – Source, Filter, Destination miteinander verbinden

Beispieleinträge für Log

destination message { file(“/var/log/messages”); };
log { source (
Bekannte_Meldungen); filter (f_messages); destination (message); };

5.) Options – Allgemeine Optionen

Beispieleinträge für Options

options {

# Zeit nach der eine Verbindung wiederaufgebaut wird
time_reopen(10);
# Zeit in Sek, bis eine nicht benutzte Datei geschlossen wird
time_reap(360);
# Anzahl Zeilen, die gepuffert werden. Je höher, desto bessere Performance, desto weniger Zugriffe
sync(50);
# Erstellen von Verzeichnissen erlauben
create_dirs(yes);
# Einstellungen für Besitzer, Gruppe und Berechtigungen der Log-Dateien
owner(root);
group(adm);
perm(0640);

# Einstellungen für Besitzer, Gruppe und Berechtigungen der Verzeichnisse
dir_owner(root);
dir_group(root);
dir_perm(0755);


};

logger – Meldungen an Syslogger übergeben

logger -p user.notice Hilfeeeee // Systemmeldung Kat. = user, Priorität = notice, meldung = Hilffeee

LPI 2.211.2 Softwarepakete erstellen

Aufbau eines RPM-Pakets

1.) Alle notwendigen Dateien (hallo.c, MAKEFILE, README) in das Vrz. hallo-1.0.0 kopieren
2.) tar -czvf hallo-1.0.0.tar.gz hallo-1.0.0
3.) Tar-Archiv nach
/usr/src/packages/SOURCES kopieren
4.) SPEC-Datei erstellen (hallo.spec) und nach
/usr/src/packages/SPECS kopieren
5.) cd /usr/src/packages/SPECS &&
rpm -ba hallo.spec usr/src/packages/ SOURCES = Enthält die Original-Sources (*.tar.gz)
SPECS = Enthält die SPEC-Dateien
BUILD = Hier werden die Sources entpackt, um sie dann zu kompilieren
RPMS = Hier werden die fertigen Binaries abgelegt. Jede Architektur hat ein Unterverzeichnis (i386)
SRPMS = Vrz. für erzeugte Source-RPMs
rpm bzw. rpmbuild -bp datei.spec = Nur der %prep-Abschnitt wird ausgeführt (Auspacken der Sources)
-bl datei.spec = Überprüft, ob die Dateien von %files exisitieren (List check)
-bc datei.spec = %build Sektion ausführen
-bi datei.spec = Auswertung der %install Sektion
-bb datei.spec = Binary-Paket bauen (vorher werden prep, build, install werden vorher ausgeführt)
-bs datei.spec = nur das Source-RPM erzeugen
-ba datei.spec = alle bauen, RPM und SRPM
rpmbuild –rebuild source-rpm = Erstellt ein Binary aus einem SRPMS
/usr/lib/rpm/rpmrc =
/usr/lib/rpm/redhat/rpmrc = Einstellungen für RPM festlegen
Die SPEC-Datei ist die Bauanleitung des Programms. Beispiel SPEC-Datei # Präambel Vendor: W.Eihnachtsmann Distribution: None Name: hallo Release: 13 Packager: W.Eihnachtsmann <weihnachtsmann@nordpol.com> Copyright: GPL Group: unsorted Provides: hallo Autoreqprov: on Version: 1.0.0 Summary: Eine einfache Hallo Welt Anwendung Source: hallo-1.0.0.tar.gz %description Diese Anwendung zeigt die grundlegende Funktionalitaet eines C-Compilers. # Die %prep Sektion entpackt das tar Archiv. (Statt der beiden Anweisungen # haetten wir auch einfach %setup schreiben koennen. %prep rm -rf $RPM_BUILD_DIR/hallo-1.0.0 zcat $RPM_SOURCE_DIR/hallo-1.0.0.tar.gz | tar -xvf - # Die %build Sektion kompiliert das Programm %build make # Die %install Sektion installiert es %install make install # Die %files Sektion enthält eine Liste der Dateien, die in das RPM-Paket # integriert werden sollen. Diese Liste muß von Hand erstellt werden und alle
# Dateien, die übernommen werden sollen müssen hier mit vollem Pfad angegeben %files /usr/local/bin/hallo %doc README

Beispiel MAKEFILE

CC = gcc
TARGET = hallo
BINDIR = /usr/local/bin
DOCDIR = /usr/share/doc/packages/hallo
all: hallo.c
        $(CC) -o $(TARGET) hallo.c
install:
        cp hallo $(BINDIR)
        mkdir $(DOCDIR)
        cp README $(DOCDIR)
clean:
        rm hallo

Erstellen eines DEB-Pakets

Bei DEB-Dateien handelt es sich um ar-Archive. Mittels ar tx syslog-ng_1.6.5_i386.deb kann man sich den Inhalt anzeigen lassen.
Aufbau einer DEB-Datei
debian-binary = kennzeichnet das Archiv als Debian-Paket, enthält die Versionsnummer des DEB-Formats
data.tar.gz = Enthält Programmdateien (vollständiger Pfad, Binaries, Dokus, Konfigs)
control.tar.gz = Kontrollinformationen für dpkg, vor allem die Datei control, welche ähnlich d. SPEC-Files ist
Inhalt der control.tar.gz control = wichtige Infos wie Versionsnr., Beschreibung, Infos zum Paket. Ähnlich dem SPEC-File
preinst, postinst, prerm, postrm = Skripte die vor-/nach der (De-)Installation ausgeführt werden
conffiles = spezielle Konfig-Datei, welche bei Upgrade nicht auto. Überschrieben werden
config = Skript, das vom User die notwendigen Konfigurationsparameter erfragt
templates = enthält die Texte zu den von debconf gestellten Fragen
md5sum = MD5-Summe
Beispiel der control-Datei Package: rc-local
Version: 0.1-1
Section: martin // Eine der Debian-eigenen Sektionen, wie z. B. admin, base, utils, misc, net..
Priority: extra
Architecture: all
Installed-Size: 56
Maintainer: Martin Bock <mbock@bigfoot.de>
Description: Initscript for local stuff
Adds a rc.local in Red Hat-Style to your systems System V-Init....
dpkg-deb dpkg-deb --build, -b VRZ paket.deb = Erstellt ein Debian-Paket aus Vrz, welches die Debian-Struktur hat
dpkg-deb
--info, -I = Gibt Infos über ein Debian-Paket aus
dpkg-deb
--extract, -x, --vextract, -X = Extrahiert die Dateien aus dem Deb-Paket

LPI 2.211.3 Datensicherung

Inkrementelles Backup: Nur Änderungen zur vorherigen Sicherung werden gesichert.
Differentielles Backup: Änderungen zum letzten Vollbackup werden gesichert.


Backup-Level bei inkrementeller Sicherung

Montag: Vollbackup, Level 0, [20,9 GB]

Dienstag: inkrementelles Backup 1, Level 1, geänderte Daten [60,2 MB]

Mittwoch: inkrementelles Backup 2, Level 1, geänderte Daten [98,2 MB]

Donnerstag: inkrementelles Backup 3, Level 1, geänderte Daten [125,0 MB]

Freitag: inkrementelles Backup 4, Level 1, geänderte Daten [153,2 MB]


dump/restore - Backup erstellen

dump [-Level] [-u] [-f Backupdatei] Dateisystem/Verzeichnis


-f = Speicherort, kann Platte, Bandlaufwerk oder eine Datei sein

-u = Aktualisiert die Datei /etc/dumpdates


dump -0ua -f /dev/tape /dev/hda1 = Erstes Vollbackup erstellen (Level 0)

dump -1ua -f /dev/tape /dev/hda1 = Erstes inkrementelles Backup erstellen (Level 1)


restore = Sicherung von dump wiederherstellen

-f = Angabe zur Datei, die das Backup enthält

-C = Backup überprüfen

-r = Backup wiederherstellen

-i = Interaktiv, Eingabeaufforderung bei der Wiederherstellung


// Backup wiederherstellen

# mke2fs /dev/hda4

# mount /dev/hda4 /mnt/recovery

# cd /mnt/recovery

# restore -r -f /home/backup


cpio

cpio -p = Copy-Pass-Modus, einlesen von der Standardeingabe
cpio -o = Copy-Out-Modus, Erstellen von Archiven
cpio -i = Copy-In-Modus zum Auslesen/Auspacken eines Archivs


Optionen

-o / --create = Erstellen eines Archivs
-A / --append = Dateien ans Archiv anhängen
-i / --extract = Copy-In Modus zum entpacken von Archiven
-t / --list = gibt den Archivinhalt aus
-d / --make-directories = Legt nicht vorhandene Vrz. an.
-m / --preserve-modification-time = Zeitstempel der letzten Dateiänderung bleibt erhalten


Beispiele

find . |cpio -pvd /backup // Inhalt des aktuellen Vrz nach /backup kopieren
find ~ -name *.tex | cpio -ov > tex.cpio // Alle tex-Dateien im H-Laufwerk in Archivdatei tex-cpio speichern
cpio -it < /tmp/tex.cpio // Inhalt des Archivs auflisten
cpio -idv < /tmp/tex.cpio // Archiv extrahieren
ls *.jpg | cpio -o > /dev/fd0

find /etc -mtime -5 -maxdepth 2 -depth | cpio -o > /dev/fd0


tar

-f datei = Angabe der Datei
-c = Erzeugen eines Archivs
-x = Extrahieren eines Archivs
-C Vrz = Ins Verzeichnis wechseln
-t = Inhalt auflisten
-A = (append) Dateien zu Archiv anhängen/hinzufügen
--delete = Dateien aus einem Archiv löschen
-j = Bzip2 Archiv
-z = gzip (tar.gz) Archiv


Images mit dd (Device to Device Copy)

- dd liest und schreibt zuverlässig blockweise

- intepretiert die Blöcke nicht, daher ist das Dateisystem unwichtig


dd if=/dev/hda1 of=/dev/hdb1 1:1-Kopie von hda1 nach hdb1

dd if=/dev/hdc of=image.iso CD-Image erstellen

dd if=/dev/hda1 of=/dev/hdb1 bs=2k Blockgröße ändern, 2048 Bytes Blöcke

dd if=/dev/hda of=/dev/fd0 bs=512 count=1 MBR-Bootrecord sichern

dd if=/dev/fd0 of=/dev/hda1 bs=512 count=1 MBR-Bootrecord zurückschreiben

LPI 2.213.1 Tätigkeiten durch Skripte automatisieren

Reguläre Ausdrücke


\ = Ausdruck maskieren, so dass die Bash diesen als Zeichen intepretiert


Wildcards

. = genau ein Zeichen

[xyz] = Ein Zeichen aus der Menge

[a-f]] = Ein Zeichen aus der Menge a bis f

[^qwertz] = Alle Zeichen aus den angegebenen


Modifier (Wie oft kommen Zeichen vor?)

* = beliebig häufige Vorkommen, auch nullmal

+ = wie *, nur das es mind. einmal vorkommen muss

? = Zeichen kommt null- oder einmal vor.

\{n\} = Zeichen/Muster kommt n-mal vor

\{n,\} = Zeichen/Muster kommt mindestens n-mal vor
\{n,m\} = Zeichen/Muster kommt n- bis m-mal vor


Anchors (Wo kommt das Zeichen vor?)

^ = Zeilenanfang

$ = Zeilenende

\< = Wortanfang

\> = Wortende


Gruppierung

\(ausdruck\) = Gruppierung von Suchbegriffen

od|er = od ODER der

& = UND
\i = greift auf das i-te in der runden Klammer eingeschlossene Muster zu


\1 = referenziert den Suchbegriff


Extended Regular Expressions

egrep, grep -E awk kennen erweiterte Expressions


\{n,m\} ==> {n,m}

\(ausdruck\) ==> (ausdruck)


Beispiele:

^\(From|Subject|Date\) => Am Zeilenanfang entweder From, Subject oder Date.
sed 's/<<(.*)>>/\1/g' => Entfernt die << und >> Zeichen aus einem Text


Perl


#!/usr/bin/perl
  print "Nennen Sie Ihren Namen ";
  $name = <STDIN>;
  chop($name);
  print "Hallo $name, nett Sie zu sehen\n";

# If-Bedingung if ($zahl1 >= $zahl2) { $zahl3 = $zahl1 - $zahl2; } else { $zahl3 = $zahl2 - $zahl1; }

# WHILE-Schleifen while (Bedingung) { Anweisung1; Anweisung2; } until (Bedingung) { Anweisung1; Anweisung2; } # FOR-Schleife for ($i=1;$i<=10;++$i) { print "$i\n"; } # Array @liste=("Hans","Otto","Gabi","Peter"); foreach $name (@liste){ print "Das ist $name\n"; }

Module in Perl einbinden


Perl-Module sind *.pm-Dateien. Perl-Module werden folgendermaßen importiert


import Modul [Liste] = Importiert Routinen/Variablen aus der angegebenen Moduldatei i. d. aktuelle Projekt.

unimport Modul [Liste] = Hebt die Wirkung eines vorher aufgerufenen import oder use Befehls wieder auf. require Moduldatei = Bindet die angegebene Datei einmal in den Quellcode ein.

use Modul [Version] [Liste] = Während des Kompil. wird das angegebene Modul mittels require geladen.


CPAN (Comprehensive Perl Archive Network )


weltweites Netz von Perl-Programmierern, die ihre Module allen anderen Perl-Nutzern zur Verfügung stellen

perl -MCPAN -e shell = Startet interaktive Shell, wo man u.a. Nach Modulen suchen kann.


PERL-Taint-Modus

Der Taint-Modus von Perl versetzt den Perl-Interpreter in einen "paranoiden Zustand", in dem alle Eingaben der User solange als bösartig gelten, bis der Programmierer explizit sein OK gibt. alle Kommandozeilenargumente, Umgebungsvariablen und Usereingaben werden abgelehnt, wenn 1.)
Befehle, die eine Subshell öffnen 2.) Kommandos, welche Dateien, Verzeichnisse und Prozesse manipulieren und 3.) eval-Statements sind.


Grundlagen Bash-Programmierung


Bash-Skripte


#!Programm = startet jede Shell das Progamm und gibt ihm als Parameter den Namen des Scripts mit.

#!/bin/bash = für die Abarbeitung des Scriptswird grundsätzlich die bash benutzt

source = externen Quellcode einbinden
read = Benutzereingaben einlesen


Beispiel:

addiere 10 20

# auszug Skript addiere

#!/bin/bash

let ergebnis=$1+$2

echo $1 plus $2 ergibt $ergebnis


Shift

Der Befehl shift verschiebt die ganze Kette der Kommandozeilenparameter um eines nach links. Das bedeutet, der Parameter 2 wird zum Parameter1, der Parameter3 zum Parameter2 usw. Der erste Parameter fällt weg. Damit kann eine unbestimmte Anzahl von Parametern bearbeitet werden, indem in einer Schleife immer nur der erste Parameter verarbeitet wird und anschließend der Befehl shift aufgerufen wird. Die Schleife wird solange wiederholt, bis keine Parameter mehr übrig sind.


#!/bin/bash

while [ $# -gt 0 ] # Solange die Anzahl der Parameter ($#) größer 0

do

echo $1 # Ausgabe des ersten Parameters

shift # Parameter verschieben $2->$1, $3->$2, $4->$3,...

done


set

Mit set können Parameter geändert werden. Wird selten benutzt.


test

-r Dateiname Die Datei Dateiname existiert und ist lesbar

-w Dateiname Die Datei Dateiname existiert und ist beschreibbar

-x Dateiname Die Datei Dateiname existiert und ist ausführbar

-d Dateiname Die Datei Dateiname existiert und ist ein Verzeichnis

-s Dateiname Die Datei Dateiname existiert und ist nicht leer

-b Dateiname Die Datei Dateiname existiert und ist ein blockorientiertes Gerät

-c Dateiname Die Datei Dateiname existiert und ist ein zeichenorientiertes Gerät

-g Dateiname Die Datei Dateiname existiert und das SGID-Bit ist gesetzt

-k Dateiname Die Datei Dateiname existiert und das Sticky-Bit ist gesetzt

-u Dateiname Die Datei Dateiname existiert und das SUID-Bit ist gesetzt

-p Dateiname Die Datei Dateiname existiert und ist ein Named Pipe

-e Dateiname Die Datei Dateiame existiert

-f Dateiname Die Datei Dateiname existiert und ist eine reguläre Datei

-L Dateiname Die Datei Dateiname existiert und ist ein symbolischer Link

-S Dateiname Die Datei Dateiname existiert und ist ein Socket

-O Dateiname Die Datei Dateiname existiert und ist Eigentum des Anwenders, unter dessen UID das test-Programm gerade läuft

-G Dateiname Die Datei Dateiname existiert und gehört zu der Gruppe, zu der der User gehört, unter dessen UID das test-Programm gerade läuft

Datei1 -nt Datei2 Datei1 ist neuer als Datei2 (newer than)

Datei1 -ot Datei2 Datei1 ist älter als Datei2 (older than)

Datei1 -ef Datei2 Datei1 und Datei2 benutzen die gleiche I-Node (equal file)

-z Zeichenkette Wahr wenn Zeichenkette eine Länge von Null hat.

-n Zeichenkette Wahr wenn Zeichenkette eine Länge von größer als Null hat.

Zeichenkette1 = Zeichenkette2 Wahr wenn Zeichenkette1 gleich Zeichenkette2

Zeichenkette1 != Zeichenkette2 Wahr wenn Zeichenkette1 ungleich Zeichenkette2

Wert1 -eq Wert2 Wahr, wenn Wert1 gleich Wert2 (equal)

Wert1 -ne Wert2 Wahr, wenn Wert1 ungleich Wert2 (not equal)

Wert1 -gt Wert2 Wahr, wenn Wert1 größer Wert2 (greater than)

Wert1 -ge Wert2 Wahr, wenn Wert1 größer oder gleich Wert2 (greater or equal)

Wert1 -lt Wert2 Wahr, wenn Wert1 kleiner Wert2 (less than)

Wert1 -le Wert2 Wahr, wenn Wert1 kleiner oder gleich Wert2 (less or equal)

!Ausdruck Logische Verneinung von Ausdruck

Ausdruck -a Ausdruck Logisches UND. Wahr, wenn beide Ausdrücke wahr sind

Ausdruck -o Ausdruck Logisches ODER. Wahr wenn mindestens einer der beiden Ausdrücke wahr ist


if-Anweisung


if [-x /home/chef/skript1]

then

/home/chef/skript1

else

echo Datei existiert nicht!

fi


while-Schleife


while [ $zahl -gt 1 ];

do

fakultaet=$fakultaet*$zahl

zahl=$zahl-1

done


For-Schleife


for name in $@ # Arbeitet jeden Parameter ab

do

...

done


for i in `cut -d: -f1 /etc/passwd` # Zeigt alle Benutzer an

do

echo $i

done


case-Bedingung


case $m in

Jan*|jan*) m=1 ;;

Feb*|feb*) m=2 ;;

Mar*|mar*) m=3 ;;

Apr*|apr*) m=4 ;;

Mai*|mai*) m=5 ;;

Jun*|jun*) m=6 ;;

Jul*|jul*) m=7 ;;

Aug*|aug*) m=8 ;;

Sep*|sep*) m=9 ;;

Okt*|okt*) m=10 ;;

Nov*|nov*) m=11 ;;

Dez*|dez*) m=12 ;;

esac


Speicherort von Skripten


Nur ROOT:

/usr/local/sbin oder /root/bin

Zugriffsmodus: rwx------ 700


Für Benutzer:

/usr/local/bin

Zugriffsmodus: rwxr-xr-x 755


Beispiel-Skript:


#!/bin/bash

function zaehle_von_bis()

{

i=$1 # i bekommt den Wert des ersten Parameters

while [ $i -le $2 ] # Solange i kleiner/gleich Parameter2

do

echo $i # Ausgabe der Zahl i

let i=$i+1 # i wird um 1 erhöht

done

}


read -p "Startwert: " zahl1 # Startwert einlesen

read -p "Endwert: " zahl2 # Endwert einlesen

zaehle_von_bis $zahl1 $zahl2 # Aufruf der Funktion mit den gelesenen Werten


Beispiel-Skript


Auslastung=`df /dev/hda1| grep ^/ |cut -c52-54`

if [ $Auslastung -gt 90 ]

then

mail -s "Alarm: Platte bald voll" root <<EOM

Hallo Systemverwalter. Die Platte /dev/hda1 ist bald voll.

Sie ist zu $Auslastung belegt.

Mach was!!!

EOM

fi


Parameter


$0 = Name des Skripts

$1 = 1. übergebene Parameter

$2 = 2. übergebene Parameter

...

$99 = 99. übergebene Parameter

$@ = Steht für alle angegebenen Parameter (Unterschied wenn in " ")

$* = Steht für alle angegebenen Parameter

$# = Steht für die Anzahl aller angegebenen Parameter


Datenkanäle umlenken


> datei = Standardausgabe in Datei schreiben

< datei = liest aus Datei anstatt von Tastatur

>> datei = wie >, nur wird Ausgabe angehängt

2> datei = Fehlerausgabe in Datei schreiben

2>> datei = wie 2>, nur Fehlerausgabe wird angehängt

2>&1 = Umleitung von Fehlerausgabe auf Standardausgabe

1>&2 = Umleitung von Standardausgabe auf Fehlerausgabe
&> datei = Standard- und Fehlerausgabe in Datei schreiben

com1 | com2 = com2 empfängt Standardausgabe von com1 als Eingabe

com1 | com2 > datei = Standardausgabe von com1 und com2 werden in Datei geschrieben


Befehle verknüpfen


com1 ; com2 = com2 wird nach com1 ausgeführt

com1 && com2 = com2 wird ausgeführt, wenn com1 erfolgreich war

com1 || com2 = com2 wird ausgeführt, wenn com1 fehlerhaft war


grep


grep -i = unterscheidet nicht mehr zwischen Groß-/Kleinschreibung

grep -l = gibt nur Namen der Dateien an, die das Suchmuster enthalten

grep -n = Zeigt die Zeile an, in der das Suchmuster gefunden wurde

grep -r = rekursive Suche in allen Verzeichnissen

grep -v = gibt nur die Dateien an, in der das Suchmuster nicht gefunden wurde


sed


sed BEFEHL datei


Befehle

a = Einfügen nach aktueller Zeile

i = Einfgen vor aktueller Zeile

d = Löschen

p = Ausgeben

c = Zeilen ersetzen

s = Suchen / Ersetzen

y = Zeichen durch andere Zeichen ersetzen


Optionen

-n, --quiet, --silent = gibt nur Zeilen aus, auf die der Befehl p zutrifft

-e = Mehrere Befehle anwenden. Bsp.: sed -e ´befehl1´-e ´befehl2´datei

-f = Sed-Befehle aus Datei lesen


Beispiele

sed ´12,$d´ datei # Löschen der Zeilen 12 bis Ende ($)

sed ´5c text´ datei # Zeile 5 Ersetzen durch “text”

sed -n ´/Muster.*/p´datei # Gibt nur Zeilen aus, auf die der Regexp zutrifft. Regexp werden

# mit / eingeleitet.

sed -n ´/^#/!p´ /etc/smb.conf # Nur Zeilen ausgeben, die NICHT mit # beginnen

sed `1,10{befehl1;befehl2}´datei # 2 Befehle anwenden, durch Semikolon getrennt

sed ´s/Suse/SUSE´ datei # Ersetzt den nur den ersten Suchtreffer einer Zeile

sed ´s/Suse/SUSE/g´ datei # Ersetzt alle Suchtreffer, g steht für Global

sed ´s/Suse/SUSE/gI´ datei # Ersetzt Suchtreffer, keine Unterscheidung in Groß-/Kleinschreibung

sed ´s/:/-/2´datei # Jeder 2. Doppelpunkt wird zu einem Bindestrich

echo “Audo” | sed -e ´y/d/t/´ # Aus Audo wird Auto


awk

awk ´muster {aktion}´ # Wenn muster fehlt = Anwendung auf alle Zeilen

# Wenn {aktion} fehlt = Print


awk ´/homes/ {print}´ date # Zeilen, die das Muster homes enthalten

awk ´{print $1, $6}´ datei # Spalte 1 und 6 jeder Zeiler ausgeben

awk ´$3==1000 {print}´ datei # Zeile ausgeben, in der die 3 Spalte 1000 enthält

awk ´$3>=1000 {print}´ datei # Zeile ausgeben, in der die 3 Spalte größer/gleich 1000 ist

awk -F: ´{print $1, $6}´ datei # -F: ändert den Feldtrenner vom Leerzeichen in den Doppelpunkt

awk '{printf("Herr %s ist %d Jahre alt und verdient %.2f Euro\n",$2,$3,$4)}'


mail

mail -s “Status” abc@gmx.de < /var/log/messages # Datei als Mailinhalt verschicken

df -h | mail -s “HDD-Speicherplatz” abc@gmx.de # Ausgabe von df verschicken

mail -s “passwd” -a /etc/passwd abc@gmx.de root # Datei als Anhang verschicken


cron

Benutzer-Crontabs

Damit auch einfache Benutzer Cron-Jobs definieren können, gibt es das Tool crontab. Hier die wichtigsten Befehle:

crontab Dateiname = Anlegen einer User-Crontab-Datei
crontab -l = Anzeigen der eigenen Crontab-Datei
crontab -r = Löschen der eigenen Crontab-Datei
crontab -e = Bearbeiten der eigenen Crontab-Datei

Minute Stunde Tag Monat Wochentag Username Kommando

M S T M W Befehl

5 20 * * * /usr/bin/message.sh (täglich um 20.05)

*/5 * * * * /usr/bin/message.sh (alle 5 Minuten)

0 6-23/2 * * * Befehl (alle zwei Stunden zw. 6-23 Uhr)

0 0 * * * Befehl (Täglich um 0.00 Uhr)

20,30 1 * * 1-5 Befehl (Mo-Fr um 1.20 und 1.30 Uhr)


/etc/cron.allow und /etc/cron.deny

In diesen Dateien werden die User eingetragen, die entweder Cron-Jobs ausführen dürfen oder nicht. Es darf nur eine der beiden Dateien existieren.


at

at = Jobs zu bestimmter Zeit starten

# at 12.30 tomorrow

at> /home/backup.sh

at> [Ctrl]-[D] <eot>

warning: commands will be executed using /bin/sh

job 3 at 2007-06-07 12.30</eot>


12:30 = Heute um 12.30 Uhr

midnight = 0.00 Uhr

noon = 12.00 Uhr

teatime = 16.00 Uhr

8:30pm = 20.30 Uhr

8:30am = 8.30 Uhr

30.05 = 30.05 dieses Jahres

12/12/07 = Am 12.12.2007

tomorrow, today = »Morgen« und »heute«.


atq (at -l) = Jobliste anzeigen lassen

atrm (at -d oder at -r) 5 6 12 15 = Jobs löschen


rsync


rsync OPTIONEN quelle ziel


Optionen

-v / --verbose = “gesprächig”

-q / --quiet = Keine Ausgabe

-a / --archive = Archivmodus, entspricht -rlptgoD

-r kopiert Unterverzeichnisse, lässt rsync rekursiv arbeiten

-l kopiert symbolische Links

-p behält Rechte bei

-t behält Zeiten bei,

-g behält Gruppenrechte bei

-D behält Gerätedateien bei; nur root

-A ACLs erhalten

-H Hardlinks erhalten

-S Dateien "mit Löchern" effizient handhaben

-X Xattrs erhalten

-v zeigt beim Kopieren alle Schritte, die gerade ausgeführt werden, an

-n simuliert den Kopierauftrag, trocken - ein Testlauf, der nichts wirklich kopiert

-z komprimiert den Datentransfer

-e hiermit lässt sich die Remote-Shell wählen, welche per Default SSH ist;

-b Backups werden erstellt

-u update - Dateien, die im Backup schon vorhanden und sind sind, werden ausgelassen

-v verbose - Gibt einen genauen Verlauf, insbesondere wenn Fehler auftauchen

--backup-dir=Verzeichnis ;kann ein Verzeichnis angeben werden

--progress Hier wird der Fortschritt während der Übertragung angezeigt

--delete Dateien, die auf der Quelle nicht mehr existieren, werden auch auf dem Ziel gelöscht.

--exclude=Verzeichnis Damit werden Verzeichnisse von dem Kopiervorgang ausgeschlossen


Beispiele:
rsync -a /quelle /vrz/ziel # Inhalt von quelle nach ziel kopieren. /quelle/ würde komplettes Vrz bedeuten

rsync -av -e ssh /home/ root@rechner1:/ziel/home/ # Per SSH Dateien synchronisieren


rsyncd ist der Rsync-Dämon. Wird in /etc/rsyncd.conf konfiguriert.


rsyncd.conf

uid = nobody
gid = nobody
use chroot = no
max connections = 4
syslog facility = local5
pid file = /var/run/rsyncd.pid
[ftp]
        path = /var/ftp/pub
        comment = whole ftp area (approx 6.1 GB)
[sambaftp]
        path = /var/ftp/pub/samba
        comment = Samba ftp area (approx 300 MB)

LPI 2.214.2 Rettungsmedien erzeugen

Bootprozess

1.) Laden des Kernels direkt bzw. über Bootloader

- BIOS liest Sektor 0 des Zylinders 0 und führt dort gefundenes Programm aus

- Das Programm kann Bootloader oder Betriebssystem sein.

- Wenn Kernel direkt auf Bootmedium geschrieben wurde, dann wird der Kernel direkt geladen

- Wenn Bootloader auf das Bootmedium geschrieben wurde, wird dieser ausgeführt


2.) Ramdisk-Word

Nach Laden des Kernels wird eine bestimmte Speicheradresse, das so genannte Ramdisk Word, gelesen. Dieses enthält Angabe des Root-Devices, welches man mit rdev bearbeiten kann.


rdev /boot/vmlinuz = Zeigt Root-Verzeichnis des Kernels an

rdev /boot/vmlinuz /dev/hda5 = Ändert das Root-Device des Kernels in /dev/hda5

rdev -v /boot/vmlinuz =

vidmode = Auslesen des Videomodus

rdev -v /boot/vmlinuz 1 = Videomodus in 80x25 Zeichen ändern

rdev -v /boot/vmlinuz 2 = Videomodus in 80x50 Zeichen ändern

rdev -v /boot/vmlinuz 3 = Mögliche Videomodi werden beim Booten zur Auswahl angeboten

rdev -r = Gibt die Größe der Ramdisk an


Eine RAM-Disk ist ein virtueller und temporärer Datenträger im Arbeitsspeicher eines Computers. Sie wird hauptsächlich eingesetzt, wenn andere physikalische Speichermedien zu langsam oder, während der Rechner neu aufgesetzt wird, nicht verfügbar sind.


Rettungsdisketten bestehen in der Regel aus zwei Disketten, nämlich aus einer Bootdiskette (enthält Minimal-Kernel mit notwendigen Modulen, um auf das Dateisystem zuzugreifen, etc) und aus einer Rootdiskette (Wurzeldateisystem mit notwendigen Werkzeugen) in Form einer komprimierten Ramdisk. Somit wird das Wurzeldateisystem in den RAM des Rechners geladen ==> Schneller als von Diskette direkt.


3.) Image für Root-Diskette erstellen

Benötigt alle essentiellen Bestandteile eines Linux-Systems. Die wären:

- Dateisystemstrukur: /dev, /proc, /bin, /etc, /lib, /usr, /tmp

- Basisprogramme: ls, cp, mv, init, getty, login, mount inklusive Shared Libraries

- Konfigurationsdateien: /etc/inittab, /etc/fstab, /etc/passwd

- Gerätedateien: /dev/hd*, /dev/tty*, /dev/fd0, /dev/console, /dev/kmem, /dev/mem, /dev/null, /dev/ram0


dd if=/dev/zero of=root-fs bs=4M count=1 # 4 MB große Ramdisk erstellen, welche mit Nullen gefüllt ist

mk2fs -m 0 -N 2000 root-fs # Ausreichend Inodes anlegen, 0 Blöcke für Root.

mount -o loop /tmp/root-fs /mnt # Ramdisk mounten

==> ALLE wichtigen Dateien nach /mnt kopieren

chroot /mnt # Ramdisk-Umgebung betreten / testen

cat /tmp/root-fs | gzip -9 > root-fs.gz # Image komprimieren


4.) Bootdisk erstellen

dd if=kernel-2.6.16 of=/dev/fd0 bs=1k # Kernel direkt auf Diskette kopieren

rdev /dev/fd0 /dev/fd0 # Root-Device definieren

rdev -R /dev/fd0 0 # Root-Device (-R) soll schreibbar (0) gemountet werden


LILO-Fehlermeldungen

nichts Kein Teil von Lilo wurde geladen.

LFehlernummer Der 1. Teil des Bootloaders wurde geladen, aber er kann den zweiten Teil nicht laden.

LI Der erste Teil des Bootloaders hat den zweiten Teil geladen, kann ihn aber nicht ausführen.

LIL Der 2. Teil des Bootloaders wurde gestartet, kann aber die Beschreibungstabelle des map-files nicht laden. Typischerweise ein Medien-Fehler (Oberflächenbeschädigung) oder unpassende Plattengeometrie.

LIL? Der zweite Teil des Bootloaders wurde an eine falsche Adresse geladen. Auch hier ist die wahrscheinlichste Ursache, dass die Datei /boot/boot.b verändert oder bewegt wurde.

LIL- Die Beschreibngstabelle ist beschädigt. Entweder ein Oberflächenfehler, oder die Datei /boot/map wurde verändert oder bewegt.

LILO Alle Teile von lilo wurden ordnungsgemäß geladen.

LPI 2.214.5 Allgemeine Probleme lösen

Strace / ltrace– Fehlerdiagnose nach Programmabsturz

strace mozilla-firefox # Liest Standardfehlerausgabe über das Programm firefox aus.

strace -p 7594 # Ausgabe über laufenden Prozess


strings – Text aus Binärdateien lesen

strings /boot/kernel-2.6.16


lsof – List Open Files, geöffnete Dateien anzeigen

lsof /mnt/usb-hdd

LPI 2.214.8 Probleme bei Umgebungskonfigurationen lösen

/etc/passwd

Username:x:UserID:GruppenID:Beschreibung:Homeverzeichnis:Startshell

/etc/shadow

Username:Passwort:Alter:min_Alter:max_Alter:Warnzeit:Pufferzeit:Ungültigkeit:Reserviert

/etc/group
Gruppenname:x:GruppenID:Liste der Mitglieder


/etc/gshadow

Gruppenname:Passwort:Gruppenverwalter:Liste der Mitglieder


chfn & finger

Benutzerinformationen aus /etc/passwd anzeigen


chsh

Shell wechseln/ändern


chage = ändert die Anzahl der Tage zwischen Passwort-Wechseln und dem Datum der letzten Passwort-Änderung.
-m = Minimale Zeit, in der der User das PW ändern muss

-M = Maximale Zeit, in der der User das PW ändern muss

-d = Wann wurde das PW zuletzt geändert (JJJJ-MM-TT, in Tagen seit dem 01.01.1970)

-E = (expires) Datum, wann das PW abläuft  (JJJJ-MM-TT, in Tagen seit dem 01.01.1970)

-I = Pufferzeit, nachdem das PW abgelaufen ist

-W = (warndays) Tage vor dem Auslaufen des PW