【发布时间】:2012-07-10 13:45:44
【问题描述】:
一个正在运行的 C 程序如何检测它是否在 illumos/solaris 上的“chroot”中运行?
有一个 Debian 实用程序 [1] 在 linux、freebsd、hurd 上使用了一些技巧。
如何在 illumos/solaris 上做到这一点?
【问题讨论】:
-
在其他平台上可以检测到它的事实似乎是错误的。如果没有超级用户权限,它可能根本不应该以编程方式检测到。
一个正在运行的 C 程序如何检测它是否在 illumos/solaris 上的“chroot”中运行?
有一个 Debian 实用程序 [1] 在 linux、freebsd、hurd 上使用了一些技巧。
如何在 illumos/solaris 上做到这一点?
【问题讨论】:
this thread on comp.unix.solaris 详细介绍了确定 Solaris 是在区域(容器/chroot-on-lots-of-steroids)还是虚拟机内运行的各种方法。特别广泛的是the list in this posting(似乎来自this blog post。我将在这里重新创建一些与区域相关的项目——那些非root用户可以使用的项目。
/usr/bin/zonename 命令告诉您一些不同于“全局”的内容sched,但在区域内称为zsched。 prstat 命令(类似于其他 UN*Xes 上的 top)具有 -z / -Z 命令行选项,可将报告限制在特定区域 (-z) 或提供所有区域的统计信息 ( -Z);在区域内,这些选项不起作用/仅显示您正在运行的区域。希望能有所帮助。
【讨论】:
我是这样用的:
#elif defined (__sun__)
/* Similar to Linux
* XXX: check zone?
* XXX: illumos kernel automatically mounts /proc on boot
*/
static int ischroot()
{
struct stat st1, st2;
if (stat("/", &st1))
return 2;
if (stat("/proc/1/root", &st2))
return 2;
if ((st1.st_dev == st2.st_dev) && (st1.st_ino == st2.st_ino))
return 1;
return 0;
}
#else
【讨论】: