通过网络将文件复制到 EFI shell

通过网络将文件复制到 EFI shell

是否可以使用某种网络协议将文件复制到 EFI?

比如我有一台电脑和一台虚拟机,虚拟机启动到EFI,我需要把文件复制到虚拟机里,然后在EFI环境下执行。

这可能吗?

答案1

添加到德米特里的解决方案

4. 通过HTTP传输
这个与 TFTP 类似,您需要为其构建二进制文件并将其放在与您的 shell 相同的位置(或其他地方,但输入应用程序的路径会很累)。

我发现我需要connect先运行才能ifconfig正确将驱动程序连接到其处理程序。我使用一个简单的startup.nsh脚本来加快速度:

FS0:
connect
ifconfig -r eth0
ifconfig -s eth0 dhcp
ifconfig -l eth0

请注意,如果您有多个块设备,则可能需要FS<x>:输入不同的内容。您可以使用map列出设备。

然后从 HTTP 服务器提取文件(假设您有http.efi):

http <server_ip> <remote_path_to_file>  

这将覆盖当前文件。如果您想保留它:

http <server_ip> <remote_path_to_file> <new_local_filename>

要设置本地 HTTP 服务器 (Ubuntu):

sudo apt-get install apache2
/etc/init.d/apache2 start

将您想要的文件放入其中/var/www/html以进行顶部访问。

我还记录了一些我建造过程中的个人笔记TianoCore 外壳和应用程序,因为似乎有几个 README 已经过时和/或漂浮在各个位置。

构建 TianoCore EDKII UEFI Shell 和实用程序

这些说明仅在 UBUNTU 18.04、20.10 上使用 EDK II 存储库头进行了测试35ed29f

1. 克隆EDK II 存储库

git clone --recursive https://github.com/tianocore/edk2.git

或者

git clone https://github.com/tianocore/edk2.git
cd edk2
git submodule update --init

2. 安装要求

由于有多个 README,因此不确定哪些是必需的。我使用全部是因为“安全总比后悔好”。

sudo apt-get install uuid-dev nasm gcc-5 build-essential \
     iasl git python3-distutils texinfo \
     bison flex libgmp3-dev libmpfr-dev subversion

3. 编译构建工具

cd edk2
make -C BaseTools

4.初始化环境

. edksetup.sh

5. 调整配置(我的情况是 X64 架构)

vi ./Conf/target.txt
  • 设置行ACTIVE_PLATFORM = ./ShellPkg/ShellPkg.dsc
  • 设置行TARGET_ARCH = X64
  • 设置行TOOL_CHAIN_TAG = GCC5

在构建时,有一些标志可以覆盖平台、架构、工具链,但我更喜欢只调整配置。

6. 构建包

build

7. 找到文件

cd ./edk2/Build/Shell/DEBUG_GCC5/X64/

两个Shell_<GUID>.efi文件都可以。我有:

  • Shell_7C04A583-9E3E-4f1c-AD65-E05268D0B4D1.efi
  • Shell_EA4BB293-2D7F-4456-A681-1F22F42CD0BC.efi
  • http.efi

答案2

好吧,当我开始开发 EFI 应用程序时,我发现了同样的问题。如何在 EFI 环境中发送文件?目前我知道这些方法:

1.USB存储设备。

如果您不经常复制文件,这可能是最简单的方法。只需将文件放在 USB 闪存驱动器上并将其连接到虚拟机 (VM)。

要从 EFI 环境访问文件,您需要 EFI shell 或类似的东西。VMware 已经集成了 shell,而在其他虚拟机上,您可能需要获取它。为此,您可以使用 wonderfulrEFInd 启动管理器,其中包含 shell。解压缩它,将 iso 映像插入 VM 的 CD-ROM 并从中启动。在 rEFInd 菜单中,选择“启动 EFI Shell”。您将看到命令提示符,其中所有存储设备都映射为 FS0、FS1……如果您只看到 FS0(rEFInd 文件系统),那么您可能忘记将 USB 驱动器连接到 VM。

现在要获取文件,只需输入以下命令:

fs1:
cd directory_with_file

通过命令可以找到所有的shell命令help

2.通过TFTP传输。

设置时间更长,使用速度更快。如果您经常发送文件,例如在开发 EFI 应用程序时,这种方法就很不错。对于这种方法,您需要 TFTP 服务器(如 tftpd-hpa)运行(它可能在您的主机上),VM 上的 EFI Shell + TFTP 客户端。关于启动 TFTP 服务器有很多信息,因此您可以自己找到手册。此外,拥有 DHCP 服务器也很好(它是可选的,但使用 DHCP 配置会容易得多)。

TFTP 客户端可以从Tianocore 来源或者从以下网址下载 x64 预编译二进制文件我的云(我不知道为什么 Tianocore 维护者不提供二进制文件)。将tftp.efi虚拟机放在可以访问的地方(USB 驱动器或虚拟硬盘)。将文件放在 TFTP 根目录(如 /srv/tftp)中。如果您想使用 DHCP,可能应该将虚拟机的网络适配器设置为桥接模式,这样它就有了真实 IP。按照上述说明启动 EFI shell 虚拟机。看到命令提示符时,键入以下命令。

ifconfig -s eth0 dhcp
fs1:
cd destination_directory
tftp 192.168.3.1 file_to_copy

在哪里:

  • eth0是您的网络适配器,您可以使用 找到所需的适配器ifconfig -l。您也可以使用静态 IP 代替 dhcp,请参阅help ifconfig
  • fs1:是你的文件系统tftp.efi,它可能是fs0:或其他取决于你的启动设备
  • tftptftp.efiapp,192.168.3.1是TFTP服务器(主机或真实服务器)的ip地址

您也可以在可启动文件系统根目录中的 startup.nsh 文件中写入此命令,以便在 VM 加载时执行此操作。或者在 EFI 运行时下载另一个 *.nsh 脚本文件中的最后一行。

3.QEMU虚拟机

它对于简单的测试非常方便,你不需要 TFTP、DHCP、USB 驱动器等。如果每次启动时都可以重新创建 VM,那么有一篇关于使用 QEMU 创建和调试 EFI 应用程序的精彩文章osdev.org

答案3

如果您只想执行远程 EFI 二进制文件,请查找“rload”命令(如果您的 EFI shell 中可用)。

这使用 TFTP。并且假设您的 EFI 具有网络驱动程序等。

在我的 shell 中,没有找到实际将远程文件复制到文件系统的命令,这有点烦人。

相关内容