首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenVZ如何引导操作系统?

问OpenVZ如何引导操作系统?
EN

Stack Overflow用户
提问于 2015-08-03 22:13:56
回答 2查看 712关注 0票数 0

我在OpenVZ虚拟化上购买了VPS,并启用了Debian。

来宾/boot dir是空的。/etc/inittab是空的。

如何执行OS初始化过程?

reboot对于OpenVZ容器的意义是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-04 21:03:50

经过研究,我克隆了vzctl工具作为启动/停止的主要工作在这里完成:

代码语言:javascript
复制
git clone https://github.com/OpenVZ/vzctl.git
git clone https://github.com/OpenVZ/libvzctl.git

vzctl使用libvzctl,您可以在那里找到https://github.com/OpenVZ/libvzctl/blob/master/lib/env.c#L783

代码语言:javascript
复制
int exec_init(struct start_param *param)
{
   char cid[STR_SIZE];
   char *argv[] = {"init", "-z", "      ", NULL};
   char *envp[] = {"HOME=/", "TERM=linux", cid, NULL};
   char **env;
   int errcode = 0;
   logger(1, 0, "Starting init");

   if (stat_file("/sbin/init") == 0 &&
                   stat_file("/ertc/init") == 0  &&
                   stat_file("/bin/init") == 0)
           errcode = VZCTL_E_BAD_TMPL;

   if (write(param->err_p[1], &errcode, sizeof(errcode)) == -1)
           logger(-1, errno, "exec_init: write(param->err_p[1]");

   snprintf(cid, sizeof(cid), "container="SYSTEMD_CTID_FMT, EID(param->h));
   env = makeenv(envp, &param->h->env_param->misc->ve_env);
   if (env == NULL)
           return VZCTL_E_NOMEM;

   execve("/sbin/init", argv, env);
   execve("/etc/init", argv, env);
   execve("/bin/init", argv, env);
   free_ar_str(env);
   free(env);

   return VZCTL_E_BAD_TMPL;
}

停止由https://github.com/OpenVZ/libvzctl/blob/master/lib/env.c#L103完成

代码语言:javascript
复制
int real_env_stop(int stop_mode)
{
  logger(10, 0, "* stop mode %d", stop_mode);
  close_fds(1, -1);
  /* Disable fsync. The fsync will be done by umount() */
  configure_sysctl("/proc/sys/fs/fsync-enable", "0");
  switch (stop_mode) {
  case M_HALT: {
          char *argv[] = {"halt", NULL};
          char *argv_init[] = {"init", "0", NULL};
          execvep(argv[0], argv, NULL);
          execvep(argv_init[0], argv_init, NULL);
          break;
  }
  case M_REBOOT: {
          char *argv[] = {"reboot", NULL};
          execvep(argv[0], argv, NULL);
          break;
  }
  case M_KILL:
          return syscall(__NR_reboot, LINUX_REBOOT_MAGIC1,
                  LINUX_REBOOT_MAGIC2,
                  LINUX_REBOOT_CMD_POWER_OFF, NULL);
  }
  return -1;
}

在调用/sbin/init vzctl之前,进行一些检查(如is系统已经运行或挂载,某些文件存在,等等),必要时停止运行,挂载fs,对chroot进行隔离模拟,并执行/sbin/init。

grub/linux-image/initrd 结论 OpenVZ不使用客户操作系统中的,直接调用其中的以下内容:

代码语言:javascript
复制
"/sbin/init"
"/etc/init"
"/bin/init"

在客人操作系统中。为了阻止它使用

代码语言:javascript
复制
halt
init 0
reboot

客人操作系统的。容器非用户化(安全性、隔离性、挂载等)从用户角度看对来宾OS引导过程不感兴趣。

票数 2
EN

Stack Overflow用户

发布于 2015-08-03 23:22:28

从本质上说,OpenVZ VPS作为它的沙箱进程树在主机系统中运行。因此,它没有自己的引导加载程序或内核,而且通常不会在/boot中有任何文件。

OpenVZ VPSes是通过让主机系统在一个特殊的环境中运行/bin/init来启动的,因此它与主机系统是隔离的,因此它认为自己是PID 1。我不完全确定细节,因为Parallels还没有详细记录它。

对于使用systemd init而不是SysV init的Linux系统来说,空的或缺失的SysV是正常的。Debian的当前版本默认使用systemd;此行为不特定于OpenVZ。

我不完全确定在reboot VPS中运行OpenVZ是如何工作的,但我认为主机内核必须对容器中的reboot()系统调用进行一些特殊处理,从而导致主机内核停止或重新启动容器,而不是整个系统。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31797657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档