Содержание
Домашний сервер на 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, а системники с хорошей продувкой корзины обычно как целая тумбочка.
Конфигурация
- В качестве системного SSD поставил Samsung 980 (просто 980, без PRO и EVO), в отличие от всяких прошек тут не 9 ватт, а только 4 потребление, т.е. будет не таким горячим и лучше будет себя чувствовать в тесной коробке.
- Стоит две планки памяти по 8 гигабайт, одна шла в комплекте, вторую докупил подобрав по таймингам Patriot Viper
- Установлено 4 диска WD DC HC550 18tb, не знаю почему так много, когда покупал то это было самое выгодное решение рублей на гигабайт, условно там WD Red Plus на 8Tb стоил почти как этот на 18, но диски очень компромисные в плане шума
Система
Установил Debian 12, минималку netinstall
Первым делом добавил все ветки репозитория в /etc/apt/sources.list
deb http://deb.debian.org/debian/ bookworm main contrib non-free non-free-firmware deb-src http://deb.debian.org/debian/ bookworm main contrib non-free non-free-firmware deb http://security.debian.org/debian-security bookworm-security main contrib non-free-firmware deb-src http://security.debian.org/debian-security bookworm-security main contrib non-free-firmware deb http://deb.debian.org/debian/ bookworm-updates main contrib non-free-firmware deb-src http://deb.debian.org/debian/ bookworm-updates main contrib non-free-firmware
Далее стандарно обновил систему
apt update && apt upgrade
Далее накатил минимальный набор софта
apt install wget curl iotop blktrace git hdparm
Работа с дисками
Массив
mdadm --create --verbose /dev/md0 -l 10 -n 4 /dev/sda /dev/sdb /dev/sdc /dev/sdd
Контроль шума HDD
Указать уровень шума
hdparm -B 128 /dev/sd[a,b,c,d]
Указать время засыпания при неактивности
hdparm -S 20 /dev/sd[a,b,c,d]
Принудительно приглушить диски
DRIVE_TO_SET=/dev/sd[a,b,c,d] && hdparm -Y $DRIVE_TO_SET
Поддержка датчиков и управление вентиляторами/температурой
Для полноценной работы нужно чтобы все датчики нормально мониторились - температуры дисков, процессора и обороты вентилятора
Подгрузка модулей
apt install lm-sensors
Для обычных ситуаций достаточно запустить команду sensors-detect
и нажимать везде y, но у меня особый случай, точнее, устройство специфичное,
чтобы получить результат прямо сейчас, вводим:
modprobe coretemp modprobe drivetemp modprobe it87 force_id=0x8620
А чтобы это работало после перезагрузки
в /etc/modules
coretemp drivetemp it87
Но it87 просто так не заведется, нужно еще опцию прописать в файле
/etc/modprobe.d/it87.conf
options it87 force_id=0x8620
lm-sensors
После данных манипуляций команда sensors будет иметь такой вывод, т.е. видно
- Датчик температуры жесткого диска
- Датчик температуры nvme
- Датчик температуры процессора и чипсета
- Обороты вентиляторов
drivetemp-scsi-3-0 Adapter: SCSI adapter temp1: +33.0°C (low = +0.0°C, high = +60.0°C) (crit low = -40.0°C, crit = +70.0°C) (lowest = +32.0°C, highest = +46.0°C) drivetemp-scsi-1-0 Adapter: SCSI adapter temp1: +34.0°C (low = +0.0°C, high = +60.0°C) (crit low = -40.0°C, crit = +70.0°C) (lowest = +32.0°C, highest = +49.0°C) coretemp-isa-0000 Adapter: ISA adapter Package id 0: +51.0°C (high = +105.0°C, crit = +105.0°C) Core 0: +44.0°C (high = +105.0°C, crit = +105.0°C) Core 1: +44.0°C (high = +105.0°C, crit = +105.0°C) Core 2: +44.0°C (high = +105.0°C, crit = +105.0°C) Core 3: +44.0°C (high = +105.0°C, crit = +105.0°C) acpitz-acpi-0 Adapter: ACPI interface temp1: +27.8°C it8620-isa-0a30 Adapter: ISA adapter in0: 1.88 V (min = +0.00 V, max = +3.06 V) in1: 1.37 V (min = +0.00 V, max = +3.06 V) in2: 2.26 V (min = +0.00 V, max = +3.06 V) +5V: 5.59 V (min = +0.00 V, max = +6.12 V) in4: 2.27 V (min = +0.00 V, max = +3.06 V) in5: 2.22 V (min = +0.00 V, max = +3.06 V) in6: 1.34 V (min = +0.00 V, max = +3.06 V) 3VSB: 1.61 V (min = +0.00 V, max = +6.12 V) Vbat: 3.36 V fan2: 0 RPM (min = 0 RPM) fan3: 1290 RPM (min = 0 RPM) fan4: 0 RPM (min = 0 RPM) fan5: 0 RPM (min = 0 RPM) temp1: +41.0°C (low = -128.0°C, high = +127.0°C) sensor = thermal diode temp2: +37.0°C (low = -128.0°C, high = +127.0°C) sensor = thermal diode temp3: +47.0°C (low = -128.0°C, high = +127.0°C) temp4: +47.0°C temp5: +47.0°C temp6: +47.0°C intrusion0: ALARM drivetemp-scsi-2-0 Adapter: SCSI adapter temp1: +34.0°C (low = +0.0°C, high = +60.0°C) (crit low = -40.0°C, crit = +70.0°C) (lowest = +32.0°C, highest = +50.0°C) drivetemp-scsi-0-0 Adapter: SCSI adapter temp1: +34.0°C (low = +0.0°C, high = +60.0°C) (crit low = -40.0°C, crit = +70.0°C) (lowest = +32.0°C, highest = +46.0°C) nvme-pci-0300 Adapter: PCI adapter Composite: +41.9°C (low = -273.1°C, high = +81.8°C) (crit = +84.8°C) Sensor 1: +41.9°C (low = -273.1°C, high = +65261.8°C) Sensor 2: +38.9°C (low = -273.1°C, high = +65261.8°C)
Работа без lm-sensors
Узнать где какой датчик в /sys/class/hwmon/… можно такой командой
for f in $(ls -1 /sys/class/hwmon/); do echo $f" - "$(cat /sys/class/hwmon/${f}/name); done
Выведет например такое
hwmon0 - acpitz hwmon1 - nvme hwmon2 - coretemp hwmon3 - drivetemp hwmon4 - drivetemp hwmon5 - drivetemp hwmon6 - drivetemp hwmon7 - it8620
- acpitz - это вроде как чипсет
- nvme - ну это мой m2 накопитель
- derivetemp - это температура 4х дисков
- it8620 - это системный мониторинг, включающий в себя и напряжения и обороты вентиляторов и даже какие-то температуры
Управление вентиляторами
Как мы поняли из прошлого листинга, вентиляторы у нас это hwmon7, а вот понять какой наш, можно последовательно выполнив на все вентиляторы подобные команды (я уже знаю что у меня hwmon7/pwm3 это оба вентилятора)
Сперва включаем ручное управление
echo 1 > /sys/class/hwmon/hwmon7/pwm3_enable
Потом останавливаем
echo 0 > /sys/class/hwmon/hwmon7/pwm3
А потом запускаем на полную скорость
echo 255 > /sys/class/hwmon/hwmon7/pwm3
Мой первый вариант получения скоростей был таким, через lm-sensors
# получение температуры датчиков: id_датчика, строчка с темпепературой function getSensTemp { echo $(sensors $1 | grep $2 |tr -s ' '|cut -d '+' -f 2| cut -d '.' -f1); } #получение оборотов вентилятора function getFanSpeedRPM { echo $(sensors it8620-isa-0a30 |grep fan$1|tr -s ' '|cut -d ' ' -f 2); } # задает все переменные function setTemp { tempHdd1=$(getSensTemp "drivetemp-scsi-0-0" "temp1"); tempHdd2=$(getSensTemp "drivetemp-scsi-1-0" "temp1"); tempHdd3=$(getSensTemp "drivetemp-scsi-2-0" "temp1"); tempHdd4=$(getSensTemp "drivetemp-scsi-3-0" "temp1"); hddMax=$(echo $tempHdd1"!"$tempHdd2"!"$tempHdd3"!"$tempHdd4|sed 's/!/\n/g'|sort -n|tail -1) tempSSD=$(getSensTemp "nvme-pci-0300" "Composite"); tempCpu=$(getSensTemp "coretemp-isa-000" "Package"); fanRPM=$(getFanSpeedRPM 3); }
в итоге стало более проще
function getMaxHddTemp { echo $(($(cat /sys/class/hwmon/hwmon[3,4,5,6]/temp1_input|sort -n|tail -1)/1000)); } function getCpuTemp { $(($(cat /sys/class/hwmon/hwmon2/temp1_input)/1000)) }
TODO
- Описать процесс создания рейд
- Описать опции форматирования и монтирования рейда
- Описать настройку управления вентиляторами