CentOS 4:Installation
Vorwort
Das Ziel dieser Installations-Anleitung ist ein möglichst schlankes Linux CentOS 4 Update 5 (4.5) zu installieren und auf Sicherheit zu achten.
Test- und Installationsmaschinen waren:
Sun Microsystem M2 X2100
2800 MHz, 2 GB RAM, s-ATA 250GB HD
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"
Installation der Install-CD
Lege die CD oder DVD ins Laufwerk ein und starte die Maschine. Achte darauf das im Bios das CD oder DVD Laufwerk als erstes Boot Device aufgefuehrt. Sobald der Prompt erscheint gebe ein
boot: linux
NOTE
Die Nachfolgenden Information sind ein Anhaltspunkt und koennen jenachdem von Release zu Release Abweichungen aufweisen. Die Nachfolgenden Infos sollen als Anhaltspunkt dienen.
Nach erfolgreichem Aufstarten erscheint ein Dialog mit dem man das Medium testen kann. Wir waehlen hier:
Skip
Wir waehlen die Sprache fuer die Installation:
English
Wir waehlen das Keyboard Layout:
sg-latin1
Wir waehlen die Monitor Aufloesung:
Monitor 640x480
Wir waehlen die Art der Installation:
Custom
Wir wahlen die Art der Partitionierung:
Autopartition
Eine Warnung erscheint das alle Daten verloren gehen:
OK
Welche Festplatte soll benutzt werden fuer die Installation und welche bestehenden Partitionen sollen entfernt werden etc:
Remove all partitions on this system [*] sda
Wenn es sich um eine IDE Disk handelt so erscheint "hda" anstelle von "sda" dh. sda= SCSI und hda= IDE! Nach der Bestaetigung wird das vorgegebene "Layout" der Disk angezeigt. Achte darauf das folgende Hinweise eingehalten werden:
Die Partition /boot kann geloescht werden Die Partition swap sollte mind 2 X die RAM Groesse aufweisen Erstelle eine neue Partitin /var mit 1024 MB
Sofern noetig wechsle die Angaben anhand der "Cursor" Tasten dh. waehle zuerst die entsprechende Partition aus mit dem "Cursor" und gehe danach mit der "Tabulatoren" Taste auf Edit usw. Nach erfolgreicher Modifikation ergiebt sich folgendes Bild:
Device Start End Size Type Mount Point /dev/sda sda1 1 326 2557M ext3 / sda2 327 457 1027M ext3 /var sda3 458 522 509M swap
NOTE
Die Start und End Points koennen von System zu System varieren!
ACHTUNG Im Falle einer Konfiguration eines Mirrors (RAID 1) muess die Partitionen indem Sinne angelegt werden das diese als Typ auf "Software Raid" stehen dh. es werden keine "Mountpoints" vergeben sondern es wird nur Platz geschaffen um spaeter die Partitionen einem "Mountpoint" zuzuweisen. Die vorgehende vorgehensweise muss auf beiden Festplatten identisch durchgefuehrt werden. Nach der Erstellung aller Partitionen als "Software Raid" koennen diese dann ueber die Menueposition "RAID" zusammengefuegt werden zB. / RAID 1 /dev/sda1 /dev/sdb1 wird zu /dev/md1 /var RAID 1 /dev/sda2 /dev/sdb2 wird zu /dev/md2 swap RAID 1 /dev/sda3 /dev/sdb3 wird zu /dev/md3
Wenn nach einer Installation eines hier beschriebenen "Raid 1" sprich eines Mirrors der Server nach der Installation des OS nicht mehr bootet so fuehre folgendes aus:
--> Setup von GRUB: (Setzt vorraus das Grub bereits installiert wurde)
1. Boote als Erstes den Server neu mit der CD 1 2. Sobald der Boot Dialog erscheint gebe ein: linux rescue 3. Als naechstes muss die Sprache angegeben werden: English 4. Nun das Keyboard Layout: sg-latin1 5. Nun hat man die Moeglichkeit die Linux Partition als "read-only" oder "read-write" zu mounten dh. wir waehlen "read-write": Continue 6. Damit man nun die Partition mounten kann gebe ein: chroot /dev/sysimage 8. Nun starte GRUB und fuehre folgende Modifikation durch: # grub grub> root (hd0,0) Filesystem type is ext2fs, partition type 0xfd grub> setup (hd0) Checking if "/boot/grub/stage1" exists... yes Checking if "/boot/grub/stage2" exists... yes Checking if "/boot/grub/e2fs_stage1_5" exists... yes Running "embed /boot/grub/e2fs_stage1_5 (hd0)"... 16 sectors are embedded. succeeded Running "install /boot/grub/stage1 (hd0) (hd0)1+16 p (hd0,0)/boot/grub/stage2 /boot/grub/grub.conf"... succeeded Done. 9. Danach logge dich aus mit "quit" und "exit". Sobald man ausgeloggt ist wird ein Neustart durchgeführt.
Weitere wichtige Informationen finden man auf:
http://balrog.nmglug.org/pipermail/nmglug/2005-September/001229.html
Waehle den "Boot-Loader":
Use GRUB Boot Loader
Im folgenden Dialog haette man die Moeglichkeit dem "Kernel" beim "Boot-Prozess" spezielle Optionen mitzugeben:
* CentOS Core /dev/sda1
Die "Boot-Partition" steht nun fest jedoch noch nicht wo der "Boot-Loader" selber installiert werden soll. Wir waehlen im naechsten Dialog dies aus und zwar:
/dev/sda Master Boot Record (MBR)
Nach erfolgreicher Bestaetigung erscheint der Dialog um die "Netzwerkkarte" zu konfigurieren. Wir konfigurieren wie folgt:
[ ] Configure using DHCP [*] Activate on boot IP Address 192.168.101.34 Netmask 255.255.2550
Bestaetige die Modifikation mit "Ok". Als naechstes muss der "Gateway" sowie die "DNS Server" konfiguriert werden. In unserem Fall sieht das wie folgt aus:
Gateway: 192.168.101.120 Primary DNS: 192.168.100.125 Secondary DNS: 192.168.100.194 Tertiary DNS:
Wiederum bestaetige die Eingaben mit "OK". Als naechstes vergeben wir dem Server einen "Hostnamen":
(*) manually syrus
Als naechstes koennte eine "FireWall" eingeschaltet werden jedoch dies ist in unserem Fall unnoetig und deshalb deaktvieren wir die "FireWall":
( ) Enable firewall (*) No firewall
Bestaetige die Auswahl mit "OK". Es erscheint nach erfolgter Bestaetigung nochmals einen Hinweis betreffend der "FireWall" etc. Waehle:
Proceed
Im naechsten Dialog ist per Standard die Sprache "English" ausgewaehlt und es koennten noch mehr Sprachen ausgewaehlt werden jedoch ist dies fuer ein Server unnoetig. Also kontrolliere das folgender Eintrag angewaehlt ist und bestaetige diesen mit OK:
(*) English (USA)
Nun fehlt noch die "Zeitzone". Waehle die entsprechende an. In unserem Fall waere dies:
[ ] System clock uses UTC
Europe/Zurich
Jetzt setzen wir ein User "root" Passwort und bestaetigen dieses:
Password: ppo79456 Password (confirm): ppo79456
Alle System Angaben sind nun gemacht es fehlen nur noch die Angabe der zu installierenden Packages. Scrolle ganz nach unten und aktiviere die Position:
"Minimum...."
Alle Angaben sind gemacht! Nun erscheint nochmals einen Hinweis das die Installation protokolliert wird im folgenden File:
/root/install.log
Nun wird die Installation ausgefuehrt! Sofern weitere Packages installiert werden sollen muss auf die CentOS 4.U5 CD zurueckgegriffen werden resp. diese muss per "mount" Kommando zugaenglich gemacht werden. Danach koennen anhand des RPM Befehls weitere Packages installiert werden.
# mkdir /cdrom # mount -o ro /dev/cdrom /cdrom # rpm -ivh [Package Name]
NOTE
Ein Package kann auch anhand "yum" installiert werden sofern der Server bereits ueber Internet Anschluss verfuegt dh. der Befehl lautet dazu:
# yum install [Package Name]
Fuer "KOMPILIERUNGS FUNKTION": autoconf-2.59-5.noarch.rpm automake-1.9.2-3.noarch.rpm gcc-3.4.6-8.i386.rpm m4-1.4.1-16.i386.rpm binutils-2.15.92.0.2-22.i386.rpm cpp-3.4.6-8.x86_64.rpm glibc-devel-2.3.4-2.36.i386.rpm glibc-headers-2.3.4-2.36.i386.rpm glibc-kernheaders-2.4-9.1.100.EL.i386.rpm
Nachfolgend eine Liste von Packages die installiert werden muessen sofern das genannte Programm/Module spaeter installiert werden soll:
Fuer "Squid/Clamav/Dansguardian" im Zusammenhang mit Rueckwaertskompatibilitaet: zlib-1.2.1.2-1.2.i386.rpm zlib-devel-1.2.1.2-1.2.i386.rpm compat-libstdc++-33-3.2.3-47.3.i386.rpm
Fuer "PHP" im Zusammenhang mit "Apache": bison-1.875c-2.i386.rpm flex-2.5.4a-33.i386.rpm
Fuer "NTP" Tools: libcap-1.10-20.i386.rpm ntp-4.2.0.a.20040617-6.el4.i386.rpm
Fuer "NSLOOKUP" Tools: bind-utils-9.2.4-24.EL4.i386.rpm bind-libs-9.2.4-24.EL4.i386.rpm
Fuer "ARCserve 11.5r": httpd-2.0.52-32.ent.centos4.i386.rpm apr-0.9.4-24.5.c4.2.i386.rpm apr-util-0.9.4-21.i386.rpm expat-1.95.7-4.i386.rpm which-2.16-4.i386.rpm libstdc++-3.4.6-8.i386.rpm libstdc++-devel-3.4.6-8.i386.rpm compat-libstdc++-296-2.96-132.7.2.i386.rpm
Nachdem ersten Login sollte ein "Update" des OS durchgefuehrt werden. Das Netzwerk ist zwar eingerichtet jedoch weiss der Server noch nicht "wer" er ist sowie in welcher "domaine" er sich befindet dh. modifiziere folgende Files:
# vi /etc/hosts --------------- /etc/hosts --------------- # Do not remove the following line, or various programs # that require network funcitonality will fail. 127.0.0.1 localhost.localdomain localhost 192.168.101.34 syrus.mydomain.ch syrus --------------- /etc/hosts ---------------
# vi /etc/resolv.conf --------------- /etc/resolv.conf --------------- domain mydomain.ch nameserver 192.168.100.125 nameserver 192.168.100.194 --------------- /etc/resolv.conf ---------------
Nun kann ein Update durchgefuehrt werden. Dies wird anhand des Tools "yum" bewerkstelligt:
# yum update
OS Modifikationen/Manipulationen
Um RPM's zu verwalten beruecksichtige folgende Befehle:
Ein RPM Package installieren: # rpm -ivh [ Package ]
Ein RPM Package deinstallieren: # rpm -e [ Package ]
Ein RPM Package upgrade durchzufuehren: # rpm -Uvh [ Package ] NOTE Bei diesem Vorgang wird vorgaengig das alte Package deinstalliert und danach das neue Package installiert!
Um festzustellen ob ein RPM Package installiert ist: # rpm -q [ Package ]
Um Detailinformationen eines RPM Packages anzuzeigen: # rpm -qi [ Package ]
Um Detailinformationen anzuzeigen bevor ein RPM Package installiert wird: # rpm -qpi [ Package ]
Listet Files auf eines installierten RPM Packages: # rpm -ql [ Package ]
Listet Files auf eines nicht installierten RPM Packages: # rpm -qpl [ Package ]
Listet auf zu welchem RPM Package das File gehoehrt: # rpm -qf [ File ]
Fuehrt eine Ueberpruefung der RPM Signature durch: # rpm --checksig [ Package ]
Fuehrt eine Ueberpruefung der md5sum des RPM Packages durch: # rpm --checksig --nogpg [ Package ]
NOTE
bei der RPM Bearbeitung muss nur jeweils der Name des RPM Packages angegeben werden dh. es ist nicht noetig die Version etc. ebenfalls anzugeben. Im nachfolgenden Beispiel wird dies aufgezeigt:
# rpm -qpi [ Package ]
Mehr ueber Package Management findet man auf:
http://www.rpm.org/max-rpm/
Nachfolgend einige Modifikationen betreffend des OS's:
# echo MYDOMAIN 4.5 > /etc/redhat-release
# /etc/init.d/atd stop # /etc/init.d/anacron stop # /etc/init.d/acpid stop # /etc/init.d/apmd stop # /etc/init.d/yum stop # /etc/init.d/ypbind stop # /etc/init.d/nfs stop # /etc/init.d/nfslock stop
Nun koennen die unnoetigen rpm Packages deinstalliert werden:
# rpm -e --nodeps acl # rpm -e --nodeps acpid # rpm -e --nodeps apmd # rpm -e --nodeps ash # rpm -e --nodeps aspell # rpm -e --nodeps aspell-en # rpm -e --nodeps attr # rpm -e --nodeps autofs # rpm -e --nodeps anacron # rpm -e --nodeps bc # rpm -e --nodeps comps # rpm -e --nodeps dhclient # rpm -e --nodeps dos2unix # rpm -e --nodeps dosfstools # rpm -e --nodeps mkbootdisk # rpm -e --nodeps ed # rpm -e --nodeps eject # rpm -e --nodeps fbset # rpm -e --nodeps finger # rpm -e --nodeps gettext # rpm -e --nodeps --noscripts groff # rpm -e --nodeps hdparm # rpm -e --nodeps iptables # rpm -e --nodeps system-config-securitylevel-tui # rpm -e --nodeps irda-utils # rpm -e --nodeps isdn4k-utils # rpm -e --nodeps lha # rpm -e --nodeps libwvstreams # rpm -e --nodeps wvdial # rpm -e --nodeps lockdev # rpm -e --nodeps minicom # rpm -e --nodeps logwatch # rpm -e --nodeps lrzsz # rpm -e --nodeps lsof # rpm -e --nodeps man-1.5o1 # rpm -e --nodeps man-pages # rpm -e --nodeps mtr # rpm -e --nodeps nano # rpm -e --nodeps nc # rpm -e --nodeps netconfig # rpm -e --nodeps netdump # rpm -e --nodeps nfs-utils # rpm -e --nodeps nss_ldap # rpm -e --nodeps ntsysv # rpm -e --nodeps pam_smb # rpm -e --nodeps parted # rpm -e --nodeps pax # rpm -e --nodeps pcmcia-cs # rpm -e --nodeps ppp # rpm -e --nodeps rp-pppoe # rpm -e --nodeps prelink # rpm -e --nodeps procmail # rpm -e --nodeps psacct # rpm -e --nodeps quota # rpm -e --nodeps rdate # rpm -e --nodeps rdist # rpm -e --nodeps rsh # rpm -e --nodeps rsync # rpm -e --nodeps schedutils # rpm -e --nodeps setarch # rpm -e --nodeps slocate # rpm -e --nodeps specspo # rpm -e --nodeps star # rpm -e --nodeps statserial # rpm -e --nodeps sendmail # rpm -e --nodeps setuptool # rpm -e --nodeps stunnel # rpm -e --nodeps symlinks # rpm -e --nodeps system-config-mouse # rpm -e --nodeps system-config-network-tui # rpm -e --nodeps talk # rpm -e --nodeps tcsh # rpm -e --nodeps telnet # rpm -e --nodeps --noscripts time # rpm -e --nodeps tmpwatch # rpm -e --nodeps traceroute # rpm -e --nodeps unix2dos # rpm -e --nodeps utempter # rpm -e --nodeps vconfig # rpm -e --nodeps wireless-tools # rpm -e --nodeps ypbind # rpm -e --nodeps yp-tools # rpm -e --nodeps ftp # rpm -e --nodeps pciutils # rpm -e --nodeps dhcpv6_client # rpm -e --nodeps cups-libs
NOTE
Beim entfernen der Packages sind einige Files uebriggeblieben sowie Verzeichnisse die nicht mehr benoetigt werden. Beachte bitte, dass wenn im vorherigen Schritt nicht alle Packages entfernt worden sind event. diese Verzeichnisse und Files noch gebraucht werden!
Durch die einzelne Deinstallation verschiedenen rpm Packages sind einige verwaiste Files und Verzeichnisse auf dem System uebriggeblieben:
# rm -rf /etc/sysconfig/pcmcia.rpmsave # rm -rf /usr/share/info/dir.rpmsave # rm -rf /usr/local/share/man # rm -rf /usr/share/man # rm -rf /usr/X11R6 # rm -rf /usr/games # rm -rf /usr/lib/games # rm -rf /var/spool/anacron # rm -rf /usr/share/doc/* # rm -rf /usr/share/info/* # rm -f /etc/exports # rm -f /etc/printcap # rm -f /etc/hosts.allow # rm -f /etc/hosts.deny # rm -rf /etc/ppp # rm -rf /etc/opt # rm -rf /etc/X11 # rm -rf /var/opt # rm -rf /var/nis # rm -rf /var/spool/lpd # rm -rf /var/cache/man # rm -rf /var/lib/games # rm -rf /usr/etc # rm -rf /usr/local # rm -f /usr/bin/X11 # rm -f /usr/bin/kbdrate # rm -f /usr/lib/X11 # rm -rf /usr/share/empty # rm -rf /usr/share/pixmaps # rm -rf /home # rm -f /etc/rc0.d/K72autofs # mv /etc/rc0.d/K40smartd /etc/rc0.d/NOK40smartd
# rm -f /etc/rc1.d/K72autofs # mv /etc/rc1.d/K40smartd /etc/rc1.d/NOK40smartd
# rm -f /etc/rc2.d/*
# rm -f /etc/rc3.d/S28autofs # mv /etc/rc3.d/S40smartd /etc/rc3.d/NOS40smartd
# rm -f /etc/rc4.d/*
# rm -f /etc/rc5.d/*
# rm -f /etc/rc6.d/K72autofs # mv /etc/rc6.d/K40smartd /etc/rc6.d/NOK40smartd
NOTE
Bei der "initial" Installation des OS wurden einige Files im Verzeichnis "/root" angelegt die aufzeigen zB welche rpm Packages installiert wurden oder wie die "initial" Konfiguration aussieht. Diese Files werden nicht mehr benoetigt und koennen entfernt werden:
# rm -f /root/anaconda-ks.cfg # rm -f /root/install.log # rm -f /root/install.log.syslog # rm -f /root/.Xresources # rm -f /root/.cshrc # rm -f /root/.tcshrc
Nicht mehr benoetigte Log Verzeichnisse/Files koennen ebenfalls geloescht werden:
# rm -f prelink.log # rm -f anaconda.* # rm -f acpid # rm -rf cups # rm -rf /var/spool/cups
NOTE
Es ist zu empfehlen nach dem entfernen der Package nochmals ein Update durch "yum" auszufuehren da dadurch event. fehlende "dependencies" wiederum erstellt werden.
# yum update
Folgendes Verzeichnis kann erst entfernt werden wenn ein Neustart durchgefuehrt wurde:
# init 6
Nach dem Neustart entferne das Verzeichnis:
# rm -rf /var/lib/nfs
Ein Kontrolle kann folgendermassen durchgefuehrt werden:
# rpm -q [ Package ]
Damit ergiebt sich folgendes Bild betreffend installierten Packages:
# rpm -q --all -------------- output of rpm -q all --------------- hwdata-0.146.28.EL-1 libgcc-3.4.6-8 rootfiles-8-1 filesystem-2.3.0-1 termcap-5.4-3 glibc-common-2.3.4-2.36 audit-libs-1.0.15-3.EL4 bzip2-libs-1.0.2-13.EL4.3 e2fsprogs-1.35-12.5.el4 ethtool-1.8-4 gdbm-1.8.0-24 libattr-2.4.16-3.1.el4 libcap-1.10-20 checkpolicy-1.17.5-1 db4-4.2.52-7.1 libtermcap-2.0.8-39 mktemp-1.5-20 audit-1.0.15-3.EL4 iproute-2.6.9-3.EL4.7 keyutils-1.0-2 less-382-4.rhel4 perl-Filter-1.30-6 psmisc-21.4-4.1 setserial-2.17-17 newt-0.51.6-9.rhel4 tcl-8.4.7-2 vim-minimal-6.3.046-0.40E.7 cpio-2.5-13.RHEL4 gawk-3.1.3-10.1 coreutils-5.2.1-31.6 grub-0.95-3.8 module-init-tools-3.1-0.pre5.3.4 procps-3.2.3-8.6 lvm2-2.02.21-5.el4 pyxf86config-0.3.19-1 rpm-libs-4.3.3-22_nonptl shadow-utils-4.0.3-61.RHEL4 dbus-glib-0.22-12.EL.9 rpm-4.3.3-22_nonptl cracklib-dicts-2.8.9-1.3 authconfig-4.6.10-rhel4.3 selinux-policy-targeted-1.17.30-2.145 SysVinit-2.85-34.4 hal-0.4.2-6.EL4 kudzu-1.1.95.22-1 which-2.16-4 initscripts-7.93.29.EL-1.centos4 kernel-smp-2.6.9-55.EL libuser-0.52.5-1.el4.1 kbd-1.12-2.el4.4 cryptsetup-0.1-4 dump-0.4b39-3.EL4.2 bluez-libs-2.10-2 hesiod-3.0.2-30 libgpg-error-1.0-1 libjpeg-6b-33 mailx-8.1.1-37.EL4 bzip2-1.0.2-13.EL4.3 mt-st-0.8-1 libibcommon-1.0.1-7 libsdp-1.1.0-7 opensm-libs-2.0.0-7 numactl-0.6.4-1.39 logrotate-3.7.1-6.RHEL4 redhat-menus-3.7.1-2 libmthca-1.0.3.1-7 dapl-1.2.1-7 tcp_wrappers-7.6-37.2 zip-2.3-27 binutils-2.15.92.0.2-22 libxslt-1.1.11-1 m4-1.4.1-16 OpenIPMI-1.4.14-1.4E.17 pinfo-0.6.8-7 lftp-3.0.6-3 diskdumputils-1.3.25-1 libxml2-python-2.6.16-10 python-elementtree-1.2.6-5.el4.centos rhnlib-2.1.1-3.el4 nscd-2.3.4-2.36 python-sqlite-1.1.7-1.2.1 syslinux-2.11-1 umb-scheme-3.2-36.EL4 swig-1.3.21-6 xmlsec1-1.2.6-3 at-3.1.8-80_EL4 pam_ccreds-3-3.rhel4.2 sudo-1.6.7p5-30.1.3 NetworkManager-0.3.1-4.el4 gnupg-1.2.6-9 openssh-clients-3.9p1-8.RHEL4.20 openssh-server-3.9p1-8.RHEL4.20 iptstate-1.3-4 yum-2.4.3-3.el4.centos apr-0.9.4-24.5.c4.2 libstdc++-devel-3.4.6-8 compat-libstdc++-296-2.96-132.7.2 BABmgr-11.5.0-1 BABcmagt-11.5.0-1 ca-ingres-WV-3.0.2-105 ca-ingres-net-WV-3.0.2-105 ca-ingres-c2audit-WV-3.0.2-105 ca-ingres-esql-WV-3.0.2-105 ca-ingres-odbc-WV-3.0.2-105 ca-ingres-qr_run-WV-3.0.2-105 ca-ingres-star-WV-3.0.2-105 ca-ingres-vision-WV-3.0.2-105 gpg-pubkey-443e1821-421f218f glibc-kernheaders-2.4-9.1.100.EL glibc-devel-2.3.4-2.36 autoconf-2.59-5 zlib-devel-1.2.1.2-1.2 flex-2.5.4a-33 cyrus-sasl-2.1.19-14 perl-5.8.5-36.el4_5.2 bind-libs-9.2.4-27.0.1.el4 device-mapper-1.02.17-3.0.1.el4 cups-libs-1.1.22-0.rc1.9.20.2.el4_5.2 bind-utils-9.2.4-27.0.1.el4 cyrus-sasl-md5-2.1.19-14 krb5-workstation-1.3.4-49 bluez-utils-2.10-2.2 tzdata-2007h-1.el4 kernel-smp-2.6.9-55.0.12.EL kernel-2.6.9-55.0.12.EL xorg-x11-libs-6.8.2-1.EL.31 httpd-2.0.52-32.3.ent.centos4 dmraid-1.0.0.rc14-5_RHEL4_U5 indexhtml-4-2.centos4 redhat-logos-1.1.26-1.centos4.4 setup-2.5.37-1.3 basesystem-8.0-4 glibc-2.3.4-2.36 beecrypt-3.1.0-6 chkconfig-1.3.13.5.EL4-1 elfutils-libelf-0.97.1-4 expat-1.95.7-4 glib2-2.4.7-1 keyutils-libs-1.0-2 libacl-2.2.23-5.3.el4 libselinux-1.19.1-7.3 libsepol-1.1.1-2 libstdc++-3.4.6-8 gmp-4.1.4-3 mingetty-1.07-3 bash-3.0-19.3 centos-release-4-4.3 iputils-20020927-19.EL4.5 ncurses-5.4-13 net-tools-1.60-37.EL4.9 popt-1.9.1-22_nonptl rpmdb-CentOS-4.5-0.20070506 slang-1.4.9-8 sysfsutils-1.2.0-1 usbutils-0.11-7.RHEL4.1 zlib-1.2.1.2-1.2 info-4.7-5.el4.2 diffutils-2.8.1-12 findutils-4.1.20-7.el4.3 grep-2.5.1-32.3 gzip-1.3.3-16.rhel4 libxml2-2.6.16-10 openssl-0.9.7a-43.16 readline-4.3-13 python-2.3.4-14.4 rhpl-0.148.5-1 sed-4.1.2-6.el4 dbus-0.22-12.EL.9 MAKEDEV-3.15.2-3 sysklogd-1.4.1-26_EL cracklib-2.8.9-1.3 pam-0.77-66.21 policycoreutils-1.18.1-4.12 setools-2.3-4 util-linux-2.12a-16.EL4.25 hotplug-2004_04_01-7.8 udev-039-10.15.EL4 mkinitrd-4.2.1.10-1.1 kernel-2.6.9-55.EL openldap-2.2.13-7.4E passwd-0.68-10.1 usermode-1.74-2 mailcap-2.1.17-1 rmt-0.4b39-3.EL4.2 bluez-hcidump-1.11-1 elfutils-0.97.1-4 glib-1.2.10-15 libgcrypt-1.2.0-3 libusb-0.1.8-3 bluez-bluefw-1.0-6 crontabs-1.10-7 lksctp-tools-1.0.2-6.4E.1 openib-1.1-7 libibumad-1.0.1-7 OpenIPMI-libs-1.4.14-1.4E.17 pam_passwdqc-0.7.5-2 patch-2.5.4-20 desktop-file-utils-0.9-3.el4 htmlview-3.0.0-8 libibverbs-1.0.4-7 librdmacm-0.9.1-7 unzip-5.51-9.EL4.5 words-3.0-3.2 crash-4.0-3.9 fontconfig-2.2.3-7.centos4 gpm-1.20.1-71.RHEL4 jwhois-3.2.2-6.EL4.1 libgssapi-0.8-1 libtiff-3.6.1-12 make-3.80-6.EL4 mgetty-1.1.31-2 mtools-3.9.9-9 nss_db-2.2-29 pdksh-5.2.14-30.3 pyOpenSSL-0.6-1.p23 python-urlgrabber-2.9.8-2 jpackage-utils-1.7.3-1jpp.1.el4 rpm-python-4.3.3-22_nonptl sqlite-3.3.6-2 sysreport-1.3.15-8 guile-1.6.4-14 ibutils-1.0-4 wpa_supplicant-0.4.9-1.1.el4 xmlsec1-openssl-1.2.6-3 pam_krb5-2.1.8-1 ipsec-tools-0.3.3-6.rhel4.1 kernel-utils-2.4-13.1.99 openssh-3.9p1-8.RHEL4.20 portmap-4.0-63 mdadm-1.12.0-2 libpcap-0.8.3-10.RHEL4 tcpdump-3.8.2-10.RHEL4 xinetd-2.3.13-4.4E.1 redhat-lsb-3.0-8.EL apr-util-0.9.4-21 compat-libstdc++-33-3.2.3-47.3 cpp-3.4.6-8 glibc-headers-2.3.4-2.36 gcc-3.4.6-8 automake-1.9.2-3 bison-1.875c-2 krb5-libs-1.3.4-49 file-4.10-3.0.2.el4 pcre-4.5-4.el4_5.4 freetype-2.1.9-6.el4 libpng-1.2.7-3.el4_5.1 cups-1.1.22-0.rc1.9.20.2.el4_5.2 up2date-4.5.5-6.el4.centos cyrus-sasl-plain-2.1.19-14 net-snmp-libs-5.1.2-11.EL4.10.0.1 httpd-suexec-2.0.52-32.3.ent.centos4 tar-1.14-12.5.1.RHEL4 vixie-cron-4.1-47.EL4 nfs-utils-lib-1.0.6-8.z1 xorg-x11-Mesa-libGL-6.8.2-1.EL.31 -------------- output of rpm -q all ---------------
Konfiguration des Netzwerks
Um ein Netzwerkinterface sowie den Hostnamen des Servers zu manipulieren muessen folgende Files modifiziert werden:
# vi /etc/hosts # vi /etc/sysconfig/network-scripts/ifcfg-eth0 # vi /etc/resolv.conf # vi /etc/sysconfig/network
NOTE
Wenn die IP geaendert wird muss das nachfolgende File ebenfalls betreffend Position "ListenAddress" geandert werden sowie der sshd Deamon muss neu gestartet werden.
# vi /etc/ssh/sshd_config # /etc/init.d/sshd stop # /etc/init.d/sshd start
Nachfolgend eine Detailierte Erklaerung fuer die zu manipulierenden Files:
# vi /etc/sysconfig/network-scripts/ifcfg-eth0 --------------- /etc/sysconfig/network-scripts/ifcfg-eth0 --------------- DEVICE=eth0 BOOTPROTO=static BROADCAST=192.168.101.255 HWADDR=00:0C:29:F3:16:68 IPADDR=192.168.101.34 NETMASK=255.255.255.0 NETWORK=192.168.101.0 ONBOOT=yes TYPE=Ethernet USERCTL=no --------------- /etc/sysconfig/network-scripts/ifcfg-eth0 --------------- # chown root:root /etc/sysconfig/network-scripts/ifcfg-eth0 # chmod 644 /etc/sysconfig/network-scripts/ifcfg-eth0
Die Eintraege bedeuten folgendes: DEVICE= Gibt den Device Namen an dh. eth0 BOOTPROTO= Gibt die Art der Konfiguration der Ip an dh. static, dhcp, bootp none BROADCAST= Die Broadcast Adresse der konfigurierten IP Adresse IPADDR= Die zu konfigurierende IP Adresse NETMASK= Die Netmask Adresse der konfigurierten IP Adresse NETWORK= Die Netzwerk Adresse der konfigurierten IP Adresse ONBOOT= Gib an ob nach einem Neustart das Interface zur Verfuegung steht dh. yes fuer ja und no fuer nein USERCTL= Gibt an ob nur User "root" das Interface konfigurieren darf dh. no fuer "nur" User "root" kann das Interface konfigurieren oder yes fuer "alle" duerfen das Interface konfigurieren. HWADDR= Die zum Interface gehoerende MAC Adresse TYPE= Gibt den Typ des Interfaces an dh. zB Ethernet
NOTE Um ein virtuelles Interface zu konfigurieren benuetze als Interface Namen eth0:1.
Nun koennen wir das Interface stoppen und wieder starten dh.:
# ifconfig eth0 down # ifconfig eth0 up
Es kann mit folgenden Befehl kontrolliert werden ob die Konfiguration erfolgreich war:
# ifconfig eth0
Weiter werden wir nun die DNS Server konfigurieren. Fuer diese Aufgabe ist das File "/etc/resolv.conf" zustaendig das per Standard "nicht" besteht dh. wir muessen dieses zuerst erstellen mit folgenden Eintraegen:
# vi /etc/resolv.conf --------------- /etc/resolv.conf --------------- domain mydomain.ch search dns1.mydomain.ch dns2.mydomain.ch mydomain.ch nameserver 192.168.100.125 nameserver 192.168.100.194 nameserver 127.0.0.1 --------------- /etc/resolv.conf --------------- # chown root:root /etc/resolv.conf # chmod 644 /etc/resolv.conf
DNS Server werden im File "/etc/resolv.conf" indem Sinne bgearbeitet wie diese aufgelistet sind dh. in unserem Beispiel dns1.mydomain.ch danach dns2.mydomain.ch usw. Im File "/etc/host.conf" wird konfiguriert wie die "Namensaufloesung" funktionieren soll dh. Files vor DNs usw. In unserem Fall und als Standard kann folgendes konfiguriert werden:
# vi /etc/host.conf --------------- /etc/host.conf --------------- # Lookup names via /etc/hosts first then fall back to DNS resolver. order hosts,bind # We have machines with multiple addresses. multi off --------------- /etc/host.conf --------------- # chown root:root /etc/host.conf # chmod 644 /etc/host.conf
Wenn auf einem Server virtuelle Interfaces konfiguriert sind oder wenn mehrere Interfaces selber konfiguriert sind muss im File "/etc/host.conf" dies mit "multi on" angegeben werden damit das OS weiss, dass ein "multihoming" konfiguriert ist. Als naechstes wird ein Gateway konfiguriert dh. fuer diese Funktion ist das File "/etc/sysconfig/network" zustaendig:
# vi /etc/sysconfig/network --------------- /etc/sysconfig/network --------------- NETWORKING=yes HOSTNAME=syrus GATEWAY=192.168.101.120 GATEWAYDEV=eth0 --------------- /etc/sysconfig/network --------------- # chown root:root /etc/sysconfig/network # chmod 644 /etc/sysconfig/network
Die Eintrage von "/etc/sysconfig/network" haben folgende Bedeutung: NETWORKING= Gibt an ob ein Netzwerk konfiguriert is dh. "yes" fuer mit Netzwerk und no fuer "ohne" Netzwerk HOSTNAME= Gibt den Hostnamen des Servers an GATEWAY= Gibt die IP des Gateway an GATEWAYDEV= Gibt das Interface an ueber welches das Gateway erreicht werden soll
Nun kommen wir zum "host" Eintrag. Fuer diesen Eintrag ist "/etc/hosts" zustaendig:
# vi /etc/hosts --------------- /etc/hosts --------------- # Do not remove the following line, or various programs # that require network funcitonality will fail. 127.0.0.1 localhost.localdomain localhost 192.168.101.34 syrus.mydomain.ch syrus 192.168.101.35 wsmob08.mydomain.ch wsmob08 --------------- /etc/hosts --------------- # chown root:root /etc/hosts # chmod 644 /etc/hosts
Es ist zu empfehlen den Client in das File "/etc/hosts" einzutragen, denn bei Verbindungen mit SSH oder FTP versucht der Server den Client mit dem Namen aufzuloesen und wenn dieser im DNS nicht eingetragen ist kann der Verbindungs- aufbau einige Zeit dauern. Wenn ein Linux system als Gateway, VPN, Proxy oder PPP eingesetzt wird so sollte IPv4 forwarding eingeschaltet werden. Dies wird mit folgenden Eintrag bewerkstelligt:
# vi /etc/sysctl.conf --------------- /etc/sysctl.conf --------------- # Kernel sysctl configuration file for Red Hat Linux # # For binary values, 0 is disabled, 1 is enabled. See sysctl(8) and # sysctl.conf(5) for more details. # Controls IP packet forwarding net.ipv4.ip_forward = 0 # Controls source route verification net.ipv4.conf.default.rp_filter = 1 # Do not accept source routing net.ipv4.conf.default.accept_source_route = 0 # Controls the System Request debugging functionality of the kernel kernel.sysrq = 0 # Controls whether core dumps will append the PID to the core filename. # Useful for debugging multi-threaded applications. kernel.core_uses_pid = 1 # Decrease the time default value for tcp_fin_timeout connection net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 1800 # Turn off the tcp_window_scaling support net.ipv4.tcp_window_scaling = 0 # Turn off the tcp_sack support net.ipv4.tcp_sack = 0 # Turn off the tcp_timestamps support net.ipv4.tcp_timestamps = 0 # Disable ignoring ping request net.ipv4.icmp_echo_ignore_all = 0 # Disable ignoring broadcasts request net.ipv4.icmp_echo_ignore_broadcasts = 0 # Disable IP source routing net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.lo.accept_source_route = 0 net.ipv4.conf.eth0.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0 # TCP SYN Cookie Protection sysctl -w net.ipv4.tcp_syncookies=1 # Disable ICMP Redirect Acceptance net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.lo.accept_redirects = 0 net.ipv4.conf.eth0.accept_redirects = 0 net.ipv4.conf.eth1.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 # Enable Bad error message Protection net.ipv4.icmp_ignore_bogus_error_responses = 1 # Enable Log Spoofed Packets, Source Routed Packets, Redirect Packets net.ipv4.conf.all.log_martians = 1 net.ipv4.conf.lo.log_martians = 1 net.ipv4.conf.eth0.log_martians = 1 net.ipv4.conf.eth1.log_martians = 1 net.ipv4.conf.default.log_martians = 1 # Allowed local port range net.ipv4.ip_local_port_range = 16384 65536 #net.ipv4.ip_local_port_range = 1024 32768 # Increase the maximum memory used to reassemble IP fragments net.ipv4.ipfrag_high_thresh = 512000 net.ipv4.ipfrag_low_thresh = 446464 --------------- /etc/sysctl.conf --------------- # chown root:root /etc/sysctl.conf # chmod 644 /etc/sysctl.conf
Nach den Netzwerk Modifikationen sollte das Netzwerk neue gestartet werden dh. benuetze folgenden Befehl dazu:
# /etc/rc.d/init.d/network stop # /etc/rc.d/init.d/network start # /etc/rc.d/init.d/network status
Je nach Konfiguration oder Situation kann das Netzwerk nicht gestoppt werden dh. es kann auch ein Neustart ausgefuehrt werden:
# /etc/rc.d/init.d/network restart
Um die Netzwerkkonfiguration zu ueberpruefen kann folgendes ausgefuehrt werden:
# ping localhost # ping [hostname] # netstat -vat # hostname
Shell einrichten und Modifizieren
Die Shell dh. "bash" wurde durch die Installation bereits eingerichtet. Die Shell Konfiguration nimmt als Referenz die zur Verfuegung stehenden Files in "/etc/skell" dh. wird ein neuer "user" eingerichtet werden diese Files als Referenz zur Einrichtung der Shell herangezogen. Wir werden in den naechsten Schritten die Files in "/etc/skell" so modifizieren das diese unseren Gegebenheiten entsprechen:
# vi /etc/skel/.bashrc --------------- /etc/skel/.bashrc --------------- # .bashrc # User specific aliases and functions alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi --------------- /etc/skel/.bashrc ---------------
# vi /etc/skel/.bash_profile --------------- /etc/skel/.bash_profile --------------- # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # user specific environment and startup programs HISTSIZE=1000 TMOUT=7200 PATH=$PATH:$HOME/bin BASH_ENV=$HOME/.bashrc USERNAME="root" export USERNAME BASH_ENV PATH --------------- /etc/skel/.bash_profile ---------------
Der Eintrag "HISTSIZE" bedeutet nichts anderes als das jedes Kommando als "history" gespeichert wird im File "bash_history" und das dieses "500" Eintraege enthalten kann. Wird die Angabe "0" angegeben so wird beim Logout dieses File jedesmal zurueckgesetzt.
Der Eintrag "TMOUT" bedeutet das ein Timout aktiv wird nach dem angegebenen Wert und die Session fuer den User automatisch beendet wird. In unserem Fall ist der angegeben Wert "7200" was einer Stunde entspricht.
Moechte man diese beiden Konfigurationen "Global" setzen so kann das File "/etc/profile" modifiziert werden und somit gilt das fuer jeden User auf dem System:
# vi /etc/profile --------------- /etc/profile--------------- HISTSIZE=1000 TMOUT=7200 --------------- /etc/profile---------------
# vi /etc/skel/.bash_logout --------------- /etc/skel/.bash_logout --------------- # ~/.bash_logout clear --------------- /etc/skel/.bash_logout ---------------
Nun werden wir noch die Rechte des Home Verzeichnis des Users "root" anpassen sowie dessen Files:
# chown root:root /root # chmod 700 /root # chown root:root /root/.* # chmod 600 /root/.bashrc /root/.bash_profile /root/.bash_logout
Einen neuen User sysop erfassen
Nun wir werden einen neuen User erfassen mit dem Namen "sysop". Das Home- verzeichnis dieses Users legen wir im Verzeichnis "/export/sysop" an. Um dies zu bewerkstelligen muss das Verzeichnis "/export" bestehen denn beim anlegen des Users anhand des Kommandos "useradd" wird kontrolliert ob das Verzeichnis "/export" besteht. Ist dies der Fall wird das darinliegende Homeverzeichnis von "sysop" angelegt und die Standard "shell" Files von "/etc/skel/.bash*" hineinkopiert. Also als erstes legen wir das Verzeichnis "/export" an, erstellen die Gruppe zum User "sysop" und danach koennen wir den User erstellen:
# mkdir /export # chown root:root /export # chmod 755 /export # groupadd -g 200 sysop
Kontrolliere die Erstellung der Gruppe "sysop" und fuege bereits den "noch" nicht bestehende User "sysop" hinzu:
# cat /etc/group | grep sysop --------------- /etc/group --------------- sysop:x:200:sysop --------------- /etc/group ---------------
# useradd -u 200 -g 200 -d /export/sysop -s /bin/bash -c SysOperator sysop
Auch hier kontrolliere die Erstellung des Users "sysop":
# cat /etc/passwd | grep sysop --------------- /etc/passwd --------------- sysop:x:200:200:SysOperator:/export/sysop:/bin/bash --------------- /etc/passwd ---------------
Kontrolliere die Rechte des neu erstellten Homeverzeichnis von User "sysop" und passe gegebenfalls diese an sowie kontrolliere die "shell" Files:
# chown sysop:sysop /export/sysop # chmod 700 /export/sysop # chown root:sysop /export/sysop/.bash* # chmod 640 /export/sysop/.bash*
# vi /export/sysop/.bash_profile --------------- /export/sysop/.bash_profile --------------- # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # user specific environment and startup programs HISTSIZE=1000 TMOUT=7200 PATH=$PATH:$HOME/bin BASH_ENV=$HOME/.bashrc USERNAME="sysop" export USERNAME BASH_ENV PATH --------------- /export/sysop/.bash_profile ---------------
Alles getan vergesse jedoch nicht ein Passwort zu vergeben:
# passwd sysop Changing password for user sysop. new UNIX password: Retype new UNIX password: passwd: all authentication tokens updated successfully.
Modifikaton /etc/passwd, /etc/shadow, /etc/group
Als erstes werden wir die ueberfluessigen User entfernen:
# userdel adm # userdel lp * # userdel shutdown # userdel halt # userdel news # userdel uucp # userdel operator # userdel games # userdel gopher # userdel sshd * # userdel rpc # userdel ftp # userdel dbus # userdel haldaemon # userdel netdump
Nachdem entfernen der User gibt sich folgende Situation:
# cat /etc/passwd --------------- /etc/passwd --------------- root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync mail:x:8:12:mail:/var/spool/mail:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin nscd:x:28:28:NSCD Daemon:/:/sbin/nologin ntp:x:38:38::/etc/ntp:/sbin/nologin rpm:x:37:37::/var/lib/rpm:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin pcap:x:77:77::/var/arpwatch:/sbin/nologin mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin sysop:x:200:200:SysOperator:/export/sysop:/bin/bash --------------- /etc/passwd ---------------
Weiter entfernen wir die ueberfluessigen Gruppen:
# groupdel adm # groupdel lp * # groupdel news # groupdel uucp # groupdel games # groupdel dip # groupdel man
Nachdem entfernen der Gruppen ergiebt sich folgende Situation:
# cat /etc/group --------------- /etc/group --------------- root:x:0:root bin:x:1:root,bin,daemon daemon:x:2:root,bin,daemon sys:x:3:root,bin tty:x:5: disk:x:6:root lp:x:7:daemon,lp mem:x:8: kmem:x:9:ingres wheel:x:10:root mail:x:12:mail games:x:20: ftp:x:50: lock:x:54: nobody:x:99: users:x:100: floppy:x:19: vcsa:x:69: utmp:x:22: nscd:x:28: sshd:x:74: rpc:x:32: pcap:x:77: mailnull:x:47: smmsp:x:51: sysop:x:200:sysop --------------- /etc/group ---------------
Das Passwort unter Linux hat eine minimum Laenge von 5 Zeichen. Dies sollte erhoeht werden auf minimum 8. Um das zu bewerkstelligen gehe folgendermassen vor:
# vi /etc/pam.d/passwd --------------- /etc/pam.d/passwd --------------- #%PAM-1.0 auth required pam_stack.so service=system-auth account required pam_stack.so service=system-auth #password required pam_stack.so service=system-auth password required pam_cracklib.so retry=3 minlen=8 password sufficient pam_unix.so nullok use_authtok md5 shadow password required pam_deny.so --------------- /etc/pam.d/passwd ---------------
# vi /etc/pam.d/system-auth --------------- /etc/pam.d/system-auth --------------- #%PAM-1.0 # This file is auto-generated. # User changes will be destroyed the next time authconfig is run. auth required /lib/security/$ISA/pam_env.so auth sufficient /lib/security/$ISA/pam_unix.so likeauth nullok auth required /lib/security/$ISA/pam_deny.so account required /lib/security/$ISA/pam_unix.so #account sufficient /lib/security/$ISA/pam_succeed_if.so uid < 100 quiet account required /lib/security/$ISA/pam_permit.so password requisite /lib/security/$ISA/pam_cracklib.so retry=3 #password sufficient /lib/security/$ISA/pam_unix.so nullok use_authtok md5 shadow password required /lib/security/$ISA/pam_deny.so session required /lib/security/$ISA/pam_limits.so session required /lib/security/$ISA/pam_unix.so --------------- /etc/pam.d/system-auth ---------------
NOTE
Die Zeile "pam_succeed_if.so" sollte auskommentiert werden wenn nicht mit "NIS oder LDAP" gearbeitet wird ansonsten kommt es zu einer Fehlermeldung beim einloggen von SSH:
pam_succeed_if: requirement "uid < 100" not met by user "sysop"
Allgemeine Modifikationen am Betriebssystem
Wenn ein Linux in Single User mode gestartet oder wechselt wird per Standard kein Passwort abgefragt. Dies ist zu verhindern. Deshalb fuehre folgende Modifikation durch:
# vi /etc/inittab --------------- /etc/pam.d/system-auth --------------- id:3:initdefault: ~~:S:wait:/sbin/sulogin --------------- /etc/pam.d/system-auth ---------------
Diese Modifikation erzwingt das Passwort von User "root"! Um dies zu testen pruefe den Single User mode:
# init 1
Die verschiedenen Deklarierten Service dh. TCP/IP Port xy werden im folgenden File aufgefuehrt dh. durch dieses File werden Server und Client Programme/Services mit Namen aufgeloest:
# cat /etc/services
Das File "/etc/securetty" erlaubt die Spezifizierung welche Console dh. "TTY" und "VC" (Virtual console) der User "root" benutzen darf reps. einloggen darf. Dieses File "/etc/securetty" wird durch das Login Programm "/bin/login" ausgelesen.
# vi /etc/securetty --------------- /etc/securetty --------------- console ttyS0 ttyS1 vc/1 #vc/2 #vc/3 #vc/4 #vc/5 #vc/6 #vc/7 #vc/8 #vc/9 #vc/10 #vc/11 tty1 #tty2 #tty3 #tty4 #tty5 #tty6 #tty7 #tty8 #tty9 #tty10 #tty11 --------------- /etc/securetty ---------------
dieses mit einem sogenannten "immutable" bit versehen werden. Wenn dies geschieht ist das File nicht veränderbar und das bit muss zuerst wieder aufgehoben werden damit das File verändert werden kann. Das dazugehoerige Kommando muss folgendermassen ausgefuehrt werden:
# chattr +i [file] # chattr -i [file]
Auf der Console kann ein Linux Server mit "Ctrl-Alt-Delete" heruntergefahren werden. Dies muss unter allen Umstaenden verhindert werden. Um diese Modifikation durchzufuehren kommentiere folgende Zeile aus:
# vi /etc/inittab --------------- /etc/inittab --------------- # Trap CTRL-ALT-DELETE #ca::ctrlaltdel:/sbin/shutdown -t3 -r now --------------- /etc/inittab ---------------
Aktivierung des Serial Ports fuer Logins
Es ist sinnvoll Linux so zu konfigurieren das dieses ueber den Serial Port Administriert werden kann sowie ueber den Serial Port den Boot-Vorgang mit- verfolgt werden kann. Dies insofern das nach dieser Modifikation kein Keyboard noch Monitor benoetigt wird um den Server zu administrieren. Als erstes muss ueberprueft werden ob Linux den Serial Ports des Servers erkannt hat:
# dmesg | grep tty --------------- output of dmesg --------------- ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A --------------- output of dmesg ---------------
# setserial -g /dev/ttyS[01] --------------- output of dmesg --------------- /dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4 /dev/ttyS1, UART: 16550A, Port: 0x02f8, IRQ: 3 --------------- output of dmesg ---------------
In diesem Beispiel wurden zwei Serial Ports erkannt dh. COM1 und COM2! Als naechstes muss "agetty" so konfiguriert werden das dieses Programm auf die Serial Ports hoert. In diesem Beispiel benutzen wir "agetty" und nicht "mgetty":
# cp /etc/inittab /etc/inittab.org
# vi /etc/inittab --------------- output of dmesg --------------- # Run gettys in standard runlevels 1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6 # Run agetty on COM1/ttyS0 and COM2/ttyS1 s0:2345:respawn:/sbin/agetty -L -f /etc/issueserial 9600 ttyS0 vt100 s1:2345:respawn:/sbin/agetty -L -f /etc/issueserial 9600 ttyS1 vt100 #s1:2345:respawn:/sbin/agetty -L -i 38400 ttyS1 vt100 --------------- output of dmesg ---------------
Nun lege ein neues File an indem einige "escape" sequenzen" konfiguriert sind (siehe agetty manpage). Unsere Modifikationen geben Informationen aus wie Serial Port Nummer und Geschwindigkeit:
# vi /etc/issueserial --------------- /etc/issueserial --------------- Hostname Connected on \l at \b bps \U --------------- /etc/issueserial --------------- # chown root:root /etc/issueserial # chmod 644 /etc/issueserial
Um die Modifikationen zu aktivieren fuehre folgendes aus:
# init q
Danach kontrolliere ob die Modifikationen erfolgreich waren:
# ps -ef | grep agetty
ttyS0 00:00:00 /sbin/agetty -L -f /etc/issueserial 9600 ttyS0 vt100 ttyS1 00:00:00 /sbin/agetty -L -f /etc/issueserial 9600 ttyS1 vt100
Teste nun den Zugriff des Serial Ports mit folgenden Einstellungen:
9600, N, 8, 1 VT100 flow control off
Damit mit User "root" ueber den Serial Port eingeloggt werden kann sind die Eintreage im File "/etc/securetty" zustaendig dh. folgende Eintraege muessen bestehen:
# vi /etc/securetty --------------- /etc/securetty --------------- ttyS0 ttyS1 --------------- /etc/securetty ---------------
Nun es ist zwar jetzt moeglich ueber den Serial Port eine Verbindung anhand eines Users oder User "root" zu erstellen jedoch beim "Bootvorgang" werden die Informationen nicht auf den Serial Port ausgegeben. Wir muessen eine Modifikation durchfuehren damit die Consolen Ausgabe auf den Serial Port ausgegebe werden:
# vi /etc/grub.conf --------------- /etc/securetty --------------- # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You do not have a /boot partition. This means that # all kernel and initrd paths are relative to /, eg. # root (hd0,0) # kernel /boot/vmlinuz-version ro root=/dev/hda1 # initrd /boot/initrd-version.img #boot=/dev/hda default=0 timeout=10 splashimage=(hd0,0)/boot/grub/splash.xpm.gz title RED HAT Core (2.6.5-1.358) root (hd0,0) kernel /boot/vmlinuz-2.6.5-1.358 ro root=LABEL=/ console=ttyS0,9600 initrd /boot/initrd-2.6.5-1.358.img --------------- /etc/securetty ---------------
NOTE
Der relevante Eintrag ist "console=ttyS1,38400". Fehlmanipulationen an diesem File fuehren dazu das Linux nicht mehr gestartet werden kann!
Fuehre nun einen Neustart durch waerend man eine Verbindung mit dem Serial Port besteht. Weitere Informationen betreffend Serial Port Konfiguration findet man auf:
http://www.znark.com/tech/serialconsole.html http://www.vanemery.com/Linux/Serial/serial-console.html
Aktivierung und Konfiguration von OpenSSH
Um noch eine hoehere Sicherheit zu gewaehrleisten muessen wir verhindern das der User "Root" sich direkt einloggen kann und das nur normale User per SSH 2 Protokoll einloggen koennen. Um direkte "Root" Logins zu verhindern oeffne das File "/etc/ssh/sshd2_config" und setze die Zeile "PermitRootLogin" auf "no":
# vi /etc/ssh/sshd_config ---------- /etc/ssh/sshd_config ---------- Port 22 Protocol 2 ListenAddress 192.168.1.34 SyslogFacility AUTHPRIV PermitRootLogin no StrictModes yes RhostsAuthentication no IgnoreRhosts yes RhostsRSAAuthentication no PasswordAuthentication yes PermitEmptyPasswords no KerberosAuthentication no GSSAPIAuthentication yes GSSAPICleanupCredentials yes UsePAM yes #X11Forwarding yes Subsystem sftp /usr/libexec/openssh/sftp-server ---------- /etc/ssh/sshd_config ----------
Im naechsten Schritt schalten wir gewisse Authentifizierungen aus sowie erlauben nur SSH Protokoll 2:
# vi /etc/ssh/ssh_config ---------- /etc/ssh/ssh_config ---------- RhostsAuthentication no RhostsRSAAuthentication no PasswordAuthentication yes Port 22 Protocol 2 Host * # ForwardX11 yes ---------- /etc/ssh/ssh_config ----------
OpenSSH wird ueber ein Script in "/etc/init.d/sshd" gestartet dh.:
# /etc/init.d/sshd stop # /etc/init.d/sshd start # /etc/init.d/sshd restart
Konfiguration von cron & crontab
Cron durchsucht das Verzeichns "/var/spool/cron" nach crontab files die Namen tragen nach den erfassten user in "/etc/passwd" dh. zB "root".
Ebenfalls wird das Verzeichns "/etc/cron.d/" durchsucht was wiederum Files enthaelt die anderst aufgebaut sind (crontab). Diese Files werden indem Sinne abgearbeitet, dass Cron jede Minute ueberprueft ob irgendwelche crontabs abgearbeitet werden muessen (/etc/cron.d oder crontabs). Die Besonderheit ist, dass wenn ein Eintrag abgearbeitet werden muss, wird der "output" an den Besitzer (User) des crontab Eintrages gemailt oder an den User der in der Variable MAILTO definiert ist per mail zugestellt.
Bei der Ueberpruefung schaut Cron in das File /"etc/crontab" und erkennt Aenderungen an diesem File. Sind solche Aenderungen vorhanden, laedt Cron das File anhand der Funktion "modtime" neu dh. Aenderungen in "/etc/crontab" beduerfen keines Neustarts von Cron. Die oben beschriebene Funktionen werden durch zwei rpm Packages gewaehrleistet dh:
vixie-cron-3.0.1-87.i386.rpm crontabs-1.10-6.i386.rpm
Durch diese zwei rpm Packages werden folgende Konfig Files angelegt:
/etc/cron.d/ /etc/cron.daily/ /etc/cron.hourly /etc/cron.weekly
/etc/crontab
/var/spool/cron
/etc/init.d/crond
NOTE
Beim entfernen dieser Packages werden alle Verzeichnisse entfernt mit Ausnahme von "/etc/cron.daily/". In diesem Verzeichnis befindet sich das "rpm" und "logrotate" script.
Um einen "cron-job" zu erstellen geben wir in folgenden Files zuerst an wer solche "cron-job's" ausfuehren darf:
# vi /etc/cron.allow ---------- /etc/cron.allow ---------- root ---------- /etc/cron.allow ---------- # vi /etc/cron.deny ---------- /etc/cron.deny ---------- bin daemon sync mail nobody rpm vcsa pcap mailnull smmsp sysop ---------- /etc/cron.deny ---------- # chown root:root /etc/cron.deny /etc/cron.allow # chmod 640 /etc/cron.deny /etc/cron.allow
Als naechstes erstellen wir den "cron-job" effektiv dh. dabei ist zu beruecksichtigen, dass das Format betreffend Ausfuehrung resp. Minuten, Stunden etc. ein bestimmtes Format aufweisen muss:
* * * * * [Path to script or command]
* Minuten (0-59) * Stunden (0-23) * TagDesMonats (1-31) * Monat des Jahres (1-12) * TagDerWoche (0-6 with 0=Sunday)
Um nun den "cron-job" zu erstellen sind zwei verschiedenen Wege moeglich. Der eine Weg ist ueber das Kommando "crontab -e" und der andere ist das File direkt zu manipulieren oder zu erstellen:
# crontab -e ---------- crontab ---------- 30 * * * * /usr/bin/pkill -HUP init ---------- crontab ----------
Dieses Kommando oeffnet den Editor fuer Cron dh. beim Abspeichern wird die Syntax ueberprueft und sofern nicht richtig das Abspeichern verhindert. Nach erfolgreichen Abspeichern wird ein File mit dem Namen des Users der diesen Eintrag erstellt hat in "/var/spool/cron" abgelegt. In unserem Fall haben wir den Eintrag als User "root" erstellt und deshalb wird das File "/var/spool/cron/root". Es ist unnoetig den Cron Deamon neu zu starten denn dies wird durch die Funktion "modtime" uebernommen.
Nach der Modifikation und nach dem Abspeichern sieht das File das durch "crontab" erstellt wurde folgendermassen aus:
# cat /var/spool/cron/root ---------- /var/spool/cron/root ---------- # DO NOT EDIT THIS FILE - edit the master and reinstall. # (tmp/crontab.1319 installed on Mon Dec 20. 14:39:59 2004) # (Cron version -- $ld: crontab.c,v 2.19 1994/01/17 03:20:37 30 * * * * /usr/bin/pkill -HUP init ---------- /var/spool/cron/root ----------
Die zweite Moeglichkeit ist das File "/var/spool/cron/root" selber zu erstellen und die Modifikation direkt im File durchzufuehren. Dabei muessen zwei Dinge beachtet werden dh. erstens sollte entweder die manuelle Bearbeitung gewaehlt werden oder die mit "crontab -e" jedoch mische "nie" die beiden Varianten. Bei den manuellen Variante muss der Deamon "crond" neu gestartet werden. Nun bleibt noch das File "/etc/crontab" dh. dieses File beinhaltet die Ausfuehrung der verschiedenen Verzeichnisse dh. "cron.hourly", "cron.daily" etc.
# vi /etc/crontab --------------- /etc/crontab --------------- SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # run-parts 01 * * * * root run-parts /etc/cron.hourly 02 4 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly --------------- /etc/crontab ---------------
Wenn das File "/etc/crontab" modifiziert wird muss der Deamon nicht neu gestartet werden da dieses File wiederum durch die Funktion "modtime" abgearbeitet wird.
Konfiguration von logrotate
Logrotate ist eine Funktion um logs von verschiedenen Programmen zu archivieren und zu kompremieren. Fuer diese Funktion ist das folgende rpm Packages zustaendig:
logrotate-3.7-4.1.i386.rpm
Bei der Installation des rpm Packages werden folgende Konfig Files erstellt:
/etc/cron.daily/logrotate /etc/logrotate.conf
Um nun ein Logrotate einzurichten benuetzen wir ein bereits installiertes und vorbereitetes script sprich:
# vi /etc/logrotate.conf --------------- /etc/logrotate.conf --------------- # see "man logrotate" for details # rotate log files weekly weekly # keep 5 weeks worth of backlogs rotate 5 # create new empty log files after rotating old ones create # uncomment this if you want your log files compressed compress # RPM packages drop log rotation information into this directory include /etc/logrotate.d # no packages own wtmp -- we'll rotate them here /oar/log/wtmp { monthly create 0664 root utmp rotate 1 } # system-specific logs may be also be configured here. /var/log/messages { rotate 5 weekly sharedscripts postrotate nomail /sbin/killall -HUP syslogd endscript } --------------- /etc/logrotate.conf ---------------
Dieses Script wird aufgerufen durch das Script im Verzeichnis "/etc/cron.daily/" dh. "logrotate". Wenn ein Script monatlich ausgefuehrt werden soll so erstelle dieses im Verzeichnis "/etc/cron.monthly". Das die Verzeichnisse durch den Cron Deamon abgearbeitet werden ist "/etc/crontab" zustaendig dh. die Eintraege betreffend der zu ausfuehrenden Verzeichnissen sind in diesem File "/etc/crontab" enthalten.
Ueberpruefen von mdstat oder RAID Status
Um den Status eines RAID's zu ueberpruefen kann manuell in das File "/proc/mdstat" hineingeschaut werden zB:
# cat /proc/mdstat --------------- output mdstat --------------- Personalities : [raid1] md2 : active raid1 sdb1[1] sda1[0] 5244928 blocks [2/2] [UU] md3 : active raid1 sdb2[1] sda2[0] 2096384 blocks [2/2] [UU] md1 : active raid1 sdb5[1] sda5[0] 235801856 blocks [2/2] [UU] md0 : active raid1 sdb3[1] sda3[0] 1052160 blocks [2/2] [UU] unused devices: <none> --------------- output mdstat ---------------
Um jedoch diese Ueberpruefung zu automatisieren erstellen wir ein kleines Script das wir alle 2 Stunden ausfuehren sowie wenn es zu einem crash kommt dieser per E-Mail gemeldet wird. Damit wir nicht sendmail installieren muessen installieren wir einen kleinen Mail-client:
# mkdir /root/smtp # cd /root/smtp # mv smtpclient-1.0.0.tar.gz /root/smtp # gzip -dc smtpclient-1.0.0.tar.gz | tar xvf -
# cd /root/smtp/smtpclient-1.0.0 # ./configure \ --prefix=/opt/smtpclient-1.0.0 \ --exec-prefix=/opt/smtpclient-1.0.0 \ --oldincludedir=/opt/smtpclient-1.0.0/usr/include
# make # make install
Um mehr ueber die Funktionen dieses Mail-Client zu erfahren fuehre folgendes aus:
/opt/smtpclient-1.0.0/bin/smtpclient --help
Nun erstellen wir das Script in einem seperaten Verzeichnis:
# mkdir /opt/scripts
# vi /opt/scripts/mdstat.sh --------------- /opt/scripts/mdstat.sh --------------- #!/bin/sh -x # search for bad disks in /proc/mdstat for PAT in _U U_ __; do if grep $PAT /proc/mdstat; then i=1; fi ; done # send mail if we found bad disk(s) if [ "$i" == "1" ]; then # metastat.sh found at least one crashed disk echo metastat.sh found at least one crashed disk! | /opt/smtpclient-1.0.0/bin/smtpclient -s 'One crashed disk found on host hostname' -f root@domain.ch -S mail.domain.ch webmaster@domain.ch support@domain.ch fi --------------- /opt/scripts/mdstat.sh --------------- # chown -R root:root /opt/scripts # chmod -R 700 /opt/scripts
Nun fehlt nur noch der "cron-job" damit das Script alle zwei Stunden zur vollen Stunde ausgefuehrt wird
# crontab -e --------------- crontab -e --------------- 0 0,2,4,6,8,10,12,14,16,18,20,22 * * * /opt/scripts/mdstat.sh --------------- crontab -e ---------------
Einrichten einer Time-Synchronisation NTP
Um mit NTP anhand eines externen Servers die Zeit zu synchronisieren braucht es folgende Konfiguration:
# rpm -ivh libcap-1.10-20.x86_64.rpm ntp-4.2.0.a.20040617-6.el4.x86_64.rpm
# vi /etc/ntp.conf --------------- /etc/ntp.conf --------------- # Prohibit general access to this service. restrict default ignore # Permit all access over the loopback interface. This could # be tightened as well, but to do so would effect some of # the administrative functions. restrict 127.0.0.1 # -- CLIENT NETWORK ------- # Permit systems on this network to synchronize with this # time service. Do not permit those systems to modify the # configuration of this service. Also, do not use those # systems as peers for synchronization. # restrict 192.168.1.0 mask 255.255.255.0 notrust nomodify notrap # --- OUR TIMESERVERS ----- # or remove the default restrict line # Permit time synchronization with our time source, but do not # permit the source to query or modify the service on this system. # restrict mytrustedtimeserverip mask 255.255.255.255 nomodify notrap noquery # server mytrustedtimeserverip server ntp.metas.ch # --- NTP MULTICASTCLIENT --- #multicastclient # listen on default 224.0.1.1 # restrict 224.0.1.1 mask 255.255.255.255 notrust nomodify notrap # restrict 192.168.1.0 mask 255.255.255.0 notrust nomodify notrap # --- GENERAL CONFIGURATION --- # # Undisciplined Local Clock. This is a fake driver intended for backup # and when no outside source of synchronized time is available. The # default stratum is usually 3, but in this case we elect to use stratum # 0. Since the server line does not have the prefer keyword, this driver # is never used for synchronization, unless no other other # synchronization source is available. In case the local host is # controlled by some external source, such as an external oscillator or # another protocol, the prefer keyword would cause the local host to # disregard all other synchronization sources, unless the kernel # modifications are in use and declare an unsynchronized condition. # server 127.127.1.0 # local clock fudge 127.127.1.0 stratum 10 # # Drift file. Put this in a directory which the daemon can write to. # No symbolic links allowed, either, since the daemon updates the file # by creating a temporary in the same directory and then rename()'ing # it to the file. # driftfile /var/lib/ntp/drift broadcastdelay 0.008 # # Authentication delay. If you use, or plan to use someday, the # authentication facility you should make the programs in the auth_stuff # directory and figure out what this number should be on your machine. # # authenticate yes # # Keys file. If you want to diddle your server at run time, make a # keys file (mode 600 for sure) and define the key number to be # used for making requests. # # PLEASE DO NOT USE THE DEFAULT VALUES HERE. Pick your own, or remote # systems might be able to reset your clock at will. Note also that # ntpd is started with a -A flag, disabling authentication, that # will have to be removed as well. # keys /etc/ntp/keys --------------- /etc/ntp.conf --------------- # /etc/init.d/ntp start
Erstellen eines Raid 0
Um ein Raid 0 (auch stripping genannt) zu erstellen muessen wir zuerst die Disk's identifizieren die involiviert sind. In unserem Fall waeren dies die folgenden:
/dev/sdd /dev/sde
Als erstes muessen die Disk's richtig partitioniert werden:
# fdisk /dev/sde --------------- output of fdisk --------------- The number of cylinders for this disk is set to 48642. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK) Command (m for help): t Selected partition 1 Hex code (type L to list codes): fd Changed system type of partition 1 to fd (Linux raid autodetect) Command (m for help): p Disk /dev/sde: 400.0 GB, 400099294720 bytes 255 heads, 63 sectors/track, 48642 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sde1 1 48642 390716833+ fd Linux raid autodetect Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. --------------- output of fdisk ---------------
Vergiss dies nicht fuer alle Disks durchzufuehren die in das Raid 0 eingebunden werden sollen. Die Konfiguration selber des Raid 0 befinden sich im File "/etc/raidtab". In diesem File fuehren wir nun die entsprechenden Modifikationen durch. Ist dieses File noch nicht vorhanden erstellen wir es neu:
# vi /etc/raidtab --------------- /etc/raidtab --------------- raiddev /dev/md4 raid-level 0 nr-raid-disks 2 persistent-superblock 0 nr-spare-disks 0 chunk-size 32 device /dev/sdd1 raid-disk 0 device /dev/sde1 raid-disk 1 --------------- /etc/raidtab ---------------
In diesem Beispiel wird das Raid 0 den Namen /dev/md4 tragen oder sich als dieses Device darstellen. Als naechstes erstellen wir das Raid 0 mit folgenden Befehl:
# mkraid /dev/md4 handling MD device /dev/md4 analyzing super-block
Ob dies durchgefuehrt wurde kann mit folgenden Befehl kontrolliert werden:
# cat /proc/mdstat Personalities : [raid0] [raid1] md4 : active raid0 sde1[1] sdd1[0] 781433664 blocks 32k chunks
Das Raid 0 wurde angelegt nun kann das Filesystem darauf installiert resp. generiert werden:
# mke2fs -j -b 4096 -R stride=8 /dev/md4 mke2fs 1.35 (28-Feb-2004) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) 97681408 inodes, 195358416 blocks 9767920 blocks (5.00%) reserved for the super user First data block=0 5962 block groups 32768 blocks per group, 32768 fragments per group 16384 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 102400000 Writing inode tables: done Creating journal (8192 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 35 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.
Das Filesystem steht nun muss noch ein Mount Point erstellt werden und damit dieser automatisch gemountet wird bei einem Systemstart erstellen wir einenEintrag in "/etc/fstab":
# vi /etc/fstab --------------- /etc/fstab --------------- /dev/md4 /mnt/mountpoint ext3 defaults 1 2 --------------- /etc/fstab ---------------
Erstelle nun den Mount Point und mounte diesen:
# mkdir /mnt/mountpoint # mount /mnt/mountpoint
Fuehre nochmals eine Kontrolle durch ob das Raid 0 steht und arbeitet:
# cat /proc/mdstat Personalities : [raid0] [raid1] md4 : active raid0 sde1[1] sdd1[0] 781433664 blocks 32k chunks
Disk-Replacement fuer Raid1
Wenn ein Raid aufgesetzt wurde (Mirror) und eine Disk oder Partition crashed muss die betreffende Disk event. ersetzt werden. Um dies zu bewerkstelligen gehe folgendermasse vor: Zuerst ueberpruefe den Status der Disk'/Mirror's:
# cat /proc/mdstat ---------------- output ---------------- Personalities : [raid0] [raid1] md1 : active raid1 sdc2[1] sda2[0] 2096384 blocks [2/2] [UU] md3 : active raid1 sdc3[1] sda3[0] 1052160 blocks [2/2] [UU] md2 : active raid1 sdc5[2](F) sda5[0] 147894272 blocks [2/1] [U_] md0 : active raid1 sdc1[1] sda1[0] 5245120 blocks [2/2] [UU] ---------------- output ----------------
Analysiere zuerst die Situation und verschaffe dir einen Ueberblick dh. in unserem Beispiel ist der Mirror von "md2" nicht mehr in Ordnung dh. Disk/Partition "sdc5" ist mit "(F) markiert sprich dies bedeutet "faulty". Nun alle anderen Mirror's laufen aktiv auf "sdcx" sprich man kann die Disk "sdc" nicht einfach entfernen!
Als erstes produzieren wir einen Failover auf allen Partitionen auf die Disk "sda". Um das zu bewerkstelligen muessen alle "sdcx" Partitionen als "fault" gekennzeichnet werden:
# mdadm --manage --fail /dev/md1 /dev/sdc2 # mdadm --manage --fail /dev/md3 /dev/sdc3 # mdadm --manage --fail /dev/md0 /dev/sdc1
Nun koennen wir die Partitionen aus dem Mirror nehmen:
# mdadm --manage -r /dev/md1 /dev/sdc2 # mdadm --manage -r /dev/md3 /dev/sdc3 # mdadm --manage -r /dev/md3 /dev/sdc5 # mdadm --manage -r /dev/md0 /dev/sdc1
Nun haben wir eine neue Situation
# cat /proc/mdstat ---------------- output ---------------- Personalities : [raid0] [raid1] md1 : active raid1 sda2[0] 2096384 blocks [2/1] [U_] md3 : active raid1 sda3[0] 1052160 blocks [2/1] [U_] md2 : active raid1 sda5[0] 147894272 blocks [2/1] [U_] md0 : active raid1 sda1[0] 5245120 blocks [2/1] [U_] ---------------- output ----------------
Nun muss der Server runtergefahren werden:
# shutdown -h now
Sobald der Server ausgeschaltet ist und vom Strom genommen wurde ersetze die entsprechende Disk. Die neue Disk muss minimum so gross sein wie die zu ersetzende Disk (auf keinen Fall kleiner). Sobald das Die Disk ersetzt wurde starte den Server neu. Sobald er vollstaending gestartet wurde muss nun als Erstes das Layout der aktiven Disk dh. "sda" auf die neue Disk "sdc" kopiert werden.
# sfdisk -d /dev/sda | sfdisk /dev/sdc
Ueberpruefe ob dem so ist:
# fdisk -l
Nun koennen die einzelnen Partitionen wiederum zum Mirror hinzugefuegt werden:
# mdadm --manage -a /dev/md1 /dev/sdc2 # mdadm --manage -a /dev/md3 /dev/sdc3 # mdadm --manage -a /dev/md3 /dev/sdc5 # mdadm --manage -a /dev/md0 /dev/sdc1
Es koennen zwar alle Befehle nacheinander abgesetzt werden jedoch "mdadm" kann nur jeweils eine Partition neu Synchronisieren. Der Vorgang kann mit folgendem Befehl ueberwacht werden:
# cat /proc/mdstat
Nach erfolgreicher Synchronisation ist es ratsam den Server neu zu starten:
# reboot
Es ist ratsam die Partitionstabelle der Disk's zu speichern. Dies wird folgendermassen bewerkstelligt:
# mkdir /raidinfo # sfdisk -d /dev/sda > /raidinfo/partitions.sda # sfdisk -d /dev/sdb > /raidinfo/partitions.sdb
Um die Partitionstabelle im Notfall wieder herzustellen fuehre folgenden Befehl aus
# sfdisk /dev/sda < /raidinfo/partitions.sda
Wenn die Situation eintrifft das der Server nicht mehr bootet weil die Boot Disk nicht mehr zur Verfuegung steht muss ueber die noch intakte Disk gebootet werden. Diese Disk muss jedoch ueber einen MBR (Master Boot Record) verfuegen. Ein Software Raid legt per standard diesen MBR nur auf der Master Disk an jedoch nicht auf der Slave Disk. Gehen wir davon aus das der Master /dev/sda ist und der Slave /dev/sdb muss der MBR bei einem Ausfall von /dev/sda zuerst auf /dev/sdb geschrieben werden. Nur so kann von dem Slave gestartet werden. Um dies zu gewaehrleisten gehe folgendermassen vor:
# grub Um nun festzustellen wo ueberall ein Grub Setup installiert ist gebe ein: # find /boot/grub/stage1 (hd0,0) (hd1,0) NOTE Die Ausgabe (hd0,0) und (hd1,0) bedeutet Sda=hd0 sdb=hd1 Da die Ausgabe ueber das "find" Kommando angiebt das hd0 bereits ein Grub aufweist im MBR koennen wir folgende Befehl ausfuehren um diese Infos auf hd1 sprich /dev/sdb zu uebertragen: Grub>device (hd0) /dev/sdb Grub>root (hd0,0) Filesystem type is ext2fs, partition type 0xfd Grub>setup (hd0) Checking if "/boot/grub/stage1" exists... yes Checking if "/boot/grub/stage2" exists... yes Checking if "/boot/grub/e2fs_stage1_5" exists... yes Running "embed /boot/grub/e2fs_stage1_5 (hd0)"... 16 sectors are embedded. succeeded Running "install /boot/grub/stage1 (hd0) (hd0)1+16 p (hd0,0)/boot/grub/stage2 /boot/grub/grub.conf"... succeeded Done. NOTE "/dev/sdb" stellt den Slave dar des Mirrors. Welches der Mirror ist kann ueber "cat /proc/mdstat" herausgefunden werden. Grub wird nun die noetigen Aenderungen vornehmen. Sobald diese Aenderungen durchgefuehrt sind besteht auf dem Slave ebenfalls ein aktiver MBR und somit kann der Slave im Fall eines Total Ausfalls des Masters gebootet werden was ohne diese Aenderungen nicht moeglich waere. Mehr infos ueber diese Angaben findet man unter: http://lists.us.dell.com/pipermail/linux-poweredge/2003-July/008898.html