[Buildroot] [PATCH 3/3] eudev: generate hwdb.bin at system startup

Carlos Santos casantos at datacom.com.br
Mon Oct 15 20:09:54 UTC 2018


> From: "Matthew Weber" <matthew.weber at rockwellcollins.com>
> To: "Carlos Santos" <casantos at datacom.ind.br>
> Cc: "buildroot" <buildroot at buildroot.org>, "Bernd Kuhls" <bernd.kuhls at t-online.de>, "Eric Le Bihan"
> <eric.le.bihan.dev at free.fr>, "Yann Morin" <yann.morin.1998 at free.fr>
> Sent: Monday, October 15, 2018 4:55:51 PM
> Subject: Re: [Buildroot] [PATCH 3/3] eudev: generate hwdb.bin at system startup

> Carlos, Yann,
> 
> On Mon, Oct 15, 2018 at 2:43 PM Carlos Santos <casantos at datacom.ind.br> wrote:
>>
>> Programs that use libudev (e.g. lsusb, from usbutils) need the hwdb.bin
>> file to work properly.
>>
>> If BR2_PACKAGE_EUDEV_ENABLE_HWDB is selected then the eudev installation
>> populates /etc/udev/hwdb.d/ but does not genarete /etc/udev/hwdb.bin. It
>> must be created running "udevadm hwdb --update" on the target device but
>> this does not work on with read-only /etc, so we need these changes:
>>
>> - Add the BR2_PACKAGE_EUDEV_HWDB_BIN_PATH config, allowing the user to
>>   set the location of hwdb.bin.
>> - Patch the configuration script, allowing to set the hwdb.bin path by
>>   means of an environment variable (udevhwdbbinpath).
>> - Pass the value set in BR2_PACKAGE_EUDEV_HWDB_BIN_PATH to the configure
>>   script by means of the udevhwdbbinpath variable.
>> - Make the S10udev init script run "udevadm hwdb --update" to recreate
>>   hwdb.bin or print an error message if the operation fails (e.g. no
>>   write permission on the filesystem).
>>
> 
> (aarch qemu target)
> Tested-by: Matt Weber <matthew.weber at rockwellcollins.com>
> 
>> Signed-off-by: Carlos Santos <casantos at datacom.ind.br>
>> ---
>>  package/eudev/Config.in |  9 +++++++++
>>  package/eudev/S10udev   |  8 +++++++-
>>  package/eudev/eudev.mk  | 13 ++++++++++++-
>>  3 files changed, 28 insertions(+), 2 deletions(-)
>>
>> diff --git a/package/eudev/Config.in b/package/eudev/Config.in
>> index 2220265a55..a589a14af3 100644
>> --- a/package/eudev/Config.in
>> +++ b/package/eudev/Config.in
>> @@ -32,6 +32,15 @@ config BR2_PACKAGE_EUDEV_ENABLE_HWDB
>>         help
>>           Enables hardware database installation to /etc/udev/hwdb.d
>>
>> +config BR2_PACKAGE_EUDEV_HWDB_BIN_PATH
> 
> Should this depend on BR2_PACKAGE_EUDEV_ENABLE_HWDB?  What does it do
> if you don't enable this option or have a write-able location for the
> .bin?
> 
>> +       string "hwdb.bin path"
>> +       default "/etc/udev/hwdb.bin"
>> +       help
>> +         Location of the hwdb.bin file, which is re-generated at system
>> +         startup. The default is /etc/udev/hwdb.bin but you may want to
>> +         move it elsewhere (e.g. /var/run/udev/hwdb.bin) if /etc is in
>> +         a read-only filesystem.
>> +
>>  endif
>>
>>  comment "eudev needs eudev /dev management"
>> diff --git a/package/eudev/S10udev b/package/eudev/S10udev
>> index 640fec625b..026ab6ae49 100755
>> --- a/package/eudev/S10udev
>> +++ b/package/eudev/S10udev
>> @@ -25,14 +25,20 @@ UDEV_CONFIG=/etc/udev/udev.conf
> 
> This section of the patch no-longer applies (cosmetic changes required).

I will update the patch accordingly.

>>  test -r $UDEV_CONFIG || exit 6
>>  . $UDEV_CONFIG
>>
>> +UDEV_HWDB_BIN=%%UDEV_HWDB_BIN%%
>> +
>>  case "$1" in
>>      start)
>>          printf "Populating %s using udev: " "${udev_root:-/dev}"
>>          printf '\000\000\000\000' > /proc/sys/kernel/hotplug
>>          $UDEV_BIN -d || { echo "FAIL"; exit 1; }
>> +        echo "done"
>>          udevadm trigger --type=subsystems --action=add
>>          udevadm trigger --type=devices --action=add
>> -        udevadm settle --timeout=30 || echo "udevadm settle failed"
>> +        udevadm settle --timeout=30 || { echo "udevadm settle failed" && exit
>> 1; }
>> +        echo "done"
>> +        printf "Compiling hardware database information $UDEV_HWDB_BIN: "
>> +        udevadm hwdb --update || { echo "FAIL" && exit 1; }
> 
> Yann had a good point on IRC, this probably could be prebuild offline.

Does "offline" mean "at build time" or "asynchronous to the initialization"?

>>          echo "done"
>>          ;;
>>      stop)
>> diff --git a/package/eudev/eudev.mk b/package/eudev/eudev.mk
>> index d08b9bb0c9..25745008d2 100644
>> --- a/package/eudev/eudev.mk
>> +++ b/package/eudev/eudev.mk
>> @@ -47,8 +47,19 @@ else
>>  EUDEV_CONF_OPTS += --disable-selinux
>>  endif
>>
>> +define EUDEV_POST_PATCH
>> +       $(SED)
>> 's,$${udevconfdir}/hwdb.bin,$${udevhwdbbinpath:-$${udevconfdir}/hwdb.bin},' \
>> +               $(@D)/configure
>> +endef
>> +EUDEV_POST_PATCH_HOOKS += EUDEV_POST_PATCH
>> +
>> +EUDEV_CONF_ENV += udevhwdbbinpath=$(BR2_PACKAGE_EUDEV_HWDB_BIN_PATH)
>> +
>>  define EUDEV_INSTALL_INIT_SYSV
>> -       $(INSTALL) -D -m 0755 package/eudev/S10udev
>> $(TARGET_DIR)/etc/init.d/S10udev
>> +       $(INSTALL) -D -m 0755 package/eudev/S10udev \
>> +               $(TARGET_DIR)/etc/init.d/S10udev
>> +       $(SED) 's,%%UDEV_HWDB_BIN%%,$(BR2_PACKAGE_EUDEV_HWDB_BIN_PATH),' \
>> +               $(TARGET_DIR)/etc/init.d/S10udev
> 
> Instead of a SED approach, could we add a /etc/defaults/udev cfg file
> instead and just set the value in that file if present.  Otherwise
> default the value?  (Like what was done in the recent S01logging
> suggested updates).

I like this approach. I will update the patch to implement it.

-- 
Carlos Santos (Casantos) - DATACOM, P&D
“Marched towards the enemy, spear upright, armed with the certainty
that only the ignorant can have.” — Epitaph of a volunteer



More information about the buildroot mailing list