[{"data":1,"prerenderedAt":1792},["ShallowReactive",2],{"page-\u002Flinux\u002F13-kernel-and-modules":3},{"id":4,"title":5,"body":6,"description":1785,"extension":1786,"meta":1787,"navigation":308,"path":1788,"seo":1789,"stem":1790,"__hash__":1791},"content\u002Flinux\u002F13-kernel-and-modules.md","13 — Kernel & Modules",{"type":7,"value":8,"toc":1755},"minimark",[9,13,35,40,93,96,206,226,230,241,328,333,391,395,450,456,595,599,699,707,772,779,794,800,882,886,976,980,1105,1112,1164,1171,1176,1195,1301,1305,1347,1351,1408,1412,1522,1526,1628,1632,1639,1751],[10,11,5],"h1",{"id":12},"_13-kernel-modules",[14,15,16,17,21,22,26,27,30,31,34],"p",{},"The ",[18,19,20],"strong",{},"kernel"," is the core of Linux — it manages the CPU, memory, devices, filesystems, and processes. This chapter covers kernel versions, loadable modules, kernel parameters (",[23,24,25],"code",{},"sysctl","), ",[23,28,29],{},"\u002Fproc","\u002F",[23,32,33],{},"\u002Fsys"," interfaces, and kernel upgrades — through the lens of production tuning and troubleshooting.",[36,37,39],"h2",{"id":38},"kernel-versions","Kernel Versions",[41,42,44],"code-wrapper",{"language":43},"bash",[45,46,50],"pre",{"className":47,"code":48,"language":43,"meta":49,"style":49},"language-bash shiki shiki-themes github-light github-dark","uname -r              # current kernel release (e.g., 6.8.0-31-generic)\nuname -a              # full info (hostname, kernel version, arch, build date)\ncat \u002Fproc\u002Fversion      # kernel version + gcc version it was built with\n","",[23,51,52,69,80],{"__ignoreMap":49},[53,54,57,61,65],"span",{"class":55,"line":56},"line",1,[53,58,60],{"class":59},"sIsaT","uname",[53,62,64],{"class":63},"snvgF"," -r",[53,66,68],{"class":67},"sdCPZ","              # current kernel release (e.g., 6.8.0-31-generic)\n",[53,70,72,74,77],{"class":55,"line":71},2,[53,73,60],{"class":59},[53,75,76],{"class":63}," -a",[53,78,79],{"class":67},"              # full info (hostname, kernel version, arch, build date)\n",[53,81,83,86,90],{"class":55,"line":82},3,[53,84,85],{"class":59},"cat",[53,87,89],{"class":88},"sJ6F3"," \u002Fproc\u002Fversion",[53,91,92],{"class":67},"      # kernel version + gcc version it was built with\n",[14,94,95],{},"Version numbering:",[41,97,98],{"language":43},[45,99,101],{"className":47,"code":100,"language":43,"meta":49,"style":49},"6.8.0-31-generic\n└┘└┘└┘ └┘ └─────┘\n │ │  │  │     └ distro\u002Fbuild flavor (Ubuntu: -generic, -aws; RHEL: -el9)\n │ │  │  └ patch level (distro-specific)\n │ │  └ minor\n │ └ major\n",[23,102,103,108,119,162,183,195],{"__ignoreMap":49},[53,104,105],{"class":55,"line":56},[53,106,107],{"class":59},"6.8.0-31-generic\n",[53,109,110,113,116],{"class":55,"line":71},[53,111,112],{"class":59},"└┘└┘└┘",[53,114,115],{"class":88}," └┘",[53,117,118],{"class":88}," └─────┘\n",[53,120,121,124,126,129,131,134,137,140,144,147,150,153,156,159],{"class":55,"line":82},[53,122,123],{"class":59}," │",[53,125,123],{"class":88},[53,127,128],{"class":88},"  │",[53,130,128],{"class":88},[53,132,133],{"class":88},"     └",[53,135,136],{"class":88}," distro\u002Fbuild",[53,138,139],{"class":88}," flavor",[53,141,143],{"class":142},"ssxIu"," (Ubuntu: ",[53,145,146],{"class":63},"-generic,",[53,148,149],{"class":63}," -aws",[53,151,152],{"class":142},"; ",[53,154,155],{"class":59},"RHEL:",[53,157,158],{"class":63}," -el9",[53,160,161],{"class":142},")\n",[53,163,165,167,169,171,174,177,180],{"class":55,"line":164},4,[53,166,123],{"class":59},[53,168,123],{"class":88},[53,170,128],{"class":88},[53,172,173],{"class":88},"  └",[53,175,176],{"class":88}," patch",[53,178,179],{"class":88}," level",[53,181,182],{"class":142}," (distro-specific)\n",[53,184,186,188,190,192],{"class":55,"line":185},5,[53,187,123],{"class":59},[53,189,123],{"class":88},[53,191,173],{"class":88},[53,193,194],{"class":88}," minor\n",[53,196,198,200,203],{"class":55,"line":197},6,[53,199,123],{"class":59},[53,201,202],{"class":88}," └",[53,204,205],{"class":88}," major\n",[207,208,209,220],"ul",{},[210,211,212,215,216,219],"li",{},[18,213,214],{},"Distro kernels",": Ubuntu\u002FRHEL patch and backport fixes onto a base version. ",[23,217,218],{},"6.8.0-31-generic"," is Ubuntu's 31st patch level of 6.8.",[210,221,222,225],{},[18,223,224],{},"LTS (Long Term Support)",": some mainline versions get long support (e.g., 6.1, 6.8). Distros often pick LTS bases.",[36,227,229],{"id":228},"loadable-kernel-modules-lkms","Loadable Kernel Modules (LKMs)",[14,231,232,233,236,237,240],{},"Drivers and features can be compiled as ",[18,234,235],{},"modules"," (",[23,238,239],{},".ko"," files) that are loaded on demand — rather than being built into the kernel.",[41,242,243],{"language":43},[45,244,246],{"className":47,"code":245,"language":43,"meta":49,"style":49},"# Complex Implementation: load a module with parameters + verify\nlsmod                            # list loaded modules\nsudo modprobe nfs version=4     # load a module (+ dependencies) with parameters\nsudo modprobe -r nfs            # remove a module (and deps)\nmodinfo nfs                     # show module info (author, params, deps)\n\n# Anti-Pattern: insmod (no dependency resolution)\n# sudo insmod \u002Fpath\u002Fto\u002Fdriver.ko   → fails if prerequisites are missing\n# Use modprobe instead — it resolves dependencies automatically\n",[23,247,248,253,261,281,294,304,310,316,322],{"__ignoreMap":49},[53,249,250],{"class":55,"line":56},[53,251,252],{"class":67},"# Complex Implementation: load a module with parameters + verify\n",[53,254,255,258],{"class":55,"line":71},[53,256,257],{"class":59},"lsmod",[53,259,260],{"class":67},"                            # list loaded modules\n",[53,262,263,266,269,272,275,278],{"class":55,"line":82},[53,264,265],{"class":59},"sudo",[53,267,268],{"class":88}," modprobe",[53,270,271],{"class":88}," nfs",[53,273,274],{"class":88}," version=",[53,276,277],{"class":63},"4",[53,279,280],{"class":67},"     # load a module (+ dependencies) with parameters\n",[53,282,283,285,287,289,291],{"class":55,"line":164},[53,284,265],{"class":59},[53,286,268],{"class":88},[53,288,64],{"class":63},[53,290,271],{"class":88},[53,292,293],{"class":67},"            # remove a module (and deps)\n",[53,295,296,299,301],{"class":55,"line":185},[53,297,298],{"class":59},"modinfo",[53,300,271],{"class":88},[53,302,303],{"class":67},"                     # show module info (author, params, deps)\n",[53,305,306],{"class":55,"line":197},[53,307,309],{"emptyLinePlaceholder":308},true,"\n",[53,311,313],{"class":55,"line":312},7,[53,314,315],{"class":67},"# Anti-Pattern: insmod (no dependency resolution)\n",[53,317,319],{"class":55,"line":318},8,[53,320,321],{"class":67},"# sudo insmod \u002Fpath\u002Fto\u002Fdriver.ko   → fails if prerequisites are missing\n",[53,323,325],{"class":55,"line":324},9,[53,326,327],{"class":67},"# Use modprobe instead — it resolves dependencies automatically\n",[329,330,332],"h3",{"id":331},"auto-loading-at-boot","Auto-Loading at Boot",[41,334,335],{"language":43},[45,336,338],{"className":47,"code":337,"language":43,"meta":49,"style":49},"# Modules in \u002Fetc\u002Fmodules-load.d\u002F*.conf are loaded at boot:\necho \"nfs\" | sudo tee \u002Fetc\u002Fmodules-load.d\u002Fnfs.conf\n\n# Module parameters in \u002Fetc\u002Fmodprobe.d\u002F*.conf:\necho \"options nfs version=4\" | sudo tee \u002Fetc\u002Fmodprobe.d\u002Fnfs.conf\n",[23,339,340,345,366,370,375],{"__ignoreMap":49},[53,341,342],{"class":55,"line":56},[53,343,344],{"class":67},"# Modules in \u002Fetc\u002Fmodules-load.d\u002F*.conf are loaded at boot:\n",[53,346,347,350,353,357,360,363],{"class":55,"line":71},[53,348,349],{"class":63},"echo",[53,351,352],{"class":88}," \"nfs\"",[53,354,356],{"class":355},"svdQ7"," |",[53,358,359],{"class":59}," sudo",[53,361,362],{"class":88}," tee",[53,364,365],{"class":88}," \u002Fetc\u002Fmodules-load.d\u002Fnfs.conf\n",[53,367,368],{"class":55,"line":82},[53,369,309],{"emptyLinePlaceholder":308},[53,371,372],{"class":55,"line":164},[53,373,374],{"class":67},"# Module parameters in \u002Fetc\u002Fmodprobe.d\u002F*.conf:\n",[53,376,377,379,382,384,386,388],{"class":55,"line":185},[53,378,349],{"class":63},[53,380,381],{"class":88}," \"options nfs version=4\"",[53,383,356],{"class":355},[53,385,359],{"class":59},[53,387,362],{"class":88},[53,389,390],{"class":88}," \u002Fetc\u002Fmodprobe.d\u002Fnfs.conf\n",[329,392,394],{"id":393},"blacklisting-modules","Blacklisting Modules",[41,396,397],{"language":43},[45,398,400],{"className":47,"code":399,"language":43,"meta":49,"style":49},"# Complex Implementation: fully block a problematic driver (e.g., nouveau before installing NVIDIA)\necho \"blacklist nouveau\" | sudo tee \u002Fetc\u002Fmodprobe.d\u002Fblacklist-nouveau.conf\n# \"blacklist\" prevents auto-load (by alias), but `modprobe nouveau` still works\n# To fully prevent even manual load:\necho \"install nouveau \u002Fbin\u002Ffalse\" | sudo tee -a \u002Fetc\u002Fmodprobe.d\u002Fblacklist-nouveau.conf\n",[23,401,402,407,423,428,433],{"__ignoreMap":49},[53,403,404],{"class":55,"line":56},[53,405,406],{"class":67},"# Complex Implementation: fully block a problematic driver (e.g., nouveau before installing NVIDIA)\n",[53,408,409,411,414,416,418,420],{"class":55,"line":71},[53,410,349],{"class":63},[53,412,413],{"class":88}," \"blacklist nouveau\"",[53,415,356],{"class":355},[53,417,359],{"class":59},[53,419,362],{"class":88},[53,421,422],{"class":88}," \u002Fetc\u002Fmodprobe.d\u002Fblacklist-nouveau.conf\n",[53,424,425],{"class":55,"line":82},[53,426,427],{"class":67},"# \"blacklist\" prevents auto-load (by alias), but `modprobe nouveau` still works\n",[53,429,430],{"class":55,"line":164},[53,431,432],{"class":67},"# To fully prevent even manual load:\n",[53,434,435,437,440,442,444,446,448],{"class":55,"line":185},[53,436,349],{"class":63},[53,438,439],{"class":88}," \"install nouveau \u002Fbin\u002Ffalse\"",[53,441,356],{"class":355},[53,443,359],{"class":59},[53,445,362],{"class":88},[53,447,76],{"class":63},[53,449,422],{"class":88},[36,451,453,454],{"id":452},"kernel-parameters-sysctl","Kernel Parameters — ",[23,455,25],{},[41,457,458],{"language":43},[45,459,461],{"className":47,"code":460,"language":43,"meta":49,"style":49},"# Complex Implementation: production network tuning with persistent config\n# Read:\nsysctl net.ipv4.ip_forward        # one parameter\ncat \u002Fproc\u002Fsys\u002Fnet\u002Fipv4\u002Fip_forward  # same (file path = parameter name with \u002F for .)\n\n# Set temporarily:\nsudo sysctl -w net.ipv4.ip_forward=1     # lost on reboot\necho 1 | sudo tee \u002Fproc\u002Fsys\u002Fnet\u002Fipv4\u002Fip_forward   # same\n\n# Set persistent:\necho \"net.ipv4.ip_forward = 1\" | sudo tee \u002Fetc\u002Fsysctl.d\u002F99-ip-forward.conf\nsudo sysctl -p \u002Fetc\u002Fsysctl.d\u002F99-ip-forward.conf   # load just this file\nsudo sysctl --system                               # load ALL configs\n",[23,462,463,468,473,483,493,497,502,521,539,543,549,566,582],{"__ignoreMap":49},[53,464,465],{"class":55,"line":56},[53,466,467],{"class":67},"# Complex Implementation: production network tuning with persistent config\n",[53,469,470],{"class":55,"line":71},[53,471,472],{"class":67},"# Read:\n",[53,474,475,477,480],{"class":55,"line":82},[53,476,25],{"class":59},[53,478,479],{"class":88}," net.ipv4.ip_forward",[53,481,482],{"class":67},"        # one parameter\n",[53,484,485,487,490],{"class":55,"line":164},[53,486,85],{"class":59},[53,488,489],{"class":88}," \u002Fproc\u002Fsys\u002Fnet\u002Fipv4\u002Fip_forward",[53,491,492],{"class":67},"  # same (file path = parameter name with \u002F for .)\n",[53,494,495],{"class":55,"line":185},[53,496,309],{"emptyLinePlaceholder":308},[53,498,499],{"class":55,"line":197},[53,500,501],{"class":67},"# Set temporarily:\n",[53,503,504,506,509,512,515,518],{"class":55,"line":312},[53,505,265],{"class":59},[53,507,508],{"class":88}," sysctl",[53,510,511],{"class":63}," -w",[53,513,514],{"class":88}," net.ipv4.ip_forward=",[53,516,517],{"class":63},"1",[53,519,520],{"class":67},"     # lost on reboot\n",[53,522,523,525,528,530,532,534,536],{"class":55,"line":318},[53,524,349],{"class":63},[53,526,527],{"class":63}," 1",[53,529,356],{"class":355},[53,531,359],{"class":59},[53,533,362],{"class":88},[53,535,489],{"class":88},[53,537,538],{"class":67},"   # same\n",[53,540,541],{"class":55,"line":324},[53,542,309],{"emptyLinePlaceholder":308},[53,544,546],{"class":55,"line":545},10,[53,547,548],{"class":67},"# Set persistent:\n",[53,550,552,554,557,559,561,563],{"class":55,"line":551},11,[53,553,349],{"class":63},[53,555,556],{"class":88}," \"net.ipv4.ip_forward = 1\"",[53,558,356],{"class":355},[53,560,359],{"class":59},[53,562,362],{"class":88},[53,564,565],{"class":88}," \u002Fetc\u002Fsysctl.d\u002F99-ip-forward.conf\n",[53,567,569,571,573,576,579],{"class":55,"line":568},12,[53,570,265],{"class":59},[53,572,508],{"class":88},[53,574,575],{"class":63}," -p",[53,577,578],{"class":88}," \u002Fetc\u002Fsysctl.d\u002F99-ip-forward.conf",[53,580,581],{"class":67},"   # load just this file\n",[53,583,585,587,589,592],{"class":55,"line":584},13,[53,586,265],{"class":59},[53,588,508],{"class":88},[53,590,591],{"class":63}," --system",[53,593,594],{"class":67},"                               # load ALL configs\n",[329,596,598],{"id":597},"common-parameters","Common Parameters",[600,601,602,615],"table",{},[603,604,605],"thead",{},[606,607,608,612],"tr",{},[609,610,611],"th",{},"Parameter",[609,613,614],{},"Purpose",[616,617,618,629,639,649,659,669,679,689],"tbody",{},[606,619,620,626],{},[621,622,623],"td",{},[23,624,625],{},"net.ipv4.ip_forward",[621,627,628],{},"IP forwarding (router\u002FVPN\u002FDocker)",[606,630,631,636],{},[621,632,633],{},[23,634,635],{},"net.ipv4.tcp_tw_reuse",[621,637,638],{},"Reuse TIME_WAIT sockets (high-conn servers)",[606,640,641,646],{},[621,642,643],{},[23,644,645],{},"net.core.somaxconn",[621,647,648],{},"Max backlog of pending connections",[606,650,651,656],{},[621,652,653],{},[23,654,655],{},"vm.swappiness",[621,657,658],{},"Swap tendency (0-100, default 60)",[606,660,661,666],{},[621,662,663],{},[23,664,665],{},"vm.overcommit_memory",[621,667,668],{},"Memory overcommit (0=heuristic, 1=always, 2=strict)",[606,670,671,676],{},[621,672,673],{},[23,674,675],{},"fs.file-max",[621,677,678],{},"System-wide max open files",[606,680,681,686],{},[621,682,683],{},[23,684,685],{},"fs.inotify.max_user_watches",[621,687,688],{},"Inotify watches (IDEs, Dropbox)",[606,690,691,696],{},[621,692,693],{},[23,694,695],{},"kernel.sysrq",[621,697,698],{},"Magic SysRq key (1=enable all)",[329,700,702,703,706],{"id":701},"edge-case-sysctl-w-changes-are-temporary","Edge Case: ",[23,704,705],{},"sysctl -w"," Changes Are Temporary",[41,708,709],{"language":43},[45,710,712],{"className":47,"code":711,"language":43,"meta":49,"style":49},"# NAIVE: set without persisting\nsudo sysctl -w vm.swappiness=10\n# After reboot: swappiness is back to 60\n\n# PRODUCTION: persist in \u002Fetc\u002Fsysctl.d\u002F\necho \"vm.swappiness = 10\" | sudo tee \u002Fetc\u002Fsysctl.d\u002F99-swappiness.conf\nsudo sysctl --system\n",[23,713,714,719,733,738,742,747,763],{"__ignoreMap":49},[53,715,716],{"class":55,"line":56},[53,717,718],{"class":67},"# NAIVE: set without persisting\n",[53,720,721,723,725,727,730],{"class":55,"line":71},[53,722,265],{"class":59},[53,724,508],{"class":88},[53,726,511],{"class":63},[53,728,729],{"class":88}," vm.swappiness=",[53,731,732],{"class":63},"10\n",[53,734,735],{"class":55,"line":82},[53,736,737],{"class":67},"# After reboot: swappiness is back to 60\n",[53,739,740],{"class":55,"line":164},[53,741,309],{"emptyLinePlaceholder":308},[53,743,744],{"class":55,"line":185},[53,745,746],{"class":67},"# PRODUCTION: persist in \u002Fetc\u002Fsysctl.d\u002F\n",[53,748,749,751,754,756,758,760],{"class":55,"line":197},[53,750,349],{"class":63},[53,752,753],{"class":88}," \"vm.swappiness = 10\"",[53,755,356],{"class":355},[53,757,359],{"class":59},[53,759,362],{"class":88},[53,761,762],{"class":88}," \u002Fetc\u002Fsysctl.d\u002F99-swappiness.conf\n",[53,764,765,767,769],{"class":55,"line":312},[53,766,265],{"class":59},[53,768,508],{"class":88},[53,770,771],{"class":63}," --system\n",[329,773,775,778],{"id":774},"etcsysctld-precedence",[23,776,777],{},"\u002Fetc\u002Fsysctl.d\u002F"," Precedence",[14,780,781,782,785,786,789,790,793],{},"Files are loaded in lexical order. ",[23,783,784],{},"99-sysctl.conf"," is a symlink to ",[23,787,788],{},"\u002Fetc\u002Fsysctl.conf"," (loaded last, lowest priority). Use ",[23,791,792],{},"99-*.conf"," for your overrides so they take precedence.",[36,795,797,799],{"id":796},"proc-kernel-process-interface",[23,798,29],{}," — Kernel & Process Interface",[41,801,802],{"language":43},[45,803,805],{"className":47,"code":804,"language":43,"meta":49,"style":49},"# Complex Implementation: read system state from \u002Fproc (no external tools needed)\ncat \u002Fproc\u002Floadavg\n# 0.45 0.32 0.28 2\u002F1024 12345\n#  └─────────────┘ └─────┘\n#  load avg (1,5,15)   running\u002Ftotal processes, last PID\n\ncat \u002Fproc\u002Fmeminfo | head -5\n# MemTotal:       16332940 kB\n# MemFree:         8234520 kB\n# MemAvailable:   11234567 kB   ← what apps can actually use (free + reclaimable cache)\n\ncat \u002Fproc\u002Fcmdline   # boot parameters passed to the kernel\n",[23,806,807,812,819,824,829,834,838,853,858,863,868,872],{"__ignoreMap":49},[53,808,809],{"class":55,"line":56},[53,810,811],{"class":67},"# Complex Implementation: read system state from \u002Fproc (no external tools needed)\n",[53,813,814,816],{"class":55,"line":71},[53,815,85],{"class":59},[53,817,818],{"class":88}," \u002Fproc\u002Floadavg\n",[53,820,821],{"class":55,"line":82},[53,822,823],{"class":67},"# 0.45 0.32 0.28 2\u002F1024 12345\n",[53,825,826],{"class":55,"line":164},[53,827,828],{"class":67},"#  └─────────────┘ └─────┘\n",[53,830,831],{"class":55,"line":185},[53,832,833],{"class":67},"#  load avg (1,5,15)   running\u002Ftotal processes, last PID\n",[53,835,836],{"class":55,"line":197},[53,837,309],{"emptyLinePlaceholder":308},[53,839,840,842,845,847,850],{"class":55,"line":312},[53,841,85],{"class":59},[53,843,844],{"class":88}," \u002Fproc\u002Fmeminfo",[53,846,356],{"class":355},[53,848,849],{"class":59}," head",[53,851,852],{"class":63}," -5\n",[53,854,855],{"class":55,"line":318},[53,856,857],{"class":67},"# MemTotal:       16332940 kB\n",[53,859,860],{"class":55,"line":324},[53,861,862],{"class":67},"# MemFree:         8234520 kB\n",[53,864,865],{"class":55,"line":545},[53,866,867],{"class":67},"# MemAvailable:   11234567 kB   ← what apps can actually use (free + reclaimable cache)\n",[53,869,870],{"class":55,"line":551},[53,871,309],{"emptyLinePlaceholder":308},[53,873,874,876,879],{"class":55,"line":568},[53,875,85],{"class":59},[53,877,878],{"class":88}," \u002Fproc\u002Fcmdline",[53,880,881],{"class":67},"   # boot parameters passed to the kernel\n",[36,883,885],{"id":884},"udev-device-management","udev — Device Management",[41,887,888],{"language":43},[45,889,891],{"className":47,"code":890,"language":43,"meta":49,"style":49},"# Complex Implementation: stable device name with udev rules\n# \u002Fetc\u002Fudev\u002Frules.d\u002F99-usb-serial.rules\n# SUBSYSTEM==\"tty\", ATTRS{idVendor}==\"0403\", ATTRS{idProduct}==\"6001\", SYMLINK+=\"usb_serial\"\n# → creates \u002Fdev\u002Fusb_serial (stable across reboots, instead of \u002Fdev\u002FttyUSB0 sometimes being ttyUSB1)\n\n# Debug:\nudevadm monitor                     # live device events (plug\u002Funplug USB)\nudevadm info -a \u002Fdev\u002Fsda1           # all attributes (for writing rules)\nsudo udevadm control --reload-rules  # reload after editing\nsudo udevadm trigger                 # re-process all devices\n",[23,892,893,898,903,908,913,917,922,933,948,964],{"__ignoreMap":49},[53,894,895],{"class":55,"line":56},[53,896,897],{"class":67},"# Complex Implementation: stable device name with udev rules\n",[53,899,900],{"class":55,"line":71},[53,901,902],{"class":67},"# \u002Fetc\u002Fudev\u002Frules.d\u002F99-usb-serial.rules\n",[53,904,905],{"class":55,"line":82},[53,906,907],{"class":67},"# SUBSYSTEM==\"tty\", ATTRS{idVendor}==\"0403\", ATTRS{idProduct}==\"6001\", SYMLINK+=\"usb_serial\"\n",[53,909,910],{"class":55,"line":164},[53,911,912],{"class":67},"# → creates \u002Fdev\u002Fusb_serial (stable across reboots, instead of \u002Fdev\u002FttyUSB0 sometimes being ttyUSB1)\n",[53,914,915],{"class":55,"line":185},[53,916,309],{"emptyLinePlaceholder":308},[53,918,919],{"class":55,"line":197},[53,920,921],{"class":67},"# Debug:\n",[53,923,924,927,930],{"class":55,"line":312},[53,925,926],{"class":59},"udevadm",[53,928,929],{"class":88}," monitor",[53,931,932],{"class":67},"                     # live device events (plug\u002Funplug USB)\n",[53,934,935,937,940,942,945],{"class":55,"line":318},[53,936,926],{"class":59},[53,938,939],{"class":88}," info",[53,941,76],{"class":63},[53,943,944],{"class":88}," \u002Fdev\u002Fsda1",[53,946,947],{"class":67},"           # all attributes (for writing rules)\n",[53,949,950,952,955,958,961],{"class":55,"line":324},[53,951,265],{"class":59},[53,953,954],{"class":88}," udevadm",[53,956,957],{"class":88}," control",[53,959,960],{"class":63}," --reload-rules",[53,962,963],{"class":67},"  # reload after editing\n",[53,965,966,968,970,973],{"class":55,"line":545},[53,967,265],{"class":59},[53,969,954],{"class":88},[53,971,972],{"class":88}," trigger",[53,974,975],{"class":67},"                 # re-process all devices\n",[36,977,979],{"id":978},"kernel-upgrade","Kernel Upgrade",[41,981,982],{"language":43},[45,983,985],{"className":47,"code":984,"language":43,"meta":49,"style":49},"# Complex Implementation: safe kernel upgrade with fallback\nsudo apt update && sudo apt install linux-image-generic\n# Old kernels are kept (so you can fall back)\n\n# Check installed kernels:\nls \u002Fboot\u002Fvmlinuz-*\ndpkg --list | grep linux-image      # Debian\nrpm -qa | grep kernel               # RHEL\n\n# NEVER remove the running kernel:\nuname -r                            # check before purging\n# If you purge linux-image-$(uname -r), the system may keep running\n# (kernel is in memory) but you can't load modules or rebuild initramfs\n",[23,986,987,992,1015,1020,1024,1029,1040,1059,1077,1081,1086,1095,1100],{"__ignoreMap":49},[53,988,989],{"class":55,"line":56},[53,990,991],{"class":67},"# Complex Implementation: safe kernel upgrade with fallback\n",[53,993,994,996,999,1002,1005,1007,1009,1012],{"class":55,"line":71},[53,995,265],{"class":59},[53,997,998],{"class":88}," apt",[53,1000,1001],{"class":88}," update",[53,1003,1004],{"class":142}," && ",[53,1006,265],{"class":59},[53,1008,998],{"class":88},[53,1010,1011],{"class":88}," install",[53,1013,1014],{"class":88}," linux-image-generic\n",[53,1016,1017],{"class":55,"line":82},[53,1018,1019],{"class":67},"# Old kernels are kept (so you can fall back)\n",[53,1021,1022],{"class":55,"line":164},[53,1023,309],{"emptyLinePlaceholder":308},[53,1025,1026],{"class":55,"line":185},[53,1027,1028],{"class":67},"# Check installed kernels:\n",[53,1030,1031,1034,1037],{"class":55,"line":197},[53,1032,1033],{"class":59},"ls",[53,1035,1036],{"class":88}," \u002Fboot\u002Fvmlinuz-",[53,1038,1039],{"class":63},"*\n",[53,1041,1042,1045,1048,1050,1053,1056],{"class":55,"line":312},[53,1043,1044],{"class":59},"dpkg",[53,1046,1047],{"class":63}," --list",[53,1049,356],{"class":355},[53,1051,1052],{"class":59}," grep",[53,1054,1055],{"class":88}," linux-image",[53,1057,1058],{"class":67},"      # Debian\n",[53,1060,1061,1064,1067,1069,1071,1074],{"class":55,"line":318},[53,1062,1063],{"class":59},"rpm",[53,1065,1066],{"class":63}," -qa",[53,1068,356],{"class":355},[53,1070,1052],{"class":59},[53,1072,1073],{"class":88}," kernel",[53,1075,1076],{"class":67},"               # RHEL\n",[53,1078,1079],{"class":55,"line":324},[53,1080,309],{"emptyLinePlaceholder":308},[53,1082,1083],{"class":55,"line":545},[53,1084,1085],{"class":67},"# NEVER remove the running kernel:\n",[53,1087,1088,1090,1092],{"class":55,"line":551},[53,1089,60],{"class":59},[53,1091,64],{"class":63},[53,1093,1094],{"class":67},"                            # check before purging\n",[53,1096,1097],{"class":55,"line":568},[53,1098,1099],{"class":67},"# If you purge linux-image-$(uname -r), the system may keep running\n",[53,1101,1102],{"class":55,"line":584},[53,1103,1104],{"class":67},"# (kernel is in memory) but you can't load modules or rebuild initramfs\n",[329,1106,702,1108,1111],{"id":1107},"edge-case-boot-fills-up-from-old-kernels",[23,1109,1110],{},"\u002Fboot"," Fills Up From Old Kernels",[41,1113,1114],{"language":43},[45,1115,1117],{"className":47,"code":1116,"language":43,"meta":49,"style":49},"df -h \u002Fboot                         # check space\nsudo apt autoremove --purge         # Debian (keeps current + one previous)\nsudo dnf remove --oldinstallonly   # RHEL\n",[23,1118,1119,1133,1148],{"__ignoreMap":49},[53,1120,1121,1124,1127,1130],{"class":55,"line":56},[53,1122,1123],{"class":59},"df",[53,1125,1126],{"class":63}," -h",[53,1128,1129],{"class":88}," \u002Fboot",[53,1131,1132],{"class":67},"                         # check space\n",[53,1134,1135,1137,1139,1142,1145],{"class":55,"line":71},[53,1136,265],{"class":59},[53,1138,998],{"class":88},[53,1140,1141],{"class":88}," autoremove",[53,1143,1144],{"class":63}," --purge",[53,1146,1147],{"class":67},"         # Debian (keeps current + one previous)\n",[53,1149,1150,1152,1155,1158,1161],{"class":55,"line":82},[53,1151,265],{"class":59},[53,1153,1154],{"class":88}," dnf",[53,1156,1157],{"class":88}," remove",[53,1159,1160],{"class":63}," --oldinstallonly",[53,1162,1163],{"class":67},"   # RHEL\n",[36,1165,1167,1170],{"id":1166},"initramfs-early-userspace",[23,1168,1169],{},"initramfs"," — Early Userspace",[14,1172,16,1173,1175],{},[18,1174,1169],{}," is loaded by the bootloader into RAM. It contains enough userspace to:",[1177,1178,1179,1182,1185],"ol",{},[210,1180,1181],{},"Load modules needed to access the root filesystem.",[210,1183,1184],{},"Mount the root filesystem.",[210,1186,1187,1190,1191,1194],{},[23,1188,1189],{},"pivot_root"," into it and ",[23,1192,1193],{},"exec"," the real init (systemd).",[41,1196,1197],{"language":43},[45,1198,1200],{"className":47,"code":1199,"language":43,"meta":49,"style":49},"# Regenerate after kernel or storage changes:\nsudo update-initramfs -u        # Debian\u002FUbuntu (current kernel)\nsudo update-initramfs -u -k all # all kernels\nsudo dracut -f                  # RHEL\u002FFedora\nsudo mkinitcpio -P              # Arch\n\n# Inspect:\nlsinitramfs \u002Fboot\u002Finitrd.img-$(uname -r) | grep ext4   # has ext4 module?\n",[23,1201,1202,1207,1220,1237,1250,1263,1267,1272],{"__ignoreMap":49},[53,1203,1204],{"class":55,"line":56},[53,1205,1206],{"class":67},"# Regenerate after kernel or storage changes:\n",[53,1208,1209,1211,1214,1217],{"class":55,"line":71},[53,1210,265],{"class":59},[53,1212,1213],{"class":88}," update-initramfs",[53,1215,1216],{"class":63}," -u",[53,1218,1219],{"class":67},"        # Debian\u002FUbuntu (current kernel)\n",[53,1221,1222,1224,1226,1228,1231,1234],{"class":55,"line":82},[53,1223,265],{"class":59},[53,1225,1213],{"class":88},[53,1227,1216],{"class":63},[53,1229,1230],{"class":63}," -k",[53,1232,1233],{"class":88}," all",[53,1235,1236],{"class":67}," # all kernels\n",[53,1238,1239,1241,1244,1247],{"class":55,"line":164},[53,1240,265],{"class":59},[53,1242,1243],{"class":88}," dracut",[53,1245,1246],{"class":63}," -f",[53,1248,1249],{"class":67},"                  # RHEL\u002FFedora\n",[53,1251,1252,1254,1257,1260],{"class":55,"line":185},[53,1253,265],{"class":59},[53,1255,1256],{"class":88}," mkinitcpio",[53,1258,1259],{"class":63}," -P",[53,1261,1262],{"class":67},"              # Arch\n",[53,1264,1265],{"class":55,"line":197},[53,1266,309],{"emptyLinePlaceholder":308},[53,1268,1269],{"class":55,"line":312},[53,1270,1271],{"class":67},"# Inspect:\n",[53,1273,1274,1277,1280,1283,1285,1287,1290,1293,1295,1298],{"class":55,"line":318},[53,1275,1276],{"class":59},"lsinitramfs",[53,1278,1279],{"class":88}," \u002Fboot\u002Finitrd.img-",[53,1281,1282],{"class":142},"$(",[53,1284,60],{"class":59},[53,1286,64],{"class":63},[53,1288,1289],{"class":142},") ",[53,1291,1292],{"class":355},"|",[53,1294,1052],{"class":59},[53,1296,1297],{"class":88}," ext4",[53,1299,1300],{"class":67},"   # has ext4 module?\n",[329,1302,1304],{"id":1303},"edge-case-missing-initramfs-causes-boot-failure","Edge Case: Missing initramfs Causes Boot Failure",[41,1306,1307],{"language":43},[45,1308,1310],{"className":47,"code":1309,"language":43,"meta":49,"style":49},"# Error: \"VFS: Unable to mount root fs on unknown-block(0,0)\"\n# The initramfs is missing or doesn't have the storage driver for the new kernel.\n# Fix: boot an older kernel (GRUB → \"Advanced options\"), then:\nsudo update-initramfs -u -k all\nsudo reboot\n",[23,1311,1312,1317,1322,1327,1340],{"__ignoreMap":49},[53,1313,1314],{"class":55,"line":56},[53,1315,1316],{"class":67},"# Error: \"VFS: Unable to mount root fs on unknown-block(0,0)\"\n",[53,1318,1319],{"class":55,"line":71},[53,1320,1321],{"class":67},"# The initramfs is missing or doesn't have the storage driver for the new kernel.\n",[53,1323,1324],{"class":55,"line":82},[53,1325,1326],{"class":67},"# Fix: boot an older kernel (GRUB → \"Advanced options\"), then:\n",[53,1328,1329,1331,1333,1335,1337],{"class":55,"line":164},[53,1330,265],{"class":59},[53,1332,1213],{"class":88},[53,1334,1216],{"class":63},[53,1336,1230],{"class":63},[53,1338,1339],{"class":88}," all\n",[53,1341,1342,1344],{"class":55,"line":185},[53,1343,265],{"class":59},[53,1345,1346],{"class":88}," reboot\n",[36,1348,1350],{"id":1349},"dkms-dynamic-kernel-module-support","DKMS — Dynamic Kernel Module Support",[41,1352,1353],{"language":43},[45,1354,1356],{"className":47,"code":1355,"language":43,"meta":49,"style":49},"# Third-party modules (NVIDIA, ZFS, VirtualBox) need rebuilding for each kernel version\nsudo dkms install nvidia\u002F550.54          # build + install for current kernel\ndkms status                              # list DKMS modules\n# When a new kernel is installed, DKMS auto-rebuilds via a postinst hook\n\n# Edge Case: if DKMS fails (API changed), the module is missing after reboot\n# Check dkms status after kernel updates — have a fallback kernel ready\n",[23,1357,1358,1363,1378,1389,1394,1398,1403],{"__ignoreMap":49},[53,1359,1360],{"class":55,"line":56},[53,1361,1362],{"class":67},"# Third-party modules (NVIDIA, ZFS, VirtualBox) need rebuilding for each kernel version\n",[53,1364,1365,1367,1370,1372,1375],{"class":55,"line":71},[53,1366,265],{"class":59},[53,1368,1369],{"class":88}," dkms",[53,1371,1011],{"class":88},[53,1373,1374],{"class":88}," nvidia\u002F550.54",[53,1376,1377],{"class":67},"          # build + install for current kernel\n",[53,1379,1380,1383,1386],{"class":55,"line":82},[53,1381,1382],{"class":59},"dkms",[53,1384,1385],{"class":88}," status",[53,1387,1388],{"class":67},"                              # list DKMS modules\n",[53,1390,1391],{"class":55,"line":164},[53,1392,1393],{"class":67},"# When a new kernel is installed, DKMS auto-rebuilds via a postinst hook\n",[53,1395,1396],{"class":55,"line":185},[53,1397,309],{"emptyLinePlaceholder":308},[53,1399,1400],{"class":55,"line":197},[53,1401,1402],{"class":67},"# Edge Case: if DKMS fails (API changed), the module is missing after reboot\n",[53,1404,1405],{"class":55,"line":312},[53,1406,1407],{"class":67},"# Check dkms status after kernel updates — have a fallback kernel ready\n",[36,1409,1411],{"id":1410},"tips-tricks","💡 Tips & Tricks",[207,1413,1414,1431,1452,1460,1477,1490,1499,1511],{},[210,1415,1416,1419,1420,1423,1424,1427,1428,1430],{},[18,1417,1418],{},"Idiom",": use ",[23,1421,1422],{},"sysctl --system"," after editing ",[23,1425,1426],{},"\u002Fetc\u002Fsysctl.d\u002F*.conf"," — loads all sysctl files in order. Put custom config in ",[23,1429,792],{}," so it loads last and wins.",[210,1432,1433,1419,1435,1438,1439,1442,1443,1445,1446,1448,1449,1451],{},[18,1434,1418],{},[23,1436,1437],{},"modprobe"," (not ",[23,1440,1441],{},"insmod",") for loading modules — ",[23,1444,1437],{}," resolves dependencies. ",[23,1447,1441],{}," loads a single ",[23,1450,239],{}," and fails if deps are missing.",[210,1453,1454,1419,1456,1459],{},[18,1455,1418],{},[23,1457,1458],{},"modinfo \u003Cmodule>"," before loading — shows description, parameters, dependencies, and which kernel it was built for.",[210,1461,1462,1464,1465,1468,1469,1472,1473,1476],{},[18,1463,1418],{},": blacklist problematic modules in ",[23,1466,1467],{},"\u002Fetc\u002Fmodprobe.d\u002F"," — ",[23,1470,1471],{},"blacklist"," stops auto-load; ",[23,1474,1475],{},"install \u003Cmodule> \u002Fbin\u002Ffalse"," blocks even manual loading.",[210,1478,1479,1481,1482,1485,1486,1489],{},[18,1480,1418],{},": run ",[23,1483,1484],{},"sudo update-initramfs -u"," (or ",[23,1487,1488],{},"dracut -f",") after storage\u002Fkernel changes — ensures the initramfs has the modules to boot.",[210,1491,1492,1419,1495,1498],{},[18,1493,1494],{},"Debug",[23,1496,1497],{},"udevadm monitor"," to watch device events live — plug in a USB device and see the kernel + udev events.",[210,1500,1501,1419,1503,1506,1507,1510],{},[18,1502,1494],{},[23,1504,1505],{},"cat \u002Fproc\u002Fcmdline"," to verify boot parameters — confirms that GRUB changes took effect after ",[23,1508,1509],{},"update-grub",".",[210,1512,1513,1419,1515,1485,1518,1521],{},[18,1514,1494],{},[23,1516,1517],{},"journalctl -k -p err",[23,1519,1520],{},"dmesg --level=err",") for kernel errors — hardware failures, driver issues, OOM kills.",[36,1523,1525],{"id":1524},"️-edge-cases-gotchas","⚠️ Edge Cases & Gotchas",[207,1527,1528,1534,1553,1563,1577,1600,1610],{},[210,1529,1530,1533],{},[18,1531,1532],{},"Modules are kernel-version-specific",": a module built for 6.8.0-31 won't load on 6.8.0-32 (vermagic check). DKMS rebuilds on kernel updates — if DKMS fails (e.g., NVIDIA can't build against a new kernel), the module won't load after reboot.",[210,1535,1536,1542,1543,1546,1547,1550,1551,1510],{},[18,1537,1538,1541],{},[23,1539,1540],{},"rmmod"," fails if the module is in use",": you can't remove a filesystem module while a filesystem of that type is mounted, or a network driver while the interface is up. Stop the usage first (",[23,1544,1545],{},"umount",", ",[23,1548,1549],{},"ip link set down","), then ",[23,1552,1540],{},[210,1554,1555,1560,1561,1510],{},[18,1556,1557,1559],{},[23,1558,705],{}," changes are temporary",": lost on reboot. Always persist in ",[23,1562,777],{},[210,1564,1565,1568,1569,1572,1573,1576],{},[18,1566,1567],{},"Removing the running kernel breaks the system",": if you ",[23,1570,1571],{},"apt purge linux-image-$(uname -r)",", the running kernel's files are deleted. You can't load modules or rebuild initramfs. Never purge the running kernel — check ",[23,1574,1575],{},"uname -r"," first.",[210,1578,1579,1584,1585,1588,1589,1591,1592,1595,1596,1599],{},[18,1580,1581,1583],{},[23,1582,1110],{}," can fill up from old kernels",": ",[23,1586,1587],{},"apt"," keeps old kernels, and ",[23,1590,1110],{}," is often a small separate partition. Clean with ",[23,1593,1594],{},"sudo apt autoremove --purge"," (Debian) or ",[23,1597,1598],{},"dnf remove --oldinstallonly"," (RHEL).",[210,1601,1602,1605,1606,1609],{},[18,1603,1604],{},"DKMS can break on kernel updates",": if a third-party module (NVIDIA, ZFS) can't compile against a new kernel (API changed), DKMS fails, and after reboot the module is missing. Check ",[23,1607,1608],{},"dkms status"," and have a fallback kernel.",[210,1611,1612,1584,1620,1623,1624,1627],{},[18,1613,1614,1616,1617,1619],{},[23,1615,29],{}," and ",[23,1618,33],{}," are virtual",[23,1621,1622],{},"du -sh \u002Fproc"," gives nonsense. ",[23,1625,1626],{},"tar"," should exclude them. Don't try to back them up — they're generated by the kernel at read time.",[36,1629,1631],{"id":1630},"quick-quiz","🧠 Quick Quiz",[14,1633,1634,1635,1638],{},"You install a new kernel via ",[23,1636,1637],{},"sudo apt install linux-image-6.8.0-35-generic",", reboot, and get a kernel panic: \"VFS: Unable to mount root fs on unknown-block(0,0)\". What's the most likely cause, and how do you fix it?",[1640,1641,1642,1646,1652,1657,1665,1707,1712,1746],"details",{},[1643,1644,1645],"summary",{},"Answer",[14,1647,1648,1651],{},[18,1649,1650],{},"The initramfs is missing or doesn't have the storage driver."," \"Unable to mount root fs\" means the kernel booted but can't find\u002Fread the root filesystem — because the driver for your disk controller or filesystem (ext4, LVM, NVMe) is a module that wasn't included in the initramfs.",[14,1653,1654],{},[18,1655,1656],{},"Fix:",[1177,1658,1659,1662],{},[210,1660,1661],{},"Boot an older (working) kernel — GRUB → \"Advanced options\" → select the previous kernel (e.g., 6.8.0-31).",[210,1663,1664],{},"Regenerate the initramfs for the new kernel:",[41,1666,1667],{"language":43},[45,1668,1670],{"className":47,"code":1669,"language":43,"meta":49,"style":49},"sudo update-initramfs -u -k 6.8.0-35-generic\n# Or for all kernels:\nsudo update-initramfs -u -k all\n# RHEL: sudo dracut -f \u002Fboot\u002Finitramfs-6.8.0-35.img 6.8.0-35\n",[23,1671,1672,1685,1690,1702],{"__ignoreMap":49},[53,1673,1674,1676,1678,1680,1682],{"class":55,"line":56},[53,1675,265],{"class":59},[53,1677,1213],{"class":88},[53,1679,1216],{"class":63},[53,1681,1230],{"class":63},[53,1683,1684],{"class":88}," 6.8.0-35-generic\n",[53,1686,1687],{"class":55,"line":71},[53,1688,1689],{"class":67},"# Or for all kernels:\n",[53,1691,1692,1694,1696,1698,1700],{"class":55,"line":82},[53,1693,265],{"class":59},[53,1695,1213],{"class":88},[53,1697,1216],{"class":63},[53,1699,1230],{"class":63},[53,1701,1339],{"class":88},[53,1703,1704],{"class":55,"line":164},[53,1705,1706],{"class":67},"# RHEL: sudo dracut -f \u002Fboot\u002Finitramfs-6.8.0-35.img 6.8.0-35\n",[1177,1708,1709],{"start":82},[210,1710,1711],{},"Verify the initramfs exists and has the needed modules:",[41,1713,1714],{"language":43},[45,1715,1717],{"className":47,"code":1716,"language":43,"meta":49,"style":49},"ls -lh \u002Fboot\u002Finitrd.img-6.8.0-35-generic   # should be > 10 MB\nlsinitramfs \u002Fboot\u002Finitrd.img-6.8.0-35-generic | grep ext4   # has ext4 module?\n",[23,1718,1719,1732],{"__ignoreMap":49},[53,1720,1721,1723,1726,1729],{"class":55,"line":56},[53,1722,1033],{"class":59},[53,1724,1725],{"class":63}," -lh",[53,1727,1728],{"class":88}," \u002Fboot\u002Finitrd.img-6.8.0-35-generic",[53,1730,1731],{"class":67},"   # should be > 10 MB\n",[53,1733,1734,1736,1738,1740,1742,1744],{"class":55,"line":71},[53,1735,1276],{"class":59},[53,1737,1728],{"class":88},[53,1739,356],{"class":355},[53,1741,1052],{"class":59},[53,1743,1297],{"class":88},[53,1745,1300],{"class":67},[1177,1747,1748],{"start":164},[210,1749,1750],{},"Reboot — select the new kernel. It should boot now.",[1752,1753,1754],"style",{},"html pre.shiki code .sIsaT, html code.shiki .sIsaT{--shiki-default:#6F42C1;--shiki-github-dark:#B392F0}html pre.shiki code .snvgF, html code.shiki .snvgF{--shiki-default:#005CC5;--shiki-github-dark:#79B8FF}html pre.shiki code .sdCPZ, html code.shiki .sdCPZ{--shiki-default:#6A737D;--shiki-github-dark:#6A737D}html pre.shiki code .sJ6F3, html code.shiki .sJ6F3{--shiki-default:#032F62;--shiki-github-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .github-dark .shiki span {color: var(--shiki-github-dark);background: var(--shiki-github-dark-bg);font-style: var(--shiki-github-dark-font-style);font-weight: var(--shiki-github-dark-font-weight);text-decoration: var(--shiki-github-dark-text-decoration);}html.github-dark .shiki span {color: var(--shiki-github-dark);background: var(--shiki-github-dark-bg);font-style: var(--shiki-github-dark-font-style);font-weight: var(--shiki-github-dark-font-weight);text-decoration: var(--shiki-github-dark-text-decoration);}html pre.shiki code .ssxIu, html code.shiki .ssxIu{--shiki-default:#24292E;--shiki-github-dark:#E1E4E8}html pre.shiki code .svdQ7, html code.shiki .svdQ7{--shiki-default:#D73A49;--shiki-github-dark:#F97583}",{"title":49,"searchDepth":71,"depth":71,"links":1756},[1757,1758,1762,1770,1772,1773,1777,1781,1782,1783,1784],{"id":38,"depth":71,"text":39},{"id":228,"depth":71,"text":229,"children":1759},[1760,1761],{"id":331,"depth":82,"text":332},{"id":393,"depth":82,"text":394},{"id":452,"depth":71,"text":1763,"children":1764},"Kernel Parameters — sysctl",[1765,1766,1768],{"id":597,"depth":82,"text":598},{"id":701,"depth":82,"text":1767},"Edge Case: sysctl -w Changes Are Temporary",{"id":774,"depth":82,"text":1769},"\u002Fetc\u002Fsysctl.d\u002F Precedence",{"id":796,"depth":71,"text":1771},"\u002Fproc — Kernel & Process Interface",{"id":884,"depth":71,"text":885},{"id":978,"depth":71,"text":979,"children":1774},[1775],{"id":1107,"depth":82,"text":1776},"Edge Case: \u002Fboot Fills Up From Old Kernels",{"id":1166,"depth":71,"text":1778,"children":1779},"initramfs — Early Userspace",[1780],{"id":1303,"depth":82,"text":1304},{"id":1349,"depth":71,"text":1350},{"id":1410,"depth":71,"text":1411},{"id":1524,"depth":71,"text":1525},{"id":1630,"depth":71,"text":1631},"The kernel is the core of Linux — it manages the CPU, memory, devices, filesystems, and processes. This chapter covers kernel versions, loadable modules, kernel parameters (sysctl), \u002Fproc\u002F\u002Fsys interfaces, and kernel upgrades — through the lens of production tuning and troubleshooting.","md",{},"\u002Flinux\u002F13-kernel-and-modules",{"title":5,"description":1785},"linux\u002F13-kernel-and-modules","oarVp-4MrdY1LE7UNROwlCZL-8jlyoWlw5ASX4dAZf0",1789924650077]