• Vlastimil Babka's avatar
    kernel/sysctl: support setting sysctl parameters from kernel command line · 3db978d4
    Vlastimil Babka authored
    Patch series "support setting sysctl parameters from kernel command line", v3.
    
    This series adds support for something that seems like many people
    always wanted but nobody added it yet, so here's the ability to set
    sysctl parameters via kernel command line options in the form of
    sysctl.vm.something=1
    
    The important part is Patch 1.  The second, not so important part is an
    attempt to clean up legacy one-off parameters that do the same thing as
    a sysctl.  I don't want to remove them completely for compatibility
    reasons, but with generic sysctl support the idea is to remove the
    one-off param handlers and treat the parameters as aliases for the
    sysctl variants.
    
    I have identified several parameters that mention sysctl counterparts in
    Documentation/admin-guide/kernel-parameters.txt but there might be more.
    The conversion also has varying level of success:
    
     - numa_zonelist_order is converted in Patch 2 together with adding the
       necessary infrastructure. It's easy as it doesn't really do anything
       but warn on deprecated value these days.
    
     - hung_task_panic is converted in Patch 3, but there's a downside that
       now it only accepts 0 and 1, while previously it was any integer
       value
    
     - nmi_watchdog maps to two sysctls nmi_watchdog and hardlockup_panic,
       so there's no straighforward conversion possible
    
     - traceoff_on_warning is a flag without value and it would be required
       to handle that somehow in the conversion infractructure, which seems
       pointless for a single flag
    
    This patch (of 5):
    
    A recently proposed patch to add vm_swappiness command line parameter in
    addition to existing sysctl [1] made me wonder why we don't have a
    general support for passing sysctl parameters via command line.
    
    Googling found only somebody else wondering the same [2], but I haven't
    found any prior discussion with reasons why not to do this.
    
    Settings the vm_swappiness issue aside (the underlying issue might be
    solved in a different way), quick search of kernel-parameters.txt shows
    there are already some that exist as both sysctl and kernel parameter -
    hung_task_panic, nmi_watchdog, numa_zonelist_order, traceoff_on_warning.
    
    A general mechanism would remove the need to add more of those one-offs
    and might be handy in situations where configuration by e.g.
    /etc/sysctl.d/ is impractical.
    
    Hence, this patch adds a new parse_args() pass that looks for parameters
    prefixed by 'sysctl.' and tries to interpret them as writes to the
    corresponding sys/ files using an temporary in-kernel procfs mount.
    This mechanism was suggested by Eric W.  Biederman [3], as it handles
    all dynamically registered sysctl tables, even though we don't handle
    modular sysctls.  Errors due to e.g.  invalid parameter name or value
    are reported in the kernel log.
    
    The processing is hooked right before the init process is loaded, as
    some handlers might be more complicated than simple setters and might
    need some subsystems to be initialized.  At the moment the init process
    can be started and eventually execute a process writing to /proc/sys/
    then it should be also fine to do that from the kernel.
    
    Sysctls registered later on module load time are not set by this
    mechanism - it's expected that in such scenarios, setting sysctl values
    from userspace is practical enough.
    
    [1] https://lore.kernel.org/r/BL0PR02MB560167492CA4094C91589930E9FC0@BL0PR02MB5601.namprd02.prod.outlook.com/
    [2] https://unix.stackexchange.com/questions/558802/how-to-set-sysctl-using-kernel-command-line-parameter
    [3] https://lore.kernel.org/r/87bloj2skm.fsf@x220.int.ebiederm.org/Signed-off-by: default avatarVlastimil Babka <vbabka@suse.cz>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Reviewed-by: default avatarLuis Chamberlain <mcgrof@kernel.org>
    Reviewed-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
    Acked-by: default avatarKees Cook <keescook@chromium.org>
    Acked-by: default avatarMichal Hocko <mhocko@suse.com>
    Cc: Iurii Zaikin <yzaikin@google.com>
    Cc: Ivan Teterevkov <ivan.teterevkov@nutanix.com>
    Cc: Michal Hocko <mhocko@kernel.org>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: "Eric W . Biederman" <ebiederm@xmission.com>
    Cc: "Guilherme G . Piccoli" <gpiccoli@canonical.com>
    Cc: Alexey Dobriyan <adobriyan@gmail.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Christian Brauner <christian.brauner@ubuntu.com>
    Link: http://lkml.kernel.org/r/20200427180433.7029-1-vbabka@suse.cz
    Link: http://lkml.kernel.org/r/20200427180433.7029-2-vbabka@suse.czSigned-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    3db978d4
proc_sysctl.c 44 KB