bluez5: install /var/lib/bluetooth directory

Message ID 20220408081533.1705128-1-yi.zhao@windriver.com
State New
Headers show
Series bluez5: install /var/lib/bluetooth directory | expand

Commit Message

Yi Zhao April 8, 2022, 8:15 a.m. UTC
There is a bluetooth service startup failure:
bluetooth.service: Failed at step NAMESPACE spawning /usr/libexec/bluetooth/bluetoothd: No such file or directory
bluetooth.service: Failed to set up mount namespacing: /run/systemd/unit-root/var/lib/bluetooth: No such file or directory

This is because the directory /var/lib/bluetooth has been listed in
ReadWritePaths= in the service unit file but does not exist. We need to
create it before service startup.

Signed-off-by: Yi Zhao <yi.zhao@windriver.com>
---
 meta/recipes-connectivity/bluez5/bluez5.inc | 2 ++
 1 file changed, 2 insertions(+)

Comments

Stefan Herbrechtsmeier April 8, 2022, 8:34 a.m. UTC | #1
Am 08.04.2022 um 10:15 schrieb Yi Zhao via lists.openembedded.org:
> There is a bluetooth service startup failure:
> bluetooth.service: Failed at step NAMESPACE spawning /usr/libexec/bluetooth/bluetoothd: No such file or directory
> bluetooth.service: Failed to set up mount namespacing: /run/systemd/unit-root/var/lib/bluetooth: No such file or directory
> 
> This is because the directory /var/lib/bluetooth has been listed in
> ReadWritePaths= in the service unit file but does not exist. We need to
> create it before service startup.
> 
> Signed-off-by: Yi Zhao <yi.zhao@windriver.com>
> ---
>   meta/recipes-connectivity/bluez5/bluez5.inc | 2 ++
>   1 file changed, 2 insertions(+)
> 
> diff --git a/meta/recipes-connectivity/bluez5/bluez5.inc b/meta/recipes-connectivity/bluez5/bluez5.inc
> index 79d4645ca8..ee2cdbcc59 100644
> --- a/meta/recipes-connectivity/bluez5/bluez5.inc
> +++ b/meta/recipes-connectivity/bluez5/bluez5.inc
> @@ -102,6 +102,8 @@ do_install:append() {
>   	# Patch python tools to use Python 3; they should be source compatible, but
>   	# still refer to Python 2 in the shebang
>   	sed -i -e '1s,#!.*python.*,#!${bindir}/python3,' ${D}${libdir}/bluez/test/*
> +
> +	install -d ${D}${localstatedir}/lib/bluetooth

Please use systemd StateDirectory= [1]. Maybe it is reasonable to 
replace the ReadWritePaths= with StateDirectory=.

[1] 
https://www.freedesktop.org/software/systemd/man/systemd.exec.html#RuntimeDirectory=
Yi Zhao April 8, 2022, 9:23 a.m. UTC | #2
On 4/8/22 16:34, Stefan Herbrechtsmeier wrote:
> Am 08.04.2022 um 10:15 schrieb Yi Zhao via lists.openembedded.org:
>> There is a bluetooth service startup failure:
>> bluetooth.service: Failed at step NAMESPACE spawning 
>> /usr/libexec/bluetooth/bluetoothd: No such file or directory
>> bluetooth.service: Failed to set up mount namespacing: 
>> /run/systemd/unit-root/var/lib/bluetooth: No such file or directory
>>
>> This is because the directory /var/lib/bluetooth has been listed in
>> ReadWritePaths= in the service unit file but does not exist. We need to
>> create it before service startup.
>>
>> Signed-off-by: Yi Zhao <yi.zhao@windriver.com>
>> ---
>>   meta/recipes-connectivity/bluez5/bluez5.inc | 2 ++
>>   1 file changed, 2 insertions(+)
>>
>> diff --git a/meta/recipes-connectivity/bluez5/bluez5.inc 
>> b/meta/recipes-connectivity/bluez5/bluez5.inc
>> index 79d4645ca8..ee2cdbcc59 100644
>> --- a/meta/recipes-connectivity/bluez5/bluez5.inc
>> +++ b/meta/recipes-connectivity/bluez5/bluez5.inc
>> @@ -102,6 +102,8 @@ do_install:append() {
>>       # Patch python tools to use Python 3; they should be source 
>> compatible, but
>>       # still refer to Python 2 in the shebang
>>       sed -i -e '1s,#!.*python.*,#!${bindir}/python3,' 
>> ${D}${libdir}/bluez/test/*
>> +
>> +    install -d ${D}${localstatedir}/lib/bluetooth
>
> Please use systemd StateDirectory= [1]. Maybe it is reasonable to 
> replace the ReadWritePaths= with StateDirectory=.
>
> [1] 
> https://www.freedesktop.org/software/systemd/man/systemd.exec.html#RuntimeDirectory=


Thanks Stefank, but the ReadWritePaths= is set by bluez:

https://github.com/bluez/bluez/commit/442d211b5f30f00d5ddd69b43385a03c1428ac45


//Yi
Stefan Herbrechtsmeier April 8, 2022, 10:51 a.m. UTC | #3
Am 08.04.2022 um 11:23 schrieb Yi Zhao:
> 
> On 4/8/22 16:34, Stefan Herbrechtsmeier wrote:
>> Am 08.04.2022 um 10:15 schrieb Yi Zhao via lists.openembedded.org:
>>> There is a bluetooth service startup failure:
>>> bluetooth.service: Failed at step NAMESPACE spawning 
>>> /usr/libexec/bluetooth/bluetoothd: No such file or directory
>>> bluetooth.service: Failed to set up mount namespacing: 
>>> /run/systemd/unit-root/var/lib/bluetooth: No such file or directory
>>>
>>> This is because the directory /var/lib/bluetooth has been listed in
>>> ReadWritePaths= in the service unit file but does not exist. We need to
>>> create it before service startup.
>>>
>>> Signed-off-by: Yi Zhao <yi.zhao@windriver.com>
>>> ---
>>>   meta/recipes-connectivity/bluez5/bluez5.inc | 2 ++
>>>   1 file changed, 2 insertions(+)
>>>
>>> diff --git a/meta/recipes-connectivity/bluez5/bluez5.inc 
>>> b/meta/recipes-connectivity/bluez5/bluez5.inc
>>> index 79d4645ca8..ee2cdbcc59 100644
>>> --- a/meta/recipes-connectivity/bluez5/bluez5.inc
>>> +++ b/meta/recipes-connectivity/bluez5/bluez5.inc
>>> @@ -102,6 +102,8 @@ do_install:append() {
>>>       # Patch python tools to use Python 3; they should be source 
>>> compatible, but
>>>       # still refer to Python 2 in the shebang
>>>       sed -i -e '1s,#!.*python.*,#!${bindir}/python3,' 
>>> ${D}${libdir}/bluez/test/*
>>> +
>>> +    install -d ${D}${localstatedir}/lib/bluetooth
>>
>> Please use systemd StateDirectory= [1]. Maybe it is reasonable to 
>> replace the ReadWritePaths= with StateDirectory=.
>>
>> [1] 
>> https://www.freedesktop.org/software/systemd/man/systemd.exec.html#RuntimeDirectory= 
>>
> 
> 
> Thanks Stefank, but the ReadWritePaths= is set by bluez:
> 
> https://github.com/bluez/bluez/commit/442d211b5f30f00d5ddd69b43385a03c1428ac45

And who creates the directory before the patch?

The systemd solution to create a state directory is StateDirectory= (or 
tmpfiles.d for older versions of systemd). Systemd supports stateless 
system [1] and therefore every service must work with an empty /var/lib.

This patch hide a bug in bluez and the problem should be fixed in bluez.

[1] https://0pointer.net/blog/projects/stateless.html
Yi Zhao April 8, 2022, 11:01 a.m. UTC | #4
On 4/8/22 18:51, Stefan Herbrechtsmeier wrote:
> Am 08.04.2022 um 11:23 schrieb Yi Zhao:
>>
>> On 4/8/22 16:34, Stefan Herbrechtsmeier wrote:
>>> Am 08.04.2022 um 10:15 schrieb Yi Zhao via lists.openembedded.org:
>>>> There is a bluetooth service startup failure:
>>>> bluetooth.service: Failed at step NAMESPACE spawning 
>>>> /usr/libexec/bluetooth/bluetoothd: No such file or directory
>>>> bluetooth.service: Failed to set up mount namespacing: 
>>>> /run/systemd/unit-root/var/lib/bluetooth: No such file or directory
>>>>
>>>> This is because the directory /var/lib/bluetooth has been listed in
>>>> ReadWritePaths= in the service unit file but does not exist. We 
>>>> need to
>>>> create it before service startup.
>>>>
>>>> Signed-off-by: Yi Zhao <yi.zhao@windriver.com>
>>>> ---
>>>>   meta/recipes-connectivity/bluez5/bluez5.inc | 2 ++
>>>>   1 file changed, 2 insertions(+)
>>>>
>>>> diff --git a/meta/recipes-connectivity/bluez5/bluez5.inc 
>>>> b/meta/recipes-connectivity/bluez5/bluez5.inc
>>>> index 79d4645ca8..ee2cdbcc59 100644
>>>> --- a/meta/recipes-connectivity/bluez5/bluez5.inc
>>>> +++ b/meta/recipes-connectivity/bluez5/bluez5.inc
>>>> @@ -102,6 +102,8 @@ do_install:append() {
>>>>       # Patch python tools to use Python 3; they should be source 
>>>> compatible, but
>>>>       # still refer to Python 2 in the shebang
>>>>       sed -i -e '1s,#!.*python.*,#!${bindir}/python3,' 
>>>> ${D}${libdir}/bluez/test/*
>>>> +
>>>> +    install -d ${D}${localstatedir}/lib/bluetooth
>>>
>>> Please use systemd StateDirectory= [1]. Maybe it is reasonable to 
>>> replace the ReadWritePaths= with StateDirectory=.
>>>
>>> [1] 
>>> https://www.freedesktop.org/software/systemd/man/systemd.exec.html#RuntimeDirectory= 
>>>
>>
>>
>> Thanks Stefank, but the ReadWritePaths= is set by bluez:
>>
>> https://github.com/bluez/bluez/commit/442d211b5f30f00d5ddd69b43385a03c1428ac45 
>>
>
> And who creates the directory before the patch?

There is no need this directory before the patch. The service can 
startup without this directory.


>
> The systemd solution to create a state directory is StateDirectory= 
> (or tmpfiles.d for older versions of systemd). Systemd supports 
> stateless system [1] and therefore every service must work with an 
> empty /var/lib.


I'll try adding StateDirecotry to service unit file to  see if this can 
solve the problem.  Thanks.


//Yi

>
> This patch hide a bug in bluez and the problem should be fixed in bluez.
>
> [1] https://0pointer.net/blog/projects/stateless.html
Markus Volk April 8, 2022, 8:03 p.m. UTC | #5
also had this issue and found out, that the bluetooth service did come 
up, once bluetooth was enabled

My fix was to edit like this

ReadWritePaths=:/var/lib/bluetooth

The colon ensures that the service won't fail if the directory doesn't exist


Am 08.04.22 um 13:01 schrieb Yi Zhao:
>
> On 4/8/22 18:51, Stefan Herbrechtsmeier wrote:
>> Am 08.04.2022 um 11:23 schrieb Yi Zhao:
>>>
>>> On 4/8/22 16:34, Stefan Herbrechtsmeier wrote:
>>>> Am 08.04.2022 um 10:15 schrieb Yi Zhao via lists.openembedded.org:
>>>>> There is a bluetooth service startup failure:
>>>>> bluetooth.service: Failed at step NAMESPACE spawning 
>>>>> /usr/libexec/bluetooth/bluetoothd: No such file or directory
>>>>> bluetooth.service: Failed to set up mount namespacing: 
>>>>> /run/systemd/unit-root/var/lib/bluetooth: No such file or directory
>>>>>
>>>>> This is because the directory /var/lib/bluetooth has been listed in
>>>>> ReadWritePaths= in the service unit file but does not exist. We 
>>>>> need to
>>>>> create it before service startup.
>>>>>
>>>>> Signed-off-by: Yi Zhao <yi.zhao@windriver.com>
>>>>> ---
>>>>>   meta/recipes-connectivity/bluez5/bluez5.inc | 2 ++
>>>>>   1 file changed, 2 insertions(+)
>>>>>
>>>>> diff --git a/meta/recipes-connectivity/bluez5/bluez5.inc 
>>>>> b/meta/recipes-connectivity/bluez5/bluez5.inc
>>>>> index 79d4645ca8..ee2cdbcc59 100644
>>>>> --- a/meta/recipes-connectivity/bluez5/bluez5.inc
>>>>> +++ b/meta/recipes-connectivity/bluez5/bluez5.inc
>>>>> @@ -102,6 +102,8 @@ do_install:append() {
>>>>>       # Patch python tools to use Python 3; they should be source 
>>>>> compatible, but
>>>>>       # still refer to Python 2 in the shebang
>>>>>       sed -i -e '1s,#!.*python.*,#!${bindir}/python3,' 
>>>>> ${D}${libdir}/bluez/test/*
>>>>> +
>>>>> +    install -d ${D}${localstatedir}/lib/bluetooth
>>>>
>>>> Please use systemd StateDirectory= [1]. Maybe it is reasonable to 
>>>> replace the ReadWritePaths= with StateDirectory=.
>>>>
>>>> [1] 
>>>> https://www.freedesktop.org/software/systemd/man/systemd.exec.html#RuntimeDirectory= 
>>>>
>>>
>>>
>>> Thanks Stefank, but the ReadWritePaths= is set by bluez:
>>>
>>> https://github.com/bluez/bluez/commit/442d211b5f30f00d5ddd69b43385a03c1428ac45 
>>>
>>
>> And who creates the directory before the patch?
>
> There is no need this directory before the patch. The service can 
> startup without this directory.
>
>
>>
>> The systemd solution to create a state directory is StateDirectory= 
>> (or tmpfiles.d for older versions of systemd). Systemd supports 
>> stateless system [1] and therefore every service must work with an 
>> empty /var/lib.
>
>
> I'll try adding StateDirecotry to service unit file to  see if this 
> can solve the problem.  Thanks.
>
>
> //Yi
>
>>
>> This patch hide a bug in bluez and the problem should be fixed in bluez.
>>
>> [1] https://0pointer.net/blog/projects/stateless.html
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#164159): https://lists.openembedded.org/g/openembedded-core/message/164159
> Mute This Topic: https://lists.openembedded.org/mt/90331367/3618223
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [f_l_k@t-online.de]
> -=-=-=-=-=-=-=-=-=-=-=-
>
Stefan Herbrechtsmeier April 11, 2022, 7:17 a.m. UTC | #6
Am 08.04.2022 um 22:03 schrieb Markus Volk via lists.openembedded.org:
> also had this issue and found out, that the bluetooth service did come 
> up, once bluetooth was enabled
> 
> My fix was to edit like this
> 
> ReadWritePaths=:/var/lib/bluetooth
> 
> The colon ensures that the service won't fail if the directory doesn't 
> exist

Regarding the documentation the ReadOnlyPaths and ReadWritePaths makes 
not sense because ProtectSystem=full mounts /usr, boot loader and /etc 
directories read-only.

Have somebody report the problem to the bluez project?

Regards
   Stefan


> 
> 
> Am 08.04.22 um 13:01 schrieb Yi Zhao:
>>
>> On 4/8/22 18:51, Stefan Herbrechtsmeier wrote:
>>> Am 08.04.2022 um 11:23 schrieb Yi Zhao:
>>>>
>>>> On 4/8/22 16:34, Stefan Herbrechtsmeier wrote:
>>>>> Am 08.04.2022 um 10:15 schrieb Yi Zhao via lists.openembedded.org:
>>>>>> There is a bluetooth service startup failure:
>>>>>> bluetooth.service: Failed at step NAMESPACE spawning 
>>>>>> /usr/libexec/bluetooth/bluetoothd: No such file or directory
>>>>>> bluetooth.service: Failed to set up mount namespacing: 
>>>>>> /run/systemd/unit-root/var/lib/bluetooth: No such file or directory
>>>>>>
>>>>>> This is because the directory /var/lib/bluetooth has been listed in
>>>>>> ReadWritePaths= in the service unit file but does not exist. We 
>>>>>> need to
>>>>>> create it before service startup.
>>>>>>
>>>>>> Signed-off-by: Yi Zhao <yi.zhao@windriver.com>
>>>>>> ---
>>>>>>   meta/recipes-connectivity/bluez5/bluez5.inc | 2 ++
>>>>>>   1 file changed, 2 insertions(+)
>>>>>>
>>>>>> diff --git a/meta/recipes-connectivity/bluez5/bluez5.inc 
>>>>>> b/meta/recipes-connectivity/bluez5/bluez5.inc
>>>>>> index 79d4645ca8..ee2cdbcc59 100644
>>>>>> --- a/meta/recipes-connectivity/bluez5/bluez5.inc
>>>>>> +++ b/meta/recipes-connectivity/bluez5/bluez5.inc
>>>>>> @@ -102,6 +102,8 @@ do_install:append() {
>>>>>>       # Patch python tools to use Python 3; they should be source 
>>>>>> compatible, but
>>>>>>       # still refer to Python 2 in the shebang
>>>>>>       sed -i -e '1s,#!.*python.*,#!${bindir}/python3,' 
>>>>>> ${D}${libdir}/bluez/test/*
>>>>>> +
>>>>>> +    install -d ${D}${localstatedir}/lib/bluetooth
>>>>>
>>>>> Please use systemd StateDirectory= [1]. Maybe it is reasonable to 
>>>>> replace the ReadWritePaths= with StateDirectory=.
>>>>>
>>>>> [1] 
>>>>> https://www.freedesktop.org/software/systemd/man/systemd.exec.html#RuntimeDirectory= 
>>>>>
>>>>
>>>>
>>>> Thanks Stefank, but the ReadWritePaths= is set by bluez:
>>>>
>>>> https://github.com/bluez/bluez/commit/442d211b5f30f00d5ddd69b43385a03c1428ac45 
>>>>
>>>
>>> And who creates the directory before the patch?
>>
>> There is no need this directory before the patch. The service can 
>> startup without this directory.
>>
>>
>>>
>>> The systemd solution to create a state directory is StateDirectory= 
>>> (or tmpfiles.d for older versions of systemd). Systemd supports 
>>> stateless system [1] and therefore every service must work with an 
>>> empty /var/lib.
>>
>>
>> I'll try adding StateDirecotry to service unit file to  see if this 
>> can solve the problem.  Thanks.
>>
>>
>> //Yi
>>
>>>
>>> This patch hide a bug in bluez and the problem should be fixed in bluez.
>>>
>>> [1] https://0pointer.net/blog/projects/stateless.html
>>
>>
>>
> 
> 
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#164177): https://lists.openembedded.org/g/openembedded-core/message/164177
> Mute This Topic: https://lists.openembedded.org/mt/90331367/6374899
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [stefan.herbrechtsmeier-oss@weidmueller.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
Stefan Herbrechtsmeier April 13, 2022, 8:21 a.m. UTC | #7
Hi,

Am 11.04.2022 um 09:17 schrieb Stefan Herbrechtsmeier via 
lists.openembedded.org:
> Am 08.04.2022 um 22:03 schrieb Markus Volk via lists.openembedded.org:
>> also had this issue and found out, that the bluetooth service did come 
>> up, once bluetooth was enabled
>>
>> My fix was to edit like this
>>
>> ReadWritePaths=:/var/lib/bluetooth
>>
>> The colon ensures that the service won't fail if the directory doesn't 
>> exist
> 
> Regarding the documentation the ReadOnlyPaths and ReadWritePaths makes 
> not sense because ProtectSystem=full mounts /usr, boot loader and /etc 
> directories read-only.
> 
> Have somebody report the problem to the bluez project?

I have open an issue:
https://github.com/bluez/bluez/issues/329

I will post a patch when we come to a solution.

Regards
   Stefan
Richard Purdie April 14, 2022, 4:22 p.m. UTC | #8
On Wed, 2022-04-13 at 10:21 +0200, Stefan Herbrechtsmeier wrote:
> Hi,
> 
> Am 11.04.2022 um 09:17 schrieb Stefan Herbrechtsmeier via 
> lists.openembedded.org:
> > Am 08.04.2022 um 22:03 schrieb Markus Volk via lists.openembedded.org:
> > > also had this issue and found out, that the bluetooth service did come 
> > > up, once bluetooth was enabled
> > > 
> > > My fix was to edit like this
> > > 
> > > ReadWritePaths=:/var/lib/bluetooth
> > > 
> > > The colon ensures that the service won't fail if the directory doesn't 
> > > exist
> > 
> > Regarding the documentation the ReadOnlyPaths and ReadWritePaths makes 
> > not sense because ProtectSystem=full mounts /usr, boot loader and /etc 
> > directories read-only.
> > 
> > Have somebody report the problem to the bluez project?
> 
> I have open an issue:
> https://github.com/bluez/bluez/issues/329
> 
> I will post a patch when we come to a solution.

We have a slight challenge in that I'd like to build 4.0 rc2 but I think there
will be complaints if this is left broken.

I'm going to post a version of your patch and hope that improves things. If
anyone knows of issues with that patch please let me know ASAP.

Cheers,

Richard

Patch

diff --git a/meta/recipes-connectivity/bluez5/bluez5.inc b/meta/recipes-connectivity/bluez5/bluez5.inc
index 79d4645ca8..ee2cdbcc59 100644
--- a/meta/recipes-connectivity/bluez5/bluez5.inc
+++ b/meta/recipes-connectivity/bluez5/bluez5.inc
@@ -102,6 +102,8 @@  do_install:append() {
 	# Patch python tools to use Python 3; they should be source compatible, but
 	# still refer to Python 2 in the shebang
 	sed -i -e '1s,#!.*python.*,#!${bindir}/python3,' ${D}${libdir}/bluez/test/*
+
+	install -d ${D}${localstatedir}/lib/bluetooth
 }
 
 PACKAGES =+ "${PN}-testtools ${PN}-obex ${PN}-noinst-tools"