Gentoo Installation from Scratch auf einem Manitu Dedicated Server

In meinem ersten Beitrag habe ich schon erwähnt, dass ich gerne Blogs lese. Einer dieser Blogs ist von Manuel Schmitt, Chef des Webspace und Serververmieters Manitu.

Vor einigen Tagen hat er dort ein Angebot über einen Dedicated Server für 20 Euro brutto im Monat gepostet. In einer Art Glücksspiel wurde hier bunt zusammengewürfelten Hardware-Komponenten aus alten Servern ein zweites Leben geschenkt.

Da man sich nur einen Monat binden musste, habe ich mir einen Server bestellt und einen Dual Core Athlon 64 X2 3800+ (2x2Ghz) mit zwei Gigabyte RAM und zwei 160-GB-Festplatten erhalten.
Super Angebot für den Preis, wenn man bedankt, dass mein vServer auf nur einem Kern des baugleichen Prozessors läuft.

Der Support hat bis jetzt immer super schnell und kompetent reagiert.
Der neue Server war anfangs nur per Half-Duplex an das Internet angebunden, weshalb die Download-Geschwindigkeit sehr gelitten hat. Dies wurde schnell erkannt und gelöst. Außerdem hat der Boot ins Rescue-System nicht funktioniert, da eine BIOS-Einstellung falsch war. Auch das wurde sehr schnell behoben.

Auf dem System habe ich verschiedene Linux-Distributionen getestet, da ich von Gentoo zu einer Binärdistribution wechseln wollte. Leider haben diese mich schon beim Installieren sehr aufgeregt. Keine war passend für mich. Also musste doch wieder Gentoo her...

Gentoo habe ich from Scratch installiert - also nicht das fertige Image von Manitu.

Meine Schritte habe ich hier einmal dokumentiert:

Der Server wird mit einem RAID-1 und 64-Bit eingerichtet.

Als allererstes bootet man in das Rescue-System. Dann kann man gleich die Platten neu formatieren.

  1. # Format Disks
  2. cfdisk /dev/sda1

Insgesamt werden vier Partitionen angelegt.
Eine /boot vom Typ fd (Linux RAID Autodetect, hier 512MB), eine Swap-Partition (hier 1024 MB), danach eine Root-Partition (auch fd, 20 480MB). Der Rest wird auch als RAID konfiguriert.

Die Einstellungen von der ersten Festplatte können nun auf die zweite Festplatte geschrieben werden.

  1. # Copy Partition Layout to new disk
  2. sfdisk -d /dev/sda | sfdisk /dev/sdb

Die Swap-Partitionen werden eingerichtet...

  1. # Set up swap
  2. mkswap /dev/sda2
  3. mkswap /dev/sdb2

... und aktiviert

  1. # Activate it
  2. swapon -p 1 /dev/sda2 && swapon -p 1 /dev/sdb2

Danach kann man schon das RAID aufsetzen:

  1. # Set up RAID
  2. mdadm --create /dev/md1 --level=1 --raid-devices=2 --metadata=0.90 /dev/sda1 /dev/sdb1
  3. mdadm --create /dev/md3 --level=1 --raid-devices=2 /dev/sda3 /dev/sdb3
  4. mdadm --create /dev/md4 --level=1 --raid-devices=2 /dev/sda4 /dev/sdb4

Als nächstes müssen wir warten, bis das RAID fertig ist. Watch ruft dafür alle zwei Sekunden den aktuellen Status ab und gibt ihn aus.
  1. # Wait for sync
  2. watch cat /proc/mdstat

Nun legen wir das Boot- und das Root-Dateisystem an...
  1. # Root-Filesystem
  2. mke2fs /dev/md1
  3. mkreiserfs /dev/md3

... und aktivieren das LVM.
  1. # LVM
  2. vgscan
  3. vgchange -a y
  4. pvcreate /dev/md4
  5. vgcreate main /dev/md4
  6.  
  7. # LVM Logical Volumes
  8. lvcreate -n usr -L 5G main
  9. lvcreate -n var -L 3G main
  10. lvcreate -n home -L 5G main
  11. lvcreate -n srv -L 5G main
  12. lvcreate -n tmp -L 1G main
  13. lvcreate -n vartmp -L 1G main
  14. lvcreate -n root -L 0.5G main

Auf den LVM-Partitionen erstellen wir nun noch das Dateisystem.
  1. # Filesystems
  2. for i in /dev/main/*; do yes | mkreiserfs $i ; done;

Jetzt ist es an der Zeit, die nötigen Verzeichnisse zu erstellen und die Partitionen zu mounten.
  1. # Set up filesystem
  2. mkdir /mnt/gentoo/
  3. mount /dev/md3 /mnt/gentoo
  4. mkdir /mnt/gentoo/boot/
  5. mount /dev/md1 /mnt/gentoo/boot
  6.  
  7. mkdir /mnt/gentoo/home
  8. mkdir /mnt/gentoo/var
  9. mkdir /mnt/gentoo/usr
  10. mkdir /mnt/gentoo/srv
  11. mkdir /mnt/gentoo/tmp
  12. mkdir /mnt/gentoo/root
  13.  
  14. mount /dev/main/usr /mnt/gentoo/usr/
  15. mount /dev/main/var /mnt/gentoo/var/
  16. mount /dev/main/home /mnt/gentoo/home/
  17. mount /dev/main/srv /mnt/gentoo/srv/
  18. mount /dev/main/tmp /mnt/gentoo/tmp/
  19. mount /dev/main/root /mnt/gentoo/root/
  20.  
  21. mkdir /mnt/gentoo/var/tmp
  22. mount /dev/main/vartmp /mnt/gentoo/var/tmp/
  23.  
  24. chmod 1777 /mnt/gentoo/tmp /mnt/gentoo/var/tmp

Der erste Teil ist nun geschafft, jetzt können wir das Stage-3-Image herunterladen und entpacken.
  1. # Bootstrap
  2. cd /mnt/gentoo/
  3. wget ftp://mirror.netcologne.de/gentoo/releases/amd64/current-stage3/stage3-amd64-20101111.tar.bz2
  4. time tar xjpf stage3-amd64-20101111.tar.bz2
  5. rm stage3-amd64-20101111.tar.bz2

Genauso den aktuellen Portage-Snapshot.
  1. # Portage
  2. cd /mnt/gentoo/usr
  3. wget ftp://mirror.netcologne.de/gentoo/snapshots/portage-latest.tar.bz2
  4. time tar xjf portage-latest.tar.bz2
  5. rm portage-latest.tar.bz2

Bereits jetzt können wir in unser neues System chrooten.
  1. # Chroot
  2. cd /
  3. cp -L /etc/resolv.conf /mnt/gentoo/etc/
  4. mount -t proc none /mnt/gentoo/proc
  5. mount -o bind /dev /mnt/gentoo/dev
  6. mount -o bind /dev/pts /mnt/gentoo/dev/pts 
  7. chroot /mnt/gentoo /bin/bash
  8. env-update && source /etc/profile

Und erste Einstellungen wie Hostname und Zeitzone vornehmen.
  1. # First settings
  2. cp /usr/share/zoneinfo/Europe/Berlin /etc/localtime
  3. cd /etc
  4. echo "127.0.0.1 aliena.tfgservers.net aliena localhost" > hosts
  5. sed -i -e 's/HOSTNAME.*/HOSTNAME="aliena"/' conf.d/hostname
  6. hostname aliena
  7. hostname -f

Um die Installation schnell abschließen zu können empfiehlt es sich, schon jetzt schnelle Mirrors auszuwählen.
  1. # Mirrors
  2. emerge -v mirrorselect
  3. mirrorselect -i -o >> /etc/make.conf
  4. mirrorselect -i -r -o >> /etc/make.conf

Nun installieren wir einige Systemverwaltungstools.
  1. # Emerge System tools
  2. emerge -v vim iproute2 mdadm lvm2 reiserfsprogs
  3. rc-update add mdraid boot
  4. rc-update add lvm boot

Den Kernel bauen wir anhand der vorgeschlagenen Config von Manitu.
  1. # Kernel
  2. time emerge -v gentoo-sources
  3. cd /usr/src/linux
  4. cp ~/aliena/config-2.6.35.6 .config
  5. make oldconfig
  6. make menuconfig
  7. make -j2
  8. make modules_install
  9. cp arch/x86_64/boot/bzImage /boot/kernel

Nun Editieren wir die Mounteinstellungen...
  1. # Fstab
  2. vim /etc/fstab

... mit folgendem Inhalt:
  1. /dev/md1                /boot           ext2            noauto,noatime  1 2
  2. /dev/md3                /               reiserfs        noatime 0 0
  3. /dev/sda2               none            swap            sw,pri=1        0 0
  4. /dev/sdb2               none            swap            sw,pri=1        0 0
  5. /dev/main/root          /root           reiserfs        noatime,nodev,noexec    0 0
  6. /dev/main/usr           /usr            reiserfs        noatime,nodev   0 0
  7. /dev/main/var           /var            reiserfs        noatime,nodev   0 0
  8. /dev/main/srv           /srv            reiserfs        noatime,nodev   0 0
  9. /dev/main/tmp           /tmp            reiserfs        noatime,nodev,noexec,nosuid     0 0
  10. /dev/main/vartmp        /var/tmp        reiserfs        noatime,nodev   0 0

Desweiteren richten wir noch das Netzwerk ein...
  1. # Network config
  2. cd /etc/conf.d/
  3. echo 'modules=( "iproute2" )' > net
  4. echo 'config_eth0=( "89.238.82.222/24" "89.238.82.223/24" "89.238.82.224/24" "89.238.82.225/24" )' >> net
  5. echo 'routes_eth0=( "default via 89.238.82.1" )' >> net
  6. rc-update add net.eth0 default

... und setzen ein root-Passwort:
  1. # password
  2. passwd

Die Zeitzone legen wir noch auf Europe/Berlin fest...
  1. # Timezone
  2. vim /etc/conf.d/clock
  3. # TIMEZONE="Europe/Berlin"

... und richten Cron und Syslogd ein.
  1. # Syslog and Cron
  2. emerge -v syslog-ng vixie-cron
  3. rc-update add syslog-ng default
  4. rc-update add vixie-cron default

Als Bootloader verwenden wir Grub:
  1. # Bootloader
  2. grep -v rootfs /proc/mounts > /etc/mtab
  3. emerge -v grub
  4. echo 'default 0
  5. timeout 5
  6.  
  7. title Gentoo
  8. root (hd0,0)
  9. kernel /boot/kernel root=/dev/md3
  10. ' > /boot/grub/grub.conf
  11.  
  12. echo 'root (hd0,0)
  13. setup (hd0)
  14. root (hd1,0)
  15. setup (hd1)
  16. quit' | grub

Zugriff auf unseren Server wollen wir per SSH erhalten. Dazu verwenden wir den schlanken dropbear.
  1. # SSH
  2. emerge -v dropbear
  3. sed -i -e 's/DROPBEAR_OPTS.*/DROPBEAR_OPTS="-p 9112 -g"/' /etc/conf.d/dropbear
  4. rc-update add dropbear default

Anschließend richten wir noch die Firewall ein:
  1. # Firewall
  2. vim /etc/netfilter
  3. echo '#!/sbin/runscript
  4. # Copyright 1999-2006 Gentoo Foundation
  5. # Distributed under the terms of the GNU General Public License v2
  6. # $Header: $
  7.  
  8. depend() {
  9.         need net
  10. }
  11.  
  12. start() {
  13.         #bash /etc/netfilter.sh
  14.         iptables-restore < /etc/netfilter
  15.         ip6tables-restore < /etc/netfilter6
  16. }
  17.  
  18. #stop() {
  19. #
  20. #}
  21.  
  22. #restart() {
  23. #
  24. #}' > /etc/init.d/netfilter
  25. chmod +x /etc/init.d/netfilter
  26. rc-update add netfilter default

Geschafft! Nun können wir in unser neues System booten.
  1. # REBOOT
  2. reboot

Sobald der Server hochgefahren ist, machen wir noch ein paar Schönheitskorrekturen:
  1. # Useful Stuff
  2. emerge -v autounmask screen ethtool iptables traceroute bind-tools
  3.  
  4. # Locale
  5. echo 'de_DE.UTF-8 UTF-8' >> /etc/locale.gen
  6. locale-gen
  7. echo 'LANG="de_DE.UTF-8"
  8. LC_COLLATE="C"' > /etc/env.d/02locale
  9. env-update && source /etc/profile
  10.  
  11.  
  12. # Make Options
  13. sed -i -e 's/CFLAGS.*/CFLAGS="-march=k8 -O2 -pipe"/' /etc/make.conf
  14. echo 'ACCEPT_LICENSE="*"' >> /etc/make.conf
  15.  
  16.  
  17. # Speed up portage
  18. emerge -v pysqlite
  19. echo 'portdbapi.auxdbmodule = cache.sqlite.database' >> /etc/portage/modules
  20. echo '# Portage w/ SQLite
  21. FEATURES="${FEATURES} metadata-transfer"' >> /etc/make.conf
  22. rm -rf /var/cache/edb/dep 
  23. emerge --metadata
  24.  
  25. # NTP
  26. emerge -v ntp
  27. /etc/init.d/ntpd start
  28. rc-update add ntpd default