AI 摘要

阿里云轻量服务器因crashkernel参数配置导致1G内存仅剩700M可用。本文解析了Ubuntu系统通过GRUB调整crashkernel分段策略的方法,通过修改内存分配区间(如将1G-4G:192M调整为0M-8G:0M),有效释放被预留的192M内存。详细步骤涵盖配置语法修改、GRUB更新及系统重启操作,并强调需根据实际内存容量平衡kdump功能与系统可用性。

前言

阿里云、腾讯云等云厂商近期都陆续推出了200Mbps峰值带宽且不限流量的轻量服务器,如图所示;尽管其价格略高于同配的30M/3M(海外/大陆),但如此高的带宽对于流量不高的自建站和图床而言,完全可以省下配置CDN的精力和金钱开销,属实福音。

本着尝鲜的想法,我自己买了一个34元/月的2C1G版本来体验一下。阿里云的Ubuntu镜像设置了crashkernel参数以配置内核崩溃转储(kernel crash dump)的大小,使得1G内存中实际可用量大约只有700M

只是随便玩玩的话内核崩溃转储并非必须,可以酌情考虑关闭。Ubuntu的crashkernel参数是通过GRUB引导加载程序传递给内核的。以下是修改它的具体步骤:

编辑GRUB配置文件

打开终端并使用管理员权限编辑GRUB配置文件,通常是/etc/default/grub。

sudo nano /etc/default/grub

修改GRUB_CMDLINE_LINUX_DEFAULT行:
在该行中找到crashkernel=参数进行修改。如果没有这个参数,你可以手动添加它。例如,设置默认128MB的内存用于崩溃转储:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash crashkernel=128M"

128M只是一个示例,具体的值需要根据你的系统内存大小和实际需求来设定。例如,2025年2月在阿里云购买的轻量服务器,其中提供的Ubuntu 24.04系统中的相关配置如下:

root@xxx-hk-2:~# cat /etc/default/grub
...
GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=1
GRUB_DISTRIBUTOR=`( . /etc/os-release; echo ${NAME:-Ubuntu} ) 2>/dev/null || echo Ubuntu`
GRUB_CMDLINE_LINUX_DEFAULT=""
GRUB_CMDLINE_LINUX="vga=792 console=tty0 console=ttyS0,115200n8 net.ifnames=0 noibrs iommu=pt crashkernel=0M-1G:0M,1G-4G:192M,4G-128G:384M,128G-:512M nvme_core.io_timeout=4294967295 nvme_core.admin_timeout=4294967295"
...

注意到0M-1G:0M,1G-4G:192M,实测这里如果有刚好1G内存,会有192M内存被吃掉,可以修改为8G以下都不开启,

GRUB_CMDLINE_LINUX_DEFAULT=""
GRUB_CMDLINE_LINUX="vga=792 console=tty0 console=ttyS0,115200n8 net.ifnames=0 noibrs iommu=pt crashkernel=0M-8G:0M,8G-128G:384M,128G-:512M nvme_core.io_timeout=4294967295 nvme_core.admin_timeout=4294967295"

完整配置如下:

更新GRUB

修改完成后,保存退出编辑器,并运行以下命令更新GRUB配置:

sudo update-grub

重启系统

更新GRUB后,为了使新的设置生效,需要重启系统:

sudo reboot

完成上述步骤后,系统将按照新的crashkernel参数设置运行,上述配置将影响内核崩溃转储的行为。

如果kdump对你而言是刚需,应确保你提供的crashkernel值足够大以包含可能的崩溃信息,但也不要过大以免影响系统的正常运行内存。