linux lspci信息 详解_Linux引导之EFI SHELL详解

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

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

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

1EFI SHELL简单操作

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

6027661cb51705971fd23421d6c4c7c7.png

选中回车即进入了EFI SHELL。

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

1.1 map命令

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

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

3fa371872c990b691b055bda0d7133f3.png

2542cc82c57cc99d93ea56af985c5995.png

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:

f7245c7549b793c49119476439d42755.png

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

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

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

33432c22c818a08655c1319e9a436009.png

在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的。

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

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

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;

如下图:

a97e544ada1656cf75b1042318cf9fd9.png 

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

2.2 map设备路径

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

d3c1876801aa34fb2a52d80c4cf240ce.png

就以FS0为例:

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

22d41010b381bf19a2bf523921838c3b.png

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(0x110x5)

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在下图地址:

1a40e04d9a7c685dec57ef2583e373ba.png

)

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

c689b2e65e9923607e690c9ba7d76df9.png

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处:

d349bf45ec52c60ee817a19c2883decb.png

)

# 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信息:

f73418ba76a3043feef696337da5a727.png

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

47d0db22018f76760d5cb009c1b68739.png

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

36661a5edec527500fdcdd55aef35a6d.png

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

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

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

8d6695ec727a9f7140abb137008143ea.png

3.2 通过bcfg命令添加启动项

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

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

224aac7ba4ff3069b1a2e900b1d5056e.png

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

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

先查看当前的启动项:

f020c00b063b905853089e9006360c90.png

help bcfg -b:

389e471cc53c75bf9a43257447ad4661.png

2bb16ef700ee5128b3ef7dfe50d4f556.png

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

823bc17e2465ee44da288090fdb92672.png

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

e867e05eb3513f61e3b6da97193ef22b.png 

并且zxpuboot也可以正常引导:

754641a6beccc8dcb73d6858c3ba95fb.png

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

3.3 dmpstore查看更底层的启动项

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

449be350ca55b42136ce3e3d2918f160.png

0dab39d39f9ca59bff5a2ac70cc03d0a.png

2866bd36f5dbf7509f76ccab323a23e7.png

27868f5f94e41d2ca7be67c31062fb88.png

111d22072fd45b171b97b268420eadea.png 

上图说明:

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的值:

35942f47bf90c0939f61b5327a6b18aa.png

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

e8925094998defd5f9ba02ca0d74aed4.png

也对应 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”

4b9eb7a481c3cf250594d95194c3797a.png

另外也可以推导出:

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,手工选择启动项,这些列出来的启动项:

ce3d882f99bd318780aa1ce2c37ec0f6.png

3.4 PXE网卡启动测试

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

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

0cac0e1b9f3a0e4cc470ea64177e4b04.png

4118dc756edd582aa40d120822a06470.png

3.4.1 静态IP测试

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

b5b6be6e46e0008c7685ca1cacfac317.png

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

37463c446160b82308c627136c9a2802.png

tftp.efi的语法错误:

35767f1e2e28cd5fba65ac63c6ccadc2.png

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

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

114fedc4945b2d59b2773867b0c3724a.png

816845551a7cf0e553ccbfc3230da72b.png

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

da73d832c9b76b10f310604370999dc5.png

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

3466536cd3cd6e8f10b71dbdad84a11b.png

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

89cae96399c3ac05adb579a4d8cbd9f3.png

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

94288ce5375d051a21a48f345ff43894.png

b625e8253bcff8f573910ed139afe94a.png

尝试tftp client连接:成功

292d9980503252455f8c7e2b5ddf91b4.png

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

2565749e25a8552c89d769209d32e3e7.png

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

b01e1d3690302c8d963c58de89449ca5.png

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

94288ce5375d051a21a48f345ff43894.png

tftpclient 运行成功:

00ea0d4de71dc40d7e3501fd1f5a6de1.png

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

8425e3c1a259355fdcbf01cf089169d3.png

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

8175175b84c72807a6ddafe0dddb7353.png

3.4.2 动态IP获取测试

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

步骤略。

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

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值