ESXi上でCentOS7をインストールした場合、open-vm-toolsをインストールされていても「CentOS6」だと言われてしまう件について調査した。
なお、何故かvCenter上から見た場合は警告されず、直接ESXi上で仮想マシンを見た際にだけ言われる。
結論めいたこと
open-vm-toolsのバグ(Fix CentOS 7.6 detection)で、open-vm-tools 10.3.10以降で修正されている。
しかし、2019/06/27時点でのCentOS7のopen-vm-toolsは10.2.5であり修正されていないバージョンであるため公式な手法では対処できない。
回避策としては2つある
/etc/centos-release を修正する
今回のバグは「CentOS Linux release 7.6.1810 (Core)」の文字列からOSバージョン判定をする際に「”6.”があればCentOS6」「”7.”があればCentOS7」「”8.”があればCentOS8」という順番で行っているせいで、「7.6.1810」の中にある「6.」を読み取ってしまい「CentOS6」と判定されていることにより発生している。
このため、/etc/centos-release 内の誤判定要素を無くすことで対処できなくもない。
例えば「 CentOS Linux release 7.6 1810 (Core) 」と、「.」を抜いてしまうとか。
ただ、このファイルは他のソフトウェアでもディストリビューション判別に使用されており、そこでの条件の書き方によっては正しく判定できなくなってしまう恐れもあるため、注意が必要である。
もしくはCentOS 7.7以降ではれば、「6.」に引っかかることがなくなるので、アップデートする、という手もとれる。
vSphere仮想マシンオプションのゲストOSを修正する
vSphere6.5以降(仮想マシンバージョン13以降)でCentOS7を使用する場合、仮想マシンオプションで「ゲストOS:Linux」と「ゲストOSのバージョン:CentOS 7(64ビット)」を設定する。
誤判定で「CentOS 6(64ビット)」と認識されているんだったら、仮想マシンオプションの「ゲストOSのバージョン」も「CentOS 6 (64ビット)」にしちゃえばいいじゃん。
という非常に雑な対応手法。
なんでこんなことに
githubにあるopen-vm-toolsのソースコードからopen-vm-tools/open-vm-tools/lib/misc/hostinfoPosix.c を見てみるとひたすら条件が列挙されている。
いままではバージョン表記の中に「.」が2個登場するという想定が無かったようで、Debianでも同様の手法で判定しています。
今回のCentOSでの対応は、いままで「6.」をキーにしていたものを「 6.」と数字の前にスペースが入っていることを検出するようにした、というものになっている。
個人的に結構意外だったのはRedHat Enterprise LinuxとCentOSの判定ルーチンが独立しているという点。
if (strstr(distroLower, "red hat")) {
if (strstr(distroLower, "enterprise")) {
/*
* Looking for "release x" here instead of "x" as there could be
* build version which can be misleading. For example Red Hat
* Enterprise Linux ES release 4 (Nahant Update 3)
*/
int release = 0;
char *releaseStart = strstr(distroLower, "release");
if (releaseStart != NULL) {
sscanf(releaseStart, "release %d", &release);
if (release > 0) {
snprintf(distroShort, distroShortSize, STR_OS_RED_HAT_EN"%d",
release);
}
}
if (release <= 0) {
Str_Strcpy(distroShort, STR_OS_RED_HAT_EN, distroShortSize);
}
} else {
Str_Strcpy(distroShort, STR_OS_RED_HAT, distroShortSize);
}
}
} else if (StrUtil_StartsWith(distroLower, "centos")) {
if (strstr(distroLower, " 6.")) {
Str_Strcpy(distroShort, STR_OS_CENTOS6, distroShortSize);
} else if (strstr(distroLower, " 7.")) {
Str_Strcpy(distroShort, STR_OS_CENTOS7, distroShortSize);
} else if (strstr(distroLower, " 8.")) {
Str_Strcpy(distroShort, STR_OS_CENTOS8, distroShortSize);
} else {
Str_Strcpy(distroShort, STR_OS_CENTOS, distroShortSize);
}
}
そして、Oracle LinuxはCentOSと同様の記載になっているという点。
} else if (StrUtil_StartsWith(distroLower, "enterprise linux") ||
StrUtil_StartsWith(distroLower, "oracle")) {
/*
* [root@localhost ~]# lsb_release -sd
* "Enterprise Linux Enterprise Linux Server release 5.4 (Carthage)"
*
* Not sure why they didn't brand their releases as "Oracle Enterprise
* Linux". Oh well. It's fixed in 6.0, though.
*/
if (strstr(distroLower, "6.")) {
Str_Strcpy(distroShort, STR_OS_ORACLE6, distroShortSize);
} else if (strstr(distroLower, "7.")) {
Str_Strcpy(distroShort, STR_OS_ORACLE7, distroShortSize);
} else if (strstr(distroLower, "8.")) {
Str_Strcpy(distroShort, STR_OS_ORACLE8, distroShortSize);
} else {
Str_Strcpy(distroShort, STR_OS_ORACLE, distroShortSize);
}
}
Oracle Linux 7の /etc/oracle-release の表記はどういう風になってるんだろうかな・・・