Main differences between MARK and Sambuca #
1. Static UID/GID #
The system UID (user ID) and GID (group ID) of the major services are statically
allocated and managed through the entities tool and his catalog. This helps
to have a more linear installation between systems and help on share network
filesystems like NFS.
It is possible to see the list of the available uid/gid with the following commands:
$> # Show list of all groups availables in our catalog
$> entities list groups --specs-dir /usr/share/macaroni/entities/
$> # Show list of all users available in our catalog
$> entities list users --specs-dir /usr/share/macaroni/entities/
$> # Show list of all shadow available in our catalog
$> entities list shadow --specs-dir /usr/share/macaroni/entities/
$> # Show list of all gshadow available in our catalog
$> entities list gshadow --specs-dir /usr/share/macaroni/entities/
$> # Show list of all groups configured in the current rootfs
$> entities list groups
$> # Show list of all users configured in the current rootfs
$> entities list users
The entities tool is a replacement of the classic adduser, gpasswd, etc.
This will not be a real difference when the issue
#27
will be completed but at the moment, MARK uses the user.eclass available in
the tree to dynamically create new users/groups.
We don’t follow the Gentoo behaviour with acct-* packages.
2. USE flags not aligned to MARK Profiles #
In order to have binary packages to support different DEs and different
features is needed mix different profiles, mix-in and USEs.
To reach this target means that a lot of USE flags must be enabled
but without trying to inject unnecessary dependencies when possible.
So, for this reason, the control of the use flags selected for every
package is done by the anise-portage-converter tool on build phase,
that permits to override existing dependencies and/or elaborate
dependencies based on the use flags defined in the anise-portage-converter
specs. This permits great control of the compilation process but
unfortunately, doesn’t permit it to maintain compatibility with the MARK
profiles that are used to configure the use flags based on the needs
of the users and their choice. This means that installing Macaroni’s
packages and just using emerge could be not managed with a simple
configuration of the MARK profiles and instead it’s highly probable
that just trying to emerge the world will ask for changes of the
use flags used instead by Sambuca stack.
If the users prefer to use more the binary stack and keep MARK to apply
particular patch, recompile specific packages with additional
CFLAGS, LDFLAGS, etc. it’s needed force definition of USE under
/etc/portage/package.use/. This behaviour override the normal MARK
logic but could be later customized by the users. To help users in this
join it’s available the tool pkgs-checker that permits to generate
the file with all USE of the installed packages. So, a possible workflow
could be, install all binary packages needed and later executed these
commands:
$> # Install pkgs-checker if not available
$> anise i -y pkgs-checker # or `emerge pkgs-checker`
$> mkdir -p /etc/portage/package.use
$> pkgs-checker portage gen-pkgs-uses --filter-opts \
/usr/share/pkgs-checker/gen-uses-filter.yaml > /etc/portage/package.use/99-pkgs-checker.use
Normally, this operation could be executed after every anise
upgrade or a new packages installed. The pkgs-checker reads the
directory /var/db/pkg and retrieve all used USE flags and write them
to the stdout.
3. Split packages #
In order to support multiple use cases but with fewer dependencies
injected we have some packages that have been split without having a 1:1 map
with an ebuild. For example, the pinentry package installs additional binary
when gtk/gnome use flag is enabled with the pinetry-gnome binary or with
the qt use flag the pinentry-qt, etc.
Thanks to our build process it’s very easy to assign the specific file to
a specific package, but this package will be without portage metadata and
instead, the use flags of the main pinentry package will be minimal.
Probably, in the near future we will split also the MARK packages in order to avoid these differences and keep more aligned the Sambuca stack to MARK.
4. Packages from scratch #
Sambuca stack doesn’t depend strictly from MARK. anise-build can be used
to compiles packages from scratch (this is what we will do with MFS). For
this packages the users can retrieve installed files only with anise and
not from Portage tools.
This is a good example that Sambuca could be also a gate between different
worlds.
5. Portage metadata optional #
The installation of the Portage metadata and the include files are optional,
they are installed only when the subsets devel and portage are enabled.
This permits users without the need to compile software to reduce space used
in their filesystem. Normally, the ISOs with Mark suffix are configured
with both subsets.
The Portage package database under the directory /var/db/pkg is then used by
the anise-portage-converter tool to compare packages updates with emerge that
will be added in the Macaroni database with the scm repository and will be
part of the Macaroni upgrades if the installed version will be elder or will be
the same version available in Macaroni repository. In particular, in order to
automatically install missing runtime dependencies the anise tool creates a
hash will the requires of the analyzed package and if this hash is different
from the hash of the installed package will be queued for the upgrade with the
asterisk in the version (for example, *1.1.1). It’s possible that the injected
package added from anise-portage-converter will have different requires of
the Macaroni original specs; this is the reason because will be replaced.
This could be avoided by masking the package.
6. etc-update and env-update implementation #
The Funtoo/Gentoo etc-update and env-update scripts are supplied by the
sys-apps/portage package that requires Python to be installed with a lot
of dependencies.
In order to reduce the installation of the packages for a Macaroni’s minimal
image where Python is not something needed, for example considering CD/CI
tasks, Macaroni implements the macaronictl etc-update that supplies
an etc-update compliant command and as a replacer. It has a few differences
that are more related to the interactive shell but for the rest, it’s
pretty similar.
NOTE: To use
macaronictl etc-updateis neededsys-apps/diffutils.
The same concept is applicable to the macaronictl env-update command that
reimplements a Portage-compliant logic. The behavior is configurable, instead
of updating every time the system and the (t)csh environment files, for these
two the configuration is enabled respectively with the options --systemd and --csh.
We suggest to use macaronictl etc-update and macaronictl env-update
instead of using the Portage tools.
7. Post-install/Post-remove commands #
In the Funtoo/Gentoo world where every package is compiled the ebuild file
contains the instructions about how to compile the package supply yet the
steps for the post-installation and post-remove. Macaroni divides completely
the build process from the runtime/install phase and as described in the
previous chapters the Portage metadata could not be present, like the kits.
In Macaroni, the post-install and post-remove operations are managed by the
finalizer that could be added in the anise specs over the YAML file
finalize.yaml of the package. Due to the complexity of this phase, and
because sometimes could be helpful to re-run the post-install steps we have
created the tool whip that collects the instructions about what runs as
a specific hook. The hook is a scripted list of commands to run that will
be used also in the pkg_postinstall and pkg_postrm phases of the ebuild
in order to align the behaviour between MARK and Sambuca and to have a way
to easily force rerun of the postinstall scripts.
8. Anise solver logic #
The Funtoo/Gentoo’s Portage solver always considers RDEPEND (runtime dependencies) as
mandatory dependencies for the compilation of a package. We understand this choice,
for example, this is needed for virtual package, the consequence is the ebuilds have
some dependencies added as RDEPEND when could be more correct to have them as DEPEND
for Macaroni. So, for these use cases, we override the dependencies through the
anise-portage-converter specs.
Another big difference is that at the moment the anise solver doesn’t support the
OR condition needed to supply alternative packages supply the same feature.
This is been a design choice to try to maintain things more simple for the solver,
a similar functionality could be handled by the provides and the mask feature.
But it’s something that could be grown based on the use cases we need to support.
The provides was also present in the past in Portage as PROVIDES but later removed.
Third, the default behavior of the solver in the upgrading process is to select only
packages with a greater version for speedup reasons. The downgrade is possible on
adding --deep flag on upgrade command.
9. Kernel, initrd and extra modules #
The kernel packages from anise are based on vanilla or Zen kernel, compiled over the
Macaroni Terragon Release system but without generating Portage metadata.
The kernels could be managed through macaronictl tool but are not visible to Portage
but we follow a versioning logic that use the kernel release (5.10, 6.1, etc.) as a
SLOT where the category contains the kernel release and the string kernel-.
So, the package kernel-5.10/macaroni-full-5.10.198 will be upgraded by the package
kernel-5.10/macaroni-full-5.10.199, etc.
In a similar way, the extra kernel modules will be managed with the same logic the category but with the version of the module used, for example, for ZFS, the package will be kernel-5.10/zfs-kmod-2.2.0 and for new kernel release we will bump a new build version of the same package, for example, kernel-5.10/zfs-kmod-2.2.0+1.
About initrd, at the moment we use a custom initrd based of Golang u-root for the
Macaroni ISO, and instead it’s used Dracut for the generation of the initrd images in the
installed rootfs (Desktop and Server).