diff mbox series

[v2] overlayfs-etc: add option to skip creation of mount dirs

Message ID ed5d6a8c842319c81026bb4aab7e2a9de3c13189.1707762606.git.baruch@tkos.co.il
State Accepted, archived
Commit 3d433d8559467d255bd19af2d0999c65ea24a48d
Headers show
Series [v2] overlayfs-etc: add option to skip creation of mount dirs | expand

Commit Message

Baruch Siach Feb. 12, 2024, 6:30 p.m. UTC
The 'preinit' script can't create mount directories when rootfs is
read-only. Add an option to skip this step. The user must make sure that
all required directories are already in the rootfs directory layout.

Cc: Vyacheslav Yurkov <uvv.mail@gmail.com>
Signed-off-by: Baruch Siach <baruch@tkos.co.il>
---
v2: Add a user selectable option. Don't skip mkdir automatically when
    read-only-rootfs feature is enabled.
---
 meta/classes-recipe/overlayfs-etc.bbclass |  5 ++++-
 meta/files/overlayfs-etc-preinit.sh.in    | 16 +++++++++-------
 2 files changed, 13 insertions(+), 8 deletions(-)

Comments

Vyacheslav Yurkov Feb. 12, 2024, 7:40 p.m. UTC | #1
On 12.02.2024 19:30, Baruch Siach wrote:
> The 'preinit' script can't create mount directories when rootfs is
> read-only. Add an option to skip this step. The user must make sure that
> all required directories are already in the rootfs directory layout.
>
> Cc: Vyacheslav Yurkov <uvv.mail@gmail.com>
> Signed-off-by: Baruch Siach <baruch@tkos.co.il>
> ---
> v2: Add a user selectable option. Don't skip mkdir automatically when
>      read-only-rootfs feature is enabled.
> ---
>   meta/classes-recipe/overlayfs-etc.bbclass |  5 ++++-
>   meta/files/overlayfs-etc-preinit.sh.in    | 16 +++++++++-------
>   2 files changed, 13 insertions(+), 8 deletions(-)
>
> diff --git a/meta/classes-recipe/overlayfs-etc.bbclass b/meta/classes-recipe/overlayfs-etc.bbclass
> index 0c7834d01f43..d339fbbeee9f 100644
> --- a/meta/classes-recipe/overlayfs-etc.bbclass
> +++ b/meta/classes-recipe/overlayfs-etc.bbclass
> @@ -41,6 +41,7 @@ OVERLAYFS_ETC_USE_ORIG_INIT_NAME ??= "1"
>   OVERLAYFS_ETC_MOUNT_OPTIONS ??= "defaults"
>   OVERLAYFS_ETC_INIT_TEMPLATE ??= "${COREBASE}/meta/files/overlayfs-etc-preinit.sh.in"
>   OVERLAYFS_ETC_EXPOSE_LOWER ??= "0"
> +OVERLAYFS_ETC_CREATE_MOUNT_DIRS ??= "1"
>   
>   python create_overlayfs_etc_preinit() {
>       overlayEtcMountPoint = d.getVar("OVERLAYFS_ETC_MOUNT_POINT")
> @@ -62,6 +63,7 @@ python create_overlayfs_etc_preinit() {
>       initBaseName = oe.path.join(d.getVar("base_sbindir"), "init")
>       origInitNameSuffix = ".orig"
>       exposeLower = oe.types.boolean(d.getVar('OVERLAYFS_ETC_EXPOSE_LOWER'))
> +    createMoundDirs = oe.types.boolean(d.getVar('OVERLAYFS_ETC_CREATE_MOUNT_DIRS'))
>   
>       args = {
>           'OVERLAYFS_ETC_MOUNT_POINT': overlayEtcMountPoint,
> @@ -69,7 +71,8 @@ python create_overlayfs_etc_preinit() {
>           'OVERLAYFS_ETC_FSTYPE': overlayEtcFsType,
>           'OVERLAYFS_ETC_DEVICE': overlayEtcDevice,
>           'SBIN_INIT_NAME': initBaseName + origInitNameSuffix if useOrigInit else initBaseName,
> -        'OVERLAYFS_ETC_EXPOSE_LOWER': "true" if exposeLower else "false"
> +        'OVERLAYFS_ETC_EXPOSE_LOWER': "true" if exposeLower else "false",
> +        'CREATE_MOUNT_DIRS': "true" if createMoundDirs else "false"
>       }
>   
>       if useOrigInit:
> diff --git a/meta/files/overlayfs-etc-preinit.sh.in b/meta/files/overlayfs-etc-preinit.sh.in
> index 8db076f4ba65..b05e3957a382 100644
> --- a/meta/files/overlayfs-etc-preinit.sh.in
> +++ b/meta/files/overlayfs-etc-preinit.sh.in
> @@ -3,12 +3,15 @@
>   echo "PREINIT: Start"
>   
>   PATH=/sbin:/bin:/usr/sbin:/usr/bin
> -mount -o remount,rw /
> -
> -mkdir -p /proc
> -mkdir -p /sys
> -mkdir -p /run
> -mkdir -p /var/run
> +if {CREATE_MOUNT_DIRS}; then
> +    mount -o remount,rw /
> +
> +    mkdir -p /proc
> +    mkdir -p /sys
> +    mkdir -p /run
> +    mkdir -p /var/run
> +    mkdir -p {OVERLAYFS_ETC_MOUNT_POINT}
> +fi
>   
>   mount -t proc proc /proc
>   mount -t sysfs sysfs /sys
> @@ -20,7 +23,6 @@ UPPER_DIR=$BASE_OVERLAY_ETC_DIR/upper
>   WORK_DIR=$BASE_OVERLAY_ETC_DIR/work
>   LOWER_DIR=$BASE_OVERLAY_ETC_DIR/lower
>   
> -mkdir -p {OVERLAYFS_ETC_MOUNT_POINT}
>   if mount -n -t {OVERLAYFS_ETC_FSTYPE} \
>       -o {OVERLAYFS_ETC_MOUNT_OPTIONS} \
>       {OVERLAYFS_ETC_DEVICE} {OVERLAYFS_ETC_MOUNT_POINT}

Hi Baruch,
Thanks for the v2. Looks good now. Could you please also add a test case 
to cover the new option?

You saw from the test that mount output is parsed to confirm whether 
overlay is actually mounted. sda3 is a 3rd partition from 
https://git.openembedded.org/openembedded-core/tree/meta-selftest/wic/overlayfs_etc.wks.in 
. We could change rootfs (2nd partition) in the file to substitute the 
fs type (ext4/squashfs) from the test and then check that everything is 
mounted correctly. Does it make sense?

Thanks,
Slava
Baruch Siach Feb. 14, 2024, 6:54 a.m. UTC | #2
Hi Slava,

On Mon, Feb 12 2024, Vyacheslav Yurkov wrote:
> On 12.02.2024 19:30, Baruch Siach wrote:
>> The 'preinit' script can't create mount directories when rootfs is
>> read-only. Add an option to skip this step. The user must make sure that
>> all required directories are already in the rootfs directory layout.
>>
>> Cc: Vyacheslav Yurkov <uvv.mail@gmail.com>
>> Signed-off-by: Baruch Siach <baruch@tkos.co.il>
>> ---
>> v2: Add a user selectable option. Don't skip mkdir automatically when
>>      read-only-rootfs feature is enabled.
>> ---
>>   meta/classes-recipe/overlayfs-etc.bbclass |  5 ++++-
>>   meta/files/overlayfs-etc-preinit.sh.in    | 16 +++++++++-------
>>   2 files changed, 13 insertions(+), 8 deletions(-)
>>
>> diff --git a/meta/classes-recipe/overlayfs-etc.bbclass b/meta/classes-recipe/overlayfs-etc.bbclass
>> index 0c7834d01f43..d339fbbeee9f 100644
>> --- a/meta/classes-recipe/overlayfs-etc.bbclass
>> +++ b/meta/classes-recipe/overlayfs-etc.bbclass
>> @@ -41,6 +41,7 @@ OVERLAYFS_ETC_USE_ORIG_INIT_NAME ??= "1"
>>   OVERLAYFS_ETC_MOUNT_OPTIONS ??= "defaults"
>>   OVERLAYFS_ETC_INIT_TEMPLATE ??= "${COREBASE}/meta/files/overlayfs-etc-preinit.sh.in"
>>   OVERLAYFS_ETC_EXPOSE_LOWER ??= "0"
>> +OVERLAYFS_ETC_CREATE_MOUNT_DIRS ??= "1"
>>     python create_overlayfs_etc_preinit() {
>>       overlayEtcMountPoint = d.getVar("OVERLAYFS_ETC_MOUNT_POINT")
>> @@ -62,6 +63,7 @@ python create_overlayfs_etc_preinit() {
>>       initBaseName = oe.path.join(d.getVar("base_sbindir"), "init")
>>       origInitNameSuffix = ".orig"
>>       exposeLower = oe.types.boolean(d.getVar('OVERLAYFS_ETC_EXPOSE_LOWER'))
>> +    createMoundDirs = oe.types.boolean(d.getVar('OVERLAYFS_ETC_CREATE_MOUNT_DIRS'))
>>         args = {
>>           'OVERLAYFS_ETC_MOUNT_POINT': overlayEtcMountPoint,
>> @@ -69,7 +71,8 @@ python create_overlayfs_etc_preinit() {
>>           'OVERLAYFS_ETC_FSTYPE': overlayEtcFsType,
>>           'OVERLAYFS_ETC_DEVICE': overlayEtcDevice,
>>           'SBIN_INIT_NAME': initBaseName + origInitNameSuffix if useOrigInit else initBaseName,
>> -        'OVERLAYFS_ETC_EXPOSE_LOWER': "true" if exposeLower else "false"
>> +        'OVERLAYFS_ETC_EXPOSE_LOWER': "true" if exposeLower else "false",
>> +        'CREATE_MOUNT_DIRS': "true" if createMoundDirs else "false"
>>       }
>>         if useOrigInit:
>> diff --git a/meta/files/overlayfs-etc-preinit.sh.in b/meta/files/overlayfs-etc-preinit.sh.in
>> index 8db076f4ba65..b05e3957a382 100644
>> --- a/meta/files/overlayfs-etc-preinit.sh.in
>> +++ b/meta/files/overlayfs-etc-preinit.sh.in
>> @@ -3,12 +3,15 @@
>>   echo "PREINIT: Start"
>>     PATH=/sbin:/bin:/usr/sbin:/usr/bin
>> -mount -o remount,rw /
>> -
>> -mkdir -p /proc
>> -mkdir -p /sys
>> -mkdir -p /run
>> -mkdir -p /var/run
>> +if {CREATE_MOUNT_DIRS}; then
>> +    mount -o remount,rw /
>> +
>> +    mkdir -p /proc
>> +    mkdir -p /sys
>> +    mkdir -p /run
>> +    mkdir -p /var/run
>> +    mkdir -p {OVERLAYFS_ETC_MOUNT_POINT}
>> +fi
>>     mount -t proc proc /proc
>>   mount -t sysfs sysfs /sys
>> @@ -20,7 +23,6 @@ UPPER_DIR=$BASE_OVERLAY_ETC_DIR/upper
>>   WORK_DIR=$BASE_OVERLAY_ETC_DIR/work
>>   LOWER_DIR=$BASE_OVERLAY_ETC_DIR/lower
>>   -mkdir -p {OVERLAYFS_ETC_MOUNT_POINT}
>>   if mount -n -t {OVERLAYFS_ETC_FSTYPE} \
>>       -o {OVERLAYFS_ETC_MOUNT_OPTIONS} \
>>       {OVERLAYFS_ETC_DEVICE} {OVERLAYFS_ETC_MOUNT_POINT}
>
> Hi Baruch,
> Thanks for the v2. Looks good now. Could you please also add a test case to
> cover the new option?
>
> You saw from the test that mount output is parsed to confirm whether overlay
> is actually mounted. sda3 is a 3rd partition from
> https://git.openembedded.org/openembedded-core/tree/meta-selftest/wic/overlayfs_etc.wks.in
> . We could change rootfs (2nd partition) in the file to substitute the fs type
> (ext4/squashfs) from the test and then check that everything is mounted
> correctly. Does it make sense?

Makes sense.

I added mkdirhier of OVERLAYFS_ETC_MOUNT_POINT for the case of
OVERLAYFS_ETC_CREATE_MOUNT_DIRS == 0. Let me know if there is a better
solution for read-only filesystems.

The trouble with testing is that I could not find any existing feature
in yocto-kernel-cache that enables either CONFIG_SQUASHFS or
CONFIG_EROFS_FS. Is there another way to enable kernel features for the
test?

Thanks,
baruch
Vyacheslav Yurkov Feb. 15, 2024, 6:38 p.m. UTC | #3
Hi Baruch,
That's a good question.

Bruce, if we need a new kernel feature (squashfs), the only way would be 
first to contribute it to https://git.yoctoproject.org/yocto-kernel-cache/ ?
Or there's another way to enable a specific kernel configuration in a 
selftest?

Slava

On 14.02.2024 07:54, Baruch Siach wrote:
> Makes sense.
>
> I added mkdirhier of OVERLAYFS_ETC_MOUNT_POINT for the case of
> OVERLAYFS_ETC_CREATE_MOUNT_DIRS == 0. Let me know if there is a better
> solution for read-only filesystems.
>
> The trouble with testing is that I could not find any existing feature
> in yocto-kernel-cache that enables either CONFIG_SQUASHFS or
> CONFIG_EROFS_FS. Is there another way to enable kernel features for the
> test?
>
> Thanks,
> baruch
>
diff mbox series

Patch

diff --git a/meta/classes-recipe/overlayfs-etc.bbclass b/meta/classes-recipe/overlayfs-etc.bbclass
index 0c7834d01f43..d339fbbeee9f 100644
--- a/meta/classes-recipe/overlayfs-etc.bbclass
+++ b/meta/classes-recipe/overlayfs-etc.bbclass
@@ -41,6 +41,7 @@  OVERLAYFS_ETC_USE_ORIG_INIT_NAME ??= "1"
 OVERLAYFS_ETC_MOUNT_OPTIONS ??= "defaults"
 OVERLAYFS_ETC_INIT_TEMPLATE ??= "${COREBASE}/meta/files/overlayfs-etc-preinit.sh.in"
 OVERLAYFS_ETC_EXPOSE_LOWER ??= "0"
+OVERLAYFS_ETC_CREATE_MOUNT_DIRS ??= "1"
 
 python create_overlayfs_etc_preinit() {
     overlayEtcMountPoint = d.getVar("OVERLAYFS_ETC_MOUNT_POINT")
@@ -62,6 +63,7 @@  python create_overlayfs_etc_preinit() {
     initBaseName = oe.path.join(d.getVar("base_sbindir"), "init")
     origInitNameSuffix = ".orig"
     exposeLower = oe.types.boolean(d.getVar('OVERLAYFS_ETC_EXPOSE_LOWER'))
+    createMoundDirs = oe.types.boolean(d.getVar('OVERLAYFS_ETC_CREATE_MOUNT_DIRS'))
 
     args = {
         'OVERLAYFS_ETC_MOUNT_POINT': overlayEtcMountPoint,
@@ -69,7 +71,8 @@  python create_overlayfs_etc_preinit() {
         'OVERLAYFS_ETC_FSTYPE': overlayEtcFsType,
         'OVERLAYFS_ETC_DEVICE': overlayEtcDevice,
         'SBIN_INIT_NAME': initBaseName + origInitNameSuffix if useOrigInit else initBaseName,
-        'OVERLAYFS_ETC_EXPOSE_LOWER': "true" if exposeLower else "false"
+        'OVERLAYFS_ETC_EXPOSE_LOWER': "true" if exposeLower else "false",
+        'CREATE_MOUNT_DIRS': "true" if createMoundDirs else "false"
     }
 
     if useOrigInit:
diff --git a/meta/files/overlayfs-etc-preinit.sh.in b/meta/files/overlayfs-etc-preinit.sh.in
index 8db076f4ba65..b05e3957a382 100644
--- a/meta/files/overlayfs-etc-preinit.sh.in
+++ b/meta/files/overlayfs-etc-preinit.sh.in
@@ -3,12 +3,15 @@ 
 echo "PREINIT: Start"
 
 PATH=/sbin:/bin:/usr/sbin:/usr/bin
-mount -o remount,rw /
-
-mkdir -p /proc
-mkdir -p /sys
-mkdir -p /run
-mkdir -p /var/run
+if {CREATE_MOUNT_DIRS}; then
+    mount -o remount,rw /
+
+    mkdir -p /proc
+    mkdir -p /sys
+    mkdir -p /run
+    mkdir -p /var/run
+    mkdir -p {OVERLAYFS_ETC_MOUNT_POINT}
+fi
 
 mount -t proc proc /proc
 mount -t sysfs sysfs /sys
@@ -20,7 +23,6 @@  UPPER_DIR=$BASE_OVERLAY_ETC_DIR/upper
 WORK_DIR=$BASE_OVERLAY_ETC_DIR/work
 LOWER_DIR=$BASE_OVERLAY_ETC_DIR/lower
 
-mkdir -p {OVERLAYFS_ETC_MOUNT_POINT}
 if mount -n -t {OVERLAYFS_ETC_FSTYPE} \
     -o {OVERLAYFS_ETC_MOUNT_OPTIONS} \
     {OVERLAYFS_ETC_DEVICE} {OVERLAYFS_ETC_MOUNT_POINT}