歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 讓Linux開機進入字符界面的方法及設置FrameBuffer分辨率的方法

讓Linux開機進入字符界面的方法及設置FrameBuffer分辨率的方法

日期:2017/2/28 14:02:42   编辑:Linux教程

閱讀目錄

  • 引言
  • 讓Linux開機進入字符界面的方法
  • 設置FrameBuffer的分辨率的方法
  • 關於FrameBuffer和內核模塊
  • 總結

引言

  這個標題有點長,是為了在標題中就把問題說清楚,以便搜索引擎能夠把有需要的朋友准確地帶到我這裡來。目前在網絡上,很多關於Linux方面的知識是過時的和錯誤的。我標題中指出的兩個知識點就是其中的重災區。(這兩個知識點,在某寶的某幾個牛人合著的《Linux就是這個范兒》這本書中講的都是錯的。)

  先來說說開機進入字符界面的問題。網絡上的答案一邊倒的就是修改/etc/inittab文件,須不知,Fedora 系統和 Radhat Enterprise Linux 系統早就將 init 程序從 SysVinit 更換成了 systemd,雖然/etc/inittab文件還在,但是已經只具有提示意義了。而 Ubuntu 中更是根本就不存在/etc/inittab文件,而且 Ubuntu 中的運行級別的意義也和傳統的 RedHat Linux 不一樣,在 Ubuntu 中,運行級別 2\3\4\5 都是進入圖形界面。不要問我是怎麼知道的,後面我會講到。

  再來說說開啟 FrameBuffer 以及設置 FrameBuffer 分辨率的問題,網絡上的方法也是早就過時了。網絡上都說要開啟 FrameBuffer,需要先修改/etc/modprobe.d中的文件,以便加載 vesafb 內核模塊,還要修改 Grub 給 Linux 內核傳遞 vga=? 的參數。可實際上,目前的 Linux 版本早就默認加載 drm 驅動,自動開啟 FrameBuffer 了,根本就不存在開啟 FrameBuffer 這樣的說法。至於 vga=? 這樣的參數, Grub2 也是不支持的。那麼究竟怎樣才能設置 FrameBuffer 的分辨率呢?還是請大家閱讀後面的正文。

讓Linux開機進入字符界面的方法

  先來說 Ubuntu,我用過的從 Ubuntu 12.04 到現在的 Ubuntu 14.10 都可以用我下面所說的方法,至於更早的版本我沒用過我就不亂說了。Ubuntu 使用的 init 程序是屬於 Upstart 軟件包的,系統啟動後,運行 init 程序,然後運行/etc/init目錄下的腳本。系統啟動時,先運行/etc/init/rc-sysinit.conf,將該文件打開看一下,如下圖:

  從該文件中可以看出,如果存在/etc/inittab文件的話,它還是會解析該文件獲得默認運行級別的,否則就從 Grub 傳遞給內核的參數解析命令行級別。問題在於,它認為運行級別 2\3\4\5 是一樣的,對於想給內核傳遞一個 3 作為參數進入字符界面的夢想一下子就破滅了。不過沒關系,我們還可以從啟動 X 系統的顯示管理器入手,Ubuntu 使用的顯示管理器是 lightdm,正好/etc/init目錄下有一個lightdm.conf文件,打開看一下,如下圖:

  從該文件中很容易看出,它也解析傳遞給內核的參數,如果參數中有 text 的話,它就不啟動。那麼結論出來了,如果要讓 Ubuntu 啟動時自動進入字符界面,給它傳遞 text 參數即可。

  對於 Fedora 來說就簡單了,它的/etc/inittab文件還在,看一下該文件就可以得到提示,然後按照提示運行systemctl set-default multi-user.target即可讓系統開機進入字符界面,要恢復圖形界面,只需要運行systemctl set-default graphical.target命令即可。該方法在我使用的 Fedora 19、Fedora 20 和 Fedora 21 中均適用,更早的版本我沒用過就不知道了。如下圖:

設置FrameBuffer的分辨率的方法

  在舊系統中,如果進入純字符界面,界面的大小只有 80×25,當然是不夠用的啦,如果要在字符界面下繪圖啊、顯示中文啊什麼的那就更加不夠用了,所以需要另外打開 FrameBuffer。在新系統中,FrameBuffer 默認就是打開的,貌似不需要另外設置。但是很不幸,目前的顯示器分辨率太高了,想像一下在 1920×1080 的分辨率下使用字符界面時字體是多麼的小,再想像一下 4K 分辨率的屏幕呢。所以需要重新設置 FrameBuffer 的分辨率。

  新系統(比如這裡的 Fedora 19\20\21 以及 Ubuntu 12\13\14)是不能使用 vga=? 這樣的參數的。其實 vga=? 從來都不是內核支持的參數,只不過 Grub 會解析這個參數,然後以特殊的協議將它傳遞給內核而已。可惜,在新系統中,都用的是 Grub 的第 2 版了,Grub2 不支持 vga=? 這樣的參數。我是在閱讀了內核源代碼中的Documentation/kernel-parameters.txt後知道的。如下圖:

  然後根據該文檔中的說明,要設置 FrameBuffer 的分辨率,需要給內核傳遞 video=? 這樣的參數,該參數可以取什麼樣的值呢?再將Documentation/fb/modedb.txt文件打開看一下,如下圖:

回到頂部

關於FrameBuffer和內核模塊

  能否成功啟用 FrameBuffer 和硬件軟件都有關系,首先是顯卡需要支持 FrameBuffer,其次是要選擇合適的 FrameBuffer 驅動。我在前面講到現在較新的 Linux 發行版都是默認開啟 FrameBuffer 的,這一點也不是完全准確,因為總有意外。在我的筆記本電腦以及使用 Intel 集顯的 HP 工作站上,FrameBuffer 是默認打開的。在虛擬機中,FrameBuffer 也是開啟的,不過 Fedora 和 Ubuntu 支持的分辨率不一樣。但是在我自己的配備 Nvidia GTX 860 顯卡的台式機上,在安裝了 Nvidia 驅動的情況下,FrameBuffer 就失效了。

  後來我仔細研究 FrameBuffer 有效和失效的情況,發現還是和驅動程序有關,也就是和內核模塊有關。反正網絡上說的那幾個內核模塊 fbcon、vesafb 和 vga16fb 是指望不上的。在使用集成顯卡時,或者使用虛擬機時,svgadrmfb 驅動運行得就不錯,如果使用的是獨立顯卡,nouveau 模塊中的 nouveaufb 運行得也不錯。但是如果安裝了 Nvidia 的顯卡驅動, FrameBuffer 就失敗了,因為 Nvidia 顯卡驅動會在/etc/modprobe.d目錄下面加上一些 blacklist 配置,使得沒有合適的 FrameBuffer 驅動運行。雖然可以手動更改配置載入 nvidiafb 模塊,但是經過我測試,該模塊的運行是有問題的。

  怎麼判斷 FrameBuffer 是否開啟呢?方法是查看/dev/fb0文件是否存在。怎麼查看目前的 FrameBuffer 分辨率是多少,以及由哪個驅動程序提供支持呢?這需要一個小工具 fbset。該工具可以使用yum install命令或apt-get install命令安裝。查看 FrameBuffer 的細節如下圖:

  至於怎樣去測試各個模塊,那就只有去修改/etc/modprobe.d目錄下的文件,然後不斷地重啟機器了,每次修改文件後,還要記得更新 initramfs 文件哦。

總結

  知道了要給內核傳遞什麼參數,剩下的就是修改 Grub 的配置文件了。在 Grub2 中,推薦的方法已經不是修改/boot/grub/grub.cfg文件了,而是先修改/etc/default/grub文件,然後運行sudo update-grub命令自動生成/boot/grub/grub.cfg文件。你問我是怎麼知道的呢,因為我閱讀了 Grub2 的文檔。閱讀 Grub2 的文檔用info grub命令。

  在/etc/default/grub文件中,修改GRUB_CMDLINE_LINUX_DEFAULT=...這一行,先加入video=1366x768M@60m這樣的參數,如果是 Ubuntu 系統,則再加入text參數,就可以讓系統啟動時自動進入字符界面,而且字符界面的分辨率是 1366×768,屏幕刷新率 60Hz,帶 margin。如果是 Fedora 系統,則連text參數都可以省略掉。下圖是在 Ubuntu 14.10 下的截圖:

  最後,sudo update-grub一下,重啟機器,一切搞定。

Copyright © Linux教程網 All Rights Reserved