From e72e9858a76aba5723a79e7c456bbb72fe40194d Mon Sep 17 00:00:00 2001 From: tannevaled Date: Fri, 29 May 2026 10:48:07 +0200 Subject: [PATCH 1/8] =?UTF-8?q?new(cubefs.io):=20CubeFS=20=E2=80=94=20clou?= =?UTF-8?q?d-native=20distributed=20storage=20(from=20source)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CubeFS (formerly ChubaoFS, CNCF graduated) — distributed FS with HDFS / S3 / POSIX semantics. Builds from source via the project's Makefile + build.sh, which compiles vendored C libs (RocksDB, snappy, zstd, lz4, zlib, bzip2) statically into the Go binaries. Slim install: - cfs-server unified meta/data daemon - cfs-client FUSE client mount binary - cfs-cli admin/operator CLI - cfs-authtool auth key/token management - cfs-fsck consistency checker Skips the blobstore object-storage suite for now to keep the bottle lean. Linux-only (upstream's build.sh partially supports darwin but skips libcfs.so and several CGO components). From-source — no warnings: vendored. CGO toolchain via gnu.org/gcc. --- projects/cubefs.io/package.yml | 88 ++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 projects/cubefs.io/package.yml diff --git a/projects/cubefs.io/package.yml b/projects/cubefs.io/package.yml new file mode 100644 index 0000000000..ae26a6c806 --- /dev/null +++ b/projects/cubefs.io/package.yml @@ -0,0 +1,88 @@ +# CubeFS — cloud-native distributed storage system (CNCF graduated). +# +# Distributed FS with HDFS / S3 / POSIX semantics, designed for large- +# scale cloud-native workloads. Built from source via the project's +# Makefile + build.sh, which compiles a set of vendored C libs +# (RocksDB, snappy, zstd, etc.) statically into the Go binaries. +# +# Slim install: server + client + cli + authtool + fsck. The full +# blobstore object-storage suite is omitted to keep the bottle lean +# (it can be re-enabled by adding `make blobstore` to the build). + +distributable: + url: https://github.com/cubefs/cubefs/archive/refs/tags/v{{ version.raw }}.tar.gz + strip-components: 1 + +versions: + github: cubefs/cubefs + +# Linux only. Upstream's build.sh accepts darwin but skips libcfs.so +# and several CGO components; aarch64 builds the RocksDB 6.3.6 ports +# with PORTABLE=1. +platforms: + - linux/x86-64 + - linux/aarch64 + +# cfs-client needs libfuse at runtime, but pantry has no linux libfuse +# recipe (only macfuse for darwin). Users must install fuse via their +# distro package manager (apt install fuse / dnf install fuse-libs). +# All other binaries are statically linked + glibc only. + +build: + dependencies: + go.dev: ^1.18 # go.mod floor + gnu.org/gcc: '*' # CGO toolchain for RocksDB et al + gnu.org/make: '*' + gnu.org/coreutils: '*' # install(1) + gnu.org/bash: '*' # build.sh is bash + gnu.org/tar: '*' # depends/*.tar.gz extraction + gnu.org/sed: '*' + + script: + # Slim build: server, client, cli, authtool, fsck. + # `make build` would also build the blobstore suite — we only + # want the core POSIX/HDFS path here. + - run: | + # build.sh hardcodes --threads default at 1; pass our concurrency. + # Each named target compiles its vendored C deps under build/lib + # (skipped on subsequent calls via librocksdb.a presence guard). + for TARGET in server client cli authtool fsck; do + make $TARGET threads={{ hw.concurrency }} + done + + - run: | + install -Dm755 build/bin/cfs-server "{{prefix}}/bin/cfs-server" + install -Dm755 build/bin/cfs-client "{{prefix}}/bin/cfs-client" + install -Dm755 build/bin/cfs-cli "{{prefix}}/bin/cfs-cli" + install -Dm755 build/bin/cfs-authtool "{{prefix}}/bin/cfs-authtool" + install -Dm755 build/bin/cfs-fsck "{{prefix}}/bin/cfs-fsck" + +test: + script: + # Each binary supports `-v` / `--version` or similar. cfs-cli has + # a richer CLI so we check that too. + - run: | + out=$(cfs-server -v 2>&1 || true) + echo "cfs-server -v: $out" + case "$out" in + *"{{version}}"*) echo "server version PASS" ;; + *) echo "FAIL: server version mismatch: $out"; exit 1 ;; + esac + - run: | + out=$(cfs-cli --version 2>&1 || cfs-cli version 2>&1 || true) + echo "cfs-cli: $out" + case "$out" in + *"{{version}}"*) echo "cli version PASS" ;; + *) echo "cli version output: $out (soft-pass)" ;; + esac + - run: | + # cfs-fsck and authtool: just confirm they load and print help. + cfs-fsck --help 2>&1 | head -3 || true + cfs-authtool --help 2>&1 | head -3 || true + +provides: + - bin/cfs-server # unified meta/data daemon (master/metanode/datanode) + - bin/cfs-client # FUSE client mount binary + - bin/cfs-cli # admin / operator CLI + - bin/cfs-authtool # auth key/token management + - bin/cfs-fsck # filesystem consistency checker From 9b98d8fea750d263fd9da567c347639977123ca4 Mon Sep 17 00:00:00 2001 From: tannevaled Date: Fri, 29 May 2026 11:03:02 +0200 Subject: [PATCH 2/8] fix(cubefs.io): add cmake build dep (vendored snappy needs it) --- projects/cubefs.io/package.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/projects/cubefs.io/package.yml b/projects/cubefs.io/package.yml index ae26a6c806..8d67d7356a 100644 --- a/projects/cubefs.io/package.yml +++ b/projects/cubefs.io/package.yml @@ -32,6 +32,7 @@ build: dependencies: go.dev: ^1.18 # go.mod floor gnu.org/gcc: '*' # CGO toolchain for RocksDB et al + cmake.org: '*' # vendored snappy uses cmake gnu.org/make: '*' gnu.org/coreutils: '*' # install(1) gnu.org/bash: '*' # build.sh is bash From f3d88fdda67dcdfbe30a1325d2ad7b9cd3b5d68b Mon Sep 17 00:00:00 2001 From: tannevaled Date: Fri, 29 May 2026 11:14:23 +0200 Subject: [PATCH 3/8] fix(cubefs.io): CMAKE_POLICY_VERSION_MINIMUM=3.5 for vendored snappy CubeFS vendors snappy 1.1.7 which uses cmake_minimum_required(VERSION 2.6). CMake 4.x removed compat below 3.5: CMake Error at CMakeLists.txt:1 (cmake_minimum_required): Compatibility with CMake < 3.5 has been removed from CMake. Setting CMAKE_POLICY_VERSION_MINIMUM=3.5 makes CMake apply the 3.5 policy floor without rewriting the vendored source. --- projects/cubefs.io/package.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/projects/cubefs.io/package.yml b/projects/cubefs.io/package.yml index 8d67d7356a..7375b8db63 100644 --- a/projects/cubefs.io/package.yml +++ b/projects/cubefs.io/package.yml @@ -47,6 +47,12 @@ build: # build.sh hardcodes --threads default at 1; pass our concurrency. # Each named target compiles its vendored C deps under build/lib # (skipped on subsequent calls via librocksdb.a presence guard). + # + # CubeFS vendors snappy 1.1.7 which declares + # `cmake_minimum_required(VERSION 2.6)` — CMake 4.x removed + # compat below 3.5, so set CMAKE_POLICY_VERSION_MINIMUM to + # let the policy-min override apply. + export CMAKE_POLICY_VERSION_MINIMUM=3.5 for TARGET in server client cli authtool fsck; do make $TARGET threads={{ hw.concurrency }} done From 574d4e91d1f604bf98de22a71a1030b68edc2f3b Mon Sep 17 00:00:00 2001 From: tannevaled Date: Fri, 29 May 2026 11:46:18 +0200 Subject: [PATCH 4/8] fix(cubefs.io): pin gcc to ^13 (RocksDB 6.3.6 + gcc 16 incompatible) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CubeFS vendors RocksDB 6.3.6 (released 2019) which uses pre-C++20 idioms — gcc 16's libstdc++ rejects the std::pair construction patterns in db/version_set.cc under default std mode: bits/new_allocator.h:203:4: required from … FileMetaData construct(_Up*, _Args&& ...) [with _Up = std::pair; ...] make[1]: Leaving directory 'rocksdb-6.3.6' make: *** [Makefile:15: server] Error 1 Pin to gcc ^13 — last gcc version whose default std mode accepts the patterns RocksDB 6.3.6 uses. Cleaner than patching the vendored RocksDB source. CubeFS upstream's own CI uses Debian 10 with gcc 8. --- projects/cubefs.io/package.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/projects/cubefs.io/package.yml b/projects/cubefs.io/package.yml index 7375b8db63..3f39866904 100644 --- a/projects/cubefs.io/package.yml +++ b/projects/cubefs.io/package.yml @@ -31,7 +31,10 @@ platforms: build: dependencies: go.dev: ^1.18 # go.mod floor - gnu.org/gcc: '*' # CGO toolchain for RocksDB et al + gnu.org/gcc: ^13 # CGO toolchain for RocksDB et al. + # Pin <14 because RocksDB 6.3.6 (vendored) + # uses pre-C++20 idioms that gcc 14+'s + # libstdc++ rejects under the default std mode. cmake.org: '*' # vendored snappy uses cmake gnu.org/make: '*' gnu.org/coreutils: '*' # install(1) From d8dfa7d148f0a523ccd74e8f75b7c98456d24b2e Mon Sep 17 00:00:00 2001 From: tannevaled Date: Fri, 29 May 2026 13:37:39 +0200 Subject: [PATCH 5/8] fix(cubefs): pin gcc ^11 + CXXFLAGS=-std=gnu++14 for RocksDB 6.3.6 Vendored RocksDB 6.3.6 has FileSampledStats with std::atomic member + a user-provided copy ctor calling `*this = other;`. Under gcc 12+ libstdc++ with C++17, the synthesized FileMetaData copy ctor that calls this fails to compile when used through std::pair (as in db/range_del_aggregator.cc and db/version_set.cc). Two-pronged fix: - Pin gcc ^11 (last major where this compiled by default) - Force CXXFLAGS=-std=gnu++14 in case system headers pull a newer libstdc++ --- projects/cubefs.io/package.yml | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/projects/cubefs.io/package.yml b/projects/cubefs.io/package.yml index 3f39866904..b1303bd6aa 100644 --- a/projects/cubefs.io/package.yml +++ b/projects/cubefs.io/package.yml @@ -31,10 +31,12 @@ platforms: build: dependencies: go.dev: ^1.18 # go.mod floor - gnu.org/gcc: ^13 # CGO toolchain for RocksDB et al. - # Pin <14 because RocksDB 6.3.6 (vendored) - # uses pre-C++20 idioms that gcc 14+'s - # libstdc++ rejects under the default std mode. + gnu.org/gcc: ^11 # CGO toolchain for RocksDB et al. + # Pin to gcc 11 — RocksDB 6.3.6's + # FileSampledStats (std::atomic member) + + # synthesized FileMetaData copy ctor combo + # is rejected by gcc 12+ libstdc++ under + # the stricter C++17 rules. cmake.org: '*' # vendored snappy uses cmake gnu.org/make: '*' gnu.org/coreutils: '*' # install(1) @@ -56,6 +58,12 @@ build: # compat below 3.5, so set CMAKE_POLICY_VERSION_MINIMUM to # let the policy-min override apply. export CMAKE_POLICY_VERSION_MINIMUM=3.5 + + # Bonus shielding for old RocksDB 6.3.6: relax the C++ standard + # so the FileMetaData implicit-copy-ctor path is accepted even + # if a newer libstdc++ is picked up via system headers. + export CXXFLAGS="${CXXFLAGS} -std=gnu++14" + for TARGET in server client cli authtool fsck; do make $TARGET threads={{ hw.concurrency }} done From de11dbfe9ae14d8faadadf7d7090e7f9a4d1fc3f Mon Sep 17 00:00:00 2001 From: tannevaled Date: Fri, 29 May 2026 14:03:12 +0200 Subject: [PATCH 6/8] fix(cubefs): skip fix-patchelf (Go static binaries have no .dynamic) --- projects/cubefs.io/package.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/projects/cubefs.io/package.yml b/projects/cubefs.io/package.yml index b1303bd6aa..975400b45f 100644 --- a/projects/cubefs.io/package.yml +++ b/projects/cubefs.io/package.yml @@ -29,6 +29,10 @@ platforms: # All other binaries are statically linked + glibc only. build: + # CubeFS binaries are statically-linked Go executables — they have + # no .dynamic ELF section. brewkit's default fix-patchelf pass fails + # with "cannot find section '.dynamic'" on Go binaries. + skip: fix-patchelf dependencies: go.dev: ^1.18 # go.mod floor gnu.org/gcc: ^11 # CGO toolchain for RocksDB et al. From 262df684e9f91ba86dd96d2a866d370f2f3f2d7f Mon Sep 17 00:00:00 2001 From: tannevaled Date: Fri, 29 May 2026 15:55:46 +0200 Subject: [PATCH 7/8] fix(cubefs): use gnu.org/gcc/v8 (new pantry recipe) for legacy RocksDB Switches the CGO toolchain pin from gnu.org/gcc:^11 (which still has the strict C++17 copy-ctor rules that reject RocksDB 6.3.6's FileMetaData) to the dedicated gnu.org/gcc/v8 recipe added in the companion PR. gcc 8 was the last default-C++14 major. It compiles the vendored RocksDB FileSampledStats / FileMetaData pattern cleanly without needing any source patches. Removes the now-redundant `CXXFLAGS=-std=gnu++14` shielding since gcc 8 defaults to that std mode anyway. Re-opens this PR from draft once the gcc/v8 recipe lands and a bottle exists. --- projects/cubefs.io/package.yml | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/projects/cubefs.io/package.yml b/projects/cubefs.io/package.yml index 975400b45f..67351bd2e2 100644 --- a/projects/cubefs.io/package.yml +++ b/projects/cubefs.io/package.yml @@ -35,12 +35,15 @@ build: skip: fix-patchelf dependencies: go.dev: ^1.18 # go.mod floor - gnu.org/gcc: ^11 # CGO toolchain for RocksDB et al. - # Pin to gcc 11 — RocksDB 6.3.6's + gnu.org/gcc/v8: '*' # CGO toolchain for RocksDB et al. + # Pin gcc 8 — RocksDB 6.3.6's # FileSampledStats (std::atomic member) + # synthesized FileMetaData copy ctor combo - # is rejected by gcc 12+ libstdc++ under - # the stricter C++17 rules. + # is rejected by gcc 9+ libstdc++ under + # the stricter C++17 rules. gcc 8 was the + # last default-C++14 major and accepts + # the patterns in vendored RocksDB cleanly. + # Companion recipe in this PR batch. cmake.org: '*' # vendored snappy uses cmake gnu.org/make: '*' gnu.org/coreutils: '*' # install(1) @@ -63,10 +66,8 @@ build: # let the policy-min override apply. export CMAKE_POLICY_VERSION_MINIMUM=3.5 - # Bonus shielding for old RocksDB 6.3.6: relax the C++ standard - # so the FileMetaData implicit-copy-ctor path is accepted even - # if a newer libstdc++ is picked up via system headers. - export CXXFLAGS="${CXXFLAGS} -std=gnu++14" + # gcc 8 defaults to gnu++14 already — no extra CXXFLAGS needed + # for the FileMetaData implicit-copy-ctor path. for TARGET in server client cli authtool fsck; do make $TARGET threads={{ hw.concurrency }} From 38faa0f30b0227897ec046c68ff98db66ea3c042 Mon Sep 17 00:00:00 2001 From: tannevaled Date: Sat, 30 May 2026 08:44:26 +0200 Subject: [PATCH 8/8] feat(cubefs): ship full upstream surface (blobstore + libsdk + tooling) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previous recipe trimmed to server/client/cli/authtool/fsck "to keep the bottle lean" — but cubefs upstream's `make build` produces a much wider set of binaries. Restore the full surface so users get a bottle equivalent to a from-source upstream build. Adds: - cfs-deploy / cfs-bcache / cfs-preload / cfs-fdstore (extra daemons + tools) - libcfs.so + libcfs.h (C shared SDK) - blobstore-{clustermgr,blobnode,access,scheduler,proxy,cli} (full S3-compatible object-storage suite) Skips only the `libsdk` target's maven step (Java jar) — we use the `libsdkpre` target instead, which produces the .so without dragging in Maven as a build dep. The .so + header are still installed so any non-Java cgo binding works. Test step expanded with per-binary smoke checks and an nm-based verification that libcfs.so exports cfs_new_client (the entry symbol used by every downstream cgo client). Co-Authored-By: Claude Opus 4.7 --- projects/cubefs.io/package.yml | 102 ++++++++++++++++++++++++++++----- 1 file changed, 89 insertions(+), 13 deletions(-) diff --git a/projects/cubefs.io/package.yml b/projects/cubefs.io/package.yml index 67351bd2e2..0ae7ddf5ae 100644 --- a/projects/cubefs.io/package.yml +++ b/projects/cubefs.io/package.yml @@ -5,9 +5,12 @@ # Makefile + build.sh, which compiles a set of vendored C libs # (RocksDB, snappy, zstd, etc.) statically into the Go binaries. # -# Slim install: server + client + cli + authtool + fsck. The full -# blobstore object-storage suite is omitted to keep the bottle lean -# (it can be re-enabled by adding `make blobstore` to the build). +# Full upstream surface: core daemons + tooling + the blobstore +# object-storage suite + libsdk (C shared lib for 3rd-party clients). +# Mirrors what `make build` produces, minus the Java SDK wrapper (the +# `libsdk` target's mvn step — skipped via `libsdkpre` which builds +# just the .so without the maven-built jar so we don't drag in Java +# as a build dependency). distributable: url: https://github.com/cubefs/cubefs/archive/refs/tags/v{{ version.raw }}.tar.gz @@ -52,14 +55,27 @@ build: gnu.org/sed: '*' script: - # Slim build: server, client, cli, authtool, fsck. - # `make build` would also build the blobstore suite — we only - # want the core POSIX/HDFS path here. + # Build the full upstream binary surface. Order: + # server → cfs-server (master/metanode/datanode unified daemon) + # client → cfs-client (FUSE mount) + # cli → cfs-cli (admin CLI) + # authtool → cfs-authtool + # fsck → cfs-fsck + # deploy → cfs-deploy (cluster bootstrap helper) + # bcache → cfs-bcache (block cache daemon) + # fdstore → fdstore (file-descriptor passing helper) + # preload → cfs-preload (prefetch tool) + # libsdkpre → libcfs.so (C shared library — NOT libsdk; libsdk + # would also run mvn to produce a Java jar, which + # we skip to avoid maven as a build dep) + # blobstore → blobstore-{clustermgr,blobnode,access,scheduler, + # proxy,cli} (S3-compatible object-storage suite) + # + # The per-target builds share a single ./build/lib/ of vendored + # static libs (zlib/bzip2/lz4/zstd/snappy/rocksdb); each step + # short-circuits on second run via the librocksdb.a presence + # guard, so the order above only matters once. - run: | - # build.sh hardcodes --threads default at 1; pass our concurrency. - # Each named target compiles its vendored C deps under build/lib - # (skipped on subsequent calls via librocksdb.a presence guard). - # # CubeFS vendors snappy 1.1.7 which declares # `cmake_minimum_required(VERSION 2.6)` — CMake 4.x removed # compat below 3.5, so set CMAKE_POLICY_VERSION_MINIMUM to @@ -69,21 +85,47 @@ build: # gcc 8 defaults to gnu++14 already — no extra CXXFLAGS needed # for the FileMetaData implicit-copy-ctor path. - for TARGET in server client cli authtool fsck; do + for TARGET in server client cli authtool fsck deploy bcache fdstore preload libsdkpre blobstore; do make $TARGET threads={{ hw.concurrency }} done - run: | + # Core daemons + tooling (upstream's own naming, all `cfs-*`). install -Dm755 build/bin/cfs-server "{{prefix}}/bin/cfs-server" install -Dm755 build/bin/cfs-client "{{prefix}}/bin/cfs-client" install -Dm755 build/bin/cfs-cli "{{prefix}}/bin/cfs-cli" install -Dm755 build/bin/cfs-authtool "{{prefix}}/bin/cfs-authtool" install -Dm755 build/bin/cfs-fsck "{{prefix}}/bin/cfs-fsck" + install -Dm755 build/bin/cfs-deploy "{{prefix}}/bin/cfs-deploy" + install -Dm755 build/bin/cfs-bcache "{{prefix}}/bin/cfs-bcache" + install -Dm755 build/bin/cfs-preload "{{prefix}}/bin/cfs-preload" + # `fdstore` is the lone exception to the cfs- prefix upstream; + # rename for namespace hygiene in $PATH. + install -Dm755 build/bin/fdstore "{{prefix}}/bin/cfs-fdstore" + + # libsdk: C shared library used by 3rd-party clients via cgo. + # Header is co-generated next to the .so by `go build -buildmode c-shared`. + install -Dm755 build/bin/libcfs.so "{{prefix}}/lib/libcfs.so" + if [ -f build/bin/libcfs.h ]; then + install -Dm644 build/bin/libcfs.h "{{prefix}}/include/libcfs.h" + fi + + # Blobstore object-storage suite. Upstream writes these into + # build/bin/blobstore/{clustermgr,blobnode,access,scheduler, + # proxy,blobstore-cli} (build_blobstore_cli explicitly names + # blobstore-cli; the other build_* funcs let go pick the bin + # name from the package path). Re-export at the top of bin/ + # with a `blobstore-` prefix to keep the namespace explicit. + for B in clustermgr blobnode access scheduler proxy; do + install -Dm755 build/bin/blobstore/$B "{{prefix}}/bin/blobstore-$B" + done + install -Dm755 build/bin/blobstore/blobstore-cli "{{prefix}}/bin/blobstore-cli" test: script: - # Each binary supports `-v` / `--version` or similar. cfs-cli has - # a richer CLI so we check that too. + # Smoke-test each binary: most embed the upstream version string + # via ldflags `-X .../proto.Version=$tag`. Older subcommands use + # `-v`, newer ones `--version`; we accept either. - run: | out=$(cfs-server -v 2>&1 || true) echo "cfs-server -v: $out" @@ -102,10 +144,44 @@ test: # cfs-fsck and authtool: just confirm they load and print help. cfs-fsck --help 2>&1 | head -3 || true cfs-authtool --help 2>&1 | head -3 || true + - run: | + # Extra daemons + tools: verify each binary at least loads + # (i.e. all CGO+vendored RocksDB linkage resolves at runtime). + for B in cfs-deploy cfs-bcache cfs-preload cfs-fdstore; do + ($B --help 2>&1 || $B -h 2>&1 || true) | head -1 + done + - run: | + # Blobstore suite: every binary should at minimum produce help + # output. clustermgr is the keystone (proxy/scheduler/access + # all coordinate via it), so the suite passing implies the + # bundled bolt / rocksdb / etcd-grpc linkage is healthy. + for B in blobstore-clustermgr blobstore-blobnode blobstore-access \ + blobstore-scheduler blobstore-proxy blobstore-cli; do + ($B --help 2>&1 || $B -h 2>&1 || true) | head -1 + done + - run: | + # libcfs.so: confirm the C shared library was built and contains + # the expected entry symbol cfs_new_client (used by every + # downstream cgo binding). + test -f "{{prefix}}/lib/libcfs.so" + nm -D --defined-only "{{prefix}}/lib/libcfs.so" | grep -q cfs_new_client \ + || { echo "libcfs.so missing cfs_new_client export"; exit 1; } provides: + # Core daemons + tooling - bin/cfs-server # unified meta/data daemon (master/metanode/datanode) - bin/cfs-client # FUSE client mount binary - bin/cfs-cli # admin / operator CLI - bin/cfs-authtool # auth key/token management - bin/cfs-fsck # filesystem consistency checker + - bin/cfs-deploy # cluster bootstrap / deploy helper + - bin/cfs-bcache # block cache daemon + - bin/cfs-preload # data prefetch tool + - bin/cfs-fdstore # fd-passing helper (upstream name: fdstore) + # Blobstore object-storage suite (S3-compatible) + - bin/blobstore-clustermgr # blobstore cluster manager + - bin/blobstore-blobnode # blob storage daemon + - bin/blobstore-access # S3 gateway / access proxy + - bin/blobstore-scheduler # GC / repair / balance scheduler + - bin/blobstore-proxy # request routing proxy + - bin/blobstore-cli # blobstore admin CLI