'\" t .\" Title: nvme-discoverd .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot .\" Date: 10/30/2026 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" .TH "NVME\-DISCOVERD" "8" "10/30/2026" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" nvme-discoverd \- NVMe\-oF discovery and connectivity daemon .SH "SYNOPSIS" .sp .nf \fInvme\-discoverd\fR [\-\-config=] [\-\-nvme\-path=] [\-\-debug] [\-\-help] .fi .SH "DESCRIPTION" .sp nvme\-discoverd is a persistent daemon that connects the host\(cqs desired NVMe\-oF controllers and keeps them connected\&. It reads three sources to build its set of desired connections: the NBFT ACPI table (boot\-time controllers), the shared NVMe\-oF fabrics configuration (nvme\-fabrics\&.conf(5)), and the Discovery Log Pages of any Discovery Controllers it connects to (including FC targets found via FC kickstart)\&. It never disconnects a live controller in response to a discovery change; the only disconnects it causes are a side effect of stopping its own systemd units, at shutdown or on request\&. .sp At shutdown, a unit is stopped only after the file systems mounted with the \fI_netdev\fR option are unmounted\&. A file system on an NVMe\-oF namespace must use \fI_netdev\fR in fstab(5)\&. Without it, the controller can be disconnected while the file system is still mounted\&. .sp Every connection attempt is delegated to \fInvme connect\fR, which runs inside a systemd transient unit instead of writing directly to /dev/nvme\-fabrics\&. As a result, a stuck connect attempt never blocks the daemon\(cqs event loop\&. Each unit is named after a hash of the controller\(cqs transport identity\&. .sp Failed connections retry with exponential backoff\&. Discovery Controllers from NBFT or the fabrics config represent explicit intent, so they always retry forever\&. A Discovery Controller found only through a referral or FC kickstart is different: it gives up after \fIdc\-giveup\-timeout\fR (default 72hours) of unbroken failure and is dropped from tracking\&. .sp A TLS connection needs tlshd(8) from ktls\-utils\&. Enable it with \fIsystemctl enable \-\-now tlshd\fR\&. When both are enabled, nvme\-discoverd starts after tlshd\&. .sp Before connecting or reconnecting anything, nvme\-discoverd checks the system\-wide exclusion list\&. It also registers ownership of every controller it connects (\-\-owner discoverd, or \-\-owner nbft for an NBFT\-sourced controller) in the NVMe\-oF ownership registry\&. See nvme\-registry\-list(1) and nvme\-exclusion\-add(1)\&. .sp A Discovery Controller that has no owner, for example one connected with \fInvme discover \-\-persistent\fR, is not tracked\&. When its discovery log changes, or when it reconnects, nvme\-discoverd runs \fInvme connect\-all\fR for it in a transient unit, as the legacy udev rules do\&. The connections it makes have no owner, and \fInvme disconnect\-all\fR removes them\&. Events from a Discovery Controller with another owner are ignored\&. .sp nvme\-discoverd is still experimental\&. It is meant to replace the older udev\-rule/systemd\-unit autoconnect mechanism\&. By default, the legacy mechanism is built only when nvme\-discoverd is not\&. Building with \fI\-Dnvmf\-autoconnect=enabled\fR installs both\&. The legacy udev rules are active as soon as they are installed\&. nvme\-discoverd runs only when the administrator enables it with \fIsystemctl enable \-\-now nvme\-discoverd\fR\&. While nvme\-discoverd is active, nvmf\-autoconnect\&.service and the FC kickstart skip their connect step\&. .SH "OPTIONS" .PP \-c , \-\-config= .RS 4 Path to the daemon\(cqs own configuration file\&. Default: /usr/local/etc/nvme/nvme\-discoverd\&.conf; see CONFIGURATION below\&. A missing file is not an error \(em every knob keeps its default\&. .RE .PP \-\-nvme\-path= .RS 4 Absolute or relative path to the \fInvme\fR binary that transient connection units exec\&. Default: /usr/local/sbin/nvme\&. Mainly useful for running nvme\-discoverd against a locally built \fInvme\fR instead of the installed one\&. .RE .PP \-d, \-\-debug .RS 4 Enable debug\-level logging for both nvme\-discoverd and the libnvme calls it makes, overriding the configured debug\-level\&. .RE .PP \-h, \-\-help .RS 4 Print usage and exit\&. .RE .SH "CONFIGURATION" .sp nvme\-discoverd\&.conf holds the daemon\(cqs own knobs, in a \fI[Global]\fR section and a \fI[Discovery]\fR section: .sp .if n \{\ .RS 4 .\} .nf [Global] nbft = true debug\-level = info .fi .if n \{\ .RE .\} .sp .if n \{\ .RS 4 .\} .nf [Discovery] epcsd\-poll\-interval\-minutes = 15 fc\-kickstart\-interval\-minutes = 0 dc\-giveup\-timeout = 72hours zeroconf = false .fi .if n \{\ .RE .\} .sp \fInbft\fR (boolean, default true) adopts and connects controllers listed in the NBFT ACPI table\&. \fIdebug\-level\fR (err, warn, info, or debug; default info) sets the log threshold; \fI\-\-debug\fR on the command line overrides it\&. .sp \fIepcsd\-poll\-interval\-minutes\fR (default 15, minimum 1) sets how often, in minutes, to reconnect and re\-check a DC whose effective EPCSD (Explicit Persistent Connection Support for Discovery) is 0\&. Such a DC is disconnected between checks\&. \fIfc\-kickstart\-interval\-minutes\fR (default 0) re\-issues FC kickstart every N minutes; 0 = only at startup and on every FC controller drop\&. \fIdc\-giveup\-timeout\fR (default 72hours) is the give\-up horizon described above\&. It takes a systemd time span ("72hours", "3 days 5 hours") or a unit\-less value in seconds; "infinity" = never give up, 0 = give up on the first failure\&. .sp A DC connects with a keep\-alive timeout of 30 seconds, or with its configured \fIkeep\-alive\-tmo\fR (see nvme\-fabrics\&.conf(5))\&. A DC configured with \fIpersistent = no\fR connects with none\&. .sp \fIzeroconf\fR (boolean, default false) connects to and manages Discovery Controllers found through mDNS (TP8009)\&. It requires systemd\-resolved v258 or later with mDNS enabled (\fIMulticastDNS=yes\fR), and an nvme\-discoverd built with mDNS support\&. It is re\-read on SIGHUP\&. .sp The connections nvme\-discoverd manages come entirely from the shared fabrics configuration, not from this file: which Discovery Controllers and subsystems to connect, host identity, per\-connection parameters\&. See nvme\-fabrics\&.conf(5)\&. .SH "SIGNALS" .PP SIGHUP .RS 4 Reload both nvme\-discoverd\&.conf and the shared fabrics configuration\&. Newly desired connections are started; nothing already connected is ever disconnected by a reload\&. If the fabrics configuration fails to reload (e\&.g\&. a syntax error), the previous one is kept and the failure is logged\&. .RE .PP SIGTERM, SIGINT .RS 4 Shut down gracefully\&. .RE .SH "FILES" .PP /usr/local/etc/nvme/nvme\-discoverd\&.conf .RS 4 The daemon\(cqs own configuration; see CONFIGURATION\&. .RE .PP /usr/local/etc/nvme/nvme\-discoverd\&.conf\&.sample .RS 4 A commented example of nvme\-discoverd\&.conf with every knob at its default\&. It is not read; copy it to nvme\-discoverd\&.conf to change a setting\&. .RE .PP /usr/local/etc/nvme/nvme\-fabrics\&.conf, /usr/local/etc/nvme/nvme\-fabrics\&.conf\&.d/*\&.conf .RS 4 The connections nvme\-discoverd manages; see nvme\-fabrics\&.conf(5)\&. .RE .PP /run/nvme/discoverd/ .RS 4 Runtime state linking each connected controller to the systemd transient unit that owns it\&. Does not survive a reboot\&. .RE .SH "SEE ALSO" .sp nvme\-fabrics\&.conf(5) tlshd(8) nvme\-connect(1) nvme\-registry\-list(1) nvme\-exclusion\-add(1) .SH "NVME" .sp Part of the nvme\-user suite