Содержание

Домашний сервер на TerraMaster F4-423

Зачем мне такое?

Всю жизнь у меня всегда есть сервер дома, для таких сайтов как этот, если я плачу за интернет и он очень стабильный, как и энергоснабжение, то не всегда есть смысл платить за хостинг.
Помимо этого, есть необходимость в облачных хранилищах, которые тоже дорогие.
Плюсом на досуге я занимаюсь съемкой видео на ютуб и хранить все исходники не особо хочется.

Почему же я выбрал именно Terramaster?

Terramaster F4-423 это по сути обычный компьютер на интеле, у него есть биос, стоят 4 пиновые PWM вентиляторы, есть два слота под оперативную память (я поставил 16 гигов), есть два слота под nvme диски, и что самое интересное - есть hdmi выход, т.е. я просто подключил монитор, клавиатуру и могу устанавливать любую систему на голое железо, а не в виртуалки.

Практика показала что даже при выкрученных на максимум вентиляторах обычные системные блоки достаточно плохо продувают диски, а тут если прибавить вентиляторы чуть выше среднего, то в 30 градусную жару при 4х дневной нагрузке 24/7 на все 4 диска (ребилд на скорости в 250 мегабайт на каждый диск). NAS выдувает воздух с задней стенки, и засасывает его через корзины, т.е. входной поток проходит сквозь все диски и при такой плотной компановке охлаждение в норме, не превышает 43-45 градусом, но если мои диски просто положить на стол и подключить, то они быстро нагреются до 55 градусов, это очень горячие диски на 18 террабайт с 3 раздельными блоками головок и кучей блинов.
Поэтом, у вот такой накопитель создает идеальные условия для охлада моих дисков.

Да и так, я разглядывал кучу системников, сейчас сложно найти системник на 4 диска 3.5, а системники с хорошей продувкой корзины обычно как целая тумбочка.

Конфигурация

Система

Установил Debian 12, минималку netinstall

Первым делом добавил все ветки репозитория в /etc/apt/sources.list

  1. deb http://deb.debian.org/debian/ bookworm main contrib non-free non-free-firmware
  2. deb-src http://deb.debian.org/debian/ bookworm main contrib non-free non-free-firmware
  3.  
  4.  
  5. deb http://security.debian.org/debian-security bookworm-security main contrib non-free-firmware
  6. deb-src http://security.debian.org/debian-security bookworm-security main contrib non-free-firmware
  7.  
  8. deb http://deb.debian.org/debian/ bookworm-updates main contrib non-free-firmware
  9. deb-src http://deb.debian.org/debian/ bookworm-updates main contrib non-free-firmware

Далее стандарно обновил систему

apt update && apt upgrade

Далее накатил минимальный набор софта

  1. apt install wget curl iotop blktrace git hdparm

Работа с дисками

Массив

  1. mdadm --create --verbose /dev/md0 -l 10 -n 4 /dev/sda /dev/sdb /dev/sdc /dev/sdd

Контроль шума HDD

Указать уровень шума

  1. hdparm -B 128 /dev/sd[a,b,c,d]

Указать время засыпания при неактивности

  1. hdparm -S 20 /dev/sd[a,b,c,d]

Принудительно приглушить диски

  1. DRIVE_TO_SET=/dev/sd[a,b,c,d] && hdparm -Y $DRIVE_TO_SET

Поддержка датчиков и управление вентиляторами/температурой

Для полноценной работы нужно чтобы все датчики нормально мониторились - температуры дисков, процессора и обороты вентилятора

Подгрузка модулей

  1. apt install lm-sensors

Для обычных ситуаций достаточно запустить команду sensors-detect и нажимать везде y, но у меня особый случай, точнее, устройство специфичное,
чтобы получить результат прямо сейчас, вводим:

  1. modprobe coretemp
  2. modprobe drivetemp
  3. modprobe it87 force_id=0x8620

А чтобы это работало после перезагрузки
в /etc/modules

  1. coretemp
  2. drivetemp
  3. it87

Но it87 просто так не заведется, нужно еще опцию прописать в файле
/etc/modprobe.d/it87.conf

  1. options it87 force_id=0x8620

lm-sensors

После данных манипуляций команда sensors будет иметь такой вывод, т.е. видно

  1. drivetemp-scsi-3-0
  2. Adapter: SCSI adapter
  3. temp1: +33.0°C (low = +0.0°C, high = +60.0°C)
  4. (crit low = -40.0°C, crit = +70.0°C)
  5. (lowest = +32.0°C, highest = +46.0°C)
  6.  
  7. drivetemp-scsi-1-0
  8. Adapter: SCSI adapter
  9. temp1: +34.0°C (low = +0.0°C, high = +60.0°C)
  10. (crit low = -40.0°C, crit = +70.0°C)
  11. (lowest = +32.0°C, highest = +49.0°C)
  12.  
  13. coretemp-isa-0000
  14. Adapter: ISA adapter
  15. Package id 0: +51.0°C (high = +105.0°C, crit = +105.0°C)
  16. Core 0: +44.0°C (high = +105.0°C, crit = +105.0°C)
  17. Core 1: +44.0°C (high = +105.0°C, crit = +105.0°C)
  18. Core 2: +44.0°C (high = +105.0°C, crit = +105.0°C)
  19. Core 3: +44.0°C (high = +105.0°C, crit = +105.0°C)
  20.  
  21. acpitz-acpi-0
  22. Adapter: ACPI interface
  23. temp1: +27.8°C
  24.  
  25. it8620-isa-0a30
  26. Adapter: ISA adapter
  27. in0: 1.88 V (min = +0.00 V, max = +3.06 V)
  28. in1: 1.37 V (min = +0.00 V, max = +3.06 V)
  29. in2: 2.26 V (min = +0.00 V, max = +3.06 V)
  30. +5V: 5.59 V (min = +0.00 V, max = +6.12 V)
  31. in4: 2.27 V (min = +0.00 V, max = +3.06 V)
  32. in5: 2.22 V (min = +0.00 V, max = +3.06 V)
  33. in6: 1.34 V (min = +0.00 V, max = +3.06 V)
  34. 3VSB: 1.61 V (min = +0.00 V, max = +6.12 V)
  35. Vbat: 3.36 V
  36. fan2: 0 RPM (min = 0 RPM)
  37. fan3: 1290 RPM (min = 0 RPM)
  38. fan4: 0 RPM (min = 0 RPM)
  39. fan5: 0 RPM (min = 0 RPM)
  40. temp1: +41.0°C (low = -128.0°C, high = +127.0°C) sensor = thermal diode
  41. temp2: +37.0°C (low = -128.0°C, high = +127.0°C) sensor = thermal diode
  42. temp3: +47.0°C (low = -128.0°C, high = +127.0°C)
  43. temp4: +47.0°C
  44. temp5: +47.0°C
  45. temp6: +47.0°C
  46. intrusion0: ALARM
  47.  
  48. drivetemp-scsi-2-0
  49. Adapter: SCSI adapter
  50. temp1: +34.0°C (low = +0.0°C, high = +60.0°C)
  51. (crit low = -40.0°C, crit = +70.0°C)
  52. (lowest = +32.0°C, highest = +50.0°C)
  53.  
  54. drivetemp-scsi-0-0
  55. Adapter: SCSI adapter
  56. temp1: +34.0°C (low = +0.0°C, high = +60.0°C)
  57. (crit low = -40.0°C, crit = +70.0°C)
  58. (lowest = +32.0°C, highest = +46.0°C)
  59.  
  60. nvme-pci-0300
  61. Adapter: PCI adapter
  62. Composite: +41.9°C (low = -273.1°C, high = +81.8°C)
  63. (crit = +84.8°C)
  64. Sensor 1: +41.9°C (low = -273.1°C, high = +65261.8°C)
  65. Sensor 2: +38.9°C (low = -273.1°C, high = +65261.8°C)

Работа без lm-sensors

Узнать где какой датчик в /sys/class/hwmon/… можно такой командой

  1. for f in $(ls -1 /sys/class/hwmon/); do echo $f" - "$(cat /sys/class/hwmon/${f}/name); done

Выведет например такое

  1. hwmon0 - acpitz
  2. hwmon1 - nvme
  3. hwmon2 - coretemp
  4. hwmon3 - drivetemp
  5. hwmon4 - drivetemp
  6. hwmon5 - drivetemp
  7. hwmon6 - drivetemp
  8. hwmon7 - it8620

Управление вентиляторами

Как мы поняли из прошлого листинга, вентиляторы у нас это hwmon7, а вот понять какой наш, можно последовательно выполнив на все вентиляторы подобные команды (я уже знаю что у меня hwmon7/pwm3 это оба вентилятора)

Сперва включаем ручное управление

  1. echo 1 > /sys/class/hwmon/hwmon7/pwm3_enable


Потом останавливаем

  1. echo 0 > /sys/class/hwmon/hwmon7/pwm3


А потом запускаем на полную скорость

  1. echo 255 > /sys/class/hwmon/hwmon7/pwm3




Мой первый вариант получения скоростей был таким, через lm-sensors

  1. # получение температуры датчиков: id_датчика, строчка с темпепературой
  2. function getSensTemp {
  3. echo $(sensors $1 | grep $2 |tr -s ' '|cut -d '+' -f 2| cut -d '.' -f1);
  4. }
  5.  
  6.  
  7. #получение оборотов вентилятора
  8. function getFanSpeedRPM {
  9. echo $(sensors it8620-isa-0a30 |grep fan$1|tr -s ' '|cut -d ' ' -f 2);
  10. }
  11.  
  12.  
  13. # задает все переменные
  14. function setTemp {
  15. tempHdd1=$(getSensTemp "drivetemp-scsi-0-0" "temp1");
  16. tempHdd2=$(getSensTemp "drivetemp-scsi-1-0" "temp1");
  17. tempHdd3=$(getSensTemp "drivetemp-scsi-2-0" "temp1");
  18. tempHdd4=$(getSensTemp "drivetemp-scsi-3-0" "temp1");
  19. hddMax=$(echo $tempHdd1"!"$tempHdd2"!"$tempHdd3"!"$tempHdd4|sed 's/!/\n/g'|sort -n|tail -1)
  20. tempSSD=$(getSensTemp "nvme-pci-0300" "Composite");
  21. tempCpu=$(getSensTemp "coretemp-isa-000" "Package");
  22. fanRPM=$(getFanSpeedRPM 3);
  23. }

в итоге стало более проще

  1. function getMaxHddTemp {
  2. echo $(($(cat /sys/class/hwmon/hwmon[3,4,5,6]/temp1_input|sort -n|tail -1)/1000));
  3. }
  4.  
  5. function getCpuTemp {
  6. $(($(cat /sys/class/hwmon/hwmon2/temp1_input)/1000))
  7. }

TODO