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

Woj*_*icz 5 efi

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

例如,我有一台电脑和一个虚拟机。虚拟机启动到EFI,我需要将文件复制到其中,然后在EFI环境中执行它。

这可能吗?

小智 6

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

1. USB 存储设备。

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

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

现在要获取文件,只需键入如下命令:

fs1:
cd directory_with_file
Run Code Online (Sandbox Code Playgroud)

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

2.通过TFTP传输。

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

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

ifconfig -s eth0 dhcp
fs1:
cd destination_directory
tftp 192.168.3.1 file_to_copy
Run Code Online (Sandbox Code Playgroud)

在哪里:

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

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

3.QEMU虚拟机

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


tre*_*ell 5

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

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

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

FS0:
connect
ifconfig -r eth0
ifconfig -s eth0 dhcp
ifconfig -l eth0
Run Code Online (Sandbox Code Playgroud)

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

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

http <server_ip> <remote_path_to_file>  
Run Code Online (Sandbox Code Playgroud)

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

http <server_ip> <remote_path_to_file> <new_local_filename>
Run Code Online (Sandbox Code Playgroud)

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

FS0:
connect
ifconfig -r eth0
ifconfig -s eth0 dhcp
ifconfig -l eth0
Run Code Online (Sandbox Code Playgroud)

将您想要的文件放入/var/www/html顶部访问。

我还根据自己构建TianoCore Shell和应用程序的经验记录了一些个人笔记,因为似乎有几个自述文件已过时和/或漂浮在各个位置。

构建 TianoCore EDKII UEFI Shell 和实用程序

这些指令仅在 UBUNTU 18.04、20.10 上进行了测试,EDK II 存储库头位于35ed29f

1. 克隆EDK II 存储库

http <server_ip> <remote_path_to_file>  
Run Code Online (Sandbox Code Playgroud)

或者

http <server_ip> <remote_path_to_file> <new_local_filename>
Run Code Online (Sandbox Code Playgroud)

2. 安装要求

由于多个自述文件,不确定需要其中哪一个。我把一切都当作“安全总比后悔好”。

sudo apt-get install apache2
/etc/init.d/apache2 start
Run Code Online (Sandbox Code Playgroud)

3. 编译构建工具

git clone --recursive https://github.com/tianocore/edk2.git
Run Code Online (Sandbox Code Playgroud)

4.初始化环境

git clone https://github.com/tianocore/edk2.git
cd edk2
git submodule update --init
Run Code Online (Sandbox Code Playgroud)

5.调整配置(我的例子是X64架构)

sudo apt-get install uuid-dev nasm gcc-5 build-essential \
     iasl git python3-distutils texinfo \
     bison flex libgmp3-dev libmpfr-dev subversion
Run Code Online (Sandbox Code Playgroud)
  • 设置行ACTIVE_PLATFORM = ./ShellPkg/ShellPkg.dsc
  • 设置行TARGET_ARCH = X64
  • 设置行TOOL_CHAIN_TAG = GCC5

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

6. 构建包

cd edk2
make -C BaseTools
Run Code Online (Sandbox Code Playgroud)

7. 找到文件

. edksetup.sh
Run Code Online (Sandbox Code Playgroud)

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

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


小智 0

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

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

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