Skip to main content

Minimize the Disk Footprint of Fleet Devices

Fit full device monitoring into a small image. Remove unused plugin bundles and strip debugging symbols while keeping the system metrics, application metrics and live Functions your operators need. Let the Parent provide dashboards, long-term storage, alerts and anomaly detection.

The example package keeps system metrics, process monitoring and hardware sensors in 54.0 MiB on ARMv6 or 40.6 MiB on ARMv7—a payload reduction of about 90% and 94% respectively. The compressed installers are 21.8 MiB and 19.3 MiB.

Use the fleet preparation script to create a new installer from the upstream static package. The examples and size reference below use Netdata v2.12.0-2-nightly and LLVM 23.1.1.

Prepare the build host​

Use a Linux or macOS build host with Python 3.9 or newer and a GNU binutils or LLVM strip tool that supports Linux ELF files for your device architecture. Install these tools on the build host; devices need no cross-compilation tools.

Reserve 4 GiB of workspace per ARM package on a filesystem supporting Unix permissions, symbolic links and hard links, such as ext4, XFS or APFS. You can copy the completed installer and checksum to other storage.

Debian and Ubuntu​

sudo apt-get update
sudo apt-get install python3 coreutils curl binutils-arm-linux-gnueabihf

The ARM binutils package supplies arm-linux-gnueabihf-strip for both ARMv6 and ARMv7. For 64-bit ARM packages, use binutils-aarch64-linux-gnu and aarch64-linux-gnu-strip. Your build host's default strip may support only its own architecture.

Alternatively, LLVM supplies one tool for multiple target architectures:

sudo apt-get install llvm
llvm-strip --version

macOS​

Install Python and LLVM through Homebrew, then add LLVM's tools to the current shell's PATH:

brew install python llvm
export PATH="$(brew --prefix llvm)/bin:$PATH"
python3 --version
llvm-strip --version

Use --strip-tool llvm-strip for Netdata's Linux ELF binaries. macOS's built-in strip handles Mach-O files and is unsuitable for these packages.

For checksum commands below, use macOS's shasum -a 256 in place of sha256sum:

shasum -a 256 netdata-armv6l-v2.12.0-2-nightly.gz.run
shasum -a 256 netdata-armv7l-v2.12.0-2-nightly.gz.run

Choose the stripping tool​

Prebuilt toolchains are also available from LLVM releases, including LLVM 23.1.1. Choose the toolchain for your build host and put its bin directory on PATH.

The examples use --strip-tool llvm-strip. Substitute --strip-tool arm-linux-gnueabihf-strip when using GNU binutils.

Choose what to keep​

For system, process and sensor monitoring, use --keep apps,debugfs. Add network for live connection inspection or go for its application and service collectors. The capability reference below explains every choice.

Built-in Linux system collectors remain in the Agent: CPU, memory, network interfaces and disks continue to be monitored with their collectors enabled. Your selected plugins provide the additional device-side metrics and Functions that operators use through the Parent.

Choose a stripping mode:

OptionUse it for
--strip-mode allThe smallest binaries; keep the original package on the build host for crash diagnosis
--strip-mode debugRemoving debug information while keeping more diagnostic symbols; this is the default
--strip-mode noneSelecting bundles while leaving binary symbols unchanged

Prepare an ARMv6 package​

Download the script, package and published checksums:

curl -fL -o prepare-fleet.py \
https://raw.githubusercontent.com/netdata/netdata/master/packaging/makeself/prepare-fleet.py
curl -fL -o netdata-armv6l-v2.12.0-2-nightly.gz.run \
https://github.com/netdata/netdata-nightlies/releases/download/v2.12.0-2-nightly/netdata-armv6l-v2.12.0-2-nightly.gz.run
curl -fL -o sha256sums.txt \
https://github.com/netdata/netdata-nightlies/releases/download/v2.12.0-2-nightly/sha256sums.txt
sha256sum netdata-armv6l-v2.12.0-2-nightly.gz.run

Compare the checksum with sha256sums.txt. For this package it is:

4bbb1c330137f8b53f895d173ae176fd71015032c2d75c843a0d5981e0184ebe netdata-armv6l-v2.12.0-2-nightly.gz.run

Run preparation:

python3 ./prepare-fleet.py \
--input netdata-armv6l-v2.12.0-2-nightly.gz.run \
--sha256 4bbb1c330137f8b53f895d173ae176fd71015032c2d75c843a0d5981e0184ebe \
--keep apps,debugfs \
--strip-mode all \
--strip-tool llvm-strip \
--apply \
--output netdata-armv6l-edge.gz.run

The script shows each command before running it, the before/after size of each stripped executable, and the completed package. This example uses /build/edge as the working directory; temporary workspace names vary:

/build/edge > python3 ./prepare-fleet.py --input netdata-armv6l-v2.12.0-2-nightly.gz.run --sha256 4bbb1c330137f8b53f895d173ae176fd71015032c2d75c843a0d5981e0184ebe --keep apps,debugfs --strip-mode all --strip-tool llvm-strip --apply --output netdata-armv6l-edge.gz.run
Workspace retained for inspection: /build/edge/.netdata-fleet-example
Input: netdata-armv6l-v2.12.0-2-nightly.gz.run
Keep: apps, debugfs
Remove: charts, containers, dashboard, go, ioping, log2journal, mcp, network, nfacct, perf, python, scripts, slabinfo
Strip mode: all
Original payload: 514.7 MiB
Removed bundles: 305.7 MiB
Payload before stripping: 209.0 MiB
/build/edge > llvm-strip --strip-all -o /build/edge/.netdata-fleet-example/stripped-file /build/edge/.netdata-fleet-example/tree/bin/bash
Stripped bin/bash: 1.9 MiB -> 1.9 MiB
/build/edge > llvm-strip --strip-all -o /build/edge/.netdata-fleet-example/stripped-file /build/edge/.netdata-fleet-example/tree/bin/curl
Stripped bin/curl: 7.4 MiB -> 7.4 MiB
/build/edge > llvm-strip --strip-all -o /build/edge/.netdata-fleet-example/stripped-file /build/edge/.netdata-fleet-example/tree/bin/nd-run
Stripped bin/nd-run: 475.1 KiB -> 65.4 KiB
/build/edge > llvm-strip --strip-all -o /build/edge/.netdata-fleet-example/stripped-file /build/edge/.netdata-fleet-example/tree/bin/netdatacli
Stripped bin/netdatacli: 2.5 MiB -> 358.7 KiB
/build/edge > llvm-strip --strip-all -o /build/edge/.netdata-fleet-example/stripped-file /build/edge/.netdata-fleet-example/tree/bin/srv/netdata
Stripped bin/srv/netdata: 169.0 MiB -> 30.2 MiB
/build/edge > llvm-strip --strip-all -o /build/edge/.netdata-fleet-example/stripped-file /build/edge/.netdata-fleet-example/tree/bin/systemd-cat-native
Stripped bin/systemd-cat-native: 11.1 MiB -> 7.3 MiB
/build/edge > llvm-strip --strip-all -o /build/edge/.netdata-fleet-example/stripped-file /build/edge/.netdata-fleet-example/tree/usr/libexec/netdata/plugins.d/apps.plugin
Stripped usr/libexec/netdata/plugins.d/apps.plugin: 7.0 MiB -> 1.2 MiB
/build/edge > llvm-strip --strip-all -o /build/edge/.netdata-fleet-example/stripped-file /build/edge/.netdata-fleet-example/tree/usr/libexec/netdata/plugins.d/debugfs.plugin
Stripped usr/libexec/netdata/plugins.d/debugfs.plugin: 4.8 MiB -> 879.2 KiB
/build/edge > llvm-strip --strip-all -o /build/edge/.netdata-fleet-example/stripped-file /build/edge/.netdata-fleet-example/tree/usr/libexec/netdata/plugins.d/ndsudo
Stripped usr/libexec/netdata/plugins.d/ndsudo: 399.0 KiB -> 62.1 KiB
/build/edge > cksum /build/edge/.netdata-fleet-example/payload.gz
Published /build/edge/netdata-armv6l-edge.gz.run
Published /build/edge/netdata-armv6l-edge.gz.run.sha256
Prepared payload: 54.0 MiB
Disk reduction: 89.5%
Installer: netdata-armv6l-edge.gz.run (21.8 MiB)
Checksum: netdata-armv6l-edge.gz.run.sha256
Manifest: usr/share/netdata/fleet-manifest.json

The result is netdata-armv6l-edge.gz.run, ready to install in your device image, and its .sha256 checksum file.

Prepare an ARMv7 package​

Download the ARMv7 package and compare its checksum with the same release's sha256sums.txt:

curl -fL -o netdata-armv7l-v2.12.0-2-nightly.gz.run \
https://github.com/netdata/netdata-nightlies/releases/download/v2.12.0-2-nightly/netdata-armv7l-v2.12.0-2-nightly.gz.run
sha256sum netdata-armv7l-v2.12.0-2-nightly.gz.run

Expected checksum:

0994f644457a0c273fdef0a3c05e5e5c8f2fd9ca61843f5a1e1a231b15e74281 netdata-armv7l-v2.12.0-2-nightly.gz.run

Run preparation:

python3 ./prepare-fleet.py \
--input netdata-armv7l-v2.12.0-2-nightly.gz.run \
--sha256 0994f644457a0c273fdef0a3c05e5e5c8f2fd9ca61843f5a1e1a231b15e74281 \
--keep apps,debugfs \
--strip-mode all \
--strip-tool llvm-strip \
--apply \
--output netdata-armv7l-edge.gz.run

Expected output, using the same workspace convention:

/build/edge > python3 ./prepare-fleet.py --input netdata-armv7l-v2.12.0-2-nightly.gz.run --sha256 0994f644457a0c273fdef0a3c05e5e5c8f2fd9ca61843f5a1e1a231b15e74281 --keep apps,debugfs --strip-mode all --strip-tool llvm-strip --apply --output netdata-armv7l-edge.gz.run
Workspace retained for inspection: /build/edge/.netdata-fleet-example
Input: netdata-armv7l-v2.12.0-2-nightly.gz.run
Keep: apps, debugfs
Remove: charts, containers, dashboard, go, ioping, journal, log2journal, mcp, netflow, network, nfacct, otel, perf, python, scripts, slabinfo
Strip mode: all
Original payload: 676.4 MiB
Removed bundles: 482.7 MiB
Payload before stripping: 193.7 MiB
/build/edge > llvm-strip --strip-all -o /build/edge/.netdata-fleet-example/stripped-file /build/edge/.netdata-fleet-example/tree/bin/bash
Stripped bin/bash: 1.3 MiB -> 1.3 MiB
/build/edge > llvm-strip --strip-all -o /build/edge/.netdata-fleet-example/stripped-file /build/edge/.netdata-fleet-example/tree/bin/curl
Stripped bin/curl: 5.4 MiB -> 5.4 MiB
/build/edge > llvm-strip --strip-all -o /build/edge/.netdata-fleet-example/stripped-file /build/edge/.netdata-fleet-example/tree/bin/nd-run
Stripped bin/nd-run: 452.4 KiB -> 45.4 KiB
/build/edge > llvm-strip --strip-all -o /build/edge/.netdata-fleet-example/stripped-file /build/edge/.netdata-fleet-example/tree/bin/netdatacli
Stripped bin/netdatacli: 2.3 MiB -> 258.7 KiB
/build/edge > llvm-strip --strip-all -o /build/edge/.netdata-fleet-example/stripped-file /build/edge/.netdata-fleet-example/tree/bin/srv/netdata
Stripped bin/srv/netdata: 158.9 MiB -> 22.0 MiB
/build/edge > llvm-strip --strip-all -o /build/edge/.netdata-fleet-example/stripped-file /build/edge/.netdata-fleet-example/tree/bin/systemd-cat-native
Stripped bin/systemd-cat-native: 9.1 MiB -> 5.4 MiB
/build/edge > llvm-strip --strip-all -o /build/edge/.netdata-fleet-example/stripped-file /build/edge/.netdata-fleet-example/tree/usr/libexec/netdata/plugins.d/apps.plugin
Stripped usr/libexec/netdata/plugins.d/apps.plugin: 6.6 MiB -> 921.1 KiB
/build/edge > llvm-strip --strip-all -o /build/edge/.netdata-fleet-example/stripped-file /build/edge/.netdata-fleet-example/tree/usr/libexec/netdata/plugins.d/debugfs.plugin
Stripped usr/libexec/netdata/plugins.d/debugfs.plugin: 4.6 MiB -> 647.2 KiB
/build/edge > llvm-strip --strip-all -o /build/edge/.netdata-fleet-example/stripped-file /build/edge/.netdata-fleet-example/tree/usr/libexec/netdata/plugins.d/ndsudo
Stripped usr/libexec/netdata/plugins.d/ndsudo: 378.1 KiB -> 46.1 KiB
/build/edge > cksum /build/edge/.netdata-fleet-example/payload.gz
Published /build/edge/netdata-armv7l-edge.gz.run
Published /build/edge/netdata-armv7l-edge.gz.run.sha256
Prepared payload: 40.6 MiB
Disk reduction: 94.0%
Installer: netdata-armv7l-edge.gz.run (19.3 MiB)
Checksum: netdata-armv7l-edge.gz.run.sha256
Manifest: usr/share/netdata/fleet-manifest.json

Preview a different selection​

Leave out --apply and --output to preview which bundles will be kept and removed. Add --verbose for the complete file report. Detailed file lists and exact byte counts are also retained in the installed usr/share/netdata/fleet-manifest.json.

Each run keeps its preparation workspace for inspection. Include those workspaces in your build-host cleanup policy.

Install the prepared package​

Install into a clean device image so the component selection matches your policy. The static installer uses /opt/netdata:

sudo sh ./netdata-armv6l-edge.gz.run --accept -- \
--dont-start-it --disable-telemetry

For ARMv7, use netdata-armv7l-edge.gz.run. --accept enables unattended license acceptance. Apply the Child configuration and streaming credentials before starting the Agent:

sudo systemctl start netdata
sudo /opt/netdata/bin/netdatacli version

Expected version:

netdata v2.12.0-2-nightly

The installer assigns plugin ownership and Linux capabilities, including setuid fallbacks. If your pipeline copies an offline prepared tree instead, apply the same ownership and privilege policy. Use the static installer's /opt/netdata prefix; --target is an extraction option, not a supported installation-prefix setting.

Save the package manifest and checksum with the image release. Use the image-controlled update workflow to keep the selected components through future updates.

Plugin capability reference​

--keep capabilityWhat it providesKeep it when
appsPer-process and process-group CPU, memory, disk I/O and other resource metrics, plus the live processes FunctionYou need to identify a busy, leaking or failing device application from the Parent
debugfsLinux hwmon sensors through bundled libsensors, the live sensors Function, powercap/RAPL energy metrics, memory fragmentation, zswap and Linux audit statusYou need the sensors or kernel interfaces present on your hardware
networkLive TCP/UDP connection inspection with network-viewer.plugin, plus connection topology and apps for process attributionYou need to investigate which device process is communicating with a service
containersContainer-name resolution, Kubernetes labels and container-network helpers for the built-in cgroups collectorDevices run containers and you need their names and network attribution. The cgroups collector itself is in the Agent executable
goThe Go collector bundle, its discovery and supported live Functions, stock collector configurations and Prometheus profiles; also retains local-listeners and snmp-trap-profile-genYou collect application, database, UPS, service, SNMP, Prometheus or other metrics supplied by this bundle. Select jobs in go.d configuration
journalReading and querying local systemd journals through the journal FunctionOperators need device logs through the Parent. Keep readable systemd journals on the device
otelOTLP/gRPC ingestion of supported metrics, logs and traces, with local log/trace storage and query FunctionsDevice applications export OpenTelemetry to the local Agent. Account for log and trace retention separately
netflowNetFlow/IPFIX/sFlow ingestion and flow exploration, with bundled IP-intelligence databasesThe device receives flow exports. The database assets account for most of this bundle's size
dashboardWeb dashboard assets hosted by the deviceOperators use a device-local dashboard. Omit it when dashboards are served by the Parent
mcpnd-mcp, the stdio-to-WebSocket bridge used by desktop MCP clientsA desktop client uses this bridge on the device; the Agent provides the MCP server
pythonpython.d.plugin and its bundled Python collector modules/configurationsYou use one of these collectors. The device needs a Python interpreter and any collector-specific dependencies; the package includes its YAML loader, but does not bundle Python
chartscharts.d.plugin, its Bash collector modules and stock configurationsYou use a charts.d module. The package retains Bash, but module-specific external commands must be available on the device
scriptsscripts.d.plugin and its Nagios-check configurationYou run Nagios-compatible checks. Provide the check executables, interpreters and their dependencies on the device; they are not bundled with Netdata
perfLinux perf-event CPU counters, including cycles, instructions and cache eventsYou need CPU performance-counter monitoring and the hardware/kernel exposes the counters. Enable this plugin explicitly
slabinfoPer-cache Linux kernel slab allocator statistics from /proc/slabinfoYou need detailed kernel-memory troubleshooting. Enable it explicitly and retain its privileged permissions
nfacctNetfilter connection-tracking statistics and packet/byte totals for configured accounting objectsThe device uses the relevant kernel facilities and accounting rules
ipmifreeipmi.plugin, for IPMI hardware sensors and event-log metricsThe hardware exposes an IPMI management interface and the input package includes this plugin
xenxenstat.plugin, for Xen host and domain resource statisticsThe device is a Xen hypervisor host (dom0); this is not a guest-VM collector
cupsCUPS printer and print-job metricsThe device operates a CUPS print service and the input package includes this plugin
ebpfThe packaged C and Go eBPF plugins for kernel instrumentationYou need their kernel/network/process monitoring and have a supported package, kernel and required privileges
systemd-unitsThe live systemd-list-units Function for service and other unit status over D-BusYou need live service-status inspection and the input package includes this plugin; service metrics are also available from the separate Go systemd collector
iopingThe bundled ioping executable and its collector/configurationYou need active storage-latency probes against configured devices, files or directories
log2journalThe log2journal utility and stock conversion configurationsYour log pipeline converts application output into structured journal records

Use python3 ./prepare-fleet.py --list-capabilities to see selection names and their paths. --keep all keeps all available bundles; --keep none keeps the Agent and shared helpers. Select capabilities available in your input package: the ARMv6 input used here lacks journal, otel and netflow; the ARMv7 input contains all three, which this example's --keep apps,debugfs selection removes. Neither input package includes ipmi, xen, cups, ebpf or systemd-units.

Keep go when your devices need its collectors, then enable the jobs you use. Bundle selection controls disk space; collector configuration controls runtime work. Custom configuration in etc/netdata is retained. With customized source trees, use --verbose to inspect files inside bundles selected for removal.

Package size reference​

PackageARMv6ARMv7
Upstream compressed installer173.0 MiB254.0 MiB
Upstream payload514.7 MiB676.4 MiB
All components, debug stripped338.5 MiB496.4 MiB
All components, fully stripped332.1 MiB473.9 MiB
apps,debugfs, fully stripped54.0 MiB40.6 MiB
Reduced compressed installer21.8 MiB19.3 MiB

Payload sizes cover package files. Allow additional space for filesystem allocation and any local history or logs you retain.

Optional bundle sizes​

These include the bundle's executables, configuration, profiles and data. The network row covers the network viewer; add the apps row for its process-attribution dependency.

CapabilityARMv6 originalARMv6 allARMv7 originalARMv7 all
apps7.001.266.580.91
debugfs4.790.864.560.63
network20.948.3818.376.04
containers9.487.129.357.01
go189.80186.83189.53186.60
mcp6.566.536.506.47
journalAbsentAbsent8.121.43
otelAbsentAbsent23.8814.72
netflowAbsentAbsent149.03142.47
dashboard51.7651.7651.7651.76
python0.680.680.680.68
charts0.050.050.050.05
scripts14.3814.3314.3114.26
perf2.560.382.440.28
slabinfo2.510.362.400.26
nfacct2.540.382.410.27
ipmiAbsentAbsentAbsentAbsent
xenAbsentAbsentAbsentAbsent
cupsAbsentAbsentAbsentAbsent
ebpfAbsentAbsentAbsentAbsent
systemd-unitsAbsentAbsentAbsentAbsent
ioping0.120.120.090.09
log2journal4.321.253.810.90

The Go bundle is about 187 MiB after stripping. The ARMv7 NetFlow bundle includes about 132 MiB of IP-intelligence data. Select these capabilities when your devices use them to match the image size to the monitoring job.

ARMv6 executable sizes​

ExecutableOriginal MiBDebug stripped MiBFully stripped MiB
bash1.861.861.86
curl7.387.387.38
log2journal4.311.361.25
nd-mcp6.566.536.53
nd-run0.460.080.06
netdatacli2.460.430.35
srv/netdata168.9933.1430.19
systemd-cat-native11.108.637.35
apps.plugin6.991.381.25
cgroup-name6.756.706.70
cgroup-network2.710.500.41
debugfs.plugin4.790.970.86
go.d.plugin162.50162.49162.49
ioping0.110.110.11
local-listeners3.550.710.61
ndsudo0.390.080.06
network-viewer.plugin20.949.648.38
nfacct.plugin2.540.460.38
perf.plugin2.560.460.38
scripts.d.plugin14.3814.3314.33
slabinfo.plugin2.510.440.36
snmp-trap-profile-gen9.259.249.24

ARMv7 executable sizes​

ExecutableOriginal MiBDebug stripped MiBFully stripped MiB
bash1.301.301.30
curl5.445.445.44
log2journal3.801.010.89
nd-mcp6.506.476.47
nd-run0.440.060.04
netdatacli2.340.330.25
srv/netdata158.9425.1722.02
systemd-cat-native9.116.655.37
apps.plugin6.571.030.90
cgroup-name6.756.706.70
cgroup-network2.580.380.30
debugfs.plugin4.560.740.63
go.d.plugin162.44162.43162.43
ioping0.080.080.08
local-listeners3.350.540.44
ndsudo0.370.060.05
netflow-plugin17.2317.1810.67
network-viewer.plugin18.377.336.04
nfacct.plugin2.410.350.27
otel-plugin23.8723.8114.71
perf.plugin2.440.360.28
scripts.d.plugin14.3114.2614.26
slabinfo.plugin2.400.340.26
snmp-trap-profile-gen9.259.249.24
systemd-journal.plugin8.121.701.43

Do you have any feedback for this page? If so, you can open a new issue on our netdata/learn repository.