Previously, reading fragment 512 would panic with index out of range. Fix that panic by introducing an abstraction over reading blocks of items, caching the intermediate result, and returning an item at a particular index. The primary goal of this abstraction is to make edge cases like requesting items on page boundaries easy to unit test for. Additionally, fix unit tests by making t.Fatal calls protected by nil checks on the error values.
squashfs
A PURE Go library to read squashfs. There is currently no plans to add archive creation support as it will almost always be better to just call mksquashfs. I could see some possible use cases, but probably won't spend time on it unless it's requested (open a discussion if you want this feature).
The library has two parts with this github.com/CalebQ42/squashfs being easy to use as it implements io/fs interfaces and doesn't expose unnecessary information. 95% this is the library you want. If you need lower level access to the information, use github.com/CalebQ42/squashfs/low where far more information is exposed.
Currently has support for reading squashfs files and extracting files and folders.
Special thanks to https://dr-emann.github.io/squashfs/ for some VERY important information in an easy to understand format. Thanks also to distri's squashfs library as I referenced it to figure some things out (and double check others).
Build tags
As of v1.1.0 this library has two optional build tags: no_gpl and no_obsolete. no_gpl disables the ability to read archives with lzo compression due to the library's gpl license. no_obsolete removes "obsolete" compression types for a reduced compilation size; currently this only disable lzma compression since it's superseded by xz.
FUSE
As of v1.0, FUSE capabilities has been moved to a separate library.
Limitations
- No Xattr parsing.
- Socket files are not extracted.
- From my research, it seems like a socket file would be useless if it could be created.
- Fifo files are ignored on
darwin
Issues
- Noticably slower then
unsquashfsfor extraction, especially on larger images.- This seems to be related to above along with the general optimization of
unsquashfsand it's compression libraries. - Times seem to be largely dependent on file tree size and compression type.
- My main testing image (~100MB) using Zstd takes ~2x longer.
- An Arch Linux airootfs image (~780MB) using XZ compression with LZMA filters takes ~28x longer.
- A Tensorflow docker image (~3.3GB) using Zstd takes ~3x longer.
- This seems to be related to above along with the general optimization of
Note: These numbers are using FastOptions(). DefaultOptions() takes ~2x longer.
Recommendations on Usage
Due to the above performance consideration, this library should only be used to access files within the archive without extraction, or to mount it via Fuse.
- Neither of these use cases are largely effected by the issue above.