diff --git a/rootfs/default.nix b/rootfs/default.nix index 5880254..27e8096 100644 --- a/rootfs/default.nix +++ b/rootfs/default.nix @@ -14,7 +14,6 @@ stdenvNoCC.mkDerivation (finalAttrs: { buildInputs = with pkgs; [ glibc - binutils ]; glibcPatos = "${patosPkgs.glibc.out}"; diff --git a/rootfs/install.sh b/rootfs/install.sh index 402a4a1..a098650 100644 --- a/rootfs/install.sh +++ b/rootfs/install.sh @@ -13,10 +13,10 @@ rm -f $out/usr/lib/systemd/system/sysinit.target.wants/systemd-firstboot.service rm -f $out/usr/lib/udev/rules.d/90-vconsole.rules ### install PatOS glibc -cp -P $glibcPatos/lib/*.so* $out/usr/lib/ +cp -Pr $glibcPatos/lib/*.so* $out/usr/lib/ ### install kernel modules -cp -r $kernel/lib/modules $out/usr/lib/ +cp -Pr $kernel/lib/modules $out/usr/lib/ find $out/usr/lib/modules -type d -exec chmod 755 {} \; ### install busybox @@ -38,11 +38,11 @@ find $out -type f -executable -exec ldd {} \; | awk '{print $3}' | grep -v syste find $out -type f -executable -exec chmod 755 {} \; # FIXME: ELF patching. Is there a better way? -find $out -type f -executable -exec patchelf --set-rpath /lib:/usr/lib:/usr/lib/systemd {} \; -find $out -type f -executable -exec patchelf --set-interpreter /lib/ld-linux-x86-64.so.2 {} \; +find $out -type f -executable -exec patchelf --set-rpath /lib:/usr/lib:/usr/lib/systemd {} \; 2> /dev/null +find $out -type f -executable -exec patchelf --set-interpreter /lib/ld-linux-x86-64.so.2 {} \; 2> /dev/null patchelf --remove-rpath $out/usr/lib/ld-linux-x86-64.so.2 # strip binaries -find $out -type f -executable -exec strip {} \; +find $out -type f -executable -exec strip {} \; 2> /dev/null find $out -type d -exec chmod 755 {} \; diff --git a/utils/mkinitrd.nix b/utils/mkinitrd.nix index 8aec407..0bd234c 100644 --- a/utils/mkinitrd.nix +++ b/utils/mkinitrd.nix @@ -7,6 +7,7 @@ pkgs.writeShellApplication { name = "mkinitrd"; runtimeInputs = with pkgs; [ + patchelf cpio gzip ]; @@ -16,10 +17,6 @@ pkgs.writeShellApplication { mkdir -p root pushd root - ### copy rootfs - cp -prP ${patosPkgs.rootfs}/* . - find . -type d -exec chmod 755 {} \; - ### create directories mkdir -p etc dev proc sys tmp root ln -sf usr/bin bin @@ -29,14 +26,47 @@ pkgs.writeShellApplication { 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 - # enable dbus broker + ### 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 @@ -122,6 +152,15 @@ pkgs.writeShellApplication { EOF ln -sf ../demo.service usr/lib/systemd/system/basic.target.wants/demo.service + # 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 + patchelf --remove-rpath ./usr/lib/ld-linux-x86-64.so.2 + + # strip binaries + find . -type f -executable -exec strip {} \; 2> /dev/null + find . -type d -exec chmod 755 {} \; + # gen initrd find . -print0 | cpio --null --owner=root:root -o --format=newc | gzip -9 > ../initrd.gz