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.
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.EFIcó 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?
| 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 | 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.
| 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.
| 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
| 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
| 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.
| 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
| 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
| 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, dh và connect.
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.
Before connect
USB/disk có thể chưa có fsX mapping.
connect -r
Shell yêu cầu connect controller/driver recursively.
Driver binding
USB/NVMe/SATA/FAT drivers bind nếu có.
Protocols appear
Block I/O, Simple File System xuất hiện.
map -r
Refresh fsX mappings.
fs0:/dir
Vào filesystem và kiểm tra file.
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
| 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
| 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:
Check Setup policy
USB boot/Fast Boot/Secure Boot.
connect -r
Connect driver/controller.
map -r
Refresh filesystem mappings.
Find fsX
Tìm USB filesystem.
Check fallback path
dir EFI\BOOT và BOOTX64.EFI.
Run EFI file
Thử chạy file nếu policy cho phép.
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.
| 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ế
| 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
| 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ầ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
- dmpstore là gì?
- bcfg là gì?
- map là gì?
- fs0 là gì?
- dh là gì?
- drivers là gì?
- devtree là gì?
- connect là gì?
- memmap là gì?
- startup.nsh là gì?
- Boot#### là gì?
- Device Path Node là gì?
- EFI System Partition là gì?
Nguồn tham khảo public
- UEFI Specification
- EDK II ShellPkg
- EDK II UefiShellLib
- EDK II Device Path libraries
- EDK II UefiBootManagerLib
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ả.
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.
dmpstore là gì?
Giải thích sâu lệnh dmpstore trong UEFI Shell: đọc BootOrder, BootNext, BootCurrent, Boot####, Secure Boot variables, dump NVRAM, rủi ro ghi/xóa variable và checklist debug.
map là gì?
Giải thích sâu lệnh map trong UEFI Shell: fs0:, blk0:, map -r, filesystem mappings, ESP, USB boot, Device Path, connect -r và checklist debug.
bcfg là gì?
Giải thích sâu lệnh bcfg trong UEFI Shell: xem, thêm, xóa, đổi thứ tự Boot####, sửa BootOrder, tạo boot entry trỏ ESP/file .efi, rủi ro NVRAM và checklist debug.
Biến note thành bài viết hoàn chỉnh
Notes là nơi ghi nhanh khái niệm.