LCTL-SET_PARAM(8)

πŸ“¦ version 2.17.58, in ubuntu stonking

✨ LCTL-SET_PARAM(8) ✨

okay bestie, sit down, hydrate, because we're talking about lctl set_param from the Lustre Configuration Utilities set πŸ’– this is the lil command that sets your Lustre tunables, and it's lowkey one of the most useful things in the whole toolkit.


🌸 NAME 🌸

lctl-set_param β€” the Lustre tunable parameter setting utility. that's it, that's the job, and it ate πŸ’…


πŸŽ€ SYNOPSIS πŸŽ€

lctl set_param [--client|-C[FSNAME]] [--delete|-d] [--file|-F] [--no-
               name|-n] [--module|-o] [--permanent|-P]
               [--threads|-t[THREAD_COUNT]] PARAMETER=VALUE ...
lctl set_param -F FILENAME

πŸ¦‹ DESCRIPTION πŸ¦‹

So the whole vibe is: you take a named Lustre or LNet PARAMETER and you set it to VALUE, either just on the local node or permanently on the MGS for the entire filesystem. main character energy either way πŸ‘‘

Parameter names are made of one or more components, and they're glued together with a . (a period, bestie, not a comma, not a slash β€” a period ✨). Every one of those components can be written out in plain text, OR you can use a wildcard in glob(7) format, and yeah the classic move is * to match every named instance of that parameter. When you wildcard it up, more than one parameter can match and get changed all at once, which is honestly a lifesaver when you're configuring a huge filesystem with a million device instances. no cap 🫢

Parameters are often (not always, don't come for me) shaped like OBD_NAME.OBD_INSTANCE.PARAMETER_NAME, where OBD_NAME is one of the OBD object types, like ldlm, llite, lmv, lov, mdc, osc, etc., and OBD_INSTANCE is the name of a Lustre device, like testfs-OST0000 β€” but it can also be a specific component, or contain wildcards to match some or all device instances ✨

🚨 security check bestie: parameters can only be modified by the root user. for security reasons. don't @ me.

πŸ’œ OPTIONS πŸ’œ

(the original says "the various options supported by lctl get_param" β€” yes, it says get_param, we're keeping it, it's iconic, moving on 😭)

  • -C, --client β€” instead of setting the parameter just once, write it into the /etc/lustre/mount.client.params config file on the local node. Then on all future Lustre client mounts on only that node, those parameters get set on the local node. If you specified FSNAME, they go instead to the filesystem-specific /etc/lustre/mount.FSNAME.params config file on the local node. Those filesystem-specific params are only set when that filesystem is mounted on that local node, and they override the more generic client mount parameters from the /etc/lustre/mount.client.params file, or permanent parameters coming from the MGS. so: local specificity wins, periodt πŸ’…
  • -d, --delete β€” removes the permanent setting. only works for filesystem-wide parameters set with -P on the MGS or with -C on the local node. bye bye permanent setting πŸ‘‹
  • -F, --file β€” set parameters from FILENAME instead of from the command line. The contents of FILENAME are YAML format, created from the output of running lctl llog_print FSNAME-client, or from any other valid llog configuration log as listed by lctl llog_catlist. obsessed with a good backup file πŸ“
  • -n, --no-name β€” disables printing of the parameter name after setting it. just the value, no name, minimal, chic ✨
  • -o, --module β€” lets module parameters be visible to the lctl set_param command. Those module parameters will be set on the local node at module load time 🧚
  • -P, --permanent β€” sets PARAMETER permanently in the MGS configuration log for all mountpoints using the MGS where the command is run β€” both now and in the future, no take-backs. To keep wildcard PARAMETER matching limited to specific filesystems or parameters, it's preferred that PARAMETER contains a suitably-specific expression for the OBD_NAME and OBD_INSTANCE, like the FSNAME and/or a specific target name. be specific, bestie, wildcards go feral otherwise 🌈
  • -t, --threads [THREAD_COUNT] β€” spawn threads to set multiple parameters in parallel, optionally specifying the max number of threads to run (and yes, with no space between -t and THREAD_COUNT). Without this option, the specified parameter(s) are set serially. If lctl was compiled without pthread support, a warning message gets printed and the parameters get set serially anyway (rude but fine). If -t is specified with no argument at all, it runs up to 8 threads by default πŸ”₯

⭐ BASH COMPLETION ⭐

This command supports bash-completion(1) for tab-completing parameter names available on the local node, assuming you have the right shell and package installed. Honestly this is a gift β€” it makes finding which parameters exist so much easier instead of running lctl-list_param(8) over and over and over 😭

Wanna see the long options (more descriptive, easier to understand)? type --TAB. Wanna see the short options? type -TAB. iykyk πŸŽ€


🌈 EXAMPLES 🌈

Set two parameters temporarily on the local node:

client# lctl set_param jobid_name=%H:%e:%u debug_mb=1024
jobid_name=%H:%e:%u
debug_mb=1024

Set two parameters, but don't print parameter names with the values:

client# lctl set_param -n jobid_name=%H:%e:%u debug_mb=1024
%H:%e:%u
1024

Run two parallel threads to set parameters that may do a lot of work:

client# lctl set_param -t2 ldlm.namespaces.*osc*.lru_size=clear
ldlm.namespaces.fsname-OST0001-osc-MDT0000.lru_size=clear
ldlm.namespaces.fsname-OST0000-osc-MDT0000.lru_size=clear

Permanently set a parameter with a wildcard in the MGS config llog:

mgs# lctl set_param -P osc.testfs-OST*.max_dirty_mb=512
osc.testfs-OST0000-osc-ffff8803c9c0f000.max_dirty_mb=512
osc.testfs-OST0001-osc-ffff8803c9c0f000.max_dirty_mb=512
osc.testfs-OST0002-osc-ffff8803c9c0f000.max_dirty_mb=512
osc.testfs-OST0003-osc-ffff8803c9c0f000.max_dirty_mb=512
osc.testfs-OST0004-osc-ffff8803c9c0f000.max_dirty_mb=512

Permanently set osc.testfs-*.max_dirty_mb=2000 when mounting testfs and osc.testfs-*.max_dirty_mb=1024 for other Lustre mountpoints on this client node:

client# lctl set_param -C=test_fs osc.testfs-*.max_dirty_mb=2000
client# lctl set_param -C osc.*.max_dirty_mb=1024

Backup the params configuration log, and then restore it (at some later time):

mgs# lctl llog_print params > /home/admin/params.yaml
[ params log is erased, not shown here ]
mgs# lctl set_param -F /home/admin/params.yaml

🫢 AVAILABILITY 🫢

lctl set_param is part of the lustre(7) filesystem package since release 1.7.0. she's been around, she's seasoned, she's a legend πŸ’–


πŸ‘‘ SEE ALSO πŸ‘‘

lustre(7), lctl(8), lctl-find_param(8), lctl-get_param(8), lctl-help_param(8), lctl-list_param(8), lctl-llog_catlist(8), lctl-llog_print(8)


and that's the whole page bestie!! this one comes to you from Lustre, dated 2026-03-06, and it's filed under the LCTL-SET_PARAM(8) manual page name πŸ’… go forth and set your params responsibly, mwah πŸŽ€βœ¨

πŸ“¦ where this page comes from