Recently, I built an x86 NAS using an Epson ST190E mini PC equipped with an i3-8300T processor (4 cores, 4 threads), 16GB of DDR4 RAM, a 1TB NVMe M.2 SSD, and two 2TB 2.5-inch SATA HDDs. This article focuses on how I installed Feiniu OS on this machine, with a particular emphasis on comparing the pros and cons of bare-metal installation versus virtualized installation.
Virtual Machine Installation (First Attempt)
Initially, I chose to install Feiniu OS via a virtual machine on PVE 9.0.
I followed the installation guide provided on the Feiniu official website: How to Install Feiniu fnOS on a Virtual Machine?.
However, this guide did not mention GPU passthrough.
Since my i3-8300T has an integrated UHD 630 GPU and my primary use for Feiniu is its photo gallery feature, I needed to solve the issue of passing through the UHD 630 GPU to Feiniu OS.
But this didn’t go smoothly.
I tried two methods:
Using PVEtools
Project address: github.com/ivanhak/pvetools
PVEtools offers many commonly used PVE utilities, allowing quick configuration of apt sources and PCI hardware passthrough, including integrated GPU passthrough.
However, after multiple attempts, I found it unsatisfactory—the GPU never showed up in Feiniu.
Manual GPU Passthrough Configuration
With the help of AI, I configured GPU passthrough directly in the PVE terminal.
This mainly involved installing Intel GPU drivers and modifying the /etc/default/grub
file.
Using this method, I successfully passed through the UHD 630 GPU to Feiniu OS.
But this led to another issue—I could no longer manage the Feiniu VM from PVE. The PVE panel couldn’t connect to the Feiniu VM and consistently reported the error: VM 100 qmp command 'set_password' failed - Could not set password
.
Since I couldn’t resolve this issue, I eventually gave up on the virtual machine approach and reinstalled Feiniu OS on bare metal.
Bare-Metal Installation of Feiniu OS
Installing Feiniu on bare metal was much easier. I just followed the official tutorial and clicked “Next” all the way through.
After accessing the web management interface, I confirmed that the CPU’s integrated GPU was automatically detected and working.
However, bare-metal installation wasn’t my original intention—I had planned to use this machine for other tools as well.
Since I had already installed it on bare metal, I decided to test whether Feiniu could handle an All-in-One setup. Reality quickly proved me wrong.
Issues with the App Store
The first problem arose with 1Panel. After installing 1Panel from the Feiniu App Store, I eagerly opened it, only to find that OpenResty refused to install.
At first, I thought it was a Docker image issue and tried various domestic mirrors, but none worked.
Later, I realized it was a path conflict. Feiniu’s 1Panel had set a default www
path during OpenResty installation, which needed to be changed to the actual path.
After resolving this, I successfully installed OpenResty but found that I couldn’t add websites.
Upon inspecting the file directory, I noticed that paths like /usr/local/openresty/nginx/conf/conf.d/*.conf
and /usr/local/openresty/nginx/conf/default/*.conf
didn’t exist. I suspected that this version of 1Panel had been modified by Feiniu—and indeed, it had.
Since Feiniu uses ports 80 and 443 by default, adding websites in 1Panel would require using other ports, which meant modifying nginx settings. However, Feiniu itself relies on nginx, so changing its configuration could introduce instability.
While researching this issue, I came across several posts on the Feiniu forum where users reported that running apt upgrade
caused Feiniu to stop updating. This made me hesitant to proceed.
What frustrated me the most was when I paused 1Panel in Feiniu’s Docker to add a few ports—after making the changes, the entire 1Panel application reset itself.
Since my experience with Docker was limited to Baota and 1Panel, I was unfamiliar with basic concepts like container persistence and was left confused for a while.
Looking at the Feiniu App Store, there were no warnings about this. Thankfully, this wasn’t a production environment—otherwise, 1Panel crashing would have been a major headache.
Next, I tried Baota Panel.
Baota fared slightly better—nginx installed without issues. But it had the same problem as 1Panel: whenever I added a website and tried to open a port in Feiniu’s Docker, the entire container reset.
I also attempted to install 1Panel and OpenResty directly in Feiniu’s Docker, but after multiple tries, it didn’t work as expected.
During my bare-metal testing, I browsed the Feiniu forum and found numerous posts detailing various issues users encountered.
Of course, Feiniu OS itself is updated frequently, with many new features being added and bugs fixed quickly. However, this rapid update pace could impact the stability of the entire system. If I were to install a soft router in a Feiniu VM, I’m not even sure whether the network would remain functional after a Feiniu OS update.
Reluctantly, I returned to the virtual machine installation approach. I considered forgoing Feiniu’s photo gallery and switching to Immich instead, since it can remotely utilize GPU processing. Not having a GPU wouldn’t be a dealbreaker—Synology works fine without one, after all.
Virtual Machine Installation of Feiniu (Second Attempt)
I reinstalled PVE, this time opting for version 8.4 instead of 9.0. PVE 9.0 was just too new—it had only been released 10 days prior, and there were very few tutorials available. Whenever I encountered an issue, it was hard to find solutions, and AI databases couldn’t possibly be updated that quickly.
During the Feiniu installation on PVE 8.4, I didn’t focus on GPU passthrough initially. I proceeded with the default settings and simply clicked through the setup. When adding a second network card in the PCI devices section, I noticed the UHD 630 option and decided to try selecting it.
To my surprise, with just that one click, the GPU showed up in Feiniu’s panel.
Looking back at all the time I had wasted trying to configure GPU passthrough, it turned out to be this simple.
All those elaborate PVE GPU passthrough tutorials I found online made it seem complicated, but PVE supported it by default. What a pleasant surprise.
After installing Feiniu, I didn’t experiment with other Docker applications within Feiniu this time. Instead, I just installed the photo gallery and started scanning photos with AI recognition.
Other functionalities can be handled in a separate Ubuntu virtual machine, completely avoiding potential issues within Feiniu that might lead to a reinstallation. Even though Feiniu claims that reinstalling the OS won’t affect data drives, reconfiguring other features still requires significant effort. Overall, system stability should be the top priority.
Currently, my Feiniu instance is in the initialization phase, requiring substantial computational power. I’ve allocated 3 CPU cores to Feiniu temporarily, leaving 1 core for Ubuntu. Once the photo recognition is complete, I’ll adjust Feiniu to use 2 cores and reserve the remaining one for RouterOS or OpenWrt—I haven’t decided which yet. Given my home network setup, the soft router would have to function as the main router, so I need to evaluate the best approach.
In the next article, I’ll briefly discuss how to secure PVE and Feiniu OS for public network access. I previously tested Feiniu’s built-in FN Connect during the trial phase but didn’t feel entirely comfortable with it. During the third installation, I didn’t log into a Feiniu account or enable remote access. After all, Feiniu is still a small company with just over 20 employees. While they have a good privacy record, there’s no guarantee that FN Connect is entirely free of backdoors. It’s better to take extra precautions with important data.