出于安全考虑,一些提供服务的虚拟机只开放服务端口,其他所有端口关闭,包括管理端口。我们遇见这样一个场景,用户搭建一个Web服务器在Linux上,除80端口外关闭一切其他端口;如果要维护该虚拟服务器,管理员只能通过vSphere Client或者Web Client打开虚拟机控制台进行操作。而该虚拟机运行了Linux操作系统,除命令行外也没有图形界面,不巧的是服务软件被封装,操作界面全部是中文的,在Linux控制台里没法正常显示,全部乱码。


我们做了以下测试能够正确显示中文:


A. 如果在Linux图形界面里运行命令行终端程序能够正确显示中文,如图显示。


B. 如果使用putty等软件通过ssh远程连接Linux,且字符编码使用UTF-8也是可以正常显示的,设置如图。



C. 但用户不允许运行sshd,不允许运行图形界面即X-Windows;需求是必须使用Linux命令行控制台,但控制台又没法直接加载显示中文字符,所以我们想到用framebuffer的机制以位图方式显示中文而不是直接显示中文字符的点阵。


Linux控制台显示中文需要使用framebuffer console。这需要内核支持framebuffer并且使用支持CJK的终端软件,比如fbterm, jfbterm, zhcon。在虚拟机环境下和在物理机条件下是一样的设置。下面以debian6为例说明步骤。

1. 安装debian6,安装中最好直接选择中文界面选择中文支持,这样可以把字库就安装进去了。 列表是我安装后的中文字库包,xfonts-*是X图形环境使用,可以不用装。

# dpkg -l | grep "font\|ttf" | grep -i chinese
ii  ttf-arphic-bsmi00lp                  2.10-8                            "AR PL Mingti2L Big5" Chinese TrueType font by Arphic Technology
ii  ttf-arphic-gbsn00lp                  2.11-9                            "AR PL SungtiL GB" Chinese TrueType font by Arphic Technology
ii  ttf-arphic-gkai00mp                  2.11-8                            "AR PL KaitiM GB" Chinese TrueType font by Arphic Technology
ii  ttf-arphic-ukai                      0.2.20080216.1-1                  "AR PL UKai" Chinese Unicode TrueType font collection Kaiti style
ii  ttf-arphic-uming                     0.2.20080216.1-3                  "AR PL UMing" Chinese Unicode TrueType font collection Mingti style
ii  xfonts-intl-chinese                  1.2.1-8                           International fonts for X -- Chinese
ii  xfonts-intl-chinese-big              1.2.1-8                           International fonts for X -- Chinese big

备注: 如果没有安装中文字库,使用下面命令安装

# apt-get install ttf-arphic-*


2. 检查环境变量locale设置成简体中文。

# env | grep "LANG\|LANGUAGE\|LC_ALL"

  LANG=zh_CN.UTF-8
  LANGUAGE=zh_CN:zh
  LC_ALL=zh_CN.UTF-8


3. 安装下面任意一款支持CJK的终端软件。CJK是中国、日本、韩国的英文首字母合成

# apt-get install fbterm jfbterm zhcon

ii  fbterm                               1.6-2                             A fast framebuffer based terminal emulator for Linux
ii  jfbterm                              0.4.7-8                           multilingual terminal on Linux framebuffer
ii  zhcon                                1:0.2.6-6.1                       A Fast Console CJK System Using FrameBuffer


4. 安装framebuffer内核模块的依赖包。下面是安装好的包列表。

# apt-get install v86d

# dpkg -l | grep v86d
ii  v86d                                 0.1.9-1                           daemon to run x86 code in an emulated environment


5. 装载framebuffer内核模块, 当然前提是发行版已经编译好了,通常以模块形式存在。否则需要自己配置重编译内核。

装载命令:
# modprobe uvesafb

检查命令1:
# lsmod | grep uvesafb
vmuser@debian:~$ lsmod | grep uvesafb
uvesafb                17548  2
cn                      3667  2 uvesafb

检查命令2:
# dmesg | grep fb
[   52.605692] uvesafb: VMware, Inc, VMware virtual machine, 2.0, OEM: V M ware, Inc. VBE support 2.0, VBE v2.0
[   52.608410] uvesafb: no monitor limits have been set, default refresh rate will be used
[   52.608512] uvesafb: VBE state buffer size cannot be determined (eax=0x0, err=0)
[   52.608522] uvesafb: scrolling: redraw
[   52.615151] uvesafb: framebuffer at 0xd8000000, mapped to 0xf8280000, using 4096k, total 4096k
[   52.615154] fb0: VESA VGA frame buffer device


6. 运行在第二步中安装的支持CJK的终端软件

# fbterm


7. 这时就可以看简体中文了,使用命令cat/vi等文本工具确认。

# cat chinese.txt


小结:

其实在Linux控制台显示中文的问题并不是在vSphere环境中才有发生,在物理机环境的默认配置下表现是一样的,中文乱码。由于现在有的用户其虚拟化整合比例已经很高,没有物理机直接奔跑Linux,加上使用ssh远程连接又能正确显示中文,所以很自然认为是vSphere的虚拟机控制台不能根据汉字编码正确解析中文。这个案例需要同时了解Linux有关语言字符集支持等相关知识,从多个角度、层面去分析和尝试从而找到解决办法,一味相信万能的vSphere并不能解脱我们。


再次归纳关键步骤:

1. 安装中文字库

2. 设置中文环境变量

3. 安装v86d模拟服务程序

4. 装载framebuffer 内核模块

5. 安装运行中文终端程序fbterm


其他:
国内可以使用下面的软件数据源安装:
deb http://mirrors.163.com/debian squeeze main non-free contrib
deb http://mirrors.163.com/debian-security squeeze/updates main contrib non-free
deb-src http://mirrors.163.com/debian squeeze main non-free contrib
deb-src http://mirrors.163.com/debian-security squeeze/updates main contrib non-free