{"id":17652248,"url":"https://github.com/minoru/plentyfs","last_synced_at":"2025-08-25T14:07:54.178Z","repository":{"id":54890593,"uuid":"304916296","full_name":"Minoru/plentyfs","owner":"Minoru","description":"A proof-of-concept for a read-only filesystem with random contents generated on demand.","archived":false,"fork":false,"pushed_at":"2021-08-02T12:52:40.000Z","size":59,"stargazers_count":38,"open_issues_count":6,"forks_count":1,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-05-07T07:39:38.832Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Minoru.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-10-17T16:07:02.000Z","updated_at":"2025-02-07T10:41:59.000Z","dependencies_parsed_at":"2022-08-14T05:50:49.604Z","dependency_job_id":null,"html_url":"https://github.com/Minoru/plentyfs","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Minoru/plentyfs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Minoru%2Fplentyfs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Minoru%2Fplentyfs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Minoru%2Fplentyfs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Minoru%2Fplentyfs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Minoru","download_url":"https://codeload.github.com/Minoru/plentyfs/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Minoru%2Fplentyfs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272077690,"owners_count":24869288,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-25T02:00:12.092Z","response_time":1107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-23T11:46:20.141Z","updated_at":"2025-08-25T14:07:54.159Z","avatar_url":"https://github.com/Minoru.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PlentyFS\n\nA proof-of-concept for a read-only filesystem with random contents generated on\ndemand.\n\nDeveloped [at the request of Lars Wirzenius](https://toot.liw.fi/@liw/105028618188354731).\n\nLicensed under the [Blue Oak Model License 1.0.0](LICENSE.md).\n\n## Dependencies\n\n- Rust and Cargo (tested with Rust 1.47.0)\n- fuse (including the headers, that's `libfuse-dev` on Debian) (tested with\n    2.9.9)\n\n## How to run\n\nIn the root of the repo:\n\n```\nmkdir mnt\ncargo run --release mnt\n```\n\nThis will mount PlentyFS into `mnt` directory and block. You can work with the\ndirectory in a different terminal.\n\nOnce you're done, cd to the root of the repo and call:\n\n```\nfusermount -u mnt\n```\n\nThis will unmount PlentyFS and release the first terminal.\n\n## Architecture\n\n### Requirements\n\nThe filesystem should:\n\n- be read-only\n- have files with random contents\n- store (almost) nothing in memory or on disk\n\n### The architecture under test\n\nFor this PoC, the FS contains a single directory (root) with a fixed number of\nfiles (10,000) of fixed size (1 megabyte each). The only thing that's random is\nthe contents of the file.\n\nUpon mounting, we take the PID of the fuse program. That's our \"root seed\", and\nit's the only value that PlentyFS stores in memory. Everything else is computed\nfrom it and the meta-information.\n\nUpon each `read()`, we generate the blocks that contain requested data. To do\nthat, we:\n\n1. generate a \"file seed\": combine root seed with the file's inode number, and\n   hash the result;\n\n2. generate the block: combine the file seed with the block number, and hash the\n   result.\n\nThis architecture is \"embarrassingly parallel\", because the contents of the file\nblocks depend only on the \"root seed\", file's inode, and the block offset. This\nshould enable it to scale linearly to many cores.\n\nDetails of this implementation:\n\n- file inodes are numbered from 2 upwards;\n- the hash we use is SHA-1.\n\n### Benchmarks\n\nOn Intel i7-7700HQ, `tar -cvf /dev/shm/plentyfs.tar /mnt` achieves 115 MB/s.\nNote that `/dev/shm/` is a `tempfs`. The speed was limited by this program,\nwhich maxed out a single core for the whole duration of the benchmark.\n\n## Why the name\n\nHorn of plenty (conrnucopia) is a small object overflowing with food and riches.\nSimilarly, PlentyFS is a tiny filesystem containing as much data as you can\nconsume.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fminoru%2Fplentyfs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fminoru%2Fplentyfs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fminoru%2Fplentyfs/lists"}