就我而言,我需要每天从一个单独的文件系统中启动一个进程,该文件系统的根目录位于子目录中。因为它是文件系统上唯一需要卸载的东西。
另一个问题是我无法执行fork()
/ clone()
进程,因为它在特权环中运行。
我想到了以下解决方案:
char *argv [] = {"/path2/sbin/the_program_to_be_launched","-option","value of option",NULL};
char *envp [] = {"HOME=/","SHELL=no_shell_available","LC_ALL=C",NULL};
mount(name, "/path/", fs, flags, data);
chroot("/path/");
execve("/path2/sbin/the_program_to_be_launched",argv,envp); // would not work because the program won’t be able find his libraries
umount("/"); // would never be called if execve() would have been called correctly
这样的事情如果不执行该过程将无法正常工作。
mount(name, "/path/", fs, flags, data);
chroot("/path/path2/"):
umount("/"); // would not work since "/" is not the root of the device.
那么,如何在不更改父进程之一的情况下启动具有不同根目录的其他子进程呢?
最佳答案
crom可以启动可启动实际程序的shell脚本。
在Linux中,“ /”目录是所有文件系统的根目录。因此,您绝对不希望卸下它。请阅读有关安装/卸载的手册页。
您可以在fstab中为用户可挂载的文件系统放置一个适当的条目。然后安装/卸载它会相对简单。
您可以创建一个“受限”用户,脚本可以登录/注销。
该用户可以用来运行目标程序并执行安装/卸载操作。
由crom运行的shell可以执行所有CD,等等
使应用程序能够执行而不会看到其“库”,或者将其链接为“静态”。可能是用户的.profile包含$ PATH变量的开发,以包含库的路径。
用户的登录名可以使用busybox的版本,该版本仅包含用户运行目标程序所需的命令。