您的位置 首页 知识

efi系统分区(Linux引导之EFI SHELL详解)

efi系统分区
上一篇说,我觉得许多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 –
bmount成功后 再通过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 分成8×8 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,0×8000,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 enterpriselinuxEFIredhatshimx64.efi
boot0000 为 linpus liteEFIbootgrubx64.efi
boot2002 为 EFI cdrom
boot2003 为 EFI network
boot2001 为 EFI us
bboot0008 为 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 enterpriselinuxEFIredhatshimx64.efi
boot0000 为 linpus liteEFIbootgrubx64.efi
boot2002 为 EFI cdrom
boot2003 为 EFI network
boot2001 为 EFI us
bboot0008 为 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架构系列暂告一段落。

efi系统分区相关文章


返回顶部