ok-1
This commit is contained in:
87
internal/system/sysctl.go
Normal file
87
internal/system/sysctl.go
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user