引言

  这个标题有点长,是为了在标题中就把问题说清楚,以便搜索引擎能够把有需要的朋友准确地带到我这里来。目前在网络上,很多关于 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. C语言 · 高精度加法

    问题描述 输入两个整数a和b,输出这两个整数的和.a和b都不超过100位. 算法描述 由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储.对于这种问题,一般使用数组来处理. 定义一个数组A ...

  2. 再讲IQueryable<T>,揭开表达式树的神秘面纱

    接上篇<先说IEnumerable,我们每天用的foreach你真的懂它吗?> 最近园子里定制自己的orm那是一个风生水起,感觉不整个自己的orm都不好意思继续混博客园了(开个玩笑).那么 ...

  3. web前端基础知识

    #HTML    什么是HTML,和他ML...    网页可以比作一个装修好了的,可以娶媳妇的房子.    房子分为:毛坯房,精装修    毛坯房的修建: 砖,瓦,水泥,石头,石子....    精 ...

  4. Hyper-v 安装CentOS 7 (其他虚拟机一样参考)

    平台之大势何人能挡? 带着你的Net飞奔吧!http://www.cnblogs.com/dunitian/p/4822808.html hyper-v安装很多人没弄过,我这里介绍一下.(其他虚拟机参 ...

  5. 【翻译】MongoDB指南/CRUD操作(二)

    [原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(二) 主要内容: 更新文档,删除文档,批量写操作,SQL与MongoDB映射图,读隔离(读关 ...

  6. Spring框架概述

    Spring是最流行的Java企业级应用开发框架,全球数以百万的开发者在使用Spring框架创建高性能.易测试.可重用的代码. Spring框架的核心特性可以应用于任何Java应用,但扩展的JavaE ...

  7. 【原创分享·微信支付】C# MVC 微信支付教程系列之现金红包

            微信支付教程系列之现金红包           最近最弄这个微信支付的功能,然后扫码.公众号支付,这些都做了,闲着无聊,就看了看微信支付的其他功能,发现还有一个叫“现金红包”的玩意,想 ...

  8. 阿里云服务器上配置并使用: PHP + Redis + Mysql 从配置到使用

    (原创出处为本博客,http://www.cnblogs.com/linguanh/) 目录: 一,下载 二,解压 三,配置与启动 四,测试 Redis 五,配置 phpRedis 扩展 六,综合测试 ...

  9. 漫谈C#编程语言在游戏领域的应用

    0x00 前言 随着微软越来越开放,C#也变得越来越吸引人们的眼球.而在游戏行业中,C#也开始慢慢地获得了关注.这不, 网易绝代双娇手游团队已经全面使用.Net Core支持前后端统一C#开发,跨平台 ...

  10. 利用apply()或者rest参数来实现用数组传递函数参数

    关于call()和apply()的用法,MDN文档里写的非常清晰明白,在这里就不多做记录了. https://developer.mozilla.org/zh-CN/docs/Web/JavaScri ...