linux lspci信息 详解_Linux引导之EFI SHELL详解
上一篇說,我覺得許多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详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 12 天直降 891 元:苹果 Mac
- 下一篇: 要约收购后股价怎么走 要约收购的意思