Hi Dumitru, Frode,

Thanks for the review. I just sent v4 -
https://mail.openvswitch.org/pipermail/ovs-dev/2026-July/434360.html

It keeps tmpfiles/sysusers support opt-in, preserves the existing
log-directory ownership behavior by default, and explicitly enables
the new behavior in Debian and Fedora packaging.  The Debian package
continues to configure the log ownership as root:adm.

Best regards,
Joshua

On Mon, Jul 20, 2026 at 5:34 PM Joshua Zhang <[email protected]>
wrote:

> Hi Dumitru, Frode,
>
> Thanks for taking a look.
>
> For some background, this work started from an ovn-controller logging
> issue reported against charm-ovn-chassis:
>
> https://bugs.launchpad.net/charm-ovn-chassis/+bug/2143318
>
> I initially proposed handling it in the charm.  Following discussion
> with Frode, I moved the proposed fix to the Debian OVN packaging, which
> led to the following Salsa merge request:
>
> https://salsa.debian.org/openstack-team/third-party/ovn/-/merge_requests/69
>
> During the review of that merge request, Luca pointed out that OVN's
> startup scripts recursively change the ownership of the log directory,
> which would override the ownership configured by the package.  He
> therefore suggested addressing that behavior upstream first and managing
> the log ownership with tmpfiles.d.  The sysusers.d support was added
> based on further review there.
>
> The current upstream patch is therefore the result of moving the fix
> from the charm to Debian packaging and then upstream, following the
> feedback at each stage.
>
> Thanks,
> Zhang Hua
>
> On Mon, Jul 20, 2026 at 5:09 PM Dumitru Ceara <[email protected]> wrote:
>
>> On 7/20/26 11:02 AM, Dumitru Ceara wrote:
>> > On 7/2/26 4:32 AM, Zhang Hua via dev wrote:
>> >> ovn-ctl and ovn-lib currently chown the OVN log directory
>> >> recursively when services start.  That can undo ownership set by
>> >> distribution tooling such as tmpfiles.d and logrotate.  In particular,
>> >> Debian and Ubuntu need ovn-controller.log to remain root:adm so rsyslog
>> >> can read it, but a later OVN service restart may change it back to the
>> >> OVN daemon user/group.
>> >>
>> >> Add an OVN tmpfiles.d template for the log directory and
>> >> ovn-controller.log, with configurable log user, log group and
>> tmpfiles.d
>> >> installation directory.  Debian configures the log owner as root:adm,
>> >> while Fedora/RHEL keeps openvswitch:openvswitch.
>> >>
>> >> Stop recursively changing the OVN log directory ownership from ovn-ctl
>> >> and ovn-lib at service startup.  Runtime, database and configuration
>> >> paths are still chowned according to --ovn-user, preserving the
>> existing
>> >> privilege-drop behavior for non-log state.
>> >>
>> >> Reported-at: https://github.com/ovn-org/ovn/issues/310
>> >> Signed-off-by: Zhang Hua <[email protected]>
>> >> ---
>> >
>> > Hi Zhang Hua,
>> >
>> > Thanks for the patch!
>> >
>> > Hi Frode,
>> >
>> > Would you have some time to look at this patch from an Ubuntu/Debian
>> > perspective?
>> >
>>
>> Sorry, I should've replied to v3 instead:
>>
>>
>> https://patchwork.ozlabs.org/project/ovn/patch/[email protected]/
>>
>> > Thanks,
>> > Dumitru
>> >
>> >> Submitted-at: https://github.com/ovn-org/ovn/pull/311
>> >>
>> >> v2:
>> >> - Added the trailing dot required by checkpatch to the subject.
>> >>
>> >> Testing:
>> >> - Ran utilities/checkpatch.py -1.
>> >> - Ran make check TESTSUITEFLAGS="-j$(nproc)".
>> >>
>> >>  Makefile.am                    |  4 ++++
>> >>  configure.ac                   |  3 +++
>> >>  debian/ovn-common.install      |  1 +
>> >>  debian/rules                   |  2 +-
>> >>  m4/ovn.m4                      | 31 +++++++++++++++++++++++++++++++
>> >>  rhel/ovn-fedora.spec.in        |  3 +++
>> >>  utilities/automake.mk          |  4 ++++
>> >>  utilities/ovn-ctl              |  6 ++----
>> >>  utilities/ovn-lib.in           |  1 -
>> >>  utilities/ovn-tmpfiles.conf.in |  2 ++
>> >>  10 files changed, 51 insertions(+), 6 deletions(-)
>> >>  create mode 100644 utilities/ovn-tmpfiles.conf.in
>> >>
>> >> diff --git a/Makefile.am b/Makefile.am
>> >> index 0f2389b25..79929ee6c 100644
>> >> --- a/Makefile.am
>> >> +++ b/Makefile.am
>> >> @@ -131,6 +131,7 @@ noinst_PROGRAMS =
>> >>  noinst_SCRIPTS =
>> >>  OVSIDL_BUILT =
>> >>  pkgdata_DATA =
>> >> +tmpfiles_DATA =
>> >>  sbin_SCRIPTS =
>> >>  scripts_SCRIPTS =
>> >>  completion_SCRIPTS =
>> >> @@ -148,6 +149,7 @@ endif
>> >>  scriptsdir = $(pkgdatadir)/scripts
>> >>  completiondir = $(sysconfdir)/bash_completion.d
>> >>  pkgconfigdir = $(libdir)/pkgconfig
>> >> +tmpfilesdir = @TMPFILESDIR@
>> >>
>> >>  # This ensures that files added to EXTRA_DIST are always distributed,
>> >>  # even if they are inside an Automake if...endif conditional block
>> that is
>> >> @@ -166,6 +168,8 @@ SUFFIXES += .in
>> >>        sed \
>> >>          -e 's,[@]PKIDIR[@],$(PKIDIR),g' \
>> >>          -e 's,[@]LOGDIR[@],$(LOGDIR),g' \
>> >> +        -e 's,[@]LOGUSER[@],$(LOGUSER),g' \
>> >> +        -e 's,[@]LOGGROUP[@],$(LOGGROUP),g' \
>> >>          -e 's,[@]DBDIR[@],$(DBDIR),g' \
>> >>          -e 's,[@]PYTHON3[@],$(PYTHON3),g' \
>> >>          -e 's,[@]OVN_RUNDIR[@],$(OVN_RUNDIR),g' \
>> >> diff --git a/configure.ac b/configure.ac
>> >> index cfa4cc386..d19e26612 100644
>> >> --- a/configure.ac
>> >> +++ b/configure.ac
>> >> @@ -88,6 +88,9 @@ OVS_CHECK_NETLINK
>> >>  OVS_CHECK_LINUX_NETLINK
>> >>  OVS_CHECK_OPENSSL
>> >>  OVN_CHECK_LOGDIR
>> >> +OVN_CHECK_LOGUSER
>> >> +OVN_CHECK_LOGGROUP
>> >> +OVN_CHECK_TMPFILESDIR
>> >>  OVN_CHECK_PYTHON3
>> >>  OVN_CHECK_FLAKE8
>> >>  OVN_CHECK_SPHINX
>> >> diff --git a/debian/ovn-common.install b/debian/ovn-common.install
>> >> index fc48f07e4..b890c6797 100644
>> >> --- a/debian/ovn-common.install
>> >> +++ b/debian/ovn-common.install
>> >> @@ -12,4 +12,5 @@ usr/share/ovn/scripts/ovn-lib
>> >>  usr/share/ovn/scripts/ovn-bugtool-nbctl-show
>> >>  usr/share/ovn/scripts/ovn-bugtool-sbctl-lflow-list
>> >>  usr/share/ovn/scripts/ovn-bugtool-sbctl-show
>> >> +usr/lib/tmpfiles.d/ovn-tmpfiles.conf
>> >>  usr/lib/*/libovn*.so.*
>> >> diff --git a/debian/rules b/debian/rules
>> >> index b25a0b48e..0d5da5b26 100755
>> >> --- a/debian/rules
>> >> +++ b/debian/rules
>> >> @@ -30,7 +30,7 @@ override_dh_autoreconf:
>> >>      dh_autoreconf $(DH_AS_NEEDED)
>> >>
>> >>  override_dh_auto_configure:
>> >> -    dh_auto_configure -- --enable-ssl --enable-shared
>> --with-ovs-source=${OVSDIR} $(EXTRA_CONFIGURE_OPTS)
>> >> +    dh_auto_configure -- --enable-ssl --enable-shared
>> --with-ovs-source=${OVSDIR} --with-log-user=root --with-log-group=adm
>> $(EXTRA_CONFIGURE_OPTS)
>> >>
>> >>  override_dh_auto_test:
>> >>  ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
>> >> diff --git a/m4/ovn.m4 b/m4/ovn.m4
>> >> index 22ad1a27f..f022a0152 100644
>> >> --- a/m4/ovn.m4
>> >> +++ b/m4/ovn.m4
>> >> @@ -127,6 +127,37 @@ AC_DEFUN([OVN_CHECK_LOGDIR],
>> >>       [LOGDIR='${localstatedir}/log/${PACKAGE}'])
>> >>     AC_SUBST([LOGDIR])])
>> >>
>> >> +dnl Checks for the user that should own log files.
>> >> +AC_DEFUN([OVN_CHECK_LOGUSER],
>> >> +  [AC_ARG_WITH(
>> >> +     [log-user],
>> >> +     AS_HELP_STRING([--with-log-user=USER],
>> >> +                    [user used for log files [[root]]]),
>> >> +     [LOGUSER=$withval],
>> >> +     [LOGUSER=root])
>> >> +   AC_SUBST([LOGUSER])])
>> >> +
>> >> +dnl Checks for the group that should own log files.
>> >> +AC_DEFUN([OVN_CHECK_LOGGROUP],
>> >> +  [AC_ARG_WITH(
>> >> +     [log-group],
>> >> +     AS_HELP_STRING([--with-log-group=GROUP],
>> >> +                    [group used for log files [[root]]]),
>> >> +     [LOGGROUP=$withval],
>> >> +     [LOGGROUP=root])
>> >> +   AC_SUBST([LOGGROUP])])
>> >> +
>> >> +dnl Checks for the directory in which to install tmpfiles.d
>> configuration.
>> >> +AC_DEFUN([OVN_CHECK_TMPFILESDIR],
>> >> +  [AC_ARG_WITH(
>> >> +     [tmpfilesdir],
>> >> +     AS_HELP_STRING([--with-tmpfilesdir=DIR],
>> >> +                    [directory used for tmpfiles.d configuration
>> >> +                    [[PREFIX/lib/tmpfiles.d]]]),
>> >> +     [TMPFILESDIR=$withval],
>> >> +     [TMPFILESDIR='${prefix}/lib/tmpfiles.d'])
>> >> +   AC_SUBST([TMPFILESDIR])])
>> >> +
>> >>  dnl Checks for the directory in which to store the OVN database.
>> >>  AC_DEFUN([OVN_CHECK_DBDIR],
>> >>    [AC_ARG_WITH(
>> >> diff --git a/rhel/ovn-fedora.spec.in b/rhel/ovn-fedora.spec.in
>> >> index 131b3eaab..1fdaad706 100644
>> >> --- a/rhel/ovn-fedora.spec.in
>> >> +++ b/rhel/ovn-fedora.spec.in
>> >> @@ -159,6 +159,8 @@ cd -
>> >>          --with-ovs-source=$PWD/openvswitch-%{ovsver} \
>> >>  %if %{with libcapng}
>> >>          --enable-libcapng \
>> >> +        --with-log-user=openvswitch \
>> >> +        --with-log-group=openvswitch \
>> >>  %else
>> >>          --disable-libcapng \
>> >>  %endif
>> >> @@ -531,6 +533,7 @@ fi
>> >>  %{_mandir}/man8/ovn-debug.8*
>> >>  %{_prefix}/lib/ocf/resource.d/ovn/ovndb-servers
>> >>  %config(noreplace) %{_sysconfdir}/logrotate.d/ovn
>> >> +%{_tmpfilesdir}/ovn-tmpfiles.conf
>> >>  %{_unitdir}/[email protected]
>> >>
>> >>  %files docker
>> >> diff --git a/utilities/automake.mk b/utilities/automake.mk
>> >> index b620038d0..c22b5d8c3 100644
>> >> --- a/utilities/automake.mk
>> >> +++ b/utilities/automake.mk
>> >> @@ -26,6 +26,7 @@ EXTRA_DIST += \
>> >>      utilities/ovn-ctl \
>> >>      utilities/ovn-lib.in \
>> >>      utilities/ovn-ctl.8.xml \
>> >> +    utilities/ovn-tmpfiles.conf.in \
>> >>      utilities/ovn-docker-overlay-driver.in \
>> >>      utilities/ovn-docker-underlay-driver.in \
>> >>      utilities/ovn-nbctl.8.xml \
>> >> @@ -48,6 +49,7 @@ EXTRA_DIST += \
>> >>  CLEANFILES += \
>> >>      utilities/ovn-ctl.8 \
>> >>      utilities/ovn-lib \
>> >> +    utilities/ovn-tmpfiles.conf \
>> >>      utilities/ovn-docker-overlay-driver \
>> >>      utilities/ovn-docker-underlay-driver \
>> >>      utilities/ovn-nbctl.8 \
>> >> @@ -66,7 +68,9 @@ CLEANFILES += \
>> >>  EXTRA_DIST += utilities/ovn-sim.in
>> >>  noinst_SCRIPTS += utilities/ovn-sim
>> >>
>> >> +tmpfiles_DATA += utilities/ovn-tmpfiles.conf
>> >>  utilities/ovn-lib: $(top_builddir)/config.status
>> >> +utilities/ovn-tmpfiles.conf: $(top_builddir)/config.status
>> >>
>> >>  # ovn-nbctl
>> >>  bin_PROGRAMS += utilities/ovn-nbctl
>> >> diff --git a/utilities/ovn-ctl b/utilities/ovn-ctl
>> >> index 3b62ca9b7..58effd5e5 100755
>> >> --- a/utilities/ovn-ctl
>> >> +++ b/utilities/ovn-ctl
>> >> @@ -276,9 +276,8 @@ $cluster_remote_port
>> >>          upgrade_db "$file" "$schema"
>> >>      fi
>> >>
>> >> -    # Set the owner of the ovn_dbdir (with -R option) to OVN_USER if
>> set.
>> >> -    # This is required because the ovndbs are created with root
>> permission
>> >> -    # if not present when create_cluster/upgrade_db is called.
>> >> +    # Database files may be created as root before ovsdb-server drops
>> >> +    # privileges, so keep ownership aligned with OVN_USER when
>> configured.
>> >>      INSTALL_USER="$(id -un)"
>> >>      INSTALL_GROUP="$(id -gn)"
>> >>      [ "$OVN_USER" != "" ] && INSTALL_USER="${OVN_USER%:*}"
>> >> @@ -286,7 +285,6 @@ $cluster_remote_port
>> >>
>> >>      chown -R $INSTALL_USER:$INSTALL_GROUP $ovn_dbdir
>> >>      chown -R $INSTALL_USER:$INSTALL_GROUP $OVN_RUNDIR
>> >> -    chown -R $INSTALL_USER:$INSTALL_GROUP $ovn_logdir
>> >>      chown -R $INSTALL_USER:$INSTALL_GROUP $ovn_etcdir
>> >>
>> >>      set ovsdb-server
>> >> diff --git a/utilities/ovn-lib.in b/utilities/ovn-lib.in
>> >> index 5a0766816..0b19149da 100644
>> >> --- a/utilities/ovn-lib.in
>> >> +++ b/utilities/ovn-lib.in
>> >> @@ -133,7 +133,6 @@ start_ovn_daemon () {
>> >>      set "$@" --detach
>> >>      test X"$MONITOR" = Xno || set "$@" --monitor
>> >>
>> >> -    chown -R $INSTALL_USER:$INSTALL_GROUP $ovn_logdir
>> >>      chown -R $INSTALL_USER:$INSTALL_GROUP $ovn_rundir
>> >>
>> >>      start_wrapped_daemon "$wrapper" $daemon "$priority" "$@"
>> >> diff --git a/utilities/ovn-tmpfiles.conf.in b/utilities/
>> ovn-tmpfiles.conf.in
>> >> new file mode 100644
>> >> index 000000000..d37391f88
>> >> --- /dev/null
>> >> +++ b/utilities/ovn-tmpfiles.conf.in
>> >> @@ -0,0 +1,2 @@
>> >> +d @LOGDIR@ 0750 @LOGUSER@ @LOGGROUP@ -
>> >> +f @LOGDIR@/ovn-controller.log 0640 @LOGUSER@ @LOGGROUP@ -
>> >> \ No newline at end of file
>>
>>
>
> --
> Best Regards
> Zhang Hua(张华)
> Software Engineer | Canonical
> IRC:  zhhuabj
> We are hiring
> <https://canonical.com/careers?utm_source=signature&utm_medium=email> | Life
> at Canonical <https://www.linkedin.com/company/canonical/life/>
>


-- 
Best Regards
Zhang Hua(张华)
Software Engineer | Canonical
IRC:  zhhuabj
We are hiring
<https://canonical.com/careers?utm_source=signature&utm_medium=email> | Life
at Canonical <https://www.linkedin.com/company/canonical/life/>
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to