@@ -43,14 +43,56 @@ exit(EXIT_FAILURE); } int main(int argc, char **argv) { + int mount_ret; + + /* + * Load kernel modules (drivers) + */ + mkdir("/sys", 0755); + mount("sysfs", "/sys", "sysfs", 0, NULL); + + run("/bin/init-modules", "init-modules", NULL); + + umount("/sys"); + rmdir("/sys"); + /* - * Remount root filesystem read-write + * Mount root filesystem */ - mount("/dev/vda2", "/", "ext4", MS_REMOUNT, NULL); + mkdir("/dev", 0755); + mount("devtmpfs", "/dev", "devtmpfs", 0, NULL); + + mkdir("/new-root", 0755); + mount_ret = mount("/dev/vda2", "/new-root", "ext4", 0, NULL); + if (mount_ret != 0) { + mount_ret = mount("/dev/sda2", "/new-root", "ext4", 0, NULL); + } + if (mount_ret != 0) { + mount_ret = mount("/dev/hda2", "/new-root", "ext4", 0, NULL); + } + umount("/dev"); + rmdir("/dev"); + + if (mount_ret == 0) { + mkdir("/new-root/initramfs", 0755); + mkdir("/new-root/bin", 0755); + mkdir("/new-root/lib", 0755); + symlink("../initramfs/bin/appfsd", "/new-root/bin/appfsd"); + symlink("../initramfs/bin/init", "/new-root/bin/init"); + symlink("../initramfs/bin/init-modules", "/new-root/bin/init-modules"); + symlink("../initramfs/bin/init-networking", "/new-root/bin/init-networking"); + symlink("../initramfs/bin/appfs-cache", "/new-root/bin/appfs-cache"); + symlink("../initramfs/bin/tclkit", "/new-root/bin/tclkit"); + symlink("../initramfs/lib/modules", "/new-root/lib/modules"); + chdir("/new-root"); + mount("/", "/new-root/initramfs", "bind", MS_BIND, NULL); + chroot("/new-root"); + chdir("/"); + } /* * Mount needed filesystems */ mkdir("/dev", 0755); @@ -67,11 +109,10 @@ /* * Setup networking */ run("/bin/init-networking", "init-networking", NULL); - run("/bin/init-fuse", "init-fuse", NULL); mkdir("/etc", 0755); mkdir("/bin", 0755); mkdir("/lib", 0755); mkdir("/opt", 0755); @@ -78,11 +119,10 @@ mkdir("/opt/appfs", 0755); mkdir("/var", 0755); mkdir("/var/cache", 0755); mkdir("/var/cache/appfs", 0755); - mount("/dev/vda3", "/var/cache/appfs", "ext4", 0, NULL); run("/bin/appfsd", "appfsd", "/var/cache/appfs", "/opt/appfs", NULL); symlink(".", "/usr"); symlink("lib", "/lib64"); @@ -100,19 +140,9 @@ run("/bin/appfs-cache", "appfs-cache", "install", "core.appfs.rkeene.org", "procps-ng", NULL); setenv("PATH", "/bin", 1); run("/bin/sh", "sh", NULL); - /* - * Remount root filesystem read-only - */ - umount("/dev"); - umount("/tmp"); - umount("/proc"); - umount("/sys"); - umount("/opt/appfs"); - umount("/var/cache/appfs"); - mount("/dev/vda2", "/", "ext4", MS_REMOUNT | MS_RDONLY, NULL); sync(); return(0); }