Dnes si pripojíme k nášmu NextcloudHub subvol zo ZFS poolu, ktorý sme si nachystali pri inštalácii ZFS. V privilegovanom LXC stačil klasický bind mount a aby všetko fungovalo, tak bola potrebná aj zmena vlastníka namountovaného subvolu. V neprivilegovanom LXC to funguje podobne, ale nevyhneme sa mapovaniu UID/GID (neskôr vysvetlím).
Hneď na začiatku sa musím priznať, že pri testovaní som sa dostal do problémov, pretože som obsah subvolu, ktorý bol mountnutý do starého Nextcloud kompletne zmazal. Samozrejme som o žiadne dáta neprišiel, pretože data som mal synchronizované na desktopovom disku. Tento disk už asi rok nepoužívam, takže ho stačí pripojiť do siete a súbory nahrať znova na subvol zpoolu. Pre istotu starý subvol zmažeme a vytvoríme si nový, pokojne môže mať rovnaký názov aj pridelenú kvótu. Kto nevie ako vytvoriť zpool, príp. subvol nech si prečíta tento blog. Na hostitieľskom stroji vyzeral pôvodný subvol takto:
/datapool/nextcloud
Takže najprv odpojíme subvol zo starého Nextcloudu tak, že vymažeme z konfiguračného súboru daného LXC ( <id-lxc> nahradíme číslom nášho kontajnera) riadok, kde je spravený mount. To vykonáme na hostiteľovi (Proxmox). Po zmene konfigurácie je vyžadovaný reboot LXC.
nano /etc/pve/lxc/<id-lxc>.conf
mp0: /datapool/nextcloud,mp=/mnt/sdb/nextcloud
Ako som uviedol vyššie, tak celý zpool vrátane subvolu môžeme zmazať. Na to nám poslúži jednoduchý príkaz. Ale je dôležité aby sme presne vedeli čo ideme robiť, pretože príkaz bez akéhokoľvek upozornenia zpool jednoducho odstráni vrátane dát. Ešte predtým skontrolujeme ako to na hostiteľskom systéme vyzerá
zfs list
NAME USED AVAIL REFER MOUNTPOINT
datapool 497M 899G 96K /datapool
datapool/nextcloud 495M 200G 495M /datapool/nextcloud
rpool 35.6G 193G 96K /rpool
rpool/ROOT 24.7G 193G 96K /rpool/ROOT
rpool/ROOT/pve-1 24.7G 193G 24.7G /
rpool/data 10.9G 193G 128K /rpool/data
...
V treťom riadku vidíme náš zpool. Teraz zpool môžeme zmazať.
zpool destroy datapool
Tento príkaz nám nedá žiadny výstup, ale keď použijeme znova príkaz zfs list
tak uvidíme, že zpool je naozaj odstránený.
Pred vytvorením zpoolu si zobrazíme diskové zariadenia podľa ID. Pre nás je zaujímavý riadok 10, disk „sdc“.
ls -l /dev/disk/by-id
lrwxrwxrwx 1 root root 9 Jun 28 13:11 ata-Patriot_P200_256GB_AA000000000000000025 -> ../../sdb
lrwxrwxrwx 1 root root 10 Jun 28 13:11 ata-Patriot_P200_256GB_AA000000000000000025-part1 -> ../../sdb1
lrwxrwxrwx 1 root root 10 Jun 28 13:11 ata-Patriot_P200_256GB_AA000000000000000025-part2 -> ../../sdb2
lrwxrwxrwx 1 root root 10 Jun 28 13:11 ata-Patriot_P200_256GB_AA000000000000000025-part3 -> ../../sdb3
lrwxrwxrwx 1 root root 9 Jun 28 13:11 ata-Patriot_P200_256GB_AA000000000000000978 -> ../../sda
lrwxrwxrwx 1 root root 10 Jun 28 13:11 ata-Patriot_P200_256GB_AA000000000000000978-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Jun 28 13:11 ata-Patriot_P200_256GB_AA000000000000000978-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 Jun 28 13:11 ata-Patriot_P200_256GB_AA000000000000000978-part3 -> ../../sda3
lrwxrwxrwx 1 root root 12 Jun 28 13:11 lvm-pv-uuid-PsS2aq-dT3d-NP8t-Guiu-y0n0-TVva-EGjWJ1 -> ../../zd32p5
lrwxrwxrwx 1 root root 9 Jul 5 16:30 usb-WDC_WDS_100T2B0A-00SM50_98765432100C-0:0 -> ../../sdc
lrwxrwxrwx 1 root root 10 Jul 5 16:30 usb-WDC_WDS_100T2B0A-00SM50_98765432100C-0:0-part1 -> ../../sdc1
lrwxrwxrwx 1 root root 10 Jul 5 16:30 usb-WDC_WDS_100T2B0A-00SM50_98765432100C-0:0-part9 -> ../../sdc9
Teraz môžeme vytvoriť nový zpool, subvol a pridelíme mu kvótu 200 GB. Posledný príkaz by nám mal zobraziť vytvorený zpool vrátane subvolu a jeho veľkosť (viď riadok 3).
zpool create datapool usb-WDC_WDS_100T2B0A-00SM50_98765432100C-0:0
zfs create datapool/nextcloud
zfs set quota=200G datapool/nextcloud
zfs list
NAME USED AVAIL REFER MOUNTPOINT
datapool 576K 899G 96K /datapool
datapool/nextcloud 96K 200G 96K /datapool/nextcloud
rpool 34.6G 194G 96K /rpool
rpool/ROOT 24.7G 194G 96K /rpool/ROOT
rpool/ROOT/pve-1 24.7G 194G 24.7G /
rpool/data 9.94G 194G 128K /rpool/data
Príkazom ls zistíme, že pripojený datapool ma práva 755 a vlastníkom je root
ls -la /datapool
total 10
drwxr-xr-x 3 root root 3 Jul 10 09:09 .
drwxr-xr-x 19 root root 25 Jul 10 09:08 ..
drwxr-xr-x 2 root root 2 Jul 10 09:09 nextcloud
Teraz môžeme spraviť mout do nového neprivilegovaného LXC a tak isto po zmene konfigurácie spravíme reboot LXC
pct set <id-lxc> -mp0 /datapool/nextcloud,mp=/var/www/nextcloud-data
Ak sa pozrieme cez webové rozhranie Proxmoxu do kontajnera, tak v sekcii resources by sme mali vidieť, že mount prebehol úspešne (to je ten riadok s Mount Point (mp0)).

Ak sa však cez terminál pozrieme do kontajnera a vypíšeme si zoznam súborov, zistíme, že náš adresár pre dáta má užívateľa a skupinu nobody nogroup
$ ls -la /var/www
total 18
drwxr-xr-x 4 root root 4 Jul 1 10:18 .
drwxr-xr-x 12 root root 14 Jun 7 14:26 ..
drwxr-xr-x 4 root root 5 Jun 7 15:23 html
drwxrwx--- 2 nobody nogroup 2 Jul 1 08:42 nextcloud-data
To je spôsobené tým, že v neprivilegovanom LXC, užívateľ s UID 0 (root) vnútri LXC je na hostiteľovi mapovaný s UID 100000. Užívateľ s UID 33 je na hostiteľovi mapovaný na 100033 atď. Všetky UID, ktorých je 2^16 čiže 0-65535 sú mapované na hostiteľovi 100000-165535. Zatiaľ čo v privilegovanom LXC bol užívateľ s UID 33 aj na hostiteľovi 33 a nebolo potrebné, žiadne mapovanie. Teraz je však v LXC užívateľ s UID 33 na hostiteľovi viditeľný ako užívateľ s UID 100033. Prečo práve spomínam UID 33? No preto, lebo keď si zistíme aký UID používa užívateľ www-data, tak zistíme, že je to 33.
id -u www-data
id -g www-data
To znamená, že identifikátor užívateľa a skupiny musíme pomocou idmap premapovať. Premapovanie znova vykonáme na hostiteľovi pre konkrétny kontajner.
nano /etc/pve/lxc/<id-lxc>.conf
Na koniec konfiguračného súboru pridáme tieto riadky.
lxc.idmap: u 0 100000 33
lxc.idmap: g 0 100000 33
lxc.idmap: u 33 33 1
lxc.idmap: g 33 33 1
lxc.idmap: u 34 100034 65502
lxc.idmap: g 34 100034 65502
Tak isto musme upraviť aj konfiguráky /etc/subuid a /etc/subgid
nano /etc/subuid
nano /etc/subgid
kde dopíšeme
root:33:1
Po zmenách v konfigurácii znova kontajner rebootujeme. Ak sme všetko spravili a na nič sme nezabudli, tak po reboote zistíme, že všetko čo v LXC vlastnil užívateľ www-data je pod užívateľom nobody a skupinou nogroup. Tym pádom nemá k týmto adresárom a súborom nikto prístup a prakticky nám nefunguje celý web (dokonca ani phpmyadmin).
ls -la /var/www/html
total 35
drwxr-xr-x 4 root root 5 Jun 7 15:23 .
drwxr-xr-x 4 root root 4 Jun 7 15:51 ..
-rw-r--r-- 1 root root 10701 Jun 7 14:26 index.html
drwxr-xr-x 13 nobody nogroup 31 Jun 7 15:02 phpmyadmin
drwxr-xr-x 14 nobody nogroup 28 Jun 7 19:28 www.nextcloud.ddns.info
To znamená, že z hostíteľa (Proxmox) musíme rekurzívne zmeniť vlastníka a skupinu pre tie adresáre, ktoré potrebujeme. Z kontajnera to z pochopiteľných dôvodov nemôžeme spraviť, lebo kontajner je neprivilegovaný.
chown 33:33 -R /rpool/data/subvol-108-disk-0/var/www/
chown 33:33 -R /datapool/nextcloud/
Teraz sa môžeme pozrieť priamo v kontajnery, že adresáre a súbory už vlastní užívateľ www-data, čo je super.
ls -la /var/www/html
total 35
drwxr-xr-x 4 www-data www-data 5 Jun 7 15:23 .
drwxr-xr-x 4 www-data www-data 5 Jul 20 20:17 ..
-rw-r--r-- 1 www-data www-data 10701 Jun 7 14:26 index.html
drwxr-xr-x 13 www-data www-data 31 Jun 7 15:02 phpmyadmin
drwxr-xr-x 14 www-data www-data 28 Jul 20 19:35 www.nextcloud.ddns.info
ls -la /var/www
total 18
drwxr-xr-x 4 www-data www-data 4 Jun 7 15:51 .
drwxr-xr-x 12 root root 14 Jun 7 14:26 ..
drwxr-xr-x 4 www-data www-data 5 Jun 7 15:23 html
drwxr-xr-x 2 www-data www-data 2 Jul 20 18:37 nextcloud-data
Ale je tu ďalší problém, ktorý si neviem vysvetliť a NextcloudHub stále nefunguje. Ak prejdem na web NextclouHub, tak vidím len hlášku:
Chyba
Priečinok s dátami je neplatný
Uistite sa, že v koreňovom adresári sa nachádza súbor s názvom ".ocdata".
Keď si nechám zobraziť obsah koreňového adresára, tak vidím prázdny adresár, resp. nachádza sa tam jeden prázdny log súbor:
sudo ls -la /var/www/nextcloud-data
total 2
drwxrwx--- 2 www-data www-data 3 Jul 20 19:09 .
drwxr-xr-x 4 www-data www-data 4 Jun 7 15:51 ..
-rw-r--r-- 1 www-data www-data 0 Jul 20 19:09 nextcloud.log
Ak sa však pozrem do adresára z hostiteľa, tak je všetko v poriadku.
ls -la /rpool/data/subvol-108-disk-0/var/www/nextcloud-data
total 28
drwxrwx--- 4 www-data www-data 8 Jun 7 15:55 .
drwxr-xr-x 4 www-data www-data 4 Jun 7 15:51 ..
drwxr-xr-x 9 www-data www-data 9 Jun 7 19:28 appdata_oc65vcb3bp4d
-rw-r--r-- 1 www-data www-data 542 Jun 7 15:54 .htaccess
-rw-r--r-- 1 www-data www-data 0 Jun 7 15:54 index.html
drwxr-xr-x 4 www-data www-data 4 Jun 7 19:27 nextcloud
-rw-r----- 1 www-data www-data 391 Jun 7 17:30 nextcloud.log
-rw-r--r-- 1 www-data www-data 0 Jun 7 15:54 .ocdata
Ak sa v kontajnery prihlásim ako root a chcem spravíť zápis do koreňového adresára z dátami, tak všetko funguje a dáta je vidieť aj na subvole datapoolu. Z toho vyplýva, že mount je v poriadku, ale stále si neviem vysvetliť, prečo v LXC, nie je vidieť žiadne dáta a tým pádom NextcloudHub nedokáže načítať konfiguráciu a nič nefunguje. Zisťoval som, prečo je to tak, ale nič som nezistil. Ani na odborných diskusiách mi nikto neporadil. Spravil som teda ešte jeden pokus a podarilo sa mi to rozbehnúť, ale aj tak v tom nemám celkom jasno. Postupoval som takto:
- Zastavujem kontajner
- V konfiguračnom súbore, Mením bod pripojenia
- Štartujem kontajner
pct stop 108
nano /etc/pve/lxc/108.conf
mp0: /datapool/nextcloud,mp=/var/www/nextcloudata
pct start 108
V prehliadači prejdem na web a zisťujem, že už je možné prihlásiť sa na web. Zdá sa, že na webe je všetko v poriadku. Vnútri kontajnera zisťujem, že sa vytvoril nový adresár pre dáta podľa mountpoint
ls -la /var/www/
total 31
drwxr-xr-x 5 www-data www-data 6 Jul 20 19:36 .
drwxr-xr-x 12 root root 14 Jun 7 14:26 ..
-rw------- 1 www-data www-data 1024 Jul 20 19:36 .rnd
drwxr-xr-x 4 www-data www-data 5 Jun 7 15:23 html
drwxrwx--- 4 www-data www-data 8 Jun 7 15:55 nextcloud-data
drwxrwx--- 2 www-data www-data 3 Jul 20 19:19 nextcloudata
V pôvodnom adresáre vnútri kontajnera vidím celý obsah
sudo ls -la /var/www/nextcloud-data
total 28
drwxrwx--- 4 www-data www-data 8 Jun 7 15:55 .
drwxr-xr-x 5 www-data www-data 6 Jul 20 19:36 ..
-rw-r--r-- 1 www-data www-data 542 Jun 7 15:54 .htaccess
-rw-r--r-- 1 www-data www-data 0 Jun 7 15:54 .ocdata
drwxr-xr-x 10 www-data www-data 10 Jul 20 19:36 appdata_oc65vcb3bp4d
-rw-r--r-- 1 www-data www-data 0 Jun 7 15:54 index.html
drwxr-xr-x 4 www-data www-data 4 Jun 7 19:27 nextcloud
-rw-r----- 1 www-data www-data 391 Jun 7 17:30 nextcloud.log
Teraz presunieme dáta zo starého adresára do nového a starý adresár odstránime. Toto môžeme spraviť vnútri kontajnera s privilégiami roota napr. cez sudo mc
. Potom nesmieme zabudnúť zmeniť v konfiguračnom súbore NextcloudHub cestu k adresáru s dátami
sudo nano /var/www/html/www.nextcloud.ddns.info/config/config.php
a upravíme na
'datadirectory' => '/var/www/nextcloudata',
Záver
Aj keď nie vždy všetko funguje na prvý krát a s týmto problémom som sa trápil niekoľko dní, ale výsledok sa dostavil a NextcloudHub funguje. Zo záložného disku musím ešte presunúť na subvol dáta a NextcloudHub môžeme začať plnohodnotne využívať. Ak bude niekto tento článok čítať a bude mať znalosti ohľadom mapovania UID/GID v neprivilegovaných LXC, tak môže pridať komentár pod článkom. Zaujíma ma hlavne to, prečo sa v namountovanom adresári LXC nezobrazovali žiadne súbory aj keď bol vlastníkom užívateľ www-data.