UEFI Shell là gì?

Giải thích sâu UEFI Shell cho firmware engineer: cách dùng map, fs0:, dmpstore, bcfg, dh, devtree, drivers, connect, memmap, startup.nsh để debug boot, NVRAM, ESP và Device Path.

Cập nhật 20 phút đọc
UEFI Shell / Debug cover

UEFI Shell là môi trường dòng lệnh chạy trực tiếp trong UEFI firmware, trước khi hệ điều hành được boot. Với firmware engineer, đây là một công cụ debug cực kỳ mạnh vì nó cho phép kiểm tra filesystem, ESP, boot variables, device path, driver/protocol, memory map, và chạy các EFI application mà không cần OS.

Nói ngắn gọn: UEFI Shell là “terminal” trong thế giới UEFI, dùng để quan sát và can thiệp vào boot environment trước khi OS chạy.

Ví dụ trong UEFI Shell, bạn có thể làm các việc như:

map -r
fs0:
dir EFI\BOOT
dmpstore BootOrder
bcfg boot dump
drivers
dh
devtree
connect -r
memmap

Những lệnh này giúp debug các lỗi như:

  • BootOrder đúng nhưng máy không boot
  • BootNext không có tác dụng
  • Boot#### trỏ sai ESP
  • USB boot không hiện
  • File BOOTX64.EFI có nhưng firmware không load
  • Device Path stale sau clone disk
  • Variable Store full
  • Driver chưa connect
  • Filesystem chưa xuất hiện

UEFI Shell nằm ở đâu trong boot flow?

UEFI Shell trong firmware boot flow

SEC / PEI / DXE / BDS
└─ BDS Boot Manager
   ├─ Boot Windows/Linux loader
   ├─ Boot USB installer
   ├─ Boot recovery/updater
   └─ Boot UEFI Shell
      ├─ Shell.efi hoặc BOOTX64.EFI
      ├─ map/fs0:/dmpstore/bcfg
      ├─ dh/devtree/drivers/connect
      └─ Run EFI apps/scripts

UEFI Shell bản chất cũng là một EFI application. Firmware có thể boot nó như một boot option, từ ESP, từ USB fallback path, hoặc từ built-in shell nếu platform có tích hợp.

Vì sao firmware engineer cần UEFI Shell?

UEFI Shell dùng để debug gì?
Mảng debug Lệnh thường dùng Giúp kiểm tra
ESP/filesystem map, fs0:, dir, cd, type Firmware có thấy filesystem và file .efi không
Boot variables dmpstore, bcfg BootOrder, BootNext, BootCurrent, Boot####
Device Path bcfg, dh, devices, devtree Boot option trỏ tới đâu, handle path là gì
Driver/protocol drivers, dh, devtree, connect Driver đã bind chưa, protocol có xuất hiện không
Memory memmap UEFI memory map trước OS
Automation startup.nsh Chạy lệnh tự động khi vào shell
EFI app test chạy file .efi Test app, updater, diagnostic, shell tool

Cách boot vào UEFI Shell

Có nhiều cách vào UEFI Shell tùy platform.

Cách vào UEFI Shell
Cách Mô tả Rủi ro/debug
Built-in Shell Firmware tích hợp sẵn shell trong BIOS Setup hoặc Boot Menu Không phải platform nào cũng có
Shell trên ESP Tạo Boot#### trỏ tới Shell.efi trên ESP Cần Boot#### đúng path
Shell USB fallback Đặt shell thành \EFI\BOOT\BOOTX64.EFI trên USB x64 Secure Boot/architecture phải đúng
BootNext vào Shell Set BootNext tới Boot#### của shell Cần clear BootNext để tránh loop
Boot menu direct Chọn USB/Shell từ one-time boot menu Có thể không ghi NVRAM
Vendor debug build Firmware debug menu có shell Không nên bật trong production nếu policy cấm

Với máy x64, cách cứu hộ phổ biến là USB có:

\EFI\BOOT\BOOTX64.EFI

Trong đó BOOTX64.EFI chính là UEFI Shell binary hoặc bootloader chain vào shell.

UEFI Shell và Secure Boot

UEFI Shell là một EFI image, nên nếu Secure Boot bật, shell cũng phải được signed/trusted theo policy.

UEFI Shell và Secure Boot
Tình huống Triệu chứng Hướng kiểm tra
Shell unsigned USB shell không chạy khi Secure Boot on Signature/db/dbx
Shell signed/trusted Boot được nếu policy cho phép Cert/key phù hợp
Secure Boot off thì chạy Vấn đề trust, không phải path So trạng thái on/off
Production platform Shell có thể bị disable Platform security policy
Vendor debug shell Nguy hiểm nếu bật ngoài ý muốn Disable/lock trong production
Recovery shell Cần kiểm soát quyền Không bypass boot policy

Lệnh map: xem filesystem mappings

map hiển thị mapping giữa UEFI handles/filesystems và tên như fs0:, fs1:, blk0:.

Lệnh thường dùng:

map
map -r

map -r refresh mapping, hữu ích sau khi connect device hoặc cắm media.

map dùng để làm gì?
Lệnh Ý nghĩa Debug
map Hiển thị mapping hiện tại Xem fs0:, fs1: có tồn tại không
map -r Refresh mapping Sau connect -r hoặc media mới
fs0: Chuyển sang filesystem fs0 Vào ESP/USB filesystem
blk0: Block device chưa có filesystem mapping Có disk nhưng chưa đọc được FS
map output Có thể hiển thị device path So với Boot#### path
Không có fsX Filesystem chưa xuất hiện Driver/connect/filesystem issue

Ví dụ:

Shell> map -r
Shell> fs0:
FS0:\> dir

Nếu không có fs0:, có thể firmware chưa thấy filesystem, hoặc chưa connect driver, hoặc filesystem không được hỗ trợ.

Lệnh fs0:, dir, cd, type

Sau khi có mapping, bạn có thể vào filesystem:

fs0:
dir
cd EFI
dir
cd BOOT
dir

Ví dụ kiểm tra fallback boot path:

fs0:
dir EFI\BOOT

Nếu có BOOTX64.EFI, USB/ESP có file fallback x64.

Checklist kiểm tra ESP bằng Shell

Lệnh dmpstore: đọc và ghi UEFI variables

dmpstore dùng để dump UEFI variables. Đây là lệnh quan trọng khi debug BootOrder, BootNext, BootCurrent, Boot#### và variable store.

Ví dụ:

dmpstore BootOrder
dmpstore BootNext
dmpstore BootCurrent
dmpstore Boot0001
dmpstore -all
dmpstore dùng để debug gì?
Variable Ý nghĩa Cần xem
BootOrder Thứ tự boot mặc định Array UINT16: 0001, 0003...
BootNext One-time boot option Có được clear không
BootCurrent Entry đang dùng ở lần boot hiện tại Firmware boot từ Boot#### nào
Boot#### EFI_LOAD_OPTION Attributes, Description, Device Path, OptionalData
SecureBoot Trạng thái Secure Boot Security context
Setup variables BIOS setup variables tùy platform Cẩn thận khi sửa
db/dbx/PK/KEK Secure Boot databases Không sửa nếu không hiểu rõ

Lệnh bcfg: quản lý boot option

bcfg là lệnh UEFI Shell dùng để xem và sửa boot options, nếu shell build có hỗ trợ.

Ví dụ:

bcfg boot dump
bcfg boot add 0 fs0:\EFI\BOOT\BOOTX64.EFI "UEFI USB Shell"
bcfg boot rm 3
bcfg boot mv 2 0
bcfg dùng để làm gì?
Lệnh Ý nghĩa Debug
bcfg boot dump Liệt kê boot options Xem Boot#### theo dạng dễ đọc hơn
bcfg boot add Thêm boot option Tạo Boot#### trỏ file .efi
bcfg boot rm Xóa boot option Cleanup stale/duplicate Boot####
bcfg boot mv Đổi thứ tự boot Sửa BootOrder
bcfg driver dump Liệt kê driver options nếu hỗ trợ Ít dùng hơn boot debug
Không có bcfg Shell build thiếu command Dùng dmpstore/OS tool hoặc shell khác

bcfg rất tiện nhưng cũng nguy hiểm. Trước khi xóa entry, hãy dump BootOrder/Boot#### và chắc chắn entry đó không còn dùng.

Lệnh dh: xem handles và protocols

dh thường dùng để dump handles và protocols. Trong UEFI, thiết bị, driver, filesystem, loaded image đều được quản lý qua handle/protocol database.

Ví dụ:

dh
dh -p SimpleFileSystem
dh -p BlockIo

Tùy shell build, syntax có thể khác.

dh dùng để debug gì?
Mục tiêu Protocol cần tìm Ý nghĩa
Filesystem Simple File System Protocol Có fsX mapping nếu filesystem được expose
Disk/block device Block I/O Protocol Firmware thấy block media
Loaded image Loaded Image Protocol EFI app/loader đã load
Device path Device Path Protocol Handle có device path gì
Driver binding Driver Binding Protocol Driver có thể bind controller
Network Simple Network Protocol NIC/network boot support

Nếu map không có fs0:, dùng dh để xem có Block I/O hay Simple File System Protocol không sẽ giúp xác định lỗi nằm ở layer nào.

Lệnh devtree: xem cây thiết bị

devtree hiển thị cây device/handle theo quan hệ controller/child. Đây là lệnh hữu ích khi debug PCI, USB, NVMe, SATA, network path.

devtree
devtree dùng để debug gì?
Use case Giúp thấy gì Debug
USB boot USB controller, hub, device, mass storage child USB chưa enumerate ở đâu
NVMe boot NVMe controller và block devices Disk có xuất hiện không
SATA boot AHCI controller và drives Controller/drive path
Network boot NIC và network protocols PXE path
Driver binding Controller có child handles không Driver chưa bind hoặc bind fail
Device Path Quan hệ path thực tế So với Boot#### device path

Nếu devtree không thấy USB device, đừng debug BOOTX64.EFI vội.

Lệnh drivers: xem driver đã load

drivers hiển thị danh sách UEFI drivers đã load. Khi device không xuất hiện, cần kiểm tra driver có load/bind không.

drivers
drivers dùng để debug gì?
Driver Cần cho Nếu thiếu
USB xHCI driver USB controller init USB boot không hiện
USB Mass Storage driver USB disk thành Block I/O USB có thể detect nhưng không có disk
NVMe driver NVMe disk boot Không thấy NVMe drive
AHCI/SATA driver SATA disk boot Không thấy SATA disk
FAT filesystem driver Đọc ESP/FAT Không có fsX mapping
Network driver PXE/network boot Không có network boot

Driver load không có nghĩa driver đã bind. Cần kết hợp devtree, dhconnect.

Lệnh connect: connect controller/driver

connect dùng để connect driver với controller. Trong debug, lệnh phổ biến là:

connect -r
map -r

connect -r cố gắng connect recursively, giúp protocol/filesystem xuất hiện nếu trước đó chưa được connect.

01 Before

Before connect

USB/disk có thể chưa có fsX mapping.

02 Connect

connect -r

Shell yêu cầu connect controller/driver recursively.

03 Bind

Driver binding

USB/NVMe/SATA/FAT drivers bind nếu có.

04 Expose

Protocols appear

Block I/O, Simple File System xuất hiện.

05 Refresh

map -r

Refresh fsX mappings.

06 Access

fs0:/dir

Vào filesystem và kiểm tra file.

connect -r có thể làm filesystem xuất hiện sau khi driver bind.

Lệnh memmap: xem UEFI memory map

memmap hiển thị UEFI memory map trong Shell. Nó hữu ích khi debug memory type, runtime regions, boot services memory, reserved memory hoặc các vấn đề trước ExitBootServices.

memmap
memmap dùng để debug gì?
Thông tin Ý nghĩa Liên hệ
Conventional Memory Vùng RAM dùng được OS loader sẽ dùng
Boot Services Code/Data Memory dùng bởi boot services Được reclaim sau ExitBootServices
Runtime Services Code/Data Vùng runtime cần map sau OS boot UEFI runtime services
Reserved Memory Firmware/hardware reserved ACPI/SMRAM/MMIO context
ACPI Reclaim/NVS ACPI tables/state OS cần xử lý đúng
Memory map key ExitBootServices cần key đúng OS loader debug

Trong blog BIOS/UEFI, memmap sẽ nối với bài UEFI Memory Map.

startup.nsh: script tự động khi vào Shell

startup.nsh là script Shell có thể được chạy tự động khi UEFI Shell khởi động, tùy shell/platform policy.

Ví dụ:

echo Starting debug script
map -r
fs0:
dir EFI\BOOT
pause
startup.nsh dùng để làm gì?
Use case Ví dụ Cẩn thận
Debug tự động map -r, dump info Không chạy lệnh phá boot
Firmware update Chạy updater.efi Cần kiểm soát power/security
Test app Chạy EFI app nhiều lần Log status rõ ràng
Factory flow Provisioning script Không để lọt vào production
Recovery Chạy tool kiểm tra ESP/NVRAM Có user confirmation nếu sửa variable
Boot loop risk startup.nsh tự chạy lại mỗi boot Cần stop condition

UEFI Shell debug BootOrder/Boot####

Một workflow debug BootOrder trong Shell:

Checklist debug BootOrder bằng UEFI Shell

Ví dụ:

dmpstore BootOrder
dmpstore Boot0001
bcfg boot dump

UEFI Shell debug ESP

Workflow kiểm tra ESP:

Checklist debug ESP bằng UEFI Shell

UEFI Shell debug USB/removable boot

Workflow khi USB không boot:

01 Policy

Check Setup policy

USB boot/Fast Boot/Secure Boot.

02 Connect

connect -r

Connect driver/controller.

03 Map

map -r

Refresh filesystem mappings.

04 FS

Find fsX

Tìm USB filesystem.

05 Path

Check fallback path

dir EFI\BOOT và BOOTX64.EFI.

06 Run

Run EFI file

Thử chạy file nếu policy cho phép.

Debug USB boot bằng Shell nên đi từ controller tới file.

Checklist:

Checklist USB boot bằng Shell

UEFI Shell debug Device Path

Shell không chỉ xem file. Nó còn giúp xem handles/protocols và device path.

Shell command cho Device Path debug
Lệnh Dùng khi Ý nghĩa
bcfg boot dump Xem boot option Có thể in path dễ đọc
dh Xem handles/protocols Handle có Device Path Protocol không
devtree Xem device tree Quan hệ controller/child
map Xem fsX mapping Filesystem path
drivers Xem driver loaded Driver có trong hệ thống không
connect Connect controller Làm path/protocol xuất hiện
dmpstore Boot#### Dump raw variable Cần parser nếu muốn đọc sâu

Nếu DevicePathToText trong firmware log không có, Shell output có thể giúp đối chiếu.

Debug Diary: BootOrder đúng nhưng không boot Windows

Triệu chứng:

BootOrder = 0001
Boot0001 = Windows Boot Manager

Nhưng máy vào BIOS hoặc boot fail.

Shell workflow:

Checklist BootOrder đúng nhưng Windows không boot

Debug Diary: USB có BOOTX64.EFI nhưng boot menu không thấy

Shell workflow nếu vào được shell từ nguồn khác:

connect -r
map -r

Nếu sau đó xuất hiện fs1:, thử:

fs1:
dir EFI\BOOT

Nếu thấy BOOTX64.EFI, USB/filesystem OK. Lỗi có thể do boot policy hoặc Fast Boot không scan USB trong BDS path.

Nếu không thấy fsX nhưng thấy blkX, nghi filesystem/partition. Nếu không thấy cả blkX, nghi USB controller, port, driver hoặc policy.

Debug Diary: BootNext loop vào updater

Một updater set BootNext vào Shell/updater path rồi reset. Máy cứ quay lại updater.

Shell giúp kiểm tra:

Checklist BootNext loop bằng Shell

Failure pattern thực tế

Failure pattern khi dùng UEFI Shell
Triệu chứng Khả năng cao Hướng kiểm tra
Không vào được Shell Shell không có, Secure Boot block, Boot#### sai Shell path, signature, BootOrder
Không có fs0: Filesystem chưa xuất hiện hoặc không support connect -r, map -r, drivers
Có blk nhưng không có fs Block device có, filesystem không đọc được FAT/ESP/driver
Có fs nhưng không thấy EFI folder Không phải ESP cần tìm Thử fs khác, so HD node
dmpstore không thấy Boot#### Variable missing/corrupt Variable store, BootOrder consistency
bcfg không có Shell build thiếu command Dùng dmpstore hoặc shell khác
connect -r không giúp Thiếu driver hoặc policy block drivers/devtree/dh
Shell USB không chạy Sai architecture hoặc Secure Boot BOOTX64/BOOTIA32, signature
startup.nsh chạy loop Script tự reset/boot lại Stop condition, rename script
Lệnh syntax khác Shell version/build khác help command, shell docs

Instrumentation nên có trong firmware khi hỗ trợ Shell debug

Firmware log nên hỗ trợ Shell debug
Vị trí Log nên có Mục tiêu
BDS BootNext/BootOrder/Boot#### selected So với dmpstore/bcfg
Device path DevicePathToText output So với shell path
Driver connect ConnectDevicePath status So với connect -r
Filesystem Simple FS open status So với map/fsX
LoadImage EFI_STATUS Biết file/security/unsupported
Secure Boot Verification status Giải thích shell/app bị block
Variable SetVariable/GetVariable status Debug dmpstore/BootNext
Recovery/update BootNext clear/retry count Debug loop

Shell mạnh hơn nhiều nếu firmware log có cùng khái niệm để đối chiếu.

Debug playbook tổng hợp

UEFI Shell debug playbook

Security checklist

Security checklist cho UEFI Shell

Khi đọc source nên tìm gì?

Đọc source theo vấn đề UEFI Shell
Cần hiểu gì Tìm ở đâu Câu hỏi cần trả lời
Shell package EDK II ShellPkg Shell commands nào được build vào image?
Startup script Shell startup.nsh handling startup.nsh chạy khi nào, từ fs nào?
Variable access dmpstore implementation Ghi/xóa variable bị policy gì?
Boot config bcfg command implementation bcfg tạo Boot#### format ra sao?
Mapping map command / shell file system mapping fsX được tạo từ handles nào?
Connect connect command Connect recursive hoạt động thế nào?
Handle/protocol dump dh/devtree/drivers commands Thông tin nào in ra?
Security Secure Boot / shell launch policy Shell bị allow/block theo policy nào?

Câu hỏi tự kiểm tra

Tự kiểm tra sau khi đọc note này

Blog seeds

  • UEFI Shell Explained: terminal của firmware engineer
  • Debug BootOrder bằng dmpstore và bcfg
  • map -r, fs0: và cách tìm ESP trong UEFI Shell
  • connect -r giúp USB/ESP xuất hiện như thế nào?
  • startup.nsh và nguy cơ boot loop trong UEFI Shell

Bài liên quan

Nguồn tham khảo public

Bài viết này hữu ích với bạn?

Bạn có thể chia sẻ cho người đang học firmware, BIOS/UEFI, embedded systems hoặc ủng hộ tác giả.

Góp ý

Nội dung liên quan

Một số bài viết, ghi chú hoặc project có liên quan đến nội dung bạn vừa đọc.

Biến note thành bài viết hoàn chỉnh

Notes là nơi ghi nhanh khái niệm.