Why use quite outdated (released in 2016) Dell Wyse 3030 LT terminal under FreeBSD? There are probably many answers to that question. I recently started to use these for my backup purposes … and to be honest I am really pleased with them.
In the past I used to make my own boxes based on Mini ITX motherboards such as these:
- Silent Fanless FreeBSD Server/Desktop
- Silent Fanless FreeBSD Server – DIY Backup
- Silent Fanless FreeBSD Server – Redundant Backup
… and to be honest – I was pretty pleased with their service. The reason that I started to look for alternative and settled on Dell Wyse 3030 LT terminals were Pico ITX power supplies. Both of them failed somewhere between now and 2018. I got replacements from China but then these boxes (without any active cooling) started to overheat. I also tried to replace motherboards with other ones – but still had the same problem. I really wanted to avoid active cooling because it creates a lot of pointless dust. Both inside and outside the case.
My current point of view is that these used Dell Wyse 3030 LT terminals are both cheaper at buy and later at usage costs as they draw a lot less power then the Mini ITX motherboard based ones.
Dell Wyse 3030 LT
The Dell Wyse 3030 LT terminals are not that much powerful – they should be treated as Raspberry Pi boards more then like a casual mini PC. Both because of their power draw and compute power. Here is how such Dell Wyse 3030 LT terminal looks like. I put a 2.5 USB attached hard disk on top of it – its WD Elements with 5 TB capacity. The USB pendrive that is plugged into one of the front USB ports is Lexar S47 32GB USB drive. This is where FreeBSD 13.2-RC6 is installed. I will of course update it when 13.2-RELEASE is ready to rumble.
You may ask why WD Elements and its a good question. The answer is I do not care. I just sort the drives for ‘best price’ order and buy the cheapest one. The other Dell Wyse 3030 LT terminal I got has Seagate Basic Portable 2.5 USB drive instead – also 5 TB in capacity. Works the same well. Cost almost the same. I do not remember which one was better deal but they both were very close.
Ports
The Dell Wyse 3030 LT terminal has quite a few useful ports that most of them I find useful.
These are:
- (1) — 1 x USB 3.0 (front)
- (2) — 2 x USB 2.0 (front)
- (3) — 1 x Mini Jack (front)
- (4) — 1 x LAN 10/100/1000 Realtek RTL8111/8168/8411 (back)
- (5) — 2 x DisplayPort (back)
- (6) — 1 x USB 2.0 (back)
- (*) — 1 x WLAN Intel AC-7265 (internal)
The hardware specs are not that great for today’s standards.
MODEL: Dell Wyse 3030 LT CPU: Intel Celeron N2807 2 x 1.58 GHz (2.16 GHz Turbo) RAM: 2 GB DDR3L (soldered on motherboard) eMMC: 4 GB Flash (soldered on motherboard) mPCI: Intel Dual Band Wireless-AC 7265
I use ZFS filesystem for my data and one may say that 2 GB RAM is not enough for ZFS needs … but OpenZFS page recommends 2 GB RAM as a minimum so I do not have to worry here.
Have enough memory: A minimum of 2GB of memory is recommended for ZFS. Additional memory is strongly recommended when the compression and deduplication features are enabled.
The source of that information comes from OpenZFS FAQ page.
In the past I have successfully run a 512 MB box with 2 x 2 TB ZFS mirror for several years. I have had zero crashes/panics/problems with it. Everything just worked like it suppose to. I also run several simple services on the same 512 MB box – like NFS and SAMBA services to export the available data to machines on the local network. The only thing I did back then was to limit the ARC usage up to 128 MB of RAM. Nothing more.
With current 2 GB RAM that I have configured ARC to be 128-256 MB with following settings in the /etc/sysctl.conf file.
# ZFS ARC
# ZFS TUNING
vfs.zfs.arc.min=134217728
vfs.zfs.arc.max=268435456
The details about that Intel Celeron N2807 CPU can be found on Intel ARK database.
Here are its specs. The most interesting ones are TDP(W).
The lscpu(1) shows following information about it.
wyse3030 % lscpu Architecture: amd64 Byte Order: Little Endian Total CPU(s): 2 Thread(s) per core: 1 Core(s) per socket: 2 Socket(s): 1 Vendor: GenuineIntel CPU family: 6 Model: 55 Model name: Intel(R) Celeron(R) CPU N2807 @ 1.58GHz Stepping: 8 L1d cache: 24K L1i cache: 32K L2 cache: 1024K Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 cflsh ds acpi mmx fxsr sse sse2 ss htt tm pbe sse3 pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 movbe popcnt tsc_deadline rdrnd tsc_adjust smep erms fpcsds syscall nx rdtscp lm lahf_lm
The FreeBSD information about it from /var/run/dmesg.boot looks as follows.
CPU: Intel(R) Celeron(R) CPU N2807 @ 1.58GHz (1583.40-MHz K8-class CPU) Origin="GenuineIntel" Id=0x30678 Family=0x6 Model=0x37 Stepping=8 Features=0xbfebfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH,DTS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE> Features2=0x41d8e3bf<SSE3,PCLMULQDQ,DTES64,MON,DS_CPL,VMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,SSE4.1,SSE4.2,MOVBE,POPCNT,TSCDLT,RDRAND> AMD Features=0x28100800<SYSCALL,NX,RDTSCP,LM> AMD Features2=0x101<LAHF,Prefetch> Structured Extended Features=0x2282<TSCADJ,SMEP,ERMS,NFPUSG> VT-x: PAT,HLT,MTF,PAUSE,EPT,UG,VPID TSC: P-state invariant, performance statistics
Several C-states and P-states are properly supported on FreeBSD as shown below.
wyse3030 % sysctl dev.cpu.0 dev.cpu.0.temperature: 44.0C dev.cpu.0.coretemp.throttle_log: 0 dev.cpu.0.coretemp.tjmax: 100.0C dev.cpu.0.coretemp.resolution: 1 dev.cpu.0.coretemp.delta: 56 dev.cpu.0.cx_method: C1/hlt C2/io dev.cpu.0.cx_usage_counters: 21488971 0 dev.cpu.0.cx_usage: 100.00% 0.00% last 409us dev.cpu.0.cx_lowest: C1 dev.cpu.0.cx_supported: C1/1/1 C2/3/104 dev.cpu.0.freq_levels: 2501/45000 2500/45000 2000/33977 1800/29872 1600/25926 1400/22148 1200/18525 1000/15060 800/11752 dev.cpu.0.freq: 1400 dev.cpu.0.%parent: acpi0 dev.cpu.0.%pnpinfo: _HID=none _UID=0 _CID=none dev.cpu.0.%location: handle=\_PR_.CPU0 dev.cpu.0.%driver: cpu dev.cpu.0.%desc: ACPI CPU
Keep in mind to load coretemp(4) module at system startup to get all needed information.
The output from sensors.sh is available below.
wyse3030 # sensors.sh BATTERY/AC/TIME/FAN/SPEED ------------------------------------ dev.cpu.0.cx_supported: C1/1/1 C2/2/500 C3/3/1500 dev.cpu.0.cx_usage: 26.04% 12.27% 61.68% last 125us dev.cpu.0.freq: 498 hw.acpi.cpu.cx_lowest: C8 powerd(8): running SYSTEM/TEMPERATURES ------------------------------------ dev.cpu.0.temperature: 37.0C (max: 105.0C) dev.cpu.1.temperature: 40.0C (max: 105.0C) hw.acpi.thermal.tz0.temperature: 26.9C (max: 90.1C) DISKS/TEMPERATURES ------------------------------------ smart.da1.temperature_celsius: 37.0C
The biggest drawback is the lack of support for aesni(4) acceleration. Test I had made – with powerd(8) enabled – shows that its able to reach 15-16 MB/s of speed with calculating that encryption on these two cores. Its more then enough for my needs as I rarely go above 10-11 MB/s on the WiFi transfers.
If you are interested how the internals of Dell Wyse 3030 LT motherboard looks like – take a journey to David Parkinson page at Dell Wyse 3030 LT location. You will also find a lot information about other Thin Client software – often also called Terminals.
I did not bothered to unscrew mine knowing what David Parkinson shows on his site.
WiFi
As the Dell Wyse 3030 LT has the Intel Dual Band Wireless-AC 7265 WiFi card from 2014 – almost a decade old WiFi card – there is a big chance that FreeBSD will flawlessly support it and at least allow 802.11n protocol and speed – as its 9 years old.
Here are some specs from Intel on that WiFi card.
… and here is the neat part π – it does not work on FreeBSD – its not able to connect to WiFi access point – what were you thinking π
This is what I tried at both 2.4GHz and 5.0GHz WiFi networks that are WPA2 protected.
wyse3030 # grep iwm /var/run/dmesg.boot
iwm0: <Intel(R) Dual Band Wireless AC 7265> mem 0x88500000-0x88501fff at device 0.0 on pci2
iwm0: hw rev 0x210, fw ver 22.361476.0, address d0:57:7b:13:41:4c
wyse3030 # pciconf -lv iwm0
iwm0@pci0:2:0:0: class=0x028000 rev=0x59 hdr=0x00 vendor=0x8086 device=0x095a subvendor=0x8086 subdevice=0x5410
vendor = 'Intel Corporation'
device = 'Wireless 7265'
class = network
wyse3030 # sysctl -n net.wlan.devices iwm0
wyse3030 # ifconfig wlan0 create wlandev $( !! )
wyse3030 # ifconfig wlan0 up
wyse3030 # ifconfig wlan0 scan SSID/MESH ID BSSID CHAN RATE S:N INT CAPS wifinet d8:07:b6:aa:bb:00 7 54M -63:-96 100 EP APCHANREP WPA RSN BSSLOAD HTCAP VHTCAP VHTOPMODE
wifinet d8:07:b6:aa:bb:02 40 54M -80:-96 100 EP VHTPWRENV APCHANREP WPA RSN HTCAP VHTCAP
These are my WiFi networks that I will try to use:
- WiFi 2.4GHz – wifinet – d8:07:b6:aa:bb:00
- WiFi 5.0GHz – wifinet – d8:07:b6:aa:bb:02
Results below.
WiFi 2.4GHz
wyse3030 # wpa_supplicant -i wlan0 -c /etc/wpa_supplicant.conf Successfully initialized wpa_supplicant ioctl[SIOCS80211, op=20, val=0, arg_len=7]: Invalid argument ioctl[SIOCS80211, op=20, val=0, arg_len=7]: Invalid argument ioctl[SIOCS80211, op=103, val=0, arg_len=128]: Operation now in progress wlan0: CTRL-EVENT-SCAN-FAILED ret=-1 retry=1 wlan0: Trying to associate with d8:07:b6:aa:bb:00 (SSID='wifinet' freq=2442 MHz) wlan0: Authentication with d8:07:b6:aa:bb:00 timed out. wlan0: CTRL-EVENT-DISCONNECTED bssid=d8:07:b6:aa:bb:00 reason=3 locally_generated=1 BSSID d8:07:b6:aa:bb:00 ignore list count incremented to 2, ignoring for 10 seconds wlan0: CTRL-EVENT-DSCP-POLICY clear_all wlan0: Trying to associate with d8:07:b6:aa:bb:00 (SSID='wifinet' freq=2442 MHz) wlan0: Authentication with d8:07:b6:aa:bb:00 timed out. wlan0: CTRL-EVENT-DISCONNECTED bssid=d8:07:b6:aa:bb:00 reason=3 locally_generated=1 BSSID d8:07:b6:aa:bb:00 ignore list count incremented to 2, ignoring for 10 seconds wlan0: CTRL-EVENT-DSCP-POLICY clear_all wlan0: Trying to associate with d8:07:b6:aa:bb:00 (SSID='wifinet' freq=2442 MHz) wlan0: Authentication with d8:07:b6:aa:bb:00 timed out. wlan0: CTRL-EVENT-DISCONNECTED bssid=d8:07:b6:aa:bb:00 reason=3 locally_generated=1 BSSID d8:07:b6:aa:bb:00 ignore list count incremented to 2, ignoring for 10 seconds wlan0: CTRL-EVENT-DSCP-POLICY clear_all wlan0: Trying to associate with d8:07:b6:aa:bb:00 (SSID='wifinet' freq=2442 MHz) ^C
WiFi 5.0GHz
wyse3030 # wpa_supplicant -i wlan0 -c /etc/wpa_supplicant.conf Successfully initialized wpa_supplicant ioctl[SIOCS80211, op=20, val=0, arg_len=7]: Invalid argument ioctl[SIOCS80211, op=20, val=0, arg_len=7]: Invalid argument wlan0: Trying to associate with d8:07:b6:aa:bb:02 (SSID='wifinet' freq=5200 MHz) wlan0: Authentication with d8:07:b6:aa:bb:02 timed out. wlan0: CTRL-EVENT-DISCONNECTED bssid=d8:07:b6:aa:bb:02 reason=3 locally_generated=1 BSSID d8:07:b6:aa:bb:02 ignore list count incremented to 2, ignoring for 10 seconds wlan0: CTRL-EVENT-DSCP-POLICY clear_all wlan0: Trying to associate with d8:07:b6:aa:bb:02 (SSID='wifinet' freq=5200 MHz) wlan0: Authentication with d8:07:b6:aa:bb:02 timed out. wlan0: CTRL-EVENT-DISCONNECTED bssid=d8:07:b6:aa:bb:02 reason=3 locally_generated=1 BSSID d8:07:b6:aa:bb:02 ignore list count incremented to 2, ignoring for 10 seconds wlan0: CTRL-EVENT-DSCP-POLICY clear_all wlan0: Trying to associate with d8:07:b6:aa:bb:02 (SSID='wifinet' freq=5200 MHz) wlan0: Authentication with d8:07:b6:aa:bb:02 timed out. wlan0: CTRL-EVENT-DISCONNECTED bssid=d8:07:b6:aa:bb:02 reason=3 locally_generated=1 BSSID d8:07:b6:aa:bb:02 ignore list count incremented to 2, ignoring for 10 seconds wlan0: CTRL-EVENT-DSCP-POLICY clear_all wlan0: Trying to associate with d8:07:b6:aa:bb:02 (SSID='wifinet' freq=5200 MHz) wlan0: Authentication with d8:07:b6:aa:bb:02 timed out. wlan0: CTRL-EVENT-DISCONNECTED bssid=d8:07:b6:aa:bb:02 reason=3 locally_generated=1 BSSID d8:07:b6:aa:bb:02 ignore list count incremented to 2, ignoring for 10 seconds wlan0: CTRL-EVENT-SSID-TEMP-DISABLED id=0 ssid="wifinet" auth_failures=1 duration=10 reason=CONN_FAILED wlan0: CTRL-EVENT-DSCP-POLICY clear_all wlan0: CTRL-EVENT-SSID-REENABLED id=0 ssid="wifinet" wlan0: Trying to associate with d8:07:b6:aa:bb:02 (SSID='wifinet' freq=5200 MHz) wlan0: CTRL-EVENT-DISCONNECTED bssid=d8:07:b6:aa:bb:02 reason=3 locally_generated=1 wlan0: CTRL-EVENT-DSCP-POLICY clear_all wlan0: CTRL-EVENT-DSCP-POLICY clear_all wlan0: CTRL-EVENT-TERMINATING ^C
… and to be fair – I have used latest and greatest FreeBSD 13.2-RC6 (the 13.2-RELEASE is probably available now). I even installed the comms/iwmbt-firmware package hoping it would solve anything – it does not change anything.
For the record – this is how properly working WiFi connection looks like on FreeBSD.
# ifconfig wlan0 up
# wpa_supplicant -i wlan0 -c /etc/wpa_supplicant.conf
Successfully initialized wpa_supplicant
ioctl[SIOCS80211, op=20, val=0, arg_len=7]: Invalid argument
ioctl[SIOCS80211, op=20, val=0, arg_len=7]: Invalid argument
wlan0: Trying to associate with d8:07:b6:aa:bb:00 (SSID='wifinet' freq=2442 MHz)
wlan0: Associated with d8:07:b6:aa:bb:00
wlan0: WPA: Key negotiation completed with d8:07:b6:aa:bb:00 [PTK=CCMP GTK=CCMP]
wlan0: CTRL-EVENT-CONNECTED - Connection to d8:07:b6:aa:bb:00 completed [id=43 id_str=]
At this point (after you get the CTRL-EVENT-CONNECTED message) you hit [CTRL]+[Z] then type bg at the prompt to keep wpa_supplicant(8) process in the background – and then dhclient wlan0 to get the IP address, default gateway and DNS servers.
The best FreeBSD can get on that box when it comes to WiFi side is Realtek RTL8188CUS tiny USB dongle … but while its 802.11n capable – the FreeBSD is only able to support 802.11g speeds on it. Details here – Realtek RTL8188CUS – USB 802.11n WiFi Review – in one of my older articles.
You now probably understand why I have these two WiFi antennas detached π – but for the record – I have tested the WiFi connection with both antennas attached to that Intel AC 7265 card.
LAN
While WiFi on FreeBSD sucks greatly the builtin LAN – Realtek RTL8111/8168/8411 – works quite well with re(4) driver … but it needs one spacial quirk to work π
All network connections need to be restarted at the end of the boot process to work – if you do not do that – you just do not have network connectivity at all – I was not able to track why its fucked up like that – so I went with the idea to use /etc/rc.local scripts as its already there and its really late in the boot process. Here are mine /etc/rc.local script contents that seem to workaround that fuckup well.
wyse3030 % cat /etc/rc.local #! /bin/sh # RESTART NETWORKING ( service netif restart 1> /dev/null 2> /dev/null service routing restart 1> /dev/null 2> /dev/null ) &
To not waste time I put both netif and routing services in the background for startup.
DisplayPort
The DisplayPort sockets just work – when attached to the 1080p monitor they just deliver. I tried only in the vt(4) console mode. I did not tried X11 mode – but I suspect that the CPU is so old that it will work flawlessly with i915kms.ko driver from graphics/drm-fbsd13-kmod package.
When it comes to early booting – set your native screen resolution in the /boot/loader.conf file as specified below.
# CONSOLE RESOLUTION # --------------------------------------------------------
kern.vt.fb.default.mode=1920x1080 # FORCE FHD
efi_max_resolution=1920x1080 # FORCE FHD
Also – if you (like me) like to have small/smaller font size in the terminal – this will also be helpful in the /boot/loader.conf file.
screen.font=6x12 # USE SMALLEST FONT NO MATTER THE RESOLUTION
USB
The USB ports work as desired. Both USB 2.0 and USB 3.0 ports work without any issues.
I currently use Lexar S47 32 GB USB tiny dongle foe FreeBSD system. I did not yet tested the builtin eMMC 4 GB flash storage space – will probably add some UPDATE about it in the future.
Data
Lets get back to the main responsibility of that box – backups. In the past my main NAS system used to have two 5 TB disks in ZFS mirror – but as I have another offsite copy and another offline copy and I also have my main copy always with me – I now find it pointless to have this single NAS mirrored. Besides – its more then 3-2-1 backup rule anyway …
As this box has 4 USB ports one can of course even create raidz ZFS pool with 3 drives for data and 1 for parity. Nothing stops you from doing that. You will get 15 TB of usable storage that way … not sure how log would it take to rebuild through. As these are SMR drives you may consider raidz2 or mirror instead. I also have some tips for ZFS on SMR Drives here.
Costs
This is the neat part … and I am not joking here. My earlier setups cost about $110 to $120 only for the case/motherboard/PSUs/RAM/etc. You needed to add disk costs to that on top. But not with this one. I got several of these Dell Wyse 3030 LT terminals for less then $18 each … and it was not a one time offer – they just cost that much now.
The disks (5 TB 2.5 USB drives) that I use also got cheaper in time and its relatively easy to get a used one for about $80. Does not matter if its Seagate or Western Digital or whatever. They are very similar cheap 5400 rpm SMR drives.
This make my new backup solution cost about $100 for a 5 TB space of storage.
Configuration
This is the main FreeBSD config /etc/rc.conf file.
wyse3030 % cat /etc/rc.conf # BOOT/SILENCE # ------------------------------------------------------------- rc_startmsgs=NO rc_info=NO # NETWORK # ------------------------------------------------------------------ hostname=wyse3030 ifconfig_re0="inet 10.0.0.2/24" defaultrouter="10.0.0.1" defaultroute_delay=3 defaultroute_carrier_delay=3 gateway_enable=YES # MODULES/COMMON/BASE # ------------------------------------------------------ kld_list="${kld_list} fusefs coretemp sem cpuctl ichsmb" # POWER # -------------------------------------------------------------------- performance_cx_lowest=Cmax economy_cx_lowest=Cmax powerd_enable=YES powerd_flags="-n adaptive -a hiadaptive -b adaptive -m 100 -M 2000" # DAEMONS # ------------------------------------------------------------------ syslogd_flags="-ss" sshd_enable=YES zfs_enable=YES sendmail_enable=NO sendmail_submit_enable=YES sendmail_outbound_enable=NO sendmail_msp_queue_enable=NO # OTHER # -------------------------------------------------------------------- keyrate=fast virecover_enable=NO update_motd=NO hostid_enable=NO entropy_file=NO savecore_enable=NO clear_tmp_enable=YES dumpdev=AUTO
Options that can be changed anytime at /etc/sysctl.conf file below.
wyse3030 % cat /etc/sysctl.conf # SECURITY # ------------------------------------------------------------------ security.bsd.see_jail_proc=0 security.bsd.unprivileged_proc_debug=0 # SECURITY/RANDOM PID # ------------------------------------------------------- kern.randompid=1 # ANNOYING THINGS # ----------------------------------------------------------- vfs.usermount=1 kern.coredump=0 hw.syscons.bell=0 kern.vt.enable_bell=0 # ZFS ASHIFT 4k BLOCK SIZE # -------------------------------------------------- vfs.zfs.min_auto_ashift=12 # ZFS DELETE FUCKUP TRIM # ---------------------------------------------------- vfs.zfs.vdev.trim_max_active=1 # ZFS ARC 128MB FORCE # ------------------------------------------------------- vfs.zfs.arc.min=134217728 vfs.zfs.arc.max=268435456 # JAILS/ALLOW UPGRADES IN JAILS # --------------------------------------------- security.jail.chflags_allowed=1 # JAILS/ALLOW RAW SOCKETS # --------------------------------------------------- security.jail.allow_raw_sockets=1 # ALLOW idprio(8) USE BY REGULAR USER # --------------------------------------- security.bsd.unprivileged_idprio=1
… and last but not least (actually first :> to be read) the /boot/loader.conf file.
wyse3030 % cat /boot/loader.conf # CONSOLE COMMON # ------------------------------------------------------------ autoboot_delay=2 # USE '-1' => NO WAIT | USE 'NO' => INFINITE WAIT loader_logo=none # LOGO POSIBILITES: fbsdbw beastiebw beastie none loader_menu_frame=none # REMOVE FRAMES FROM FreeBSD BOOT MENU screen.font=6x12 # USE SMALLEST FONT NO MATTER THE RESOLUTION # CONSOLE RESOLUTION # -------------------------------------------------------- kern.vt.fb.default.mode=1920x1080 # FORCE FHD efi_max_resolution=1920x1080 # FORCE FHD # MODULES # ------------------------------------------------------------------- geom_eli_load=YES cryptodev_load=YES zfs_load=YES # DISABLE /dev/diskid/* AND /dev/gptid/* ENTRIES FOR DISKS # ------------------ kern.geom.label.disk_ident.enable=0 kern.geom.label.gptid.enable=0 # COLORS # -------------------------------------------------------------------- kern.vt.color.0.rgb="#000000" kern.vt.color.1.rgb="#dc322f" kern.vt.color.2.rgb="#859900" kern.vt.color.3.rgb="#b58900" kern.vt.color.4.rgb="#268bd2" kern.vt.color.5.rgb="#ec0048" kern.vt.color.6.rgb="#2aa198" kern.vt.color.7.rgb="#94a3a5" kern.vt.color.8.rgb="#586e75" kern.vt.color.9.rgb="#cb4b16" kern.vt.color.10.rgb="#859900" kern.vt.color.11.rgb="#b58900" kern.vt.color.12.rgb="#268bd2" kern.vt.color.13.rgb="#d33682" kern.vt.color.14.rgb="#2aa198" kern.vt.color.15.rgb="#6c71c4" # RACCT/RCTL RESOURCE LIMITS # ------------------------------------------------ kern.racct.enable=1 # ZFS TUNING # ---------------------------------------------------------------- vfs.zfs.prefetch_disable=1 # POWER MANAGEMENT POWER OFF DEVICES WITHOUT ATTACHED DRIVER # ---------------- hw.pci.do_power_nodriver=3 # POWER MANAGEMENT FOR EVERY USED AHCI CHANNEL (ahcich 0-7) # ----------------- hint.ahcich.0.pm_level=5 hint.ahcich.1.pm_level=5 hint.ahcich.2.pm_level=5 hint.ahcich.3.pm_level=5 hint.ahcich.4.pm_level=5 hint.ahcich.5.pm_level=5 hint.ahcich.6.pm_level=5 hint.ahcich.7.pm_level=5 # DISABLE DESTRUCTIVE DTrace # ------------------------------------------------ security.bsd.allow_destructive_dtrace=0
There is also this 5 TB disk drive configuration to be mentioned.
wyse3030 # gpart destroy -F da0
wyse3030 # dd if=/dev/zero of=/dev/da0 bs=1m status=progress count=10
wyse3030 # gpart create -s GPT da0
wyse3030 # gpart add -t freebsd-zfs -a 4k da0
wyse3030 # geli init -s 4096 da0p1
wyse3030 # geli attach da0p1
Why I use password based encryption and not based on key? If someone would steal that device then with attached key on – for example – USB drive – all the data would be accessible – and all encryption and effort would be lost. With password based encryption whoever steals the devices gets some nice /dev/random input from my disk because its encrypted.
In the end these boxes do not hang by themselves and when there is power outage – its not that common like twice a week. Its more like once a quarter – I do not mind typing my password once in a quarter to make my data safe from people that should not be allowed to access it.
ZFS Pool Configuration
I did not used anything spectacular for ZFS configuration – just disabled atime and enabled compression that would save some space. I also increased the recordsize to 1M so the compressratio would be a little better … but nothing more to be honest.
wyse3030 # zpool history wd History for 'wd': 2023-04-05.14:46:01 zpool create wd /dev/da0p1.eli 2023-04-05.14:46:07 zfs set compression=zstd wd 2023-04-05.14:46:12 zfs set atime=off wd 2023-04-05.14:46:15 zfs set recordsize=1m wd 2023-04-05.14:51:46 zfs create wd/data 2023-04-05.14:51:50 zfs set mountpoint=none wd 2023-04-05.14:52:00 zfs set mountpoint=/data wd/data
As you probably guessed the wd name is for the Western Digital 5 TB drive. If you are curious (and you probably are) the second ZFS pool is called seagate π
Last time I used the LZ4 compression for the ZFS pool. Not I use the ZSTD compression and the compressratio improved from 1.04 to 1.07 – almost twice more efficient.
wyse3030 % zfs get compressratio
NAME PROPERTY VALUE SOURCE
wd compressratio 1.07x -
wd/data compressratio 1.07x -
One may think that 7% of more data space is almost ‘non-existent’ – think again. When it comes to terabytes it makes a big difference. In my case when my real data takes 4.2 TB and compressed one takes 3.9 TB its … 245 GB of space. For free. Thank you ZFS.
Quirks
The ‘quirks’ are things that need to be done differently then usual to make the device ‘happy’ – to make it work the way we want.
One of the Dell Wyse 3030 LT quirks is its bot process … it does not need any additional configuration – I just want to mention it – so you will not be stressed about it. After the FreeBSD loader(8) menu there is slight pause before continuing into the ‘rest’ of the boot process. Its several seconds long and its harmless. Here is how it looks on attached screen.
Power Usage Comparison
So its dirt cheap … and takes HALF of the power then my previews Mini ITX solution. The Mini ITX based systems used about 10.4 W of power when at idle state.
After measuring the Dell Wyse 3030 LT terminal power consumption with a kill-a-watt physical device – its only about 4.5 W only … and this is with % TB of 2.5 disk attached at idle state.
Another interesting fact is that I used the same ‘external’ power supply that I used for these Mini ITX boxes.
Its 2.5A at 12V (which means 30 W)- exactly what a Dell Wyse 3030 LT terminal needs – according to its specification. As you can see from the photo above – the official power supply – while quite similar in size – needs a lot more space because of the additional 3-pin power cord – which is quite thick and takes a lot more space.
As in the past – I used python(1) [1] processes to load the CPU and dd(8) commands to load the drives I/O subsystem.
[1] # echo '999999999999999999 ** 999999999999999999' | python
[2] # dd if=/dev/da0 of=/dev/null bs=1M
[3] # dd if=/dev/zero of=/data/FILE bs=1M
I will also include older Mini ITX based system measurements.
BOX POWER CPU I/O Wyse3030 3.8 W IDLE IDLE MiniITX 10.5 W IDLE IDLE BOX POWER CPU I/O Wyse3030 10.3 W 8 Thread(s) 3 DISK READ Thread(s) + 3 DISK WRITE Thread(s) MiniITX 17.8 W 8 Thread(s) 3 DISK READ Thread(s) + 3 DISK WRITE Thread(s)
So after cutting CAPEX costs from about $110 to $15 I also lowered the OPEX price in half.
What can I say … I really appreciate and like the price/performance ratio π
Cloud Storage Costs Comparison
I am not a fan of cloud based storage – its just damn overpriced to say the least.
In the past I have made multiple calculations about cloud storage costs and it will be no different this time. We need to assume some cost of 1kWh of power. In Poland its about $0.25 for 1kWh which means running a device that draws 1000 Watts for entire hour.
Assuming that our Dell Wyse 3030 LT uses about 4.5W all the time it would make the following costs.
COST TIME $0.03 1 DAY(s) $9.96 1 YEAR(s) $29.88 3 YEAR(s) $49.80 5 YEAR(s)
Combining that with server cost ($100) we get TCO for our self hosted 5TB storage service.
COST TIME $110 1 YEAR(s) $130 3 YEAR(s) $150 5 YEAR(s)
This time after searching for cheapest cloud based storage I found these services.
- Amazon Drive
- Amazon S3 Glacier Storage
- Backblaze B2 Cloud Storage
- Google One
- Dropbox Basic
Here is its cost summarized for 1 year period for 5TB of data.
PRICE TIME SERVICE $300 1 YEAR(s) Amazon Drive $310 1 YEAR(s) Google One $240 1 YEAR(s) Amazon S3 Glacier Storage $450 1 YEAR(s) Backblaze B2 Cloud Storage $360 1 YEAR(s) Dropbox Basic
For the Backblaze B2 Cloud Storage I assumed average between upload/download price because upload is two times cheaper then download.
Here is its cost summarized for 5 year period for 5 TB of data.
PRICE TIME SERVICE
$150 5 YEAR(s) Dell Wyse 3030 LT + 5 TB USB 2.5 Drive
$230 5 YEAR(s) Dell Wyse 3030 LT + 5 TB USB 2.5 Drive (assuming drive failed)
$1500 5 YEAR(s) Amazon Drive
$1550 5 YEAR(s) Google One
$1200 5 YEAR(s) Amazon S3 Glacier Storage
$2250 5 YEAR(s) Backblaze B2 Cloud Storage
$1800 5 YEAR(s) Dropbox Basic
… but there is also a catch here. Recently I was able to get a lifetime offer for 1 TB of cloud storage. It cost me about $170 for that 1 TB.
This is where it gets interesting – for 5 TB we would have to pay $850 for lifetime cloud storage. Lets calculate where the ‘personal’ NAS is comparable to ‘lifetime’ cloud storage.
PRICE TIME SERVICE
$230 5 YEAR(s) Dell Wyse 3030 LT + 5 TB USB 2.5 Drive => assuming drive failed 1 time(s)
$460 10 YEAR(s) Dell Wyse 3030 LT + 5 TB USB 2.5 Drive => assuming drive failed 2 time(s)
$690 15 YEAR(s) Dell Wyse 3030 LT + 5 TB USB 2.5 Drive => assuming drive failed 3 time(s)
$920 20 YEAR(s) Dell Wyse 3030 LT + 5 TB USB 2.5 Drive => assuming drive failed 4 time(s)
$850 UNLIMITED {5TB unlimited time cloud vendor}
So … it will take you about 20 years of your life (and an assumption that a drive will fail every 5 years with 4 drive fails total) to make it less expensive then the unlimited cloud storage. To be honest – I would get such unlimited cloud storage for most important files and documents for example in 1 TB or less size. Keep an encrypted backup copy the most important files and you are doing better then the classic 3-2-1 backup rule … assuming that you already have one online and one offline backup and also one onsite backup and one offsite backup … and at least two different medium types used π
Drawbacks
WiFi is not supported and network requires restart after boot. Besides these I did not find any other issues.