OpenVZ如何知道VE的分布

使用OpenVZ,您可以使用vzctl set CTID --hostname myhost --save从主机节点(HN)分配VE的主机名(等等)。 然后在/etc/vz/conf/CTID.conf设置它。 在VE启动过程中,会查询/etc/vz/dists特定于分发的文件,其中包含指向/etc/vz/dists/scripts文件的指针。 这些是用于编辑VE的configuration文件的特定于发行版的脚本,例如,如果VE使用Debian或Ubuntu,则主机名写入/etc/hostname 。 例如,IP地址也是如此。

我现在的问题是:OpenVZ如何知道/etc/vz/dists哪个文件要使用? 它以某种方式从模板名称派生出分布名称吗?

看看vzctl的来源,我想出了它是如何工作的。 它实际上是从模板的名称派生出名字。 在启动VE时,在某个时候调用lib/dist.c一个方法:

 static int get_dist_conf_name(char *dist_name, char *dir, char *file, int len) { char buf[256]; char *ep; if (dist_name != NULL) { snprintf(buf, sizeof(buf), "%s", dist_name); ep = buf + strlen(buf); do { snprintf(file, len, "%s/%s.conf", dir, buf); if (stat_file(file)) return 0; while (ep > buf && *ep != '-') --ep; *ep = 0; } while (ep > buf); [...] } 

在那里,它从名称的末尾删除以短划线分隔的部分,每次都在寻找一个匹配。 我所看到的模板是arch-2010.05-x86_64-minimal ,所以在这里首先尝试arch-2010.05-x86_64-minimal.conf ,然后是arch-2010.05-x86_64.conf ,然后是arch-2010.05.conf ,直到它终于find一个名为arch.conf的文件持有指向脚本的指针,用于更新Arch的configuration文件。