IPKG

Aus

Einleitung

Um die Installation von zusätzlicher Software zu vereinfachen, verwendet man das Paketverwaltungssystem IPKG (Itsy Package Management System). IPKG verwendet dabei bereits prozessorspezifische Programmpakete, so dass bei der Installation zusätzlicher Software nicht mehr auf die Kompatibilität zum verwendeten Prozessor geachtet werden muss. IPKG ist nicht Bestandteil der Synology-Firmware und muss zunächst selbst installiert werden.


Vorbereitung

Die Installation von IPKG muss auf den vorhandenen Prozessortyp abgestimmt sein. Welchen Prozessortyp besitzt mein System?

cat /proc/cpuinfo | grep cpu

Neue, jedoch noch ungetestete Adressen gibt es hier: http://www.synology-forum.de/showthread.html?p=106324

Installation

  1. Mit SSH/Telnet !als root, nicht als admin! auf der Synology Station einloggen. Das Passwort für root ist das gleiche wie für den user admin
  2. Ins Verzeichnis public wechseln (wenn nicht vorhanden, muss das Verzeichnis erstellt werden)
    cd /volume1/public
  3. Die prozessorspezifische Datei mit wget herunterladen - Beispiel:
    wget http://ipkg.nslu2-linux.org/feeds/optware/syno-x07/cross/unstable/syno-x07-bootstrap_1.2-7_arm.xsh
  4. Das .xsh Skript starten - Beispiel:
    sh syno-x07-bootstrap_1.2-7_arm.xsh
    • DS211/DS411slim/DS411: Das Boostrap Skript syno-mvkw-bootstrap_1.2-7_arm.xsh ist noch nicht an den in der DS211/DS411slim/DS411 verwendeten Marvell 88F6282/88FR313 angepasst worden. Es bricht unnötigerweise mit der Fehlermeldung "Error: CPU not Marvell Kirkwood, probably wrong bootstrap.xsh" ab. Dies kann man korrigieren, indem man in der Datei /volume1/public/bootstrap/bootstrap.sh die Zeile 21 wie folgt ändert von
      if ! grep Feroceon-KW /proc/cpuinfo >/dev/null 2>&1; then
      in
      if ! grep Feroceon /proc/cpuinfo >/dev/null 2>&1; then
      Es wird also nur das "-KW" gelöscht. Das geänderte bootstrap Skript startet man danach mit
      sh bootstrap.sh
  5. Herunterladen des aktuellen Paketverzeichnisses mit
    ipkg update
  6. Neustart des Systems

Die .xsh Datei kann jetzt aus dem Verzeichnis public gelöscht werden.


die geänderte "bootstrap.sh" für DS211:

#!/bin/sh # Replaced during packaging based on value in target-specific.mk REAL_OPT_DIR=/volume1/@optware if [ -e "$REAL_OPT_DIR" ] ; then echo "Backup your configuration settings, then type:" echo " rm -rf $REAL_OPT_DIR" echo " rm -rf /usr/lib/ipkg" echo "This will remove all existing optware packages." echo echo "You must *reboot* and then restart the bootstrap script." exit 1 fi if [ ! -e `dirname $REAL_OPT_DIR` ]; then echo "Error: `dirname $REAL_OPT_DIR` does not exist" exit 2 fi if ! grep Feroceon /proc/cpuinfo >/dev/null 2>&1; then echo "Error: CPU not Marvell Kirkwood, probably wrong bootstrap.xsh" exit 3 fi BS_DIR="$REAL_OPT_DIR/ipkg-bootstrap" echo "Creating temporary ipkg repository..." rm -rf $BS_DIR mkdir -p $BS_DIR ln -s $BS_DIR /tmp/ipkg cat >>$BS_DIR/ipkg.conf <<EOF dest root / lists_dir ext $BS_DIR/ipkg EOF if ! which md5sum >/dev/null && which openssl >/dev/null; then \ sed -i -e "/md5sum.*sed/{s|\`md5sum|\`openssl md5|;s|sed 's/ .*//'|sed 's/.* //'|}" ./ipkg.sh fi export IPKG_CONF_DIR=$BS_DIR export IPKG_DIR_PREFIX=$BS_DIR echo "Installing optware-bootstrap package..." sh ./ipkg.sh install optware-bootstrap.ipk echo "Installing ipkg..." sh ./ipkg.sh install ipkg-opt.ipk echo "Removing temporary ipkg repository..." rm -rf $BS_DIR rm /tmp/ipkg echo "Installing wget..." /opt/bin/ipkg install wget.ipk || exit 1 [ ! -d /opt/etc/ipkg ] && mkdir -p /opt/etc/ipkg if [ ! -e /opt/etc/ipkg/cross-feed.conf ] then echo "Creating /opt/etc/ipkg/cross-feed.conf..." echo "src/gz cross http://ipkg.nslu2-linux.org/feeds/optware/cs08q1armel/cross/unstable" >/opt/etc/ipkg/cross-feed.conf fi echo "Setup complete."

Weitergehende Installation IPKG

Auch wenn die einfach IPKG Installation erst einmal funktionsfähig ist, hat diese Originale IPKG Installation leider ein paar Nachteile. Vor allem kann es vorkommen, dass die DS nicht mehr korrekt heruntergefahren wird, wenn man nicht noch ein paar Dinge anpasst, welche nachfolgend beschrieben werden.

Altes Startup Script anpassen

Im originalen IPKG Startup Script /etc/rc.local werden die Optware Startup Scripte aufgerufen. Bevor man ein neues Startup Script etablieren kann, muss der alte Eintrag des IPKG Pakets entfernt oder wenigstens auskommentiert werden. Der entsprechende Eintrag könnte nach der Änderung so aussehen:

# Optware setup
#[ -x /etc/rc.optware ] && /etc/rc.optware start

Mount Bind entfernen

Nach dem entfernen des Originalen Startup Scripts, wird /opt beim Booten der DS nicht mehr per mount bind eingebunden. Das ist auch gut so, da man ohne Probleme einen Symbolischen Link verwenden kann und so der Mount Bind beim herunterfahren nicht mehr per umount entfernt werden muss.

Umount eines ggf. noch gemounteten /opt

umount /opt

Falls es beim umount zu Problemen kommen sollte, weil noch Dienste der Optware laufen, müssen diese vorher beendet werden. Danach klappt es auch mit dem umount. Falls es gar nicht klappen will, dann wird nach dem entfernen des Eintrags in rc.local einfach die DS neu gestartet. Da die Optware Prozesse zu diesem Zeitpunkt ggf. noch laufen, kann es allerdings sein, dass die DS nicht sauber herunterfährt. Einfach nicht nervöss werden und der DS ein paar Minuten Zeit geben, die Filesystem Caches auf die Platte zu schreiben. Danach beherzt abschalten und wieder hochfahren lassen. Dann wieder als root einloggen und weitermachen.

Um den Symbolischen Link statt des Mount Bind zu setzen wird folgendermaßen vorgegangen:

rmdir /opt
ln -s /volume1/@optware /opt

Dabei bitte Kontrollieren, dass /volume1/@optware auch existiert! Auf manchen DS Varianten scheint das Verzeichnis anders zu heissen. Zur Not also mit einem

ls -l /opt

nachsehen, wie das entsprechende Verzeichnis heisst.

Neues separates Startup Script für Optware

Ein neues Startup Script sorgt dafür, dass die Optware Scripte doch wieder ausgeführt werden, diesmal sorgt aber der DS Startup und Shutdown Prozess dafür, dass auch jeweils die "start" und ganz wichtig die "stop" Scripte ausgeführt werden. Es sollte dabei darauf geachtet werden, dass die originalen IPKG Optware Startup Scripte nicht unbedingt gut für den Start/Stop-Betrieb geeignet sind. Vor deren Verwendung sollte daher noch einmal sichergestellt werden, dass diese Scripts ordentlich mittels start und stop gesteuert werden können, ansonsten muss man vor einem sauberen Shutdown die entsprechenden Dienste von Hand per "kill" beenden. Wenn alle Scripte sauber mittels "start"- und "stop"-Parameter funktionieren, kann die DiskStation die IPKG Optware-Dienste und selbstdefinierten Dienste sauber hoch- und herunterfahren. Damit wird sichergestellt, dass die DiskStation beim Herunterfahren nicht "hängenbleibt".

Nicht verschwiegen werden soll, dass das neue Optware Startup Script die Optware Dienste erst gegen Ende des Startup Prozesses startet und nicht wie das Alte Script, ganz am Anfang. Dies dürfte aber keinen Nachteil darstellen, die Vorteile überwiegen eindeutig.

Das neu Optware Startup Script sollte unter /usr/local/etc/rc.d/optware.sh abgelegt werden und folgendermaßen aussehen, dabei muss man ggf. das Verzeichnis /usr/local/etc/rc.d von Hand mittels mkdir anlegen. Fall es gar nicht mit dem mkdir klappen sollte, kann man noch das AdminTool installieren, beim Installieren des 3d Party Scripts wird das Verzeichnis unter /usr/local mit angelegt.

#!/bin/sh
#
# Optware setup
# Alternatives Optware Startup und Shutdown Script #/usr/local/etc/rc.d/optware.sh
#
case $1 in
start)
       for i in /opt/etc/init.d/S??* ;do
#
               # Ignore dangling symlinks (if any).
               [ ! -f "$i" ] && continue
#
               case "$i" in
                  *.sh)
                       # Source shell script for speed.
                       (
                               trap - INT QUIT TSTP
                               set start
                               . $i
                       )
                       ;;
                  *)
                       # No sh extension, so fork subprocess.
                       $i start
                       ;;
               esac
       done
       ;;
#
stop)
#
       for i in /opt/etc/init.d/S??* ;do
#
               # Ignore dangling symlinks (if any).
               [ ! -f "$i" ] && continue
#
               case "$i" in
                  *.sh)
                       # Source shell script for speed.
                       (
                               trap - INT QUIT TSTP
                               set stop
                              . $i
                       )
                       ;;
                  *)
                       # No sh extension, so fork subprocess.
                       $i stop                       ;;
               esac
         done
         ;;
#
*)
         echo "Usage: $0 [start|stop]"
         ;;
esac
#
# End

Jetzt noch das Script ausführbar machen, damit es von der DS beim Starten und Stoppen ausgeführt werden kann.

chmod +x /usr/local/etc/rc.d/optware.sh

Fertig zum Testen. Wenn man alles richtig gemacht hat, werden die Optware Dienste beim Starten ausgeführt und beim Herunterfahren sauber beendet. Kein Hängenbleiben der DS beim Reboot mehr.

Wer ganz vorsichtig sein will, benennt erst einmal alle Scripts unter /opt/etc/init.d/ von gross "S" nach klein "s" am Anfang um und startet seine DS erst einmal neu. Danach wird ein Script nach dem anderen wieder nach gross "S" umbenannt, wenn es denn gebraucht wird und die DS neu gestartet. Wenn man die nicht benötigten Startup Scripte weglässt, hat das gleich noch den Vorteil, dass man etwas entrümpelt, falls doch alzu viele IPK Dienste bereits ihren Weg auf die DS gefunden haben.

Zusätzlich kann man mit dieser Vorgehensweise sehr klar feststellen, wo es hakt.

Alternative IPKG Startup Scripts

Wie bereits geschrieben, sind die Originalen Startup Scripts des IPKG Optware unter "/etc/opt/init.d/" nicht gerade das gelbe vom Ei. Die Scripts eignen sich gerade mal dazu die Dienste zu starten, aber für das herunterfahren der DS sind diese Scripts einfach nicht geeignet. Daher sind hier alternative Start/Stop Scripts abgelegt und jeder, der seine DS erweitert ist aufgerufen, weitere Scripts, welche ein sauberes Starten und stoppen ermöglichen, hier abzulegen. Wenn man nachfolgende Scripts verwendet, ist das alternative "optware.sh" Sript beim herunterfahren der DS dazu in der Lage die entsprechenden Dienste sauber mit stop zu beenden.

Startup Script atd

Das originale aus dem IPK stammende Startup Script unter /opt/etc/init.d/ wurde um start/stop/restart Prozeduren erweitert.

#!/bin/sh
#
# Startup script for atd
#
# Stop myself if running
PIDFILE=/var/run/atd.pid
#
start() {
 /opt/sbin/atd &
 echo "Optware startup atd"
}
#
stop() {
 [ -f ${PIDFILE} ] && kill `cat ${PIDFILE}`
 echo "Optware shutdown atd"
}
#
case "$1" in
       start)
               start
       ;;
       stop)
               stop
       ;;
       restart)
               stop
               sleep 1
               start
       ;;
       *)
               echo "Usage: $0 (start|stop|restart)"
               exit 1
       ;;
esac
# End

Startup Script fetchmail

Das Script ist etwas angepasst, damit für jeden User ein eigenes fetchmail aufgerufen werden kann. Das Logfile hat derzeit den Nachteil, dass es für alle User beschreibbar und lesbar sein muss. Da ist noch ein kleines TODO, aber fürs erste ist das Script besser, wie das Originale, welches sich für das IPKG unter /opt/etc/init.d/ findet.

#!/bin/sh
PROG=fetchmail
#ARGS="-d 300 -t 60 -a -e 50 --auth password -f /opt/etc/fetchmailrc -L /opt/var/log/fetchmail"
ARGS="-d 910 -t 60 -a -e 50 --auth password -L /opt/var/log/fetchmail"
#
if [ -z "$1" ] ; then
   case `echo "$0" | /bin/sed 's/^.*\/\(.*\)/\1/g'` in
       S??*) rc="start" ;;
       K??*) rc="stop" ;;
       *) rc="usage" ;;
   esac
else
   rc="$1"
fi
#
case "$rc" in
   start)
       echo "starting service $PROG"
       for user in `cat /etc/passwd | awk -F':' '{ print $1}'`; do
         USERHOME=`cat /etc/passwd | grep "^${user}" | awk -F':' '{print $6}'`
         if [ -f ${USERHOME}/.fetchmailrc ]; then
           su - ${user} -c "export HOME=${USERHOME} ; $PROG $ARGS" 2>&1
         fi
       done
       exit
#
       ;;
   stop)
       echo "stopping service $PROG"
#
       if [ -n "`pidof $PROG`" ]; then
           killall $PROG
       fi
       ;;
   restart)
       "$0" stop
       sleep 1
       "$0" start
       ;;
   *)
       echo "Usage: $0 (start|stop|restart|usage)"
       ;;
esac
#
# End

Startup Script rsyncd

Das nachfolgende Script für /opt/etc/init.d/ sollte bei verwendung besser noch einmal sauber durchgetestet werden. Da mit DSM3.0 die Diskstation einen eingenen rsynd anbietet, ist das Script nur vollständigkeitshalber hier abgelegt.

#!/bin/sh
#
# Startup and Shutdown script for rsyncd
#
# Start
start() {
 [ -e /opt/etc/default/rsync ] && . /opt/etc/default/rsync
#
 if ${RSYNC_ENABLE} ; then
   /opt/bin/rsync --daemon ${RSYNC_OPTS}
   echo "Optware startup rsyncd."
 fi
}
#
# Stop
stop() {
 if [ -f /var/run/rsyncd.pid ] ; then
   kill `cat /var/run/rsyncd.pid`
 else
   killall rsync 2>/dev/null
 fi
 rm -f /var/run/rsyncd.pid
}
#
stop
#
start
#
case "$1" in
       start)
               start
               ;;
       stop)
               stop
               ;;
       restart)
               stop
               sleep 1
               start
               ;;
       *)
               echo "Usage: $0 (start|stop|restart)"
               exit 1
               ;;
esac
#                                                                                                                                                                                
# End

Startup Script cupsd

#!/bin/sh
#
# Start / Stop Script for cupsd http://localhost:631
#
PREFIX=/opt
NAME=cupsd
DAEMON=/opt/sbin/cupsd
DAEMON_OPTS=""
#
#
start() {
       echo "Starting Service: $NAME"
       $DAEMON $DAEMON_OPTS
}
#
#
stop() {
       killall cupsd
}
#
#
case "$1" in
       start)
               start
               ;;
       stop)
               stop
               ;;
       restart)
               stop
               start
               ;;
       *)
               echo "Usage: $0 (start|stop|restart)"
               exit 1
               ;;
esac
#
# End

Startup Script openvpn mit NAT

Bitte ggf. die Adresse das VPN-Subnetzes entsprechend der /opt/etc/openvpn/openvpn.conf anpassen. Bitte vorher modprobe in Betrieb nehmen.

#!/bin/sh
#
# Startup script for openvpn server with NAT routing
# to access your local net by VPN.
#
start() {
 # Get network interface of default route
 DEV=$( route -n | grep "^0\.0\.0\.0" | sed 's/  */ /g' | cut -d" " -f8 )
 # Get local IP address of default routing interface
 IPA=$( ip addr show ${DEV} | awk '$1~/^inet$/ {gsub("/.*$","",$2);print $2}' )
 # Make sure IP forwarding is enabled
 echo 1 > /proc/sys/net/ipv4/ip_forward

 # Make device if not present (not devfs)
 if ( [ ! -c /dev/net/tun ] ) then
  # Make /dev/net directory if needed
  if ( [ ! -d /dev/net ] ) then
   mkdir -m 755 /dev/net
  fi
  mknod /dev/net/tun c 10 200
 fi

 # Make sure the tunnel driver is loaded
 if ( !(lsmod | grep -q "^tun") ); then
  modprobe tun
 fi
 # Make sure the nat table is loaded
 # (Will load ip_nat, ip_tables and ip_conntrack too.)
 if ( !(lsmod | grep -q "^iptable_nat") ); then
  modprobe iptable_nat
 fi

 ## Start standalone servers (without xinetd) comment out if xinetd is used
 # Start the openvpn daemon - add as many daemons as you want
 /opt/sbin/openvpn --daemon --cd /opt/etc/openvpn --config openvpn.conf
 # Setup NAT (adjust address if different)
 iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j SNAT --to-source ${IPA}
 echo "Optware startup openvpn with NAT to ${IPA}"
}
#
stop() {
 # Kill all servers running
 if [ -n "`/opt/bin/pidof openvpn`" ]; then
    /opt/bin/killall openvpn 2>/dev/null
 fi
 # Erase and unload nat table
 if ( (lsmod | grep -q "^iptable_nat") ); then 
  iptables -t nat -F
  modprobe -r iptable_nat;
 fi
 # unloaded no longe needed modules
 if ( (lsmod | grep -q "^tun") ); then
  #ifconfig tun0 down
  modprobe -r tun;
 fi

 echo "Optware shutdown openvpn"
}
#
case "$1" in
       start)
               start
       ;;
       stop)
               stop
       ;;
       restart)
               stop
               sleep 1
               start
       ;;
       *)
               echo "Usage: $0 (start|stop|restart)"
               exit 1
       ;;
esac
# End

Backup Script Optware / IPKG Installation

Das nachfolgende kleine Backup Script soll als Beispiel dienen, wie die Optware Installation gesichert werden kann. Das Quellverzeichnis muss entsprechend dem DS Pfad für IPKG angepasst werden und das BACKUPDIR sollte natürlich auf einem externen Medium liegen.

#!/bin/sh
#
# Script zum Backup der Optware incl. der Einstellungen
#
OPTWARE="/volume1/@optware /etc/rc.optware /etc/rc.local /usr/local/etc/rc.d/optware.sh"
BACKUPDIR="/volume1/backup_data"
#
BACKUPFILE=optware-backup-`date +%a`.tar.bz2
tar -cjf ${BACKUPDIR}/${BACKUPFILE} ${OPTWARE}
#
# End

externe Links, Mirrors

Mirror wenn ipkg.nslu2-linux.org down ist