前言
我在實驗進入linux系統啟動xwindow server而不啟動KDE GNOME等桌面系統時遇到的問題。只啟動x server而不啟動桌面系統,在xserver之上運行一個全屏的圖形界面程序,這樣就能實現該程序對顯示器的獨占,對一般用戶來說他就不能在這台電腦上搞別的動作了,只能用這個程序。一些工業控制、超市收銀等應用場景下都會有這樣的需求,目前這些程序都運行在windows xp (embeded)之下,也有運行於dos的。由於windows xp太被大眾熟悉了,結果這些軟件便不能穩定的運行了。windows也無法實現應用對窗口的獨占,桌面系統是在windows內核實現的,不能說不啟動桌面系統,只要啟動了桌面系統,桌面上的窗口都可以關掉或者干到后台去。
實現這種圖形界面程序對顯示器的獨占,還有另外一種方式——不啟動x server,而啟動系統的framebuffer能力;使用一種支持在framebuffer上實現圖形界面的圖形庫來開發這種程序。通過調研的結果來看,qt 4.6及之后就能夠做到了。但是framebuffer不能夠支持調用顯卡的運算能力進行圖形的渲染,framebuffer只是內存上划出來的一片區域,對應着顯示器上的每一個邏輯像素,只能通過CPU執行指令修改framebuffer然后直接就能反應到顯示器上。linux下還有另外一種技術DirectFB,其介紹說能夠利用GPU進行加速主要應用於嵌入式環境,不知道能不能夠編譯到X86上使用?
(PS:對於xwindow 和KDE GNOME這些桌面系統關系的理解,很多人都是錯誤的。可以參考一下http://www.cnblogs.com/sunsonbaby/archive/2004/08/26/36683.html)
由於滿足上述應用場景采用不啟動x server的方法非常有難度,所以先試驗了只啟動x server不啟動桌面系統的方法。結果編輯啟動配置以便不進入桌面系統時失敗了,卡在進入桌面系統哪里動不了,只好切入到命名模式。但是分辨率只有800*600,漢字還不能顯示,實在是郁悶。勉強把進入桌面系統的配置恢復后,開始解決這個分辨率低,不支持中文的問題。
在linux中一切都是文件,如果linux啟動時支持framebuffer的,必須划出一片內存,虛擬一個文件fb0。估計是因為要降低對資源的消耗,ubuntu默認沒有開啟framebuffer。
第一步,查看顯卡支持的模式
使用hwinfo,如果沒有先安裝。
sudo apt-get install hwinfo
安裝之后就可以使用下面的命令查看顯卡支持的模式了。
sudo hwinfo --framebuffer
其實你安裝ubuntu時如果沒有按照顯卡驅動會提示安裝的,一般驅動都是安裝好的。其他的指導還說要安裝v86d,這個得看具體請看來定,如果查看模式沒得結果再安裝也不遲。
sudo apt-get install v86d
第二步,選擇一個模式設置啟動項
我的電腦查看模式之后會有下面這個模式,分辨率最高,色彩最高16位,就選擇這個。
Mode 0x0317: 1024x768 (+2048), 16 bits
然后編輯文件/etc/default/grub,找到下面的項目,改成下面一樣的。其實就是在后面增加了vga=0x0317。
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash vga=0x0317"
第三步,設置initramfs支持framebuffer
編輯文件/etc/initramfs-tools/modules,在其后加入行
fbcon
vesafb
vga16fb
(為毛要加這三個,估計也是大家相互抄。有空可以驗證一下只加vesafb是否可以。)
編輯文件/etc/modprobe.d/blacklist-framebuffer.conf,注釋掉出現上面內容的blacklist。
#blacklist fbcon
#blacklist vesafb
#blacklist vga16fb
(vga vesa con都是老顯卡模式標准,現在的顯卡能支持一種就不錯了。)
第四步,跟新grub和initramfs
執行下面的指令。
sudo update-grub sudo update-initramfs -u
第五步,將需要在命令模式下使用的用戶加入video組
這個好多方法的,很多命令都能完成這個功能。直接去改/etc/group文件也可以,但是不推薦。
sudo adduser your_name video
有了上面四步,重啟系統再進入命名模式,就會發現分辨率已經提高了。我的電腦到這一步已經可以支持中文顯示了。 因為我按照ubuntu之后就按照了漢語的語言包。
有的教程一開始就讓安裝fbterm。這個沒必要,不用中文輸入的話,就可以不用安裝這個。需要中文輸入的話,是否能不需要fbterm直接實現,我也沒調研,暫時沒這個需求。以后有需求的時候再寫博客。
剩余的話
initramfs是個什么玩意?我也是個新手,就我的查找到資料和我的理解,它是對系統啟動時預先分配出來的內存的一種管理技術。linux中一切資源都是文件,那么系統啟動時預先分配的內存也是文件,當作文件管理,就要為其提供進行存儲空間分配的文件系統,initramfs就是這樣一種文件系統。
