OpenVZ 仮想化で VPS を購入し、Debian ゲスト OS を有効にしました。
ゲスト/boot
ディレクトリが空です。/etc/inittab
空です。
OSの初期化プロセスはどのように実行されますか?
reboot
OpenVZ コンテナーの意味は何ですか?
OpenVZ 仮想化で VPS を購入し、Debian ゲスト OS を有効にしました。
ゲスト/boot
ディレクトリが空です。/etc/inittab
空です。
OSの初期化プロセスはどのように実行されますか?
reboot
OpenVZ コンテナーの意味は何ですか?
調査の後vzctl
、ここで実行される開始/停止に関する主な仕事としてツールを複製します:
git clone https://github.com/OpenVZ/vzctl.git
git clone https://github.com/OpenVZ/libvzctl.git
vzctl
https://github.com/OpenVZ/libvzctl/blob/master/lib/env.c#L783libvzctl
を見つけることができる場所を使用します:
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, ¶m->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による停止:
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
、いくつかのチェック (システムが既に実行されているかマウントされているか、ファイルが存在するかなど) を行い、必要に応じて停止し、fs をマウントし、chroot の分離された類似物を作成して do を実行します/sbin/init
。
結論OpenVZ はゲスト OS から // を使用せずgrub
、linux-image
次initrd
の中で最初に見つけたものを直接呼び出します。
"/sbin/init"
"/etc/init"
"/bin/init"
ゲストOSで。停止するには、次のいずれかを使用します
halt
init 0
reboot
ゲストOSから。コンテナーの初期化 (セキュリティ、分離、マウントなど) は、ゲスト OS の起動プロセスのユーザーの観点からは重要ではありません。