Die Zotac ZBOX

 
 

Ausgangssituation:

Die diversen Home-Services liefen auf 3 „Servern“, einer Synology DS101j, einer Linksys NSLU2 und einem alten Notebook. Das hatte sich im Laufe der Zeit so entwickelt, führte aber letztlich dazu, dass die drei schwächlichen Büchsen zusammen auch nicht weniger Strom verbrauchen, als ein fetter Server.

Also bekam ich zu Weihnachten 2010 von mir ( :-) ) eine Zotac ZBOX ID-40 mit 4 GB Hauptspeicher und 500 GB Harddisk. Diese sollte nicht nur die Serverfunktionen der kleinen Büchslein übernehmen, sondern auch als Home-Theatre dienen.

Hier der Link zum Hersteller: Zotac Homepage

 

Hardwareinstallation

 
Laborbetrieb am Monitor (VGA)

Die war überaus einfach: Plug and go. Dem System liegt ein VGA-Adapter bei.

Betrieb am 42" Fernseher(HDMI)

Video funktionierte auch sofort, stürzte aber regelmäßig ab. Allerdings kam zunächst kein Sound durch das HDMI-Kabel (siehe Treiberinstallation)

Funk-Uhr Tobit Time:LAN

Siehe NTP

 

Softwareinstallation

 
Betriebsystem

Zunächst muss man das System booten. Ich hatte mich für OpenSUSE 11.3 entschieden. (Oh, wäre ich doch bei Debian geblieben, da fühle ich mich wohler.) Für den ersten Bootvorgang habe ich ein CDRom Laufwerk über ein USB2IDE-Kabel angeschlossen. Die dabei entstandenen Probleme waren darauf zurückzuführen, dass das zunächst benutzte Laufwerk defekt war.

Hernach war die Installation kein Problem. Bei der Partitionierung habe ich es mir einfach gemacht: eine 20 GB Partition für / und eine Partition für /Data. Wie sinnvoll das ist, wird sich zeigen.

OpenSUSE installiert eine schiere Unmenge von Kram, deshalb war die Netzinstallation ziemlich langwierig über meine langsame DSL-Leitung.

Grafiktreiber

Standardmäßig installiert OpenSUSE den „nouveau“-Treiber, der regelmäßig „abschmiert“. Nach einiger Suche fand ich bei Zotac den richtigen Treiber

Zotac Downloads

Die Installation war nicht so einfach, denn es ist nicht so einfach, den „nouveau“-Treiber wieder los zu werden, es handelt sich um ein Kernel-Modul, welches beim Start bereits geladen wird. Schließlich half folgendes Vorgehen.

  • Booten mit dem „nomodeset“ - Flag
  • Die folgenden zwei Zeilen in die Datei /etc/modprobe.d/50-blacklist.conf einfügen
blacklist nouveau
options nouveau modeset=0
  • Deinstalleren des Nouveau-Treibers
  • Installieren des Zotac-Treibers

Damit war es dann möglich, die Full-HD-Auflösung via HDMI zu erreichen. Die Schrift ist damit allerdings sehr klein und die Systemsteuerung der OpenSUSE kann das nur eingeschränkt anpassen.

Sound-Einstellung

Das nächste Problem war die Ausgabe von Sound via HDMI-Kabel. In der Sound Einstllung muss man dazu den richtigen Kanal einstellen: FIXME Screenshot

Um auch noch Filme schauen zu können muss man in der Sound-Einstellung von XINE folgendes eingeben „hw:1,8“ FIXME Screenshot

WLAN-Einstellung

OpenSUSE ist doof! Ich kannte den Network-Manager von Debian und war ganz zufrieden damit. Damit kann Suse's YAST nicht umgehen. Daran muss noch gearbeitet werden FIXME

 

Software

 
Apache

Der Apache Webserver ist im Lieferumfang von Opensuse enthalten, er funktioniert out of the Box. Um mod_perl zu aktivieren, dient die Datei /etc/apache2/conf.d/mod_perl.conf

<Directory "/Data/WEB/perl_bin">
    AllowOverride None
    Options None
    Order allow,deny
    allow from all
</Directory>

Alias /perl_bin/ /Data/WEB/perl_bin/
<Location /perl_bin/>
   # mod_perl mode
#   SetHandler perl-script
   AddHandler perl-script .pl
   PerlResponseHandler ModPerl::Registry
   PerlOptions +ParseHeaders
   Options +ExecCGI
</Location>

# mod_dbd configuration
DBDriver mysql
DBDParams "dbname=apache2 user=auth_user pass=avalos host=localhost"
DBDMin  4
DBDKeep 8
DBDMax  20
DBDExptime 300

<Directory /Data/WEB/perl_bin>
  # core authentication and mod_auth_basic configuration
  # for mod_authn_dbd
  AuthType Basic
  AuthName "My Server"
  AuthBasicProvider dbd

  # core authorization configuration
  Require valid-user

  # mod_authn_dbd SQL query to authenticate a user
  AuthDBDUserPWQuery \
    "SELECT passwd FROM clients WHERE username = %s"
</Directory>
PHP5

Damit meine Scripts laufen, müssen ein paar Änderungen in der Datei /etc/php5/apache2 vorgenommen werden:

short_open_tag = On
safe_mode = Off
register_globals = Off
post_max_size = 8M
file_uploads = On
upload_max_filesize = 100M
MySQL

Der MySQL-Datenbankserver ist im Lieferumfang von Opensuse enthalten, er funktioniert out of the Box. Probleme entstanden beim Umzug der Daten, weil ich, ohne es recht zu merken, von Latin1 auf UTF-8 ungestellt hatte. Nachdem die Umlaute repariert waren, läuft die Datenbank zuverlässig

Samba
 
Perl
 
Postfix

Die ZBox soll ein ordentlicher Mailserver werden, dazu benutzen wir Postfix. Das funktioniert auch ohne Probleme, aber ich musste feststellen, dass ich schon nach kurzer Zeit mit Spam zugemüllt wurde. Mit dem Paket PCRE und den Erklärungen auf dieser Seite http://chains.ch/docs/postfix-UCE-HOWTO-de.html konnte ich abhilfe Schaffen. Hie auszugsweise die entsprechenden Dateien.

1. /etc/postfix/main.cf

#################################################################################
#### Spam Einstellungen
## 1. Absender
#     - Verwirft die Sender Domain, wenn diese keinen DNS Rekord vom Typ A oder MX hat.
#     - Verwirft den Absender, wenn diese nicht in FQDN Form ist (Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!).   
#     - Verwirft die Anfrage, wenn der Sender einen DNS Rekord vom Typ A unter domain.tld hat.
smtpd_sender_restrictions = 
    warn_if_reject,
    reject_unknown_sender_domain,
    reject_non_fqdn_sender,
#    reject_rhsbl_sender domain.tld

## 2. Client Restrictions
#     - Verwirft die Anfrage, wenn der Hostname des SMTP Clients unbekannt ist (die IP Adresse
#       oder der Hostname des TCP/IP Clients) oder wenn Reverse und Forward Lookups nicht übereinstimmen.
#     - Verwirft die Anfrage, wenn der SMTP Client einen DNS Rekord vom Typ A unter domain.tld hat. 
#       Ein RHSBL ist eine Real-time Blacklist (Domain basiert). 
#     - Gewährt Zugriff, wenn der Client in $mynetworks zu finden ist.
smtpd_client_restrictions = 
    permit_mynetworks,
    reject_invalid_hostname,
    reject_unknown_hostname,
    reject_non_fqdn_hostname,

## 3. HELO Einstellungen
#     - Verwirft im HELO/EHLO angegebenen Hostname, falls dieser eine falsche Syntax hat. Wenn man in einem
#       Netzwerk ist und man will, dass die Maschinen, die auch im Netzwerk sind Emails über unseren MTA   
#       verschicken wollen, dann ist es sinnvoll, diese Beschränkung erst nach permit_mynetworks anzugeben 
#     - Verwirft den im HELO/EHLO angegebenen Hostnamen, welcher keinen DNS Rekord vom Typ A oder MX hat.  
#       Hier ist es auch sinnvoll permit_mynetworks zuerst anzugeben, wenn man ein Relay-MTA für das innere Netzwerk ist.
#     - Verwirft den im HELO/EHLO angegebenen Hostnamen, wenn dieser nicht in FQDN Form ist. 
#     - Sieht im HELO/EHLO angegebenen Hostnamen oder Parent Domain nach.
#     - Gewährt Zugriff, wenn der Client in der Liste von $mynetworks ist.
smtpd_helo_required = yes
smtpd_helo_restrictions =
    permit_mynetworks,   
    reject_invalid_hostname,
    reject_unknown_hostname,
    reject_non_fqdn_hostname
#    check_helo_access

strict_rfc821_envelopes = no
## 4. Recipient Einstellungen
#     - Verwirft die Anfrage, wenn im RCPT TO die Domain des Empfängers keinen DNS Rekord vom Typ A oder MX hat.
#     - Verwirft die Anfrage, wenn im RCPT TO die Domain des Empfängers nicht in FQDN Form ist.
#     - Verwirft die Anfrage, wenn der Empfänger einen DNS Rekord vom Typ A unter domain.tld hat.
#     - Verwirft das Absenden von Emails:
#     - + zu Zielmaschinen, die nicht unter $inet_interfaces, $mydestination, $virtual_alias_domains der $virtual_mailbox_domains zu finden si
#     - + zu Zielmaschinen, die nicht unter $relay_domains oder in deren Subdomains zu finden sind (ausser Sender-spezifisches Routing).
#     - Wandelt jedes REJECT einer direkt nachfolgenden Restriction in eine Warnung um.
#     - Löst die Empfänger-Adresse, Parent Domain oder localpart@ auf.
#     - Der MX Record der Empfängerdomain wird bestimmt und das Ergebnis wird zur Suche in maptype:mapname verwendet.
#     - Erlaubt das Absenden von Emails:
#     - - zu Zielmaschinen, die unter $inet_interfaces, $mydestination, $virtual_alias_domains der $virtual_mailbox_domains zu finden sind.
#     - - zu Zielmaschinen, die unter $relay_domains oder in deren Subdomains zu finden sind (ausser Sender-spezifisches Routing).
#     - Erlaubt das Empfangen von Emails für Seiten, die mich als MX Host auflisten.
#     - Gewährt Zugriff, wenn der Client in der Liste von $mynetworks ist.
smtpd_recipient_restrictions = 
    warn_if_reject,
    permit_mynetworks,
    reject_unauth_destination,
    reject_invalid_hostname,  
    reject_non_fqdn_sender,   
    reject_unknown_sender_domain,
    reject_non_fqdn_recipient,   
    reject_unknown_recipient_domain,
    reject_rbl_client relays.ordb.org,
    reject_rbl_client cbl.abuseat.org,


## 5. PCRE Checks


#     - Header und Body der Mail werden per Regex untersucht. Die Regeln dafür stehen in den folgenden Dateien
header_checks = pcre:/etc/postfix/header_checks.pcre
body_checks = pcre:/etc/postfix/body_checks.pcre

2. /etc/postfix/body_checks.pcre

/iagra/           DISCARD
/Angelina/        DISCARD
/pills/           DISCARD
/nlarge/          DISCARD
/Scam/            DISCARD
/herbal/          DISCARD
/increase/        DISCARD
/Chronomet/       REJECT Spam rejected
/usverkauf/       DISCARD
/rmbanduhr/       REJECT Spam rejected
/generic/         DISCARD
/ialis/           DISCARD
/rands/           DISCARD
/Penis/           DISCARD

3. /etc/postfix/header_checks.pcre

/^From:.*ample/             DISCARD
/^From:.*Anwalt/            DISCARD
/^From:.*Gewinn/            DISCARD
/^From:.*Games/             DISCARD
/^From:.*Hero/              DISCARD
/^From:.*Oprah/             DISCARD
/^From:.*Photos/            DISCARD
/^From:.*Promo/             DISCARD
/^From:.*rial/              DISCARD
/^From:.*Jennifer Aniston/  DISCARD
/^From:.*roduct/            DISCARD
/^From:.*Rolex/             DISCARD
/^From:.*Britney/           DISCARD
/^From:.*Clinical/          DISCARD
/^From:.*Tube/              DISCARD
/^Subject:.*Angelina/       DISCARD
/^Subject:.*Bett/           DISCARD
/^Subject:.*Brand/          DISCARD
/^Subject:.*areer/          DISCARD
/^Subject:.*Rolex/          DISCARD
/^Subject:.*sale/           DISCARD
/^Subject:.*Weight/         DISCARD
/^Subject:.*eduction/       DISCARD
/^Subject:.*market/         DISCARD
/^Subject:.*Oprah/          DISCARD
/^Subject:.*intimate/       DISCARD
/^Subject:.*Penny/          DISCARD
/^Subject:.*ussische/       DISCARD
/^Subject:.*Chronomet/      DISCARD
/^Subject:.*eitmesser/      DISCARD
/^Subject:.*eplica/         DISCARD
/^Subject:.*generic/        DISCARD
/^Subject:.*herbal/         DISCARD
/^Subject:.*iagra/          DISCARD
/^Subject:.*ialis/          DISCARD
/^Subject:.*inch/           DISCARD
/^Subject:.*increase/       DISCARD
/^Subject:.*iracle/         DISCARD
/^Subject:.*ize/            DISCARD
/^Subject:.*Mahnung/        DISCARD
/^Subject:.*nlarge/         DISCARD
/^Subject:.*pill/           DISCARD
/^Subject:.*roduct/         DISCARD
/^Subject:.*rands/          DISCARD
/^Subject:.*rmbanduhr/      DISCARD
/^Subject:.*Scam/           DISCARD
/^Subject:.*Sex/            DISCARD
/^Subject:.*SEX/            DISCARD
/^Subject:.*sex/            DISCARD
/^Subject:.*usverkauf/      DISCARD
/^Subject:.*zubehoer/       DISCARD
DHCP
 
NTP

OpenSuSE installiert einen NTP-Server, der auch funktioniert. Ich wollte aber meine Tobit DCF77 Uhr anschließen. Die ZBOX hat keinen seriellen Ausgang also kam ein simpler USB to Serial Adapter zum Einsatz. Zuerst muss ein Link von /dev/ttyUSB0 nach /dev/refclock-0 her.

Dann muss /etc/ntp.conf erweitert werden

logconfig =all   # das kann später wieder abgeschaltet werden
server 127.127.8.0 mode 16

Nach rcntp restart meldet das Log Permission denied. Das liegt an AppArmor (*grrr*) deshalb muss in /etc/apparmor.d/usr.sbin.ntpd eingefügt werden damit auf die Interfaces geschrieben werden kann.

  /dev/refclock-0 rw,
  /dev/ttyUSB0 rw,

Anschließend muss ein symbolischer link von ttyUSB0 nach refclock-0 gelegt werden, damit ntp die Uhr finden kann. Hier ist mein mangelndes Verständnis von UDEV im Weg, der Link verschwindet nach jedem Reboot, daher wird der Link nach jedem Boot neu erstellt FIXME

Sie läuft nun anstandslos mit folgender Konfiguration:

driftfile /var/lib/ntp/drift/ntp.drift
logfile /var/log/ntp
logconfig =all
server 127.127.8.0 mode 16

Nach nochmaligem rcntp restart: Voilà. Man muss allerdings etwas Geduld haben, bis die Uhr synchronisiert.