全网络最正确的让 Linux 开机进入字符界面的方法及设置 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一下,重启机器,一切搞定。
(京山游侠于2015-03-31发布于博客园,转载请注明出处。)
最新进展
从 Ubuntu 15.04 开始,Ubuntu 也开始采用 systemd 作为它的 init 程序,所以,让 Ubuntu 启动后进入字符界面的方法也变得和 Fedora 一样了。都是使用 sudo systemctl set-default multi-user.target 命令。进入图形模式都是使用 sudo systemctl set-default graphical.target 命令。而 Framebuffer 是自动开启的,除非使用 Nvidia 驱动,因为 Nvidia 驱动不支持 Framebuffer。要设置 Framebuffer 的分辨率,只需要向内核传递 video=... 参数就可以了。
(京山游侠于2016-08-21更新于博客园,转载请注明出处。)
全网络最正确的让 Linux 开机进入字符界面的方法及设置 FrameBuffer 分辨率的方法的更多相关文章
- linux下的字符界面和图形界面转换
linux下的字符界面和图形界面转换 linux下有六个虚拟终端按键ctrl+alt+F1-F6可以进入相应的虚拟终端永久的话修改/etc/inittab将id:5:initdefault:中的5改成 ...
- Linux 开机启动图形界面,shell界面
查看当前启动模式 # systemctl get-default 更改模式命令: systemctl set-default graphical.target由命令行模式更改为图形界面模式 syste ...
- LINUX RHEL6.5字符界面安装图形化桌面
安装RHEL 6.5 系统,也是一波三折.好不容易把系统装上去了,发现没装图形化界面.重装倒是学会了,不过觉得太麻烦,于是有了今天. 查了很多帖子,然后自己一一尝试,发现都是说简单,只要 yum gr ...
- Linux 纯字符界面的玩法
Linux 纯字符界面的用途 装逼必备 省资源,服务器一般不安装图形界面 图形界面崩溃后紧急救援 进入字符界面的正确方式 目前新的 Linux 发行版基本上都使用 Systemd 作为 init 程序 ...
- linux复习3:linux字符界面的操作
一.前言 1.对linux服务器进行管理的时候,经常要进入字符界面进行操作,使用命令需要记住该命令的相关选项和参数.vi编辑器可以用于编辑任何ASCII文本,功能非常的强大,可以对文本进行创建.查找. ...
- Linux字符界面和图形界面
Ubuntu图形界面和字符界面的切换 Ubuntu和其他的Linux系统一样,有图形界面和字符界面,同时能够设置默认的启动界面. linux的显示界面分为命令行的字符界面和图形界面,我们可以设置lin ...
- Linux 切换字符界面和图形界面
1. 切换方式 # root 权限 systemctl get-default # 获取当前模式 systemctl set-default graphical.target # 设置开机为图形界面 ...
- yum管理——linux字符界面安装图形化及两种界面的切换(3)
1.查看yum软件包组 yum groups list 2.选择安装带 GUI 的服务器 yum groups install "带 GUI 的服务器" 3.字符界面切换为图形化界 ...
- linux开机自动连接无线网络
1.右击无线网络图标的“编辑连接”. 2.在“无线”选项卡里,选择“编辑”. 3.在“无线安全性”选项卡里,输入无线密匙,并选中左下角的“对所有用户可 用”的选项点击应用,会提 ...
随机推荐
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
- RxJS + Redux + React = Amazing!(译二)
今天,我将Youtube上的<RxJS + Redux + React = Amazing!>的后半部分翻译(+机译)了下来,以供国内的同学学习,英文听力好的同学可以直接看原版视频: ht ...
- 《LoadRunner12七天速成宝典》来了
看到自己的新书又要发行了,算算从09年第一本书开始,不知不觉已经是第四本书了(帮朋友合写的书不算),每次写完之后都会说太累了,不想再写了,但是却又次次反悔,吞下食言的苦果.如果非要说第四本书的感受,那 ...
- C# 对象实例化 用json保存 泛型类 可以很方便的保存程序设置
用于永久化对象,什么程序都行,依赖NewtonSoft.用于json序列化和反序列化. using Newtonsoft.Json; using System; using System.Collec ...
- Flex 布局教程:实例篇
该教程整理自 阮一峰Flexible教程 今天介绍常见布局的Flex写法.你会看到,不管是什么布局,Flex往往都可以几行命令搞定. 我的主要参考资料是Landon Schropp的文章和Solved ...
- IIS启动失败,启动Windows Process Activation Service时,出现错误13:数据无效 ;HTTP 错误 401.2 - Unauthorized 由于身份验证头无效,您无权查看此页
因为修改过管理员账号的密码后重启服务器导致IIS无法启动,出现已下异常 1.解决:"启动Windows Process Activation Service时,出现错误13:数据无效&quo ...
- 【C#】获取网页内容及HTML解析器HtmlAgilityPack的使用
最近经常需要下载一些东西,而这个下载地址又会经过层层跳转,每个页面上都有很多广告,烦不胜烦,所以做了一个一键获得最终下载地址的小工具.使用C#,来获取网页内容,然后通过HtmlAgilityPack获 ...
- SVG:textPath深入理解
SVG的文本可以沿着一条自定义的Path来排布,比如曲线.圆形等等,使用方式如下所示(来源MDN): <svg viewBox="0 0 1000 300" xmlns=&q ...
- 自制文件上传JS控件,支持IE、chrome、firefox etc.
(function() { if (window.FileUpload) { return; } window.FileUpload = function (id, url) { this.id = ...
- "过期不候"--具备生命周期的数据的技术实现方案
"过期不候"--具备生命周期的数据的技术实现方案 1 引言 本文可以作为之前的一个 原理性文章 对应的 技术实现部分 . 此处给出其上文的直达电梯: http://www.cn ...