I have two vdr instances running on the same machine, one for recording and
other for viewing. Then I wanted them to use the new vdr peer system to be
able to edit timers from the viewing side.
Running two vdr's didn't work because they both want to bind the 6419 port, so
I made a work-around with network namespaces like this:
First, a helper script to create a network namespace if not already created
and run a command there:
/usr/local/sbin/Nsenter_vdr2
----------------------------------------
#!/bin/bash
mp=/home/vdr/vdr2/netns
addr=192.168.8.2/24
gw=192.168.8.1
if ! mountpoint -q $mp ; then
unshare --net=$mp true || exit 1
ip link add vdr2eth type veth peer name eth0 netns $mp
nsenter --net=$mp sh -c "ip link set eth0 up \
&& ip a add $addr dev eth0 \
&& ip link set lo up \
&& ip -4 route add default via $gw"
fi
if test -n "$SUDO_USER" -a "$SUDO_USER" != root ; then
exec nsenter --net=$mp sudo -u "$SUDO_USER" "$@"
else
exec nsenter --net=$mp "$@"
fi
----------------------------------------
The name space mount point is a reqular file (empty) and not a directory.
Nsenter script creates a veth pair named vdr2eth on the outside and eth0
inside.
I used /etc/network/interfaces to set vdr2eth address, but it coud be done in
the Nsenter script too.
allow-hotplug vdr2eth
iface vdr2eth inet static
address 192.168.8.1
netmask 255.255.255.0
Then I run the recording instance of vdr normally on the outside and add
permissions for 192.168.8.2 in svdrphosts and streamdevhosts.
Viewing vdr is run in the network namespace something like this:
#!/bin/bash
if test "$1" = "nsentered" ; then
shift
exec vdr -D- "-Psofthddevice -f" -i 1 -Pstreamdev-client "$@"
exit 1
fi
while true ; do
sudo Nsenter_vdr2 "$0" nsentered "$@"
done
I don't need to peer the viewing vdr to other computers in the local network.
If that were the case, then the outside end of the veth pair would need to be
bridged with the physical network card of the machine.