An os independent rust ext4 file system
env
wsl2 ubuntu22.04
rust version nightly-2024-06-01
rustc 1.80.0-nightly (ada5e2c7b 2024-05-31)
mkfs.ext4 1.46.5 (30-Dec-2021)
For small images, the newer mkfs.ext4 uses a 512-byte block size. Use mkfs.ext4 -b 4096 to set a 4096-byte block size.
run example
fuse example
git clone https://github.com/yuoo655/ext4libtest.git
cd ext4libtest
sh gen_img.sh
# cargo run /path/to/mountpoint
cargo run ./foo/
features
| 操作 | 支持情况 |
|---|---|
| mount | ✅ |
| open | ✅ |
| close | ✅ |
| lsdir | ✅ |
| mkdir | ✅ |
| read_file | ✅ |
| read_link | ✅ |
| create_file | ✅ |
| write_file | ✅ |
| link | ✅ |
| unlink | ✅ |
| file_truncate | ✅ |
| file_remove | ✅ |
| umount | ✅ |
| dir_remove | ✅ |
how to use
impl BlockDevice Trait
open ext4
let disk = new;
let ext4 = open;
read regular file
let path = "test_files/0.txt";
let mut read_buf = vec!;
let child_inode = ext4.generic_open.unwrap;
// 1G
let mut data = vec!;
let read_data = ext4.read_at;
info!;
read link
let path = "test_files/linktest";
let mut read_buf = vec!;
// 2 is root inode
let child_inode = ext4.generic_open.unwrap;
let mut data = vec!;
let read_data = ext4.read_at;
info!;
mkdir
for i in 0..10
let path = "dir1/dir2/dir3/dir4/dir5/dir6";
let r = ext4.dir_mk;
assert!;
file write test
// file create/write
let inode_mode = S_IFREG.bits;
let inode_ref = ext4.create.unwrap;
const WRITE_SIZE: usize = ;
let write_buf = vec!;
let r = ext4.write_at;
ls
let entries = ext4.dir_get_entries;
info!;
for entry in entries
file remove
let path = "test_files/file_to_remove";
let r = ext4.file_remove;
dir remove
let path = "dir_to_remove";
let r = ext4.dir_remove;
known bugs
-
ext4_valid_extent check fails in linux due to block allocation using system reserved blocks.(Fixed: Block allocator now checks for system reserved blocks before allocation) -
extent block checksum not set(Fixed: Added support for computing and setting extent block checksums)