go-ext4 is a pure Go implementation of an Ext4 reader with support for reading the journal. An example of how to walk the file-structure:
inodeNumber := InodeRootDirectory filepath := path.Join(assetsPath, "hierarchy_32.ext4") f, err := os.Open(filepath) log.PanicIf(err) defer f.Close() _, err = f.Seek(Superblock0Offset, io.SeekStart) log.PanicIf(err) sb, err := NewSuperblockWithReader(f) log.PanicIf(err) bgdl, err := NewBlockGroupDescriptorListWithReadSeeker(f, sb) log.PanicIf(err) bgd, err := bgdl.GetWithAbsoluteInode(inodeNumber) log.PanicIf(err) dw, err := NewDirectoryWalk(f, bgd, inodeNumber) log.PanicIf(err) allEntries := make([]string, 0) for { fullPath, de, err := dw.Next() if err == io.EOF { break } else if err != nil { log.Panic(err) } description := fmt.Sprintf("%s: %s", fullPath, de.String()) allEntries = append(allEntries, description) } sort.Strings(allEntries) for _, entryDescription := range allEntries { fmt.Println(entryDescription) } // Output: // // directory1/fortune1: DirectoryEntry // directory1/fortune2: DirectoryEntry // directory1/fortune5: DirectoryEntry // directory1/fortune6: DirectoryEntry // directory1/subdirectory1/fortune3: DirectoryEntry // directory1/subdirectory1/fortune4: DirectoryEntry // directory1/subdirectory1: DirectoryEntry // directory1/subdirectory2/fortune7: DirectoryEntry // directory1/subdirectory2/fortune8: DirectoryEntry // directory1/subdirectory2: DirectoryEntry // directory1: DirectoryEntry // directory2/fortune10: DirectoryEntry // directory2/fortune9: DirectoryEntry // directory2: DirectoryEntry // lost+found: DirectoryEntry // thejungle.txt: DirectoryEntry
This project is used to directly read the filesystem, file, and journal data without the support of kernel or the FUSE interface. Therefore, no elevated privileges are required.