Packages s390-tools and s390-tools-signed uploaded
(with fixes not only for LP#2044104, but also for LP#2103414 ad LP#2078347).
** Description changed:
+ SRU Justification:
+
+ [ Impact ]
+
+ * The CCW (or zdev) devices that are special for s390x always need
+ to be explicitly enabled before they can be used.
+ And this is usually done with the help of the 'chzdev -e' command
+ (part of the s390-tools), that also creates underlying udev rules
+ for the device activation.
+
+ * When for example a qeth network device is persistently configured by
+ 'chzdev -e' the initramfs is usually rebuild, since the corresponding
+ udev rule might be needed in initramfs (early at boot time).
+
+ * But chzdev also has the parameter 'zdev:early' that allows to explicity
+ direct if the initramfs should be rebuild and the udev rule integrated
+ (zdev:early=1) or not (zdev:early=0).
+
+ * Right now the initramfs is erroneously rebuild every time and
+ includes all (zdev) udev rules, just ignoring the zdev:early parameter.
+
+ * This can have a significant impact especially on systems with hundreds
+ (or even thousands) of devices and can lead to space constraints.
+ (Note that also larger ranges of devices can easily be enables with one
cmd.)
+
+ * For example supplemental devices (like disks), that are not relevant
+ at early boot time (and for example may only be used in backup or take-over
+ cases) must not be always activated at boot time.
+
+ * On system in DPM mode this can also be (to a certain degree) controlled
+ by the HMC (but only in DPM mode).
+
+ * To fix this situation, two things are needed:
+ - s390-tools: have an option in chzdev that allows to identify if an udev
rule is
+ zdev related or not.
+ (since a udev rule could also be generic, and not specific to s390x).
+ - systemd: handle zdev related rules in extra/initramfs-tools/hooks/udev
+ properly according to the zdev:early parameter or use a proper default
+
+ [ Test Plan ]
+
+ * Have an s390x LPAR or z/VM system with several ccw/zdev devices.
+ Some might be in use (e.g. for the underlying disk of the main
+ network device), but some spares to test with are needed.
+ Easiest is to use qeth network devices.
+
+ * List the available devices:
+ $ lszdev | grep qeth | head -3
+ qeth 0.0.c000:0.0.c001:0.0.c002 yes yes
encc000
+ qeth 0.0.c003:0.0.c004:0.0.c005 no no
+ qeth 0.0.c006:0.0.c007:0.0.c008 no no
+ Notice that using only a short form of the device triples is sufficient.
+ Here c000 is already active, but c003 and c006 are not.
+
+ * Check which qeth devices are in the current initramfs:
+ lsinitramfs /boot/initrd.img-$(uname -r) | grep
usr/lib/udev/rules.d/41-qeth-0.0.c00
+ usr/lib/udev/rules.d/41-qeth-0.0.c000.rules
+ Like expected, only c000 is listed.
+
+ * Now add a second device and explicity direct to not include it
+ into the initramfs (using parameter 'zdev:early=0'):
+ $ sudo chzdev -e qeth 0.0.c003 zdev:early=0
+ and check what's in the initramfs:
+ $ lsinitramfs /boot/initrd.img-$(uname -r) | grep
usr/lib/udev/rules.d/41-qeth-0.0.c00
+ usr/lib/udev/rules.d/41-qeth-0.0.c000.rules
+ Still c000 only.
+
+ * Now add another device, but this time explicitly directing
+ to incl. the corresponding udev rule into initramfs:
+ $ sudo chzdev -e qeth 0.0.c006 zdev:early=1
+ and check again the content of the initramfs:
+ $ lsinitramfs /boot/initrd.img-(uname -r) | grep
usr/lib/udev/rules.d/41-qeth-0.0.c00
+ usr/lib/udev/rules.d/41-qeth-0.0.c000.rules
+ usr/lib/udev/rules.d/41-qeth-0.0.c006.rules
+ Now both are included.
+
+ * More for regression testing disable/remove the devices again
+ ('zdev:early' parameter is irrelevant in this case):
+ sudo chzdev -d qeth c003
+ sude chzdev -d qeth c006
+ check:
+ $ lsinitramfs /boot/initrd.img-(uname -r) | grep -i
usr/lib/udev/rules.d/41-qeth-0.0.c00
+ usr/lib/udev/rules.d/41-qeth-0.0.c000.rules
+
+ * Add a device without parameter 'zdev:early' specified at all,
+ which needs to default to 'zdev:early=1':
+ sudo chzdev -e qeth c003
+ and check:
+ $ lsinitramfs /boot/initrd.img-(uname -r) | grep -i
usr/lib/udev/rules.d/41-qeth-0.0.c00
+ usr/lib/udev/rules.d/41-qeth-0.0.c000.rules
+ usr/lib/udev/rules.d/41-qeth-0.0.c003.rules
+
+ [ Where problems could occur ]
+
+ * The modification in the s390-tools are to expand the chzdev command with
+ the option '--is-owner <rule>' that allows to identify a zdev rule.
+
+ * Since it's added (no existing code line was removed or modified) the impact
+ is moderate, because it is obviously not in use yet by anyone using noble.
+
+ * However, the code for this option got inserted into existing, hence in case
+ the new lines are not properly closed/terminated problem can occur
+ that can even have an impact on other chzdev arguments and paramaters
+ (e.g. the ones that are in the case stmt before and after 'is-owner').
+
+ * The exit code EXIT_UNKNOWN_FILE of 'is-owner' is 33, whereas the defined
+ number could be wrong, used accidentially multiple times or a different
+ exit code is expected, which may lead to wrong states.
+
+ * The upstream commit needed to be modifed in one aspect (to backport it to
2.31).
+ Between version 2.33, where 'is-owner' was added and the version in noble
+ (2.31) a refactoring happend (commit 4c2bfb1d47e7), that led (amongst
other,
+ not relevant changes) to a the renaming of the file zdev/include/site.h to
+ zdev/include/zdev.h.
+ Fortunately the content of the file stayed the same, so that no add.
+ commit needed to be applied, but only the file name in the quilt patch
adjusted.
+
+ * Some modification are for the man page and usage.txt file only.
+
+ * For systemd / extra/initramfs-tools/hooks/udev the modification of this
+ LP#2044104 are not sofficient, since after all this was introduced into
oracular
+ two more cases occured that needed to be handled on top, that are:
+ - ensure rules file exists before invoking chzdev (LP: #2079993)
+ - udev rules are copied in case zdev_early is not specified (LP: #2102236)
+
+ * To simplyfy the systemd modifications (and with that reduce risk) the
+ version check of the initial modfification that checks for the s390-tools
+ version (2.33, to ensure that chzdev '--is-owner' is only used if the right
+ s390-tools package is available) got removed, since this is now backported
+ to previous version 2.31 (hence would fail).
+ And because noble will never get a new version anymore, the check is
obsolete.
+
+ * All this affects the s390x architecture only.
+
+ * (We may think of removing it from the current development release as well
+ that comes today with v2.38.0, since we will never go back to an older
+ s390-tools version.)
+
+ [ Other Info ]
+
+ * The systemd / udev changes will be piggy-baged on a bigger systemd update
+ (to avoid too many updates, since this affects s390x-only but would trigger
+ updates for other architectures too.)
+
+ * The s390-tools and systemd modifications can be done separately,
+ in case s390-tools has landed in the archive before the systemd
+ modifications, since systemd will be the first exploiter of the
+ s390-tools modification.
+ Hence a grouped upload is not needed, if s390-tools is handled first.
+
+ * A test build in PPA is available here:
+
https://launchpad.net/~fheimes/+archive/ubuntu/lp2103414+lp2078347+lp2044104
+ and the test packages were tested:
+ https://pastebin.canonical.com/p/nfGDnHVYWd/
+ __________
+
Versions:
Ubuntu 20.04.5 s390-tools version 2.12.0-0ubuntu3.7.s390x
Ubuntu 22.04.2 s390-tools version 2.20.0-0ubuntu3.2.s390x
When I configure a zfcp LUN persistently via chzdev, the initrd is being
rebuilt even with parameter zdev:early=0
root@a8315003:~# chzdev -e zfcp-lun
0.0.1803:0x500507630910d430:0x4019409200000000 zdev:early=0
zFCP LUN 0.0.1803:0x500507630910d430:0x4019409200000000 configured
Note: The initial RAM-disk must be updated for these changes to take effect:
- - zFCP LUN 0.0.1803:0x500507630910d430:0x4019409200000000
+ - zFCP LUN 0.0.1803:0x500507630910d430:0x4019409200000000
update-initramfs: Generating /boot/initrd.img-5.15.0-60-generic
I: The initramfs will attempt to resume from /dev/dasdb1
I: (UUID=e70ecb80-4d1e-4074-9cda-ce231ad6e698)
I: Set the RESUME variable to override this.
Using config file '/etc/zipl.conf'
Building bootmap in '/boot'
Adding IPL section 'ubuntu' (default)
Preparing boot device: dasda (c00a).
Done.
root@a8315003:~#
== Comment: - Thorsten Diehl <[email protected]> - 2023-03-01
06:55:47 ==
@BOE-dev
This behaviour is unexpected.
https://www.ibm.com/docs/en/linux-on-systems?topic=commands-chzdev says:
Activating a device early during the boot process
Use the zdev:early device attribute to activate a device early during
the boot process and to override any existing auto-configuration with a
persistent device configuration.
zdev:early=1
- The device is activated during the initial RAM disc phase according to
the persistent configuration.
+ The device is activated during the initial RAM disc phase according to
the persistent configuration.
zdev:early=0
- The device is activated as usual during the boot process. This is the
default. If auto-configuration data is present, the device is activated during
the initial RAM disc phase according to the auto-configuration.
+ The device is activated as usual during the boot process. This is the
default. If auto-configuration data is present, the device is activated during
the initial RAM disc phase according to the auto-configuration.
I can't interprete a SCSI LUN as a device with auto configuration data.
(At least, if the zfcp device hasn't NPIV enabled)
== Comment: #5 - Peter Oberparleiter <[email protected]> -
2023-03-01 11:18:28 ==
(In reply to comment #2)
> @BOE-dev
> This behaviour is unexpected.
> https://www.ibm.com/docs/en/linux-on-systems?topic=commands-chzdev says:
> Activating a device early during the boot process
- >
+ >
> Use the zdev:early device attribute to activate a device early during the
> boot process and to override any existing auto-configuration with a
> persistent device configuration.
- >
+ >
> zdev:early=1
> The device is activated during the initial RAM disc phase according to
> the persistent configuration.
- >
+ >
> zdev:early=0
> The device is activated as usual during the boot process. This is the
> default. If auto-configuration data is present, the device is activated
- > during the initial RAM disc phase according to the auto-configuration.
+ > during the initial RAM disc phase according to the auto-configuration.
The documentation is incorrect for Ubuntu. Canonical specifically builds
zdev in a way that every change to persistent device configuration
causes an update to the initial RAM-disk. See also:
https://bugzilla.linux.ibm.com/show_bug.cgi?id=187578#c35
https://github.com/ibm-s390-linux/s390-tools/commit/7dd03eaeecdd0e2674f145aca34be1275d291bd8
> I can't interprete a SCSI LUN as a device with auto configuration data. (At
> least, if the zfcp device hasn't NPIV enabled)
This is related to auto-configuration as implemented for DPM.
== Comment: #6 - Thorsten Diehl <[email protected]> - 2023-03-03
12:41:44 ==
So, IIUC, chzdev is built for Ubuntu with ZDEV_ALWAYS_UPDATE_INITRD=1, which
make the parameter zdev:early=0 ineffective. Correct?
If you confirm, you may also close this bug.
Not nice - then we have to find an alternate solution.
== Comment: #7 - Peter Oberparleiter <[email protected]> -
2023-03-07 06:48:07 ==
(In reply to comment #6)
> So, IIUC, chzdev is built for Ubuntu with ZDEV_ALWAYS_UPDATE_INITRD=1, which
> make the parameter zdev:early=0 ineffective. Correct?
> If you confirm, you may also close this bug.
- >
+ >
> Not nice - then we have to find an alternate solution.
chzdev -p on Ubuntu will by default rebuild the initrd. This is intended
behavior by Canonical and controlled by the ZDEV_ALWAYS_UPDATE_INITRD
build-time
switch. You can suppress it by adding option --no-root-update to the command
line.
Specifying zdev:early=0 to chzdev has exactly the effect that it is supposed
to
have: it tells zdev not to enable that device during initrd processing,
resulting in the corresponding udev rule not being copied to the initrd [1].
Unfortunately there is another Ubuntu-initrd script [2] that simply copies ALL
udev rules, including those created by zdev, into the initrd. As a result,
zdev's early-attribute handling is rendered useless and all devices are
enabled,
even if a user specified zdev:early=0.
Since this bug report indicates that there is a use-case for this function in
Ubuntu, it might be worth asking Canonical if current processing could be
changed to provide a way for users to specify that a device should
specifically
NOT be enabled within initrd processing.
Technically this could easily be done:
1) Have the generic udev initramfs script not copy zdev-generated Udev rules,
- OR
- have the zdev initramfs script remove those rules (somewhat of a hack)
+ OR
+ have the zdev initramfs script remove those rules (somewhat of a hack)
2) Change the zdev initramfs script logic from the current:
- - enable devices required for the root file system, AND
- - enable devices for which zdev:early=1 was specified
-
- to
-
- - enable all persistently configured devices EXCEPT those for which
- zdev:early=0 was specified
-
- This change would be needed to maintain Canonical's policy of enabling
- all devices in the initrd by default
+ - enable devices required for the root file system, AND
+ - enable devices for which zdev:early=1 was specified
+
+ to
+
+ - enable all persistently configured devices EXCEPT those for which
+ zdev:early=0 was specified
+
+ This change would be needed to maintain Canonical's policy of enabling
+ all devices in the initrd by default
I'm open to adding the change in 2) to our s390-tools package, but someone at
Canonical would need to work out a way to implement 1).
[1]
https://github.com/ibm-s390-linux/s390-tools/blob/master/zdev/initramfs/hooks/s390-tools-zdev#L47
[2]
https://git.launchpad.net/~ubuntu-core-dev/ubuntu/+source/systemd/tree/debian/extra/initramfs-tools/hooks/udev#n42
** Also affects: s390-tools (Ubuntu Plucky)
Importance: Undecided
Status: New
** Also affects: systemd (Ubuntu Plucky)
Importance: Undecided
Status: New
** Also affects: s390-tools (Ubuntu Questing)
Importance: Medium
Assignee: Skipper Bug Screeners (skipper-screen-team)
Status: Fix Released
** Also affects: systemd (Ubuntu Questing)
Importance: Medium
Assignee: Simon Chopin (schopin)
Status: Fix Released
** Also affects: s390-tools (Ubuntu Noble)
Importance: Undecided
Status: New
** Also affects: systemd (Ubuntu Noble)
Importance: Undecided
Status: New
** Changed in: systemd (Ubuntu Plucky)
Status: New => Fix Released
** Changed in: s390-tools (Ubuntu Plucky)
Status: New => Fix Released
** Also affects: s390-tools-signed (Ubuntu)
Importance: Undecided
Status: New
** Changed in: s390-tools-signed (Ubuntu Plucky)
Status: New => Fix Released
** Changed in: s390-tools-signed (Ubuntu Questing)
Status: New => Fix Released
** Changed in: s390-tools-signed (Ubuntu Noble)
Status: New => In Progress
** Changed in: s390-tools (Ubuntu Noble)
Status: New => In Progress
--
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/2044104
Title:
[UBUNTU 20.04] chzdev -e is rebuilding initramfs even with
zdev:early=0 set
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu-z-systems/+bug/2044104/+subscriptions
--
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs