特別說明:要在個人隨筆後寫評論的小夥伴們請注意了,個人博客開啓了 MathJax 數學公式支持,MathJax 使用
$
標記數學公式的開始和結束。若是某條評論中出現了兩個$
,MathJax 會將兩個$
之間的內容按照數學公式進行排版,從而致使評論區格式混亂。若是你們的評論中用到了$
,可是又不是爲了使用數學公式,就請使用\$
轉義一下,謝謝。html
想從頭閱讀該系列嗎?下面是傳送門:linux
前一篇講了 X Window,這一篇就來說講沒有 X Window 的 Linux,主要是 Linux 的字符模式,甚至是在進入 Linux 以前的 Grub 命令行模式。原本想把這一篇的標題叫《字符界面怎麼玩》,或者《沒有圖形界面怎麼玩》,可是怎麼想都以爲不許確。去掉桌面環境的 Linux,並不必定就不是圖形界面,由於 Linux 圖形界面無處不在。之前我使用 Linux 桌面的時候,老是有一個誤區:認爲只有 XServer 啓動後,纔可以訪問到圖形系統,不然只能訪問字符界面。隨着對 Linux 的認識逐步加深,才發現即便在 XServer 啓動以前,圖形界面也是無處不在的。例如,Grub 的系統啓動菜單,能夠是圖形化的,還能夠經過改背景和主題進行美化。再例如在 Linux 初始化過程當中,有一個 PlyMouth 軟件,能夠直接經過內核的 DRM 模塊訪問圖形硬件,從而顯示一個圖形化的啓動界面和進度條,同理,PlyMouth 也是能夠經過更改主題進行美化的。最後,當 Linux 初始化完成後,會給咱們顯示一個讓咱們登陸的圖形界面,這就是 DM(Display Manager),這個 DM 既是 XServer 的父進程,負責啓動 XServer,又是一個 XClient,給出圖形化的登陸接口。登陸成功後,它又是 Gnome Shell 的父進程,負責啓動 Gnome Shell。還有,即便在純字符界面下,也是可使用 FrameBuffer 得到圖形功能的,甚至能夠截圖和播放視頻。惟一的區別,就是在這些模式下,在沒有桌面環境的狀況下,咱們和計算機的交互,每每只能經過 CLI 進行。因此,我給這一篇取名《沒有 GUI 的時候應該怎麼玩》。shell
Linux 系統啓動的過程是這樣的:先由 BIOS 啓動一個系統引導程序;而後系統引導程序負責把 Linux 的內核加載到內存,同時把 initrd 加載到內存,而後把控制權交給 Linux 的內核;Linux 的內核初始化完成後,將控制權交給 init 程序;init 程序負責啓動各類服務。若是要啓動圖形桌面系統,則 init 先啓動一個窗口管理器,由窗口管理器負責用戶的登陸和驗證;用戶登陸和驗證成功後,窗口管理器負責啓動 X 服務器和客戶端,進入桌面系統。若是是不須要圖形桌面系統的 Linux,則 init 啓動 login 程序,login 程序負責用戶的登陸和驗證,驗證成功後,啓動一個 shell。編程
GRUB 就是目前 Linux 系統使用的系統引導程序,是計算機啓動後運行的第一個程序(固然,BIOS除外)。它在將 Linux 內核加載到內存的時候,還能夠向內核傳遞各類參數。目前的 Linux 發行版使用的 GRUB 都已是第 2 版了,它的功能和配置都和之前的版本不同。網上不少文章都是基於之前的 GRUB Legacy 版本進行的講解,已經不能適應如今新的形勢了。vim
GRUB 的文檔在這裏:https://www.gnu.org/software/grub/manual/grub/。從前面的介紹能夠看出,GRUB 是計算機啓動後運行的第一個程序,這個時候 Linux 的內核尚未加載,其它的程序也都不可能運行。這時有人就會想了,這個 GRUB 的功能應該至關有限吧。我剛開始也是這麼想的。可是當我讀完前面給出的 GRUB 文檔後,個人思想被完全顛覆了。GRUB 的功能太 TM 強了,簡直逆天。bash
那麼這個一開機就啓動的簡單程序究竟具備哪些讓人意想不到的功能呢?請看我列舉幾條:服務器
這些功能真的是已經超強了,就快遇上一個操做系統了。重要的是,它還提供了一個很是好用的命令行界面,該命令行界面的使用方法和 Linux 系統中的 Shell 極其接近,也支持編程、支持環境變量,其編程的語法也和 Bash 差很少。再加上 GRUB 提供的豐富的命令,該界面使用起來爽得不要不要的。網絡
實踐出真知,下面以 Ubuntu 爲例開始實戰。app
剛安裝好的 Ubuntu 啓動時不顯示 GRUB 界面,由於它在設置中把它隱藏了。它的啓動畫面是這樣的:
frontend
必須按一下 ESC 鍵,咱們纔可以看到 GRUB 的菜單,它是這樣的:
上面這個界面想必你們已經很熟悉了。在這個界面中,若是按下 c 鍵,就會切換到 GRUB 的命令行界面,以下:
還有一種狀況就是,若是你們在使用 Linux 過程當中不當心刪除了 /boot/grub/grub.cfg,或者配置錯誤,或者刪除了 Linux 系統所在的硬盤分區的數據,使得 GRUB 沒法正確加載 Linux 系統,也會自動進入到這個命令行界面。
GRUB 的命令補全功能很是方便,只要按一下 TAB 鍵,就能夠顯示它支持的全部命令。命令以後按 TAB 鍵,能夠自動補全文件名。下面是 GRUB 支持的命令,我按 TAB 鍵調出來的:
使用ls
命令能夠列出目錄和文件,使用cat
命令能夠輸出文本文件的內容。在 GRUB 中,使用(hd0, msdos1)
或者(hd0, gpt1)
識別硬盤分區,使用(hd0, gptN)/boot/grub/grub.cfg
這樣的形式識別文件。因爲 GRUB 能自動識別根分區,因此我下面的命令中省略掉了指定硬盤分區的部分。以下圖:
在上圖中,我使用cat /etc/fstab
命令顯示了我係統中硬盤分區的狀況。能夠看到,我使用的是 GPT 分區格式和 EFI 固件,硬盤分了三個去,第一個分區的掛載點是/boot/efi
,而且是 vfat 格式的文件系統,第二個分區的掛載點是根目錄/
,第三個分區是 swap 空間。按照 GRUB 的術語,則分區(hd0, gpt1)
是掛載的/boot/efi
,分區(hd0, gpt2)
是根目錄,分區(hd0, gpt3)
是交換分區。能夠看到,GRUB 中硬盤是從 0 開始計數的,而分區是從 1 開始計數的。
我在以前的某一篇隨筆中講過,命令行參數、環境變量、配置文件是對軟件進行配置的三駕馬車,GRUB 也不例外,它的不少行爲也受環境變量控制。下面看一個例子,當我想查看 GRUB 的啓動配置文件/boot/grub/grub.cfg
時,使用cat
命令查看該文件的內容,可是因爲該文件太長,一個屏幕顯示不完,因此只能看到最後幾行,以下兩圖:
這是很是蛋疼的,但還不是最鬱悶的,畢竟/boot/grub/grub.cfg
是系統中的一個文件,大不了我進 Linux 後用 vim 看。最蛋疼的是某些命令的輸出,只能看到最後幾行,又不能保存下來,真的讓人捉急。就像下面這個例子,我使用videoinfo
命令查看個人 GRUB 支持哪些圖形分辨率:
這個時候,就只能經過設置環境變量的方法來解決問題了。使用set pager=1
命令設置環境變量pager
,讓 GRUB 的輸出啓用分頁,以下圖:
咱們還能夠經過不帶參數的set
命令顯示全部可用的環境變量,以下圖:
也可使用echo
命令輸出某一個環境變量,以下圖:
咱們能夠控制 GRUB 顯示界面的分辨率,還能夠經過 GRUB 控制 Linux 啓動進入字符模式後的分辨率。前提條件是要看咱們的 BIOS 和顯卡支持哪些模式。能夠經過 videoinfo
命令查看,以下圖:
我使用的是虛擬機,由於玩 GRUB 不使用虛擬機沒法截圖啊。若是採起的是 EFI 固件,則其輸出以下:
若是採起的是 Legacy BIOS,則其輸出以下:
能夠看到,若是使用的是 Legacy BIOS,它的顯示模式是由 ' VESA BIOS Extension Video Driver ' 提供支持的。若是使用的是 EFI,則其顯示模式是由 ' EFI GOP driver ' 提供支持的。在個人虛擬機中,它們能提供的最高分辨率也只有 1152 x 864,遠遠達不到 1920 x 1080。可是在個人物理機中,都是能夠達到 1920 x 1080。並且貌似只能進入 1920 x 1080,想改小還改不了。在物理機上,想經過改小分辨率,而後利用顯示器的放大功能來放大字體的夢想是破滅了的。
在虛擬機中,我要作的是把分辨率改大,至少讓我徹底進入 Linux 字符界面的時候有個 1024 x 768 的分辨率吧,否則字符界面用起來豈不是太憋屈。能夠經過修改 /etc/default/grub
文件,而後調用sudo update-grub
命令更新 GRUB。以下圖,使用sudo vim /etc/default/grub
修改配置文件:
在上面的這個文件中的註釋裏,也寫得很明白了,要修改 GRUB 和 Linux 字符界面的分辨率,能夠經過修改 GRUB_GFXMODE
和 GRUB_GFXPAYLOAD_LINUX
參數來設置,並且千萬不要設置GRUB_TERMINAL=console
,否則就真的進入只有文字的文字模式了,沒有 Graphic 的支持,還談啥分辨率呢。
而後重啓系統,能夠看到咱們的 GRUB 界面變大了一圈,以下兩圖:
下面進入 Linux 的字符界面,進入 Linux 字符界面的方式是啓動進入 Linux 後,使用 sudo systemctl set-default multi-user.target
,而後重啓,在 1024 x 768 的分辨率下開一個 vim 看看,以下圖:
又找到了懷舊的感受,不是嗎?惟一的缺憾是字過小。若是是在個人物理機上,15.6寸 1920 x 1080 的屏幕,字會小得根本沒法看。下面,咱們再來探討 Framebuffer 的正確打開姿式。
目前新的 Linux 發行版基本上都使用 Systemd 做爲 init 程序,再也不使用 SysV init 和 Upstart init。因此若是想讓系統啓動後直接進入字符界面,應該使用以下命令:
sudo systemctl set-default multi-user.target
反過來,要讓系統啓動後直接進入圖形界面,應該使用以下命令:
sudo systemctl set-default graphical.target
另外,Linux 自己提供有虛擬控制檯的功能,使用Ctrl + Alt + F1
到Ctrl + Alt + F7
進行切換,其中有一個是圖形界面,剩下的是字符界面。圖形界面玩崩潰了,就不得不使用Ctrl + Alt + F3
切換到字符界面進行救援。
字符界面分兩種,一種是不開啓 Framebuffer 的,另外一種是開啓 Framebuffer 的。Framebuffer 是一種圖形驅動,不開啓 Framebuffer 就是真的全字符,不能改變分辨率,不能顯示圖像,不能截圖。目前最新的 Linux 發行版默認開啓 Framebuffer。控制 Framebuffer 開啓和關閉,以及分辨率的方法,是設置 Grub2 的參數。修改 /etc/default/grub
文件,添加以下參數能夠設置分辨率:
GRUB_GFXPAYLOAD_LINUX=1024x768x32
而後使用以下命令更新 GRUB2 配置:
sudo update-grub
其中的分辨率必須是咱們的硬件支持的。能夠經過 GRUB2 命令行中的videoinfo
命令查看咱們的硬件支持的分辨率。
若是要關閉 Framebuffer,則這樣更改 GRUB2 的配置:
GRUB_GFXPAYLOAD_LINUX=text
一樣,須要:
sudo update-grub
而後重啓。
之前在圖形界面的時候,設置個網絡、鏈接個 wifi 很是簡單,玩兒似的,結果一進入純字符界面就抓瞎。不聯網,就不能下載和安裝軟件包,後面就玩不下去了。因此進入純字符界面後,要解決的第一件事就是怎麼聯網。說到管理網絡的工具,你們能夠列舉一大堆,什麼 ipconfig、iwconfig、ip 等等。可是,在最新的 Linux 發行版中,已是使用 NetManager 管理網絡了。經過閱讀 NetManager 的文檔,能夠知道它提供一個功能很強大的命令行工具,那就是 nmcli。經過man nmcli
能夠查看該工具的用法。以下圖:
使用以下命令能夠查看可用的 wifi 熱點以及鏈接 wifi:
nmcli device status #查看網絡鏈接的狀態,能夠看到各網卡的名稱 nmcli device wifi list iface 網卡名稱 #查看可用的 wifi 熱點 nmcli device wifi connect **** password **** #鏈接 wifi,須要提供 wifi 的名稱和密碼
以下圖:
連上了網,Ubuntu 就能夠在純字符界面下起飛了。
經過上面的截圖,發現兩個問題:
解決辦法是使用 fbterm。一舉解決字體大小問題和中文顯示問題。先安裝 fbterm,使用以下命令:
sudo apt-get install fbterm
先使用sudo fbterm
啓動 fbterm 一次,再用exit
命令退出,這樣,fbterm 會自動生成一個默認的配置文件~/.fbtermrc
,而後修改~/.fbtermrc
配置文件中的兩行,設置使用的字體和字體大小,以下:
font-names=DejaVu\ Sans\ Mono font-size=16
而後使用sudo fbterm
命令啓動 fbterm,就能夠了。下面是看對比圖,使用 fbterm 以前,Vim 的啓動界面是不能顯示中文的:
使用 fbterm 以後,中文能夠正常顯示:
使用 fbterm 以前,閱讀代碼是這樣的:
字很是的小,NERDTree 和 Tagbar 裏面的符號顯示也有問題。使用 fbterm 以後,就很漂亮了,以下圖:
這纔是全高清屏該有的顯示效果嘛。關於在 fbterm 下輸入中文,我嘗試過 fbterm-ucimf,也嘗試過 fcitx-frontend-fbterm,都沒有成功。後來我就不試了,反正我也沒有在全字符界面下輸入中文的需求。
使用 fbset 能夠查看 Framebuffer 的信息,包括 Framebuffer 是否開啓,分辨率是多少,由哪一個內核模塊提供支持等。使用以下命令安裝 fbset:
sudo apt-get install fbset
使用sudo fbset -i
命令查看 Framebuffer 的信息,以下圖:
使用 fbgrab 能夠在 Framebuffer 下進行截圖。使用以下命令安裝 fbgrab:
sudo apt-get install fbgrab
使用 fbgrab 命令的方式以下:
sudo fbgrab -c N filename.png #對 /dev/ttyN 對應的終端進行截圖 sudo fbgrab -C N filename.png #先跳轉到 /dev/ttyN 對應的終端,再進行截圖 sudo fbgrab -s N filename.png #先等待 N 秒,再進行截圖
我前面的圖片都是使用 fbgrab 截的,這裏就不貼圖了。
使用 fbi 能夠在 Framebuffer 下查看圖片,一樣使用sudo apt-get install fbi
安裝這個軟件。在看圖界面下按 H 鍵,還會顯示幫助信息。以下圖:
使用老牌的上網工具 w3m,安裝方式sudo apt-get install w3m
,而後使用w3m https://www.cnblogs.com/
就能夠訪問博客園了,只有文字哦,圖片就不要想了。效果以下圖:
固然,必須在 fbterm 下執行才能顯示中文。
使用 mplayer 播放器能夠播放視頻,經過mplayer -vo help
命令能夠看到,mplayer 支持不少種視頻驅動,而 Framebuffer 正是其中一種。使用sudo mplayer -vo fbdev2 badapple.mp4
播放 Bad Apple 的 PV 視頻,效果以下:
由於這裏要錄製 gif 動畫,因此我使用了虛擬機運行 Linux,Framebuffer 的分辨率設置爲 1024x768。一樣,經過上面的mplayer -vo help
命令,還能夠看到 mplayer 支持使用 libaa 庫,將視頻播放爲字符畫。據我觀察,只有在圖形界面下效果才能夠,純字符界面不行。使用mplayer -vo aa -moniterpixelaspect 0.5 badapple.mp4
播放,效果以下:
固然是 cmatrix 啦。效果以下:
我對此次寫的這個系列要求是很是高的:首先內容要有意義、夠充實,信息量要足夠豐富;其次是每個知識點要講透徹,不能模棱兩可含糊不清;最後是包含豐富的截圖,讓那些不想裝 Linux 系統的朋友們也能夠領略到 Linux 桌面的風采。若是個人努力獲得你們的承認,能夠掃下面的二維碼打賞一下:
該隨筆由京山遊俠在2018年11月02日發佈於博客園,引用請註明出處,轉載或出版請聯繫博主。QQ郵箱:1841079@qq.com