С OpenVZ вы назначаете имя хоста VE (среди прочего) от хост-узла (HN), используя vzctl set CTID --hostname myhost --save
. Затем он устанавливает это в /etc/vz/conf/CTID.conf
. Во время запуска VE файл для конкретного дистрибутива в /etc/vz/dists
консультируется, содержащий указатели на файлы в /etc/vz/dists/scripts
. Это скрипты для конкретного дистрибутива для редактирования файлов конфигурации VE, например, если 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
, пока он, наконец, не найдет файл с именем arch.conf
указатели на скрипты для обновления файлов конфигурации Arch.