-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcompile_kernel.sh
More file actions
executable file
·104 lines (87 loc) · 3.55 KB
/
compile_kernel.sh
File metadata and controls
executable file
·104 lines (87 loc) · 3.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#!/bin/bash
# ==============================================================================
# The "Spoon-Feed" Kernel Builder
# Author: Linus Torvalds (Spirit)
# Purpose: Compiles the kernel, then PRINTS the install command for the human.
# ==============================================================================
set -e # 遇到错误立即停止,绝不含糊
# 颜色定义
GREEN='\033[1;32m'
YELLOW='\033[1;33m'
RED='\033[1;31m'
CYAN='\033[1;36m'
NC='\033[0m'
# 1. 位置检查
# ------------------------------------------------------------------------------
if [ -z "$1" ]; then
echo "Usage: $0 <path_to_kernel_source>"
exit 1
fi
SRC_DIR=$(realpath "$1")
if [ ! -f "$SRC_DIR/Makefile" ]; then
echo -e "${RED}[错误]${NC} 这不是内核源码目录!"
exit 1
fi
cd "$SRC_DIR"
echo -e "${CYAN}[INFO]${NC} 进入源码目录: $SRC_DIR"
# 2. 必须有 .config
if [ ! -f ".config" ]; then
echo -e "${RED}[错误]${NC} 找不到 .config。请先配置好内核。"
exit 1
fi
# 3. 强制版本隔离 (LOCALVERSION)
# ------------------------------------------------------------------------------
echo ""
echo -e "${YELLOW}=== 版本隔离设置 ===${NC}"
echo "输入一个后缀来区分这次构建 (例如: -cxl-test-v1)。"
read -p "Suffix: " CUSTOM_SUFFIX
if [ -z "$CUSTOM_SUFFIX" ]; then
echo -e "${RED}[错误]${NC} 后缀不能为空。退出。"
exit 1
fi
# 确保以 - 开头
if [[ "$CUSTOM_SUFFIX" != -* ]]; then
CUSTOM_SUFFIX="-${CUSTOM_SUFFIX}"
fi
# 4. 预计算内核版本
# ------------------------------------------------------------------------------
echo -e "${CYAN}[INFO]${NC} 计算最终版本号..."
KERNEL_RELEASE=$(make -s LOCALVERSION="$CUSTOM_SUFFIX" kernelrelease)
TARGET_MOD_DIR="/lib/modules/${KERNEL_RELEASE}"
echo -e "目标内核版本: ${GREEN}${KERNEL_RELEASE}${NC}"
echo -e "目标模块路径: ${YELLOW}${TARGET_MOD_DIR}${NC}"
# 5. 执行编译 (无需 root)
# ------------------------------------------------------------------------------
JOBS=$(nproc)
echo ""
echo -e "${CYAN}[INFO]${NC} 开始编译 (Make -j$JOBS)... 这需要一点时间。"
echo "在此期间,不要去动源码文件。"
# 只要这里不加 sudo,生成的文件所有权就是你的,很安全
if make -j"$JOBS" LOCALVERSION="$CUSTOM_SUFFIX"; then
echo ""
echo -e "${GREEN}=== 编译成功 ===${NC}"
else
echo ""
echo -e "${RED}[失败]${NC} 编译出错。检查上面的日志。"
exit 1
fi
# 6. 生成“一行流”安装命令
# ------------------------------------------------------------------------------
# 这是一个极其复杂的命令字符串,我帮你拼好了。
# 它包含了:清理旧目录 -> 安装模块 -> 安装内核 -> 刷新GRUB(隐含)
INSTALL_CMD="sudo rm -rf ${TARGET_MOD_DIR} && sudo make LOCALVERSION=${CUSTOM_SUFFIX} modules_install && sudo make LOCALVERSION=${CUSTOM_SUFFIX} install"
echo ""
echo "---------------------------------------------------------------------"
echo -e "${YELLOW}准备就绪。${NC}"
echo "编译已完成,但我没有权限安装,也不会向你要密码。"
echo "请复制下面这行命令,在当前终端执行它:"
echo "---------------------------------------------------------------------"
echo ""
echo -e "${GREEN}${INSTALL_CMD}${NC}"
echo ""
echo "---------------------------------------------------------------------"
echo "这行命令会:"
echo "1. 彻底删除 ${TARGET_MOD_DIR} (防止混合二进制)"
echo "2. 安装新模块"
echo "3. 安装新内核并更新 GRUB"
echo "---------------------------------------------------------------------"