This commit is contained in:
2026-02-14 05:36:00 +08:00
commit d7cd899983
37 changed files with 4169 additions and 0 deletions

87
internal/system/sysctl.go Normal file
View File

@@ -0,0 +1,87 @@
package system
import (
"bufio"
"fmt"
"os"
"os/exec"
"strings"
"time"
)
// ConfigureSysctl 设置内核参数
// 参数: params - 键值对映射,如 {"net.ipv4.ip_forward": "1"}
// 返回: error - 第一个失败的错误
func ConfigureSysctl(params map[string]string) error {
if len(params) == 0 {
return nil
}
// 首先应用临时配置
for k, v := range params {
cmd := exec.Command("sysctl", "-w", fmt.Sprintf("%s=%s", k, v))
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
return fmt.Errorf("设置 sysctl %s=%s 失败: %v", k, v, err)
}
}
// 持久化配置到 /etc/sysctl.conf 或 /etc/sysctl.d/
return appendToSysctlConf(params)
}
// appendToSysctlConf 将参数写入持久化配置文件
func appendToSysctlConf(params map[string]string) error {
const sysctlFile = "/etc/sysctl.d/99-sunhpc.conf"
// 读取现有配置
existing := make(map[string]bool)
if data, err := os.ReadFile(sysctlFile); err == nil {
scanner := bufio.NewScanner(strings.NewReader(string(data)))
for scanner.Scan() {
line := strings.TrimSpace(scanner.Text())
if line == "" || strings.HasPrefix(line, "#") {
continue
}
parts := strings.SplitN(line, "=", 2)
if len(parts) == 2 {
existing[strings.TrimSpace(parts[0])] = true
}
}
}
// 构建新内容
var content strings.Builder
content.WriteString("# SunHPC 系统优化配置\n")
content.WriteString("# 生成时间: " + time.Now().Format(time.RFC3339) + "\n\n")
for k, v := range params {
// 跳过已存在的配置(避免重复)
if existing[k] {
continue
}
content.WriteString(fmt.Sprintf("%s = %s\n", k, v))
}
// 如果有新配置才写入
if content.Len() > 100 {
if err := os.WriteFile(sysctlFile, []byte(content.String()), 0644); err != nil {
return err
}
// 应用持久化配置
return exec.Command("sysctl", "--system").Run()
}
return nil
}
// GetSysctl 获取当前内核参数值
func GetSysctl(key string) (string, error) {
cmd := exec.Command("sysctl", "-n", key)
output, err := cmd.Output()
if err != nil {
return "", err
}
return strings.TrimSpace(string(output)), nil
}