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 https://efi.akeo.ie
- Visual Studio 2017 (Windows) preferably with Update 4 or later for ARM64 compilation support, 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)
- Fetch the git submodules with
git submodule initand
git submodule update. NOTE This only works if you cloned the directory using
Visual Studio (non EDK2)
grub\subdirectory. This applies changes that are required for successful MSVC compilation.
- Open the solution file and hit
F5to compile and debug the default driver.
gcc (non EDK2)
makein the top directory. If needed you can also issue something like
make ARCH=<arch> CROSS_COMPILE=<tuple>where
<arch>is one of
aa64(the official UEFI abbreviations for an arch, as used in
<tuple>is the one for your cross- compiler, such as
make ARCH=aa64 CROSS_COMPILE=aarch64-linux-gnu-
- If using Visual Studio, apply
- 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 like
mklink /D EfiFsPkg C:\efifs, and on Linux
ln -s ../efifs EfiFsPkg.
- From a command prompt, set Grub to target the platform you are compiling for
<arch>is one of
Note that you MUST invoke the
set_grub_cpuscript every time you switch target.
- After having invoked
edksetup.sh(Linux) run something like:
build -a X64 -b RELEASE -t <toolchain> -p EfiFsPkg/EfiFsPkg.dsc
<toolchain>is something like
NB: To build an individual driver, such as NTFS, you can also use something like:
build -a X64 -b RELEASE -t <toolchain> -p EfiFsPkg/EfiFsPkg.dsc -m EfiFsPkg/EfiFsPkg/Ntfs.inf
- Note that, provided that you cloned a recent EDK2 from git, you should be able
VS2017as your EDK2 toolchain, including for buidling the ARM or ARM64 drivers, with something like:
build -a AARCH64 -b RELEASE -t VS2017 -p EfiFsPkg/EfiFsPkg.dsc
- A Windows script to build all the drivers for all architectures, using EDK2 +
VS2017 is also provided as
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
C:\Program Files\qemu\ (which you can download here).
If that is not the case, you should edit
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>.efior wherever your driver was copied
map -rthis should make a new
- You should now be able to navigate and access content (in read-only mode)
- For logging output, set the
FS_LOGGINGshell variable to 1 or more
- To unload use the
unloadwith the driver ID
Visual Studio 2017 and ARM/ARM64 support
Please be mindful that, to enable ARM/ARM64 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:
You also need to ensure that you have Windows SDK 10.0.14393.0 or later installed, as this is the minimum version that provides the required ARM64 static libraries.
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
(GPLv2 only) or Intel's FAT driver (requires an extra copyright notice).
Bonus: Commands to compile EfiFs using EDK2 on a vanilla Debian GNU/Linux 9.1
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 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