# Proxmox VE

# Configurazione Synology DS1817 come QDevice per il quorum

## Obiettivo

Configurare un NAS **Synology DS1817** come voto esterno per il quorum di un cluster **Proxmox VE a 2 nodi**, usando `corosync-qnetd`.

Schema finale:

```text
proxmox01      1 voto
proxmox02      1 voto
Synology NAS   1 voto esterno QDevice

Totale voti:   3
Quorum:        2

```

Il Synology **non diventa un nodo Proxmox**. Serve solo come server `corosync-qnetd`.

---

## Scenario di esempio

<table id="bkmrk-host-ip-proxmox01-19"><thead><tr><th>Host</th><th>IP</th></tr></thead><tbody><tr><td>`proxmox01`</td><td>`192.168.0.10`</td></tr><tr><td>`proxmox02`</td><td>`192.168.0.11`</td></tr><tr><td>`Synology DS1817`</td><td>`192.168.0.50`</td></tr></tbody></table>

Cluster Proxmox già esistente:

```text
proxmox01 + proxmox02

```

---

## Nota importante

Questa guida è pensata per **Synology DS1817 non Plus**, quindi modello ARM.

Non useremo:

```text
VM Debian
Docker
Raspberry
Debian chroot

```

La soluzione funzionante è:

```text
Synology DS1817
└── Entware
    ├── corosync
    ├── corosync-qdevice
    ├── nss-utils
    └── openssh-sftp-server

```

---

## 1. Abilitare SSH sul Synology

Da DSM:

```text
Pannello di controllo
→ Terminale e SNMP
→ Abilita servizio SSH

```

Poi collegarsi al NAS:

```bash
ssh tuo_utente@192.168.0.50
sudo -i

```

---

## 2. Installare Entware sul Synology

Creare la directory persistente:

```bash
mkdir -p /volume1/@Entware/opt
rm -rf /opt
mkdir -p /opt
mount -o bind /volume1/@Entware/opt /opt

```

Installare Entware per ARMv7:

```bash
wget -O - https://bin.entware.net/armv7sf-k3.2/installer/generic.sh | /bin/sh

```

Aggiornare `opkg`:

```bash
/opt/bin/opkg update

```

Installare alcuni strumenti base:

```bash
/opt/bin/opkg install bash wget tar gzip xz binutils

```

Verificare che `opkg` funzioni:

```bash
/opt/bin/opkg update

```

---

## 3. Installare i pacchetti necessari

Sul Synology:

```bash
/opt/bin/opkg update
/opt/bin/opkg install corosync corosync-qdevice nss-utils openssh-sftp-server

```

Verificare i binari:

```bash
find /opt -type f | grep -E 'corosync-qnetd|qnetd|qdevice|certutil|sftp-server'

```

Output atteso simile:

```text
/opt/bin/corosync-qnetd
/opt/bin/corosync-qnetd-tool
/opt/bin/corosync-qnetd-certutil
/opt/bin/certutil
/opt/lib/sftp-server

```

---

## 4. Creare i wrapper per Proxmox

Proxmox, durante il comando `pvecm qdevice setup`, si aspetta alcuni binari in percorsi standard come `/usr/bin` e `/usr/sbin`.

Creare i wrapper:

```bash
cat > /usr/sbin/corosync-qnetd <<'EOF'
#!/bin/sh
exec /opt/bin/corosync-qnetd "$@"
EOF

cat > /usr/bin/corosync-qnetd-tool <<'EOF'
#!/bin/sh
exec /opt/bin/corosync-qnetd-tool "$@"
EOF

cat > /usr/bin/corosync-qnetd-certutil <<'EOF'
#!/bin/sh
exec /opt/bin/corosync-qnetd-certutil "$@"
EOF

cat > /usr/bin/certutil <<'EOF'
#!/bin/sh
exec /opt/bin/certutil "$@"
EOF

chmod +x /usr/sbin/corosync-qnetd
chmod +x /usr/bin/corosync-qnetd-tool
chmod +x /usr/bin/corosync-qnetd-certutil
chmod +x /usr/bin/certutil

```

Verificare:

```bash
which corosync-qnetd
which corosync-qnetd-tool
which corosync-qnetd-certutil
which certutil

```

---

## 5. Sistemare le directory di Corosync

Creare la directory di configurazione:

```bash
mkdir -p /etc/corosync/qnetd
chmod 700 /etc/corosync
chmod 700 /etc/corosync/qnetd

```

Sul Synology, Entware usa `/opt/etc/corosync`, mentre Proxmox cerca `/etc/corosync`.

La struttura funzionante è:

```text
/etc/corosync = directory reale
/opt/etc/corosync -> /etc/corosync

```

Creare il symlink:

```bash
rm -rf /opt/etc/corosync
ln -s /etc/corosync /opt/etc/corosync

```

Verificare:

```bash
ls -ld /etc/corosync /opt/etc/corosync

```

Output atteso:

```text
drwx------ ... /etc/corosync
lrwxrwxrwx ... /opt/etc/corosync -> /etc/corosync

```

---

## 6. Sistemare SFTP/SCP sul Synology

`pvecm qdevice setup` usa `scp` per copiare certificati e file necessari.

Sul DS1817 può comparire questo errore:

```text
subsystem request failed on channel 0
scp: Connection closed

```

Per risolvere, usare il server SFTP installato tramite Entware.

Modificare il file SSH:

```bash
vi /etc/ssh/sshd_config

```

Cercare la riga `Subsystem sftp`.

Commentare eventuali righe esistenti, per esempio:

```text
#Subsystem       sftp    internal-sftp -f DAEMON -u 000

```

Aggiungere questa riga:

```text
Subsystem       sftp    /opt/lib/sftp-server

```

Verificare che ci sia una sola riga attiva:

```bash
grep -n "^[^#].*Subsystem.*sftp" /etc/ssh/sshd_config

```

Riavviare SSH:

```bash
synosystemctl restart sshd

```

Se non funziona, disabilitare e riabilitare SSH da DSM:

```text
Pannello di controllo
→ Terminale e SNMP
→ Disabilita SSH
→ Applica
→ Abilita SSH
→ Applica

```

---

## 7. Abilitare accesso root SSH via chiave

Da `proxmox01`, controllare se esiste già la chiave SSH root:

```bash
ls -l /root/.ssh/id_rsa.pub

```

Se non esiste, crearla:

```bash
ssh-keygen -t rsa -b 4096 -f /root/.ssh/id_rsa

```

Mostrare la chiave pubblica:

```bash
cat /root/.ssh/id_rsa.pub

```

Sul Synology, da root:

```bash
mkdir -p /root/.ssh
chmod 700 /root/.ssh
vi /root/.ssh/authorized_keys

```

Incollare dentro `authorized_keys` la chiave pubblica di `proxmox01`.

Poi sistemare i permessi:

```bash
chmod 600 /root/.ssh/authorized_keys
chown -R root:root /root/.ssh

```

Nel file SSH:

```bash
vi /etc/ssh/sshd_config

```

assicurarsi che siano presenti:

```text
PermitRootLogin prohibit-password
PubkeyAuthentication yes

```

Riavviare SSH:

```bash
synosystemctl restart sshd

```

Test da `proxmox01`:

```bash
ssh root@192.168.0.50 'hostname'

```

Output atteso:

```text
synology

```

Test SCP:

```bash
scp root@192.168.0.50:/etc/hosts /tmp/synology-hosts-test

```

Se questo comando funziona, si può proseguire.

---

## 8. Rimuovere eventuale vecchio QDevice

Se era già presente un QDevice precedente, ad esempio un Raspberry Pi, rimuoverlo da Proxmox.

Su `proxmox01`:

```bash
pvecm qdevice remove

```

Verificare:

```bash
pvecm status

```

Output temporaneo atteso:

```text
Expected votes: 2
Total votes:    2
Quorum:         2
Quorate:        Yes

```

---

## 9. Pulire eventuale database qnetd precedente

Sul Synology:

```bash
rm -rf /etc/corosync/qnetd/nssdb
rm -rf /opt/etc/corosync/qnetd/nssdb

```

---

## 10. Configurare il Synology come QDevice

Da `proxmox01`:

```bash
pvecm qdevice setup 192.168.0.50

```

Al termine, verificare:

```bash
pvecm status

```

Output atteso:

```text
Expected votes:   3
Total votes:      3
Quorum:           2
Flags:            Quorate Qdevice

```

Membership attesa:

```text
Nodeid      Votes    Qdevice Name
0x00000001      1    A,V,NMW 192.168.0.10
0x00000002      1    A,V,NMW 192.168.0.11
0x00000000      1            Qdevice

```

---

## 11. Avviare qnetd sul Synology

Sul Synology:

```bash
nohup /opt/bin/corosync-qnetd -f > /var/log/corosync-qnetd.log 2>&1 &

```

Verificare:

```bash
ps | grep '[c]orosync-qnetd'
netstat -tlnp | grep 5403

```

Output atteso:

```text
tcp6  0  0 :::5403  :::*  LISTEN  .../corosync-qnetd

```

Controllare lo stato:

```bash
/opt/bin/corosync-qnetd-tool -l

```

Output atteso simile:

```text
Cluster "casa":
    Algorithm: Fifty-Fifty split (KAP Tie-breaker)
    Tie-breaker: Node with lowest node ID
    Node ID 1:
        Vote: ACK
    Node ID 2:
        Vote: No change (ACK)

```

---

## 12. Creare avvio automatico al boot del Synology

Creare lo script:

```bash
cat > /usr/local/bin/start-qnetd.sh <<'EOF'
#!/bin/sh

mkdir -p /opt

if ! mountpoint -q /opt; then
    mount -o bind /volume1/@Entware/opt /opt
fi

if ! ps | grep '[c]orosync-qnetd' >/dev/null 2>&1; then
    nohup /opt/bin/corosync-qnetd -f > /var/log/corosync-qnetd.log 2>&1 &
fi
EOF

chmod +x /usr/local/bin/start-qnetd.sh

```

Testare lo script:

```bash
pkill corosync-qnetd
/usr/local/bin/start-qnetd.sh
ps | grep '[c]orosync-qnetd'
netstat -tlnp | grep 5403

```

Poi da DSM:

```text
Pannello di controllo
→ Utilità di pianificazione
→ Crea
→ Attività attivata

```

Impostare:

```text
Utente: root
Evento: Avvio

```

Script:

```bash
/usr/local/bin/start-qnetd.sh

```

---

## 13. Verifiche finali

Su Proxmox:

```bash
pvecm status

```

Output corretto:

```text
Expected votes: 3
Total votes:    3
Quorum:         2
Flags:          Quorate Qdevice

```

Su Synology:

```bash
ps | grep '[c]orosync-qnetd'
netstat -tlnp | grep 5403
/opt/bin/corosync-qnetd-tool -l

```

---

## Errori comuni e soluzioni

### Errore: `certutil: command not found`

Errore tipico:

```text
/opt/bin/corosync-qnetd-certutil: line 143: certutil: command not found

```

Soluzione:

```bash
/opt/bin/opkg install nss-utils

```

Poi creare il wrapper:

```bash
cat > /usr/bin/certutil <<'EOF'
#!/bin/sh
exec /opt/bin/certutil "$@"
EOF

chmod +x /usr/bin/certutil

```

### Errore: `subsystem request failed on channel 0`

Errore tipico durante `scp`:

```text
subsystem request failed on channel 0
scp: Connection closed

```

Soluzione:

```bash
/opt/bin/opkg install openssh-sftp-server

```

Poi in `/etc/ssh/sshd_config`:

```text
Subsystem       sftp    /opt/lib/sftp-server

```

Riavviare SSH:

```bash
synosystemctl restart sshd

```

### Errore: QDevice configurato ma voto non attivo

Su Proxmox può apparire:

```text
Qdevice (votes 1)
Total votes: 2

```

E sul Synology:

```bash
/opt/bin/corosync-qnetd-tool -l

```

può dare:

```text
Can't connect to qnetd socket

```

Significa che `qnetd` non è avviato.

Avviarlo:

```bash
nohup /opt/bin/corosync-qnetd -f > /var/log/corosync-qnetd.log 2>&1 &

```

Poi verificare:

```bash
pvecm status

```

---

##  

## Risultato finale

La configurazione corretta lato Proxmox deve essere:

```text
Expected votes: 3
Total votes:    3
Quorum:         2
Flags:          Quorate Qdevice

```

La configurazione corretta lato Synology deve mostrare:

```bash
ps | grep '[c]orosync-qnetd'
netstat -tlnp | grep 5403
/opt/bin/corosync-qnetd-tool -l

```

Con `qnetd` attivo e i due nodi Proxmox collegati, il Synology DS1817 sta facendo correttamente da **voto esterno quorum** per Proxmox HA.