首頁 > 軟體

讓Linux開機進入字元介面的方法及設定FrameBuffer解析度的方法

2020-06-16 18:02:32

閱讀目錄

  • 引言
  • 讓Linux開機進入字元介面的方法
  • 設定FrameBuffer的解析度的方法
  • 關於FrameBuffer和核心模組
  • 總結

引言

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

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

  再來說說開啟 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 傳遞給核心的引數解析命令列級別。問題在於,它認為執行級別 2345 是一樣的,對於想給核心傳遞一個 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 192021 以及 Ubuntu 121314)是不能使用 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一下,重新啟動機器,一切搞定。

本文永久更新連結地址http://www.linuxidc.com/Linux/2015-04/116075.htm


IT145.com E-mail:sddin#qq.com