出于安全考虑,一些提供服务的虚拟机只开放服务端口,其他所有端口关闭,包括管理端口。我们遇见这样一个场景,用户搭建一个Web服务器在上,除80端口外关闭一切其他端口;如果要维护该虚拟服务器,管理员只能通过vSphere Client或者Web Client打开虚拟机控制台进行操作。而该虚拟机运行了操作系统,除命令行外也没有图形界面,不巧的是服务软件被封装,操作界面全部是中文的,在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 chineseii ttf-arphic-bsmi00lp 2.10-8 "AR PL Mingti2L Big5" Chinese TrueType font by Arphic Technologyii ttf-arphic-gbsn00lp 2.11-9 "AR PL SungtiL GB" Chinese TrueType font by Arphic Technologyii ttf-arphic-gkai00mp 2.11-8 "AR PL KaitiM GB" Chinese TrueType font by Arphic Technologyii ttf-arphic-ukai 0.2.20080216.1-1 "AR PL UKai" Chinese Unicode TrueType font collection Kaiti styleii ttf-arphic-uming 0.2.20080216.1-3 "AR PL UMing" Chinese Unicode TrueType font collection Mingti styleii xfonts-intl-chinese 1.2.1-8 International fonts for X -- Chineseii 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-83. 安装下面任意一款支持CJK的终端软件。CJK是中国、日本、韩国的英文首字母合成。# apt-get install fbterm jfbterm zhconii fbterm 1.6-2 A fast framebuffer based terminal emulator for Linuxii jfbterm 0.4.7-8 multilingual terminal on Linux framebufferii zhcon 1:0.2.6-6.1 A Fast Console CJK System Using FrameBuffer4. 安装framebuffer内核模块的依赖包。下面是安装好的包列表。# apt-get install v86d# dpkg -l | grep v86dii v86d 0.1.9-1 daemon to run x86 code in an emulated environment5. 装载framebuffer内核模块, 当然前提是发行版已经编译好了,通常以模块形式存在。否则需要自己配置重编译内核。装载命令:# modprobe uvesafb检查命令1:# lsmod | grep uvesafbvmuser@debian:~$ lsmod | grep uvesafbuvesafb 17548 2cn 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 device6. 运行在第二步中安装的支持CJK的终端软件# fbterm7. 这时就可以看简体中文了,使用命令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 contribdeb http://mirrors.163.com/debian-security squeeze/updates main contrib non-freedeb-src http://mirrors.163.com/debian squeeze main non-free contribdeb-src http://mirrors.163.com/debian-security squeeze/updates main contrib non-free