On Tue, Jan 29, 2013 at 1:57 PM, Canek Peláez Valdés <can...@gmail.com> wrote:
> On Tue, Jan 29, 2013 at 10:32 AM, Stefan G. Weichinger <li...@xunil.at> wrote:
>> Am 28.01.2013 22:49, schrieb Stefan G. Weichinger:
>>
>>>>> ps: my bigger hurdle will be the bridging-setup for running
>>>>> KVM-virtualization. This was one of the reasons to go back to openrc
>>>>> back then.
>>>>
>>>> I have no experience with that, but if it works in OpenRC it should
>>>> work in systemd. Probably better, even.
>>>
>>> I don't think it won't work, I just wonder how to do it in the right and
>>> most efficient way. I will think about that later/tomorrow maybe,
>>> already late here ...
>>
>> I have a *draft* here for bridge.service ... I used the init.d-script
>> from here as a template:
>>
>> http://en.gentoo-wiki.com/wiki/KVM#Script_to_ease_the_configuration
>>
>> (I used a variation of that as /etc/init.d/kvm for long now)
>>
>> My service-file reads variables from a separated configfile:
>>
>> # cat /etc/conf.d/network_systemd
>> interface=eth0
>> address=172.32.99.12
>> netmask=255.255.255.0
>> broadcast=172.32.99.255
>> gateway=172.32.99.250
>> bridge_name=br0
>> tap_name=qtap0
>> user=sgw
>>
>>
>> and it currently looks like this:
>>
>> # cat /etc/systemd/system/bridge.service
>> [Unit]
>> Description=network bridge for KVM
>> After=network.target
>>
>> [Service]
>> Type=oneshot
>> RemainAfterExit=yes
>>
>> EnvironmentFile=/etc/conf.d/network_systemd
>>
>> ExecStart=/sbin/brctl addbr ${bridge_name}
>> ExecStart=/usr/bin/tunctl -b -u ${user} -t ${tap_name}
>> ExecStart=/bin/ifconfig ${bridge_name} ${address} netmask ${netmask} up
>> ExecStart=/bin/ifconfig ${interface} up
>> ExecStart=/bin/ifconfig ${tap_name} up 0.0.0.0 promisc
>> ExecStart=/sbin/brctl addif ${bridge_name} ${tap_name} ${interface}
>> ExecStart=/sbin/sysctl net.ipv4.conf.${bridge_name}.forwarding=1
>> ExecStart=iptables -t nat -A POSTROUTING -o ${interface} -j MASQUERADE
>> ExecStart=/bin/ip route add default via ${gateway}
>>
>> ExecStop=/bin/ip route del default via ${gateway}
>> ExecStop=/sbin/sysctl net.ipv4.conf.${bridge_name}.forwarding=0
>> ExecStop=/bin/ifconfig ${tap_name} down
>> ExecStop=/sbin/brctl delif ${bridge_name} ${tap_name}
>> ExecStop=/usr/bin/tunctl -d ${tap_name}
>> ExecStop=/bin/ifconfig ${bridge_name} down
>> ExecStop=/bin/ifconfig ${interface} down
>> ExecStop=/sbin/brctl delbr ${bridge_name}
>> ExecStop=iptables -t nat -D POSTROUTING -o ${interface} -j MASQUERADE
>>
>> [Install]
>> WantedBy=multi-user.target
>>
>> ----------
>>
>> I disabled network.service and enabled bridge.service, works fine so
>> far, I already tested connectivity from KVM-VMs.
>>
>> I am sure that this quite fresh and bloody, suggestions welcome as
>> always ...
>
> If it works, it works. It just looks... wrong :D
>
> If you really need so much commands from your unit, you can use a script:
>
> ------------------------------------------------------------------------
> $ cat /usr/local/bin/kvm-brigdge
> #!/bin/sh
>
> source /etc/conf.d/network_systemd
>
> case "${1}" in
>     start)
>         /sbin/brctl addbr ${bridge_name}
>         /usr/bin/tunctl -b -u ${user} -t ${tap_name}
>         /bin/ifconfig ${bridge_name} ${address} netmask ${netmask} up
>         /bin/ifconfig ${interface} up
>         /bin/ifconfig ${tap_name} up 0.0.0.0 promisc
>         /sbin/brctl addif ${bridge_name} ${tap_name} ${interface}
>         /sbin/sysctl net.ipv4.conf.${bridge_name}.forwarding=1
>         iptables -t nat -A POSTROUTING -o ${interface} -j MASQUERADE
>         /bin/ip route add default via ${gateway}
>         ;;
>     stop)
>         /bin/ip route del default via ${gateway}
>         /sbin/sysctl net.ipv4.conf.${bridge_name}.forwarding=0
>         /bin/ifconfig ${tap_name} down
>         /sbin/brctl delif ${bridge_name} ${tap_name}
>         /usr/bin/tunctl -d ${tap_name}
>         /bin/ifconfig ${bridge_name} down
>         /bin/ifconfig ${interface} down
>         /sbin/brctl delbr ${bridge_name}
>         iptables -t nat -D POSTROUTING -o ${interface} -j MASQUERADE
>         ;;
> esac
>
> ------------------------------------------------------------------------
> $ cat /etc/systemd/system/kvm-bridge.service
> [Unit]
> Description=network bridge for KVM
> After=network.target
>
> [Service]
> Type=oneshot
> RemainAfterExit=yes
>
> ExecStart=/usr/local/bin/kvm-brigdge start
> ExecStop=/usr/local/bin/kvm-brigdge stop
>
> [Install]
> WantedBy=multi-user.target
>
> As I have been saying all this years: that systemd can work without
> using scripts, doesn't mean that it isn't able to use them. I use a
> couple of them myself; I think this is a perfect example of one. Your
> unit file then it's small and simple, as all of them should be.
>
> Remember that /usr/local/bin/kvm-brigdge needs to be executable.

I'll note that in your version, you're ignoring the exit statuses of
each of those commands. From a correctness standpoint, I prefer
Stefan's version.

--
:wq

Reply via email to