是否可以使用某种网络协议将文件复制到 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 ifconfigfs1:您的文件系统是tftp.efi,它可能是fs0:或其他取决于您的启动设备tftp是tftp.efi应用程序,192.168.3.1是TFTP服务器(主机或真实服务器)的IP地址您还可以在可启动文件系统根目录下的startup.nsh 文件中写入此命令,以便在VM 加载时执行此操作。或者在 EFI 运行时仅下载另一个 *.nsh 脚本文件中的最后一行。
3.QEMU虚拟机
对于简单的测试来说非常方便,你不需要 TFTP、DHCP、USB 驱动器等。如果可以在每次启动时重新创建 VM,osdev.org上有一篇关于使用 QEMU 创建和调试 EFI 应用程序的精彩文章。
添加到德米特里的解决方案:
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和应用程序的经验记录了一些个人笔记,因为似乎有几个自述文件已过时和/或漂浮在各个位置。
这些指令仅在 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.dscTARGET_ARCH = X64TOOL_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.efiShell_EA4BB293-2D7F-4456-A681-1F22F42CD0BC.efihttp.efi小智 0
如果您只想执行远程 EFI 二进制文件,请查找“rload”命令(如果它在您的 EFI shell 中可用)。
这使用 TFTP。这假设您的 EFI 具有网络驱动程序等。
在我的 shell 中,没有找到将远程文件实际复制到文件系统的命令,这有点烦人。
| 归档时间: |
|
| 查看次数: |
7706 次 |
| 最近记录: |