ITСooky

IT-рецепты съедобные и не очень!

Домашний сервер на Raspberry Pi 4 с NVMe, RTC, UPS в DIY корпусе!

дата 22.10.2020

Что нужно домашнему серверу — отказоустойчивое питание, большой быстрый диск, хорошее охлаждение, маленький размер, мобильность ну чтобы поставить везде где есть хотябы питание! Это и буду делать — питание через X725 с аккумуляторами 18650, диск на NVMe избыточно быстрый для USB3, охлаждение лучше не куда! И стильный маленький корпус — для Raspberry pi нет универсальных корпусов, под всю начинку, но можно взять стандартный и доработать его!


ПК Raspberry Pi 4
Посмотрю что у меня за модель
cat /sys/firmware/devicetree/base/model

Raspberry Pi 4 Model B Rev 1.1

Посмотрим сколько памяти
free -h

              total        used        free      shared  buff/cache   available
Mem:          3.8Gi        90Mi       3.5Gi       8.0Mi       242Mi       3.6Gi
Swap:          99Mi          0B        99Mi

4Gb!

Охлаждение Raspberry Pi
Беру кулер Low Profile Ice Tower Cooler SKU: EP-0112, почему его вот тут подробно описано Тестирование башенных куллеров ICE Tower от 52Pi для Raspberry Pi 4!.

Часы для Raspberry Pi
У меня были довольно старые DS3231 RTC

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

UPS для Raspberry Pi
У меня вот такой SupTronics X725 Power Management Board, не покупайте его, есть уже более новая молель, а у этой из заявленных функций работает только электропитание и выключение — включится может от любого прикосновения. Вот тут я его более подробно тестировал X725 Power Management Board так себе шильд под аккумуляторы 18650 для Raspberry Pi!

Кнопка питания для X725
Momentary Self-Reset Power Control Switch

Блок питания
Вот такой, подключается к x725 разъем круглый

USB диск для Raspberry Pi
У меня в начале был mSATA в шильде SupTronics X856 и он отлично работал в тестовой сборке, но потом вдруг скорость на нем упала в 100 раз, стал выключаться…

R.I.P
SupTronics X856 или noname 1Tb mSATA

Срочная замена Blueendless SSD M2 PCIe NVMe/NGFF Type C USB 3,1 и 256Gb KingSpec M.2 NVMe SSD NE Series 2280 PCIE Gen3x4 их тоже подробно тестировал во тут Выбираем USB диск для Raspberry Pi, под загрузку OS, на mSATA или NVMe!

Надеюсь что будет плюс, заработает полностью Wi-Fi так как SupTronics X856 вносит помехи в работу Wi-Fi на Raspberry Pi. С ним 2,4Mgz полностью не работает, не возможно подключиться к AP, а 5Mhz может частично работать.

Корпус для Raspberry Pi
1. Железная электрическая распределительная коробка DIY усилитель металлическая коробка 150*140*70 мм
2. Удлинительный кабель Cat6 RJ45
3. USB 2,0 Удлинительный кабель «Папа-мама» с винт крепления
4. Кабель питания зарядное устройство адаптер 1,2 м DC разъем наконечник разъем шнур кабель ноутбук питание 5,5X2,5
5. Разъем питания DC099 5,5 мм x 2,1 мм,

Корпус DIY — Drill It Yourself

В металлической части корпуса сверлю отверстия под RPI и шильд. Пожалел, что не подвинул их ближе к передней крышке, эти пару миллиметров очень бы помогли у задней крышки! Удобно сверлить отверстия аккумуляторным шуруповертом с режимом сверла, надо только помнить что он в обе стороны умеет вращать сверло…и так и так можно просверлить отверстия, но если сверло вращается по часов то сверлить гораздо проще и быстрее! Перед сверлением я накернил отверстия, надо это делать с осторожностью а то металла сразу прогибается. Места расположения портов продуманы с учетом, внутренностей и кабелей. Кабеля USB можно засунуть под x725, под RPI можно было засунуть USB NVMe, но буквально не хватает пару миллиметров, коннект USB очень длинный!

На пластмассовой крышке есть разметка внутри, это помогает проделывать отверстия под порты. Использовал шуруповерт и дремель с фрезой.

Разъем питания припаял к кабелю питания. В центре плюс красный, с боку земля черный — подсказка есть на блоке питания. На кабелях USB отрезал на коннекторах защиту от сгибания, а то не влезали

Схема подключения

x725 и RPI соединил обычными ардуиновскими кабелями, первые 7 пинов(со стороны питания два ряда). Пару раз ошибался и кабеля у меня плавились… но RPI и x725(она и до этого фигово работала) выжили! К x725 подключаю часы DS3231 RTC, как раз в перекинутые на ней пины с RPI. Переднею панель присоединяю в последний момент, кнопку подключаю к соответствующему рзьему на x725

Внутри жуткая мешанина из кабелей, но все влезло! Сверху лежит USB NVMe. Вентилятор CPU перевернул, чтобы работал на выдув, на корупсе как раз рядом отверстия! На 3.3 он достаточно слабо, но дует, зато тихо!

Снаружи все прилично и красиво — специально для малинки брал красный корпус!

Для включения нажимаем и отпускаем единственную кнопку! Для выключения нажимаем её же и держим 3-4 секунд, когда она начнет мигать, значит запущен процесс выключения. Если держать долго, принудительно выключится, если 1-2 секунлды то перезашрузится, все это работает только е сли тсаивть скрипты для x725.

Первичная установка на SD карту
Надо ставить Raspberry Pi OS (32-bit) Lite (ранее известный как Raspbian) в этой версии нет Desktop окружения.
Качаю последнею версию тут www.raspberrypi.org/downloads/raspbian/
А вот тут качаю установщик https://www.raspberrypi.org/downloads/

Чтобы ssh работал, на карте в BOOT разделе надо сделать пустой файл с именем ssh и оно после этого будет работать. После этого можно карту вставлять в малинку, подключать ethernet кабель, включать и смотреть какой малинка получила IP я посмотрел на роутере, можно и на малинку руками зайти и посмотреть коммандой
ifconfig
Имя для ssh: pi
и пароль: raspberry

Подключение и загрузка с NVMe по USB
Подключаюсь и гружусь пока с SD карты.
Смотрим какая сейчас прошивка
vcgencmd bootloader_version

Apr 16 2020 18:11:26
version a5e1b95f320810c69441557c5f5f0a7f2460dfb8 (release)
timestamp 1587057086

Не последняя — обновляемся
sudo apt update
sudo apt full-upgrade
sudo rpi-eeprom-update
sudo rpi-eeprom-update -a

Можно и вручную, но только после апдейта всего. Должна появится новая прошивка и надо обновить её, для этого меняем в файле
sudo vi /etc/default/rpi-eeprom-update
слово critical на stable

смотрим какие прошивки есть в
ls /lib/firmware/raspberrypi/bootloader/stable/

ставим последную pieeprom-2020-09-03.bin
sudo rpi-eeprom-update -d -f /lib/firmware/raspberrypi/bootloader/stable/pieeprom-2020-09-03.bin

перезагружаемся
смотрим
vcgencmd bootloader_version

Sep  3 2020 13:11:43
version c305221a6d7e532693cc7ff57fddfc8649def167 (release)
timestamp 1599135103

теперь последняя

NVMe у нас с диском подключен и определятся как sda
Как нибудь скачиваем и кладем на малинку последний образ 2020-08-20-raspios-buster-armhf-lite.zip на сайте нет прямой ссылки, так что как-нибудь!
unzip 2020-08-20-raspios-buster-armhf-lite.zip

Пишем этот образ на NVMe
sudo dd bs=4M if=2020-08-20-raspios-buster-armhf-lite.img of=/dev/sda conv=fsync

Монтируем первый раздел в папку например

sudo mkdir /mnt/usb
sudo mount /dev/sda1 /mnt/usb

тут создаем файл для ssh
sudo touch /mnt/usb/ssh

После этого выключаем малинку, вынимаем SD карту и включаемся!
Все чудесным образом грузится

Делаем второй раздел и шифруем его
Если вам второй раздел не нужен, то и не делайте его! Мне он нужен, чтобы хранить там все данные и вдруг не забить весь диск ими. Так же я буду его шифровать — потому что там будет личная информация, бекапы, пароли и пр.

Опять грузимся с SD. Как говорится операционна система Linux эта файлы — и нам надо всего лишь скопировать все файлы с основного раздела чтобы сделать копию или перенести на новый диск всю ОС!

делаю нужные папки
sudo mkdir /mnt/nvme
sudo mkdir /home/pi/backup/

у меня нужный раздел определился как sda2 монтирую его
sudo mount /dev/sda2 /mnt/nvme
и копирую все файлы
sudo cp -rp /mnt/nvme/* /home/pi/backup/
sudo umount /dev/sda2

ВАЖНО: Копировать надо не просто а с сохоранением всех прав и атрибутов, пожтому в команде p

Смотрю что у нас есть по дискам
sudo fdisk -lu
Информация по NVMe

Disk /dev/sda: 238.5 GiB, 256060514304 bytes, 500118192 sectors
Disk model:                 
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0xcf443634

Device     Boot  Start       End   Sectors   Size Id Type
/dev/sda1         8192    532479    524288   256M  c W95 FAT32 (LBA)
/dev/sda2       532480 500118191 499585712 238.2G 83 Linux

Первый раздел не трогаем, а вот sda2 удаляем и на нем будем делать два раздела!

Запускаем fdisk
sudo fdisk /dev/sda
Странная штуковина но её нельзя использовать командами, только интерактивны режим
чтобы удалить второй раздел нажимаем с enter каждый раз
d
2
w
enter

Запускаем
sudo fdisk /dev/sda
чтобы создать новый второй раздел, надо знать где кончается первый это видно в sudo fdisk -lu обычно fdisk сам должен это понять, но вот у меня нет. Добавлем к этой цифре один и 532480 будет началом второго раздела, а 64013096 концом это означает что размер этого раздела будет окло 30GB
n
p
2
532480
64013096

сомртрим

Disk /dev/sda: 238.5 GiB, 256060514304 bytes, 500118192 sectors
Disk model:                 
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0xcf443634

Device     Boot  Start      End  Sectors  Size Id Type
/dev/sda1         8192   532479   524288  256M  c W95 FAT32 (LBA)
/dev/sda2       532480 64013096 63480617 30.3G 83 Linux

Filesystem/RAID signature on partition 2 will be wiped.

И делаем третий раздел, тут также по цифрам, конец только не указываем использум все что есть
n
p
3
64013097
enter

Чтобы применить иззименения надо еще
w

Делаем фйловую систему
sudo mkfs -t ext4 /dev/sda2
надо также сразу сделать файловую систему на третем разделе, а то малинка псле загрузки постарается расшириться и занять её тоже(как мне кажется)
sudo mkfs -t ext4 /dev/sda3

Монотирую
sudo mount /dev/sda2 /mnt/nvme
и копирую все файлы обратно
sudo cp -rp /home/pi/backup/* /mnt/nvme/

Выключаю, вынимаю SD карту, включаю и теперь два раздела!

Безопасное хранение данных
Можно зашифровать весь диск, но тогда надо вводить на загрузке всегда пароль. Неудобно — так что я буду шифровать только один раздел. Это позволить защитить данные на нем от прямого чтения — если нет шифрования в любой момент можно подключить диск к другому пк и прочитать все данные. Тут тоже надо будет вводит пароль, но в момент его подключения, а не на загрузке.

Обновляемся если не обновлялись
sudo apt update
sudo apt full-upgrade

Устанавливаю то что нужно для шифрования
sudo apt-get install cryptsetup
sudo modprobe dm-crypt sha256 aes

Делаю шифро раздел, тут надо будет придумать пароль
sudo cryptsetup --verify-passphrase luksFormat /dev/sda3 -c aes -s 256 -h sha256
Инициализирую шифро раздел, тут надо будет ввести пароль
sudo cryptsetup luksOpen /dev/sda3 mYdata

И создаю файловую систему, но не просто так а сразу с файловой таблицей. А то если просто создавать, она будет сосздана при певром монтирование — в случае с шифро разделом это создает большую непонятную нагрузку на систему, так что сразу пусть делает!
sudo mkfs -t ext4 -E lazy_itable_init=0,lazy_journal_init=0 /dev/mapper/mYdata

И монтирую

sudo mkdir /mnt/nvme
sudo mount /dev/mapper/mYdata /mnt/nvme

Шифрование конечно нагружает процессор и скорость записи падает.

Я замераял скрость создания файла
sudo dd if=/dev/zero of=test.file count=10000 bs=1048576
Скорости были от 200 до 70 мб в секунду, мне эти результаты не понятны…

Источник бесперебойного питания для Raspberry Pi
У меня было X725 Power Management Board вы эту плату не берите, производитель уже продает новую модель x728 — она должна быть лучше, даже если половина заявленных функций наней работает то она точно уже лучше чем x725. Подробно тут X725 Power Management Board так себе шильд под аккумуляторы 18650 для Raspberry Pi!

На Raspberry Pi надо включить I2C все делают через меню, я сделаю через консоль.

Надо отредактировать файл
sudo vi /boot/config.txt
раскоментить строки

dtparam=i2c_arm=on
dtparam=i2s=on

А так же в файл
sudo vi /etc/modules
добавить

i2c-dev
i2c-bcm2835

И устанавливаем
sudo apt-get install -y python-smbus i2c-tools

Теперь по инструкциям производителя www.suptronics.com/miniPCkits/x725-software.html ставим

wget https://raw.githubusercontent.com/suptronics/x750_x725-script/master/x750.sh
sudo bash x750.sh
printf "%s\n" "alias x750off='sudo x750shutdown.sh'" >> ~/.bashrc
sudo reboot

Он устанавливает скрипты
sudo python /home/pi/x750ups.py
этот показывает напряжение и процент зарядки, результат выводит постоянно в консоль

******************
Voltage: 4.22V
Battery:  104%
******************
******************
Voltage: 4.22V
Battery:  104%
******************

А это команда жестко выключает малинку и x725
x750off
из консоли срабатывает из скриптов нет, но можно вот так выключить
sudo /usr/local/bin/x750shutdown.sh

мне нужно просто один раз получает значение напряжения, так что я убираю все лишнее создаю срипт
sudo vi /home/pi/x725bv.py

с кодом

#!/usr/bin/env python
import struct
import smbus
import sys
import time


def readVoltage(bus):

     address = 0x36
     read = bus.read_word_data(address, 2)
     swapped = struct.unpack("<H", struct.pack(">H", read))[0]
     voltage = swapped * 1.25 /1000/16
     return voltage



bus = smbus.SMBus(1) # 0 = /dev/i2c-0 (port I2C0), 1 = /dev/i2c-1 (port I2C1)

while True:
 print ("{0}".format(readVoltage(bus))) 
 exit()

И баш срикпт, который будет выключать все когда напряжение батарей станет меньше 3,5 это около двух часов работы малинки под нагрузкой
vi /home/pi/batteryoff.sh
с кодом

#!/bin/bash
a=`sudo python /home/pi/x725bv.py`
compare=`echo "$a>3.5" | bc`
if [ $compare -eq 0 ]
then
sudo /usr/local/bin/x750shutdown.sh
fi

Это будет жесткое октлючение… не самый удачный авриант… с кнопки x725 по другому отключает, по хорошему!

Чтобы он запускался сам раз в минуту добавляем в
sudo crontab -e
строку

* * * * * sh /home/pi/batteryoff.sh

Статический IP
в файле раскоменчиваем строки
sudo vi /etc/dhcpcd.conf
и пишем свое, свободный IP вашей подсети(не из DHCP диапазона), и роутер и DNS

interface eth0
static ip_address=192.168.1.11/24
static routers=192.168.1.1
static domain_name_servers=8.8.8.8

Подключаемся к Wi-Fi
Разблокируем Wi-Fi
sudo rfkill unblock 0

Посмотрим сети
sudo iwlist wlan0 scan

Добавляем в файл
sudo vi /etc/wpa_supplicant/wpa_supplicant.conf

вот это со своим именем сети и паролем

network={
    ssid="ITCOOKY_CEO_B"
    psk="passwrod"
}

Перезапускаем Wi-Fi
wpa_cli -i wlan0 reconfigure
И секундч через 20, видим подключение
ifconfig

Подключаемся часы ds3231
Добавдляе в
sudo vi /boot/config.txt
строку

dtoverlay=i2c-rtc,ds3231

Удалеям ненастоящие часы
sudo apt-get purge fake-hwclock

Конфигурируем время
sudo dpkg-reconfigure tzdata

Перезагружаюсь

Смотрю какое сейчас время на часах
sudo hwclock -r

Та можно записать в часы системное время
sudo hwclock -w

Чтобы система брала время из часов на загрузке добавляю в
sudo vi /etc/rc.local
перед exit 0 добавить

/sbin/hwclock -s

это должно писать из RTC время в систему на загрузке

Проверяю, отключаю синхронизацию времени
sudo systemctl disable systemd-timesyncd

Выключаю малинку, и включаю, время актуальное сработало!

включаю обратно синхранизацию времени, для ней как я понимаю нужен интернет
sudo systemctl enable systemd-timesyncd

Ну вот и все, получилось длинно, а ведь еще будет система мониторинга статуса сервера с информрованием… потом…

UPD: Программное отключение Raspberry Pi и X725 Power Management Board
Проблема, с X725 Power Management Board идет срикпт который отключает её саму, но не Raspberry Pi!

После устноавки сриптом от производителя он появляется тут /usr/local/bin/x750shutdown.sh он посылает 1 на 18 пин и X725 выключается, обрывая питание Raspberry Pi, что не очень хорошо… что очень плохо!

Второй скрипт /etc/x750pwr.sh слушает нажатие кнопки на пин 4, и посылает на пин 17 сигнал 1 — так что когда кнопка нажимается достаточно долго, запускает отключение Raspberry Pi, а x725 отключается когда пропадает сигнал на 17 что значит что малинка выключалась — это супер правильное выключение! Проблема в том что нельзя послать на пин 4 сигнал 1 с другого пина малинки чтобы запустить это отключение программно(малинка отключает на X725 нет)… надо полностью как-то нажать кнопку, это можно сделать транзистором!

Беру транзистор 2N3904 подсоединяю по схеме

В транзисторах путаюсь так что смотрите как на картинке. Красный провод от транзистора подпаиваю к красному на кнопке, у самой кнопки а не как на схеме.
На малинке транзистор подключен к пин 27 и земле, на схеме эти пины перекинуты на X725.

И надо нажимать кнопку всего от 3 до 6 секунд, если нажимать 8 должно жестко выключится. Поэтому делаем скрипт
sudo vi bshut.sh
с кодом

#!/bin/bash
shdown=27
echo "$shdown" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio$shdown/direction
echo "1" > /sys/class/gpio/gpio$shdown/value
shtdownstart=$(date +%s%N | cut -b1-13)
while true; do
if [ $(($(date +%s%N | cut -b1-13)-$shtdownstart)) -gt 600 ]; then
exit
fi
done

Запускаем
sudo bash ./bshut.sh

И сработывает нормальное выключение как с кнопки!


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *