收起左侧

给华芸 / 爱速特 AS6602T 安装飞牛系统

14
回复
721
查看
[ 复制链接 ]

0

主题

11

回帖

0

牛值

江湖小虾

2025-3-24 00:43:35 显示全部楼层 阅读模式

[i=s] 本帖最后由 鼎坐为飞泉 于 2025-3-24 00:46 编辑 [/i]<br /> <br />

实际上这些有完整 BIOS 的 x86 成品 NAS 都是完整的个人电脑,安装 x86 操作系统从原理到实践上都没有任何区别。写这个帖子主要是记录操作过程而不是作为教程。但如果看完帖子能给其他人启发那就更好了。

在其他论坛上发了也在飞牛本家论坛上发一份,过程有些啰嗦还请见谅。

〇、起因

华芸 AS6602 是一台搭载了 J4125 处理器的双 2.5 盘位 + 双 M.2 盘位 + 双 2.5G 接口的品牌 NAS。具体的拆解过程与介绍可以看 KoolShare 论坛的文章:ASUS 华硕 AS6602T 双盘位双2.5G NAS 开箱拆解评测

我挺喜欢这台机的工业设计风格的。加上硬件规格还说得过去,所以这台机我一直留着没有出二手。而软件上,这台机使用了华芸自己研制的 Asustor Data Manager(ADM)操作系统。这个系统吧只能说中规中矩,算不上好用,也说不上缺陷。有兴趣的朋友可以到 ADM - 在线体验 这个网页体验华芸提供的在线 demo。

因为是正常的 x86 机型,所以一定可以装上其他操作系统。出于好玩就装个别的系统看看。

一、准备工作

安装操作系统的第一步需要准备安装界质。本文以飞牛OS为例(我只是想选一个 Web 后台好看一点的 Debian)。在飞牛 OS 的官方网站获获取 ISO 镜像,然后通过 rufus(或者任何用起来顺手的写盘软件)将镜像写入到大小足够 U 盘里。

image.png

写好盘之后将安装盘插入到设备的 USB 口里,同时将 HDMI 接口连接到显示器,为了方便操作还可以再连接一把键盘和以太网。设备内部还需要准备一块硬盘用来安装操作系统。这里我直接往 3.5 盘位上塞了一块中古 HDD 作为本次折腾的系统盘。

一〇、安装过程

2.1 修改 BIOS 启动项

设备内部有一块 8G EMMC,上面有保存原厂系统的引导。为了安装和运行我们想要的操作系统,需要对启动项进行修改。

连接好以上操作之后,通电打开设备。根据屏幕上给出的提示,按 ESC 键进入启动选项

image.png

进入启动选项之后,再选择 Setup Utility 进入 BIOS 选单

image.png

BIOS 的界面如下图所示

通过方向键切换光标,打开 Boot 菜单下的 Boot Type Order 选项

在这个选单下,通过 - 减号键可以将光标选择的启动项下调优先级。我将 eMMC 的优先级下调到最低,同时将 USB 启动项调到最高。这样当安装 U 盘插入的时候从 U 盘启动,没有插入安装 U 盘的时候将会从硬盘位上安装有系统的硬盘启动。如果以后想恢复原厂系统,只需要把 eMMC 启动项改回来。

完成启动项修改后,我的启动项列表 be like:

最后,按 F10 保存修改并退出 BIOS。

保存退出 BIOS 后,设备会自动重新启动。

2.2 系统安装

于是我们的系统理所当然地从 U 盘进入了飞牛 OS 的安装过程

什么都不用动会自动进入图形安装界面,在这里我选择把系统安装在我古早的 500G HDD 上

根据我自己的需要,我禁用了 swap。

等待系统安装完成,

数分钟后,系统安装好了

我没有调整网卡的设置,直接下一步

再次确定,系统会重启,这时候可以拔 U 盘了。

2.3 系统初始化

顺理成章地,系统启动了刚刚安装好的飞牛OS。

完成启动之后,根据屏幕上的 URL 进入 Web 界面对系统进行初始化

进入浏览器打开对应的页面

简单填一下

至此系统安装就算完成了

2.4 简单初始化一个存储空间

顺着安装工具的提示,我选择创建存储空间

在这里能看到 3 个存储空间,其中第一个硬盘是系统内置的 eMMC,上面放着原系统,第二个硬盘是我放在 m.2 盘位上的傲腾。这两块硬盘都存着我原厂系统里的一些数据。所以我暂时不想动它们。我直接选择第三个硬盘创建存储空间

单盘没什么可选的直接 Basic 完事了。

我随便测试了一下存储空间的上传和下载,使用起来都挺正常的,就不一一放图了

一一、后续工作

尽管飞牛OS的安装到这一步就已经结束了,但对于这款设备仍有一些值得一做的后续工作。

3.1 备份原厂系统

刚刚初始化硬盘的时候注意到在安装阶段看不到的 eMMC 在系统安装完成之后是可以被正常访问的。上面存放着原厂系统的引导。尽管不主动去操作 eMMC 那么在它上面的数据发生不了什么事情,但难免会有意外情况的发生。如果 eMMC 上的原厂系统被删掉了,倒是可以联系华芸的支持服务,可以要到恢复用的镜像。但这样的操作始终比较麻烦。为了更周全的考虑,还是给原厂系统备份一下比较好。

在设置里打开 SSH 开关

使用任何用得顺手的 SSH 客户端连接到设备

在 2.4 里我创建了一个存储空间,我直接 cd 到存储空间的目录再操作

SillPlain@as6602-fnos:/$ cd /vol1/1000/
SillPlain@as6602-fnos:/vol1/1000$

随后执行 sudo dd if=/dev/mmcblk0 | gzip > disk.img.gz,我个人习惯再加上 status=progress 看执行进度

SillPlain@as6602-fnos:/vol1/1000$ sudo dd if=/dev/mmcblk0 | gzip > disk.img.gz
7755629056 bytes (7.8 GB, 7.2 GiB) copied, 94 s, 82.5 MB/s
15269888+0 records in
15269888+0 records out
7818182656 bytes (7.8 GB, 7.3 GiB) copied, 94.5773 s, 82.7 MB/s
SillPlain@as6602-fnos:/vol1/1000$

很快就执行好了,这时候去 Web 界面看存储空间里有刚刚 dump 下来的镜像文件

保存好这个文件,万一哪天需要恢复 eMMC 上的系统就需要把它再写回到 eMMC 上。

恢复风扇转速控制与控制前面板指示灯

华芸采用了定制的 SuperIO 芯片,这导致 ADM 以外的系统都无法读取与控制风扇转速,也不能控制前面板上的几个 LED 灯。我的前面板上绿灯在不断闪烁,这很烦人。同时作为一个指示灯爱好者我也希望可以恢复前面板灯指示系统状态的功能。

好在 GitHub 上有开源项目 asustor-platform-driver 实现了这块芯片(以及好几款华芸设备)的驱动,在此感谢各位开源作者的贡献。

首先我们把项目拉到设备上,并打开拉下来的源码目录

SillPlain@as6602-fnos:/vol1/1000$ git clone https://github.com/mafredri/asustor-platform-driver.git
Cloning into 'asustor-platform-driver'...
remote: Enumerating objects: 190, done.
remote: Counting objects: 100% (36/36), done.
remote: Compressing objects: 100% (18/18), done.
remote: Total 190 (delta 27), reused 18 (delta 18), pack-reused 154 (from 2)
Receiving objects: 100% (190/190), 123.12 KiB | 1.09 MiB/s, done.
Resolving deltas: 100% (113/113), done.
SillPlain@as6602-fnos:/vol1/1000$ cd asustor-platform-driver/
SillPlain@as6602-fnos:/vol1/1000/asustor-platform-driver$

阅读文档,直接运行 make 命令,报告了这样一个错误

SillPlain@as6602-fnos:/vol1/1000/asustor-platform-driver$ make
make[1]: *** /lib/modules/6.6.38-trim/build: No such file or directory.  Stop.
make: *** [Makefile:24: modules] Error 2
SillPlain@as6602-fnos:/vol1/1000/asustor-platform-driver$

一看 6.6.38-trim 这是什么内核,没见过。 /lib/modules/6.6.38-trim/build 没有指向正确的 kernel source。于是在 /lib/modules/6.6.38-trim 目录下拉个软连接

SillPlain@as6602-fnos:/lib/modules/6.6.38-trim$ sudo ln -s /usr/src/linux-headers-6.6.38-trim/ build
SillPlain@as6602-fnos:/lib/modules/6.6.38-trim$

回到 /vol1/1000/asustor-platform-drivermake 就没有这个问题了。但是报了新问题

SillPlain@as6602-fnos:/vol1/1000/asustor-platform-driver$ make
make[1]: Entering directory '/usr/src/linux-headers-6.6.38-trim'
warning: the compiler differs from the one used to build the kernel
  The kernel was built by: gcc (Debian 12.2.0-14) 12.2.0
  You are using:
  CC [M]  /vol1/1000/asustor-platform-driver/asustor.o
/bin/sh: 1: gcc: not found
make[3]: *** [scripts/Makefile.build:243: /vol1/1000/asustor-platform-driver/asustor.o] Error 127
make[2]: *** [/usr/src/linux-headers-6.6.38-trim/Makefile:1921: /vol1/1000/asustor-platform-driver] Error 2
make[1]: *** [Makefile:234: __sub-make] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-6.6.38-trim'
make: *** [Makefile:24: modules] Error 2
SillPlain@as6602-fnos:/vol1/1000/asustor-platform-driver$

这也好办,就是缺软件包了。因为这个系统基于 Debian 所以可以轻松地用 apt 安装一个

SillPlain@as6602-fnos:/vol1/1000/asustor-platform-driver$ sudo apt update
(中略)
SillPlain@as6602-fnos:/vol1/1000/asustor-platform-driver$ sudo apt install gcc

安装好之后再次 make, 没有报错

SillPlain@as6602-fnos:/vol1/1000/asustor-platform-driver$ make
make[1]: Entering directory '/usr/src/linux-headers-6.6.38-trim'
  CC [M]  /vol1/1000/asustor-platform-driver/asustor.o
  CC [M]  /vol1/1000/asustor-platform-driver/asustor_it87.o
  CC [M]  /vol1/1000/asustor-platform-driver/asustor_gpio_it87.o
  MODPOST /vol1/1000/asustor-platform-driver/Module.symvers
  CC [M]  /vol1/1000/asustor-platform-driver/asustor.mod.o
  LD [M]  /vol1/1000/asustor-platform-driver/asustor.ko
  CC [M]  /vol1/1000/asustor-platform-driver/asustor_it87.mod.o
  LD [M]  /vol1/1000/asustor-platform-driver/asustor_it87.ko
  CC [M]  /vol1/1000/asustor-platform-driver/asustor_gpio_it87.mod.o
  LD [M]  /vol1/1000/asustor-platform-driver/asustor_gpio_it87.ko
make[1]: Leaving directory '/usr/src/linux-headers-6.6.38-trim'
SillPlain@as6602-fnos:/vol1/1000/asustor-platform-driver$

最后再执行 sudo make install

SillPlain@as6602-fnos:/vol1/1000/asustor-platform-driver$ sudo make install
/usr/bin/install -m 644 -D asustor.ko /lib/modules/6.6.38-trim/kernel/drivers/platform/x86/asustor.ko; /usr/bin/install -m 644 -D asustor_it87.ko /lib/modules/6.6.38-trim/kernel/drivers/hwmon/asustor_it87.ko; /usr/bin/install -m 644 -D asustor_gpio_it87.ko /lib/modules/6.6.38-trim/kernel/drivers/gpio/asustor_gpio_it87.ko;
depmod -a -F /boot/System.map-6.6.38-trim 6.6.38-trim
SillPlain@as6602-fnos:/vol1/1000/asustor-platform-driver$

没有消息就是最好的消息,到这里 SuperIO 驱动也安装完了。

重启一下让新安装好的模块生效。

先执行一下 sensors 查看更新之前的传感器状态

SillPlain@as6602-fnos:/vol1/1000/asustor-platform-driver$ sensors
coretemp-isa-0000
Adapter: ISA adapter
Package id 0:  +48.0°C  (high = +105.0°C, crit = +105.0°C)
Core 0:        +48.0°C  (high = +105.0°C, crit = +105.0°C)
Core 1:        +48.0°C  (high = +105.0°C, crit = +105.0°C)
Core 2:        +48.0°C  (high = +105.0°C, crit = +105.0°C)
Core 3:        +48.0°C  (high = +105.0°C, crit = +105.0°C)

acpitz-acpi-0
Adapter: ACPI interface
temp1:        +46.0°C

nvme-pci-0800
Adapter: PCI adapter
Composite:    +41.9°C

SillPlain@as6602-fnos:/vol1/1000/asustor-platform-driver$

然后执行 sensors-detect 更新传感器状态。一路默认就好

再执行 sensors,这下风扇传感器就被读出来了。

SillPlain@as6602-fnos:/$ sensors
it8625-isa-0290
Adapter: ISA adapter
in0:           1.40 V  (min =  +0.81 V, max =  +0.60 V)  ALARM
in1:           1.40 V  (min =  +2.49 V, max =  +1.68 V)  ALARM
in2:           2.06 V  (min =  +1.61 V, max =  +2.32 V)
in3:           2.04 V  (min =  +1.19 V, max =  +1.71 V)  ALARM
in4:           1.95 V  (min =  +1.57 V, max =  +0.96 V)  ALARM
in5:           1.87 V  (min =  +2.56 V, max =  +1.45 V)  ALARM
in6:           1.79 V  (min =  +1.72 V, max =  +0.34 V)  ALARM
3VSB:          3.30 V  (min =  +3.15 V, max =  +2.27 V)  ALARM
Vbat:          3.08 V
+3.3V:         3.30 V
fan1:        1243 RPM  (min =   26 RPM)
fan2:           0 RPM  (min =   10 RPM)  ALARM
fan3:           0 RPM  (min =   13 RPM)  ALARM
temp1:       -128.0°C  (low  = +29.0°C, high = -102.0°C)
temp2:       -128.0°C  (low  = +21.0°C, high = +102.0°C)  sensor = thermal diode
temp3:       -128.0°C  (low  = -14.0°C, high = +33.0°C)
intrusion0:  ALARM

acpitz-acpi-0
Adapter: ACPI interface
temp1:        +51.0°C

coretemp-isa-0000
Adapter: ISA adapter
Package id 0:  +54.0°C  (high = +105.0°C, crit = +105.0°C)
Core 0:        +54.0°C  (high = +105.0°C, crit = +105.0°C)
Core 1:        +54.0°C  (high = +105.0°C, crit = +105.0°C)
Core 2:        +54.0°C  (high = +105.0°C, crit = +105.0°C)
Core 3:        +54.0°C  (high = +105.0°C, crit = +105.0°C)

nvme-pci-0800
Adapter: PCI adapter
Composite:    +42.9°C

SillPlain@as6602-fnos:/$

如果有需要,可以再通过 fancontrol 或者其他类似的工具执行风扇策略。

前面板 LED 灯也是同样的,根据文档执行

SillPlain@as6602-fnos:/$ echo 0 | sudo tee /sys/devices/platform/asustor_it87.*/hwmon/hwmon*/gpled1_blink

绿色 LED 灯的闪烁也停止了。

文档还给出了其他控制 LED 灯的例子,行为上有些细微的出入,但绝大部分都是能用的。

于是风扇转速控制与前面板指示灯两个问题也跟着解决了。

收藏
送赞 1
分享

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

1

主题

15

回帖

0

牛值

江湖小虾

2025-4-9 15:48:38 显示全部楼层

懒得开新帖了,风扇自动调整转速就直接回复在这吧,接主楼帖子,执行完 sensors-detect后,就可以获得风扇的控制权了。
运行 nano /root/temp_monitor.sh,输入以下代码:

#!/bin/bash

#Target temperature in Celsius 目标温度
TARGET_TEMP=45

#Maximum fan speed 最大转速占空比
MAX_SPEED=255

#Minimum fan speed 最低转速占空比
MIN_SPEED=60

#Cleanup function to reset fan speed on stop 初始化风扇为最低转速占空比
cleanup() {
echo "Restoring fan speed..."
echo $MIN_SPEED > /sys/class/hwmon/hwmon3/pwm1
exit 0
}

#Trap INT signal (Ctrl+C) to call the cleanup function 捕获中断信号
trap cleanup INT

#Infinite loop until Ctrl+C is pressed 循环执行直到按键中断
while true; do
#Get the current temperature of the hottest core 获取最热核心的温度
CURRENT_TEMP=$(sensors | grep 'Core 0' | awk '{print $3}' | cut -d '+' -f 2 | cut -d '.' -f 1)

#Calculate the necessary speed 转速设定逻辑
if [ $CURRENT_TEMP -gt $TARGET_TEMP ]; then
#Calculate the new PWM based on the current temperature 基于当前温度计算占空比
DELTA_TEMP=$((CURRENT_TEMP - TARGET_TEMP))
NEW_SPEED=$((MIN_SPEED + (DELTA_TEMP * (MAX_SPEED - MIN_SPEED) / (105 - TARGET_TEMP))))

#Limit the speed to the maximum allowed 限制最高转速
if [ $NEW_SPEED -gt $MAX_SPEED ]; then
NEW_SPEED=$MAX_SPEED
fi

#Apply the new speed 应用风扇转速
echo $NEW_SPEED > /sys/class/hwmon/hwmon3/pwm1
fi

#Display the current temperature of the cores 显示CPU核心温度
sensors | grep 'Core'

#Pause for 10 seconds before the next check 暂停10秒进入下个循环
sleep 10
done

按下 Ctrl+X,此时提示是否保存,输入 YES ,此时提示输入保存路径,按 回车键 使用默认路径。

运行 nano /etc/rc.local,输入以下代码:

#!/bin/sh -e
#launch custom fan control script
nohup /root/temp_monitor.sh &

跟之前一样的方法保存退出。
依次输入下面的命令,赋予脚本执行权限:

chmod +x /root/temp_monitor.sh
chmod +x /etc/rc.local

重启后,屏幕回显CPU温度,并根据温度调整风扇转速,具体转速调整逻辑可以在 /root/temp_monitor.sh里自行修改,其中 /sys/class/hwmon/hwmon3/pwm1可能需要根据具体设备调整。
本文参考来源:
https://gist.github.com/johndavisnz/06a5e1aabaf878add0ad95669b3a0b3d#file-4-asustor_debian_fancontrol-md
https://forum.proxmox.com/threads/proxmox-is-running-stable-on-a-asustor-as6604t.124924/

1

主题

15

回帖

0

牛值

江湖小虾

2025-4-10 11:31:27 显示全部楼层

奇怪的关键=字审=查,导致复制下面的代码出现星号,进而运行出错,请移步 https://wiz.istudy.win:8888/wapp/pages/view/share/s/2HhNgM3bJx7G2hHVL-1QVHYW2Eb2l00l517M2-8El538LrX1观看,教程可能会随时修改,以上述网址的说明为准。

重新编辑一下,ai帮助我稍微改了下一些,现在适用于AS6604T,实测通过。

这个脚本用于替代 https://club.fnnas.com/forum.php?mod=viewthread&tid=19686&page=1&extra=#pid101856楼层的脚本,原脚本只是根据CPU核心温度机械调速,本楼的脚本会综合CPU、系统、硬盘三者的温度来调速,只需按上述楼层的帖子里的步骤操作,仅在输入脚本内容的时候用本楼的脚本替换即可。

注释里的依赖项不用在意,只要你按帖子一楼的顺序执行到 sensors-detect这里,那么此脚本需要的依赖项其实已经有了,不用特地去安装注释里的依赖项,因为脚本是抄来后缝缝补补涂涂改改的,所以保留了原本(可能无效)的注释。

另外我在原脚本的基础上,屏蔽了nvme和ssd的温度检测,起因是我的某个ssd硬盘温度永远显示40度,而最低转速匹配的硬盘温度设置的是35度,导致最低风扇转速虚设。

微信截图_20250410134022.png

来源:https://gist.github.com/johndavisnz/06a5e1aabaf878add0ad95669b3a0b3d#file-4-asustor_debian_fancontrol-md

因为来源页使用hddtemp获取硬盘温度,但这个软件包因为某些原因在新版debian中被摒弃了,所以找ai帮我改了下使用smartctl获取硬盘温度,顺便让ai改成中文注释,这个脚本的好处是按温度差的平方来调整风扇占空比,曲线更平滑,有温升快速提高转速,温度回落后延时降低转速。

#!/bin/bash

# Asustor风扇控制脚本
#
# 能动态处理不同型号的更新版本
#
# v2.1 2022年8月30日 (初始测试版本)
# v2.2 2022年8月31日 (抽象化了hwmon路径以及核心/硬盘数量 - 现在应该能处理任何英特尔CPU和任意数量的硬盘)
# v2.3 2025年4月10日 (适用于AS6604T,经过AI的提醒,hddtemp已删库所以不用它了,sys_desired_pwm变量出现在hdd段落已修正,pwm=0时停止而不是全速已修正,其他语法或者**ug修了两三个)

# 依赖项:
#
# lm_sensors (用于查询系统传感器)
#
# smartmontools (用于查询硬盘温度传感器,替代了hddtemp)
#
# 自定义it87内核模块,用于读取/设置风扇转速
#    需要从源码编译 (https://github.com/a1wong/it87),因为Debian提供的
#    it87不支持Asustor中使用的IT8625E

# 使用(高于阈值的温度的平方)+基础PWM值来作为硬盘响应曲线
# 使用((高于阈值的温度/2)的平方)+基础PWM值来作为系统响应曲线
#
# 这能在期望的温度范围内(硬盘范围35 - 50摄氏度,系统范围50 - 75摄氏度)实现缓慢的初始加速和快速的最终加速

#
# 用于调整行为的全局变量
#

# 调试输出级别: 0 = 禁用 1 = 最低限度 2 = 详细 3 = 极其详细
debug=3

# 启用风扇转速变化的邮件警报
mail**s=0

# 发送邮件警报的地址
mail_address=root@localhost
# 在邮件警报中用于标识自身的主机名
mail_hostname=AS6604T.home
if [ $debug -gt 1 ]; then
   echo "启动信息: 邮件地址=" $mail_address " 主机名=" $mail_hostname
fi

# 检查温度/设置转速的频率(以秒为单位)
frequency=10

# 系统传感器更新频率与硬盘传感器更新频率的比率
# 采样系统传感器的开销较小,而通过SMART查询硬盘传感器会干扰磁盘I/O - 并且硬盘温度变化没那么快
ratio_sys_to_hdd=12

# 开始提高风扇转速的硬盘温度阈值
hdd_threshold=35

# 开始提高风扇转速的系统温度阈值
sys_threshold=50

# 希望设置的风扇最低PWM值 (70 == 1600转/分钟,60 == 1400转/分钟)
min_pwm=60

#
# 确定/sys/class/hwmon映射
#

# 哪个/sys/class/hwmon符号链接指向it87(风扇转速)
hwmon_it87="/sys/class/hwmon/"`ls -lQ /sys/class/hwmon | grep -i it87 | cut -d "\"" -f 2`
if [ $debug -gt 1 ]; then
   echo "启动信息: hwmon_it87="  $hwmon_it87
fi

# 哪个/sys/class/hwmon符号链接指向英特尔核心温度传感器
hwmon_coretemp="/sys/class/hwmon/"`ls -lQ /sys/class/hwmon | grep -i coretemp | cut -d "\"" -f 2`
if [ $debug -gt 1 ]; then
   echo "启动信息: hwmon_coretemp=" $hwmon_coretemp
fi

# 哪个/sys/class/hwmon符号链接指向ACPI传感器(主板温度传感器)
hwmon_acpi="/sys/class/hwmon/"`ls -lQ /sys/class/hwmon | grep -i thermal_zone0 | cut -d "\"" -f 2`
if [ $debug -gt 1 ]; then
   echo "启动信息: hwmon_acpi=" $hwmon_acpi
fi

# 将风扇转速设置为期望的PWM值
function set_fan_speed() {
    # 加载it87模块后,可通过/sys/class/hwmon/hwmonX读取风扇转速 - 风扇转速位于pwm1
    # 0 == 全速 255 = 停止
    # 注意,这与ADM fanctrl相反,ADM fanctrl中0 = 停止,255 = 最大转速
    local real_pwm
    # 实际上在AS6604T中
    # 0 == 停止 255 == 全速
    # 所以修改掉下面的语句
    # let real_pwm=255-$desired_pwm
    let real_pwm=$desired_pwm
    echo $real_pwm >$hwmon_it87/pwm1
}

# 查询风扇转速并设置全局变量fan_rpm
function get_fan_speed() {
    fan_rpm=`cat $hwmon_it87/fan1_input`
}

# 查询所有硬盘的温度,并将全局变量hdd_temp设置为最高温度
function get_hdd_temp() {
    local hdd_temps=()
    local disk
    # 遍历所有可能的硬盘设备
    for disk in /dev/sd[a-z]; do
        if [ -e "$disk" ]; then
            disk_basename=$(basename "$disk")
            rotational_path="/sys/block/${disk_basename}/queue/rotational"
            # 检查是否为旋转设备(HDD)
            if [ -f "$rotational_path" ]; then
                rotational=$(cat "$rotational_path")
                if [ "$rotational" -eq 0 ]; then
                    if [ $debug -gt 2 ]; then
                        echo "忽略非旋转设备(SSD/NVMe): $disk"
                    fi
                    continue  # 跳过非旋转设备
                fi
            else
                if [ $debug -gt 2 ]; then
                    echo "无法确定设备类型,跳过: $disk"
                fi
                continue
            fi
            # 使用smartctl命令获取硬盘的温度信息
            local temp=$(smartctl -A "$disk" | grep -i 'temperature' | awk '{print $10}')
            if [ -n "$temp" ]; then
                hdd_temps+=("$temp")
            fi
        fi
    done
    # 找出所有硬盘温度中的最大值
    if [ ${#hdd_temps[@]} -eq 0 ]; then
        hdd_temp=0  # 若无HDD,设为0避免错误
    else
        hdd_temp=$(printf '%s\n' "${hdd_temps[@]}" | sort -rn | head -1)
    fi
    if [ $debug -gt 1 ]; then
       echo "获取硬盘温度: 硬盘最高温度= " $hdd_temp
    fi
}

# 查询系统温度,并将全局变量sys_temp设置为最高温度
function get_sys_temp() {
    # 通过ACPI读取系统主板温度传感器的值
    local acpi_temp=`cat $hwmon_acpi/temp1_input`
    acpi_temp=$(expr $acpi_temp / 1000)

    # 读取coretemp提供的所有温度(封装 + 核心1..N)并返回最高值
    local cpu_temp=`cat $hwmon_coretemp/temp?_input | sort -nr | head -1`
    cpu_temp=$(expr $cpu_temp / 1000)

    # 选择核心温度和系统温度中的最大值
    sys_temp=$(( $acpi_temp > $cpu_temp ? $acpi_temp : $cpu_temp ))

    if [[ $debug -gt 1 ]] ; then
       echo "获取系统温度: ACPI温度=" $acpi_temp " CPU温度=" $cpu_temp " 系统温度=" $sys_temp
    fi
}

# 将当前硬盘温度映射到期望的PWM值
#
# 使用基础PWM值+(硬盘温度 - 硬盘温度阈值)的平方来获得一个良好的曲线
#
function map_hdd_temp() {
    if [[ $hdd_temp -le $hdd_threshold ]] ; then
        if [[ $debug -gt 1 ]]; then
            echo "映射硬盘温度: 硬盘温度=" $hdd_temp " 且低于阈值"
        fi
        hdd_desired_pwm=$min_pwm
    else
        if [[ $debug -gt 1 ]] ; then
            echo "映射硬盘温度: 硬盘温度=" $hdd_temp " 且高于阈值"
        fi
        # 计算高于阈值的差值
        let hdd_desired_pwm=$hdd_temp-$hdd_threshold
        # 对差值进行平方运算
        let hdd_desired_pwm=$hdd_desired_pwm*$hdd_desired_pwm
        # 将结果添加到基础PWM值上
        let hdd_desired_pwm=$min_pwm+$hdd_desired_pwm
    fi
    if [[ $hdd_desired_pwm -gt 255 ]] ; then
        # 超过最大值 - 截断为最大值
        hdd_desired_pwm=255
    fi
    if [[ $debug -gt 1 ]] ; then
        echo "映射硬盘温度: 期望的硬盘PWM值=" $hdd_desired_pwm
    fi
}

# 将当前系统温度映射到期望的PWM值
#
# 使用基础PWM值+((系统温度 - 系统温度阈值)/2)的平方来获得一个良好的曲线
#
function map_sys_temp() {
    if [[ $sys_temp -le $sys_threshold ]] ; then
        if [[ $debug -gt 1 ]] ; then
            echo "映射系统温度: 系统温度=" $sys_temp " 且低于阈值"
        fi
        sys_desired_pwm=$min_pwm
    else
        if [[ $debug -gt 1 ]] ; then
            echo "映射系统温度: 系统温度=" $sys_temp " 且高于阈值"
        fi
        # 计算高于阈值的差值
        let sys_desired_pwm=$sys_temp-$sys_threshold
        # 将差值减半
        let sys_desired_pwm=$sys_desired_pwm/2
        # 对减半后的差值进行平方运算
        let sys_desired_pwm=$sys_desired_pwm*$sys_desired_pwm
        # 将结果添加到基础PWM值上
        let sys_desired_pwm=$min_pwm+$sys_desired_pwm
    fi
    if [[ $sys_desired_pwm -gt 255 ]] ; then
        # 超过最大值 - 截断为最大值
        sys_desired_pwm=255
    fi
    if [[ $debug -gt 1 ]] ; then
        echo "映射系统温度: 期望的系统PWM值=" $sys_desired_pwm
    fi
}

# 根据当前温度确定期望的PWM区域
function get_desired_pwm() {
    map_sys_temp
    map_hdd_temp
    if [[ $hdd_desired_pwm -gt $sys_desired_pwm ]] ; then
        desired_pwm=$hdd_desired_pwm
        if [[ $debug -gt 2 ]] ; then
            echo "获取期望的PWM值: 选择硬盘PWM值 - 期望的PWM值=" $desired_pwm " 期望的硬盘PWM值=" $hdd_desired_pwm " 期望的系统PWM值=" $sys_desired_pwm
        fi
    else
        desired_pwm=$sys_desired_pwm
        if [[ $debug -gt 2 ]] ; then
            echo "获取期望的PWM值: 选择系统PWM值 - 期望的PWM值=" $desired_pwm " 期望的硬盘PWM值=" $hdd_desired_pwm " 期望的系统PWM值=" $sys_desired_pwm
        fi
    fi
}

## 主程序 #################################################################################

# 获取初始温度
get_sys_temp
get_hdd_temp
last_sys_temp=$sys_temp
last_hdd_temp=$hdd_temp
get_fan_speed

# 我们使用变量 'last_pwm'、'last_sys_temp' 和 'last_hdd_temp' 来跟踪上一次循环中的PWM/温度值
# 这样,只有当状态发生变化时才会改变风扇转速,而不是每次迭代都改变

# 获取初始PWM值
get_desired_pwm

last_pwm=$desired_pwm

# 设置初始风扇转速
if [[ $debug -gt 1 ]] ; then
   echo "主程序: 初始风扇PWM值=" $desired_pwm
fi

set_fan_speed

# 现在进入无限循环进行监控和响应
cycles=$ratio_sys_to_hdd

while true; do
    # 更新传感器读数
    get_fan_speed
    get_sys_temp
    if [[ $cycles -eq 1 ]] ; then
        if [[ $debug -gt 1 ]] ; then
            echo "主程序: 采样硬盘传感器"
        fi
        get_hdd_temp
        cycles=$ratio_sys_to_hdd
    else
        if [[ $debug -gt 1 ]] ; then
            echo "主程序: 跳过硬盘传感器更新"
        fi
        let cycles=$cycles-1
    fi
    # 根据读数更新目标PWM值
    get_desired_pwm
    if [[ $debug -gt 1 ]] ; then
        echo "主程序: 期望的PWM值=" $desired_pwm " 上一次的PWM值=" $last_pwm
        echo "主程序: 系统温度=" $sys_temp " 上一次的系统温度=" $last_sys_temp
        echo "主程序: 硬盘温度=" $hdd_temp " 上一次的硬盘温度=" $last_hdd_temp
        echo "主程序: 风扇转速=" $fan_rpm
    fi
    if [[ $desired_pwm -gt $last_pwm ]] ; then
        # 需要提高风扇转速 - 立即响应
        if [[ $debug -ge 1 ]] ; then
            echo "!!!! 风扇转速增加 : 硬盘温度 " $hdd_temp " 系统温度 " $sys_temp " 风扇转速 " $fan_rpm " - 将风扇转速更改为 " $desired_pwm
        fi
        if [[ $mail**s -ge 1 ]] ; then
            echo "!!!! 风扇转速增加 : 硬盘温度 " $hdd_temp " 系统温度 " $sys_temp " 风扇转速 " $fan_rpm " - 将风扇转速更改为" $desired_pwm | mail $mail_address -s "$mail_hostname - 温度警报"
        fi
        # 设置风扇转速
        set_fan_speed
        # 只有当目标风扇转速发生变化时才更新状态跟踪变量
        last_pwm=$desired_pwm
        last_sys_temp=$sys_temp
        last_hdd_temp=$hdd_temp
    fi
    if [[ $desired_pwm -lt $last_pwm ]] ; then
        # 需要降低风扇转速
        # 计算每个传感器相对于上一次读数的差值
        let hdd_delta=$last_hdd_temp-$hdd_temp
        let sys_delta=$last_sys_temp-$sys_temp
        if [[ $debug -gt 1 ]] ; then
            echo "主程序: 当前系统温度差值=" $sys_delta " 当前硬盘温度差值=" $hdd_delta
        fi
        # 我们需要对硬盘温度应用2度的滞后,对系统温度应用4度的滞后,以防止风扇转速波动
        if [[ $hdd_delta -gt 2 ]] || [[ $sys_delta -gt 4 ]] ; then
            # 温度下降幅度足够大 - 实际改变风扇转速
            if [[ $debug -ge 1 ]] ; then
                echo "!!!! 风扇转速降低 : 硬盘温度 " $hdd_temp " 系统温度 " $sys_temp " 风扇转速 " $fan_rpm " - 将风扇转速更改为 " $desired_pwm
            fi
            if [[ $mail**s -ge 1 ]] ; then
                echo "!!!! 风扇转速降低 : 硬盘温度 " $hdd_temp " 系统温度 " $sys_temp " 风扇转速 " $fan_rpm " - 将风扇转速更改为" $desired_pwm | mail $mail_address -s "$mail_hostname - 温度警报"
            fi
            # 设置风扇转速
            set_fan_speed
            # 只有当目标风扇转速发生变化时才更新状态跟踪变量
            last_pwm=$desired_pwm
            last_sys_temp=$sys_temp
            last_hdd_temp=$hdd_temp
        else
            # 温度下降幅度不足以触发实际变化
            if [[ $debug -ge 1 ]] ; then
                echo "!!!! 风扇转速降低 : 硬盘温度 " $hdd_temp " 系统温度 " $sys_temp " - 但温差不足(" $hdd_delta " " $sys_delta ")!"
            fi
        fi
    fi
    if [[ $debug -ge 1 ]] ; then
        echo "主程序: 休眠 " $frequency " 秒"
    fi
    sleep $frequency
done

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

0

主题

4

回帖

0

牛值

江湖小虾

2025-3-25 13:06:52 显示全部楼层
我的是华芸的fs6706t,没有进bios的界面直接进系统了
华芸的大部分机子好像有个后门,插上U盘后,按住USB COPY键不放,再开机,就可以从U盘启动。 U盘插前面和插后面好像还有区别的,可能只有一个位置可以启动。  详情 回复
2025-4-8 14:04
试试按下电源按键后立刻不停敲F2键。  详情 回复
2025-4-7 15:43
我没有 FS6706T,但这方面的正常思路是接显示器之后看屏幕上写按哪个键盘进 BIOS,其次是把所有功能键盘都按一遍  详情 回复
2025-3-27 19:52

0

主题

11

回帖

0

牛值

江湖小虾

2025-3-27 19:52:04 楼主 显示全部楼层
胡嘉隆 发表于 2025-3-25 13:06
我的是华芸的fs6706t,没有进bios的界面直接进系统了

我没有 FS6706T,但这方面的正常思路是接显示器之后看屏幕上写按哪个键盘进 BIOS,其次是把所有功能键盘都按一遍

1

主题

15

回帖

0

牛值

江湖小虾

2025-4-7 13:20:47 显示全部楼层
**plus,让我少走了很多弯路,一会我试试给捡的as6604t也安装个飞牛。

1

主题

15

回帖

0

牛值

江湖小虾

2025-4-7 15:32:18 显示全部楼层
大佬,我的AS6604T跟着你的教程成功了,LCD屏幕可以关闭或者自定义吗?最好是滚动播放,防止烧屏。
我没有 6604 或者其他带 LCD 屏幕的华芸设备,但有个 GPIO 针脚被标记为控制 LCD 屏幕电源的,你可以试试。另一方面,你也可以直接选择把 LCD 屏幕的线给拔了。 除此之外,https://github.com/mafredri/lcm 这个库  详情 回复
2025-4-7 16:07

1

主题

15

回帖

0

牛值

江湖小虾

2025-4-7 15:43:44 显示全部楼层
胡嘉隆 发表于 2025-3-25 13:06
我的是华芸的fs6706t,没有进bios的界面直接进系统了

试试按下电源按键后立刻不停敲F2键。

0

主题

11

回帖

0

牛值

江湖小虾

2025-4-7 16:07:04 楼主 显示全部楼层
BlueFang 发表于 2025-4-7 15:32
大佬,我的AS6604T跟着你的教程成功了,LCD屏幕可以关闭或者自定义吗?最好是滚动播放,防止烧屏。 ...

我没有 6604 或者其他带 LCD 屏幕的华芸设备,但有个 GPIO 针脚被标记为控制 LCD 屏幕电源的,你可以试试。另一方面,你也可以直接选择把 LCD 屏幕的线给拔了。

除此之外,https://github.com/mafredri/lcm 这个库提供了一个自定义 LCD 屏幕内容的方法。我没有相关设备测试,但你可以试着装一下
感谢大佬,作为linux小白补充下,lcm可以完美的控制AS6604的屏幕。 跟主贴一样,还是缺软件包,所以要先安装软件包: sudo apt install golang-go 其他的**化按**hub上的命令输入即可: git clone https://github.co  详情 回复
2025-4-8 10:19

1

主题

15

回帖

0

牛值

江湖小虾

2025-4-8 10:19:57 显示全部楼层

感谢大佬,作为linux小白补充下,lcm可以完美的控制AS6604的屏幕。
跟主贴一样,还是缺软件包,所以要先安装软件包:

sudo apt install golang-go

其他的=傻=瓜=化按ga=yhub上的命令输入即可:

git clone https://github.com/mafredri/lcm
cd lcm
go build ./cmd/openlcmd
sudo cp openlcmd /usr/local/sbin/openlcmd
sudo cp cmd/openlcmd/systemd/openlcmd.service /etc/systemd/system/openlcmd.service
sudo systemctl enable openlcmd
sudo systemctl start openlcmd

最后屏幕会显示主机名和IP地址,按键可以呼出关机和重启的菜单。

还有个小问题,楼主的命令会让AS6604T电源键下面的绿色LED常亮,不知道如何才能实现呼吸灯效果以及关闭。

echo 0 | sudo tee /sys/devices/platform/asustor_it87.*/hwmon/hwmon*/gpled1_blink
再来报告下,lcd只能显示IP和主机名,重启和关机菜单是无效的。  详情 回复
2025-4-8 10:30

1

主题

15

回帖

0

牛值

江湖小虾

2025-4-8 10:30:45 显示全部楼层
BlueFang 发表于 2025-4-8 10:19
感谢大佬,作为linux小白补充下,lcm可以完美的控制AS6604的屏幕。
跟主贴一样,还是缺软件包,所以要先安 ...

再来报告下,lcd只能显示IP和主机名,重启和关机菜单是无效的。
原库比较老了,可能要针对新机型做点修改,这个就待有兴趣的人继续深入研究了  详情 回复
2025-4-8 22:09

1

主题

15

回帖

0

牛值

江湖小虾

2025-4-8 13:58:20 显示全部楼层

引用页:https://www.reddit.com/r/asustor/comments/rksn5v/new_release_linux_on_asustor_asustorplatformdriver/

reddit找到帖子,以下命令可以设置LED亮度为 230,取值范围 0-255

echo 230 >/sys/devices/platform/asustor_it87.656/hwmon/hwmon3/pwm3
对的,asustor-platform-driver 的仓库里也有提到一些其他的设置项可以改变灯的状态。其中也包括关闭和固定模式的闪烁  详情 回复
2025-4-8 22:11

1

主题

15

回帖

0

牛值

江湖小虾

2025-4-8 14:04:15 显示全部楼层
胡嘉隆 发表于 2025-3-25 13:06
我的是华芸的fs6706t,没有进bios的界面直接进系统了

华芸的大部分机子好像有个后门,插上U盘后,按住USB COPY键不放,再开机,就可以从U盘启动。
U盘插前面和插后面好像还有区别的,可能只有一个位置可以启动。

0

主题

11

回帖

0

牛值

江湖小虾

2025-4-8 22:09:27 楼主 显示全部楼层
BlueFang 发表于 2025-4-8 10:30
再来报告下,lcd只能显示IP和主机名,重启和关机菜单是无效的。

原库比较老了,可能要针对新机型做点修改,这个就待有兴趣的人继续深入研究了

0

主题

11

回帖

0

牛值

江湖小虾

2025-4-8 22:11:25 楼主 显示全部楼层
BlueFang 发表于 2025-4-8 13:58
引用页:https://www.reddit.com/r/asustor/comments/rksn5v/new_release_linux_on_asustor_asustorplatfor ...

对的,asustor-platform-driver 的仓库里也有提到一些其他的设置项可以改变灯的状态。其中也包括关闭和固定模式的闪烁
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则