参考资料

GRUB 的文档在这里:https://www.gnu.org/software/grub/manual/grub/

Linux 的启动过程和 GRUB 的地位

Linux 系统启动的过程是这样的:先由 BIOS 启动一个系统引导程序;然后系统引导程序负责把 Linux 的内核加载到内存,同时把 initrd 加载到内存,然后把控制权交给 Linux 的内核;Linux 的内核初始化完成后,将控制权交给 init 程序;init 程序负责启动各种服务。如果要启动图形桌面系统,则 init 先启动一个窗口管理器,由窗口管理器负责用户的登录和验证;用户登录和验证成功后,窗口管理器负责启动 X 服务器和客户端,进入桌面系统。如果是不需要图形桌面系统的 Linux,则 init 启动 login 程序,login 程序负责用户的登录和验证,验证成功后,启动一个 shell。

GRUB 就是目前 Linux 系统使用的系统引导程序,是计算机启动后运行的第一个程序(当然,BIOS除外)。它在将 Linux 内核加载到内存的时候,还可以向内核传递各种参数。目前的 Linux 发行版使用的 GRUB 都已经是第 2 版了,它的功能和配置都和以前的版本不一样。网上很多文章都是基于以前的 GRUB Legacy 版本进行的讲解,已经不能适应现在新的形势了,所以才有了我的这篇文章。

从上面的介绍可以看出,GRUB 是计算机启动后运行的第一个程序,这个时候 Linux 的内核还没有加载,其它的程序也都不可能运行。这时有人就会想了,这个 GRUB 的功能应该相当有限吧。我刚开始也是这么想的。但是当我读完上面参考资料中给出的 GRUB 文档后,我的思想被彻底颠覆了。GRUB 的功能太 TM 强了,所以我才把这篇文章取名“逆天的 GRUB”。

GRUB 功能概览

那么这个一开机就启动的简单程序究竟具有哪些让人意想不到的功能呢?请看我列举几条:

  • 能够访问任何设备上的数据,不管你是硬盘、软盘还是光盘;
  • 能够探测到所有的内存;
  • 能够识别大部分的文件系统,不管你是 FAT32、NTFS 还是 ext2/ext3/ext4;
  • 能够识别文件系统中的文件,文档中说它可识别大部分可执行文件格式,ELF什么的根本不在话下;
  • 能够使用 .png、.jpg 格式的图片作为背景,说明它能够识别一些图片格式;
  • 对字体的支持稍微差一点,好像只能使用 PFF2 格式的字体;
  • 当然可以读取和输出硬盘上的文本文件;
  • 据说还能播放乐曲;
  • 支持联网,可以从网络上启动操作系统;
  • 可以支持串口输入输出。

这些功能真的是已经超强了,就快赶上一个操作系统了。重要的是,它还提供了一个非常好用的命令行界面,该命令行界面的使用方法和 Linux 系统中的 Shell 及其接近,也支持编程、支持环境变量,其编程的语法也和 Bash 差不多。再加上 GRUB 提供的丰富的命令,该界面使用起来爽得不要不要的。

GRUB实战

实践出真知,下面以 Ubuntu 为例开始实战。

GRUB的界面

刚安装好的 Ubuntu 启动时不显示 GRUB 界面,因为它在设置中把它隐藏了。它的启动画面是这样的:

必须按一下 ESC 键,我们才能够看到 GRUB 的菜单,它是这样的:

上面这个界面想必大家已经很熟悉了。在这个界面中,如果按下 c 键,就会切换到 GRUB 的命令行界面,如下:

还有一种情况就是,如果大家在使用 Linux 过程中不小心删除了 /boot/grub/grub.cfg,或者配置错误,或者删除了 Linux 系统所在的硬盘分区的数据,使得 GRUB 无法正确加载 Linux 系统,也会自动进入到这个命令行界面。

GRUB 支持的命令

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 也不例外,它的很多行为也受环境变量控制。下面看一个例子,当我想查看 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_GFXMODEGRUB_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 的正确打开姿势。

逆天的 GRUB的更多相关文章

  1. Linux 桌面玩家指南:10. 没有 GUI 的时候应该怎么玩

    特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...

  2. 【资源】.Net 入门@提高 - 逆天的高薪之路!

     入门看视频,提高看书籍,飘升做项目.老练研开源,高手读外文,大牛讲低调~    官方学习计划 http://www.cnblogs.com/dunitian/p/5667901.html ----- ...

  3. 移动硬盘不能识别的常见7种解决方案 ~ By 逆天经验

    服务器汇总:http://www.cnblogs.com/dunitian/p/4822808.html#iis 服务器异常: http://www.cnblogs.com/dunitian/p/45 ...

  4. 逆天通用水印支持Winform,WPF,Web,WP,Win10。支持位置选择(9个位置 ==》[X])

    常用技能:http://www.cnblogs.com/dunitian/p/4822808.html#skill 逆天博客:http://dnt.dkil.net 逆天通用水印扩展篇~新增剪贴板系列 ...

  5. Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示

    Dapper的牛逼就不扯蛋了,答应群友做个入门Demo的,现有园友需要,那么公开分享一下: 完整Demo:http://pan.baidu.com/s/1i3TcEzj 注 意 事 项:http:// ...

  6. 第14章 Linux启动管理(2)_启动引导程序grub

    2. 启动引导程序grub 2.1 Grub配置文件 (1)grub中分区的表示 硬盘 分区 Linux设备文件名 Grub中设备文件名 第1块SCSI硬盘 第1个主分区 /dev/sda1 hd(0 ...

  7. 我为NET狂~群福利:逆天书库

    我为NET狂-官方群① 238575862 爱学习,爱研究,福利不断,技能直彪~~ 最近更新:2016-08-30,欢迎补充 暂缺PDF: │ SQL Server 2012 Analysis Ser ...

  8. 我为NET狂群福利:逆天常用的一些谷歌浏览器插件

    逆天书库:http://www.cnblogs.com/dunitian/p/5734677.html 常用工具:http://www.cnblogs.com/dunitian/p/5640147.h ...

  9. ubuntu关于引导修复[grub命令行][live linux]

    第一种:grub命令行: ls 列出所有分区 ls /grub ls /grub 检查确认linux引导分区,如果linux单独/boot分区,就要采用如下命令进行检查: ls /boot/grub ...

随机推荐

  1. 一位6年老Android面经总结

    声明|作者:android进阶者地址:https://www.jianshu.com/p/d77873cbad5f 前言 准备面试其实已经准备了挺久了,当时打算面试准备了差不多以后,跟公司谈谈涨薪的事 ...

  2. Mysql的子查询相关知识,少但是精

    Mysql子查询 概念分析: 根据相关性分: (1)不相关子查询:一条Sql语句中含有多条SELECT语句,先执行子查询,再执行外查询,子查询可对立运行 关键字:(1)先子查询,再外查询 (2)可以对 ...

  3. python-循环&运算符

    一.while 循环语句 while 循环语句的基本用法如下: while 条件表达式: 循环体 当条件表达式的返回值为真时,则执行循环体中的语句,执行完毕后,重新判断条件表达式的返回值,直到表达式的 ...

  4. leetcode python两个排序数组的中位数

    给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个有序数组的中位数.要求算法的时间复杂度为 O(log (m+n)) . 你可以假设 nums1 和 nums2 不同 ...

  5. php curl Problem with the SSL CA cert (path? access rights?)

    公司有台老服务器,搭的php的环境,有个负载均横的服务 调用 curl_init 的时候报了 Problem with the SSL CA cert (path? access rights?) 网 ...

  6. .net 获取配置文件AppSettings的键值

    //AppSettings.config 节点代码 <appSettings> <add key="IsUpdate" value="false&quo ...

  7. phpmail发送phpexcel生成的附件,php导出的Excel 作为邮件附件发送

    PHP发送邮件戳这里https://www.cnblogs.com/wangzhaobo/p/8931328.html PHP导出excel戳这里https://www.cnblogs.com/wan ...

  8. 蓝桥杯 穿越雷区(bfs)

    题目描述 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废.某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短? ...

  9. twig模板的进一步学习以及在symfony当中的使用

    首先,twig可以理解为用于输出html代码的,虽然用PHP等其他语言也可以输出,但是twig更为简洁高效,同时twig模板被编译成原生的php类缓存起来,所以才会这么快, 其实twig跟php类差不 ...

  10. android studio 开发免安装的app之目录结构

    尚未深入分析,暂且外链到我看到的,对此有帮助的博客,在此,感谢你们. 1.https://blog.csdn.net/tscyds/article/details/74331085 2.https:/ ...