EfiFs - EFI File System Drivers
This is a GPLv3+ implementation of standalone EFI File System drivers, based on the GRUB 2.0 read-only drivers.
For additional info as well as precompiled drivers, see http://efi.akeo.ie
Requirements
- Visual Studio 2017 (Windows), MinGW (Windows), gcc (Linux) or EDK2.
- A git client able to initialize/update submodules
- QEMU v2.7 or later if debugging with Visual Studio (NB: You can find QEMU Windows binaries here)
Compilation
Common
- Fetch the git submodules with
git submodule init
andgit submodule update
. - Apply the included patches to the
grub\
subdirectory. This adds F2FS support, and fixes that are required for Clang and MSVC compilation.
Visual Studio (non EDK2)
- Open the solution file and hit
F5
to compile and debug the default driver.
gcc (non EDK2)
- Run
make
in the top directory. If needed you can also issue something likemake ARCH=<arch> CROSS_COMPILE=<tuple>
where<arch>
is one ofia32
,x64
,arm
oraa64
(the official UEFI abbreviations for an arch, as used in/efi/boot/boot[ARCH].efi
) and tuple is the one for your cross-compiler, such asarm-linux-gnueabihf-
. e.g.make ARCH=aa64 CROSS_COMPILE=aarch64-linux-gnu-
EDK2
- Open an elevated command prompt and create a symbolic link called
EfiFsPkg
, inside your EDK2 directory, to the EfiFs source. On Windows, from an elevated prompt, you could run something likemklink /D EfiFsPkg C:\efifs
, and on Linuxln -s ../efifs EfiFsPkg
. - From a command prompt, set Grub to target the platform you are compiling for by invoking:
- (Windows)
set_grub_cpu.cmd <arch>
- (Linux)
./set_grub_cpu.sh <arch>
Where<arch>
is one ofia32
,x64
,arm
oraa64
.
Note that you MUST invoke theset_grub_cpu
script every time you switch target.
- (Windows)
- After having invoked
Edk2Setup.bat
(Windows) oredksetup.sh
(Linux) run something like:wherebuild -a X64 -b RELEASE -t <toolchain> -p EfiFsPkg/EfiFsPkg.dsc
<toolchain>
is something likeVS2015
(Windows) orGCC5
(Linux).
NB: To build an individual driver, such as NTFS, you would can also use something like:build -a X64 -b RELEASE -t <toolchain> -p EfiFsPkg/EfiFsPkg.dsc -m EfiFsPkg/EfiFsPkg/Ntfs.inf
Testing
If QEMU is installed, the Visual Studio solution will set up and test the drivers using QEMU
(by also downloading a sample image for each target file system).
Note however that VS debugging expects a 64-bit version of QEMU to be installed in
C:\Program Files\qemu\
(which you can download here).
If that is not the case, you should edit .msvc\debug.vbs
accordingly.
For testing outside of Visual Studio, make sure you have at least one disk with a target partition using the target filesystem, that is not being handled by other EFI filesystem drivers. Then boot into the EFI shell and run the following:
load fs0:\<fs_name>_<arch>.efi
or wherever your driver was copiedmap -r
this should make a newfs#
available, egfs2:
- You should now be able to navigate and access content (in read-only mode)
- For logging output, set the
FS_LOGGING
shell variable to 1 or more - To unload use the
drivers
command, thenunload
with the driver ID
Visual Studio 2017 and ARM support
Please be mindful that, to enable ARM compilation support in Visual Studio 2017, you MUST go to the Individual components screen in the setup application and select the ARM compilers and libraries there, as they do NOT appear in the default Workloads screen:
While in this section, you may also want to select the installation of Clang/C2 (experimental), so that you can open and compile the Clang solution...
Additional Notes
This is a pure GPLv3+ implementation of EFI drivers. Great care was taken not to
use any code from non GPLv3 compatible sources, such as rEFInd's fsw_efi
(GPLv2
only) or Intel's FAT driver (requires an extra copyright notice).
Bonus: Commands to compile EfiFs using EDK2 on Debian GNU/Linux 9.1
As root:
apt-get install nasm uuid-dev gcc-arm-linux-gnueabihf gcc-aarch64-linux-gnu
cd /usr/src
git clone https://github.com/tianocore/edk2.git
git clone https://github.com/pbatard/efifs.git
cd efifs
git submodule init
git submodule update
cd grub
git am ../*.patch
cd /usr/src/edk2
ln -s ../efifs EfiFsPkg
make -C /usr/src/edk2/BaseTools/Source/C
export GCC5_ARM_PREFIX=arm-linux-gnueabihf-
export GCC5_AARCH64_PREFIX=aarch64-linux-gnu-
source edksetup.sh
./EfiFsPkg/set_grub_cpu.sh X64
build -a X64 -b RELEASE -t GCC5 -p EfiFsPkg/EfiFsPkg.dsc
./EfiFsPkg/set_grub_cpu.sh IA32
build -a IA32 -b RELEASE -t GCC5 -p EfiFsPkg/EfiFsPkg.dsc
./EfiFsPkg/set_grub_cpu.sh ARM
build -a ARM -b RELEASE -t GCC5 -p EfiFsPkg/EfiFsPkg.dsc
./EfiFsPkg/set_grub_cpu.sh AARCH64
build -a AARCH64 -b RELEASE -t GCC5 -p EfiFsPkg/EfiFsPkg.dsc