尽管我没有找到明确的解决方案,但我想分享我尝试过的方法。希望这将为其他有类似问题的人提供灵感。
对我有很大帮助的一件事(当时不可用)是切换到更新的 OS。我正在运行基于 Ubuntu 18.04 的 Armbian,日志现在不那么混乱了。此外,改进了一些小细节。如果你登陆这里并且仍然运行 Armbian Stretch,你应该升级。
频繁崩溃的一个原因可能是由频繁崩溃引起的文件系统损坏:-(。Armbian 安装您的 SD 卡
UUID=<uid> / ext4 defaults,noatime,nodiratime,commit=600,errors=remount-ro 0 1
注意commit=600
,这意味着更改将仅每 10 分钟写入一次。如果您的机器在两者之间崩溃,则文件系统可能会损坏。因此,您可以fsck.ext4
在 SD 卡文件系统上运行。为了彻底解决这个问题,您可以:
- 每次启动时运行 fsck
- 省略提交设置。我的 SD 卡可以很好地处理额外的压力。
我认为为我解决问题的方法是将通过 SATA 连接的外部 HDD 置于睡眠状态。我很惊讶这不会自动发生。现在我将以下部分附加到我的/etc/hdparm.conf
:
/dev/disk/by-uuid/<uid> {
spindown_time = 60
write_cache = off
}
这告诉 hdparm 在 5 分钟不活动后将 HDD 置于待机状态。关闭写缓存是防止文件系统再次损坏的安全措施。一些磁盘在不应该对 BtrFS 写入指令进行重新排序时。
我观察到的一点是,在机器上施加一些负载有助于保持系统的运行。不幸的是,直到某个时间点才如此。但是,如果连接键盘和鼠标或让脚本始终运行有助于重新启动,那么您将有一些工作要做。
我使用以下脚本记录在发生崩溃时可能对我有帮助的信息:
#!/bin/bash
# LICENSE: GPLv3 or later
set -euo pipefail
LOGFILE=/home/mgoerner/error-detection.log
function main() {
parse_cli_args "$@"
while true
do
print_debug_information >>"$LOGFILE" 2>&1
sync
sleep 3m
done
}
function parse_cli_args() {
if [[ $# -eq 1 ]]
then
arg="$1";shift
if [[ "$arg" == "--help" || "$arg" == "-h" ]]
then
print_usage
exit
fi
LOGFILE="$arg"
elif [[ $# -gt 1 ]]
then
echo "Please provide at most one argument!" >&2
exit 1
fi
}
function print_usage() {
cat <<EOF
$0 [LOGFILE]
EOF
}
function print_debug_information() {
echo
date
uptime
dmesg -uT | tail
ip addr show wlxd85d4c97e434
iwlist wlxd85d4c97e434 scan | egrep ESSID
hdparm -acdgkmurC /dev/sda
free
}
main "$@"
我让它在启动后自动启动。将睡眠时间设置在约 10 分钟以下用于让崩溃消失,但现在不再如此。不幸的是,这个脚本产生的错误日志从来没有帮助获得任何洞察力。来自 的各种日志也是如此/var/log/
。但是,这对您来说可能会有所不同。
此外,我怀疑我的WiFi 加密狗不喜欢温暖。我重新使用了一个儿童鞋盒作为外壳,并将加密狗放在封闭的盒子内导致了一些连接问题。
最后但同样重要的是,我在重启后关闭了自动更新。很多时候,崩溃是在一些(神秘的)重启之后直接发生的。关闭自动更新帮助我完全摆脱了这种情况。