diff --git a/dbus-broker/default.nix b/dbus-broker/default.nix index eb0eb76..cad66af 100644 --- a/dbus-broker/default.nix +++ b/dbus-broker/default.nix @@ -138,15 +138,22 @@ stdenv.mkDerivation (finalAttrs: { "-D=system-console-users=gdm,sddm,lightdm" ]; - PKG_CONFIG_SYSTEMD_SYSTEMDSYSTEMUNITDIR = "/lib/systemd/system"; - PKG_CONFIG_SYSTEMD_SYSTEMDUSERUNITDIR = "/lib/systemd/user"; - PKG_CONFIG_SYSTEMD_CATALOGDIR = "/lib/systemd/catalog"; + PKG_CONFIG_SYSTEMD_SYSTEMDSYSTEMUNITDIR = "/usr/lib/systemd/system"; + PKG_CONFIG_SYSTEMD_SYSTEMDUSERUNITDIR = "/usr/lib/systemd/user"; + PKG_CONFIG_SYSTEMD_CATALOGDIR = "/usr/lib/systemd/catalog"; preInstall = '' export DESTDIR=${placeholder "out"} ''; - postInstall = ''''; + postInstall = '' + mkdir -p $out/usr/share + cp -Pr ${pkgs.dbus.out}/share/* $out/usr/share/ + cp ${pkgs.dbus.out}/etc/systemd/system/dbus.socket $out/usr/lib/systemd/system/ + find $out/usr/share/ -type d -exec chmod 755 {} \; + sed -i 's#/nix/store.*/share#/usr/share#' $out/usr/share/xml/dbus-1/catalog.xml + sed -i 's#/nix/store.*/libexec#/usr/bin#' $out/usr/share/dbus-1/system.conf + ''; doCheck = false; diff --git a/flake.nix b/flake.nix index 7606d12..221d203 100644 --- a/flake.nix +++ b/flake.nix @@ -16,6 +16,7 @@ system: let pkgs = import nixpkgs { inherit system; }; + patosPkgs = self.packages.${system}; in { packages = { @@ -37,13 +38,8 @@ systemd = pkgs.callPackage ./systemd { }; dbus-broker = pkgs.callPackage ./dbus-broker { }; - qemu-uefi-tpm = pkgs.callPackage ./utils/qemu-uefi-tpm.nix { inherit pkgs; }; - - mkinitrd = pkgs.callPackage ./utils/mkinitrd.nix { - inherit pkgs; - inherit system; - inherit self; - }; + mkinitrd = pkgs.callPackage ./utils/mkinitrd.nix { inherit patosPkgs; }; + qemu-uefi-tpm = pkgs.callPackage ./utils/qemu-uefi-tpm.nix { }; }; checks = { diff --git a/glibc/default.nix b/glibc/default.nix index 65bebc3..b5028c0 100644 --- a/glibc/default.nix +++ b/glibc/default.nix @@ -1,25 +1,21 @@ { - fetchurl, pkgs, stdenv, ... }: let - version = "2.40"; - pname = "glibcStandalone"; + version = pkgs.glibc.version; + src = pkgs.glibc.src; + pname = "glibcPatos"; in stdenv.mkDerivation (finalAttrs: { inherit version; - - pname = pname; - - src = fetchurl { - url = "mirror://gnu/glibc/glibc-${version}.tar.xz"; - sha256 = "sha256-GaiQF16SY9dI9ieZPeb0sa+c0h4D8IDkv7Oh+sECBaI="; - }; + inherit src; + inherit pname; enableParallelBuilding = true; + dontPatchShebangs = true; configureFlags = [ "--prefix=/" diff --git a/utils/mkinitrd.nix b/utils/mkinitrd.nix index 6cc08d9..0bd234c 100644 --- a/utils/mkinitrd.nix +++ b/utils/mkinitrd.nix @@ -1,7 +1,6 @@ { pkgs, - self, - system, + patosPkgs, ... }: pkgs.writeShellApplication { @@ -14,29 +13,61 @@ pkgs.writeShellApplication { ]; text = '' - # shellcheck disable=SC2038 - echo "make initrd..." - mkdir -p out + echo "Building initram disk" + mkdir -p root + pushd root - # copy systemd - cp -Pr ${self.packages.${system}.systemd.out}/* out/ - pushd out - - find . -type d -exec chmod 755 {} \; - - # Copy kernel modules - cp -Pr ${self.packages.${system}.kernel.kernel}/lib/modules ./usr/lib/ - find usr/lib/modules -type d -exec chmod 755 {} \; - - mkdir -p dev proc sys tmp root + ### create directories + mkdir -p etc dev proc sys tmp root ln -sf usr/bin bin ln -sf usr/bin sbin ln -sf usr/lib lib ln -sf usr/lib lib64 - ln -sf ../proc/self/mounts etc/mtab ln -sf ../usr/lib/systemd/systemd init + ### install systemd + cp -Pr ${patosPkgs.systemd.out}/* ./ + find . -type d -exec chmod 755 {} \; + rm -rf ./usr/include + rm -rf ./usr/sbin + # set default target to basic + mkdir usr/lib/systemd/system/basic.target.wants + ln -sf basic.target usr/lib/systemd/system/default.target + # remove first boot + rm -f usr/lib/systemd/system/sysinit.target.wants/systemd-firstboot.service + # remove vconsole setup + rm -f usr/lib/udev/rules.d/90-vconsole.rules + + ### install PatOS glibc + cp -Pr ${patosPkgs.glibc.out}/lib/*.so* ./usr/lib/ + + ### install kernel modules + cp -Pr ${patosPkgs.kernel.kernel}/lib/modules ./usr/lib/ + find usr/lib/modules -type d -exec chmod 755 {} \; + + ### install busybox + cp ${pkgs.busybox.out}/bin/busybox ./usr/bin/ + usr/bin/busybox --list | xargs -I {} ln -sf busybox usr/bin/{} + + ### install dbus broker + cp -r ${patosPkgs.dbus-broker.out}/* ./ + ln -sf ../dbus-broker.service usr/lib/systemd/system/basic.target.wants/dbus.service + ln -sf ../dbus.socket usr/lib/systemd/system/sockets.target.wants/dbus.socket + + ### install lib kmod + cp -P ${pkgs.kmod.lib}/lib/* ./usr/lib + cp -P ${pkgs.kmod.out}/bin/* ./usr/bin + + ### install libbpf + cp -P ${pkgs.libbpf.out}/lib/libbpf* ./usr/lib + + ### Find and install all shared libs + find . -type f -executable -exec ldd {} \; 2> /dev/null | awk '{print $3}' | grep -v systemd | grep -v glibc | sort -u | xargs cp -t usr/lib + find . -type f -executable -exec chmod 755 {} \; + + + ### Create needed files echo patos > ./etc/hostname cat <<EOF > ./etc/os-release NAME="PatOS" @@ -96,7 +127,7 @@ pkgs.writeShellApplication { EOF chmod 644 ./etc/group - # FIXME: remove this + # FIXME: remove this later (just to get a shell in the initramfs) cat <<EOF > usr/lib/systemd/system/demo.service [Unit] Description=Debug Shell (/bin/sulogin) @@ -119,55 +150,12 @@ pkgs.writeShellApplication { [Install] WantedBy=basic.target EOF - mkdir usr/lib/systemd/system/basic.target.wants ln -sf ../demo.service usr/lib/systemd/system/basic.target.wants/demo.service - # set default target - ln -sf basic.target usr/lib/systemd/system/default.target - # remove first boot - rm -f usr/lib/systemd/system/sysinit.target.wants/systemd-firstboot.service - # remove vconsole setup - rm -f usr/lib/udev/rules.d/90-vconsole.rules - - # install busybox - cp ${pkgs.busybox.out}/bin/busybox usr/bin/ - usr/bin/busybox --list | xargs -I {} ln -sf busybox usr/bin/{} - - # install dbus broker - cp ${self.packages.${system}.dbus-broker.out}/usr/bin/* usr/bin - cp ${self.packages.${system}.dbus-broker.out}/lib/systemd/system/* usr/lib/systemd/system - cp -Pr ${pkgs.dbus.out}/share/* usr/share/ - find usr/share/ -type d -exec chmod 755 {} \; - sed -i 's#/nix/store.*/share#/usr/share#' usr/share/xml/dbus-1/* - sed -i 's#/nix/store.*/libexec#/usr/bin#' usr/share/dbus-1/system.conf - - # enable dbus - ln -sf ../dbus-broker.service usr/lib/systemd/system/basic.target.wants/dbus.service - - cat <<EOF > usr/lib/systemd/system/dbus.socket - [Unit] - Description=D-Bus System Message Bus Socket - - [Socket] - ListenStream=/run/dbus/system_bus_socket - EOF - ln -sf ../dbus.socket usr/lib/systemd/system/sockets.target.wants/dbus.socket - - # install lib kmod - cp -P ${pkgs.kmod.lib}/lib/* ./usr/lib - cp -P ${pkgs.kmod.out}/bin/* ./usr/bin - cp -P ${pkgs.libbpf.out}/lib/libbpf* ./usr/lib - - # get shared libs - find . -type f -executable -exec ldd {} \; 2> /dev/null | awk '{print $3}' | grep -v systemd | sort -u | xargs cp -t usr/lib - find . -type f -executable -exec chmod 755 {} \; - - # FIXME: hacky(?) ELF patching. Is there a better way???????? + # FIXME: ELF patching. Is there a better way? find . -type f -executable -exec patchelf --set-rpath /lib:/usr/lib:/usr/lib/systemd {} \; 2> /dev/null find . -type f -executable -exec patchelf --set-interpreter /lib/ld-linux-x86-64.so.2 {} \; 2> /dev/null - cp ${ - self.packages.${system}.glibc.out - }/lib/ld-linux-x86-64.so.2 lib/ && patchelf --remove-rpath lib/ld-linux-x86-64.so.2 + patchelf --remove-rpath ./usr/lib/ld-linux-x86-64.so.2 # strip binaries find . -type f -executable -exec strip {} \; 2> /dev/null @@ -177,6 +165,6 @@ pkgs.writeShellApplication { find . -print0 | cpio --null --owner=root:root -o --format=newc | gzip -9 > ../initrd.gz popd - rm -rf out + rm -rf root ''; }