NVME-ZNS-ZONE-APP(1)

πŸ’… NVME-ZNS-ZONE-APP(1) πŸ’…

okay so this is the nvme-zns-zone-append page from the NVMe Manual β€” yes, that NVMe Manual, the one we actually read β€” and bestie, it's literally just about yeeting data into a ZNS zone and finding out where it landed. sit down, hydrate, let's go 🫢


✨ NAME ✨

nvme-zns-zone-append β€” send an NVMe write command, and get results back. that's the whole vibe. πŸŽ€


🌸 SYNOPSIS 🌸

nvme [<global-options>] zns zone-append <device>
                        [--namespace-id=<NUM> | -n <NUM>]
                                [--zslba=<IONUM> | -s <IONUM>]
                                [--data-size=<IONUM> | -z <IONUM>]
                                [--metadata-size=<IONUM> | -y <IONUM>]
                                [--data=<FILE> | -d <FILE>]
                                [--metadata=<FILE> | -M <FILE>]
                                [--limited-retry | -l]
                                [--force-unit-access | -f]
                                [--ref-tag=<NUM> | -r <NUM>]
                                [--app-tag-mask=<NUM> | -m <NUM>]
                                [--app-tag=<NUM> | -a <NUM>]
                                [--prinfo=<NUM> | -p <NUM>]

no cap, that's a lot of brackets. but every single one is listed down below so you don't have to guess πŸ’€


πŸ¦‹ DESCRIPTION πŸ¦‹

so the zone append command writes the logical blocks specified by the command to the medium, pulling from the data buffer you give it. it's literally that. πŸ”₯

if you don't pass a file? it will use stdin by default. no file, no problem, just pipe it in πŸ’–

on success, the program will report the LBA that was assigned to the data for the append operation β€” which is kind of the main character moment of this whole command, ngl. πŸ‘‘


πŸ’… OPTIONS πŸ’…

  • -n <NUM>, --namespace-id=<NUM> β€” use this namespace id for the command. if you don't provide one, the namespace id of the block device gets used instead. but if you're issuing the command to a non-block device, the parameter is required (so like, don't skip it, bestie). also: the broadcast value 0xffffffff can be given as either all or -1. ✨
  • -s <IONUM>, --zslba=<IONUM>, -z <IONUM>, --data-size=<IONUM> β€” size of data, in bytes. yes, all four of those spellings, exactly like that, i don't make the rules πŸŽ€
  • -y <IONUM>, --metadata-size=<IONUM> β€” size of metadata, in bytes. 🌸
  • -d <FILE>, --data=<FILE> β€” the data file providing the data to write. if none provided, contents are sent from STDIN. slay. πŸ’œ
  • -M <FILE>, --metadata=<FILE> β€” metadata file, if necessary. πŸ¦‹
  • -l, --limited-retry β€” sets the limited retry flag. ⭐
  • -f, --force-unit-access β€” sets the force-unit access flag. πŸ’ͺ
  • -r <NUM>, --ref-tag=<NUM> β€” optional reftag when used with protection information. πŸŽ€
  • -m <NUM>, --app-tag-mask=<NUM> β€” optional application tag mask when used with protection information. 🌈
  • -a <NUM>, --app-tag=<NUM> β€” optional application tag when used with protection information. πŸ“
  • -p <NUM>, --prinfo=<NUM> β€” Protection Information field definition. 🧚

πŸ‘‘ GLOBAL OPTIONS πŸ‘‘

these are defined at the top-level nvme command, which means they're available to this subcommand too. yes, they're the group-chat lurkers who are technically in every conversation 😭

  • --dry-run β€” print the command that would be executed, but do not actually execute it. all the flirting, none of the commitment πŸ™ˆ
  • --no-ioctl-probing β€” disable probing for 64-bit IOCTL support. πŸ’…
  • --no-retries β€” disable retry logic on transient errors. one shot, no second chances πŸ’€
  • -o <fmt>, --output-format=<fmt> β€” set the reporting format to normal, tabular, 'json, or binary. only one output format may be used at a time. (that stray quote before json is in the original, i'm just the messenger 🫢)
  • --output-format-version=<version> β€” select the output format version. version 1 uses the original field naming, while version 2 (the default) provides more consistent and script-friendly field names. other versions are rejected β€” so don't try it πŸ”₯
  • --quiet β€” suppress informational messages. errors are still reported, and --quiet cancels any --verbose for the library log level. 🀫
  • --set-options=<key=value>[,<key=value>...] β€” set libnvme library options for this invocation. supported keys are force-4k, mi-probe-enabled, test-base-dir and test-sysfs-dir. βš™οΈ
  • --timeout=<ms> β€” set the timeout for the command in milliseconds. infinite or -1 waits without a time limit (0xffffffff). the way patience is a virtue 😌
  • -v, --verbose β€” increase the level of detail in the output. may be specified multiple times to further increase verbosity. go off, stack them ⭐
heads up bestie: these options can also be set as machine-wide defaults in nvme-cli.conf(5). a command-line flag always overrides the file β€” CLI stays winning πŸ‘‘

πŸŽ€ EXAMPLES πŸŽ€

  • append the data "hello world" into 4k worth of blocks into the zone starting at block 0 for namespace 1:
# echo "hello world" | nvme zns zone-append /dev/nvme0 -n 1 -s 0 -z 4k

see? pipe it, point it, zone it, done. iconic. πŸ’–


🌈 NVME 🌈

part of the nvme-user suite. πŸ’œ


okay that's the whole page, you ate that fr fr 🫢 so anyway β€” this little masterpiece lives in the NVMe manual, sourced from NVMe, dated 10/30/2026, filed under NVME-ZNS-ZONE-APP(1). go append something beautiful, bestie πŸ’…βœ¨

πŸ“¦ where this page comes from