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