上一篇说,我觉得许多EFI SHELL的文章,总是没讲透。所以我想将EFI SHELL掀个底儿朝天。

磁盘上的EFI系统分区,即 EFI system partition,简写为 ESP。

UEFI类型的BIOS一般自带EFI SHELL,我们进入EFI SHELL中,就像进入了一个就简单的cli交互系统。通过命令可以看到bios与os之间的某些联系,也能看到一些操作系统引导的某些信息。

1、EFI SHELL简单操作

在UEFI BIOS的引导菜单中,通常都有EFI SHELL菜单。

选中回车即进入了EFI SHELL。

有些服务器的EFI SHELL命令和功能较全;而有些服务器需要通过厂商的诊断维护U盘执行其他EFI命令,来补充相关的EFISHELL功能。

1.1 map命令

使用map –b 可以看到当前可以引导操作系统的硬盘。

-b 分页显示 相当于 linux命令 more

map -b的说明:

fs是mount点,blkX是磁盘块设备分区;

UEFI承认的块设备分区blkX、也就是磁盘上的EFI分区,可以自动或者手动mount到某个fsX上;

比如shell>mount blk9 fs9——如果blk9是EFI分区,则可以正常挂载;

详细参考 help mount -b

mount成功后 再通过map -b看设备:

fs0:盘中的EFI esp分区(blk0)的mount点。Alias关键字后面的alias blk0 表示 blk0 mount 在fs0;

fs1:硬盘上的EFI esp分区(blk1)即hd(1,gpt)的mount点;

blk0:centos光盘介质的EFI blk设备;

blk1,5,6,7: 硬盘上的EFI esp分区(blk1)即hd(1,gpt);blk5-7,硬盘上的另外3个分区,分别对应hd(2,gpt),hd(3,gpt),hd(4,gpt);

————————map -b的说明完毕——————————————————

1.2 fsX的简单操作

对blk设备进行mount后,在EFISHELL里 可以对EFI分区进行ls等操作,在本实验中,只能对fs0,fs1进行ls和cd:

“fsX:”用于文件系统之间切换;

——————————————————————————————————

centos 所在硬盘里的EFI分区的内容:

在EFI SHELL里,.EFI就是bootloader,可以在EFISHELL中直接执行。

硬盘EFI esp里的内容 就是fs1(hd(1,gpt))里面的内容:

[root@localhost /]# cd /boot/EFI

[root@localhost EFI]# ls

EFI

[root@localhost EFI]# cd EFI

[root@localhost EFI]# ls

BOOT centos

[root@localhost EFI]# cd BOOT

[root@localhost BOOT]# ls -l

total 1340

-rwx------. 1 root root 1296176 Dec 7 2015 BOOTX64.EFI

-rwx------. 1 root root 73240 Dec 7 2015 fallback.EFI

[root@localhost BOOT]# cd ../centos

[root@localhost centos]# ls -l

total 5816

-rwx------. 1 root root 128 Dec 7 2015 BOOT.CSV

drwx------. 2 root root 4096 Jul 31 13:03 fonts

-rwx------. 1 root root 1025920 Nov 22 2016 gcdx64.EFI

-rwx------. 1 root root 4159 Jul 31 13:17 grub.cfg

-rwx------. 1 root root 1024 Jul 31 13:17 grubenv

-rwx------. 1 root root 1025920 Nov 22 2016 grubx64.EFI

-rwx------. 1 root root 1283952 Dec 7 2015 MokManager.EFI

-rwx------. 1 root root 1291512 Dec 7 2015shim-centos.EFI

-rwx------. 1 root root 1296176 Dec 7 2015 shim.EFI

[root@localhost centos]#

-rwx------. 1 root root 1025920 Nov 22 2016 grubx64.EFI——是可以执行启动linux的。

2、map命令中的磁盘设备路径

本部分的图与第一部分的图无关。

2.1 补充的Intel x86 CPU架构知识

假设该服务器是Intel skylake 两路服务器。

那么CPU0 的四个PCIBUSNO,会被BIOS初始化成:0x00,0x17,0x3a,0x5d;

那么CPU1 的四个PCIBUSNO,会被BIOS初始化成:0x80,0x85,0xae,0xd7;

除了第一个PCIBUSNO,其他三个CPU PCIBUSNO 对应的rootport,可以被劈成(bifurcate)以下几种方式:

1、一整个PCIBUS x16 pcie lane,形成 一个rootport;

2、一个PCIBUS x16 pcie 分成8x8 pcie lane,形成两个rootport;

3、一个PCIBUS x16 pcie 分成8x4x4 pcie lane,形成三个rootport;

4、一个PCIBUS x16 pcie 分成4x4x4x4 pcie lane,形成四个rootport;

如下图:

——服务器型号不同,则上图bifurcate的方式就不同,具体要看服务器厂商的电路设计以及服务器的系统逻辑图。

2.2 map设备路径

再看一台skylake服务器,浪潮I48某节点的EFI SHELL 的map命令输出:

就以FS0为例:

下面这个路径,从左到右,挨个的撸。

2.2.1   PCIroot(0x00)

代表了该磁盘所在的rootport编号(第0个rootport,第1个rootport,第2个rootport,,,,)

从操作系统的lspci -vt缩略树来看,rootport的编号和PCIE BDF位置如下:》》》粗体所示(注意iou bus 5d,明显的,该IOU 的 PCIE lanes被研发劈成了8x4x4,所以 bus 5d下有三个rootport)

-+-[0000:d7]-+-00.0-[d8-d9]--+-00.0 Intel Corporation 82599ES 10-GigabitSFI/SFP+ Network Connection 》》》这个00.0 是系统第9个rootport;

| | \-00.1 Intel Corporation 82599ES 10-GigabitSFI/SFP+ Network Connection

| +-05.0 Intel Corporation Device 2034

+-[0000:ae]-+-00.0-[af-b2]----00.0 Intel Corporation PCIe Data Center SSD 》》》这个00.0 是系统第8个rootport;

| +-05.0 Intel Corporation Device 2034

+-[0000:85]-+-05.0 Intel Corporation Device 2034 》》》05.0 前面的 00.0没有插卡,所以,lspci没显示00.0。这个没显示的00.0 是系统第7个rootport;

+-[0000:80]-+-04.0 Intel Corporation Sky Lake-E CBDMA Registers 》》》04.0 前面的 00.0没有插卡,所以,lspci没显示00.0。这个没显示的00.0 是系统第第6个rootport;

+-[0000:5d]-+-00.0-[5e-61]----00.0-[5f-61]----03.0-[60-61]--+-00.0Intel Corporation Ethernet Connection X722 for 1GbE 》》》系统第3个rootport

| | +-00.1 Intel Corporation Ethernet Connection X722for 1GbE

| | +-00.2 Intel Corporation Ethernet Connection X722for 1GbE

| | \-00.3 Intel Corporation Ethernet Connection X722for 1GbE

| +-02.0-[62]-- 》》》系统第4个rootport

| +-03.0-[63]-- 》》》系统第5个rootport

| +-05.0 Intel Corporation Device 2034

+-[0000:3a]-+-00.0-[3b]----00.0 LSI Logic / Symbios Logic MegaRAID SAS-33108 [Invader] 》》》系统第2个rootbus

| +-05.0 Intel Corporation Device 2034

+-[0000:17]-+-05.0 Intel Corporation Device 2034 》》》05.0 前面的 00.0没有插卡,所以,lspci没显示00.0。这个没显示的00.0 是第系统1个rootbus

\-[0000:00]-+-00.0 Intel Corporation Sky Lake-E DMI3 Registers》》》系统第0个rootbus

+-04.0 Intel Corporation Sky Lake-E CBDMA Registers

+-11.5 Intel Corporation C610/X99 series chipset sSATAController [RAID mode]

——所以如上所述, fs0 所在最top的rootport是:-[0000:00]-+-00.0 Intel Corporation Sky Lake-E DMI3 Registers 》》》第0个rootport(其实就是DMI连接的PCH南桥)。所以 fs0的路径PciRoot为0x0。

2.2.2 pci(0x11,0x5)

pci(0x11,0x5) 与fs0 的 的sata控制器的dev,function 一致

lsblk:

?..md126 9:126 0 849.5G 0 raid0

?..md126p1 259:0 0 200M 0 md /boot/efi/

/sys/devices/pci0000:00/0000:00:11.5/ata1/host3/target3:0:0/3:0:0:0/block/sdc/holders/md126

2.2.3 sata(05,0x8000,0x1)

这个确实不知道。

2.2.4 HD(1,gpt,748ae5f2-2aa3-4cec-a074-976d6fef0895,0x800,0x64000)

1:表示这是磁盘的第一个partition(盘的分区就是从1开始);

gpt:表示该磁盘为gpt分区类型;

748ae5f2-2aa3-4cec-a074-976d6fef0895

对应 blkid的PartUUID:

[root@localhost ~]# blkid

/dev/sdc: TYPE="isw_raid_member"

/dev/sdd: TYPE="isw_raid_member"

/dev/md126p1: SEC_TYPE="msdos"UUID="3D70-7403" TYPE="vfat" PARTLABEL="EFI SystemPartition" PARTUUID="748ae5f2-2aa3-4cec-a074-976d6fef0895"

(补充 UUID="3D70-7403" 在分区的分区头,该uuid是分区内的文件系统的uuid。这里的分区 是磁盘的第一个分区。分区的物理起始地址是0x100000,所以UUID:3D70-7403在下图地址:

)

PARTUUID也就是对应gpt硬盘的盘头 LBA2 中 第一个分区的meta(from 绝对字节地址0x400)信息中的一部分数据,绝对字节地址(0x410~0x41f),表示分区的uuid:

748ae5f2-2aa3-4cec-a074-976d6fef0895

0x800:分区开始的扇区号:

Disk /dev/md126: 912.1 GB, 912141582336 bytes,1781526528 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 131072 bytes / 262144bytes

Disk label type: gpt

Disk identifier: BE6F6087-1C3E-4BF9-BDB2-6BE87F471B34

(

disk identifier 对应 盘头 LBA1 地址0x238~0x247处:

)

# Start End Size Type Name

1 2048 411647 200M EFI System EFI System Partition

2 411648 2508799 1G Microsoft basic

3 2508800 1781524479 848.3G Linux LVM

——start 2048=0x800 扇区,就是这个0x800;(当然,每个扇区是512字节,所以start 2048也就是 start 字节地址0x100000);

——end 411647,所以 part的大小就是 411647-2048+1=409600=0x64000个扇区

至此,map设备路径解析完毕。

3、启动项

3.1 添加USB安装盘,map的前后变化

原始的map信息:

通过bcfg boot dump –v来查看当前的OS启动项:

bmc 的kvm远程加载一个 redhat安装iso——模拟一个光驱设备:

此时efishell里的map里还没有这个虚拟cdrom;

从efi shell>exit返回到 bios仿真图形,然后再进入boot manager,boot manager应该是自动扫描了启动设备,此时启动项里便有了usb/cdrom;

然后再进入efishell>map -b,就有了虚拟cdrom了:

3.2 通过bcfg命令添加启动项

节点 的bios 中似乎没有“手工添加启动项” 的功能菜单。

刀片所用的bios厂商信息记录如下:

——也许其他机型、其他logo 的bios有 “手工添加启动项” ,但是本机BIOS中没有这个功能。

在这种情况下,可以尝试用EFI SHELL里的bcfg命令来添加启动项zxpuboot。

先查看当前的启动项:

help bcfg -b:

先尝试添加引导项:第一次添加失败(用blk设备名路径,添加失败),第二次添加成功(用fs设备名路径,添加成功)

返回看看 bootmanager 仿真界面,确实有了“zxpuboot”选项:

并且zxpuboot也可以正常引导:

在某些特殊情况下,例如:升级bios以后启动项丢失,我们就可以使用以上方法添加启动项。

3.3 dmpstore查看更底层的启动项

shell>dmpstore boot* -b (注:下图输出中,每一行中间的 “-” (例如20-01,中间的“-”)没有意义,忽略)

上图说明:

1、bootcurrent:当前启动在什么地方,上图值为0008;而下面的图中,boot0008项表示为EFI SHELL;

2、bootorder:顺序分别为 0009,0000,2002,2003,2001,0008.

根据下面系列图片,也以知道:

boot0009 为 redhat enterpriselinux\EFI\redhat\shimx64.efi

boot0000 为 linpus lite\EFI\boot\grubx64.efi

boot2002 为 EFI cdrom

boot2003 为 EFI network

boot2001 为 EFI usb

boot0008 为 EFI Shell

其实也可以通过shell>setvar BootOrder来查看变量BootOrder的值:

——所以 dmpstore boot* -b命令 的boot order结果,对应:bios界面 boot菜单下的"Boot Type Order":

也对应 shell>btcfg boot dump -v的结果。

3、通过上图,可以看到

板载网卡(BMC 的dedicate+share的MAC 在A8处:2500 后面的 6c 92 bf 9a 66 3d/3c;(boot000B,boot0001)

网卡x722的的MAC 在 B2处:2500后面的 6c92 bf 9a 66 3e;(boot0002~0005)

x520 网卡的MAC地址在 A0 处:2500后面的f8 f2 1e 2c b2 80(boot0006~0007)

——参照 下面的 “bios中网卡mac”

另外也可以推导出:

dmpstore boot* -b命令 的boot order结果;

boot order:顺序分别为 0009,0000,2002,2003,2001,0008.

根据下面系列图片,也以知道:

boot0009 为 redhat enterpriselinux\EFI\redhat\shimx64.efi

boot0000 为 linpus lite\EFI\boot\grubx64.efi

boot2002 为 EFI cdrom

boot2003 为 EFI network

boot2001 为 EFI usb

boot0008 为 EFI Shell

——若network列出详细的NETWORKPXE设备,就相当于:

服务器启动时,若输入F11中断,进入boot Manager,手工选择启动项,这些列出来的启动项:

3.4 PXE网卡启动测试

当我们遇到PXE安装失败时,我们可以通过EFI SHELL中的相关命令 手工测试本地PXE网卡 tftp PXE server。

fat32 的U盘上有下载的tftp.efi:

3.4.1 静态IP测试

首先看看 网卡在uefi阶段设置的 eth0 的静态ip(配置方法参考云笔记:”i48测试” ):

从efi的tftp client端 ping tftp server 不通——这是浪潮内网的问题。

tftp.efi的语法错误:

——也就是说,以后不要再写 “/”了。

从efi客户端 尝试tftp 一个不存在的ip 10.48.4.31(模拟IP不通):

不启动远端tftpserver 的情况下(IP通,但没有tftpserver服务),强制启动 tftp client:结果和ip不通是一样一样的,提示unable to get the size of.....timeout

启动tftp server,但是指定错误的文件目录:

尝试 tftp client连接,提示:提示unable to get the size of.....TFTPError

正确的设置 tftp server的根路径:

尝试tftp client连接:成功

再次故意错误设置tftp server 上的文件路径:

tftp client 又提示:unable to get the size of.....TFTPError

最后恢复正确的tftpserver 的文件路径:

tftpclient 运行成功:

tftp client指定 nic 方式连接也运行 成功:

efi本地fs1确实也下载了mbrsda4k文件:

3.4.2 动态IP获取测试

测试ifconfig -s eth0 dhcp来获取dhcpIP地址。

步骤略。

——本篇为x86架构与 linux操作系统的最后过渡。本篇结束后,x86架构系列暂告一段落。

linux lspci信息 详解_Linux引导之EFI SHELL详解相关推荐

  1. linux lspci信息 详解_Linux硬件管理命令--lspci命令详解

    命令说明: lspci 是一个用来显示系统中所有PCI总线设备或连接到该总线上的所有设备的工具 参数: -v 使得 lspci 以冗余模式显示所有设备的详细信息. -vv 使得 lspci 以过冗余模 ...

  2. linux网卡驱动离线安装_Linux下安装网卡驱动程序详解 | 吴文辉博客

    我的centos 5.5网卡驱动是r8169,而官方网站出来了最新驱动是r8168,这让我感觉很怪异,r8169这些数据难道不代表驱动版本,还是r8169不是官方开发的.以防万一换了在说.下面将以我的 ...

  3. linux 自建yum源_Linux 搭建YUM仓库源详解

    基于ISO镜像构建 YUM 本地源 1.yum install httpd:安装httpd软件包.yum remove httpd:卸载httpd软件包.yum erase httpd:删除httpd ...

  4. linux文件移出目录命令_Linux 文件与目录管理详解

    一.目录树 在 Linux 底下,所有的文件与目录都是由根目录开始的. 根目录是所有目录与文件的源头,再一个一个的分支下来,有点像是树枝状. 因此,我们也称这种目录配置方式为:『目录树(directo ...

  5. linux mv 保持目录结构_Linux中的mv命令详解

    mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录. 1.命令格式: mv [选项] 源文件或目 ...

  6. linux efi shell,EFI Shell 命令说明

    EFI Shell命令说明 引导命令- EFI Shell与 nPartition引导有关的命令. autoboot         设置(查看)自动引导超时变量. bcfg 显示(或修改)驱动程序( ...

  7. Linux 开机引导和启动过程详解

    你是否曾经对操作系统为何能够执行应用程序而感到疑惑?那么本文将为你揭开操作系统引导与启动的面纱. 理解操作系统开机引导和启动过程对于配置操作系统和解决相关启动问题是至关重要的.该文章陈述了 GRUB2 ...

  8. rhel系统启动过程_技术|Linux 开机引导和启动过程详解

    你是否曾经对操作系统为何能够执行应用程序而感到疑惑?那么本文将为你揭开操作系统引导与启动的面纱. 理解操作系统开机引导和启动过程对于配置操作系统和解决相关启动问题是至关重要的.该文章陈述了 GRUB2 ...

  9. 黑苹果引导工具 Clover 配置详解及Clover Configurator使用

    黑苹果引导工具 Clover 配置详解及Clover Configurator使用 2017-03-11 14:01:40 by SemiconductorKING 转自:@三个表哥 简介: 可引导m ...

最新文章

  1. Asp.Net站点整合Discuz论坛实现同步注册和单点登录
  2. mongodb 监控命令mongostat
  3. layui数据表格(一:基础篇,数据展示、分页组件、表格内嵌表单和图片)
  4. 家装强电弱电布线图_关于你不知道的弱电改造详解 提早了解好做准备
  5. 计算机系统的组成doc,计算机系统由(组成.doc
  6. 需求分析的初稿出来了
  7. Zabbix(二)通过API在zabbix系统中查看、删除及创建监控主机
  8. POJ 3683 Priest John's Busiest Day (算竞进阶习题)
  9. 将越狱进行到底 Pod2g邀约众大神组建evad3rs
  10. 全球及中国车险行业十四五渠道营销与竞争战略规划报告2022-2028年
  11. 英语时态:一般、否定疑问句、现表将来(中文练到无停顿)
  12. C#中使用设置(Settings.settings) Properties.Settings.Default .
  13. 十八种最好的室内植物
  14. SpringCloud Alibaba 实战之《限流与熔断:Sentinel 在项目中的最佳实践》
  15. 与设备无关的彩色空间
  16. 175Echarts - 象形柱图(Spirits)
  17. NodeMCU入坑指南-低成本打造零舍友闻风丧胆WiFi断网神器
  18. 【小彬学vue系列专栏】001 | 出发吧,带上背包和Vue
  19. Problem 07 龟兔赛跑
  20. 支付宝iot小程序开发文档

热门文章

  1. IOS15一个工作空间创建多个项目
  2. IOS基础之Foundation框架常用类NSFileManager,DSDate,CGPoint,CGSize,copy,单例
  3. android m权限工具类,android M权限适配,简单工具类
  4. linux裸机网络安装,linux下PXEServer实现网络安装【实验】
  5. boa linux arm修改网卡,嵌入式linux架设boa webserver
  6. android java 调用js,Android中Java和JavaScript交互实例
  7. 基于深度学习的视频预测研究综述
  8. textview文本超出部分用省略号表示
  9. windows 10下的kiosk模式
  10. Flutter开发之实现沉浸式状态栏的效果