2023-03-09 17:30:40 +00:00
#!/usr/bin/env bash
#
# SPDX-License-Identifier: GPL-2.0
#
# Copyright (c) 2013-2023 Igor Pecovnik, igor@armbian.com
#
# This file is a part of the Armbian Build Framework
# https://github.com/armbian/build/
2023-02-02 03:18:17 +00:00
# Forced .config options for all Armbian kernels.
2025-10-25 18:30:36 +00:00
# IMPORTANT:
# armbian_kernel_config hooks are called twice: once for obtaining the version via hashing,
# and once for actually modifying the kernel .config. They *must* be consistent, and can't depend on
# the contents of the .config (which is not available during version calculation).
2025-10-26 09:03:10 +00:00
#
# To facilitate this, use the arrays opts_n/opts_y/opts_m and/or the opts_val dictionary.
# those will be hashed and applied at the correct moments automatically.
#
# Be consistent -- both the versioning/hashing mechanism and the fast-rebuild principles depend on it.
#
# A word on modules or built-in: try use modules if possible. Certain things should be built-in,
# specially if they're needed before the initramfs is available.
#
2025-10-25 18:30:36 +00:00
# The exact same also applies to custom_kernel_config hooks.
2024-03-27 14:46:45 +00:00
# Please note: Manually changing options doesn't check the validity of the .config file. This is done at next make time. Check for warnings in build log.
2023-02-02 03:18:17 +00:00
2025-03-31 15:55:34 +00:00
# Enables additional wireless configuration options for Wi-Fi drivers on kernels 6.13 and later.
2025-10-26 12:31:49 +00:00
# ensures that settings for wireless drivers (e.g. cfg80211 and mac80211) are properly enabled
2025-03-31 15:55:34 +00:00
# to avoid build errors due to recent kernel updates.
2025-01-20 20:31:16 +00:00
function armbian_kernel_config__extrawifi_enable_wifi_opts_80211( ) {
if linux-version compare " ${ KERNEL_MAJOR_MINOR } " ge 6.13; then
2025-10-26 08:25:12 +00:00
# Required by many wifi drivers; otherwise "error: 'struct net_device' has no member named 'ieee80211_ptr'"
2025-10-26 12:31:49 +00:00
# In 6.13 something changed ref MAC80211 and CFG80211; enable both to preserve wireless drivers
opts_m += ( "CFG80211" )
opts_m += ( "MAC80211" )
opts_y += ( "MAC80211_MESH" )
opts_y += ( "CFG80211_WEXT" )
2025-01-20 20:31:16 +00:00
fi
}
2025-03-31 15:55:34 +00:00
# Enables the NETKIT kernel configuration option for kernels version 6.7 and above.
2025-03-31 15:49:32 +00:00
function armbian_kernel_config__netkit( ) {
if linux-version compare " ${ KERNEL_MAJOR_MINOR } " ge 6.7; then
2025-10-26 08:25:12 +00:00
opts_y += ( "NETKIT" )
2025-03-31 15:49:32 +00:00
fi
}
2025-03-31 15:55:34 +00:00
# Disables various kernel configuration options that conflict with Armbian's kernel build requirements.
2025-10-26 12:31:49 +00:00
# This function disables several kernel configuration options such as
# module signing and automatic versioning to speed up the build
# process and ensure compatibility with Armbian requirements.
# Additionally, it forces EXPERT mode (EXPERT=y) to ensure otherwise
# hidden configurations are visible.
2024-03-27 14:46:45 +00:00
function armbian_kernel_config__disable_various_options( ) {
2025-10-26 12:31:49 +00:00
display_alert "Enable EXPERT=y" "armbian-kernel" "debug"
2025-10-26 08:25:12 +00:00
opts_y += ( "EXPERT" ) # Too many config options are hidden behind EXPERT=y, lets have it always on
2024-01-01 14:09:30 +00:00
2025-10-26 08:25:12 +00:00
display_alert "Disabling module signing / debug / auto version" "armbian-kernel" "debug"
2025-10-26 12:31:49 +00:00
opts_n += ( "SECURITY_LOCKDOWN_LSM" )
opts_n += ( "MODULE_SIG" ) # No use signing modules
opts_n += ( "MODULE_SIG_ALL" ) # No use auto-signing modules
opts_n += ( "MODULE_SIG_FORCE" ) # No forcing of module sign verification
opts_n += ( "IMA_APPRAISE_MODSIG" ) # No appraisal module-style either
2023-02-03 14:36:28 +00:00
2025-10-26 08:25:12 +00:00
# DONE: Disable: version shenanigans
2025-10-26 12:31:49 +00:00
opts_n += ( "LOCALVERSION_AUTO" ) # This causes a mismatch between what Armbian wants and what make produces.
opts_val[ "LOCALVERSION" ] = '""' # Must be empty; make is later invoked with LOCALVERSION and it adds up
2023-02-02 03:18:17 +00:00
}
2025-01-07 23:46:45 +00:00
function armbian_kernel_config__force_pa_va_48_bits_on_arm64( ) {
2024-12-30 18:01:23 +00:00
if [ [ " ${ ARCH } " = = "arm64" ] ] ; then
2025-10-26 12:31:49 +00:00
opts_y += ( "ARM64_VA_BITS_48" )
opts_val[ "ARM64_PA_BITS" ] = "48"
2024-12-30 18:01:23 +00:00
fi
2025-01-07 23:46:45 +00:00
}
2024-12-30 18:01:23 +00:00
2025-03-27 10:14:05 +00:00
# Configures kernel options to enable or disable eBPF and BTF debug information.
#
# This function adjusts kernel configuration settings based on the value of the global
# variable KERNEL_BTF and the amount of available system memory. When KERNEL_BTF is set
# to "no", the function disables all debug and BTF options (while leaving eBPF options unchanged).
# Otherwise, it checks if the system has at least 6451 MiB of available RAM. If memory is
# insufficient and KERNEL_BTF is not explicitly set to "yes", the function exits with an error.
# When sufficient memory is available or KERNEL_BTF is forced to "yes", it enables eBPF and BTF
# support, including a set of related debug options.
#
# Globals:
# KERNEL_BTF - Determines whether BTF debug information should be enabled ("yes" to enable,
# "no" to disable).
# /proc/meminfo - Used to calculate available system memory in MiB.
#
# Outputs:
# Alerts are displayed via the display_alert function to indicate configuration changes.
# The function may exit with an error message if the available memory is insufficient.
#
# Returns:
# 0 on successful configuration application.
2025-01-07 23:46:45 +00:00
function armbian_kernel_config__600_enable_ebpf_and_btf_info( ) {
if [ [ " ${ KERNEL_BTF } " = = "no" ] ] ; then # If user is explicit by passing "KERNEL_BTF=no", then actually disable all debug info.
display_alert "Disabling eBPF and BTF info for kernel" "as requested by KERNEL_BTF=no" "info"
2025-10-26 12:31:49 +00:00
opts_y += ( "DEBUG_INFO_NONE" ) # Enable the "none" option
opts_n += ( "DEBUG_INFO" "DEBUG_INFO_DWARF5" "DEBUG_INFO_BTF" "DEBUG_INFO_BTF_MODULES" ) # BTF & CO-RE == off
2025-01-07 23:46:45 +00:00
# We don't disable the eBPF options, as eBPF itself doesn't require BTF (debug info) and doesnt' consume as much memory during build as BTF debug info does.
else
declare -i available_physical_memory_mib
available_physical_memory_mib = $(( $( awk '/MemAvailable/ {print $2}' /proc/meminfo) / 1024 )) # MiB
display_alert "Considering available RAM for BTF build" " ${ available_physical_memory_mib } MiB " "info"
if [ [ ${ available_physical_memory_mib } -lt 6451 ] ] ; then # If less than 6451 MiB of RAM is available, then exit with an error, telling the user to avoid pain and set KERNEL_BTF=no ...
if [ [ " ${ KERNEL_BTF } " = = "yes" ] ] ; then # ... except if the user knows better, and has set KERNEL_BTF=yes, then we'll just warn.
display_alert " Not enough RAM available ( ${ available_physical_memory_mib } Mib) for BTF build " "but KERNEL_BTF=yes is set; enabling BTF" "warn"
else
exit_with_error " Not enough RAM available ( ${ available_physical_memory_mib } Mib) for BTF build. Please set 'KERNEL_BTF=no' to avoid running out of memory during the kernel LD/BTF build step; or ignore this check by setting 'KERNEL_BTF=yes' -- that might put a lot of load on your swap disk, if any. "
fi
fi
2024-12-30 17:50:05 +00:00
2025-01-07 23:46:45 +00:00
display_alert "Enabling eBPF and BTF info" "for fully BTF & CO-RE enabled kernel" "info"
2025-10-26 12:31:49 +00:00
opts_n += ( "DEBUG_INFO_NONE" ) # Make sure the "none" option is disabled
2025-01-07 23:46:45 +00:00
opts_y += (
2025-10-26 12:31:49 +00:00
"BPF_JIT" "BPF_JIT_DEFAULT_ON" "FTRACE_SYSCALLS" "PROBE_EVENTS_BTF_ARGS" "BPF_KPROBE_OVERRIDE" # eBPF == on
"DEBUG_INFO" "DEBUG_INFO_DWARF5" "DEBUG_INFO_BTF" "DEBUG_INFO_BTF_MODULES" # BTF & CO-RE == off
2025-01-07 23:46:45 +00:00
)
2024-12-30 17:50:05 +00:00
fi
}
2025-03-27 10:14:05 +00:00
# Enables ZRAM support by configuring the kernel for compressed memory swap.
# - Enables compressed swap space (ZSWAP).
# - Sets the default compression pool for ZSWAP to ZBUD.
# - Activates the compressed memory allocator (ZSMALLOC).
# - Enables in-memory compression for swap or temporary storage (ZRAM).
# - Allows write-back of compressed ZRAM data (ZRAM_WRITEBACK).
# - Enables memory usage tracking for ZRAM (ZRAM_MEMORY_TRACKING).
2025-10-16 06:40:23 +00:00
# - Enables various ZRAM compression backend algorithms (LZ4, LZ4HC, ZSTD, DEFLATE, 842, LZO).
2025-03-26 20:04:58 +00:00
function armbian_kernel_config__enable_zram_support( ) {
2025-10-26 08:25:12 +00:00
opts_y += ( "ZSWAP" ) # Enables compressed swap space in memory
opts_y += ( "ZSWAP_ZPOOL_DEFAULT_ZBUD" ) # Sets default compression pool for ZSWAP to ZBUD
opts_m += ( "ZSMALLOC" ) # Enables compressed memory allocator for better memory usage
opts_m += ( "ZRAM" ) # Enables in-memory block device compression for swap or temporary storage
opts_y += ( "ZRAM_WRITEBACK" ) # Allows write-back of compressed ZRAM data to storage
opts_y += ( "ZRAM_MEMORY_TRACKING" ) # Enables tracking of memory usage in ZRAM
opts_y += ( "ZRAM_BACKEND_LZ4" )
opts_y += ( "ZRAM_BACKEND_LZ4HC" )
opts_y += ( "ZRAM_BACKEND_ZSTD" )
opts_y += ( "ZRAM_BACKEND_DEFLATE" )
opts_y += ( "ZRAM_BACKEND_842" )
opts_y += ( "ZRAM_BACKEND_LZO" )
2025-03-26 20:04:58 +00:00
}
2025-10-26 12:31:49 +00:00
# Enables almost all IPTABLES/NFTABLES options as modules.
2025-09-22 00:51:09 +00:00
function armbian_kernel_config__select_nftables( ) {
2025-10-26 08:25:12 +00:00
opts_m += ( "BRIDGE_NETFILTER" ) # Enables netfilter support for the bridge
opts_m += ( "IP6_NF_FILTER" ) # Enables IPv6 netfilter filtering support
opts_m += ( "IP6_NF_IPTABLES" ) # IP6 tables support (required for filtering)
opts_m += ( "IP6_NF_MANGLE" ) # Enables IPv6 netfilter mangling support
opts_m += ( "IP6_NF_MATCH_AH" ) # "ah" match support
opts_m += ( "IP6_NF_MATCH_EUI64" ) # "eui64" address check
opts_m += ( "IP6_NF_MATCH_FRAG" ) # "frag" Fragmentation header match support
opts_m += ( "IP6_NF_MATCH_HL" ) # "hl" hoplimit match support
opts_m += ( "IP6_NF_MATCH_IPV6HEADER" ) # "ipv6header" IPv6 Extension Headers Match
opts_m += ( "IP6_NF_MATCH_MH" ) # "mh" match support
opts_m += ( "IP6_NF_MATCH_OPTS" ) # "hbh" hop-by-hop and "dst" opts header match support
opts_m += ( "IP6_NF_MATCH_RPFILTER" ) # "rpfilter" reverse path filter match support
opts_m += ( "IP6_NF_MATCH_RT" ) # "rt" Routing header match support
opts_m += ( "IP6_NF_MATCH_SRH" ) # "srh" Segment Routing header match support
opts_m += ( "IP6_NF_NAT" ) # Enables IPv6 network address translation support
opts_m += ( "IP6_NF_RAW" ) # Enables raw support for IPv6 netfilter
opts_m += ( "IP6_NF_SECURITY" ) # Enables IPv6 netfilter security features
opts_m += ( "IP6_NF_TARGET_HL" ) # "HL" hoplimit target support
opts_m += ( "IP6_NF_TARGET_MASQUERADE" ) # Enables IPv6 netfilter target for masquerading (NAT)
opts_m += ( "IP6_NF_TARGET_NPT" ) # NPT (Network Prefix translation) target support
opts_m += ( "IP6_NF_TARGET_REJECT" ) # REJECT target support
opts_m += ( "IP6_NF_TARGET_SYNPROXY" ) # SYNPROXY target support
opts_m += ( "IP_NF_IPTABLES" ) # Enables iptables for IPv4
opts_m += ( "IP_NF_FILTER" ) # filter table
opts_m += ( "IP_NF_MANGLE" ) # mangle table
opts_m += ( "IP_NF_TARGET_MASQUERADE" ) # Enables IPv4 netfilter target for masquerading (NAT)
opts_m += ( "IP_NF_TARGET_NETMAP" ) # Enables IPv4 netfilter target for netmap
opts_m += ( "IP_NF_TARGET_REDIRECT" ) # Enables IPv4 netfilter target for redirect
opts_m += ( "IP_NF_NAT" ) # Enables NAT (Network Address Translation) support for IPv4
opts_m += ( "IP_NF_RAW" ) # Enables raw support for IPv4 netfilter
opts_m += ( "IP_NF_SECURITY" ) # Enables security features for IPv4 netfilter
opts_m += ( "NET_ACT_IPT" )
opts_m += ( "NET_EMATCH_IPT" ) # IPtables Matches
opts_y += ( "NETFILTER_BPF_LINK" ) # BPF link support for netfilter hooks
opts_m += ( "NETFILTER_CONNCOUNT" )
opts_y += ( "NETFILTER_EGRESS" ) # Netfilter egress support
opts_y += ( "NETFILTER_FAMILY_ARP" )
opts_y += ( "NETFILTER_FAMILY_BRIDGE" )
opts_y += ( "NETFILTER_INGRESS" ) # Netfilter ingress support
opts_m += ( "NETFILTER_NETLINK_ACCT" ) # Netfilter NFACCT over NFNETLINK interface
opts_y += ( "NETFILTER_NETLINK_GLUE_CT" )
opts_m += ( "NETFILTER_NETLINK_HOOK" ) # Netfilter base hook dump support
opts_m += ( "NETFILTER_NETLINK_LOG" ) # Netfilter LOG over NFNETLINK interface
opts_m += ( "NETFILTER_NETLINK" )
opts_m += ( "NETFILTER_NETLINK_OSF" ) # Netfilter OSF over NFNETLINK interface
opts_m += ( "NETFILTER_NETLINK_QUEUE" ) # Netfilter NFQUEUE over NFNETLINK interface
opts_m += ( "NETFILTER_SYNPROXY" )
opts_y += ( "NETFILTER_XTABLES_COMPAT" ) # Netfilter Xtables 32bit support
opts_m += ( "NETFILTER_XTABLES" ) # Enables x_tables support in netfilter
opts_m += ( "NETFILTER_XT_CONNMARK" ) # ctmark target and match support
opts_m += ( "NETFILTER_XT_MARK" ) # Enables mark matching for netfilter
opts_m += ( "NETFILTER_XT_MATCH_ADDRTYPE" ) # Enables address type matching for netfilter
opts_m += ( "NETFILTER_XT_MATCH_BPF" ) # Enables BPF match support in netfilter
opts_m += ( "NETFILTER_XT_MATCH_CGROUP" ) # "control group" match support
opts_m += ( "NETFILTER_XT_MATCH_CLUSTER" ) # "cluster" match support
opts_m += ( "NETFILTER_XT_MATCH_COMMENT" ) # "comment" match support
opts_m += ( "NETFILTER_XT_MATCH_CONNBYTES" ) # "connbytes" per-connection counter match support
opts_m += ( "NETFILTER_XT_MATCH_CONNLABEL" ) # "connlabel" match support
opts_m += ( "NETFILTER_XT_MATCH_CONNLIMIT" ) # "connlimit" match support
opts_m += ( "NETFILTER_XT_MATCH_CONNMARK" ) # "connmark" connection mark match support
opts_m += ( "NETFILTER_XT_MATCH_CONNTRACK" ) # Enables connection tracking match support in netfilter
opts_m += ( "NETFILTER_XT_MATCH_CPU" ) # "cpu" match support
opts_m += ( "NETFILTER_XT_MATCH_DCCP" ) # "dccp" protocol match support
opts_m += ( "NETFILTER_XT_MATCH_DEVGROUP" ) # "devgroup" match support
opts_m += ( "NETFILTER_XT_MATCH_DSCP" ) # "dscp" and "tos" match support
opts_m += ( "NETFILTER_XT_MATCH_ECN" ) # "ecn" match support
opts_m += ( "NETFILTER_XT_MATCH_ESP" ) # "esp" match support
opts_m += ( "NETFILTER_XT_MATCH_HASHLIMIT" ) # "hashlimit" match support
opts_m += ( "NETFILTER_XT_MATCH_HELPER" ) # "helper" match support
opts_m += ( "NETFILTER_XT_MATCH_HL" ) # "hl" hoplimit/TTL match support
opts_m += ( "NETFILTER_XT_MATCH_IPCOMP" ) # "ipcomp" match support
opts_m += ( "NETFILTER_XT_MATCH_IPRANGE" ) # "iprange" address range match support
opts_m += ( "NETFILTER_XT_MATCH_IPVS" ) # Enables IPVS match support in netfilter
opts_m += ( "NETFILTER_XT_MATCH_L2TP" ) # "l2tp" match support
opts_m += ( "NETFILTER_XT_MATCH_LENGTH" ) # "length" match support
opts_m += ( "NETFILTER_XT_MATCH_LIMIT" ) # "limit" match support
opts_m += ( "NETFILTER_XT_MATCH_MAC" ) # "mac" address match support
opts_m += ( "NETFILTER_XT_MATCH_MARK" ) # "mark" match support
opts_m += ( "NETFILTER_XT_MATCH_MULTIPORT" ) # "multiport" Multiple port match support
opts_m += ( "NETFILTER_XT_MATCH_NFACCT" ) # "nfacct" match support
opts_m += ( "NETFILTER_XT_MATCH_OSF" ) # "osf" Passive OS fingerprint match
opts_m += ( "NETFILTER_XT_MATCH_OWNER" ) # "owner" match support
opts_m += ( "NETFILTER_XT_MATCH_PHYSDEV" ) # "physdev" match support
opts_m += ( "NETFILTER_XT_MATCH_PKTTYPE" ) # "pkttype" packet type match support
opts_m += ( "NETFILTER_XT_MATCH_POLICY" ) # IPsec "policy" match support
opts_m += ( "NETFILTER_XT_MATCH_QUOTA" ) # "quota" match support
opts_m += ( "NETFILTER_XT_MATCH_RATEEST" ) # "rateest" match support
opts_m += ( "NETFILTER_XT_MATCH_REALM" ) # "realm" match support
opts_m += ( "NETFILTER_XT_MATCH_RECENT" ) # "recent" match support
opts_m += ( "NETFILTER_XT_MATCH_SCTP" ) # "sctp" protocol match support
opts_m += ( "NETFILTER_XT_MATCH_SOCKET" ) # "socket" match support
opts_m += ( "NETFILTER_XT_MATCH_STATE" ) # "state" match support
opts_m += ( "NETFILTER_XT_MATCH_STATISTIC" ) # "statistic" match support
opts_m += ( "NETFILTER_XT_MATCH_STRING" ) # "string" match support
opts_m += ( "NETFILTER_XT_MATCH_TCPMSS" ) # "tcpmss" match support
opts_m += ( "NETFILTER_XT_MATCH_TIME" ) # "time" match support
opts_m += ( "NETFILTER_XT_MATCH_U32" ) # "u32" match support
opts_m += ( "NETFILTER_XT_NAT" ) # "SNAT and DNAT" targets support
opts_m += ( "NETFILTER_XT_SET" ) # set target and match support
opts_m += ( "NETFILTER_XT_TARGET_AUDIT" ) # AUDIT target support
opts_m += ( "NETFILTER_XT_TARGET_CHECKSUM" ) # CHECKSUM target support
opts_m += ( "NETFILTER_XT_TARGET_CLASSIFY" ) # "CLASSIFY" target support
opts_m += ( "NETFILTER_XT_TARGET_CONNMARK" ) # "CONNMARK" target support
opts_m += ( "NETFILTER_XT_TARGET_CONNSECMARK" ) # "CONNSECMARK" target support
opts_m += ( "NETFILTER_XT_TARGET_CT" ) # "CT" target support
opts_m += ( "NETFILTER_XT_TARGET_DSCP" ) # "DSCP" and "TOS" target support
opts_m += ( "NETFILTER_XT_TARGET_FLOWOFFLOAD" )
opts_m += ( "NETFILTER_XT_TARGET_HL" ) # "HL" hoplimit target support
opts_m += ( "NETFILTER_XT_TARGET_HMARK" ) # "HMARK" target support
opts_m += ( "NETFILTER_XT_TARGET_IDLETIMER" ) # IDLETIMER target support
opts_m += ( "NETFILTER_XT_TARGET_LED" ) # "LED" target support
opts_m += ( "NETFILTER_XT_TARGET_LOG" ) # LOG target support
opts_m += ( "NETFILTER_XT_TARGET_MARK" ) # "MARK" target support
opts_m += ( "NETFILTER_XT_TARGET_MASQUERADE" ) # Enables masquerade target for netfilter
opts_m += ( "NETFILTER_XT_TARGET_NETMAP" ) # "NETMAP" target support
opts_m += ( "NETFILTER_XT_TARGET_NFLOG" ) # "NFLOG" target support
opts_m += ( "NETFILTER_XT_TARGET_NFQUEUE" ) # "NFQUEUE" target Support
opts_m += ( "NETFILTER_XT_TARGET_NOTRACK" ) # "NOTRACK" target support (DEPRECATED)
opts_m += ( "NETFILTER_XT_TARGET_RATEEST" ) # "RATEEST" target support
opts_m += ( "NETFILTER_XT_TARGET_REDIRECT" ) # REDIRECT target support
opts_m += ( "NETFILTER_XT_TARGET_SECMARK" ) # "SECMARK" target support
opts_m += ( "NETFILTER_XT_TARGET_TCPMSS" ) # "TCPMSS" target support
opts_m += ( "NETFILTER_XT_TARGET_TCPOPTSTRIP" ) # "TCPOPTSTRIP" target support
opts_m += ( "NETFILTER_XT_TARGET_TEE" ) # "TEE" - packet cloning to alternate destination
opts_m += ( "NETFILTER_XT_TARGET_TPROXY" ) # "TPROXY" target transparent proxying support
opts_m += ( "NETFILTER_XT_TARGET_TRACE" ) # "TRACE" target support
opts_y += ( "NETFILTER" ) # Enables support for netfilter framework
opts_y += ( "NETFILTER_ADVANCED" ) # Enables advanced netfilter options
opts_m += ( "NET_IP_TUNNEL" )
opts_y += ( "NF_TABLES_ARP" ) # ARP nf_tables support
opts_m += ( "NF_TABLES_BRIDGE" )
opts_y += ( "NF_TABLES_INET" ) # Enables IPv4 and IPv6 support for nf_tables
opts_y += ( "NF_TABLES_IPV4" )
opts_y += ( "NF_TABLES_IPV6" )
opts_m += ( "NF_TABLES" ) # Enables nf_tables framework support
opts_y += ( "NF_TABLES_NETDEV" ) # Enables netdevice support for nf_tables
opts_m += ( "NF_CONNTRACK" ) # Enables connection tracking support
opts_m += ( "NF_CONNTRACK_FTP" ) # Enables FTP connection tracking support
opts_m += ( "NF_CONNTRACK_IRC" ) # Enables IRC connection tracking support
opts_y += ( "NF_CONNTRACK_MARK" ) # Enables connection mark support in netfilter
opts_m += ( "NF_CONNTRACK_PPTP" ) # Enables PPTP connection tracking support
opts_m += ( "NF_CONNTRACK_TFTP" ) # Enables TFTP connection tracking support
opts_y += ( "NF_CONNTRACK_ZONES" ) # Enables connection tracking zones support
opts_y += ( "NF_CONNTRACK_EVENTS" ) # Enables connection tracking events support
opts_y += ( "NF_CONNTRACK_LABELS" ) # Enables connection tracking labels support
opts_m += ( "NF_NAT" ) # Enables NAT support in nf_conntrack
opts_m += ( "NF_NAT_MASQUERADE_IPV4" ) # Enables IPv4 masquerading for NAT in nf_conntrack
opts_m += ( "NF_NAT_IPV4" ) # Enables IPv4 NAT support in nf_conntrack
opts_m += ( "NF_NAT_FTP" ) # Enables FTP NAT support in nf_conntrack
opts_m += ( "NF_NAT_TFTP" ) # Enables TFTP NAT support in nf_conntrack
opts_m += ( "NFT_BRIDGE_META" ) # Netfilter nf_table bridge meta support
opts_m += ( "NFT_BRIDGE_REJECT" ) # Netfilter nf_tables bridge reject support
opts_m += ( "NFT_COMPAT_ARP" )
opts_m += ( "NFT_COMPAT" ) # Enables compatibility support for older nftables versions
opts_m += ( "NFT_CONNLIMIT" ) # Netfilter nf_tables connlimit module
opts_m += ( "NFT_COUNTER" )
opts_m += ( "NFT_CT" ) # Netfilter nf_tables conntrack module
opts_m += ( "NFT_DUP_IPV4" ) # IPv4 nf_tables packet duplication support
opts_m += ( "NFT_DUP_IPV6" ) # IPv6 nf_tables packet duplication support
opts_m += ( "NFT_DUP_NETDEV" ) # Enables duplicate netdev (network device) support in nftables
opts_m += ( "NFT_FIB_INET" )
opts_m += ( "NFT_FIB_IPV4" ) # nf_tables fib / ip route lookup support
opts_m += ( "NFT_FIB_IPV6" ) # nf_tables fib / ipv6 route lookup support
opts_m += ( "NFT_FIB" )
opts_m += ( "NFT_FIB_NETDEV" ) # Netfilter nf_tables netdev fib lookups support
opts_m += ( "NFT_FLOW_OFFLOAD" ) # Netfilter nf_tables hardware flow offload module
opts_m += ( "NFT_FWD_NETDEV" ) # Enables forward netdev support in nftables
opts_m += ( "NFT_HASH" ) # Enables hash-based set operations support in nftables
opts_m += ( "NFT_LIMIT" ) # Netfilter nf_tables limit module
opts_m += ( "NFT_LOG" ) # Netfilter nf_tables log module
opts_m += ( "NFT_MASQ" )
opts_m += ( "NFT_NAT" ) # Enables NAT (Network Address Translation) support in nftables
opts_m += ( "NFT_NUMGEN" ) # Netfilter nf_tables number generator module
opts_m += ( "NFT_OBJREF" )
opts_m += ( "NFT_OSF" )
opts_m += ( "NFT_QUEUE" ) # Netfilter nf_tables queue module
opts_m += ( "NFT_QUOTA" ) # Enables quota support in nftables
opts_m += ( "NFT_REDIR" )
opts_m += ( "NFT_REJECT_INET" )
opts_m += ( "NFT_REJECT_IPV4" )
opts_m += ( "NFT_REJECT_IPV6" )
opts_m += ( "NFT_REJECT" ) # Enables reject target support in nftables
opts_m += ( "NFT_REJECT_NETDEV" ) # Enables reject netdev support in nftables
opts_m += ( "NFT_SOCKET" ) # Enables socket operations support in nftables
opts_m += ( "NFT_SYNPROXY" ) # Enables SYN proxy support in nftables
opts_m += ( "NFT_TPROXY" ) # Enables transparent proxy support in nftables
opts_m += ( "NFT_TUNNEL" ) # Enables tunneling support in nftables
opts_m += ( "NFT_XFRM" ) # Enables transformation support in nftables
opts_m += ( "IP_SET" ) # IP Set core
opts_m += ( "IP_SET_HASH_IP" )
opts_m += ( "IP_SET_HASH_NET" )
opts_m += ( "IP_SET_HASH_IPPORT" )
opts_m += ( "IP_SET_HASH_NETPORT" )
opts_m += ( "IP_SET_HASH_IPPORTNET" )
opts_m += ( "IP_SET_BITMAP_IP" )
opts_m += ( "IP_SET_BITMAP_PORT" )
2025-09-22 00:51:09 +00:00
}
2025-03-27 10:14:05 +00:00
# Enables Docker support by configuring a comprehensive set of kernel options required for Docker functionality.
2025-10-26 12:31:49 +00:00
# sets a wide range of kernel configuration options necessary for Docker, including support for
2025-03-27 10:14:05 +00:00
# filesystems (e.g., BTRFS, EXT4), control groups (cgroups), networking, security, and various netfilter
# components. These settings ensure that the kernel is properly configured to support containerized environments.
2025-03-26 20:04:58 +00:00
function armbian_kernel_config__enable_docker_support( ) {
2025-10-26 12:31:49 +00:00
opts_y += ( "BTRFS_FS" ) # Enables the BTRFS file system support (built-in)
2025-10-26 08:25:12 +00:00
opts_y += ( "BTRFS_FS_POSIX_ACL" ) # Enables POSIX ACL support for BTRFS
opts_y += ( "BLK_CGROUP" ) # Enables block layer control groups (cgroups)
opts_y += ( "BLK_DEV_THROTTLING" ) # Enables block device IO throttling
opts_y += ( "BRIDGE_VLAN_FILTERING" ) # Enables VLAN filtering on network bridges
opts_y += ( "BRIDGE" ) # Enables support for Ethernet bridges
opts_y += ( "CFQ_GROUP_IOSCHED" ) # Enables CFQ (Completely Fair Queueing) I/O scheduler for cgroups
opts_y += ( "CGROUP_BPF" ) # Enables BPF-based control groups
opts_y += ( "CGROUP_CPUACCT" ) # Enables CPU accounting in cgroups
opts_y += ( "CGROUP_DEVICE" ) # Enables device control in cgroups
opts_y += ( "CGROUP_FREEZER" ) # Enables freezer for suspending tasks in cgroups
opts_y += ( "CGROUP_HUGETLB" ) # Enables huge page control in cgroups
opts_y += ( "CGROUP_NET_CLASSID" ) # Enables network classid control in cgroups
opts_y += ( "CGROUP_NET_PRIO" ) # Enables network priority control in cgroups
opts_y += ( "CGROUP_PERF" ) # Enables performance counter control in cgroups
opts_y += ( "CGROUP_PIDS" ) # Enables process ID control in cgroups
opts_y += ( "CGROUP_SCHED" ) # Enables scheduler control in cgroups
opts_y += ( "CGROUPS" ) # Enables general cgroup functionality
opts_y += ( "CPUSETS" ) # Enables CPU set support for cgroups
opts_m += ( "CRYPTO" ) # Enables cryptographic algorithms support as modules
opts_m += ( "CRYPTO_AEAD" ) # Enables AEAD (Authenticated Encryption with Associated Data) algorithms support
opts_m += ( "CRYPTO_GCM" ) # Enables GCM (Galois/Counter Mode) cipher support
opts_m += ( "CRYPTO_GHASH" ) # Enables GHASH algorithm support
opts_m += ( "CRYPTO_SEQIV" ) # Enables sequential initialization vector support for cryptographic operations
opts_y += ( "EVENTFD" ) # Enables eventfd system calls for event notification
opts_y += ( "BPF_SYSCALL" ) # Enables BPF (Berkeley Packet Filter) system call support
opts_y += ( "CFS_BANDWIDTH" ) # Enables bandwidth control for CFS (Completely Fair Scheduler)
opts_m += ( "DUMMY" ) # Enables dummy network driver module
opts_y += ( "DEVPTS_MULTIPLE_INSTANCES" ) # Enables multiple instances of devpts (pseudo-terminal master/slave pairs)
opts_y += ( "ENCRYPTED_KEYS" ) # Enables support for encrypted keys in the kernel
2025-10-26 12:31:49 +00:00
opts_y += ( "EXT4_FS" ) # Enables EXT4 file system support as builtin
2025-10-26 08:25:12 +00:00
opts_y += ( "EXT4_FS_POSIX_ACL" ) # Enables POSIX ACL support for EXT4
opts_y += ( "EXT4_FS_SECURITY" ) # Enables security extensions for EXT4 file system
opts_m += ( "IPVLAN" ) # Enables IPvlan network driver support
opts_y += ( "INET" ) # Enables Internet protocol (IPv4) support
opts_y += ( "FAIR_GROUP_SCHED" ) # Enables fair group scheduling support
opts_m += ( "INET_ESP" ) # Enables ESP (Encapsulating Security Payload) for IPv4
opts_y += ( "IP_VS_NFCT" ) # Enables connection tracking for IPVS (IP Virtual Server)
opts_y += ( "IP_VS_PROTO_TCP" ) # Enables TCP protocol support for IPVS
opts_y += ( "IP_VS_PROTO_UDP" ) # Enables UDP protocol support for IPVS
opts_m += ( "IP_VS" ) # Enables IPVS (IP Virtual Server) support as a module
opts_m += ( "IP_VS_RR" ) # Enables round-robin scheduling for IPVS
opts_y += ( "KEY_DH_OPERATIONS" ) # Enables Diffie-Hellman key exchange operations
opts_y += ( "KEYS" ) # Enables key management framework support
opts_m += ( "MACVLAN" ) # Enables MACVLAN network driver support
opts_y += ( "MEMCG" ) # Enables memory controller for cgroups
opts_y += ( "MEMCG_KMEM" ) # Enables memory controller for kmem (kernel memory) cgroups
opts_m += ( "NET_CLS_CGROUP" ) # Enables network classification using cgroups
opts_y += ( "NET_CORE" ) # Enables core networking stack support
opts_y += ( "NET_L3_MASTER_DEV" ) # Enables master device support for Layer 3 (L3) networking
opts_y += ( "NET_NS" ) # Enables network namespace support
opts_y += ( "NET_SCHED" ) # Enables network scheduler support
opts_y += ( "NETDEVICES" ) # Enables support for network devices
opts_y += ( "NAMESPACES" ) # Enables support for namespaces (including network namespaces)
opts_m += ( "OVERLAY_FS" ) # Enables support for OverlayFS
opts_y += ( "PID_NS" ) # Enables PID (Process ID) namespace support
opts_y += ( "POSIX_MQUEUE" ) # Enables POSIX message queues support
opts_y += ( "PROC_PID_CPUSET" ) # Enables CPU set control for /proc/{pid}/cpuset
opts_y += ( "PERSISTENT_KEYRINGS" ) # Enables persistent keyring support
opts_m += ( "RESOURCE_COUNTERS" ) # Enables resource counters support in cgroups
opts_y += ( "RT_GROUP_SCHED" ) # Enables real-time group scheduling
opts_y += ( "SECURITY_APPARMOR" ) # Enables AppArmor security module support
opts_y += ( "SECCOMP" ) # Enables seccomp (secure computing) support
opts_y += ( "SECCOMP_FILTER" ) # Enables seccomp filtering
opts_y += ( "USER_NS" ) # Enables user namespace support
opts_m += ( "VXLAN" ) # Enables VXLAN network driver support
opts_m += ( "VETH" ) # Enables Virtual Ethernet (veth) network driver support
opts_m += ( "VLAN_8021Q" ) # Enables 802.1Q VLAN tagging support
opts_y += ( "XFRM" ) # Enables transform (XFRM) framework support
opts_m += ( "XFRM_ALGO" ) # Enables cryptographic algorithm support for XFRM
opts_m += ( "XFRM_USER" ) # Enables user space XFRM framework support
2025-03-26 20:04:58 +00:00
}
2025-03-27 10:14:05 +00:00
# Enables live system access to the kernel configuration via /proc/config.gz.
2024-03-27 21:34:42 +00:00
function armbian_kernel_config__enable_config_access_in_live_system( ) {
2025-10-26 12:31:49 +00:00
opts_y += ( "IKCONFIG" ) # This information can be extracted from the kernel image file with the script scripts/extract-ikconfig and used as input to rebuild the current kernel or to build another kernel
opts_y += ( "IKPROC" ) # This option enables access to the kernel configuration file through /proc/config.gz
2024-01-01 14:09:30 +00:00
}
function armbian_kernel_config__restore_enable_gpio_sysfs( ) {
2025-10-26 12:31:49 +00:00
opts_y += ( "GPIO_SYSFS" ) # This was a victim of not having EXPERT=y due to some _DEBUG conflicts in old times. Re-enable it forcefully.
2024-03-27 21:34:42 +00:00
}
# +++++++++++ HELPERS CORNER +++++++++++
#
2023-02-03 14:36:28 +00:00
# Helpers for manipulating kernel config.
2024-03-27 21:34:42 +00:00
#
2023-02-02 03:18:17 +00:00
function kernel_config_set_m( ) {
declare module = " $1 "
2025-10-26 08:08:11 +00:00
display_alert "Enabling kernel module" " ${ module } =m " "debug"
run_host_command_logged ./scripts/config --module " ${ module } "
2023-02-02 03:18:17 +00:00
}
function kernel_config_set_y( ) {
declare config = " $1 "
display_alert "Enabling kernel config/built-in" " ${ config } =y " "debug"
run_host_command_logged ./scripts/config --enable " ${ config } "
}
function kernel_config_set_n( ) {
declare config = " $1 "
display_alert "Disabling kernel config/module" " ${ config } =n " "debug"
2025-10-26 08:08:11 +00:00
run_host_command_logged ./scripts/config --disable " ${ config } "
2024-03-27 14:44:56 +00:00
2023-02-02 03:18:17 +00:00
}
2024-03-27 14:44:56 +00:00
2023-11-23 22:42:17 +00:00
function kernel_config_set_string( ) {
declare config = " $1 "
declare value = " ${ 2 } "
2024-01-01 14:09:30 +00:00
display_alert "Setting kernel config/module string" " ${ config } = ${ value } " "debug"
2023-11-23 22:42:17 +00:00
run_host_command_logged ./scripts/config --set-str " ${ config } " " ${ value } "
}
2024-01-01 14:09:30 +00:00
function kernel_config_set_val( ) {
declare config = " $1 "
declare value = " ${ 2 } "
display_alert "Setting kernel config/module value" " ${ config } = ${ value } " "debug"
run_host_command_logged ./scripts/config --set-val " ${ config } " " ${ value } "
}
2025-01-07 23:46:45 +00:00
# This takes opts_n, opts_y, arrays from parent scope; also the opts_val dictionary;
# it and applies them to the hashes and to the .config if it exists.
function armbian_kernel_config_apply_opts_from_arrays( ) {
2025-10-26 08:08:11 +00:00
declare opt_y opt_val opt_n opt_m
2025-01-07 23:46:45 +00:00
for opt_n in " ${ opts_n [@] } " ; do
kernel_config_modifying_hashes += ( " ${ opt_n } =n " )
done
for opt_y in " ${ opts_y [@] } " ; do
kernel_config_modifying_hashes += ( " ${ opt_y } =y " )
done
2025-10-26 08:08:11 +00:00
for opt_m in " ${ opts_m [@] } " ; do
kernel_config_modifying_hashes += ( " ${ opt_m } =m " )
done
2025-01-07 23:46:45 +00:00
for opt_val in " ${ !opts_val[@] } " ; do
kernel_config_modifying_hashes += ( " ${ opt_val } = ${ opts_val [ $opt_val ] } " )
done
if [ [ -f .config ] ] ; then
for opt_n in " ${ opts_n [@] } " ; do
display_alert "Disabling kernel opt" " ${ opt_n } =n " "debug"
kernel_config_set_n " ${ opt_n } "
done
for opt_y in " ${ opts_y [@] } " ; do
display_alert "Enabling kernel opt" " ${ opt_y } =y " "debug"
kernel_config_set_y " ${ opt_y } "
done
2025-10-26 08:08:11 +00:00
for opt_m in " ${ opts_m [@] } " ; do
2025-10-26 12:31:49 +00:00
display_alert "Enabling kernel opt" " ${ opt_m } =m " "debug"
2025-10-26 08:08:11 +00:00
kernel_config_set_m " ${ opt_m } "
done
2025-01-07 23:46:45 +00:00
for opt_val in " ${ !opts_val[@] } " ; do
display_alert "Setting kernel opt" " ${ opt_val } = ${ opts_val [ $opt_val ] } " "debug"
kernel_config_set_val " ${ opt_val } " " ${ opts_val [ $opt_val ] } "
done
fi
}