<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Proxmox VE on ousfifty's blog</title><link>https://blog.ous50.moe/en/tags/proxmox-ve/</link><description>Recent content in Proxmox VE on ousfifty's blog</description><generator>Hugo -- gohugo.io</generator><language>en-US</language><copyright>ousfifty 2020-</copyright><lastBuildDate>Fri, 08 Aug 2025 11:26:29 +0800</lastBuildDate><atom:link href="https://blog.ous50.moe/en/tags/proxmox-ve/index.xml" rel="self" type="application/rss+xml"/><item><title>Advanced FnOS Configuration and Usage Tips</title><link>https://blog.ous50.moe/en/p/advanced-fnos-configuration-and-usage-tips/</link><pubDate>Fri, 08 Aug 2025 11:26:29 +0800</pubDate><guid>https://blog.ous50.moe/en/p/advanced-fnos-configuration-and-usage-tips/</guid><description>&lt;p&gt;This article focuses on optimizing &lt;a class="link" href="https://www.fnnas.com/" target="_blank" rel="noopener"
 &gt;FnOS&lt;/a&gt;. For instructions on installing FnOS on PVE or a physical machine, please see the &lt;a class="link" href="../installing-fnos-on-proxmox-ve-pve/" &gt;previous article&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="network-optimization"&gt;&lt;a href="#network-optimization" class="header-anchor"&gt;&lt;/a&gt;Network Optimization
&lt;/h2&gt;&lt;p&gt;The following optional steps can improve network throughput and privacy.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Execute this script to enable the BBR congestion control algorithm:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; /etc/sysctl.d/99-enable-bbr.conf &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.core.default_qdisc=fq
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.ipv4.tcp_congestion_control=bbr
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Apply the BBR configuration without rebooting:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sysctl -p /etc/sysctl.d/99-enable-bbr.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Execute this script to enable modern IPv6 privacy address standards (RFC 7217 and RFC 4941):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; /etc/sysctl.d/99-enable-private-ipv6.conf &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.ipv6.conf.all.use_tempaddr = 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.ipv6.conf.default.use_tempaddr = 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.ipv6.conf.all.addr_gen_mode=1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.ipv6.conf.default.addr_gen_mode=1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Apply the sysctl configuration:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sysctl -p /etc/sysctl.d/99-enable-private-ipv6.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;🚨 &lt;strong&gt;Warning&lt;/strong&gt;: Do not use the “EUI-64” option in the FnOS web interface. Doing so will &lt;strong&gt;negate these privacy enhancements by exposing the device’s MAC address&lt;/strong&gt; in its IPv6 address.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Applying Network Changes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To activate the new IPv6 address settings, the network interface must be reset. This can be done with &lt;code&gt;nmcli&lt;/code&gt; without a full system reboot.&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;🚨 Important&lt;/strong&gt;: Execute these commands from the PVE web console (&lt;code&gt;Xterm.js&lt;/code&gt;), as running them over SSH &lt;strong&gt;will cause a disconnection due to the IPv6 address change&lt;/strong&gt; and may not be recoverable.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Step 1: Identify the Connection Name&lt;/strong&gt;
List all active connections to find the name of your primary interface.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nmcli connection show
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The output will list available connections. Note the name of your Ethernet connection, which is often &lt;code&gt;Wired connection 1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 2: Reset the Connection&lt;/strong&gt;
Use the identified name to restart the network interface:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nmcli connection down &lt;span class="s2"&gt;&amp;#34;Wired connection 1&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; nmcli connection up &lt;span class="s2"&gt;&amp;#34;Wired connection 1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The network interface will restart. You can confirm the new IPv6 address configuration using &lt;code&gt;ip a&lt;/code&gt; or in the &lt;code&gt;Summary&lt;/code&gt; page for the VM in the PVE web console.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Enabling IPv6 Router Advertisements (RA) for Hosted Virtual Machines&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To allow VMs inside it to also acquire IPv6 addresses via SLAAC, its RA settings must be changed:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; /etc/sysctl.d/99-virtual-machine.conf &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.ipv6.conf.all.accept_ra = 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.ipv6.conf.default.accept_ra = 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sysctl -p /etc/sysctl.d/99-virtual-machine.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="enabling-memory-and-cpu-hot-plug-as-a-pveqemu-guest"&gt;&lt;a href="#enabling-memory-and-cpu-hot-plug-as-a-pveqemu-guest" class="header-anchor"&gt;&lt;/a&gt;Enabling Memory and CPU Hot-plug as a PVE/QEMU Guest
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Modify &lt;code&gt;/etc/default/grub&lt;/code&gt; to enable memory hot-plug:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;- GRUB_CMDLINE_LINUX=&amp;#34;modprobe.blacklist=pcspkr&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ GRUB_CMDLINE_LINUX=&amp;#34;modprobe.blacklist=pcspkr memhp_default_state=online&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a UDEV rule to enable CPU hot-plug:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; /lib/udev/rules.d/80-hotplug-cpu.rules &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;SUBSYSTEM==&amp;#34;cpu&amp;#34;, ACTION==&amp;#34;add&amp;#34;, TEST==&amp;#34;online&amp;#34;, ATTR{online}==&amp;#34;0&amp;#34;, ATTR{online}=&amp;#34;1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Shut down the virtual machine.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the PVE web console, on the &lt;code&gt;Processor&lt;/code&gt; page, check &amp;ldquo;Enable NUMA&amp;rdquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the PVE web console, on the &lt;code&gt;Options&lt;/code&gt; page, check &lt;code&gt;Memory&lt;/code&gt; and &lt;code&gt;CPU&lt;/code&gt; in the &amp;ldquo;Hotplug&amp;rdquo; options list.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>Installing FnOS on Proxmox VE (PVE)</title><link>https://blog.ous50.moe/en/p/installing-fnos-on-proxmox-ve-pve/</link><pubDate>Sun, 03 Aug 2025 10:12:00 +0800</pubDate><guid>https://blog.ous50.moe/en/p/installing-fnos-on-proxmox-ve-pve/</guid><description>&lt;h2 id="introduction"&gt;&lt;a href="#introduction" class="header-anchor"&gt;&lt;/a&gt;Introduction
&lt;/h2&gt;&lt;p&gt;This document addresses common issues encountered on the process of &lt;strong&gt;installing FnOS in a PVE environment&lt;/strong&gt;, such as a locked system and an unresponsive PVE web console. By following these steps, you will achieve a fully accessible, secure, and optimized FnOS virtual machine.&lt;/p&gt;
&lt;p&gt;If you have already &lt;strong&gt;completed the installation and want to see more optimization tips&lt;/strong&gt;, please see &lt;a class="link" href="../advanced-fnos-configuration-and-usage-tips/" &gt;this article&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="pre-installation"&gt;&lt;a href="#pre-installation" class="header-anchor"&gt;&lt;/a&gt;Pre-Installation
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;FnOS ISO&lt;/strong&gt;: Visit &lt;a class="link" href="https://www.fnnas.com/" target="_blank" rel="noopener"
 &gt;https://www.fnnas.com/&lt;/a&gt; and obtain it via “Direct Download”.&lt;/p&gt;
&lt;p&gt;It is recommended that the FnOS VM has at least 3GB of RAM and 2 cores.&lt;/p&gt;
&lt;p&gt;Follow the &lt;a class="link" href="https://help.fnnas.com/articles/fnosV1/start/install-os.md" target="_blank" rel="noopener"
 &gt;official guide&lt;/a&gt; to install the system.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="post-installation-configuration"&gt;&lt;a href="#post-installation-configuration" class="header-anchor"&gt;&lt;/a&gt;Post-Installation Configuration
&lt;/h2&gt;&lt;p&gt;On the first boot, two primary issues prevent access to the new FnOS instance:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Login Disabled&lt;/strong&gt;: The system console does not accept any credentials (including &lt;code&gt;root&lt;/code&gt;) until the web-based initial setup is complete. This is problematic for remote machines that may only have IPv6 access.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unresponsive PVE Console&lt;/strong&gt;: The &lt;code&gt;Xterm.js&lt;/code&gt; serial console in the PVE web UI does not work by default.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The following sections provide solutions to these problems.&lt;/p&gt;
&lt;h3 id="1-gaining-initial-root-access"&gt;&lt;a href="#1-gaining-initial-root-access" class="header-anchor"&gt;&lt;/a&gt;1. Gaining Initial Root Access
&lt;/h3&gt;&lt;p&gt;First, we must bypass the standard boot sequence to set a root password.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the PVE console, restart the VM. At the GRUB boot menu, press &lt;code&gt;e&lt;/code&gt; to edit the boot parameters.&lt;/li&gt;
&lt;li&gt;Find the line that begins with &lt;code&gt;linux&lt;/code&gt;. It will look similar to this:
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;linux /boot/vmlinuz-6.12.18-trim root=UUID=... ro quiet
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;At the end of this line, add &lt;code&gt;single init=/bin/bash&lt;/code&gt;. This parameter boots the system directly into a root shell.&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Ctrl+X&lt;/code&gt; or &lt;code&gt;F10&lt;/code&gt; to boot.&lt;/li&gt;
&lt;li&gt;In the root shell, execute the &lt;code&gt;passwd&lt;/code&gt; command to set a new password for the &lt;code&gt;root&lt;/code&gt; user.&lt;/li&gt;
&lt;li&gt;Once done, reboot the VM. The boot parameter change is temporary and will not persist.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="2-enabling-permanent-console-access-and-functionality"&gt;&lt;a href="#2-enabling-permanent-console-access-and-functionality" class="header-anchor"&gt;&lt;/a&gt;2. Enabling Permanent Console Access and Functionality
&lt;/h3&gt;&lt;p&gt;With root access established, permanently modify the GRUB configuration to enable the PVE serial console and other features.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Log in as &lt;code&gt;root&lt;/code&gt; with the newly set password.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Edit the GRUB configuration file: &lt;code&gt;nano /etc/default/grub&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Modify the &lt;code&gt;GRUB_CMDLINE_LINUX_DEFAULT&lt;/code&gt; line to include serial console and optional nested virtualization IOMMU support.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For Intel CPUs:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;- GRUB_CMDLINE_LINUX_DEFAULT=&amp;#34;quiet&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ GRUB_CMDLINE_LINUX_DEFAULT=&amp;#34;quiet console=tty0 console=ttyS0,115200 intel_iommu=on iommu=pt&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;For AMD CPUs:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;- GRUB_CMDLINE_LINUX_DEFAULT=&amp;#34;quiet&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ GRUB_CMDLINE_LINUX_DEFAULT=&amp;#34;quiet console=tty0 console=ttyS0,115200 amd_iommu=on iommu=pt&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;code&gt;console=ttyS0,115200&lt;/code&gt; is the key parameter for PVE &lt;code&gt;Xterm.js&lt;/code&gt; functionality.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Save the changes and exit the editor.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Apply the new configuration by executing:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;update-grub
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reboot the VM. The PVE web console should now be fully functional.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="3-installing-the-qemu-guest-agent"&gt;&lt;a href="#3-installing-the-qemu-guest-agent" class="header-anchor"&gt;&lt;/a&gt;3. Installing the QEMU Guest Agent
&lt;/h3&gt;&lt;p&gt;For better integration with PVE, such as displaying network information in the VM summary, we need to install the &lt;code&gt;qemu-guest-agent&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;```shell
apt update &amp;amp;&amp;amp; apt -y install qemu-guest-agent
systemctl enable --now qemu-guest-agent
```
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="conclusion"&gt;&lt;a href="#conclusion" class="header-anchor"&gt;&lt;/a&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;You have successfully configured an FnOS instance on Proxmox VE. The system is now fully accessible and properly integrated with the PVE host. &lt;strong&gt;Further configurations and optimizations will be presented&lt;/strong&gt; in a &lt;a class="link" href="../advanced-fnos-configuration-and-usage-tips/" &gt;new article&lt;/a&gt;.&lt;/p&gt;</description></item></channel></rss>