mirror of
https://github.com/LibreQoE/LibreQoS.git
synced 2025-02-25 18:55:32 -06:00
359 lines
30 KiB
HTML
359 lines
30 KiB
HTML
<!DOCTYPE html>
|
||
<html class="writer-html5" lang="en" >
|
||
<head>
|
||
<meta charset="utf-8" /><meta name="generator" content="Docutils 0.18.1: http://docutils.sourceforge.net/" />
|
||
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||
<title>Install LibreQoS — LibreQoE documentation</title>
|
||
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
|
||
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
|
||
<!--[if lt IE 9]>
|
||
<script src="../../_static/js/html5shiv.min.js"></script>
|
||
<![endif]-->
|
||
|
||
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
|
||
<script src="../../_static/doctools.js"></script>
|
||
<script src="../../_static/sphinx_highlight.js"></script>
|
||
<script src="../../_static/js/theme.js"></script>
|
||
<link rel="index" title="Index" href="../../genindex.html" />
|
||
<link rel="search" title="Search" href="../../search.html" />
|
||
</head>
|
||
|
||
<body class="wy-body-for-nav">
|
||
<div class="wy-grid-for-nav">
|
||
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
|
||
<div class="wy-side-scroll">
|
||
<div class="wy-side-nav-search" >
|
||
|
||
|
||
|
||
<a href="../../index.html" class="icon icon-home">
|
||
LibreQoE
|
||
</a>
|
||
<div role="search">
|
||
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
|
||
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
|
||
<input type="hidden" name="check_keywords" value="yes" />
|
||
<input type="hidden" name="area" value="default" />
|
||
</form>
|
||
</div>
|
||
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
|
||
<p class="caption" role="heading"><span class="caption-text">Readme:</span></p>
|
||
<ul>
|
||
<li class="toctree-l1"><a class="reference internal" href="../../README.html">Sponsors</a></li>
|
||
<li class="toctree-l1"><a class="reference internal" href="../../README.html#support-libreqos">Support LibreQoS</a></li>
|
||
<li class="toctree-l1"><a class="reference internal" href="../../README.html#matrix-chat">Matrix Chat</a></li>
|
||
<li class="toctree-l1"><a class="reference internal" href="../../README.html#features">Features</a></li>
|
||
</ul>
|
||
<p class="caption" role="heading"><span class="caption-text">Read me first!:</span></p>
|
||
<ul>
|
||
<li class="toctree-l1"><a class="reference internal" href="networkdesignassumptions.html">Network Design Assumptions</a></li>
|
||
</ul>
|
||
<p class="caption" role="heading"><span class="caption-text">Quickstart Considerations:</span></p>
|
||
<ul>
|
||
<li class="toctree-l1"><a class="reference internal" href="../System%20Requirements/Compute.html">System Requirements</a></li>
|
||
<li class="toctree-l1"><a class="reference internal" href="../System%20Requirements/Networking.html">Network Interface Requirements</a></li>
|
||
</ul>
|
||
|
||
</div>
|
||
</div>
|
||
</nav>
|
||
|
||
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
|
||
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
|
||
<a href="../../index.html">LibreQoE</a>
|
||
</nav>
|
||
|
||
<div class="wy-nav-content">
|
||
<div class="rst-content">
|
||
<div role="navigation" aria-label="Page navigation">
|
||
<ul class="wy-breadcrumbs">
|
||
<li><a href="../../index.html" class="icon icon-home" aria-label="Home"></a></li>
|
||
<li class="breadcrumb-item active">Install LibreQoS</li>
|
||
<li class="wy-breadcrumbs-aside">
|
||
<a href="../../_sources/docs/Quickstart/quickstart-libreqos.md.txt" rel="nofollow"> View page source</a>
|
||
</li>
|
||
</ul>
|
||
<hr/>
|
||
</div>
|
||
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
|
||
<div itemprop="articleBody">
|
||
|
||
<section id="install-libreqos">
|
||
<h1>Install LibreQoS<a class="headerlink" href="#install-libreqos" title="Permalink to this heading"></a></h1>
|
||
</section>
|
||
<section id="updating-from-v1-3">
|
||
<h1>Updating from v1.3<a class="headerlink" href="#updating-from-v1-3" title="Permalink to this heading"></a></h1>
|
||
<section id="remove-offloadoff-service">
|
||
<h2>Remove offloadOff.service<a class="headerlink" href="#remove-offloadoff-service" title="Permalink to this heading"></a></h2>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sudo</span> <span class="n">systemctl</span> <span class="n">disable</span> <span class="n">offloadOff</span><span class="o">.</span><span class="n">service</span>
|
||
<span class="n">sudo</span> <span class="n">rm</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">local</span><span class="o">/</span><span class="n">sbin</span><span class="o">/</span><span class="n">offloadOff</span><span class="o">.</span><span class="n">sh</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">systemd</span><span class="o">/</span><span class="n">system</span><span class="o">/</span><span class="n">offloadOff</span><span class="o">.</span><span class="n">service</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
<section id="remove-cron-tasks-from-v1-3">
|
||
<h2>Remove cron tasks from v1.3<a class="headerlink" href="#remove-cron-tasks-from-v1-3" title="Permalink to this heading"></a></h2>
|
||
<p>Run <code class="docutils literal notranslate"><span class="pre">sudo</span> <span class="pre">crontab</span> <span class="pre">-e</span></code> and remove any entries pertaining to LibreQoS from v1.3.</p>
|
||
</section>
|
||
<section id="simple-install-via-deb-package-recommended">
|
||
<h2>Simple install via .Deb package (Recommended)<a class="headerlink" href="#simple-install-via-deb-package-recommended" title="Permalink to this heading"></a></h2>
|
||
<p>Use the deb package from the <a class="reference external" href="https://github.com/LibreQoE/LibreQoS/releases/">latest v1.4 release</a>.</p>
|
||
</section>
|
||
<section id="complex-install-not-recommended">
|
||
<h2>Complex install (Not Recommended)<a class="headerlink" href="#complex-install-not-recommended" title="Permalink to this heading"></a></h2>
|
||
<section id="clone-the-repo">
|
||
<h3>Clone the repo<a class="headerlink" href="#clone-the-repo" title="Permalink to this heading"></a></h3>
|
||
<p>The recommended install location is <code class="docutils literal notranslate"><span class="pre">/opt/libreqos</span></code>
|
||
Go to the install location, and clone the repo:</p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">cd</span> <span class="o">/</span><span class="n">opt</span><span class="o">/</span>
|
||
<span class="n">git</span> <span class="n">clone</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">github</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">LibreQoE</span><span class="o">/</span><span class="n">LibreQoS</span><span class="o">.</span><span class="n">git</span> <span class="n">libreqos</span>
|
||
<span class="n">sudo</span> <span class="n">chown</span> <span class="o">-</span><span class="n">R</span> <span class="n">YOUR_USER</span> <span class="o">/</span><span class="n">opt</span><span class="o">/</span><span class="n">libreqos</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>By specifying <code class="docutils literal notranslate"><span class="pre">libreqos</span></code> at the end, git will ensure the folder name is lowercase.</p>
|
||
</section>
|
||
<section id="install-dependencies-from-apt-and-pip">
|
||
<h3>Install Dependencies from apt and pip<a class="headerlink" href="#install-dependencies-from-apt-and-pip" title="Permalink to this heading"></a></h3>
|
||
<p>You need to have a few packages from <code class="docutils literal notranslate"><span class="pre">apt</span></code> installed:</p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>sudo apt-get install -y python3-pip clang gcc gcc-multilib llvm libelf-dev git nano graphviz curl screen llvm pkg-config linux-tools-common linux-tools-`uname -r` libbpf-dev
|
||
</pre></div>
|
||
</div>
|
||
<p>Then you need to install some Python dependencies:</p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">cd</span> <span class="o">/</span><span class="n">opt</span><span class="o">/</span><span class="n">libreqos</span>
|
||
<span class="n">python3</span> <span class="o">-</span><span class="n">m</span> <span class="n">pip</span> <span class="n">install</span> <span class="o">-</span><span class="n">r</span> <span class="n">requirements</span><span class="o">.</span><span class="n">txt</span>
|
||
<span class="n">sudo</span> <span class="n">python3</span> <span class="o">-</span><span class="n">m</span> <span class="n">pip</span> <span class="n">install</span> <span class="o">-</span><span class="n">r</span> <span class="n">requirements</span><span class="o">.</span><span class="n">txt</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
<section id="install-the-rust-development-system">
|
||
<h3>Install the Rust development system<a class="headerlink" href="#install-the-rust-development-system" title="Permalink to this heading"></a></h3>
|
||
<p>Go to <a class="reference external" href="https://rustup.rs">RustUp</a> and follow the instructions. Basically, run the following:</p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">curl</span> <span class="o">--</span><span class="n">proto</span> <span class="s1">'=https'</span> <span class="o">--</span><span class="n">tlsv1</span><span class="mf">.2</span> <span class="o">-</span><span class="n">sSf</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">sh</span><span class="o">.</span><span class="n">rustup</span><span class="o">.</span><span class="n">rs</span> <span class="o">|</span> <span class="n">sh</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>When Rust finishes installing, it will tell you to execute a command to place the Rust build tools into your path. You need to either execute this command or logout and back in again.</p>
|
||
<p>Once that’s done, please run:</p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">cd</span> <span class="o">/</span><span class="n">opt</span><span class="o">/</span><span class="n">libreqos</span><span class="o">/</span><span class="n">src</span><span class="o">/</span>
|
||
<span class="o">./</span><span class="n">build_rust</span><span class="o">.</span><span class="n">sh</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>This will take a while the first time, but it puts everything in the right place.</p>
|
||
<p>Now, to build rust crates, run:</p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">cd</span> <span class="n">rust</span>
|
||
<span class="n">cargo</span> <span class="n">build</span> <span class="o">--</span><span class="nb">all</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
</section>
|
||
</section>
|
||
<section id="configure-libreqos">
|
||
<h1>Configure LibreQoS<a class="headerlink" href="#configure-libreqos" title="Permalink to this heading"></a></h1>
|
||
<section id="configure-lqos-conf">
|
||
<h2>Configure lqos.conf<a class="headerlink" href="#configure-lqos-conf" title="Permalink to this heading"></a></h2>
|
||
<p>Copy the lqosd daemon configuration file to <code class="docutils literal notranslate"><span class="pre">/etc</span></code>:</p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">cd</span> <span class="o">/</span><span class="n">opt</span><span class="o">/</span><span class="n">libreqos</span><span class="o">/</span><span class="n">src</span>
|
||
<span class="n">sudo</span> <span class="n">cp</span> <span class="n">lqos</span><span class="o">.</span><span class="n">example</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">lqos</span><span class="o">.</span><span class="n">conf</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>Now edit the file to match your setup with</p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sudo</span> <span class="n">nano</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">lqos</span><span class="o">.</span><span class="n">conf</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>Change <code class="docutils literal notranslate"><span class="pre">enp1s0f1</span></code> and <code class="docutils literal notranslate"><span class="pre">enp1s0f2</span></code> to match your network interfaces. It doesn’t matter which one is which. Notice, it’s paring the interfaces, so when you first enter enps0f<ins><strong>1</strong></ins> in the first line, the <code class="docutils literal notranslate"><span class="pre">redirect_to</span></code> parameter is enp1s0f<ins><strong>2</strong></ins> (replacing with your actual interface names).</p>
|
||
<ul class="simple">
|
||
<li><p>First Line: <code class="docutils literal notranslate"><span class="pre">name</span> <span class="pre">=</span> <span class="pre">"enp1s0f1",</span> <span class="pre">redirect_to</span> <span class="pre">=</span> <span class="pre">"enp1s0f2"</span></code></p></li>
|
||
<li><p>Second Line: <code class="docutils literal notranslate"><span class="pre">name</span> <span class="pre">=</span> <span class="pre">"enp1s0f2",</span> <span class="pre">redirect_to</span> <span class="pre">=</span> <span class="pre">"enp1s0f1"</span></code></p></li>
|
||
</ul>
|
||
<p>Then, if using Bifrost/XDP set <code class="docutils literal notranslate"><span class="pre">use_xdp_bridge</span> <span class="pre">=</span> <span class="pre">true</span></code> under that same <code class="docutils literal notranslate"><span class="pre">[bridge]</span></code> section.</p>
|
||
</section>
|
||
<section id="configure-ispconfig-py">
|
||
<h2>Configure ispConfig.py<a class="headerlink" href="#configure-ispconfig-py" title="Permalink to this heading"></a></h2>
|
||
<p>Copy ispConfig.example.py to ispConfig.py and edit as needed</p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">cd</span> <span class="o">/</span><span class="n">opt</span><span class="o">/</span><span class="n">libreqos</span><span class="o">/</span><span class="n">src</span><span class="o">/</span>
|
||
<span class="n">cp</span> <span class="n">ispConfig</span><span class="o">.</span><span class="n">example</span><span class="o">.</span><span class="n">py</span> <span class="n">ispConfig</span><span class="o">.</span><span class="n">py</span>
|
||
<span class="n">nano</span> <span class="n">ispConfig</span><span class="o">.</span><span class="n">py</span>
|
||
</pre></div>
|
||
</div>
|
||
<ul class="simple">
|
||
<li><p>Set upstreamBandwidthCapacityDownloadMbps and upstreamBandwidthCapacityUploadMbps to match the bandwidth in Mbps of your network’s upstream / WAN internet connection. The same can be done for generatedPNDownloadMbps and generatedPNUploadMbps.</p></li>
|
||
<li><p>Set interfaceA to the interface facing your core router (or bridged internal network if your network is bridged)</p></li>
|
||
<li><p>Set interfaceB to the interface facing your edge router</p></li>
|
||
<li><p>Set <code class="docutils literal notranslate"><span class="pre">enableActualShellCommands</span> <span class="pre">=</span> <span class="pre">True</span></code> to allow the program to actually run the commands.</p></li>
|
||
</ul>
|
||
</section>
|
||
<section id="integrations">
|
||
<h2>Integrations<a class="headerlink" href="#integrations" title="Permalink to this heading"></a></h2>
|
||
<section id="uisp-integration">
|
||
<h3>UISP Integration<a class="headerlink" href="#uisp-integration" title="Permalink to this heading"></a></h3>
|
||
<p>First, set the relevant parameters for UISP (uispAuthToken, UISPbaseURL, etc.) in ispConfig.py.</p>
|
||
<p>To test the UISP Integration, use</p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">python3</span> <span class="n">integrationUISP</span><span class="o">.</span><span class="n">py</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>On the first successful run, it will create a network.json and ShapedDevices.csv file.
|
||
If a network.json file exists, it will not be overwritten.
|
||
You can modify the network.json file to more accurately reflect bandwidth limits.
|
||
ShapedDevices.csv will be overwritten every time the UISP integration is run.
|
||
You have the option to run integrationUISP.py automatically on boot and every 30 minutes, which is recommended. This can be enabled by setting <code class="docutils literal notranslate"><span class="pre">automaticImportUISP</span> <span class="pre">=</span> <span class="pre">True</span></code> in ispConfig.py</p>
|
||
</section>
|
||
<section id="splynx-integration">
|
||
<h3>Splynx Integration<a class="headerlink" href="#splynx-integration" title="Permalink to this heading"></a></h3>
|
||
<p>First, set the relevant parameters for Splynx (splynx_api_key, splynx_api_secret, etc.) in ispConfig.py.</p>
|
||
<p>To test the Splynx Integration, use</p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">python3</span> <span class="n">integrationSplynx</span><span class="o">.</span><span class="n">py</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>On the first successful run, it will create a ShapedDevices.csv file.
|
||
You can manually create your network.json file to more accurately reflect bandwidth limits.
|
||
ShapedDevices.csv will be overwritten every time the Splynx integration is run.
|
||
You have the option to run integrationSplynx.py automatically on boot and every 30 minutes, which is recommended. This can be enabled by setting <code class="docutils literal notranslate"><span class="pre">automaticImportSplynx</span> <span class="pre">=</span> <span class="pre">True</span></code> in ispConfig.py</p>
|
||
</section>
|
||
</section>
|
||
<section id="network-json">
|
||
<h2>Network.json<a class="headerlink" href="#network-json" title="Permalink to this heading"></a></h2>
|
||
<p>Network.json allows ISP operators to define a Hierarchical Network Topology, or Flat Network Topology.</p>
|
||
<p>For networks with no Parent Nodes (no strictly defined Access Points or Sites) edit the network.json to use a Flat Network Topology with
|
||
<code class="docutils literal notranslate"><span class="pre">nano</span> <span class="pre">network.json</span></code>
|
||
setting the following file content:</p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">{}</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>If you plan to use the built-in UISP or Splynx integrations, you do not need to create a network.json file quite yet.</p>
|
||
<p>If you plan to use the built-in UISP integration, it will create this automatically on its first run (assuming network.json is not already present). You can then modify the network.json to more accurately reflect your topology.</p>
|
||
<p>If you will not be using an integration, you can manually define the network.json following the template file - network.example.json</p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">+-----------------------------------------------------------------------+</span>
|
||
<span class="o">|</span> <span class="n">Entire</span> <span class="n">Network</span> <span class="o">|</span>
|
||
<span class="o">+-----------------------+-----------------------+-----------------------+</span>
|
||
<span class="o">|</span> <span class="n">Parent</span> <span class="n">Node</span> <span class="n">A</span> <span class="o">|</span> <span class="n">Parent</span> <span class="n">Node</span> <span class="n">B</span> <span class="o">|</span> <span class="n">Parent</span> <span class="n">Node</span> <span class="n">C</span> <span class="o">|</span>
|
||
<span class="o">+-----------------------+-------+-------+-------+-----------------------+</span>
|
||
<span class="o">|</span> <span class="n">Parent</span> <span class="n">Node</span> <span class="n">D</span> <span class="o">|</span> <span class="n">Sub</span> <span class="mi">3</span> <span class="o">|</span> <span class="n">Sub</span> <span class="mi">4</span> <span class="o">|</span> <span class="n">Sub</span> <span class="mi">5</span> <span class="o">|</span> <span class="n">Sub</span> <span class="mi">6</span> <span class="o">|</span> <span class="n">Sub</span> <span class="mi">7</span> <span class="o">|</span> <span class="n">Parent</span> <span class="n">Node</span> <span class="n">F</span> <span class="o">|</span>
|
||
<span class="o">+-------+-------+-------+-------+-------+-------+-------+-------+-------+</span>
|
||
<span class="o">|</span> <span class="n">Sub</span> <span class="mi">1</span> <span class="o">|</span> <span class="n">Sub</span> <span class="mi">2</span> <span class="o">|</span> <span class="o">|</span> <span class="o">|</span> <span class="o">|</span> <span class="n">Sub</span> <span class="mi">8</span> <span class="o">|</span> <span class="n">Sub</span> <span class="mi">9</span> <span class="o">|</span>
|
||
<span class="o">+-------+-------+-------+-----------------------+-------+-------+-------+</span>
|
||
</pre></div>
|
||
</div>
|
||
<section id="manual-setup">
|
||
<h3>Manual Setup<a class="headerlink" href="#manual-setup" title="Permalink to this heading"></a></h3>
|
||
<p>You can use</p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">python3</span> <span class="n">csvToNetworkJSON</span><span class="o">.</span><span class="n">py</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>to convert manualNetwork.csv to a network.json file.
|
||
manualNetwork.csv can be copied from the template file, manualNetwork.template.csv</p>
|
||
<p>Note: The parent node name must match that used for clients in ShapedDevices.csv</p>
|
||
</section>
|
||
</section>
|
||
<section id="shapeddevices-csv">
|
||
<h2>ShapedDevices.csv<a class="headerlink" href="#shapeddevices-csv" title="Permalink to this heading"></a></h2>
|
||
<p>If you are using an integration, this file will be automatically generated. If you are not using an integration, you can manually edit the file.</p>
|
||
<section id="manual-editing">
|
||
<h3>Manual Editing<a class="headerlink" href="#manual-editing" title="Permalink to this heading"></a></h3>
|
||
<ul class="simple">
|
||
<li><p>Modify the ShapedDevices.csv file using your preferred spreadsheet editor (LibreOffice Calc, Excel, etc), following the template file - ShapedDevices.example.csv</p></li>
|
||
<li><p>Circuit ID is required. Must be a string of some sort (int is fine, gets parsed as string). Must NOT include any number symbols (#).</p></li>
|
||
<li><p>An IPv4 address or IPv6 address is required for each entry.</p></li>
|
||
<li><p>The Access Point or Site name should be set in the Parent Node field. Parent Node can be left blank for flat networks.</p></li>
|
||
<li><p>The ShapedDevices.csv file allows you to set minimum guaranteed, and maximum allowed bandwidth per subscriber.</p></li>
|
||
<li><p>The minimum allowed plan rates for Circuits are 2Mbit. Bandwidth min and max should both be above that threshold.</p></li>
|
||
<li><p>Recommendation: set the min bandwidth to something like 25/10 and max to 1.15X advertised plan rate by using bandwidthOverheadFactor = 1.15</p>
|
||
<ul>
|
||
<li><p>This way, when an AP hits its ceiling, users have any remaining AP capacity fairly distributed between them.</p></li>
|
||
<li><p>Ensure a reasonable minimum bandwidth minimum for every subscriber, allowing them to utilize up to the maximum provided when AP utilization is below 100%.</p></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<p>Note regarding SLAs: For customers with SLA contracts that guarantee them a minimum bandwidth, set their plan rate as the minimum bandwidth. That way when an AP approaches its ceiling, SLA customers will always get that amount.</p>
|
||
<p><img alt="image" src="https://user-images.githubusercontent.com/22501920/200134960-28709d0f-48fe-4129-b4fd-70b204cade2c.png" /></p>
|
||
</section>
|
||
</section>
|
||
</section>
|
||
<section id="libreqos-daemons">
|
||
<h1>LibreQoS daemons<a class="headerlink" href="#libreqos-daemons" title="Permalink to this heading"></a></h1>
|
||
<p>lqosd</p>
|
||
<ul class="simple">
|
||
<li><p>Manages actual XDP code. Build with Rust.</p></li>
|
||
</ul>
|
||
<p>lqos_node_manager</p>
|
||
<ul class="simple">
|
||
<li><p>Runs the GUI available at http://a.b.c.d:9123</p></li>
|
||
</ul>
|
||
<p>lqos_scheduler</p>
|
||
<ul class="simple">
|
||
<li><p>lqos_scheduler handles statistics and performs continuous refreshes of LibreQoS’ shapers, including pulling from any enabled CRM Integrations (UISP, Splynx).</p></li>
|
||
<li><p>On start: Run a full setup of queues</p></li>
|
||
<li><p>Every 10 seconds: Graph bandwidth and latency stats</p></li>
|
||
<li><p>Every 30 minutes: Update queues, pulling new configuration from CRM integration if enabled</p></li>
|
||
</ul>
|
||
<section id="run-daemons-with-systemd">
|
||
<h2>Run daemons with systemd<a class="headerlink" href="#run-daemons-with-systemd" title="Permalink to this heading"></a></h2>
|
||
<p>You can setup <code class="docutils literal notranslate"><span class="pre">lqosd</span></code>, <code class="docutils literal notranslate"><span class="pre">lqos_node_manager</span></code>, and <code class="docutils literal notranslate"><span class="pre">lqos_scheduler</span></code> as systemd services.</p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sudo</span> <span class="n">cp</span> <span class="o">/</span><span class="n">opt</span><span class="o">/</span><span class="n">libreqos</span><span class="o">/</span><span class="n">src</span><span class="o">/</span><span class="nb">bin</span><span class="o">/</span><span class="n">lqos_node_manager</span><span class="o">.</span><span class="n">service</span><span class="o">.</span><span class="n">example</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">systemd</span><span class="o">/</span><span class="n">system</span><span class="o">/</span><span class="n">lqos_node_manager</span><span class="o">.</span><span class="n">service</span>
|
||
<span class="n">sudo</span> <span class="n">cp</span> <span class="o">/</span><span class="n">opt</span><span class="o">/</span><span class="n">libreqos</span><span class="o">/</span><span class="n">src</span><span class="o">/</span><span class="nb">bin</span><span class="o">/</span><span class="n">lqosd</span><span class="o">.</span><span class="n">service</span><span class="o">.</span><span class="n">example</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">systemd</span><span class="o">/</span><span class="n">system</span><span class="o">/</span><span class="n">lqosd</span><span class="o">.</span><span class="n">service</span>
|
||
<span class="n">sudo</span> <span class="n">cp</span> <span class="o">/</span><span class="n">opt</span><span class="o">/</span><span class="n">libreqos</span><span class="o">/</span><span class="n">src</span><span class="o">/</span><span class="nb">bin</span><span class="o">/</span><span class="n">lqos_scheduler</span><span class="o">.</span><span class="n">service</span><span class="o">.</span><span class="n">example</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">systemd</span><span class="o">/</span><span class="n">system</span><span class="o">/</span><span class="n">lqos_scheduler</span><span class="o">.</span><span class="n">service</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>Finally, run</p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sudo</span> <span class="n">systemctl</span> <span class="n">daemon</span><span class="o">-</span><span class="n">reload</span>
|
||
<span class="n">sudo</span> <span class="n">systemctl</span> <span class="n">enable</span> <span class="n">lqosd</span> <span class="n">lqos_node_manager</span> <span class="n">lqos_scheduler</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>You can now point a web browser at <code class="docutils literal notranslate"><span class="pre">http://a.b.c.d:9123</span></code> (replace <code class="docutils literal notranslate"><span class="pre">a.b.c.d</span></code> with the management IP address of your shaping server) and enjoy a real-time view of your network.</p>
|
||
</section>
|
||
<section id="debugging-lqos-scheduler">
|
||
<h2>Debugging lqos_scheduler<a class="headerlink" href="#debugging-lqos-scheduler" title="Permalink to this heading"></a></h2>
|
||
<p>In the background, lqos_scheduler runs scheduler.py, which in turn runs LibreQoS.py</p>
|
||
<p>One-time runs of these individual components can be very helpful for debugging and to make sure everything is correctly configured.</p>
|
||
<p>First, stop lqos_scheduler</p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sudo</span> <span class="n">systemctl</span> <span class="n">stop</span> <span class="n">lqos_scheduler</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>For one-time runs of LibreQoS.py, use</p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sudo</span> <span class="o">./</span><span class="n">LibreQoS</span><span class="o">.</span><span class="n">py</span>
|
||
</pre></div>
|
||
</div>
|
||
<ul class="simple">
|
||
<li><p>To use the debug mode with more verbose output, use:</p></li>
|
||
</ul>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sudo</span> <span class="o">./</span><span class="n">LibreQoS</span><span class="o">.</span><span class="n">py</span> <span class="o">--</span><span class="n">debug</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>To confirm that lqos_scheduler (scheduler.py) is able to work correctly, run:</p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sudo</span> <span class="n">python3</span> <span class="n">scheduler</span><span class="o">.</span><span class="n">py</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>Once you have any errors eliminated, restart lqos_scheduler with</p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sudo</span> <span class="n">systemctl</span> <span class="n">start</span> <span class="n">lqos_scheduler</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
</section>
|
||
|
||
|
||
</div>
|
||
</div>
|
||
<footer>
|
||
|
||
<hr/>
|
||
|
||
<div role="contentinfo">
|
||
<p>© Copyright 2023, LibreQoE.</p>
|
||
</div>
|
||
|
||
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
|
||
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
|
||
provided by <a href="https://readthedocs.org">Read the Docs</a>.
|
||
|
||
|
||
</footer>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
<script>
|
||
jQuery(function () {
|
||
SphinxRtdTheme.Navigation.enable(true);
|
||
});
|
||
</script>
|
||
|
||
</body>
|
||
</html> |