diff --git a/system_files/shared/usr/share/ublue-os/dx/quadlets/cockpit-dx.container b/system_files/shared/usr/share/ublue-os/dx/quadlets/cockpit-dx.container new file mode 100644 index 0000000..2b4aed6 --- /dev/null +++ b/system_files/shared/usr/share/ublue-os/dx/quadlets/cockpit-dx.container @@ -0,0 +1,15 @@ +[Unit] +Description=Cockpit Web Service +After=network-online.target +Wants=network-online.target sshd.service + +[Container] +Image=quay.io/cockpit/ws:latest +ContainerName=cockpit-ws +Volume=/:/host:rslave +PodmanArgs=--privileged --pid=host + +Network=host + +[Install] +WantedBy=multi-user.target diff --git a/system_files/shared/usr/share/ublue-os/dx/quadlets/incus-dx.container b/system_files/shared/usr/share/ublue-os/dx/quadlets/incus-dx.container new file mode 100644 index 0000000..14f963a --- /dev/null +++ b/system_files/shared/usr/share/ublue-os/dx/quadlets/incus-dx.container @@ -0,0 +1,26 @@ +[Unit] +Description=Incus Container Service +After=network-online.target + +[Container] +Image=ghcr.io/cmspam/incus-docker:nightly +AutoUpdate=registry +ContainerName=incus +PodmanArgs=--privileged --cgroupns=host --security-opt unmask=/sys/fs/cgroup --pid=host +Network=host + +# Volume mappings +Volume=/dev:/dev +Volume=/var/lib/incus:/var/lib/incus +Volume=/lib/modules:/lib/modules:ro + +AddDevice=/dev/kvm +AddDevice=/dev/bus/usb +Mount=type=bind,source=/dev/dri,destination=/dev/dri + +[Install] +WantedBy=multi-user.target + +[Service] +StateDirectory=incus +ExecStartPost=bash -c 'until [ -S /var/lib/incus/unix.socket ]; do sleep 0.2; done; chgrp incus-admin /var/lib/incus/unix.socket' \ No newline at end of file diff --git a/system_files/shared/usr/share/ublue-os/dx/quadlets/libvirt-dx.container b/system_files/shared/usr/share/ublue-os/dx/quadlets/libvirt-dx.container new file mode 100644 index 0000000..0c9ccb2 --- /dev/null +++ b/system_files/shared/usr/share/ublue-os/dx/quadlets/libvirt-dx.container @@ -0,0 +1,34 @@ +[Unit] +Description=Libvirt Service in Podman +After=network-online.target + +[Container] +Image=ghcr.io/jumpyvi/qemu-box:latest +AutoUpdate=registry +Network=host + +PodmanArgs=--privileged --cgroupns=host --security-opt label=disable --pid=host + +# Dbus +Mount=type=bind,source=/var/run/dbus/system_bus_socket,destination=/run/dbus/system_bus_socket + +# UDev +Mount=type=bind,source=/var/run/udev,destination=/run/udev,ro + +# KVV, USB Devices and OpenGL +AddDevice=/dev/kvm +AddDevice=/dev/bus/usb +Mount=type=bind,source=/dev/dri,destination=/dev/dri +Mount=type=bind,source=/var/run/libvirt-dx,destination=/run/libvirt + +# Storage +Mount=type=bind,source=/var/lib/libvirt-dx,destination=/var/lib/libvirt +Volume=libvirt-conf:/etc/libvirt:Z + +Exec=sh -c "chgrp kvm /dev/kvm && virtlogd -d && libvirtd" + +[Install] +WantedBy=multi-user.target + +[Service] +RuntimeDirectory=libvirt-dx \ No newline at end of file diff --git a/system_files/shared/usr/share/ublue-os/dx/units/system/dockerd-dx.service b/system_files/shared/usr/share/ublue-os/dx/units/system/dockerd-dx.service new file mode 100644 index 0000000..eba78a0 --- /dev/null +++ b/system_files/shared/usr/share/ublue-os/dx/units/system/dockerd-dx.service @@ -0,0 +1,26 @@ +[Unit] +Description=Docker Application Container Engine (brew) +Documentation=https://docs.docker.com/ + +[Service] +ExecStart=/bin/bash -c "env PATH='$PATH:/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin' /home/linuxbrew/.linuxbrew/bin/dockerd" +ExecReload=/bin/kill -s HUP $MAINPID + +Type=notify +NotifyAccess=all +KillMode=mixed +Delegate=yes + +Restart=always +RestartSec=2 +StartLimitBurst=3 +StartLimitInterval=60s + +TimeoutSec=0 +LimitNOFILE=infinity +LimitNPROC=infinity +LimitCORE=infinity +TasksMax=infinity + +[Install] +WantedBy=default.target diff --git a/system_files/shared/usr/share/ublue-os/dx/units/user/dockerd-rootless-dx.service b/system_files/shared/usr/share/ublue-os/dx/units/user/dockerd-rootless-dx.service new file mode 100644 index 0000000..02e70aa --- /dev/null +++ b/system_files/shared/usr/share/ublue-os/dx/units/user/dockerd-rootless-dx.service @@ -0,0 +1,28 @@ +[Unit] +Description=Docker Application Container Engine (Brew Rootless) +Documentation=https://docs.docker.com/go/rootless/ + +[Service] +Environment=PATH=/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin:/usr/bin:/usr/sbin:/bin +Environment=XDG_RUNTIME_DIR=/run/user/%U +ExecStart=/home/linuxbrew/.linuxbrew/bin/dockerd-rootless.sh --iptables=false +ExecReload=/bin/kill -s HUP $MAINPID +TimeoutSec=0 +RestartSec=2 +Restart=always +StartLimitBurst=3 +StartLimitInterval=60s +LimitNOFILE=infinity +LimitNPROC=infinity +LimitCORE=infinity +TasksMax=infinity +Delegate=yes +Type=notify +NotifyAccess=all +KillMode=mixed + +[Install] +WantedBy=default.target + +[Install] +WantedBy=default.target \ No newline at end of file diff --git a/system_files/shared/usr/share/ublue-os/homebrew/dx-next.Brewfile b/system_files/shared/usr/share/ublue-os/homebrew/dx-next.Brewfile new file mode 100644 index 0000000..c32926f --- /dev/null +++ b/system_files/shared/usr/share/ublue-os/homebrew/dx-next.Brewfile @@ -0,0 +1,36 @@ +tap "ublue-os/experimental-tap" +tap "ublue-os/tap" + + +cask "android-platform-tools" +flatpak "org.flatpak.Builder" +brew "git-svn" +brew "git-subrepo" +brew "bpftop" +brew "numactl" +brew "p7zip" +brew "podman-compose" +brew "podman-tui" +#brew "sysprof" +brew "ublue-os/experimental-tap/ydotool" + +# New +brew "lima" +brew "kind" +brew "incus" +brew "squashfs" +brew "devcontainer" +vscode "ms-vscode-remote.remote-containers" +flatpak "io.podman_desktop.PodmanDesktop" + +# Wall of shame +#iotop +#bcc +#bpftrace +#fonts todo +#nicstat +#osbuild-selinux +#podman-machine +#tiptop +#udica +#util-linux-script \ No newline at end of file diff --git a/system_files/shared/usr/share/ublue-os/just/apps.just b/system_files/shared/usr/share/ublue-os/just/apps.just index 0fc4d1c..e7b8594 100644 --- a/system_files/shared/usr/share/ublue-os/just/apps.just +++ b/system_files/shared/usr/share/ublue-os/just/apps.just @@ -73,3 +73,79 @@ cncf: fi fi bbrew -f "/usr/share/ublue-os/homebrew/cncf.Brewfile" + +dx_justfile := "/usr/share/ublue-os/just/dx.just" +# Experimental DX mode +dx-next: + #!/usr/bin/env bash + if ! gum confirm "Enter experimental DX mode?"; then + exit 0 + fi + + gum style \ + --border rounded \ + --border-foreground 212 \ + --padding "0 2" \ + --margin "1 0" \ + "DX-Next Environment Setup" "Please select your installation path." + + MODE=$(gum choose "Default" "Customize" --header "Installation Mode") + + if [ -z "$MODE" ]; then + gum style --foreground 196 "Setup cancelled." + exit 0 + fi + + if [ "$MODE" = "Default" ]; then + CHOICES="Virt Docker DX-Tools" + gum style --foreground 242 "Proceeding with Default options: $CHOICES" + else + echo "" + gum style --foreground 242 " Use to select/deselect, to confirm" + CHOICES=$(gum choose --no-limit \ + --selected="Virt,Docker,DX-Tools" \ + --header="--- Select Components ---" \ + --cursor.foreground 212 --selected.foreground 212 \ + "Virt" "Docker" "DX-Tools" "Incus" "Cockpit") + fi + + if [ -z "$CHOICES" ]; then + gum style --foreground 196 "No options selected. Exiting." + exit 0 + fi + + gum style --foreground 212 "󱗼 Initializing DX-Next environment..." + + # Always run group setup + just -f {{dx_justfile}} dx-groups + + # All subchoices + if echo "$CHOICES" | grep -q "DX-Tools"; then + just -f {{dx_justfile}} dx-tools + fi + + if echo "$CHOICES" | grep -q "Docker"; then + just -f {{dx_justfile}} dx-docker + fi + + if echo "$CHOICES" | grep -q "Virt"; then + just -f {{dx_justfile}} dx-virt + fi + + if echo "$CHOICES" | grep -q "Incus"; then + just -f {{dx_justfile}} dx-incus + fi + + if echo "$CHOICES" | grep -q "Cockpit"; then + just -f {{dx_justfile}} dx-cockpit + fi + + # Final Banner + echo "" + gum style --border normal --border-foreground 212 \ + "You are now testing the experimental DX mode. Please report any issues to the GitHub, or come talk with us on Discord! + + 󰙯 https://discord.gg/8RZGC3uFzA +  https://github.com/projectbluefin/common" + + gum style --foreground 220 "⏻ Please reboot to fully apply changes." \ No newline at end of file diff --git a/system_files/shared/usr/share/ublue-os/just/dx.just b/system_files/shared/usr/share/ublue-os/just/dx.just new file mode 100644 index 0000000..6cb7b6c --- /dev/null +++ b/system_files/shared/usr/share/ublue-os/just/dx.just @@ -0,0 +1,100 @@ +dx_justfile := "/usr/share/ublue-os/just/dx.just" + +# Add user to all DX group with sysusers, this is always ran +dx-groups: + #!/usr/bin/env bash + current=$(groups "$USER") + missing=() + for group in libvirt docker incus-admin; do + echo "$current" | grep -qw "$group" || missing+=("$group") + done + + if [ ${#missing[@]} -ne 0 ]; then + gum format -- "Adding $USER to: **${missing[*]}**" + sudo mkdir -p /etc/sysusers.d/ + for group in "${missing[@]}"; do echo "m $USER $group"; done | sudo tee /etc/sysusers.d/dx-groups.conf > /dev/null + sudo systemd-sysusers /etc/sysusers.d/dx-groups.conf + fi + +# A developper's essential toolkit such as VSCode, podman-tui, etc +dx-tools: + #!/usr/bin/env bash + gum style --foreground 212 "󱁯 Installing DX-Tools & Base Apps..." + brew bundle --file=/usr/share/ublue-os/homebrew/dx-next.Brewfile + brew install --cask ublue-os/tap/visual-studio-code-linux + +# Setup rootless and rootfull docker with brew +dx-docker: + #!/usr/bin/env bash + just -f {{dx_justfile}} dx-docker-rootless + just -f {{dx_justfile}} dx-docker-root + + +dx-docker-rootless: + #!/usr/bin/env bash + gum style --foreground 212 "󰡨 Setting up Rootless Docker..." + + brew install docker + brew install --cask ublue-os/experimental-tap/dockerd-linux + mkdir -p ~/.config/systemd/user/ + cp /usr/share/ublue-os/dx/units/user/dockerd-rootless-dx.service ~/.config/systemd/user/ + + systemctl --user daemon-reload + systemctl --user enable --now dockerd-rootless-dx + +dx-docker-root: + #!/usr/bin/env bash + gum style --foreground 212 "󰡨 Setting up Rootfull Docker..." + sudo cp /usr/share/ublue-os/dx/units/system/dockerd-dx.service /etc/systemd/system/ + brew install --cask ublue-os/experimental-tap/dockerd-linux + brew install iptables docker + sudo systemctl daemon-reload + sudo systemctl enable --now dockerd-dx + /home/linuxbrew/.linuxbrew/bin/docker context switch default + + +# Setup qemu/libvirt using quadlets +dx-virt: + #!/usr/bin/env bash + gum style --foreground 212 " Setting up Libvirt/QEMU..." + flatpak install -y org.virt_manager.virt-manager + flatpak install -y org.virt_manager.virt_manager.Extension.Qemu + + + SOCKET_DIR="/run/libvirt-dx" + echo 'SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0664", GROUP="libvirt"' | sudo tee /etc/udev/rules.d/50-spice-usb.rules + sudo mkdir -p /var/lib/libvirt-dx "$SOCKET_DIR" + sudo chmod 775 "$SOCKET_DIR" + + if ! sudo firewall-cmd --permanent --get-zones | grep -qw libvirt; then + sudo firewall-cmd --permanent --new-zone=libvirt + fi + sudo firewall-cmd --permanent --zone=libvirt --set-target=ACCEPT + sudo firewall-cmd --reload + + sudo mkdir -p /etc/containers/systemd/ + sudo mkdir -p /var/lib/libvirt-dx/images/ + sudo cp /usr/share/ublue-os/dx/quadlets/libvirt-dx.container /etc/containers/systemd/ + sudo systemctl daemon-reload + sudo systemctl start libvirt-dx + + flatpak override --user --filesystem=/run/libvirt-dx org.virt_manager.virt-manager + flatpak run org.virt_manager.virt-manager -c "qemu:///system?socket=/run/libvirt-dx/libvirt-sock" &>/dev/null & + flatpak run org.virt_manager.virt-manager -c "qemu:///session" &>/dev/null & + +# Setup incus and incus-webui with quadlet +dx-incus: + #!/usr/bin/env bash + gum style --foreground "#cc3d19" " Enabling and Starting Incus..." + brew install incus + sudo cp /usr/share/ublue-os/dx/quadlets/incus-dx.container /etc/containers/systemd/ + sudo systemctl daemon-reload + sudo systemctl start incus-dx + +# Setup cockpit with quadlet +dx-cockpit: + #!/usr/bin/env bash + gum style --foreground "#2c77df" " Enabling and Starting Cockpit..." + sudo cp /usr/share/ublue-os/dx/quadlets/cockpit-dx.container /etc/containers/systemd/ + sudo systemctl daemon-reload + sudo systemctl start cockpit-dx \ No newline at end of file