diff --git a/system/inputdevices1/inputdevices.go b/system/inputdevices1/inputdevices.go index 8727a17a6..f2955650e 100644 --- a/system/inputdevices1/inputdevices.go +++ b/system/inputdevices1/inputdevices.go @@ -97,7 +97,12 @@ func (m *InputDevices) init() { logger.Warning(err) return } - err = m.touchpad.setTouchpadEnable(v.Value().(bool)) + enabled := v.Value().(bool) + // 启动恢复:直接根据 dconfig 重建 udev 规则文件。 + // 不调用 setTouchpadEnable,因为 newTouchpad 已将 Enable 设为 dconfig 值, + // setPropEnable 会判定 changed=false 从而跳过 udev 写入, + // 导致强制关机后 udev 规则文件丢失但无法重建。 + err = m.touchpad.setTouchpadEnableViaUdev(enabled) if err != nil { logger.Warning(err) } diff --git a/system/inputdevices1/touchpad.go b/system/inputdevices1/touchpad.go index 681f08598..172dc5c91 100644 --- a/system/inputdevices1/touchpad.go +++ b/system/inputdevices1/touchpad.go @@ -154,8 +154,24 @@ func (t *Touchpad) setTouchpadEnableViaUdev(enabled bool) error { return nil } - // 创建或覆盖 udev 规则文件 - if err := os.WriteFile(udevRuleFile, []byte(udevRuleContent), 0644); err != nil { + // 创建或覆盖 udev 规则文件,使用 fsync 确保落盘, + // 防止强制关机(断电)时 page cache 丢失导致规则文件丢失 + f, err := os.Create(udevRuleFile) + if err != nil { + return err + } + _, err = f.Write([]byte(udevRuleContent)) + if err != nil { + f.Close() + return err + } + err = f.Sync() + if err != nil { + f.Close() + return err + } + err = f.Close() + if err != nil { return err } logger.Info("created udev rule file:", udevRuleFile)