9 min read

Расширяем функционал WD PR2100.

Это двухдисковый NAS от Western Digital из линейки My Cloud Pro памяти, общие характеристики такие:

  • 2 корзины для дисков
  • 4Гб оперативной памяти
  • 4-х ядерный процессор N3710
  • 2 ethernet порта
  • 2 разьема питания
  • Наличие UART

Подробный обзор можно почитать тут.


Cloud OS5

Родное ПО позволяет ставить разного рода приложения, вроде transmission, plex, joomla и т.п. Так же есть возможность установить приложение вручную загрузив его в виде zip архива. В родном магазине приложений много чего есть, но не все. Приложения от комьюнити можно найти тут и установить вручную.

Стоит отметить что родная прошивка NAS имеет возможность включить доступ по ssh. Включаем и смотрим:

~$ ssh sshd@hub-local

BusyBox v1.30.1 (2023-01-16 13:49:52 UTC) built-in shell (ash)
Enter 'help' for a list of built-in commands.
root@hub-local ~ # uname -a
Linux hub-local 4.14.22 #1 SMP Thu Oct 27 07:52:40 UTC 2022 Build-38 x86_64 GNU/Linux
root@hub-local ~ # cat /proc/cmdline
BOOT_IMAGE=/uImage root=/dev/ram0 rootfstype=ramfs rootwait console=ttyS0,115200n8 net.ifnames=0 acpi_enforce_resources=lax
root@hub-local ~ #

Устарело

Пользуясь моментом глянул что отвечает за web интерфейс:

root@hub-local ~ # ps ax |grep nas
4118 root 709m S nasAdmin -configPath /etc/nasAdmin.toml
4357 root 978m S upnp_nas_device -webdir /etc/upnp
12688 root 4548 R grep nas
root@hub-local ~ # cat /etc/nasAdmin.toml
[ports]
httpPort = 80
httpsPort = 8543
proxyPort = 8000
sdkClientPort = 8001

[timeouts]
accessTokenTimeoutSec = 300
refreshTokenTimeoutMin = 15
httpTimeoutSec = 180
maxSessionTimeoutSec = 7200

[logging]
stackTrace = false
debugLogging = false

[tls]
enabled = true
logoutWaitSec = 600
restartDelaySec = 172800
certDirectory = "/mnt/HD/HD_a2/restsdk-info/data/crypto2/prod/"
cacheDirectory = "/usr/local/config/certCache"
certWatchRetrySec = 600

[rate_limiters]

[rate_limiters.auth]
requests = 20
seconds = 60
prefix = "auth"

[rate_limiters.gen]
requests = 4000
seconds = 600
prefix = "gen"

[rate_limiters.base]
requests = 2000
seconds = 600
prefix = "base"

Можно поменять в конфиге http порт и рестартнуть сервис:

killall nasAdmin ; sed -i 's/httpPort = 80/httpPort = 7080/' /etc/nasAdmin.toml ; nasAdmin -configPath /etc/nasAdmin.toml &

У нас освободился 80 порт, который будет полезен для прокси вроде nginx или traefik которые можно поднять в докере. Однако у такого решения есть и минусы, после перезагрузки изменения не остаются и nasAdmin стартанет на 80 порту из-за чего не запустится контейнер с прокси.

Оказывается в настройках есть опция перенаправления портов.

можно просто перенаправить 80 на 8080 и разрулить все через прокси

Docker

Докер устанавливается сразу с portainer.

при желани можно поставить другую админку, например Yacht.

пока что у меня используются:

  • Home Assistant
  • Pi-hole
  • контейнер с сайтом

Установка Debian

В какой то момент я наткнулся на тот факт что любое подключенное устройство в usb порт может быть распознано только как накопитель, а у знал я это подключив zigbee координатор. Учитывая что на борту у NAS'а полноценный линукс, хоть и достаточно хитро запакованный, то появилась идея запустить там свою систему, по возможности не отказываясь от уже имеющегося функционала. Из обзоров на коробку можно было понять что "прошивка" там находится на распаянной mmc памяти. Смотрим что у нас есть:

root@hub-local ~ # ls -l /dev/mmcblk0*
brw-rw----    1 root     root      179,   0 Dec 15 21:38 /dev/mmcblk0
brw-rw----    1 root     root      179,  16 Dec 15 21:38 /dev/mmcblk0boot0
brw-rw----    1 root     root      179,  32 Dec 15 21:38 /dev/mmcblk0boot1
brw-rw----    1 root     root      179,   1 Dec 15 21:38 /dev/mmcblk0p1
brw-rw----    1 root     root      179,   2 Dec 15 21:39 /dev/mmcblk0p2
brw-rw----    1 root     root      179,   3 Dec 15 21:39 /dev/mmcblk0p3
brw-rw----    1 root     root      179,   4 Dec 15 21:39 /dev/mmcblk0p4
brw-rw----    1 root     root      179,   5 Dec 15 21:39 /dev/mmcblk0p5
brw-rw----    1 root     root      179,   6 Dec 15 21:39 /dev/mmcblk0p6
brw-rw----    1 root     root      179,   9 Dec 15 21:39 /dev/mmcblk0p9
brw-rw----    1 root     root      179,  48 Dec 15 21:38 /dev/mmcblk0rpmb

Немного погуглив, нашел несколько постов на форуме комьюнити wd: usb to serial uart и debian linux on the my cloud. Можно подключиться к uart на плате:

на фото PR4100, но на PR2100 все аналогично

соблюдая порядок подключения:

GND <--> GND
 RX <--> TX
 TX <--> RX
VCC <--> NO CONNECTION

и смотреть через minicom как в монитор. Подключаемся и смотрим:

sudo minicom -D /dev/ttyUSB0 -b 115200 -8

Полноценный bios, из полезного есть boot overwrite, я поправил настройки загрузки и теперь при обнаружении usb накопителя будет попытка загрузиться с него. Далее грузится сам linux версии 4.14, не самое свежее, но тем не менее. Есть несколько вариантов получить свой linux :

  • Подключить диск с флешкой и через minicom ставить руками самому.
  • Тоже самое, но с использованием preseed. Preseed это такая штука которая позволяет задать свои параметры для установки debian систем. Можно заранее все прописать и получить готовую к использованию систему без дополнительного вмешательства.
  • Использовать debootstrap, как в случае с DNS-325.
  • В теории можно поставить систему в kvm, сконфигурировать как нужно, а потом раскать на диск и загрузиться с него.
  • Затереть существующие разделы на mmc и записать туда свою ОС.

Я пошел по второму пути и решил ставить Debian12 minimal.
Качаем образ:
https://mirror.yandex.ru/debian-cd/12.4.0/amd64/iso-cd/debian-12.4.0-amd64-netinst.iso
Записываем на флешку любым удобным способом, я записывал через unetbootin.
Теперь нам надо сделать свой preseed.cfg с таким содержимым:

### Preseed (Automated Install):

### Splash
d-i debian-installer/splash boolean false

### Localization
d-i debian-installer/locale string en_US

### Keyboard Selection
d-i keyboard-configuration/xkb-keymap select us

### Network Configuration
d-i netcfg/choose_interface select auto
d-i netcfg/get_ipaddress string 172.19.0.5
d-i netcfg/get_netmask string 255.255.255.0
d-i netcfg/get_gateway string 172.19.0.1
d-i netcfg/get_nameservers string 8.8.8.8
d-i netcfg/confirm_static boolean true


### Hardware Detection
d-i ethdetect/prompt_missing_firmware boolean false
d-i hw-detect/load_firmware boolean true

### Network Console (username is installer)
#d-i anna/choose_modules string network-console
#d-i network-console/password password r00tme
#d-i network-console/password-again password r00tme
#d-i network-console/authorized_keys_url string http://10.0.0.1/openssh-key

### Mirror Settings
d-i mirror/country string manual
d-i mirror/http/hostname string mirror.yandex.ru
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string

### Account Setup
d-i passwd/make-user boolean false
d-i passwd/root-password password r00tme
d-i passwd/root-password-again password r00tme

### Clock and Time Zone
d-i clock-setup/utc boolean true
d-i time/zone string EU/Moscow
d-i clock-setup/ntp boolean true

### Partitioning
d-i partman-efi/non_efi_system boolean true
d-i partman-auto/disk string /dev/sda
d-i partman-auto/method string regular
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-md/device_remove_md boolean true
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true
d-i partman-auto/choose_recipe select atomic
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
d-i partman-md/confirm boolean true
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true

### Apt Setup
d-i apt-setup/non-free boolean true
d-i apt-setup/contrib boolean true
#d-i apt-setup/use_mirror boolean false
#d-i apt-setup/services-select multiselect security, updates
#d-i apt-setup/security_host string security.debian.org

### Package Selection
tasksel tasksel/first multiselect standard, web-server
d-i pkgsel/include string openssh-server
d-i pkgsel/upgrade select none
popularity-contest popularity-contest/participate boolean false

### Bootloader Installation
d-i grub-installer/only_debian boolean true
d-i grub-installer/with_other_os boolean false
d-i grub-installer/bootdev string /dev/sda
d-i debian-installer/add-kernel-opts string nomodeset acpi_osi=Linux acpi_enforce_resources=lax console=ttyS0,115200n8

### Finish
d-i finish-install/reboot_in_progress note
d-i debian-installer/exit/poweroff boolean true

### Custom Commands
# This command is run just before the install finishes, but when there is
# still a usable /target directory. You can chroot to /target and use it
# directly, or use the apt-install and in-target commands to easily install
# packages and run commands in the target system.
#d-i preseed/late_command string LINUX COMMANDS GO HERE
d-i preseed/late_command string in-target sed -i 's/PermitRootLogin.*/PermitRootLogin yes/g' /etc/ssh/sshd_config

В процессе установки у root будет установлен пароль r00tme, так же небольшие предварительные настройки, включая возможность логина root по ssh. Теперь открываем /boot/grub/grub.cfg на флешке и приводим к такому виду:

if [ x$feature_default_font_path = xy ] ; then
   font=unicode
else
   font=$prefix/font.pf2
fi

if loadfont $font ; then
  set gfxmode=800x600
  set gfxpayload=keep
  insmod efi_gop
  insmod efi_uga
  insmod video_bochs
  insmod video_cirrus
  insmod gfxterm
  insmod png
  terminal_output gfxterm
fi

if background_image /isolinux/splash.png; then
  set color_normal=light-gray/black
  set color_highlight=white/black
elif background_image /splash.png; then
  set color_normal=light-gray/black
  set color_highlight=white/black
else
  set menu_color_normal=cyan/blue
  set menu_color_highlight=white/blue
fi

insmod play
play 960 440 1 0 4 440 1
set theme=/boot/grub/theme/1
menuentry --hotkey=i 'Automated Install' {
    set background_color=black
    linux    /install.amd/vmlinuz debian-installer/locale=en_US keyboard-configuration/xkb-keymap=us preseed/file=/cdrom/preseed.cfg console=ttyS0,115200n8
    initrd   /install.amd/initrd.gz
}

Подключаем флешку и диск к NAS, включаем и ждем пока выключится, так же можно посмотреть за процессом через minicom, весь вывод будет идти через uart. В результате получаем полноценный домашний сервер, без ограничений производителя, однако не без проблем.

  • Не работает управление вентилятором из-за чего вентилятор работает на максимальных оборотах и очень неприятно шумит. Как именно управляется вентилятор я сам понять не смог. Нашел такой проект на гитхабе: wdnas-hwtools.
    Не смотря на то что проект больше мертв чем жив у меня сервис завелся и вентилятор перестал шуметь. Однако не без багов, NAS периодически выключался или перезагружался. Возможно когда-нибудь напишут свой сервис для контроля вентиляторами и прочими кнопками, а пока могу только поделиться логами wdhwd:
...
2023-09-06 07:14:06,293 - wdhwlib.fancontroller - ERROR - SystemTemperatureMonitor: Failed to read temperature: No response received before timeout was reached
2023-09-06 07:14:40,395 - wdhwlib.fancontroller - WARNING - SystemTemperatureMonitor: No temperature reading available, level is 7
2023-09-06 07:14:40,560 - wdhwlib.wdpmcprotocol - ERROR - PMCProcessor: Unexpected out-of-order response 'FAN'
2023-09-06 07:14:40,607 - __main__ - ERROR - FanControllerImpl: Fan error detected
2023-09-06 07:14:40,868 - __main__ - ERROR - PMCCommandsImpl: Out-of-sequence PMC message received (code = 'FAN', value = '14')
2023-09-06 07:14:41,985 - __main__ - ERROR - FanControllerImpl: Fan error detected
...
2023-09-10 11:50:12,075 - __main__ - ERROR - FanControllerImpl: Fan error detected
2023-09-10 11:50:13,972 - wdhwlib.wdpmcprotocol - ERROR - PMCProcessor: Unexpected out-of-order response 'ACK'
2023-09-10 11:50:13,975 - wdhwlib.fancontroller - WARNING - SystemTemperatureMonitor: No temperature reading available, level is 7
2023-09-10 11:50:14,004 - __main__ - ERROR - PMCCommandsImpl: Out-of-sequence PMC message received (code = 'ACK', value = 'None')
2023-09-10 11:50:14,940 - __main__ - ERROR - FanControllerImpl: Fan error detected
2023-09-10 11:50:16,042 - __main__ - ERROR - FanControllerImpl: Fan error detected
...
  • Диски сами не засыпают. Лечится установкой hd-idle и прописыванием в конфиг /etc/default/hd-idle следующее:
# defaults file for hd-idle

START_HD_IDLE=true
HD_IDLE_OPTS="-i 1200 -l /var/log/hd-idle.log”
  • В процессе установки промахнулся с дисками и grub случайно записался на mmc что привело к невозможности загрузки родной ОС. Сначала я думал что затерся бутлоадер и переписал первые 446 байт из бэкапа:
dd if=full_emmc_image of=/dev/mmcblk0 bs=446 count=1

Однако результата не последовало, grub все так же выдавал командную строку.
В действительности проблему решило удаление каталога debian в EFI.

В остальном все работает без проблем. В качестве панели управления всем этим я попробовал OMV. Лично мне показался сложным, к тому же он хорош для управлением сервера как NAS. Докер можно поставить, а вот transmission уже нет. Точней поставить то можно, но конфигурировать его надо отдельно, из web интерфейса OMV этого сделать не получится.


Вывод

Не смотря на то что полноценная ОС имеет свои преимущества, она имеет и весьма серьезные недостатки. Проснуться в 4 часа ночи из-за того что wdwhd сбойнул и решил включить вентилятор на максимум, это не круто. Я вернулся обратно на стандартную Cloud OS5 т.к. с ней NAS работает стабильней.