仅6MB!为Gunyah编译轻量Linux内核 #2
Sui-KP
started this conversation in
Tutorial 教程
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
第二版:













⚠️ 必选DMA Restricted Pool,该选项可防止不完全可信的硬件乱动内核内存,如果你没有勾选:






[GGLK]仅6MB!为Gunyah编译轻量Linux内核 来自 得道逍遥 - 酷安 (2026_5_17 14:09:18).html
以QEMU-Gunyah启动Debian 14 No Cloud Arm64 Daily为例
可能不适用于其他虚拟化平台
1.准备
先去https://kernel.org 拜访下Tux😋😋😋
mainline为主线版本,当前7.1-rc3
长按复制tarball链接https://git.kernel.org/torvalds/t/linux-7.1-rc3.tar.gz
回到你的Linux环境,输入并回车执行下列命令(可能需要sudo)
apt update
apt install -y bc bison build-essential ccache clang-22 dwarves findutils flex gcc-aarch64-linux-gnu gzip libelf-dev libncurses5-dev libssl-dev lld-22 llvm-22 openssl python3 wget zstd
就绪后执行命令
wget https://git.kernel.org/torvalds/t/linux-7.1-rc3.tar.gz
tar -xvpzf ./linux-7.1-rc3.tar.gz -C . --numeric-owner
cd linux-7.1-rc3
2.精简+勾勾乐
2.1 主页
先执行
make ARCH=arm64 LLVM=-22 CROSS_COMPILE=aarch64-linux-gnu menuconfig
来到主页
👻硬件信息等已被系统提供,勾掉ACPI
👻无需嵌套虚拟化,勾掉Virtualization
👻动态加载模块不如静态编译进去省事,勾掉Enable loadable module support
👻不需要安全性的,不需要加密算法的,勾掉Cryptographic API
✅Enable the block layer用于Virtio BLK设备
✅顾名思义,Networking support代表网络支持
2.2 General setup
手指/鼠标上下滑/键盘上下键导航到General setup回车
👻即使当前硬件环境下无法加载某些驱动,也强制进行编译?非测试勾掉Compile also drivers which will not load
👻把所有的编译器警告(WARN)都当成错误处理(ERR)?无改动则鸡肋,有改动非测试勾掉Compile the kernel with warnings as errors
👻不想加版本后缀的勾掉Local version - append to kernel release
👻不注重内容回溯的勾掉Automatically append version information...
👻不区分代码完全一致但在不同环境下编译出的两个二进制文件的勾掉Build ID Salt
🤔Default init path代表内核启动后执行的第一个程序路径,若你启动标准Linux无需勾选,若你启动的Linux比较特殊,可能需要回车改为/bin/sh等再回车暂存修改
🤔Default hostname代表默认主机名,有啥用呢?看下图👇
内核Default hostname配置留空则默认主机名自动变为localhost
假设我配置Default hostname为als,那下面的localhost login会变为als login(Debian可以,Ubuntu某些版本自带主机名,会覆盖内核配置的默认主机名
👻System V IPC作为经典的进程间通信机制,老旧软件基础库等可能需要,虽然很多AI建议勾选,但一般勾掉也无所谓(反正个人目前还没遇到勾掉它导致出现的问题)
👻POSIX Message Queues代表POSIX标准的进程间消息队列,为内核轻量可勾掉
👻General notification queue代表通用内核到用户态通知机制,允许内核将事件直接通知程序,为内核轻量可勾掉
🤔Enable process_vm_readv/writev syscalls代表允许一个进程直接读写另一个进程的虚拟内存空间,建议勾选,为内核轻量可勾掉
👻Auditing support代表内核审计子系统,可勾掉
🤔IRQ subsystem代表中断处理子系统,非专业默认即可
🤔Timers subsystem代表内核定时器,非专业默认即可
🤔BPF subsystem代表伯克利数据包过滤器扩展,建议勾选,为内核轻量可勾掉
🤔Preemption Model代表抢占模型,一般默认Low-Latency Desktop即可
🤔Fully Preemptible Kernel (Real-Time)代表完全抢占式(硬实时)内核,非必要可勾掉
🤔Preemption behaviour defined on boot代表在启动参数中动态选择抢占模式,默认即可
🤔CPU/Task time and stats accounting代表统计每个进程消耗了多少 CPU 时间,为内核轻量可勾掉
👻CPU isolation代表将某些CPU核心隔离并不参与通用调度,然而理想很美好,现实很骨感,目前Gunyah存在一核有难,七核围观的场面,可勾掉
🤔RCU Subsystem代表Read-Copy-Update(读-复制-更新)锁机制,建议勾选,为内核轻量可勾掉
👻Kernel .config support,勾选后你可在虚拟机内执行zcat /proc/config.gz查看内核配置信息,可勾掉
🤔Enable kernel headers through /sys/kernel/kheaders.tar.xz代表在内核里塞入头文件压缩包,方便在机器上直接编译驱动,不需要额外下载内核源码包,为内核轻量可勾掉
👻Kernel log buffer size代表内核日志缓冲区大小,也就是dmesg肚子容量😅,CPU kernel log buffer size contribution代表根据CPU核心数量自动增加日志缓冲区,为内核轻量千万调小(CONFIG_LOG_BUF_SHIFT=12-25,CONFIG_LOG_CPU_MAX_BUF_SHIFT=0-21),实测静态分配与内存对齐等会导致Image指数级增长,两值最大较最小Image体积大110MB+
🤔Scheduler features代表调度器高级特性,非专业默认即可
✅Control Group support,小名Cgroups,没它systemd会直接[!!!!!!]罢工😂但是里面的子项可全部勾掉
🤔Namespaces support代表命名空间支持,可勾掉
👻Checkpoint/restore support代表冷冻进程并保存到磁盘,以后再恢复运行,可勾掉
🤔Automatic process group scheduling代表自动按用户会话组调度进程,建议勾选,为内核轻量可勾掉
👻Kernel->user space relay support,可勾掉
👻Initial RAM filesystem and RAM disk代表支持内存盘,确实很重要,但要考虑实际对吧😂,直接启动磁盘不预先加载驱动的可勾掉,如果勾掉了它则顺手把Boot config support也勾掉
🤔Length to try to wrap the cmdline代表启动参数(cmdline)在日志中显示的换行长度,默认即可
✅Compiler optimization level回车选择Optimize for size(-Os),节省体积相当可观
👻Sysfs syscall support,可勾掉
🤔Configure standard kernel features代表展开更多微调选项,可参考下图
👻Kernel Performance Events And Counters可配合perf工具监测系统性能,Profiling support同样与性能分析有关,为内核轻量可勾掉子项
👻Kexec and crash features代表内核快速热启动和崩溃转储,类似于
"你的电脑遇到问题,需要重新启动
我们只收集某些错误信息,然后为你重新启动"
可勾掉子项
👻Live Update and Kexec HandOver代表在不完全重启硬件的情况下,把旧内核的状态传递给新内核,可勾掉
2.3 Platform selection
👻虚拟机是真实硬件吗?全部勾掉
2.4 Kernel Features
👻选择ARM errata workarounds回车,把里面的子项全部勾掉
🤔Page size默认4KB即可
🤔Virtual address space size与Physical address space size默认即可
🤔Endianness (Build little-endian kernel)默认小端序即可
🤔Maximum number of CPUs代表内核支持的最大CPU核心数,默认是4,根据实际需要更改
👻Support for hot-pluggable CPUs代表支持CPU热插拔,非调试想勾选的先告诉我手机能不能热插拔CPU
👻NUMA Memory Allocation and Scheduler Support代表非一致存储访问结构支持,勾掉
🤔Timer frequency代表内核时钟频率,理论HZ值越大响应越快,但鱼和熊掌不可兼得,响应快的同时功耗也会增长(不过无所谓,实测功耗差异很小)
🤔Enable paravirtualization code代表让内核知道自己运行在虚拟机里从而直接调用宿主机的指令来提速,就是半虚拟化,可以试试😄,但为内核轻量可勾掉
🤔Paravirtual steal time accounting代表统计"被偷走的时间",为内核轻量可勾掉
👻Xen guest support on ARM64代表支持在Xen虚拟机环境下运行,Gunyah姓G不姓X,勾掉
👻Unmap kernel when running in userspace代表内核页表隔离,为了修复臭名昭著的Meltdown(熔断)漏洞,Mitigate Spectre style attacks against branch history是针对 Spectre(幽灵)变体漏洞的补丁,不在乎针对CPU硬件漏洞的安全攻击的可勾掉
👻Emulate Privileged Access Never代表模拟"禁止内核访问用户态内存"的安全特性,如果你的CPU硬件本身不支持 PAN 特性,内核可以用软件方案模拟,防止某些内核漏洞被利用.同样的你在乎这些边际效用你就勾选,不在乎就勾掉
✅Enable the tagged user addresses syscall ABI代表允许用户态地址带有标签,用于内存安全检测,必选不然虚拟机内会出很多诡异问题
👻Kernel support for 32-bit EL0,就是在64位内核上运行32位程序,非必要可勾掉
✅ARMvX.x architectural features默认即可
✅ARM Scalable Vector Extension support代表支持ARM的"可伸缩矢量扩展",必选否则某些软件会报错Illegal instruction(非法指令)
👻ARM Scalable Matrix Extension support代表支持ARM的"可伸缩矩阵扩展",为内核轻量可勾掉
👻Support for NMI-like interrupts是一种类不可屏蔽中断(NMI),内核通常用它来处理硬件紧急故障,非调试可勾掉
🤔Build a relocatable kernel image代表生成一个"可重定位"的内核镜像.开启后,内核不再死板地要求必须加载到内存的某个固定物理地址上,而是可以在内存的任何地方启动.有用的,不过我为内核轻量勾掉了
👻Randomize the address of the kernel image代表内核地址空间布局随机化,若不考虑安全为内核轻量可勾掉
2.5 Boot options
参考下图即可
🤔Default kernel command string代表预设内核启动参数,通常留空,若不想每次启动都写-append后面那串可以回车硬编码命令到这里
🤔UEFI runtime support代表支持UEFI运行时服务,虽然勾掉也不影响kernel直接启动,但建议勾选
🤔Install compressed image by default代表默认安装压缩后的镜像.这个选项悉听尊便,本教程说的6MB指的是原始Image
🤔Enable support for SMBIOS,虽然勾掉不影响启动,但建议勾选
2.6 Power management options
✅Suspend to RAM and standby代表支持挂起到内存,某些系统长时间待机会休眠,你把它勾掉很可能系统直接睡死了,无法唤醒,只能重启
👻Skip kernel's sys_sync() on suspend代表跳过磁盘同步直接睡眠,你要是觉得数据不重要因睡眠掉电丢失也无所谓可以勾选😅
👻Opportunistic sleep通俗来讲就是让虚拟机内系统生怕自己少睡一秒钟,没事干就睡眠,其实有用但也没大用,想勾选就勾选吧
👻Userspace opportunistic sleep代表允许用户态程序控制"机会性睡眠",User space wakeup sources interface代表用户空间唤醒源接口,防止任务还没完事系统就打瞌睡,为内核轻量可勾掉
✅Device power management core functionality代表设备电源管理核心逻辑,勾选Suspend to RAM and standby后它就会被强制勾选
👻Power Management Debug Support用于虚拟机休眠后起不来了的关键时刻查看相关日志,排查问题,为内核轻量可勾掉
👻Enable workqueue power-efficient mode by default就是任务队列的省电模式,为内核轻量可勾掉
2.7 CPU Power Management
🤔该菜单所有子项默认即可
2.8 General architecture-dependent options
👻SMT (Hyperthreading) scheduler support代表超线程调度支持,非必要可勾掉,不影响启动
🤔Cluster scheduler support代表集群调度支持,让相关任务共享L2缓存,提升性能,建议勾选,为内核轻量可勾掉
🤔Multi-Core Cache (MC) scheduler support代表多核缓存调度优化,利用CPU的多级缓存层级来优化进程分配,建议勾选,为内核轻量可勾掉
👻Kprobes用于运行时探查内核函数调用情况,非调试可勾掉
✅Optimize very unlikely/likely branches代表优化极小概率/大概率的分支预测,提升性能,一般会被强制勾选
👻Enable seccomp代表安全计算模式,不打算跑Docker等涉及限制进程系统调用软件的可勾掉
👻Stack Protector / Shadow Call Stack,这两个都与防御"栈溢出"攻击有关,为内核轻量可勾掉
🤔Link Time Optimization一定要选None,选其他的Image体积都比None大
🤔Number of bits to use for ASLR,MMU page size,Use a virtually-mapped stack(虚拟映射栈)默认即可
👻Support for randomizing kernel stack offset代表随机化内核栈偏移,同样是为了安全,为内核轻量可勾掉
2.9 Enable the block layer
✅顶层菜单必须勾选
✅子菜单Partition Types勾选Advanced partition selection后,勾选PC BIOS (MSDOS partition tables) support与EFI GUID Partition support,其他子项均可勾掉
👻IO Schedulers菜单子项为内核轻量可全部勾掉
👻其他Legacy autoloading support到Enable inline encryption support为内核轻量均可勾掉
2.10 Executable file formats
✅Kernel support for ELF binaries代表支持ELF格式的二进制文件,必选,否则系统无法运行任何软件(包括但不限于cd,ls等任何Linux程序)
✅Kernel support for scripts starting with #!代表支持以 #! 开头的脚本.经常写脚本的小伙伴都知道很多脚本第一行是#!/bin/sh,#!/bin/bash等,勾选它就可以./script.sh运行脚本而不是sh script.sh,提升兼容性与易用性,必选
👻Kernel support for MISC binaries代表支持混合/杂项二进制格式,勾选它你就可以通过binfmt_misc告诉内核:当你遇到Windows的exe时,自动调用Wine运行;或者当你遇到x86的程序时,自动调用qemu-user来翻译运行,为内核轻量可勾掉
👻Enable core dump support用于程序崩溃时内核会把那一刻的内存状态吐出来存成一个core文件,方便程序员用gdb调试(话说gdb真好用,能具体到运行时的代码👍推荐)非调试可勾掉
2.11 Memory Management options
✅Allow for memory compaction代表允许紧缩内存,当系统运行久了,大块的连续内存会变少.勾选后,内核可以把散乱的小块内存“拼”成大块,建议勾选
🤔Transparent Hugepage Support,小名THP,代表透明大页支持,用2MB或更大的页代替传统的4KB页,一定有用,但对于Gunyah勾选后虚拟机系统是否稳定尚不明确
🤔Contiguous Memory Allocator,小名CMA,代表连续内存分配器,可预留一大块连续内存给特定硬件,但对于Gunyah勾选后虚拟机系统是否稳定尚不明确
🤔Page Block Order Upper Limit代表内核单次能分配出的最大连续内存块大小,我这里填写了9,就是2的9次幂,代表2MB
👻Support DMA zone / DMA32 zone,支持传统的直接内存访问区域.为内核轻量可勾掉
👻Enable VM event counters for /proc/vmstat,在 /proc/vmstat 中显示内存统计信息.若发现系统莫名卡顿,可以通过这个文件查看是不是由于频繁的缺页中断造成的.非调试可勾掉
✅Enable memfd_create() system call,图形渲染数据交换的基础,非常重要,必选
✅Multi-Gen LRU,相比传统的LRU算法更聪明,能更精准地决定该踢走哪些内存,降低Out of memory几率,提升性能,建议勾选并连带勾选Enable by default
其他凡未提到者有数值则默认,有选项则根据需要勾勾乐(我为内核轻量没提到者都勾掉了)
2.12 Networking support
✅勾选顶层菜单Networking support
✅进入子菜单,除Networking options与被强制勾选者其余根据需要勾选或为内核轻量可全部勾掉
✅进入Networking options菜单,勾选Packet socket,Unix domain sockets,TCP/IP networking等子菜单,孙菜单为内核轻量可全部勾掉
🤔INET: Source port perturbation table size代表源端口扰动表大小,数值默认即可,数值大些更安全,数值为0也可以(让内核根据内存情况自动计算)
✅INET: socket monitoring interface代表套接字监控接口,是ss,netstat,lsof等工具读取网络状态信息的来源,建议勾选
✅Use percpu variables to maintain network device stats代表使用"每个 CPU 独立变量"来维护网卡统计数据,避免多核锁竞争,减少高网络负载下CPU消耗,建议勾选
✅Maximum number of fragments per skb_shared_info控制一个网络包可以被拆成多少块,默认即可,最大值为45
✅Receive packet steering代表接受包转向,它可以把接收到的包分发给其他核心处理,综合提升网络吞吐量,建议勾选
其他凡未提到者根据需要勾勾乐,为内核轻量可全部勾掉
2.13 Device Drivers
我们的目标是开启输入,显示等设备
✅必选PCI support,PCI support菜单内默认即可
✅一般已被强制勾选Device Tree and Open Firmware support
✅必选Block devices顶层菜单,进入Block devices菜单勾选Virtio block driver
✅必选Network device support,进入Network device support菜单勾选Network core driver support与Virtio network driver
✅进入Input device support菜单
勾选Event interface,Keyboards与Mice
进入Keyboards菜单,勾选AT keyboard
Mice菜单内默认即可
进入Hardware I/O ports菜单,勾选Serial I/O support与Serial port line discipline,这样就可以在串口进行基本交互
✅进入Character devices(字符设备)菜单
必选Enable TTY,否则内核无任何交互界面
可选Virtual terminal(虚拟终端),该选项允许一个物理屏幕模拟出多个独立的终端窗口,这样就可在VNC等画面里看到终端输出而不局限于串口,若勾选则连带勾选Enable character translations in console(控制台字符转换支持),Support for console on virtual terminal(这样内核日志就可在虚拟终端查看了)与Support for binding and unbinding console drivers(一般已被强制勾选)
必选Unix98 PTY support,一切伪终端的基础
✅进入Graphics support菜单
必选Direct Rendering Manager菜单
进入Direct Rendering Manager菜单,勾选Virtio GPU driver与Virtio GPU driver modesetting support
进入Frame buffer Devices菜单,勾选Support for frame buffer device drivers,回车把里面的EFI-based Framebuffer Support勾选了
必选Enable firmware EDID(显示器的身份证)
可选Bootup logo,反正我怎么调也没看到那只Tux🐧
✅勾选HID bus support,进入HID bus support菜单
勾选HID bus core support,Generic HID driver与I2C HID support(内部菜单默认即可)
✅勾选Virtio drivers,进入Virtio drivers菜单
勾选PCI driver for virtio devices与Virtio input driver
其他凡未提到者根据需要勾勾乐
2.14 File systems
✅必选The Extended 4 (ext4) filesystem,不然内核不认识Linux磁盘文件系统
✅勾选Enable POSIX file locking API与Inotify support for userspace
✅进入DOS/FAT/EXFAT/NT Filesystems菜单,确保状态如下
[*] VFAT (Windows-95) fs support (437) Default codepage for FAT
(iso8859-1) Default iocharset for FAT
使其支持识别磁盘内的ESP分区文件系统
其他凡未提到者根据需要勾勾乐
2.15 Security options,Cryptographic API
👻为内核轻量可全部勾掉
2.16 Library routines
😄感谢您能看到这里,这一页菜单看似简单实则危机四伏,很多人做出来的内核结果Gunyah启动不了,主要原因就在这里
✅勾选必要算法Enable optimized CRC implementations,XZ decompression support与ARM64 BCJ filter decoder
2.17 Kernel hacking
👻关注下printk and dmesg options,调整Default console loglevel,quiet console loglevel,Default message log level
😄这里给大家看下15,15,7和1,1,1的区别
3.编译
依次执行
make ARCH=arm64 LLVM=-22 CROSS_COMPILE=aarch64-linux-gnu olddefconfig
make ARCH=arm64 LLVM=-22 CROSS_COMPILE=aarch64-linux-gnu- CC="ccache clang-22" -j$(nproc) Image
编译完成后去arch/arm64/boot/取Image
4.😄我提供两个配置,一个是无头版,一个是标准版(本教程以标准版为例)
简称为GGLK也很合理😋👍
https://1846806371.share.123pan.cn/123pan/WuTjTd-ozFNd
5.展示
设备 一加 Ace 5 Pro
系统 ColorOS 16.0.0.204
Sui @longhanlop
2026.5.16 13:20
Beta Was this translation helpful? Give feedback.
All reactions