88 lines
2.1 KiB
Go
88 lines
2.1 KiB
Go
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
|
|
}
|