static int hyper_container_init(void *data) { struct hyper_container_arg *arg = data; struct hyper_container *container = arg->c; char root[512], oldroot[512]; fprintf(stdout, "%s in\n", __func__); if (container->exec.argv == NULL) { fprintf(stdout, "no cmd!\n"); goto fail; } if (setns(arg->ipcns, CLONE_NEWIPC) < 0) { perror("setns to ipcns of pod init faild"); goto fail; } if (setns(arg->utsns, CLONE_NEWUTS) < 0) { perror("setns to ipcns of pod init faild"); goto fail; } if (hyper_rescan_scsi() < 0) { fprintf(stdout, "rescan scsi failed\n"); goto fail; } if (hyper_setup_env(container->envs, container->envs_num) < 0) { fprintf(stdout, "setup env failed\n"); goto fail; } if (mount("", "/", NULL, MS_SLAVE|MS_REC, NULL) < 0) { perror("mount SLAVE failed"); goto fail; } if (mount("", "/", NULL, MS_PRIVATE|MS_REC, NULL) < 0) { perror("mount PRIVATE failed"); goto fail; } sprintf(root, "/tmp/hyper/%s/root/", container->id); if (hyper_mkdir(root) < 0) { perror("make root directroy failed"); goto fail; } fprintf(stdout, "container root directory %s\n", root); if (container->fstype) { char dev[128]; sprintf(dev, "/dev/%s", container->image); fprintf(stdout, "device %s\n", dev); if (mount(dev, root, container->fstype, 0, NULL) < 0) { perror("mount device failed"); goto fail; } } else { char path[512]; sprintf(path, "/tmp/hyper/shared/%s/", container->image); fprintf(stdout, "src directory %s\n", path); if (mount(path, root, NULL, MS_BIND, NULL) < 0) { perror("mount src dir failed"); goto fail; } } fprintf(stdout, "root directory for container is %s/%s, init task %s\n", root, container->rootfs, container->exec.argv[0]); sprintf(oldroot, "%s/%s/.oldroot", root, container->rootfs); if (hyper_mkdir(oldroot) < 0) { perror("make oldroot directroy failed"); goto fail; } if (mount("/", oldroot, NULL, MS_BIND|MS_REC, NULL) < 0) { perror("bind oldroot failed"); goto fail; } /* reuse oldroot array */ sprintf(oldroot, "%s/%s/", root, container->rootfs); /* pivot_root won't work, see * Documention/filesystem/ramfs-rootfs-initramfs.txt */ chroot(oldroot); chdir("/"); if (container_setup_volume(container) < 0) { fprintf(stderr, "container sets up voulme failed\n"); goto fail; } if (container_setup_mount(container) < 0) { fprintf(stderr, "container sets up mount failed\n"); goto fail; } if (container_setup_sysctl(container) < 0) { fprintf(stderr, "container sets up sysctl failed\n"); goto fail; } if (container_setup_dns(container) < 0) { fprintf(stderr, "container sets up dns failed\n"); goto fail; } if (container_setup_workdir(container) < 0) { fprintf(stderr, "container sets up work directory failed\n"); goto fail; } container_unmount_oldroot("/.oldroot"); fflush(stdout); if (container_setup_tty(arg->pipe[1], container) < 0) { fprintf(stdout, "setup tty failed\n"); goto fail; } symlink("/proc/self/fd", "/dev/fd"); symlink("/proc/self/fd/0", "/dev/stdin"); symlink("/proc/self/fd/1", "/dev/stdout"); symlink("/proc/self/fd/2", "/dev/stderr"); execvp(container->exec.argv[0], container->exec.argv); perror("exec container command failed"); _exit(-1); fail: hyper_send_type(arg->pipe[1], ERROR); _exit(-1); }
static int hyper_container_init(void *data) { struct hyper_container_arg *arg = data; struct hyper_container *container = arg->c; char root[512], oldroot[512]; fprintf(stdout, "%s in\n", __func__); if (container->exec.argv == NULL) { fprintf(stdout, "no cmd!\n"); goto fail; } if (hyper_rescan_scsi() < 0) { fprintf(stdout, "rescan scsi failed\n"); goto fail; } if (container_setup_env(container) < 0) { fprintf(stdout, "setup env failed\n"); goto fail; } if (mount("", "/", NULL, MS_SLAVE|MS_REC, NULL) < 0) { perror("mount SLAVE failed"); goto fail; } if (mount("", "/", NULL, MS_PRIVATE|MS_REC, NULL) < 0) { perror("mount PRIVATE failed"); goto fail; } sprintf(root, "/tmp/hyper/%s/root/", container->id); if (hyper_mkdir(root) < 0) { perror("make root directroy failed"); goto fail; } fprintf(stdout, "container root directory %s\n", root); if (container->fstype) { char dev[128]; sprintf(dev, "/dev/%s", container->image); fprintf(stdout, "device %s\n", dev); if (mount(dev, root, container->fstype, 0, NULL) < 0) { perror("mount device failed"); goto fail; } } else { char path[512]; sprintf(path, "/tmp/hyper/shared/%s/", container->image); fprintf(stdout, "src directory %s\n", path); if (mount(path, root, NULL, MS_BIND, NULL) < 0) { perror("mount src dir failed"); goto fail; } } fprintf(stdout, "root directory for container is %s/%s, init task %s\n", root, container->rootfs, container->exec.argv[0]); hyper_list_dir(root); sprintf(oldroot, "%s/%s/.oldroot", root, container->rootfs); if (hyper_mkdir(oldroot) < 0) { perror("make oldroot directroy failed"); goto fail; } if (mount("/", oldroot, NULL, MS_BIND|MS_REC, NULL) < 0) { perror("bind oldroot failed"); goto fail; } /* reuse oldroot array */ sprintf(oldroot, "%s/%s/", root, container->rootfs); /* pivot_root won't work, see * Documention/filesystem/ramfs-rootfs-initramfs.txt */ chroot(oldroot); chdir("/"); if (container_setup_volume(container) < 0) { fprintf(stderr, "container sets up voulme failed\n"); goto fail; } if (container_setup_mount(container) < 0) { fprintf(stderr, "container sets up mount ns failed\n"); goto fail; } if (container_setup_workdir(container) < 0) { fprintf(stderr, "container sets up work directory failed\n"); goto fail; } container_unmount_oldroot("/.oldroot"); fflush(stdout); if (container_setup_tty(arg->pipe[1], container) < 0) { fprintf(stdout, "setup tty failed\n"); goto fail; } close(arg->pipe[0]); close(arg->pipe[1]); execvp(container->exec.argv[0], container->exec.argv); _exit(-1); fail: container->exec.code = -1; hyper_send_type_block(arg->pipe[1], ERROR, 0); _exit(-1); }