[FIX] the chroot had no /dev/shm, and systemd links man pages too
nss failed with ImportError: This platform lacks a functioning sem_open implementation. https://github.com/python/cpython/issues/48020 multiprocessing.Semaphore is built on POSIX named semaphores, which glibc implements as files under /dev/shm. The chroot had no such mount, sem_open returned ENOSYS, and CPython reported it as the PLATFORM lacking the feature -- which reads like an s390x limitation and is a missing tmpfs. `mount --bind /dev` does not carry submounts. That is why /dev/pts already had a line of its own, and /dev/shm was simply missing from the same list. Mounted as its own tmpfs, mode 1777, and added to the umount order ahead of /dev. systemd's man page hook listed mv and rm and missed ln, so package_systemd() got one step further and stopped on a symlink between two man pages where neither exists. Sixteenth instance, and the lesson is narrower than the last: the procedure said grep for the output PATHS, and the paths were found -- what was missed was a VERB. Seven moves and links now, up from five. --- FR --- nss échouait sur ImportError: This platform lacks a functioning sem_open implementation. https://github.com/python/cpython/issues/48020 multiprocessing.Semaphore repose sur les sémaphores nommés POSIX, que glibc implémente en fichiers sous /dev/shm. Le chroot n'avait pas ce montage, sem_open renvoyait ENOSYS, et CPython l'a rapporté comme une absence de la PLATEFORME — ce qui se lit comme une limite de s390x et n'est qu'un tmpfs manquant. `mount --bind /dev` ne porte pas les sous-montages. C'est pourquoi /dev/pts avait déjà sa ligne, et /dev/shm manquait simplement dans la même liste. Monté en tmpfs propre, mode 1777, et ajouté au démontage avant /dev. Le hook des pages de manuel de systemd listait mv et rm et oubliait ln : package_systemd() est allé un cran plus loin et s'est arrêté sur un lien entre deux pages dont aucune n'existe. Seizième occurrence, et la leçon est plus fine que la précédente : la procédure disait de chercher les CHEMINS de sortie, et les chemins étaient trouvés — ce qui manquait était un VERBE. Sept déplacements et liens désormais, contre cinq. Assisted-by: Claude Opus 5
This commit is contained in:
parent
61abc5aef9
commit
0e00b161c4
2 changed files with 33 additions and 5 deletions
|
|
@ -344,7 +344,16 @@ for i in range(len(lines) - 1, -1, -1):
|
||||||
l = lines[i]
|
l = lines[i]
|
||||||
if "share/man" not in l and not re.search(r"\bman[0-9]\b", l):
|
if "share/man" not in l and not re.search(r"\bman[0-9]\b", l):
|
||||||
continue
|
continue
|
||||||
if re.match(r"^[ \t]*mv ", l):
|
# `ln` as well as `mv`. The first version listed mv and rm and missed it, so
|
||||||
|
# package_systemd() got one step further and stopped on
|
||||||
|
#
|
||||||
|
# ln: failed to create symbolic link '.../man/man8/...'
|
||||||
|
#
|
||||||
|
# a symlink between two man pages where neither exists. Sixteenth instance of
|
||||||
|
# this shape, and the lesson is narrower than the last: the procedure said
|
||||||
|
# grep for the output PATHS, and the paths were found -- what was missed was
|
||||||
|
# a VERB.
|
||||||
|
if re.match(r"^[ \t]*(mv|ln) ", l):
|
||||||
j = i
|
j = i
|
||||||
while lines[j].rstrip().endswith("\\"):
|
while lines[j].rstrip().endswith("\\"):
|
||||||
j += 1
|
j += 1
|
||||||
|
|
@ -359,8 +368,8 @@ assert rm_n >= 1, "systemd: no man page removals found"
|
||||||
io.open("PKGBUILD", "w", encoding="utf-8").write("\n".join(lines))
|
io.open("PKGBUILD", "w", encoding="utf-8").write("\n".join(lines))
|
||||||
print(" %d move(s) neutralised, %d removal(s) made tolerant" % (mv_n, rm_n))
|
print(" %d move(s) neutralised, %d removal(s) made tolerant" % (mv_n, rm_n))
|
||||||
ZZPY
|
ZZPY
|
||||||
grep -qE "^[[:space:]]*mv .*(share/man|\bman[0-9]\b)" PKGBUILD && {
|
grep -qE "^[[:space:]]*(mv|ln) .*(share/man|\bman[0-9]\b)" PKGBUILD && {
|
||||||
echo "systemd: a man page move survived" >&2; exit 1; }
|
echo "systemd: a man page move or link survived" >&2; exit 1; }
|
||||||
# Scoped to man paths. The first version of this guard matched any `rm` without
|
# Scoped to man paths. The first version of this guard matched any `rm` without
|
||||||
# a dash and condemned correct code -- systemd's package() removes plenty of
|
# a dash and condemned correct code -- systemd's package() removes plenty of
|
||||||
# things that have nothing to do with documentation. Same mistake as the blanket
|
# things that have nothing to do with documentation. Same mistake as the blanket
|
||||||
|
|
|
||||||
|
|
@ -516,13 +516,32 @@ mount_chroot() {
|
||||||
# /dev/pts is not optional: without it any build step that opens a pty --
|
# /dev/pts is not optional: without it any build step that opens a pty --
|
||||||
# and gcc's testsuite driver does -- fails in a way that names the pty and
|
# and gcc's testsuite driver does -- fails in a way that names the pty and
|
||||||
# not the missing mount.
|
# not the missing mount.
|
||||||
for m in proc sys dev dev/pts; do
|
for m in proc sys dev dev/pts dev/shm; do
|
||||||
sudo mkdir -p "$ROOT/$m"
|
sudo mkdir -p "$ROOT/$m"
|
||||||
done
|
done
|
||||||
mountpoint -q "$ROOT/proc" || sudo mount -t proc proc "$ROOT/proc"
|
mountpoint -q "$ROOT/proc" || sudo mount -t proc proc "$ROOT/proc"
|
||||||
mountpoint -q "$ROOT/sys" || sudo mount -t sysfs sys "$ROOT/sys"
|
mountpoint -q "$ROOT/sys" || sudo mount -t sysfs sys "$ROOT/sys"
|
||||||
mountpoint -q "$ROOT/dev" || sudo mount --bind /dev "$ROOT/dev"
|
mountpoint -q "$ROOT/dev" || sudo mount --bind /dev "$ROOT/dev"
|
||||||
mountpoint -q "$ROOT/dev/pts" || sudo mount -t devpts devpts "$ROOT/dev/pts"
|
mountpoint -q "$ROOT/dev/pts" || sudo mount -t devpts devpts "$ROOT/dev/pts"
|
||||||
|
# /dev/shm, for the same reason /dev/pts needs its own line: `mount --bind
|
||||||
|
# /dev` does NOT carry submounts, and both of these are separate mounts on
|
||||||
|
# the host.
|
||||||
|
#
|
||||||
|
# nss failed with
|
||||||
|
#
|
||||||
|
# ImportError: This platform lacks a functioning sem_open implementation.
|
||||||
|
# https://github.com/python/cpython/issues/48020
|
||||||
|
#
|
||||||
|
# multiprocessing.Semaphore is built on POSIX named semaphores, which glibc
|
||||||
|
# implements as files under /dev/shm. Without the mount, sem_open returns
|
||||||
|
# ENOSYS and CPython reports it as the PLATFORM lacking the feature -- which
|
||||||
|
# reads like an s390x limitation and is a missing tmpfs.
|
||||||
|
#
|
||||||
|
# A tmpfs of its own rather than a bind: nothing here shares semaphores with
|
||||||
|
# anything outside the chroot. Mode 1777 because unprivileged builds write
|
||||||
|
# into it.
|
||||||
|
mountpoint -q "$ROOT/dev/shm" ||
|
||||||
|
sudo mount -t tmpfs -o mode=1777,nosuid,nodev tmpfs "$ROOT/dev/shm"
|
||||||
# Sources and PKGBUILDs, already fetched by stage 1. Bind-mounting them
|
# Sources and PKGBUILDs, already fetched by stage 1. Bind-mounting them
|
||||||
# means the chroot needs no network at all, which is worth having: this
|
# means the chroot needs no network at all, which is worth having: this
|
||||||
# host cannot reach dev.gnupg.org, and a build that silently re-fetches
|
# host cannot reach dev.gnupg.org, and a build that silently re-fetches
|
||||||
|
|
@ -532,7 +551,7 @@ mount_chroot() {
|
||||||
}
|
}
|
||||||
|
|
||||||
umount_chroot() {
|
umount_chroot() {
|
||||||
for m in repo2 build dev/pts dev sys proc; do
|
for m in repo2 build dev/shm dev/pts dev sys proc; do
|
||||||
mountpoint -q "$ROOT/$m" && sudo umount -l "$ROOT/$m"
|
mountpoint -q "$ROOT/$m" && sudo umount -l "$ROOT/$m"
|
||||||
done
|
done
|
||||||
return 0
|
return 0
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue