<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://your-docusaurus-site.example.com/blog</id>
    <title>Docusaurus Tailwind Shadcn/ui Blog</title>
    <updated>2026-10-02T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://your-docusaurus-site.example.com/blog"/>
    <subtitle>Docusaurus Tailwind Shadcn/ui Blog</subtitle>
    <icon>https://your-docusaurus-site.example.com/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[OpenStack Cluster with Synology iSCSI Backend Storage]]></title>
        <id>https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi</id>
        <link href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi"/>
        <updated>2026-10-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Most OpenStack storage guides jump straight to Ceph. That is the right answer for production, but it is a lot of machinery for a lab. If you already have a Synology DSM box, there is a much lighter option: Cinder ships an in-tree driver for Synology (SynoISCSIDriver) that creates one iSCSI LUN per volume. In this post I connect a multinode Kolla Ansible deployment to Synology DSM over iSCSI, with two storage paths and multipath, and boot instances from Synology-backed volumes.]]></summary>
        <content type="html"><![CDATA[<p>Most OpenStack storage guides jump straight to Ceph. That is the right answer for production, but it is a lot of machinery for a lab. If you already have a Synology DSM box, there is a much lighter option: Cinder ships an in-tree driver for Synology (<code>SynoISCSIDriver</code>) that creates one iSCSI LUN per volume. In this post I connect a multinode Kolla Ansible deployment to Synology DSM over iSCSI, with two storage paths and multipath, and boot instances from Synology-backed volumes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-cinder-talks-to-synology">How Cinder talks to Synology<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#how-cinder-talks-to-synology" class="hash-link" aria-label="Direct link to How Cinder talks to Synology" title="Direct link to How Cinder talks to Synology" translate="no">​</a></h2>
<p>The driver works with two kinds of traffic, and it helps to keep them apart in your head:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">cinder-volume ──── HTTPS :5001 ────▶ DSM WebAPI      (control: create / delete LUN + target)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">compute node  ──── iSCSI  :3260 ───▶ DSM iSCSI target (data: the instance's disk I/O)</span><br></div></code></pre></div></div>
<p>Every time you create a volume in OpenStack, <code>cinder-volume</code> logs in to the <strong>DSM WebAPI</strong> and creates an <em>advanced file LUN</em> plus an iSCSI target inside a DSM volume. When you attach it, the <strong>compute node</strong> logs in to that target directly, and the LUN shows up as a block device for the instance. Once a volume is attached, <code>cinder-volume</code> is no longer in the data path.</p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>Read this before you build anything on it.</p><ul>
<li class="">The driver documentation targets DSM 6.0.2 or later. DSM 7 renamed <em>iSCSI Manager</em> to <em>SAN Manager</em>, and the driver docs do not explicitly promise that every API still behaves the same. Test with <strong>one</strong> volume before you build anything else on top.</li>
<li class="">A single DSM box is a <strong>single point of failure</strong>. Two network paths protect you from a broken link, not from a dead DSM.</li>
<li class="">The Synology driver does <strong>not</strong> support active/active. You run <code>cinder-volume</code> on exactly one node.</li>
</ul></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-environment">Example environment<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#example-environment" class="hash-link" aria-label="Direct link to Example environment" title="Direct link to Example environment" translate="no">​</a></h2>
<p>The lab runs as VMs on a single Proxmox host, which is why the numbers below are small. Replace the addressing with your own.</p>
<table><thead><tr><th>Item</th><th>Value</th></tr></thead><tbody><tr><td>OpenStack</td><td>2025.1 (Epoxy), deployed with Kolla Ansible</td></tr><tr><td>Networking</td><td>Neutron ML2/OVN</td></tr><tr><td>OS</td><td>Ubuntu 24.04 on every node</td></tr><tr><td>Storage backend</td><td>Synology DSM 7.x (a VM using the Arc loader)</td></tr><tr><td>Deployment host</td><td>An existing jump host at <code>192.168.19.30</code>, on the management network only</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="nodes">Nodes<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#nodes" class="hash-link" aria-label="Direct link to Nodes" title="Direct link to Nodes" translate="no">​</a></h3>
<table><thead><tr><th>Hostname</th><th>Management</th><th>Tunnel</th><th>Storage 1</th><th>Storage 2</th><th>External</th><th>CPU</th><th>RAM</th><th>Disk</th><th>Additional disk</th></tr></thead><tbody><tr><td><code>dev-ubuntu24-deployer</code></td><td><code>192.168.19.30</code></td><td>none</td><td>none</td><td>none</td><td>none</td><td>2 vCPU</td><td>4 GB</td><td>30 GB</td><td>none</td></tr><tr><td><code>dev-synology-central-storage</code></td><td><code>192.168.19.31</code></td><td>none</td><td><code>172.16.2.31</code></td><td><code>172.16.3.31</code></td><td>none</td><td>2 vCPU</td><td>4 GB</td><td>51 GB</td><td>5 x 200 GB</td></tr><tr><td><code>dev-openstack-controller-01</code></td><td><code>192.168.19.36</code></td><td><code>172.16.1.36</code></td><td><code>172.16.2.36</code></td><td><code>172.16.3.36</code></td><td>yes</td><td>4 vCPU</td><td>8 GB</td><td>128 GB</td><td>none</td></tr><tr><td><code>dev-openstack-controller-02</code></td><td><code>192.168.19.37</code></td><td><code>172.16.1.37</code></td><td><code>172.16.2.37</code></td><td><code>172.16.3.37</code></td><td>yes</td><td>4 vCPU</td><td>8 GB</td><td>128 GB</td><td>none</td></tr><tr><td><code>dev-openstack-controller-03</code></td><td><code>192.168.19.38</code></td><td><code>172.16.1.38</code></td><td><code>172.16.2.38</code></td><td><code>172.16.3.38</code></td><td>yes</td><td>4 vCPU</td><td>8 GB</td><td>128 GB</td><td>none</td></tr><tr><td><code>dev-openstack-compute-01</code></td><td><code>192.168.19.41</code></td><td><code>172.16.1.41</code></td><td><code>172.16.2.41</code></td><td><code>172.16.3.41</code></td><td>none</td><td>8 vCPU</td><td>16 GB</td><td>128 GB</td><td>none</td></tr><tr><td><code>dev-openstack-compute-02</code></td><td><code>192.168.19.42</code></td><td><code>172.16.1.42</code></td><td><code>172.16.2.42</code></td><td><code>172.16.3.42</code></td><td>none</td><td>8 vCPU</td><td>16 GB</td><td>128 GB</td><td>none</td></tr></tbody></table>
<p>All subnets are <code>/24</code>. Every OpenStack node has five NICs: management, tunnel, storage 1, storage 2, and a fifth NIC for the external network. That fifth NIC has <strong>no IP</strong>, because Neutron takes it over and turns it into <code>br-ex</code>. The Synology VM has three NICs: management (admin and internet access), storage 1, and storage 2.</p>
<p>The VIP for the OpenStack APIs is <code>192.168.19.35</code>, held by HAProxy and Keepalived on the controllers.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="networks">Networks<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#networks" class="hash-link" aria-label="Direct link to Networks" title="Direct link to Networks" translate="no">​</a></h3>
<p>The tunnel and storage networks are internal only, with no gateway.</p>
<table><thead><tr><th>Network</th><th>Subnet</th><th>Used for</th></tr></thead><tbody><tr><td>Management</td><td><code>192.168.19.0/24</code></td><td>APIs, SSH, DSM web UI, the VIP</td></tr><tr><td>Tunnel</td><td><code>172.16.1.0/24</code></td><td>Geneve overlay traffic between nodes (tenant networks)</td></tr><tr><td>Storage 1</td><td><code>172.16.2.0/24</code></td><td>WebAPI calls, iSCSI path 1, and the Glance NFS share</td></tr><tr><td>Storage 2</td><td><code>172.16.3.0/24</code></td><td>iSCSI path 2</td></tr><tr><td>External</td><td><code>192.168.19.0/24</code> (flat)</td><td>Floating IPs, on the fifth NIC of each controller</td></tr></tbody></table>
<p>Each node uses the same last octet on every subnet (for example <code>.36</code> on controller-01), which makes it easy to tell which node an address belongs to. DSM has an address on both storage networks: <code>172.16.2.31</code> and <code>172.16.3.31</code>.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Both storage networks are software bridges on the same Proxmox host. The multipath failover in this post therefore trains the logical path failure (a NIC going down inside a VM), not a real physical NIC or switch failure.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-prepare-dsm">Step 1: Prepare DSM<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#step-1-prepare-dsm" class="hash-link" aria-label="Direct link to Step 1: Prepare DSM" title="Direct link to Step 1: Prepare DSM" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="storage-and-network">Storage and network<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#storage-and-network" class="hash-link" aria-label="Direct link to Storage and network" title="Direct link to Storage and network" translate="no">​</a></h3>
<p>Everything in this section happens in the DSM web interface. The network comes first, so every service you enable afterwards can be bound to the right NIC.</p>
<ol>
<li class="">
<p><strong>Give DSM a static IP on each storage NIC.</strong> Open <strong>Control Panel → Network</strong> and set <code>172.16.2.31/24</code> and <code>172.16.3.31/24</code> on the two storage adapters. Leave the gateway empty on both, because these networks only carry storage traffic. Two separate subnets (instead of two addresses in one subnet) keep routing unambiguous and give you two independent iSCSI paths later.</p>
<p><img decoding="async" loading="lazy" alt="Static IP" src="https://your-docusaurus-site.example.com/assets/images/Screenshot%202026-10-01%20224458-8e92e487a79df746b20c2ffb9703fb2b.png" width="1149" height="650" class="img_ev3q"></p>
</li>
<li class="">
<p><strong>Create a storage pool and a volume.</strong> In Storage Manager, create a pool and then a volume on top of it. Choose <strong>Btrfs</strong>, because thin-provisioned LUNs and snapshots generally need it. Write down the volume name (for example <code>volume1</code>). That exact name becomes <code>synology_pool_name</code> in the Cinder configuration.</p>
<p><img decoding="async" loading="lazy" alt="Create Pool and Volume" src="https://your-docusaurus-site.example.com/assets/images/Screenshot%202026-10-01%20225156-83dbb15a04d626fa08c12faa1ee9435b.png" width="1279" height="840" class="img_ev3q"></p>
</li>
<li class="">
<p><strong>Create a LUN (optional).</strong> In SAN Manager, create a LUN on the new volume. The Synology driver creates and deletes LUNs by itself, so Cinder does not need this step. A manual LUN is still handy to confirm the volume can host LUNs at all, and it is the starting point if you ever use the fallback of one big LUN with LVM on top.</p>
<p><img decoding="async" loading="lazy" alt="Create LUN" src="https://your-docusaurus-site.example.com/assets/images/Screenshot%202026-10-01%20234459-76d4942086db967a12c9d7ff8b85c01e.png" width="1166" height="626" class="img_ev3q"></p>
</li>
<li class="">
<p><strong>Create an iSCSI target (optional).</strong> Create a target and map the LUN to it. Like the LUN, this is only for testing: you can log in to it with <code>iscsiadm</code> from a node to prove the data path works before Cinder is involved. Later, the targets that Cinder creates have names starting with <code>Cinder-Target-</code>.</p>
<p><img decoding="async" loading="lazy" alt="Create iSCSI" src="https://your-docusaurus-site.example.com/assets/images/Screenshot%202026-10-02%20112946-8bbb6b963fa41e099469113c2a9fcb84.png" width="1163" height="623" class="img_ev3q"></p>
</li>
<li class="">
<p><strong>Bind the iSCSI service to the storage NICs.</strong> In the iSCSI network binding settings, allow the service to listen on the two storage interfaces only. This makes both portals (<code>172.16.2.31</code> and <code>172.16.3.31</code>) visible to initiators, which multipath depends on, and keeps iSCSI off the management network.</p>
<p><img decoding="async" loading="lazy" alt="Network Binding iSCSI" src="https://your-docusaurus-site.example.com/assets/images/Screenshot%202026-10-01%20234512-26913c63b887a288bcbabfe0a9f7b9cd.png" width="1167" height="624" class="img_ev3q"></p>
</li>
<li class="">
<p><strong>Enable the NFS service.</strong> Block storage is not the only thing worth sharing. OpenStack's image service (Glance) stores images as plain files by default, so each controller only sees the images it received itself. An NFS share that every controller mounts fixes that. In <strong>Control Panel → File Services → NFS</strong>, enable the service and set the maximum protocol to <strong>NFSv4.1</strong>, which needs only port <code>2049</code>.</p>
<p><img decoding="async" loading="lazy" alt="Enable NFS" src="https://your-docusaurus-site.example.com/assets/images/Screenshot%202026-10-01%20233601-c959527daa6c65f47b2c2e83cd4ba2a7.png" width="1156" height="658" class="img_ev3q"></p>
</li>
<li class="">
<p><strong>Create a shared folder.</strong> In <strong>Control Panel → Shared Folder</strong>, create a folder named <code>glance</code> on the volume from step 2. Its path on DSM is <code>/volume1/glance</code>, and that is what the controllers will mount. The recycle bin and encryption can stay off for an image store.</p>
<p><img decoding="async" loading="lazy" alt="Create Shared Folder" src="https://your-docusaurus-site.example.com/assets/images/Screenshot%202026-10-01%20233358-236d6922f411fc4bcc7c8d97cc699ed3.png" width="1157" height="661" class="img_ev3q"></p>
</li>
<li class="">
<p><strong>Grant permissions.</strong> Give Read/Write on the shared folder to the accounts that will touch the files, in my case the <code>guest</code> and <code>ops</code> users. Then add an NFS permission rule for the storage subnet (<code>172.16.2.0/24</code>) with Read/Write. Set squash to <strong>No mapping</strong>, otherwise <code>chown</code> from the controllers is silently remapped and Glance can hit permission errors.</p>
<p><img decoding="async" loading="lazy" alt="Gift Permission" src="https://your-docusaurus-site.example.com/assets/images/Screenshot%202026-10-01%20233449-4bce5299785addb960f7d2db6ebaf5db.png" width="1159" height="660" class="img_ev3q"></p>
</li>
<li class="">
<p><strong>Bind NFS to the storage network.</strong> Restrict the NFS service to the storage interface, the same way as for iSCSI. NFS is then only reachable from the storage subnet, not from the management network, and the DSM firewall only needs to allow port <code>2049</code> from the controllers.</p>
<p><img decoding="async" loading="lazy" alt="Network Binding NFS" src="https://your-docusaurus-site.example.com/assets/images/Screenshot%202026-10-01%20233748-690181998447f111499ffb4954e9de93.png" width="1156" height="658" class="img_ev3q"></p>
</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-service-account">The service account<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#the-service-account" class="hash-link" aria-label="Direct link to The service account" title="Direct link to The service account" translate="no">​</a></h3>
<p>The driver logs in non-interactively with a username and password, so the account it uses cannot have two-factor authentication. In my lab I did not create a dedicated Cinder user. I reused <code>ops</code>, the first account I created on DSM, because I already mapped its permissions for the shared folders and did not want to repeat that work for a second account.</p>
<p><img decoding="async" loading="lazy" alt="Add User to Administrator Group" src="https://your-docusaurus-site.example.com/assets/images/Screenshot%202026-10-02%20114534-d4e5204c5d695f2542250c0687c0c3ec.png" width="1154" height="657" class="img_ev3q"></p>
<ol>
<li class=""><strong>Control Panel → User &amp; Group</strong>: add <code>ops</code> to the <code>administrators</code> group. The driver needs admin rights to create LUNs and targets. Without this, volume creation fails.</li>
<li class=""><strong>Control Panel → Security → Account → Two-factor authentication</strong>: make sure enforcement does <strong>not</strong> cover <code>ops</code>. If enforcement is set to all users or to the administrators group, scope it to a specific group and keep <code>ops</code> out of it.</li>
<li class="">Use <code>ops</code> as <code>synology_username</code> in <code>cinder-volume.conf</code>.</li>
</ol>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>This is the lazy path, and it has a cost. <code>ops</code> is now an admin account without 2FA whose password sits in plain text in <code>cinder-volume.conf</code>. Anyone who reads that file gets full admin on DSM, including the <code>glance</code> share and everything else <code>ops</code> can touch. A dedicated account limits that blast radius, and I would create one for anything beyond a lab.</p></div></div>
<p>Because of that, lock the account down at the network level. In <strong>Control Panel → Security → Firewall</strong>, allow:</p>
<ul>
<li class="">port <code>5001</code> only from the OpenStack nodes on Storage 1,</li>
<li class="">port <code>3260</code> only from the OpenStack nodes on both storage subnets,</li>
<li class="">and deny everything else.</li>
</ul>
<p>Also use a long random password for <code>ops</code>, and keep <code>cinder-volume.conf</code> at <code>chmod 600</code> and out of git.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>The driver also supports a <code>synology_device_id</code> option (a trusted-device token that skips the OTP prompt), which lets you keep 2FA on an account. The token is tied to that account and breaks if its password or 2FA is reset, so a dedicated service account is usually cleaner.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="test-from-a-controller">Test from a controller<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#test-from-a-controller" class="hash-link" aria-label="Direct link to Test from a controller" title="Direct link to Test from a controller" translate="no">​</a></h3>
<p>Run these from the node that will host <code>cinder-volume</code>, because that is the exact path Cinder will use.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># iSCSI portals on both paths</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">nc</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-zv</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">172.16</span><span class="token plain">.2.31 </span><span class="token number" style="color:rgb(247, 140, 108)">3260</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">nc</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-zv</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">172.16</span><span class="token plain">.3.31 </span><span class="token number" style="color:rgb(247, 140, 108)">3260</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># WebAPI login: the response must contain "success":true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(255, 203, 107)">read</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-rsp</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"DSM password: "</span><span class="token plain"> P</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(255, 203, 107)">echo</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-sk</span><span class="token plain"> https://172.16.2.31:5001/webapi/auth.cgi </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  --data-urlencode </span><span class="token string" style="color:rgb(195, 232, 141)">"api=SYNO.API.Auth"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  --data-urlencode </span><span class="token string" style="color:rgb(195, 232, 141)">"version=6"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  --data-urlencode </span><span class="token string" style="color:rgb(195, 232, 141)">"method=login"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  --data-urlencode </span><span class="token string" style="color:rgb(195, 232, 141)">"account=ops"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  --data-urlencode </span><span class="token string" style="color:rgb(195, 232, 141)">"passwd=</span><span class="token string variable" style="color:rgb(191, 199, 213)">$P</span><span class="token string" style="color:rgb(195, 232, 141)">"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  --data-urlencode </span><span class="token string" style="color:rgb(195, 232, 141)">"format=sid"</span><br></div></code></pre></div></div>
<p>If the login fails with a 403 or 404-style error, 2FA is probably still being enforced for that account.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-prepare-the-openstack-nodes">Step 2: Prepare the OpenStack nodes<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#step-2-prepare-the-openstack-nodes" class="hash-link" aria-label="Direct link to Step 2: Prepare the OpenStack nodes" title="Direct link to Step 2: Prepare the OpenStack nodes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="hostname-mapping-deployer-only">Hostname mapping (deployer only)<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#hostname-mapping-deployer-only" class="hash-link" aria-label="Direct link to Hostname mapping (deployer only)" title="Direct link to Hostname mapping (deployer only)" translate="no">​</a></h3>
<p>Kolla Ansible connects to the nodes by the names in the inventory, so the deployment host must be able to resolve them. Add the management IPs of all OpenStack nodes to <code>/etc/hosts</code> on the deployer:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token function" style="color:rgb(130, 170, 255)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">tee</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-a</span><span class="token plain"> /etc/hosts </span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;&lt;</span><span class="token string" style="color:rgb(195, 232, 141)">'EOF'</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)"># OpenStack VIP</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)">192.168.19.35   openstack-vip kolla-vip</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)"># OpenStack controllers</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)">192.168.19.36   dev-openstack-controller-01 controller-01</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)">192.168.19.37   dev-openstack-controller-02 controller-02</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)">192.168.19.38   dev-openstack-controller-03 controller-03</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)"># OpenStack computes</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)">192.168.19.41   dev-openstack-compute-01 compute-01</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)">192.168.19.42   dev-openstack-compute-02 compute-02</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token string" style="color:rgb(195, 232, 141)">EOF</span><br></div></code></pre></div></div>
<p>A few notes:</p>
<ul>
<li class="">The inventory always uses the <strong>full</strong> hostname (<code>dev-openstack-controller-01</code>). The short aliases (<code>controller-01</code>) are only for typing <code>ssh</code> by hand.</li>
<li class="">Each node's own hostname must match the name in the inventory (<code>hostnamectl</code> on the node), because RabbitMQ and Galera use it.</li>
</ul>
<p>Check that every name resolves and that you can reach each node over SSH:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token keyword" style="font-style:italic">for</span><span class="token plain"> </span><span class="token for-or-select variable" style="color:rgb(191, 199, 213)">h</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">in</span><span class="token plain"> dev-openstack-controller-0</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token number" style="color:rgb(247, 140, 108)">1,2</span><span class="token plain">,3</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"> dev-openstack-compute-0</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token number" style="color:rgb(247, 140, 108)">1,2</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">do</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  getent hosts </span><span class="token variable" style="color:rgb(191, 199, 213)">$h</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">||</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(255, 203, 107)">echo</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"</span><span class="token string variable" style="color:rgb(191, 199, 213)">$h</span><span class="token string" style="color:rgb(195, 232, 141)">: NOT RESOLVED"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">done</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">for</span><span class="token plain"> </span><span class="token for-or-select variable" style="color:rgb(191, 199, 213)">h</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">in</span><span class="token plain"> dev-openstack-controller-0</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token number" style="color:rgb(247, 140, 108)">1,2</span><span class="token plain">,3</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"> dev-openstack-compute-0</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token number" style="color:rgb(247, 140, 108)">1,2</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">do</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token function" style="color:rgb(130, 170, 255)">ssh</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-o</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(191, 199, 213)">BatchMode</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain">yes </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-o</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(191, 199, 213)">ConnectTimeout</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token number" style="color:rgb(247, 140, 108)">5</span><span class="token plain"> </span><span class="token variable" style="color:rgb(191, 199, 213)">$h</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">hostname</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">||</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(255, 203, 107)">echo</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"</span><span class="token string variable" style="color:rgb(191, 199, 213)">$h</span><span class="token string" style="color:rgb(195, 232, 141)">: SSH FAILED"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">done</span><br></div></code></pre></div></div>
<p>Each node should print its own full hostname. If one prints <code>SSH FAILED</code>, fix the SSH key or user first, because Kolla Ansible needs passwordless SSH to every node.</p>
<p>Do this on the target nodes <strong>before</strong> <code>kolla-ansible bootstrap-servers</code>. The deployment host does not need any of it.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="time-sync-all-nodes">Time sync (all nodes)<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#time-sync-all-nodes" class="hash-link" aria-label="Direct link to Time sync (all nodes)" title="Direct link to Time sync (all nodes)" translate="no">​</a></h3>
<p>Galera, RabbitMQ, and Keystone tokens are sensitive to clock drift between nodes, so every node needs working time sync. I run chrony on the host and turn off Kolla's own chrony container so the two do not fight over NTP:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token function" style="color:rgb(130, 170, 255)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">apt</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-y</span><span class="token plain"> chrony</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">sudo</span><span class="token plain"> systemctl </span><span class="token builtin class-name" style="color:rgb(255, 203, 107)">enable</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--now</span><span class="token plain"> chrony</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">sudo</span><span class="token plain"> timedatectl set-timezone Asia/Jakarta</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">chronyc tracking</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="disable-the-host-multipathd-and-iscsid-all-nodes">Disable the host multipathd and iscsid (all nodes)<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#disable-the-host-multipathd-and-iscsid-all-nodes" class="hash-link" aria-label="Direct link to Disable the host multipathd and iscsid (all nodes)" title="Direct link to Disable the host multipathd and iscsid (all nodes)" translate="no">​</a></h3>
<p>Kolla runs <code>iscsid</code> and <code>multipathd</code> as <strong>containers</strong> on compute nodes and on the <code>cinder-volume</code> node. If the host's own <code>iscsid</code>, <code>open-iscsi</code>, or <code>multipathd</code> are also running, they fight with the containers. Disable them on every node before the first deploy:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token function" style="color:rgb(130, 170, 255)">sudo</span><span class="token plain"> systemctl disable </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--now</span><span class="token plain"> multipathd.service multipathd.socket</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">sudo</span><span class="token plain"> systemctl disable </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--now</span><span class="token plain"> iscsid.service iscsid.socket open-iscsi.service</span><br></div></code></pre></div></div>
<p>I disable them on all nodes, not just the ones that run the containers today, so that moving <code>cinder-volume</code> to another node later does not bring the conflict back.</p>
<p>Also make sure each node has an IP on <strong>both</strong> storage subnets, with no gateway.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="mount-the-glance-nfs-share-controllers-only">Mount the Glance NFS share (controllers only)<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#mount-the-glance-nfs-share-controllers-only" class="hash-link" aria-label="Direct link to Mount the Glance NFS share (controllers only)" title="Direct link to Mount the Glance NFS share (controllers only)" translate="no">​</a></h3>
<p>Do this only after the DSM side is ready (NFS service, <code>glance</code> shared folder, NFS permission for <code>172.16.2.0/24</code>, and port <code>2049</code> open in the DSM firewall). Run it on all three controllers.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token function" style="color:rgb(130, 170, 255)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">apt</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-y</span><span class="token plain"> nfs-common</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">mkdir</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-p</span><span class="token plain"> /mnt/glance</span><br></div></code></pre></div></div>
<p>Make the mount permanent in <code>/etc/fstab</code>:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">172.16.2.31:/volume1/glance  /mnt/glance  nfs4  vers=4.1,_netdev,nofail,x-systemd.automount  0  0</span><br></div></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token function" style="color:rgb(130, 170, 255)">sudo</span><span class="token plain"> systemctl daemon-reload</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">mount</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-a</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">chmod</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">755</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-R</span><span class="token plain"> /mnt/glance/</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">df</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-h</span><span class="token plain"> /mnt/glance</span><br></div></code></pre></div></div>
<p>Test that the share is really shared: write from one controller and read from the others.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token builtin class-name" style="color:rgb(255, 203, 107)">echo</span><span class="token plain"> ok </span><span class="token operator" style="color:rgb(137, 221, 255)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">tee</span><span class="token plain"> /mnt/glance/test.txt   </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># controller-01</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">cat</span><span class="token plain"> /mnt/glance/test.txt                  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># controller-02 and 03</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">rm</span><span class="token plain"> /mnt/glance/test.txt</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3-deploy-with-kolla-ansible">Step 3: Deploy with Kolla Ansible<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#step-3-deploy-with-kolla-ansible" class="hash-link" aria-label="Direct link to Step 3: Deploy with Kolla Ansible" title="Direct link to Step 3: Deploy with Kolla Ansible" translate="no">​</a></h2>
<p>Run everything in this step on the deployment host.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-kolla-ansible">Install Kolla Ansible<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#install-kolla-ansible" class="hash-link" aria-label="Direct link to Install Kolla Ansible" title="Direct link to Install Kolla Ansible" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token function" style="color:rgb(130, 170, 255)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">apt</span><span class="token plain"> update</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">apt</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-y</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">git</span><span class="token plain"> python3-dev libffi-dev gcc libssl-dev python3-venv</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">python3 </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-m</span><span class="token plain"> venv openstack</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(255, 203, 107)">source</span><span class="token plain"> openstack/bin/activate</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">pip </span><span class="token function" style="color:rgb(130, 170, 255)">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-U</span><span class="token plain"> pip</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 2025.1 needs ansible-core 2.16 to 2.17 (check the exact range in the 2025.1 Quick Start)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">pip </span><span class="token function" style="color:rgb(130, 170, 255)">install</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">'ansible-core&gt;=2.16,&lt;2.18'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">pip </span><span class="token function" style="color:rgb(130, 170, 255)">install</span><span class="token plain"> git+https://opendev.org/openstack/kolla-ansible@stable/2025.1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">mkdir</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-p</span><span class="token plain"> /etc/kolla</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">chown</span><span class="token plain"> </span><span class="token environment constant" style="color:rgb(130, 170, 255)">$USER</span><span class="token builtin class-name" style="color:rgb(255, 203, 107)">:</span><span class="token environment constant" style="color:rgb(130, 170, 255)">$USER</span><span class="token plain"> /etc/kolla</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">cp</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-r</span><span class="token plain"> </span><span class="token variable" style="color:rgb(191, 199, 213)">$VIRTUAL_ENV</span><span class="token plain">/share/kolla-ansible/etc_examples/kolla/* /etc/kolla</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">cp</span><span class="token plain"> </span><span class="token variable" style="color:rgb(191, 199, 213)">$VIRTUAL_ENV</span><span class="token plain">/share/kolla-ansible/ansible/inventory/multinode </span><span class="token builtin class-name" style="color:rgb(255, 203, 107)">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">kolla-ansible install-deps</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="inventory">Inventory<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#inventory" class="hash-link" aria-label="Direct link to Inventory" title="Direct link to Inventory" translate="no">​</a></h3>
<p>Edit the <code>multinode</code> file you just copied. The groups I use:</p>
<div class="language-ini codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-ini codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">[control]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dev-openstack-controller-01</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dev-openstack-controller-02</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dev-openstack-controller-03</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">[network]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dev-openstack-controller-01</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dev-openstack-controller-02</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dev-openstack-controller-03</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">[compute]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dev-openstack-compute-01</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dev-openstack-compute-02</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">[monitoring]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dev-openstack-controller-01</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">[storage]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">dev-openstack-controller-01</span><br></div></code></pre></div></div>
<p><code>cinder-volume</code> runs on the hosts in <code>[storage]</code>. Because the Synology driver cannot run active/active, that group gets exactly one node. Do not leave it empty: without a node there, <code>cinder-volume</code> is never deployed, even though the backend is not a local disk. Moving it to another node is covered in the failover section below.</p>
<p>Check that Ansible can reach every node before going further:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">ansible </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-i</span><span class="token plain"> ./multinode all </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-m</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">ping</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="passwords">Passwords<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#passwords" class="hash-link" aria-label="Direct link to Passwords" title="Direct link to Passwords" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kolla-genpwd</span><br></div></code></pre></div></div>
<p>This fills <code>/etc/kolla/passwords.yml</code>. Keep that file out of git.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="globalsyml">globals.yml<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#globalsyml" class="hash-link" aria-label="Direct link to globals.yml" title="Direct link to globals.yml" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token key atrule">kolla_base_distro</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"ubuntu"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">kolla_internal_vip_address</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"192.168.19.35"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">neutron_plugin_agent</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"ovn"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">network_interface</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"eth0"</span><span class="token plain">          </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># (management)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">tunnel_interface</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"eth1"</span><span class="token plain">           </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># (internal)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">storage_interface</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"eth2"</span><span class="token plain">          </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># (storage)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">neutron_external_interface</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"ens22"</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># (external)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">enable_haproxy</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"yes"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">enable_keepalived</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"yes"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">keepalived_virtual_router_id</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"51"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">enable_cinder</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"yes"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">enable_horizon</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"yes"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">enable_iscsid</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"yes"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">enable_multipathd</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"yes"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">glance_file_datadir_volume</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"/mnt/glance"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">enable_cinder_backend_iscsi</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"yes"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">skip_cinder_backend_check</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"yes"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">enable_cinder_backup</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"no"</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-cinder-backend">The Cinder backend<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#the-cinder-backend" class="hash-link" aria-label="Direct link to The Cinder backend" title="Direct link to The Cinder backend" translate="no">​</a></h3>
<p>Create <code>/etc/kolla/config/cinder/cinder-volume.conf</code> on the deployment host. Kolla copies it to the <code>cinder-volume</code> node.</p>
<div class="language-ini codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-ini codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">[DEFAULT]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">enabled_backends = synology</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">[synology]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Fixed logical host name, so volumes are not tied to one node.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Set it BEFORE creating the first volume.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">backend_host = cinder-synology</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">volume_backend_name = synology</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">volume_driver = cinder.volume.drivers.synology.synology_iscsi.SynoISCSIDriver</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">target_protocol = iscsi</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Path 1: WebAPI and the main iSCSI portal</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">target_ip_address = 172.16.2.31</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Path 2: second iSCSI portal</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">target_secondary_ip_addresses = 172.16.3.31</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">synology_admin_port = 5001</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">driver_use_ssl = True</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># DSM uses a self-signed certificate out of the box</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">synology_ssl_verify = False</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">driver_ssl_cert_verify = False</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">synology_username = &lt;username&gt;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">synology_password = &lt;password&gt;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">synology_pool_name = volume1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">use_multipath_for_image_xfer = True</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Cache images in the backend to speed up "create volume from image"</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">image_volume_cache_enabled = True</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">image_volume_cache_max_size_gb = 100</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">image_volume_cache_max_count = 20</span><br></div></code></pre></div></div>
<p>A few notes:</p>
<ul>
<li class=""><code>target_ip_address</code> takes only <strong>one</strong> IP and is also used for the WebAPI calls. The second iSCSI portal goes in <code>target_secondary_ip_addresses</code>. Either way, verify that both sessions really form (see the multipath check later in this post).</li>
<li class=""><code>driver_ssl_cert_verify = False</code> is fine for a lab. In production, install a proper certificate on DSM and leave verification on.</li>
<li class="">The image-volume cache only becomes active after you set <code>cinder_internal_tenant_project_id</code> and <code>cinder_internal_tenant_user_id</code>, which need Keystone to be running first. Until then it does nothing, so it is safe to leave in.</li>
<li class="">The password sits in this file in plain text. Set <code>chmod 600</code>, keep it out of git, and consider <code>ansible-vault</code> for the file.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-4-deploy">Step 4: Deploy<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#step-4-deploy" class="hash-link" aria-label="Direct link to Step 4: Deploy" title="Direct link to Step 4: Deploy" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kolla-ansible bootstrap-servers </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-i</span><span class="token plain"> ./multinode</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">kolla-ansible prechecks </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-i</span><span class="token plain"> ./multinode</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">kolla-ansible deploy </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-i</span><span class="token plain"> ./multinode</span><br></div></code></pre></div></div>
<p>If OpenStack is already running, apply the backend with a reconfigure instead:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kolla-ansible reconfigure </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-i</span><span class="token plain"> ./multinode </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--tags</span><span class="token plain"> cinder</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-5-create-a-volume-type-and-test-one-volume">Step 5: Create a volume type and test one volume<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#step-5-create-a-volume-type-and-test-one-volume" class="hash-link" aria-label="Direct link to Step 5: Create a volume type and test one volume" title="Direct link to Step 5: Create a volume type and test one volume" translate="no">​</a></h2>
<p>First, check that the <code>cinder-volume</code> service for the Synology backend is up:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack volume </span><span class="token function" style="color:rgb(130, 170, 255)">service</span><span class="token plain"> list</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># cinder-volume ... synology ... up</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="Cinder volume service list" src="https://your-docusaurus-site.example.com/assets/images/Screenshot%202026-10-02%20124620-ee0be5245cb109d6c6bcc2fe66475cb6.png" width="766" height="326" class="img_ev3q"></p>
<p>Create a volume type that points to the backend, then create a 10 GB test volume:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack volume </span><span class="token builtin class-name" style="color:rgb(255, 203, 107)">type</span><span class="token plain"> create fast</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack volume </span><span class="token builtin class-name" style="color:rgb(255, 203, 107)">type</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(255, 203, 107)">set</span><span class="token plain"> fast </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--property</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(191, 199, 213)">volume_backend_name</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain">synology</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack volume create </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--size</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">10</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--type</span><span class="token plain"> fast test-vol</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack volume list</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack volume show test-vol </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-c</span><span class="token plain"> status </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-c</span><span class="token plain"> os-vol-host-attr:host</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="Test volume status and host" src="https://your-docusaurus-site.example.com/assets/images/Screenshot%202026-10-02%20125052-6b69af9a32a7cea67befe613972332d5.png" width="783" height="211" class="img_ev3q"></p>
<p>The status should become <code>available</code>. In DSM, <strong>SAN Manager</strong> should now show a new LUN and a target whose name starts with <code>Cinder-Target-</code>.</p>
<p><img decoding="async" loading="lazy" alt="New Cinder LUN in DSM SAN Manager" src="https://your-docusaurus-site.example.com/assets/images/Screenshot%202026-10-02%20125102-a995f81c77d5132eb7fdfa09e81139a5.png" width="1160" height="620" class="img_ev3q">
If the status goes to <code>error</code>, look at the Cinder log on the <code>cinder-volume</code> node:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token function" style="color:rgb(130, 170, 255)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">docker</span><span class="token plain"> logs cinder_volume</span><br></div></code></pre></div></div>
<p>Login failures, 2FA problems, and API-version differences on DSM 7 all show up there.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-6-prepare-openstack">Step 6: Prepare OpenStack<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#step-6-prepare-openstack" class="hash-link" aria-label="Direct link to Step 6: Prepare OpenStack" title="Direct link to Step 6: Prepare OpenStack" translate="no">​</a></h2>
<p>Everything in this step runs with the admin credentials loaded (<code>source /etc/kolla/admin-openrc.sh</code>).</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="security-group">Security group<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#security-group" class="hash-link" aria-label="Direct link to Security group" title="Direct link to Security group" translate="no">​</a></h3>
<p>A minimal group that allows SSH, HTTP, and ping from anywhere. Outbound traffic is allowed by the default egress rules that every new group gets.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack security group create minimum </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--description</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"ssh, http, icmp inbound; all outbound"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack security group rule create </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--ingress</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--protocol</span><span class="token plain"> tcp --dst-port </span><span class="token number" style="color:rgb(247, 140, 108)">22</span><span class="token plain"> --remote-ip </span><span class="token number" style="color:rgb(247, 140, 108)">0.0</span><span class="token plain">.0.0/0 minimum</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack security group rule create </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--ingress</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--protocol</span><span class="token plain"> tcp --dst-port </span><span class="token number" style="color:rgb(247, 140, 108)">80</span><span class="token plain"> --remote-ip </span><span class="token number" style="color:rgb(247, 140, 108)">0.0</span><span class="token plain">.0.0/0 minimum</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack security group rule create </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--ingress</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--protocol</span><span class="token plain"> icmp --remote-ip </span><span class="token number" style="color:rgb(247, 140, 108)">0.0</span><span class="token plain">.0.0/0 minimum</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="images">Images<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#images" class="hash-link" aria-label="Direct link to Images" title="Direct link to Images" translate="no">​</a></h3>
<p>Download a few cloud images and upload them to Glance. With the NFS setup from Step 2, the uploaded files end up on the DSM share.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token function" style="color:rgb(130, 170, 255)">mkdir</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-p</span><span class="token plain"> ~/images </span><span class="token operator" style="color:rgb(137, 221, 255)">&amp;&amp;</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(255, 203, 107)">cd</span><span class="token plain"> ~/images</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">wget</span><span class="token plain"> https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">wget</span><span class="token plain"> https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">wget</span><span class="token plain"> https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-GenericCloud-Base.latest.x86_64.qcow2</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack image create ubuntu-24.04 </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--file</span><span class="token plain"> noble-server-cloudimg-amd64.img </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  --disk-format qcow2 --container-format bare </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--public</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--property</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(191, 199, 213)">os_distro</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain">ubuntu </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--property</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(191, 199, 213)">os_version</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token number" style="color:rgb(247, 140, 108)">24.04</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack image create ubuntu-22.04 </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--file</span><span class="token plain"> jammy-server-cloudimg-amd64.img </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  --disk-format qcow2 --container-format bare </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--public</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--property</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(191, 199, 213)">os_distro</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain">ubuntu </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--property</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(191, 199, 213)">os_version</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token number" style="color:rgb(247, 140, 108)">22.04</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack image create rocky-9 </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--file</span><span class="token plain"> Rocky-9-GenericCloud-Base.latest.x86_64.qcow2 </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  --disk-format qcow2 --container-format bare </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--public</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--property</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(191, 199, 213)">os_distro</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain">rocky </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--property</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(191, 199, 213)">os_version</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token number" style="color:rgb(247, 140, 108)">9</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="flavors">Flavors<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#flavors" class="hash-link" aria-label="Direct link to Flavors" title="Direct link to Flavors" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack flavor create </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--vcpus</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--ram</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">4096</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--disk</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">20</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--public</span><span class="token plain"> c2r4d20</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack flavor create </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--vcpus</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--ram</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">2048</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--disk</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">10</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--public</span><span class="token plain"> c1r2d10</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="networks-1">Networks<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#networks-1" class="hash-link" aria-label="Direct link to Networks" title="Direct link to Networks" translate="no">​</a></h3>
<p>An external network for floating IPs, a tenant network for instances, and a router between them.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># external network + subnet (flat, on the external NIC)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack network create ext-net </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--external</span><span class="token plain"> --provider-network-type flat --provider-physical-network physnet1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack subnet create ext-sub </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--network</span><span class="token plain"> ext-net --subnet-range </span><span class="token number" style="color:rgb(247, 140, 108)">192.168</span><span class="token plain">.19.0/24 </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--gateway</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">192.168</span><span class="token plain">.19.1 --no-dhcp </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  --allocation-pool </span><span class="token assign-left variable" style="color:rgb(191, 199, 213)">start</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token number" style="color:rgb(247, 140, 108)">192.168</span><span class="token plain">.19.51,end</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token number" style="color:rgb(247, 140, 108)">192.168</span><span class="token plain">.19.71</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># tenant network + subnet</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack network create lab-ops-net</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack subnet create lab-ops-sub </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--network</span><span class="token plain"> lab-ops-net --subnet-range </span><span class="token number" style="color:rgb(247, 140, 108)">10.10</span><span class="token plain">.10.0/24 </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--gateway</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">10.10</span><span class="token plain">.10.1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># router: gateway to ext-net, interface to lab-ops-sub</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack router create ops-router</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack router </span><span class="token builtin class-name" style="color:rgb(255, 203, 107)">set</span><span class="token plain"> ops-router --external-gateway ext-net</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack router </span><span class="token function" style="color:rgb(130, 170, 255)">add</span><span class="token plain"> subnet ops-router lab-ops-sub</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="keypair">Keypair<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#keypair" class="hash-link" aria-label="Direct link to Keypair" title="Direct link to Keypair" translate="no">​</a></h3>
<p>Create a keypair and save the private key on the deployer:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack keypair create --private-key ~/.ssh/labops labops</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">chmod</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">600</span><span class="token plain"> ~/.ssh/labops</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The floating IP pool (<code>192.168.19.51</code> to <code>.71</code>) shares the management subnet in this lab, so pick a range that no node or DSM address uses. With ML2/OVN there is no <code>--ha</code> flag for routers: HA comes from the gateway chassis on the three controllers (with BFD), and the router fails over by itself.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-7-boot-an-instance-from-a-volume">Step 7: Boot an instance from a volume<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#step-7-boot-an-instance-from-a-volume" class="hash-link" aria-label="Direct link to Step 7: Boot an instance from a volume" title="Direct link to Step 7: Boot an instance from a volume" translate="no">​</a></h2>
<p>By default, a Nova instance's root disk is <strong>ephemeral and stored on the compute node</strong>, not on Synology. To really put the disk on Synology, boot from a volume.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="boot-the-instance">Boot the instance<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#boot-the-instance" class="hash-link" aria-label="Direct link to Boot the instance" title="Direct link to Boot the instance" translate="no">​</a></h3>
<p>Create the root volume from the image on the <code>fast</code> type first, so it is guaranteed to land on the Synology backend, then boot from it:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack volume create </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--size</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">20</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--type</span><span class="token plain"> fast </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--image</span><span class="token plain"> ubuntu-24.04 </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--bootable</span><span class="token plain"> vol-root-ops-lab-ubuntu24</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack server create </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--flavor</span><span class="token plain"> c2r4d20 </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--volume</span><span class="token plain"> vol-root-ops-lab-ubuntu24 </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--network</span><span class="token plain"> lab-ops-net </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  --security-group minimum </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  --key-name labops </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  ins-ops-lab-ubuntu24</span><br></div></code></pre></div></div>
<p>Wait until the volume is <code>available</code> before booting, and until the server is <code>ACTIVE</code> before the next step:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack volume show vol-root-ops-lab-ubuntu24 </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-c</span><span class="token plain"> status</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack server show ins-ops-lab-ubuntu24 </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-c</span><span class="token plain"> status </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-c</span><span class="token plain"> addresses</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="floating-ip-and-login">Floating IP and login<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#floating-ip-and-login" class="hash-link" aria-label="Direct link to Floating IP and login" title="Direct link to Floating IP and login" translate="no">​</a></h3>
<p>The instance only has an address on <code>lab-ops-net</code> (<code>10.10.10.0/24</code>). Give it a floating IP from <code>ext-net</code> to reach it from your LAN:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack floating </span><span class="token function" style="color:rgb(130, 170, 255)">ip</span><span class="token plain"> create ext-net</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack server </span><span class="token function" style="color:rgb(130, 170, 255)">add</span><span class="token plain"> floating </span><span class="token function" style="color:rgb(130, 170, 255)">ip</span><span class="token plain"> ins-ops-lab-ubuntu24 </span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token plain">floating-ip</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">ssh</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-i</span><span class="token plain"> ~/.ssh/labops ubuntu@</span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token plain">floating-ip</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="extra-data-volume">Extra data volume<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#extra-data-volume" class="hash-link" aria-label="Direct link to Extra data volume" title="Direct link to Extra data volume" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack volume create </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--size</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">10</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--type</span><span class="token plain"> fast vol-data01-ops-lab-ubuntu24</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack server </span><span class="token function" style="color:rgb(130, 170, 255)">add</span><span class="token plain"> volume ins-ops-lab-ubuntu24 vol-data01-ops-lab-ubuntu24</span><br></div></code></pre></div></div>
<p>Inside the guest, <code>lsblk</code> should show the 20 GB root disk and the 10 GB data disk.</p>
<p><img decoding="async" loading="lazy" alt="Disk Instance" src="https://your-docusaurus-site.example.com/assets/images/Screenshot%202026-10-02%20142956-45baf13c23b0b3c1a066b57ca5a89bf9.png" width="958" height="253" class="img_ev3q"></p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p><code>--boot-from-volume 20</code> is the shortcut, but it creates the root volume with the <strong>default</strong> volume type and gives you no way to choose another. With one Cinder backend this makes no difference, but creating the volume yourself with <code>--type fast</code> keeps working if you add a second backend later.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-8-verify-the-two-iscsi-paths">Step 8: Verify the two iSCSI paths<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#step-8-verify-the-two-iscsi-paths" class="hash-link" aria-label="Direct link to Step 8: Verify the two iSCSI paths" title="Direct link to Step 8: Verify the two iSCSI paths" translate="no">​</a></h2>
<p>On the compute node that runs the instance:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token function" style="color:rgb(130, 170, 255)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">docker</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(255, 203, 107)">exec</span><span class="token plain"> iscsid iscsiadm </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-m</span><span class="token plain"> session</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># expect two sessions: 172.16.2.31:3260 and 172.16.3.31:3260</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">docker</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(255, 203, 107)">exec</span><span class="token plain"> multipathd multipath </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-ll</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># expect one device with two paths, both active/ready</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="Verify Multipath" src="https://your-docusaurus-site.example.com/assets/images/Screenshot%202026-10-02%20143248-118a838d3c56fc418cbc77e8a1953ee8.png" width="928" height="297" class="img_ev3q"></p>
<p>Because the config only knows one <code>target_ip_address</code>, the second session depends on iSCSI discovery: the initiator asks the first portal which portals exist, and DSM advertises both, provided the target listens on both NICs. I treat this as something to <strong>verify, not assume</strong>. If you only see one session, check that the target is not bound to a single interface, and that port <code>3260</code> is open on the second subnet.</p>
<p>Then test the failover. Take one storage interface down on the compute node and keep writing to the volume inside the guest:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token function" style="color:rgb(130, 170, 255)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">ip</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">link</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(255, 203, 107)">set</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token plain">storage-nic-</span><span class="token operator file-descriptor important" style="color:rgb(137, 221, 255)">1</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"> down</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">docker</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(255, 203, 107)">exec</span><span class="token plain"> multipathd multipath </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-ll</span><span class="token plain">   </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># one path failed, one active</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">ip</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">link</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(255, 203, 107)">set</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token plain">storage-nic-</span><span class="token operator file-descriptor important" style="color:rgb(137, 221, 255)">1</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"> up</span><br></div></code></pre></div></div>
<p>I/O in the guest should keep working, possibly after a short stall while multipath switches paths. If the guest freezes instead, the second session most likely never formed. Repeat with the second NIC. By default DM-multipath uses a failover policy (one active path, one standby). Set <code>path_grouping_policy multibus</code> in <code>multipath.conf</code> if you want both paths in use at the same time.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-happens-when-something-fails">What happens when something fails<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#what-happens-when-something-fails" class="hash-link" aria-label="Direct link to What happens when something fails" title="Direct link to What happens when something fails" translate="no">​</a></h2>
<table><thead><tr><th>Failure</th><th>Result</th></tr></thead><tbody><tr><td>One storage path goes down</td><td>I/O continues over the other path.</td></tr><tr><td><code>cinder-volume</code> node goes down</td><td>You cannot create, delete, or resize volumes. Attached volumes keep working, because the instance talks to DSM directly.</td></tr><tr><td>DSM goes down</td><td>All volumes lose their I/O. Guests freeze or remount read-only. After DSM is back, iSCSI sessions reconnect. Reboot guests that went read-only.</td></tr><tr><td>DSM is up, API unreachable</td><td>New volumes cannot be created. Existing ones are fine.</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="moving-cinder-volume-to-another-node">Moving cinder-volume to another node<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#moving-cinder-volume-to-another-node" class="hash-link" aria-label="Direct link to Moving cinder-volume to another node" title="Direct link to Moving cinder-volume to another node" translate="no">​</a></h3>
<p>Cinder-volume runs as a single active instance (active/passive). Without a DLM
and a driver that supports active/active, running several instances against the
same <code>backend_host</code> is not formally safe, so failover is manual and the RTO
depends on the operator.</p>
<p><strong>Prerequisites (set up once)</strong></p>
<ol>
<li class="">Use a fixed logical host name in the backend section <strong>before creating the
first volume</strong>, so volumes are not tied to a node name:</li>
</ol>
<div class="language-ini codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-ini codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">[synology]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">backend_host = cinder-synology</span><br></div></code></pre></div></div>
<p>If volumes already exist under a node-specific host name, check their
current host (<code>openstack volume show &lt;id&gt; -c os-vol-host-attr:host</code>, admin
only) and move them once:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token function" style="color:rgb(130, 170, 255)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">docker</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(255, 203, 107)">exec</span><span class="token plain"> cinder_api cinder-manage volume update_host </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--currenthost</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token plain">old-node</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain">@synology</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">#&lt;pool&gt; \</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--newhost</span><span class="token plain"> cinder-synology@synology</span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">#&lt;pool&gt;</span><br></div></code></pre></div></div>
<ol start="2">
<li class="">Every candidate node must reach both iSCSI portals (172.16.2.31,
172.16.3.31) over the storage interface and the Synology DSM API (port 5001).</li>
</ol>
<p><strong>Failover procedure</strong></p>
<ol>
<li class="">Make sure the old node is really stopped or isolated. Two <code>cinder-volume</code>
instances running at the same time is unsafe.</li>
<li class="">In the inventory, remove the old node from <code>[storage]</code> and add the new one.</li>
<li class="">Refresh facts, then deploy only to the new node:</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">kolla-ansible gather-facts </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-i</span><span class="token plain"> ./multinode</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">kolla-ansible deploy </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-i</span><span class="token plain"> ./multinode </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--tags</span><span class="token plain"> cinder,iscsi </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--limit</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token plain">new-node</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><br></div></code></pre></div></div>
<p>If <code>gather-facts</code> fails because the dead node is unreachable, temporarily
remove it from the inventory or limit the facts to the remaining hosts.
4. Verify:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack volume </span><span class="token function" style="color:rgb(130, 170, 255)">service</span><span class="token plain"> list      </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># cinder-synology@synology must be up</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack volume create </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--size</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"> failover-test</span><br></div></code></pre></div></div>
<ol start="5">
<li class="">Volumes stuck in <code>creating</code>, <code>attaching</code> or <code>deleting</code> from before the
failure are not recovered automatically. Reset them and retry:</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">openstack volume </span><span class="token builtin class-name" style="color:rgb(255, 203, 107)">set</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--state</span><span class="token plain"> available </span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token plain">id</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain">   </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># or: cinder reset-state</span><br></div></code></pre></div></div>
<p><strong>When the old node returns</strong></p>
<p>Deploy does not stop containers on hosts outside <code>[storage]</code>. Before bringing
the node back online (or immediately after, if it auto-starts), remove the
stale container so it does not run next to the new one:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token function" style="color:rgb(130, 170, 255)">sudo</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">docker</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">rm</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-f</span><span class="token plain"> cinder_volume</span><br></div></code></pre></div></div>
<p><strong>Scope of the failure</strong></p>
<p>Only the control path for volumes (create, attach, detach, delete) is
interrupted. Running instances keep their I/O because the data path goes
directly from the compute node to the Synology over multipath iSCSI.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="if-the-synology-driver-does-not-work">If the Synology driver does not work<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#if-the-synology-driver-does-not-work" class="hash-link" aria-label="Direct link to If the Synology driver does not work" title="Direct link to If the Synology driver does not work" translate="no">​</a></h2>
<p>The driver is the part most likely to give trouble on newer DSM versions. If it does, there is a fallback that keeps the same hardware: create one big LUN manually in DSM, log in to both portals from the cinder node with <code>iscsiadm</code>, let multipath merge them into one device, build an LVM volume group named <code>cinder-volumes</code> on it, and use Kolla's regular LVM backend (<code>enable_cinder_backend_lvm</code> and <code>enable_cinder_backend_iscsi</code>). Cinder then slices volumes inside LVM, and DSM is just a big disk. You lose Synology's native snapshots and clones, but it is the most predictable path.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="troubleshooting">Troubleshooting<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#troubleshooting" class="hash-link" aria-label="Direct link to Troubleshooting" title="Direct link to Troubleshooting" translate="no">​</a></h2>
<table><thead><tr><th>Symptom</th><th>Likely cause</th></tr></thead><tbody><tr><td>Precheck: "Please enable at least one backend"</td><td>Add <code>skip_cinder_backend_check: "yes"</code> to <code>globals.yml</code>.</td></tr><tr><td>Volume goes to <code>error</code> immediately</td><td>Read <code>docker logs cinder_volume</code>. Common causes: wrong password, the account is not in <code>administrators</code>, 2FA still enforced.</td></tr><tr><td>SSL certificate errors in the log</td><td>DSM has a self-signed cert. Set <code>driver_ssl_cert_verify = False</code> or install a trusted cert.</td></tr><tr><td><code>cinder-volume</code> is not deployed at all</td><td><code>[storage]</code> is empty in the inventory.</td></tr><tr><td>Only one iSCSI session</td><td>The target is bound to one NIC, or port 3260 is blocked on the second subnet.</td></tr><tr><td>Attach fails or no multipath device</td><td>A host-level <code>iscsid</code> or <code>multipathd</code> is still running. Disable it and confirm the containers are up.</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="wrap-up">Wrap up<a href="https://your-docusaurus-site.example.com/blog/openstack-cinder-synology-iscsi#wrap-up" class="hash-link" aria-label="Direct link to Wrap up" title="Direct link to Wrap up" translate="no">​</a></h2>
<p>Cinder plus a Synology box is a pleasant way to learn the full block-storage flow: WebAPI calls to create LUNs, iSCSI logins from compute nodes, multipath on two paths, and boot-from-volume. It is not a high-availability storage design, because DSM and the single <code>cinder-volume</code> node are both single points of failure. Treat it as a lab and learning setup, and when you need real storage HA, move to Ceph.</p>]]></content>
        <author>
            <name>Rizwan Fairuz Mamduh</name>
        </author>
        <category label="Homelab" term="Homelab"/>
        <category label="OpenStack" term="OpenStack"/>
        <category label="Storage" term="Storage"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Deploy Xpenology with Arc Loader]]></title>
        <id>https://your-docusaurus-site.example.com/blog/deploy-xpenology</id>
        <link href="https://your-docusaurus-site.example.com/blog/deploy-xpenology"/>
        <updated>2026-09-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Synology DSM is one of the nicest NAS operating systems around, but it normally only runs on Synology's own hardware. Xpenology is the community way of running it anywhere else, including as a virtual machine. In this post I explain what Xpenology and the Arc Loader are, and then walk through deploying a DSM VM on Proxmox VE, step by step.]]></summary>
        <content type="html"><![CDATA[<p>Synology DSM is one of the nicest NAS operating systems around, but it normally only runs on Synology's own hardware. <strong>Xpenology</strong> is the community way of running it anywhere else, including as a virtual machine. In this post I explain what Xpenology and the Arc Loader are, and then walk through deploying a DSM VM on Proxmox VE, step by step.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-xpenology">What is Xpenology?<a href="https://your-docusaurus-site.example.com/blog/deploy-xpenology#what-is-xpenology" class="hash-link" aria-label="Direct link to What is Xpenology?" title="Direct link to What is Xpenology?" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Synology DSM 7 desktop" src="https://your-docusaurus-site.example.com/assets/images/StorageReview-Synology-DSM-7.0-Main-d1c52f56e4c08a5f3f997fe0b9654105.webp" width="1000" height="507" class="img_ev3q"></p>
<p><strong>DSM (DiskStation Manager)</strong> is the operating system that ships with Synology NAS devices. It gives you a clean web interface for storage management, file sharing (SMB, NFS), user and permission management, backups, containers, and a large catalog of packages.</p>
<p>Normally DSM only boots on a real Synology box. <strong>Xpenology</strong> is not an operating system by itself. It is the name of the community effort that makes DSM boot on hardware Synology never made: a desktop PC, a spare server, or a virtual machine.</p>
<p>For a homelab this is attractive. You are not limited to the CPU, RAM, disk bays, and network ports of a specific Synology model. You can reuse whatever you already have, or simply try DSM inside a VM without buying anything.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-does-it-work">How does it work?<a href="https://your-docusaurus-site.example.com/blog/deploy-xpenology#how-does-it-work" class="hash-link" aria-label="Direct link to How does it work?" title="Direct link to How does it work?" translate="no">​</a></h2>
<p>DSM expects to find a Synology device underneath it: a known model name, a serial number, specific hardware. A generic PC or VM does not look like that, so a small piece of software called a <strong>loader</strong> sits in front of DSM.</p>
<p>The loader boots first, presents the identity and settings DSM wants to see, and then hands control to the DSM kernel. The boot flow looks roughly like this:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">BIOS / UEFI</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">     │</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">     ▼</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  Loader  (small boot disk)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">     │</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">     ▼</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    DSM   (installed on the data disks)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">     │</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">     ▼</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> NAS services (SMB, NFS, iSCSI, apps ...)</span><br></div></code></pre></div></div>
<p>This also explains the disk layout you will see later in the VM: the loader lives on its own tiny disk, and DSM is installed onto separate data disks.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-arc-loader">What is Arc Loader?<a href="https://your-docusaurus-site.example.com/blog/deploy-xpenology#what-is-arc-loader" class="hash-link" aria-label="Direct link to What is Arc Loader?" title="Direct link to What is Arc Loader?" translate="no">​</a></h2>
<p>There are a few different loaders in the Xpenology world. <strong>Arc Loader</strong> (by AuxXxilium) is the one used in this post, and it is popular because it takes most of the manual work out of the process:</p>
<ul>
<li class="">It is <strong>menu driven</strong>. You choose a model, a DSM version, and some options, and Arc builds the loader for you. No hand-editing config files.</li>
<li class="">It <strong>downloads the DSM installation file</strong> for you during the build.</li>
<li class="">It <strong>generates the serial number and MAC addresses</strong> that DSM will use.</li>
<li class="">It ships as a ready-to-use disk image, which is easy to import into Proxmox.</li>
<li class="">It has a built-in <strong>web terminal</strong> on port <code>7080</code>, so you can drive the menu from a browser instead of the Proxmox console.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="before-you-start">Before you start<a href="https://your-docusaurus-site.example.com/blog/deploy-xpenology#before-you-start" class="hash-link" aria-label="Direct link to Before you start" title="Direct link to Before you start" translate="no">​</a></h2>
<p>Xpenology is a great way to learn and to build a homelab NAS, but there are a few things worth knowing up front.</p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>Xpenology is unofficial and unsupported. DSM is designed to run on Synology hardware, and Synology will not help you if something breaks on other hardware. Updates can also break an Xpenology install, so treat it as a lab and learning tool, not as a place for data you cannot lose.</p></div></div>
<ul>
<li class=""><strong>RAID and redundancy are not a backup.</strong> If a file is deleted by mistake, every disk in the array agrees that it is gone. Keep a separate backup of anything important.</li>
<li class=""><strong>Be careful with updates.</strong> A DSM update that is fine on a real Synology can fail on Xpenology. Take a Proxmox snapshot or backup before every DSM update, and turn off automatic updates.</li>
<li class=""><strong>A virtual disk is not redundancy.</strong> A single VM disk on a single Proxmox node is exactly one copy of your data.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="requirements">Requirements<a href="https://your-docusaurus-site.example.com/blog/deploy-xpenology#requirements" class="hash-link" aria-label="Direct link to Requirements" title="Direct link to Requirements" translate="no">​</a></h2>
<ul>
<li class="">A Proxmox VE host with internet access</li>
<li class="">A network bridge with internet access (this post uses <code>vmbr0</code>)</li>
<li class="">A storage target for VM disks (this post uses <code>local-lvm</code>; use whatever you have)</li>
<li class="">A DHCP server on the network, or be ready to set a static IP in DSM afterwards</li>
<li class="">Suggested VM resources: 2 vCPU, 4 GB RAM, and as much data disk as you like</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-download-the-arc-image">Step 1: Download the Arc image<a href="https://your-docusaurus-site.example.com/blog/deploy-xpenology#step-1-download-the-arc-image" class="hash-link" aria-label="Direct link to Step 1: Download the Arc image" title="Direct link to Step 1: Download the Arc image" translate="no">​</a></h2>
<p>On the Proxmox host, download the latest Arc release from the project's GitHub releases page (<code>github.com/AuxXxilium/arc</code>). The asset is a zip file with a single <code>.img</code> inside.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token builtin class-name" style="color:rgb(255, 203, 107)">cd</span><span class="token plain"> /tmp</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">wget</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token plain">URL of the arc-</span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token plain">version</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain">.img.zip asset from the releases page</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">unzip</span><span class="token plain"> arc-*.img.zip</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">ls</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-lh</span><span class="token plain"> arc-*.img</span><br></div></code></pre></div></div>
<p>If <code>unzip</code> is missing, install it with <code>apt install -y unzip</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-create-the-vm">Step 2: Create the VM<a href="https://your-docusaurus-site.example.com/blog/deploy-xpenology#step-2-create-the-vm" class="hash-link" aria-label="Direct link to Step 2: Create the VM" title="Direct link to Step 2: Create the VM" translate="no">​</a></h2>
<p>I use two shell variables so the commands can be copy-pasted. Change them to fit your host.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token assign-left variable" style="color:rgb(191, 199, 213)">VMID</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token number" style="color:rgb(247, 140, 108)">100</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token assign-left variable" style="color:rgb(191, 199, 213)">STORAGE</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain">local-lvm</span><br></div></code></pre></div></div>
<p>Create the VM without any disks. The loader image is imported as a disk in the next step.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">qm create </span><span class="token variable" style="color:rgb(191, 199, 213)">$VMID</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--name</span><span class="token plain"> xpenology-dsm </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--ostype</span><span class="token plain"> l26 </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--machine</span><span class="token plain"> q35 </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--cpu</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">host</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--sockets</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--cores</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--memory</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">4096</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--balloon</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--net0</span><span class="token plain"> virtio,bridge</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain">vmbr0</span><br></div></code></pre></div></div>
<p>A few notes on those options:</p>
<ul>
<li class=""><code>--cpu host</code> passes the real CPU features to the guest. DSM and some of its packages can be picky about CPU flags, and <code>host</code> avoids most surprises.</li>
<li class=""><code>--balloon 0</code> turns off memory ballooning. A NAS operating system does not like having its memory taken away behind its back.</li>
<li class="">VirtIO is fine for the NIC in most cases. If Arc does not detect it later, switch to <code>e1000</code>: <code>qm set $VMID --net0 e1000,bridge=vmbr0</code>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3-import-the-loader-and-add-a-data-disk">Step 3: Import the loader and add a data disk<a href="https://your-docusaurus-site.example.com/blog/deploy-xpenology#step-3-import-the-loader-and-add-a-data-disk" class="hash-link" aria-label="Direct link to Step 3: Import the loader and add a data disk" title="Direct link to Step 3: Import the loader and add a data disk" translate="no">​</a></h2>
<p>Import the Arc image and attach it as <strong>SATA0</strong>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">qm importdisk </span><span class="token variable" style="color:rgb(191, 199, 213)">$VMID</span><span class="token plain"> /tmp/arc-</span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token plain">version</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain">.img </span><span class="token variable" style="color:rgb(191, 199, 213)">$STORAGE</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">qm </span><span class="token builtin class-name" style="color:rgb(255, 203, 107)">set</span><span class="token plain"> </span><span class="token variable" style="color:rgb(191, 199, 213)">$VMID</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--sata0</span><span class="token plain"> </span><span class="token variable" style="color:rgb(191, 199, 213)">$STORAGE</span><span class="token plain">:vm-</span><span class="token variable" style="color:rgb(191, 199, 213)">$VMID</span><span class="token plain">-disk-0</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>On file-based storage (like a directory storage) the imported disk may have a different name, for example <code>vm-100-disk-0.raw</code>. Run <code>qm config $VMID</code> and look for the <code>unused0</code> line to see the exact name to attach.</p></div></div>
<p>Now add the data disk as <strong>SATA1</strong>. The number after the colon is the size in GB:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">qm </span><span class="token builtin class-name" style="color:rgb(255, 203, 107)">set</span><span class="token plain"> </span><span class="token variable" style="color:rgb(191, 199, 213)">$VMID</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--sata1</span><span class="token plain"> </span><span class="token variable" style="color:rgb(191, 199, 213)">$STORAGE</span><span class="token plain">:50</span><br></div></code></pre></div></div>
<p>Finally, make the loader disk the boot device:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">qm </span><span class="token builtin class-name" style="color:rgb(255, 203, 107)">set</span><span class="token plain"> </span><span class="token variable" style="color:rgb(191, 199, 213)">$VMID</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--boot</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(191, 199, 213)">order</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain">sata0</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>Use <strong>SATA</strong> for both the loader and the data disks. DSM expects SATA-style disks, and disks attached as VirtIO or SCSI are often not offered as installable drives.</p></div></div>
<p>Check the result:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">qm config </span><span class="token variable" style="color:rgb(191, 199, 213)">$VMID</span><br></div></code></pre></div></div>
<p>You should see <code>sata0</code> (the loader), <code>sata1</code> (the data disk), <code>net0</code>, and <code>boot: order=sata0</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-4-boot-and-build-the-loader">Step 4: Boot and build the loader<a href="https://your-docusaurus-site.example.com/blog/deploy-xpenology#step-4-boot-and-build-the-loader" class="hash-link" aria-label="Direct link to Step 4: Boot and build the loader" title="Direct link to Step 4: Boot and build the loader" translate="no">​</a></h2>
<p>Start the VM and open its console in the Proxmox web UI:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">qm start </span><span class="token variable" style="color:rgb(191, 199, 213)">$VMID</span><br></div></code></pre></div></div>
<p>Arc shows a text menu and prints the IP address the VM received, along with the address of its web terminal:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">http://&lt;vm-ip&gt;:7080</span><br></div></code></pre></div></div>
<p>You can continue in the Proxmox console, but the web terminal is nicer to work with. Menu labels differ a little between Arc versions, but the flow is always the same:</p>
<ol>
<li class=""><strong>Choose a model.</strong> Pick one from the list Arc offers. The model decides things like the maximum number of disks and which CPU features are required, so read the notes Arc shows.</li>
<li class=""><strong>Choose a DSM version.</strong> Pick a DSM 7.x release.</li>
<li class=""><strong>Review the options.</strong> Arc generates a serial number and MAC address for the VM. Write them down. If you ever recreate the VM, reuse the same values so DSM recognizes it as the same device.</li>
<li class=""><strong>Pick addons</strong> if you want any. Skipping them is fine for a first install.</li>
<li class=""><strong>Build the loader.</strong> Arc downloads the DSM file from Synology, so the VM needs internet access for this step.</li>
<li class=""><strong>Boot the loader.</strong> Arc restarts into the DSM installer.</li>
</ol>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>If the build fails while downloading, check DNS and the default gateway on the network the VM is attached to. Arc can also use a DSM file that you download yourself and provide manually.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-5-install-dsm">Step 5: Install DSM<a href="https://your-docusaurus-site.example.com/blog/deploy-xpenology#step-5-install-dsm" class="hash-link" aria-label="Direct link to Step 5: Install DSM" title="Direct link to Step 5: Install DSM" translate="no">​</a></h2>
<p>After the loader boots, the VM looks like a brand new, uninstalled Synology device. From your laptop:</p>
<ul>
<li class="">open <code>http://&lt;vm-ip&gt;:5000</code>, or</li>
<li class="">open <code>find.synology.com</code> from a machine on the same network.</li>
</ul>
<p>Then:</p>
<ol>
<li class="">Click <strong>Install</strong>. DSM installs itself onto the data disk and the VM reboots once or twice.</li>
<li class="">Create your admin account.</li>
<li class="">Finish the setup wizard. You can skip the Synology account and QuickConnect options.</li>
</ol>
<p>When the DSM desktop appears, you are done. From here you can create a storage pool and volume, set up shared folders, and install packages like on any other Synology.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-6-autostart-and-snapshots">Step 6: Autostart and snapshots<a href="https://your-docusaurus-site.example.com/blog/deploy-xpenology#step-6-autostart-and-snapshots" class="hash-link" aria-label="Direct link to Step 6: Autostart and snapshots" title="Direct link to Step 6: Autostart and snapshots" translate="no">​</a></h2>
<p>Make the VM start together with the Proxmox host:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">qm </span><span class="token builtin class-name" style="color:rgb(255, 203, 107)">set</span><span class="token plain"> </span><span class="token variable" style="color:rgb(191, 199, 213)">$VMID</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">--onboot</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><br></div></code></pre></div></div>
<p>And before touching anything risky, such as a DSM update or a loader rebuild, take a snapshot:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">qm snapshot </span><span class="token variable" style="color:rgb(191, 199, 213)">$VMID</span><span class="token plain"> before-update</span><br></div></code></pre></div></div>
<p>To roll back if something goes wrong: <code>qm rollback $VMID before-update</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="troubleshooting">Troubleshooting<a href="https://your-docusaurus-site.example.com/blog/deploy-xpenology#troubleshooting" class="hash-link" aria-label="Direct link to Troubleshooting" title="Direct link to Troubleshooting" translate="no">​</a></h2>
<table><thead><tr><th>Problem</th><th>What to check</th></tr></thead><tbody><tr><td>Arc does not show an IP address</td><td>The NIC model may not be detected. Switch <code>net0</code> to <code>e1000</code> and reboot the VM.</td></tr><tr><td><code>find.synology.com</code> cannot find the VM</td><td>Open <code>http://&lt;vm-ip&gt;:5000</code> directly, and make sure your laptop is on the same network as the VM.</td></tr><tr><td>The installer says no disk was found</td><td>The data disk must be attached as <strong>SATA</strong> (<code>sata1</code>), not VirtIO or SCSI.</td></tr><tr><td>Arc fails to download DSM</td><td>Check internet access and DNS from the VM, or provide the DSM file manually.</td></tr><tr><td>Black screen after installing</td><td>Confirm <code>boot: order=sata0</code> in <code>qm config</code>. The loader disk must stay the first boot device.</td></tr><tr><td>DSM asks to migrate or reinstall after recreating the VM</td><td>The serial number or MAC address changed. Reuse the values you wrote down in Step 4.</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="wrap-up">Wrap up<a href="https://your-docusaurus-site.example.com/blog/deploy-xpenology#wrap-up" class="hash-link" aria-label="Direct link to Wrap up" title="Direct link to Wrap up" translate="no">​</a></h2>
<p>Xpenology lets you run DSM on hardware that Synology never intended, and Arc Loader makes the process mostly point and click. For a Proxmox VM it comes down to this: import the Arc image as <code>SATA0</code>, add a data disk as <code>SATA1</code>, build the loader from the Arc menu, and run the normal DSM installer. Just keep in mind that it is an unsupported setup, so snapshot before updates and keep real backups of anything you care about.</p>]]></content>
        <author>
            <name>Rizwan Fairuz Mamduh</name>
        </author>
        <category label="Homelab" term="Homelab"/>
        <category label="Proxmox" term="Proxmox"/>
        <category label="Storage" term="Storage"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Test Blog Post 2]]></title>
        <id>https://your-docusaurus-site.example.com/blog/test-post-2</id>
        <link href="https://your-docusaurus-site.example.com/blog/test-post-2"/>
        <updated>2025-10-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Lorem ipsum dolor sit amet, consectetur adipiscing elit.]]></summary>
        <content type="html"><![CDATA[<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://your-docusaurus-site.example.com/blog/test-post-2#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no">​</a></h2>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="main-content">Main Content<a href="https://your-docusaurus-site.example.com/blog/test-post-2#main-content" class="hash-link" aria-label="Direct link to Main Content" title="Direct link to Main Content" translate="no">​</a></h2>
<p>Praesent euismod, nunc vel consectetur interdum, nisl nisi aliquam nunc, eget aliquam nisl nisi eu nunc. Sed euismod, nunc vel consectetur interdum, nisl nisi aliquam nunc, eget aliquam nisl nisi eu nunc.</p>]]></content>
        <author>
            <name>Thành Nam Nguyễn</name>
        </author>
        <category label="Hola" term="Hola"/>
        <category label="Docusaurus" term="Docusaurus"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Test Blog Post]]></title>
        <id>https://your-docusaurus-site.example.com/blog/test-post</id>
        <link href="https://your-docusaurus-site.example.com/blog/test-post"/>
        <updated>2025-10-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Lorem ipsum dolor sit amet, consectetur adipiscing elit.]]></summary>
        <content type="html"><![CDATA[<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://your-docusaurus-site.example.com/blog/test-post#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no">​</a></h2>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="main-content">Main Content<a href="https://your-docusaurus-site.example.com/blog/test-post#main-content" class="hash-link" aria-label="Direct link to Main Content" title="Direct link to Main Content" translate="no">​</a></h2>
<p>Praesent euismod, nunc vel consectetur interdum, nisl nisi aliquam nunc, eget aliquam nisl nisi eu nunc. Sed euismod, nunc vel consectetur interdum, nisl nisi aliquam nunc, eget aliquam nisl nisi eu nunc.</p>]]></content>
        <author>
            <name>Thành Nam Nguyễn</name>
        </author>
        <category label="Hola" term="Hola"/>
        <category label="Docusaurus" term="Docusaurus"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Welcome]]></title>
        <id>https://your-docusaurus-site.example.com/blog/welcome</id>
        <link href="https://your-docusaurus-site.example.com/blog/welcome"/>
        <updated>2021-08-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Docusaurus blogging features are powered by the blog plugin.]]></summary>
        <content type="html"><![CDATA[<p><a href="https://docusaurus.io/docs/blog" target="_blank" rel="noopener noreferrer" class="">Docusaurus blogging features</a> are powered by the <a href="https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-blog" target="_blank" rel="noopener noreferrer" class="">blog plugin</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-a-new-blog-post">I. Create a new blog post<a href="https://your-docusaurus-site.example.com/blog/welcome#create-a-new-blog-post" class="hash-link" aria-label="Direct link to I. Create a new blog post" title="Direct link to I. Create a new blog post" translate="no">​</a></h2>
<p>Simply add Markdown files (or folders) to the <code>blog</code> directory.</p>
<p>Regular blog authors can be added to <code>authors.yml</code>.</p>
<p>The blog post date can be extracted from filenames, such as:</p>
<ul>
<li class=""><code>2019-05-30-welcome.md</code></li>
<li class=""><code>2019-05-30-welcome/index.md</code></li>
</ul>
<p>A blog post folder can be convenient to co-locate blog post images:</p>
<p><img decoding="async" loading="lazy" alt="Docusaurus Plushie" src="https://your-docusaurus-site.example.com/assets/images/docusaurus-plushie-banner-a60f7593abca1e3eef26a9afa244e4fb.jpeg" width="1500" height="500" class="img_ev3q"></p>
<p>The blog supports tags as well!</p>
<p><strong>And if you don't want a blog</strong>: just delete this directory, and use <code>blog: false</code> in your Docusaurus config.</p>]]></content>
        <author>
            <name>Sébastien Lorber</name>
        </author>
        <author>
            <name>Yangshun Tay</name>
        </author>
        <author>
            <name>Thành Nam Nguyễn</name>
        </author>
        <category label="Facebook" term="Facebook"/>
        <category label="Hello" term="Hello"/>
        <category label="Docusaurus" term="Docusaurus"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[MDX Blog Post]]></title>
        <id>https://your-docusaurus-site.example.com/blog/mdx-blog-post</id>
        <link href="https://your-docusaurus-site.example.com/blog/mdx-blog-post"/>
        <updated>2021-08-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Blog posts support Docusaurus Markdown features, such as MDX.]]></summary>
        <content type="html"><![CDATA[<p>Blog posts support <a href="https://docusaurus.io/docs/markdown-features" target="_blank" rel="noopener noreferrer" class="">Docusaurus Markdown features</a>, such as <a href="https://mdxjs.com/" target="_blank" rel="noopener noreferrer" class="">MDX</a>.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>Use the power of React to create interactive blog posts.</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token plain">button onClick</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(137, 221, 255)">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">alert</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">'button clicked!'</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token maybe-class-name">Click</span><span class="token plain"> me</span><span class="token operator" style="color:rgb(137, 221, 255)">!</span><span class="token operator" style="color:rgb(137, 221, 255)">&lt;</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">button</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><br></div></code></pre></div></div><button>Click me!</button></div></div>]]></content>
        <author>
            <name>Sébastien Lorber</name>
        </author>
        <author>
            <name>Thành Nam Nguyễn</name>
        </author>
        <category label="Docusaurus" term="Docusaurus"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Long Blog Post]]></title>
        <id>https://your-docusaurus-site.example.com/blog/long-blog-post</id>
        <link href="https://your-docusaurus-site.example.com/blog/long-blog-post"/>
        <updated>2019-05-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This is the summary of a very long blog post,]]></summary>
        <content type="html"><![CDATA[<p>This is the summary of a very long blog post,</p>
<p>Use a <code>&lt;!--</code> <code>truncate</code> <code>--&gt;</code> comment to limit blog post size in the list view.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-a-new-blog-post">1. Create a new blog post<a href="https://your-docusaurus-site.example.com/blog/long-blog-post#create-a-new-blog-post" class="hash-link" aria-label="Direct link to 1. Create a new blog post" title="Direct link to 1. Create a new blog post" translate="no">​</a></h2>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>]]></content>
        <author>
            <name>Endilie Yacop Sucipto</name>
        </author>
        <author>
            <name>Yangshun Tay</name>
        </author>
        <category label="Hello" term="Hello"/>
        <category label="Docusaurus" term="Docusaurus"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[First Blog Post]]></title>
        <id>https://your-docusaurus-site.example.com/blog/first-blog-post</id>
        <link href="https://your-docusaurus-site.example.com/blog/first-blog-post"/>
        <updated>2019-05-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet]]></summary>
        <content type="html"><![CDATA[<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>]]></content>
        <author>
            <name>Gao Wei</name>
        </author>
        <category label="Hola" term="Hola"/>
        <category label="Docusaurus" term="Docusaurus"/>
    </entry>
</feed>