Grub编译与调试

Grub编译与调试

文章目录

  • Grub编译与调试
    • 1. Grub编译
    • 2. Grub文件生成
      • 2.1 grub.efi
      • 2.2 grub.cfg
      • 2.3 将grub安装至UEFI引导界面
    • 3. GRUB界面
    • 4. 编辑GRUB选项
    • 5. 手动找grub.cfg
    • 6. 没有grub.cfg的情况下引导内核
    • 7. Grub增加串口
      • 7.1 使能串口
      • 7.2 使能串口输入
    • 8. Grub打开debug

1. Grub编译

git clone https://github.com/loongarch64/grub.git
cd grub
./bootstrap
./configure --with-platform=efi --target=loongarch64 --prefix=$(pwd) --disable-werror

2. Grub文件生成

2.1 grub.efi

./grub-mkimage -p . -c /boot/mxd.cfg -d ./grub-core/ -O loongarch64-efi -o /boot/mxd.efi $(ls grub-core/ | grep -E "\.mod$" | cut -d "." -f 1 | uniq)

各参数可在help信息中查看.

2.2 grub.cfg

./grub-mkconfig -o /boot/mxd.cfg

除了生成grub.cfg外, 系统下还有一些用于参考的grub默认配置选项, 如: /etc/default/grub, /etc/grub.d等. 倘若修改这些文件, 还需要更新/boot/grub/grub.cfg, 有命令可以做到:

update-grub

2.3 将grub安装至UEFI引导界面

grub-install --boot-directory=/boot --efi-directory=/boot/efi --bootload-id=mxd /dev/sda

--boot-directory指定在/boot作为根目录, 下寻找grub.cfg和模块.

--efi-directory指定在/boot/efi下寻找grubefi文件.

--bootload-id指定生成的efi选项在UEFI下显示的名称.

/dev/sda是安装grubloongarch64.efi的目标路径.

grub-install会调用grub-mkimage生成grub.efi文件, 同时会调用efibootmgr命令, 将grub.efi的路径通过UEFI运行时服务的接口写入到Flash中, 比如我这里举例是--bootload-id=mxd, 那在UEFI启动界面下将显示一个启动项, 名叫mxd, 指向/boot/efi/EFI/mxd/grubloongarch64.efi.

3. GRUB界面

GRUB主界面

如图, GRUB界面下列出了几个选项, 其中第一项vm.mxd是我自己加的内核, 第二项Loongnix GNU/Linux是系统自带内核, 第三项Advanced options for Loongnix GNU/Linux是高级选项, 通常包含一些恢复模式的选项, 第四项是System Setup–系统设置, 其实就是进入UEFI Setup界面.

然后在界面的最下方:

Use the ^ and v keys to select which entry is highlighted.
Press enter to boot the selected OS, e to edit the commands
before booting or c for a command-line.

翻译一下:

通过按上下键选择选项, 按执行进入选项, 按e去编辑选项, 按c进入GRUB的命令行.

4. 编辑GRUB选项

通常我们通过UEFI执行GRUBefi文件即可进入GRUB界面, 然后回车便可以启动内核, 但是倘若内核无法正常启动, 我们需要加串口调试, 就需要我们按e去编辑选项, 比如增加串口或者进入单用户模式等.

e后进入下图, 我们可以将光标通过上下左右按键, 移动至linux开头的那一行, 并在行末加入想要的参数比如串口console=ttyS0,115200 earlycon=uart,mmio,0x1fe001e0.

GRUB编辑

可以看到, 界面最下面仍然有一些文字, 告诉我们按下Ctrl-X组合键或者F10可以直接启动, 按下Ctrl-cF2进入到GRUB命令行, 按下ESC可以退回上一步.

5. 手动找grub.cfg

当我们在UEFI下执行GRUBefi文件后, 加入grub.cfg的路径有问题, 则需要我们手动找到grub.cfg并且加载:

GRUB命令行操作

逐个说明上述命令: 首先ls命令能够看到当前能够识别的设别, 其中hd0表示一块硬盘(Hard Disk0), 如果有多个硬盘将以hdx的形式显示.

但是hd0并不具有文件系统, (hd0,msdos2)这种形式才表示有文件系统, msdos指MBR的分区格式, msdos2也就表示MBR硬盘上第二个分区.

然后逐级用ls命令找到grub.cfg的路径:(hd0,msdos2)/boot/grub/grub.cfg.

最后通过configfile命令, 解析grub.cfg文件, 即可重新回到GRUB的主界面.

6. 没有grub.cfg的情况下引导内核

有时候, 我们会遇到有grub, 但是没有grub.cfg的情况, 这时, 我们可以稍微背下来两条命令, 这两条也就是grub.cfg中加载内核和加载initrd的命令: linux命令和initrd命令

linux命令后面加内核的路径, 以及内核启动参数

initrd命令后面加initrd的路径即可.

然后执行boot即可启动. 如下图:

grub命令启动内核

7. Grub增加串口

7.1 使能串口

grub> serial --unit=0 --speed=115200

或:

grub> serial --speed=115200 com0

--unit后指定com0comN用作串口, 通常默认使用com0.

但比如loongarch机器, 串口可能注册为了别的名字, 比如efi0, 所以真正执行的命令是:

grub> serial --speed=115200 efi0

7.2 使能串口输入

使能串口后, terminal_inputterminal_output命令分别查看可用的输入输出选项如下:

grub> terminal_input
Active input terminals:
console
Available input terminals:
serial_efi0
grub>
grub> terminal_output
Active output terminals:
console gfxterm
Available output terminals:
serial_efi0

可见输入和输出选项中各自增加了一个可用选项:serial_efi0

所以使用terminal_inputterminal_output命令分别设定可用的选项作为输入输出.

grub> terminal_input console serial_efi0
grub> terminal_output console gfxterm serial_efi0

串口下即可显示grub的一举一动了.

8. Grub打开debug

grub> set pager=1
grub> set debug=all

打开后打印会从terminal_output中可用的选项中输出. 所以建议增加串口后使用, 否则屏幕不支持回翻也挺麻烦的.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/190379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot启动项目自动动态加载数据库的groovy脚本

将groovy脚本保存在数据库中,页面支持动态增删改查,启动springboot项目时,从数据库中读取groovy配置表,然后编译脚本,项目中就可以直接调用使用脚本。 开发环境:springbootMybatisPlus 脚本实体类&#x…

c++ 的几种用法

1. 声明引用:别名 改变ref a 都修改源数据 源地址数值 int a 10; int& ref a; // 声明一个引用变量ref,它引用了变量a 为什么要用别名: 1 给变量起一个更容易理解的名子 2 给函数/方法 传参 取这个参数的地址的值 修改的是源数据值 更高效 不多用…

TD-LTE通信

TD-LTE 目录 1 TD-LTE的发展历程 2 1.1 第一代移动通信系统 2 1.2 第二代移动通信系统 2 1.3 第三代移动通信系统 2 1.4 第四代移动通信系统 3 2 TD-LTE简析概述 3 2.1 TD-LTE概念 3 2.2 TD-LTE的特点 3 2.3 TD-LTE的优缺点 4 2.3.1 优点 4 2.3.2 缺点 4 2.4 TD-LTE规模试验需…

mysql-binlog,redolog 和 undolog区别

binlog MySQL的binlog(二进制日志 或 归档日志)是一种记录数据库的更改操作的日志。它包含了对数据库进行的插入、更新和删除操作的详细信息。binlog是以二进制格式存储,可以用于恢复数据库、数据复制和数据同步等操作。具体来说&#xff0c…

工业机器视觉megauging(向光有光)使用说明书(五,轻量级的visionpro)

这个说明主要介绍抓线功能。 第一步,添加线工具,鼠标双击工具箱“抓线”,出现如下界面: 第二步,我们拉一条,“九点标定”到“抓线1”的线,和visionpro操作一样: 第三步,…

torch中的随机数种子

如何在torch生成随机数时,设置随机种子,要求每次调用生成的随机数都一样 在 PyTorch 中,可以使用 torch.manual_seed(seed) 函数设置随机种子,以确保每次运行代码时生成的随机数都一样。 以下是一个示例代码,展示了如…

vue循环v-for遍历图表

循环遍历图表 index.vue主页面 <view v-if"powerPage"><view v-for"(item, index) in powerDetailsData.addMap" :key"index"><PowerEChartsCity:echartData"powerDetailsData.addMap[index]"></PowerEChartsC…

LeetCode 1094. 拼车:优先队列

【LetMeFly】1094.拼车&#xff1a;优先队列 力扣题目链接&#xff1a;https://leetcode.cn/problems/car-pooling/ 车上最初有 capacity 个空座位。车 只能 向一个方向行驶&#xff08;也就是说&#xff0c;不允许掉头或改变方向&#xff09; 给定整数 capacity 和一个数组…

【JavaSE学习专栏】第03篇 数组

文章目录 1 数组的定义2 数组声明创建3 数组的初始化4 数组的四个基本特点5 数组边界6 数组的使用7 多维数组8 Arrays类9 冒泡排序9.1 原理9.2 代码实现 10 数组插入算法10.1 问题10.2 分析10.3 代码 11 稀疏矩阵11.1 稀疏数组介绍 1 数组的定义 数组是相同类型数据的有序集合。…

备战春招——12.1 算法

动态规划 动态规划的核心思想就是 本次只由上一次决定。 爬楼梯 第3阶由&#xff08;第1节2&#xff09;和&#xff08;第二节1&#xff09;&#xff0c;不要想着往下迭代&#xff0c;不然那是个无穷底。所以f(x)f(x-1)f(x-2) (x>2)。所以就是当前只与上个操作相关。 cla…

Jmeter组件执行顺序与作用域

一、Jmeter重要组件 1&#xff09;配置元件---Config Element&#xff1a; 用于初始化默认值和变量&#xff0c;以便后续采样器使用。配置元件大其作用域的初始阶段处理&#xff0c;配置元件仅对其所在的测试树分支有效&#xff0c;如&#xff0c;在同一个作用域的任何采样器…

肖sir__mysql之单表练习题2__(2)

mysql之单表练习题 一.建表语句 create table grade(class int(4),chinese int(8),english int(4),math int(8),name varchar(20),age int(8),sid int(4)primary key auto_increment) DEFAULT charsetutf8; insert into grade(class,chinese,english,math,name,age)values(1833…

012 OpenCV sobel边缘检测

目录 一、环境 二、soble原理介绍 三、源码实验 一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、soble原理介绍 Sobel边缘检测是一种广泛应用于图像处理领域的边缘检测算法&#xff0c;它通过计算图像灰度函数在水平方向和垂直…

微服务--03--OpenFeign 实现远程调用 (负载均衡组件SpringCloudLoadBalancer)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 OpenFeign其作用就是基于SpringMVC的常见注解&#xff0c;帮我们优雅的实现http请求的发送。 RestTemplate实现了服务的远程调用 OpenFeign快速入门负载均衡组件Spr…

Java医院综合绩效考核系统支持主流绩效方案

医院绩效考核管理系统是采用B/S架构模式设计、使用JAVA语言开发、后台使用MySql数据库进行管理的一整套计算机应用软件。系统和his系统进行对接&#xff0c;按照设定周期&#xff0c;从his系统获取医院科室和医生、护士、其他人员工作量&#xff0c;对没有录入信息化系统的工作…

软件测试经典面试题分析——软件测试流程(第1天)

需求分析 跟同事之间探讨客户需求 对需求文档进行测试 互相交换想法 2、需求评审 如何评审 首先提前一天发邮件给格个参会人员&#xff0c;准备参与XXX项目需求评审 参与人员&#xff1a;产品经理&#xff0c;项目经理&#xff0c;研发负责人&#xff0c;研发小组成员&a…

【前端】html不渲染换行\n\t\r等的问题

方法一 string.replace(/\r\n/g,</br>) 方法二 推荐 使用 pre 元素 <style> /* 设置 white-space 样式 */ pre {white-space: pre-wrap; } </style><div><pre>{{sqlHtml}}</pre></div>pre 元素 <pre> 元素可定义预格式化…

Python学习路线 - Python语言基础入门 - 基础语法

Python学习路线 - Python语言基础入门 - 基础语法 字面量什么是字面量常用的值类型字符串 注释注释的作用注释的分类 变量什么是变量变量的特征 数据类型type()语句type()语句的使用方式数据类型转换 标识符什么是标识符标识符命名规则标识符命名规则 - 内容限定标识符命令规则…

基于docker容器部署JVM参数分析

基于docker容器部署JVM参数分析 公司项目推荐的 jvm 配置&#xff0c;简述下配置含义 -XX:UseContainerSupport -XX:MaxRAMPercentage75.0 -XX:InitialRAMPercentage75.0 -XX:MinRAMPercentage75.0 // JVM提供了MaxRAMPercentage,InitialRAMPercentage,MinRAMPercentage三…

Go 语言中的结构体:定义、初始化与高级用法解析

一、结构体基础 1、什么是结构体 Go语言中没有“类”的概念&#xff0c;也不支持“类”的继承等面向对象的概念Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性 2、自定义类型 在Go语言中有一些基本的数据类型&#xff0c;如string、整型、浮点型、…