Repository navigation
Keep the Windows VM boundary probe off the host's mounts - #1
Merged
Merged
Conversation
The battery service ran `powerprofilesctl get` every two seconds to keep the active profile visible to the wallpaper and lock services. That command is a PyGObject script, so the shell spawned a Python interpreter for it tens of thousands of times a day. Roughly once a day one of those exits into a CPython 3.14 finalization race (python/cpython#124619): the GLib D-Bus worker thread calls PyGILState_Ensure after the interpreter is torn down and the process dies with SIGSEGV, leaving a core dump and a crash notification behind. Read the ActiveProfile property straight from power-profiles-daemon with busctl, the same way omarchy-powerprofiles-set already reads UPower. The output is JSON, so an empty or malformed reply when the daemon is not running still reads as no active profile, matching the previous behaviour. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011gbfh4Mi9dK6SAd1P2xMTi
The kernel leaves NVMe on none and everything else on mq-deadline. Neither bounds latency once the device queue fills, so a large build, copy, or package upgrade can make the desktop sluggish while reads wait behind a wall of writes. Kyber keeps separate read and sync-write queues and throttles the depth it submits to hit a 2ms read target, which keeps interactive reads flowing under heavy writes at negligible CPU cost. The trade is a small ceiling on peak throughput on very fast devices, which matters for a storage server chasing IOPS but not for a desktop. Ships as a package-owned udev rule in /etc so it applies at boot and on hot-plug. Existing installs pick it up at the next boot. zram is left alone since it has nothing to schedule. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
udev patterns are shell globs, so nvme[0-9]*n[0-9]* also matched every partition. Partitions have no queue/scheduler, and udev logged a "Could not chase sysfs attribute" for each one at boot. Restrict the match to SUBSYSTEM block with DEVTYPE disk, which also keeps mmcblk boot areas and NVMe multipath nodes out. Reword the comment: kyber targets a read latency rather than bounding it, and the kernel's default choice depends on the device rather than being a fixed NVMe versus everything-else split. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Fix typo in manual
Use the kyber I/O scheduler on real disks
1Password 8.12 changed its app id from "1Password" to "com.onepassword.OnePassword" (its .desktop file now declares that as StartupWMClass). Our window rule only matched the old name, so the main window came up tiled and lost the no_screen_share protection. Match both forms so older installs keep working. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LSFKDatumRZHB8zqk5CP5C
Match 1Password's new window class so it floats again
The repo moved to the omacom org. GitHub redirects the old URLs, but `omarchy channel set dev` was still cloning from basecamp/omarchy, which left every dev checkout with a stale origin remote that confuses gh (pr create fails with "No commits between omacom:quattro and basecamp:<branch>"). Update the clone URL, the quattro upgrade tarball, the update-confirm release link, the systemd Documentation link, and the manual. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LSFKDatumRZHB8zqk5CP5C
Add Cloudflare CLI lazy wrapper
Point GitHub URLs at omacom/omarchy instead of basecamp/omarchy
No branch on the repo is protected and there are no rulesets, so the file never enforced owner review. Its only effect was auto-requesting a review from the other owner on every PR, which nobody acted on. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Remove CODEOWNERS
…edumps Poll the active power profile over D-Bus instead of powerprofilesctl
…gration Migrate Panther Lake systems to the Omarchy PTL kernel
The probe re-execs into an isolated namespace only when EUID is not 0, so a root test runner -- a container, a root CI job, sudo ./test/all -- walks past the unshare and lands its tmpfs mounts on the live system. /run, /var and /home are replaced in the caller's own namespace, hiding the running session's runtime state and every home directory, the checkout included, for as long as the machine stays up. Nothing unmounts them when the file exits. Gate the re-exec on a marker variable instead, the way the sibling compose probe already does, and give uid 0 a plain mount namespace since it needs no user namespace to get one. Root now runs the probe in full rather than wrecking the machine that started it, and a runner that can make no namespace at all skips as before. Record the caller's mount namespace before the re-exec and refuse to mount when the probe still sits in it, so this fails closed rather than destructively if the isolation ever lapses again. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MUNbTymYv46cHfVS6gz7dW
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars. ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Advanced Run ID: Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
therahul-yo
marked this pull request as ready for review
September 14, 2026 05:59
therahul-yo
added a commit
that referenced
this pull request
Oct 2, 2026
Keep the Windows VM boundary probe off the host's mounts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fork audit
Compared
therahul-yo/omarchyagainst upstream (basecamp/omarchy, which now redirects toomacom/omarchy— both serve identical SHAs on every branch).quattro@692c02cquattro@b679363bThis branch is therefore based on
upstream/quattro, so merging it both brings the fork current (the 17 upstream commits, including the Panther Lake kernel migration, the kyber I/O scheduler rule, the 1Password window class fix, and thebasecamp→omacomURL move) and lands the fix below.The bug
test/shell.d/windows-vm-mount-boundary-test.shmounts tmpfs over/run,/varand/hometo fake a system for the privilegedomarchy-windows-vmhelper. That is only safe inside its own mount namespace, and the file re-execs itself into one — but only when it is not already root:A root test runner — a container, a root CI job,
sudo ./test/all— arrives withEUIDalready 0, so the wholeunshareis skipped and themount -t tmpfs ...calls land on the caller's own namespace. Nothing unmounts them when the file exits, so for the rest of the machine's uptime:/runis an empty 8 MB tmpfs — the session's runtime state, sockets and$XDG_RUNTIME_DIRare gone/varis an empty 16 MB tmpfs — the pacman database and logs are hidden/homeis an empty 16 MB tmpfs — every home directory disappears, the checkout with itBeing root is not isolation, which is exactly the assumption the
EUIDcheck encodes. The file's own comment shows the hazard was known but assumed handled: "The checkout may live under /home, which the tmpfs below hides, so take a mount-safe copy of the helper before the mounts land."Observed, not theorized
This reproduced while auditing the fork:
./test/allwas run as root, and the repository checkout vanished mid-session. The tmpfs mounts the test creates were still sitting on the host afterwards:Those names come only from this file. Every test that ran after it, and everything else on the machine that reads
/run,/varor/home, was working against empty tmpfs.The fix
Gate the re-exec on a marker variable rather than on uid — the pattern the sibling
windows-vm-compose-test.shalready uses — and give uid 0 a plain mount namespace, since it needs no user namespace to get one:unshare --mount --propagation private--user --map-auto --map-root-user --mount)Then record the caller's mount namespace before the re-exec and refuse to mount while still in it, so any future lapse in isolation fails closed instead of destructively.
Coverage improves rather than shrinks: a root runner previously ran the probe and wrecked the host; it now runs the probe in full and leaves the host alone.
Verification
Run as root in a container, on the fixed file:
All nine assertions pass and the host mount table is unchanged. Before the fix the same command replaced
/run,/varand/home.New regression test,
test/shell.d/mount-namespace-isolation-test.sh, which stubsmount(8)so a regression records a call instead of landing one:It fails (exit 1) against the pre-fix file and passes after, and it passes inside a full
./test/shellrun.windows-vm-test.shandbin-style-test.shalso pass.docs/testing.mdgains the convention under "Conventions worth copying" so the next mounting test does not re-derive it.Not duplicate
No upstream issue, pull request, or branch covers this. Searches across
omacom/omarchyfor the test file name,unshare, mount-namespace and root-runner phrasings return nothing; the ninewindows-vmmount hits are all about the runtime0700/setgid mode check inbin/omarchy-windows-vm(omacom#9874, omacom#10004, omacom#10035, omacom#10114, omacom#10149, omacom#10256, omacom#10321, omacom#10399, PRs omacom#9783 and omacom#10113), a different file and a different failure. No upstream branch touches test-namespace isolation.Scope note
One pre-existing, unrelated failure was observed and deliberately left alone:
windows-vm-compose-test.shexits 2 under a root runner (cannot identify the user who authorized this action, since--map-current-usermaps root to root andPKEXEC_UIDis unset). It fails safely inside its own namespace and is a separate change.