引言

  这个标题有点长,是为了在标题中就把问题说清楚,以便搜索引擎能够把有需要的朋友准确地带到我这里来。目前在网络上,很多关于 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 分辨率的方法的更多相关文章

  1. linux下的字符界面和图形界面转换

    linux下的字符界面和图形界面转换 linux下有六个虚拟终端按键ctrl+alt+F1-F6可以进入相应的虚拟终端永久的话修改/etc/inittab将id:5:initdefault:中的5改成 ...

  2. Linux 开机启动图形界面,shell界面

    查看当前启动模式 # systemctl get-default 更改模式命令: systemctl set-default graphical.target由命令行模式更改为图形界面模式 syste ...

  3. LINUX RHEL6.5字符界面安装图形化桌面

    安装RHEL 6.5 系统,也是一波三折.好不容易把系统装上去了,发现没装图形化界面.重装倒是学会了,不过觉得太麻烦,于是有了今天. 查了很多帖子,然后自己一一尝试,发现都是说简单,只要 yum gr ...

  4. Linux 纯字符界面的玩法

    Linux 纯字符界面的用途 装逼必备 省资源,服务器一般不安装图形界面 图形界面崩溃后紧急救援 进入字符界面的正确方式 目前新的 Linux 发行版基本上都使用 Systemd 作为 init 程序 ...

  5. linux复习3:linux字符界面的操作

    一.前言 1.对linux服务器进行管理的时候,经常要进入字符界面进行操作,使用命令需要记住该命令的相关选项和参数.vi编辑器可以用于编辑任何ASCII文本,功能非常的强大,可以对文本进行创建.查找. ...

  6. Linux字符界面和图形界面

    Ubuntu图形界面和字符界面的切换 Ubuntu和其他的Linux系统一样,有图形界面和字符界面,同时能够设置默认的启动界面. linux的显示界面分为命令行的字符界面和图形界面,我们可以设置lin ...

  7. Linux 切换字符界面和图形界面

    1. 切换方式 # root 权限 systemctl get-default # 获取当前模式 systemctl set-default graphical.target # 设置开机为图形界面 ...

  8. yum管理——linux字符界面安装图形化及两种界面的切换(3)

    1.查看yum软件包组 yum groups list 2.选择安装带 GUI 的服务器 yum groups install "带 GUI 的服务器" 3.字符界面切换为图形化界 ...

  9. linux开机自动连接无线网络

           1.右击无线网络图标的“编辑连接”. 2.在“无线”选项卡里,选择“编辑”. 3.在“无线安全性”选项卡里,输入无线密匙,并选中左下角的“对所有用户可      用”的选项点击应用,会提 ...

随机推荐

  1. Angular2学习笔记(1)

    Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...

  2. Python 小而美的函数

    python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况   any any(iterable) ...

  3. opencv在图像显示中文

    在图像定位和模式识别时,经常需要把结果标注到图片上,标注内容可以是数字字母.矩形框等(opencv支持的)或者是中文汉字(借助freetype). 1.显示数字/矩形框 #include <op ...

  4. 从中间件的历史来看移动App开发的未来

    在移动开发领域我们发现一个很奇怪的现象:普通菜鸟新手经过3个月的培训就可以拿到 8K 甚至上万的工作:在北京稍微有点工作经验的 iOS 开发,就要求 2 万一个月的工资.不知道大家是否想过:移动应用开 ...

  5. 小兔JS教程(三)-- 彻底攻略JS回调函数

    这一讲来谈谈回调函数. 其实一句话就能概括这个东西: 回调函数就是把一个函数当做参数,传入另一个函数中.传进去的目的仅仅是为了在某个时刻去执行它. 如果不执行,那么你传一个函数进去干嘛呢? 就比如说对 ...

  6. H5 canvas的 width、height 与style中宽高的区别

    Canvas 的width height属性 1.当使用width height属性时,显示正常不会被拉伸:如下 <canvas id="mycanvas" width=&q ...

  7. BPM与 SAP & Oracle EBS集成解决方案分享

    一.需求分析 SAP和Oracle EBS都是作为全球顶级的的ERP产 品,得到了众多客户的青睐.然而由于系统庞大.价格昂贵以及定位不同,客户在实施过程中经常会面临以下困惑: 1.SAP如何实现&qu ...

  8. Unicode 和 UTF-8 有何区别?

    Unicode符号范围 (一个字符两个字节)     | UTF-8编码方式 (十六进制)     | (二进制) —————————————————————– 这儿有四个字节从-----00 00 ...

  9. Kafka:主要参数详解(转)

    原文地址:http://kafka.apache.org/documentation.html ############################# System ############### ...

  10. 三大框架SSH整合

    三大框架SSH整合 -------------------------------Spring整合Hibernate------------------------------- 一.为什么要整合Hi ...