是否可以使用某种网络协议将文件复制到 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:
或其他取决于你的启动设备tftp
是tftp.efi
app,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 中,没有找到实际将远程文件复制到文件系统的命令,这有点烦人。