This repository provides a Rust crate that allows read-only access to an
ext4 filesystem. It also works with ext2 filesystems. Write access
is an explicit non-goal. The crate is no_std
, so it can be used in
embedded contexts. However, it does require alloc
.
Add the dependency:
cargo add ext4-view
Basic example:
use ext4_view::{Ext4, Metadata};
// Load the filesystem. The data source can be be anything that
// implements the `Ext4Read` trait. The simplest source is a
// `Vec<u8>` containing the whole filesystem.
let fs_data: Vec<u8> = get_fs_data_from_somewhere();
let fs = Ext4::load(Box::new(fs_data))?;
// If the `std` feature is enabled, you can load a filesystem by path:
let fs = Ext4::load_from_path(std::path::Path::new("some-fs.bin"))?;
// The `Ext4` type has methods very similar to `std::fs`:
let path = "/some/file/path";
let file_data: Vec<u8> = fs.read(path)?;
let file_str: String = fs.read_to_string(path)?;
let exists: bool = fs.exists(path)?;
let metadata: Metadata = fs.metadata(path)?;
for entry in fs.read_dir("/some/dir")? {
let entry = entry?;
println!("{}", entry.path().display());
}
In order of importance:
- Correct
- All valid ext2/ext4 filesystems should be readable.
- Invalid data should never cause crashes, panics, or non-terminating loops.
- No
unsafe
code in the main package (it is allowed in dependencies). - Well tested.
- Easy to use
- The API should follow the conventions of
std::fs
where possible.
- The API should follow the conventions of
- Good performance
- Performance should not come at the expense of correctness or ease of use.
Non-goals:
- Write support.
- Recovery of corrupt filesystems.
Licensed under either of Apache License, Version 2.0 or MIT license at your option.
See the code of conduct and contributing.md.
Bug reports and PRs are welcome!
This project is not an official Google project. It is not supported by Google and Google specifically disclaims all warranties as to its quality, merchantability, or fitness for a particular purpose.