LibreQoS/_readthedocs/html/docs/Quickstart/quickstart-libreqos.html
2023-05-19 14:17:54 -06:00

359 lines
30 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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 &mdash; 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">&#39;=https&#39;</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 thats 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 doesnt matter which one is which. Notice, its 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">&quot;enp1s0f1&quot;,</span> <span class="pre">redirect_to</span> <span class="pre">=</span> <span class="pre">&quot;enp1s0f2&quot;</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">&quot;enp1s0f2&quot;,</span> <span class="pre">redirect_to</span> <span class="pre">=</span> <span class="pre">&quot;enp1s0f1&quot;</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 networks 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>&#169; 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>