From 1aceede596ea4c8e9d6d2a909765fb0e3260ebdd Mon Sep 17 00:00:00 2001 From: JumpyVi Date: Wed, 22 Jul 2026 14:51:27 -0400 Subject: [PATCH 01/86] feat: Transfer old repo --- .github/workflows/daily-8.1.yml | 35 - .github/workflows/daily-9.0.yml | 35 - .github/workflows/stable-8.1.yml | 35 - .gitignore | 23 +- Justfile | 22 + LICENSE | 686 +----------------- README.md | 21 +- cosign.pub | 4 + etc/auto/config | 75 -- etc/config/archives/elementary.key | 31 - etc/config/archives/elementary.list | 3 - etc/config/archives/patches.key | 31 - etc/config/archives/patches.list | 3 - etc/config/archives/patches.pref | 6 - .../bootloaders/grub-pc/dejavu-bold-14.pf2 | Bin 191158 -> 0 bytes .../bootloaders/grub-pc/dejavu-bold-16.pf2 | Bin 212142 -> 0 bytes .../grub-pc/elementary-theme/background.png | Bin 1049 -> 0 bytes .../grub-pc/elementary-theme/logo.png | Bin 2887 -> 0 bytes .../grub-pc/elementary-theme/theme.txt | 61 -- etc/config/bootloaders/grub-pc/grub.cfg | 39 - etc/config/bootloaders/isolinux/hdt.c32 | 1 - etc/config/bootloaders/isolinux/isolinux.bin | 1 - etc/config/bootloaders/isolinux/isolinux.cfg | 3 - etc/config/bootloaders/isolinux/ldlinux.c32 | 1 - etc/config/bootloaders/isolinux/libcom32.c32 | 1 - etc/config/bootloaders/isolinux/libgpl.c32 | 1 - etc/config/bootloaders/isolinux/libmenu.c32 | 1 - etc/config/bootloaders/isolinux/libutil.c32 | 1 - etc/config/bootloaders/isolinux/live.cfg.in | 27 - etc/config/bootloaders/isolinux/menu.c32 | 1 - etc/config/bootloaders/isolinux/stdmenu.cfg | 42 -- etc/config/bootloaders/isolinux/vesamenu.c32 | 1 - .../000-remove-blacklisted-packages.chroot | 21 - .../hooks/live/999-cleanup-apt-cache.chroot | 7 - .../hooks/live/apparmor-profiles.chroot | 16 - .../live/revert-os-release-divert.chroot | 14 - etc/config/hooks/live/set-disk-info.binary | 5 - .../hooks/live/setup-casper-folder.binary | 12 - .../includes.binary/.disk/base_installable | 0 etc/config/includes.binary/.disk/cd_type | 1 - etc/config/includes.binary/.disk/info | 1 - .../etc/apt/apt.conf.d/00trustcdrom | 1 - .../package-lists/desktop.list.chroot_install | 7 - .../package-lists/desktop.list.chroot_live | 1 - etc/config/package-lists/pool.list.binary | 26 - etc/terraform-amd64.conf | 30 - etc/terraform-arm64.conf | 30 - etc/terraform-daily-7.1-azure.conf | 30 - etc/terraform-daily-8.1-azure-amd64.conf | 30 - etc/terraform-daily-8.1-azure-arm64.conf | 30 - etc/terraform-daily-9.0-azure-amd64.conf | 30 - etc/terraform-daily-9.0-azure-arm64.conf | 30 - etc/terraform-stable-8.1-azure-amd64.conf | 30 - etc/terraform-stable-8.1-azure-arm64.conf | 30 - mkosi.bump | 4 + mkosi.clean | 6 + mkosi.conf | 27 + mkosi.conf.d/elementary/mkosi.conf | 2 + .../elementary/mkosi.conf.d/apparmor.conf | 8 + .../mkosi.conf.d/elementary-apps.conf | 23 + .../mkosi.conf.d/elementary-desktop.conf | 39 + .../mkosi.conf.d/elementary-panel.conf | 22 + .../mkosi.conf.d/elementary-settings.conf | 31 + .../elementary/mkosi.conf.d/elementary.conf | 57 ++ .../lib/dracut/dracut.conf.d/base-ubuntu.conf | 4 + .../usr/lib/dracut/dracut.conf.d/lvm2.conf | 1 + mkosi.extra/usr/lib/sysctl.d/60-apparmor.conf | 2 + .../systemd/system-preset/01-systemd.preset | 6 + .../system-preset/91-resolved-default.preset | 1 + .../systemd/user-preset/01-zirconium.preset | 4 + mkosi.extra/usr/lib/sysusers.d/session.conf | 2 + mkosi.extra/usr/lib/sysusers.d/wpa.conf | 1 + .../usr/lib/tmpfiles.d/99-factory.conf | 2 + mkosi.extra/usr/lib/tmpfiles.d/login.conf | 1 + .../usr/lib/tmpfiles.d/resolved-default.conf | 1 + mkosi.extra/usr/share/factory/etc/.gitkeep | 1 + .../flatpak/remotes.d/appcenter.flatpakrepo | 8 + .../flatpak/remotes.d/flathub.flatpakrepo | 8 + ...entary.desktop.wingpanel.power.gschema.xml | 10 + mkosi.postinst.chroot | 6 + mkosi.profiles/sysupdate/mkosi.conf | 55 ++ .../sysupdate/mkosi.conf.d/ubuntu/mkosi.conf | 20 + .../mkosi.extra/boot/loader/loader.conf | 1 + .../mkosi.extra/usr/lib/repart.d/00-esp.conf | 6 + .../usr/lib/repart.d/10-usr-verity-sig.conf | 4 + .../usr/lib/repart.d/11-usr-verity.conf | 6 + .../mkosi.extra/usr/lib/repart.d/12-usr.conf | 7 + .../usr/lib/repart.d/20-usr-verity-sig.conf | 3 + .../usr/lib/repart.d/21-usr-verity.conf | 6 + .../mkosi.extra/usr/lib/repart.d/22-usr.conf | 7 + .../mkosi.extra/usr/lib/repart.d/40-root.conf | 10 + .../mkosi.extra/usr/lib/repart.d/50-home.conf | 7 + .../system-preset/10-elementary.preset | 14 + .../lib/systemd/system/preset-global.service | 17 + .../sysupdate.d/10-usr-verity-sig.transfer | 16 + .../lib/sysupdate.d/11-usr-verity.transfer | 16 + .../usr/lib/sysupdate.d/12-usr.transfer | 16 + .../usr/lib/sysupdate.d/20-uki.transfer | 24 + .../mkosi.extra/usr/lib/tmpfiles.d/etc.conf | 78 ++ mkosi.profiles/sysupdate/mkosi.finalize | 8 + .../sysupdate/mkosi.postinst.chroot | 46 ++ .../sysupdate/mkosi.repart/00-esp.conf | 7 + .../mkosi.repart/10-usr-verity-sig.conf | 6 + .../sysupdate/mkosi.repart/11-usr-verity.conf | 8 + .../sysupdate/mkosi.repart/12-usr.conf | 10 + .../10-usr-verity-sig.transfer | 16 + .../mkosi.sysupdate/11-usr-verity.transfer | 16 + .../sysupdate/mkosi.sysupdate/12-usr.transfer | 16 + .../sysupdate/mkosi.sysupdate/20-uki.transfer | 23 + .../sysupdate/mkosi.uki-profiles/10-live.conf | 23 + .../sysupdate/mkosi.uki-profiles/20-ipe.conf | 16 + .../mkosi.uki-profiles/80-storagetm.conf | 15 + .../mkosi.uki-profiles/90-factory-reset.conf | 16 + .../91-factory-reset-with-tpm-clear.conf | 14 + .../mkosi.uki-profiles/95-emergency.conf | 16 + .../mkosi.uki-profiles/99-debug.conf | 18 + .../etc/apt/keyrings/elementary-os-daily.gpg | Bin 0 -> 1159 bytes .../apt/keyrings/elementary-os-os-patches.gpg | Bin 0 -> 1159 bytes .../elementary-os-daily.sources | 5 + .../elementary-os-patches.sources | 5 + upload.py | 18 - upload.sh | 65 -- workflows.sh | 12 - 123 files changed, 940 insertions(+), 1602 deletions(-) delete mode 100644 .github/workflows/daily-8.1.yml delete mode 100644 .github/workflows/daily-9.0.yml delete mode 100644 .github/workflows/stable-8.1.yml create mode 100644 Justfile create mode 100644 cosign.pub delete mode 100755 etc/auto/config delete mode 100644 etc/config/archives/elementary.key delete mode 100644 etc/config/archives/elementary.list delete mode 100644 etc/config/archives/patches.key delete mode 100644 etc/config/archives/patches.list delete mode 100644 etc/config/archives/patches.pref delete mode 100644 etc/config/bootloaders/grub-pc/dejavu-bold-14.pf2 delete mode 100644 etc/config/bootloaders/grub-pc/dejavu-bold-16.pf2 delete mode 100644 etc/config/bootloaders/grub-pc/elementary-theme/background.png delete mode 100644 etc/config/bootloaders/grub-pc/elementary-theme/logo.png delete mode 100644 etc/config/bootloaders/grub-pc/elementary-theme/theme.txt delete mode 100644 etc/config/bootloaders/grub-pc/grub.cfg delete mode 120000 etc/config/bootloaders/isolinux/hdt.c32 delete mode 120000 etc/config/bootloaders/isolinux/isolinux.bin delete mode 100644 etc/config/bootloaders/isolinux/isolinux.cfg delete mode 120000 etc/config/bootloaders/isolinux/ldlinux.c32 delete mode 120000 etc/config/bootloaders/isolinux/libcom32.c32 delete mode 120000 etc/config/bootloaders/isolinux/libgpl.c32 delete mode 120000 etc/config/bootloaders/isolinux/libmenu.c32 delete mode 120000 etc/config/bootloaders/isolinux/libutil.c32 delete mode 100644 etc/config/bootloaders/isolinux/live.cfg.in delete mode 120000 etc/config/bootloaders/isolinux/menu.c32 delete mode 100644 etc/config/bootloaders/isolinux/stdmenu.cfg delete mode 120000 etc/config/bootloaders/isolinux/vesamenu.c32 delete mode 100755 etc/config/hooks/live/000-remove-blacklisted-packages.chroot delete mode 100755 etc/config/hooks/live/999-cleanup-apt-cache.chroot delete mode 100755 etc/config/hooks/live/apparmor-profiles.chroot delete mode 100644 etc/config/hooks/live/revert-os-release-divert.chroot delete mode 100755 etc/config/hooks/live/set-disk-info.binary delete mode 100755 etc/config/hooks/live/setup-casper-folder.binary delete mode 100644 etc/config/includes.binary/.disk/base_installable delete mode 100644 etc/config/includes.binary/.disk/cd_type delete mode 100644 etc/config/includes.binary/.disk/info delete mode 100644 etc/config/includes.chroot/etc/apt/apt.conf.d/00trustcdrom delete mode 100644 etc/config/package-lists/desktop.list.chroot_install delete mode 100644 etc/config/package-lists/desktop.list.chroot_live delete mode 100644 etc/config/package-lists/pool.list.binary delete mode 100644 etc/terraform-amd64.conf delete mode 100644 etc/terraform-arm64.conf delete mode 100644 etc/terraform-daily-7.1-azure.conf delete mode 100644 etc/terraform-daily-8.1-azure-amd64.conf delete mode 100644 etc/terraform-daily-8.1-azure-arm64.conf delete mode 100644 etc/terraform-daily-9.0-azure-amd64.conf delete mode 100644 etc/terraform-daily-9.0-azure-arm64.conf delete mode 100644 etc/terraform-stable-8.1-azure-amd64.conf delete mode 100644 etc/terraform-stable-8.1-azure-arm64.conf create mode 100755 mkosi.bump create mode 100755 mkosi.clean create mode 100644 mkosi.conf create mode 100644 mkosi.conf.d/elementary/mkosi.conf create mode 100644 mkosi.conf.d/elementary/mkosi.conf.d/apparmor.conf create mode 100644 mkosi.conf.d/elementary/mkosi.conf.d/elementary-apps.conf create mode 100644 mkosi.conf.d/elementary/mkosi.conf.d/elementary-desktop.conf create mode 100644 mkosi.conf.d/elementary/mkosi.conf.d/elementary-panel.conf create mode 100644 mkosi.conf.d/elementary/mkosi.conf.d/elementary-settings.conf create mode 100644 mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf create mode 100644 mkosi.extra/usr/lib/dracut/dracut.conf.d/base-ubuntu.conf create mode 100644 mkosi.extra/usr/lib/dracut/dracut.conf.d/lvm2.conf create mode 100644 mkosi.extra/usr/lib/sysctl.d/60-apparmor.conf create mode 100644 mkosi.extra/usr/lib/systemd/system-preset/01-systemd.preset create mode 100644 mkosi.extra/usr/lib/systemd/system-preset/91-resolved-default.preset create mode 100644 mkosi.extra/usr/lib/systemd/user-preset/01-zirconium.preset create mode 100644 mkosi.extra/usr/lib/sysusers.d/session.conf create mode 100644 mkosi.extra/usr/lib/sysusers.d/wpa.conf create mode 100644 mkosi.extra/usr/lib/tmpfiles.d/99-factory.conf create mode 100644 mkosi.extra/usr/lib/tmpfiles.d/login.conf create mode 100644 mkosi.extra/usr/lib/tmpfiles.d/resolved-default.conf create mode 100644 mkosi.extra/usr/share/factory/etc/.gitkeep create mode 100644 mkosi.extra/usr/share/flatpak/remotes.d/appcenter.flatpakrepo create mode 100644 mkosi.extra/usr/share/flatpak/remotes.d/flathub.flatpakrepo create mode 100644 mkosi.extra/usr/share/glib-2.0/schemas/io.elementary.desktop.wingpanel.power.gschema.xml create mode 100755 mkosi.postinst.chroot create mode 100644 mkosi.profiles/sysupdate/mkosi.conf create mode 100644 mkosi.profiles/sysupdate/mkosi.conf.d/ubuntu/mkosi.conf create mode 100644 mkosi.profiles/sysupdate/mkosi.extra/boot/loader/loader.conf create mode 100644 mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/00-esp.conf create mode 100644 mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf create mode 100644 mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf create mode 100644 mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/12-usr.conf create mode 100644 mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/20-usr-verity-sig.conf create mode 100644 mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/21-usr-verity.conf create mode 100644 mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/22-usr.conf create mode 100644 mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/40-root.conf create mode 100644 mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/50-home.conf create mode 100644 mkosi.profiles/sysupdate/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset create mode 100644 mkosi.profiles/sysupdate/mkosi.extra/usr/lib/systemd/system/preset-global.service create mode 100644 mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer create mode 100644 mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer create mode 100644 mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer create mode 100644 mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer create mode 100644 mkosi.profiles/sysupdate/mkosi.extra/usr/lib/tmpfiles.d/etc.conf create mode 100755 mkosi.profiles/sysupdate/mkosi.finalize create mode 100755 mkosi.profiles/sysupdate/mkosi.postinst.chroot create mode 100644 mkosi.profiles/sysupdate/mkosi.repart/00-esp.conf create mode 100644 mkosi.profiles/sysupdate/mkosi.repart/10-usr-verity-sig.conf create mode 100644 mkosi.profiles/sysupdate/mkosi.repart/11-usr-verity.conf create mode 100644 mkosi.profiles/sysupdate/mkosi.repart/12-usr.conf create mode 100644 mkosi.profiles/sysupdate/mkosi.sysupdate/10-usr-verity-sig.transfer create mode 100644 mkosi.profiles/sysupdate/mkosi.sysupdate/11-usr-verity.transfer create mode 100644 mkosi.profiles/sysupdate/mkosi.sysupdate/12-usr.transfer create mode 100644 mkosi.profiles/sysupdate/mkosi.sysupdate/20-uki.transfer create mode 100644 mkosi.profiles/sysupdate/mkosi.uki-profiles/10-live.conf create mode 100644 mkosi.profiles/sysupdate/mkosi.uki-profiles/20-ipe.conf create mode 100644 mkosi.profiles/sysupdate/mkosi.uki-profiles/80-storagetm.conf create mode 100644 mkosi.profiles/sysupdate/mkosi.uki-profiles/90-factory-reset.conf create mode 100644 mkosi.profiles/sysupdate/mkosi.uki-profiles/91-factory-reset-with-tpm-clear.conf create mode 100644 mkosi.profiles/sysupdate/mkosi.uki-profiles/95-emergency.conf create mode 100644 mkosi.profiles/sysupdate/mkosi.uki-profiles/99-debug.conf create mode 100644 mkosi.sandbox/etc/apt/keyrings/elementary-os-daily.gpg create mode 100644 mkosi.sandbox/etc/apt/keyrings/elementary-os-os-patches.gpg create mode 100644 mkosi.sandbox/etc/apt/sources.list.d/elementary-os-daily.sources create mode 100644 mkosi.sandbox/etc/apt/sources.list.d/elementary-os-patches.sources delete mode 100644 upload.py delete mode 100755 upload.sh delete mode 100755 workflows.sh diff --git a/.github/workflows/daily-8.1.yml b/.github/workflows/daily-8.1.yml deleted file mode 100644 index a68938412..000000000 --- a/.github/workflows/daily-8.1.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: Daily OS 8 - -on: - push: - branches: - - main - schedule: - - cron: "0 0 * * *" - workflow_dispatch: {} - -jobs: - build: - strategy: - fail-fast: false - matrix: - include: - - runner: ubuntu-24.04 - arch: amd64 - - runner: ubuntu-24.04-arm - arch: arm64 - runs-on: ${{ matrix.runner }} - - container: - image: debian:latest - volumes: - - /proc:/proc - options: --privileged - - steps: - - name: Clone build scripts - uses: actions/checkout@v7 - - - name: Build and upload daily .iso - run: | - ./workflows.sh etc/terraform-daily-8.1-azure-${{ matrix.arch }}.conf "${{ secrets.key }}" "${{ secrets.secret }}" "${{ secrets.endpoint }}" "${{ secrets.bucket }}" diff --git a/.github/workflows/daily-9.0.yml b/.github/workflows/daily-9.0.yml deleted file mode 100644 index da2db2704..000000000 --- a/.github/workflows/daily-9.0.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: Daily OS 9 - -on: - push: - branches: - - main - schedule: - - cron: "0 0 * * *" - workflow_dispatch: {} - -jobs: - build: - strategy: - fail-fast: false - matrix: - include: - - runner: ubuntu-26.04 - arch: amd64 - - runner: ubuntu-26.04-arm - arch: arm64 - runs-on: ${{ matrix.runner }} - - container: - image: debian:latest - volumes: - - /proc:/proc - options: --privileged - - steps: - - name: Clone build scripts - uses: actions/checkout@v7 - - - name: Build and upload daily .iso - run: | - ./workflows.sh etc/terraform-daily-9.0-azure-${{ matrix.arch }}.conf "${{ secrets.key }}" "${{ secrets.secret }}" "${{ secrets.endpoint }}" "${{ secrets.bucket }}" diff --git a/.github/workflows/stable-8.1.yml b/.github/workflows/stable-8.1.yml deleted file mode 100644 index 70a5d57e6..000000000 --- a/.github/workflows/stable-8.1.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: Stable OS 8 - -on: - push: - tags: - - "*" - schedule: - - cron: "0 0 1 * *" - workflow_dispatch: {} - -jobs: - build: - strategy: - fail-fast: false - matrix: - include: - - runner: ubuntu-24.04 - arch: amd64 - - runner: ubuntu-24.04-arm - arch: arm64 - runs-on: ${{ matrix.runner }} - - container: - image: debian:latest - volumes: - - /proc:/proc - options: --privileged - - steps: - - name: Clone build scripts - uses: actions/checkout@v7 - - - name: Build and upload stable .iso - run: | - ./workflows.sh etc/terraform-stable-8.1-azure-${{ matrix.arch }}.conf "${{ secrets.key }}" "${{ secrets.secret }}" "${{ secrets.endpoint }}" "${{ secrets.bucket }}" diff --git a/.gitignore b/.gitignore index 5dce753a5..f0ba790c7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,18 @@ -.DS_Store -tmp -artifacts -builds -*~ \ No newline at end of file +cosign.key +**/cosign.key +cache +_build_* +output +_build-*/** +*.img +mkosi.local/ +mkosi.local.conf +mkosi.output/ +mkosi.cache/ +mkosi.tools/ +mkosi.tools.manifest +mkosi.key +mkosi.crt +mkosi.version +mkosi.rootpw +.mkosi-private \ No newline at end of file diff --git a/Justfile b/Justfile new file mode 100644 index 000000000..a4155f202 --- /dev/null +++ b/Justfile @@ -0,0 +1,22 @@ +default: + #!/usr/bin/env bash + set -xeuo pipefail + just build-sysupdate + +lazy-spin: + just _gen_keys + just build-sysupdate && just resize + +build-sysupdate: + mkosi -B --debug --force --profile=sysupdate + +resize: + qemu-img resize ./mkosi.output/Elementary_x86-64.raw +40G + +_gen_keys: + mkosi genkey || true + + +clean: + mkosi clean + sudo rm -r mkosi.tools/ mkosi.cache/ diff --git a/LICENSE b/LICENSE index 94a9ed024..87b23a248 100644 --- a/LICENSE +++ b/LICENSE @@ -1,674 +1,12 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . \ No newline at end of file diff --git a/README.md b/README.md index 119becb62..804083aa4 100644 --- a/README.md +++ b/README.md @@ -24,20 +24,19 @@ ## Building Locally -As elementary OS is built with the Debian version of `live-build`, not the Ubuntu patched version, it's easiest to build an elementary .iso in a Debian VM or container. This prevents messing up your host system too. +1. Install `mkosi`, `just`, `fzf` +2. Generate keys `just _gen_keys` +3. Build `just build-sysupdate` +4. Resize `just resize` -The following example assumes you have Docker correctly installed and set up, and that your current working directory is this repo. When done, your image will be in the `builds` folder. +### Run with qemu -Configure the channel (stable, daily) in the configuration file (`etc/terraform-amd64.conf` or `etc/terraform-arm64.conf` based on your host architecture), then run: +You can directly boot the .raw image with qemu, make sure to have TPM and UEFI enabled -```sh -docker run --rm --privileged -it \ - -v /proc:/proc \ - -v ${PWD}:/working_dir \ - -w /working_dir \ - debian:latest \ - ./build.sh -``` + +### Run on baremetal + +`sudo dd if=mkosi.output/Elementary---.raw of=/dev/sdX bs=4M status=progress` ## Further Information diff --git a/cosign.pub b/cosign.pub new file mode 100644 index 000000000..34b63aca0 --- /dev/null +++ b/cosign.pub @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEO/99O5B1Vc8ykZo5jF4MF1PT0VdQ +mUFtSTST3FFvWbVKfHpgLaxoLCialVduO1EKwhnbESPfV7fcpLGFe0IsLA== +-----END PUBLIC KEY----- diff --git a/etc/auto/config b/etc/auto/config deleted file mode 100755 index 94ff1b5df..000000000 --- a/etc/auto/config +++ /dev/null @@ -1,75 +0,0 @@ -#!/bin/sh - -set -e - -. ./terraform.conf - -if [ "$HWE_KERNEL" = "yes" ]; then - KERNEL_FLAVORS="generic-hwe-${BASEVERSION}" -else - KERNEL_FLAVORS="generic" -fi - -if [ "$HWE_X11" = "yes" ]; then - XORG_HWE="xserver-xorg-hwe-${BASEVERSION}" -fi - -case "$ARCH" in - amd64|i386) - MIRROR_BINARY_URL="http://archive.ubuntu.com/ubuntu/" - MIRROR_BINARY_SECURITY_URL="http://security.ubuntu.com/ubuntu/" - ;; - arm64) - MIRROR_BINARY_URL="http://ports.ubuntu.com/ubuntu-ports/" - MIRROR_BINARY_SECURITY_URL="http://ports.ubuntu.com/ubuntu-ports/" - ;; -esac - -lb config noauto \ - --architectures "$ARCH" \ - --mode debian \ - --initramfs none \ - --distribution "$BASECODENAME" \ - --parent-distribution "$BASECODENAME" \ - --archive-areas "main restricted universe multiverse" \ - --parent-archive-areas "main restricted universe multiverse" \ - --linux-packages linux-image \ - --linux-flavours "$KERNEL_FLAVORS" \ - --bootappend-live "boot=casper maybe-ubiquity quiet splash" \ - --debootstrap-options="--extractor=ar --keyring=/etc/apt/trusted.gpg" \ - --checksums md5 \ - --mirror-bootstrap "$MIRROR_URL" \ - --parent-mirror-bootstrap "$MIRROR_URL" \ - --mirror-chroot-security "$MIRROR_BINARY_SECURITY_URL" \ - --parent-mirror-chroot-security "$MIRROR_BINARY_SECURITY_URL" \ - --mirror-binary-security "$MIRROR_BINARY_SECURITY_URL" \ - --parent-mirror-binary-security "$MIRROR_BINARY_SECURITY_URL" \ - --mirror-binary "$MIRROR_BINARY_URL" \ - --parent-mirror-binary "$MIRROR_BINARY_URL" \ - --keyring-packages ubuntu-keyring \ - --apt-options "--yes --option Acquire::Retries=2 --option Acquire::http::Timeout=45" \ - --cache-packages false \ - --uefi-secure-boot enable \ - --binary-images iso-hybrid \ - --iso-application "$NAME" \ - --iso-volume "$NAME" \ - --firmware-binary false \ - --firmware-chroot false \ - --zsync false \ - --security true \ - "${@}" - -# replace channel and suite -sed -i "s/@CHANNEL/$CHANNEL/" config/archives/*.list* -sed -i "s/@BASECODENAME/$BASECODENAME/" config/archives/*.list* - -DATE=$(date +%Y%m%d) -sed -i "s/@CHANNEL/$CHANNEL/" config/includes.binary/.disk/info -sed -i "s/@CODENAME/$CODENAME/" config/includes.binary/.disk/info -sed -i "s/@ARCH/$ARCH/" config/includes.binary/.disk/info -sed -i "s/@DISTRO_NAME/$NAME/" config/includes.binary/.disk/info -sed -i "s/@VERSION/$VERSION/" config/includes.binary/.disk/info -sed -i "s/@DATE/$DATE/" config/includes.binary/.disk/info - -sed -i "s/@XORG_HWE/$XORG_HWE/" config/package-lists/desktop.list.chroot_install -sed -i "s/@KERNEL_HEADERS/linux-headers-$KERNEL_FLAVORS/" config/package-lists/desktop.list.chroot_install diff --git a/etc/config/archives/elementary.key b/etc/config/archives/elementary.key deleted file mode 100644 index 56323a415..000000000 --- a/etc/config/archives/elementary.key +++ /dev/null @@ -1,31 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- -Version: Hockeypuck 2.2 - -xsFNBGY0W70BEACjPRVK1K0yzj/TPI4AOEfjUFO7w4VHDBXV6tYo/jqjlqXNsnlh -m2Ou+V6RvJUHvX7OBZIzXWaDnlYeLAho34nF82NV8SoZt6n8YvhKGg3sCqpfDxG2 -ZlsW/N3r1BH/o7bUiLrHmcT0e13qoH2qh0aZrkH6PdNSdxtoe74RNDJM3r5UKWY7 -sailTDftcLhM7pVgK4yno80JVIgWmaW6qg+/UpkF24gHuN9XDXsD4u8ppwRuZA1e -FPWtlZhh6mkZwoKW+G3geVt5pyztm9wD25eGq5NfqbSkyCWtQuZtF2oG2KQV/qTI -2Ga8J7lHXraaS+UGmh++AOSj4o0OkeutwFsBRAfJhWusY9etCGnY5+S4CB9ElJqd -m9pSHrjQtjEtGRP0iDXGVR1m+15fkBcU70cp3IIkxKhcojOJmMhpc5e3H184dB8k -0GarxMdMPCmABqNfTZa/RTBPvVQoC30TRlTsYDlBzsAtKxZ+HLrJ+KRuKjoisBTD -zDeGRtLf+Q3gHF8LE8FmkKrDouR8QBL1U6BSev49XZnsB8m1IYH8fLY9ItuyPsjU -myn4OBongmV3aSDkRNLjit5DOaCuSH7R6AtEGn4PHCBOq15tvGP/Jr73+QPii9RF -8dH3xiIkSloB1dFOBJ9+kQokO1LoQOsKkYpF+98vmqJ9jsJy/hBqlmifsQARAQAB -zSRMYXVuY2hwYWQgUFBBIGZvciBlbGVtZW50YXJ5IE9TIHRlYW3CwY4EEwEKADgW -IQQ2SDfPkeBwkQIxwv6CGbOgrvPUmAUCZjRbvQIbAwULCQgHAgYVCgkICwIEFgID -AQIeAQIXgAAKCRCCGbOgrvPUmFPmD/9R76nz346nc3jiEBuQDalV562Y7V16jITQ -T0cQa1J0F1OivPkKKuiNYpstuAK88xoCSV7U50edVtWWMCqMQXAYzpwsIiNWaRV6 -9Z/c7xQnV0MIPVUaoKK6tFNANtRGApjjzkl+F5jQkgTzWOrJzfInj7n/QrkCIGfI -GR6QXjeM/PcwmMCC7z5OiBi0YPG0SrNQcdDvCZffpppYMYndXZA4huc27ELjVNKS -SbdWxczMRi/SpPqBount03DfbHAR7oNpXQwIvgUZ8BMKNJ3kVWLMS/qhbpMVLzPy -E3c62kMkeX5i6BTAfxfdZOZgqSs+pELg4uBeuDdGO1ivlbCgnTnaqeKMcuX9b2s3 -qHjToNiub9JsjpP/q6EpfBVkF5ftdGLZ864EYup4df/BEGjxbYnenifaOFTLpb+K -ncB3ZNAbkK80+7HrYbd61e2dZWWt6N0IrUllF/GoJPC8trUNoSDtZo8wVOQ7OHG7 -BmPmjwsj6Mf8I6wEjnKK/Lp1l+EVtnOIILypbHwiyaIsBbZJVSS/DaqQQoZyyp+u -mb4mULGwDdMA7O+785Ktc3V2+tijgSSa7H21UOcoj0gDUe6IffmNs0C6P6e5LhHg -xqbXPFit+vPyW19q9e+eILGLqKb2biCmApJyDKMKRPjAdL+c7c3C2CJeimp0eZuq -QQ2R1C+7Og== -=ivCt ------END PGP PUBLIC KEY BLOCK----- - diff --git a/etc/config/archives/elementary.list b/etc/config/archives/elementary.list deleted file mode 100644 index fc715b7da..000000000 --- a/etc/config/archives/elementary.list +++ /dev/null @@ -1,3 +0,0 @@ -deb https://ppa.launchpadcontent.net/elementary-os/@CHANNEL/ubuntu @BASECODENAME main -deb-src https://ppa.launchpadcontent.net/elementary-os/@CHANNEL/ubuntu @BASECODENAME main - diff --git a/etc/config/archives/patches.key b/etc/config/archives/patches.key deleted file mode 100644 index 56323a415..000000000 --- a/etc/config/archives/patches.key +++ /dev/null @@ -1,31 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- -Version: Hockeypuck 2.2 - -xsFNBGY0W70BEACjPRVK1K0yzj/TPI4AOEfjUFO7w4VHDBXV6tYo/jqjlqXNsnlh -m2Ou+V6RvJUHvX7OBZIzXWaDnlYeLAho34nF82NV8SoZt6n8YvhKGg3sCqpfDxG2 -ZlsW/N3r1BH/o7bUiLrHmcT0e13qoH2qh0aZrkH6PdNSdxtoe74RNDJM3r5UKWY7 -sailTDftcLhM7pVgK4yno80JVIgWmaW6qg+/UpkF24gHuN9XDXsD4u8ppwRuZA1e -FPWtlZhh6mkZwoKW+G3geVt5pyztm9wD25eGq5NfqbSkyCWtQuZtF2oG2KQV/qTI -2Ga8J7lHXraaS+UGmh++AOSj4o0OkeutwFsBRAfJhWusY9etCGnY5+S4CB9ElJqd -m9pSHrjQtjEtGRP0iDXGVR1m+15fkBcU70cp3IIkxKhcojOJmMhpc5e3H184dB8k -0GarxMdMPCmABqNfTZa/RTBPvVQoC30TRlTsYDlBzsAtKxZ+HLrJ+KRuKjoisBTD -zDeGRtLf+Q3gHF8LE8FmkKrDouR8QBL1U6BSev49XZnsB8m1IYH8fLY9ItuyPsjU -myn4OBongmV3aSDkRNLjit5DOaCuSH7R6AtEGn4PHCBOq15tvGP/Jr73+QPii9RF -8dH3xiIkSloB1dFOBJ9+kQokO1LoQOsKkYpF+98vmqJ9jsJy/hBqlmifsQARAQAB -zSRMYXVuY2hwYWQgUFBBIGZvciBlbGVtZW50YXJ5IE9TIHRlYW3CwY4EEwEKADgW -IQQ2SDfPkeBwkQIxwv6CGbOgrvPUmAUCZjRbvQIbAwULCQgHAgYVCgkICwIEFgID -AQIeAQIXgAAKCRCCGbOgrvPUmFPmD/9R76nz346nc3jiEBuQDalV562Y7V16jITQ -T0cQa1J0F1OivPkKKuiNYpstuAK88xoCSV7U50edVtWWMCqMQXAYzpwsIiNWaRV6 -9Z/c7xQnV0MIPVUaoKK6tFNANtRGApjjzkl+F5jQkgTzWOrJzfInj7n/QrkCIGfI -GR6QXjeM/PcwmMCC7z5OiBi0YPG0SrNQcdDvCZffpppYMYndXZA4huc27ELjVNKS -SbdWxczMRi/SpPqBount03DfbHAR7oNpXQwIvgUZ8BMKNJ3kVWLMS/qhbpMVLzPy -E3c62kMkeX5i6BTAfxfdZOZgqSs+pELg4uBeuDdGO1ivlbCgnTnaqeKMcuX9b2s3 -qHjToNiub9JsjpP/q6EpfBVkF5ftdGLZ864EYup4df/BEGjxbYnenifaOFTLpb+K -ncB3ZNAbkK80+7HrYbd61e2dZWWt6N0IrUllF/GoJPC8trUNoSDtZo8wVOQ7OHG7 -BmPmjwsj6Mf8I6wEjnKK/Lp1l+EVtnOIILypbHwiyaIsBbZJVSS/DaqQQoZyyp+u -mb4mULGwDdMA7O+785Ktc3V2+tijgSSa7H21UOcoj0gDUe6IffmNs0C6P6e5LhHg -xqbXPFit+vPyW19q9e+eILGLqKb2biCmApJyDKMKRPjAdL+c7c3C2CJeimp0eZuq -QQ2R1C+7Og== -=ivCt ------END PGP PUBLIC KEY BLOCK----- - diff --git a/etc/config/archives/patches.list b/etc/config/archives/patches.list deleted file mode 100644 index 440f4c1fc..000000000 --- a/etc/config/archives/patches.list +++ /dev/null @@ -1,3 +0,0 @@ -deb https://ppa.launchpadcontent.net/elementary-os/os-patches/ubuntu @BASECODENAME main -deb-src https://ppa.launchpadcontent.net/elementary-os/os-patches/ubuntu @BASECODENAME main - diff --git a/etc/config/archives/patches.pref b/etc/config/archives/patches.pref deleted file mode 100644 index 02b44ae3a..000000000 --- a/etc/config/archives/patches.pref +++ /dev/null @@ -1,6 +0,0 @@ -Explanation: OS patches for elementary OS. -Explanation: We need this pin because our patched build can lag a few hours behind Ubuntu's updates, -Explanation: and during those few hours packages can be overwritten with unpatched ones. -Package: * -Pin: release o=LP-PPA-elementary-os-os-patches -Pin-Priority: 999 diff --git a/etc/config/bootloaders/grub-pc/dejavu-bold-14.pf2 b/etc/config/bootloaders/grub-pc/dejavu-bold-14.pf2 deleted file mode 100644 index 9b093b207c71dc7006eda84276105474e317463a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191158 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 KelF{r5}E)5iz(p% diff --git a/etc/config/bootloaders/grub-pc/elementary-theme/logo.png b/etc/config/bootloaders/grub-pc/elementary-theme/logo.png deleted file mode 100644 index 68d5b8f529d48dd1e6538eafc9e9d36f16cd4771..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2887 zcmV-N3%K-&P)A(O!vG8ca3O#$A=&H(@Gk&s0Q?oeYsQ!p@mdU_ z1d?M(t{{1s{&AS(a*|_2;qeMdp@{PV+zDVjfQ~Kvc>{p$0QOsEiU3*xXb+$>fSv%_ zwZNwyz_S2;VvPAuyc`mWxQOHulFcce=tCr5COMnrP?Ft3@a{x%7|HL*s%T6xMia@! zB>SDsia3Yl6C_VMexOE@i%1S9S?<{!j*xL19OIrO`54JgXOkif$tfiFIew5W^8czL zkfTb*+T@U9FUhZvG-t!Ac+v3#yhU;x$&x(CR6_D*l5acYS`qbXF%eFDuxy|;YID99 zz{AFv<`BHv0=NpmKmeZu&{a0`;{fUaYyq$iz-nVmV?dr|0Hy+%C%lr_31GZ2=I>|H z%J>q=6YA;veaH>kkQ_;JDaj)NkGMxjK1=eF5aVT(ne8yqLLQzRFXY!^cLcaS`$c+4zzW&A+>Fdvc}5Q4sjlrl=v>m3&NOLl6w@7`NgV?yVOLsk?bAP%+;&aFh0!2PqIwpIBM~! zBiT0uk6MzO)m&y2CW5 zRvY*>lAjKGdQuzeagvif$#tE0srHQC0cksteBGiwN^+!U z`R1#q{F0FLz0{tvgJj1-RfbVc-|?UuILS(qYc1Mlk~ic)#!B_TEX;t%K$)BEJeopO z$P{JwX9lDzlS$c_okKZit5AGp20Ugcc_$a5soJNUJ`<4k0X4Zl<}!prvWGfwjPPI$ z>Iy0#Dbdp;4hHqWCGu)Vdv}rS9D%&He{x@jJi5zVPoD$}MHv^VA9Y4Ry3QnbtJQIH zL^3~TjkzQXKGW18p>H85WQmH}mIb8ywNl2b5z1_v$v?F3~89IUQ2ibQ#%RWSH z!W}&Eyc-M{Sa=Rh0YcO!#CPq8MuZdu_m6*((6l zs_&LZtc)roG9#1ldAb`7z|J8X7UjfNhYbWeZV(UT!Cc*{#&73|ZFe-+(#BUZ@W*4XtPH}eh>?WM!Ns*Yk} zSK5)?fHbXCs3g*}x+60CJ&(M9s+>Z5oXewj2>%(7rl;cx>Kl^I|5h?An8NZ z0hs3NH_e3DUKK$zHV!zx>z*TJlmU1Sz+n062!NZ6F?AkzmjZakQZ!{xs!Opd8lzB% zJxI{>&K-_b(jy1TD3y(NlzeqUl(Ej!5cdPHllLAo#=Mkfk8MP*LGmX12pNJ-hZer> zdu6Em{brJ5J@Wsu@};)8@{LKpna!~`6Tz;q9ib3(zf}tPjYpYUlU$~}IeINt&4M?Oh%REodt5qaoD2HurH zaIx0mtzVm^92ZM=yW z6v|lC0?pm|3cufL4g69Fx?3HE`hCLs0n&AWDh0K_$N3F+G!}TVr5Knhznc@KLatG{ zyyXGu+Nji_unPTx+{05{Y8Kh)E9v1r)R*onk&0LarA_QGqDd42C|9w;Z?LCgBF$a9! zr-&I`?ojwDl5GO=uzjEx5H*y8crZ*+rlLK4B3Z30#*O($BS$P*;x;KHuTqj*EgnBdzCg0KdcwvA zq%$NhQ3U{wGgQTB! z%|gCTQt7lI%?kWkCZ{#Y6W$y)$2r#u>8DECz9~hZ!zDTHX}S1s%A#>)vm8HflM=d; zH1bqR^1&>jIhKa+hM=LJ6l2X&GWJ0sKsxc*f`!3R+2BWzd?-cBKUW{dO%lRcDW6v* z5$;p~`n{su(k$j&qmJVXP$&?yus5V4*2`+@q<9TV(cR4lc1padLzeS3ss+fNg6rrY zJqlYgJFk(vucf$?l!=W=vjK<2E0RxE=4r086#q#mG{{r4!eJVol(tIeWXShYl0PK* zj}ZINE|M=usacKZdFtjm%Y3%hFuqL}fc5w|31AO^A;y@kp7>V+=qLQU;gdbz4%tJ1txp-JB8lXpLUM%?+0PBn~O@%t=Vtn;#H4?90t;NT$UQL>&L)K>p60crujO|X07%^hRh!G=3 lj2JOu#E20iMvNH#@jrc(=Mal<2WtQT002ovPDHLkV1g@^Vd($> diff --git a/etc/config/bootloaders/grub-pc/elementary-theme/theme.txt b/etc/config/bootloaders/grub-pc/elementary-theme/theme.txt deleted file mode 100644 index a8831e2de..000000000 --- a/etc/config/bootloaders/grub-pc/elementary-theme/theme.txt +++ /dev/null @@ -1,61 +0,0 @@ -title-text: "" -desktop-image: "background.png" -desktop-color: "#000000" -title-color: "#ffffff" -title-font: "DejaVu Sans Bold 16" -message-font: "Unifont Regular 16" - -terminal-left: "0" -terminal-top: "0" -terminal-width: "100%" -terminal-height: "100%" -terminal-border: "0" - -# Logo image -+ image { - left = 50%-50 - top = 50%-50 - file = "logo.png" -} - -#help bar at the bottom -+ label { - top = 100%-50 - left = 0 - width = 100% - height = 20 - text = "@KEYMAP_SHORT@" - align = "center" - color = "#ffffff" - font = "DejaVu Sans Bold 14" -} - -#boot menu -+ boot_menu { - left = 50%-150 - width = 500 - top = 50%+100 - height = 300 - - item_font = "DejaVu Sans Bold 14" - item_color = "#999" - selected_item_font = "DejaVu Sans Bold 14" - selected_item_color= "#fff" - - item_height = 26 - item_padding = 0 - item_icon_space = 0 - item_spacing = 1 - scrollbar = false -} - -# Show a countdown message using the label component -+ label { - top = 82% - left = 35% - width = 30% - align = "center" - id = "__timeout__" - text = "Booting in %d seconds" - color = "#f6f6f6" -} diff --git a/etc/config/bootloaders/grub-pc/grub.cfg b/etc/config/bootloaders/grub-pc/grub.cfg deleted file mode 100644 index eb2d5140d..000000000 --- a/etc/config/bootloaders/grub-pc/grub.cfg +++ /dev/null @@ -1,39 +0,0 @@ -set default=0 - -set gfxmode=auto -loadfont $prefix/dejavu-bold-16.pf2 -loadfont $prefix/dejavu-bold-14.pf2 -loadfont $prefix/unicode.pf2 -insmod all_video -insmod gfxterm -insmod png - -set color_normal=light-gray/black -set color_highlight=white/black - -set theme=/boot/grub/elementary-theme/theme.txt - -terminal_output gfxterm - -set timeout=10 -set timeout_style=menu - -menuentry "Try or install elementary OS" { - linux /casper/vmlinuz APPEND_LIVE - initrd /casper/initrd.lz -} - -menuentry "Try or install elementary OS (Safe graphics)" { - linux /casper/vmlinuz APPEND_LIVE nomodeset - initrd /casper/initrd.lz -} - -submenu 'Advanced options...' { - -# More installer entries (if any) -LINUX_ADVANCED_INSTALL - -# Memtest (if any) -MEMTEST - -} diff --git a/etc/config/bootloaders/isolinux/hdt.c32 b/etc/config/bootloaders/isolinux/hdt.c32 deleted file mode 120000 index f84c641c7..000000000 --- a/etc/config/bootloaders/isolinux/hdt.c32 +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/syslinux/modules/bios/hdt.c32 \ No newline at end of file diff --git a/etc/config/bootloaders/isolinux/isolinux.bin b/etc/config/bootloaders/isolinux/isolinux.bin deleted file mode 120000 index 33a2ad6f2..000000000 --- a/etc/config/bootloaders/isolinux/isolinux.bin +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/ISOLINUX/isolinux.bin \ No newline at end of file diff --git a/etc/config/bootloaders/isolinux/isolinux.cfg b/etc/config/bootloaders/isolinux/isolinux.cfg deleted file mode 100644 index 0fa37834a..000000000 --- a/etc/config/bootloaders/isolinux/isolinux.cfg +++ /dev/null @@ -1,3 +0,0 @@ -default vesamenu.c32 -include stdmenu.cfg -include live.cfg diff --git a/etc/config/bootloaders/isolinux/ldlinux.c32 b/etc/config/bootloaders/isolinux/ldlinux.c32 deleted file mode 120000 index df554c7e5..000000000 --- a/etc/config/bootloaders/isolinux/ldlinux.c32 +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/syslinux/modules/bios/ldlinux.c32 \ No newline at end of file diff --git a/etc/config/bootloaders/isolinux/libcom32.c32 b/etc/config/bootloaders/isolinux/libcom32.c32 deleted file mode 120000 index 44ab36b56..000000000 --- a/etc/config/bootloaders/isolinux/libcom32.c32 +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/syslinux/modules/bios/libcom32.c32 \ No newline at end of file diff --git a/etc/config/bootloaders/isolinux/libgpl.c32 b/etc/config/bootloaders/isolinux/libgpl.c32 deleted file mode 120000 index 81c83fbdf..000000000 --- a/etc/config/bootloaders/isolinux/libgpl.c32 +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/syslinux/modules/bios/libgpl.c32 \ No newline at end of file diff --git a/etc/config/bootloaders/isolinux/libmenu.c32 b/etc/config/bootloaders/isolinux/libmenu.c32 deleted file mode 120000 index 2491ff9a1..000000000 --- a/etc/config/bootloaders/isolinux/libmenu.c32 +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/syslinux/modules/bios/libmenu.c32 \ No newline at end of file diff --git a/etc/config/bootloaders/isolinux/libutil.c32 b/etc/config/bootloaders/isolinux/libutil.c32 deleted file mode 120000 index 478194e85..000000000 --- a/etc/config/bootloaders/isolinux/libutil.c32 +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/syslinux/modules/bios/libutil.c32 \ No newline at end of file diff --git a/etc/config/bootloaders/isolinux/live.cfg.in b/etc/config/bootloaders/isolinux/live.cfg.in deleted file mode 100644 index 8f3599b6c..000000000 --- a/etc/config/bootloaders/isolinux/live.cfg.in +++ /dev/null @@ -1,27 +0,0 @@ -prompt 0 - -MENU HIDDEN -MENU AUTOBOOT Booting elementary OS live disk in # seconds -timeout 50 - -label live-@FLAVOUR@ - menu label ^Try or install elementary OS - menu default - linux /casper/vmlinuz - initrd /casper/initrd.lz - append @APPEND_LIVE@ - -label live-safe-@FLAVOUR@ - menu label Try or install elementary OS (^Safe graphics) - linux /casper/vmlinuz - initrd /casper/initrd.lz - append @APPEND_LIVE@ nomodeset - -label check - menu label ^Check disk for defects - linux /casper/vmlinuz - append boot=casper integrity-check initrd=/casper/initrd.lz quiet splash -- - -label hd - menu label ^Boot from first hard disk - localboot 0x80 diff --git a/etc/config/bootloaders/isolinux/menu.c32 b/etc/config/bootloaders/isolinux/menu.c32 deleted file mode 120000 index 86c360d37..000000000 --- a/etc/config/bootloaders/isolinux/menu.c32 +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/syslinux/modules/bios/menu.c32 \ No newline at end of file diff --git a/etc/config/bootloaders/isolinux/stdmenu.cfg b/etc/config/bootloaders/isolinux/stdmenu.cfg deleted file mode 100644 index cb7f674b2..000000000 --- a/etc/config/bootloaders/isolinux/stdmenu.cfg +++ /dev/null @@ -1,42 +0,0 @@ -menu hshift 13 -menu width 49 -menu margin 8 - -# Override the default radial gradient background with black -menu background #ff000000 - -# Title bar -menu color title 0 #ffffffff #00000000 * - -# Border Area -menu color border * #00000000 #00000000 none - -# Unselected menu item -menu color unsel 0 #999999 #00000000 * - -# Unselected hotkey -menu color hotkey 0 #999999 #00000000 none - -# Selection bar -menu color sel 0 #ffffff #00000000 none - -# Selected hotkey -menu color hotsel 0 #ffffffff #00000000 none - -# Press [Tab] message -menu color tabmsg 0 #f6f6f6 #00000000 none - -# Timeout message -menu color timeout_msg 0 #f6f6f6 #00000000 none - -# Timeout counter -menu color timeout * #ffffffff #00000000 none - -# Command line -menu color cmdline 0 #ffffffff #00000000 none - -# Command line marker -menu color cmdmark 0 #00000000 #00000000 none - -# Helptest -menu color help 0 #ffffffff #00000000 none diff --git a/etc/config/bootloaders/isolinux/vesamenu.c32 b/etc/config/bootloaders/isolinux/vesamenu.c32 deleted file mode 120000 index 84e2eff1e..000000000 --- a/etc/config/bootloaders/isolinux/vesamenu.c32 +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/syslinux/modules/bios/vesamenu.c32 \ No newline at end of file diff --git a/etc/config/hooks/live/000-remove-blacklisted-packages.chroot b/etc/config/hooks/live/000-remove-blacklisted-packages.chroot deleted file mode 100755 index 13ae4b4df..000000000 --- a/etc/config/hooks/live/000-remove-blacklisted-packages.chroot +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh -# Description: Checkout seed branches and remove blacklisted packages - -echo "P: Begin executing remove-blacklisted-packages chroot hook..." - -export LSB_OS_RELEASE="/usr/lib/upstream-os-release" -dist="$(lsb_release -c -s)" -unset LSB_OS_RELEASE - -apt-get install --no-install-recommends -f -q -y git - -git clone --depth 1 https://github.com/elementary/seeds.git --single-branch --branch "$dist" -git clone --depth 1 https://github.com/elementary/platform.git --single-branch --branch "$dist" - -for package in $(cat 'platform/blacklist' 'seeds/blacklist' | grep -v '#'); do - apt-get autoremove --purge -f -q -y "$package" -done - -apt-get autoremove --purge -f -q -y git - -rm -R ../seeds ../platform diff --git a/etc/config/hooks/live/999-cleanup-apt-cache.chroot b/etc/config/hooks/live/999-cleanup-apt-cache.chroot deleted file mode 100755 index e0a81eceb..000000000 --- a/etc/config/hooks/live/999-cleanup-apt-cache.chroot +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh -# Description: Cleanup apt cache files that add ~100MB to the .iso and aren't needed - -rm -f /var/lib/apt/lists/*_Packages -rm -f /var/lib/apt/lists/*_Sources -rm -f /var/lib/apt/lists/*_Translation-* - diff --git a/etc/config/hooks/live/apparmor-profiles.chroot b/etc/config/hooks/live/apparmor-profiles.chroot deleted file mode 100755 index 2067aa379..000000000 --- a/etc/config/hooks/live/apparmor-profiles.chroot +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh -# Description: enable experimental AppArmor profile for bubblewrap so Flatpak apps can open in Demo Mode - -# The apparmor systemd service (that parses profiles and loads them into the kernel) is patched to be disabled -# when running on "live" systems due to historical bugs with it breaking applications. Apparmor is still -# enabled, but no profiles are loaded as a result. -# -# There are discussions dating back a few years questioning whether this is still necessary: -# https://www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg1821688.html -# -# Since it breaks our Flatpak apps, remove the config that disables it. -mkdir -p /usr/lib/systemd/system/apparmor.service.d -cat << EOF > /usr/lib/systemd/system/apparmor.service.d/99_enable_in_live_mode.conf -[Unit] -ConditionPathExists= -EOF diff --git a/etc/config/hooks/live/revert-os-release-divert.chroot b/etc/config/hooks/live/revert-os-release-divert.chroot deleted file mode 100644 index 0389cf73b..000000000 --- a/etc/config/hooks/live/revert-os-release-divert.chroot +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh -# Description: Revert dpkg-divert of /etc/os-release done by live-build -# https://salsa.debian.org/live-team/live-build/-/blob/debian/1%2520250505/scripts/build/bootstrap_debootstrap?ref_type=tags#L125-142 - -echo "P: Begin executing revert-os-release-divert chroot hook..." - -OS_RELEASE=/etc/os-release -OS_RELEASE_DIVERTED="${OS_RELEASE}.debootstrap" - -dpkg-divert --list "$OS_RELEASE" | grep -q "$OS_RELEASE" -if [ $? -eq 0 ]; then - mv "$OS_RELEASE_DIVERTED" "$OS_RELEASE" - dpkg-divert --quiet --local --remove --no-rename --divert "$OS_RELEASE_DIVERTED" "$OS_RELEASE" -fi diff --git a/etc/config/hooks/live/set-disk-info.binary b/etc/config/hooks/live/set-disk-info.binary deleted file mode 100755 index fc6eb5413..000000000 --- a/etc/config/hooks/live/set-disk-info.binary +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh - -echo "P: Begin executing set-disk-info binary hook in ${PWD}" - -cp -rf ../config/includes.binary/.disk . diff --git a/etc/config/hooks/live/setup-casper-folder.binary b/etc/config/hooks/live/setup-casper-folder.binary deleted file mode 100755 index d3f63e9ba..000000000 --- a/etc/config/hooks/live/setup-casper-folder.binary +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh - -mkdir casper || true -mv boot/filesystem.squashfs casper/filesystem.squashfs -mv boot/filesystem.size casper/filesystem.size -mv boot/initrd.img-* casper/initrd.lz -mv boot/vmlinuz-* casper/vmlinuz -mv boot/filesystem.packages-remove casper/filesystem.manifest-remove -mv boot/filesystem.packages casper/filesystem.manifest - -mkdir live || true -cp casper/vmlinuz live/vmlinuz diff --git a/etc/config/includes.binary/.disk/base_installable b/etc/config/includes.binary/.disk/base_installable deleted file mode 100644 index e69de29bb..000000000 diff --git a/etc/config/includes.binary/.disk/cd_type b/etc/config/includes.binary/.disk/cd_type deleted file mode 100644 index daab660cd..000000000 --- a/etc/config/includes.binary/.disk/cd_type +++ /dev/null @@ -1 +0,0 @@ -full_cd/single diff --git a/etc/config/includes.binary/.disk/info b/etc/config/includes.binary/.disk/info deleted file mode 100644 index 277b60dc8..000000000 --- a/etc/config/includes.binary/.disk/info +++ /dev/null @@ -1 +0,0 @@ -@DISTRO_NAME @VERSION "@CODENAME" - @CHANNEL @ARCH (@DATE) diff --git a/etc/config/includes.chroot/etc/apt/apt.conf.d/00trustcdrom b/etc/config/includes.chroot/etc/apt/apt.conf.d/00trustcdrom deleted file mode 100644 index c7588cb4a..000000000 --- a/etc/config/includes.chroot/etc/apt/apt.conf.d/00trustcdrom +++ /dev/null @@ -1 +0,0 @@ -APT::Authentication::TrustCDROM "true"; diff --git a/etc/config/package-lists/desktop.list.chroot_install b/etc/config/package-lists/desktop.list.chroot_install deleted file mode 100644 index 21b75d5f4..000000000 --- a/etc/config/package-lists/desktop.list.chroot_install +++ /dev/null @@ -1,7 +0,0 @@ -# elementary meta packages -elementary-desktop -elementary-minimal -elementary-standard - -@XORG_HWE -@KERNEL_HEADERS diff --git a/etc/config/package-lists/desktop.list.chroot_live b/etc/config/package-lists/desktop.list.chroot_live deleted file mode 100644 index eccbc11ab..000000000 --- a/etc/config/package-lists/desktop.list.chroot_live +++ /dev/null @@ -1 +0,0 @@ -elementary-live diff --git a/etc/config/package-lists/pool.list.binary b/etc/config/package-lists/pool.list.binary deleted file mode 100644 index 209b69a73..000000000 --- a/etc/config/package-lists/pool.list.binary +++ /dev/null @@ -1,26 +0,0 @@ -b43-fwcutter -dkms -open-vm-tools-desktop -setserial -user-setup - -efibootmgr -secureboot-db -shim -shim-signed - -#if ARCHITECTURES amd64 -broadcom-sta-dkms -intel-microcode -iucode-tool - -grub-efi-amd64 -grub-efi-amd64-bin -grub-efi-amd64-signed -#endif - -#if ARCHITECTURES arm64 -grub-efi-arm64 -grub-efi-arm64-bin -grub-efi-arm64-signed -#endif diff --git a/etc/terraform-amd64.conf b/etc/terraform-amd64.conf deleted file mode 100644 index 7d046b1e8..000000000 --- a/etc/terraform-amd64.conf +++ /dev/null @@ -1,30 +0,0 @@ -# target architecture -ARCH="amd64" - -# base codename -BASECODENAME="noble" - -# base version -BASEVERSION="24.04" - -# distribution codename -CODENAME="circe" - -# distribution version -VERSION="8.0" - -# distribution channel -CHANNEL="stable" - -# distribution name -NAME="elementary OS" - -# mirror to fetch packages from -MIRROR_URL="http://archive.ubuntu.com/ubuntu/" - -# use HWE kernel and packages? -HWE_KERNEL="yes" -HWE_X11="no" - -# suffix for generated .iso files -OUTPUT_SUFFIX="" diff --git a/etc/terraform-arm64.conf b/etc/terraform-arm64.conf deleted file mode 100644 index 13540da16..000000000 --- a/etc/terraform-arm64.conf +++ /dev/null @@ -1,30 +0,0 @@ -# target architecture -ARCH="arm64" - -# base codename -BASECODENAME="noble" - -# base version -BASEVERSION="24.04" - -# distribution codename -CODENAME="circe" - -# distribution version -VERSION="8.0" - -# distribution channel -CHANNEL="stable" - -# distribution name -NAME="elementary OS" - -# mirror to fetch packages from -MIRROR_URL="http://ports.ubuntu.com/ubuntu-ports/" - -# use HWE kernel and packages? -HWE_KERNEL="yes" -HWE_X11="no" - -# suffix for generated .iso files -OUTPUT_SUFFIX="" diff --git a/etc/terraform-daily-7.1-azure.conf b/etc/terraform-daily-7.1-azure.conf deleted file mode 100644 index 2afdb4a8b..000000000 --- a/etc/terraform-daily-7.1-azure.conf +++ /dev/null @@ -1,30 +0,0 @@ -# target architecture - i386, amd64 or all -ARCH="amd64" - -# base codename -BASECODENAME="jammy" - -# base version -BASEVERSION="22.04" - -# distribution codename -CODENAME="horus" - -# distribution version -VERSION="7.1" - -# distribution channel -CHANNEL="daily" - -# distribution name -NAME="elementary OS" - -# mirror to fetch packages from -MIRROR_URL="http://azure.archive.ubuntu.com/ubuntu/" - -# use HWE kernel and packages? -HWE_KERNEL="no" -HWE_X11="no" - -# suffix for generated .iso files -OUTPUT_SUFFIX="" diff --git a/etc/terraform-daily-8.1-azure-amd64.conf b/etc/terraform-daily-8.1-azure-amd64.conf deleted file mode 100644 index 7a2d3be29..000000000 --- a/etc/terraform-daily-8.1-azure-amd64.conf +++ /dev/null @@ -1,30 +0,0 @@ -# target architecture -ARCH="amd64" - -# base codename -BASECODENAME="noble" - -# base version -BASEVERSION="24.04" - -# distribution codename -CODENAME="circe" - -# distribution version -VERSION="8.1" - -# distribution channel -CHANNEL="daily" - -# distribution name -NAME="elementary OS" - -# mirror to fetch packages from -MIRROR_URL="http://azure.archive.ubuntu.com/ubuntu/" - -# use HWE kernel and packages? -HWE_KERNEL="yes" -HWE_X11="no" - -# suffix for generated .iso files -OUTPUT_SUFFIX="" diff --git a/etc/terraform-daily-8.1-azure-arm64.conf b/etc/terraform-daily-8.1-azure-arm64.conf deleted file mode 100644 index a33d7926b..000000000 --- a/etc/terraform-daily-8.1-azure-arm64.conf +++ /dev/null @@ -1,30 +0,0 @@ -# target architecture -ARCH="arm64" - -# base codename -BASECODENAME="noble" - -# base version -BASEVERSION="24.04" - -# distribution codename -CODENAME="circe" - -# distribution version -VERSION="8.1" - -# distribution channel -CHANNEL="daily" - -# distribution name -NAME="elementary OS" - -# mirror to fetch packages from -MIRROR_URL="http://azure.ports.ubuntu.com/ubuntu-ports/" - -# use HWE kernel and packages? -HWE_KERNEL="yes" -HWE_X11="no" - -# suffix for generated .iso files -OUTPUT_SUFFIX="" diff --git a/etc/terraform-daily-9.0-azure-amd64.conf b/etc/terraform-daily-9.0-azure-amd64.conf deleted file mode 100644 index 79fd43a87..000000000 --- a/etc/terraform-daily-9.0-azure-amd64.conf +++ /dev/null @@ -1,30 +0,0 @@ -# target architecture -ARCH="amd64" - -# base codename -BASECODENAME="resolute" - -# base version -BASEVERSION="26.04" - -# distribution codename -CODENAME="tanit" - -# distribution version -VERSION="9.0" - -# distribution channel -CHANNEL="daily" - -# distribution name -NAME="elementary OS" - -# mirror to fetch packages from -MIRROR_URL="http://azure.archive.ubuntu.com/ubuntu/" - -# use HWE kernel and packages? -HWE_KERNEL="yes" -HWE_X11="no" - -# suffix for generated .iso files -OUTPUT_SUFFIX="" diff --git a/etc/terraform-daily-9.0-azure-arm64.conf b/etc/terraform-daily-9.0-azure-arm64.conf deleted file mode 100644 index 22396c465..000000000 --- a/etc/terraform-daily-9.0-azure-arm64.conf +++ /dev/null @@ -1,30 +0,0 @@ -# target architecture -ARCH="arm64" - -# base codename -BASECODENAME="resolute" - -# base version -BASEVERSION="26.04" - -# distribution codename -CODENAME="tanit" - -# distribution version -VERSION="9.0" - -# distribution channel -CHANNEL="daily" - -# distribution name -NAME="elementary OS" - -# mirror to fetch packages from -MIRROR_URL="http://azure.ports.ubuntu.com/ubuntu-ports/" - -# use HWE kernel and packages? -HWE_KERNEL="yes" -HWE_X11="no" - -# suffix for generated .iso files -OUTPUT_SUFFIX="" diff --git a/etc/terraform-stable-8.1-azure-amd64.conf b/etc/terraform-stable-8.1-azure-amd64.conf deleted file mode 100644 index 2f331d868..000000000 --- a/etc/terraform-stable-8.1-azure-amd64.conf +++ /dev/null @@ -1,30 +0,0 @@ -# target architecture -ARCH="amd64" - -# base codename -BASECODENAME="noble" - -# base version -BASEVERSION="24.04" - -# distribution codename -CODENAME="circe" - -# distribution version -VERSION="8.1" - -# distribution channel -CHANNEL="stable" - -# distribution name -NAME="elementary OS" - -# mirror to fetch packages from -MIRROR_URL="http://azure.archive.ubuntu.com/ubuntu/" - -# use HWE kernel and packages? -HWE_KERNEL="yes" -HWE_X11="no" - -# suffix for generated .iso files -OUTPUT_SUFFIX="" diff --git a/etc/terraform-stable-8.1-azure-arm64.conf b/etc/terraform-stable-8.1-azure-arm64.conf deleted file mode 100644 index 59f9438a6..000000000 --- a/etc/terraform-stable-8.1-azure-arm64.conf +++ /dev/null @@ -1,30 +0,0 @@ -# target architecture -ARCH="arm64" - -# base codename -BASECODENAME="noble" - -# base version -BASEVERSION="24.04" - -# distribution codename -CODENAME="circe" - -# distribution version -VERSION="8.1" - -# distribution channel -CHANNEL="stable" - -# distribution name -NAME="elementary OS" - -# mirror to fetch packages from -MIRROR_URL="http://azure.ports.ubuntu.com/ubuntu-ports/" - -# use HWE kernel and packages? -HWE_KERNEL="yes" -HWE_X11="no" - -# suffix for generated .iso files -OUTPUT_SUFFIX="" diff --git a/mkosi.bump b/mkosi.bump new file mode 100755 index 000000000..fa52d3fbf --- /dev/null +++ b/mkosi.bump @@ -0,0 +1,4 @@ +#!/bin/bash +set -e + +date -u +%Y%m%d%H%M%S diff --git a/mkosi.clean b/mkosi.clean new file mode 100755 index 000000000..7b94e2bd8 --- /dev/null +++ b/mkosi.clean @@ -0,0 +1,6 @@ +#!/bin/sh +set -e +set -o nounset + +rm -rf "$OUTPUTDIR"/"$IMAGE_ID"* +rm -rf "$SRCDIR/cache" diff --git a/mkosi.conf b/mkosi.conf new file mode 100644 index 000000000..0e6c54940 --- /dev/null +++ b/mkosi.conf @@ -0,0 +1,27 @@ +[Config] +MinimumVersion=26~devel + +[Distribution] +Distribution=ubuntu +Release=resolute +Repositories=main,universe + +[Content] +Hostname=elementary + +[Build] +ToolsTree=default +History=yes +CacheDirectory=mkosi.cache +Incremental=yes + +[Validation] +SecureBoot=no +SignExpectedPcr=no + +[Output] +ImageId=Elementary +OutputDirectory=mkosi.output +ManifestFormat=json +Output=%i_%a # Unversioned tag for quick testing +# Output=%i_%v_%a # Versioned tag for releases \ No newline at end of file diff --git a/mkosi.conf.d/elementary/mkosi.conf b/mkosi.conf.d/elementary/mkosi.conf new file mode 100644 index 000000000..d95b24937 --- /dev/null +++ b/mkosi.conf.d/elementary/mkosi.conf @@ -0,0 +1,2 @@ +[Match] +Distribution=ubuntu diff --git a/mkosi.conf.d/elementary/mkosi.conf.d/apparmor.conf b/mkosi.conf.d/elementary/mkosi.conf.d/apparmor.conf new file mode 100644 index 000000000..d624fefc3 --- /dev/null +++ b/mkosi.conf.d/elementary/mkosi.conf.d/apparmor.conf @@ -0,0 +1,8 @@ +[Match] +Distribution=ubuntu + +[Content] +Packages= + apparmor + apparmor-profiles + apparmor-utils \ No newline at end of file diff --git a/mkosi.conf.d/elementary/mkosi.conf.d/elementary-apps.conf b/mkosi.conf.d/elementary/mkosi.conf.d/elementary-apps.conf new file mode 100644 index 000000000..ecdd0c78f --- /dev/null +++ b/mkosi.conf.d/elementary/mkosi.conf.d/elementary-apps.conf @@ -0,0 +1,23 @@ +[Match] +Distribution=ubuntu + +[Content] +Packages= + contractor + io.elementary.appcenter + io.elementary.bluetooth-daemon + io.elementary.code + io.elementary.feedback + io.elementary.mail + io.elementary.monitor + io.elementary.onboarding + io.elementary.sideload + io.elementary.tasks + io.elementary.terminal + pantheon-files + pantheon-photos + + + + + diff --git a/mkosi.conf.d/elementary/mkosi.conf.d/elementary-desktop.conf b/mkosi.conf.d/elementary/mkosi.conf.d/elementary-desktop.conf new file mode 100644 index 000000000..4228c923c --- /dev/null +++ b/mkosi.conf.d/elementary/mkosi.conf.d/elementary-desktop.conf @@ -0,0 +1,39 @@ +[Match] +Distribution=ubuntu + +[Content] +Packages= + appcenter + pantheon-greeter + elementary-artwork + elementary-wallpapers + fonts-inter + fonts-elementary-core + fonts-elementary-extra + fonts-roboto-mono-elementary + granite-demo + elementary-default-settings + elementary-desktop + elementary-minimal + elementary-printer-test-page + elementary-os-overlay + elementary-icon-theme + elementary-sdk + elementary-standard + io.elementary.session-settings + io.elementary.initial-setup + gnome-session-bin + gnome-session-common + desktop-base + pantheon-shell + pantheon + io.elementary.settings-daemon + io.elementary.portals + pantheon-agent-polkit + xwayland + gala + + + + + diff --git a/mkosi.conf.d/elementary/mkosi.conf.d/elementary-panel.conf b/mkosi.conf.d/elementary/mkosi.conf.d/elementary-panel.conf new file mode 100644 index 000000000..c875537fa --- /dev/null +++ b/mkosi.conf.d/elementary/mkosi.conf.d/elementary-panel.conf @@ -0,0 +1,22 @@ +[Match] +Distribution=ubuntu + +[Content] +Packages= + io.elementary.dock + io.elementary.notifications + io.elementary.wingpanel + io.elementary.shortcut-overlay + io.elementary.panel.bluetooth + io.elementary.panel.datetime + io.elementary.panel.keyboard + io.elementary.panel.network + io.elementary.panel.nightlight + io.elementary.panel.notifications + io.elementary.panel.power + io.elementary.quick-settings + + + + + diff --git a/mkosi.conf.d/elementary/mkosi.conf.d/elementary-settings.conf b/mkosi.conf.d/elementary/mkosi.conf.d/elementary-settings.conf new file mode 100644 index 000000000..890dd112b --- /dev/null +++ b/mkosi.conf.d/elementary/mkosi.conf.d/elementary-settings.conf @@ -0,0 +1,31 @@ +[Match] +Distribution=ubuntu + +[Content] +Packages= + io.elementary.settings + io.elementary.settings.applications + io.elementary.settings.bluetooth + io.elementary.settings.datetime + io.elementary.settings.desktop + io.elementary.settings.display + io.elementary.settings.keyboard + io.elementary.settings.locale + io.elementary.settings.mouse-touchpad + io.elementary.settings.network + io.elementary.settings.notifications + io.elementary.settings.onlineaccounts + io.elementary.settings.power + io.elementary.settings.printers + io.elementary.settings.screentime-limits + io.elementary.settings.security-privacy + #io.elementary.settings.sharing + io.elementary.settings.sound + io.elementary.settings.system + io.elementary.settings.useraccounts + io.elementary.settings.wacom + + + + + diff --git a/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf b/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf new file mode 100644 index 000000000..28fa89532 --- /dev/null +++ b/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf @@ -0,0 +1,57 @@ +[Content] +RemoveFiles= + /usr/bin/chsh + /usr/bin/lchsh + +VolatilePackages= + systemd-container + +RemovePackages= + anacron + +Packages= + plymouth + plymouth-theme-elementary + linux-image-generic + linux-firmware + libpam-systemd + dbus-user-session + systemd-resolved + systemd-cryptsetup + cryptsetup + btrfs-progs + bolt + x11-common + curl + wget + binutils + iputils-ping + ubuntu-keyring + distrobox + fastfetch + oras + flatpak + htop + podman + vim + fzf + gcr + git + locales-all + glycin-loaders + gnome-disk-utility + gnome-keyring + libpam-gnome-keyring + totem-video-thumbnailer + just + lshw + nano + ncurses-base + network-manager + ssh-askpass-gnome + systemd-homed + sudo-rs + yq + jq + xdg-desktop-portal-gtk + xdg-user-dirs \ No newline at end of file diff --git a/mkosi.extra/usr/lib/dracut/dracut.conf.d/base-ubuntu.conf b/mkosi.extra/usr/lib/dracut/dracut.conf.d/base-ubuntu.conf new file mode 100644 index 000000000..bc2e09618 --- /dev/null +++ b/mkosi.extra/usr/lib/dracut/dracut.conf.d/base-ubuntu.conf @@ -0,0 +1,4 @@ +export DRACUT_NO_XATTR=1 +reproducible=yes +hostonly=no +compress=zstd diff --git a/mkosi.extra/usr/lib/dracut/dracut.conf.d/lvm2.conf b/mkosi.extra/usr/lib/dracut/dracut.conf.d/lvm2.conf new file mode 100644 index 000000000..fa0c03dab --- /dev/null +++ b/mkosi.extra/usr/lib/dracut/dracut.conf.d/lvm2.conf @@ -0,0 +1 @@ +add_dracutmodules+=" lvm dm crypt fips " diff --git a/mkosi.extra/usr/lib/sysctl.d/60-apparmor.conf b/mkosi.extra/usr/lib/sysctl.d/60-apparmor.conf new file mode 100644 index 000000000..9dec26aed --- /dev/null +++ b/mkosi.extra/usr/lib/sysctl.d/60-apparmor.conf @@ -0,0 +1,2 @@ +kernel.apparmor_restrict_unprivileged_userns=0 +kernel.apparmor_restrict_unprivileged_unconfined=0 \ No newline at end of file diff --git a/mkosi.extra/usr/lib/systemd/system-preset/01-systemd.preset b/mkosi.extra/usr/lib/systemd/system-preset/01-systemd.preset new file mode 100644 index 000000000..9452a002d --- /dev/null +++ b/mkosi.extra/usr/lib/systemd/system-preset/01-systemd.preset @@ -0,0 +1,6 @@ +disable systemd-timesyncd.service +disable sshd.socket +disable sshd.service +enable firewalld.service +enable systemd-resolved.service +enable plymouth.service diff --git a/mkosi.extra/usr/lib/systemd/system-preset/91-resolved-default.preset b/mkosi.extra/usr/lib/systemd/system-preset/91-resolved-default.preset new file mode 100644 index 000000000..df1bca628 --- /dev/null +++ b/mkosi.extra/usr/lib/systemd/system-preset/91-resolved-default.preset @@ -0,0 +1 @@ +enable systemd-resolved.service diff --git a/mkosi.extra/usr/lib/systemd/user-preset/01-zirconium.preset b/mkosi.extra/usr/lib/systemd/user-preset/01-zirconium.preset new file mode 100644 index 000000000..2daae828f --- /dev/null +++ b/mkosi.extra/usr/lib/systemd/user-preset/01-zirconium.preset @@ -0,0 +1,4 @@ +enable gnome-keyring-daemon.service +enable gnome-keyring-daemon.socket +enable gcr-ssh-agent.service +enable gcr-ssh-agent.socket diff --git a/mkosi.extra/usr/lib/sysusers.d/session.conf b/mkosi.extra/usr/lib/sysusers.d/session.conf new file mode 100644 index 000000000..d23e69189 --- /dev/null +++ b/mkosi.extra/usr/lib/sysusers.d/session.conf @@ -0,0 +1,2 @@ +u lightdm - "Light Display Manager" /var/lib/lightdm /usr/sbin/nologin +u geoclue - "Geoclue Service" /var/lib/geoclue /usr/sbin/nologin \ No newline at end of file diff --git a/mkosi.extra/usr/lib/sysusers.d/wpa.conf b/mkosi.extra/usr/lib/sysusers.d/wpa.conf new file mode 100644 index 000000000..a1c19663b --- /dev/null +++ b/mkosi.extra/usr/lib/sysusers.d/wpa.conf @@ -0,0 +1 @@ +g netdev - - \ No newline at end of file diff --git a/mkosi.extra/usr/lib/tmpfiles.d/99-factory.conf b/mkosi.extra/usr/lib/tmpfiles.d/99-factory.conf new file mode 100644 index 000000000..546291743 --- /dev/null +++ b/mkosi.extra/usr/lib/tmpfiles.d/99-factory.conf @@ -0,0 +1,2 @@ +C+ /etc/containers/ +L? /etc/hostname \ No newline at end of file diff --git a/mkosi.extra/usr/lib/tmpfiles.d/login.conf b/mkosi.extra/usr/lib/tmpfiles.d/login.conf new file mode 100644 index 000000000..72393e306 --- /dev/null +++ b/mkosi.extra/usr/lib/tmpfiles.d/login.conf @@ -0,0 +1 @@ +d /var/lib/lightdm/data 0755 root root - \ No newline at end of file diff --git a/mkosi.extra/usr/lib/tmpfiles.d/resolved-default.conf b/mkosi.extra/usr/lib/tmpfiles.d/resolved-default.conf new file mode 100644 index 000000000..360c949bf --- /dev/null +++ b/mkosi.extra/usr/lib/tmpfiles.d/resolved-default.conf @@ -0,0 +1 @@ +L /etc/resolv.conf - - - - ../run/systemd/resolve/stub-resolv.conf diff --git a/mkosi.extra/usr/share/factory/etc/.gitkeep b/mkosi.extra/usr/share/factory/etc/.gitkeep new file mode 100644 index 000000000..326c1956b --- /dev/null +++ b/mkosi.extra/usr/share/factory/etc/.gitkeep @@ -0,0 +1 @@ +# add factory overwrite here... \ No newline at end of file diff --git a/mkosi.extra/usr/share/flatpak/remotes.d/appcenter.flatpakrepo b/mkosi.extra/usr/share/flatpak/remotes.d/appcenter.flatpakrepo new file mode 100644 index 000000000..f487455be --- /dev/null +++ b/mkosi.extra/usr/share/flatpak/remotes.d/appcenter.flatpakrepo @@ -0,0 +1,8 @@ +[Flatpak Repo] +Title=AppCenter +Url=https://flatpak.elementaryos.org/repo +Homepage=https://elementary.io/ +Icon=https://flatpak.elementaryos.org/icon.svg +Comment=The open source, pay-what-you-want app store from elementary +Description=Reviewed and curated by elementary to ensure a native, privacy-respecting, and secure experience +GPGKey=LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCgptUUVOQkZjUlJOSUJDQURyRW5JUjkxYjJ2WDZCckFBWXFEUlRLWmVGZE1GRzdTdFNxRm8zbFpIMktGZDdLQmVCCnhZV25VM1YveEpRKzFsRnVqbytuYTZ6N0w5cUJydGlrWWRJbjlNYzNlU3l3L2ZsaTFGa011b0ZtZE10ajZrMUYKeitORU0wZFNyRUxhdkJNUHpYYjRrakY4WkdLbmVSMzV2NFkzUlArbHZaRGl1bVpwdkZ6VHpVMEFSVVJreEgzTgpiWWlYMG1raTc1Z3krRUh3Q1JlU1BqQnhLOTQrc1FSb0NsSmRyUWJGYUh0WERxZmgyWFZRTW0yTm5tSmFmMlJiCk1Gbzc1ekVveEh6WWJuQnlXZFIvWGg2dWhsU3lEYUJZME8wZjFjM3ljR243VVQrN0NBZEdrYTZHdTJWWlVYRUgKR0xaUzRvdFZodG95Z2Era0dhaUo3U1lSU1F6ZDBTL3hQUHh0QUJFQkFBRzBLR1ZzWlcxbGJuUmhjbmtnWW5WcApiR1J6SUR4aWRXbHNaSE5BWld4bGJXVnVkR0Z5ZVM1cGJ6NkpBVGNFRXdFSkFDRUZBbGNSUk5JQ0d3TUZDd2tJCkJ3TUZGUWtLQ0FzRkZnTUNBUUFDSGdFQ0Y0QUFDZ2tRcDA5ejcvNXd1Unpmd1FmL1FlR3RkbFFpVjNISkMvaEYKeVE0Q0hPeFpKRnJwZS9VZC90YXprVWlwbGMyWS9tcnJldGdkR2hJb0o2TnBRV3BEVENMRm12RDVDRXE5bGV0cwplUlVOVUx3MjF1dG5pdVRyckRYWmUxdG9tMEZrRlNkeUNZOFVwRERPYzdMa3piUTh3S28xQVNreXlFajhmVlhMCkVvT2tic2pSUUpVWFMvNlNkb1JTZVZpdXREZXdqVHkwWXZlbFVNVnhjWDVINVRqSmZYbVpNR1V4dEdVZWYzUmEKUkRYUjY5a21GamY3VW12MkFpaVZzZW5kcXJmSFJMblpRUnNiYmxOQWxObDVKK1ZUbEtrdmN3WGl2V2V3bFZVYQpPTDhIUEZvOWQya3hJYmV4RzJ5THdudXdtZmF2U0ZKVjROWWVtU1BTS2w2bEpWYkkzUCt6eitVODdWT01yOEtmCnVMMERvN2tCRFFSWEVVVFNBUWdBdkEzb1o3ck4xaUU4TTNROTFIVzM3bEJWK0V0YWdpckpVYTYrbTJvdlBmYTYKVG5PUHN5Z1NZOEVpTVBLQjhyRHhWUmszMlhuendObDNNQ21XMFlqTjFTMnNkRnY4WW5QWEx6WEtKV1lxVGFDTgpkZ0pQaEZ6K0xkZ1BtdVcya0hIM0VOWjhrT0JLZVZKZFErVUN4WmtFZEpaVmhuc0lQNjBwSHBTMmw4b01HWllrCnd0UnBlNkJEdEpNbHBnVVZXSzFqSnJmL1VqL0pBNjIrcnB2QWwyN1R4ZFpncHNtWU5hT3BnOWd1bVY4YUd0VWsKNGw2WDBOalNrS2FrYTdtMkJVTEFIb3RZT0FLMThEMHo3d3NzbEdiU2ZDWUtOS3NYS29VYlg5ZnB4anhQVXByTQpIUUo3TkFlZkRnZmllREltRm1CcGNTWEViem5VenQ1dmdTS3lIR05zdXdBUkFRQUJpUUVmQkJnQkNRQUpCUUpYCkVVVFNBaHNNQUFvSkVLZFBjKy8rY0xrY2VKQUgvMFhQVTJmeithaXBoNGx0dDludmRrWS9pcUZKNC9uZzJwWWoKejlLOWU4Sld1NjVFQkJrVW4zSjgwY1Z3TVRjQ3ZaZHVEeU1IaXpvYlBpbEhVeVdBZHdYdExYZ0xUWTVUUmZrZApIUVRLVmhGcXEvTHJwclVCUm9BSlFmVGJMNlhkQ1g4RHk3cTg5OXlhaUhzQkpkMUl6RUJpS3BmVE9jMVJtVnQvCnR2YUcwK1doQlJlL2FIdTV3bktrZkV4TGRzVzhtRHJOVW5EeWtUajUwQ2tpMWtmRnZMV2xTTHo2d2xYeXFHMVUKMWFCK25FTTdkMS9yL2pvRnNvWWZ0MlRUc2NOaTBIdnhZOFUxbU5TRDVIN0lYSzFlY0dUNTNmU2NsUFBrclZkNQorRjRZQnBkOUZJeTdMQm5MaGZLMEY0YUJlN2lUTFBpWUo3VFVwSWV6M2s3dWJSR0dCWmc9Cj1JQ3JSCi0tLS0tRU5EIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0K \ No newline at end of file diff --git a/mkosi.extra/usr/share/flatpak/remotes.d/flathub.flatpakrepo b/mkosi.extra/usr/share/flatpak/remotes.d/flathub.flatpakrepo new file mode 100644 index 000000000..26a88a345 --- /dev/null +++ b/mkosi.extra/usr/share/flatpak/remotes.d/flathub.flatpakrepo @@ -0,0 +1,8 @@ +[Flatpak Repo] +Title=Flathub +Url=https://dl.flathub.org/repo/ +Homepage=https://flathub.org/ +Comment=Central repository of Flatpak applications +Description=Central repository of Flatpak applications +Icon=https://dl.flathub.org/repo/logo.svg +GPGKey=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 \ No newline at end of file diff --git a/mkosi.extra/usr/share/glib-2.0/schemas/io.elementary.desktop.wingpanel.power.gschema.xml b/mkosi.extra/usr/share/glib-2.0/schemas/io.elementary.desktop.wingpanel.power.gschema.xml new file mode 100644 index 000000000..036c91cd9 --- /dev/null +++ b/mkosi.extra/usr/share/glib-2.0/schemas/io.elementary.desktop.wingpanel.power.gschema.xml @@ -0,0 +1,10 @@ + + + + + false +

Sets if the percentage of the primary battery is shown in the panel. + Enable this to see the percentage of the battery directly in the panel without having to click onto the power-indicator. + + + diff --git a/mkosi.postinst.chroot b/mkosi.postinst.chroot new file mode 100755 index 000000000..bf18d6b05 --- /dev/null +++ b/mkosi.postinst.chroot @@ -0,0 +1,6 @@ +#!/bin/bash +set -xeuo pipefail + +fc-cache --force --really-force --system-only --verbose + +glib-compile-schemas /usr/share/glib-2.0/schemas/ diff --git a/mkosi.profiles/sysupdate/mkosi.conf b/mkosi.profiles/sysupdate/mkosi.conf new file mode 100644 index 000000000..15d3901e6 --- /dev/null +++ b/mkosi.profiles/sysupdate/mkosi.conf @@ -0,0 +1,55 @@ +# THIS PROFILE SHOULD NOT BE USED BY DEFAULT +# This is an implementation of sysupdate-based Ubuntu, everything that would be necessary to implement the same idea as systemd's particleOS. + +[Match] +Profiles=sysupdate + +[Output] +SplitArtifacts=uki,partitions +Format=disk + +[Content] +Bootable=yes +Bootloader=uki +UnifiedKernelImageFormat=%i_%v_%a +InitrdProfiles= +KernelInitrdModules= + default + ahci + nvme + xhci_pci + usb_storage + uas + sd_mod + dm-verity +KernelCommandLine= + splash + root=dissect + mount.usr=dissect + rw + audit=0 + systemd.image_policy=esp=unprotected:xbootldr=unprotected+unused+absent:usr=signed:root=encrypted+absent:home=unprotected+absent:=ignore + systemd.image_filter=usr=Elementary_*:usr-verity=Elementary_*:usr-verity-sig=Elementary_*:root=Elementary-*:home=Elementary-* + systemd.debug-shell=ttyS0 + rd.systemd.debug-shell=ttyS0 + ipe.enforce=0 + +[Validation] +# just for now, please do enable secureboot +SecureBoot=no +SignExpectedPcr=no + +# mkosi vm specific +[Runtime] +RuntimeSize=40G +RAM=4G +CPUs=4 +Ephemeral=yes +Credentials= + passwd.plaintext-password.root=particleos + tty.serial.hvc0.agetty.autologin=particleos + tty.serial.hvc0.login.noauth=yes + tty.console.agetty.autologin=particleos + tty.console.login.noauth=yes + tty.virtual.tty1.agetty.autologin=particleos + tty.virtual.tty1.login.noauth=yes diff --git a/mkosi.profiles/sysupdate/mkosi.conf.d/ubuntu/mkosi.conf b/mkosi.profiles/sysupdate/mkosi.conf.d/ubuntu/mkosi.conf new file mode 100644 index 000000000..3f572bede --- /dev/null +++ b/mkosi.profiles/sysupdate/mkosi.conf.d/ubuntu/mkosi.conf @@ -0,0 +1,20 @@ +[Match] +Distribution=ubuntu + +[Content] +Packages=systemd-container + +VolatilePackages= + passwd + login + uidmap + systemd-boot + +InitrdVolatilePackages= + systemd + udev + +InitrdPackages= + linux-firmware + cryptsetup + cryptsetup-bin \ No newline at end of file diff --git a/mkosi.profiles/sysupdate/mkosi.extra/boot/loader/loader.conf b/mkosi.profiles/sysupdate/mkosi.extra/boot/loader/loader.conf new file mode 100644 index 000000000..689fa6c49 --- /dev/null +++ b/mkosi.profiles/sysupdate/mkosi.extra/boot/loader/loader.conf @@ -0,0 +1 @@ +timeout 20 diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/00-esp.conf b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/00-esp.conf new file mode 100644 index 000000000..ec520239e --- /dev/null +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/00-esp.conf @@ -0,0 +1,6 @@ +[Partition] +Type=esp +Format=vfat +CopyFiles=/boot:/ +SizeMinBytes=1G +SizeMaxBytes=1G diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf new file mode 100644 index 000000000..c6647667e --- /dev/null +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf @@ -0,0 +1,4 @@ +[Partition] +Type=usr-verity-sig +Label=%M_%A_verity_sig +CopyBlocks=auto diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf new file mode 100644 index 000000000..d3a162d6a --- /dev/null +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf @@ -0,0 +1,6 @@ +[Partition] +Type=usr-verity +Label=%M_%A_verity +CopyBlocks=auto +SizeMinBytes=400M +SizeMaxBytes=400M diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/12-usr.conf b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/12-usr.conf new file mode 100644 index 000000000..17fd4a3c2 --- /dev/null +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/12-usr.conf @@ -0,0 +1,7 @@ +[Partition] +Type=usr +Label=%M_%A +SizeMinBytes=5G +SizeMaxBytes=20G +Weight=2000 +CopyBlocks=auto diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/20-usr-verity-sig.conf b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/20-usr-verity-sig.conf new file mode 100644 index 000000000..318fec069 --- /dev/null +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/20-usr-verity-sig.conf @@ -0,0 +1,3 @@ +[Partition] +Type=usr-verity-sig +Label=_empty diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/21-usr-verity.conf b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/21-usr-verity.conf new file mode 100644 index 000000000..6c813102e --- /dev/null +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/21-usr-verity.conf @@ -0,0 +1,6 @@ +[Partition] +Type=usr-verity +Label=_empty +NoAuto=1 +SizeMinBytes=400M +SizeMaxBytes=400M diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/22-usr.conf b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/22-usr.conf new file mode 100644 index 000000000..aff32b239 --- /dev/null +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/22-usr.conf @@ -0,0 +1,7 @@ +[Partition] +Type=usr +Label=_empty +NoAuto=1 +SizeMinBytes=5G +SizeMaxBytes=20G +Weight=2000 diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/40-root.conf b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/40-root.conf new file mode 100644 index 000000000..735fb2183 --- /dev/null +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/40-root.conf @@ -0,0 +1,10 @@ +[Partition] +Type=root +Format=btrfs +SizeMinBytes=9G +Weight=18000 +Subvolumes=/var +MakeDirectories=/var/log/journal +Encrypt=tpm2 +FactoryReset=yes +Label=%M-root diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/50-home.conf b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/50-home.conf new file mode 100644 index 000000000..3c7e04426 --- /dev/null +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/50-home.conf @@ -0,0 +1,7 @@ +[Partition] +Type=home +Format=btrfs +SizeMinBytes=10G +Weight=45000 +FactoryReset=yes +Label=%M-home diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset new file mode 100644 index 000000000..d04aa7310 --- /dev/null +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset @@ -0,0 +1,14 @@ +enable systemd-resolved +enable NetworkManager.service +enable NetworkManager-wait-online.service +disable systemd-networkd + +enable systemd-timesyncd.service +disable systemd-homed-firstboot.service +disable systemd-firstboot.service +mask systemd-firstboot.service +enable systemd-homed.service + +disable avahi.* + +enable preset-global.service diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/systemd/system/preset-global.service b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/systemd/system/preset-global.service new file mode 100644 index 000000000..53a76fbdf --- /dev/null +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/systemd/system/preset-global.service @@ -0,0 +1,17 @@ +[Unit] +ConditionFirstBoot=no +ConditionPathIsReadWrite=/etc + +DefaultDependencies=no + +Before=basic.target +Conflicts=shutdown.target +Before=shutdown.target + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=systemctl preset-all --global + +[Install] +WantedBy=basic.target diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer new file mode 100644 index 000000000..8c407c63d --- /dev/null +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer @@ -0,0 +1,16 @@ +[Transfer] +ProtectVersion=%A + +[Source] +Type=regular-file +Path=/ +PathRelativeTo=explicit +MatchPattern=%M_@v_%a.usr-%a-verity-sig.@u.raw + +[Target] +Type=partition +Path=auto +MatchPattern=%M_@v_verity_sig +MatchPartitionType=usr-verity-sig +PartitionFlags=0 +ReadOnly=1 \ No newline at end of file diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer new file mode 100644 index 000000000..b014c420f --- /dev/null +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer @@ -0,0 +1,16 @@ +[Transfer] +ProtectVersion=%A + +[Source] +Type=regular-file +Path=/ +PathRelativeTo=explicit +MatchPattern=%M_@v_%a.usr-%a-verity.@u.raw + +[Target] +Type=partition +Path=auto +MatchPattern=%M_@v_verity +MatchPartitionType=usr-verity +PartitionFlags=0 +ReadOnly=1 \ No newline at end of file diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer new file mode 100644 index 000000000..8140fb51b --- /dev/null +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer @@ -0,0 +1,16 @@ +[Transfer] +ProtectVersion=%A + +[Source] +Type=regular-file +Path=/ +PathRelativeTo=explicit +MatchPattern=%M_@v_%a.usr-%a.@u.raw + +[Target] +Type=partition +Path=auto +MatchPattern=%M_@v +MatchPartitionType=usr +PartitionFlags=0 +ReadOnly=1 \ No newline at end of file diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer new file mode 100644 index 000000000..f7bbbc29d --- /dev/null +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer @@ -0,0 +1,24 @@ +[Transfer] +ProtectVersion=%A + +[Source] +Type=regular-file +Path=/ +PathRelativeTo=explicit +MatchPattern=%M_@v_%a.efi + +[Target] +Type=regular-file +Path=/EFI/Linux +PathRelativeTo=boot +MatchPattern=%M_@v_%a+@l-@d.efi \ + %M_@v_%a+@l.efi \ + %M_@v_%a.efi \ + %M_@v+@l-@d.efi \ + %M_@v+@l.efi \ + %M_@v.efi +# MatchPartitionType=uki +Mode=0600 +TriesLeft=3 +TriesDone=0 +InstancesMax=2 \ No newline at end of file diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/tmpfiles.d/etc.conf b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/tmpfiles.d/etc.conf new file mode 100644 index 000000000..f1a8c9ccd --- /dev/null +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/tmpfiles.d/etc.conf @@ -0,0 +1,78 @@ +# This overrides the same file from systemd since we want to symlink everything +# into /etc instead of copying so updates to /usr propagate properly. +L /etc/os-release - - - - ../usr/lib/os-release +L+ /etc/mtab - - - - ../proc/self/mounts +# Contains the default systemd locale +L /etc/locale.conf +L /etc/nsswitch.conf +C /etc/profile +C /etc/profile.d +# Required by pam_env plugin +C /etc/security +L? /etc/bashrc +L? /etc/bash.bashrc +L? /etc/bash.bash_logout +# TODO: drop once https://github.com/scop/bash-completion/pull/1399 is merged, +# needed for shell completion of sd-run/run0 +L? /etc/bash_completion.d +# Canonical location to look for certificates +L? /etc/ca-certificates +L? /etc/crypto-policies +L? /etc/pki +L /etc/debuginfod +L /etc/ssh/ssh_config +L /etc/ssh/ssh_config.d +L /etc/ssh/sshd_config +L /etc/ssh/sshd_config.d +# Canonical location to look for certificates +L /etc/ssl +# niri-session requires /etc/shells +L /etc/shells +L /etc/sudoers +# Required by pam environment plugin +L /etc/environment +# Required to generate desktop environment application menus +C /etc/xdg +# Contains default font configuration +L /etc/fonts +# Configuration for man +L /etc/man_db.conf +# Configuration for ldconfig +L /etc/ld.so.conf +L /etc/ld.so.conf.d +# Required by authselect (Fedora/CentOS) +L? /etc/authselect +# Required by tuned +L? /etc/tuned +# Required by light +C /etc/lightdm +C /etc/dbus-1 +# Required by geoclue +L? /etc/geoclue +# Required by fwupd +L /etc/fwupd +# Required by gnome +C /etc/dconf +# Used by some services, like nftables +L? /etc/services +# Required by nftables service +L? /etc/nftables.conf +L? /etc/skel +# CUPS is pulled in by GNOME, and fails if the configs are not there +L? /etc/cups +# On some distributions various binaries in /usr/bin are managed via +# /etc/alternatives. +L? /etc/alternatives +# ModemManager needs its dbus policy file +L? /etc/dbus1/systemd.d/org.freedesktop.ModemManager1.conf +# man fails without this in /etc/ +L? /etc/manpath.config +# WPASupplicant also needs its configuration +L? /etc/wpa_supplicant/wpa_supplicant.conf +# Make sure flatpak's XDG_DATA_DIR integration works +L? /etc/profile.d/flatpak.sh + +C /etc/apparmor +C /etc/apparmor.d + +C /etc/sudoers.d diff --git a/mkosi.profiles/sysupdate/mkosi.finalize b/mkosi.profiles/sysupdate/mkosi.finalize new file mode 100755 index 000000000..e679c8d0f --- /dev/null +++ b/mkosi.profiles/sysupdate/mkosi.finalize @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Capture the entirety of /etc in /usr/share/factory/etc so we can use +# systemd-tmpfiles to symlink individual directories from it to /etc. +mkdir -p "$BUILDROOT/usr/share/factory/" +cp --archive --no-target-directory --update=none "$BUILDROOT/etc" "$BUILDROOT/usr/share/factory/etc" +ln -sr "$BUILDROOT/usr" "$BUILDROOT/usr/share/factory/usr" diff --git a/mkosi.profiles/sysupdate/mkosi.postinst.chroot b/mkosi.profiles/sysupdate/mkosi.postinst.chroot new file mode 100755 index 000000000..14b2b5e78 --- /dev/null +++ b/mkosi.profiles/sysupdate/mkosi.postinst.chroot @@ -0,0 +1,46 @@ +#!/usr/bin/env bash +set -euo pipefail + +if command -v authselect >/dev/null; then + authselect select local + authselect enable-feature with-systemd-homed +fi + +if [[ -d /etc/pam.d ]]; then + find /etc/pam.d -mindepth 1 -exec mv {} /usr/lib/pam.d \; + rmdir /etc/pam.d +fi + +# Get rid of obsolete stuff in the pam stack. +find /usr/lib/pam.d/ -mindepth 1 -exec sed --in-place '/pam_shells.so/d' {} \; +find /usr/lib/pam.d/ -mindepth 1 -exec sed --in-place '/pam_securetty.so/d' {} \; + +# Fedora disables the userdb ssh dropin by default, but helpfully leaves it available in +# the package so that we can just symlink it to a name that will be picked up by systemd-tmpfiles. +if [[ -f /usr/lib/tmpfiles.d/20-systemd-userdb.conf.example ]]; then + ln --symbolic 20-systemd-userdb.conf.example /usr/lib/tmpfiles.d/20-systemd-userdb.conf +fi + + +( + . /usr/lib/os-release + cat >/usr/lib/os-release </usr/lib/issue <DSt)+qiuqn4%3 zvUy>fW3KsLk-U`$y?)LGk~3XqgPv9%EC^`diN*6{Rq-krx2gPM_(~cL>(mkdqqfwDy2qKs^m|?Epna-`MwzZb`aRQ9cN=JXz7aGsOy0g!DP}vdsHIFd z?QpnE?v-FGjHjc`2~>y{nWeg_55H2G1>1-RxZhU|djsO{DW?Q(WDQ;v^{thdVd`la z!h)9gZQyxZd8aJxo7@B2mxim8U#YaD$R({p=4}^h2H2z({-ns*X1pi4M_#s?OXUWd zAHD$OqvDMYk?XC%TLDA|$%SjIW7n++Y1rrFxCkFal$xEJ+EO04(6%ux858t~HO5sP zX8T@WkQWs1M=9KbB*ds(qBDt@$Z2zzw;x|PbRQ(pW~;=2;O5NeiapRoWD0RREbBurs-ZewV0VPqgsP(dJOZ*m}IY-Md_ZggRCc_2?yAarG6 zZNkBh1QP)Y05}#Q1U5)F&ynD8kpeNo{(>2^psw@Om<0l6G+Vs_8v_Lk2?z%Q1{Dek z2nzxP76JnS0v-VZ7k~f?2@rxAv!Jf?)Riy!i?$=#65VEw}=_^BMw4UexDDomSPBFe;2ea2U>hCs#uVJyjZ@qPnzGKsMAy0+{2@Nq!fY(2@l6SnA2m@+XhE|3bL}AZN%K9*|x) zjQsa7n81SXK2C@jv|#bHO0!UL(C-PC-=>;aF^Sz>kT{0tHta&%tkNL zr22uP>Fv{S-)wLZ?t^Jv3<$mj8SoPdG@ayCV$4hWp>C5EFEjEJcRJcbBzb;f=oG+z z7u{s$V5uuUq(b20;9j^lMmt!qm9U_lIohe>jB@4uZ)-QGc+;TRu5Z$8j+6hZp(%V7 zWEYq1bYj`_t^{K0cy<555NPpjiQb+k+Bj6prN4@uz;|TO8<4Lw`?2d`w|dp>on>XM z=-mjdNo5!Ds3h>bwzUnRAnj(4FjV9_IB~lMW9E+wBk0HcBdi3Da*F)Ab(i54wsVLe zys2z_BFUmG1-405B)<)+kV1xX%Ac;8z9vwyunp4y?C-ntlC5)fcKX<(fh3yjeYH^M zD33@3QSOL+`Hizcx<9A6E)n3yrq?`Jt@`uwTVHDR@17vBi>RjdZXl)tl5z~A3Pkw8 ZbibVK&BE9sUW#gTd7G+14UyC@yE=RVFuwo* literal 0 HcmV?d00001 diff --git a/mkosi.sandbox/etc/apt/keyrings/elementary-os-os-patches.gpg b/mkosi.sandbox/etc/apt/keyrings/elementary-os-os-patches.gpg new file mode 100644 index 0000000000000000000000000000000000000000..9e7e760340b79c6754ef9581687ce78b08d6ba3c GIT binary patch literal 1159 zcmV;21bF+I0u2OaG+Vs^5CEe+6-v~tGR{BKJdOZ3N8?aayTgS?3>DSt)+qiuqn4%3 zvUy>fW3KsLk-U`$y?)LGk~3XqgPv9%EC^`diN*6{Rq-krx2gPM_(~cL>(mkdqqfwDy2qKs^m|?Epna-`MwzZb`aRQ9cN=JXz7aGsOy0g!DP}vdsHIFd z?QpnE?v-FGjHjc`2~>y{nWeg_55H2G1>1-RxZhU|djsO{DW?Q(WDQ;v^{thdVd`la z!h)9gZQyxZd8aJxo7@B2mxim8U#YaD$R({p=4}^h2H2z({-ns*X1pi4M_#s?OXUWd zAHD$OqvDMYk?XC%TLDA|$%SjIW7n++Y1rrFxCkFal$xEJ+EO04(6%ux858t~HO5sP zX8T@WkQWs1M=9KbB*ds(qBDt@$Z2zzw;x|PbRQ(pW~;=2;O5NeiapRoWD0RRECBurs-ZewV0VPqgsP(dJOZ*m}IY-Md_ZggRCc_2?yAarG6 zZHWR-1QP)Y05}#Q1U5)F&ynD8kpeNo{(>2^psw@Om<0l6G+Vs_8v_Lk2?z%Q1{Dek z2nzxP76JnS0v-VZ7k~f?2@rxAv!Jf?)Riy!i?$=#65VEw}=_^BMw4UexDDomSPBFe;2ea2U>hCs#uVJyjZ@qPnzGKsMAy0+{2@Nq!fY(2@l6SnA2m@+XhE|3bL}AZN%K9*|x) zjQsa7n81SXK2C@jv|#bHO0!UL(C-PC-=>;aF^Sz>kT{0tHta&%tkNL zr22uP>Fv{S-)wLZ?t^Jv3<$mj8SoPdG@ayCV$4hWp>C5EFEjEJcRJcbBzb;f=oG+z z7u{s$V5uuUq(b20;9j^lMmt!qm9U_lIohe>jB@4uZ)-QGc+;TRu5Z$8j+6hZp(%V7 zWEYq1bYj`_t^{K0cy<555NPpjiQb+k+Bj6prN4@uz;|TO8<4Lw`?2d`w|dp>on>XM z=-mjdNo5!Ds3h>bwzUnRAnj(4FjV9_IB~lMW9E+wBk0HcBdi3Da*F)Ab(i54wsVLe zys2z_BFUmG1-405B)<)+kV1xX%Ac;8z9vwyunp4y?C-ntlC5)fcKX<(fh3yjeYH^M zD33@3QSOL+`Hizcx<9A6E)n3yrq?`Jt@`uwTVHDR@17vBi>RjdZXl)tl5z~A3Pkw8 ZbibVK&BE9sUW#gTd7G+14UyC@yE-3zE Date: Wed, 22 Jul 2026 12:18:04 -0700 Subject: [PATCH 02/86] Add post-boot configuration for NetworkManager --- mkosi.profiles/sysupdate/mkosi.extra/usr/lib/tmpfiles.d/etc.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/tmpfiles.d/etc.conf b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/tmpfiles.d/etc.conf index f1a8c9ccd..d26cb712c 100644 --- a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/tmpfiles.d/etc.conf +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/tmpfiles.d/etc.conf @@ -72,6 +72,7 @@ L? /etc/wpa_supplicant/wpa_supplicant.conf # Make sure flatpak's XDG_DATA_DIR integration works L? /etc/profile.d/flatpak.sh +C /etc/NetworkManager C /etc/apparmor C /etc/apparmor.d From bdee221ef16bc8d039e1d2a8c1fc1409244285b0 Mon Sep 17 00:00:00 2001 From: JumpyVi Date: Wed, 22 Jul 2026 19:05:07 -0400 Subject: [PATCH 03/86] Mask firstboot --- .../usr/lib/systemd/system-preset/10-elementary.preset | 2 +- .../usr/lib/systemd/system/systemd-firstboot.service | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 mkosi.profiles/sysupdate/mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset index d04aa7310..b050c120c 100644 --- a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset @@ -6,7 +6,7 @@ disable systemd-networkd enable systemd-timesyncd.service disable systemd-homed-firstboot.service disable systemd-firstboot.service -mask systemd-firstboot.service + enable systemd-homed.service disable avahi.* diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service new file mode 100644 index 000000000..4bb28c3fd --- /dev/null +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service @@ -0,0 +1 @@ +# Masked \ No newline at end of file From cbde144500770a65481f19e0899bfd35943c1371 Mon Sep 17 00:00:00 2001 From: JumpyVi Date: Wed, 22 Jul 2026 19:41:42 -0400 Subject: [PATCH 04/86] feat: Switch to systemd-boot and remove UKI profiles, fix #6 --- mkosi.profiles/sysupdate/mkosi.conf | 3 ++- .../sysupdate/mkosi.uki-profiles/.gitkeep | 3 +++ .../sysupdate/mkosi.uki-profiles/10-live.conf | 23 ------------------- .../sysupdate/mkosi.uki-profiles/20-ipe.conf | 16 ------------- .../mkosi.uki-profiles/80-storagetm.conf | 15 ------------ .../mkosi.uki-profiles/90-factory-reset.conf | 16 ------------- .../91-factory-reset-with-tpm-clear.conf | 14 ----------- .../mkosi.uki-profiles/95-emergency.conf | 16 ------------- .../mkosi.uki-profiles/99-debug.conf | 18 --------------- 9 files changed, 5 insertions(+), 119 deletions(-) create mode 100644 mkosi.profiles/sysupdate/mkosi.uki-profiles/.gitkeep delete mode 100644 mkosi.profiles/sysupdate/mkosi.uki-profiles/10-live.conf delete mode 100644 mkosi.profiles/sysupdate/mkosi.uki-profiles/20-ipe.conf delete mode 100644 mkosi.profiles/sysupdate/mkosi.uki-profiles/80-storagetm.conf delete mode 100644 mkosi.profiles/sysupdate/mkosi.uki-profiles/90-factory-reset.conf delete mode 100644 mkosi.profiles/sysupdate/mkosi.uki-profiles/91-factory-reset-with-tpm-clear.conf delete mode 100644 mkosi.profiles/sysupdate/mkosi.uki-profiles/95-emergency.conf delete mode 100644 mkosi.profiles/sysupdate/mkosi.uki-profiles/99-debug.conf diff --git a/mkosi.profiles/sysupdate/mkosi.conf b/mkosi.profiles/sysupdate/mkosi.conf index 15d3901e6..d0e9bf183 100644 --- a/mkosi.profiles/sysupdate/mkosi.conf +++ b/mkosi.profiles/sysupdate/mkosi.conf @@ -10,7 +10,7 @@ Format=disk [Content] Bootable=yes -Bootloader=uki +Bootloader=systemd-boot UnifiedKernelImageFormat=%i_%v_%a InitrdProfiles= KernelInitrdModules= @@ -24,6 +24,7 @@ KernelInitrdModules= dm-verity KernelCommandLine= splash + quiet root=dissect mount.usr=dissect rw diff --git a/mkosi.profiles/sysupdate/mkosi.uki-profiles/.gitkeep b/mkosi.profiles/sysupdate/mkosi.uki-profiles/.gitkeep new file mode 100644 index 000000000..bf3d90237 --- /dev/null +++ b/mkosi.profiles/sysupdate/mkosi.uki-profiles/.gitkeep @@ -0,0 +1,3 @@ +# Add more profiles later + +# https://github.com/systemd/particleos/tree/main/mkosi.uki-profiles \ No newline at end of file diff --git a/mkosi.profiles/sysupdate/mkosi.uki-profiles/10-live.conf b/mkosi.profiles/sysupdate/mkosi.uki-profiles/10-live.conf deleted file mode 100644 index 7937e1914..000000000 --- a/mkosi.profiles/sysupdate/mkosi.uki-profiles/10-live.conf +++ /dev/null @@ -1,23 +0,0 @@ -[UKIProfile] -Profile= - ID=live - TITLE=Live System (Installer) - -Cmdline= - root=tmpfs - mount.usr=dissect - rd.systemd.mask=systemd-repart.service - systemd.mask=systemd-repart.service - systemd.firstboot=no - systemd.set-credential=agetty.autologin:root - systemd.set-credential=login.noauth:yes - SYSTEMD_SULOGIN_FORCE=1 - systemd.journald.forward_to_console=1 - systemd.journald.max_level_console=warning - rw - audit=0 - systemd.image_policy=esp=unprotected:xbootldr=unprotected+unused+absent:usr=signed:=ignore - systemd.image_filter=usr=Elementary_*:usr-verity=Elementary_*:usr-verity-sig=Elementary_*:root=Elementary-*:swap=Elementary-*:home=Elementary-* - ipe.enforce=0 - -SignExpectedPcr=no diff --git a/mkosi.profiles/sysupdate/mkosi.uki-profiles/20-ipe.conf b/mkosi.profiles/sysupdate/mkosi.uki-profiles/20-ipe.conf deleted file mode 100644 index ae876684a..000000000 --- a/mkosi.profiles/sysupdate/mkosi.uki-profiles/20-ipe.conf +++ /dev/null @@ -1,16 +0,0 @@ -[UKIProfile] -Profile= - ID=ipe - TITLE=Boot with IPE LSM enforcement - -Cmdline= - root=dissect - mount.usr=dissect - systemd.verity_usr_options=root-hash-signature=auto - rw - audit=0 - systemd.image_policy=esp=unprotected:xbootldr=unprotected+unused+absent:usr=signed:root=encrypted+absent:swap=encrypted+unused+absent:home=unprotected+absent:=ignore - systemd.image_filter=usr=Elementary_*:usr-verity=Elementary_*:usr-verity-sig=Elementary_*:root=Elementary-*:swap=Elementary-*:home=Elementary-* - ipe.enforce=1 - -SignExpectedPcr=yes diff --git a/mkosi.profiles/sysupdate/mkosi.uki-profiles/80-storagetm.conf b/mkosi.profiles/sysupdate/mkosi.uki-profiles/80-storagetm.conf deleted file mode 100644 index 03fe916ed..000000000 --- a/mkosi.profiles/sysupdate/mkosi.uki-profiles/80-storagetm.conf +++ /dev/null @@ -1,15 +0,0 @@ -[UKIProfile] -Profile= - ID=storagetm - TITLE=Storage Target Mode with Public Access - -Cmdline= - rd.systemd.unit=storage-target-mode.target - ip=any - ro - audit=0 - systemd.image_policy=- - root=off - ipe.enforce=0 - -SignExpectedPcr=no diff --git a/mkosi.profiles/sysupdate/mkosi.uki-profiles/90-factory-reset.conf b/mkosi.profiles/sysupdate/mkosi.uki-profiles/90-factory-reset.conf deleted file mode 100644 index cc5c46cda..000000000 --- a/mkosi.profiles/sysupdate/mkosi.uki-profiles/90-factory-reset.conf +++ /dev/null @@ -1,16 +0,0 @@ -[UKIProfile] -Profile= - ID=factory-reset - TITLE=Reset System to Factory Defaults [CAUTION!] - -Cmdline= - root=dissect - mount.usr=dissect - systemd.factory_reset=1 - rw - audit=0 - systemd.image_policy=esp=unprotected:xbootldr=unprotected+unused+absent:usr=signed:root=encrypted+absent:swap=encrypted+unused+absent:home=unprotected+absent:=ignore - systemd.image_filter=usr=Elementary_*:usr-verity=Elementary_*:usr-verity-sig=Elementary_*:root=Elementary-*:swap=Elementary-*:home=Elementary-* - ipe.enforce=0 - -SignExpectedPcr=yes diff --git a/mkosi.profiles/sysupdate/mkosi.uki-profiles/91-factory-reset-with-tpm-clear.conf b/mkosi.profiles/sysupdate/mkosi.uki-profiles/91-factory-reset-with-tpm-clear.conf deleted file mode 100644 index c9a363f3e..000000000 --- a/mkosi.profiles/sysupdate/mkosi.uki-profiles/91-factory-reset-with-tpm-clear.conf +++ /dev/null @@ -1,14 +0,0 @@ -[UKIProfile] -Profile= - ID=factory-reset-tpm2-clear - TITLE=Reset System to Factory Defaults + TPM2 Clear [CAUTION!] - -Cmdline= - rd.systemd.unit=factory-reset.target - ro - audit=0 - systemd.image_policy=- - root=off - ipe.enforce=0 - -SignExpectedPcr=no diff --git a/mkosi.profiles/sysupdate/mkosi.uki-profiles/95-emergency.conf b/mkosi.profiles/sysupdate/mkosi.uki-profiles/95-emergency.conf deleted file mode 100644 index f4ed472b2..000000000 --- a/mkosi.profiles/sysupdate/mkosi.uki-profiles/95-emergency.conf +++ /dev/null @@ -1,16 +0,0 @@ -[UKIProfile] -Profile= - ID=emergency - TITLE=Boot into Emergency Mode - -Cmdline= - root=dissect - mount.usr=dissect - systemd.unit=emergency.target - rw - audit=0 - systemd.image_policy=esp=unprotected:xbootldr=unprotected+unused+absent:usr=signed:root=encrypted+absent:swap=encrypted+unused+absent:home=unprotected+absent:=ignore - systemd.image_filter=usr=Elementary_*:usr-verity=Elementary_*:usr-verity-sig=Elementary_*:root=Elementary-*:swap=Elementary-*:home=Elementary-* - ipe.enforce=0 - -SignExpectedPcr=yes diff --git a/mkosi.profiles/sysupdate/mkosi.uki-profiles/99-debug.conf b/mkosi.profiles/sysupdate/mkosi.uki-profiles/99-debug.conf deleted file mode 100644 index 4e2a0a268..000000000 --- a/mkosi.profiles/sysupdate/mkosi.uki-profiles/99-debug.conf +++ /dev/null @@ -1,18 +0,0 @@ -[UKIProfile] -Profile= - ID=debug - TITLE=Boot with debug logs enabled - -Cmdline= - root=dissect - mount.usr=dissect - debug - systemd.log_level=debug - systemd.journald.forward_to_console=1 - rw - audit=0 - systemd.image_policy=esp=unprotected:xbootldr=unprotected+unused+absent:usr=signed:root=encrypted+absent:swap=encrypted+unused+absent:home=unprotected+absent:=ignore - systemd.image_filter=usr=Elementary_*:usr-verity=Elementary_*:usr-verity-sig=Elementary_*:root=Elementary-*:swap=Elementary-*:home=Elementary-* - ipe.enforce=0 - -SignExpectedPcr=yes From 5c91da44cb0433bc00f43f1cb61a59eedf3a345d Mon Sep 17 00:00:00 2001 From: JumpyVi Date: Wed, 22 Jul 2026 21:03:46 -0400 Subject: [PATCH 05/86] feat: Add swap (zram) --- .../elementary/mkosi.conf.d/elementary.conf | 3 ++- mkosi.profiles/sysupdate/mkosi.conf | 18 ------------------ .../mkosi.extra/boot/loader/loader.conf | 2 +- .../usr/lib/systemd/zram-generator.conf | 3 +++ 4 files changed, 6 insertions(+), 20 deletions(-) create mode 100644 mkosi.profiles/sysupdate/mkosi.extra/usr/lib/systemd/zram-generator.conf diff --git a/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf b/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf index 28fa89532..c51a5e66c 100644 --- a/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf +++ b/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf @@ -54,4 +54,5 @@ Packages= yq jq xdg-desktop-portal-gtk - xdg-user-dirs \ No newline at end of file + xdg-user-dirs + systemd-zram-generator \ No newline at end of file diff --git a/mkosi.profiles/sysupdate/mkosi.conf b/mkosi.profiles/sysupdate/mkosi.conf index d0e9bf183..c331e3fc6 100644 --- a/mkosi.profiles/sysupdate/mkosi.conf +++ b/mkosi.profiles/sysupdate/mkosi.conf @@ -1,6 +1,3 @@ -# THIS PROFILE SHOULD NOT BE USED BY DEFAULT -# This is an implementation of sysupdate-based Ubuntu, everything that would be necessary to implement the same idea as systemd's particleOS. - [Match] Profiles=sysupdate @@ -39,18 +36,3 @@ KernelCommandLine= # just for now, please do enable secureboot SecureBoot=no SignExpectedPcr=no - -# mkosi vm specific -[Runtime] -RuntimeSize=40G -RAM=4G -CPUs=4 -Ephemeral=yes -Credentials= - passwd.plaintext-password.root=particleos - tty.serial.hvc0.agetty.autologin=particleos - tty.serial.hvc0.login.noauth=yes - tty.console.agetty.autologin=particleos - tty.console.login.noauth=yes - tty.virtual.tty1.agetty.autologin=particleos - tty.virtual.tty1.login.noauth=yes diff --git a/mkosi.profiles/sysupdate/mkosi.extra/boot/loader/loader.conf b/mkosi.profiles/sysupdate/mkosi.extra/boot/loader/loader.conf index 689fa6c49..e67411086 100644 --- a/mkosi.profiles/sysupdate/mkosi.extra/boot/loader/loader.conf +++ b/mkosi.profiles/sysupdate/mkosi.extra/boot/loader/loader.conf @@ -1 +1 @@ -timeout 20 +timeout 6 diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/systemd/zram-generator.conf b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/systemd/zram-generator.conf new file mode 100644 index 000000000..52ea5d619 --- /dev/null +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/systemd/zram-generator.conf @@ -0,0 +1,3 @@ +[zram0] +zram-size = min(ram / 2, 16384) +compression-algorithm = zstd \ No newline at end of file From e3bb0b8feaafd8e2f7d32a41f3b63da49e51c13d Mon Sep 17 00:00:00 2001 From: JumpyVi Date: Thu, 23 Jul 2026 13:09:24 -0400 Subject: [PATCH 06/86] Add tools for testing updates locally --- Justfile | 29 ++++++++++++++++++- mkosi.conf | 4 +-- .../sysupdate.d/10-usr-verity-sig.transfer | 5 ++-- .../lib/sysupdate.d/11-usr-verity.transfer | 5 ++-- .../usr/lib/sysupdate.d/12-usr.transfer | 5 ++-- .../usr/lib/sysupdate.d/20-uki.transfer | 5 ++-- .../10-usr-verity-sig.transfer | 5 ++-- .../mkosi.sysupdate/11-usr-verity.transfer | 5 ++-- .../sysupdate/mkosi.sysupdate/12-usr.transfer | 5 ++-- .../sysupdate/mkosi.sysupdate/20-uki.transfer | 5 ++-- 10 files changed, 46 insertions(+), 27 deletions(-) diff --git a/Justfile b/Justfile index a4155f202..85cbb4959 100644 --- a/Justfile +++ b/Justfile @@ -1,3 +1,5 @@ +alias serve := start-sysupdate-server + default: #!/usr/bin/env bash set -xeuo pipefail @@ -8,7 +10,8 @@ lazy-spin: just build-sysupdate && just resize build-sysupdate: - mkosi -B --debug --force --profile=sysupdate + mkosi -B --debug --force --profile=sysupdate && \ + just sign-repo resize: qemu-img resize ./mkosi.output/Elementary_x86-64.raw +40G @@ -20,3 +23,27 @@ _gen_keys: clean: mkosi clean sudo rm -r mkosi.tools/ mkosi.cache/ + +start-sysupdate-server: + python -m http.server -d mkosi.output 7676 + +sign-repo: + #!/usr/bin/env bash + set -euo pipefail + export GNUPGHOME="$(mktemp -d)" + trap 'rm -rf "$GNUPGHOME"' EXIT + + gpg --batch --generate-key < SHA256SUMS + gpg --batch --yes --local-user sysupdate-dev --detach-sign --armor -o SHA256SUMS.gpg SHA256SUMS + gpg --export sysupdate-dev > sysupdate-dev.pgp \ No newline at end of file diff --git a/mkosi.conf b/mkosi.conf index 0e6c54940..df354fa58 100644 --- a/mkosi.conf +++ b/mkosi.conf @@ -23,5 +23,5 @@ SignExpectedPcr=no ImageId=Elementary OutputDirectory=mkosi.output ManifestFormat=json -Output=%i_%a # Unversioned tag for quick testing -# Output=%i_%v_%a # Versioned tag for releases \ No newline at end of file +# Output=%i_%a # Unversioned tag for quick testing +Output=%i_%v_%a # Versioned tag for releases \ No newline at end of file diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer index 8c407c63d..f0a846443 100644 --- a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer @@ -2,9 +2,8 @@ ProtectVersion=%A [Source] -Type=regular-file -Path=/ -PathRelativeTo=explicit +Type=url-file +Path=http://10.0.2.2:7676/ MatchPattern=%M_@v_%a.usr-%a-verity-sig.@u.raw [Target] diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer index b014c420f..c5907af95 100644 --- a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer @@ -2,9 +2,8 @@ ProtectVersion=%A [Source] -Type=regular-file -Path=/ -PathRelativeTo=explicit +Type=url-file +Path=http://10.0.2.2:7676/ MatchPattern=%M_@v_%a.usr-%a-verity.@u.raw [Target] diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer index 8140fb51b..9a487eed5 100644 --- a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer @@ -2,9 +2,8 @@ ProtectVersion=%A [Source] -Type=regular-file -Path=/ -PathRelativeTo=explicit +Type=url-file +Path=http://10.0.2.2:7676/ MatchPattern=%M_@v_%a.usr-%a.@u.raw [Target] diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer index f7bbbc29d..0c2e3ce9b 100644 --- a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer @@ -2,9 +2,8 @@ ProtectVersion=%A [Source] -Type=regular-file -Path=/ -PathRelativeTo=explicit +Type=url-file +Path=http://10.0.2.2:7676/ MatchPattern=%M_@v_%a.efi [Target] diff --git a/mkosi.profiles/sysupdate/mkosi.sysupdate/10-usr-verity-sig.transfer b/mkosi.profiles/sysupdate/mkosi.sysupdate/10-usr-verity-sig.transfer index 546409cc2..3603473e8 100644 --- a/mkosi.profiles/sysupdate/mkosi.sysupdate/10-usr-verity-sig.transfer +++ b/mkosi.profiles/sysupdate/mkosi.sysupdate/10-usr-verity-sig.transfer @@ -2,9 +2,8 @@ ProtectVersion=%A [Source] -Type=regular-file -Path=/ -PathRelativeTo=explicit +Type=url-file +Path=http://10.0.2.2:7676/ MatchPattern=%M_@v_%a.usr-%a-verity-sig.@u.raw [Target] diff --git a/mkosi.profiles/sysupdate/mkosi.sysupdate/11-usr-verity.transfer b/mkosi.profiles/sysupdate/mkosi.sysupdate/11-usr-verity.transfer index 75bd8e14c..cb63281f6 100644 --- a/mkosi.profiles/sysupdate/mkosi.sysupdate/11-usr-verity.transfer +++ b/mkosi.profiles/sysupdate/mkosi.sysupdate/11-usr-verity.transfer @@ -2,9 +2,8 @@ ProtectVersion=%A [Source] -Type=regular-file -Path=/ -PathRelativeTo=explicit +Type=url-file +Path=http://10.0.2.2:7676/ MatchPattern=%M_@v_%a.usr-%a-verity.@u.raw [Target] diff --git a/mkosi.profiles/sysupdate/mkosi.sysupdate/12-usr.transfer b/mkosi.profiles/sysupdate/mkosi.sysupdate/12-usr.transfer index 3796b7c0e..8e99e03df 100644 --- a/mkosi.profiles/sysupdate/mkosi.sysupdate/12-usr.transfer +++ b/mkosi.profiles/sysupdate/mkosi.sysupdate/12-usr.transfer @@ -2,9 +2,8 @@ ProtectVersion=%A [Source] -Type=regular-file -Path=/ -PathRelativeTo=explicit +Type=url-file +Path=http://10.0.2.2:7676/ MatchPattern=%M_@v_%a.usr-%a.@u.raw [Target] diff --git a/mkosi.profiles/sysupdate/mkosi.sysupdate/20-uki.transfer b/mkosi.profiles/sysupdate/mkosi.sysupdate/20-uki.transfer index 9f3ce6d7f..9aa4903d4 100644 --- a/mkosi.profiles/sysupdate/mkosi.sysupdate/20-uki.transfer +++ b/mkosi.profiles/sysupdate/mkosi.sysupdate/20-uki.transfer @@ -2,9 +2,8 @@ ProtectVersion=%A [Source] -Type=regular-file -Path=/ -PathRelativeTo=explicit +Type=url-file +Path=http://10.0.2.2:7676/ MatchPattern=%M_@v_%a.efi [Target] From e423488634c88a7c7f0f2f86462aa36a2dfeeab6 Mon Sep 17 00:00:00 2001 From: JumpyVi Date: Fri, 24 Jul 2026 14:17:17 -0400 Subject: [PATCH 07/86] feat: Full upgrade support --- .gitignore | 1 + Justfile | 33 ++++++++----------- mkosi.conf | 1 - .../sysupdate.d/10-usr-verity-sig.transfer | 4 +-- .../lib/sysupdate.d/11-usr-verity.transfer | 4 +-- .../usr/lib/sysupdate.d/12-usr.transfer | 4 +-- .../usr/lib/sysupdate.d/20-uki.transfer | 14 ++++---- .../usr/lib/tmpfiles.d/aliases.conf | 3 ++ .../sysupdate/mkosi.repart/00-esp.conf | 4 +-- .../10-usr-verity-sig.transfer | 6 ++-- .../mkosi.sysupdate/11-usr-verity.transfer | 6 ++-- .../sysupdate/mkosi.sysupdate/12-usr.transfer | 6 ++-- .../sysupdate/mkosi.sysupdate/20-uki.transfer | 17 +++++----- 13 files changed, 50 insertions(+), 53 deletions(-) create mode 100644 mkosi.profiles/sysupdate/mkosi.extra/usr/lib/tmpfiles.d/aliases.conf diff --git a/.gitignore b/.gitignore index f0ba790c7..3ecf0a0b2 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ _build_* output _build-*/** *.img +*.raw mkosi.local/ mkosi.local.conf mkosi.output/ diff --git a/Justfile b/Justfile index 85cbb4959..bc6dc7bdd 100644 --- a/Justfile +++ b/Justfile @@ -7,14 +7,14 @@ default: lazy-spin: just _gen_keys - just build-sysupdate && just resize + just build-sysupdate build-sysupdate: mkosi -B --debug --force --profile=sysupdate && \ just sign-repo -resize: - qemu-img resize ./mkosi.output/Elementary_x86-64.raw +40G +# resize: +# qemu-img resize ./mkosi.output/Elementary_x86-64.raw +40G _gen_keys: mkosi genkey || true @@ -25,25 +25,18 @@ clean: sudo rm -r mkosi.tools/ mkosi.cache/ start-sysupdate-server: + #!/usr/bin/env bash + just sign-repo && \ python -m http.server -d mkosi.output 7676 sign-repo: #!/usr/bin/env bash - set -euo pipefail - export GNUPGHOME="$(mktemp -d)" - trap 'rm -rf "$GNUPGHOME"' EXIT - - gpg --batch --generate-key < SHA256SUMS - gpg --batch --yes --local-user sysupdate-dev --detach-sign --armor -o SHA256SUMS.gpg SHA256SUMS - gpg --export sysupdate-dev > sysupdate-dev.pgp \ No newline at end of file + echo "Repo will not be signed, use verify=no." + echo "Generating SHA256..." + sha256sum Elementary_*_x86-64.usr-x86-64-verity-sig.*.raw \ + Elementary_*_x86-64.usr-x86-64-verity.*.raw \ + Elementary_*_x86-64.usr-x86-64.*.raw \ + Elementary_*_x86-64.efi \ + > SHA256SUMS + cd .. \ No newline at end of file diff --git a/mkosi.conf b/mkosi.conf index df354fa58..af63a2546 100644 --- a/mkosi.conf +++ b/mkosi.conf @@ -23,5 +23,4 @@ SignExpectedPcr=no ImageId=Elementary OutputDirectory=mkosi.output ManifestFormat=json -# Output=%i_%a # Unversioned tag for quick testing Output=%i_%v_%a # Versioned tag for releases \ No newline at end of file diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer index f0a846443..02a9f701c 100644 --- a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer @@ -4,12 +4,12 @@ ProtectVersion=%A [Source] Type=url-file Path=http://10.0.2.2:7676/ -MatchPattern=%M_@v_%a.usr-%a-verity-sig.@u.raw +MatchPattern=Elementary_@v_%a.usr-%a-verity-sig.@u.raw [Target] Type=partition Path=auto -MatchPattern=%M_@v_verity_sig +MatchPattern=Elementary_@v_verity_sig MatchPartitionType=usr-verity-sig PartitionFlags=0 ReadOnly=1 \ No newline at end of file diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer index c5907af95..c58ffde6f 100644 --- a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer @@ -4,12 +4,12 @@ ProtectVersion=%A [Source] Type=url-file Path=http://10.0.2.2:7676/ -MatchPattern=%M_@v_%a.usr-%a-verity.@u.raw +MatchPattern=Elementary_@v_%a.usr-%a-verity.@u.raw [Target] Type=partition Path=auto -MatchPattern=%M_@v_verity +MatchPattern=Elementary_@v_verity MatchPartitionType=usr-verity PartitionFlags=0 ReadOnly=1 \ No newline at end of file diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer index 9a487eed5..22b81820a 100644 --- a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer @@ -4,12 +4,12 @@ ProtectVersion=%A [Source] Type=url-file Path=http://10.0.2.2:7676/ -MatchPattern=%M_@v_%a.usr-%a.@u.raw +MatchPattern=Elementary_@v_%a.usr-%a.@u.raw [Target] Type=partition Path=auto -MatchPattern=%M_@v +MatchPattern=Elementary_@v MatchPartitionType=usr PartitionFlags=0 ReadOnly=1 \ No newline at end of file diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer index 0c2e3ce9b..9270dbd22 100644 --- a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer @@ -4,18 +4,18 @@ ProtectVersion=%A [Source] Type=url-file Path=http://10.0.2.2:7676/ -MatchPattern=%M_@v_%a.efi +MatchPattern=Elementary_@v_%a.efi [Target] Type=regular-file Path=/EFI/Linux PathRelativeTo=boot -MatchPattern=%M_@v_%a+@l-@d.efi \ - %M_@v_%a+@l.efi \ - %M_@v_%a.efi \ - %M_@v+@l-@d.efi \ - %M_@v+@l.efi \ - %M_@v.efi +MatchPattern=Elementary_@v_%a+@l-@d.efi \ + Elementary_@v_%a+@l.efi \ + Elementary_@v_%a.efi \ + Elementary_@v+@l-@d.efi \ + Elementary_@v+@l.efi \ + Elementary_@v.efi # MatchPartitionType=uki Mode=0600 TriesLeft=3 diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/tmpfiles.d/aliases.conf b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/tmpfiles.d/aliases.conf new file mode 100644 index 000000000..ad5c58b98 --- /dev/null +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/tmpfiles.d/aliases.conf @@ -0,0 +1,3 @@ +# Type Path Mode UID GID Age Target +L+ /usr/sbin/systemd-sysupdate - - - - /usr/lib/systemd/systemd-sysupdate +L+ /usr/sbin/sysupdate - - - - /usr/lib/systemd/systemd-sysupdate \ No newline at end of file diff --git a/mkosi.profiles/sysupdate/mkosi.repart/00-esp.conf b/mkosi.profiles/sysupdate/mkosi.repart/00-esp.conf index bd852a220..e87e8dae2 100644 --- a/mkosi.profiles/sysupdate/mkosi.repart/00-esp.conf +++ b/mkosi.profiles/sysupdate/mkosi.repart/00-esp.conf @@ -3,5 +3,5 @@ Type=esp Format=vfat CopyFiles=/efi:/ CopyFiles=/boot:/ -SizeMinBytes=1G -SizeMaxBytes=1G +SizeMinBytes=2G +SizeMaxBytes=2G diff --git a/mkosi.profiles/sysupdate/mkosi.sysupdate/10-usr-verity-sig.transfer b/mkosi.profiles/sysupdate/mkosi.sysupdate/10-usr-verity-sig.transfer index 3603473e8..02a9f701c 100644 --- a/mkosi.profiles/sysupdate/mkosi.sysupdate/10-usr-verity-sig.transfer +++ b/mkosi.profiles/sysupdate/mkosi.sysupdate/10-usr-verity-sig.transfer @@ -4,12 +4,12 @@ ProtectVersion=%A [Source] Type=url-file Path=http://10.0.2.2:7676/ -MatchPattern=%M_@v_%a.usr-%a-verity-sig.@u.raw +MatchPattern=Elementary_@v_%a.usr-%a-verity-sig.@u.raw [Target] Type=partition Path=auto -MatchPattern=%M_@v_verity_sig +MatchPattern=Elementary_@v_verity_sig MatchPartitionType=usr-verity-sig PartitionFlags=0 -ReadOnly=1 +ReadOnly=1 \ No newline at end of file diff --git a/mkosi.profiles/sysupdate/mkosi.sysupdate/11-usr-verity.transfer b/mkosi.profiles/sysupdate/mkosi.sysupdate/11-usr-verity.transfer index cb63281f6..c58ffde6f 100644 --- a/mkosi.profiles/sysupdate/mkosi.sysupdate/11-usr-verity.transfer +++ b/mkosi.profiles/sysupdate/mkosi.sysupdate/11-usr-verity.transfer @@ -4,12 +4,12 @@ ProtectVersion=%A [Source] Type=url-file Path=http://10.0.2.2:7676/ -MatchPattern=%M_@v_%a.usr-%a-verity.@u.raw +MatchPattern=Elementary_@v_%a.usr-%a-verity.@u.raw [Target] Type=partition Path=auto -MatchPattern=%M_@v_verity +MatchPattern=Elementary_@v_verity MatchPartitionType=usr-verity PartitionFlags=0 -ReadOnly=1 +ReadOnly=1 \ No newline at end of file diff --git a/mkosi.profiles/sysupdate/mkosi.sysupdate/12-usr.transfer b/mkosi.profiles/sysupdate/mkosi.sysupdate/12-usr.transfer index 8e99e03df..22b81820a 100644 --- a/mkosi.profiles/sysupdate/mkosi.sysupdate/12-usr.transfer +++ b/mkosi.profiles/sysupdate/mkosi.sysupdate/12-usr.transfer @@ -4,12 +4,12 @@ ProtectVersion=%A [Source] Type=url-file Path=http://10.0.2.2:7676/ -MatchPattern=%M_@v_%a.usr-%a.@u.raw +MatchPattern=Elementary_@v_%a.usr-%a.@u.raw [Target] Type=partition Path=auto -MatchPattern=%M_@v +MatchPattern=Elementary_@v MatchPartitionType=usr PartitionFlags=0 -ReadOnly=1 +ReadOnly=1 \ No newline at end of file diff --git a/mkosi.profiles/sysupdate/mkosi.sysupdate/20-uki.transfer b/mkosi.profiles/sysupdate/mkosi.sysupdate/20-uki.transfer index 9aa4903d4..9270dbd22 100644 --- a/mkosi.profiles/sysupdate/mkosi.sysupdate/20-uki.transfer +++ b/mkosi.profiles/sysupdate/mkosi.sysupdate/20-uki.transfer @@ -4,19 +4,20 @@ ProtectVersion=%A [Source] Type=url-file Path=http://10.0.2.2:7676/ -MatchPattern=%M_@v_%a.efi +MatchPattern=Elementary_@v_%a.efi [Target] Type=regular-file Path=/EFI/Linux PathRelativeTo=boot -MatchPattern=%M_@v_%a+@l-@d.efi \ - %M_@v_%a+@l.efi \ - %M_@v_%a.efi \ - %M_@v+@l-@d.efi \ - %M_@v+@l.efi \ - %M_@v.efi +MatchPattern=Elementary_@v_%a+@l-@d.efi \ + Elementary_@v_%a+@l.efi \ + Elementary_@v_%a.efi \ + Elementary_@v+@l-@d.efi \ + Elementary_@v+@l.efi \ + Elementary_@v.efi +# MatchPartitionType=uki Mode=0600 TriesLeft=3 TriesDone=0 -InstancesMax=2 +InstancesMax=2 \ No newline at end of file From 1b78f3945ea3d8a55c3fe100d513427480ab8dd3 Mon Sep 17 00:00:00 2001 From: Niko Date: Fri, 24 Jul 2026 16:45:14 -0700 Subject: [PATCH 08/86] Update readme (#8) --- Justfile | 2 +- README.md | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/Justfile b/Justfile index bc6dc7bdd..161add7b8 100644 --- a/Justfile +++ b/Justfile @@ -10,7 +10,7 @@ lazy-spin: just build-sysupdate build-sysupdate: - mkosi -B --debug --force --profile=sysupdate && \ + mkosi build --debug --force --profile=sysupdate && \ just sign-repo # resize: diff --git a/README.md b/README.md index 804083aa4..cbad8aa18 100644 --- a/README.md +++ b/README.md @@ -27,17 +27,23 @@ 1. Install `mkosi`, `just`, `fzf` 2. Generate keys `just _gen_keys` 3. Build `just build-sysupdate` -4. Resize `just resize` ### Run with qemu -You can directly boot the .raw image with qemu, make sure to have TPM and UEFI enabled +- Resize with `qemu-img resize "$(ls mkosi.output/Elementary_*_x86-64.raw)" +40G`, and you can then directly boot the .raw image with qemu or VirtManager/libvirt. +- Make sure to have TPM and UEFI enabled in libvirt (Gnome Boxes won't work - doesn't support TPM). -### Run on baremetal +### Install / run on baremetal -`sudo dd if=mkosi.output/Elementary---.raw of=/dev/sdX bs=4M status=progress` +Copy the main .raw file to a 40+ GB USB stick with one of the options below. It will then expand and be bootable. Note: Don't run this after resizing for qemu or your image will be the wrong shape. -## Further Information +`sudo dd if="$(ls mkosi.output/Elementary_*_x86-64.raw)" of=/dev/sdX bs=4M status=progress conv=fsync` where X is your usb drive on /dev/sda, etc -More information about the concepts behind `live-build` and the technical decisions made to arrive at this set of tools to build an .iso can be found [on the wiki](https://github.com/elementary/os/wiki/Building-iso-Images). +or + +`sudo mkosi burn /dev/sdX` where X is your usb drive on /dev/sda, etc + +or + +Fedora Media Writer, etc. From 80dd71fdb569439956a92e26a95182225863b480 Mon Sep 17 00:00:00 2001 From: Niko Date: Fri, 24 Jul 2026 17:00:47 -0700 Subject: [PATCH 09/86] Re-add build & upload jobs (#7) * re-add sysupdate jobs * make only monthly image. * make monthly * update scripts * done * merge * revert * fix typo, PR feedback on build * add date to raw * better update file matching * update sha * update upload.py for cloudflare R2 --- .github/workflows/monthly-image-9.0.yml | 39 +++++++++++ build.sh | 92 +------------------------ upload.py | 18 +++++ upload.sh | 62 +++++++++++++++++ 4 files changed, 120 insertions(+), 91 deletions(-) create mode 100644 .github/workflows/monthly-image-9.0.yml mode change 100755 => 100644 build.sh create mode 100644 upload.py create mode 100755 upload.sh diff --git a/.github/workflows/monthly-image-9.0.yml b/.github/workflows/monthly-image-9.0.yml new file mode 100644 index 000000000..8ec711f96 --- /dev/null +++ b/.github/workflows/monthly-image-9.0.yml @@ -0,0 +1,39 @@ +name: Monthly Image-based OS 9 + +on: + push: + branches: + - main + schedule: + - cron: "0 0 1 * *" + workflow_dispatch: {} + +jobs: + build: + strategy: + fail-fast: false + matrix: + include: + - runner: ubuntu-26.04 + arch: amd64 + - runner: ubuntu-26.04-arm + arch: arm64 + runs-on: ${{ matrix.runner }} + + container: + image: debian:latest + volumes: + - /proc:/proc + options: --privileged + + steps: + - name: Clone build scripts + uses: actions/checkout@v7 + + - name: Build + run: | + ./build.sh etc/terraform-daily-9.0-azure-${{ matrix.arch }}.conf + + - name: Upload + run: | + ./upload.sh "${{ secrets.key }}" "${{ secrets.secret }}" "${{ secrets.endpoint }}" "${{ secrets.bucket }}" "${{ secrets.install_bucket }}" diff --git a/build.sh b/build.sh old mode 100755 new mode 100644 index 71596c5bd..9d8705fbf --- a/build.sh +++ b/build.sh @@ -2,94 +2,4 @@ set -e -# check for root permissions -if [[ "$(id -u)" != 0 ]]; then - echo "E: Requires root permissions" > /dev/stderr - exit 1 -fi - -# get config -if [ -n "$1" ]; then - CONFIG_FILE="$1" -else - CONFIG_FILE="etc/terraform-$(dpkg --print-architecture).conf" -fi -BASE_DIR="$PWD" -source "$BASE_DIR"/"$CONFIG_FILE" - -echo -e " -#----------------------# -# INSTALL DEPENDENCIES # -#----------------------# -" - -apt-get update -apt-get install -y live-build patch gnupg2 binutils zstd - -# The Debian repositories don't seem to have the `ubuntu-keyring` or `ubuntu-archive-keyring` packages -# anymore, so we add the archive keys manually. This may need to be updated if Ubuntu changes their signing keys -# To get the current key ID, find `ubuntu-keyring-xxxx-archive.gpg` in /etc/apt/trusted.gpg.d on a running -# system and run `gpg --keyring /etc/apt/trusted.gpg.d/ubuntu-keyring-xxxx-archive.gpg --list-public-keys ` -gpg --homedir /tmp --no-default-keyring --keyring /etc/apt/trusted.gpg --recv-keys --keyserver keyserver.ubuntu.com F6ECB3762474EDA9D21B7022871920D1991BC93C - -# TODO: Remove this once debootstrap can natively build resolute images: -ln -sfn /usr/share/debootstrap/scripts/gutsy /usr/share/debootstrap/scripts/resolute - -build () { - BUILD_ARCH="$1" - - mkdir -p "$BASE_DIR/tmp/$BUILD_ARCH" - cd "$BASE_DIR/tmp/$BUILD_ARCH" || exit - - # remove old configs and copy over new - rm -rf config auto - cp -r "$BASE_DIR"/etc/* . - # Make sure conffile specified as arg has correct name - cp -f "$BASE_DIR"/"$CONFIG_FILE" terraform.conf - - echo -e " -#------------------# -# LIVE-BUILD CLEAN # -#------------------# -" - lb clean - - echo -e " -#-------------------# -# LIVE-BUILD CONFIG # -#-------------------# -" - lb config - - echo -e " -#------------------# -# LIVE-BUILD BUILD # -#------------------# -" - lb build - - echo -e " -#---------------------------# -# MOVE OUTPUT TO BUILDS DIR # -#---------------------------# -" - - YYYYMMDD="$(date +%Y%m%d)" - OUTPUT_DIR="$BASE_DIR/builds/$BUILD_ARCH" - mkdir -p "$OUTPUT_DIR" - FNAME="elementaryos-$VERSION-$CHANNEL-$BUILD_ARCH.$YYYYMMDD$OUTPUT_SUFFIX" - mv "$BASE_DIR/tmp/$BUILD_ARCH/live-image-$BUILD_ARCH.hybrid.iso" "$OUTPUT_DIR/${FNAME}.iso" - - # cd into output to so {FNAME}.sha256.txt only - # includes the filename and not the path to - # our file. - cd $OUTPUT_DIR - md5sum "${FNAME}.iso" | tee "${FNAME}.md5.txt" - sha256sum "${FNAME}.iso" | tee "${FNAME}.sha256.txt" - cd $BASE_DIR -} - -# remove old builds before creating new ones -rm -rf "$BASE_DIR"/builds - -build "$ARCH" +mkosi -B --debug --force --profile=sysupdate diff --git a/upload.py b/upload.py new file mode 100644 index 000000000..a1dd5f724 --- /dev/null +++ b/upload.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python3 + +import boto3 +import sys + +KEY, SECRET, ENDPOINT, BUCKET, FILEPATH, FILENAME = [sys.argv[i+1] for i in range(6)] + +session = boto3.session.Session() +client = session.client('s3', + region_name='auto', # for cloudflare R2 + endpoint_url='https://' + ENDPOINT, + aws_access_key_id = KEY, + aws_secret_access_key = SECRET) + +client.upload_file(FILEPATH, # Path to local file + BUCKET, # Name of Space + FILENAME, # Name for remote file + ) diff --git a/upload.sh b/upload.sh new file mode 100755 index 000000000..cb91e4a0b --- /dev/null +++ b/upload.sh @@ -0,0 +1,62 @@ +#!/bin/bash + +set -e + +KEY="$1" +SECRET="$2" +ENDPOINT="$3" +UPDATES_BUCKET="$4" +INSTALL_BUCKET="$5" + +upload_file() { + local bucket="$1" + local src="$2" + local dst="$3" + python3 upload.py "$KEY" "$SECRET" "$ENDPOINT" "$bucket" "$src" "$dst" || exit 1 +} + +echo -e " +#----------------------# +# INSTALL DEPENDENCIES # +#----------------------# +" + +apt-get update +apt-get install -y python3 python3-boto3 + +echo -e " +#---------------------------------# +# UPLOAD TO SYSUPDATES CLOUDFLARE # +#---------------------------------# +" + +UPDATE_FILES="$(find mkosi.output -type f \( -name '*.efi' -o -name '*.manifest' -o -name '*.usr-*' -o -name 'SHA256SUMS' \))" +while IFS= read -r FILE; do + REMOTE="$(basename "$FILE")" + echo "uploading $REMOTE to $UPDATES_BUCKET..." + upload_file "$UPDATES_BUCKET" "$FILE" "$REMOTE" +done <<< "$UPDATE_FILES" + +echo -e " +#-----------------------------------# +# UPLOAD INSTALLER-ISO TO CLOUDFLARE # +#-----------------------------------# +" + +RAW="$(ls mkosi.output/Elementary_*_x86-64.raw)" +SHA="${RAW}.sha256" +MD5="${RAW}.md5" + +sha256sum \ + mkosi.output/Elementary_*_x86-64.usr-x86-64-verity-sig.*.raw \ + mkosi.output/Elementary_*_x86-64.usr-x86-64-verity.*.raw \ + mkosi.output/Elementary_*_x86-64.usr-x86-64.*.raw \ + mkosi.output/Elementary_*_x86-64.efi \ + > SHA256SUMS + +sha256sum "$RAW" | tee "$SHA" +md5sum "$RAW" | tee "$MD5" + +upload_file "$INSTALL_BUCKET" "$RAW" "elementaryos.raw" +upload_file "$INSTALL_BUCKET" "$SHA" "elementaryos.raw.sha256" +upload_file "$INSTALL_BUCKET" "$MD5" "elementaryos.raw.md5" From fc8ddf7b41ade954832ac878976926fa2d1f7117 Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Mon, 27 Jul 2026 12:10:23 -0400 Subject: [PATCH 10/86] Refactor image building (#10) --- .github/workflows/release.yaml | 51 +++++++++++++++++++ Justfile | 30 +++++++---- mkosi.conf | 15 ++---- .../mkosi.conf.d/elementary-desktop.conf | 1 - .../mkosi.conf.d/elementary-settings.conf | 1 - .../elementary/mkosi.conf.d/elementary.conf | 22 +------- mkosi.extra/usr/lib/sysupdate.d/devel.feature | 3 ++ .../usr/lib/sysupdate.d/devel.transfer | 12 +++++ mkosi.images/devel/mkosi.conf | 46 +++++++++++++++++ mkosi.images/os/mkosi.conf | 10 ++++ .../{sysupdate => elementaryos}/mkosi.conf | 2 +- .../mkosi.conf.d/ubuntu/mkosi.conf | 0 .../mkosi.extra/boot/loader/loader.conf | 0 .../mkosi.extra/usr/lib/repart.d/00-esp.conf | 0 .../usr/lib/repart.d/10-usr-verity-sig.conf | 0 .../usr/lib/repart.d/11-usr-verity.conf | 0 .../mkosi.extra/usr/lib/repart.d/12-usr.conf | 0 .../usr/lib/repart.d/20-usr-verity-sig.conf | 0 .../usr/lib/repart.d/21-usr-verity.conf | 0 .../mkosi.extra/usr/lib/repart.d/22-usr.conf | 0 .../mkosi.extra/usr/lib/repart.d/40-root.conf | 0 .../mkosi.extra/usr/lib/repart.d/50-home.conf | 0 .../system-preset/10-elementary.preset | 0 .../lib/systemd/system/preset-global.service | 0 .../systemd/system/systemd-firstboot.service | 0 .../usr/lib/systemd/zram-generator.conf | 0 .../sysupdate.d}/10-usr-verity-sig.transfer | 4 +- .../lib/sysupdate.d}/11-usr-verity.transfer | 4 +- .../usr/lib/sysupdate.d}/12-usr.transfer | 4 +- .../usr/lib/sysupdate.d}/20-uki.transfer | 4 +- .../usr/lib/tmpfiles.d/aliases.conf | 0 .../mkosi.extra/usr/lib/tmpfiles.d/etc.conf | 0 .../mkosi.finalize | 0 .../mkosi.postinst.chroot | 4 +- .../mkosi.repart/00-esp.conf | 0 .../mkosi.repart/10-usr-verity-sig.conf | 0 .../mkosi.repart/11-usr-verity.conf | 0 .../mkosi.repart/12-usr.conf | 0 mkosi.profiles/elementaryos/mkosi.sysupdate | 1 + .../mkosi.uki-profiles/.gitkeep | 0 .../sysupdate.d/10-usr-verity-sig.transfer | 15 ------ .../lib/sysupdate.d/11-usr-verity.transfer | 15 ------ .../usr/lib/sysupdate.d/12-usr.transfer | 15 ------ .../usr/lib/sysupdate.d/20-uki.transfer | 23 --------- 44 files changed, 161 insertions(+), 121 deletions(-) create mode 100644 .github/workflows/release.yaml create mode 100644 mkosi.extra/usr/lib/sysupdate.d/devel.feature create mode 100644 mkosi.extra/usr/lib/sysupdate.d/devel.transfer create mode 100644 mkosi.images/devel/mkosi.conf create mode 100644 mkosi.images/os/mkosi.conf rename mkosi.profiles/{sysupdate => elementaryos}/mkosi.conf (97%) rename mkosi.profiles/{sysupdate => elementaryos}/mkosi.conf.d/ubuntu/mkosi.conf (100%) rename mkosi.profiles/{sysupdate => elementaryos}/mkosi.extra/boot/loader/loader.conf (100%) rename mkosi.profiles/{sysupdate => elementaryos}/mkosi.extra/usr/lib/repart.d/00-esp.conf (100%) rename mkosi.profiles/{sysupdate => elementaryos}/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf (100%) rename mkosi.profiles/{sysupdate => elementaryos}/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf (100%) rename mkosi.profiles/{sysupdate => elementaryos}/mkosi.extra/usr/lib/repart.d/12-usr.conf (100%) rename mkosi.profiles/{sysupdate => elementaryos}/mkosi.extra/usr/lib/repart.d/20-usr-verity-sig.conf (100%) rename mkosi.profiles/{sysupdate => elementaryos}/mkosi.extra/usr/lib/repart.d/21-usr-verity.conf (100%) rename mkosi.profiles/{sysupdate => elementaryos}/mkosi.extra/usr/lib/repart.d/22-usr.conf (100%) rename mkosi.profiles/{sysupdate => elementaryos}/mkosi.extra/usr/lib/repart.d/40-root.conf (100%) rename mkosi.profiles/{sysupdate => elementaryos}/mkosi.extra/usr/lib/repart.d/50-home.conf (100%) rename mkosi.profiles/{sysupdate => elementaryos}/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset (100%) rename mkosi.profiles/{sysupdate => elementaryos}/mkosi.extra/usr/lib/systemd/system/preset-global.service (100%) rename mkosi.profiles/{sysupdate => elementaryos}/mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service (100%) rename mkosi.profiles/{sysupdate => elementaryos}/mkosi.extra/usr/lib/systemd/zram-generator.conf (100%) rename mkosi.profiles/{sysupdate/mkosi.sysupdate => elementaryos/mkosi.extra/usr/lib/sysupdate.d}/10-usr-verity-sig.transfer (58%) rename mkosi.profiles/{sysupdate/mkosi.sysupdate => elementaryos/mkosi.extra/usr/lib/sysupdate.d}/11-usr-verity.transfer (58%) rename mkosi.profiles/{sysupdate/mkosi.sysupdate => elementaryos/mkosi.extra/usr/lib/sysupdate.d}/12-usr.transfer (57%) rename mkosi.profiles/{sysupdate/mkosi.sysupdate => elementaryos/mkosi.extra/usr/lib/sysupdate.d}/20-uki.transfer (79%) rename mkosi.profiles/{sysupdate => elementaryos}/mkosi.extra/usr/lib/tmpfiles.d/aliases.conf (100%) rename mkosi.profiles/{sysupdate => elementaryos}/mkosi.extra/usr/lib/tmpfiles.d/etc.conf (100%) rename mkosi.profiles/{sysupdate => elementaryos}/mkosi.finalize (100%) rename mkosi.profiles/{sysupdate => elementaryos}/mkosi.postinst.chroot (97%) rename mkosi.profiles/{sysupdate => elementaryos}/mkosi.repart/00-esp.conf (100%) rename mkosi.profiles/{sysupdate => elementaryos}/mkosi.repart/10-usr-verity-sig.conf (100%) rename mkosi.profiles/{sysupdate => elementaryos}/mkosi.repart/11-usr-verity.conf (100%) rename mkosi.profiles/{sysupdate => elementaryos}/mkosi.repart/12-usr.conf (100%) create mode 120000 mkosi.profiles/elementaryos/mkosi.sysupdate rename mkosi.profiles/{sysupdate => elementaryos}/mkosi.uki-profiles/.gitkeep (100%) delete mode 100644 mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer delete mode 100644 mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer delete mode 100644 mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer delete mode 100644 mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 000000000..bd8c4b63a --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,51 @@ +name: Build and Release DDI (Elementary OS) + +on: + workflow_dispatch: + +jobs: + build-and-release: + name: Build Image and Release + runs-on: ubuntu-latest + permissions: + contents: write + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Maximize build space + uses: ublue-os/remove-unwanted-software@v8 + + - name: Setup build environment + run: | + sudo apt-get update + sudo apt-get install -y mkosi systemd-container gzip coreutils + + - name: Build image with mkosi + run: | + sudo mkosi -B --debug --force --profile=elementaryos + + - name: Gunzip usr.raw + run: | + find mkosi.output -type f -name "*.usr-*.raw" ! -name "*verity*" -exec gzip -9 {} + + + - name: Generate SHA256SUMS + run: | + cd mkosi.output + sha256sum *.efi *.usr-*.raw.gz *.usr-*-verity*.raw *.usr-*-verity-sig*.raw > SHA256SUMS + + echo "Generated SHA256SUMS:" + cat SHA256SUMS + + - name: Create Release and Upload Artifacts + uses: softprops/action-gh-release@v3 + with: + tag_name: ${{ github.ref_name }} + name: Release ${{ github.ref_name }} + files: | + mkosi.output/*.efi + mkosi.output/*.usr-*.raw.gz + mkosi.output/*.usr-*-verity.raw + mkosi.output/*.usr-*-verity-sig.raw + mkosi.output/SHA256SUMS \ No newline at end of file diff --git a/Justfile b/Justfile index 161add7b8..b57d361b0 100644 --- a/Justfile +++ b/Justfile @@ -1,3 +1,6 @@ +# resize: +# qemu-img resize ./mkosi.output/Elementary_x86-64.raw +40G + alias serve := start-sysupdate-server default: @@ -10,11 +13,9 @@ lazy-spin: just build-sysupdate build-sysupdate: - mkosi build --debug --force --profile=sysupdate && \ - just sign-repo - -# resize: -# qemu-img resize ./mkosi.output/Elementary_x86-64.raw +40G + rm -rf mkosi.output/ && \ + sudo $(which mkosi) -B --debug --force --profile=elementaryos --profile=sysexts --workspace-directory=$HOME/.cache/mkosi-workspace && \ + sudo chown -R $(whoami):$(whoami) ./mkosi.output/ _gen_keys: mkosi genkey || true @@ -26,17 +27,28 @@ clean: start-sysupdate-server: #!/usr/bin/env bash + mkdir -p mkosi.output/se/ && \ + just sign-ext && \ just sign-repo && \ python -m http.server -d mkosi.output 7676 + +sign-ext: + #!/usr/bin/env bash + cd mkosi.output/se/ + echo "Sysexts will not be signed, use verify=no." + echo "Generating SHA256..." + sha256sum *.raw > SHA256SUMS + cd ../../ + sign-repo: #!/usr/bin/env bash cd mkosi.output echo "Repo will not be signed, use verify=no." echo "Generating SHA256..." - sha256sum Elementary_*_x86-64.usr-x86-64-verity-sig.*.raw \ - Elementary_*_x86-64.usr-x86-64-verity.*.raw \ - Elementary_*_x86-64.usr-x86-64.*.raw \ - Elementary_*_x86-64.efi \ + sha256sum Elementary_*.usr-x86-64-verity-sig.*.raw \ + Elementary_*.usr-x86-64-verity.*.raw \ + Elementary_*.usr-x86-64.*.raw \ + Elementary_*.efi \ > SHA256SUMS cd .. \ No newline at end of file diff --git a/mkosi.conf b/mkosi.conf index af63a2546..4a6da1029 100644 --- a/mkosi.conf +++ b/mkosi.conf @@ -6,21 +6,14 @@ Distribution=ubuntu Release=resolute Repositories=main,universe -[Content] -Hostname=elementary - [Build] ToolsTree=default -History=yes CacheDirectory=mkosi.cache Incremental=yes - -[Validation] -SecureBoot=no -SignExpectedPcr=no +ToolsTreeDistribution=debian +ToolsTreeRelease=trixie [Output] -ImageId=Elementary +Format=none OutputDirectory=mkosi.output -ManifestFormat=json -Output=%i_%v_%a # Versioned tag for releases \ No newline at end of file +ImageId=Elementary \ No newline at end of file diff --git a/mkosi.conf.d/elementary/mkosi.conf.d/elementary-desktop.conf b/mkosi.conf.d/elementary/mkosi.conf.d/elementary-desktop.conf index 4228c923c..194189ac1 100644 --- a/mkosi.conf.d/elementary/mkosi.conf.d/elementary-desktop.conf +++ b/mkosi.conf.d/elementary/mkosi.conf.d/elementary-desktop.conf @@ -11,7 +11,6 @@ Packages= fonts-elementary-core fonts-elementary-extra fonts-roboto-mono-elementary - granite-demo elementary-default-settings elementary-desktop elementary-minimal diff --git a/mkosi.conf.d/elementary/mkosi.conf.d/elementary-settings.conf b/mkosi.conf.d/elementary/mkosi.conf.d/elementary-settings.conf index 890dd112b..dbc9228c9 100644 --- a/mkosi.conf.d/elementary/mkosi.conf.d/elementary-settings.conf +++ b/mkosi.conf.d/elementary/mkosi.conf.d/elementary-settings.conf @@ -19,7 +19,6 @@ Packages= io.elementary.settings.printers io.elementary.settings.screentime-limits io.elementary.settings.security-privacy - #io.elementary.settings.sharing io.elementary.settings.sound io.elementary.settings.system io.elementary.settings.useraccounts diff --git a/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf b/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf index c51a5e66c..299e721ca 100644 --- a/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf +++ b/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf @@ -20,39 +20,21 @@ Packages= systemd-cryptsetup cryptsetup btrfs-progs - bolt x11-common - curl - wget - binutils iputils-ping ubuntu-keyring - distrobox - fastfetch - oras flatpak - htop - podman - vim - fzf - gcr - git locales-all glycin-loaders gnome-disk-utility gnome-keyring libpam-gnome-keyring - totem-video-thumbnailer - just - lshw - nano + micro + vim ncurses-base network-manager - ssh-askpass-gnome systemd-homed sudo-rs - yq - jq xdg-desktop-portal-gtk xdg-user-dirs systemd-zram-generator \ No newline at end of file diff --git a/mkosi.extra/usr/lib/sysupdate.d/devel.feature b/mkosi.extra/usr/lib/sysupdate.d/devel.feature new file mode 100644 index 000000000..f022e7e7f --- /dev/null +++ b/mkosi.extra/usr/lib/sysupdate.d/devel.feature @@ -0,0 +1,3 @@ +[Feature] +Description=Tooling for developpers +Enabled=false \ No newline at end of file diff --git a/mkosi.extra/usr/lib/sysupdate.d/devel.transfer b/mkosi.extra/usr/lib/sysupdate.d/devel.transfer new file mode 100644 index 000000000..b2ed2b356 --- /dev/null +++ b/mkosi.extra/usr/lib/sysupdate.d/devel.transfer @@ -0,0 +1,12 @@ +[Transfer] +Features=devel + +[Source] +Type=url-file +Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download/ +MatchPattern=ext-devel_@v.raw + +[Target] +Type=regular-file +Path=/var/lib/extensions +MatchPattern=ext-devel_@v.raw \ No newline at end of file diff --git a/mkosi.images/devel/mkosi.conf b/mkosi.images/devel/mkosi.conf new file mode 100644 index 000000000..f0f2a3daa --- /dev/null +++ b/mkosi.images/devel/mkosi.conf @@ -0,0 +1,46 @@ +[Config] +Dependencies=os + +[Match] +Distribution=ubuntu +Release=resolute +Profiles=sysexts + +[Output] +Format=sysext +Overlay=yes +ImageId=ext-devel + +[Content] +Bootable=no +BaseTrees=%O/Elementary_%v_%a.raw +Packages= + cmake + meson + sassc + libxml2-dev + libdbus-1-dev + libadwaita-1-dev + git + build-essential + ripgrep + dnsutils + podman-compose + gcc + gettext + distrobox + fastfetch + binutils + curl + wget + htop + podman + vim + fzf + gcr + git + just + lshw + ssh-askpass-gnome + yq + jq \ No newline at end of file diff --git a/mkosi.images/os/mkosi.conf b/mkosi.images/os/mkosi.conf new file mode 100644 index 000000000..447c61113 --- /dev/null +++ b/mkosi.images/os/mkosi.conf @@ -0,0 +1,10 @@ +[Content] +Hostname=elementary + +[Validation] +SecureBoot=no +SignExpectedPcr=no + +[Output] +ManifestFormat=json +Output=%i_%v_%a \ No newline at end of file diff --git a/mkosi.profiles/sysupdate/mkosi.conf b/mkosi.profiles/elementaryos/mkosi.conf similarity index 97% rename from mkosi.profiles/sysupdate/mkosi.conf rename to mkosi.profiles/elementaryos/mkosi.conf index c331e3fc6..adcfc9e99 100644 --- a/mkosi.profiles/sysupdate/mkosi.conf +++ b/mkosi.profiles/elementaryos/mkosi.conf @@ -1,5 +1,5 @@ [Match] -Profiles=sysupdate +Profiles=elementaryos [Output] SplitArtifacts=uki,partitions diff --git a/mkosi.profiles/sysupdate/mkosi.conf.d/ubuntu/mkosi.conf b/mkosi.profiles/elementaryos/mkosi.conf.d/ubuntu/mkosi.conf similarity index 100% rename from mkosi.profiles/sysupdate/mkosi.conf.d/ubuntu/mkosi.conf rename to mkosi.profiles/elementaryos/mkosi.conf.d/ubuntu/mkosi.conf diff --git a/mkosi.profiles/sysupdate/mkosi.extra/boot/loader/loader.conf b/mkosi.profiles/elementaryos/mkosi.extra/boot/loader/loader.conf similarity index 100% rename from mkosi.profiles/sysupdate/mkosi.extra/boot/loader/loader.conf rename to mkosi.profiles/elementaryos/mkosi.extra/boot/loader/loader.conf diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/00-esp.conf b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/00-esp.conf similarity index 100% rename from mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/00-esp.conf rename to mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/00-esp.conf diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf similarity index 100% rename from mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf rename to mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf similarity index 100% rename from mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf rename to mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/12-usr.conf b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/12-usr.conf similarity index 100% rename from mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/12-usr.conf rename to mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/12-usr.conf diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/20-usr-verity-sig.conf b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/20-usr-verity-sig.conf similarity index 100% rename from mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/20-usr-verity-sig.conf rename to mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/20-usr-verity-sig.conf diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/21-usr-verity.conf b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/21-usr-verity.conf similarity index 100% rename from mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/21-usr-verity.conf rename to mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/21-usr-verity.conf diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/22-usr.conf b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/22-usr.conf similarity index 100% rename from mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/22-usr.conf rename to mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/22-usr.conf diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/40-root.conf b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/40-root.conf similarity index 100% rename from mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/40-root.conf rename to mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/40-root.conf diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/50-home.conf b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/50-home.conf similarity index 100% rename from mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/50-home.conf rename to mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/50-home.conf diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset similarity index 100% rename from mkosi.profiles/sysupdate/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset rename to mkosi.profiles/elementaryos/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/systemd/system/preset-global.service b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/systemd/system/preset-global.service similarity index 100% rename from mkosi.profiles/sysupdate/mkosi.extra/usr/lib/systemd/system/preset-global.service rename to mkosi.profiles/elementaryos/mkosi.extra/usr/lib/systemd/system/preset-global.service diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service similarity index 100% rename from mkosi.profiles/sysupdate/mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service rename to mkosi.profiles/elementaryos/mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/systemd/zram-generator.conf b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/systemd/zram-generator.conf similarity index 100% rename from mkosi.profiles/sysupdate/mkosi.extra/usr/lib/systemd/zram-generator.conf rename to mkosi.profiles/elementaryos/mkosi.extra/usr/lib/systemd/zram-generator.conf diff --git a/mkosi.profiles/sysupdate/mkosi.sysupdate/10-usr-verity-sig.transfer b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer similarity index 58% rename from mkosi.profiles/sysupdate/mkosi.sysupdate/10-usr-verity-sig.transfer rename to mkosi.profiles/elementaryos/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer index 02a9f701c..ee9db5269 100644 --- a/mkosi.profiles/sysupdate/mkosi.sysupdate/10-usr-verity-sig.transfer +++ b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer @@ -3,8 +3,8 @@ ProtectVersion=%A [Source] Type=url-file -Path=http://10.0.2.2:7676/ -MatchPattern=Elementary_@v_%a.usr-%a-verity-sig.@u.raw +Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download +MatchPattern=Elementary_@v.usr-%a-verity-sig.@u.raw [Target] Type=partition diff --git a/mkosi.profiles/sysupdate/mkosi.sysupdate/11-usr-verity.transfer b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer similarity index 58% rename from mkosi.profiles/sysupdate/mkosi.sysupdate/11-usr-verity.transfer rename to mkosi.profiles/elementaryos/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer index c58ffde6f..c246af48d 100644 --- a/mkosi.profiles/sysupdate/mkosi.sysupdate/11-usr-verity.transfer +++ b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer @@ -3,8 +3,8 @@ ProtectVersion=%A [Source] Type=url-file -Path=http://10.0.2.2:7676/ -MatchPattern=Elementary_@v_%a.usr-%a-verity.@u.raw +Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download +MatchPattern=Elementary_@v.usr-%a-verity.@u.raw [Target] Type=partition diff --git a/mkosi.profiles/sysupdate/mkosi.sysupdate/12-usr.transfer b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer similarity index 57% rename from mkosi.profiles/sysupdate/mkosi.sysupdate/12-usr.transfer rename to mkosi.profiles/elementaryos/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer index 22b81820a..64f7ac1b3 100644 --- a/mkosi.profiles/sysupdate/mkosi.sysupdate/12-usr.transfer +++ b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer @@ -3,8 +3,8 @@ ProtectVersion=%A [Source] Type=url-file -Path=http://10.0.2.2:7676/ -MatchPattern=Elementary_@v_%a.usr-%a.@u.raw +Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download +MatchPattern=Elementary_@v.usr-%a.@u.raw.gz [Target] Type=partition diff --git a/mkosi.profiles/sysupdate/mkosi.sysupdate/20-uki.transfer b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer similarity index 79% rename from mkosi.profiles/sysupdate/mkosi.sysupdate/20-uki.transfer rename to mkosi.profiles/elementaryos/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer index 9270dbd22..801be7b83 100644 --- a/mkosi.profiles/sysupdate/mkosi.sysupdate/20-uki.transfer +++ b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer @@ -3,8 +3,8 @@ ProtectVersion=%A [Source] Type=url-file -Path=http://10.0.2.2:7676/ -MatchPattern=Elementary_@v_%a.efi +Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download +MatchPattern=Elementary_@v.efi [Target] Type=regular-file diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/tmpfiles.d/aliases.conf b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/tmpfiles.d/aliases.conf similarity index 100% rename from mkosi.profiles/sysupdate/mkosi.extra/usr/lib/tmpfiles.d/aliases.conf rename to mkosi.profiles/elementaryos/mkosi.extra/usr/lib/tmpfiles.d/aliases.conf diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/tmpfiles.d/etc.conf b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/tmpfiles.d/etc.conf similarity index 100% rename from mkosi.profiles/sysupdate/mkosi.extra/usr/lib/tmpfiles.d/etc.conf rename to mkosi.profiles/elementaryos/mkosi.extra/usr/lib/tmpfiles.d/etc.conf diff --git a/mkosi.profiles/sysupdate/mkosi.finalize b/mkosi.profiles/elementaryos/mkosi.finalize similarity index 100% rename from mkosi.profiles/sysupdate/mkosi.finalize rename to mkosi.profiles/elementaryos/mkosi.finalize diff --git a/mkosi.profiles/sysupdate/mkosi.postinst.chroot b/mkosi.profiles/elementaryos/mkosi.postinst.chroot similarity index 97% rename from mkosi.profiles/sysupdate/mkosi.postinst.chroot rename to mkosi.profiles/elementaryos/mkosi.postinst.chroot index 14b2b5e78..bde06afa6 100755 --- a/mkosi.profiles/sysupdate/mkosi.postinst.chroot +++ b/mkosi.profiles/elementaryos/mkosi.postinst.chroot @@ -30,8 +30,8 @@ ID="elementary" ID_LIKE="ubuntu" PRETTY_NAME="$NAME $VERSION_ID" FANCY_NAME="\033[0;38:2:252:186:3;1;49m⸭\033[0;38:2:252:186:3;49m $NAME $VERSION\033[0m" -VERSION="9.0" -VERSION_ID="Tanit" +VERSION="Tanit" +VERSION_ID="9" ANSI_COLOR="38:2:252:186:3;1;49" ANSI_COLOR_REVERSE="48;2;252;186;3;1;30" DEFAULT_HOSTNAME="particle-????-????" diff --git a/mkosi.profiles/sysupdate/mkosi.repart/00-esp.conf b/mkosi.profiles/elementaryos/mkosi.repart/00-esp.conf similarity index 100% rename from mkosi.profiles/sysupdate/mkosi.repart/00-esp.conf rename to mkosi.profiles/elementaryos/mkosi.repart/00-esp.conf diff --git a/mkosi.profiles/sysupdate/mkosi.repart/10-usr-verity-sig.conf b/mkosi.profiles/elementaryos/mkosi.repart/10-usr-verity-sig.conf similarity index 100% rename from mkosi.profiles/sysupdate/mkosi.repart/10-usr-verity-sig.conf rename to mkosi.profiles/elementaryos/mkosi.repart/10-usr-verity-sig.conf diff --git a/mkosi.profiles/sysupdate/mkosi.repart/11-usr-verity.conf b/mkosi.profiles/elementaryos/mkosi.repart/11-usr-verity.conf similarity index 100% rename from mkosi.profiles/sysupdate/mkosi.repart/11-usr-verity.conf rename to mkosi.profiles/elementaryos/mkosi.repart/11-usr-verity.conf diff --git a/mkosi.profiles/sysupdate/mkosi.repart/12-usr.conf b/mkosi.profiles/elementaryos/mkosi.repart/12-usr.conf similarity index 100% rename from mkosi.profiles/sysupdate/mkosi.repart/12-usr.conf rename to mkosi.profiles/elementaryos/mkosi.repart/12-usr.conf diff --git a/mkosi.profiles/elementaryos/mkosi.sysupdate b/mkosi.profiles/elementaryos/mkosi.sysupdate new file mode 120000 index 000000000..c9ae06122 --- /dev/null +++ b/mkosi.profiles/elementaryos/mkosi.sysupdate @@ -0,0 +1 @@ +/home/jumpyvi/Projects/elementary-atomic-os/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/sysupdate.d \ No newline at end of file diff --git a/mkosi.profiles/sysupdate/mkosi.uki-profiles/.gitkeep b/mkosi.profiles/elementaryos/mkosi.uki-profiles/.gitkeep similarity index 100% rename from mkosi.profiles/sysupdate/mkosi.uki-profiles/.gitkeep rename to mkosi.profiles/elementaryos/mkosi.uki-profiles/.gitkeep diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer deleted file mode 100644 index 02a9f701c..000000000 --- a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer +++ /dev/null @@ -1,15 +0,0 @@ -[Transfer] -ProtectVersion=%A - -[Source] -Type=url-file -Path=http://10.0.2.2:7676/ -MatchPattern=Elementary_@v_%a.usr-%a-verity-sig.@u.raw - -[Target] -Type=partition -Path=auto -MatchPattern=Elementary_@v_verity_sig -MatchPartitionType=usr-verity-sig -PartitionFlags=0 -ReadOnly=1 \ No newline at end of file diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer deleted file mode 100644 index c58ffde6f..000000000 --- a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer +++ /dev/null @@ -1,15 +0,0 @@ -[Transfer] -ProtectVersion=%A - -[Source] -Type=url-file -Path=http://10.0.2.2:7676/ -MatchPattern=Elementary_@v_%a.usr-%a-verity.@u.raw - -[Target] -Type=partition -Path=auto -MatchPattern=Elementary_@v_verity -MatchPartitionType=usr-verity -PartitionFlags=0 -ReadOnly=1 \ No newline at end of file diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer deleted file mode 100644 index 22b81820a..000000000 --- a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer +++ /dev/null @@ -1,15 +0,0 @@ -[Transfer] -ProtectVersion=%A - -[Source] -Type=url-file -Path=http://10.0.2.2:7676/ -MatchPattern=Elementary_@v_%a.usr-%a.@u.raw - -[Target] -Type=partition -Path=auto -MatchPattern=Elementary_@v -MatchPartitionType=usr -PartitionFlags=0 -ReadOnly=1 \ No newline at end of file diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer deleted file mode 100644 index 9270dbd22..000000000 --- a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer +++ /dev/null @@ -1,23 +0,0 @@ -[Transfer] -ProtectVersion=%A - -[Source] -Type=url-file -Path=http://10.0.2.2:7676/ -MatchPattern=Elementary_@v_%a.efi - -[Target] -Type=regular-file -Path=/EFI/Linux -PathRelativeTo=boot -MatchPattern=Elementary_@v_%a+@l-@d.efi \ - Elementary_@v_%a+@l.efi \ - Elementary_@v_%a.efi \ - Elementary_@v+@l-@d.efi \ - Elementary_@v+@l.efi \ - Elementary_@v.efi -# MatchPartitionType=uki -Mode=0600 -TriesLeft=3 -TriesDone=0 -InstancesMax=2 \ No newline at end of file From 702cf2ee42df8213656bd81b94b18349f6c7c42e Mon Sep 17 00:00:00 2001 From: JumpyVi Date: Mon, 27 Jul 2026 12:43:44 -0400 Subject: [PATCH 11/86] Use mkosi@26 --- .github/workflows/release.yaml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index bd8c4b63a..7eb55f6c4 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -17,10 +17,11 @@ jobs: - name: Maximize build space uses: ublue-os/remove-unwanted-software@v8 - - name: Setup build environment - run: | - sudo apt-get update - sudo apt-get install -y mkosi systemd-container gzip coreutils + - name: Install mkosi + uses: systemd/mkosi@v26 + + - name: Generate key + run: mkosi genkey - name: Build image with mkosi run: | From f472c93f4f43ad1c0f8b53a47388b5a838ada3a8 Mon Sep 17 00:00:00 2001 From: JumpyVi Date: Mon, 27 Jul 2026 12:54:23 -0400 Subject: [PATCH 12/86] Fix permissions --- .github/workflows/release.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 7eb55f6c4..7b63eb840 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -27,6 +27,9 @@ jobs: run: | sudo mkosi -B --debug --force --profile=elementaryos + - name: Update permissions + run: sudo chown -R $USER:$USER mkosi.output + - name: Gunzip usr.raw run: | find mkosi.output -type f -name "*.usr-*.raw" ! -name "*verity*" -exec gzip -9 {} + From 5437004b29a5913b577d985111fb3840a1fc74b1 Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Mon, 27 Jul 2026 13:04:58 -0400 Subject: [PATCH 13/86] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index cbad8aa18..e3cbfac1a 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@

Stable 8.1 Daily 8.1 + Monthly 9.0

--- From 796891fa30a8c6b1bd2a5d813e116f9879e1dde4 Mon Sep 17 00:00:00 2001 From: JumpyVi Date: Mon, 27 Jul 2026 13:15:04 -0400 Subject: [PATCH 14/86] Update releases matching --- .github/workflows/release.yaml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 7b63eb840..3b5b9cd9f 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -1,4 +1,4 @@ -name: Build and Release DDI (Elementary OS) +name: Build and Release DDI (Elementary OS 9) on: workflow_dispatch: @@ -42,6 +42,14 @@ jobs: echo "Generated SHA256SUMS:" cat SHA256SUMS + - name: Extract Date + run: | + FILE_PATH=$(ls mkosi.output/Elementary_*.raw | head -n 1) + FILE_NAME=$(basename "$FILE_PATH") + TIMESTAMP=$(echo "$FILE_NAME" | sed 's/^Elementary_//;s/\.raw$//') + echo "RELEASE_TAG=os9-$TIMESTAMP" >> $GITHUB_ENV + echo "Generated tag: os9-$TIMESTAMP" + - name: Create Release and Upload Artifacts uses: softprops/action-gh-release@v3 with: @@ -50,6 +58,6 @@ jobs: files: | mkosi.output/*.efi mkosi.output/*.usr-*.raw.gz - mkosi.output/*.usr-*-verity.raw - mkosi.output/*.usr-*-verity-sig.raw + mkosi.output/*.usr-*-verity*.raw + mkosi.output/*.usr-*-verity-sig*.raw mkosi.output/SHA256SUMS \ No newline at end of file From 180d961185e7dcedae5bccb950d7134370d0631e Mon Sep 17 00:00:00 2001 From: JumpyVi Date: Mon, 27 Jul 2026 13:27:48 -0400 Subject: [PATCH 15/86] Use date a release tag --- .github/workflows/release.yaml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 3b5b9cd9f..fbb28ea19 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -43,18 +43,20 @@ jobs: cat SHA256SUMS - name: Extract Date + id: get_date run: | FILE_PATH=$(ls mkosi.output/Elementary_*.raw | head -n 1) FILE_NAME=$(basename "$FILE_PATH") TIMESTAMP=$(echo "$FILE_NAME" | sed 's/^Elementary_//;s/\.raw$//') - echo "RELEASE_TAG=os9-$TIMESTAMP" >> $GITHUB_ENV + + echo "RELEASE_TAG=os9-$TIMESTAMP" >> "$GITHUB_OUTPUT" echo "Generated tag: os9-$TIMESTAMP" - name: Create Release and Upload Artifacts uses: softprops/action-gh-release@v3 with: - tag_name: ${{ github.ref_name }} - name: Release ${{ github.ref_name }} + tag_name: ${{ steps.get_date.outputs.RELEASE_TAG }} + name: Release ${{ steps.get_date.outputs.RELEASE_TAG }} files: | mkosi.output/*.efi mkosi.output/*.usr-*.raw.gz From a238abdf770ba8912a2426110edadc397528253f Mon Sep 17 00:00:00 2001 From: JumpyVi Date: Mon, 27 Jul 2026 13:40:44 -0400 Subject: [PATCH 16/86] Fix date extraction --- .github/workflows/release.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index fbb28ea19..b19ad7d5c 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -47,8 +47,8 @@ jobs: run: | FILE_PATH=$(ls mkosi.output/Elementary_*.raw | head -n 1) FILE_NAME=$(basename "$FILE_PATH") - TIMESTAMP=$(echo "$FILE_NAME" | sed 's/^Elementary_//;s/\.raw$//') - + TIMESTAMP=$(echo "$FILE_NAME" | sed 's/^Elementary_//;s/\..*//') + echo "RELEASE_TAG=os9-$TIMESTAMP" >> "$GITHUB_OUTPUT" echo "Generated tag: os9-$TIMESTAMP" From 6a13cf3e31ef9da5f159786ed4a17ad7cf196bec Mon Sep 17 00:00:00 2001 From: JumpyVi Date: Mon, 27 Jul 2026 14:03:21 -0400 Subject: [PATCH 17/86] Move to xz7 --- .github/workflows/release.yaml | 8 ++++---- .../mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index b19ad7d5c..aee5cd80e 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -30,14 +30,14 @@ jobs: - name: Update permissions run: sudo chown -R $USER:$USER mkosi.output - - name: Gunzip usr.raw + - name: Compress (xz7) usr.raw run: | - find mkosi.output -type f -name "*.usr-*.raw" ! -name "*verity*" -exec gzip -9 {} + + find mkosi.output -type f -name "*.usr-*.raw" ! -name "*verity*" -exec xz -7v -T0 {} + - name: Generate SHA256SUMS run: | cd mkosi.output - sha256sum *.efi *.usr-*.raw.gz *.usr-*-verity*.raw *.usr-*-verity-sig*.raw > SHA256SUMS + sha256sum *.efi *.usr-*.raw.xz *.usr-*-verity*.raw *.usr-*-verity-sig*.raw > SHA256SUMS echo "Generated SHA256SUMS:" cat SHA256SUMS @@ -59,7 +59,7 @@ jobs: name: Release ${{ steps.get_date.outputs.RELEASE_TAG }} files: | mkosi.output/*.efi - mkosi.output/*.usr-*.raw.gz + mkosi.output/*.usr-*.raw.xz mkosi.output/*.usr-*-verity*.raw mkosi.output/*.usr-*-verity-sig*.raw mkosi.output/SHA256SUMS \ No newline at end of file diff --git a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer index 64f7ac1b3..9e717e150 100644 --- a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer +++ b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer @@ -4,7 +4,7 @@ ProtectVersion=%A [Source] Type=url-file Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download -MatchPattern=Elementary_@v.usr-%a.@u.raw.gz +MatchPattern=Elementary_@v.usr-%a.@u.raw.xz [Target] Type=partition From d6af04295a6a3c20e103cf5d62bec1066d4182cc Mon Sep 17 00:00:00 2001 From: JumpyVi Date: Tue, 28 Jul 2026 19:36:31 -0400 Subject: [PATCH 18/86] Add audio stack --- mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf b/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf index 299e721ca..acb1c457d 100644 --- a/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf +++ b/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf @@ -12,6 +12,7 @@ RemovePackages= Packages= plymouth plymouth-theme-elementary + pipewire-audio linux-image-generic linux-firmware libpam-systemd From f46b8342d8189abfd0e32c65bc15a50ab78797df Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Tue, 28 Jul 2026 20:35:01 -0400 Subject: [PATCH 19/86] Add flatpak-preinstalld (#14) --- .../mkosi.conf.d/elementary-apps.conf | 3 -- .../system/flatpak-preinstalld.service | 22 ++++++++ .../{01-zirconium.preset => 01-user.preset} | 0 .../flatpak/preinstall.d/appcenter.preinstall | 51 +++++++++++++++++++ .../flatpak/remotes.d/appcenter.flatpakrepo | 3 +- .../system-preset/10-elementary.preset | 1 + .../systemd-networkd-wait-online.service | 1 + 7 files changed, 77 insertions(+), 4 deletions(-) create mode 100644 mkosi.extra/usr/lib/systemd/system/flatpak-preinstalld.service rename mkosi.extra/usr/lib/systemd/user-preset/{01-zirconium.preset => 01-user.preset} (100%) create mode 100644 mkosi.extra/usr/share/flatpak/preinstall.d/appcenter.preinstall create mode 100644 mkosi.profiles/elementaryos/mkosi.extra/usr/lib/systemd/system/systemd-networkd-wait-online.service diff --git a/mkosi.conf.d/elementary/mkosi.conf.d/elementary-apps.conf b/mkosi.conf.d/elementary/mkosi.conf.d/elementary-apps.conf index ecdd0c78f..fb1b05f40 100644 --- a/mkosi.conf.d/elementary/mkosi.conf.d/elementary-apps.conf +++ b/mkosi.conf.d/elementary/mkosi.conf.d/elementary-apps.conf @@ -8,14 +8,11 @@ Packages= io.elementary.bluetooth-daemon io.elementary.code io.elementary.feedback - io.elementary.mail io.elementary.monitor io.elementary.onboarding io.elementary.sideload - io.elementary.tasks io.elementary.terminal pantheon-files - pantheon-photos diff --git a/mkosi.extra/usr/lib/systemd/system/flatpak-preinstalld.service b/mkosi.extra/usr/lib/systemd/system/flatpak-preinstalld.service new file mode 100644 index 000000000..c6142eebe --- /dev/null +++ b/mkosi.extra/usr/lib/systemd/system/flatpak-preinstalld.service @@ -0,0 +1,22 @@ +[Unit] +Description=Preinstall Flatpaks +After=network-online.target +Wants=network-online.target +ConditionPathExists=/usr/bin/flatpak +ConditionPathExists=!/var/lib/flatpak/.preinstall-finished +Documentation=man:flatpak-preinstall(1) +StartLimitIntervalSec=600 + +[Service] +Type=oneshot +ExecStart=mkdir -p /var/lib/flatpak/ +ExecStart=/usr/bin/flatpak preinstall -y +ExecStart=touch /var/lib/flatpak/.preinstall-finished +RemainAfterExit=true +Restart=on-failure +RestartSec=30 + +StartLimitBurst=3 + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/mkosi.extra/usr/lib/systemd/user-preset/01-zirconium.preset b/mkosi.extra/usr/lib/systemd/user-preset/01-user.preset similarity index 100% rename from mkosi.extra/usr/lib/systemd/user-preset/01-zirconium.preset rename to mkosi.extra/usr/lib/systemd/user-preset/01-user.preset diff --git a/mkosi.extra/usr/share/flatpak/preinstall.d/appcenter.preinstall b/mkosi.extra/usr/share/flatpak/preinstall.d/appcenter.preinstall new file mode 100644 index 000000000..f58860095 --- /dev/null +++ b/mkosi.extra/usr/share/flatpak/preinstall.d/appcenter.preinstall @@ -0,0 +1,51 @@ +[Flatpak Preinstall io.elementary.mail] +Branch=stable +IsRuntime=false + +[Flatpak Preinstall io.elementary.calculator] +Branch=stable +IsRuntime=false + +[Flatpak Preinstall io.elementary.calendar] +Branch=stable +IsRuntime=false + +[Flatpak Preinstall io.elementary.photos] +Branch=stable +IsRuntime=false + +[Flatpak Preinstall io.elementary.music] +Branch=stable +IsRuntime=false + +[Flatpak Preinstall io.elementary.tasks] +Branch=stable +IsRuntime=false + +[Flatpak Preinstall org.gnome.Epiphany] +Branch=stable +IsRuntime=false + +[Flatpak Preinstall org.gnome.capnet-assist] +Branch=stable +IsRuntime=false + +[Flatpak Preinstall org.gnome.Evince] +Branch=stable +IsRuntime=false + +[Flatpak Preinstall org.gnome.FileRoller] +Branch=stable +IsRuntime=false + +[Flatpak Preinstall org.gnome.font-viewer] +Branch=stable +IsRuntime=false + +[Flatpak Preinstall io.elementary.camera] +Branch=stable +IsRuntime=false + +[Flatpak Preinstall io.elementary.maps] +Branch=stable +IsRuntime=false diff --git a/mkosi.extra/usr/share/flatpak/remotes.d/appcenter.flatpakrepo b/mkosi.extra/usr/share/flatpak/remotes.d/appcenter.flatpakrepo index f487455be..81b95f1ca 100644 --- a/mkosi.extra/usr/share/flatpak/remotes.d/appcenter.flatpakrepo +++ b/mkosi.extra/usr/share/flatpak/remotes.d/appcenter.flatpakrepo @@ -5,4 +5,5 @@ Homepage=https://elementary.io/ Icon=https://flatpak.elementaryos.org/icon.svg Comment=The open source, pay-what-you-want app store from elementary Description=Reviewed and curated by elementary to ensure a native, privacy-respecting, and secure experience -GPGKey=LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCgptUUVOQkZjUlJOSUJDQURyRW5JUjkxYjJ2WDZCckFBWXFEUlRLWmVGZE1GRzdTdFNxRm8zbFpIMktGZDdLQmVCCnhZV25VM1YveEpRKzFsRnVqbytuYTZ6N0w5cUJydGlrWWRJbjlNYzNlU3l3L2ZsaTFGa011b0ZtZE10ajZrMUYKeitORU0wZFNyRUxhdkJNUHpYYjRrakY4WkdLbmVSMzV2NFkzUlArbHZaRGl1bVpwdkZ6VHpVMEFSVVJreEgzTgpiWWlYMG1raTc1Z3krRUh3Q1JlU1BqQnhLOTQrc1FSb0NsSmRyUWJGYUh0WERxZmgyWFZRTW0yTm5tSmFmMlJiCk1Gbzc1ekVveEh6WWJuQnlXZFIvWGg2dWhsU3lEYUJZME8wZjFjM3ljR243VVQrN0NBZEdrYTZHdTJWWlVYRUgKR0xaUzRvdFZodG95Z2Era0dhaUo3U1lSU1F6ZDBTL3hQUHh0QUJFQkFBRzBLR1ZzWlcxbGJuUmhjbmtnWW5WcApiR1J6SUR4aWRXbHNaSE5BWld4bGJXVnVkR0Z5ZVM1cGJ6NkpBVGNFRXdFSkFDRUZBbGNSUk5JQ0d3TUZDd2tJCkJ3TUZGUWtLQ0FzRkZnTUNBUUFDSGdFQ0Y0QUFDZ2tRcDA5ejcvNXd1Unpmd1FmL1FlR3RkbFFpVjNISkMvaEYKeVE0Q0hPeFpKRnJwZS9VZC90YXprVWlwbGMyWS9tcnJldGdkR2hJb0o2TnBRV3BEVENMRm12RDVDRXE5bGV0cwplUlVOVUx3MjF1dG5pdVRyckRYWmUxdG9tMEZrRlNkeUNZOFVwRERPYzdMa3piUTh3S28xQVNreXlFajhmVlhMCkVvT2tic2pSUUpVWFMvNlNkb1JTZVZpdXREZXdqVHkwWXZlbFVNVnhjWDVINVRqSmZYbVpNR1V4dEdVZWYzUmEKUkRYUjY5a21GamY3VW12MkFpaVZzZW5kcXJmSFJMblpRUnNiYmxOQWxObDVKK1ZUbEtrdmN3WGl2V2V3bFZVYQpPTDhIUEZvOWQya3hJYmV4RzJ5THdudXdtZmF2U0ZKVjROWWVtU1BTS2w2bEpWYkkzUCt6eitVODdWT01yOEtmCnVMMERvN2tCRFFSWEVVVFNBUWdBdkEzb1o3ck4xaUU4TTNROTFIVzM3bEJWK0V0YWdpckpVYTYrbTJvdlBmYTYKVG5PUHN5Z1NZOEVpTVBLQjhyRHhWUmszMlhuendObDNNQ21XMFlqTjFTMnNkRnY4WW5QWEx6WEtKV1lxVGFDTgpkZ0pQaEZ6K0xkZ1BtdVcya0hIM0VOWjhrT0JLZVZKZFErVUN4WmtFZEpaVmhuc0lQNjBwSHBTMmw4b01HWllrCnd0UnBlNkJEdEpNbHBnVVZXSzFqSnJmL1VqL0pBNjIrcnB2QWwyN1R4ZFpncHNtWU5hT3BnOWd1bVY4YUd0VWsKNGw2WDBOalNrS2FrYTdtMkJVTEFIb3RZT0FLMThEMHo3d3NzbEdiU2ZDWUtOS3NYS29VYlg5ZnB4anhQVXByTQpIUUo3TkFlZkRnZmllREltRm1CcGNTWEViem5VenQ1dmdTS3lIR05zdXdBUkFRQUJpUUVmQkJnQkNRQUpCUUpYCkVVVFNBaHNNQUFvSkVLZFBjKy8rY0xrY2VKQUgvMFhQVTJmeithaXBoNGx0dDludmRrWS9pcUZKNC9uZzJwWWoKejlLOWU4Sld1NjVFQkJrVW4zSjgwY1Z3TVRjQ3ZaZHVEeU1IaXpvYlBpbEhVeVdBZHdYdExYZ0xUWTVUUmZrZApIUVRLVmhGcXEvTHJwclVCUm9BSlFmVGJMNlhkQ1g4RHk3cTg5OXlhaUhzQkpkMUl6RUJpS3BmVE9jMVJtVnQvCnR2YUcwK1doQlJlL2FIdTV3bktrZkV4TGRzVzhtRHJOVW5EeWtUajUwQ2tpMWtmRnZMV2xTTHo2d2xYeXFHMVUKMWFCK25FTTdkMS9yL2pvRnNvWWZ0MlRUc2NOaTBIdnhZOFUxbU5TRDVIN0lYSzFlY0dUNTNmU2NsUFBrclZkNQorRjRZQnBkOUZJeTdMQm5MaGZLMEY0YUJlN2lUTFBpWUo3VFVwSWV6M2s3dWJSR0dCWmc9Cj1JQ3JSCi0tLS0tRU5EIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0K \ No newline at end of file +GPGKey=LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCgptUUVOQkZjUlJOSUJDQURyRW5JUjkxYjJ2WDZCckFBWXFEUlRLWmVGZE1GRzdTdFNxRm8zbFpIMktGZDdLQmVCCnhZV25VM1YveEpRKzFsRnVqbytuYTZ6N0w5cUJydGlrWWRJbjlNYzNlU3l3L2ZsaTFGa011b0ZtZE10ajZrMUYKeitORU0wZFNyRUxhdkJNUHpYYjRrakY4WkdLbmVSMzV2NFkzUlArbHZaRGl1bVpwdkZ6VHpVMEFSVVJreEgzTgpiWWlYMG1raTc1Z3krRUh3Q1JlU1BqQnhLOTQrc1FSb0NsSmRyUWJGYUh0WERxZmgyWFZRTW0yTm5tSmFmMlJiCk1Gbzc1ekVveEh6WWJuQnlXZFIvWGg2dWhsU3lEYUJZME8wZjFjM3ljR243VVQrN0NBZEdrYTZHdTJWWlVYRUgKR0xaUzRvdFZodG95Z2Era0dhaUo3U1lSU1F6ZDBTL3hQUHh0QUJFQkFBRzBLR1ZzWlcxbGJuUmhjbmtnWW5WcApiR1J6SUR4aWRXbHNaSE5BWld4bGJXVnVkR0Z5ZVM1cGJ6NkpBVGNFRXdFSkFDRUZBbGNSUk5JQ0d3TUZDd2tJCkJ3TUZGUWtLQ0FzRkZnTUNBUUFDSGdFQ0Y0QUFDZ2tRcDA5ejcvNXd1Unpmd1FmL1FlR3RkbFFpVjNISkMvaEYKeVE0Q0hPeFpKRnJwZS9VZC90YXprVWlwbGMyWS9tcnJldGdkR2hJb0o2TnBRV3BEVENMRm12RDVDRXE5bGV0cwplUlVOVUx3MjF1dG5pdVRyckRYWmUxdG9tMEZrRlNkeUNZOFVwRERPYzdMa3piUTh3S28xQVNreXlFajhmVlhMCkVvT2tic2pSUUpVWFMvNlNkb1JTZVZpdXREZXdqVHkwWXZlbFVNVnhjWDVINVRqSmZYbVpNR1V4dEdVZWYzUmEKUkRYUjY5a21GamY3VW12MkFpaVZzZW5kcXJmSFJMblpRUnNiYmxOQWxObDVKK1ZUbEtrdmN3WGl2V2V3bFZVYQpPTDhIUEZvOWQya3hJYmV4RzJ5THdudXdtZmF2U0ZKVjROWWVtU1BTS2w2bEpWYkkzUCt6eitVODdWT01yOEtmCnVMMERvN2tCRFFSWEVVVFNBUWdBdkEzb1o3ck4xaUU4TTNROTFIVzM3bEJWK0V0YWdpckpVYTYrbTJvdlBmYTYKVG5PUHN5Z1NZOEVpTVBLQjhyRHhWUmszMlhuendObDNNQ21XMFlqTjFTMnNkRnY4WW5QWEx6WEtKV1lxVGFDTgpkZ0pQaEZ6K0xkZ1BtdVcya0hIM0VOWjhrT0JLZVZKZFErVUN4WmtFZEpaVmhuc0lQNjBwSHBTMmw4b01HWllrCnd0UnBlNkJEdEpNbHBnVVZXSzFqSnJmL1VqL0pBNjIrcnB2QWwyN1R4ZFpncHNtWU5hT3BnOWd1bVY4YUd0VWsKNGw2WDBOalNrS2FrYTdtMkJVTEFIb3RZT0FLMThEMHo3d3NzbEdiU2ZDWUtOS3NYS29VYlg5ZnB4anhQVXByTQpIUUo3TkFlZkRnZmllREltRm1CcGNTWEViem5VenQ1dmdTS3lIR05zdXdBUkFRQUJpUUVmQkJnQkNRQUpCUUpYCkVVVFNBaHNNQUFvSkVLZFBjKy8rY0xrY2VKQUgvMFhQVTJmeithaXBoNGx0dDludmRrWS9pcUZKNC9uZzJwWWoKejlLOWU4Sld1NjVFQkJrVW4zSjgwY1Z3TVRjQ3ZaZHVEeU1IaXpvYlBpbEhVeVdBZHdYdExYZ0xUWTVUUmZrZApIUVRLVmhGcXEvTHJwclVCUm9BSlFmVGJMNlhkQ1g4RHk3cTg5OXlhaUhzQkpkMUl6RUJpS3BmVE9jMVJtVnQvCnR2YUcwK1doQlJlL2FIdTV3bktrZkV4TGRzVzhtRHJOVW5EeWtUajUwQ2tpMWtmRnZMV2xTTHo2d2xYeXFHMVUKMWFCK25FTTdkMS9yL2pvRnNvWWZ0MlRUc2NOaTBIdnhZOFUxbU5TRDVIN0lYSzFlY0dUNTNmU2NsUFBrclZkNQorRjRZQnBkOUZJeTdMQm5MaGZLMEY0YUJlN2lUTFBpWUo3VFVwSWV6M2s3dWJSR0dCWmc9Cj1JQ3JSCi0tLS0tRU5EIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0K +Priority=100 \ No newline at end of file diff --git a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset index b050c120c..2d639f8bd 100644 --- a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset +++ b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset @@ -1,4 +1,5 @@ enable systemd-resolved +enable flatpak-preinstalld.service enable NetworkManager.service enable NetworkManager-wait-online.service disable systemd-networkd diff --git a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/systemd/system/systemd-networkd-wait-online.service b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/systemd/system/systemd-networkd-wait-online.service new file mode 100644 index 000000000..4bb28c3fd --- /dev/null +++ b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/systemd/system/systemd-networkd-wait-online.service @@ -0,0 +1 @@ +# Masked \ No newline at end of file From a48839e7082c8c298ba64c67682509bc707dc771 Mon Sep 17 00:00:00 2001 From: jumpyvi Date: Fri, 31 Jul 2026 16:16:43 -0400 Subject: [PATCH 20/86] Initial work --- Justfile | 34 +++----- mkosi.conf.d/elementary/mkosi.conf | 18 +++++ .../mkosi.conf.d/ubuntu/mkosi.conf | 20 ----- .../usr/lib/repart.d/20-usr-verity-sig.conf | 3 - .../usr/lib/repart.d/21-usr-verity.conf | 6 -- .../mkosi.extra/usr/lib/repart.d/22-usr.conf | 7 -- mkosi.profiles/liveiso/mkosi.conf | 38 +++++++++ .../mkosi.extra/boot/loader/loader.conf | 1 + .../mkosi.extra/usr/lib/repart.d/00-esp.conf | 7 ++ .../usr/lib/repart.d/10-usr-verity-sig.conf | 6 ++ .../usr/lib/repart.d/11-usr-verity.conf | 8 ++ .../mkosi.extra/usr/lib/repart.d/12-usr.conf | 11 +++ .../mkosi.extra/usr/lib/repart.d/40-root.conf | 11 +++ .../mkosi.extra/usr/lib/repart.d/50-home.conf | 8 ++ .../system-preset/10-elementary.preset | 15 ++++ .../lib/systemd/system/preset-global.service | 17 ++++ .../systemd/system/systemd-firstboot.service | 1 + .../systemd-networkd-wait-online.service | 1 + .../usr/lib/systemd/zram-generator.conf | 3 + .../sysupdate.d/10-usr-verity-sig.transfer | 15 ++++ .../lib/sysupdate.d/11-usr-verity.transfer | 15 ++++ .../usr/lib/sysupdate.d/12-usr.transfer | 15 ++++ .../usr/lib/sysupdate.d/20-uki.transfer | 23 ++++++ .../usr/lib/tmpfiles.d/aliases.conf | 3 + .../mkosi.extra/usr/lib/tmpfiles.d/etc.conf | 79 +++++++++++++++++++ mkosi.profiles/liveiso/mkosi.finalize | 8 ++ mkosi.profiles/liveiso/mkosi.postinst.chroot | 46 +++++++++++ .../liveiso/mkosi.repart/00-esp.conf | 7 ++ .../mkosi.repart/10-usr-verity-sig.conf | 6 ++ .../liveiso/mkosi.repart/11-usr-verity.conf | 8 ++ .../liveiso/mkosi.repart/12-usr.conf | 10 +++ mkosi.profiles/liveiso/mkosi.sysupdate | 1 + 32 files changed, 392 insertions(+), 59 deletions(-) delete mode 100644 mkosi.profiles/elementaryos/mkosi.conf.d/ubuntu/mkosi.conf delete mode 100644 mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/20-usr-verity-sig.conf delete mode 100644 mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/21-usr-verity.conf delete mode 100644 mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/22-usr.conf create mode 100644 mkosi.profiles/liveiso/mkosi.conf create mode 100644 mkosi.profiles/liveiso/mkosi.extra/boot/loader/loader.conf create mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/00-esp.conf create mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf create mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf create mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/12-usr.conf create mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/40-root.conf create mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/50-home.conf create mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset create mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system/preset-global.service create mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service create mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system/systemd-networkd-wait-online.service create mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/zram-generator.conf create mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer create mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer create mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer create mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer create mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/tmpfiles.d/aliases.conf create mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/tmpfiles.d/etc.conf create mode 100755 mkosi.profiles/liveiso/mkosi.finalize create mode 100755 mkosi.profiles/liveiso/mkosi.postinst.chroot create mode 100644 mkosi.profiles/liveiso/mkosi.repart/00-esp.conf create mode 100644 mkosi.profiles/liveiso/mkosi.repart/10-usr-verity-sig.conf create mode 100644 mkosi.profiles/liveiso/mkosi.repart/11-usr-verity.conf create mode 100644 mkosi.profiles/liveiso/mkosi.repart/12-usr.conf create mode 120000 mkosi.profiles/liveiso/mkosi.sysupdate diff --git a/Justfile b/Justfile index b57d361b0..91b9a6c10 100644 --- a/Justfile +++ b/Justfile @@ -1,46 +1,34 @@ # resize: # qemu-img resize ./mkosi.output/Elementary_x86-64.raw +40G -alias serve := start-sysupdate-server default: #!/usr/bin/env bash set -xeuo pipefail just build-sysupdate -lazy-spin: - just _gen_keys - just build-sysupdate - build-sysupdate: rm -rf mkosi.output/ && \ sudo $(which mkosi) -B --debug --force --profile=elementaryos --profile=sysexts --workspace-directory=$HOME/.cache/mkosi-workspace && \ sudo chown -R $(whoami):$(whoami) ./mkosi.output/ -_gen_keys: - mkosi genkey || true +build-iso: + rm -rf mkosi.output/ && \ + sudo $(which mkosi) -B --debug --force --profile=liveiso --workspace-directory=$HOME/.cache/mkosi-workspace && \ + sudo chown -R $(whoami):$(whoami) ./mkosi.output/ + + +flash: + #!/bin/bash + read -p "Enter .raw image path: " raw_img + read -p "Enter destination (/dev/sdX): " dest_dev + sudo systemd-repart --copy-from "$raw_img" --definitions=./mkosi.profiles/liveiso/mkosi.extra/etc/repart-config/ --dry-run=no --empty=force "$dest_dev" clean: mkosi clean sudo rm -r mkosi.tools/ mkosi.cache/ -start-sysupdate-server: - #!/usr/bin/env bash - mkdir -p mkosi.output/se/ && \ - just sign-ext && \ - just sign-repo && \ - python -m http.server -d mkosi.output 7676 - - -sign-ext: - #!/usr/bin/env bash - cd mkosi.output/se/ - echo "Sysexts will not be signed, use verify=no." - echo "Generating SHA256..." - sha256sum *.raw > SHA256SUMS - cd ../../ - sign-repo: #!/usr/bin/env bash cd mkosi.output diff --git a/mkosi.conf.d/elementary/mkosi.conf b/mkosi.conf.d/elementary/mkosi.conf index d95b24937..3f572bede 100644 --- a/mkosi.conf.d/elementary/mkosi.conf +++ b/mkosi.conf.d/elementary/mkosi.conf @@ -1,2 +1,20 @@ [Match] Distribution=ubuntu + +[Content] +Packages=systemd-container + +VolatilePackages= + passwd + login + uidmap + systemd-boot + +InitrdVolatilePackages= + systemd + udev + +InitrdPackages= + linux-firmware + cryptsetup + cryptsetup-bin \ No newline at end of file diff --git a/mkosi.profiles/elementaryos/mkosi.conf.d/ubuntu/mkosi.conf b/mkosi.profiles/elementaryos/mkosi.conf.d/ubuntu/mkosi.conf deleted file mode 100644 index 3f572bede..000000000 --- a/mkosi.profiles/elementaryos/mkosi.conf.d/ubuntu/mkosi.conf +++ /dev/null @@ -1,20 +0,0 @@ -[Match] -Distribution=ubuntu - -[Content] -Packages=systemd-container - -VolatilePackages= - passwd - login - uidmap - systemd-boot - -InitrdVolatilePackages= - systemd - udev - -InitrdPackages= - linux-firmware - cryptsetup - cryptsetup-bin \ No newline at end of file diff --git a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/20-usr-verity-sig.conf b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/20-usr-verity-sig.conf deleted file mode 100644 index 318fec069..000000000 --- a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/20-usr-verity-sig.conf +++ /dev/null @@ -1,3 +0,0 @@ -[Partition] -Type=usr-verity-sig -Label=_empty diff --git a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/21-usr-verity.conf b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/21-usr-verity.conf deleted file mode 100644 index 6c813102e..000000000 --- a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/21-usr-verity.conf +++ /dev/null @@ -1,6 +0,0 @@ -[Partition] -Type=usr-verity -Label=_empty -NoAuto=1 -SizeMinBytes=400M -SizeMaxBytes=400M diff --git a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/22-usr.conf b/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/22-usr.conf deleted file mode 100644 index aff32b239..000000000 --- a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/22-usr.conf +++ /dev/null @@ -1,7 +0,0 @@ -[Partition] -Type=usr -Label=_empty -NoAuto=1 -SizeMinBytes=5G -SizeMaxBytes=20G -Weight=2000 diff --git a/mkosi.profiles/liveiso/mkosi.conf b/mkosi.profiles/liveiso/mkosi.conf new file mode 100644 index 000000000..00c9e702b --- /dev/null +++ b/mkosi.profiles/liveiso/mkosi.conf @@ -0,0 +1,38 @@ +[Match] +Profiles=liveiso + +[Output] +SplitArtifacts=uki,partitions +Format=disk + +[Content] +Bootable=yes +Bootloader=systemd-boot +UnifiedKernelImageFormat=%i_%v_%a +InitrdProfiles= +KernelInitrdModules= + default + ahci + nvme + xhci_pci + usb_storage + uas + sd_mod + dm-verity +KernelCommandLine= + splash + quiet + root=dissect + mount.usr=dissect + rw + audit=0 + systemd.image_policy=esp=unprotected:xbootldr=unprotected+unused+absent:usr=signed:root=unprotected+absent:home=unprotected+absent:=ignore + systemd.image_filter=usr=Elementary_*:usr-verity=Elementary_*:usr-verity-sig=Elementary_*:root=Elementary-*:home=Elementary-* + systemd.debug-shell=ttyS0 + rd.systemd.debug-shell=ttyS0 + ipe.enforce=0 + +[Validation] +# just for now, please do enable secureboot +SecureBoot=no +SignExpectedPcr=no diff --git a/mkosi.profiles/liveiso/mkosi.extra/boot/loader/loader.conf b/mkosi.profiles/liveiso/mkosi.extra/boot/loader/loader.conf new file mode 100644 index 000000000..b40638208 --- /dev/null +++ b/mkosi.profiles/liveiso/mkosi.extra/boot/loader/loader.conf @@ -0,0 +1 @@ +timeout 3 diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/00-esp.conf b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/00-esp.conf new file mode 100644 index 000000000..9e2ce2b67 --- /dev/null +++ b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/00-esp.conf @@ -0,0 +1,7 @@ +[Partition] +Type=esp +Format=vfat +CopyFiles=/efi:/ +CopyFiles=/boot:/ +SizeMinBytes=0.5G +SizeMaxBytes=0.5G diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf new file mode 100644 index 000000000..8379561f4 --- /dev/null +++ b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf @@ -0,0 +1,6 @@ +[Partition] +Type=usr-verity-sig +Label=%M_%A_verity_sig +Verity=signature +VerityMatchKey=usr +SplitName=%t.%U diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf new file mode 100644 index 000000000..067b935d1 --- /dev/null +++ b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf @@ -0,0 +1,8 @@ +[Partition] +Type=usr-verity +Label=%M_%A_verity +Verity=hash +VerityMatchKey=usr +SizeMinBytes=400M +SizeMaxBytes=400M +SplitName=%t.%U diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/12-usr.conf b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/12-usr.conf new file mode 100644 index 000000000..26addd5d5 --- /dev/null +++ b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/12-usr.conf @@ -0,0 +1,11 @@ +[Partition] +Type=usr +Label=%M_%A +Format=erofs +CopyFiles=/usr:/ +Verity=data +VerityMatchKey=usr +Minimize=yes +Compression=zstd +SplitName=%t.%U +SizeMaxBytes=3G diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/40-root.conf b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/40-root.conf new file mode 100644 index 000000000..65cf424d0 --- /dev/null +++ b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/40-root.conf @@ -0,0 +1,11 @@ +[Partition] +Type=root +Format=btrfs +SizeMinBytes=1G +SizeMaxBytes=1G +Weight=18000 +Subvolumes=/var +MakeDirectories=/var/log/journal +Encrypt=off +FactoryReset=yes +Label=Elementary-root diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/50-home.conf b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/50-home.conf new file mode 100644 index 000000000..2bbdccd39 --- /dev/null +++ b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/50-home.conf @@ -0,0 +1,8 @@ +[Partition] +Type=home +Format=btrfs +SizeMinBytes=0.5G +SizeMaxBytes=0.5G +Weight=45000 +FactoryReset=yes +Label=Elementary-home diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset new file mode 100644 index 000000000..2d639f8bd --- /dev/null +++ b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset @@ -0,0 +1,15 @@ +enable systemd-resolved +enable flatpak-preinstalld.service +enable NetworkManager.service +enable NetworkManager-wait-online.service +disable systemd-networkd + +enable systemd-timesyncd.service +disable systemd-homed-firstboot.service +disable systemd-firstboot.service + +enable systemd-homed.service + +disable avahi.* + +enable preset-global.service diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system/preset-global.service b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system/preset-global.service new file mode 100644 index 000000000..53a76fbdf --- /dev/null +++ b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system/preset-global.service @@ -0,0 +1,17 @@ +[Unit] +ConditionFirstBoot=no +ConditionPathIsReadWrite=/etc + +DefaultDependencies=no + +Before=basic.target +Conflicts=shutdown.target +Before=shutdown.target + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=systemctl preset-all --global + +[Install] +WantedBy=basic.target diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service new file mode 100644 index 000000000..4bb28c3fd --- /dev/null +++ b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service @@ -0,0 +1 @@ +# Masked \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system/systemd-networkd-wait-online.service b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system/systemd-networkd-wait-online.service new file mode 100644 index 000000000..4bb28c3fd --- /dev/null +++ b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system/systemd-networkd-wait-online.service @@ -0,0 +1 @@ +# Masked \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/zram-generator.conf b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/zram-generator.conf new file mode 100644 index 000000000..52ea5d619 --- /dev/null +++ b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/zram-generator.conf @@ -0,0 +1,3 @@ +[zram0] +zram-size = min(ram / 2, 16384) +compression-algorithm = zstd \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer new file mode 100644 index 000000000..ee9db5269 --- /dev/null +++ b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer @@ -0,0 +1,15 @@ +[Transfer] +ProtectVersion=%A + +[Source] +Type=url-file +Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download +MatchPattern=Elementary_@v.usr-%a-verity-sig.@u.raw + +[Target] +Type=partition +Path=auto +MatchPattern=Elementary_@v_verity_sig +MatchPartitionType=usr-verity-sig +PartitionFlags=0 +ReadOnly=1 \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer new file mode 100644 index 000000000..c246af48d --- /dev/null +++ b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer @@ -0,0 +1,15 @@ +[Transfer] +ProtectVersion=%A + +[Source] +Type=url-file +Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download +MatchPattern=Elementary_@v.usr-%a-verity.@u.raw + +[Target] +Type=partition +Path=auto +MatchPattern=Elementary_@v_verity +MatchPartitionType=usr-verity +PartitionFlags=0 +ReadOnly=1 \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer new file mode 100644 index 000000000..9e717e150 --- /dev/null +++ b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer @@ -0,0 +1,15 @@ +[Transfer] +ProtectVersion=%A + +[Source] +Type=url-file +Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download +MatchPattern=Elementary_@v.usr-%a.@u.raw.xz + +[Target] +Type=partition +Path=auto +MatchPattern=Elementary_@v +MatchPartitionType=usr +PartitionFlags=0 +ReadOnly=1 \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer new file mode 100644 index 000000000..801be7b83 --- /dev/null +++ b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer @@ -0,0 +1,23 @@ +[Transfer] +ProtectVersion=%A + +[Source] +Type=url-file +Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download +MatchPattern=Elementary_@v.efi + +[Target] +Type=regular-file +Path=/EFI/Linux +PathRelativeTo=boot +MatchPattern=Elementary_@v_%a+@l-@d.efi \ + Elementary_@v_%a+@l.efi \ + Elementary_@v_%a.efi \ + Elementary_@v+@l-@d.efi \ + Elementary_@v+@l.efi \ + Elementary_@v.efi +# MatchPartitionType=uki +Mode=0600 +TriesLeft=3 +TriesDone=0 +InstancesMax=2 \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/tmpfiles.d/aliases.conf b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/tmpfiles.d/aliases.conf new file mode 100644 index 000000000..ad5c58b98 --- /dev/null +++ b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/tmpfiles.d/aliases.conf @@ -0,0 +1,3 @@ +# Type Path Mode UID GID Age Target +L+ /usr/sbin/systemd-sysupdate - - - - /usr/lib/systemd/systemd-sysupdate +L+ /usr/sbin/sysupdate - - - - /usr/lib/systemd/systemd-sysupdate \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/tmpfiles.d/etc.conf b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/tmpfiles.d/etc.conf new file mode 100644 index 000000000..d26cb712c --- /dev/null +++ b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/tmpfiles.d/etc.conf @@ -0,0 +1,79 @@ +# This overrides the same file from systemd since we want to symlink everything +# into /etc instead of copying so updates to /usr propagate properly. +L /etc/os-release - - - - ../usr/lib/os-release +L+ /etc/mtab - - - - ../proc/self/mounts +# Contains the default systemd locale +L /etc/locale.conf +L /etc/nsswitch.conf +C /etc/profile +C /etc/profile.d +# Required by pam_env plugin +C /etc/security +L? /etc/bashrc +L? /etc/bash.bashrc +L? /etc/bash.bash_logout +# TODO: drop once https://github.com/scop/bash-completion/pull/1399 is merged, +# needed for shell completion of sd-run/run0 +L? /etc/bash_completion.d +# Canonical location to look for certificates +L? /etc/ca-certificates +L? /etc/crypto-policies +L? /etc/pki +L /etc/debuginfod +L /etc/ssh/ssh_config +L /etc/ssh/ssh_config.d +L /etc/ssh/sshd_config +L /etc/ssh/sshd_config.d +# Canonical location to look for certificates +L /etc/ssl +# niri-session requires /etc/shells +L /etc/shells +L /etc/sudoers +# Required by pam environment plugin +L /etc/environment +# Required to generate desktop environment application menus +C /etc/xdg +# Contains default font configuration +L /etc/fonts +# Configuration for man +L /etc/man_db.conf +# Configuration for ldconfig +L /etc/ld.so.conf +L /etc/ld.so.conf.d +# Required by authselect (Fedora/CentOS) +L? /etc/authselect +# Required by tuned +L? /etc/tuned +# Required by light +C /etc/lightdm +C /etc/dbus-1 +# Required by geoclue +L? /etc/geoclue +# Required by fwupd +L /etc/fwupd +# Required by gnome +C /etc/dconf +# Used by some services, like nftables +L? /etc/services +# Required by nftables service +L? /etc/nftables.conf +L? /etc/skel +# CUPS is pulled in by GNOME, and fails if the configs are not there +L? /etc/cups +# On some distributions various binaries in /usr/bin are managed via +# /etc/alternatives. +L? /etc/alternatives +# ModemManager needs its dbus policy file +L? /etc/dbus1/systemd.d/org.freedesktop.ModemManager1.conf +# man fails without this in /etc/ +L? /etc/manpath.config +# WPASupplicant also needs its configuration +L? /etc/wpa_supplicant/wpa_supplicant.conf +# Make sure flatpak's XDG_DATA_DIR integration works +L? /etc/profile.d/flatpak.sh + +C /etc/NetworkManager +C /etc/apparmor +C /etc/apparmor.d + +C /etc/sudoers.d diff --git a/mkosi.profiles/liveiso/mkosi.finalize b/mkosi.profiles/liveiso/mkosi.finalize new file mode 100755 index 000000000..e679c8d0f --- /dev/null +++ b/mkosi.profiles/liveiso/mkosi.finalize @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Capture the entirety of /etc in /usr/share/factory/etc so we can use +# systemd-tmpfiles to symlink individual directories from it to /etc. +mkdir -p "$BUILDROOT/usr/share/factory/" +cp --archive --no-target-directory --update=none "$BUILDROOT/etc" "$BUILDROOT/usr/share/factory/etc" +ln -sr "$BUILDROOT/usr" "$BUILDROOT/usr/share/factory/usr" diff --git a/mkosi.profiles/liveiso/mkosi.postinst.chroot b/mkosi.profiles/liveiso/mkosi.postinst.chroot new file mode 100755 index 000000000..bde06afa6 --- /dev/null +++ b/mkosi.profiles/liveiso/mkosi.postinst.chroot @@ -0,0 +1,46 @@ +#!/usr/bin/env bash +set -euo pipefail + +if command -v authselect >/dev/null; then + authselect select local + authselect enable-feature with-systemd-homed +fi + +if [[ -d /etc/pam.d ]]; then + find /etc/pam.d -mindepth 1 -exec mv {} /usr/lib/pam.d \; + rmdir /etc/pam.d +fi + +# Get rid of obsolete stuff in the pam stack. +find /usr/lib/pam.d/ -mindepth 1 -exec sed --in-place '/pam_shells.so/d' {} \; +find /usr/lib/pam.d/ -mindepth 1 -exec sed --in-place '/pam_securetty.so/d' {} \; + +# Fedora disables the userdb ssh dropin by default, but helpfully leaves it available in +# the package so that we can just symlink it to a name that will be picked up by systemd-tmpfiles. +if [[ -f /usr/lib/tmpfiles.d/20-systemd-userdb.conf.example ]]; then + ln --symbolic 20-systemd-userdb.conf.example /usr/lib/tmpfiles.d/20-systemd-userdb.conf +fi + + +( + . /usr/lib/os-release + cat >/usr/lib/os-release </usr/lib/issue < Date: Fri, 31 Jul 2026 16:25:43 -0400 Subject: [PATCH 21/86] build: Build in podman --- Justfile | 46 +++++++++++++++++----------------------------- 1 file changed, 17 insertions(+), 29 deletions(-) diff --git a/Justfile b/Justfile index b57d361b0..d0d3555ef 100644 --- a/Justfile +++ b/Justfile @@ -1,46 +1,34 @@ # resize: # qemu-img resize ./mkosi.output/Elementary_x86-64.raw +40G -alias serve := start-sysupdate-server - default: #!/usr/bin/env bash set -xeuo pipefail just build-sysupdate -lazy-spin: - just _gen_keys - just build-sysupdate - build-sysupdate: - rm -rf mkosi.output/ && \ - sudo $(which mkosi) -B --debug --force --profile=elementaryos --profile=sysexts --workspace-directory=$HOME/.cache/mkosi-workspace && \ - sudo chown -R $(whoami):$(whoami) ./mkosi.output/ - -_gen_keys: - mkosi genkey || true + rm -rf mkosi.output/ + just run-in-podman mkosi -B --debug --force --profile=elementaryos --profile=sysexts --workspace-directory=/workspace + sudo chown -R {{env_var('USER')}}:{{env_var('USER')}} ./mkosi.output/ + +run-in-podman +command: + mkdir -p {{env_var('HOME')}}/.cache/mkosi-workspace + + sudo podman run --rm -it \ + --privileged \ + --security-opt label=disable \ + -v /dev:/dev \ + -v "{{invocation_directory()}}:/work" \ + -w /work \ + -v "{{env_var('HOME')}}/.cache/mkosi-workspace:/workspace" \ + ghcr.io/jumpyvi/mkosi-ubuntu:26 \ + {{command}} clean: - mkosi clean + just run-in-podman mkosi clean sudo rm -r mkosi.tools/ mkosi.cache/ -start-sysupdate-server: - #!/usr/bin/env bash - mkdir -p mkosi.output/se/ && \ - just sign-ext && \ - just sign-repo && \ - python -m http.server -d mkosi.output 7676 - - -sign-ext: - #!/usr/bin/env bash - cd mkosi.output/se/ - echo "Sysexts will not be signed, use verify=no." - echo "Generating SHA256..." - sha256sum *.raw > SHA256SUMS - cd ../../ - sign-repo: #!/usr/bin/env bash cd mkosi.output From a31a6ef22095d7f1cd44951b23ed557631575bce Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Sun, 2 Aug 2026 13:05:24 -0400 Subject: [PATCH 22/86] Liveiso (#17) --- .gitignore | 3 +- Justfile | 5 +- README.md | 31 +++----- build.sh | 49 +++++++++++- mkosi.conf | 2 +- .../elementary/mkosi.conf.d/elementary.conf | 4 +- .../usr/lib/repart.d/00-esp.conf | 3 +- .../usr/lib/repart.d/10-usr-verity-sig.conf | 3 +- .../usr/lib/repart.d/11-usr-verity.conf | 5 +- mkosi.extra/usr/lib/repart.d/12-usr.conf | 5 ++ .../usr/lib/repart.d/20-usr-verity-sig.conf | 3 + .../usr/lib/repart.d/21-usr-verity.conf | 6 ++ .../usr/lib/repart.d/22-usr.conf | 6 +- .../usr/lib/repart.d/40-root.conf | 2 +- .../usr/lib/repart.d/50-home.conf | 0 .../system-preset/10-elementary.preset | 0 .../lib/systemd/system/preset-global.service | 0 .../systemd/system/systemd-firstboot.service | 0 .../systemd-networkd-wait-online.service | 0 .../usr/lib/systemd/zram-generator.conf | 0 .../sysupdate.d/10-usr-verity-sig.transfer | 0 .../lib/sysupdate.d/11-usr-verity.transfer | 0 .../usr/lib/sysupdate.d/12-usr.transfer | 0 .../usr/lib/sysupdate.d/20-uki.transfer | 0 .../usr/lib/tmpfiles.d/aliases.conf | 0 .../usr/lib/tmpfiles.d/etc.conf | 0 mkosi.postinst.chroot | 45 +++++++++++ .../elementaryos/mkosi.postinst.chroot | 46 ----------- .../elementaryos/mkosi.repart/00-esp.conf | 7 -- .../mkosi.repart/11-usr-verity.conf | 8 -- .../elementaryos/mkosi.repart/12-usr.conf | 10 --- mkosi.profiles/elementaryos/mkosi.sysupdate | 1 - .../elementaryos/mkosi.uki-profiles/.gitkeep | 3 - .../mkosi.extra/boot/loader/loader.conf | 5 +- .../lightdm/lightdm.conf.d/12-liveiso.conf | 3 + .../etc/repart-installer/00-esp.conf | 5 ++ .../repart-installer}/10-usr-verity-sig.conf | 3 +- .../etc/repart-installer/11-usr-verity.conf | 5 ++ .../etc/repart-installer/12-usr.conf | 5 ++ .../repart-installer/20-usr-verity-sig.conf | 3 + .../etc/repart-installer/21-usr-verity.conf | 6 ++ .../etc/repart-installer/22-usr.conf | 7 ++ .../etc/repart-installer/40-root.conf | 10 +++ .../etc/repart-installer/50-home.conf | 7 ++ .../liveiso/mkosi.extra/etc/sudoers.d/liveiso | 1 + .../mkosi.extra/usr/lib/repart.d/00-esp.conf | 7 -- .../usr/lib/repart.d/10-usr-verity-sig.conf | 6 -- .../usr/lib/repart.d/11-usr-verity.conf | 8 -- .../mkosi.extra/usr/lib/repart.d/12-usr.conf | 11 --- .../system-preset/10-elementary.preset | 1 + .../lib/systemd/system/liveiso-reset.service | 17 +++++ .../usr/lib/tmpfiles.d/aliases.conf | 3 - .../mkosi.extra/usr/lib/tmpfiles.d/etc.conf | 6 +- .../mkosi.extra/usr/sbin/elementary-install | 76 +++++++++++++++++++ mkosi.profiles/liveiso/mkosi.finalize | 2 +- mkosi.profiles/liveiso/mkosi.postinst.chroot | 3 + .../liveiso/mkosi.repart/00-esp.conf | 4 +- .../repart.d => mkosi.repart}/40-root.conf | 4 +- .../repart.d => mkosi.repart}/50-home.conf | 3 +- mkosi.profiles/liveiso/mkosi.sysupdate | 1 - .../liveiso/mkosi.uki-profiles/install.conf | 21 +++++ .../liveiso/mkosi.uki-profiles/live.conf | 18 +++++ .../{elementaryos => sysupdate}/mkosi.conf | 4 +- .../mkosi.extra/boot/loader/loader.conf | 0 .../mkosi.finalize | 0 65 files changed, 342 insertions(+), 160 deletions(-) mode change 100644 => 100755 build.sh rename {mkosi.profiles/elementaryos/mkosi.extra => mkosi.extra}/usr/lib/repart.d/00-esp.conf (59%) rename {mkosi.profiles/elementaryos/mkosi.extra => mkosi.extra}/usr/lib/repart.d/10-usr-verity-sig.conf (81%) rename {mkosi.profiles/elementaryos/mkosi.extra => mkosi.extra}/usr/lib/repart.d/11-usr-verity.conf (63%) create mode 100644 mkosi.extra/usr/lib/repart.d/12-usr.conf create mode 100644 mkosi.extra/usr/lib/repart.d/20-usr-verity-sig.conf create mode 100644 mkosi.extra/usr/lib/repart.d/21-usr-verity.conf rename mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/12-usr.conf => mkosi.extra/usr/lib/repart.d/22-usr.conf (57%) rename {mkosi.profiles/elementaryos/mkosi.extra => mkosi.extra}/usr/lib/repart.d/40-root.conf (91%) rename {mkosi.profiles/elementaryos/mkosi.extra => mkosi.extra}/usr/lib/repart.d/50-home.conf (100%) rename {mkosi.profiles/elementaryos/mkosi.extra => mkosi.extra}/usr/lib/systemd/system-preset/10-elementary.preset (100%) rename {mkosi.profiles/elementaryos/mkosi.extra => mkosi.extra}/usr/lib/systemd/system/preset-global.service (100%) rename {mkosi.profiles/elementaryos/mkosi.extra => mkosi.extra}/usr/lib/systemd/system/systemd-firstboot.service (100%) rename {mkosi.profiles/elementaryos/mkosi.extra => mkosi.extra}/usr/lib/systemd/system/systemd-networkd-wait-online.service (100%) rename {mkosi.profiles/elementaryos/mkosi.extra => mkosi.extra}/usr/lib/systemd/zram-generator.conf (100%) rename {mkosi.profiles/elementaryos/mkosi.extra => mkosi.extra}/usr/lib/sysupdate.d/10-usr-verity-sig.transfer (100%) rename {mkosi.profiles/elementaryos/mkosi.extra => mkosi.extra}/usr/lib/sysupdate.d/11-usr-verity.transfer (100%) rename {mkosi.profiles/elementaryos/mkosi.extra => mkosi.extra}/usr/lib/sysupdate.d/12-usr.transfer (100%) rename {mkosi.profiles/elementaryos/mkosi.extra => mkosi.extra}/usr/lib/sysupdate.d/20-uki.transfer (100%) rename {mkosi.profiles/elementaryos/mkosi.extra => mkosi.extra}/usr/lib/tmpfiles.d/aliases.conf (100%) rename {mkosi.profiles/elementaryos/mkosi.extra => mkosi.extra}/usr/lib/tmpfiles.d/etc.conf (100%) delete mode 100755 mkosi.profiles/elementaryos/mkosi.postinst.chroot delete mode 100644 mkosi.profiles/elementaryos/mkosi.repart/00-esp.conf delete mode 100644 mkosi.profiles/elementaryos/mkosi.repart/11-usr-verity.conf delete mode 100644 mkosi.profiles/elementaryos/mkosi.repart/12-usr.conf delete mode 120000 mkosi.profiles/elementaryos/mkosi.sysupdate delete mode 100644 mkosi.profiles/elementaryos/mkosi.uki-profiles/.gitkeep create mode 100644 mkosi.profiles/liveiso/mkosi.extra/etc/lightdm/lightdm.conf.d/12-liveiso.conf create mode 100644 mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/00-esp.conf rename mkosi.profiles/{elementaryos/mkosi.repart => liveiso/mkosi.extra/etc/repart-installer}/10-usr-verity-sig.conf (66%) create mode 100644 mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/11-usr-verity.conf create mode 100644 mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/12-usr.conf create mode 100644 mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/20-usr-verity-sig.conf create mode 100644 mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/21-usr-verity.conf create mode 100644 mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/22-usr.conf create mode 100644 mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/40-root.conf create mode 100644 mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/50-home.conf create mode 100644 mkosi.profiles/liveiso/mkosi.extra/etc/sudoers.d/liveiso delete mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/00-esp.conf delete mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf delete mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf delete mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/12-usr.conf create mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system/liveiso-reset.service delete mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/tmpfiles.d/aliases.conf create mode 100755 mkosi.profiles/liveiso/mkosi.extra/usr/sbin/elementary-install rename mkosi.profiles/liveiso/{mkosi.extra/usr/lib/repart.d => mkosi.repart}/40-root.conf (78%) rename mkosi.profiles/liveiso/{mkosi.extra/usr/lib/repart.d => mkosi.repart}/50-home.conf (67%) delete mode 120000 mkosi.profiles/liveiso/mkosi.sysupdate create mode 100644 mkosi.profiles/liveiso/mkosi.uki-profiles/install.conf create mode 100644 mkosi.profiles/liveiso/mkosi.uki-profiles/live.conf rename mkosi.profiles/{elementaryos => sysupdate}/mkosi.conf (88%) rename mkosi.profiles/{elementaryos => sysupdate}/mkosi.extra/boot/loader/loader.conf (100%) rename mkosi.profiles/{elementaryos => sysupdate}/mkosi.finalize (100%) diff --git a/.gitignore b/.gitignore index 3ecf0a0b2..4e8bef54d 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,5 @@ mkosi.key mkosi.crt mkosi.version mkosi.rootpw -.mkosi-private \ No newline at end of file +.mkosi-private +*.efi \ No newline at end of file diff --git a/Justfile b/Justfile index e34fb4502..c2d006ca6 100644 --- a/Justfile +++ b/Justfile @@ -11,6 +11,9 @@ build-sysupdate: just run-in-podman mkosi -B --debug --force --profile=elementaryos --profile=sysexts --workspace-directory=/workspace sudo chown -R {{env_var('USER')}}:{{env_var('USER')}} ./mkosi.output/ +genkey: + just run-in-podman mkosi genkey + run-in-podman +command: mkdir -p {{env_var('HOME')}}/.cache/mkosi-workspace @@ -21,7 +24,7 @@ run-in-podman +command: -v "{{invocation_directory()}}:/work" \ -w /work \ -v "{{env_var('HOME')}}/.cache/mkosi-workspace:/workspace" \ - ghcr.io/jumpyvi/mkosi-ubuntu:26 \ + ghcr.io/jumpyvi/mkosi-debian:26 \ {{command}} build-iso: diff --git a/README.md b/README.md index e3cbfac1a..2b0164539 100644 --- a/README.md +++ b/README.md @@ -23,28 +23,17 @@ --- -## Building Locally +## Building ISO Locally -1. Install `mkosi`, `just`, `fzf` -2. Generate keys `just _gen_keys` -3. Build `just build-sysupdate` +1. Install `podman` +2. Generate keys `just genkey` +3. Build `just build-iso` +4. `qemu-img resize mkosi.output/Elementary....raw 6G` -### Run with qemu -- Resize with `qemu-img resize "$(ls mkosi.output/Elementary_*_x86-64.raw)" +40G`, and you can then directly boot the .raw image with qemu or VirtManager/libvirt. -- Make sure to have TPM and UEFI enabled in libvirt (Gnome Boxes won't work - doesn't support TPM). +### Install (qemu) - -### Install / run on baremetal - -Copy the main .raw file to a 40+ GB USB stick with one of the options below. It will then expand and be bootable. Note: Don't run this after resizing for qemu or your image will be the wrong shape. - -`sudo dd if="$(ls mkosi.output/Elementary_*_x86-64.raw)" of=/dev/sdX bs=4M status=progress conv=fsync` where X is your usb drive on /dev/sda, etc - -or - -`sudo mkosi burn /dev/sdX` where X is your usb drive on /dev/sda, etc - -or - -Fedora Media Writer, etc. +1. Add the iso as a disk +2. Add a destination disk (Minimum tested is 70gb) +3. Boot the liveiso +4. Run `sudo elementary-install` diff --git a/build.sh b/build.sh old mode 100644 new mode 100755 index 9d8705fbf..5a30f3b50 --- a/build.sh +++ b/build.sh @@ -2,4 +2,51 @@ set -e -mkosi -B --debug --force --profile=sysupdate +echo "Building sysupdate profile to extract UKI..." + +rm -f ./mkosi.profiles/liveiso/mkosi.extra/usr/lib/elementary-install/Elementary_*.efi + +just run-in-podman mkosi -B --debug --force --profile=sysupdate + +SYSUPDATE_UKI=$(ls mkosi.output/*.efi | head -n 1) + +if [ -z "$SYSUPDATE_UKI" ]; then + echo "Error: sysupdate UKI" + exit 1 +fi + +echo "Found sysupdate UKI: $SYSUPDATE_UKI" +mkdir -p mkosi.profiles/liveiso/mkosi.extra/usr/lib/elementary-install +cp "$SYSUPDATE_UKI" mkosi.profiles/liveiso/mkosi.extra/usr/lib/elementary-install/ + +echo "Building liveiso profile..." +just run-in-podman mkosi -B --debug --force --profile=liveiso + + + +RAW_IMAGE=$(find mkosi.output -maxdepth 1 -type f \ + | grep -E '/[^/]+_[0-9]{14}\.raw$' \ + | head -n1) + +if [ -n "$RAW_IMAGE" ]; then + ISO_IMAGE="${RAW_IMAGE%.raw}.iso" + cp "$RAW_IMAGE" "$ISO_IMAGE" + echo "Converting $RAW_IMAGE to ISO: $ISO_IMAGE" + + systemd-repart \ + --no-pager \ + --dry-run=no \ + --size=6.7G \ + --empty=allow \ + --definitions=./mkosi.profiles/liveiso/mkosi.repart \ + --el-torito=true \ + --private-key=./mkosi.key \ + --certificate=./mkosi.crt \ + --el-torito-volume="Elementary-root" \ + --el-torito-publisher="Elementary" \ + "$ISO_IMAGE" +fi +chown -R $USER:$USER mkosi.output + + +echo "Build complete" \ No newline at end of file diff --git a/mkosi.conf b/mkosi.conf index 4a6da1029..915cd21a0 100644 --- a/mkosi.conf +++ b/mkosi.conf @@ -11,7 +11,7 @@ ToolsTree=default CacheDirectory=mkosi.cache Incremental=yes ToolsTreeDistribution=debian -ToolsTreeRelease=trixie +ToolsTreeRelease=forky [Output] Format=none diff --git a/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf b/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf index acb1c457d..e07087d57 100644 --- a/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf +++ b/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf @@ -23,6 +23,7 @@ Packages= btrfs-progs x11-common iputils-ping + fzf ubuntu-keyring flatpak locales-all @@ -38,4 +39,5 @@ Packages= sudo-rs xdg-desktop-portal-gtk xdg-user-dirs - systemd-zram-generator \ No newline at end of file + systemd-zram-generator + systemd-repart \ No newline at end of file diff --git a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/00-esp.conf b/mkosi.extra/usr/lib/repart.d/00-esp.conf similarity index 59% rename from mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/00-esp.conf rename to mkosi.extra/usr/lib/repart.d/00-esp.conf index ec520239e..d549a0a1b 100644 --- a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/00-esp.conf +++ b/mkosi.extra/usr/lib/repart.d/00-esp.conf @@ -1,6 +1,5 @@ [Partition] Type=esp Format=vfat -CopyFiles=/boot:/ SizeMinBytes=1G -SizeMaxBytes=1G +SizeMaxBytes=1G \ No newline at end of file diff --git a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf b/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf similarity index 81% rename from mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf rename to mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf index c6647667e..cd62c1dee 100644 --- a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf +++ b/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf @@ -1,4 +1,5 @@ [Partition] Type=usr-verity-sig -Label=%M_%A_verity_sig CopyBlocks=auto +Label=%M_%A_verity_sig +SplitName=%t.%U diff --git a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf b/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf similarity index 63% rename from mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf rename to mkosi.extra/usr/lib/repart.d/11-usr-verity.conf index d3a162d6a..82fc0c6c9 100644 --- a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf +++ b/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf @@ -1,6 +1,5 @@ [Partition] Type=usr-verity -Label=%M_%A_verity CopyBlocks=auto -SizeMinBytes=400M -SizeMaxBytes=400M +Label=%M_%A_verity +SplitName=%t.%U diff --git a/mkosi.extra/usr/lib/repart.d/12-usr.conf b/mkosi.extra/usr/lib/repart.d/12-usr.conf new file mode 100644 index 000000000..cd79d5309 --- /dev/null +++ b/mkosi.extra/usr/lib/repart.d/12-usr.conf @@ -0,0 +1,5 @@ +[Partition] +Type=usr +CopyBlocks=auto +Label=%M_%A +SplitName=%t.%U diff --git a/mkosi.extra/usr/lib/repart.d/20-usr-verity-sig.conf b/mkosi.extra/usr/lib/repart.d/20-usr-verity-sig.conf new file mode 100644 index 000000000..fd8815d3c --- /dev/null +++ b/mkosi.extra/usr/lib/repart.d/20-usr-verity-sig.conf @@ -0,0 +1,3 @@ +[Partition] +Type=usr-verity-sig +Label=_empty \ No newline at end of file diff --git a/mkosi.extra/usr/lib/repart.d/21-usr-verity.conf b/mkosi.extra/usr/lib/repart.d/21-usr-verity.conf new file mode 100644 index 000000000..fff802a78 --- /dev/null +++ b/mkosi.extra/usr/lib/repart.d/21-usr-verity.conf @@ -0,0 +1,6 @@ +[Partition] +Type=usr-verity +Label=_empty +NoAuto=1 +SizeMinBytes=400M +SizeMaxBytes=400M \ No newline at end of file diff --git a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/12-usr.conf b/mkosi.extra/usr/lib/repart.d/22-usr.conf similarity index 57% rename from mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/12-usr.conf rename to mkosi.extra/usr/lib/repart.d/22-usr.conf index 17fd4a3c2..183e2a003 100644 --- a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/12-usr.conf +++ b/mkosi.extra/usr/lib/repart.d/22-usr.conf @@ -1,7 +1,7 @@ [Partition] Type=usr -Label=%M_%A +Label=_empty +NoAuto=1 SizeMinBytes=5G SizeMaxBytes=20G -Weight=2000 -CopyBlocks=auto +Weight=2000 \ No newline at end of file diff --git a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/40-root.conf b/mkosi.extra/usr/lib/repart.d/40-root.conf similarity index 91% rename from mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/40-root.conf rename to mkosi.extra/usr/lib/repart.d/40-root.conf index 735fb2183..e774ac437 100644 --- a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/40-root.conf +++ b/mkosi.extra/usr/lib/repart.d/40-root.conf @@ -5,6 +5,6 @@ SizeMinBytes=9G Weight=18000 Subvolumes=/var MakeDirectories=/var/log/journal -Encrypt=tpm2 +Encrypt=off FactoryReset=yes Label=%M-root diff --git a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/50-home.conf b/mkosi.extra/usr/lib/repart.d/50-home.conf similarity index 100% rename from mkosi.profiles/elementaryos/mkosi.extra/usr/lib/repart.d/50-home.conf rename to mkosi.extra/usr/lib/repart.d/50-home.conf diff --git a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset b/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset similarity index 100% rename from mkosi.profiles/elementaryos/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset rename to mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset diff --git a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/systemd/system/preset-global.service b/mkosi.extra/usr/lib/systemd/system/preset-global.service similarity index 100% rename from mkosi.profiles/elementaryos/mkosi.extra/usr/lib/systemd/system/preset-global.service rename to mkosi.extra/usr/lib/systemd/system/preset-global.service diff --git a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service b/mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service similarity index 100% rename from mkosi.profiles/elementaryos/mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service rename to mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service diff --git a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/systemd/system/systemd-networkd-wait-online.service b/mkosi.extra/usr/lib/systemd/system/systemd-networkd-wait-online.service similarity index 100% rename from mkosi.profiles/elementaryos/mkosi.extra/usr/lib/systemd/system/systemd-networkd-wait-online.service rename to mkosi.extra/usr/lib/systemd/system/systemd-networkd-wait-online.service diff --git a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/systemd/zram-generator.conf b/mkosi.extra/usr/lib/systemd/zram-generator.conf similarity index 100% rename from mkosi.profiles/elementaryos/mkosi.extra/usr/lib/systemd/zram-generator.conf rename to mkosi.extra/usr/lib/systemd/zram-generator.conf diff --git a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer b/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer similarity index 100% rename from mkosi.profiles/elementaryos/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer rename to mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer diff --git a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer b/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer similarity index 100% rename from mkosi.profiles/elementaryos/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer rename to mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer diff --git a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer b/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer similarity index 100% rename from mkosi.profiles/elementaryos/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer rename to mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer diff --git a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer b/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer similarity index 100% rename from mkosi.profiles/elementaryos/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer rename to mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer diff --git a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/tmpfiles.d/aliases.conf b/mkosi.extra/usr/lib/tmpfiles.d/aliases.conf similarity index 100% rename from mkosi.profiles/elementaryos/mkosi.extra/usr/lib/tmpfiles.d/aliases.conf rename to mkosi.extra/usr/lib/tmpfiles.d/aliases.conf diff --git a/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/tmpfiles.d/etc.conf b/mkosi.extra/usr/lib/tmpfiles.d/etc.conf similarity index 100% rename from mkosi.profiles/elementaryos/mkosi.extra/usr/lib/tmpfiles.d/etc.conf rename to mkosi.extra/usr/lib/tmpfiles.d/etc.conf diff --git a/mkosi.postinst.chroot b/mkosi.postinst.chroot index bf18d6b05..faafb1b5b 100755 --- a/mkosi.postinst.chroot +++ b/mkosi.postinst.chroot @@ -4,3 +4,48 @@ set -xeuo pipefail fc-cache --force --really-force --system-only --verbose glib-compile-schemas /usr/share/glib-2.0/schemas/ + + +if command -v authselect >/dev/null; then + authselect select local + authselect enable-feature with-systemd-homed +fi + +if [[ -d /etc/pam.d ]]; then + find /etc/pam.d -mindepth 1 -exec mv {} /usr/lib/pam.d \; + rmdir /etc/pam.d +fi + +# Get rid of obsolete stuff in the pam stack. +find /usr/lib/pam.d/ -mindepth 1 -exec sed --in-place '/pam_shells.so/d' {} \; +find /usr/lib/pam.d/ -mindepth 1 -exec sed --in-place '/pam_securetty.so/d' {} \; + +# Fedora disables the userdb ssh dropin by default, but helpfully leaves it available in +# the package so that we can just symlink it to a name that will be picked up by systemd-tmpfiles. +if [[ -f /usr/lib/tmpfiles.d/20-systemd-userdb.conf.example ]]; then + ln --symbolic 20-systemd-userdb.conf.example /usr/lib/tmpfiles.d/20-systemd-userdb.conf +fi + + +( + . /usr/lib/os-release + cat >/usr/lib/os-release </usr/lib/issue </dev/null; then - authselect select local - authselect enable-feature with-systemd-homed -fi - -if [[ -d /etc/pam.d ]]; then - find /etc/pam.d -mindepth 1 -exec mv {} /usr/lib/pam.d \; - rmdir /etc/pam.d -fi - -# Get rid of obsolete stuff in the pam stack. -find /usr/lib/pam.d/ -mindepth 1 -exec sed --in-place '/pam_shells.so/d' {} \; -find /usr/lib/pam.d/ -mindepth 1 -exec sed --in-place '/pam_securetty.so/d' {} \; - -# Fedora disables the userdb ssh dropin by default, but helpfully leaves it available in -# the package so that we can just symlink it to a name that will be picked up by systemd-tmpfiles. -if [[ -f /usr/lib/tmpfiles.d/20-systemd-userdb.conf.example ]]; then - ln --symbolic 20-systemd-userdb.conf.example /usr/lib/tmpfiles.d/20-systemd-userdb.conf -fi - - -( - . /usr/lib/os-release - cat >/usr/lib/os-release </usr/lib/issue < /mnt/esp/loader/loader.conf <<'EOF' +timeout 6 +EOF + +umount /mnt/esp + + +target_root=$(lsblk -n -o PATH,PARTLABEL "$dest_dev" | awk '$2=="Elementary-root" {print $1}') + +if [ -n "$target_root" ]; then + mkdir -p /mnt/root + mount "$target_root" /mnt/root + + rm -f /mnt/root/etc/lightdm/lightdm.conf.d/12-liveiso.conf + rm -f /mnt/root/etc/sudoers.d/liveiso + + if chroot /mnt/root id liveiso &>/dev/null; then + chroot /mnt/root userdel -f liveiso + fi + + umount /mnt/root +else + echo "Fatal Error, could not cleanup" + exit 1 +fi + + +echo "Install done, reboot now" \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.finalize b/mkosi.profiles/liveiso/mkosi.finalize index e679c8d0f..126bd4f4d 100755 --- a/mkosi.profiles/liveiso/mkosi.finalize +++ b/mkosi.profiles/liveiso/mkosi.finalize @@ -5,4 +5,4 @@ set -euo pipefail # systemd-tmpfiles to symlink individual directories from it to /etc. mkdir -p "$BUILDROOT/usr/share/factory/" cp --archive --no-target-directory --update=none "$BUILDROOT/etc" "$BUILDROOT/usr/share/factory/etc" -ln -sr "$BUILDROOT/usr" "$BUILDROOT/usr/share/factory/usr" +ln -sr "$BUILDROOT/usr" "$BUILDROOT/usr/share/factory/usr" \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.postinst.chroot b/mkosi.profiles/liveiso/mkosi.postinst.chroot index bde06afa6..51c88d78e 100755 --- a/mkosi.profiles/liveiso/mkosi.postinst.chroot +++ b/mkosi.profiles/liveiso/mkosi.postinst.chroot @@ -44,3 +44,6 @@ EOF EOF ) + +mkdir -p /etc/credstore +touch /etc/credstore/passwd.plaintext-password.liveiso \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.repart/00-esp.conf b/mkosi.profiles/liveiso/mkosi.repart/00-esp.conf index e87e8dae2..ca2071abe 100644 --- a/mkosi.profiles/liveiso/mkosi.repart/00-esp.conf +++ b/mkosi.profiles/liveiso/mkosi.repart/00-esp.conf @@ -3,5 +3,5 @@ Type=esp Format=vfat CopyFiles=/efi:/ CopyFiles=/boot:/ -SizeMinBytes=2G -SizeMaxBytes=2G +SizeMinBytes=512M +SizeMaxBytes=1G diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/40-root.conf b/mkosi.profiles/liveiso/mkosi.repart/40-root.conf similarity index 78% rename from mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/40-root.conf rename to mkosi.profiles/liveiso/mkosi.repart/40-root.conf index 65cf424d0..418ba667b 100644 --- a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/40-root.conf +++ b/mkosi.profiles/liveiso/mkosi.repart/40-root.conf @@ -2,10 +2,10 @@ Type=root Format=btrfs SizeMinBytes=1G -SizeMaxBytes=1G +SizeMaxBytes=3G Weight=18000 Subvolumes=/var MakeDirectories=/var/log/journal Encrypt=off FactoryReset=yes -Label=Elementary-root +Label=%M-root diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/50-home.conf b/mkosi.profiles/liveiso/mkosi.repart/50-home.conf similarity index 67% rename from mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/50-home.conf rename to mkosi.profiles/liveiso/mkosi.repart/50-home.conf index 2bbdccd39..d8e0d5411 100644 --- a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/50-home.conf +++ b/mkosi.profiles/liveiso/mkosi.repart/50-home.conf @@ -2,7 +2,6 @@ Type=home Format=btrfs SizeMinBytes=0.5G -SizeMaxBytes=0.5G Weight=45000 FactoryReset=yes -Label=Elementary-home +Label=%M-home diff --git a/mkosi.profiles/liveiso/mkosi.sysupdate b/mkosi.profiles/liveiso/mkosi.sysupdate deleted file mode 120000 index c9ae06122..000000000 --- a/mkosi.profiles/liveiso/mkosi.sysupdate +++ /dev/null @@ -1 +0,0 @@ -/home/jumpyvi/Projects/elementary-atomic-os/mkosi.profiles/elementaryos/mkosi.extra/usr/lib/sysupdate.d \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.uki-profiles/install.conf b/mkosi.profiles/liveiso/mkosi.uki-profiles/install.conf new file mode 100644 index 000000000..eb3669eaf --- /dev/null +++ b/mkosi.profiles/liveiso/mkosi.uki-profiles/install.conf @@ -0,0 +1,21 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later + +[UKIProfile] +Profile= + ID=live + TITLE=Live System + +Cmdline= + splash + quiet + root=dissect + mount.usr=dissect + rw + audit=0 + systemd.image_policy=esp=unprotected:xbootldr=unprotected+unused+absent:usr=signed:root=encrypted+absent:home=unprotected+absent:=ignore + systemd.image_filter=usr=Elementary_*:usr-verity=Elementary_*:usr-verity-sig=Elementary_*:root=Elementary-*:home=Elementary-* + systemd.debug-shell=ttyS0 + rd.systemd.debug-shell=ttyS0 + ipe.enforce=0 + +SignExpectedPcr=no \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.uki-profiles/live.conf b/mkosi.profiles/liveiso/mkosi.uki-profiles/live.conf new file mode 100644 index 000000000..9d7c41bb2 --- /dev/null +++ b/mkosi.profiles/liveiso/mkosi.uki-profiles/live.conf @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later + +[UKIProfile] +Profile= + ID=live + TITLE=Live System + +Cmdline= + root=tmpfs + mount.usr=dissect + rw + audit=0 + systemd.image_policy=esp=unprotected:xbootldr=unprotected+unused+absent:usr=signed:=ignore + systemd.image_filter=usr=Elementary_*:usr-verity=Elementary_*:usr-verity-sig=Elementary_*:root=Elementary-*:home=Elementary-* + ipe.enforce=0 + liveiso.live=1 + +SignExpectedPcr=no \ No newline at end of file diff --git a/mkosi.profiles/elementaryos/mkosi.conf b/mkosi.profiles/sysupdate/mkosi.conf similarity index 88% rename from mkosi.profiles/elementaryos/mkosi.conf rename to mkosi.profiles/sysupdate/mkosi.conf index adcfc9e99..876df843b 100644 --- a/mkosi.profiles/elementaryos/mkosi.conf +++ b/mkosi.profiles/sysupdate/mkosi.conf @@ -1,5 +1,5 @@ [Match] -Profiles=elementaryos +Profiles=sysupdate [Output] SplitArtifacts=uki,partitions @@ -26,7 +26,7 @@ KernelCommandLine= mount.usr=dissect rw audit=0 - systemd.image_policy=esp=unprotected:xbootldr=unprotected+unused+absent:usr=signed:root=encrypted+absent:home=unprotected+absent:=ignore + systemd.image_policy=esp=unprotected:xbootldr=unprotected+unused+absent:usr=signed:root=unprotected+absent:home=unprotected+absent:=ignore systemd.image_filter=usr=Elementary_*:usr-verity=Elementary_*:usr-verity-sig=Elementary_*:root=Elementary-*:home=Elementary-* systemd.debug-shell=ttyS0 rd.systemd.debug-shell=ttyS0 diff --git a/mkosi.profiles/elementaryos/mkosi.extra/boot/loader/loader.conf b/mkosi.profiles/sysupdate/mkosi.extra/boot/loader/loader.conf similarity index 100% rename from mkosi.profiles/elementaryos/mkosi.extra/boot/loader/loader.conf rename to mkosi.profiles/sysupdate/mkosi.extra/boot/loader/loader.conf diff --git a/mkosi.profiles/elementaryos/mkosi.finalize b/mkosi.profiles/sysupdate/mkosi.finalize similarity index 100% rename from mkosi.profiles/elementaryos/mkosi.finalize rename to mkosi.profiles/sysupdate/mkosi.finalize From 39e41cbbc2d60b9e8cf05189a04cf6ac0fde2d1a Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Tue, 4 Aug 2026 17:17:44 -0400 Subject: [PATCH 23/86] WIP: Initial work on cdrom generation (#19) --- .gitignore | 1 + Justfile | 14 +--- README.md | 11 ++- build-bmedia.sh | 47 ++++++++++++ build.sh | 52 ------------- mkosi.conf.d/elementary/mkosi.conf | 3 +- mkosi.extra/usr/lib/repart.d/22-usr.conf | 7 -- mkosi.extra/usr/lib/repart.d/40-root.conf | 10 --- mkosi.extra/usr/lib/repart.d/50-home.conf | 7 -- mkosi.profiles/liveiso/mkosi.conf | 38 ---------- .../etc/repart-installer/00-esp.conf | 5 -- .../repart-installer/20-usr-verify-sig-b.conf | 0 .../repart-installer/20-usr-verity-sig.conf | 3 - .../etc/repart-installer/21-usr-verity-b.conf | 0 .../etc/repart-installer/21-usr-verity.conf | 6 -- .../{22-usr.conf => 22-usr-b.conf} | 3 +- .../etc/repart-installer/40-root.conf | 3 +- .../etc/repart-installer/50-home.conf | 2 +- .../mkosi.extra/usr/lib/repart.d/00-esp.conf | 5 ++ .../lib/repart.d}/10-usr-verity-sig.conf | 2 + .../lib/repart.d}/11-usr-verity.conf | 2 + .../mkosi.extra}/usr/lib/repart.d/12-usr.conf | 2 + .../mkosi.extra/usr/sbin/elementary-install | 76 ++++++------------- .../liveiso/mkosi.repart/40-root.conf | 11 --- .../liveiso/mkosi.repart/50-home.conf | 7 -- mkosi.profiles/sysupdate/mkosi.conf | 2 +- .../mkosi.extra}/usr/lib/repart.d/00-esp.conf | 4 +- .../usr/lib/repart.d/10-usr-verity-sig.conf | 2 + .../usr/lib/repart.d/11-usr-verity.conf | 2 + .../mkosi.extra/usr/lib/repart.d}/12-usr.conf | 2 + .../mkosi.repart/00-esp.conf | 4 +- .../mkosi.repart/10-usr-verity-sig.conf | 0 .../mkosi.repart/11-usr-verity.conf | 0 .../mkosi.repart/12-usr.conf | 0 34 files changed, 109 insertions(+), 224 deletions(-) create mode 100755 build-bmedia.sh delete mode 100755 build.sh delete mode 100644 mkosi.extra/usr/lib/repart.d/22-usr.conf delete mode 100644 mkosi.extra/usr/lib/repart.d/40-root.conf delete mode 100644 mkosi.extra/usr/lib/repart.d/50-home.conf delete mode 100644 mkosi.profiles/liveiso/mkosi.conf delete mode 100644 mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/00-esp.conf rename mkosi.extra/usr/lib/repart.d/20-usr-verity-sig.conf => mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/20-usr-verify-sig-b.conf (100%) delete mode 100644 mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/20-usr-verity-sig.conf rename mkosi.extra/usr/lib/repart.d/21-usr-verity.conf => mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/21-usr-verity-b.conf (100%) delete mode 100644 mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/21-usr-verity.conf rename mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/{22-usr.conf => 22-usr-b.conf} (67%) create mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/00-esp.conf rename mkosi.profiles/liveiso/mkosi.extra/{etc/repart-installer => usr/lib/repart.d}/10-usr-verity-sig.conf (70%) rename mkosi.profiles/liveiso/mkosi.extra/{etc/repart-installer => usr/lib/repart.d}/11-usr-verity.conf (68%) rename {mkosi.extra => mkosi.profiles/liveiso/mkosi.extra}/usr/lib/repart.d/12-usr.conf (67%) delete mode 100644 mkosi.profiles/liveiso/mkosi.repart/40-root.conf delete mode 100644 mkosi.profiles/liveiso/mkosi.repart/50-home.conf rename {mkosi.extra => mkosi.profiles/sysupdate/mkosi.extra}/usr/lib/repart.d/00-esp.conf (50%) rename {mkosi.extra => mkosi.profiles/sysupdate/mkosi.extra}/usr/lib/repart.d/10-usr-verity-sig.conf (70%) rename {mkosi.extra => mkosi.profiles/sysupdate/mkosi.extra}/usr/lib/repart.d/11-usr-verity.conf (68%) rename mkosi.profiles/{liveiso/mkosi.extra/etc/repart-installer => sysupdate/mkosi.extra/usr/lib/repart.d}/12-usr.conf (67%) rename mkosi.profiles/{liveiso => sysupdate}/mkosi.repart/00-esp.conf (66%) rename mkosi.profiles/{liveiso => sysupdate}/mkosi.repart/10-usr-verity-sig.conf (100%) rename mkosi.profiles/{liveiso => sysupdate}/mkosi.repart/11-usr-verity.conf (100%) rename mkosi.profiles/{liveiso => sysupdate}/mkosi.repart/12-usr.conf (100%) diff --git a/.gitignore b/.gitignore index 4e8bef54d..a2ccebab3 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ output _build-*/** *.img *.raw +*.iso mkosi.local/ mkosi.local.conf mkosi.output/ diff --git a/Justfile b/Justfile index c2d006ca6..683f9d677 100644 --- a/Justfile +++ b/Justfile @@ -27,18 +27,10 @@ run-in-podman +command: ghcr.io/jumpyvi/mkosi-debian:26 \ {{command}} -build-iso: - rm -rf mkosi.output/ && \ - just run-in-podman mkosi -B --debug --force --profile=liveiso --workspace-directory=/workspace && \ - sudo chown -R {{env_var('USER')}}:{{env_var('USER')}} ./mkosi.output/ - - -flash: - #!/bin/bash - read -p "Enter .raw image path: " raw_img - read -p "Enter destination (/dev/sdX): " dest_dev +build-bootablemedia: + sudo rm -rf mkosi.output/ && \ + sudo ./build-bmedia.sh - sudo systemd-repart --copy-from "$raw_img" --definitions=./mkosi.profiles/liveiso/mkosi.extra/etc/repart-config/ --dry-run=no --empty=force "$dest_dev" clean: just run-in-podman mkosi clean diff --git a/README.md b/README.md index 2b0164539..11e08068a 100644 --- a/README.md +++ b/README.md @@ -23,12 +23,17 @@ --- -## Building ISO Locally +## Building bootable media + +> ⚠️ The live bootable media is NOT compatible with the CDROM driver from qemu, use virtio or SATA. If you keep the .iso.raw extension (default), Gnome Boxes will auto-detect it correctly ⚠️ 1. Install `podman` 2. Generate keys `just genkey` -3. Build `just build-iso` -4. `qemu-img resize mkosi.output/Elementary....raw 6G` +3. Build `just build-bootablemedia` +4. Either: + 1. Flash with Fedora Media Writer or Impression + 2. Boot the Elementary_*.iso.raw with Gnome Boxes
+ ### Install (qemu) diff --git a/build-bmedia.sh b/build-bmedia.sh new file mode 100755 index 000000000..36ccf8065 --- /dev/null +++ b/build-bmedia.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +set -e + +echo "Building sysupdate profile to extract UKI..." +# just run-in-podman mkosi -B --debug --force --profile=sysupdate + + +RAW_IMAGE=$(find mkosi.output -maxdepth 1 -type f \ + | grep -E '/[^/]+_[0-9]{14}\.raw$' \ + | head -n1) + +if [ -z "$RAW_IMAGE" ]; then + echo "Fatal Error: no timestamped .raw image found in mkosi.output" >&2 + exit 1 +fi + +chown -R "$USER":"$USER" mkosi.output + +echo "Building final live ISO..." + +BASE_ISO="base.iso" +OUT_ISO="mkosi.output/elementary-liveiso.iso" +INSTALL_SCRIPT="mkosi.profiles/liveiso/mkosi.extra/usr/sbin/elementary-install" +REPART_DIR="mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer" + +rm -f "$OUT_ISO" + +podman run --rm \ + -v "$PWD:/work:Z" \ + -w /work \ + docker.io/alpine:latest \ + sh -c ' + apk add --no-cache xorriso && \ + xorriso -indev "'"$BASE_ISO"'" \ + -outdev "'"$OUT_ISO"'" \ + -boot_image any replay \ + -map "'"$RAW_IMAGE"'" "/extra/'"$(basename "$RAW_IMAGE")"'" \ + -map "'"$INSTALL_SCRIPT"'" "/extra/install.sh" \ + -map "'"$REPART_DIR"'" "/extra/repart.d" \ + -chmod 0755 "/extra/install.sh" -- \ + -commit + ' + +chmod 666 "$OUT_ISO" + +echo "Done: $OUT_ISO" \ No newline at end of file diff --git a/build.sh b/build.sh deleted file mode 100755 index 5a30f3b50..000000000 --- a/build.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/bash - -set -e - -echo "Building sysupdate profile to extract UKI..." - -rm -f ./mkosi.profiles/liveiso/mkosi.extra/usr/lib/elementary-install/Elementary_*.efi - -just run-in-podman mkosi -B --debug --force --profile=sysupdate - -SYSUPDATE_UKI=$(ls mkosi.output/*.efi | head -n 1) - -if [ -z "$SYSUPDATE_UKI" ]; then - echo "Error: sysupdate UKI" - exit 1 -fi - -echo "Found sysupdate UKI: $SYSUPDATE_UKI" -mkdir -p mkosi.profiles/liveiso/mkosi.extra/usr/lib/elementary-install -cp "$SYSUPDATE_UKI" mkosi.profiles/liveiso/mkosi.extra/usr/lib/elementary-install/ - -echo "Building liveiso profile..." -just run-in-podman mkosi -B --debug --force --profile=liveiso - - - -RAW_IMAGE=$(find mkosi.output -maxdepth 1 -type f \ - | grep -E '/[^/]+_[0-9]{14}\.raw$' \ - | head -n1) - -if [ -n "$RAW_IMAGE" ]; then - ISO_IMAGE="${RAW_IMAGE%.raw}.iso" - cp "$RAW_IMAGE" "$ISO_IMAGE" - echo "Converting $RAW_IMAGE to ISO: $ISO_IMAGE" - - systemd-repart \ - --no-pager \ - --dry-run=no \ - --size=6.7G \ - --empty=allow \ - --definitions=./mkosi.profiles/liveiso/mkosi.repart \ - --el-torito=true \ - --private-key=./mkosi.key \ - --certificate=./mkosi.crt \ - --el-torito-volume="Elementary-root" \ - --el-torito-publisher="Elementary" \ - "$ISO_IMAGE" -fi -chown -R $USER:$USER mkosi.output - - -echo "Build complete" \ No newline at end of file diff --git a/mkosi.conf.d/elementary/mkosi.conf b/mkosi.conf.d/elementary/mkosi.conf index 3f572bede..2abe35ff4 100644 --- a/mkosi.conf.d/elementary/mkosi.conf +++ b/mkosi.conf.d/elementary/mkosi.conf @@ -17,4 +17,5 @@ InitrdVolatilePackages= InitrdPackages= linux-firmware cryptsetup - cryptsetup-bin \ No newline at end of file + cryptsetup-bin + systemd-container \ No newline at end of file diff --git a/mkosi.extra/usr/lib/repart.d/22-usr.conf b/mkosi.extra/usr/lib/repart.d/22-usr.conf deleted file mode 100644 index 183e2a003..000000000 --- a/mkosi.extra/usr/lib/repart.d/22-usr.conf +++ /dev/null @@ -1,7 +0,0 @@ -[Partition] -Type=usr -Label=_empty -NoAuto=1 -SizeMinBytes=5G -SizeMaxBytes=20G -Weight=2000 \ No newline at end of file diff --git a/mkosi.extra/usr/lib/repart.d/40-root.conf b/mkosi.extra/usr/lib/repart.d/40-root.conf deleted file mode 100644 index e774ac437..000000000 --- a/mkosi.extra/usr/lib/repart.d/40-root.conf +++ /dev/null @@ -1,10 +0,0 @@ -[Partition] -Type=root -Format=btrfs -SizeMinBytes=9G -Weight=18000 -Subvolumes=/var -MakeDirectories=/var/log/journal -Encrypt=off -FactoryReset=yes -Label=%M-root diff --git a/mkosi.extra/usr/lib/repart.d/50-home.conf b/mkosi.extra/usr/lib/repart.d/50-home.conf deleted file mode 100644 index 3c7e04426..000000000 --- a/mkosi.extra/usr/lib/repart.d/50-home.conf +++ /dev/null @@ -1,7 +0,0 @@ -[Partition] -Type=home -Format=btrfs -SizeMinBytes=10G -Weight=45000 -FactoryReset=yes -Label=%M-home diff --git a/mkosi.profiles/liveiso/mkosi.conf b/mkosi.profiles/liveiso/mkosi.conf deleted file mode 100644 index 00c9e702b..000000000 --- a/mkosi.profiles/liveiso/mkosi.conf +++ /dev/null @@ -1,38 +0,0 @@ -[Match] -Profiles=liveiso - -[Output] -SplitArtifacts=uki,partitions -Format=disk - -[Content] -Bootable=yes -Bootloader=systemd-boot -UnifiedKernelImageFormat=%i_%v_%a -InitrdProfiles= -KernelInitrdModules= - default - ahci - nvme - xhci_pci - usb_storage - uas - sd_mod - dm-verity -KernelCommandLine= - splash - quiet - root=dissect - mount.usr=dissect - rw - audit=0 - systemd.image_policy=esp=unprotected:xbootldr=unprotected+unused+absent:usr=signed:root=unprotected+absent:home=unprotected+absent:=ignore - systemd.image_filter=usr=Elementary_*:usr-verity=Elementary_*:usr-verity-sig=Elementary_*:root=Elementary-*:home=Elementary-* - systemd.debug-shell=ttyS0 - rd.systemd.debug-shell=ttyS0 - ipe.enforce=0 - -[Validation] -# just for now, please do enable secureboot -SecureBoot=no -SignExpectedPcr=no diff --git a/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/00-esp.conf b/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/00-esp.conf deleted file mode 100644 index d549a0a1b..000000000 --- a/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/00-esp.conf +++ /dev/null @@ -1,5 +0,0 @@ -[Partition] -Type=esp -Format=vfat -SizeMinBytes=1G -SizeMaxBytes=1G \ No newline at end of file diff --git a/mkosi.extra/usr/lib/repart.d/20-usr-verity-sig.conf b/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/20-usr-verify-sig-b.conf similarity index 100% rename from mkosi.extra/usr/lib/repart.d/20-usr-verity-sig.conf rename to mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/20-usr-verify-sig-b.conf diff --git a/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/20-usr-verity-sig.conf b/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/20-usr-verity-sig.conf deleted file mode 100644 index fd8815d3c..000000000 --- a/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/20-usr-verity-sig.conf +++ /dev/null @@ -1,3 +0,0 @@ -[Partition] -Type=usr-verity-sig -Label=_empty \ No newline at end of file diff --git a/mkosi.extra/usr/lib/repart.d/21-usr-verity.conf b/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/21-usr-verity-b.conf similarity index 100% rename from mkosi.extra/usr/lib/repart.d/21-usr-verity.conf rename to mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/21-usr-verity-b.conf diff --git a/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/21-usr-verity.conf b/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/21-usr-verity.conf deleted file mode 100644 index fff802a78..000000000 --- a/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/21-usr-verity.conf +++ /dev/null @@ -1,6 +0,0 @@ -[Partition] -Type=usr-verity -Label=_empty -NoAuto=1 -SizeMinBytes=400M -SizeMaxBytes=400M \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/22-usr.conf b/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/22-usr-b.conf similarity index 67% rename from mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/22-usr.conf rename to mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/22-usr-b.conf index 183e2a003..51fbd1e1c 100644 --- a/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/22-usr.conf +++ b/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/22-usr-b.conf @@ -3,5 +3,4 @@ Type=usr Label=_empty NoAuto=1 SizeMinBytes=5G -SizeMaxBytes=20G -Weight=2000 \ No newline at end of file +SizeMaxBytes=20G \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/40-root.conf b/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/40-root.conf index e774ac437..8b83ffd46 100644 --- a/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/40-root.conf +++ b/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/40-root.conf @@ -2,9 +2,10 @@ Type=root Format=btrfs SizeMinBytes=9G +SizeMaxBytes=50G Weight=18000 Subvolumes=/var MakeDirectories=/var/log/journal Encrypt=off FactoryReset=yes -Label=%M-root +Label=Elementary-root diff --git a/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/50-home.conf b/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/50-home.conf index 3c7e04426..c4caf90d6 100644 --- a/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/50-home.conf +++ b/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/50-home.conf @@ -4,4 +4,4 @@ Format=btrfs SizeMinBytes=10G Weight=45000 FactoryReset=yes -Label=%M-home +Label=Elementary-home diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/00-esp.conf b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/00-esp.conf new file mode 100644 index 000000000..28363e46d --- /dev/null +++ b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/00-esp.conf @@ -0,0 +1,5 @@ +[Partition] +Type=esp +Format=vfat +SizeMinBytes=0.5G +SizeMaxBytes=0.5G \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/10-usr-verity-sig.conf b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf similarity index 70% rename from mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/10-usr-verity-sig.conf rename to mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf index cd62c1dee..df26ce3ec 100644 --- a/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/10-usr-verity-sig.conf +++ b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf @@ -3,3 +3,5 @@ Type=usr-verity-sig CopyBlocks=auto Label=%M_%A_verity_sig SplitName=%t.%U +SizeMinBytes=0.5G +SizeMaxBytes=0.5G diff --git a/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/11-usr-verity.conf b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf similarity index 68% rename from mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/11-usr-verity.conf rename to mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf index 82fc0c6c9..c3ccb570a 100644 --- a/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/11-usr-verity.conf +++ b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf @@ -3,3 +3,5 @@ Type=usr-verity CopyBlocks=auto Label=%M_%A_verity SplitName=%t.%U +SizeMinBytes=0.5G +SizeMaxBytes=0.5G diff --git a/mkosi.extra/usr/lib/repart.d/12-usr.conf b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/12-usr.conf similarity index 67% rename from mkosi.extra/usr/lib/repart.d/12-usr.conf rename to mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/12-usr.conf index cd79d5309..8f82320ed 100644 --- a/mkosi.extra/usr/lib/repart.d/12-usr.conf +++ b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/12-usr.conf @@ -3,3 +3,5 @@ Type=usr CopyBlocks=auto Label=%M_%A SplitName=%t.%U +SizeMinBytes=1G +SizeMaxBytes=3G \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/sbin/elementary-install b/mkosi.profiles/liveiso/mkosi.extra/usr/sbin/elementary-install index 5f4afa430..69a3f1381 100755 --- a/mkosi.profiles/liveiso/mkosi.extra/usr/sbin/elementary-install +++ b/mkosi.profiles/liveiso/mkosi.extra/usr/sbin/elementary-install @@ -3,13 +3,23 @@ set -eo pipefail echo "Thank you for testing! <3" +apt-get install fzf systemd-repart systemd-boot -y + +medium=$(findmnt -rn -t iso9660,udf -o TARGET | head -1) +extra="$medium/extra" +raw_src=$(find "$extra" -maxdepth 1 -type f -name '*.raw' | head -n1) +efi_src=$(find "$extra" -maxdepth 1 -type f -name '*.efi' | head -n1) +repart_src="$extra/repart.d" + +echo "Using source image: $raw_src" + selected_disk=$(lsblk -d -n -p -o NAME,SIZE,MODEL -e 7,11 | fzf \ - --prompt="Select installation disk (ALL DATA WILL BE LOST): " \ - --header="NAME SIZE MODEL") + --prompt="Select installation disk (ALL DATA WILL BE LOST): " \ + --header="NAME SIZE MODEL") if [ -z "$selected_disk" ]; then - echo "Installation aborted: No disk selected." - exit 1 + echo "Installation aborted: No disk selected." + exit 1 fi dest_dev=$(echo "$selected_disk" | awk '{print $1}') @@ -22,55 +32,13 @@ sleep 1 echo "Destroying drive in 1s ..." sleep 1 -systemd-repart \ - --definitions=/etc/repart-installer/ \ - --dry-run=no \ - --empty=force \ - "$dest_dev" - -echo "Installing bootloader ..." - -sleep 1 - -udevadm settle - -sleep 1 - -mkdir -p /mnt/esp - -target_esp=$(lsblk -n -o PATH,PARTLABEL "$dest_dev" | awk '$2=="esp" {print $1}') - -mount -o umask=0077 "$target_esp" /mnt/esp - -bootctl install --esp-path=/mnt/esp --no-variables - -cp /usr/lib/elementary-install/*.efi /mnt/esp/EFI/Linux/ - -cat > /mnt/esp/loader/loader.conf <<'EOF' -timeout 6 -EOF - -umount /mnt/esp - - -target_root=$(lsblk -n -o PATH,PARTLABEL "$dest_dev" | awk '$2=="Elementary-root" {print $1}') - -if [ -n "$target_root" ]; then - mkdir -p /mnt/root - mount "$target_root" /mnt/root - - rm -f /mnt/root/etc/lightdm/lightdm.conf.d/12-liveiso.conf - rm -f /mnt/root/etc/sudoers.d/liveiso - - if chroot /mnt/root id liveiso &>/dev/null; then - chroot /mnt/root userdel -f liveiso - fi - - umount /mnt/root -else - echo "Fatal Error, could not cleanup" - exit 1 -fi +/usr/sbin/wipefs -a "$dest_dev" +systemd-repart \ + --copy-from="$raw_src" \ + --definitions="$repart_src" \ + --dry-run=no \ + --empty=force \ + "$dest_dev" -echo "Install done, reboot now" \ No newline at end of file +echo "Everything is done! Enjoy your stay." \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.repart/40-root.conf b/mkosi.profiles/liveiso/mkosi.repart/40-root.conf deleted file mode 100644 index 418ba667b..000000000 --- a/mkosi.profiles/liveiso/mkosi.repart/40-root.conf +++ /dev/null @@ -1,11 +0,0 @@ -[Partition] -Type=root -Format=btrfs -SizeMinBytes=1G -SizeMaxBytes=3G -Weight=18000 -Subvolumes=/var -MakeDirectories=/var/log/journal -Encrypt=off -FactoryReset=yes -Label=%M-root diff --git a/mkosi.profiles/liveiso/mkosi.repart/50-home.conf b/mkosi.profiles/liveiso/mkosi.repart/50-home.conf deleted file mode 100644 index d8e0d5411..000000000 --- a/mkosi.profiles/liveiso/mkosi.repart/50-home.conf +++ /dev/null @@ -1,7 +0,0 @@ -[Partition] -Type=home -Format=btrfs -SizeMinBytes=0.5G -Weight=45000 -FactoryReset=yes -Label=%M-home diff --git a/mkosi.profiles/sysupdate/mkosi.conf b/mkosi.profiles/sysupdate/mkosi.conf index 876df843b..9b334411d 100644 --- a/mkosi.profiles/sysupdate/mkosi.conf +++ b/mkosi.profiles/sysupdate/mkosi.conf @@ -8,7 +8,7 @@ Format=disk [Content] Bootable=yes Bootloader=systemd-boot -UnifiedKernelImageFormat=%i_%v_%a +UnifiedKernelImageFormat=%i_%v InitrdProfiles= KernelInitrdModules= default diff --git a/mkosi.extra/usr/lib/repart.d/00-esp.conf b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/00-esp.conf similarity index 50% rename from mkosi.extra/usr/lib/repart.d/00-esp.conf rename to mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/00-esp.conf index d549a0a1b..eef2aa659 100644 --- a/mkosi.extra/usr/lib/repart.d/00-esp.conf +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/00-esp.conf @@ -1,5 +1,5 @@ [Partition] Type=esp Format=vfat -SizeMinBytes=1G -SizeMaxBytes=1G \ No newline at end of file +SizeMinBytes=0.5G +SizeMaxBytes=2G \ No newline at end of file diff --git a/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf similarity index 70% rename from mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf rename to mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf index cd62c1dee..df26ce3ec 100644 --- a/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf @@ -3,3 +3,5 @@ Type=usr-verity-sig CopyBlocks=auto Label=%M_%A_verity_sig SplitName=%t.%U +SizeMinBytes=0.5G +SizeMaxBytes=0.5G diff --git a/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf similarity index 68% rename from mkosi.extra/usr/lib/repart.d/11-usr-verity.conf rename to mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf index 82fc0c6c9..c3ccb570a 100644 --- a/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf @@ -3,3 +3,5 @@ Type=usr-verity CopyBlocks=auto Label=%M_%A_verity SplitName=%t.%U +SizeMinBytes=0.5G +SizeMaxBytes=0.5G diff --git a/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/12-usr.conf b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/12-usr.conf similarity index 67% rename from mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/12-usr.conf rename to mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/12-usr.conf index cd79d5309..8f82320ed 100644 --- a/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/12-usr.conf +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/12-usr.conf @@ -3,3 +3,5 @@ Type=usr CopyBlocks=auto Label=%M_%A SplitName=%t.%U +SizeMinBytes=1G +SizeMaxBytes=3G \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.repart/00-esp.conf b/mkosi.profiles/sysupdate/mkosi.repart/00-esp.conf similarity index 66% rename from mkosi.profiles/liveiso/mkosi.repart/00-esp.conf rename to mkosi.profiles/sysupdate/mkosi.repart/00-esp.conf index ca2071abe..847605508 100644 --- a/mkosi.profiles/liveiso/mkosi.repart/00-esp.conf +++ b/mkosi.profiles/sysupdate/mkosi.repart/00-esp.conf @@ -3,5 +3,5 @@ Type=esp Format=vfat CopyFiles=/efi:/ CopyFiles=/boot:/ -SizeMinBytes=512M -SizeMaxBytes=1G +SizeMinBytes=0.5G +SizeMaxBytes=2G diff --git a/mkosi.profiles/liveiso/mkosi.repart/10-usr-verity-sig.conf b/mkosi.profiles/sysupdate/mkosi.repart/10-usr-verity-sig.conf similarity index 100% rename from mkosi.profiles/liveiso/mkosi.repart/10-usr-verity-sig.conf rename to mkosi.profiles/sysupdate/mkosi.repart/10-usr-verity-sig.conf diff --git a/mkosi.profiles/liveiso/mkosi.repart/11-usr-verity.conf b/mkosi.profiles/sysupdate/mkosi.repart/11-usr-verity.conf similarity index 100% rename from mkosi.profiles/liveiso/mkosi.repart/11-usr-verity.conf rename to mkosi.profiles/sysupdate/mkosi.repart/11-usr-verity.conf diff --git a/mkosi.profiles/liveiso/mkosi.repart/12-usr.conf b/mkosi.profiles/sysupdate/mkosi.repart/12-usr.conf similarity index 100% rename from mkosi.profiles/liveiso/mkosi.repart/12-usr.conf rename to mkosi.profiles/sysupdate/mkosi.repart/12-usr.conf From a7274edb5f46bd7588238db1087ed301bd82e66f Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Sun, 9 Aug 2026 12:37:33 -0400 Subject: [PATCH 24/86] Merge flash --- Justfile | 22 +++-- assemble-iso.sh | 89 +++++++++++++++++++ mkosi.conf | 8 +- mkosi.conf.d/elementary/mkosi.conf | 6 +- .../elementary/mkosi.conf.d/elementary.conf | 6 +- mkosi.postinst.chroot | 6 ++ mkosi.profiles/flash/mkosi.conf | 39 ++++++++ .../opt/repart-target/home}/50-home.conf | 2 +- .../opt/repart-target/root/40-root.conf | 11 +++ .../mkosi.extra/usr/lib/repart.d/00-esp.conf | 11 +++ .../usr/lib/repart.d/10-usr-verity-sig.conf | 8 ++ .../usr/lib/repart.d/11-usr-verity.conf | 8 ++ .../mkosi.extra/usr/lib/repart.d/12-usr.conf | 10 +++ .../usr/lib/repart.d}/40-root.conf | 4 +- .../mkosi.extra/usr/lib/repart.d/50-home.conf | 8 ++ .../lib/systemd/system-preset/01-live.preset | 1 + .../lib/systemd/system/liveiso-reset.service | 0 .../mkosi.extra/usr/sbin/elementary-install | 81 +++++++++++++++++ .../{liveiso => flash}/mkosi.finalize | 2 +- mkosi.profiles/flash/mkosi.repart/00-esp.conf | 7 ++ .../flash/mkosi.repart/40-root.conf | 10 +++ .../flash/mkosi.repart/50-home.conf | 8 ++ .../mkosi.extra/boot/loader/loader.conf | 4 - .../lightdm/lightdm.conf.d/12-liveiso.conf | 3 - .../repart-installer/20-usr-verify-sig-b.conf | 3 - .../etc/repart-installer/21-usr-verity-b.conf | 6 -- .../etc/repart-installer/22-usr-b.conf | 6 -- .../liveiso/mkosi.extra/etc/sudoers.d/liveiso | 1 - .../usr/lib/repart.d/10-usr-verity-sig.conf | 3 +- .../system-preset/10-elementary.preset | 16 ---- .../lib/systemd/system/preset-global.service | 17 ---- .../systemd/system/systemd-firstboot.service | 1 - .../systemd-networkd-wait-online.service | 1 - .../usr/lib/systemd/zram-generator.conf | 3 - .../sysupdate.d/10-usr-verity-sig.transfer | 15 ---- .../lib/sysupdate.d/11-usr-verity.transfer | 15 ---- .../usr/lib/sysupdate.d/12-usr.transfer | 15 ---- .../usr/lib/sysupdate.d/20-uki.transfer | 23 ----- .../mkosi.extra/usr/lib/tmpfiles.d/etc.conf | 83 ----------------- mkosi.profiles/liveiso/mkosi.postinst.chroot | 49 ---------- .../liveiso/mkosi.uki-profiles/install.conf | 21 ----- .../liveiso/mkosi.uki-profiles/live.conf | 18 ---- mkosi.profiles/sysupdate/mkosi.conf | 9 +- .../sysupdate/mkosi.repart/00-esp.conf | 9 ++ .../sysupdate/mkosi.repart/12-usr.conf | 5 ++ 45 files changed, 349 insertions(+), 324 deletions(-) create mode 100755 assemble-iso.sh create mode 100644 mkosi.profiles/flash/mkosi.conf rename mkosi.profiles/{liveiso/mkosi.extra/etc/repart-installer => flash/mkosi.extra/opt/repart-target/home}/50-home.conf (82%) create mode 100644 mkosi.profiles/flash/mkosi.extra/opt/repart-target/root/40-root.conf create mode 100644 mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/00-esp.conf create mode 100644 mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf create mode 100644 mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf create mode 100644 mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/12-usr.conf rename mkosi.profiles/{liveiso/mkosi.extra/etc/repart-installer => flash/mkosi.extra/usr/lib/repart.d}/40-root.conf (81%) create mode 100644 mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/50-home.conf create mode 100644 mkosi.profiles/flash/mkosi.extra/usr/lib/systemd/system-preset/01-live.preset rename mkosi.profiles/{liveiso => flash}/mkosi.extra/usr/lib/systemd/system/liveiso-reset.service (100%) create mode 100755 mkosi.profiles/flash/mkosi.extra/usr/sbin/elementary-install rename mkosi.profiles/{liveiso => flash}/mkosi.finalize (84%) create mode 100644 mkosi.profiles/flash/mkosi.repart/00-esp.conf create mode 100644 mkosi.profiles/flash/mkosi.repart/40-root.conf create mode 100644 mkosi.profiles/flash/mkosi.repart/50-home.conf delete mode 100644 mkosi.profiles/liveiso/mkosi.extra/boot/loader/loader.conf delete mode 100644 mkosi.profiles/liveiso/mkosi.extra/etc/lightdm/lightdm.conf.d/12-liveiso.conf delete mode 100644 mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/20-usr-verify-sig-b.conf delete mode 100644 mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/21-usr-verity-b.conf delete mode 100644 mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/22-usr-b.conf delete mode 100644 mkosi.profiles/liveiso/mkosi.extra/etc/sudoers.d/liveiso delete mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset delete mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system/preset-global.service delete mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service delete mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system/systemd-networkd-wait-online.service delete mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/zram-generator.conf delete mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer delete mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer delete mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer delete mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer delete mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/tmpfiles.d/etc.conf delete mode 100755 mkosi.profiles/liveiso/mkosi.postinst.chroot delete mode 100644 mkosi.profiles/liveiso/mkosi.uki-profiles/install.conf delete mode 100644 mkosi.profiles/liveiso/mkosi.uki-profiles/live.conf diff --git a/Justfile b/Justfile index 683f9d677..11f512ac8 100644 --- a/Justfile +++ b/Justfile @@ -6,11 +6,23 @@ default: set -xeuo pipefail just build-sysupdate -build-sysupdate: - rm -rf mkosi.output/ - just run-in-podman mkosi -B --debug --force --profile=elementaryos --profile=sysexts --workspace-directory=/workspace +profile-sysupdate: + sudo rm -rf mkosi.output/sysupdate + just run-in-podman mkosi -B --debug --force --profile=sysupdate --workspace-directory=/workspace sudo chown -R {{env_var('USER')}}:{{env_var('USER')}} ./mkosi.output/ +profile-flash: + sudo rm -rf mkosi.output/live + just run-in-podman mkosi -B --debug --force --profile=flash --workspace-directory=/workspace + sudo chown -R {{env_var('USER')}}:{{env_var('USER')}} ./mkosi.output/ + +generate-liveiso: + #!/usr/bin/env bash + just profile-sysupdate + just profile-flash + ./assemble-iso.sh + + genkey: just run-in-podman mkosi genkey @@ -20,6 +32,7 @@ run-in-podman +command: sudo podman run --rm -it \ --privileged \ --security-opt label=disable \ + -v /var/cache/mkosi:/var/cache/mkosi \ -v /dev:/dev \ -v "{{invocation_directory()}}:/work" \ -w /work \ @@ -27,9 +40,6 @@ run-in-podman +command: ghcr.io/jumpyvi/mkosi-debian:26 \ {{command}} -build-bootablemedia: - sudo rm -rf mkosi.output/ && \ - sudo ./build-bmedia.sh clean: diff --git a/assemble-iso.sh b/assemble-iso.sh new file mode 100755 index 000000000..aabf516be --- /dev/null +++ b/assemble-iso.sh @@ -0,0 +1,89 @@ +#!/usr/bin/env bash +set -euo pipefail +cd mkosi.output/live/ + +RAW_IMAGE=$(find ../sysupdate -maxdepth 1 -type f \ + | grep -E '/[^/]+_[0-9]{14}\.raw$' \ + | head -n1) + +if [[ -z "$RAW_IMAGE" ]]; then + echo "error: No .raw image found matching the pattern." >&2 + exit 1 +fi + +XZ_IMAGE="${RAW_IMAGE}.xz" +echo "Compressing raw image: $RAW_IMAGE -> $XZ_IMAGE..." +xz -7 -T0 -c "$RAW_IMAGE" > "$XZ_IMAGE" + +# Detect version +output_dir=$(ls -d ElementaryLive_* | grep -vE '\.(raw|iso|vmlinuz|initrd|efi|manifest)$' | head -n 1) + +if [[ -z "$output_dir" ]]; then + echo "error: No mkosi.output, run just build-flash first." >&2 + exit 1 +fi + +base_name=$(basename "$output_dir") +echo "Detected release target: $base_name" + +rm -rf iso_root +mkdir -p iso_root/casper +mkdir -p iso_root/boot/grub + +# Write the GRUB configuration for Casper +cat << 'EOF' > iso_root/boot/grub/grub.cfg +set timeout=0 +set default=0 + +menuentry "ElementaryOS9 Live (pre-alpha)" { + linux /casper/vmlinuz boot=casper quiet splash --- + initrd /casper/initrd +} +EOF + +echo "Shoving everything in casper..." +sudo podman run --rm -it \ + -v "$(pwd)":/workspace \ + -w /workspace \ + alpine:latest \ + sh -c "set -e && \ + apk update && \ + apk add --no-cache squashfs-tools grub grub-efi mtools xorriso && \ + + KERNEL_VERSION=\$(ls ${base_name}/lib/modules | head -n 1) && \ + chroot ${base_name} update-initramfs -u -k \${KERNEL_VERSION} && \ + + cp ${base_name}/boot/vmlinuz-\${KERNEL_VERSION} iso_root/casper/vmlinuz && \ + cp ${base_name}/boot/initrd.img-\${KERNEL_VERSION} iso_root/casper/initrd && \ + + rm -f iso_root/casper/filesystem.squashfs && \ + mksquashfs ${base_name} iso_root/casper/filesystem.squashfs -comp xz && \ + + grub-mkrescue -o custom_ubuntu_live.iso iso_root/ && \ + echo 'Live environment generated!'" + + +echo "Generating installer..." +BASE_ISO="./live/custom_ubuntu_live.iso" +OUT_ISO="./elementary-liveiso.iso" +rm -f "../$OUT_ISO" + +cp "$XZ_IMAGE" . +LOCAL_RAW_IMAGE="./live/$(basename "$XZ_IMAGE")" + +podman run --rm \ + -v "../:/work:Z" \ + -w /work \ + docker.io/alpine:latest \ + sh -c ' + apk add --no-cache xorriso && \ + xorriso -indev "'"$BASE_ISO"'" \ + -outdev "'"$OUT_ISO"'" \ + -boot_image any keep \ + -map "'"$LOCAL_RAW_IMAGE"'" /extra/"$(basename "'"$LOCAL_RAW_IMAGE"'")" \ + -commit + ' + +rm -f "$(basename "$XZ_IMAGE")" + +echo "Success! Your live ISO is at: mkosi.output/elementary-liveiso.iso" \ No newline at end of file diff --git a/mkosi.conf b/mkosi.conf index 915cd21a0..e76c53cdd 100644 --- a/mkosi.conf +++ b/mkosi.conf @@ -10,10 +10,8 @@ Repositories=main,universe ToolsTree=default CacheDirectory=mkosi.cache Incremental=yes -ToolsTreeDistribution=debian -ToolsTreeRelease=forky +ToolsTreeDistribution=ubuntu +ToolsTreeRelease=resolute [Output] -Format=none -OutputDirectory=mkosi.output -ImageId=Elementary \ No newline at end of file +Format=none \ No newline at end of file diff --git a/mkosi.conf.d/elementary/mkosi.conf b/mkosi.conf.d/elementary/mkosi.conf index 2abe35ff4..431139f2c 100644 --- a/mkosi.conf.d/elementary/mkosi.conf +++ b/mkosi.conf.d/elementary/mkosi.conf @@ -3,6 +3,8 @@ Distribution=ubuntu [Content] Packages=systemd-container +Bootable=no +UnifiedKernelImageFormat=%i_%v VolatilePackages= passwd @@ -10,10 +12,6 @@ VolatilePackages= uidmap systemd-boot -InitrdVolatilePackages= - systemd - udev - InitrdPackages= linux-firmware cryptsetup diff --git a/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf b/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf index e07087d57..cf7991fac 100644 --- a/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf +++ b/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf @@ -10,6 +10,7 @@ RemovePackages= anacron Packages= + lightdm plymouth plymouth-theme-elementary pipewire-audio @@ -40,4 +41,7 @@ Packages= xdg-desktop-portal-gtk xdg-user-dirs systemd-zram-generator - systemd-repart \ No newline at end of file + systemd-repart + zstd + systemd-boot + xz-utils \ No newline at end of file diff --git a/mkosi.postinst.chroot b/mkosi.postinst.chroot index faafb1b5b..76b41fd45 100755 --- a/mkosi.postinst.chroot +++ b/mkosi.postinst.chroot @@ -5,6 +5,12 @@ fc-cache --force --really-force --system-only --verbose glib-compile-schemas /usr/share/glib-2.0/schemas/ +mkdir -p /var/usrlocal +ln -s /var/usrlocal /usr/local +cp -a /usr/local/. /var/usrlocal/ +rm -rf /usr/local +ln -s /var/usrlocal /usr/local + if command -v authselect >/dev/null; then authselect select local diff --git a/mkosi.profiles/flash/mkosi.conf b/mkosi.profiles/flash/mkosi.conf new file mode 100644 index 000000000..59195891a --- /dev/null +++ b/mkosi.profiles/flash/mkosi.conf @@ -0,0 +1,39 @@ +[Match] +Profiles=flash + +[Output] +Format=directory +ElTorito=yes +SplitArtifacts=kernel,initrd +OutputDirectory=../../mkosi.output/live +ImageId=ElementaryLive + +[Content] +Bootable=yes +Packages= + gparted + grub-efi-amd64 + grub-pc-bin + casper + initramfs-tools +Bootloader=grub +KernelInitrdModules= + default + ahci + nvme + xhci_pci + usb_storage + uas + sd_mod + sr_mod + isofs + loop + ext4 +KernelCommandLine= + rw + console=ttyS0 + boot=casper + +[Validation] +SecureBoot=no +SignExpectedPcr=no \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/50-home.conf b/mkosi.profiles/flash/mkosi.extra/opt/repart-target/home/50-home.conf similarity index 82% rename from mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/50-home.conf rename to mkosi.profiles/flash/mkosi.extra/opt/repart-target/home/50-home.conf index c4caf90d6..c857e0a15 100644 --- a/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/50-home.conf +++ b/mkosi.profiles/flash/mkosi.extra/opt/repart-target/home/50-home.conf @@ -1,7 +1,7 @@ [Partition] Type=home Format=btrfs -SizeMinBytes=10G +SizeMinBytes=512M Weight=45000 FactoryReset=yes Label=Elementary-home diff --git a/mkosi.profiles/flash/mkosi.extra/opt/repart-target/root/40-root.conf b/mkosi.profiles/flash/mkosi.extra/opt/repart-target/root/40-root.conf new file mode 100644 index 000000000..775869130 --- /dev/null +++ b/mkosi.profiles/flash/mkosi.extra/opt/repart-target/root/40-root.conf @@ -0,0 +1,11 @@ +[Partition] +Type=root +Format=btrfs +SizeMinBytes=9G +SizeMaxBytes=20G +Weight=18000 +Subvolumes=/var /opt +MakeDirectories=/var/log/journal +Encrypt=off +FactoryReset=yes +Label=Elementary-root \ No newline at end of file diff --git a/mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/00-esp.conf b/mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/00-esp.conf new file mode 100644 index 000000000..30d771984 --- /dev/null +++ b/mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/00-esp.conf @@ -0,0 +1,11 @@ +[Partition] +Type=esp +Format=vfat +CopyFiles=/efi:/ +CopyFiles=/boot:/ +<<<<<<<< HEAD:mkosi.profiles/sysupdate/mkosi.repart/00-esp.conf +SizeMinBytes=0.5G +======== +SizeMinBytes=1G +>>>>>>>> flash:mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/00-esp.conf +SizeMaxBytes=2G diff --git a/mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf b/mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf new file mode 100644 index 000000000..0f1664764 --- /dev/null +++ b/mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf @@ -0,0 +1,8 @@ +[Partition] +Type=usr-verity-sig +Label=%M_%A_verity_sig +Verity=signature +VerityMatchKey=usr +SplitName=%t.%U +SizeMinBytes=0.5G +SizeMaxBytes=0.5G diff --git a/mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf b/mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf new file mode 100644 index 000000000..067b935d1 --- /dev/null +++ b/mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf @@ -0,0 +1,8 @@ +[Partition] +Type=usr-verity +Label=%M_%A_verity +Verity=hash +VerityMatchKey=usr +SizeMinBytes=400M +SizeMaxBytes=400M +SplitName=%t.%U diff --git a/mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/12-usr.conf b/mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/12-usr.conf new file mode 100644 index 000000000..ef8f5790d --- /dev/null +++ b/mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/12-usr.conf @@ -0,0 +1,10 @@ +[Partition] +Type=usr +Label=%M_%A +Format=erofs +CopyFiles=/usr:/ +Verity=data +VerityMatchKey=usr +Minimize=yes +Compression=zstd +SplitName=%t.%U diff --git a/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/40-root.conf b/mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/40-root.conf similarity index 81% rename from mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/40-root.conf rename to mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/40-root.conf index 8b83ffd46..5755a75ec 100644 --- a/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/40-root.conf +++ b/mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/40-root.conf @@ -1,8 +1,8 @@ [Partition] Type=root Format=btrfs -SizeMinBytes=9G -SizeMaxBytes=50G +SizeMinBytes=2G +SizeMaxBytes=3G Weight=18000 Subvolumes=/var MakeDirectories=/var/log/journal diff --git a/mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/50-home.conf b/mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/50-home.conf new file mode 100644 index 000000000..d104b2c10 --- /dev/null +++ b/mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/50-home.conf @@ -0,0 +1,8 @@ +[Partition] +Type=home +Format=btrfs +SizeMinBytes=512M +SizeMaxBytes=512M +Weight=45000 +FactoryReset=yes +Label=Elementary-home diff --git a/mkosi.profiles/flash/mkosi.extra/usr/lib/systemd/system-preset/01-live.preset b/mkosi.profiles/flash/mkosi.extra/usr/lib/systemd/system-preset/01-live.preset new file mode 100644 index 000000000..4201b416a --- /dev/null +++ b/mkosi.profiles/flash/mkosi.extra/usr/lib/systemd/system-preset/01-live.preset @@ -0,0 +1 @@ +enable liveiso-reset.service \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system/liveiso-reset.service b/mkosi.profiles/flash/mkosi.extra/usr/lib/systemd/system/liveiso-reset.service similarity index 100% rename from mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system/liveiso-reset.service rename to mkosi.profiles/flash/mkosi.extra/usr/lib/systemd/system/liveiso-reset.service diff --git a/mkosi.profiles/flash/mkosi.extra/usr/sbin/elementary-install b/mkosi.profiles/flash/mkosi.extra/usr/sbin/elementary-install new file mode 100755 index 000000000..42533be56 --- /dev/null +++ b/mkosi.profiles/flash/mkosi.extra/usr/sbin/elementary-install @@ -0,0 +1,81 @@ +#!/bin/bash +set -eo pipefail + +echo "Thank you for testing! <3" + +medium=$(findmnt -rn -t iso9660,udf -o TARGET | head -1) +extra="$medium/extra" +raw_xz_src=$(find "$extra" -maxdepth 1 -type f -name '*.raw.xz' | head -n1) +repart_src="/opt/repart-target/" + +if [ -z "$raw_xz_src" ]; then + echo "Installation aborted: No .raw.xz file found." + exit 1 +fi + +echo "Using source image: $raw_xz_src" + +selected_disk=$(lsblk -d -n -p -o NAME,SIZE,MODEL -e 7,11 | fzf \ + --prompt="Select installation disk (ALL DATA WILL BE LOST): " \ + --header="NAME SIZE MODEL") + +if [ -z "$selected_disk" ]; then + echo "Installation aborted: No disk selected." + exit 1 +fi + +dest_dev=$(echo "$selected_disk" | awk '{print $1}') + +echo "$dest_dev selected for repartitioning..." +echo "Destroying drive in 3s ..." +sleep 1 +echo "Destroying drive in 2s ..." +sleep 1 +echo "Destroying drive in 1s ..." +sleep 1 + +/usr/sbin/wipefs -a "$dest_dev" + +echo "Creating root partition..." +systemd-repart \ + --definitions="$repart_src/root" \ + --dry-run=no \ + --empty=force \ + "$dest_dev" + +partprobe "$dest_dev" +udevadm settle + +root_part=$(lsblk -n -o PATH -l "$dest_dev" | grep -v "^${dest_dev}$" | head -n1) + +if [ -z "$root_part" ]; then + echo "Error: No root-scratch parition, aborting." + exit 1 +fi + +root_mount=/mnt/future-root +mkdir -p "$root_mount" + +echo "Mounting $root_part to $root_mount as a scratch buffer..." +if ! mount "$root_part" "$root_mount"; then + echo "Could not mount, aborting." + exit 1 +fi + +raw_src="$root_mount/source.raw" +echo "Decompressing image into the scratch buffer..." +xz -dk -T0 -c "$raw_xz_src" > "$raw_src" + +echo "Configuring partitions..." +systemd-repart \ + --copy-from="$raw_src" \ + --definitions="$repart_src/home" \ + --dry-run=no \ + "$dest_dev" + +echo "Cleaning up scratch buffer..." +rm "$raw_src" +umount "$root_mount" +rmdir "$root_mount" + +echo "Everything is done! Enjoy your stay." \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.finalize b/mkosi.profiles/flash/mkosi.finalize similarity index 84% rename from mkosi.profiles/liveiso/mkosi.finalize rename to mkosi.profiles/flash/mkosi.finalize index 126bd4f4d..e679c8d0f 100755 --- a/mkosi.profiles/liveiso/mkosi.finalize +++ b/mkosi.profiles/flash/mkosi.finalize @@ -5,4 +5,4 @@ set -euo pipefail # systemd-tmpfiles to symlink individual directories from it to /etc. mkdir -p "$BUILDROOT/usr/share/factory/" cp --archive --no-target-directory --update=none "$BUILDROOT/etc" "$BUILDROOT/usr/share/factory/etc" -ln -sr "$BUILDROOT/usr" "$BUILDROOT/usr/share/factory/usr" \ No newline at end of file +ln -sr "$BUILDROOT/usr" "$BUILDROOT/usr/share/factory/usr" diff --git a/mkosi.profiles/flash/mkosi.repart/00-esp.conf b/mkosi.profiles/flash/mkosi.repart/00-esp.conf new file mode 100644 index 000000000..0096a3039 --- /dev/null +++ b/mkosi.profiles/flash/mkosi.repart/00-esp.conf @@ -0,0 +1,7 @@ +[Partition] +Type=esp +Format=vfat +CopyFiles=/efi:/ +CopyFiles=/boot:/ +SizeMinBytes=1G +SizeMaxBytes=2G diff --git a/mkosi.profiles/flash/mkosi.repart/40-root.conf b/mkosi.profiles/flash/mkosi.repart/40-root.conf new file mode 100644 index 000000000..70d30385d --- /dev/null +++ b/mkosi.profiles/flash/mkosi.repart/40-root.conf @@ -0,0 +1,10 @@ +[Partition] +Type=root +Format=ext4 +SizeMinBytes=2G +SizeMaxBytes=3G +Weight=18000 +MakeDirectories=/var/log/journal +Encrypt=off +FactoryReset=yes +Label=Elementary-root \ No newline at end of file diff --git a/mkosi.profiles/flash/mkosi.repart/50-home.conf b/mkosi.profiles/flash/mkosi.repart/50-home.conf new file mode 100644 index 000000000..d104b2c10 --- /dev/null +++ b/mkosi.profiles/flash/mkosi.repart/50-home.conf @@ -0,0 +1,8 @@ +[Partition] +Type=home +Format=btrfs +SizeMinBytes=512M +SizeMaxBytes=512M +Weight=45000 +FactoryReset=yes +Label=Elementary-home diff --git a/mkosi.profiles/liveiso/mkosi.extra/boot/loader/loader.conf b/mkosi.profiles/liveiso/mkosi.extra/boot/loader/loader.conf deleted file mode 100644 index b8e36cb7d..000000000 --- a/mkosi.profiles/liveiso/mkosi.extra/boot/loader/loader.conf +++ /dev/null @@ -1,4 +0,0 @@ -default Elementary_*@live -timeout 0 -console-mode max -editor no \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.extra/etc/lightdm/lightdm.conf.d/12-liveiso.conf b/mkosi.profiles/liveiso/mkosi.extra/etc/lightdm/lightdm.conf.d/12-liveiso.conf deleted file mode 100644 index 6cbcc72ba..000000000 --- a/mkosi.profiles/liveiso/mkosi.extra/etc/lightdm/lightdm.conf.d/12-liveiso.conf +++ /dev/null @@ -1,3 +0,0 @@ -[Seat:*] -autologin-user=liveiso -autologin-user-timeout=0 \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/20-usr-verify-sig-b.conf b/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/20-usr-verify-sig-b.conf deleted file mode 100644 index fd8815d3c..000000000 --- a/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/20-usr-verify-sig-b.conf +++ /dev/null @@ -1,3 +0,0 @@ -[Partition] -Type=usr-verity-sig -Label=_empty \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/21-usr-verity-b.conf b/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/21-usr-verity-b.conf deleted file mode 100644 index fff802a78..000000000 --- a/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/21-usr-verity-b.conf +++ /dev/null @@ -1,6 +0,0 @@ -[Partition] -Type=usr-verity -Label=_empty -NoAuto=1 -SizeMinBytes=400M -SizeMaxBytes=400M \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/22-usr-b.conf b/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/22-usr-b.conf deleted file mode 100644 index 51fbd1e1c..000000000 --- a/mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer/22-usr-b.conf +++ /dev/null @@ -1,6 +0,0 @@ -[Partition] -Type=usr -Label=_empty -NoAuto=1 -SizeMinBytes=5G -SizeMaxBytes=20G \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.extra/etc/sudoers.d/liveiso b/mkosi.profiles/liveiso/mkosi.extra/etc/sudoers.d/liveiso deleted file mode 100644 index c73defa7b..000000000 --- a/mkosi.profiles/liveiso/mkosi.extra/etc/sudoers.d/liveiso +++ /dev/null @@ -1 +0,0 @@ -liveiso ALL=(ALL) NOPASSWD: ALL diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf index df26ce3ec..0f1664764 100644 --- a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf +++ b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf @@ -1,7 +1,8 @@ [Partition] Type=usr-verity-sig -CopyBlocks=auto Label=%M_%A_verity_sig +Verity=signature +VerityMatchKey=usr SplitName=%t.%U SizeMinBytes=0.5G SizeMaxBytes=0.5G diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset deleted file mode 100644 index f9b682c32..000000000 --- a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset +++ /dev/null @@ -1,16 +0,0 @@ -enable systemd-resolved -enable liveiso-reset.service -enable flatpak-preinstalld.service -enable NetworkManager.service -enable NetworkManager-wait-online.service -disable systemd-networkd - -enable systemd-timesyncd.service -disable systemd-homed-firstboot.service -disable systemd-firstboot.service - -enable systemd-homed.service - -disable avahi.* - -enable preset-global.service diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system/preset-global.service b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system/preset-global.service deleted file mode 100644 index 53a76fbdf..000000000 --- a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system/preset-global.service +++ /dev/null @@ -1,17 +0,0 @@ -[Unit] -ConditionFirstBoot=no -ConditionPathIsReadWrite=/etc - -DefaultDependencies=no - -Before=basic.target -Conflicts=shutdown.target -Before=shutdown.target - -[Service] -Type=oneshot -RemainAfterExit=yes -ExecStart=systemctl preset-all --global - -[Install] -WantedBy=basic.target diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service deleted file mode 100644 index 4bb28c3fd..000000000 --- a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service +++ /dev/null @@ -1 +0,0 @@ -# Masked \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system/systemd-networkd-wait-online.service b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system/systemd-networkd-wait-online.service deleted file mode 100644 index 4bb28c3fd..000000000 --- a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/system/systemd-networkd-wait-online.service +++ /dev/null @@ -1 +0,0 @@ -# Masked \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/zram-generator.conf b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/zram-generator.conf deleted file mode 100644 index 52ea5d619..000000000 --- a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/systemd/zram-generator.conf +++ /dev/null @@ -1,3 +0,0 @@ -[zram0] -zram-size = min(ram / 2, 16384) -compression-algorithm = zstd \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer deleted file mode 100644 index ee9db5269..000000000 --- a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer +++ /dev/null @@ -1,15 +0,0 @@ -[Transfer] -ProtectVersion=%A - -[Source] -Type=url-file -Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download -MatchPattern=Elementary_@v.usr-%a-verity-sig.@u.raw - -[Target] -Type=partition -Path=auto -MatchPattern=Elementary_@v_verity_sig -MatchPartitionType=usr-verity-sig -PartitionFlags=0 -ReadOnly=1 \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer deleted file mode 100644 index c246af48d..000000000 --- a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer +++ /dev/null @@ -1,15 +0,0 @@ -[Transfer] -ProtectVersion=%A - -[Source] -Type=url-file -Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download -MatchPattern=Elementary_@v.usr-%a-verity.@u.raw - -[Target] -Type=partition -Path=auto -MatchPattern=Elementary_@v_verity -MatchPartitionType=usr-verity -PartitionFlags=0 -ReadOnly=1 \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer deleted file mode 100644 index 9e717e150..000000000 --- a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer +++ /dev/null @@ -1,15 +0,0 @@ -[Transfer] -ProtectVersion=%A - -[Source] -Type=url-file -Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download -MatchPattern=Elementary_@v.usr-%a.@u.raw.xz - -[Target] -Type=partition -Path=auto -MatchPattern=Elementary_@v -MatchPartitionType=usr -PartitionFlags=0 -ReadOnly=1 \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer deleted file mode 100644 index 801be7b83..000000000 --- a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer +++ /dev/null @@ -1,23 +0,0 @@ -[Transfer] -ProtectVersion=%A - -[Source] -Type=url-file -Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download -MatchPattern=Elementary_@v.efi - -[Target] -Type=regular-file -Path=/EFI/Linux -PathRelativeTo=boot -MatchPattern=Elementary_@v_%a+@l-@d.efi \ - Elementary_@v_%a+@l.efi \ - Elementary_@v_%a.efi \ - Elementary_@v+@l-@d.efi \ - Elementary_@v+@l.efi \ - Elementary_@v.efi -# MatchPartitionType=uki -Mode=0600 -TriesLeft=3 -TriesDone=0 -InstancesMax=2 \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/tmpfiles.d/etc.conf b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/tmpfiles.d/etc.conf deleted file mode 100644 index b5c7c2a00..000000000 --- a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/tmpfiles.d/etc.conf +++ /dev/null @@ -1,83 +0,0 @@ -# This overrides the same file from systemd since we want to symlink everything -# into /etc instead of copying so updates to /usr propagate properly. -L /etc/os-release - - - - ../usr/lib/os-release -L+ /etc/mtab - - - - ../proc/self/mounts -# Contains the default systemd locale -L /etc/locale.conf -C /etc/profile -C /etc/profile.d -# Required by pam_env plugin -C /etc/security -L? /etc/bashrc -L? /etc/bash.bashrc -L? /etc/bash.bash_logout -# TODO: drop once https://github.com/scop/bash-completion/pull/1399 is merged, -# needed for shell completion of sd-run/run0 -L? /etc/bash_completion.d -# Canonical location to look for certificates -L? /etc/ca-certificates -L? /etc/crypto-policies -L? /etc/pki -L /etc/debuginfod -L /etc/ssh/ssh_config -L /etc/ssh/ssh_config.d -L /etc/ssh/sshd_config -L /etc/ssh/sshd_config.d -# Canonical location to look for certificates -L /etc/ssl -# niri-session requires /etc/shells -L /etc/shells -L /etc/sudoers -# Required by pam environment plugin -L /etc/environment -# Required to generate desktop environment application menus -C /etc/xdg -# Contains default font configuration -L /etc/fonts -# Configuration for man -L /etc/man_db.conf -# Configuration for ldconfig -L /etc/ld.so.conf -L /etc/ld.so.conf.d -# Required by authselect (Fedora/CentOS) -L? /etc/authselect -# Required by tuned -L? /etc/tuned -# Required by light -C /etc/lightdm -C /etc/dbus-1 -# Required by geoclue -L? /etc/geoclue -# Required by fwupd -L /etc/fwupd -# Required by gnome -C /etc/dconf -# Used by some services, like nftables -L? /etc/services -# Required by nftables service -L? /etc/nftables.conf -L? /etc/skel -# CUPS is pulled in by GNOME, and fails if the configs are not there -L? /etc/cups -# On some distributions various binaries in /usr/bin are managed via -# /etc/alternatives. -L? /etc/alternatives -# ModemManager needs its dbus policy file -L? /etc/dbus1/systemd.d/org.freedesktop.ModemManager1.conf -# man fails without this in /etc/ -L? /etc/manpath.config -# WPASupplicant also needs its configuration -L? /etc/wpa_supplicant/wpa_supplicant.conf -# Make sure flatpak's XDG_DATA_DIR integration works -L? /etc/profile.d/flatpak.sh - -C /etc/NetworkManager -C /etc/apparmor -C /etc/apparmor.d - -C /etc/sudoers.d - -C /etc/repart-installer - -C+ /etc/lightdm/lightdm.conf.d/12-autologin.conf -C+ /etc/sudoers.d/liveiso \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.postinst.chroot b/mkosi.profiles/liveiso/mkosi.postinst.chroot deleted file mode 100755 index 51c88d78e..000000000 --- a/mkosi.profiles/liveiso/mkosi.postinst.chroot +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -if command -v authselect >/dev/null; then - authselect select local - authselect enable-feature with-systemd-homed -fi - -if [[ -d /etc/pam.d ]]; then - find /etc/pam.d -mindepth 1 -exec mv {} /usr/lib/pam.d \; - rmdir /etc/pam.d -fi - -# Get rid of obsolete stuff in the pam stack. -find /usr/lib/pam.d/ -mindepth 1 -exec sed --in-place '/pam_shells.so/d' {} \; -find /usr/lib/pam.d/ -mindepth 1 -exec sed --in-place '/pam_securetty.so/d' {} \; - -# Fedora disables the userdb ssh dropin by default, but helpfully leaves it available in -# the package so that we can just symlink it to a name that will be picked up by systemd-tmpfiles. -if [[ -f /usr/lib/tmpfiles.d/20-systemd-userdb.conf.example ]]; then - ln --symbolic 20-systemd-userdb.conf.example /usr/lib/tmpfiles.d/20-systemd-userdb.conf -fi - - -( - . /usr/lib/os-release - cat >/usr/lib/os-release </usr/lib/issue <>>>>>> flash InitrdProfiles= KernelInitrdModules= default @@ -28,11 +34,8 @@ KernelCommandLine= audit=0 systemd.image_policy=esp=unprotected:xbootldr=unprotected+unused+absent:usr=signed:root=unprotected+absent:home=unprotected+absent:=ignore systemd.image_filter=usr=Elementary_*:usr-verity=Elementary_*:usr-verity-sig=Elementary_*:root=Elementary-*:home=Elementary-* - systemd.debug-shell=ttyS0 - rd.systemd.debug-shell=ttyS0 ipe.enforce=0 [Validation] -# just for now, please do enable secureboot SecureBoot=no SignExpectedPcr=no diff --git a/mkosi.profiles/sysupdate/mkosi.repart/00-esp.conf b/mkosi.profiles/sysupdate/mkosi.repart/00-esp.conf index 847605508..cdfc1eaef 100644 --- a/mkosi.profiles/sysupdate/mkosi.repart/00-esp.conf +++ b/mkosi.profiles/sysupdate/mkosi.repart/00-esp.conf @@ -3,5 +3,14 @@ Type=esp Format=vfat CopyFiles=/efi:/ CopyFiles=/boot:/ +<<<<<<< HEAD +<<<<<<<< HEAD:mkosi.profiles/sysupdate/mkosi.repart/00-esp.conf SizeMinBytes=0.5G +======== +SizeMinBytes=1G +>>>>>>>> flash:mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/00-esp.conf SizeMaxBytes=2G +======= +SizeMinBytes=1.5G +SizeMaxBytes=1.5G +>>>>>>> flash diff --git a/mkosi.profiles/sysupdate/mkosi.repart/12-usr.conf b/mkosi.profiles/sysupdate/mkosi.repart/12-usr.conf index ef8f5790d..adc725ec3 100644 --- a/mkosi.profiles/sysupdate/mkosi.repart/12-usr.conf +++ b/mkosi.profiles/sysupdate/mkosi.repart/12-usr.conf @@ -7,4 +7,9 @@ Verity=data VerityMatchKey=usr Minimize=yes Compression=zstd +<<<<<<< HEAD +======= +SizeMinBytes=5G +SizeMaxBytes=5G +>>>>>>> flash SplitName=%t.%U From 0d0aab39a2e694d8a1c13c2c20071d224b7caee0 Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Sun, 9 Aug 2026 12:46:57 -0400 Subject: [PATCH 25/86] Update workflow --- .github/workflows/monthly-image-9.0.yml | 39 -------------------- .github/workflows/release.yaml | 17 +++++---- build-bmedia.sh | 47 ------------------------- 3 files changed, 8 insertions(+), 95 deletions(-) delete mode 100644 .github/workflows/monthly-image-9.0.yml delete mode 100755 build-bmedia.sh diff --git a/.github/workflows/monthly-image-9.0.yml b/.github/workflows/monthly-image-9.0.yml deleted file mode 100644 index 8ec711f96..000000000 --- a/.github/workflows/monthly-image-9.0.yml +++ /dev/null @@ -1,39 +0,0 @@ -name: Monthly Image-based OS 9 - -on: - push: - branches: - - main - schedule: - - cron: "0 0 1 * *" - workflow_dispatch: {} - -jobs: - build: - strategy: - fail-fast: false - matrix: - include: - - runner: ubuntu-26.04 - arch: amd64 - - runner: ubuntu-26.04-arm - arch: arm64 - runs-on: ${{ matrix.runner }} - - container: - image: debian:latest - volumes: - - /proc:/proc - options: --privileged - - steps: - - name: Clone build scripts - uses: actions/checkout@v7 - - - name: Build - run: | - ./build.sh etc/terraform-daily-9.0-azure-${{ matrix.arch }}.conf - - - name: Upload - run: | - ./upload.sh "${{ secrets.key }}" "${{ secrets.secret }}" "${{ secrets.endpoint }}" "${{ secrets.bucket }}" "${{ secrets.install_bucket }}" diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index aee5cd80e..283c865b3 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -32,20 +32,19 @@ jobs: - name: Compress (xz7) usr.raw run: | - find mkosi.output -type f -name "*.usr-*.raw" ! -name "*verity*" -exec xz -7v -T0 {} + + find mkosi.output/sysupdate -maxdepth 1 -type f -name "*.usr-*.raw" ! -name "*verity*" -exec xz -7v -T0 {} + - name: Generate SHA256SUMS run: | - cd mkosi.output + cd mkosi.output/sysupdate sha256sum *.efi *.usr-*.raw.xz *.usr-*-verity*.raw *.usr-*-verity-sig*.raw > SHA256SUMS - echo "Generated SHA256SUMS:" cat SHA256SUMS - name: Extract Date id: get_date run: | - FILE_PATH=$(ls mkosi.output/Elementary_*.raw | head -n 1) + FILE_PATH=$(ls mkosi.output/sysupdate/Elementary_*.raw | grep -E 'Elementary_[0-9]+\.raw$' | head -n 1) FILE_NAME=$(basename "$FILE_PATH") TIMESTAMP=$(echo "$FILE_NAME" | sed 's/^Elementary_//;s/\..*//') @@ -58,8 +57,8 @@ jobs: tag_name: ${{ steps.get_date.outputs.RELEASE_TAG }} name: Release ${{ steps.get_date.outputs.RELEASE_TAG }} files: | - mkosi.output/*.efi - mkosi.output/*.usr-*.raw.xz - mkosi.output/*.usr-*-verity*.raw - mkosi.output/*.usr-*-verity-sig*.raw - mkosi.output/SHA256SUMS \ No newline at end of file + mkosi.output/sysupdate/*.efi + mkosi.output/sysupdate/*.usr-*.raw.xz + mkosi.output/sysupdate/*.usr-*-verity*.raw + mkosi.output/sysupdate/*.usr-*-verity-sig*.raw + mkosi.output/sysupdate/SHA256SUMS \ No newline at end of file diff --git a/build-bmedia.sh b/build-bmedia.sh deleted file mode 100755 index 36ccf8065..000000000 --- a/build-bmedia.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash - -set -e - -echo "Building sysupdate profile to extract UKI..." -# just run-in-podman mkosi -B --debug --force --profile=sysupdate - - -RAW_IMAGE=$(find mkosi.output -maxdepth 1 -type f \ - | grep -E '/[^/]+_[0-9]{14}\.raw$' \ - | head -n1) - -if [ -z "$RAW_IMAGE" ]; then - echo "Fatal Error: no timestamped .raw image found in mkosi.output" >&2 - exit 1 -fi - -chown -R "$USER":"$USER" mkosi.output - -echo "Building final live ISO..." - -BASE_ISO="base.iso" -OUT_ISO="mkosi.output/elementary-liveiso.iso" -INSTALL_SCRIPT="mkosi.profiles/liveiso/mkosi.extra/usr/sbin/elementary-install" -REPART_DIR="mkosi.profiles/liveiso/mkosi.extra/etc/repart-installer" - -rm -f "$OUT_ISO" - -podman run --rm \ - -v "$PWD:/work:Z" \ - -w /work \ - docker.io/alpine:latest \ - sh -c ' - apk add --no-cache xorriso && \ - xorriso -indev "'"$BASE_ISO"'" \ - -outdev "'"$OUT_ISO"'" \ - -boot_image any replay \ - -map "'"$RAW_IMAGE"'" "/extra/'"$(basename "$RAW_IMAGE")"'" \ - -map "'"$INSTALL_SCRIPT"'" "/extra/install.sh" \ - -map "'"$REPART_DIR"'" "/extra/repart.d" \ - -chmod 0755 "/extra/install.sh" -- \ - -commit - ' - -chmod 666 "$OUT_ISO" - -echo "Done: $OUT_ISO" \ No newline at end of file From 735985c9596ba045ecda5c71e0d933457573b520 Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Sun, 9 Aug 2026 12:53:27 -0400 Subject: [PATCH 26/86] Remove mkosi.clean --- mkosi.clean | 6 ------ 1 file changed, 6 deletions(-) delete mode 100755 mkosi.clean diff --git a/mkosi.clean b/mkosi.clean deleted file mode 100755 index 7b94e2bd8..000000000 --- a/mkosi.clean +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh -set -e -set -o nounset - -rm -rf "$OUTPUTDIR"/"$IMAGE_ID"* -rm -rf "$SRCDIR/cache" From fd6d6a83a48ff9147b1dbed6fdd71b8732bf24e2 Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Sun, 9 Aug 2026 13:59:55 -0400 Subject: [PATCH 27/86] Change profile name --- .github/workflows/release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 283c865b3..d03663a4b 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -25,7 +25,7 @@ jobs: - name: Build image with mkosi run: | - sudo mkosi -B --debug --force --profile=elementaryos + sudo mkosi -B --debug --force --profile=sysupdate - name: Update permissions run: sudo chown -R $USER:$USER mkosi.output From d9296834562902e37031085882ac94db9f90318b Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Sun, 9 Aug 2026 14:05:37 -0400 Subject: [PATCH 28/86] Fix badly merged stuff --- .../mkosi.extra/usr/lib/repart.d/00-esp.conf | 8 +--- mkosi.profiles/flash/mkosi.repart/00-esp.conf | 4 +- .../mkosi.extra/usr/lib/repart.d/00-esp.conf | 5 --- .../usr/lib/repart.d/10-usr-verity-sig.conf | 8 ---- .../usr/lib/repart.d/11-usr-verity.conf | 7 --- .../mkosi.extra/usr/lib/repart.d/12-usr.conf | 7 --- .../mkosi.extra/usr/sbin/elementary-install | 44 ------------------- mkosi.profiles/sysupdate/mkosi.conf | 3 -- .../sysupdate/mkosi.repart/00-esp.conf | 9 ---- .../sysupdate/mkosi.repart/12-usr.conf | 5 --- 10 files changed, 4 insertions(+), 96 deletions(-) delete mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/00-esp.conf delete mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf delete mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf delete mode 100644 mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/12-usr.conf delete mode 100755 mkosi.profiles/liveiso/mkosi.extra/usr/sbin/elementary-install diff --git a/mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/00-esp.conf b/mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/00-esp.conf index 30d771984..3ac509c71 100644 --- a/mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/00-esp.conf +++ b/mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/00-esp.conf @@ -3,9 +3,5 @@ Type=esp Format=vfat CopyFiles=/efi:/ CopyFiles=/boot:/ -<<<<<<<< HEAD:mkosi.profiles/sysupdate/mkosi.repart/00-esp.conf -SizeMinBytes=0.5G -======== -SizeMinBytes=1G ->>>>>>>> flash:mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/00-esp.conf -SizeMaxBytes=2G +SizeMinBytes=1.5G +SizeMaxBytes=1.5G diff --git a/mkosi.profiles/flash/mkosi.repart/00-esp.conf b/mkosi.profiles/flash/mkosi.repart/00-esp.conf index 0096a3039..3ac509c71 100644 --- a/mkosi.profiles/flash/mkosi.repart/00-esp.conf +++ b/mkosi.profiles/flash/mkosi.repart/00-esp.conf @@ -3,5 +3,5 @@ Type=esp Format=vfat CopyFiles=/efi:/ CopyFiles=/boot:/ -SizeMinBytes=1G -SizeMaxBytes=2G +SizeMinBytes=1.5G +SizeMaxBytes=1.5G diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/00-esp.conf b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/00-esp.conf deleted file mode 100644 index 28363e46d..000000000 --- a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/00-esp.conf +++ /dev/null @@ -1,5 +0,0 @@ -[Partition] -Type=esp -Format=vfat -SizeMinBytes=0.5G -SizeMaxBytes=0.5G \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf deleted file mode 100644 index 0f1664764..000000000 --- a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf +++ /dev/null @@ -1,8 +0,0 @@ -[Partition] -Type=usr-verity-sig -Label=%M_%A_verity_sig -Verity=signature -VerityMatchKey=usr -SplitName=%t.%U -SizeMinBytes=0.5G -SizeMaxBytes=0.5G diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf deleted file mode 100644 index c3ccb570a..000000000 --- a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf +++ /dev/null @@ -1,7 +0,0 @@ -[Partition] -Type=usr-verity -CopyBlocks=auto -Label=%M_%A_verity -SplitName=%t.%U -SizeMinBytes=0.5G -SizeMaxBytes=0.5G diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/12-usr.conf b/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/12-usr.conf deleted file mode 100644 index 8f82320ed..000000000 --- a/mkosi.profiles/liveiso/mkosi.extra/usr/lib/repart.d/12-usr.conf +++ /dev/null @@ -1,7 +0,0 @@ -[Partition] -Type=usr -CopyBlocks=auto -Label=%M_%A -SplitName=%t.%U -SizeMinBytes=1G -SizeMaxBytes=3G \ No newline at end of file diff --git a/mkosi.profiles/liveiso/mkosi.extra/usr/sbin/elementary-install b/mkosi.profiles/liveiso/mkosi.extra/usr/sbin/elementary-install deleted file mode 100755 index 69a3f1381..000000000 --- a/mkosi.profiles/liveiso/mkosi.extra/usr/sbin/elementary-install +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/bash -set -eo pipefail - -echo "Thank you for testing! <3" - -apt-get install fzf systemd-repart systemd-boot -y - -medium=$(findmnt -rn -t iso9660,udf -o TARGET | head -1) -extra="$medium/extra" -raw_src=$(find "$extra" -maxdepth 1 -type f -name '*.raw' | head -n1) -efi_src=$(find "$extra" -maxdepth 1 -type f -name '*.efi' | head -n1) -repart_src="$extra/repart.d" - -echo "Using source image: $raw_src" - -selected_disk=$(lsblk -d -n -p -o NAME,SIZE,MODEL -e 7,11 | fzf \ - --prompt="Select installation disk (ALL DATA WILL BE LOST): " \ - --header="NAME SIZE MODEL") - -if [ -z "$selected_disk" ]; then - echo "Installation aborted: No disk selected." - exit 1 -fi - -dest_dev=$(echo "$selected_disk" | awk '{print $1}') - -echo "$dest_dev selected for repartitioning..." -echo "Destroying drive in 3s ..." -sleep 1 -echo "Destroying drive in 2s ..." -sleep 1 -echo "Destroying drive in 1s ..." -sleep 1 - -/usr/sbin/wipefs -a "$dest_dev" - -systemd-repart \ - --copy-from="$raw_src" \ - --definitions="$repart_src" \ - --dry-run=no \ - --empty=force \ - "$dest_dev" - -echo "Everything is done! Enjoy your stay." \ No newline at end of file diff --git a/mkosi.profiles/sysupdate/mkosi.conf b/mkosi.profiles/sysupdate/mkosi.conf index 473330309..2bf0d9fdd 100644 --- a/mkosi.profiles/sysupdate/mkosi.conf +++ b/mkosi.profiles/sysupdate/mkosi.conf @@ -11,10 +11,7 @@ ImageId=Elementary [Content] Bootable=yes Bootloader=systemd-boot -<<<<<<< HEAD UnifiedKernelImageFormat=%i_%v -======= ->>>>>>> flash InitrdProfiles= KernelInitrdModules= default diff --git a/mkosi.profiles/sysupdate/mkosi.repart/00-esp.conf b/mkosi.profiles/sysupdate/mkosi.repart/00-esp.conf index cdfc1eaef..3ac509c71 100644 --- a/mkosi.profiles/sysupdate/mkosi.repart/00-esp.conf +++ b/mkosi.profiles/sysupdate/mkosi.repart/00-esp.conf @@ -3,14 +3,5 @@ Type=esp Format=vfat CopyFiles=/efi:/ CopyFiles=/boot:/ -<<<<<<< HEAD -<<<<<<<< HEAD:mkosi.profiles/sysupdate/mkosi.repart/00-esp.conf -SizeMinBytes=0.5G -======== -SizeMinBytes=1G ->>>>>>>> flash:mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/00-esp.conf -SizeMaxBytes=2G -======= SizeMinBytes=1.5G SizeMaxBytes=1.5G ->>>>>>> flash diff --git a/mkosi.profiles/sysupdate/mkosi.repart/12-usr.conf b/mkosi.profiles/sysupdate/mkosi.repart/12-usr.conf index adc725ec3..ef8f5790d 100644 --- a/mkosi.profiles/sysupdate/mkosi.repart/12-usr.conf +++ b/mkosi.profiles/sysupdate/mkosi.repart/12-usr.conf @@ -7,9 +7,4 @@ Verity=data VerityMatchKey=usr Minimize=yes Compression=zstd -<<<<<<< HEAD -======= -SizeMinBytes=5G -SizeMaxBytes=5G ->>>>>>> flash SplitName=%t.%U From b5c11a2d576cc8ba35c56002a9b1444beffb2509 Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Sun, 9 Aug 2026 14:54:24 -0400 Subject: [PATCH 29/86] Add b sides --- README.md | 29 ++++++++++++------- .../sysupdate/mkosi.repart/12-usr.conf | 2 ++ .../mkosi.repart/20-usr-verify-sig-bside.conf | 3 ++ .../mkosi.repart/21-usr-verity-bside.conf | 6 ++++ .../sysupdate/mkosi.repart/22-usr-bside.conf | 6 ++++ 5 files changed, 35 insertions(+), 11 deletions(-) create mode 100644 mkosi.profiles/sysupdate/mkosi.repart/20-usr-verify-sig-bside.conf create mode 100644 mkosi.profiles/sysupdate/mkosi.repart/21-usr-verity-bside.conf create mode 100644 mkosi.profiles/sysupdate/mkosi.repart/22-usr-bside.conf diff --git a/README.md b/README.md index 11e08068a..6523379f9 100644 --- a/README.md +++ b/README.md @@ -23,22 +23,29 @@ --- -## Building bootable media - -> ⚠️ The live bootable media is NOT compatible with the CDROM driver from qemu, use virtio or SATA. If you keep the .iso.raw extension (default), Gnome Boxes will auto-detect it correctly ⚠️ +## Bootable media 1. Install `podman` 2. Generate keys `just genkey` -3. Build `just build-bootablemedia` +3. Build `just generate-liveiso` 4. Either: - 1. Flash with Fedora Media Writer or Impression - 2. Boot the Elementary_*.iso.raw with Gnome Boxes
+ 1. Flash with [Fedora Media Writer](https://flathub.org/en/apps/org.fedoraproject.MediaWriter) or [Impression](flathub.org/en/apps/io.gitlab.adhami3310.Impression) + 2. Boot `elementary-liveiso.iso` with Gnome Boxes (>=51)
+5. Inside the liveiso, run `run0 elementary-install` +6. It should take arround a minute, then reboot +7. After boot, flatpak should start installing, it might take a while + + +## Operations +### Upgrades +`run0 sysupdate update --verify=no` -### Install (qemu) +Append the exact version ID at the end to upgrade to a specific version, or downgrade. -1. Add the iso as a disk -2. Add a destination disk (Minimum tested is 70gb) -3. Boot the liveiso -4. Run `sudo elementary-install` +## Minimum specs +- UEFI +- ~8gb usb stick +- Gnome Boxes >=51 (for VM only) +- 70gb destination disk, 4gb ram (less should be possible, but not tested) diff --git a/mkosi.profiles/sysupdate/mkosi.repart/12-usr.conf b/mkosi.profiles/sysupdate/mkosi.repart/12-usr.conf index ef8f5790d..dbcaa7b95 100644 --- a/mkosi.profiles/sysupdate/mkosi.repart/12-usr.conf +++ b/mkosi.profiles/sysupdate/mkosi.repart/12-usr.conf @@ -8,3 +8,5 @@ VerityMatchKey=usr Minimize=yes Compression=zstd SplitName=%t.%U +SizeMinBytes=7G +SizeMaxBytes=7G diff --git a/mkosi.profiles/sysupdate/mkosi.repart/20-usr-verify-sig-bside.conf b/mkosi.profiles/sysupdate/mkosi.repart/20-usr-verify-sig-bside.conf new file mode 100644 index 000000000..fd8815d3c --- /dev/null +++ b/mkosi.profiles/sysupdate/mkosi.repart/20-usr-verify-sig-bside.conf @@ -0,0 +1,3 @@ +[Partition] +Type=usr-verity-sig +Label=_empty \ No newline at end of file diff --git a/mkosi.profiles/sysupdate/mkosi.repart/21-usr-verity-bside.conf b/mkosi.profiles/sysupdate/mkosi.repart/21-usr-verity-bside.conf new file mode 100644 index 000000000..fff802a78 --- /dev/null +++ b/mkosi.profiles/sysupdate/mkosi.repart/21-usr-verity-bside.conf @@ -0,0 +1,6 @@ +[Partition] +Type=usr-verity +Label=_empty +NoAuto=1 +SizeMinBytes=400M +SizeMaxBytes=400M \ No newline at end of file diff --git a/mkosi.profiles/sysupdate/mkosi.repart/22-usr-bside.conf b/mkosi.profiles/sysupdate/mkosi.repart/22-usr-bside.conf new file mode 100644 index 000000000..7b19f433d --- /dev/null +++ b/mkosi.profiles/sysupdate/mkosi.repart/22-usr-bside.conf @@ -0,0 +1,6 @@ +[Partition] +Type=usr +Label=_empty +NoAuto=1 +SizeMinBytes=7G +SizeMaxBytes=7G \ No newline at end of file From 0cdaf20ed768f2cf6448bf9414668632e59bed5a Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Sun, 9 Aug 2026 15:40:00 -0400 Subject: [PATCH 30/86] Add the usroverlay command --- .../sysupdate/mkosi.extra/usr/sbin/usroverlay | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100755 mkosi.profiles/sysupdate/mkosi.extra/usr/sbin/usroverlay diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/sbin/usroverlay b/mkosi.profiles/sysupdate/mkosi.extra/usr/sbin/usroverlay new file mode 100755 index 000000000..ee8ce750f --- /dev/null +++ b/mkosi.profiles/sysupdate/mkosi.extra/usr/sbin/usroverlay @@ -0,0 +1,62 @@ +#!/bin/bash +set -euo pipefail + +RUN_DIR=/run/usroverlay +UPPER="$RUN_DIR/upper" +WORK="$RUN_DIR/work" +TARGET=/usr + +if [[ $EUID -ne 0 ]]; then + SCRIPT_PATH="$(readlink -f "$0")" + exec run0 "$SCRIPT_PATH" "$@" +fi + +is_active() { + findmnt -n -o FSTYPE "$TARGET" 2>/dev/null | grep -q '^overlay$' +} + +cmd_enable() { + if is_active; then + echo "usroverlay: already active on $TARGET" + exit 0 + fi + + mkdir -p "$UPPER" "$WORK" + mount -t overlay overlay \ + -o "lowerdir=$TARGET,upperdir=$UPPER,workdir=$WORK" \ + "$TARGET" + + echo "usroverlay is enabled, discard with usroverlay discard" +} + +cmd_discard() { + if ! is_active; then + echo "usroverlay: not currently active" >&2 + exit 1 + fi + + umount -l "$TARGET" + ( sleep 5; rm -rf "$RUN_DIR" 2>/dev/null || true ) & + disown + + echo "usroverlay has been discarded" +} + +cmd_status() { + if is_active; then + echo "usroverlay: ACTIVE" + else + echo "usroverlay: inactive" + fi +} + +case "${1:-}" in + enable) cmd_enable ;; + discard) cmd_discard ;; + status) cmd_status ;; + *) + echo "Usage: usroverlay {enable|discard|status}" >&2 + cmd_status + exit 1 + ;; +esac \ No newline at end of file From c1870f37ffaefeb911d908ea987d95ef4e25daa8 Mon Sep 17 00:00:00 2001 From: Niko Date: Tue, 11 Aug 2026 15:40:17 -0700 Subject: [PATCH 31/86] Replace manual package list for metapackages (#22) --- .../mkosi.conf.d/elementary-apps.conf | 20 ----------- .../mkosi.conf.d/elementary-desktop.conf | 34 +++---------------- .../mkosi.conf.d/elementary-panel.conf | 22 ------------ .../mkosi.conf.d/elementary-settings.conf | 30 ---------------- 4 files changed, 5 insertions(+), 101 deletions(-) delete mode 100644 mkosi.conf.d/elementary/mkosi.conf.d/elementary-apps.conf delete mode 100644 mkosi.conf.d/elementary/mkosi.conf.d/elementary-panel.conf delete mode 100644 mkosi.conf.d/elementary/mkosi.conf.d/elementary-settings.conf diff --git a/mkosi.conf.d/elementary/mkosi.conf.d/elementary-apps.conf b/mkosi.conf.d/elementary/mkosi.conf.d/elementary-apps.conf deleted file mode 100644 index fb1b05f40..000000000 --- a/mkosi.conf.d/elementary/mkosi.conf.d/elementary-apps.conf +++ /dev/null @@ -1,20 +0,0 @@ -[Match] -Distribution=ubuntu - -[Content] -Packages= - contractor - io.elementary.appcenter - io.elementary.bluetooth-daemon - io.elementary.code - io.elementary.feedback - io.elementary.monitor - io.elementary.onboarding - io.elementary.sideload - io.elementary.terminal - pantheon-files - - - - - diff --git a/mkosi.conf.d/elementary/mkosi.conf.d/elementary-desktop.conf b/mkosi.conf.d/elementary/mkosi.conf.d/elementary-desktop.conf index 194189ac1..820303b77 100644 --- a/mkosi.conf.d/elementary/mkosi.conf.d/elementary-desktop.conf +++ b/mkosi.conf.d/elementary/mkosi.conf.d/elementary-desktop.conf @@ -2,37 +2,13 @@ Distribution=ubuntu [Content] +WithRecommends=yes Packages= - appcenter - pantheon-greeter - elementary-artwork - elementary-wallpapers - fonts-inter - fonts-elementary-core - fonts-elementary-extra - fonts-roboto-mono-elementary - elementary-default-settings elementary-desktop elementary-minimal - elementary-printer-test-page - elementary-os-overlay - elementary-icon-theme - elementary-sdk elementary-standard - io.elementary.session-settings - io.elementary.initial-setup - gnome-session-bin - gnome-session-common - desktop-base - pantheon-shell - pantheon - io.elementary.settings-daemon - io.elementary.portals - pantheon-agent-polkit - xwayland - gala - - - - + pantheon-greeter # if not explicitly named, get stuck on a black screen post-install + gala # if not explicitly named, get stuck on a black screen post-install +RemovePackages= + gnome-shell # gets pulled in by gnome desktop and auto-booted into. remove it again! diff --git a/mkosi.conf.d/elementary/mkosi.conf.d/elementary-panel.conf b/mkosi.conf.d/elementary/mkosi.conf.d/elementary-panel.conf deleted file mode 100644 index c875537fa..000000000 --- a/mkosi.conf.d/elementary/mkosi.conf.d/elementary-panel.conf +++ /dev/null @@ -1,22 +0,0 @@ -[Match] -Distribution=ubuntu - -[Content] -Packages= - io.elementary.dock - io.elementary.notifications - io.elementary.wingpanel - io.elementary.shortcut-overlay - io.elementary.panel.bluetooth - io.elementary.panel.datetime - io.elementary.panel.keyboard - io.elementary.panel.network - io.elementary.panel.nightlight - io.elementary.panel.notifications - io.elementary.panel.power - io.elementary.quick-settings - - - - - diff --git a/mkosi.conf.d/elementary/mkosi.conf.d/elementary-settings.conf b/mkosi.conf.d/elementary/mkosi.conf.d/elementary-settings.conf deleted file mode 100644 index dbc9228c9..000000000 --- a/mkosi.conf.d/elementary/mkosi.conf.d/elementary-settings.conf +++ /dev/null @@ -1,30 +0,0 @@ -[Match] -Distribution=ubuntu - -[Content] -Packages= - io.elementary.settings - io.elementary.settings.applications - io.elementary.settings.bluetooth - io.elementary.settings.datetime - io.elementary.settings.desktop - io.elementary.settings.display - io.elementary.settings.keyboard - io.elementary.settings.locale - io.elementary.settings.mouse-touchpad - io.elementary.settings.network - io.elementary.settings.notifications - io.elementary.settings.onlineaccounts - io.elementary.settings.power - io.elementary.settings.printers - io.elementary.settings.screentime-limits - io.elementary.settings.security-privacy - io.elementary.settings.sound - io.elementary.settings.system - io.elementary.settings.useraccounts - io.elementary.settings.wacom - - - - - From 00571ee5e2cc0c9f4ec53f7c810074e04b5e6061 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Wed, 12 Aug 2026 09:56:37 -0700 Subject: [PATCH 32/86] Update README.md (#23) * Update README.md * Create cache dir --- README.md | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 6523379f9..89f4c4558 100644 --- a/README.md +++ b/README.md @@ -23,18 +23,30 @@ --- -## Bootable media - -1. Install `podman` -2. Generate keys `just genkey` -3. Build `just generate-liveiso` -4. Either: - 1. Flash with [Fedora Media Writer](https://flathub.org/en/apps/org.fedoraproject.MediaWriter) or [Impression](flathub.org/en/apps/io.gitlab.adhami3310.Impression) - 2. Boot `elementary-liveiso.iso` with Gnome Boxes (>=51)
-5. Inside the liveiso, run `run0 elementary-install` -6. It should take arround a minute, then reboot -7. After boot, flatpak should start installing, it might take a while +## Building, Testing, and Installation +You'll need the following dependencies: +* podman +* just + +Create the cache directory +``` +sudo mkdir /var/cache/mkosi +``` + +Generate keys and then build with `just` + +```bash +just genkey +just generate-liveiso +``` +Create install media with [Fedora Media Writer](https://flathub.org/en/apps/org.fedoraproject.MediaWriter) or [Impression](flathub.org/en/apps/io.gitlab.adhami3310.Impression). Or boot with Gnome Boxes (>=51). Then, in demo mode, install via script: + +```bash +run0 elementary-install +``` + +It should take arround a minute, then reboot. After boot, Flatpak should start installing, it might take a while. ## Operations From 18d368844c2fd8e544a212f49e1ec18f5bf9eb95 Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Fri, 14 Aug 2026 13:06:03 -0400 Subject: [PATCH 33/86] feat: Initial work on classic mode (#24) * feat: :construction: Initial work on classic mode * Add basic config * First working installer * Remove flatpak-preinstall * Remove comments --- Justfile | 21 +++-- README.md | 14 +++ assemble-iso.sh | 86 +++++++++---------- mkosi.conf | 1 + .../mkosi.conf.d/elementary-desktop.conf | 4 +- .../elementary/mkosi.conf.d/elementary.conf | 47 +++++----- .../system-preset/10-elementary.preset | 1 - .../system/flatpak-preinstalld.service | 22 ----- .../flatpak/preinstall.d/appcenter.preinstall | 51 ----------- .../flatpak/remotes.d/appcenter.flatpakrepo | 9 -- .../flatpak/remotes.d/flathub.flatpakrepo | 8 -- mkosi.postinst.chroot | 24 ------ mkosi.profiles/{flash => classic}/mkosi.conf | 13 ++- .../classic/mkosi.extra/iso_root/.disk/info | 1 + .../mkosi.extra/iso_root/boot/grub/grub.cfg | 7 ++ .../casper/filesystem.manifest-remove | 1 + .../mkosi.extra/iso_root/dists/stable/Release | 7 ++ .../opt/repart-target/home/50-home.conf | 0 .../opt/repart-target/root/40-root.conf | 0 .../mkosi.extra/usr/sbin/elementary-install | 0 .../{flash => classic}/mkosi.finalize | 0 mkosi.profiles/classic/mkosi.posinst.chroot | 19 ++++ .../mkosi.repart}/00-esp.conf | 0 .../mkosi.repart/40-root.conf | 0 .../mkosi.repart}/50-home.conf | 0 .../usr/lib/repart.d/10-usr-verity-sig.conf | 8 -- .../usr/lib/repart.d/11-usr-verity.conf | 8 -- .../mkosi.extra/usr/lib/repart.d/12-usr.conf | 10 --- .../mkosi.extra/usr/lib/repart.d/40-root.conf | 11 --- .../lib/systemd/system-preset/01-live.preset | 1 - .../lib/systemd/system/liveiso-reset.service | 17 ---- mkosi.profiles/flash/mkosi.repart/00-esp.conf | 7 -- .../flash/mkosi.repart/50-home.conf | 8 -- mkosi.profiles/sysupdate/mkosi.posinst.chroot | 19 ++++ 34 files changed, 157 insertions(+), 268 deletions(-) delete mode 100644 mkosi.extra/usr/lib/systemd/system/flatpak-preinstalld.service delete mode 100644 mkosi.extra/usr/share/flatpak/preinstall.d/appcenter.preinstall delete mode 100644 mkosi.extra/usr/share/flatpak/remotes.d/appcenter.flatpakrepo delete mode 100644 mkosi.extra/usr/share/flatpak/remotes.d/flathub.flatpakrepo rename mkosi.profiles/{flash => classic}/mkosi.conf (69%) create mode 100644 mkosi.profiles/classic/mkosi.extra/iso_root/.disk/info create mode 100644 mkosi.profiles/classic/mkosi.extra/iso_root/boot/grub/grub.cfg create mode 100644 mkosi.profiles/classic/mkosi.extra/iso_root/casper/filesystem.manifest-remove create mode 100644 mkosi.profiles/classic/mkosi.extra/iso_root/dists/stable/Release rename mkosi.profiles/{flash => classic}/mkosi.extra/opt/repart-target/home/50-home.conf (100%) rename mkosi.profiles/{flash => classic}/mkosi.extra/opt/repart-target/root/40-root.conf (100%) rename mkosi.profiles/{flash => classic}/mkosi.extra/usr/sbin/elementary-install (100%) rename mkosi.profiles/{flash => classic}/mkosi.finalize (100%) create mode 100755 mkosi.profiles/classic/mkosi.posinst.chroot rename mkosi.profiles/{flash/mkosi.extra/usr/lib/repart.d => classic/mkosi.repart}/00-esp.conf (100%) rename mkosi.profiles/{flash => classic}/mkosi.repart/40-root.conf (100%) rename mkosi.profiles/{flash/mkosi.extra/usr/lib/repart.d => classic/mkosi.repart}/50-home.conf (100%) delete mode 100644 mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf delete mode 100644 mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf delete mode 100644 mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/12-usr.conf delete mode 100644 mkosi.profiles/flash/mkosi.extra/usr/lib/repart.d/40-root.conf delete mode 100644 mkosi.profiles/flash/mkosi.extra/usr/lib/systemd/system-preset/01-live.preset delete mode 100644 mkosi.profiles/flash/mkosi.extra/usr/lib/systemd/system/liveiso-reset.service delete mode 100644 mkosi.profiles/flash/mkosi.repart/00-esp.conf delete mode 100644 mkosi.profiles/flash/mkosi.repart/50-home.conf create mode 100755 mkosi.profiles/sysupdate/mkosi.posinst.chroot diff --git a/Justfile b/Justfile index 11f512ac8..c7c3b720e 100644 --- a/Justfile +++ b/Justfile @@ -1,25 +1,22 @@ -# resize: -# qemu-img resize ./mkosi.output/Elementary_x86-64.raw +40G - default: #!/usr/bin/env bash set -xeuo pipefail - just build-sysupdate + just --choose profile-sysupdate: sudo rm -rf mkosi.output/sysupdate just run-in-podman mkosi -B --debug --force --profile=sysupdate --workspace-directory=/workspace sudo chown -R {{env_var('USER')}}:{{env_var('USER')}} ./mkosi.output/ -profile-flash: - sudo rm -rf mkosi.output/live - just run-in-podman mkosi -B --debug --force --profile=flash --workspace-directory=/workspace +build-classic-liveenv: + sudo rm -rf mkosi.output/classic + just run-in-podman mkosi -B --debug --force --profile=classic --workspace-directory=/workspace sudo chown -R {{env_var('USER')}}:{{env_var('USER')}} ./mkosi.output/ generate-liveiso: #!/usr/bin/env bash - just profile-sysupdate - just profile-flash + just profile-sysupdate && \ + just build-classic-liveenv && \ ./assemble-iso.sh @@ -30,6 +27,8 @@ run-in-podman +command: mkdir -p {{env_var('HOME')}}/.cache/mkosi-workspace sudo podman run --rm -it \ + --network host \ + --dns 8.8.8.8 \ --privileged \ --security-opt label=disable \ -v /var/cache/mkosi:/var/cache/mkosi \ @@ -37,14 +36,14 @@ run-in-podman +command: -v "{{invocation_directory()}}:/work" \ -w /work \ -v "{{env_var('HOME')}}/.cache/mkosi-workspace:/workspace" \ - ghcr.io/jumpyvi/mkosi-debian:26 \ + ghcr.io/jumpyvi/mkosi:tanit \ {{command}} clean: just run-in-podman mkosi clean - sudo rm -r mkosi.tools/ mkosi.cache/ + sudo rm -r mkosi.tools/ mkosi.cache/ /var/cache/mkosi/* sign-repo: #!/usr/bin/env bash diff --git a/README.md b/README.md index 89f4c4558..41bba5034 100644 --- a/README.md +++ b/README.md @@ -61,3 +61,17 @@ Append the exact version ID at the end to upgrade to a specific version, or down - ~8gb usb stick - Gnome Boxes >=51 (for VM only) - 70gb destination disk, 4gb ram (less should be possible, but not tested) + + +### Versions + +| Features | Elementary OS 9 | Elementary OS 9 "Classic" | +| --------------- | ---------------------------------- | ------------------------- | +| -> **Bootloader** | systemd-boot (UEFI-Only) | grub2 | +| -> **Atomic** | Readonly /usr, with verity and sig | Insecure/Legacy | +| -> **Upgrade method** | systemd-sysupdate, monthly | Manual, with apt-get | +| -> **Nvidia** | Nvidia-Open available | Manual, with apt-get | +| -> **Encryption** | TPM, Passphrase or none | TPM, Passphrase or none | +| -> **Packages** | Flatpak, Linuxbrew and Sysupdate | Flatpak and apt-get | +| -> **Kernel** | Latest Ubuntu, UKI | Latest Ubuntu, UKI | +| -> **Display** | Wayland | X11 or Wayland | \ No newline at end of file diff --git a/assemble-iso.sh b/assemble-iso.sh index aabf516be..c336f39a1 100755 --- a/assemble-iso.sh +++ b/assemble-iso.sh @@ -1,8 +1,12 @@ #!/usr/bin/env bash set -euo pipefail -cd mkosi.output/live/ +cd mkosi.output/classic/ -RAW_IMAGE=$(find ../sysupdate -maxdepth 1 -type f \ +SEARCH_DIR=../sysupdate + +OUT_ISO="./elementary-liveiso.iso" + +RAW_IMAGE=$(find "$SEARCH_DIR" -maxdepth 1 -type f \ | grep -E '/[^/]+_[0-9]{14}\.raw$' \ | head -n1) @@ -13,13 +17,13 @@ fi XZ_IMAGE="${RAW_IMAGE}.xz" echo "Compressing raw image: $RAW_IMAGE -> $XZ_IMAGE..." -xz -7 -T0 -c "$RAW_IMAGE" > "$XZ_IMAGE" +xz -1 -T0 -c "$RAW_IMAGE" > "$XZ_IMAGE" # Detect version -output_dir=$(ls -d ElementaryLive_* | grep -vE '\.(raw|iso|vmlinuz|initrd|efi|manifest)$' | head -n 1) +output_dir=$(ls -d elementaryclassic_* | grep -vE '\.(raw|iso|vmlinuz|initrd|efi|manifest)$' | head -n 1) if [[ -z "$output_dir" ]]; then - echo "error: No mkosi.output, run just build-flash first." >&2 + echo "error: No mkosi.output, run just build-classic first." >&2 exit 1 fi @@ -27,63 +31,59 @@ base_name=$(basename "$output_dir") echo "Detected release target: $base_name" rm -rf iso_root -mkdir -p iso_root/casper -mkdir -p iso_root/boot/grub -# Write the GRUB configuration for Casper -cat << 'EOF' > iso_root/boot/grub/grub.cfg -set timeout=0 -set default=0 +rsync -a --delete "${base_name}/iso_root/" iso_root/ + +echo "Writing minimal APT disc structure for apt-cdrom..." + +mkdir -p iso_root/dists/stable/main/binary-amd64 +touch iso_root/dists/stable/main/binary-amd64/Packages +gzip -kf iso_root/dists/stable/main/binary-amd64/Packages +mkdir -p iso_root/pool -menuentry "ElementaryOS9 Live (pre-alpha)" { - linux /casper/vmlinuz boot=casper quiet splash --- - initrd /casper/initrd -} -EOF echo "Shoving everything in casper..." sudo podman run --rm -it \ - -v "$(pwd)":/workspace \ + --network host \ + --dns 8.8.8.8 \ + -v "$(pwd)":/workspace:Z \ -w /workspace \ - alpine:latest \ - sh -c "set -e && \ - apk update && \ - apk add --no-cache squashfs-tools grub grub-efi mtools xorriso && \ - - KERNEL_VERSION=\$(ls ${base_name}/lib/modules | head -n 1) && \ - chroot ${base_name} update-initramfs -u -k \${KERNEL_VERSION} && \ + ghcr.io/jumpyvi/xorriso:tanit \ + sh -c "set -e + KERNEL_VERSION=\$(ls ${base_name}/lib/modules | head -n 1) + chroot ${base_name} update-initramfs -u -k \${KERNEL_VERSION} - cp ${base_name}/boot/vmlinuz-\${KERNEL_VERSION} iso_root/casper/vmlinuz && \ - cp ${base_name}/boot/initrd.img-\${KERNEL_VERSION} iso_root/casper/initrd && \ + cp ${base_name}/boot/vmlinuz-\${KERNEL_VERSION} iso_root/casper/vmlinuz + cp ${base_name}/boot/initrd.img-\${KERNEL_VERSION} iso_root/casper/initrd - rm -f iso_root/casper/filesystem.squashfs && \ - mksquashfs ${base_name} iso_root/casper/filesystem.squashfs -comp xz && \ + rm -f iso_root/casper/filesystem.squashfs + mksquashfs ${base_name} iso_root/casper/filesystem.squashfs -comp xz - grub-mkrescue -o custom_ubuntu_live.iso iso_root/ && \ + grub-mkrescue -o custom_ubuntu_live.iso iso_root/ echo 'Live environment generated!'" echo "Generating installer..." -BASE_ISO="./live/custom_ubuntu_live.iso" -OUT_ISO="./elementary-liveiso.iso" +BASE_ISO="./classic/custom_ubuntu_live.iso" rm -f "../$OUT_ISO" cp "$XZ_IMAGE" . -LOCAL_RAW_IMAGE="./live/$(basename "$XZ_IMAGE")" +LOCAL_RAW_IMAGE="./classic/$(basename "$XZ_IMAGE")" podman run --rm \ - -v "../:/work:Z" \ - -w /work \ - docker.io/alpine:latest \ - sh -c ' - apk add --no-cache xorriso && \ - xorriso -indev "'"$BASE_ISO"'" \ - -outdev "'"$OUT_ISO"'" \ - -boot_image any keep \ - -map "'"$LOCAL_RAW_IMAGE"'" /extra/"$(basename "'"$LOCAL_RAW_IMAGE"'")" \ - -commit + --security-opt label=disable \ + -v "../:/work" \ + -w /work \ + ghcr.io/jumpyvi/xorriso:tanit \ + sh -c ' + apk add --no-cache xorriso && \ + xorriso -indev "'"$BASE_ISO"'" \ + -outdev "'"$OUT_ISO"'" \ + -boot_image any keep \ + -map "'"$LOCAL_RAW_IMAGE"'" /extra/"$(basename "'"$LOCAL_RAW_IMAGE"'")" \ + -commit ' rm -f "$(basename "$XZ_IMAGE")" -echo "Success! Your live ISO is at: mkosi.output/elementary-liveiso.iso" \ No newline at end of file +echo "Success! Your live ISO is at: mkosi.output/$OUT_ISO" \ No newline at end of file diff --git a/mkosi.conf b/mkosi.conf index e76c53cdd..b6cdf80ea 100644 --- a/mkosi.conf +++ b/mkosi.conf @@ -9,6 +9,7 @@ Repositories=main,universe [Build] ToolsTree=default CacheDirectory=mkosi.cache +ToolsTreePackages=grub-efi-amd64-bin Incremental=yes ToolsTreeDistribution=ubuntu ToolsTreeRelease=resolute diff --git a/mkosi.conf.d/elementary/mkosi.conf.d/elementary-desktop.conf b/mkosi.conf.d/elementary/mkosi.conf.d/elementary-desktop.conf index 820303b77..e00938c6e 100644 --- a/mkosi.conf.d/elementary/mkosi.conf.d/elementary-desktop.conf +++ b/mkosi.conf.d/elementary/mkosi.conf.d/elementary-desktop.conf @@ -10,5 +10,5 @@ Packages= pantheon-greeter # if not explicitly named, get stuck on a black screen post-install gala # if not explicitly named, get stuck on a black screen post-install -RemovePackages= - gnome-shell # gets pulled in by gnome desktop and auto-booted into. remove it again! +# RemovePackages= + gnome-shell # gets pulled in by gnome desktop and auto-booted into. remove it again! diff --git a/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf b/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf index cf7991fac..cae30f478 100644 --- a/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf +++ b/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf @@ -10,38 +10,39 @@ RemovePackages= anacron Packages= - lightdm - plymouth - plymouth-theme-elementary - pipewire-audio - linux-image-generic - linux-firmware - libpam-systemd - dbus-user-session - systemd-resolved - systemd-cryptsetup - cryptsetup btrfs-progs - x11-common - iputils-ping - fzf - ubuntu-keyring + cryptsetup + dbus-user-session flatpak - locales-all + fzf glycin-loaders gnome-disk-utility gnome-keyring + iputils-ping libpam-gnome-keyring + libpam-systemd + lightdm + linux-firmware + linux-image-generic + locales-all + lvm2 micro - vim ncurses-base network-manager - systemd-homed + pipewire-audio + plymouth + plymouth-theme-elementary sudo-rs + systemd-boot + systemd-cryptsetup + systemd-homed + systemd-repart + systemd-resolved + systemd-zram-generator + ubuntu-keyring + vim + x11-common xdg-desktop-portal-gtk xdg-user-dirs - systemd-zram-generator - systemd-repart - zstd - systemd-boot - xz-utils \ No newline at end of file + xz-utils + zstd \ No newline at end of file diff --git a/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset b/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset index 2d639f8bd..b050c120c 100644 --- a/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset +++ b/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset @@ -1,5 +1,4 @@ enable systemd-resolved -enable flatpak-preinstalld.service enable NetworkManager.service enable NetworkManager-wait-online.service disable systemd-networkd diff --git a/mkosi.extra/usr/lib/systemd/system/flatpak-preinstalld.service b/mkosi.extra/usr/lib/systemd/system/flatpak-preinstalld.service deleted file mode 100644 index c6142eebe..000000000 --- a/mkosi.extra/usr/lib/systemd/system/flatpak-preinstalld.service +++ /dev/null @@ -1,22 +0,0 @@ -[Unit] -Description=Preinstall Flatpaks -After=network-online.target -Wants=network-online.target -ConditionPathExists=/usr/bin/flatpak -ConditionPathExists=!/var/lib/flatpak/.preinstall-finished -Documentation=man:flatpak-preinstall(1) -StartLimitIntervalSec=600 - -[Service] -Type=oneshot -ExecStart=mkdir -p /var/lib/flatpak/ -ExecStart=/usr/bin/flatpak preinstall -y -ExecStart=touch /var/lib/flatpak/.preinstall-finished -RemainAfterExit=true -Restart=on-failure -RestartSec=30 - -StartLimitBurst=3 - -[Install] -WantedBy=multi-user.target \ No newline at end of file diff --git a/mkosi.extra/usr/share/flatpak/preinstall.d/appcenter.preinstall b/mkosi.extra/usr/share/flatpak/preinstall.d/appcenter.preinstall deleted file mode 100644 index f58860095..000000000 --- a/mkosi.extra/usr/share/flatpak/preinstall.d/appcenter.preinstall +++ /dev/null @@ -1,51 +0,0 @@ -[Flatpak Preinstall io.elementary.mail] -Branch=stable -IsRuntime=false - -[Flatpak Preinstall io.elementary.calculator] -Branch=stable -IsRuntime=false - -[Flatpak Preinstall io.elementary.calendar] -Branch=stable -IsRuntime=false - -[Flatpak Preinstall io.elementary.photos] -Branch=stable -IsRuntime=false - -[Flatpak Preinstall io.elementary.music] -Branch=stable -IsRuntime=false - -[Flatpak Preinstall io.elementary.tasks] -Branch=stable -IsRuntime=false - -[Flatpak Preinstall org.gnome.Epiphany] -Branch=stable -IsRuntime=false - -[Flatpak Preinstall org.gnome.capnet-assist] -Branch=stable -IsRuntime=false - -[Flatpak Preinstall org.gnome.Evince] -Branch=stable -IsRuntime=false - -[Flatpak Preinstall org.gnome.FileRoller] -Branch=stable -IsRuntime=false - -[Flatpak Preinstall org.gnome.font-viewer] -Branch=stable -IsRuntime=false - -[Flatpak Preinstall io.elementary.camera] -Branch=stable -IsRuntime=false - -[Flatpak Preinstall io.elementary.maps] -Branch=stable -IsRuntime=false diff --git a/mkosi.extra/usr/share/flatpak/remotes.d/appcenter.flatpakrepo b/mkosi.extra/usr/share/flatpak/remotes.d/appcenter.flatpakrepo deleted file mode 100644 index 81b95f1ca..000000000 --- a/mkosi.extra/usr/share/flatpak/remotes.d/appcenter.flatpakrepo +++ /dev/null @@ -1,9 +0,0 @@ -[Flatpak Repo] -Title=AppCenter -Url=https://flatpak.elementaryos.org/repo -Homepage=https://elementary.io/ -Icon=https://flatpak.elementaryos.org/icon.svg -Comment=The open source, pay-what-you-want app store from elementary -Description=Reviewed and curated by elementary to ensure a native, privacy-respecting, and secure experience -GPGKey=LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCgptUUVOQkZjUlJOSUJDQURyRW5JUjkxYjJ2WDZCckFBWXFEUlRLWmVGZE1GRzdTdFNxRm8zbFpIMktGZDdLQmVCCnhZV25VM1YveEpRKzFsRnVqbytuYTZ6N0w5cUJydGlrWWRJbjlNYzNlU3l3L2ZsaTFGa011b0ZtZE10ajZrMUYKeitORU0wZFNyRUxhdkJNUHpYYjRrakY4WkdLbmVSMzV2NFkzUlArbHZaRGl1bVpwdkZ6VHpVMEFSVVJreEgzTgpiWWlYMG1raTc1Z3krRUh3Q1JlU1BqQnhLOTQrc1FSb0NsSmRyUWJGYUh0WERxZmgyWFZRTW0yTm5tSmFmMlJiCk1Gbzc1ekVveEh6WWJuQnlXZFIvWGg2dWhsU3lEYUJZME8wZjFjM3ljR243VVQrN0NBZEdrYTZHdTJWWlVYRUgKR0xaUzRvdFZodG95Z2Era0dhaUo3U1lSU1F6ZDBTL3hQUHh0QUJFQkFBRzBLR1ZzWlcxbGJuUmhjbmtnWW5WcApiR1J6SUR4aWRXbHNaSE5BWld4bGJXVnVkR0Z5ZVM1cGJ6NkpBVGNFRXdFSkFDRUZBbGNSUk5JQ0d3TUZDd2tJCkJ3TUZGUWtLQ0FzRkZnTUNBUUFDSGdFQ0Y0QUFDZ2tRcDA5ejcvNXd1Unpmd1FmL1FlR3RkbFFpVjNISkMvaEYKeVE0Q0hPeFpKRnJwZS9VZC90YXprVWlwbGMyWS9tcnJldGdkR2hJb0o2TnBRV3BEVENMRm12RDVDRXE5bGV0cwplUlVOVUx3MjF1dG5pdVRyckRYWmUxdG9tMEZrRlNkeUNZOFVwRERPYzdMa3piUTh3S28xQVNreXlFajhmVlhMCkVvT2tic2pSUUpVWFMvNlNkb1JTZVZpdXREZXdqVHkwWXZlbFVNVnhjWDVINVRqSmZYbVpNR1V4dEdVZWYzUmEKUkRYUjY5a21GamY3VW12MkFpaVZzZW5kcXJmSFJMblpRUnNiYmxOQWxObDVKK1ZUbEtrdmN3WGl2V2V3bFZVYQpPTDhIUEZvOWQya3hJYmV4RzJ5THdudXdtZmF2U0ZKVjROWWVtU1BTS2w2bEpWYkkzUCt6eitVODdWT01yOEtmCnVMMERvN2tCRFFSWEVVVFNBUWdBdkEzb1o3ck4xaUU4TTNROTFIVzM3bEJWK0V0YWdpckpVYTYrbTJvdlBmYTYKVG5PUHN5Z1NZOEVpTVBLQjhyRHhWUmszMlhuendObDNNQ21XMFlqTjFTMnNkRnY4WW5QWEx6WEtKV1lxVGFDTgpkZ0pQaEZ6K0xkZ1BtdVcya0hIM0VOWjhrT0JLZVZKZFErVUN4WmtFZEpaVmhuc0lQNjBwSHBTMmw4b01HWllrCnd0UnBlNkJEdEpNbHBnVVZXSzFqSnJmL1VqL0pBNjIrcnB2QWwyN1R4ZFpncHNtWU5hT3BnOWd1bVY4YUd0VWsKNGw2WDBOalNrS2FrYTdtMkJVTEFIb3RZT0FLMThEMHo3d3NzbEdiU2ZDWUtOS3NYS29VYlg5ZnB4anhQVXByTQpIUUo3TkFlZkRnZmllREltRm1CcGNTWEViem5VenQ1dmdTS3lIR05zdXdBUkFRQUJpUUVmQkJnQkNRQUpCUUpYCkVVVFNBaHNNQUFvSkVLZFBjKy8rY0xrY2VKQUgvMFhQVTJmeithaXBoNGx0dDludmRrWS9pcUZKNC9uZzJwWWoKejlLOWU4Sld1NjVFQkJrVW4zSjgwY1Z3TVRjQ3ZaZHVEeU1IaXpvYlBpbEhVeVdBZHdYdExYZ0xUWTVUUmZrZApIUVRLVmhGcXEvTHJwclVCUm9BSlFmVGJMNlhkQ1g4RHk3cTg5OXlhaUhzQkpkMUl6RUJpS3BmVE9jMVJtVnQvCnR2YUcwK1doQlJlL2FIdTV3bktrZkV4TGRzVzhtRHJOVW5EeWtUajUwQ2tpMWtmRnZMV2xTTHo2d2xYeXFHMVUKMWFCK25FTTdkMS9yL2pvRnNvWWZ0MlRUc2NOaTBIdnhZOFUxbU5TRDVIN0lYSzFlY0dUNTNmU2NsUFBrclZkNQorRjRZQnBkOUZJeTdMQm5MaGZLMEY0YUJlN2lUTFBpWUo3VFVwSWV6M2s3dWJSR0dCWmc9Cj1JQ3JSCi0tLS0tRU5EIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0K -Priority=100 \ No newline at end of file diff --git a/mkosi.extra/usr/share/flatpak/remotes.d/flathub.flatpakrepo b/mkosi.extra/usr/share/flatpak/remotes.d/flathub.flatpakrepo deleted file mode 100644 index 26a88a345..000000000 --- a/mkosi.extra/usr/share/flatpak/remotes.d/flathub.flatpakrepo +++ /dev/null @@ -1,8 +0,0 @@ -[Flatpak Repo] -Title=Flathub -Url=https://dl.flathub.org/repo/ -Homepage=https://flathub.org/ -Comment=Central repository of Flatpak applications -Description=Central repository of Flatpak applications -Icon=https://dl.flathub.org/repo/logo.svg -GPGKey=mQINBFlD2sABEADsiUZUOYBg1UdDaWkEdJYkTSZD68214m8Q1fbrP5AptaUfCl8KYKFMNoAJRBXn9FbE6q6VBzghHXj/rSnA8WPnkbaEWR7xltOqzB1yHpCQ1l8xSfH5N02DMUBSRtD/rOYsBKbaJcOgW0K21sX+BecMY/AI2yADvCJEjhVKrjR9yfRX+NQEhDcbXUFRGt9ZT+TI5yT4xcwbvvTu7aFUR/dH7+wjrQ7lzoGlZGFFrQXSs2WI0WaYHWDeCwymtohXryF8lcWQkhH8UhfNJVBJFgCY8Q6UHkZG0FxMu8xnIDBMjBmSZKwKQn0nwzwM2afskZEnmNPYDI8nuNsSZBZSAw+ThhkdCZHZZRwzmjzyRuLLVFpOj3XryXwZcSefNMPDkZAuWWzPYjxS80cm2hG1WfqrG0Gl8+iX69cbQchb7gbEb0RtqNskTo9DDmO0bNKNnMbzmIJ3/rTbSahKSwtewklqSP/01o0WKZiy+n/RAkUKOFBprjJtWOZkc8SPXV/rnoS2dWsJWQZhuPPtv3tefdDiEyp7ePrfgfKxuHpZES0IZRiFI4J/nAUP5bix+srcIxOVqAam68CbAlPvWTivRUMRVbKjJiGXIOJ78wAMjqPg3QIC0GQ0EPAWwAOzzpdgbnG7TCQetaVV8rSYCuirlPYN+bJIwBtkOC9SWLoPMVZTwQARAQABtC5GbGF0aHViIFJlcG8gU2lnbmluZyBLZXkgPGZsYXRodWJAZmxhdGh1Yi5vcmc+iQJUBBMBCAA+FiEEblwF2XnHba+TwIE1QYTdTZB6fK4FAllD2sACGwMFCRLMAwAFCwkIBwIGFQgJCgsCBBYCAwECHgECF4AACgkQQYTdTZB6fK5RJQ/+Ptd4sWxaiAW91FFk7+wmYOkEe1NY2UDNJjEEz34PNP/1RoxveHDt43kYJQ23OWaPJuZAbu+fWtjRYcMBzOsMCaFcRSHFiDIC9aTp4ux/mo+IEeyarYt/oyKb5t5lta6xaAqg7rwt65jW5/aQjnS4h7eFZ+dAKta7Y/fljNrOznUp81/SMcx4QA5G2Pw0hs4Xrxg59oONOTFGBgA6FF8WQghrpR7SnEe0FSEOVsAjwQ13Cfkfa7b70omXSWp7GWfUzgBKyoWxKTqzMN3RQHjjhPJcsQnrqH5enUu4Pcb2LcMFpzimHnUgb9ft72DP5wxfzHGAWOUiUXHbAekfq5iFks8cha/RST6wkxG3Rf44Zn09aOxh1btMcGL+5xb1G0BuCQnA0fP/kDYIPwh9z22EqwRQOspIcvGeLVkFeIfubxpcMdOfQqQnZtHMCabV5Q/Rk9K1ZGc8M2hlg8gHbXMFch2xJ0Wu72eXbA/UY5MskEeBgawTQnQOK/vNm7t0AJMpWK26Qg6178UmRghmeZDj9uNRc3EI1nSbgvmGlpDmCxaAGqaGL1zW4KPW5yN25/qeqXcgCvUjZLI9PNq3Kvizp1lUrbx7heRiSoazCucvHQ1VHUzcPVLUKKTkoTP8okThnRRRsBcZ1+jI4yMWIDLOCT7IW3FePr+3xyuy5eEo9a25Ag0EWUPa7AEQALT/CmSyZ8LWlRYQZKYw417p7Z2hxqd6TjwkwM3IQ1irumkWcTZBZIbBgrSOg6CcXD2oWydCQHWi9qaxhuhEl2bJL5LskmBcMxVdQeD0LLHd8QUnbnnIby8ocvWN1alPfvJFjCUTrmD22U1ycOzRw2lIe4kiQONbOZtdWrVImQQSndjFlisitbmlWHvHm2lOOYy8+GJB7YffVV193hmnBSJffCy4bvkuLxsI+n1DhOzc7MPV3z6HGk4HiEcF0yyt9tCYhpsxHFdBoq2h771HfAcS0s98EVAqYMFnf9em+4cnYpdI6mhIfS1FQiKl6DBAYA8tT3ggla00DurPo0JwX/zN+PaO5h/6O9aCZwV7G6rbkgMuqMergXaf8oP38gr0z+MqWnkfM63Bodq68GP4l4hd02BoFBbDf38TMuGQB14+twJMdfbAxo2MbgluvQgfwHfZ2ca6gyEY+9s/YD1gugLjV+S6CB51WkFNe1z4tAPgJZNxUcKCbeaHNbthl8Hks/pY9RCEseX/EdfzF18epbSjJMPh4DPQXbUoFwmyuYcoBOPmvZHNl9hK7B/1RP8w1ZrXk8qdupC0SNbafX7270B7lMMVImzZetGsM9ypXJ6llhp3FwW09iseNyGJGPsr/dvTMGDXqOPfU/9SAS1LSTY4K9PbRtdrBE318YX8mIk5ABEBAAGJBHIEGAEIACYWIQRuXAXZecdtr5PAgTVBhN1NkHp8rgUCWUPa7AIbAgUJEswDAAJACRBBhN1NkHp8rsF0IAQZAQgAHRYhBFSmzd2JGfsgQgDYrFYnAunj7X7oBQJZQ9rsAAoJEFYnAunj7X7oR6AP/0KYmiAFeqx14Z43/6s2gt3VhxlSd8bmcVV7oJFbMhdHBIeWBp2BvsUf00I0Zl14ZkwCKfLwbbORC2eIxvzJ+QWjGfPhDmS4XUSmhlXxWnYEveSek5Tde+fmu6lqKM8CHg5BNx4GWIX/vdLi1wWJZyhrUwwICAxkuhKxuP2Z1An48930eslTD2GGcjByc27+9cIZjHKa07I/aLffo04V+oMT9/tgzoquzgpVV4jwekADo2MJjhkkPveSNI420bgT+Q7Fi1l0X1aFUniBvQMsaBa27PngWm6xE2ZYvh7nWCdd5g0c0eLIHxWwzV1lZ4Ryx4ITO/VL25ItECcjhTRdYa64sA62MYSaB0x3eR+SihpgP3wSNPFu3MJo6FKTFdi4CBAEmpWHFW7FcRmd+cQXeFrHLN3iNVWryy0HK/CUEJmiZEmpNiXecl4vPIIuyF0zgSCztQtKoMr+injpmQGC/rF/ELBVZTUSLNB350S0Ztvw0FKWDAJSxFmoxt3xycqvvt47rxTrhi78nkk6jATKGyvP55sO+K7Q7Wh0DXA69hvPrYW2eu8jGCdVGxi6HX7L1qcfEd0378S71dZ3g9o6KKl1OsDWWQ6MJ6FGBZedl/ibRfs8p5+sbCX3lQSjEFy3rx6n0rUrXx8U2qb+RCLzJlmC5MNBOTDJwHPcX6gKsUcXZrEQALmRHoo3SrewO41RCr+5nUlqiqV3AohBMhnQbGzyHf2+drutIaoh7Rj80XRh2bkkuPLwlNPf+bTXwNVGse4bej7B3oV6Ae1N7lTNVF4Qh+1OowtGjmfJPWo0z1s6HFJVxoIof9z58Msvgao0zrKGqaMWaNQ6LUeC9g9Aj/9Uqjbo8X54aLiYs8Z1WNc06jKP+gv8AWLtv6CR+l2kLez1YMDucjm7v6iuCMVAmZdmxhg5I/X2+OM3vBsqPDdQpr2TPDLX3rCrSBiS0gOQ6DwN5N5QeTkxmY/7QO8bgLo/Wzu1iilH4vMKW6LBKCaRx5UEJxKpL4wkgITsYKneIt3NTHo5EOuaYk+y2+Dvt6EQFiuMsdbfUjs3seIHsghX/cbPJa4YUqZAL8C4OtVHaijwGo0ymt9MWvS9yNKMyT0JhN2/BdeOVWrHk7wXXJn/ZjpXilicXKPx4udCF76meE+6N2u/T+RYZ7fP1QMEtNZNmYDOfA6sViuPDfQSHLNbauJBo/n1sRYAsL5mcG22UDchJrlKvmK3EOADCQg+myrm8006LltubNB4wWNzHDJ0Ls2JGzQZCd/xGyVmUiidCBUrD537WdknOYE4FD7P0cHaM9brKJ/M8LkEH0zUlo73bY4XagbnCqve6PvQb5G2Z55qhWphd6f4B6DGed86zJEa/RhS \ No newline at end of file diff --git a/mkosi.postinst.chroot b/mkosi.postinst.chroot index 76b41fd45..68f1899dd 100755 --- a/mkosi.postinst.chroot +++ b/mkosi.postinst.chroot @@ -31,27 +31,3 @@ find /usr/lib/pam.d/ -mindepth 1 -exec sed --in-place '/pam_securetty.so/d' {} \ if [[ -f /usr/lib/tmpfiles.d/20-systemd-userdb.conf.example ]]; then ln --symbolic 20-systemd-userdb.conf.example /usr/lib/tmpfiles.d/20-systemd-userdb.conf fi - - -( - . /usr/lib/os-release - cat >/usr/lib/os-release </usr/lib/issue </usr/lib/os-release </usr/lib/os-release < Date: Fri, 14 Aug 2026 15:31:14 -0400 Subject: [PATCH 34/86] Remove gnome-shell --- mkosi.conf.d/elementary/mkosi.conf.d/elementary-desktop.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkosi.conf.d/elementary/mkosi.conf.d/elementary-desktop.conf b/mkosi.conf.d/elementary/mkosi.conf.d/elementary-desktop.conf index e00938c6e..7cd2d3b00 100644 --- a/mkosi.conf.d/elementary/mkosi.conf.d/elementary-desktop.conf +++ b/mkosi.conf.d/elementary/mkosi.conf.d/elementary-desktop.conf @@ -10,5 +10,5 @@ Packages= pantheon-greeter # if not explicitly named, get stuck on a black screen post-install gala # if not explicitly named, get stuck on a black screen post-install -# RemovePackages= +RemovePackages= gnome-shell # gets pulled in by gnome desktop and auto-booted into. remove it again! From aea20f83da7c2ec8bc021ea2ff53134fc6d9cba4 Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Fri, 14 Aug 2026 16:08:25 -0400 Subject: [PATCH 35/86] Classic only --- Justfile | 5 ++++ assemble-iso-classiconly.sh | 57 +++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100755 assemble-iso-classiconly.sh diff --git a/Justfile b/Justfile index c7c3b720e..aca081d6d 100644 --- a/Justfile +++ b/Justfile @@ -19,6 +19,11 @@ generate-liveiso: just build-classic-liveenv && \ ./assemble-iso.sh +generate-liveiso-classiconly: + #!/usr/bin/env bash + just build-classic-liveenv && \ + ./assemble-iso-classiconly.sh + genkey: just run-in-podman mkosi genkey diff --git a/assemble-iso-classiconly.sh b/assemble-iso-classiconly.sh new file mode 100755 index 000000000..6c5d4f222 --- /dev/null +++ b/assemble-iso-classiconly.sh @@ -0,0 +1,57 @@ +#!/usr/bin/env bash +set -euo pipefail +cd mkosi.output/classic/ + +SEARCH_DIR=../sysupdate + +OUT_ISO="./elementary-liveiso.iso" + +# Detect version +output_dir=$(ls -d elementaryclassic_* | grep -vE '\.(raw|iso|vmlinuz|initrd|efi|manifest)$' | head -n 1) + +if [[ -z "$output_dir" ]]; then + echo "error: No mkosi.output, run just build-classic first." >&2 + exit 1 +fi + +base_name=$(basename "$output_dir") +echo "Detected release target: $base_name" + +rm -rf iso_root + +rsync -a --delete "${base_name}/iso_root/" iso_root/ + +echo "Writing minimal APT disc structure for apt-cdrom..." + +mkdir -p iso_root/dists/stable/main/binary-amd64 +touch iso_root/dists/stable/main/binary-amd64/Packages +gzip -kf iso_root/dists/stable/main/binary-amd64/Packages +mkdir -p iso_root/pool + + +echo "Shoving everything in casper..." +sudo podman run --rm -it \ + --network host \ + --dns 8.8.8.8 \ + -v "$(pwd)":/workspace:Z \ + -w /workspace \ + ghcr.io/jumpyvi/xorriso:tanit \ + sh -c "set -e + KERNEL_VERSION=\$(ls ${base_name}/lib/modules | head -n 1) + chroot ${base_name} update-initramfs -u -k \${KERNEL_VERSION} + + cp ${base_name}/boot/vmlinuz-\${KERNEL_VERSION} iso_root/casper/vmlinuz + cp ${base_name}/boot/initrd.img-\${KERNEL_VERSION} iso_root/casper/initrd + + rm -f iso_root/casper/filesystem.squashfs + mksquashfs ${base_name} iso_root/casper/filesystem.squashfs -comp xz + + grub-mkrescue -o custom_ubuntu_live.iso iso_root/ + echo 'Live environment generated!'" + + +echo "Generating installer..." +BASE_ISO="./classic/custom_ubuntu_live.iso" +rm -f "../$OUT_ISO" + +echo "Success! Your live ISO is at: mkosi.output/classic/custom_ubuntu_live.iso" \ No newline at end of file From 4e14bf4858e7ddbcafc75a2eb2b1dd34a686c803 Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Fri, 14 Aug 2026 17:19:45 -0400 Subject: [PATCH 36/86] Remove elementary-live --- mkosi.profiles/classic/mkosi.conf | 1 - .../system/apparmor.service.d/99_enable_in_live_mode.conf | 2 ++ mkosi.profiles/classic/mkosi.posinst.chroot | 6 +++++- 3 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 mkosi.profiles/classic/mkosi.extra/usr/sbin/lib/systemd/system/apparmor.service.d/99_enable_in_live_mode.conf diff --git a/mkosi.profiles/classic/mkosi.conf b/mkosi.profiles/classic/mkosi.conf index e1ec7a3f3..2df760cac 100644 --- a/mkosi.profiles/classic/mkosi.conf +++ b/mkosi.profiles/classic/mkosi.conf @@ -11,7 +11,6 @@ ImageId=elementaryclassic [Content] Bootable=yes Packages= - elementary-live grub-efi-amd64 grub-efi-amd64-signed mokutil diff --git a/mkosi.profiles/classic/mkosi.extra/usr/sbin/lib/systemd/system/apparmor.service.d/99_enable_in_live_mode.conf b/mkosi.profiles/classic/mkosi.extra/usr/sbin/lib/systemd/system/apparmor.service.d/99_enable_in_live_mode.conf new file mode 100644 index 000000000..ce4a324ac --- /dev/null +++ b/mkosi.profiles/classic/mkosi.extra/usr/sbin/lib/systemd/system/apparmor.service.d/99_enable_in_live_mode.conf @@ -0,0 +1,2 @@ +[Unit] +ConditionPathExists= \ No newline at end of file diff --git a/mkosi.profiles/classic/mkosi.posinst.chroot b/mkosi.profiles/classic/mkosi.posinst.chroot index d8d4062b0..54feac43c 100755 --- a/mkosi.profiles/classic/mkosi.posinst.chroot +++ b/mkosi.profiles/classic/mkosi.posinst.chroot @@ -16,4 +16,8 @@ ANSI_COLOR_REVERSE="48;2;252;186;3;1;30" HOME_URL="https://elementary.io/" EOF -) \ No newline at end of file +) + +rm -f /var/lib/apt/lists/*_Packages +rm -f /var/lib/apt/lists/*_Sources +rm -f /var/lib/apt/lists/*_Translation-* \ No newline at end of file From 4c44e1ed91e0e216ad72446c7e8140f055c7afb9 Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Fri, 14 Aug 2026 19:50:21 -0400 Subject: [PATCH 37/86] Fix aa in live mode --- mkosi.conf.d/elementary/mkosi.conf.d/blacklist.conf | 13 +++++++++++++ .../elementary/mkosi.conf.d/elementary-desktop.conf | 5 +---- .../elementary/mkosi.conf.d/elementary.conf | 3 --- mkosi.profiles/classic/mkosi.conf | 1 + .../apparmor.service.d/99_enable_in_live_mode.conf | 0 5 files changed, 15 insertions(+), 7 deletions(-) create mode 100644 mkosi.conf.d/elementary/mkosi.conf.d/blacklist.conf rename mkosi.profiles/classic/mkosi.extra/usr/{sbin => }/lib/systemd/system/apparmor.service.d/99_enable_in_live_mode.conf (100%) diff --git a/mkosi.conf.d/elementary/mkosi.conf.d/blacklist.conf b/mkosi.conf.d/elementary/mkosi.conf.d/blacklist.conf new file mode 100644 index 000000000..5b749adf1 --- /dev/null +++ b/mkosi.conf.d/elementary/mkosi.conf.d/blacklist.conf @@ -0,0 +1,13 @@ +[Content] +RemovePackages= + anacron + stunnel + gdm3 + gnome-control-center + gnome-remote-desktop + gnome-screensaver + gnome-shell + gnome-session + gnome-software + gnome-system-monitor + nautilus \ No newline at end of file diff --git a/mkosi.conf.d/elementary/mkosi.conf.d/elementary-desktop.conf b/mkosi.conf.d/elementary/mkosi.conf.d/elementary-desktop.conf index 7cd2d3b00..035aff7ff 100644 --- a/mkosi.conf.d/elementary/mkosi.conf.d/elementary-desktop.conf +++ b/mkosi.conf.d/elementary/mkosi.conf.d/elementary-desktop.conf @@ -8,7 +8,4 @@ Packages= elementary-minimal elementary-standard pantheon-greeter # if not explicitly named, get stuck on a black screen post-install - gala # if not explicitly named, get stuck on a black screen post-install - -RemovePackages= - gnome-shell # gets pulled in by gnome desktop and auto-booted into. remove it again! + gala # if not explicitly named, get stuck on a black screen post-install \ No newline at end of file diff --git a/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf b/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf index cae30f478..a17cff356 100644 --- a/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf +++ b/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf @@ -6,9 +6,6 @@ RemoveFiles= VolatilePackages= systemd-container -RemovePackages= - anacron - Packages= btrfs-progs cryptsetup diff --git a/mkosi.profiles/classic/mkosi.conf b/mkosi.profiles/classic/mkosi.conf index 2df760cac..e1ec7a3f3 100644 --- a/mkosi.profiles/classic/mkosi.conf +++ b/mkosi.profiles/classic/mkosi.conf @@ -11,6 +11,7 @@ ImageId=elementaryclassic [Content] Bootable=yes Packages= + elementary-live grub-efi-amd64 grub-efi-amd64-signed mokutil diff --git a/mkosi.profiles/classic/mkosi.extra/usr/sbin/lib/systemd/system/apparmor.service.d/99_enable_in_live_mode.conf b/mkosi.profiles/classic/mkosi.extra/usr/lib/systemd/system/apparmor.service.d/99_enable_in_live_mode.conf similarity index 100% rename from mkosi.profiles/classic/mkosi.extra/usr/sbin/lib/systemd/system/apparmor.service.d/99_enable_in_live_mode.conf rename to mkosi.profiles/classic/mkosi.extra/usr/lib/systemd/system/apparmor.service.d/99_enable_in_live_mode.conf From 3282a06e0c43b411e453757bf7a71017ce76559d Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Sat, 15 Aug 2026 10:43:15 -0400 Subject: [PATCH 38/86] Temporary fix for live installer --- .../usr/lib/systemd/system/installer-force-exit.path | 9 +++++++++ .../usr/lib/systemd/system/installer-force-exit.service | 9 +++++++++ .../usr/lib/systemd/system/system-preset/live.preset | 1 + 3 files changed, 19 insertions(+) create mode 100644 mkosi.profiles/classic/mkosi.extra/usr/lib/systemd/system/installer-force-exit.path create mode 100644 mkosi.profiles/classic/mkosi.extra/usr/lib/systemd/system/installer-force-exit.service create mode 100644 mkosi.profiles/classic/mkosi.extra/usr/lib/systemd/system/system-preset/live.preset diff --git a/mkosi.profiles/classic/mkosi.extra/usr/lib/systemd/system/installer-force-exit.path b/mkosi.profiles/classic/mkosi.extra/usr/lib/systemd/system/installer-force-exit.path new file mode 100644 index 000000000..fd98e8eee --- /dev/null +++ b/mkosi.profiles/classic/mkosi.extra/usr/lib/systemd/system/installer-force-exit.path @@ -0,0 +1,9 @@ +[Unit] +Description=Watch for demo mode flag file + +[Path] +PathExists=/var/lib/lightdm/demo-mode +Unit=installer-force-exit.service + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/mkosi.profiles/classic/mkosi.extra/usr/lib/systemd/system/installer-force-exit.service b/mkosi.profiles/classic/mkosi.extra/usr/lib/systemd/system/installer-force-exit.service new file mode 100644 index 000000000..9f800af90 --- /dev/null +++ b/mkosi.profiles/classic/mkosi.extra/usr/lib/systemd/system/installer-force-exit.service @@ -0,0 +1,9 @@ +[Unit] +Description=Remove lightdm.conf.d when demo mode flag is set +ConditionPathExists=!/run/demo-lightdm-cleanup.done + +[Service] +Type=oneshot +ExecStart=/usr/bin/rm -rf /etc/lightdm/lightdm.conf.d +ExecStart=/usr/bin/systemctl restart lightdm.service +ExecStart=/usr/bin/touch /run/demo-lightdm-cleanup.done \ No newline at end of file diff --git a/mkosi.profiles/classic/mkosi.extra/usr/lib/systemd/system/system-preset/live.preset b/mkosi.profiles/classic/mkosi.extra/usr/lib/systemd/system/system-preset/live.preset new file mode 100644 index 000000000..a10fcd072 --- /dev/null +++ b/mkosi.profiles/classic/mkosi.extra/usr/lib/systemd/system/system-preset/live.preset @@ -0,0 +1 @@ +enable installer-force-exit.service From 08b0e92d37aafe72848a15b45d13d1fa0fd9319e Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Sat, 15 Aug 2026 14:19:22 -0400 Subject: [PATCH 39/86] Fix rootfs permissions --- Justfile | 6 ++--- mkosi.postinst.chroot | 23 +------------------ .../casper/filesystem.manifest-remove | 3 ++- mkosi.profiles/classic/mkosi.finalize | 8 ------- 4 files changed, 5 insertions(+), 35 deletions(-) delete mode 100755 mkosi.profiles/classic/mkosi.finalize diff --git a/Justfile b/Justfile index aca081d6d..9da80e4ca 100644 --- a/Justfile +++ b/Justfile @@ -6,23 +6,21 @@ default: profile-sysupdate: sudo rm -rf mkosi.output/sysupdate just run-in-podman mkosi -B --debug --force --profile=sysupdate --workspace-directory=/workspace - sudo chown -R {{env_var('USER')}}:{{env_var('USER')}} ./mkosi.output/ build-classic-liveenv: sudo rm -rf mkosi.output/classic just run-in-podman mkosi -B --debug --force --profile=classic --workspace-directory=/workspace - sudo chown -R {{env_var('USER')}}:{{env_var('USER')}} ./mkosi.output/ generate-liveiso: #!/usr/bin/env bash just profile-sysupdate && \ just build-classic-liveenv && \ - ./assemble-iso.sh + sudo ./assemble-iso.sh generate-liveiso-classiconly: #!/usr/bin/env bash just build-classic-liveenv && \ - ./assemble-iso-classiconly.sh + sudo ./assemble-iso-classiconly.sh genkey: diff --git a/mkosi.postinst.chroot b/mkosi.postinst.chroot index 68f1899dd..66df84065 100755 --- a/mkosi.postinst.chroot +++ b/mkosi.postinst.chroot @@ -9,25 +9,4 @@ mkdir -p /var/usrlocal ln -s /var/usrlocal /usr/local cp -a /usr/local/. /var/usrlocal/ rm -rf /usr/local -ln -s /var/usrlocal /usr/local - - -if command -v authselect >/dev/null; then - authselect select local - authselect enable-feature with-systemd-homed -fi - -if [[ -d /etc/pam.d ]]; then - find /etc/pam.d -mindepth 1 -exec mv {} /usr/lib/pam.d \; - rmdir /etc/pam.d -fi - -# Get rid of obsolete stuff in the pam stack. -find /usr/lib/pam.d/ -mindepth 1 -exec sed --in-place '/pam_shells.so/d' {} \; -find /usr/lib/pam.d/ -mindepth 1 -exec sed --in-place '/pam_securetty.so/d' {} \; - -# Fedora disables the userdb ssh dropin by default, but helpfully leaves it available in -# the package so that we can just symlink it to a name that will be picked up by systemd-tmpfiles. -if [[ -f /usr/lib/tmpfiles.d/20-systemd-userdb.conf.example ]]; then - ln --symbolic 20-systemd-userdb.conf.example /usr/lib/tmpfiles.d/20-systemd-userdb.conf -fi +ln -s /var/usrlocal /usr/local \ No newline at end of file diff --git a/mkosi.profiles/classic/mkosi.extra/iso_root/casper/filesystem.manifest-remove b/mkosi.profiles/classic/mkosi.extra/iso_root/casper/filesystem.manifest-remove index 20ef35231..5fbed9336 100644 --- a/mkosi.profiles/classic/mkosi.extra/iso_root/casper/filesystem.manifest-remove +++ b/mkosi.profiles/classic/mkosi.extra/iso_root/casper/filesystem.manifest-remove @@ -1 +1,2 @@ -casper \ No newline at end of file +casper +elementary-live \ No newline at end of file diff --git a/mkosi.profiles/classic/mkosi.finalize b/mkosi.profiles/classic/mkosi.finalize deleted file mode 100755 index e679c8d0f..000000000 --- a/mkosi.profiles/classic/mkosi.finalize +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -# Capture the entirety of /etc in /usr/share/factory/etc so we can use -# systemd-tmpfiles to symlink individual directories from it to /etc. -mkdir -p "$BUILDROOT/usr/share/factory/" -cp --archive --no-target-directory --update=none "$BUILDROOT/etc" "$BUILDROOT/usr/share/factory/etc" -ln -sr "$BUILDROOT/usr" "$BUILDROOT/usr/share/factory/usr" From 466744d8115f691566759266eaf099432c7f5c61 Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Sat, 15 Aug 2026 14:53:07 -0400 Subject: [PATCH 40/86] Decapitalized Elementary --- .github/workflows/release.yaml | 6 +++--- Justfile | 8 ++++---- README.md | 2 +- .../sysupdate.d/10-usr-verity-sig.transfer | 4 ++-- .../lib/sysupdate.d/11-usr-verity.transfer | 4 ++-- .../usr/lib/sysupdate.d/12-usr.transfer | 4 ++-- .../usr/lib/sysupdate.d/20-uki.transfer | 14 +++++++------- ...entary.desktop.wingpanel.power.gschema.xml | 10 ---------- mkosi.images/devel/mkosi.conf | 2 +- .../classic/mkosi.extra/iso_root/.disk/info | 2 +- .../mkosi.extra/iso_root/boot/grub/grub.cfg | 2 +- .../opt/repart-target/home/50-home.conf | 2 +- .../opt/repart-target/root/40-root.conf | 2 +- mkosi.profiles/classic/mkosi.posinst.chroot | 17 ----------------- .../classic/mkosi.repart/40-root.conf | 2 +- .../classic/mkosi.repart/50-home.conf | 2 +- mkosi.profiles/sysupdate/mkosi.conf | 4 ++-- mkosi.profiles/sysupdate/mkosi.posinst.chroot | 19 ------------------- upload.sh | 10 +++++----- 19 files changed, 35 insertions(+), 81 deletions(-) delete mode 100644 mkosi.extra/usr/share/glib-2.0/schemas/io.elementary.desktop.wingpanel.power.gschema.xml delete mode 100755 mkosi.profiles/sysupdate/mkosi.posinst.chroot diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index d03663a4b..550ef9e66 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -1,4 +1,4 @@ -name: Build and Release DDI (Elementary OS 9) +name: Build and Release DDI (elementary OS 9) on: workflow_dispatch: @@ -44,9 +44,9 @@ jobs: - name: Extract Date id: get_date run: | - FILE_PATH=$(ls mkosi.output/sysupdate/Elementary_*.raw | grep -E 'Elementary_[0-9]+\.raw$' | head -n 1) + FILE_PATH=$(ls mkosi.output/sysupdate/elementary_*.raw | grep -E 'elementary_[0-9]+\.raw$' | head -n 1) FILE_NAME=$(basename "$FILE_PATH") - TIMESTAMP=$(echo "$FILE_NAME" | sed 's/^Elementary_//;s/\..*//') + TIMESTAMP=$(echo "$FILE_NAME" | sed 's/^elementary_//;s/\..*//') echo "RELEASE_TAG=os9-$TIMESTAMP" >> "$GITHUB_OUTPUT" echo "Generated tag: os9-$TIMESTAMP" diff --git a/Justfile b/Justfile index 9da80e4ca..87d7aa876 100644 --- a/Justfile +++ b/Justfile @@ -53,9 +53,9 @@ sign-repo: cd mkosi.output echo "Repo will not be signed, use verify=no." echo "Generating SHA256..." - sha256sum Elementary_*.usr-x86-64-verity-sig.*.raw \ - Elementary_*.usr-x86-64-verity.*.raw \ - Elementary_*.usr-x86-64.*.raw \ - Elementary_*.efi \ + sha256sum elementary_*.usr-x86-64-verity-sig.*.raw \ + elementary_*.usr-x86-64-verity.*.raw \ + elementary_*.usr-x86-64.*.raw \ + elementary_*.efi \ > SHA256SUMS cd .. \ No newline at end of file diff --git a/README.md b/README.md index 41bba5034..e8603b2c3 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ Append the exact version ID at the end to upgrade to a specific version, or down ### Versions -| Features | Elementary OS 9 | Elementary OS 9 "Classic" | +| Features | elementary OS 9 | elementary OS 9 "Classic" | | --------------- | ---------------------------------- | ------------------------- | | -> **Bootloader** | systemd-boot (UEFI-Only) | grub2 | | -> **Atomic** | Readonly /usr, with verity and sig | Insecure/Legacy | diff --git a/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer b/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer index ee9db5269..d86c28a5d 100644 --- a/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer +++ b/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer @@ -4,12 +4,12 @@ ProtectVersion=%A [Source] Type=url-file Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download -MatchPattern=Elementary_@v.usr-%a-verity-sig.@u.raw +MatchPattern=elementary_@v.usr-%a-verity-sig.@u.raw [Target] Type=partition Path=auto -MatchPattern=Elementary_@v_verity_sig +MatchPattern=elementary_@v_verity_sig MatchPartitionType=usr-verity-sig PartitionFlags=0 ReadOnly=1 \ No newline at end of file diff --git a/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer b/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer index c246af48d..d6a473528 100644 --- a/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer +++ b/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer @@ -4,12 +4,12 @@ ProtectVersion=%A [Source] Type=url-file Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download -MatchPattern=Elementary_@v.usr-%a-verity.@u.raw +MatchPattern=elementary_@v.usr-%a-verity.@u.raw [Target] Type=partition Path=auto -MatchPattern=Elementary_@v_verity +MatchPattern=elementary_@v_verity MatchPartitionType=usr-verity PartitionFlags=0 ReadOnly=1 \ No newline at end of file diff --git a/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer b/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer index 9e717e150..7936395c3 100644 --- a/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer +++ b/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer @@ -4,12 +4,12 @@ ProtectVersion=%A [Source] Type=url-file Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download -MatchPattern=Elementary_@v.usr-%a.@u.raw.xz +MatchPattern=elementary_@v.usr-%a.@u.raw.xz [Target] Type=partition Path=auto -MatchPattern=Elementary_@v +MatchPattern=elementary_@v MatchPartitionType=usr PartitionFlags=0 ReadOnly=1 \ No newline at end of file diff --git a/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer b/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer index 801be7b83..56e787be0 100644 --- a/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer +++ b/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer @@ -4,18 +4,18 @@ ProtectVersion=%A [Source] Type=url-file Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download -MatchPattern=Elementary_@v.efi +MatchPattern=elementary_@v.efi [Target] Type=regular-file Path=/EFI/Linux PathRelativeTo=boot -MatchPattern=Elementary_@v_%a+@l-@d.efi \ - Elementary_@v_%a+@l.efi \ - Elementary_@v_%a.efi \ - Elementary_@v+@l-@d.efi \ - Elementary_@v+@l.efi \ - Elementary_@v.efi +MatchPattern=elementary_@v_%a+@l-@d.efi \ + elementary_@v_%a+@l.efi \ + elementary_@v_%a.efi \ + elementary_@v+@l-@d.efi \ + elementary_@v+@l.efi \ + elementary_@v.efi # MatchPartitionType=uki Mode=0600 TriesLeft=3 diff --git a/mkosi.extra/usr/share/glib-2.0/schemas/io.elementary.desktop.wingpanel.power.gschema.xml b/mkosi.extra/usr/share/glib-2.0/schemas/io.elementary.desktop.wingpanel.power.gschema.xml deleted file mode 100644 index 036c91cd9..000000000 --- a/mkosi.extra/usr/share/glib-2.0/schemas/io.elementary.desktop.wingpanel.power.gschema.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - false - Sets if the percentage of the primary battery is shown in the panel. - Enable this to see the percentage of the battery directly in the panel without having to click onto the power-indicator. - - - diff --git a/mkosi.images/devel/mkosi.conf b/mkosi.images/devel/mkosi.conf index f0f2a3daa..7ed6f2cbf 100644 --- a/mkosi.images/devel/mkosi.conf +++ b/mkosi.images/devel/mkosi.conf @@ -13,7 +13,7 @@ ImageId=ext-devel [Content] Bootable=no -BaseTrees=%O/Elementary_%v_%a.raw +BaseTrees=%O/elementary_%v_%a.raw Packages= cmake meson diff --git a/mkosi.profiles/classic/mkosi.extra/iso_root/.disk/info b/mkosi.profiles/classic/mkosi.extra/iso_root/.disk/info index b3b6003bb..5d34d6039 100644 --- a/mkosi.profiles/classic/mkosi.extra/iso_root/.disk/info +++ b/mkosi.profiles/classic/mkosi.extra/iso_root/.disk/info @@ -1 +1 @@ -Elementary Live amd64 \ No newline at end of file +elementary Live amd64 \ No newline at end of file diff --git a/mkosi.profiles/classic/mkosi.extra/iso_root/boot/grub/grub.cfg b/mkosi.profiles/classic/mkosi.extra/iso_root/boot/grub/grub.cfg index 26de545f5..74e40536b 100644 --- a/mkosi.profiles/classic/mkosi.extra/iso_root/boot/grub/grub.cfg +++ b/mkosi.profiles/classic/mkosi.extra/iso_root/boot/grub/grub.cfg @@ -1,7 +1,7 @@ set timeout=10 set default=0 -menuentry "ElementaryOS9 Live (pre-alpha)" { +menuentry "elementaryOS9 Live (pre-alpha)" { linux /casper/vmlinuz boot=casper quiet splash --- initrd /casper/initrd } \ No newline at end of file diff --git a/mkosi.profiles/classic/mkosi.extra/opt/repart-target/home/50-home.conf b/mkosi.profiles/classic/mkosi.extra/opt/repart-target/home/50-home.conf index c857e0a15..2c59dc98d 100644 --- a/mkosi.profiles/classic/mkosi.extra/opt/repart-target/home/50-home.conf +++ b/mkosi.profiles/classic/mkosi.extra/opt/repart-target/home/50-home.conf @@ -4,4 +4,4 @@ Format=btrfs SizeMinBytes=512M Weight=45000 FactoryReset=yes -Label=Elementary-home +Label=elementary-home diff --git a/mkosi.profiles/classic/mkosi.extra/opt/repart-target/root/40-root.conf b/mkosi.profiles/classic/mkosi.extra/opt/repart-target/root/40-root.conf index 775869130..31ddc5863 100644 --- a/mkosi.profiles/classic/mkosi.extra/opt/repart-target/root/40-root.conf +++ b/mkosi.profiles/classic/mkosi.extra/opt/repart-target/root/40-root.conf @@ -8,4 +8,4 @@ Subvolumes=/var /opt MakeDirectories=/var/log/journal Encrypt=off FactoryReset=yes -Label=Elementary-root \ No newline at end of file +Label=elementary-root \ No newline at end of file diff --git a/mkosi.profiles/classic/mkosi.posinst.chroot b/mkosi.profiles/classic/mkosi.posinst.chroot index 54feac43c..d5d85feb0 100755 --- a/mkosi.profiles/classic/mkosi.posinst.chroot +++ b/mkosi.profiles/classic/mkosi.posinst.chroot @@ -1,23 +1,6 @@ #!/bin/bash set -xeuo pipefail -( - . /usr/lib/os-release -cat >/usr/lib/os-release </usr/lib/os-release < SHA256SUMS sha256sum "$RAW" | tee "$SHA" From cde5e1f505ec0fa1836877c3828e05861e5aa895 Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Sat, 15 Aug 2026 15:07:16 -0400 Subject: [PATCH 41/86] Remove lightdm workarround --- .../usr/lib/systemd/system/installer-force-exit.path | 9 --------- .../usr/lib/systemd/system/installer-force-exit.service | 9 --------- .../usr/lib/systemd/system/system-preset/live.preset | 1 - 3 files changed, 19 deletions(-) delete mode 100644 mkosi.profiles/classic/mkosi.extra/usr/lib/systemd/system/installer-force-exit.path delete mode 100644 mkosi.profiles/classic/mkosi.extra/usr/lib/systemd/system/installer-force-exit.service delete mode 100644 mkosi.profiles/classic/mkosi.extra/usr/lib/systemd/system/system-preset/live.preset diff --git a/mkosi.profiles/classic/mkosi.extra/usr/lib/systemd/system/installer-force-exit.path b/mkosi.profiles/classic/mkosi.extra/usr/lib/systemd/system/installer-force-exit.path deleted file mode 100644 index fd98e8eee..000000000 --- a/mkosi.profiles/classic/mkosi.extra/usr/lib/systemd/system/installer-force-exit.path +++ /dev/null @@ -1,9 +0,0 @@ -[Unit] -Description=Watch for demo mode flag file - -[Path] -PathExists=/var/lib/lightdm/demo-mode -Unit=installer-force-exit.service - -[Install] -WantedBy=multi-user.target \ No newline at end of file diff --git a/mkosi.profiles/classic/mkosi.extra/usr/lib/systemd/system/installer-force-exit.service b/mkosi.profiles/classic/mkosi.extra/usr/lib/systemd/system/installer-force-exit.service deleted file mode 100644 index 9f800af90..000000000 --- a/mkosi.profiles/classic/mkosi.extra/usr/lib/systemd/system/installer-force-exit.service +++ /dev/null @@ -1,9 +0,0 @@ -[Unit] -Description=Remove lightdm.conf.d when demo mode flag is set -ConditionPathExists=!/run/demo-lightdm-cleanup.done - -[Service] -Type=oneshot -ExecStart=/usr/bin/rm -rf /etc/lightdm/lightdm.conf.d -ExecStart=/usr/bin/systemctl restart lightdm.service -ExecStart=/usr/bin/touch /run/demo-lightdm-cleanup.done \ No newline at end of file diff --git a/mkosi.profiles/classic/mkosi.extra/usr/lib/systemd/system/system-preset/live.preset b/mkosi.profiles/classic/mkosi.extra/usr/lib/systemd/system/system-preset/live.preset deleted file mode 100644 index a10fcd072..000000000 --- a/mkosi.profiles/classic/mkosi.extra/usr/lib/systemd/system/system-preset/live.preset +++ /dev/null @@ -1 +0,0 @@ -enable installer-force-exit.service From 9ea1d692bbe4a8f4323f2209fa85c67061ad3313 Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Sat, 15 Aug 2026 19:21:51 -0400 Subject: [PATCH 42/86] Reduce package set --- .../mkosi.conf.d => }/blacklist.conf | 0 .../elementary.conf => core.conf} | 25 +++++-------------- ...lementary-desktop.conf => elementary.conf} | 3 ++- .../elementary/mkosi.conf.d/apparmor.conf | 8 ------ mkosi.conf.d/{elementary => }/mkosi.conf | 0 .../mkosi.extra/usr/sbin/elementary-install | 11 +++++--- 6 files changed, 16 insertions(+), 31 deletions(-) rename mkosi.conf.d/{elementary/mkosi.conf.d => }/blacklist.conf (100%) rename mkosi.conf.d/{elementary/mkosi.conf.d/elementary.conf => core.conf} (54%) rename mkosi.conf.d/{elementary/mkosi.conf.d/elementary-desktop.conf => elementary.conf} (92%) delete mode 100644 mkosi.conf.d/elementary/mkosi.conf.d/apparmor.conf rename mkosi.conf.d/{elementary => }/mkosi.conf (100%) diff --git a/mkosi.conf.d/elementary/mkosi.conf.d/blacklist.conf b/mkosi.conf.d/blacklist.conf similarity index 100% rename from mkosi.conf.d/elementary/mkosi.conf.d/blacklist.conf rename to mkosi.conf.d/blacklist.conf diff --git a/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf b/mkosi.conf.d/core.conf similarity index 54% rename from mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf rename to mkosi.conf.d/core.conf index a17cff356..6528d776a 100644 --- a/mkosi.conf.d/elementary/mkosi.conf.d/elementary.conf +++ b/mkosi.conf.d/core.conf @@ -7,28 +7,19 @@ VolatilePackages= systemd-container Packages= + apparmor + apparmor-profiles + apparmor-utils btrfs-progs cryptsetup - dbus-user-session - flatpak - fzf - glycin-loaders - gnome-disk-utility - gnome-keyring - iputils-ping - libpam-gnome-keyring - libpam-systemd - lightdm + curl + git linux-firmware linux-image-generic - locales-all lvm2 - micro - ncurses-base + nano network-manager pipewire-audio - plymouth - plymouth-theme-elementary sudo-rs systemd-boot systemd-cryptsetup @@ -36,10 +27,6 @@ Packages= systemd-repart systemd-resolved systemd-zram-generator - ubuntu-keyring vim - x11-common - xdg-desktop-portal-gtk - xdg-user-dirs xz-utils zstd \ No newline at end of file diff --git a/mkosi.conf.d/elementary/mkosi.conf.d/elementary-desktop.conf b/mkosi.conf.d/elementary.conf similarity index 92% rename from mkosi.conf.d/elementary/mkosi.conf.d/elementary-desktop.conf rename to mkosi.conf.d/elementary.conf index 035aff7ff..efdf37679 100644 --- a/mkosi.conf.d/elementary/mkosi.conf.d/elementary-desktop.conf +++ b/mkosi.conf.d/elementary.conf @@ -8,4 +8,5 @@ Packages= elementary-minimal elementary-standard pantheon-greeter # if not explicitly named, get stuck on a black screen post-install - gala # if not explicitly named, get stuck on a black screen post-install \ No newline at end of file + gala # if not explicitly named, get stuck on a black screen post-install + lightdm \ No newline at end of file diff --git a/mkosi.conf.d/elementary/mkosi.conf.d/apparmor.conf b/mkosi.conf.d/elementary/mkosi.conf.d/apparmor.conf deleted file mode 100644 index d624fefc3..000000000 --- a/mkosi.conf.d/elementary/mkosi.conf.d/apparmor.conf +++ /dev/null @@ -1,8 +0,0 @@ -[Match] -Distribution=ubuntu - -[Content] -Packages= - apparmor - apparmor-profiles - apparmor-utils \ No newline at end of file diff --git a/mkosi.conf.d/elementary/mkosi.conf b/mkosi.conf.d/mkosi.conf similarity index 100% rename from mkosi.conf.d/elementary/mkosi.conf rename to mkosi.conf.d/mkosi.conf diff --git a/mkosi.profiles/classic/mkosi.extra/usr/sbin/elementary-install b/mkosi.profiles/classic/mkosi.extra/usr/sbin/elementary-install index 42533be56..1d931c253 100755 --- a/mkosi.profiles/classic/mkosi.extra/usr/sbin/elementary-install +++ b/mkosi.profiles/classic/mkosi.extra/usr/sbin/elementary-install @@ -15,9 +15,14 @@ fi echo "Using source image: $raw_xz_src" -selected_disk=$(lsblk -d -n -p -o NAME,SIZE,MODEL -e 7,11 | fzf \ - --prompt="Select installation disk (ALL DATA WILL BE LOST): " \ - --header="NAME SIZE MODEL") +PS3="Select installation disk (ALL DATA WILL BE LOST): " + +select selected_disk in $(lsblk -d -n -p -o NAME -e 7,11); do + if [[ -n "$selected_disk" ]]; then + break + fi + echo "Invalid selection, try again." +done if [ -z "$selected_disk" ]; then echo "Installation aborted: No disk selected." From 525b035b5371e3ba14cdbb7f4afa4cf45cd82c0d Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Sat, 15 Aug 2026 20:33:59 -0400 Subject: [PATCH 43/86] Sends usr to r2 --- .github/workflows/release.yaml | 18 +++++++++- upload.sh | 62 ---------------------------------- 2 files changed, 17 insertions(+), 63 deletions(-) delete mode 100755 upload.sh diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 550ef9e66..cb32899db 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -51,6 +51,23 @@ jobs: echo "RELEASE_TAG=os9-$TIMESTAMP" >> "$GITHUB_OUTPUT" echo "Generated tag: os9-$TIMESTAMP" + - name: Upload xz to R2 + env: + AWS_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.R2_SECRET_ACCESS_KEY }} + AWS_DEFAULT_REGION: auto + run: | + cd mkosi.output/sysupdate + + for f in *.usr-*.raw.xz; do + sha256sum "$f" > "$f.sha256" + + aws s3 cp "$f" "s3://${{ secrets.R2_BUCKET }}/" \ + --endpoint-url "${{ secrets.R2_ENDPOINT }}" + aws s3 cp "$f.sha256" "s3://${{ secrets.R2_BUCKET }}/" \ + --endpoint-url "${{ secrets.R2_ENDPOINT }}" + done + - name: Create Release and Upload Artifacts uses: softprops/action-gh-release@v3 with: @@ -58,7 +75,6 @@ jobs: name: Release ${{ steps.get_date.outputs.RELEASE_TAG }} files: | mkosi.output/sysupdate/*.efi - mkosi.output/sysupdate/*.usr-*.raw.xz mkosi.output/sysupdate/*.usr-*-verity*.raw mkosi.output/sysupdate/*.usr-*-verity-sig*.raw mkosi.output/sysupdate/SHA256SUMS \ No newline at end of file diff --git a/upload.sh b/upload.sh deleted file mode 100755 index f93424be7..000000000 --- a/upload.sh +++ /dev/null @@ -1,62 +0,0 @@ -#!/bin/bash - -set -e - -KEY="$1" -SECRET="$2" -ENDPOINT="$3" -UPDATES_BUCKET="$4" -INSTALL_BUCKET="$5" - -upload_file() { - local bucket="$1" - local src="$2" - local dst="$3" - python3 upload.py "$KEY" "$SECRET" "$ENDPOINT" "$bucket" "$src" "$dst" || exit 1 -} - -echo -e " -#----------------------# -# INSTALL DEPENDENCIES # -#----------------------# -" - -apt-get update -apt-get install -y python3 python3-boto3 - -echo -e " -#---------------------------------# -# UPLOAD TO SYSUPDATES CLOUDFLARE # -#---------------------------------# -" - -UPDATE_FILES="$(find mkosi.output -type f \( -name '*.efi' -o -name '*.manifest' -o -name '*.usr-*' -o -name 'SHA256SUMS' \))" -while IFS= read -r FILE; do - REMOTE="$(basename "$FILE")" - echo "uploading $REMOTE to $UPDATES_BUCKET..." - upload_file "$UPDATES_BUCKET" "$FILE" "$REMOTE" -done <<< "$UPDATE_FILES" - -echo -e " -#-----------------------------------# -# UPLOAD INSTALLER-ISO TO CLOUDFLARE # -#-----------------------------------# -" - -RAW="$(ls mkosi.output/elementary_*_x86-64.raw)" -SHA="${RAW}.sha256" -MD5="${RAW}.md5" - -sha256sum \ - mkosi.output/elementary_*_x86-64.usr-x86-64-verity-sig.*.raw \ - mkosi.output/elementary_*_x86-64.usr-x86-64-verity.*.raw \ - mkosi.output/elementary_*_x86-64.usr-x86-64.*.raw \ - mkosi.output/elementary_*_x86-64.efi \ - > SHA256SUMS - -sha256sum "$RAW" | tee "$SHA" -md5sum "$RAW" | tee "$MD5" - -upload_file "$INSTALL_BUCKET" "$RAW" "elementaryos.raw" -upload_file "$INSTALL_BUCKET" "$SHA" "elementaryos.raw.sha256" -upload_file "$INSTALL_BUCKET" "$MD5" "elementaryos.raw.md5" From 338873a193cca84514752b00256af80a02d57b52 Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Sun, 16 Aug 2026 13:22:30 -0400 Subject: [PATCH 44/86] Update workflow --- .github/workflows/release.yaml | 56 ++++++++++++++++------------------ Justfile | 2 +- 2 files changed, 28 insertions(+), 30 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index cb32899db..724ad0fe2 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -1,4 +1,4 @@ -name: Build and Release DDI (elementary OS 9) +name: Build and Release (elementary OS 9) on: workflow_dispatch: @@ -20,54 +20,52 @@ jobs: - name: Install mkosi uses: systemd/mkosi@v26 - - name: Generate key - run: mkosi genkey + - name: Install deps + run: apt-get update && apt-get install just podman -y - - name: Build image with mkosi - run: | - sudo mkosi -B --debug --force --profile=sysupdate + - name: Generate key + run: just genkey - - name: Update permissions - run: sudo chown -R $USER:$USER mkosi.output + - name: Release + run: just do-release - name: Compress (xz7) usr.raw run: | - find mkosi.output/sysupdate -maxdepth 1 -type f -name "*.usr-*.raw" ! -name "*verity*" -exec xz -7v -T0 {} + + find mkosi.output/sysupdate -maxdepth 1 -type f -name "*.usr-x86-64.raw" -exec xz -5v -T0 {} + + + - name: Sign ISO + run: | + cd mkosi.output + sha256sum elementary-liveiso.iso > elementary-liveiso.iso.sha256 - - name: Generate SHA256SUMS + - name: Generate SHA256SUMS (all partitions) run: | - cd mkosi.output/sysupdate - sha256sum *.efi *.usr-*.raw.xz *.usr-*-verity*.raw *.usr-*-verity-sig*.raw > SHA256SUMS - echo "Generated SHA256SUMS:" + cd mkosi.output + sha256sum sysupdate/*.efi sysupdate/*.usr-*.raw.xz sysupdate/*.usr-*-verity*.raw sysupdate/*.usr-*-verity-sig*.raw \ + | sed 's|sysupdate/||' > SHA256SUMS cat SHA256SUMS - name: Extract Date id: get_date run: | FILE_PATH=$(ls mkosi.output/sysupdate/elementary_*.raw | grep -E 'elementary_[0-9]+\.raw$' | head -n 1) - FILE_NAME=$(basename "$FILE_PATH") - TIMESTAMP=$(echo "$FILE_NAME" | sed 's/^elementary_//;s/\..*//') - + TIMESTAMP=$(basename "$FILE_PATH" | sed 's/^elementary_//;s/\..*//') echo "RELEASE_TAG=os9-$TIMESTAMP" >> "$GITHUB_OUTPUT" - echo "Generated tag: os9-$TIMESTAMP" - - name: Upload xz to R2 + - name: Upload usr, iso and SHA256SUMS to Bucket env: - AWS_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.R2_SECRET_ACCESS_KEY }} + AWS_ACCESS_KEY_ID: ${{ secrets.key }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.secret }} AWS_DEFAULT_REGION: auto run: | - cd mkosi.output/sysupdate - - for f in *.usr-*.raw.xz; do - sha256sum "$f" > "$f.sha256" - - aws s3 cp "$f" "s3://${{ secrets.R2_BUCKET }}/" \ - --endpoint-url "${{ secrets.R2_ENDPOINT }}" - aws s3 cp "$f.sha256" "s3://${{ secrets.R2_BUCKET }}/" \ - --endpoint-url "${{ secrets.R2_ENDPOINT }}" + cd mkosi.output + for f in sysupdate/*.usr-*.raw.xz sysupdate/*.usr-*.raw.xz.sha256 \ + elementary-liveiso.iso elementary-liveiso.iso.sha256 SHA256SUMS; do + aws s3 cp "$f" "s3://${{ secrets.bucket }}/" \ + --endpoint-url "${{ secrets.endpoint }}" done + - name: Create Release and Upload Artifacts uses: softprops/action-gh-release@v3 with: diff --git a/Justfile b/Justfile index 87d7aa876..34c9d872a 100644 --- a/Justfile +++ b/Justfile @@ -11,7 +11,7 @@ build-classic-liveenv: sudo rm -rf mkosi.output/classic just run-in-podman mkosi -B --debug --force --profile=classic --workspace-directory=/workspace -generate-liveiso: +do-release: #!/usr/bin/env bash just profile-sysupdate && \ just build-classic-liveenv && \ From b7c70e0ec5afec21c74ea1392766c9cddded3fbe Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Sun, 16 Aug 2026 13:28:18 -0400 Subject: [PATCH 45/86] Install deps with sudo --- .github/workflows/release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 724ad0fe2..3cf602102 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -21,7 +21,7 @@ jobs: uses: systemd/mkosi@v26 - name: Install deps - run: apt-get update && apt-get install just podman -y + run: sudo apt-get update && sudo apt-get install just podman -y - name: Generate key run: just genkey From 941be7e128da6dff14b42cb09c58d348f736d77b Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Sun, 16 Aug 2026 13:32:52 -0400 Subject: [PATCH 46/86] Create /var/cache/mkosi --- .github/workflows/release.yaml | 3 --- Justfile | 1 + README.md | 7 +------ upload.py | 18 ------------------ 4 files changed, 2 insertions(+), 27 deletions(-) delete mode 100644 upload.py diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 3cf602102..ac1821c9b 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -17,9 +17,6 @@ jobs: - name: Maximize build space uses: ublue-os/remove-unwanted-software@v8 - - name: Install mkosi - uses: systemd/mkosi@v26 - - name: Install deps run: sudo apt-get update && sudo apt-get install just podman -y diff --git a/Justfile b/Justfile index 34c9d872a..e933720f2 100644 --- a/Justfile +++ b/Justfile @@ -28,6 +28,7 @@ genkey: run-in-podman +command: mkdir -p {{env_var('HOME')}}/.cache/mkosi-workspace + mkdir -p /var/cache/mkosi sudo podman run --rm -it \ --network host \ diff --git a/README.md b/README.md index e8603b2c3..75028ff26 100644 --- a/README.md +++ b/README.md @@ -29,16 +29,11 @@ You'll need the following dependencies: * podman * just -Create the cache directory -``` -sudo mkdir /var/cache/mkosi -``` - Generate keys and then build with `just` ```bash just genkey -just generate-liveiso +just do-release ``` Create install media with [Fedora Media Writer](https://flathub.org/en/apps/org.fedoraproject.MediaWriter) or [Impression](flathub.org/en/apps/io.gitlab.adhami3310.Impression). Or boot with Gnome Boxes (>=51). Then, in demo mode, install via script: diff --git a/upload.py b/upload.py deleted file mode 100644 index a1dd5f724..000000000 --- a/upload.py +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env python3 - -import boto3 -import sys - -KEY, SECRET, ENDPOINT, BUCKET, FILEPATH, FILENAME = [sys.argv[i+1] for i in range(6)] - -session = boto3.session.Session() -client = session.client('s3', - region_name='auto', # for cloudflare R2 - endpoint_url='https://' + ENDPOINT, - aws_access_key_id = KEY, - aws_secret_access_key = SECRET) - -client.upload_file(FILEPATH, # Path to local file - BUCKET, # Name of Space - FILENAME, # Name for remote file - ) From bccc207b2e41e50d135c6eb9254fcdb44f3a9421 Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Sun, 16 Aug 2026 13:36:36 -0400 Subject: [PATCH 47/86] Add sudo --- Justfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Justfile b/Justfile index e933720f2..097383e09 100644 --- a/Justfile +++ b/Justfile @@ -28,7 +28,7 @@ genkey: run-in-podman +command: mkdir -p {{env_var('HOME')}}/.cache/mkosi-workspace - mkdir -p /var/cache/mkosi + sudo mkdir -p /var/cache/mkosi sudo podman run --rm -it \ --network host \ From df6e97e5dcb48a5402c208909a4af01588d456ba Mon Sep 17 00:00:00 2001 From: Niko Date: Sun, 16 Aug 2026 13:26:34 -0700 Subject: [PATCH 48/86] jobs fixes (#25) * add sudo to xz * chown the output directory to avoid sudo everywhere * more permissions --- .github/workflows/release.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index ac1821c9b..3b82ad2de 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -26,6 +26,11 @@ jobs: - name: Release run: just do-release + - name: Fix output dir ownership + run: | + sudo chown -R "$(id -u):$(id -g)" mkosi.output + sudo chmod -R u+rwX mkosi.output + - name: Compress (xz7) usr.raw run: | find mkosi.output/sysupdate -maxdepth 1 -type f -name "*.usr-x86-64.raw" -exec xz -5v -T0 {} + From 08acb03238ce9e40660729388ab7daed6ecf7dca Mon Sep 17 00:00:00 2001 From: jumpyvi <62212220+jumpyvi@users.noreply.github.com> Date: Sun, 16 Aug 2026 16:28:04 -0400 Subject: [PATCH 49/86] Do not sign iso --- .github/workflows/release.yaml | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 3b82ad2de..1a63348a2 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -31,15 +31,10 @@ jobs: sudo chown -R "$(id -u):$(id -g)" mkosi.output sudo chmod -R u+rwX mkosi.output - - name: Compress (xz7) usr.raw + - name: Compress (xz) usr partition run: | find mkosi.output/sysupdate -maxdepth 1 -type f -name "*.usr-x86-64.raw" -exec xz -5v -T0 {} + - - name: Sign ISO - run: | - cd mkosi.output - sha256sum elementary-liveiso.iso > elementary-liveiso.iso.sha256 - - name: Generate SHA256SUMS (all partitions) run: | cd mkosi.output @@ -62,7 +57,7 @@ jobs: run: | cd mkosi.output for f in sysupdate/*.usr-*.raw.xz sysupdate/*.usr-*.raw.xz.sha256 \ - elementary-liveiso.iso elementary-liveiso.iso.sha256 SHA256SUMS; do + elementary-liveiso.iso SHA256SUMS; do aws s3 cp "$f" "s3://${{ secrets.bucket }}/" \ --endpoint-url "${{ secrets.endpoint }}" done From e1005c0bd282704a48a8b9f79d0ca7c9fc389f27 Mon Sep 17 00:00:00 2001 From: jumpyvi <62212220+jumpyvi@users.noreply.github.com> Date: Sun, 16 Aug 2026 16:32:09 -0400 Subject: [PATCH 50/86] blacklist packages --- mkosi.sandbox/etc/apt/preferences.d/blacklist | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 mkosi.sandbox/etc/apt/preferences.d/blacklist diff --git a/mkosi.sandbox/etc/apt/preferences.d/blacklist b/mkosi.sandbox/etc/apt/preferences.d/blacklist new file mode 100644 index 000000000..ec8e4941d --- /dev/null +++ b/mkosi.sandbox/etc/apt/preferences.d/blacklist @@ -0,0 +1,3 @@ +Package: gdm3 gnome-control-center gnome-remote-desktop gnome-screensaver gnome-shell gnome-session gnome-software gnome-system-monitor nautilus +Pin: release * +Pin-Priority: -1 \ No newline at end of file From 2aafaefd9349c231beeaa31db655573d3de82e22 Mon Sep 17 00:00:00 2001 From: jumpyvi <62212220+jumpyvi@users.noreply.github.com> Date: Sun, 16 Aug 2026 20:41:37 -0400 Subject: [PATCH 51/86] Rename config files --- mkosi.conf.d/{blacklist.conf => cleanup.conf} | 3 +++ mkosi.conf.d/core.conf | 4 ---- .../etc/apt/preferences.d/{blacklist => deprioritize-gnome} | 0 3 files changed, 3 insertions(+), 4 deletions(-) rename mkosi.conf.d/{blacklist.conf => cleanup.conf} (81%) rename mkosi.sandbox/etc/apt/preferences.d/{blacklist => deprioritize-gnome} (100%) diff --git a/mkosi.conf.d/blacklist.conf b/mkosi.conf.d/cleanup.conf similarity index 81% rename from mkosi.conf.d/blacklist.conf rename to mkosi.conf.d/cleanup.conf index 5b749adf1..caebe7144 100644 --- a/mkosi.conf.d/blacklist.conf +++ b/mkosi.conf.d/cleanup.conf @@ -1,4 +1,7 @@ [Content] +RemoveFiles= + /usr/bin/chsh + /usr/bin/lchsh RemovePackages= anacron stunnel diff --git a/mkosi.conf.d/core.conf b/mkosi.conf.d/core.conf index 6528d776a..035f50cf5 100644 --- a/mkosi.conf.d/core.conf +++ b/mkosi.conf.d/core.conf @@ -1,8 +1,4 @@ [Content] -RemoveFiles= - /usr/bin/chsh - /usr/bin/lchsh - VolatilePackages= systemd-container diff --git a/mkosi.sandbox/etc/apt/preferences.d/blacklist b/mkosi.sandbox/etc/apt/preferences.d/deprioritize-gnome similarity index 100% rename from mkosi.sandbox/etc/apt/preferences.d/blacklist rename to mkosi.sandbox/etc/apt/preferences.d/deprioritize-gnome From b833e80735e888f9cdd279776fba785bff5b4760 Mon Sep 17 00:00:00 2001 From: jumpyvi <62212220+jumpyvi@users.noreply.github.com> Date: Sun, 16 Aug 2026 21:12:06 -0400 Subject: [PATCH 52/86] Remove super old cosign key --- cosign.pub | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 cosign.pub diff --git a/cosign.pub b/cosign.pub deleted file mode 100644 index 34b63aca0..000000000 --- a/cosign.pub +++ /dev/null @@ -1,4 +0,0 @@ ------BEGIN PUBLIC KEY----- -MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEO/99O5B1Vc8ykZo5jF4MF1PT0VdQ -mUFtSTST3FFvWbVKfHpgLaxoLCialVduO1EKwhnbESPfV7fcpLGFe0IsLA== ------END PUBLIC KEY----- From b982cbbbc27463e7461944381d2715b2bdc18069 Mon Sep 17 00:00:00 2001 From: Niko Date: Sun, 16 Aug 2026 20:42:50 -0700 Subject: [PATCH 53/86] make cloudflare r2 work end to end (#26) --- .github/workflows/release.yaml | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 1a63348a2..dedfce47c 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -51,15 +51,18 @@ jobs: - name: Upload usr, iso and SHA256SUMS to Bucket env: - AWS_ACCESS_KEY_ID: ${{ secrets.key }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.secret }} + AWS_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.R2_SECRET_ACCESS_KEY }} AWS_DEFAULT_REGION: auto run: | cd mkosi.output - for f in sysupdate/*.usr-*.raw.xz sysupdate/*.usr-*.raw.xz.sha256 \ - elementary-liveiso.iso SHA256SUMS; do - aws s3 cp "$f" "s3://${{ secrets.bucket }}/" \ - --endpoint-url "${{ secrets.endpoint }}" + for f in sysupdate/*.usr-*.raw.xz sysupdate/*.efi sysupdate/*.usr-*-verity*.raw sysupdate/*.usr-*-verity-sig*.raw SHA256SUMS; do + aws s3 cp "$f" "s3://${{ secrets.R2_BUCKET_UPDATES }}/" \ + --endpoint-url "${{ secrets.R2_ENDPOINT }}" + done + for f in elementary-liveiso.iso; do + aws s3 cp "$f" "s3://${{ secrets.R2_BUCKET_DAILY_INSTALLER }}/" \ + --endpoint-url "${{ secrets.R2_ENDPOINT }}" done From 2c664f4233788bc0656bfda0a91678889a557ced Mon Sep 17 00:00:00 2001 From: Niko Date: Sun, 16 Aug 2026 21:25:55 -0700 Subject: [PATCH 54/86] Fix S3 upload to differentiate between stable and daily updates (#27) --- .github/workflows/release.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index dedfce47c..053d4e263 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -57,7 +57,7 @@ jobs: run: | cd mkosi.output for f in sysupdate/*.usr-*.raw.xz sysupdate/*.efi sysupdate/*.usr-*-verity*.raw sysupdate/*.usr-*-verity-sig*.raw SHA256SUMS; do - aws s3 cp "$f" "s3://${{ secrets.R2_BUCKET_UPDATES }}/" \ + aws s3 cp "$f" "s3://${{ secrets.R2_BUCKET_DAILY_UPDATES }}/" \ --endpoint-url "${{ secrets.R2_ENDPOINT }}" done for f in elementary-liveiso.iso; do @@ -75,4 +75,4 @@ jobs: mkosi.output/sysupdate/*.efi mkosi.output/sysupdate/*.usr-*-verity*.raw mkosi.output/sysupdate/*.usr-*-verity-sig*.raw - mkosi.output/sysupdate/SHA256SUMS \ No newline at end of file + mkosi.output/sysupdate/SHA256SUMS From 54ac33446ddab0ee1ca2d4d8376d0d5418f38fb9 Mon Sep 17 00:00:00 2001 From: Niko Date: Mon, 17 Aug 2026 19:49:50 -0700 Subject: [PATCH 55/86] upload job tweaks (#28) --- .github/workflows/release.yaml | 40 ++++++++++++++-------------------- 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 053d4e263..fd49d07a7 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -33,13 +33,16 @@ jobs: - name: Compress (xz) usr partition run: | - find mkosi.output/sysupdate -maxdepth 1 -type f -name "*.usr-x86-64.raw" -exec xz -5v -T0 {} + + find mkosi.output/sysupdate -maxdepth 1 -type f -name "*.usr-*.raw" ! -name "*verity*" -exec xz -7v -T0 {} + - name: Generate SHA256SUMS (all partitions) run: | - cd mkosi.output - sha256sum sysupdate/*.efi sysupdate/*.usr-*.raw.xz sysupdate/*.usr-*-verity*.raw sysupdate/*.usr-*-verity-sig*.raw \ - | sed 's|sysupdate/||' > SHA256SUMS + cd mkosi.output/sysupdate + sha256sum *.esp.raw \ + *.usr-*.*.raw.xz \ + *.usr-*-verity.*.raw \ + *.usr-*-verity-sig.*.raw \ + > SHA256SUMS cat SHA256SUMS - name: Extract Date @@ -54,25 +57,14 @@ jobs: AWS_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.R2_SECRET_ACCESS_KEY }} AWS_DEFAULT_REGION: auto + AWS_ENDPOINT_URL: ${{ secrets.R2_ENDPOINT }} run: | - cd mkosi.output - for f in sysupdate/*.usr-*.raw.xz sysupdate/*.efi sysupdate/*.usr-*-verity*.raw sysupdate/*.usr-*-verity-sig*.raw SHA256SUMS; do - aws s3 cp "$f" "s3://${{ secrets.R2_BUCKET_DAILY_UPDATES }}/" \ - --endpoint-url "${{ secrets.R2_ENDPOINT }}" - done - for f in elementary-liveiso.iso; do - aws s3 cp "$f" "s3://${{ secrets.R2_BUCKET_DAILY_INSTALLER }}/" \ - --endpoint-url "${{ secrets.R2_ENDPOINT }}" - done + aws s3 sync mkosi.output/sysupdate/ "s3://${{ secrets.R2_BUCKET_DAILY_UPDATES }}/" \ + --exclude "*" \ + --include=*.esp.raw \ + --include=*.usr-*.*.raw.xz \ + --include=*.usr-*-verity.*.raw \ + --include=*.usr-*-verity-sig.*.raw \ + --include="SHA256SUMS" + aws s3 cp mkosi.output/elementary-liveiso.iso "s3://${{ secrets.R2_BUCKET_DAILY_INSTALLER }}/" - - - name: Create Release and Upload Artifacts - uses: softprops/action-gh-release@v3 - with: - tag_name: ${{ steps.get_date.outputs.RELEASE_TAG }} - name: Release ${{ steps.get_date.outputs.RELEASE_TAG }} - files: | - mkosi.output/sysupdate/*.efi - mkosi.output/sysupdate/*.usr-*-verity*.raw - mkosi.output/sysupdate/*.usr-*-verity-sig*.raw - mkosi.output/sysupdate/SHA256SUMS From 9072258d670cc979b31c0610df903ea159a6fa47 Mon Sep 17 00:00:00 2001 From: Niko Date: Tue, 18 Aug 2026 17:27:44 -0700 Subject: [PATCH 56/86] put isos into subfolder, and name them (#29) --- .github/workflows/release.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index fd49d07a7..2ffa38baf 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -51,6 +51,7 @@ jobs: FILE_PATH=$(ls mkosi.output/sysupdate/elementary_*.raw | grep -E 'elementary_[0-9]+\.raw$' | head -n 1) TIMESTAMP=$(basename "$FILE_PATH" | sed 's/^elementary_//;s/\..*//') echo "RELEASE_TAG=os9-$TIMESTAMP" >> "$GITHUB_OUTPUT" + echo "RELEASE_DATE=${TIMESTAMP:0:8}" >> "$GITHUB_OUTPUT" - name: Upload usr, iso and SHA256SUMS to Bucket env: @@ -66,5 +67,5 @@ jobs: --include=*.usr-*-verity.*.raw \ --include=*.usr-*-verity-sig.*.raw \ --include="SHA256SUMS" - aws s3 cp mkosi.output/elementary-liveiso.iso "s3://${{ secrets.R2_BUCKET_DAILY_INSTALLER }}/" + aws s3 cp mkosi.output/elementary-liveiso.iso "s3://${{ secrets.R2_BUCKET_DAILY_INSTALLER }}/amd64/elementaryos-9.0-daily-amd64.${{ steps.get_date.outputs.RELEASE_DATE }}.iso" From 4d0edc89ce1ed5c0066537c1d6ca67b4e24153f8 Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Tue, 18 Aug 2026 23:05:56 -0400 Subject: [PATCH 57/86] Refactor: Move to mkosi.images (#30) * Initial nvidia work * Migrate to mkosi.images * Disable cleaning metadata on liveiso * Hard code partion prefix --- Justfile | 19 +------ assemble-iso-classiconly.sh | 57 ------------------- assemble-iso.sh | 45 +++++++-------- mkosi.conf | 7 ++- mkosi.extra/usr/share/factory/etc/.gitkeep | 1 - .../base}/mkosi.conf | 16 +++--- .../base/mkosi.conf.d}/cleanup.conf | 4 +- .../base/mkosi.conf.d}/core.conf | 5 +- .../base/mkosi.conf.d}/elementary.conf | 1 + .../base}/mkosi.extra/boot/loader/loader.conf | 0 .../usr/lib}/dracut.conf.d/base-ubuntu.conf | 0 .../usr/lib}/dracut.conf.d/lvm2.conf | 0 .../usr/lib/sysctl.d/60-apparmor.conf | 0 .../systemd/system-preset/01-systemd.preset | 0 .../system-preset/10-elementary.preset | 0 .../system-preset/91-resolved-default.preset | 0 .../lib/systemd/system/preset-global.service | 0 .../systemd/system/systemd-firstboot.service | 0 .../systemd-networkd-wait-online.service | 0 .../lib/systemd/user-preset/01-user.preset | 0 .../usr/lib/systemd/zram-generator.conf | 0 .../sysupdate.d/10-usr-verity-sig.transfer | 0 .../lib/sysupdate.d/11-usr-verity.transfer | 0 .../usr/lib/sysupdate.d/12-usr.transfer | 0 .../usr/lib/sysupdate.d/20-uki.transfer | 0 .../usr/lib/sysupdate.d/devel.feature | 0 .../usr/lib/sysupdate.d/devel.transfer | 0 .../usr/lib/sysupdate.d/nvidia-addon.transfer | 16 ++++++ .../usr/lib/sysupdate.d/nvidia-driver.feature | 3 + .../nvidia-initrd-modules.transfer | 18 ++++++ .../lib/sysupdate.d/nvidia-modules.transfer | 16 ++++++ .../lib/sysupdate.d/nvidia-runtime.transfer | 16 ++++++ .../usr/lib/sysusers.d/session.conf | 0 .../mkosi.extra}/usr/lib/sysusers.d/wpa.conf | 0 .../usr/lib/tmpfiles.d/99-factory.conf | 0 .../usr/lib/tmpfiles.d/aliases.conf | 0 .../mkosi.extra}/usr/lib/tmpfiles.d/etc.conf | 0 .../usr/lib/tmpfiles.d/login.conf | 0 .../usr/lib/tmpfiles.d/resolved-default.conf | 0 .../base}/mkosi.finalize | 0 mkosi.images/devel/mkosi.conf | 46 --------------- .../elementary}/mkosi.conf | 13 +++-- .../mkosi.extra/usr/lib/repart.d/00-esp.conf | 1 + .../usr/lib/repart.d/10-usr-verity-sig.conf | 2 +- .../usr/lib/repart.d/11-usr-verity.conf | 2 +- .../mkosi.extra/usr/lib/repart.d/12-usr.conf | 2 +- .../mkosi.extra/usr/sbin/featurectl | 4 ++ .../mkosi.extra/usr/sbin/usroverlay | 0 .../elementary/mkosi.postinst.chroot | 0 .../elementary}/mkosi.repart/00-esp.conf | 1 + .../mkosi.repart/10-usr-verity-sig.conf | 2 +- .../mkosi.repart/11-usr-verity.conf | 2 +- .../elementary}/mkosi.repart/12-usr.conf | 2 +- .../mkosi.repart/20-usr-verify-sig-bside.conf | 0 .../mkosi.repart/21-usr-verity-bside.conf | 0 .../mkosi.repart/22-usr-bside.conf | 0 .../liveiso}/mkosi.conf | 16 ++++-- .../liveiso}/mkosi.extra/iso_root/.disk/info | 0 .../mkosi.extra/iso_root/boot/grub/grub.cfg | 0 .../casper/filesystem.manifest-remove | 3 + .../mkosi.extra/iso_root/dists/stable/Release | 0 .../opt/repart-target/home/50-home.conf | 0 .../opt/repart-target/root/40-root.conf | 0 .../99_enable_in_live_mode.conf | 0 .../mkosi.extra/usr/sbin/elementary-install | 0 mkosi.images/liveiso/mkosi.posinst.chroot | 6 ++ .../liveiso}/mkosi.repart/00-esp.conf | 0 .../liveiso}/mkosi.repart/40-root.conf | 0 .../liveiso}/mkosi.repart/50-home.conf | 0 mkosi.images/os/mkosi.conf | 10 ---- mkosi.initrd.conf | 10 ++++ .../casper/filesystem.manifest-remove | 2 - mkosi.profiles/classic/mkosi.posinst.chroot | 6 -- 73 files changed, 162 insertions(+), 192 deletions(-) delete mode 100755 assemble-iso-classiconly.sh delete mode 100644 mkosi.extra/usr/share/factory/etc/.gitkeep rename {mkosi.conf.d => mkosi.images/base}/mkosi.conf (54%) rename {mkosi.conf.d => mkosi.images/base/mkosi.conf.d}/cleanup.conf (89%) rename {mkosi.conf.d => mkosi.images/base/mkosi.conf.d}/core.conf (91%) rename {mkosi.conf.d => mkosi.images/base/mkosi.conf.d}/elementary.conf (91%) rename {mkosi.profiles/sysupdate => mkosi.images/base}/mkosi.extra/boot/loader/loader.conf (100%) rename {mkosi.extra/usr/lib/dracut => mkosi.images/base/mkosi.extra/usr/lib}/dracut.conf.d/base-ubuntu.conf (100%) rename {mkosi.extra/usr/lib/dracut => mkosi.images/base/mkosi.extra/usr/lib}/dracut.conf.d/lvm2.conf (100%) rename {mkosi.extra => mkosi.images/base/mkosi.extra}/usr/lib/sysctl.d/60-apparmor.conf (100%) rename {mkosi.extra => mkosi.images/base/mkosi.extra}/usr/lib/systemd/system-preset/01-systemd.preset (100%) rename {mkosi.extra => mkosi.images/base/mkosi.extra}/usr/lib/systemd/system-preset/10-elementary.preset (100%) rename {mkosi.extra => mkosi.images/base/mkosi.extra}/usr/lib/systemd/system-preset/91-resolved-default.preset (100%) rename {mkosi.extra => mkosi.images/base/mkosi.extra}/usr/lib/systemd/system/preset-global.service (100%) rename {mkosi.extra => mkosi.images/base/mkosi.extra}/usr/lib/systemd/system/systemd-firstboot.service (100%) rename {mkosi.extra => mkosi.images/base/mkosi.extra}/usr/lib/systemd/system/systemd-networkd-wait-online.service (100%) rename {mkosi.extra => mkosi.images/base/mkosi.extra}/usr/lib/systemd/user-preset/01-user.preset (100%) rename {mkosi.extra => mkosi.images/base/mkosi.extra}/usr/lib/systemd/zram-generator.conf (100%) rename {mkosi.extra => mkosi.images/base/mkosi.extra}/usr/lib/sysupdate.d/10-usr-verity-sig.transfer (100%) rename {mkosi.extra => mkosi.images/base/mkosi.extra}/usr/lib/sysupdate.d/11-usr-verity.transfer (100%) rename {mkosi.extra => mkosi.images/base/mkosi.extra}/usr/lib/sysupdate.d/12-usr.transfer (100%) rename {mkosi.extra => mkosi.images/base/mkosi.extra}/usr/lib/sysupdate.d/20-uki.transfer (100%) rename {mkosi.extra => mkosi.images/base/mkosi.extra}/usr/lib/sysupdate.d/devel.feature (100%) rename {mkosi.extra => mkosi.images/base/mkosi.extra}/usr/lib/sysupdate.d/devel.transfer (100%) create mode 100644 mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-addon.transfer create mode 100644 mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-driver.feature create mode 100644 mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-initrd-modules.transfer create mode 100644 mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-modules.transfer create mode 100644 mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-runtime.transfer rename {mkosi.extra => mkosi.images/base/mkosi.extra}/usr/lib/sysusers.d/session.conf (100%) rename {mkosi.extra => mkosi.images/base/mkosi.extra}/usr/lib/sysusers.d/wpa.conf (100%) rename {mkosi.extra => mkosi.images/base/mkosi.extra}/usr/lib/tmpfiles.d/99-factory.conf (100%) rename {mkosi.extra => mkosi.images/base/mkosi.extra}/usr/lib/tmpfiles.d/aliases.conf (100%) rename {mkosi.extra => mkosi.images/base/mkosi.extra}/usr/lib/tmpfiles.d/etc.conf (100%) rename {mkosi.extra => mkosi.images/base/mkosi.extra}/usr/lib/tmpfiles.d/login.conf (100%) rename {mkosi.extra => mkosi.images/base/mkosi.extra}/usr/lib/tmpfiles.d/resolved-default.conf (100%) rename {mkosi.profiles/sysupdate => mkosi.images/base}/mkosi.finalize (100%) delete mode 100644 mkosi.images/devel/mkosi.conf rename {mkosi.profiles/sysupdate => mkosi.images/elementary}/mkosi.conf (82%) rename {mkosi.profiles/sysupdate => mkosi.images/elementary}/mkosi.extra/usr/lib/repart.d/00-esp.conf (76%) rename {mkosi.profiles/sysupdate => mkosi.images/elementary}/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf (76%) rename {mkosi.profiles/sysupdate => mkosi.images/elementary}/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf (78%) rename {mkosi.profiles/sysupdate => mkosi.images/elementary}/mkosi.extra/usr/lib/repart.d/12-usr.conf (80%) create mode 100644 mkosi.images/elementary/mkosi.extra/usr/sbin/featurectl rename {mkosi.profiles/sysupdate => mkosi.images/elementary}/mkosi.extra/usr/sbin/usroverlay (100%) rename mkosi.postinst.chroot => mkosi.images/elementary/mkosi.postinst.chroot (100%) rename {mkosi.profiles/sysupdate => mkosi.images/elementary}/mkosi.repart/00-esp.conf (83%) rename {mkosi.profiles/sysupdate => mkosi.images/elementary}/mkosi.repart/10-usr-verity-sig.conf (73%) rename {mkosi.profiles/sysupdate => mkosi.images/elementary}/mkosi.repart/11-usr-verity.conf (80%) rename {mkosi.profiles/sysupdate => mkosi.images/elementary}/mkosi.repart/12-usr.conf (88%) rename {mkosi.profiles/sysupdate => mkosi.images/elementary}/mkosi.repart/20-usr-verify-sig-bside.conf (100%) rename {mkosi.profiles/sysupdate => mkosi.images/elementary}/mkosi.repart/21-usr-verity-bside.conf (100%) rename {mkosi.profiles/sysupdate => mkosi.images/elementary}/mkosi.repart/22-usr-bside.conf (100%) rename {mkosi.profiles/classic => mkosi.images/liveiso}/mkosi.conf (71%) rename {mkosi.profiles/classic => mkosi.images/liveiso}/mkosi.extra/iso_root/.disk/info (100%) rename {mkosi.profiles/classic => mkosi.images/liveiso}/mkosi.extra/iso_root/boot/grub/grub.cfg (100%) create mode 100644 mkosi.images/liveiso/mkosi.extra/iso_root/casper/filesystem.manifest-remove rename {mkosi.profiles/classic => mkosi.images/liveiso}/mkosi.extra/iso_root/dists/stable/Release (100%) rename {mkosi.profiles/classic => mkosi.images/liveiso}/mkosi.extra/opt/repart-target/home/50-home.conf (100%) rename {mkosi.profiles/classic => mkosi.images/liveiso}/mkosi.extra/opt/repart-target/root/40-root.conf (100%) rename {mkosi.profiles/classic => mkosi.images/liveiso}/mkosi.extra/usr/lib/systemd/system/apparmor.service.d/99_enable_in_live_mode.conf (100%) rename {mkosi.profiles/classic => mkosi.images/liveiso}/mkosi.extra/usr/sbin/elementary-install (100%) create mode 100755 mkosi.images/liveiso/mkosi.posinst.chroot rename {mkosi.profiles/classic => mkosi.images/liveiso}/mkosi.repart/00-esp.conf (100%) rename {mkosi.profiles/classic => mkosi.images/liveiso}/mkosi.repart/40-root.conf (100%) rename {mkosi.profiles/classic => mkosi.images/liveiso}/mkosi.repart/50-home.conf (100%) delete mode 100644 mkosi.images/os/mkosi.conf create mode 100644 mkosi.initrd.conf delete mode 100644 mkosi.profiles/classic/mkosi.extra/iso_root/casper/filesystem.manifest-remove delete mode 100755 mkosi.profiles/classic/mkosi.posinst.chroot diff --git a/Justfile b/Justfile index 097383e09..5f08a4e6a 100644 --- a/Justfile +++ b/Justfile @@ -3,26 +3,11 @@ default: set -xeuo pipefail just --choose -profile-sysupdate: - sudo rm -rf mkosi.output/sysupdate - just run-in-podman mkosi -B --debug --force --profile=sysupdate --workspace-directory=/workspace - -build-classic-liveenv: - sudo rm -rf mkosi.output/classic - just run-in-podman mkosi -B --debug --force --profile=classic --workspace-directory=/workspace - do-release: #!/usr/bin/env bash - just profile-sysupdate && \ - just build-classic-liveenv && \ + sudo rm -rf mkosi.output/ + just run-in-podman mkosi -B --debug --force --workspace-directory=/workspace sudo ./assemble-iso.sh - -generate-liveiso-classiconly: - #!/usr/bin/env bash - just build-classic-liveenv && \ - sudo ./assemble-iso-classiconly.sh - - genkey: just run-in-podman mkosi genkey diff --git a/assemble-iso-classiconly.sh b/assemble-iso-classiconly.sh deleted file mode 100755 index 6c5d4f222..000000000 --- a/assemble-iso-classiconly.sh +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail -cd mkosi.output/classic/ - -SEARCH_DIR=../sysupdate - -OUT_ISO="./elementary-liveiso.iso" - -# Detect version -output_dir=$(ls -d elementaryclassic_* | grep -vE '\.(raw|iso|vmlinuz|initrd|efi|manifest)$' | head -n 1) - -if [[ -z "$output_dir" ]]; then - echo "error: No mkosi.output, run just build-classic first." >&2 - exit 1 -fi - -base_name=$(basename "$output_dir") -echo "Detected release target: $base_name" - -rm -rf iso_root - -rsync -a --delete "${base_name}/iso_root/" iso_root/ - -echo "Writing minimal APT disc structure for apt-cdrom..." - -mkdir -p iso_root/dists/stable/main/binary-amd64 -touch iso_root/dists/stable/main/binary-amd64/Packages -gzip -kf iso_root/dists/stable/main/binary-amd64/Packages -mkdir -p iso_root/pool - - -echo "Shoving everything in casper..." -sudo podman run --rm -it \ - --network host \ - --dns 8.8.8.8 \ - -v "$(pwd)":/workspace:Z \ - -w /workspace \ - ghcr.io/jumpyvi/xorriso:tanit \ - sh -c "set -e - KERNEL_VERSION=\$(ls ${base_name}/lib/modules | head -n 1) - chroot ${base_name} update-initramfs -u -k \${KERNEL_VERSION} - - cp ${base_name}/boot/vmlinuz-\${KERNEL_VERSION} iso_root/casper/vmlinuz - cp ${base_name}/boot/initrd.img-\${KERNEL_VERSION} iso_root/casper/initrd - - rm -f iso_root/casper/filesystem.squashfs - mksquashfs ${base_name} iso_root/casper/filesystem.squashfs -comp xz - - grub-mkrescue -o custom_ubuntu_live.iso iso_root/ - echo 'Live environment generated!'" - - -echo "Generating installer..." -BASE_ISO="./classic/custom_ubuntu_live.iso" -rm -f "../$OUT_ISO" - -echo "Success! Your live ISO is at: mkosi.output/classic/custom_ubuntu_live.iso" \ No newline at end of file diff --git a/assemble-iso.sh b/assemble-iso.sh index c336f39a1..3853fc68a 100755 --- a/assemble-iso.sh +++ b/assemble-iso.sh @@ -1,18 +1,21 @@ #!/usr/bin/env bash set -euo pipefail -cd mkosi.output/classic/ +cd mkosi.output/ -SEARCH_DIR=../sysupdate +SEARCH_DIR=. -OUT_ISO="./elementary-liveiso.iso" +DATE=$(basename $(ls -d liveiso_* | grep -vE '\.(raw|iso|vmlinuz|initrd|efi|manifest)$' | head -n1)) +DATE=${DATE#liveiso_} + +OUT_ISO="./elementaryos-9.0-daily-amd64.${DATE}.iso" RAW_IMAGE=$(find "$SEARCH_DIR" -maxdepth 1 -type f \ - | grep -E '/[^/]+_[0-9]{14}\.raw$' \ - | head -n1) + | grep -E '/[^/]+_[0-9]{14}\.raw$' \ + | head -n1) if [[ -z "$RAW_IMAGE" ]]; then - echo "error: No .raw image found matching the pattern." >&2 - exit 1 + echo "error: No .raw image found matching the pattern." >&2 + exit 1 fi XZ_IMAGE="${RAW_IMAGE}.xz" @@ -20,11 +23,11 @@ echo "Compressing raw image: $RAW_IMAGE -> $XZ_IMAGE..." xz -1 -T0 -c "$RAW_IMAGE" > "$XZ_IMAGE" # Detect version -output_dir=$(ls -d elementaryclassic_* | grep -vE '\.(raw|iso|vmlinuz|initrd|efi|manifest)$' | head -n 1) +output_dir=$(ls -d liveiso_* | grep -vE '\.(raw|iso|vmlinuz|initrd|efi|manifest)$' | head -n 1) if [[ -z "$output_dir" ]]; then - echo "error: No mkosi.output, run just build-classic first." >&2 - exit 1 + echo "error: No mkosi.output, run just build-classic first." >&2 + exit 1 fi base_name=$(basename "$output_dir") @@ -52,30 +55,26 @@ sudo podman run --rm -it \ sh -c "set -e KERNEL_VERSION=\$(ls ${base_name}/lib/modules | head -n 1) chroot ${base_name} update-initramfs -u -k \${KERNEL_VERSION} - cp ${base_name}/boot/vmlinuz-\${KERNEL_VERSION} iso_root/casper/vmlinuz cp ${base_name}/boot/initrd.img-\${KERNEL_VERSION} iso_root/casper/initrd - rm -f iso_root/casper/filesystem.squashfs mksquashfs ${base_name} iso_root/casper/filesystem.squashfs -comp xz - grub-mkrescue -o custom_ubuntu_live.iso iso_root/ echo 'Live environment generated!'" echo "Generating installer..." -BASE_ISO="./classic/custom_ubuntu_live.iso" -rm -f "../$OUT_ISO" +BASE_ISO="./custom_ubuntu_live.iso" +rm -f "$OUT_ISO" -cp "$XZ_IMAGE" . -LOCAL_RAW_IMAGE="./classic/$(basename "$XZ_IMAGE")" +LOCAL_RAW_IMAGE="./$(basename "$XZ_IMAGE")" podman run --rm \ - --security-opt label=disable \ - -v "../:/work" \ - -w /work \ - ghcr.io/jumpyvi/xorriso:tanit \ - sh -c ' + --security-opt label=disable \ + -v "$(pwd):/work" \ + -w /work \ + ghcr.io/jumpyvi/xorriso:tanit \ + sh -c ' apk add --no-cache xorriso && \ xorriso -indev "'"$BASE_ISO"'" \ -outdev "'"$OUT_ISO"'" \ @@ -84,6 +83,4 @@ podman run --rm \ -commit ' -rm -f "$(basename "$XZ_IMAGE")" - echo "Success! Your live ISO is at: mkosi.output/$OUT_ISO" \ No newline at end of file diff --git a/mkosi.conf b/mkosi.conf index b6cdf80ea..ded800c6e 100644 --- a/mkosi.conf +++ b/mkosi.conf @@ -1,5 +1,9 @@ [Config] MinimumVersion=26~devel +Dependencies= + base + elementary + liveiso [Distribution] Distribution=ubuntu @@ -15,4 +19,5 @@ ToolsTreeDistribution=ubuntu ToolsTreeRelease=resolute [Output] -Format=none \ No newline at end of file +OutputDirectory=mkosi.output/ +Format=none diff --git a/mkosi.extra/usr/share/factory/etc/.gitkeep b/mkosi.extra/usr/share/factory/etc/.gitkeep deleted file mode 100644 index 326c1956b..000000000 --- a/mkosi.extra/usr/share/factory/etc/.gitkeep +++ /dev/null @@ -1 +0,0 @@ -# add factory overwrite here... \ No newline at end of file diff --git a/mkosi.conf.d/mkosi.conf b/mkosi.images/base/mkosi.conf similarity index 54% rename from mkosi.conf.d/mkosi.conf rename to mkosi.images/base/mkosi.conf index 431139f2c..33b35765b 100644 --- a/mkosi.conf.d/mkosi.conf +++ b/mkosi.images/base/mkosi.conf @@ -1,19 +1,17 @@ [Match] Distribution=ubuntu +[Output] +Format=directory +ImageId=base +SplitArtifacts= + [Content] -Packages=systemd-container Bootable=no -UnifiedKernelImageFormat=%i_%v - +CleanPackageMetadata=no +Packages=systemd-container VolatilePackages= passwd login uidmap systemd-boot - -InitrdPackages= - linux-firmware - cryptsetup - cryptsetup-bin - systemd-container \ No newline at end of file diff --git a/mkosi.conf.d/cleanup.conf b/mkosi.images/base/mkosi.conf.d/cleanup.conf similarity index 89% rename from mkosi.conf.d/cleanup.conf rename to mkosi.images/base/mkosi.conf.d/cleanup.conf index caebe7144..62dac1bbe 100644 --- a/mkosi.conf.d/cleanup.conf +++ b/mkosi.images/base/mkosi.conf.d/cleanup.conf @@ -1,9 +1,11 @@ +[Match] +Distribution=ubuntu + [Content] RemoveFiles= /usr/bin/chsh /usr/bin/lchsh RemovePackages= - anacron stunnel gdm3 gnome-control-center diff --git a/mkosi.conf.d/core.conf b/mkosi.images/base/mkosi.conf.d/core.conf similarity index 91% rename from mkosi.conf.d/core.conf rename to mkosi.images/base/mkosi.conf.d/core.conf index 035f50cf5..3fdbcacf9 100644 --- a/mkosi.conf.d/core.conf +++ b/mkosi.images/base/mkosi.conf.d/core.conf @@ -1,7 +1,9 @@ +[Match] +Distribution=ubuntu + [Content] VolatilePackages= systemd-container - Packages= apparmor apparmor-profiles @@ -16,6 +18,7 @@ Packages= nano network-manager pipewire-audio + plymouth sudo-rs systemd-boot systemd-cryptsetup diff --git a/mkosi.conf.d/elementary.conf b/mkosi.images/base/mkosi.conf.d/elementary.conf similarity index 91% rename from mkosi.conf.d/elementary.conf rename to mkosi.images/base/mkosi.conf.d/elementary.conf index efdf37679..6dc4c9ad5 100644 --- a/mkosi.conf.d/elementary.conf +++ b/mkosi.images/base/mkosi.conf.d/elementary.conf @@ -7,6 +7,7 @@ Packages= elementary-desktop elementary-minimal elementary-standard + plymouth-theme-elementary pantheon-greeter # if not explicitly named, get stuck on a black screen post-install gala # if not explicitly named, get stuck on a black screen post-install lightdm \ No newline at end of file diff --git a/mkosi.profiles/sysupdate/mkosi.extra/boot/loader/loader.conf b/mkosi.images/base/mkosi.extra/boot/loader/loader.conf similarity index 100% rename from mkosi.profiles/sysupdate/mkosi.extra/boot/loader/loader.conf rename to mkosi.images/base/mkosi.extra/boot/loader/loader.conf diff --git a/mkosi.extra/usr/lib/dracut/dracut.conf.d/base-ubuntu.conf b/mkosi.images/base/mkosi.extra/usr/lib/dracut.conf.d/base-ubuntu.conf similarity index 100% rename from mkosi.extra/usr/lib/dracut/dracut.conf.d/base-ubuntu.conf rename to mkosi.images/base/mkosi.extra/usr/lib/dracut.conf.d/base-ubuntu.conf diff --git a/mkosi.extra/usr/lib/dracut/dracut.conf.d/lvm2.conf b/mkosi.images/base/mkosi.extra/usr/lib/dracut.conf.d/lvm2.conf similarity index 100% rename from mkosi.extra/usr/lib/dracut/dracut.conf.d/lvm2.conf rename to mkosi.images/base/mkosi.extra/usr/lib/dracut.conf.d/lvm2.conf diff --git a/mkosi.extra/usr/lib/sysctl.d/60-apparmor.conf b/mkosi.images/base/mkosi.extra/usr/lib/sysctl.d/60-apparmor.conf similarity index 100% rename from mkosi.extra/usr/lib/sysctl.d/60-apparmor.conf rename to mkosi.images/base/mkosi.extra/usr/lib/sysctl.d/60-apparmor.conf diff --git a/mkosi.extra/usr/lib/systemd/system-preset/01-systemd.preset b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system-preset/01-systemd.preset similarity index 100% rename from mkosi.extra/usr/lib/systemd/system-preset/01-systemd.preset rename to mkosi.images/base/mkosi.extra/usr/lib/systemd/system-preset/01-systemd.preset diff --git a/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset similarity index 100% rename from mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset rename to mkosi.images/base/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset diff --git a/mkosi.extra/usr/lib/systemd/system-preset/91-resolved-default.preset b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system-preset/91-resolved-default.preset similarity index 100% rename from mkosi.extra/usr/lib/systemd/system-preset/91-resolved-default.preset rename to mkosi.images/base/mkosi.extra/usr/lib/systemd/system-preset/91-resolved-default.preset diff --git a/mkosi.extra/usr/lib/systemd/system/preset-global.service b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system/preset-global.service similarity index 100% rename from mkosi.extra/usr/lib/systemd/system/preset-global.service rename to mkosi.images/base/mkosi.extra/usr/lib/systemd/system/preset-global.service diff --git a/mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service similarity index 100% rename from mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service rename to mkosi.images/base/mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service diff --git a/mkosi.extra/usr/lib/systemd/system/systemd-networkd-wait-online.service b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system/systemd-networkd-wait-online.service similarity index 100% rename from mkosi.extra/usr/lib/systemd/system/systemd-networkd-wait-online.service rename to mkosi.images/base/mkosi.extra/usr/lib/systemd/system/systemd-networkd-wait-online.service diff --git a/mkosi.extra/usr/lib/systemd/user-preset/01-user.preset b/mkosi.images/base/mkosi.extra/usr/lib/systemd/user-preset/01-user.preset similarity index 100% rename from mkosi.extra/usr/lib/systemd/user-preset/01-user.preset rename to mkosi.images/base/mkosi.extra/usr/lib/systemd/user-preset/01-user.preset diff --git a/mkosi.extra/usr/lib/systemd/zram-generator.conf b/mkosi.images/base/mkosi.extra/usr/lib/systemd/zram-generator.conf similarity index 100% rename from mkosi.extra/usr/lib/systemd/zram-generator.conf rename to mkosi.images/base/mkosi.extra/usr/lib/systemd/zram-generator.conf diff --git a/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer b/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer similarity index 100% rename from mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer rename to mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer diff --git a/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer b/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer similarity index 100% rename from mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer rename to mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer diff --git a/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer b/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer similarity index 100% rename from mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer rename to mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer diff --git a/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer b/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer similarity index 100% rename from mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer rename to mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer diff --git a/mkosi.extra/usr/lib/sysupdate.d/devel.feature b/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/devel.feature similarity index 100% rename from mkosi.extra/usr/lib/sysupdate.d/devel.feature rename to mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/devel.feature diff --git a/mkosi.extra/usr/lib/sysupdate.d/devel.transfer b/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/devel.transfer similarity index 100% rename from mkosi.extra/usr/lib/sysupdate.d/devel.transfer rename to mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/devel.transfer diff --git a/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-addon.transfer b/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-addon.transfer new file mode 100644 index 000000000..73048574f --- /dev/null +++ b/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-addon.transfer @@ -0,0 +1,16 @@ +[Transfer] +ProtectVersion=%A +Features=nvidia-driver + +[Source] +Type=url-file +Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download/ +MatchPattern=elementary-nvidia-%a_@v.addon.efi elementary-nvidia-%a_@v.addon.efi.xz + +[Target] +Type=regular-file +Path=/EFI/Linux +PathRelativeTo=boot +MatchPattern=Elementary_@v.efi.extra.d/nvidia.addon.efi +Mode=0444 +InstancesMax=2 \ No newline at end of file diff --git a/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-driver.feature b/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-driver.feature new file mode 100644 index 000000000..2b1726a61 --- /dev/null +++ b/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-driver.feature @@ -0,0 +1,3 @@ +[Feature] +Description=NVIDIA (Open) GPU Driver +Documentation=https://github.com/nvidia/open-gpu-kernel-modules diff --git a/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-initrd-modules.transfer b/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-initrd-modules.transfer new file mode 100644 index 000000000..b554985c0 --- /dev/null +++ b/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-initrd-modules.transfer @@ -0,0 +1,18 @@ +[Transfer] +ProtectVersion=%A +Features=nvidia-driver + +[Source] +Type=url-file +Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download/ +MatchPattern=nvidia-modules-%a_@v.raw \ + nvidia-modules-%a_@v.raw.xz \ + nvidia-modules-%a_@v.raw.zst + +[Target] +Type=regular-file +Path=/EFI/Linux +PathRelativeTo=boot +MatchPattern=Elementary_@v.efi.extra.d/nvidia-modules.raw +Mode=0444 +InstancesMax=2 \ No newline at end of file diff --git a/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-modules.transfer b/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-modules.transfer new file mode 100644 index 000000000..d2f0a6ac4 --- /dev/null +++ b/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-modules.transfer @@ -0,0 +1,16 @@ +[Transfer] +ProtectVersion=%A +Features=nvidia-driver + +[Source] +Type=url-file +Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download/ +MatchPattern=nvidia-modules-%a_@v.raw \ + nvidia-modules-%a_@v.raw.xz \ + nvidia-modules-%a_@v.raw.zst + +[Target] +Type=regular-file +Path=/var/lib/extensions/ +MatchPattern=nvidia-modules_@v.raw +InstancesMax=2 diff --git a/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-runtime.transfer b/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-runtime.transfer new file mode 100644 index 000000000..5dfb5160b --- /dev/null +++ b/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-runtime.transfer @@ -0,0 +1,16 @@ +[Transfer] +ProtectVersion=%A +Features=nvidia-driver + +[Source] +Type=url-file +Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download/ +MatchPattern=nvidia-runtime-%a_@v.raw \ + nvidia-runtime-%a_@v.raw.xz \ + nvidia-runtime-%a_@v.raw.zst + +[Target] +Type=regular-file +Path=/var/lib/extensions/ +MatchPattern=nvidia-runtime_@v.raw +InstancesMax=2 \ No newline at end of file diff --git a/mkosi.extra/usr/lib/sysusers.d/session.conf b/mkosi.images/base/mkosi.extra/usr/lib/sysusers.d/session.conf similarity index 100% rename from mkosi.extra/usr/lib/sysusers.d/session.conf rename to mkosi.images/base/mkosi.extra/usr/lib/sysusers.d/session.conf diff --git a/mkosi.extra/usr/lib/sysusers.d/wpa.conf b/mkosi.images/base/mkosi.extra/usr/lib/sysusers.d/wpa.conf similarity index 100% rename from mkosi.extra/usr/lib/sysusers.d/wpa.conf rename to mkosi.images/base/mkosi.extra/usr/lib/sysusers.d/wpa.conf diff --git a/mkosi.extra/usr/lib/tmpfiles.d/99-factory.conf b/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/99-factory.conf similarity index 100% rename from mkosi.extra/usr/lib/tmpfiles.d/99-factory.conf rename to mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/99-factory.conf diff --git a/mkosi.extra/usr/lib/tmpfiles.d/aliases.conf b/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/aliases.conf similarity index 100% rename from mkosi.extra/usr/lib/tmpfiles.d/aliases.conf rename to mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/aliases.conf diff --git a/mkosi.extra/usr/lib/tmpfiles.d/etc.conf b/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/etc.conf similarity index 100% rename from mkosi.extra/usr/lib/tmpfiles.d/etc.conf rename to mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/etc.conf diff --git a/mkosi.extra/usr/lib/tmpfiles.d/login.conf b/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/login.conf similarity index 100% rename from mkosi.extra/usr/lib/tmpfiles.d/login.conf rename to mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/login.conf diff --git a/mkosi.extra/usr/lib/tmpfiles.d/resolved-default.conf b/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/resolved-default.conf similarity index 100% rename from mkosi.extra/usr/lib/tmpfiles.d/resolved-default.conf rename to mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/resolved-default.conf diff --git a/mkosi.profiles/sysupdate/mkosi.finalize b/mkosi.images/base/mkosi.finalize similarity index 100% rename from mkosi.profiles/sysupdate/mkosi.finalize rename to mkosi.images/base/mkosi.finalize diff --git a/mkosi.images/devel/mkosi.conf b/mkosi.images/devel/mkosi.conf deleted file mode 100644 index 7ed6f2cbf..000000000 --- a/mkosi.images/devel/mkosi.conf +++ /dev/null @@ -1,46 +0,0 @@ -[Config] -Dependencies=os - -[Match] -Distribution=ubuntu -Release=resolute -Profiles=sysexts - -[Output] -Format=sysext -Overlay=yes -ImageId=ext-devel - -[Content] -Bootable=no -BaseTrees=%O/elementary_%v_%a.raw -Packages= - cmake - meson - sassc - libxml2-dev - libdbus-1-dev - libadwaita-1-dev - git - build-essential - ripgrep - dnsutils - podman-compose - gcc - gettext - distrobox - fastfetch - binutils - curl - wget - htop - podman - vim - fzf - gcr - git - just - lshw - ssh-askpass-gnome - yq - jq \ No newline at end of file diff --git a/mkosi.profiles/sysupdate/mkosi.conf b/mkosi.images/elementary/mkosi.conf similarity index 82% rename from mkosi.profiles/sysupdate/mkosi.conf rename to mkosi.images/elementary/mkosi.conf index 57373c332..fda9b6a3a 100644 --- a/mkosi.profiles/sysupdate/mkosi.conf +++ b/mkosi.images/elementary/mkosi.conf @@ -1,18 +1,21 @@ +[Config] +Dependencies=base + [Match] -Profiles=sysupdate Distribution=ubuntu [Output] -SplitArtifacts=uki,partitions Format=disk -OutputDirectory=../../mkosi.output/sysupdate -ImageId=elementary +SplitArtifacts=partitions [Content] +VolatilePackages= + systemd-boot-efi Bootable=yes +BaseTrees=%O/base_%v +CleanPackageMetadata=yes Bootloader=systemd-boot UnifiedKernelImageFormat=%i_%v -InitrdProfiles= KernelInitrdModules= default ahci diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/00-esp.conf b/mkosi.images/elementary/mkosi.extra/usr/lib/repart.d/00-esp.conf similarity index 76% rename from mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/00-esp.conf rename to mkosi.images/elementary/mkosi.extra/usr/lib/repart.d/00-esp.conf index eef2aa659..f7c94a759 100644 --- a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/00-esp.conf +++ b/mkosi.images/elementary/mkosi.extra/usr/lib/repart.d/00-esp.conf @@ -1,4 +1,5 @@ [Partition] +Label=elementary_%A Type=esp Format=vfat SizeMinBytes=0.5G diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf b/mkosi.images/elementary/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf similarity index 76% rename from mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf rename to mkosi.images/elementary/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf index df26ce3ec..37ccfb4d6 100644 --- a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf +++ b/mkosi.images/elementary/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf @@ -1,7 +1,7 @@ [Partition] Type=usr-verity-sig CopyBlocks=auto -Label=%M_%A_verity_sig +Label=elementary_%A_verity_sig SplitName=%t.%U SizeMinBytes=0.5G SizeMaxBytes=0.5G diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf b/mkosi.images/elementary/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf similarity index 78% rename from mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf rename to mkosi.images/elementary/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf index c3ccb570a..e8d03c843 100644 --- a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf +++ b/mkosi.images/elementary/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf @@ -1,7 +1,7 @@ [Partition] Type=usr-verity CopyBlocks=auto -Label=%M_%A_verity +Label=elementary_%A_verity SplitName=%t.%U SizeMinBytes=0.5G SizeMaxBytes=0.5G diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/12-usr.conf b/mkosi.images/elementary/mkosi.extra/usr/lib/repart.d/12-usr.conf similarity index 80% rename from mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/12-usr.conf rename to mkosi.images/elementary/mkosi.extra/usr/lib/repart.d/12-usr.conf index 8f82320ed..03348069b 100644 --- a/mkosi.profiles/sysupdate/mkosi.extra/usr/lib/repart.d/12-usr.conf +++ b/mkosi.images/elementary/mkosi.extra/usr/lib/repart.d/12-usr.conf @@ -1,7 +1,7 @@ [Partition] Type=usr CopyBlocks=auto -Label=%M_%A +Label=elementary_%A SplitName=%t.%U SizeMinBytes=1G SizeMaxBytes=3G \ No newline at end of file diff --git a/mkosi.images/elementary/mkosi.extra/usr/sbin/featurectl b/mkosi.images/elementary/mkosi.extra/usr/sbin/featurectl new file mode 100644 index 000000000..b956c2a81 --- /dev/null +++ b/mkosi.images/elementary/mkosi.extra/usr/sbin/featurectl @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -euo pipefail + +echo "Not yet implemented, comming soon.." \ No newline at end of file diff --git a/mkosi.profiles/sysupdate/mkosi.extra/usr/sbin/usroverlay b/mkosi.images/elementary/mkosi.extra/usr/sbin/usroverlay similarity index 100% rename from mkosi.profiles/sysupdate/mkosi.extra/usr/sbin/usroverlay rename to mkosi.images/elementary/mkosi.extra/usr/sbin/usroverlay diff --git a/mkosi.postinst.chroot b/mkosi.images/elementary/mkosi.postinst.chroot similarity index 100% rename from mkosi.postinst.chroot rename to mkosi.images/elementary/mkosi.postinst.chroot diff --git a/mkosi.profiles/sysupdate/mkosi.repart/00-esp.conf b/mkosi.images/elementary/mkosi.repart/00-esp.conf similarity index 83% rename from mkosi.profiles/sysupdate/mkosi.repart/00-esp.conf rename to mkosi.images/elementary/mkosi.repart/00-esp.conf index 3ac509c71..09c16e3e2 100644 --- a/mkosi.profiles/sysupdate/mkosi.repart/00-esp.conf +++ b/mkosi.images/elementary/mkosi.repart/00-esp.conf @@ -1,4 +1,5 @@ [Partition] +Label=elementary_%A Type=esp Format=vfat CopyFiles=/efi:/ diff --git a/mkosi.profiles/sysupdate/mkosi.repart/10-usr-verity-sig.conf b/mkosi.images/elementary/mkosi.repart/10-usr-verity-sig.conf similarity index 73% rename from mkosi.profiles/sysupdate/mkosi.repart/10-usr-verity-sig.conf rename to mkosi.images/elementary/mkosi.repart/10-usr-verity-sig.conf index 8379561f4..f8ea08c1d 100644 --- a/mkosi.profiles/sysupdate/mkosi.repart/10-usr-verity-sig.conf +++ b/mkosi.images/elementary/mkosi.repart/10-usr-verity-sig.conf @@ -1,6 +1,6 @@ [Partition] Type=usr-verity-sig -Label=%M_%A_verity_sig +Label=elementary_%A_verity_sig Verity=signature VerityMatchKey=usr SplitName=%t.%U diff --git a/mkosi.profiles/sysupdate/mkosi.repart/11-usr-verity.conf b/mkosi.images/elementary/mkosi.repart/11-usr-verity.conf similarity index 80% rename from mkosi.profiles/sysupdate/mkosi.repart/11-usr-verity.conf rename to mkosi.images/elementary/mkosi.repart/11-usr-verity.conf index 067b935d1..9d08b3aee 100644 --- a/mkosi.profiles/sysupdate/mkosi.repart/11-usr-verity.conf +++ b/mkosi.images/elementary/mkosi.repart/11-usr-verity.conf @@ -1,6 +1,6 @@ [Partition] Type=usr-verity -Label=%M_%A_verity +Label=elementary_%A_verity Verity=hash VerityMatchKey=usr SizeMinBytes=400M diff --git a/mkosi.profiles/sysupdate/mkosi.repart/12-usr.conf b/mkosi.images/elementary/mkosi.repart/12-usr.conf similarity index 88% rename from mkosi.profiles/sysupdate/mkosi.repart/12-usr.conf rename to mkosi.images/elementary/mkosi.repart/12-usr.conf index dbcaa7b95..87319e2a7 100644 --- a/mkosi.profiles/sysupdate/mkosi.repart/12-usr.conf +++ b/mkosi.images/elementary/mkosi.repart/12-usr.conf @@ -1,6 +1,6 @@ [Partition] Type=usr -Label=%M_%A +Label=elementary_%A Format=erofs CopyFiles=/usr:/ Verity=data diff --git a/mkosi.profiles/sysupdate/mkosi.repart/20-usr-verify-sig-bside.conf b/mkosi.images/elementary/mkosi.repart/20-usr-verify-sig-bside.conf similarity index 100% rename from mkosi.profiles/sysupdate/mkosi.repart/20-usr-verify-sig-bside.conf rename to mkosi.images/elementary/mkosi.repart/20-usr-verify-sig-bside.conf diff --git a/mkosi.profiles/sysupdate/mkosi.repart/21-usr-verity-bside.conf b/mkosi.images/elementary/mkosi.repart/21-usr-verity-bside.conf similarity index 100% rename from mkosi.profiles/sysupdate/mkosi.repart/21-usr-verity-bside.conf rename to mkosi.images/elementary/mkosi.repart/21-usr-verity-bside.conf diff --git a/mkosi.profiles/sysupdate/mkosi.repart/22-usr-bside.conf b/mkosi.images/elementary/mkosi.repart/22-usr-bside.conf similarity index 100% rename from mkosi.profiles/sysupdate/mkosi.repart/22-usr-bside.conf rename to mkosi.images/elementary/mkosi.repart/22-usr-bside.conf diff --git a/mkosi.profiles/classic/mkosi.conf b/mkosi.images/liveiso/mkosi.conf similarity index 71% rename from mkosi.profiles/classic/mkosi.conf rename to mkosi.images/liveiso/mkosi.conf index e1ec7a3f3..44f2801eb 100644 --- a/mkosi.profiles/classic/mkosi.conf +++ b/mkosi.images/liveiso/mkosi.conf @@ -1,17 +1,21 @@ -[Match] -Profiles=classic +[Config] +Dependencies=base [Output] Format=directory -ElTorito=yes -SplitArtifacts=kernel,initrd -OutputDirectory=../../mkosi.output/classic -ImageId=elementaryclassic +SplitArtifacts= +ImageId=liveiso [Content] +BaseTrees=%O/base_%v +CleanPackageMetadata=no Bootable=yes +WithRecommends=yes +RemovePackages= + systemd-boot Packages= elementary-live + io.elementary.installer-session grub-efi-amd64 grub-efi-amd64-signed mokutil diff --git a/mkosi.profiles/classic/mkosi.extra/iso_root/.disk/info b/mkosi.images/liveiso/mkosi.extra/iso_root/.disk/info similarity index 100% rename from mkosi.profiles/classic/mkosi.extra/iso_root/.disk/info rename to mkosi.images/liveiso/mkosi.extra/iso_root/.disk/info diff --git a/mkosi.profiles/classic/mkosi.extra/iso_root/boot/grub/grub.cfg b/mkosi.images/liveiso/mkosi.extra/iso_root/boot/grub/grub.cfg similarity index 100% rename from mkosi.profiles/classic/mkosi.extra/iso_root/boot/grub/grub.cfg rename to mkosi.images/liveiso/mkosi.extra/iso_root/boot/grub/grub.cfg diff --git a/mkosi.images/liveiso/mkosi.extra/iso_root/casper/filesystem.manifest-remove b/mkosi.images/liveiso/mkosi.extra/iso_root/casper/filesystem.manifest-remove new file mode 100644 index 000000000..c50db5e5e --- /dev/null +++ b/mkosi.images/liveiso/mkosi.extra/iso_root/casper/filesystem.manifest-remove @@ -0,0 +1,3 @@ +casper +elementary-live +io.elementary.installer-session \ No newline at end of file diff --git a/mkosi.profiles/classic/mkosi.extra/iso_root/dists/stable/Release b/mkosi.images/liveiso/mkosi.extra/iso_root/dists/stable/Release similarity index 100% rename from mkosi.profiles/classic/mkosi.extra/iso_root/dists/stable/Release rename to mkosi.images/liveiso/mkosi.extra/iso_root/dists/stable/Release diff --git a/mkosi.profiles/classic/mkosi.extra/opt/repart-target/home/50-home.conf b/mkosi.images/liveiso/mkosi.extra/opt/repart-target/home/50-home.conf similarity index 100% rename from mkosi.profiles/classic/mkosi.extra/opt/repart-target/home/50-home.conf rename to mkosi.images/liveiso/mkosi.extra/opt/repart-target/home/50-home.conf diff --git a/mkosi.profiles/classic/mkosi.extra/opt/repart-target/root/40-root.conf b/mkosi.images/liveiso/mkosi.extra/opt/repart-target/root/40-root.conf similarity index 100% rename from mkosi.profiles/classic/mkosi.extra/opt/repart-target/root/40-root.conf rename to mkosi.images/liveiso/mkosi.extra/opt/repart-target/root/40-root.conf diff --git a/mkosi.profiles/classic/mkosi.extra/usr/lib/systemd/system/apparmor.service.d/99_enable_in_live_mode.conf b/mkosi.images/liveiso/mkosi.extra/usr/lib/systemd/system/apparmor.service.d/99_enable_in_live_mode.conf similarity index 100% rename from mkosi.profiles/classic/mkosi.extra/usr/lib/systemd/system/apparmor.service.d/99_enable_in_live_mode.conf rename to mkosi.images/liveiso/mkosi.extra/usr/lib/systemd/system/apparmor.service.d/99_enable_in_live_mode.conf diff --git a/mkosi.profiles/classic/mkosi.extra/usr/sbin/elementary-install b/mkosi.images/liveiso/mkosi.extra/usr/sbin/elementary-install similarity index 100% rename from mkosi.profiles/classic/mkosi.extra/usr/sbin/elementary-install rename to mkosi.images/liveiso/mkosi.extra/usr/sbin/elementary-install diff --git a/mkosi.images/liveiso/mkosi.posinst.chroot b/mkosi.images/liveiso/mkosi.posinst.chroot new file mode 100755 index 000000000..a8766c231 --- /dev/null +++ b/mkosi.images/liveiso/mkosi.posinst.chroot @@ -0,0 +1,6 @@ +#!/bin/bash +set -xeuo pipefail + +# rm -f /var/lib/apt/lists/*_Packages +# rm -f /var/lib/apt/lists/*_Sources +# rm -f /var/lib/apt/lists/*_Translation-* \ No newline at end of file diff --git a/mkosi.profiles/classic/mkosi.repart/00-esp.conf b/mkosi.images/liveiso/mkosi.repart/00-esp.conf similarity index 100% rename from mkosi.profiles/classic/mkosi.repart/00-esp.conf rename to mkosi.images/liveiso/mkosi.repart/00-esp.conf diff --git a/mkosi.profiles/classic/mkosi.repart/40-root.conf b/mkosi.images/liveiso/mkosi.repart/40-root.conf similarity index 100% rename from mkosi.profiles/classic/mkosi.repart/40-root.conf rename to mkosi.images/liveiso/mkosi.repart/40-root.conf diff --git a/mkosi.profiles/classic/mkosi.repart/50-home.conf b/mkosi.images/liveiso/mkosi.repart/50-home.conf similarity index 100% rename from mkosi.profiles/classic/mkosi.repart/50-home.conf rename to mkosi.images/liveiso/mkosi.repart/50-home.conf diff --git a/mkosi.images/os/mkosi.conf b/mkosi.images/os/mkosi.conf deleted file mode 100644 index 447c61113..000000000 --- a/mkosi.images/os/mkosi.conf +++ /dev/null @@ -1,10 +0,0 @@ -[Content] -Hostname=elementary - -[Validation] -SecureBoot=no -SignExpectedPcr=no - -[Output] -ManifestFormat=json -Output=%i_%v_%a \ No newline at end of file diff --git a/mkosi.initrd.conf b/mkosi.initrd.conf new file mode 100644 index 000000000..607208c05 --- /dev/null +++ b/mkosi.initrd.conf @@ -0,0 +1,10 @@ +[Content] +Packages= + plymouth + plymouth-themes + initramfs-tools + usrmerge + linux-firmware + cryptsetup + cryptsetup-bin + systemd-container \ No newline at end of file diff --git a/mkosi.profiles/classic/mkosi.extra/iso_root/casper/filesystem.manifest-remove b/mkosi.profiles/classic/mkosi.extra/iso_root/casper/filesystem.manifest-remove deleted file mode 100644 index 5fbed9336..000000000 --- a/mkosi.profiles/classic/mkosi.extra/iso_root/casper/filesystem.manifest-remove +++ /dev/null @@ -1,2 +0,0 @@ -casper -elementary-live \ No newline at end of file diff --git a/mkosi.profiles/classic/mkosi.posinst.chroot b/mkosi.profiles/classic/mkosi.posinst.chroot deleted file mode 100755 index d5d85feb0..000000000 --- a/mkosi.profiles/classic/mkosi.posinst.chroot +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -set -xeuo pipefail - -rm -f /var/lib/apt/lists/*_Packages -rm -f /var/lib/apt/lists/*_Sources -rm -f /var/lib/apt/lists/*_Translation-* \ No newline at end of file From f29b121a011a0aae9c201d79fb518dba967adf43 Mon Sep 17 00:00:00 2001 From: Lewis Goddard Date: Wed, 19 Aug 2026 12:05:29 +0100 Subject: [PATCH 58/86] Configurable architecture and version, upload sha256sums second --- .github/workflows/release.yaml | 48 +++++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 2ffa38baf..0f310c716 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -9,10 +9,16 @@ jobs: runs-on: ubuntu-latest permissions: contents: write + env: + # systemd architecture ID, as expanded by %a in the sysupdate transfer config. + # Must be x86-64 or arm64 + ARCH: x86-64 + # OS Version should be quoted so 9.0 isn't recuded to just 9 + OS_VERSION: "9.0" steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Maximize build space uses: ublue-os/remove-unwanted-software@v8 @@ -48,10 +54,15 @@ jobs: - name: Extract Date id: get_date run: | - FILE_PATH=$(ls mkosi.output/sysupdate/elementary_*.raw | grep -E 'elementary_[0-9]+\.raw$' | head -n 1) - TIMESTAMP=$(basename "$FILE_PATH" | sed 's/^elementary_//;s/\..*//') - echo "RELEASE_TAG=os9-$TIMESTAMP" >> "$GITHUB_OUTPUT" - echo "RELEASE_DATE=${TIMESTAMP:0:8}" >> "$GITHUB_OUTPUT" + set -euo pipefail + FILE_PATH=$(ls mkosi.output/sysupdate/*.usr-*.raw.xz | head -n 1) + TIMESTAMP=$(basename "$FILE_PATH" | grep -oE '[0-9]{8}' | head -n 1 || true) + if [ -z "$TIMESTAMP" ]; then + echo "No date found in $(basename "$FILE_PATH"), falling back to build date." + TIMESTAMP=$(date -u +%Y%m%d) + fi + echo "Release date: $TIMESTAMP" + echo "RELEASE_DATE=$TIMESTAMP" >> "$GITHUB_OUTPUT" - name: Upload usr, iso and SHA256SUMS to Bucket env: @@ -60,12 +71,25 @@ jobs: AWS_DEFAULT_REGION: auto AWS_ENDPOINT_URL: ${{ secrets.R2_ENDPOINT }} run: | - aws s3 sync mkosi.output/sysupdate/ "s3://${{ secrets.R2_BUCKET_DAILY_UPDATES }}/" \ + set -euo pipefail + + # 1. Images + aws s3 sync mkosi.output/sysupdate/ "s3://${{ secrets.R2_BUCKET_DAILY_UPDATES }}/$ARCH/" \ --exclude "*" \ - --include=*.esp.raw \ - --include=*.usr-*.*.raw.xz \ - --include=*.usr-*-verity.*.raw \ - --include=*.usr-*-verity-sig.*.raw \ - --include="SHA256SUMS" - aws s3 cp mkosi.output/elementary-liveiso.iso "s3://${{ secrets.R2_BUCKET_DAILY_INSTALLER }}/amd64/elementaryos-9.0-daily-amd64.${{ steps.get_date.outputs.RELEASE_DATE }}.iso" + --include "*.esp.raw" \ + --include "*.usr-*.*.raw.xz" \ + --include "*.usr-*-verity.*.raw" \ + --include "*.usr-*-verity-sig.*.raw" \ + --cache-control "public, max-age=31536000, immutable" + + # 2. SHA256SUMS + # not cached, will change when new updates are uploaded + aws s3 cp mkosi.output/sysupdate/SHA256SUMS \ + "s3://${{ secrets.R2_BUCKET_DAILY_UPDATES }}/$ARCH/SHA256SUMS" \ + --content-type "text/plain" \ + --cache-control "no-cache" + # 3. Live ISO + aws s3 cp mkosi.output/elementary-liveiso.iso \ + "s3://${{ secrets.R2_BUCKET_DAILY_INSTALLER }}/$ARCH/elementaryos-$OS_VERSION-daily-$ARCH.${{ steps.get_date.outputs.RELEASE_DATE }}.iso" \ + --cache-control "public, max-age=31536000, immutable" From ebc9c25026164471bd6cba2a74a97a1cf5e14f9b Mon Sep 17 00:00:00 2001 From: Lewis Goddard Date: Wed, 19 Aug 2026 12:14:46 +0100 Subject: [PATCH 59/86] Add SHA256 hash for live iso upload --- .github/workflows/release.yaml | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 0f310c716..9bce226a2 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -89,7 +89,16 @@ jobs: --content-type "text/plain" \ --cache-control "no-cache" - # 3. Live ISO - aws s3 cp mkosi.output/elementary-liveiso.iso \ - "s3://${{ secrets.R2_BUCKET_DAILY_INSTALLER }}/$ARCH/elementaryos-$OS_VERSION-daily-$ARCH.${{ steps.get_date.outputs.RELEASE_DATE }}.iso" \ + # 3. Live ISO + hash + ISO_NAME="elementaryos-$OS_VERSION-daily-$ARCH.${{ steps.get_date.outputs.RELEASE_DATE }}.iso" + mv mkosi.output/elementary-liveiso.iso "mkosi.output/$ISO_NAME" + ( cd mkosi.output && sha256sum "$ISO_NAME" > "$ISO_NAME.sha256.txt" ) + + ISO_DEST="s3://${{ secrets.R2_BUCKET_DAILY_INSTALLER }}/$ARCH" + + aws s3 cp "mkosi.output/$ISO_NAME" "$ISO_DEST/$ISO_NAME" \ + --cache-control "public, max-age=31536000, immutable" + + aws s3 cp "mkosi.output/$ISO_NAME.sha256.txt" "$ISO_DEST/$ISO_NAME.sha256.txt" \ + --content-type "text/plain" \ --cache-control "public, max-age=31536000, immutable" From fead13c9dba8c0a0d678568e8bf34a55e0864a72 Mon Sep 17 00:00:00 2001 From: Niko Date: Wed, 19 Aug 2026 08:43:22 -0700 Subject: [PATCH 60/86] jobs updates for new build folder structure (#31) --- .github/workflows/release.yaml | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 9bce226a2..5228c40d1 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -39,11 +39,11 @@ jobs: - name: Compress (xz) usr partition run: | - find mkosi.output/sysupdate -maxdepth 1 -type f -name "*.usr-*.raw" ! -name "*verity*" -exec xz -7v -T0 {} + + find mkosi.output -maxdepth 1 -type f -name "*.usr-*.raw" ! -name "*verity*" -exec xz -7v -T0 {} + - name: Generate SHA256SUMS (all partitions) run: | - cd mkosi.output/sysupdate + cd mkosi.output sha256sum *.esp.raw \ *.usr-*.*.raw.xz \ *.usr-*-verity.*.raw \ @@ -55,7 +55,7 @@ jobs: id: get_date run: | set -euo pipefail - FILE_PATH=$(ls mkosi.output/sysupdate/*.usr-*.raw.xz | head -n 1) + FILE_PATH=$(ls mkosi.output/*.usr-*.raw.xz | head -n 1) TIMESTAMP=$(basename "$FILE_PATH" | grep -oE '[0-9]{8}' | head -n 1 || true) if [ -z "$TIMESTAMP" ]; then echo "No date found in $(basename "$FILE_PATH"), falling back to build date." @@ -74,24 +74,27 @@ jobs: set -euo pipefail # 1. Images - aws s3 sync mkosi.output/sysupdate/ "s3://${{ secrets.R2_BUCKET_DAILY_UPDATES }}/$ARCH/" \ - --exclude "*" \ - --include "*.esp.raw" \ - --include "*.usr-*.*.raw.xz" \ - --include "*.usr-*-verity.*.raw" \ - --include "*.usr-*-verity-sig.*.raw" \ - --cache-control "public, max-age=31536000, immutable" + cd mkosi.output + find . -maxdepth 1 -type f \( \ + -name "*.esp.raw" \ + -o -name "*.usr-*.*.raw.xz" \ + -o -name "*.usr-*-verity.*.raw" \ + -o -name "*.usr-*-verity-sig.*.raw" \ + \) -print0 | while IFS= read -r -d '' f; do + aws s3 cp "$f" "s3://$ARCH/${{ secrets.R2_BUCKET_DAILY_UPDATES }}/" --cache-control "public, max-age=31536000, immutable" + done + # 2. SHA256SUMS # not cached, will change when new updates are uploaded - aws s3 cp mkosi.output/sysupdate/SHA256SUMS \ + aws s3 cp mkosi.output/SHA256SUMS \ "s3://${{ secrets.R2_BUCKET_DAILY_UPDATES }}/$ARCH/SHA256SUMS" \ --content-type "text/plain" \ --cache-control "no-cache" # 3. Live ISO + hash ISO_NAME="elementaryos-$OS_VERSION-daily-$ARCH.${{ steps.get_date.outputs.RELEASE_DATE }}.iso" - mv mkosi.output/elementary-liveiso.iso "mkosi.output/$ISO_NAME" + mv mkosi.output/elementaryos-9.0-*.iso "mkosi.output/$ISO_NAME" ( cd mkosi.output && sha256sum "$ISO_NAME" > "$ISO_NAME.sha256.txt" ) ISO_DEST="s3://${{ secrets.R2_BUCKET_DAILY_INSTALLER }}/$ARCH" From e97aa9dd75a8bd9779d90d994eb4da7cdd243699 Mon Sep 17 00:00:00 2001 From: jumpyvi <62212220+jumpyvi@users.noreply.github.com> Date: Wed, 19 Aug 2026 12:06:47 -0400 Subject: [PATCH 61/86] Cleanup --- .github/workflows/release.yaml | 9 ++++----- assemble-iso.sh | 2 +- mkosi.conf | 2 +- .../usr/lib/sysupdate.d/devel.feature | 3 --- .../usr/lib/sysupdate.d/devel.transfer | 12 ------------ .../usr/lib/sysupdate.d/nvidia-addon.transfer | 16 ---------------- .../usr/lib/sysupdate.d/nvidia-driver.feature | 3 --- .../sysupdate.d/nvidia-initrd-modules.transfer | 18 ------------------ .../lib/sysupdate.d/nvidia-modules.transfer | 16 ---------------- .../lib/sysupdate.d/nvidia-runtime.transfer | 16 ---------------- .../{elementary => sysupdate}/mkosi.conf | 2 +- .../mkosi.extra/usr/lib/repart.d/00-esp.conf | 0 .../usr/lib/repart.d/10-usr-verity-sig.conf | 0 .../usr/lib/repart.d/11-usr-verity.conf | 0 .../mkosi.extra/usr/lib/repart.d/12-usr.conf | 0 .../mkosi.extra/usr/sbin/featurectl | 0 .../mkosi.extra/usr/sbin/usroverlay | 0 .../mkosi.postinst.chroot | 0 .../mkosi.repart/00-esp.conf | 0 .../mkosi.repart/10-usr-verity-sig.conf | 0 .../mkosi.repart/11-usr-verity.conf | 0 .../mkosi.repart/12-usr.conf | 0 .../mkosi.repart/20-usr-verify-sig-bside.conf | 0 .../mkosi.repart/21-usr-verity-bside.conf | 0 .../mkosi.repart/22-usr-bside.conf | 0 mkosi.initrd.conf | 10 ---------- 26 files changed, 7 insertions(+), 102 deletions(-) delete mode 100644 mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/devel.feature delete mode 100644 mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/devel.transfer delete mode 100644 mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-addon.transfer delete mode 100644 mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-driver.feature delete mode 100644 mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-initrd-modules.transfer delete mode 100644 mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-modules.transfer delete mode 100644 mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-runtime.transfer rename mkosi.images/{elementary => sysupdate}/mkosi.conf (96%) rename mkosi.images/{elementary => sysupdate}/mkosi.extra/usr/lib/repart.d/00-esp.conf (100%) rename mkosi.images/{elementary => sysupdate}/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf (100%) rename mkosi.images/{elementary => sysupdate}/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf (100%) rename mkosi.images/{elementary => sysupdate}/mkosi.extra/usr/lib/repart.d/12-usr.conf (100%) rename mkosi.images/{elementary => sysupdate}/mkosi.extra/usr/sbin/featurectl (100%) rename mkosi.images/{elementary => sysupdate}/mkosi.extra/usr/sbin/usroverlay (100%) rename mkosi.images/{elementary => sysupdate}/mkosi.postinst.chroot (100%) rename mkosi.images/{elementary => sysupdate}/mkosi.repart/00-esp.conf (100%) rename mkosi.images/{elementary => sysupdate}/mkosi.repart/10-usr-verity-sig.conf (100%) rename mkosi.images/{elementary => sysupdate}/mkosi.repart/11-usr-verity.conf (100%) rename mkosi.images/{elementary => sysupdate}/mkosi.repart/12-usr.conf (100%) rename mkosi.images/{elementary => sysupdate}/mkosi.repart/20-usr-verify-sig-bside.conf (100%) rename mkosi.images/{elementary => sysupdate}/mkosi.repart/21-usr-verity-bside.conf (100%) rename mkosi.images/{elementary => sysupdate}/mkosi.repart/22-usr-bside.conf (100%) delete mode 100644 mkosi.initrd.conf diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 9bce226a2..8f3801865 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -90,15 +90,14 @@ jobs: --cache-control "no-cache" # 3. Live ISO + hash - ISO_NAME="elementaryos-$OS_VERSION-daily-$ARCH.${{ steps.get_date.outputs.RELEASE_DATE }}.iso" - mv mkosi.output/elementary-liveiso.iso "mkosi.output/$ISO_NAME" - ( cd mkosi.output && sha256sum "$ISO_NAME" > "$ISO_NAME.sha256.txt" ) + ISO=$(basename $(ls mkosi.output/elementaryos-*.iso | head -n 1)) + ( cd mkosi.output && sha256sum "$ISO" > "$ISO.sha256.txt" ) ISO_DEST="s3://${{ secrets.R2_BUCKET_DAILY_INSTALLER }}/$ARCH" - aws s3 cp "mkosi.output/$ISO_NAME" "$ISO_DEST/$ISO_NAME" \ + aws s3 cp "mkosi.output/$ISO" "$ISO_DEST/$ISO" \ --cache-control "public, max-age=31536000, immutable" - aws s3 cp "mkosi.output/$ISO_NAME.sha256.txt" "$ISO_DEST/$ISO_NAME.sha256.txt" \ + aws s3 cp "mkosi.output/$ISO.sha256.txt" "$ISO_DEST/$ISO.sha256.txt" \ --content-type "text/plain" \ --cache-control "public, max-age=31536000, immutable" diff --git a/assemble-iso.sh b/assemble-iso.sh index 3853fc68a..4f12a7617 100755 --- a/assemble-iso.sh +++ b/assemble-iso.sh @@ -7,7 +7,7 @@ SEARCH_DIR=. DATE=$(basename $(ls -d liveiso_* | grep -vE '\.(raw|iso|vmlinuz|initrd|efi|manifest)$' | head -n1)) DATE=${DATE#liveiso_} -OUT_ISO="./elementaryos-9.0-daily-amd64.${DATE}.iso" +OUT_ISO="./elementaryos-9.0-daily-$(uname -m).${DATE}.iso" RAW_IMAGE=$(find "$SEARCH_DIR" -maxdepth 1 -type f \ | grep -E '/[^/]+_[0-9]{14}\.raw$' \ diff --git a/mkosi.conf b/mkosi.conf index ded800c6e..e6dc19dbc 100644 --- a/mkosi.conf +++ b/mkosi.conf @@ -2,7 +2,7 @@ MinimumVersion=26~devel Dependencies= base - elementary + sysupdate liveiso [Distribution] diff --git a/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/devel.feature b/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/devel.feature deleted file mode 100644 index f022e7e7f..000000000 --- a/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/devel.feature +++ /dev/null @@ -1,3 +0,0 @@ -[Feature] -Description=Tooling for developpers -Enabled=false \ No newline at end of file diff --git a/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/devel.transfer b/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/devel.transfer deleted file mode 100644 index b2ed2b356..000000000 --- a/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/devel.transfer +++ /dev/null @@ -1,12 +0,0 @@ -[Transfer] -Features=devel - -[Source] -Type=url-file -Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download/ -MatchPattern=ext-devel_@v.raw - -[Target] -Type=regular-file -Path=/var/lib/extensions -MatchPattern=ext-devel_@v.raw \ No newline at end of file diff --git a/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-addon.transfer b/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-addon.transfer deleted file mode 100644 index 73048574f..000000000 --- a/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-addon.transfer +++ /dev/null @@ -1,16 +0,0 @@ -[Transfer] -ProtectVersion=%A -Features=nvidia-driver - -[Source] -Type=url-file -Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download/ -MatchPattern=elementary-nvidia-%a_@v.addon.efi elementary-nvidia-%a_@v.addon.efi.xz - -[Target] -Type=regular-file -Path=/EFI/Linux -PathRelativeTo=boot -MatchPattern=Elementary_@v.efi.extra.d/nvidia.addon.efi -Mode=0444 -InstancesMax=2 \ No newline at end of file diff --git a/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-driver.feature b/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-driver.feature deleted file mode 100644 index 2b1726a61..000000000 --- a/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-driver.feature +++ /dev/null @@ -1,3 +0,0 @@ -[Feature] -Description=NVIDIA (Open) GPU Driver -Documentation=https://github.com/nvidia/open-gpu-kernel-modules diff --git a/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-initrd-modules.transfer b/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-initrd-modules.transfer deleted file mode 100644 index b554985c0..000000000 --- a/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-initrd-modules.transfer +++ /dev/null @@ -1,18 +0,0 @@ -[Transfer] -ProtectVersion=%A -Features=nvidia-driver - -[Source] -Type=url-file -Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download/ -MatchPattern=nvidia-modules-%a_@v.raw \ - nvidia-modules-%a_@v.raw.xz \ - nvidia-modules-%a_@v.raw.zst - -[Target] -Type=regular-file -Path=/EFI/Linux -PathRelativeTo=boot -MatchPattern=Elementary_@v.efi.extra.d/nvidia-modules.raw -Mode=0444 -InstancesMax=2 \ No newline at end of file diff --git a/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-modules.transfer b/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-modules.transfer deleted file mode 100644 index d2f0a6ac4..000000000 --- a/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-modules.transfer +++ /dev/null @@ -1,16 +0,0 @@ -[Transfer] -ProtectVersion=%A -Features=nvidia-driver - -[Source] -Type=url-file -Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download/ -MatchPattern=nvidia-modules-%a_@v.raw \ - nvidia-modules-%a_@v.raw.xz \ - nvidia-modules-%a_@v.raw.zst - -[Target] -Type=regular-file -Path=/var/lib/extensions/ -MatchPattern=nvidia-modules_@v.raw -InstancesMax=2 diff --git a/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-runtime.transfer b/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-runtime.transfer deleted file mode 100644 index 5dfb5160b..000000000 --- a/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/nvidia-runtime.transfer +++ /dev/null @@ -1,16 +0,0 @@ -[Transfer] -ProtectVersion=%A -Features=nvidia-driver - -[Source] -Type=url-file -Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download/ -MatchPattern=nvidia-runtime-%a_@v.raw \ - nvidia-runtime-%a_@v.raw.xz \ - nvidia-runtime-%a_@v.raw.zst - -[Target] -Type=regular-file -Path=/var/lib/extensions/ -MatchPattern=nvidia-runtime_@v.raw -InstancesMax=2 \ No newline at end of file diff --git a/mkosi.images/elementary/mkosi.conf b/mkosi.images/sysupdate/mkosi.conf similarity index 96% rename from mkosi.images/elementary/mkosi.conf rename to mkosi.images/sysupdate/mkosi.conf index fda9b6a3a..89eb87c7f 100644 --- a/mkosi.images/elementary/mkosi.conf +++ b/mkosi.images/sysupdate/mkosi.conf @@ -13,9 +13,9 @@ VolatilePackages= systemd-boot-efi Bootable=yes BaseTrees=%O/base_%v +Output=elementary_%v CleanPackageMetadata=yes Bootloader=systemd-boot -UnifiedKernelImageFormat=%i_%v KernelInitrdModules= default ahci diff --git a/mkosi.images/elementary/mkosi.extra/usr/lib/repart.d/00-esp.conf b/mkosi.images/sysupdate/mkosi.extra/usr/lib/repart.d/00-esp.conf similarity index 100% rename from mkosi.images/elementary/mkosi.extra/usr/lib/repart.d/00-esp.conf rename to mkosi.images/sysupdate/mkosi.extra/usr/lib/repart.d/00-esp.conf diff --git a/mkosi.images/elementary/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf b/mkosi.images/sysupdate/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf similarity index 100% rename from mkosi.images/elementary/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf rename to mkosi.images/sysupdate/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf diff --git a/mkosi.images/elementary/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf b/mkosi.images/sysupdate/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf similarity index 100% rename from mkosi.images/elementary/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf rename to mkosi.images/sysupdate/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf diff --git a/mkosi.images/elementary/mkosi.extra/usr/lib/repart.d/12-usr.conf b/mkosi.images/sysupdate/mkosi.extra/usr/lib/repart.d/12-usr.conf similarity index 100% rename from mkosi.images/elementary/mkosi.extra/usr/lib/repart.d/12-usr.conf rename to mkosi.images/sysupdate/mkosi.extra/usr/lib/repart.d/12-usr.conf diff --git a/mkosi.images/elementary/mkosi.extra/usr/sbin/featurectl b/mkosi.images/sysupdate/mkosi.extra/usr/sbin/featurectl similarity index 100% rename from mkosi.images/elementary/mkosi.extra/usr/sbin/featurectl rename to mkosi.images/sysupdate/mkosi.extra/usr/sbin/featurectl diff --git a/mkosi.images/elementary/mkosi.extra/usr/sbin/usroverlay b/mkosi.images/sysupdate/mkosi.extra/usr/sbin/usroverlay similarity index 100% rename from mkosi.images/elementary/mkosi.extra/usr/sbin/usroverlay rename to mkosi.images/sysupdate/mkosi.extra/usr/sbin/usroverlay diff --git a/mkosi.images/elementary/mkosi.postinst.chroot b/mkosi.images/sysupdate/mkosi.postinst.chroot similarity index 100% rename from mkosi.images/elementary/mkosi.postinst.chroot rename to mkosi.images/sysupdate/mkosi.postinst.chroot diff --git a/mkosi.images/elementary/mkosi.repart/00-esp.conf b/mkosi.images/sysupdate/mkosi.repart/00-esp.conf similarity index 100% rename from mkosi.images/elementary/mkosi.repart/00-esp.conf rename to mkosi.images/sysupdate/mkosi.repart/00-esp.conf diff --git a/mkosi.images/elementary/mkosi.repart/10-usr-verity-sig.conf b/mkosi.images/sysupdate/mkosi.repart/10-usr-verity-sig.conf similarity index 100% rename from mkosi.images/elementary/mkosi.repart/10-usr-verity-sig.conf rename to mkosi.images/sysupdate/mkosi.repart/10-usr-verity-sig.conf diff --git a/mkosi.images/elementary/mkosi.repart/11-usr-verity.conf b/mkosi.images/sysupdate/mkosi.repart/11-usr-verity.conf similarity index 100% rename from mkosi.images/elementary/mkosi.repart/11-usr-verity.conf rename to mkosi.images/sysupdate/mkosi.repart/11-usr-verity.conf diff --git a/mkosi.images/elementary/mkosi.repart/12-usr.conf b/mkosi.images/sysupdate/mkosi.repart/12-usr.conf similarity index 100% rename from mkosi.images/elementary/mkosi.repart/12-usr.conf rename to mkosi.images/sysupdate/mkosi.repart/12-usr.conf diff --git a/mkosi.images/elementary/mkosi.repart/20-usr-verify-sig-bside.conf b/mkosi.images/sysupdate/mkosi.repart/20-usr-verify-sig-bside.conf similarity index 100% rename from mkosi.images/elementary/mkosi.repart/20-usr-verify-sig-bside.conf rename to mkosi.images/sysupdate/mkosi.repart/20-usr-verify-sig-bside.conf diff --git a/mkosi.images/elementary/mkosi.repart/21-usr-verity-bside.conf b/mkosi.images/sysupdate/mkosi.repart/21-usr-verity-bside.conf similarity index 100% rename from mkosi.images/elementary/mkosi.repart/21-usr-verity-bside.conf rename to mkosi.images/sysupdate/mkosi.repart/21-usr-verity-bside.conf diff --git a/mkosi.images/elementary/mkosi.repart/22-usr-bside.conf b/mkosi.images/sysupdate/mkosi.repart/22-usr-bside.conf similarity index 100% rename from mkosi.images/elementary/mkosi.repart/22-usr-bside.conf rename to mkosi.images/sysupdate/mkosi.repart/22-usr-bside.conf diff --git a/mkosi.initrd.conf b/mkosi.initrd.conf deleted file mode 100644 index 607208c05..000000000 --- a/mkosi.initrd.conf +++ /dev/null @@ -1,10 +0,0 @@ -[Content] -Packages= - plymouth - plymouth-themes - initramfs-tools - usrmerge - linux-firmware - cryptsetup - cryptsetup-bin - systemd-container \ No newline at end of file From 9f1a4dcedc85621fa6d3f01ce304c86353133c59 Mon Sep 17 00:00:00 2001 From: jumpyvi <62212220+jumpyvi@users.noreply.github.com> Date: Wed, 19 Aug 2026 12:09:07 -0400 Subject: [PATCH 62/86] Move sysupdate definitions to sysupdate --- .../mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer | 0 .../mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer | 0 .../mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer | 0 .../mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename mkosi.images/{base => sysupdate}/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer (100%) rename mkosi.images/{base => sysupdate}/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer (100%) rename mkosi.images/{base => sysupdate}/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer (100%) rename mkosi.images/{base => sysupdate}/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer (100%) diff --git a/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer similarity index 100% rename from mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer rename to mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer diff --git a/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer similarity index 100% rename from mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer rename to mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer diff --git a/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer similarity index 100% rename from mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer rename to mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer diff --git a/mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer similarity index 100% rename from mkosi.images/base/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer rename to mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer From ea62d0a731b10dd9b3c7b78d02692e248407afa1 Mon Sep 17 00:00:00 2001 From: jumpyvi <62212220+jumpyvi@users.noreply.github.com> Date: Wed, 19 Aug 2026 12:43:18 -0400 Subject: [PATCH 63/86] Move daily repo to daily profile --- .../workflows/{release.yaml => release-daily.yaml} | 4 ++-- Justfile | 10 ++++++++-- mkosi.profiles/daily/mkosi.conf | 2 ++ .../etc/apt/keyrings/elementary-os-daily.gpg | Bin .../etc/apt/keyrings/elementary-os-os-patches.gpg | Bin .../etc/apt/preferences.d/deprioritize-gnome | 0 .../apt/sources.list.d/elementary-os-daily.sources | 0 .../sources.list.d/elementary-os-patches.sources | 0 8 files changed, 12 insertions(+), 4 deletions(-) rename .github/workflows/{release.yaml => release-daily.yaml} (97%) create mode 100644 mkosi.profiles/daily/mkosi.conf rename {mkosi.sandbox => mkosi.profiles/daily/mkosi.sandbox}/etc/apt/keyrings/elementary-os-daily.gpg (100%) rename {mkosi.sandbox => mkosi.profiles/daily/mkosi.sandbox}/etc/apt/keyrings/elementary-os-os-patches.gpg (100%) rename {mkosi.sandbox => mkosi.profiles/daily/mkosi.sandbox}/etc/apt/preferences.d/deprioritize-gnome (100%) rename {mkosi.sandbox => mkosi.profiles/daily/mkosi.sandbox}/etc/apt/sources.list.d/elementary-os-daily.sources (100%) rename {mkosi.sandbox => mkosi.profiles/daily/mkosi.sandbox}/etc/apt/sources.list.d/elementary-os-patches.sources (100%) diff --git a/.github/workflows/release.yaml b/.github/workflows/release-daily.yaml similarity index 97% rename from .github/workflows/release.yaml rename to .github/workflows/release-daily.yaml index 7fb8ea948..cce257463 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release-daily.yaml @@ -1,4 +1,4 @@ -name: Build and Release (elementary OS 9) +name: Build and Release Daily (elementary OS 9) on: workflow_dispatch: @@ -30,7 +30,7 @@ jobs: run: just genkey - name: Release - run: just do-release + run: just do-daily - name: Fix output dir ownership run: | diff --git a/Justfile b/Justfile index 5f08a4e6a..1f15ab296 100644 --- a/Justfile +++ b/Justfile @@ -3,11 +3,17 @@ default: set -xeuo pipefail just --choose -do-release: +do-daily: #!/usr/bin/env bash sudo rm -rf mkosi.output/ - just run-in-podman mkosi -B --debug --force --workspace-directory=/workspace + just run-in-podman mkosi -B --debug --profile=daily --force --workspace-directory=/workspace sudo ./assemble-iso.sh + + +do-release: + #!/usr/bin/env bash + echo "nyi, run do-daily instead" + genkey: just run-in-podman mkosi genkey diff --git a/mkosi.profiles/daily/mkosi.conf b/mkosi.profiles/daily/mkosi.conf new file mode 100644 index 000000000..81c498af1 --- /dev/null +++ b/mkosi.profiles/daily/mkosi.conf @@ -0,0 +1,2 @@ +[Match] +Profile=daily diff --git a/mkosi.sandbox/etc/apt/keyrings/elementary-os-daily.gpg b/mkosi.profiles/daily/mkosi.sandbox/etc/apt/keyrings/elementary-os-daily.gpg similarity index 100% rename from mkosi.sandbox/etc/apt/keyrings/elementary-os-daily.gpg rename to mkosi.profiles/daily/mkosi.sandbox/etc/apt/keyrings/elementary-os-daily.gpg diff --git a/mkosi.sandbox/etc/apt/keyrings/elementary-os-os-patches.gpg b/mkosi.profiles/daily/mkosi.sandbox/etc/apt/keyrings/elementary-os-os-patches.gpg similarity index 100% rename from mkosi.sandbox/etc/apt/keyrings/elementary-os-os-patches.gpg rename to mkosi.profiles/daily/mkosi.sandbox/etc/apt/keyrings/elementary-os-os-patches.gpg diff --git a/mkosi.sandbox/etc/apt/preferences.d/deprioritize-gnome b/mkosi.profiles/daily/mkosi.sandbox/etc/apt/preferences.d/deprioritize-gnome similarity index 100% rename from mkosi.sandbox/etc/apt/preferences.d/deprioritize-gnome rename to mkosi.profiles/daily/mkosi.sandbox/etc/apt/preferences.d/deprioritize-gnome diff --git a/mkosi.sandbox/etc/apt/sources.list.d/elementary-os-daily.sources b/mkosi.profiles/daily/mkosi.sandbox/etc/apt/sources.list.d/elementary-os-daily.sources similarity index 100% rename from mkosi.sandbox/etc/apt/sources.list.d/elementary-os-daily.sources rename to mkosi.profiles/daily/mkosi.sandbox/etc/apt/sources.list.d/elementary-os-daily.sources diff --git a/mkosi.sandbox/etc/apt/sources.list.d/elementary-os-patches.sources b/mkosi.profiles/daily/mkosi.sandbox/etc/apt/sources.list.d/elementary-os-patches.sources similarity index 100% rename from mkosi.sandbox/etc/apt/sources.list.d/elementary-os-patches.sources rename to mkosi.profiles/daily/mkosi.sandbox/etc/apt/sources.list.d/elementary-os-patches.sources From e2b92a96c0437b3871e4d3ff5c1750da20198134 Mon Sep 17 00:00:00 2001 From: nikodunk Date: Wed, 19 Aug 2026 10:15:25 -0700 Subject: [PATCH 64/86] bugfix in bucket address --- .github/workflows/release-daily.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-daily.yaml b/.github/workflows/release-daily.yaml index cce257463..55eae06bd 100644 --- a/.github/workflows/release-daily.yaml +++ b/.github/workflows/release-daily.yaml @@ -81,7 +81,7 @@ jobs: -o -name "*.usr-*-verity.*.raw" \ -o -name "*.usr-*-verity-sig.*.raw" \ \) -print0 | while IFS= read -r -d '' f; do - aws s3 cp "$f" "s3://$ARCH/${{ secrets.R2_BUCKET_DAILY_UPDATES }}/" --cache-control "public, max-age=31536000, immutable" + aws s3 cp "$f" "s3://${{ secrets.R2_BUCKET_DAILY_UPDATES }}/$ARCH/" --cache-control "public, max-age=31536000, immutable" done From 9c6d7b8ad6fd6d57b8b450322032663b10529744 Mon Sep 17 00:00:00 2001 From: Niko Date: Wed, 19 Aug 2026 10:28:20 -0700 Subject: [PATCH 65/86] exit output folder so following commands succeed --- .github/workflows/release-daily.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release-daily.yaml b/.github/workflows/release-daily.yaml index 55eae06bd..0f4bde0e6 100644 --- a/.github/workflows/release-daily.yaml +++ b/.github/workflows/release-daily.yaml @@ -83,6 +83,7 @@ jobs: \) -print0 | while IFS= read -r -d '' f; do aws s3 cp "$f" "s3://${{ secrets.R2_BUCKET_DAILY_UPDATES }}/$ARCH/" --cache-control "public, max-age=31536000, immutable" done + cd .. # 2. SHA256SUMS From e98eb48369bac57b05684d10c8f6cfe872577677 Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Wed, 19 Aug 2026 16:01:37 -0400 Subject: [PATCH 66/86] Add extensions (#32) * Add extensions * Fix grep * Feature-related bugfixes --- .github/workflows/release-daily.yaml | 22 +++++++- assemble-iso.sh | 2 +- mkosi.conf | 3 + mkosi.images/base/mkosi.conf.d/core.conf | 1 + mkosi.images/ext-devel/mkosi.conf | 30 ++++++++++ mkosi.images/ext-virt/mkosi.conf | 20 +++++++ mkosi.images/ext-virt/mkosi.postinst.chroot | 4 ++ mkosi.images/sysupdate/mkosi.conf | 2 + .../usr/lib/sysupdate.d/ext-devel.feature | 3 + .../usr/lib/sysupdate.d/ext-devel.transfer | 12 ++++ .../usr/lib/sysupdate.d/ext-virt.feature | 3 + .../usr/lib/sysupdate.d/ext-virt.transfer | 12 ++++ .../mkosi.extra/usr/sbin/elementary-features | 56 +++++++++++++++++++ .../sysupdate/mkosi.extra/usr/sbin/featurectl | 4 -- 14 files changed, 166 insertions(+), 8 deletions(-) create mode 100644 mkosi.images/ext-devel/mkosi.conf create mode 100644 mkosi.images/ext-virt/mkosi.conf create mode 100755 mkosi.images/ext-virt/mkosi.postinst.chroot create mode 100644 mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-devel.feature create mode 100644 mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-devel.transfer create mode 100644 mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-virt.feature create mode 100644 mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-virt.transfer create mode 100644 mkosi.images/sysupdate/mkosi.extra/usr/sbin/elementary-features delete mode 100644 mkosi.images/sysupdate/mkosi.extra/usr/sbin/featurectl diff --git a/.github/workflows/release-daily.yaml b/.github/workflows/release-daily.yaml index 0f4bde0e6..de193e1f2 100644 --- a/.github/workflows/release-daily.yaml +++ b/.github/workflows/release-daily.yaml @@ -56,14 +56,30 @@ jobs: run: | set -euo pipefail FILE_PATH=$(ls mkosi.output/*.usr-*.raw.xz | head -n 1) - TIMESTAMP=$(basename "$FILE_PATH" | grep -oE '[0-9]{8}' | head -n 1 || true) + TIMESTAMP=$(basename "$FILE_PATH" | grep -oE '[0-9]{14}' | head -n 1 || true) if [ -z "$TIMESTAMP" ]; then - echo "No date found in $(basename "$FILE_PATH"), falling back to build date." - TIMESTAMP=$(date -u +%Y%m%d) + echo "Fatal: No timpestamped file found." + exit 0 fi echo "Release date: $TIMESTAMP" echo "RELEASE_DATE=$TIMESTAMP" >> "$GITHUB_OUTPUT" + - name: Compress and Checksum Extensions + run: | + cd mkosi.output + xz -5 -T0 ext-*.raw + sha256sum ext-*.raw.xz > SHA256SUMS + cat SHA256SUMS + + - name: Release Extensions + uses: softprops/action-gh-release@v3 + with: + tag_name: ${{ steps.get_date.outputs.RELEASE_DATE }} + name: Extension release ${{ steps.get_date.outputs.RELEASE_DATE }} + files: | + mkosi.output/ext-*.raw.xz + mkosi.output/SHA256SUMS + - name: Upload usr, iso and SHA256SUMS to Bucket env: AWS_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }} diff --git a/assemble-iso.sh b/assemble-iso.sh index 4f12a7617..b799ded36 100755 --- a/assemble-iso.sh +++ b/assemble-iso.sh @@ -10,7 +10,7 @@ DATE=${DATE#liveiso_} OUT_ISO="./elementaryos-9.0-daily-$(uname -m).${DATE}.iso" RAW_IMAGE=$(find "$SEARCH_DIR" -maxdepth 1 -type f \ - | grep -E '/[^/]+_[0-9]{14}\.raw$' \ + | grep -E '/elementary_[0-9]{14}\.raw$' \ | head -n1) if [[ -z "$RAW_IMAGE" ]]; then diff --git a/mkosi.conf b/mkosi.conf index e6dc19dbc..86618ea7d 100644 --- a/mkosi.conf +++ b/mkosi.conf @@ -4,6 +4,8 @@ Dependencies= base sysupdate liveiso + ext-devel + ext-virt [Distribution] Distribution=ubuntu @@ -19,5 +21,6 @@ ToolsTreeDistribution=ubuntu ToolsTreeRelease=resolute [Output] +ImageId=elementary OutputDirectory=mkosi.output/ Format=none diff --git a/mkosi.images/base/mkosi.conf.d/core.conf b/mkosi.images/base/mkosi.conf.d/core.conf index 3fdbcacf9..52ad8226e 100644 --- a/mkosi.images/base/mkosi.conf.d/core.conf +++ b/mkosi.images/base/mkosi.conf.d/core.conf @@ -10,6 +10,7 @@ Packages= apparmor-utils btrfs-progs cryptsetup + distrobox curl git linux-firmware diff --git a/mkosi.images/ext-devel/mkosi.conf b/mkosi.images/ext-devel/mkosi.conf new file mode 100644 index 000000000..73b5c7310 --- /dev/null +++ b/mkosi.images/ext-devel/mkosi.conf @@ -0,0 +1,30 @@ +[Config] +Dependencies=base + +[Output] +Format=sysext +Overlay=yes +ImageId=ext-devel +Verity=no + +[Content] +Bootable=no +BaseTrees=%O/base_%v +Packages= + binutils + build-essential + cmake + docker.io + docker-compose + flatpak-builder + fzf + gcc + gettext + jq + just + lshw + meson + podman-compose + sassc + wget + yq \ No newline at end of file diff --git a/mkosi.images/ext-virt/mkosi.conf b/mkosi.images/ext-virt/mkosi.conf new file mode 100644 index 000000000..f43e89788 --- /dev/null +++ b/mkosi.images/ext-virt/mkosi.conf @@ -0,0 +1,20 @@ +[Config] +Dependencies=base + +[Output] +Format=sysext +Overlay=yes +ImageId=ext-virt +Verity=no + +[Content] +Bootable=no +BaseTrees=%O/base_%v +Packages= + qemu-system-x86 + qemu-system-arm + libvirt-daemon-system + libvirt-clients + virt-manager + bridge-utils + virtinst \ No newline at end of file diff --git a/mkosi.images/ext-virt/mkosi.postinst.chroot b/mkosi.images/ext-virt/mkosi.postinst.chroot new file mode 100755 index 000000000..7305dd82d --- /dev/null +++ b/mkosi.images/ext-virt/mkosi.postinst.chroot @@ -0,0 +1,4 @@ +#!/bin/bash +set -xeuo pipefail + +glib-compile-schemas /usr/share/glib-2.0/schemas/ \ No newline at end of file diff --git a/mkosi.images/sysupdate/mkosi.conf b/mkosi.images/sysupdate/mkosi.conf index 89eb87c7f..5db5d63a4 100644 --- a/mkosi.images/sysupdate/mkosi.conf +++ b/mkosi.images/sysupdate/mkosi.conf @@ -9,6 +9,8 @@ Format=disk SplitArtifacts=partitions [Content] +RemovePackages= + command-not-found VolatilePackages= systemd-boot-efi Bootable=yes diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-devel.feature b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-devel.feature new file mode 100644 index 000000000..f022e7e7f --- /dev/null +++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-devel.feature @@ -0,0 +1,3 @@ +[Feature] +Description=Tooling for developpers +Enabled=false \ No newline at end of file diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-devel.transfer b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-devel.transfer new file mode 100644 index 000000000..3ae815381 --- /dev/null +++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-devel.transfer @@ -0,0 +1,12 @@ +[Transfer] +Features=ext-devel + +[Source] +Type=url-file +Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download/ +MatchPattern=ext-devel_@v.raw.xz + +[Target] +Type=regular-file +Path=/var/lib/extensions +MatchPattern=ext-devel_@v.raw \ No newline at end of file diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-virt.feature b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-virt.feature new file mode 100644 index 000000000..b27c1212e --- /dev/null +++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-virt.feature @@ -0,0 +1,3 @@ +[Feature] +Description=Virtualization host packages (qemu) +Enabled=false \ No newline at end of file diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-virt.transfer b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-virt.transfer new file mode 100644 index 000000000..032fa331c --- /dev/null +++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-virt.transfer @@ -0,0 +1,12 @@ +[Transfer] +Features=ext-virt + +[Source] +Type=url-file +Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download/ +MatchPattern=ext-virt_@v.raw.xz + +[Target] +Type=regular-file +Path=/var/lib/extensions +MatchPattern=ext-virt_@v.raw \ No newline at end of file diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/sbin/elementary-features b/mkosi.images/sysupdate/mkosi.extra/usr/sbin/elementary-features new file mode 100644 index 000000000..814dd2007 --- /dev/null +++ b/mkosi.images/sysupdate/mkosi.extra/usr/sbin/elementary-features @@ -0,0 +1,56 @@ +#!/usr/bin/env bash +set -euo pipefail + +REPO_URL="https://github.com/jumpyvi/elementary-atomic-os/releases/download" +EXT_DIR="/var/lib/extensions" + +enable() { + local name="$1" + local version + echo "Pulling feature: ${name}:${version} ..." + version=$(grep -oP '^IMAGE_VERSION=\K.*' /etc/os-release | tr -d '"') + + mkdir -p "$EXT_DIR" + + curl -fsSL "${REPO_URL}/${version}/${name}_${version}.raw.xz" | xz -d > "${EXT_DIR}/${name}_${version}.raw" + + systemd-sysext refresh + + mkdir -p /etc/sysupdate.d + cat > "/etc/sysupdate.d/${name}.feature" < "/etc/sysupdate.d/${name}.feature" </dev/null + ;; + enable) + enable "${2:?feature name required}" + ;; + disable) + disable "${2:?feature name required}" + ;; + *) + echo "usage: elementary-features {list|enable|disable} [FEATURE]" >&2 + exit 1 + ;; +esac \ No newline at end of file diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/sbin/featurectl b/mkosi.images/sysupdate/mkosi.extra/usr/sbin/featurectl deleted file mode 100644 index b956c2a81..000000000 --- a/mkosi.images/sysupdate/mkosi.extra/usr/sbin/featurectl +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -echo "Not yet implemented, comming soon.." \ No newline at end of file From aeb59b8d24279669af0454074c6d9a909b142a98 Mon Sep 17 00:00:00 2001 From: jumpyvi <62212220+jumpyvi@users.noreply.github.com> Date: Wed, 19 Aug 2026 20:39:16 -0400 Subject: [PATCH 67/86] Fix iso arch naming --- assemble-iso.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assemble-iso.sh b/assemble-iso.sh index b799ded36..6dcd8c3a6 100755 --- a/assemble-iso.sh +++ b/assemble-iso.sh @@ -7,7 +7,7 @@ SEARCH_DIR=. DATE=$(basename $(ls -d liveiso_* | grep -vE '\.(raw|iso|vmlinuz|initrd|efi|manifest)$' | head -n1)) DATE=${DATE#liveiso_} -OUT_ISO="./elementaryos-9.0-daily-$(uname -m).${DATE}.iso" +OUT_ISO="./elementaryos-9.0-daily-$(uname -m | tr '_' '-').${DATE}.iso" RAW_IMAGE=$(find "$SEARCH_DIR" -maxdepth 1 -type f \ | grep -E '/elementary_[0-9]{14}\.raw$' \ From 74d5f36bb81dca67343447737b4cf9d42ba85420 Mon Sep 17 00:00:00 2001 From: nikodunk Date: Wed, 19 Aug 2026 21:56:59 -0700 Subject: [PATCH 68/86] re-order upload steps so that extension SHASUM does not overwrite image SHASUM --- .github/workflows/release-daily.yaml | 32 ++++++++++++++-------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/release-daily.yaml b/.github/workflows/release-daily.yaml index de193e1f2..9a0c09175 100644 --- a/.github/workflows/release-daily.yaml +++ b/.github/workflows/release-daily.yaml @@ -64,22 +64,6 @@ jobs: echo "Release date: $TIMESTAMP" echo "RELEASE_DATE=$TIMESTAMP" >> "$GITHUB_OUTPUT" - - name: Compress and Checksum Extensions - run: | - cd mkosi.output - xz -5 -T0 ext-*.raw - sha256sum ext-*.raw.xz > SHA256SUMS - cat SHA256SUMS - - - name: Release Extensions - uses: softprops/action-gh-release@v3 - with: - tag_name: ${{ steps.get_date.outputs.RELEASE_DATE }} - name: Extension release ${{ steps.get_date.outputs.RELEASE_DATE }} - files: | - mkosi.output/ext-*.raw.xz - mkosi.output/SHA256SUMS - - name: Upload usr, iso and SHA256SUMS to Bucket env: AWS_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }} @@ -121,3 +105,19 @@ jobs: aws s3 cp "mkosi.output/$ISO.sha256.txt" "$ISO_DEST/$ISO.sha256.txt" \ --content-type "text/plain" \ --cache-control "public, max-age=31536000, immutable" + + - name: Compress and Checksum Extensions + run: | + cd mkosi.output + xz -5 -T0 ext-*.raw + sha256sum ext-*.raw.xz > SHA256SUMS + cat SHA256SUMS + + - name: Release Extensions + uses: softprops/action-gh-release@v3 + with: + tag_name: ${{ steps.get_date.outputs.RELEASE_DATE }} + name: Extension release ${{ steps.get_date.outputs.RELEASE_DATE }} + files: | + mkosi.output/ext-*.raw.xz + mkosi.output/SHA256SUMS \ No newline at end of file From d32f0e041cb055579baf6bf0dcf42b0a99868cbb Mon Sep 17 00:00:00 2001 From: jumpyvi <62212220+jumpyvi@users.noreply.github.com> Date: Thu, 20 Aug 2026 10:47:07 -0400 Subject: [PATCH 69/86] Quick fixes --- README.md | 18 +----- assemble-iso.sh | 3 + .../base/mkosi.conf.d/elementary.conf | 5 +- .../mkosi.extra/iso_root/boot/grub/grub.cfg | 2 +- mkosi.images/liveiso/mkosi.posinst.chroot | 6 -- .../mkosi.extra/usr/sbin/elementary-features | 56 ------------------- 6 files changed, 7 insertions(+), 83 deletions(-) delete mode 100755 mkosi.images/liveiso/mkosi.posinst.chroot delete mode 100644 mkosi.images/sysupdate/mkosi.extra/usr/sbin/elementary-features diff --git a/README.md b/README.md index 75028ff26..0a96f6df8 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ Generate keys and then build with `just` just genkey just do-release ``` -Create install media with [Fedora Media Writer](https://flathub.org/en/apps/org.fedoraproject.MediaWriter) or [Impression](flathub.org/en/apps/io.gitlab.adhami3310.Impression). Or boot with Gnome Boxes (>=51). Then, in demo mode, install via script: +Create install media with [Fedora Media Writer](https://flathub.org/en/apps/org.fedoraproject.MediaWriter) or [Impression](flathub.org/en/apps/io.gitlab.adhami3310.Impression), or boot with Gnome Boxes (>=51). Then, in demo mode, install via script: ```bash run0 elementary-install @@ -55,18 +55,4 @@ Append the exact version ID at the end to upgrade to a specific version, or down - UEFI - ~8gb usb stick - Gnome Boxes >=51 (for VM only) -- 70gb destination disk, 4gb ram (less should be possible, but not tested) - - -### Versions - -| Features | elementary OS 9 | elementary OS 9 "Classic" | -| --------------- | ---------------------------------- | ------------------------- | -| -> **Bootloader** | systemd-boot (UEFI-Only) | grub2 | -| -> **Atomic** | Readonly /usr, with verity and sig | Insecure/Legacy | -| -> **Upgrade method** | systemd-sysupdate, monthly | Manual, with apt-get | -| -> **Nvidia** | Nvidia-Open available | Manual, with apt-get | -| -> **Encryption** | TPM, Passphrase or none | TPM, Passphrase or none | -| -> **Packages** | Flatpak, Linuxbrew and Sysupdate | Flatpak and apt-get | -| -> **Kernel** | Latest Ubuntu, UKI | Latest Ubuntu, UKI | -| -> **Display** | Wayland | X11 or Wayland | \ No newline at end of file +- 70gb destination disk, 4gb ram (less should be possible, but not tested) \ No newline at end of file diff --git a/assemble-iso.sh b/assemble-iso.sh index 6dcd8c3a6..3e84e3753 100755 --- a/assemble-iso.sh +++ b/assemble-iso.sh @@ -44,6 +44,9 @@ touch iso_root/dists/stable/main/binary-amd64/Packages gzip -kf iso_root/dists/stable/main/binary-amd64/Packages mkdir -p iso_root/pool +source ./base_${DATE}/usr/lib/os-release +sed -i "s|PLACEHOLDER_VERSION|$PRETTY_NAME|g" iso_root/boot/grub/grub.cfg + echo "Shoving everything in casper..." sudo podman run --rm -it \ diff --git a/mkosi.images/base/mkosi.conf.d/elementary.conf b/mkosi.images/base/mkosi.conf.d/elementary.conf index 6dc4c9ad5..5749e21fb 100644 --- a/mkosi.images/base/mkosi.conf.d/elementary.conf +++ b/mkosi.images/base/mkosi.conf.d/elementary.conf @@ -7,7 +7,4 @@ Packages= elementary-desktop elementary-minimal elementary-standard - plymouth-theme-elementary - pantheon-greeter # if not explicitly named, get stuck on a black screen post-install - gala # if not explicitly named, get stuck on a black screen post-install - lightdm \ No newline at end of file + io.elementary.greeter \ No newline at end of file diff --git a/mkosi.images/liveiso/mkosi.extra/iso_root/boot/grub/grub.cfg b/mkosi.images/liveiso/mkosi.extra/iso_root/boot/grub/grub.cfg index 74e40536b..055b21ea5 100644 --- a/mkosi.images/liveiso/mkosi.extra/iso_root/boot/grub/grub.cfg +++ b/mkosi.images/liveiso/mkosi.extra/iso_root/boot/grub/grub.cfg @@ -1,7 +1,7 @@ set timeout=10 set default=0 -menuentry "elementaryOS9 Live (pre-alpha)" { +menuentry "PLACEHOLDER_VERSION (Live)" { linux /casper/vmlinuz boot=casper quiet splash --- initrd /casper/initrd } \ No newline at end of file diff --git a/mkosi.images/liveiso/mkosi.posinst.chroot b/mkosi.images/liveiso/mkosi.posinst.chroot deleted file mode 100755 index a8766c231..000000000 --- a/mkosi.images/liveiso/mkosi.posinst.chroot +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -set -xeuo pipefail - -# rm -f /var/lib/apt/lists/*_Packages -# rm -f /var/lib/apt/lists/*_Sources -# rm -f /var/lib/apt/lists/*_Translation-* \ No newline at end of file diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/sbin/elementary-features b/mkosi.images/sysupdate/mkosi.extra/usr/sbin/elementary-features deleted file mode 100644 index 814dd2007..000000000 --- a/mkosi.images/sysupdate/mkosi.extra/usr/sbin/elementary-features +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -REPO_URL="https://github.com/jumpyvi/elementary-atomic-os/releases/download" -EXT_DIR="/var/lib/extensions" - -enable() { - local name="$1" - local version - echo "Pulling feature: ${name}:${version} ..." - version=$(grep -oP '^IMAGE_VERSION=\K.*' /etc/os-release | tr -d '"') - - mkdir -p "$EXT_DIR" - - curl -fsSL "${REPO_URL}/${version}/${name}_${version}.raw.xz" | xz -d > "${EXT_DIR}/${name}_${version}.raw" - - systemd-sysext refresh - - mkdir -p /etc/sysupdate.d - cat > "/etc/sysupdate.d/${name}.feature" < "/etc/sysupdate.d/${name}.feature" </dev/null - ;; - enable) - enable "${2:?feature name required}" - ;; - disable) - disable "${2:?feature name required}" - ;; - *) - echo "usage: elementary-features {list|enable|disable} [FEATURE]" >&2 - exit 1 - ;; -esac \ No newline at end of file From 0391ebe9040908eb77e841c63d8ee56f6403cac7 Mon Sep 17 00:00:00 2001 From: jumpyvi <62212220+jumpyvi@users.noreply.github.com> Date: Thu, 20 Aug 2026 14:49:10 -0400 Subject: [PATCH 70/86] Remove id from workflow --- .github/workflows/release-daily.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/release-daily.yaml b/.github/workflows/release-daily.yaml index 9a0c09175..d75d832c3 100644 --- a/.github/workflows/release-daily.yaml +++ b/.github/workflows/release-daily.yaml @@ -52,7 +52,6 @@ jobs: cat SHA256SUMS - name: Extract Date - id: get_date run: | set -euo pipefail FILE_PATH=$(ls mkosi.output/*.usr-*.raw.xz | head -n 1) From b6f8a591033786dcee7c1a5728f104b952b03735 Mon Sep 17 00:00:00 2001 From: jumpyvi <62212220+jumpyvi@users.noreply.github.com> Date: Thu, 20 Aug 2026 14:57:56 -0400 Subject: [PATCH 71/86] Add os-patches priority --- .../daily/mkosi.sandbox/etc/apt/preferences.d/patches | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 mkosi.profiles/daily/mkosi.sandbox/etc/apt/preferences.d/patches diff --git a/mkosi.profiles/daily/mkosi.sandbox/etc/apt/preferences.d/patches b/mkosi.profiles/daily/mkosi.sandbox/etc/apt/preferences.d/patches new file mode 100644 index 000000000..62c7a5b59 --- /dev/null +++ b/mkosi.profiles/daily/mkosi.sandbox/etc/apt/preferences.d/patches @@ -0,0 +1,6 @@ +Explanation: OS patches for elementary OS. +Explanation: We need this pin because our patched build can lag a few hours behind Ubuntu's updates, +Explanation: and during those few hours packages can be overwritten with unpatched ones. +Package: * +Pin: release o=LP-PPA-elementary-os-os-patches +Pin-Priority: 999 \ No newline at end of file From bab6e9f42f262a637fa71349fe3f622c2e871d6c Mon Sep 17 00:00:00 2001 From: jumpyvi <62212220+jumpyvi@users.noreply.github.com> Date: Thu, 20 Aug 2026 14:58:09 -0400 Subject: [PATCH 72/86] Add os-patches priority --- .../etc/apt/preferences.d/{patches => prioritize-patches} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename mkosi.profiles/daily/mkosi.sandbox/etc/apt/preferences.d/{patches => prioritize-patches} (100%) diff --git a/mkosi.profiles/daily/mkosi.sandbox/etc/apt/preferences.d/patches b/mkosi.profiles/daily/mkosi.sandbox/etc/apt/preferences.d/prioritize-patches similarity index 100% rename from mkosi.profiles/daily/mkosi.sandbox/etc/apt/preferences.d/patches rename to mkosi.profiles/daily/mkosi.sandbox/etc/apt/preferences.d/prioritize-patches From 6dc785c040bc5956da92b8791cd1173b7d8adc65 Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Fri, 21 Aug 2026 20:11:14 -0400 Subject: [PATCH 73/86] Switch everything to zstd (#33) --- .github/workflows/release-daily.yaml | 33 +++++------------ Justfile | 36 +++++++++++++------ assemble-iso.sh | 14 +++----- mkosi.images/ext-devel/mkosi.conf | 1 + mkosi.images/ext-virt/mkosi.conf | 1 + .../mkosi.extra/usr/sbin/elementary-install | 10 +++--- mkosi.images/sysupdate/mkosi.conf | 3 +- .../sysupdate.d/10-usr-verity-sig.transfer | 2 +- .../lib/sysupdate.d/11-usr-verity.transfer | 2 +- .../usr/lib/sysupdate.d/12-usr.transfer | 2 +- .../usr/lib/sysupdate.d/ext-devel.transfer | 2 +- .../usr/lib/sysupdate.d/ext-virt.transfer | 2 +- 12 files changed, 53 insertions(+), 55 deletions(-) diff --git a/.github/workflows/release-daily.yaml b/.github/workflows/release-daily.yaml index d75d832c3..2cbf7f527 100644 --- a/.github/workflows/release-daily.yaml +++ b/.github/workflows/release-daily.yaml @@ -37,24 +37,13 @@ jobs: sudo chown -R "$(id -u):$(id -g)" mkosi.output sudo chmod -R u+rwX mkosi.output - - name: Compress (xz) usr partition - run: | - find mkosi.output -maxdepth 1 -type f -name "*.usr-*.raw" ! -name "*verity*" -exec xz -7v -T0 {} + - - name: Generate SHA256SUMS (all partitions) - run: | - cd mkosi.output - sha256sum *.esp.raw \ - *.usr-*.*.raw.xz \ - *.usr-*-verity.*.raw \ - *.usr-*-verity-sig.*.raw \ - > SHA256SUMS - cat SHA256SUMS + run: just sign-repo - name: Extract Date run: | set -euo pipefail - FILE_PATH=$(ls mkosi.output/*.usr-*.raw.xz | head -n 1) + FILE_PATH=$(ls mkosi.output/*.usr-*.raw.zst | head -n 1) TIMESTAMP=$(basename "$FILE_PATH" | grep -oE '[0-9]{14}' | head -n 1 || true) if [ -z "$TIMESTAMP" ]; then echo "Fatal: No timpestamped file found." @@ -76,9 +65,9 @@ jobs: cd mkosi.output find . -maxdepth 1 -type f \( \ -name "*.esp.raw" \ - -o -name "*.usr-*.*.raw.xz" \ - -o -name "*.usr-*-verity.*.raw" \ - -o -name "*.usr-*-verity-sig.*.raw" \ + -o -name "*.usr-*.*.raw.zst" \ + -o -name "*.usr-*-verity.*.raw.zst" \ + -o -name "*.usr-*-verity-sig.*.raw.zst" \ \) -print0 | while IFS= read -r -d '' f; do aws s3 cp "$f" "s3://${{ secrets.R2_BUCKET_DAILY_UPDATES }}/$ARCH/" --cache-control "public, max-age=31536000, immutable" done @@ -105,12 +94,8 @@ jobs: --content-type "text/plain" \ --cache-control "public, max-age=31536000, immutable" - - name: Compress and Checksum Extensions - run: | - cd mkosi.output - xz -5 -T0 ext-*.raw - sha256sum ext-*.raw.xz > SHA256SUMS - cat SHA256SUMS + - name: Checksum Extensions + run: just checksum-ext - name: Release Extensions uses: softprops/action-gh-release@v3 @@ -118,5 +103,5 @@ jobs: tag_name: ${{ steps.get_date.outputs.RELEASE_DATE }} name: Extension release ${{ steps.get_date.outputs.RELEASE_DATE }} files: | - mkosi.output/ext-*.raw.xz - mkosi.output/SHA256SUMS \ No newline at end of file + mkosi.output/ext/ext-*.raw.zst + mkosi.output/ext/SHA256SUMS \ No newline at end of file diff --git a/Justfile b/Justfile index 1f15ab296..5cccecd0c 100644 --- a/Justfile +++ b/Justfile @@ -5,8 +5,8 @@ default: do-daily: #!/usr/bin/env bash - sudo rm -rf mkosi.output/ - just run-in-podman mkosi -B --debug --profile=daily --force --workspace-directory=/workspace + sudo rm -rf mkosi.output/ && \ + just run-in-podman mkosi -B --debug --profile=daily --force --workspace-directory=/workspace && \ sudo ./assemble-iso.sh @@ -40,14 +40,28 @@ clean: just run-in-podman mkosi clean sudo rm -r mkosi.tools/ mkosi.cache/ /var/cache/mkosi/* -sign-repo: +checksum-repo: #!/usr/bin/env bash cd mkosi.output - echo "Repo will not be signed, use verify=no." - echo "Generating SHA256..." - sha256sum elementary_*.usr-x86-64-verity-sig.*.raw \ - elementary_*.usr-x86-64-verity.*.raw \ - elementary_*.usr-x86-64.*.raw \ - elementary_*.efi \ - > SHA256SUMS - cd .. \ No newline at end of file + sha256sum elementary_*.efi \ + elementary_*.usr-*.*.raw.zst \ + elementary_*.usr-*-verity.*.raw.zst \ + elementary_*.usr-*-verity-sig.*.raw.zst \ + > SHA256SUMS + cat SHA256SUMS + +checksum-ext: + #!/usr/bin/env bash + cd mkosi.output + mkdir ext + mv ext-*.raw.zst ext/ + cd ext/ + sha256sum ext-*.raw.zst > SHA256SUMS + cat SHA256SUMS + +serve: + #!/usr/bin/env bash + cd mkosi.output + echo "Sysupdate accessible in Gnome Boxes at http://10.0.2.2:7070" + echo "Extensions accessible in Gnome Boxes at http://10.0.2.2:7070/ext/" + python -m http.server 7070 diff --git a/assemble-iso.sh b/assemble-iso.sh index 3e84e3753..cf298f945 100755 --- a/assemble-iso.sh +++ b/assemble-iso.sh @@ -10,18 +10,14 @@ DATE=${DATE#liveiso_} OUT_ISO="./elementaryos-9.0-daily-$(uname -m | tr '_' '-').${DATE}.iso" RAW_IMAGE=$(find "$SEARCH_DIR" -maxdepth 1 -type f \ - | grep -E '/elementary_[0-9]{14}\.raw$' \ + | grep -E '/elementary_[0-9]{14}\.raw.zst$' \ | head -n1) if [[ -z "$RAW_IMAGE" ]]; then - echo "error: No .raw image found matching the pattern." >&2 + echo "error: No .raw.zst image found matching the pattern." >&2 exit 1 fi -XZ_IMAGE="${RAW_IMAGE}.xz" -echo "Compressing raw image: $RAW_IMAGE -> $XZ_IMAGE..." -xz -1 -T0 -c "$RAW_IMAGE" > "$XZ_IMAGE" - # Detect version output_dir=$(ls -d liveiso_* | grep -vE '\.(raw|iso|vmlinuz|initrd|efi|manifest)$' | head -n 1) @@ -48,7 +44,7 @@ source ./base_${DATE}/usr/lib/os-release sed -i "s|PLACEHOLDER_VERSION|$PRETTY_NAME|g" iso_root/boot/grub/grub.cfg -echo "Shoving everything in casper..." +echo "Creating casper liveiso..." sudo podman run --rm -it \ --network host \ --dns 8.8.8.8 \ @@ -61,7 +57,7 @@ sudo podman run --rm -it \ cp ${base_name}/boot/vmlinuz-\${KERNEL_VERSION} iso_root/casper/vmlinuz cp ${base_name}/boot/initrd.img-\${KERNEL_VERSION} iso_root/casper/initrd rm -f iso_root/casper/filesystem.squashfs - mksquashfs ${base_name} iso_root/casper/filesystem.squashfs -comp xz + mksquashfs ${base_name} iso_root/casper/filesystem.squashfs -comp zstd grub-mkrescue -o custom_ubuntu_live.iso iso_root/ echo 'Live environment generated!'" @@ -70,7 +66,7 @@ echo "Generating installer..." BASE_ISO="./custom_ubuntu_live.iso" rm -f "$OUT_ISO" -LOCAL_RAW_IMAGE="./$(basename "$XZ_IMAGE")" +LOCAL_RAW_IMAGE="./$(basename "$RAW_IMAGE")" podman run --rm \ --security-opt label=disable \ diff --git a/mkosi.images/ext-devel/mkosi.conf b/mkosi.images/ext-devel/mkosi.conf index 73b5c7310..b40af9290 100644 --- a/mkosi.images/ext-devel/mkosi.conf +++ b/mkosi.images/ext-devel/mkosi.conf @@ -6,6 +6,7 @@ Format=sysext Overlay=yes ImageId=ext-devel Verity=no +CompressOutput=zstd [Content] Bootable=no diff --git a/mkosi.images/ext-virt/mkosi.conf b/mkosi.images/ext-virt/mkosi.conf index f43e89788..f6649923f 100644 --- a/mkosi.images/ext-virt/mkosi.conf +++ b/mkosi.images/ext-virt/mkosi.conf @@ -6,6 +6,7 @@ Format=sysext Overlay=yes ImageId=ext-virt Verity=no +CompressOutput=zstd [Content] Bootable=no diff --git a/mkosi.images/liveiso/mkosi.extra/usr/sbin/elementary-install b/mkosi.images/liveiso/mkosi.extra/usr/sbin/elementary-install index 1d931c253..b6913eec6 100755 --- a/mkosi.images/liveiso/mkosi.extra/usr/sbin/elementary-install +++ b/mkosi.images/liveiso/mkosi.extra/usr/sbin/elementary-install @@ -5,15 +5,15 @@ echo "Thank you for testing! <3" medium=$(findmnt -rn -t iso9660,udf -o TARGET | head -1) extra="$medium/extra" -raw_xz_src=$(find "$extra" -maxdepth 1 -type f -name '*.raw.xz' | head -n1) +raw_zstd=$(find "$extra" -maxdepth 1 -type f -name '*.raw.zst' | head -n1) repart_src="/opt/repart-target/" -if [ -z "$raw_xz_src" ]; then - echo "Installation aborted: No .raw.xz file found." +if [ -z "$raw_zstd" ]; then + echo "Installation aborted: No .raw.zst file found." exit 1 fi -echo "Using source image: $raw_xz_src" +echo "Using source image: $raw_zstd" PS3="Select installation disk (ALL DATA WILL BE LOST): " @@ -69,7 +69,7 @@ fi raw_src="$root_mount/source.raw" echo "Decompressing image into the scratch buffer..." -xz -dk -T0 -c "$raw_xz_src" > "$raw_src" +zstd -dc -T0 "$raw_zstd" > "$raw_src" echo "Configuring partitions..." systemd-repart \ diff --git a/mkosi.images/sysupdate/mkosi.conf b/mkosi.images/sysupdate/mkosi.conf index 5db5d63a4..976ea8cb4 100644 --- a/mkosi.images/sysupdate/mkosi.conf +++ b/mkosi.images/sysupdate/mkosi.conf @@ -6,7 +6,8 @@ Distribution=ubuntu [Output] Format=disk -SplitArtifacts=partitions +SplitArtifacts=partitions,uki +CompressOutput=zstd [Content] RemovePackages= diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer index d86c28a5d..513423e37 100644 --- a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer +++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer @@ -4,7 +4,7 @@ ProtectVersion=%A [Source] Type=url-file Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download -MatchPattern=elementary_@v.usr-%a-verity-sig.@u.raw +MatchPattern=elementary_@v.usr-%a-verity-sig.@u.raw.zst [Target] Type=partition diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer index d6a473528..4c3faac2a 100644 --- a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer +++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer @@ -4,7 +4,7 @@ ProtectVersion=%A [Source] Type=url-file Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download -MatchPattern=elementary_@v.usr-%a-verity.@u.raw +MatchPattern=elementary_@v.usr-%a-verity.@u.raw.zst [Target] Type=partition diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer index 7936395c3..633a87e7a 100644 --- a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer +++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer @@ -4,7 +4,7 @@ ProtectVersion=%A [Source] Type=url-file Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download -MatchPattern=elementary_@v.usr-%a.@u.raw.xz +MatchPattern=elementary_@v.usr-%a.@u.raw.zst [Target] Type=partition diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-devel.transfer b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-devel.transfer index 3ae815381..1b724a203 100644 --- a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-devel.transfer +++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-devel.transfer @@ -4,7 +4,7 @@ Features=ext-devel [Source] Type=url-file Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download/ -MatchPattern=ext-devel_@v.raw.xz +MatchPattern=ext-devel_@v.raw.zst [Target] Type=regular-file diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-virt.transfer b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-virt.transfer index 032fa331c..028865fc4 100644 --- a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-virt.transfer +++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-virt.transfer @@ -4,7 +4,7 @@ Features=ext-virt [Source] Type=url-file Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download/ -MatchPattern=ext-virt_@v.raw.xz +MatchPattern=ext-virt_@v.raw.zst [Target] Type=regular-file From 335c628d8d8ece32fc836b9c2730030357b84ac9 Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Fri, 21 Aug 2026 20:45:52 -0400 Subject: [PATCH 74/86] Update release-daily.yaml --- .github/workflows/release-daily.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release-daily.yaml b/.github/workflows/release-daily.yaml index 2cbf7f527..42a761e28 100644 --- a/.github/workflows/release-daily.yaml +++ b/.github/workflows/release-daily.yaml @@ -38,7 +38,7 @@ jobs: sudo chmod -R u+rwX mkosi.output - name: Generate SHA256SUMS (all partitions) - run: just sign-repo + run: just checksum-repo - name: Extract Date run: | @@ -52,7 +52,7 @@ jobs: echo "Release date: $TIMESTAMP" echo "RELEASE_DATE=$TIMESTAMP" >> "$GITHUB_OUTPUT" - - name: Upload usr, iso and SHA256SUMS to Bucket + - name: Upload sysupdate, iso and SHA256SUMS to Bucket env: AWS_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.R2_SECRET_ACCESS_KEY }} @@ -104,4 +104,4 @@ jobs: name: Extension release ${{ steps.get_date.outputs.RELEASE_DATE }} files: | mkosi.output/ext/ext-*.raw.zst - mkosi.output/ext/SHA256SUMS \ No newline at end of file + mkosi.output/ext/SHA256SUMS From d73857ed62e740db6fee6034b3f35a6a35e43335 Mon Sep 17 00:00:00 2001 From: nikodunk Date: Sat, 22 Aug 2026 11:15:42 -0700 Subject: [PATCH 75/86] add id to extract date step so that extension tag resolves --- .github/workflows/release-daily.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release-daily.yaml b/.github/workflows/release-daily.yaml index 42a761e28..ead8b4307 100644 --- a/.github/workflows/release-daily.yaml +++ b/.github/workflows/release-daily.yaml @@ -41,6 +41,7 @@ jobs: run: just checksum-repo - name: Extract Date + id: get_date run: | set -euo pipefail FILE_PATH=$(ls mkosi.output/*.usr-*.raw.zst | head -n 1) From efe192fcd772248a33057f4e047800df944c49cd Mon Sep 17 00:00:00 2001 From: jumpyvi Date: Wed, 26 Aug 2026 19:57:38 -0400 Subject: [PATCH 76/86] Remove cleanup.conf --- mkosi.images/base/mkosi.conf.d/cleanup.conf | 18 ------------------ mkosi.images/base/mkosi.conf.d/core.conf | 3 +++ 2 files changed, 3 insertions(+), 18 deletions(-) delete mode 100644 mkosi.images/base/mkosi.conf.d/cleanup.conf diff --git a/mkosi.images/base/mkosi.conf.d/cleanup.conf b/mkosi.images/base/mkosi.conf.d/cleanup.conf deleted file mode 100644 index 62dac1bbe..000000000 --- a/mkosi.images/base/mkosi.conf.d/cleanup.conf +++ /dev/null @@ -1,18 +0,0 @@ -[Match] -Distribution=ubuntu - -[Content] -RemoveFiles= - /usr/bin/chsh - /usr/bin/lchsh -RemovePackages= - stunnel - gdm3 - gnome-control-center - gnome-remote-desktop - gnome-screensaver - gnome-shell - gnome-session - gnome-software - gnome-system-monitor - nautilus \ No newline at end of file diff --git a/mkosi.images/base/mkosi.conf.d/core.conf b/mkosi.images/base/mkosi.conf.d/core.conf index 52ad8226e..948aa80ca 100644 --- a/mkosi.images/base/mkosi.conf.d/core.conf +++ b/mkosi.images/base/mkosi.conf.d/core.conf @@ -2,6 +2,9 @@ Distribution=ubuntu [Content] +RemoveFiles= + /usr/bin/chsh + /usr/bin/lchsh VolatilePackages= systemd-container Packages= From d6a2f535550efdf1767b3a0e5a986d1fa2696908 Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Fri, 28 Aug 2026 18:55:12 -0400 Subject: [PATCH 77/86] Revert to original license --- LICENSE | 686 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 674 insertions(+), 12 deletions(-) diff --git a/LICENSE b/LICENSE index 87b23a248..20d40b6bc 100644 --- a/LICENSE +++ b/LICENSE @@ -1,12 +1,674 @@ -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as -published by the Free Software Foundation, either version 3 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . \ No newline at end of file + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file From afb13fe41597338edf570ec120a197b5f990be0b Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Fri, 28 Aug 2026 18:57:32 -0400 Subject: [PATCH 78/86] Add newlines --- .gitignore | 2 +- LICENSE | 2 +- README.md | 2 +- assemble-iso.sh | 2 +- mkosi.images/base/mkosi.conf.d/core.conf | 2 +- .../base/mkosi.conf.d/elementary.conf | 2 +- .../usr/lib/sysctl.d/60-apparmor.conf | 2 +- .../systemd/system/systemd-firstboot.service | 2 +- .../systemd-networkd-wait-online.service | 2 +- .../usr/lib/systemd/zram-generator.conf | 2 +- .../usr/lib/sysusers.d/session.conf | 2 +- .../mkosi.extra/usr/lib/sysusers.d/wpa.conf | 2 +- .../usr/lib/tmpfiles.d/99-factory.conf | 2 +- .../usr/lib/tmpfiles.d/aliases.conf | 2 +- .../mkosi.extra/usr/lib/tmpfiles.d/login.conf | 2 +- mkosi.images/ext-devel/mkosi.conf | 2 +- mkosi.images/ext-virt/mkosi.conf | 2 +- mkosi.images/ext-virt/mkosi.postinst.chroot | 2 +- mkosi.images/liveiso/mkosi.conf | 2 +- .../liveiso/mkosi.extra/iso_root/.disk/info | 2 +- .../mkosi.extra/iso_root/boot/grub/grub.cfg | 2 +- .../casper/filesystem.manifest-remove | 2 +- .../mkosi.extra/iso_root/dists/stable/Release | 2 +- .../opt/repart-target/root/40-root.conf | 2 +- .../99_enable_in_live_mode.conf | 2 +- .../mkosi.extra/usr/sbin/elementary-install | 2 +- .../liveiso/mkosi.repart/40-root.conf | 2 +- .../mkosi.extra/usr/lib/repart.d/00-esp.conf | 2 +- .../mkosi.extra/usr/lib/repart.d/12-usr.conf | 2 +- .../sysupdate.d/10-usr-verity-sig.transfer | 2 +- .../lib/sysupdate.d/11-usr-verity.transfer | 2 +- .../usr/lib/sysupdate.d/12-usr.transfer | 2 +- .../usr/lib/sysupdate.d/20-uki.transfer | 2 +- .../usr/lib/sysupdate.d/ext-devel.feature | 2 +- .../usr/lib/sysupdate.d/ext-devel.transfer | 2 +- .../usr/lib/sysupdate.d/ext-virt.feature | 2 +- .../usr/lib/sysupdate.d/ext-virt.transfer | 2 +- .../sysupdate/mkosi.extra/usr/sbin/usroverlay | 2 +- mkosi.images/sysupdate/mkosi.postinst.chroot | 2 +- .../mkosi.repart/20-usr-verify-sig-bside.conf | 2 +- .../mkosi.repart/21-usr-verity-bside.conf | 2 +- .../sysupdate/mkosi.repart/22-usr-bside.conf | 2 +- .../etc/apt/keyrings/elementary-os-daily.gpg | Bin 1159 -> 1160 bytes .../apt/keyrings/elementary-os-os-patches.gpg | Bin 1159 -> 1160 bytes .../etc/apt/preferences.d/deprioritize-gnome | 2 +- .../etc/apt/preferences.d/prioritize-patches | 2 +- .../elementary-os-daily.sources | 2 +- .../elementary-os-patches.sources | 2 +- 48 files changed, 46 insertions(+), 46 deletions(-) diff --git a/.gitignore b/.gitignore index a2ccebab3..c83287d5c 100644 --- a/.gitignore +++ b/.gitignore @@ -18,4 +18,4 @@ mkosi.crt mkosi.version mkosi.rootpw .mkosi-private -*.efi \ No newline at end of file +*.efi diff --git a/LICENSE b/LICENSE index 20d40b6bc..94a9ed024 100644 --- a/LICENSE +++ b/LICENSE @@ -671,4 +671,4 @@ into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read -. \ No newline at end of file +. diff --git a/README.md b/README.md index 0a96f6df8..7e18f0c31 100644 --- a/README.md +++ b/README.md @@ -55,4 +55,4 @@ Append the exact version ID at the end to upgrade to a specific version, or down - UEFI - ~8gb usb stick - Gnome Boxes >=51 (for VM only) -- 70gb destination disk, 4gb ram (less should be possible, but not tested) \ No newline at end of file +- 70gb destination disk, 4gb ram (less should be possible, but not tested) diff --git a/assemble-iso.sh b/assemble-iso.sh index cf298f945..7bc716f45 100755 --- a/assemble-iso.sh +++ b/assemble-iso.sh @@ -82,4 +82,4 @@ podman run --rm \ -commit ' -echo "Success! Your live ISO is at: mkosi.output/$OUT_ISO" \ No newline at end of file +echo "Success! Your live ISO is at: mkosi.output/$OUT_ISO" diff --git a/mkosi.images/base/mkosi.conf.d/core.conf b/mkosi.images/base/mkosi.conf.d/core.conf index 948aa80ca..b7a58029c 100644 --- a/mkosi.images/base/mkosi.conf.d/core.conf +++ b/mkosi.images/base/mkosi.conf.d/core.conf @@ -32,4 +32,4 @@ Packages= systemd-zram-generator vim xz-utils - zstd \ No newline at end of file + zstd diff --git a/mkosi.images/base/mkosi.conf.d/elementary.conf b/mkosi.images/base/mkosi.conf.d/elementary.conf index 5749e21fb..2753cde0b 100644 --- a/mkosi.images/base/mkosi.conf.d/elementary.conf +++ b/mkosi.images/base/mkosi.conf.d/elementary.conf @@ -7,4 +7,4 @@ Packages= elementary-desktop elementary-minimal elementary-standard - io.elementary.greeter \ No newline at end of file + io.elementary.greeter diff --git a/mkosi.images/base/mkosi.extra/usr/lib/sysctl.d/60-apparmor.conf b/mkosi.images/base/mkosi.extra/usr/lib/sysctl.d/60-apparmor.conf index 9dec26aed..fa5e3f77d 100644 --- a/mkosi.images/base/mkosi.extra/usr/lib/sysctl.d/60-apparmor.conf +++ b/mkosi.images/base/mkosi.extra/usr/lib/sysctl.d/60-apparmor.conf @@ -1,2 +1,2 @@ kernel.apparmor_restrict_unprivileged_userns=0 -kernel.apparmor_restrict_unprivileged_unconfined=0 \ No newline at end of file +kernel.apparmor_restrict_unprivileged_unconfined=0 diff --git a/mkosi.images/base/mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service index 4bb28c3fd..1eea907e4 100644 --- a/mkosi.images/base/mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service +++ b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service @@ -1 +1 @@ -# Masked \ No newline at end of file +# Masked diff --git a/mkosi.images/base/mkosi.extra/usr/lib/systemd/system/systemd-networkd-wait-online.service b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system/systemd-networkd-wait-online.service index 4bb28c3fd..1eea907e4 100644 --- a/mkosi.images/base/mkosi.extra/usr/lib/systemd/system/systemd-networkd-wait-online.service +++ b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system/systemd-networkd-wait-online.service @@ -1 +1 @@ -# Masked \ No newline at end of file +# Masked diff --git a/mkosi.images/base/mkosi.extra/usr/lib/systemd/zram-generator.conf b/mkosi.images/base/mkosi.extra/usr/lib/systemd/zram-generator.conf index 52ea5d619..c049a0905 100644 --- a/mkosi.images/base/mkosi.extra/usr/lib/systemd/zram-generator.conf +++ b/mkosi.images/base/mkosi.extra/usr/lib/systemd/zram-generator.conf @@ -1,3 +1,3 @@ [zram0] zram-size = min(ram / 2, 16384) -compression-algorithm = zstd \ No newline at end of file +compression-algorithm = zstd diff --git a/mkosi.images/base/mkosi.extra/usr/lib/sysusers.d/session.conf b/mkosi.images/base/mkosi.extra/usr/lib/sysusers.d/session.conf index d23e69189..044dca4b5 100644 --- a/mkosi.images/base/mkosi.extra/usr/lib/sysusers.d/session.conf +++ b/mkosi.images/base/mkosi.extra/usr/lib/sysusers.d/session.conf @@ -1,2 +1,2 @@ u lightdm - "Light Display Manager" /var/lib/lightdm /usr/sbin/nologin -u geoclue - "Geoclue Service" /var/lib/geoclue /usr/sbin/nologin \ No newline at end of file +u geoclue - "Geoclue Service" /var/lib/geoclue /usr/sbin/nologin diff --git a/mkosi.images/base/mkosi.extra/usr/lib/sysusers.d/wpa.conf b/mkosi.images/base/mkosi.extra/usr/lib/sysusers.d/wpa.conf index a1c19663b..4f28f9b46 100644 --- a/mkosi.images/base/mkosi.extra/usr/lib/sysusers.d/wpa.conf +++ b/mkosi.images/base/mkosi.extra/usr/lib/sysusers.d/wpa.conf @@ -1 +1 @@ -g netdev - - \ No newline at end of file +g netdev - - diff --git a/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/99-factory.conf b/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/99-factory.conf index 546291743..163b08fd9 100644 --- a/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/99-factory.conf +++ b/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/99-factory.conf @@ -1,2 +1,2 @@ C+ /etc/containers/ -L? /etc/hostname \ No newline at end of file +L? /etc/hostname diff --git a/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/aliases.conf b/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/aliases.conf index ad5c58b98..c13db985e 100644 --- a/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/aliases.conf +++ b/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/aliases.conf @@ -1,3 +1,3 @@ # Type Path Mode UID GID Age Target L+ /usr/sbin/systemd-sysupdate - - - - /usr/lib/systemd/systemd-sysupdate -L+ /usr/sbin/sysupdate - - - - /usr/lib/systemd/systemd-sysupdate \ No newline at end of file +L+ /usr/sbin/sysupdate - - - - /usr/lib/systemd/systemd-sysupdate diff --git a/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/login.conf b/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/login.conf index 72393e306..3f803995a 100644 --- a/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/login.conf +++ b/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/login.conf @@ -1 +1 @@ -d /var/lib/lightdm/data 0755 root root - \ No newline at end of file +d /var/lib/lightdm/data 0755 root root - diff --git a/mkosi.images/ext-devel/mkosi.conf b/mkosi.images/ext-devel/mkosi.conf index b40af9290..5bb95234d 100644 --- a/mkosi.images/ext-devel/mkosi.conf +++ b/mkosi.images/ext-devel/mkosi.conf @@ -28,4 +28,4 @@ Packages= podman-compose sassc wget - yq \ No newline at end of file + yq diff --git a/mkosi.images/ext-virt/mkosi.conf b/mkosi.images/ext-virt/mkosi.conf index f6649923f..7fbac6dbf 100644 --- a/mkosi.images/ext-virt/mkosi.conf +++ b/mkosi.images/ext-virt/mkosi.conf @@ -18,4 +18,4 @@ Packages= libvirt-clients virt-manager bridge-utils - virtinst \ No newline at end of file + virtinst diff --git a/mkosi.images/ext-virt/mkosi.postinst.chroot b/mkosi.images/ext-virt/mkosi.postinst.chroot index 7305dd82d..b80be8d33 100755 --- a/mkosi.images/ext-virt/mkosi.postinst.chroot +++ b/mkosi.images/ext-virt/mkosi.postinst.chroot @@ -1,4 +1,4 @@ #!/bin/bash set -xeuo pipefail -glib-compile-schemas /usr/share/glib-2.0/schemas/ \ No newline at end of file +glib-compile-schemas /usr/share/glib-2.0/schemas/ diff --git a/mkosi.images/liveiso/mkosi.conf b/mkosi.images/liveiso/mkosi.conf index 44f2801eb..bfae87e40 100644 --- a/mkosi.images/liveiso/mkosi.conf +++ b/mkosi.images/liveiso/mkosi.conf @@ -45,4 +45,4 @@ KernelCommandLine= [Validation] SecureBoot=no -SignExpectedPcr=no \ No newline at end of file +SignExpectedPcr=no diff --git a/mkosi.images/liveiso/mkosi.extra/iso_root/.disk/info b/mkosi.images/liveiso/mkosi.extra/iso_root/.disk/info index 5d34d6039..abbe1f6a6 100644 --- a/mkosi.images/liveiso/mkosi.extra/iso_root/.disk/info +++ b/mkosi.images/liveiso/mkosi.extra/iso_root/.disk/info @@ -1 +1 @@ -elementary Live amd64 \ No newline at end of file +elementary Live amd64 diff --git a/mkosi.images/liveiso/mkosi.extra/iso_root/boot/grub/grub.cfg b/mkosi.images/liveiso/mkosi.extra/iso_root/boot/grub/grub.cfg index 055b21ea5..8cc01aa26 100644 --- a/mkosi.images/liveiso/mkosi.extra/iso_root/boot/grub/grub.cfg +++ b/mkosi.images/liveiso/mkosi.extra/iso_root/boot/grub/grub.cfg @@ -4,4 +4,4 @@ set default=0 menuentry "PLACEHOLDER_VERSION (Live)" { linux /casper/vmlinuz boot=casper quiet splash --- initrd /casper/initrd -} \ No newline at end of file +} diff --git a/mkosi.images/liveiso/mkosi.extra/iso_root/casper/filesystem.manifest-remove b/mkosi.images/liveiso/mkosi.extra/iso_root/casper/filesystem.manifest-remove index c50db5e5e..b63507528 100644 --- a/mkosi.images/liveiso/mkosi.extra/iso_root/casper/filesystem.manifest-remove +++ b/mkosi.images/liveiso/mkosi.extra/iso_root/casper/filesystem.manifest-remove @@ -1,3 +1,3 @@ casper elementary-live -io.elementary.installer-session \ No newline at end of file +io.elementary.installer-session diff --git a/mkosi.images/liveiso/mkosi.extra/iso_root/dists/stable/Release b/mkosi.images/liveiso/mkosi.extra/iso_root/dists/stable/Release index abf968230..11d35e3cf 100644 --- a/mkosi.images/liveiso/mkosi.extra/iso_root/dists/stable/Release +++ b/mkosi.images/liveiso/mkosi.extra/iso_root/dists/stable/Release @@ -4,4 +4,4 @@ Suite: stable Codename: stable Architectures: amd64 Components: main -Description: Empty disc index for apt-cdrom compatibility \ No newline at end of file +Description: Empty disc index for apt-cdrom compatibility diff --git a/mkosi.images/liveiso/mkosi.extra/opt/repart-target/root/40-root.conf b/mkosi.images/liveiso/mkosi.extra/opt/repart-target/root/40-root.conf index 31ddc5863..eaf0be7ec 100644 --- a/mkosi.images/liveiso/mkosi.extra/opt/repart-target/root/40-root.conf +++ b/mkosi.images/liveiso/mkosi.extra/opt/repart-target/root/40-root.conf @@ -8,4 +8,4 @@ Subvolumes=/var /opt MakeDirectories=/var/log/journal Encrypt=off FactoryReset=yes -Label=elementary-root \ No newline at end of file +Label=elementary-root diff --git a/mkosi.images/liveiso/mkosi.extra/usr/lib/systemd/system/apparmor.service.d/99_enable_in_live_mode.conf b/mkosi.images/liveiso/mkosi.extra/usr/lib/systemd/system/apparmor.service.d/99_enable_in_live_mode.conf index ce4a324ac..f8d5faf89 100644 --- a/mkosi.images/liveiso/mkosi.extra/usr/lib/systemd/system/apparmor.service.d/99_enable_in_live_mode.conf +++ b/mkosi.images/liveiso/mkosi.extra/usr/lib/systemd/system/apparmor.service.d/99_enable_in_live_mode.conf @@ -1,2 +1,2 @@ [Unit] -ConditionPathExists= \ No newline at end of file +ConditionPathExists= diff --git a/mkosi.images/liveiso/mkosi.extra/usr/sbin/elementary-install b/mkosi.images/liveiso/mkosi.extra/usr/sbin/elementary-install index b6913eec6..1766b3795 100755 --- a/mkosi.images/liveiso/mkosi.extra/usr/sbin/elementary-install +++ b/mkosi.images/liveiso/mkosi.extra/usr/sbin/elementary-install @@ -83,4 +83,4 @@ rm "$raw_src" umount "$root_mount" rmdir "$root_mount" -echo "Everything is done! Enjoy your stay." \ No newline at end of file +echo "Everything is done! Enjoy your stay." diff --git a/mkosi.images/liveiso/mkosi.repart/40-root.conf b/mkosi.images/liveiso/mkosi.repart/40-root.conf index 91ab96747..54c898e30 100644 --- a/mkosi.images/liveiso/mkosi.repart/40-root.conf +++ b/mkosi.images/liveiso/mkosi.repart/40-root.conf @@ -7,4 +7,4 @@ Weight=18000 MakeDirectories=/var/log/journal Encrypt=off FactoryReset=yes -Label=elementary-root \ No newline at end of file +Label=elementary-root diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/repart.d/00-esp.conf b/mkosi.images/sysupdate/mkosi.extra/usr/lib/repart.d/00-esp.conf index f7c94a759..ae144cd02 100644 --- a/mkosi.images/sysupdate/mkosi.extra/usr/lib/repart.d/00-esp.conf +++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/repart.d/00-esp.conf @@ -3,4 +3,4 @@ Label=elementary_%A Type=esp Format=vfat SizeMinBytes=0.5G -SizeMaxBytes=2G \ No newline at end of file +SizeMaxBytes=2G diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/repart.d/12-usr.conf b/mkosi.images/sysupdate/mkosi.extra/usr/lib/repart.d/12-usr.conf index 03348069b..829eaf1a2 100644 --- a/mkosi.images/sysupdate/mkosi.extra/usr/lib/repart.d/12-usr.conf +++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/repart.d/12-usr.conf @@ -4,4 +4,4 @@ CopyBlocks=auto Label=elementary_%A SplitName=%t.%U SizeMinBytes=1G -SizeMaxBytes=3G \ No newline at end of file +SizeMaxBytes=3G diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer index 513423e37..e943f68f8 100644 --- a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer +++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer @@ -12,4 +12,4 @@ Path=auto MatchPattern=elementary_@v_verity_sig MatchPartitionType=usr-verity-sig PartitionFlags=0 -ReadOnly=1 \ No newline at end of file +ReadOnly=1 diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer index 4c3faac2a..e65fe74fe 100644 --- a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer +++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer @@ -12,4 +12,4 @@ Path=auto MatchPattern=elementary_@v_verity MatchPartitionType=usr-verity PartitionFlags=0 -ReadOnly=1 \ No newline at end of file +ReadOnly=1 diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer index 633a87e7a..5f79a30e4 100644 --- a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer +++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer @@ -12,4 +12,4 @@ Path=auto MatchPattern=elementary_@v MatchPartitionType=usr PartitionFlags=0 -ReadOnly=1 \ No newline at end of file +ReadOnly=1 diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer index 56e787be0..170eb7bdc 100644 --- a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer +++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer @@ -20,4 +20,4 @@ MatchPattern=elementary_@v_%a+@l-@d.efi \ Mode=0600 TriesLeft=3 TriesDone=0 -InstancesMax=2 \ No newline at end of file +InstancesMax=2 diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-devel.feature b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-devel.feature index f022e7e7f..50dd97c35 100644 --- a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-devel.feature +++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-devel.feature @@ -1,3 +1,3 @@ [Feature] Description=Tooling for developpers -Enabled=false \ No newline at end of file +Enabled=false diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-devel.transfer b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-devel.transfer index 1b724a203..28d6e4c2c 100644 --- a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-devel.transfer +++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-devel.transfer @@ -9,4 +9,4 @@ MatchPattern=ext-devel_@v.raw.zst [Target] Type=regular-file Path=/var/lib/extensions -MatchPattern=ext-devel_@v.raw \ No newline at end of file +MatchPattern=ext-devel_@v.raw diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-virt.feature b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-virt.feature index b27c1212e..cbc7b7351 100644 --- a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-virt.feature +++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-virt.feature @@ -1,3 +1,3 @@ [Feature] Description=Virtualization host packages (qemu) -Enabled=false \ No newline at end of file +Enabled=false diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-virt.transfer b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-virt.transfer index 028865fc4..834374ad4 100644 --- a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-virt.transfer +++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-virt.transfer @@ -9,4 +9,4 @@ MatchPattern=ext-virt_@v.raw.zst [Target] Type=regular-file Path=/var/lib/extensions -MatchPattern=ext-virt_@v.raw \ No newline at end of file +MatchPattern=ext-virt_@v.raw diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/sbin/usroverlay b/mkosi.images/sysupdate/mkosi.extra/usr/sbin/usroverlay index ee8ce750f..f184752c1 100755 --- a/mkosi.images/sysupdate/mkosi.extra/usr/sbin/usroverlay +++ b/mkosi.images/sysupdate/mkosi.extra/usr/sbin/usroverlay @@ -59,4 +59,4 @@ case "${1:-}" in cmd_status exit 1 ;; -esac \ No newline at end of file +esac diff --git a/mkosi.images/sysupdate/mkosi.postinst.chroot b/mkosi.images/sysupdate/mkosi.postinst.chroot index 66df84065..f03657b90 100755 --- a/mkosi.images/sysupdate/mkosi.postinst.chroot +++ b/mkosi.images/sysupdate/mkosi.postinst.chroot @@ -9,4 +9,4 @@ mkdir -p /var/usrlocal ln -s /var/usrlocal /usr/local cp -a /usr/local/. /var/usrlocal/ rm -rf /usr/local -ln -s /var/usrlocal /usr/local \ No newline at end of file +ln -s /var/usrlocal /usr/local diff --git a/mkosi.images/sysupdate/mkosi.repart/20-usr-verify-sig-bside.conf b/mkosi.images/sysupdate/mkosi.repart/20-usr-verify-sig-bside.conf index fd8815d3c..318fec069 100644 --- a/mkosi.images/sysupdate/mkosi.repart/20-usr-verify-sig-bside.conf +++ b/mkosi.images/sysupdate/mkosi.repart/20-usr-verify-sig-bside.conf @@ -1,3 +1,3 @@ [Partition] Type=usr-verity-sig -Label=_empty \ No newline at end of file +Label=_empty diff --git a/mkosi.images/sysupdate/mkosi.repart/21-usr-verity-bside.conf b/mkosi.images/sysupdate/mkosi.repart/21-usr-verity-bside.conf index fff802a78..6c813102e 100644 --- a/mkosi.images/sysupdate/mkosi.repart/21-usr-verity-bside.conf +++ b/mkosi.images/sysupdate/mkosi.repart/21-usr-verity-bside.conf @@ -3,4 +3,4 @@ Type=usr-verity Label=_empty NoAuto=1 SizeMinBytes=400M -SizeMaxBytes=400M \ No newline at end of file +SizeMaxBytes=400M diff --git a/mkosi.images/sysupdate/mkosi.repart/22-usr-bside.conf b/mkosi.images/sysupdate/mkosi.repart/22-usr-bside.conf index 7b19f433d..0d8eda06c 100644 --- a/mkosi.images/sysupdate/mkosi.repart/22-usr-bside.conf +++ b/mkosi.images/sysupdate/mkosi.repart/22-usr-bside.conf @@ -3,4 +3,4 @@ Type=usr Label=_empty NoAuto=1 SizeMinBytes=7G -SizeMaxBytes=7G \ No newline at end of file +SizeMaxBytes=7G diff --git a/mkosi.profiles/daily/mkosi.sandbox/etc/apt/keyrings/elementary-os-daily.gpg b/mkosi.profiles/daily/mkosi.sandbox/etc/apt/keyrings/elementary-os-daily.gpg index 4da300657b090e1af01c79025f90e9e3788df600..a53e01151374eb8cec13a9c53c72d6d9a8fce871 100644 GIT binary patch delta 9 QcmZqY?BLwc&cetA01l!8XaE2J delta 7 OcmeC+Z0Fq2&H?}l-U3|! diff --git a/mkosi.profiles/daily/mkosi.sandbox/etc/apt/keyrings/elementary-os-os-patches.gpg b/mkosi.profiles/daily/mkosi.sandbox/etc/apt/keyrings/elementary-os-os-patches.gpg index 9e7e760340b79c6754ef9581687ce78b08d6ba3c..8aa4105810c32f170cee62ae5a1c75f4887896f6 100644 GIT binary patch delta 9 QcmZqY?BLwc&cetA01l!8XaE2J delta 7 OcmeC+Z0Fq2&H?}l-U3|! diff --git a/mkosi.profiles/daily/mkosi.sandbox/etc/apt/preferences.d/deprioritize-gnome b/mkosi.profiles/daily/mkosi.sandbox/etc/apt/preferences.d/deprioritize-gnome index ec8e4941d..fdd5b14ce 100644 --- a/mkosi.profiles/daily/mkosi.sandbox/etc/apt/preferences.d/deprioritize-gnome +++ b/mkosi.profiles/daily/mkosi.sandbox/etc/apt/preferences.d/deprioritize-gnome @@ -1,3 +1,3 @@ Package: gdm3 gnome-control-center gnome-remote-desktop gnome-screensaver gnome-shell gnome-session gnome-software gnome-system-monitor nautilus Pin: release * -Pin-Priority: -1 \ No newline at end of file +Pin-Priority: -1 diff --git a/mkosi.profiles/daily/mkosi.sandbox/etc/apt/preferences.d/prioritize-patches b/mkosi.profiles/daily/mkosi.sandbox/etc/apt/preferences.d/prioritize-patches index 62c7a5b59..02b44ae3a 100644 --- a/mkosi.profiles/daily/mkosi.sandbox/etc/apt/preferences.d/prioritize-patches +++ b/mkosi.profiles/daily/mkosi.sandbox/etc/apt/preferences.d/prioritize-patches @@ -3,4 +3,4 @@ Explanation: We need this pin because our patched build can lag a few hours behi Explanation: and during those few hours packages can be overwritten with unpatched ones. Package: * Pin: release o=LP-PPA-elementary-os-os-patches -Pin-Priority: 999 \ No newline at end of file +Pin-Priority: 999 diff --git a/mkosi.profiles/daily/mkosi.sandbox/etc/apt/sources.list.d/elementary-os-daily.sources b/mkosi.profiles/daily/mkosi.sandbox/etc/apt/sources.list.d/elementary-os-daily.sources index 06b0d63cd..ff746acb3 100644 --- a/mkosi.profiles/daily/mkosi.sandbox/etc/apt/sources.list.d/elementary-os-daily.sources +++ b/mkosi.profiles/daily/mkosi.sandbox/etc/apt/sources.list.d/elementary-os-daily.sources @@ -2,4 +2,4 @@ Types: deb URIs: https://ppa.launchpadcontent.net/elementary-os/daily/ubuntu Suites: resolute Components: main -Signed-By: /etc/apt/keyrings/elementary-os-daily.gpg \ No newline at end of file +Signed-By: /etc/apt/keyrings/elementary-os-daily.gpg diff --git a/mkosi.profiles/daily/mkosi.sandbox/etc/apt/sources.list.d/elementary-os-patches.sources b/mkosi.profiles/daily/mkosi.sandbox/etc/apt/sources.list.d/elementary-os-patches.sources index 9b8ff81c3..f2fae00a6 100644 --- a/mkosi.profiles/daily/mkosi.sandbox/etc/apt/sources.list.d/elementary-os-patches.sources +++ b/mkosi.profiles/daily/mkosi.sandbox/etc/apt/sources.list.d/elementary-os-patches.sources @@ -2,4 +2,4 @@ Types: deb URIs: https://ppa.launchpadcontent.net/elementary-os/os-patches/ubuntu Suites: resolute Components: main -Signed-By: /etc/apt/keyrings/elementary-os-os-patches.gpg \ No newline at end of file +Signed-By: /etc/apt/keyrings/elementary-os-os-patches.gpg From d727c4a4adc22f7ce55b4d3bec56df49548b65aa Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Fri, 28 Aug 2026 20:56:47 -0400 Subject: [PATCH 79/86] Do not enable firewalld --- .../systemd/system-preset/01-systemd.preset | 2 +- .../etc/apt/keyrings/elementary-os-daily.gpg | Bin 1160 -> 1159 bytes .../apt/keyrings/elementary-os-os-patches.gpg | Bin 1160 -> 1159 bytes 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/mkosi.images/base/mkosi.extra/usr/lib/systemd/system-preset/01-systemd.preset b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system-preset/01-systemd.preset index 9452a002d..7de557ccb 100644 --- a/mkosi.images/base/mkosi.extra/usr/lib/systemd/system-preset/01-systemd.preset +++ b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system-preset/01-systemd.preset @@ -1,6 +1,6 @@ disable systemd-timesyncd.service disable sshd.socket disable sshd.service -enable firewalld.service +enable ufw.service enable systemd-resolved.service enable plymouth.service diff --git a/mkosi.profiles/daily/mkosi.sandbox/etc/apt/keyrings/elementary-os-daily.gpg b/mkosi.profiles/daily/mkosi.sandbox/etc/apt/keyrings/elementary-os-daily.gpg index a53e01151374eb8cec13a9c53c72d6d9a8fce871..4da300657b090e1af01c79025f90e9e3788df600 100644 GIT binary patch delta 7 OcmeC+Z0Fq2&H?}l-U3|! delta 9 QcmZqY?BLwc&cetA01l!8XaE2J diff --git a/mkosi.profiles/daily/mkosi.sandbox/etc/apt/keyrings/elementary-os-os-patches.gpg b/mkosi.profiles/daily/mkosi.sandbox/etc/apt/keyrings/elementary-os-os-patches.gpg index 8aa4105810c32f170cee62ae5a1c75f4887896f6..9e7e760340b79c6754ef9581687ce78b08d6ba3c 100644 GIT binary patch delta 7 OcmeC+Z0Fq2&H?}l-U3|! delta 9 QcmZqY?BLwc&cetA01l!8XaE2J From c234b4105d276cdd51f884559699427bb07fdf19 Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Sat, 29 Aug 2026 15:15:41 -0400 Subject: [PATCH 80/86] Remove apparmor overwrite --- .../usr/lib/sysctl.d/60-apparmor.conf | 2 - .../mkosi.extra/usr/lib/tmpfiles.d/etc.conf | 186 ++++++++++++------ 2 files changed, 121 insertions(+), 67 deletions(-) delete mode 100644 mkosi.images/base/mkosi.extra/usr/lib/sysctl.d/60-apparmor.conf diff --git a/mkosi.images/base/mkosi.extra/usr/lib/sysctl.d/60-apparmor.conf b/mkosi.images/base/mkosi.extra/usr/lib/sysctl.d/60-apparmor.conf deleted file mode 100644 index fa5e3f77d..000000000 --- a/mkosi.images/base/mkosi.extra/usr/lib/sysctl.d/60-apparmor.conf +++ /dev/null @@ -1,2 +0,0 @@ -kernel.apparmor_restrict_unprivileged_userns=0 -kernel.apparmor_restrict_unprivileged_unconfined=0 diff --git a/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/etc.conf b/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/etc.conf index d26cb712c..4d8439ac6 100644 --- a/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/etc.conf +++ b/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/etc.conf @@ -1,79 +1,135 @@ # This overrides the same file from systemd since we want to symlink everything -# into /etc instead of copying so updates to /usr propagate properly. -L /etc/os-release - - - - ../usr/lib/os-release +# into /etc instead of copying so updates to /usr/propagate properly where possible. + +# Core System L+ /etc/mtab - - - - ../proc/self/mounts +L /etc/os-release - - - - ../usr/lib/os-release +C /etc/default +C /etc/systemd +C /etc/sysctl.d +C /etc/tmpfiles.d +C /etc/grub.d +C /etc/init.d +C /etc/initramfs-tools +C /etc/kernel +C /etc/modprobe.d +C /etc/modules-load.d +C /etc/modules +C /etc/crypttab +C /etc/cryptsetup-initramfs +C /etc/lsb-release +C /etc/debian_version +# Configuration for ldconfig +L /etc/ld.so.conf +L /etc/ld.so.conf.d # Contains the default systemd locale L /etc/locale.conf L /etc/nsswitch.conf -C /etc/profile -C /etc/profile.d -# Required by pam_env plugin + +# ID +C /etc/passwd +C /etc/group +C /etc/shadow +C /etc/gshadow +C /etc/subuid +C /etc/subgid +C /etc/adduser.conf +C /etc/deluser.conf + +# Networking, Host & SSH +C /etc/network +C /etc/NetworkManager +C /etc/dhcp +C /etc/dhcpcd.conf +C /etc/wpa_supplicant +C /etc/ufw +C /etc/chrony +C /etc/avahi +C /etc/ppp +C /etc/openvpn +# SSH configurations +C /etc/ssh/ssh_config +C /etc/ssh/ssh_config.d +C /etc/ssh/sshd_config +C /etc/ssh/sshd_config.d +# Used by some services, like nftables +L? /etc/services +L? /etc/nftables.conf +L? /etc/dbus1/systemd.d/org.freedesktop.ModemManager1.conf + +# Hardware +C /etc/udev +C /etc/udisks2 +C /etc/UPower +C /etc/lvm +C /etc/bluetooth +C /etc/sane.d +C /etc/brltty +C /etc/brltty.conf +C /etc/hdparm.conf +C /etc/sensors.d +C /etc/sensors3.conf +C /etc/usb_modeswitch.conf +C /etc/thermald +L /etc/fwupd +L? /etc/cups + +# ========================================== +# Package Management & Updates +# ========================================== +C /etc/apt +C /etc/dpkg +C /etc/PackageKit +C /etc/update-manager +C /etc/update-motd.d +L /etc/debuginfod + +# Security +C /etc/apparmor +C /etc/apparmor.d +C /etc/sudoers.d C /etc/security -L? /etc/bashrc -L? /etc/bash.bashrc -L? /etc/bash.bash_logout -# TODO: drop once https://github.com/scop/bash-completion/pull/1399 is merged, -# needed for shell completion of sd-run/run0 -L? /etc/bash_completion.d -# Canonical location to look for certificates +C /etc/fprintd.conf +C /etc/cracklib +C /etc/sudoers +L? /etc/authselect L? /etc/ca-certificates +L /etc/ssl L? /etc/crypto-policies L? /etc/pki -L /etc/debuginfod -L /etc/ssh/ssh_config -L /etc/ssh/ssh_config.d -L /etc/ssh/sshd_config -L /etc/ssh/sshd_config.d -# Canonical location to look for certificates -L /etc/ssl -# niri-session requires /etc/shells -L /etc/shells -L /etc/sudoers -# Required by pam environment plugin -L /etc/environment -# Required to generate desktop environment application menus + +# Desktop Environment +C /etc/X11 C /etc/xdg -# Contains default font configuration -L /etc/fonts -# Configuration for man -L /etc/man_db.conf -# Configuration for ldconfig -L /etc/ld.so.conf -L /etc/ld.so.conf.d -# Required by authselect (Fedora/CentOS) -L? /etc/authselect -# Required by tuned -L? /etc/tuned -# Required by light +C /etc/dconf C /etc/lightdm -C /etc/dbus-1 -# Required by geoclue +C /etc/pulse +C /etc/speech-dispatcher +C /etc/console-setup +L /etc/fonts L? /etc/geoclue -# Required by fwupd -L /etc/fwupd -# Required by gnome -C /etc/dconf -# Used by some services, like nftables -L? /etc/services -# Required by nftables service -L? /etc/nftables.conf + +# Environment +C /etc/profile +C /etc/profile.d +C /etc/environment.d +C /etc/inputrc +C /etc/wgetrc +C /etc/screenrc +L /etc/environment +L /etc/shells +L? /etc/bashrc +L? /etc/bash.bashrc +L? /etc/bash.bash_logout +L? /etc/bash_completion +L? /etc/bash_completion.d L? /etc/skel -# CUPS is pulled in by GNOME, and fails if the configs are not there -L? /etc/cups -# On some distributions various binaries in /usr/bin are managed via -# /etc/alternatives. -L? /etc/alternatives -# ModemManager needs its dbus policy file -L? /etc/dbus1/systemd.d/org.freedesktop.ModemManager1.conf -# man fails without this in /etc/ +C /etc/apport +C /etc/dbus-1 +C /etc/mime.types +C /etc/fuse.conf +C /etc/xml +L /etc/man_db.conf L? /etc/manpath.config -# WPASupplicant also needs its configuration -L? /etc/wpa_supplicant/wpa_supplicant.conf -# Make sure flatpak's XDG_DATA_DIR integration works -L? /etc/profile.d/flatpak.sh - -C /etc/NetworkManager -C /etc/apparmor -C /etc/apparmor.d - -C /etc/sudoers.d +C /etc/alternatives +L? /etc/profile.d/flatpak.sh \ No newline at end of file From f7b7fddf5face2dbcde9214dbf00d650bc3f4e19 Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Sat, 29 Aug 2026 15:48:58 -0400 Subject: [PATCH 81/86] Add firstboot fix for apparmor --- .../lib/systemd/system-preset/10-elementary.preset | 1 + .../lib/systemd/system/apparmor-firstboot.service | 12 ++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 mkosi.images/base/mkosi.extra/usr/lib/systemd/system/apparmor-firstboot.service diff --git a/mkosi.images/base/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset index b050c120c..62bad8ca9 100644 --- a/mkosi.images/base/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset +++ b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset @@ -1,4 +1,5 @@ enable systemd-resolved +enable apparmor-firstboot.service enable NetworkManager.service enable NetworkManager-wait-online.service disable systemd-networkd diff --git a/mkosi.images/base/mkosi.extra/usr/lib/systemd/system/apparmor-firstboot.service b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system/apparmor-firstboot.service new file mode 100644 index 000000000..05448c615 --- /dev/null +++ b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system/apparmor-firstboot.service @@ -0,0 +1,12 @@ +[Unit] +Description=Restart apparmor after configs were added by tmpfiles +ConditionFirstBoot=yes +After=systemd-tmpfiles-setup.service + +[Service] +Type=oneshot +ExecStart=/usr/bin/systemctl reload --no-block apparmor.service +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target \ No newline at end of file From ea99f13e379c3808feb1cb45e97fa9f795a824d9 Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Sat, 29 Aug 2026 15:52:36 -0400 Subject: [PATCH 82/86] Replace ext-devel with ext-sdk --- mkosi.conf | 2 +- mkosi.images/ext-devel/mkosi.conf | 31 ------------------- mkosi.images/ext-sdk/mkosi.conf | 15 +++++++++ .../usr/lib/sysupdate.d/ext-devel.feature | 3 -- .../usr/lib/sysupdate.d/ext-sdk.feature | 3 ++ .../{ext-devel.transfer => ext-sdk.transfer} | 6 ++-- 6 files changed, 22 insertions(+), 38 deletions(-) delete mode 100644 mkosi.images/ext-devel/mkosi.conf create mode 100644 mkosi.images/ext-sdk/mkosi.conf delete mode 100644 mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-devel.feature create mode 100644 mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-sdk.feature rename mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/{ext-devel.transfer => ext-sdk.transfer} (66%) diff --git a/mkosi.conf b/mkosi.conf index 86618ea7d..a4c37e91a 100644 --- a/mkosi.conf +++ b/mkosi.conf @@ -4,7 +4,7 @@ Dependencies= base sysupdate liveiso - ext-devel + ext-sdk ext-virt [Distribution] diff --git a/mkosi.images/ext-devel/mkosi.conf b/mkosi.images/ext-devel/mkosi.conf deleted file mode 100644 index 5bb95234d..000000000 --- a/mkosi.images/ext-devel/mkosi.conf +++ /dev/null @@ -1,31 +0,0 @@ -[Config] -Dependencies=base - -[Output] -Format=sysext -Overlay=yes -ImageId=ext-devel -Verity=no -CompressOutput=zstd - -[Content] -Bootable=no -BaseTrees=%O/base_%v -Packages= - binutils - build-essential - cmake - docker.io - docker-compose - flatpak-builder - fzf - gcc - gettext - jq - just - lshw - meson - podman-compose - sassc - wget - yq diff --git a/mkosi.images/ext-sdk/mkosi.conf b/mkosi.images/ext-sdk/mkosi.conf new file mode 100644 index 000000000..a2b6e5b34 --- /dev/null +++ b/mkosi.images/ext-sdk/mkosi.conf @@ -0,0 +1,15 @@ +[Config] +Dependencies=base + +[Output] +Format=sysext +Overlay=yes +ImageId=ext-sdk +Verity=no +CompressOutput=zstd + +[Content] +Bootable=no +BaseTrees=%O/base_%v +Packages= + elementary-sdk diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-devel.feature b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-devel.feature deleted file mode 100644 index 50dd97c35..000000000 --- a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-devel.feature +++ /dev/null @@ -1,3 +0,0 @@ -[Feature] -Description=Tooling for developpers -Enabled=false diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-sdk.feature b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-sdk.feature new file mode 100644 index 000000000..642ee83ad --- /dev/null +++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-sdk.feature @@ -0,0 +1,3 @@ +[Feature] +Description=Tooling for elementary developpers +Enabled=false diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-devel.transfer b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-sdk.transfer similarity index 66% rename from mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-devel.transfer rename to mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-sdk.transfer index 28d6e4c2c..a7e5a0bc6 100644 --- a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-devel.transfer +++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-sdk.transfer @@ -1,12 +1,12 @@ [Transfer] -Features=ext-devel +Features=ext-sdk [Source] Type=url-file Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download/ -MatchPattern=ext-devel_@v.raw.zst +MatchPattern=ext-sdk_@v.raw.zst [Target] Type=regular-file Path=/var/lib/extensions -MatchPattern=ext-devel_@v.raw +MatchPattern=ext-sdk_@v.raw From eefbdbe7c0b386dbe3d3e3bf8a3f19a4f1ab75cb Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Wed, 2 Sep 2026 10:39:55 -0400 Subject: [PATCH 83/86] Change workflow name to match elementary --- .github/workflows/{release-daily.yaml => daily-9.0.yaml} | 0 README.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename .github/workflows/{release-daily.yaml => daily-9.0.yaml} (100%) diff --git a/.github/workflows/release-daily.yaml b/.github/workflows/daily-9.0.yaml similarity index 100% rename from .github/workflows/release-daily.yaml rename to .github/workflows/daily-9.0.yaml diff --git a/README.md b/README.md index 7e18f0c31..1c8631f03 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@

Stable 8.1 Daily 8.1 - Monthly 9.0 + Daily 9.0

--- From 41c93012b98b82986db841448adfd0958fb07a43 Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Wed, 2 Sep 2026 10:40:57 -0400 Subject: [PATCH 84/86] Update mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-sdk.feature MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Danielle Foré --- .../sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-sdk.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-sdk.feature b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-sdk.feature index 642ee83ad..a4b0be2a4 100644 --- a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-sdk.feature +++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-sdk.feature @@ -1,3 +1,3 @@ [Feature] -Description=Tooling for elementary developpers +Description=Tooling for elementary developers Enabled=false From 802c2a9fbeff35692b28948cbca837e127a15317 Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Wed, 2 Sep 2026 10:46:58 -0400 Subject: [PATCH 85/86] Remove reference to personal github --- .../mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer | 2 +- .../mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer | 2 +- .../sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer | 2 +- .../sysupdate/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer | 2 +- .../sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-sdk.transfer | 2 +- .../sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-virt.transfer | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer index e943f68f8..27a0b53cd 100644 --- a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer +++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer @@ -3,7 +3,7 @@ ProtectVersion=%A [Source] Type=url-file -Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download +Path=PLACEHOLDER_BUCKET_PATH MatchPattern=elementary_@v.usr-%a-verity-sig.@u.raw.zst [Target] diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer index e65fe74fe..6d07cd9c2 100644 --- a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer +++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer @@ -3,7 +3,7 @@ ProtectVersion=%A [Source] Type=url-file -Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download +Path=PLACEHOLDER_BUCKET_PATH MatchPattern=elementary_@v.usr-%a-verity.@u.raw.zst [Target] diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer index 5f79a30e4..3d9e2e417 100644 --- a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer +++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer @@ -3,7 +3,7 @@ ProtectVersion=%A [Source] Type=url-file -Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download +Path=PLACEHOLDER_BUCKET_PATH MatchPattern=elementary_@v.usr-%a.@u.raw.zst [Target] diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer index 170eb7bdc..e101384f8 100644 --- a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer +++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer @@ -3,7 +3,7 @@ ProtectVersion=%A [Source] Type=url-file -Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download +Path=PLACEHOLDER_BUCKET_PATH MatchPattern=elementary_@v.efi [Target] diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-sdk.transfer b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-sdk.transfer index a7e5a0bc6..c09d22dde 100644 --- a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-sdk.transfer +++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-sdk.transfer @@ -3,7 +3,7 @@ Features=ext-sdk [Source] Type=url-file -Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download/ +Path=PLACEHOLDER_BUCKET_PATH MatchPattern=ext-sdk_@v.raw.zst [Target] diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-virt.transfer b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-virt.transfer index 834374ad4..cc9417bf2 100644 --- a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-virt.transfer +++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-virt.transfer @@ -3,7 +3,7 @@ Features=ext-virt [Source] Type=url-file -Path=https://github.com/jumpyvi/elementary-atomic-os/releases/latest/download/ +Path=PLACEHOLDER_BUCKET_PATH MatchPattern=ext-virt_@v.raw.zst [Target] From cbd24b8ce957dab330a66b0c70efc7d03385f4c2 Mon Sep 17 00:00:00 2001 From: JumpyVi <62212220+jumpyvi@users.noreply.github.com> Date: Wed, 2 Sep 2026 14:26:37 -0400 Subject: [PATCH 86/86] Quick fix tmpfile formating --- mkosi.images/base/mkosi.conf.d/elementary.conf | 1 - mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/etc.conf | 2 -- 2 files changed, 3 deletions(-) diff --git a/mkosi.images/base/mkosi.conf.d/elementary.conf b/mkosi.images/base/mkosi.conf.d/elementary.conf index 2753cde0b..65f7a2a15 100644 --- a/mkosi.images/base/mkosi.conf.d/elementary.conf +++ b/mkosi.images/base/mkosi.conf.d/elementary.conf @@ -7,4 +7,3 @@ Packages= elementary-desktop elementary-minimal elementary-standard - io.elementary.greeter diff --git a/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/etc.conf b/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/etc.conf index 4d8439ac6..9e7265489 100644 --- a/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/etc.conf +++ b/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/etc.conf @@ -74,9 +74,7 @@ C /etc/thermald L /etc/fwupd L? /etc/cups -# ========================================== # Package Management & Updates -# ========================================== C /etc/apt C /etc/dpkg C /etc/PackageKit