Heimrouter-Kochbuch/ Hacks

Aus Wikibooks

OpenWRT[Bearbeiten]

Aktualisierung aller Pakete in einem Rutsch[Bearbeiten]

Von den Entwicklern kann es beabsichtigt sein, dass die Paketverwaltung opkg nicht alle verfügbaren Updates in einem Rutsch einspielen kann, wie bei vollwertigen Linux-Distributionen. Auf der Konsole (SSH-Zugang) lässt sich dies mit folgendem Workaround durchführen. Hierzu sollte auf dem Flash-Speicher allerdings ausreichend freier Speicherplatz vorhanden sein.

Zunächst wird die Paketliste aktualisiert:

opkg update

Mit dem Unterbefehl list-upgradable zeigt opkg die Pakete an, für die Aktualisierungen vorliegen. Aus dieser Liste wird mit cut -d\ -f1 (zwei Leerzeichen hinter \!) die Paketnamen extrahiert. Diese Liste wird in einer Schleife verwendet, um mit okpg diese Pakete zu installieren:

for i in $(opkg list-upgradable|cut -d" " -f1); do opkg install $i; done

Erweiterung des Speicherplatzes durch USB-Stick[Bearbeiten]

Tipp:

Zur Erweiterung des Speicherplatz müssen zunächst Pakete installiert werden, die ca. 1,5MB zusätzlich belegen. Bei bereits knappen Speicherplatz kann die Erweiterung an fehlendem Speicher scheitern. Daher bietet es sich an, zu Beginn den Speicherplatz mit einem USB-Stick zu erweitern.


Aktuellere Geräte verfügen oft über einen USB-Anschluss, an dem ein USB-Speicherstick angeschlossen werden kann. Diese Speicher kann nicht nur als NAS im Netzwerk verfügbar gemacht werden. Mit diesem Speicherplatz kann der teils begrenzte Flash-Speicher des Routers erweitert werden. Somit lassen sich deutlich mehr Programme installieren.

Diese Anleitung basiert auf der englischen Anleitung bei OpenWRT[1], bei der Ext4 als Dateisystem verwendet wird.

Vorbereitung[Bearbeiten]

Es werden einige Pakete zur Einrichtung benötigt, die bei einem frischen Image nicht eingerichtet sind:

opkg update
opkg install block-mount kmod-usb-storage kmod-usb-ohci kmod-usb-uhci fdisk
opkg install kmod-fs-ext4 e2fsprogs # Wenn Ext4 als Dateisystem verwendet werden soll
opkg install kmod-fs-btrfs btrfs-progs # Wenn Btrfs als Dateisystem verwendet werden soll

Die Pakete können prinzipiell auch unter der Weboberfläche installiert werden; allerdings muss dazu jedes Paket einzeln installiert werden.

Einrichten rootfs_data[Bearbeiten]

Folgende Schritte sind zwingend von der SSH-Konsole durchzuführen. Der SSH-Zugang muss hierzu eingerichtet sein. Das aktuelle Gerät, das zum speichern der Pakete verwendet wird, ist unter /overlay eingebunden. Dieses Gerät wird unter /rwm verschoben. Zunächst wird ermittelt, welches Gerät hierzu verwendet wird, da sich dies bei verschiedenen Modellen unterscheiden kann.

DEVICE="$(sed -n -e "/\s\/overlay\s.*$/s///p" /etc/mtab)"
uci -q delete fstab.rwm
uci set fstab.rwm="mount"
uci set fstab.rwm.device="${DEVICE}"
uci set fstab.rwm.target="/rwm"
uci commit fstab

Alternativ wird das Gerät wie folgt ermittelt:

grep -e rootfs_data /proc/mtd

Einrichten USB-Stick mit Ext4[Bearbeiten]

Nachdem ein USB-Stick angeschlossen wurde, ist dies in der Regel als /dev/sda1 ansprechbar. Dies kann mit dem Befehl block info überprüft werden.

Zunächst wird das Dateisystem Ext4 erzeugt (kann übersprungen werden, wenn auf dem USB-Stick bereits ein Ext4-Dateisystem eingerichtet ist):

DEVICE="/dev/sda1"
mkfs.ext4 ${DEVICE}

Die Einbindung über /etc/config/fstab wird über die UCI Schnittstelle gesteuert:

eval $(block info ${DEVICE} | grep -o -e "UUID=\S*")
uci -q delete fstab.overlay
uci set fstab.overlay="mount"
uci set fstab.overlay.uuid="${UUID}"
uci set fstab.overlay.target="/overlay"
uci commit fstab

Für das Kopieren der Daten wird das neue Dateisystem eingebunden:

mount ${DEVICE} /mnt

Einrichten USB-Stick mit Btrfs[Bearbeiten]

Das moderne Dateisystem BtrFS verfügt über einige interessante Eigenschaften. Unter anderem die Nutzung von Subvolumes und der Möglichkeit, Snapshots zu erstellen. BtrFS beherrscht auch Komprimierung. Allerdings wird dies von der eher leistungsschwachen CPU durchgeführt werden müssen. Zudem wird selbst bei einem USB-Stick mit 8GB ausreichend Speicherplatz für die Installation vieler Programme zur Verfügung gestellt.

Nachdem ein USB-Stick angeschlossen wurde, ist dies in der Regel als /dev/sda1 ansprechbar. Dies kann mit dem Befehl block info überprüft werden.

Zunächst wird das Dateisystem BtrFS erzeugt (kann übersprungen werden, wenn auf dem USB-Stick bereits ein BtrFS-Dateisystem eingerichtet ist):

DEVICE="/dev/sda1"
mkfs.btrfs -f ${DEVICE}

Die Option -f erzwingt das Formatieren, da ansonsten die Formatierung abgebrochen wird, wenn ein Dateisystem auf dem USB-Stick gefunden wird. Das neue Dateisystem wird eingebunden und ein Subvolume root eingerichtet:

mount ${DEVICE} /mnt
btrfs subvolume create /mnt/root
umount /mnt

Die Einbindung über /etc/config/fstab wird über die UCI Schnittstelle gesteuert:

eval $(block info ${DEVICE} | grep -o -e "UUID=\S*")
uci -q delete fstab.overlay
uci set fstab.overlay="mount"
uci set fstab.overlay.uuid="${UUID}"
uci set fstab.overlay.options="subvol=root"
uci set fstab.overlay.target="/overlay"
uci commit fstab

Für das Kopieren der Daten wird das neue Subvolumen eingebunden:

mount -o subvol=root ${DEVICE} /mnt

Kopieren der Daten[Bearbeiten]

Die Daten des Root-Dateisystem wird auf den neu formattierten USB-Stick kopiert:

cp -f -a /overlay/. /mnt
umount /mnt

Abschließen der Root-Erweiterung[Bearbeiten]

Letztlich muss der Router nur noch neu gestartet werden, um die Änderungen zu aktivieren:

reboot

Ausschalten einer SSID[Bearbeiten]

Für OpenWRT gibt es ein Paket, um WLAN als Ganzes ein- oder auszuschalten. Wurden mehrere WLAN-Netzwerke (SSID) eingerichtet, so können über die Methoden nur alle Netzwerke ein- oder ausgeschaltet werden.

Wenn für die Jugendlichen im Haus ein eigenes WLAN-Netzwerk Kids eingerichtet wurde, kann es gewünscht sein, dieses Netzwerk gerade zu Nachtzeiten auszuschalten, während das Netzwerk für die Eltern oder Heimautomation weiterhin erreichbar ist.

In der Luci-Oberfläche können einzelne SSID's mit dem Button disable in der Übersicht oder in der SSID-Konfiguration ausgeschaltet werden. Umgekehrt können diese SSID's auch wieder eingeschaltet werden. Ein Automatismus ist bisher nicht vorgesehen.

Über die Konsole können einzelne SSID's über das uci-System gesteuert werden; dies steht dann auch Skripten zur Verfügung. Dort sind die Einstellungen in einer Baumstruktur erreichbar. Für jede SSID wird ein Zeig unter wireless eingetragen, wobei die Bezeichnung nach dem Muster wifinetX verwendet wird. Anstelle des X steht eine Zahl, die beim Anlegen neuer SSID's hochgezählt wird. Im Zweig wireless.wifinetX.ssid steht die Bezeichnung des Netzwerkes (z.B. Kids). Eine SSID kann ausgeschaltet werden, indem der Zweig wireless.wifinetX.disabled auf den Wert 1 gesetzt wird. Ist dieser Wert nicht vorhanden, kann er einfach angelegt werden. Änderungen am uci-Baum müssen mit uci commit übernommen werden.

Nachdem über das uci-System eine SSID ausgeschaltet wurde, muss zusätzlich das WLAN mit dem Befehl wifi reload neu gestartet werden.

Ist die SSID Kids im uci-Baum unter wireless.wifinet2 eingetragen, wird diese SSID mit folgenden Befehlen ausgeschaltet:

uci set wireless.wifinet2.disabled = '1' # SSID ''Kids'' wird deaktiviert
uci commit wireless     # Änderung im uci wird übernommen
wifi reload             # Wifi wird neu gestartet, damit der Treiber die Änderungen sieht.

Für einzelne Zeitpunkte ist dies noch so umsetzbar, aber für eine Automation ist ein allgemeineres Skript wie das Folgende sinnvoll (entnommen von [2] und angepasst):

#!/bin/sh
Interface="$( uci show wireless | grep $1 | cut -d'=' -f1| cut -d\. -f1-2)"
if [ -z "$Interface" ]
then
  echo "SSID $1 not found."
else
  for i in ${Interface}; do
	  ucistring=$( echo "${i}.disabled" )
	  case $2 in
		off|Off|OFF|0) uci -q set ${ucistring}=1 ;;
		on|On|ON|1)    uci -q set ${ucistring}=0 ;;
	  esac
  done
  uci commit wireless
  wifi reload
fi

Das Skript erwartet zwei Parameter:

  1. SSID-Name des Netzwerk
  2. Neuer Status (einschalten oder ausschalten)

Wird das Skript unter /root/ssid_change.sh gespeichert, kann eine SSID mit /root/ssid_change.sh Kids 0/1 ein- oder ausgeschaltet werden. Sind im Router mehrere Interfaces verfügbar (z.B. für das 2,4GHz und 5GHz-Band), werden die SSID für beide Adapter geschaltet.

Im Crontab können neue Einträge wie folgt eingetragen werden, um das Netzwerk für Jugendliche über Nacht auszuschalten:

0 22 * * * /root/ssid_change.sh Kids 0
0 8 * * * /root/ssid_change.sh Kids 1

Referenzen[Bearbeiten]

  1. https://openwrt.org/docs/guide-user/additional-software/extroot_configuration
  2. https://forum.openwrt.org/t/switching-wlan-on-off-from-command-line/43259/4