■ 新疆 馬小川
編者按:本文通過(guò)對(duì)虛擬機(jī)語(yǔ)言環(huán)境參數(shù)配置不當(dāng)造成的軟件系統(tǒng)故障問(wèn)題的解決和分析,介紹了分析了出現(xiàn)問(wèn)題的原因,字符編碼的知識(shí),以及語(yǔ)言環(huán)境配置文件i18n的相關(guān)知識(shí)。
VMware Workstation是一款功能強(qiáng)大的桌面虛擬計(jì)算機(jī)軟件,可以提供用戶(hù)在單一的桌面上同時(shí)運(yùn)行不同的操作系統(tǒng)。筆者一直需要使用該軟件虛擬Linux操作系統(tǒng)服務(wù)器進(jìn)行一些軟件測(cè)試工作。但最近發(fā)現(xiàn),之前一直使用的Linux虛擬機(jī)出現(xiàn)了問(wèn)題。
圖1 報(bào)錯(cuò)對(duì)話框
虛擬機(jī)系統(tǒng)啟動(dòng)過(guò)程都是正常的,但在登錄輸入密碼 后,VMware Workstation軟件會(huì)彈出報(bào)錯(cuò)對(duì)話框,錯(cuò) 誤 內(nèi) 容 為“VMware Workstation不可恢復(fù)錯(cuò)誤(vmui):MEM_ALLOC”, 以及錯(cuò)誤日志存放在何處等信息,如圖1所示。將對(duì)話框進(jìn)行確定后,VMware Workstation軟件界面消失,無(wú)法進(jìn)行操作。
筆者使用的計(jì)算機(jī)操作系統(tǒng)為Windows 10,虛擬機(jī)軟件是VMware Workstation 8.0,linux虛擬機(jī)系統(tǒng)為Centos 6.0。在重裝VMware Workstation軟件后,該問(wèn)題依然存在。但發(fā)現(xiàn)通過(guò)SecureCRT等連接工具卻可以訪問(wèn)Linux虛擬機(jī),說(shuō)明該Linux虛擬機(jī)程序還在計(jì)算機(jī)后臺(tái)運(yùn)行。
VMware Workstation軟件提示的報(bào)錯(cuò)信息是MEM_ALLOC,是 內(nèi) 存分配方面的報(bào)錯(cuò)。難道是Linux虛擬機(jī)分配的內(nèi)存不足造成的嗎?嘗試將虛擬機(jī)內(nèi)存從1GB重新分配為2GB,該問(wèn)題依然存在。因此并不是內(nèi)存不足造成的問(wèn)題。
該報(bào)錯(cuò)信息是在Linux虛擬機(jī)系統(tǒng)正常登錄以后立刻出現(xiàn)的。而通過(guò)SecureCRT等連接工具能夠訪問(wèn)Linux虛擬機(jī),因此可以猜測(cè)在Linux虛擬機(jī)使用命令行界面模式時(shí)應(yīng)該不會(huì)出現(xiàn)報(bào)錯(cuò)。于是在SecureCRT中使用“init 3”命令,并重啟虛擬機(jī)后,發(fā)現(xiàn)Linux虛擬機(jī)在命令行界面模式下能夠正常登錄和運(yùn) 行,VMware Workstation軟件無(wú)報(bào)錯(cuò)信息出現(xiàn)。于是可以基本排除Linux虛擬機(jī)系統(tǒng)本身存在問(wèn)題。出現(xiàn)的錯(cuò)誤應(yīng)該是與Linux虛擬機(jī)在圖形界面模式下的登錄有關(guān)。
仔細(xì)檢查L(zhǎng)inux虛擬機(jī)在圖形界面下的登錄界面,發(fā)現(xiàn)在登錄界面下方的語(yǔ)言欄是“漢語(yǔ)(中國(guó))[gb18030]”。 通 過(guò) 語(yǔ)言欄的下拉菜單,將語(yǔ)言改 為“English (United States)”,登錄后發(fā)現(xiàn)虛擬機(jī)在圖形界面下運(yùn)行正常,沒(méi)有任何報(bào)錯(cuò)信息。虛擬機(jī)恢復(fù)正常,該問(wèn)題被解決。
由此可以發(fā)現(xiàn)VMware Workstation軟件出現(xiàn)的報(bào)錯(cuò)問(wèn)題,竟然和虛擬機(jī)的語(yǔ)言環(huán)境設(shè)置有關(guān)系。
原來(lái)筆者使用的Linux虛擬機(jī)的系統(tǒng)是一直英文的。之前由于要測(cè)試中文頁(yè)面,于是在/etc/sysconfig/i18n中修改了語(yǔ)言配置,將其中的LANG參數(shù)設(shè)置為漢字字符集“zh_CN.GB18030”,在修改配置后,筆者就沒(méi)有使用過(guò)該虛擬機(jī)。而最近再次使用,就出現(xiàn)了報(bào)錯(cuò)信息。
因此可以確定造成報(bào)錯(cuò)的原因,是筆者在Linux虛擬機(jī)系統(tǒng)中將i18n文件的LANG參數(shù)設(shè)置為漢字字符 集”zh_CN.GB18030”后,系統(tǒng)的中文配置和VMware Workstation軟件出現(xiàn)了沖突,造成了出現(xiàn)報(bào)錯(cuò)信息,以及軟件圖形界面消失。
使 用“zh_CN.GB18030”字符集會(huì)出現(xiàn)沖突,那么其他漢字字符集也會(huì)產(chǎn)生沖突嗎?筆者又測(cè)試了“zh_CN.GB2312”等漢字字符集,虛擬機(jī)也出現(xiàn)了相同的問(wèn)題。但配置為“zh_CN.UTF-8”字符集,虛擬機(jī)卻能運(yùn)行正常,系統(tǒng)的中文語(yǔ)言顯示也都正常。
那么為什么使用漢字字符 集“zh_CN.UTF-8”虛 擬機(jī)軟件和系統(tǒng)就能正常的運(yùn)行,而同為漢字字符集的“zh_CN.GB18030” 和“zh_CN.GB2312”就會(huì)出現(xiàn)報(bào)錯(cuò)信 息?!皕h_CN.GB18030”、“zh_CN.GB2312” 與“zh_CN.UTF-8”究竟有什么不同呢?
想了解它們的區(qū)別,要從字符編碼的歷史說(shuō)起。
計(jì)算機(jī)的底層語(yǔ)言是直接存儲(chǔ)和處理二進(jìn)制數(shù)字的。計(jì)算機(jī)要準(zhǔn)確的處理各種字符集文字,就需要進(jìn)行字符編碼,以便計(jì)算機(jī)能夠識(shí)別和存儲(chǔ)各種文字。ASCII碼是最基礎(chǔ)的標(biāo)準(zhǔn)單字節(jié)字符編碼方案,由于標(biāo)準(zhǔn)的ASCII編碼能夠包含的字符數(shù)目有限,為了擴(kuò)充ASCII編碼,以用于顯示本國(guó)的語(yǔ)言,不同的國(guó)家和地區(qū)制定了不同的標(biāo)準(zhǔn)。GB2312編碼是ANSI編碼的一種,由于GB2312不能處理漢字繁體字等,于是就產(chǎn)生了GBK編碼,GBK編碼擴(kuò)充了GB2312編碼。
世界各國(guó)不同ANSI編碼之間互不兼容,當(dāng)信息在國(guó)際間交流時(shí),文本會(huì)出現(xiàn)亂碼。為了解決跨語(yǔ)言、跨平臺(tái)進(jìn)行文本轉(zhuǎn)換、處理的要求,國(guó)際組織制定了Unicode編碼。Unicode的編碼效率不高,為了提高Unicode編碼效率,于是出現(xiàn)了UTF-8、UTF-16等編碼方式。其中UTF-8在互聯(lián)網(wǎng)上使用最為廣泛,UTF-8編碼的文字可以在各國(guó)各種支持UTF-8字符集的瀏覽器上顯示。
UTF-8具備了更好的通用性。這也就是為什么在i18n文件中,使用zh_CN.UTF-8字符集,虛擬機(jī)不會(huì)報(bào)錯(cuò)。而使用其他漢
字字符集會(huì)報(bào)錯(cuò)的原因。
筆者遇到的問(wèn)題,是由于在Linux系統(tǒng)/etc/sysconfig/i18n中修改了相關(guān)配置而出現(xiàn)的。那么這個(gè)文件是起什么作用的呢?
“i18n”是國(guó)際化組織Openi18n提出的一套國(guó)際化解決方案,通過(guò)簡(jiǎn)單的配置就能適應(yīng)不同語(yǔ)言和地區(qū)的需求。本例中,筆者只是將/etc/sysconfig/i18n文件的LANG參數(shù)進(jìn)行了修改,就使得Liunx的語(yǔ)言環(huán)境發(fā)生了改變,系統(tǒng)的語(yǔ)言環(huán)境從英文改變?yōu)橹形?。在Centos 6.0系統(tǒng)中,默認(rèn)的i18n文件非常簡(jiǎn)單,只有LANG參數(shù)和SYSFONT兩個(gè)配置參數(shù)。其中LANG參數(shù)選擇字符集配置系統(tǒng)的語(yǔ)言環(huán)境,SYSFONT參數(shù)配置系統(tǒng)字體。
例如i18n文件配置如下:
LANG=”zh_CN.UTF-8”
SYSFONT=”latarcyrhebsun16”
那么這個(gè)配置,就是要求系統(tǒng)的語(yǔ)言環(huán)境為zh_CN(簡(jiǎn)體中文)、UTF-8編碼、latarcyrheb-sun16字體。