xref: /kvmtool/guest/init.c (revision 282113fd5168ea00fa06f7581bf958eb02c8cca7)
1*282113fdSPekka Enberg /*
2*282113fdSPekka Enberg  * This is a simple init for shared rootfs guests. It brings up critical
3*282113fdSPekka Enberg  * mountpoints and then launches /bin/sh.
4*282113fdSPekka Enberg  */
5*282113fdSPekka Enberg #include <sys/mount.h>
6*282113fdSPekka Enberg #include <string.h>
7*282113fdSPekka Enberg #include <unistd.h>
8*282113fdSPekka Enberg #include <stdio.h>
9*282113fdSPekka Enberg #include <errno.h>
10*282113fdSPekka Enberg 
11*282113fdSPekka Enberg static int run_process(char *filename)
12*282113fdSPekka Enberg {
13*282113fdSPekka Enberg 	char *new_argv[] = { filename, NULL };
14*282113fdSPekka Enberg 	char *new_env[] = { NULL };
15*282113fdSPekka Enberg 
16*282113fdSPekka Enberg 	return execve(filename, new_argv, new_env);
17*282113fdSPekka Enberg }
18*282113fdSPekka Enberg 
19*282113fdSPekka Enberg static void do_mounts(void)
20*282113fdSPekka Enberg {
21*282113fdSPekka Enberg 	mount("hostfs", "/host", "9p", MS_RDONLY, "trans=virtio,version=9p2000.L");
22*282113fdSPekka Enberg 	mount("", "/sys", "sysfs", 0, NULL);
23*282113fdSPekka Enberg 	mount("proc", "/proc", "proc", 0, NULL);
24*282113fdSPekka Enberg 	mount("devtmpfs", "/dev", "devtmpfs", 0, NULL);
25*282113fdSPekka Enberg }
26*282113fdSPekka Enberg 
27*282113fdSPekka Enberg int main(int argc, char *argv[])
28*282113fdSPekka Enberg {
29*282113fdSPekka Enberg 	puts("Mounting...");
30*282113fdSPekka Enberg 
31*282113fdSPekka Enberg 	do_mounts();
32*282113fdSPekka Enberg 
33*282113fdSPekka Enberg 	puts("Starting '/bin/sh'...");
34*282113fdSPekka Enberg 
35*282113fdSPekka Enberg 	run_process("/bin/sh");
36*282113fdSPekka Enberg 
37*282113fdSPekka Enberg 	printf("Init failed: %s\n", strerror(errno));
38*282113fdSPekka Enberg 
39*282113fdSPekka Enberg 	return 0;
40*282113fdSPekka Enberg }
41