[yocto] systemd - how do I wait for a driver to load?

Chris Tapp opensource at keylevel.com
Thu Aug 28 13:57:05 PDT 2014


On 28 Aug 2014, at 20:51, Sven Ebenfeld <sven.ebenfeld at gmail.com> wrote:

> Am 28.08.2014 18:57, schrieb Chris Tapp:
>> 
>> On 27 Aug 2014, at 08:46, Sven Ebenfeld <sven.ebenfeld at gmail.com> wrote:
>>> Am 26.08.2014 22:51, schrieb Chris Tapp:
>>>> On 26 Aug 2014, at 21:02, Sven Ebenfeld <sven.ebenfeld at gmail.com> wrote:
>>>> 
>>>>> You should look at  "ConditionPathExists=" Options of systemd-units.
>>>> 
>>>> Thanks, that looks like it would do the job. I was hoping not to hard code paths as they may change if a configuration file is changed, but...
>>>> 
>>>>> Otherwise if udev is loading your device module, you could add the
>>>>> device-unit to "Requires=" option.
>>>> 
>>>> This sounds better. Is there an easy way to tell if udev did load the module? There's nothing obvious in the syslog.
>>> 
>>> If you didn't load the module by hand it's probably udev. If you didn't
>>> run modprobe or insmod. Then you should try to create a device-unit for
>>> the device.
>>> 
>>> For /dev/dvb/adaptor the unit should probably be something like
>>> dev-dvb-adaptor.device .
>> 
>> Thanks. I've now got a udev rule firing when the device loads.
>> 
>> I'm using this to create a device alias (SYMLINK) so I can get consistent names, and this is working great.
>> 
>> I've added TAG+="systemd" to the rule and I'm getting a .device generated automatically when the driver loads. However, the name for this isn't friendly (lots of bus id components). Is there a way to create my own name as my service doesn't want to know where the device is on the bus?
>> 
>> I've tried adding something like ENV{SYSTEMD_WANTS}="some-new-name.device" - this also gets created, but it never becomes active (and can't be manually started).
>> 
> 
> There should be an option like SYSTEMD_ALIAS in udev database. I haven't
> used it yet, but I think it should help out here.
> 
> http://www.freedesktop.org/software/systemd/man/systemd.device.html
> describes it as "SYSTEMD_ALIAS= Adds an additional alias name to the
> device unit. This must be an absolute path that is automatically
> transformed into a unit name. (See above.)"

My original attempt is now working - I just had a typo in the dynamic .device name where it was referenced in the .service :-(

So, assigning a SYMLINK to the udev rule and adding the "systemd" tag dynamically creates a device unit with a name of SYMLINK.device (which makes sense).

The service then "BindsTo" to this device and runs "After" it is ready.

Thanks for your help in getting this going :-)

> Am 26.08.2014 21:52, schrieb Chris Tapp:
>>>>>> I've got a service running under systemd that will only start once a kernel module has loaded and created its /dev/dvb/adaptor nodes.
>>>>>> 
>>>>>> Unfortunately, it doesn't load until after the service has failed and gone into an error state due to too many restarts.
>>>>>> 
>>>>>> I could "fix" this by increasing the restart interval, but is there a way of adding a dependancy on the kernel module?

--

Chris Tapp
opensource at keylevel.com
www.keylevel.com







More information about the yocto mailing list