Re: [systemd-devel] Question about changing systemd target during boot
Am Mon, 1 Aug 2016 16:09:36 +0300 schrieb Svetoslav Iliev: > Hi guys, > > Thank you for the prompt reply and your valuable input. Just to let > you know - I was able to do exactly what I intended. As it turns out > my mistake was indeed creating contradiction between the WantedBy and > After sections. Once I introduced a new "change.target" and adjusted > my services accordingly I was able to isolate successfully either A > or B targets during boot. > > I also had to split the services in two: one main blocking of type > oneshot and one non-blocking of simple type just to switch the > target. As it seems I cannot call systemctl isolate from onehost type > of service. Wouldn't it be easier to simply make your change.target the default boot target, depending on network-online.target and a service to start the target you need instead of isolate? Otherwise multi-user.target starts services you are going to stop just a blink later by using isolate. > I just like to say that I followed this guide: > https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget where > I quote "/Alternatively, you can change your service that needs the > network to be up, to include After=network-online.target and > Wants=network-online.target./" > > Once again thanks all for the help. > > --- > BR, > > Swetli > > On 08/01/2016 03:38 PM, Andrei Borzenkov wrote: > > On Mon, Aug 1, 2016 at 2:43 PM, Michael Chapman > > wrote: > >> On Mon, 1 Aug 2016, Andrei Borzenkov wrote: > [...] > [...] > [...] > [...] > [...] > [...] > >> > >> I just checked the code, and it looks like systemd explicitly > >> *skips* these default dependencies if they would create a loop. In > >> target_add_default_dependencies: > >> > > Yes, of course. It is also described in manual. But the question is > > what user actually intended? It is more topic of good design. > > ___ > > systemd-devel mailing list > > systemd-devel@lists.freedesktop.org > > https://lists.freedesktop.org/mailman/listinfo/systemd-devel > > -- Regards, Kai Replies to list-only preferred. ___ systemd-devel mailing list systemd-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/systemd-devel
Re: [systemd-devel] Question about changing systemd target during boot
Hi guys, Thank you for the prompt reply and your valuable input. Just to let you know - I was able to do exactly what I intended. As it turns out my mistake was indeed creating contradiction between the WantedBy and After sections. Once I introduced a new "change.target" and adjusted my services accordingly I was able to isolate successfully either A or B targets during boot. I also had to split the services in two: one main blocking of type oneshot and one non-blocking of simple type just to switch the target. As it seems I cannot call systemctl isolate from onehost type of service. I just like to say that I followed this guide: https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget where I quote "/Alternatively, you can change your service that needs the network to be up, to include After=network-online.target and Wants=network-online.target./" Once again thanks all for the help. --- BR, Swetli On 08/01/2016 03:38 PM, Andrei Borzenkov wrote: On Mon, Aug 1, 2016 at 2:43 PM, Michael Chapmanwrote: On Mon, 1 Aug 2016, Andrei Borzenkov wrote: On Mon, Aug 1, 2016 at 2:23 PM, Michael Chapman wrote: On Mon, 1 Aug 2016, Andrei Borzenkov wrote: [...] So here goes what I've done: 1. Create a service and put it in the network-online.target: /etc/systemd/system/change-target.service: [Unit] Description=Change Target Wants=network-online.target After=network-online.target [Service] Type=oneshot ExecStart=/tmp/script.sh TimeoutSec=60s [Install] WantedBy=network-online.target This unit have conflicting requirements - on one hand it is After=network-online.target, OTOH WantedBy=network-online.target implies Before=network-online.target. I've seen this asserted on this list a few times, but as far as I can tell it isn't actually correct. After/Before are meant to be completely orthogonal to Wants/Requires/etc., according to the documentation. Unless DefaultDependencies= is set to no in either of releated units or an explicit ordering dependency is already defined, target units will implicitly complement all configured dependencies of type Wants= or Requires= with dependencies of type After=. man systemd.target I just checked the code, and it looks like systemd explicitly *skips* these default dependencies if they would create a loop. In target_add_default_dependencies: Yes, of course. It is also described in manual. But the question is what user actually intended? It is more topic of good design. ___ systemd-devel mailing list systemd-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/systemd-devel ___ systemd-devel mailing list systemd-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/systemd-devel
Re: [systemd-devel] Question about changing systemd target during boot
On Mon, Aug 1, 2016 at 2:43 PM, Michael Chapmanwrote: > On Mon, 1 Aug 2016, Andrei Borzenkov wrote: >> >> On Mon, Aug 1, 2016 at 2:23 PM, Michael Chapman >> wrote: >>> >>> On Mon, 1 Aug 2016, Andrei Borzenkov wrote: >>> [...] > > > So here goes what I've done: > > 1. Create a service and put it in the network-online.target: > > /etc/systemd/system/change-target.service: > [Unit] > Description=Change Target > Wants=network-online.target > After=network-online.target > > [Service] > Type=oneshot > ExecStart=/tmp/script.sh > TimeoutSec=60s > > [Install] > WantedBy=network-online.target > This unit have conflicting requirements - on one hand it is After=network-online.target, OTOH WantedBy=network-online.target implies Before=network-online.target. >>> >>> >>> >>> I've seen this asserted on this list a few times, but as far as I can >>> tell >>> it isn't actually correct. After/Before are meant to be completely >>> orthogonal to Wants/Requires/etc., according to the documentation. >>> >> >> Unless DefaultDependencies= is set to no in either of releated units >> or an explicit ordering dependency is already defined, target units >> will implicitly complement all configured dependencies of type Wants= >> or Requires= with dependencies of type After=. >> >> man systemd.target > > > I just checked the code, and it looks like systemd explicitly *skips* > these default dependencies if they would create a loop. In > target_add_default_dependencies: > Yes, of course. It is also described in manual. But the question is what user actually intended? It is more topic of good design. ___ systemd-devel mailing list systemd-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/systemd-devel
Re: [systemd-devel] Question about changing systemd target during boot
On Mon, 1 Aug 2016, Andrei Borzenkov wrote: On Mon, Aug 1, 2016 at 2:23 PM, Michael Chapmanwrote: On Mon, 1 Aug 2016, Andrei Borzenkov wrote: [...] So here goes what I've done: 1. Create a service and put it in the network-online.target: /etc/systemd/system/change-target.service: [Unit] Description=Change Target Wants=network-online.target After=network-online.target [Service] Type=oneshot ExecStart=/tmp/script.sh TimeoutSec=60s [Install] WantedBy=network-online.target This unit have conflicting requirements - on one hand it is After=network-online.target, OTOH WantedBy=network-online.target implies Before=network-online.target. I've seen this asserted on this list a few times, but as far as I can tell it isn't actually correct. After/Before are meant to be completely orthogonal to Wants/Requires/etc., according to the documentation. Unless DefaultDependencies= is set to no in either of releated units or an explicit ordering dependency is already defined, target units will implicitly complement all configured dependencies of type Wants= or Requires= with dependencies of type After=. man systemd.target I just checked the code, and it looks like systemd explicitly *skips* these default dependencies if they would create a loop. In target_add_default_dependencies: /* Imply ordering for requirement dependencies on target * units. Note that when the user created a contradicting * ordering manually we won't add anything in here to make * sure we don't create a loop. */ - Michael ___ systemd-devel mailing list systemd-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/systemd-devel
Re: [systemd-devel] Question about changing systemd target during boot
On Mon, 1 Aug 2016, Andrei Borzenkov wrote: [...] So here goes what I've done: 1. Create a service and put it in the network-online.target: /etc/systemd/system/change-target.service: [Unit] Description=Change Target Wants=network-online.target After=network-online.target [Service] Type=oneshot ExecStart=/tmp/script.sh TimeoutSec=60s [Install] WantedBy=network-online.target This unit have conflicting requirements - on one hand it is After=network-online.target, OTOH WantedBy=network-online.target implies Before=network-online.target. I've seen this asserted on this list a few times, but as far as I can tell it isn't actually correct. After/Before are meant to be completely orthogonal to Wants/Requires/etc., according to the documentation. If A.service has: Wants=B.service Before=B.service then any time you ask A.service to be started, systemd will add a job to start B.service... but it still ensures that A.service is started *before* B.service. Is my understanding on this incorrect? I have been making use of this behaviour for quite some time, and as far as I can tell it has never failed. - Michael ___ systemd-devel mailing list systemd-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/systemd-devel
Re: [systemd-devel] Question about changing systemd target during boot
On Mon, Aug 1, 2016 at 2:23 PM, Michael Chapmanwrote: > On Mon, 1 Aug 2016, Andrei Borzenkov wrote: > [...] >>> >>> So here goes what I've done: >>> >>> 1. Create a service and put it in the network-online.target: >>> >>> /etc/systemd/system/change-target.service: >>> [Unit] >>> Description=Change Target >>> Wants=network-online.target >>> After=network-online.target >>> >>> [Service] >>> Type=oneshot >>> ExecStart=/tmp/script.sh >>> TimeoutSec=60s >>> >>> [Install] >>> WantedBy=network-online.target >>> >> >> This unit have conflicting requirements - on one hand it is >> After=network-online.target, OTOH WantedBy=network-online.target >> implies Before=network-online.target. > > > I've seen this asserted on this list a few times, but as far as I can tell > it isn't actually correct. After/Before are meant to be completely > orthogonal to Wants/Requires/etc., according to the documentation. > Unless DefaultDependencies= is set to no in either of releated units or an explicit ordering dependency is already defined, target units will implicitly complement all configured dependencies of type Wants= or Requires= with dependencies of type After=. man systemd.target > If A.service has: > > Wants=B.service > Before=B.service > > then any time you ask A.service to be started, systemd will add a job to > start B.service... but it still ensures that A.service is started *before* > B.service. > > Is my understanding on this incorrect? I have been making use of this > behaviour for quite some time, and as far as I can tell it has never failed. > > - Michael ___ systemd-devel mailing list systemd-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/systemd-devel
Re: [systemd-devel] Question about changing systemd target during boot
On Mon, Aug 1, 2016 at 12:27 PM, Svetoslav Ilievwrote: > Hi all, > > I've been recently searching through internet for a possible solution for > this but so far without success and I'm still not sure if it is even > possible. Basically what I'm trying to do: > > During system boot, after the network-online target I want to execute a > script which changes the current target ( or put simply just to boot in > another target, not in the default multi-user.target). > > So here goes what I've done: > > 1. Create a service and put it in the network-online.target: > > /etc/systemd/system/change-target.service: > [Unit] > Description=Change Target > Wants=network-online.target > After=network-online.target > > [Service] > Type=oneshot > ExecStart=/tmp/script.sh > TimeoutSec=60s > > [Install] > WantedBy=network-online.target > This unit have conflicting requirements - on one hand it is After=network-online.target, OTOH WantedBy=network-online.target implies Before=network-online.target. Systemd breaks cycle here, but what is correct? Also network-online.target is intended to be passive, not pulling anything, rather being pulled by other units. > 2. Create two new targets: > /etc/systemd/system/a.target: > [Unit] > Description=A Target > Requires=multi-user.target > After=multi-user.target > AllowIsolate=yes > Conflicts=b.target > > /etc/systemd/system/b.target: > [Unit] > Description=B Target > Requires=multi-user.target > After=multi-user.target > AllowIsolate=yes > Conflicts=a.target > > 3. The contents of script.sh > blah blah: do some work and based on that do either > systemctl isolate a.target || systemctl isolate b.target > > Note I've also edited the multi-user.target to depend on the the > change-target.service by putting the latter in the former's wants and after > sections. I've tried many things and every time it failed. The problem is > that the systemd should "wait" for the execution of script.sh before > continuing with the boot process. > This is virtually impossible currently. Nor is this requirement clear. If systemd is as far as networking large part of startup sequence is already processed. So how exactly you define units that can be started before your switch and units that must wait? > The question is - is what I'm trying to achieve even possible or systemd > should boot in a certain target before changing to another one ? If possible > please advise what I'm doing wrong since I'm pretty lost.. > > --- > BR, > > Swetli > > > ___ > systemd-devel mailing list > systemd-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/systemd-devel > ___ systemd-devel mailing list systemd-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/systemd-devel