Jak zpřístupnit v PROXMOX uživateli vytvářet virtuální PC na k tomu vyhrazenému disku, aby se nedostal nikam mimo něj?
ChatGPT řekl:
Rozumím – chceš dát uživateli možnost vytvářet a spravovat virtuální stroje na konkrétním datovém disku v Proxmoxu, ale bez přístupu k celé hostitelské infrastruktuře. Můžeme to vyřešit kombinací rolí, oprávnění a přidělení storage. Postup by mohl vypadat následovně:
1️⃣ Vytvoření dedikovaného storage pro uživatele
-
Předpokládejme, že máš disk
/dev/sdX
nebo storage v Proxmoxu (např.local-vm-user
). -
Přidej ho do Proxmoxu → Datacenter → Storage → Add → Directory / LVM / ZFS.
-
Dej mu jméno (např.
userdisk
) a nastav typ naDisk image
neboISO/images
. -
Důležité: zaškrtni jen ty VM typy, které chceš povolit (např.
VZDump backup
,ISO images
,Disk image
). NezapojujContainer templates
, pokud nechceš full root přístup.
2️⃣ Vytvoření uživatele s omezenou rolí
-
Datacenter → Permissions → Users → Add
-
Přidej uživatele (např.
vmuser@pve
), nastav password. -
Role: Vytvoříme nebo použijeme omezenou roli typu VM Creator.
Příklad role „VM Creator“:
-
Permissions:
-
VM.Audit
→ prohlížení stavu VM -
VM.Backup
→ zálohy (pokud je potřeba) -
VM.Config.Disk
→ správa disků -
VM.Config.CDROM
→ ISO -
VM.Config.HWType
→ změna HW -
VM.Console
→ přístup ke konzoli -
ne dávej
VM.PowerMgmt
pokud nechceš zapnutí/vypnutí? – ale obvykle je potřeba.
-
-
Nedávej
Sys.Modify
aniDatastore.Modify
– zabrání přístupu k ostatním storage.
3️⃣ Přidělení oprávnění k storage
-
Datacenter → Permissions → Add → Path = storage
userdisk
-
Role: „VM Creator“ (nebo custom)
-
Target: jen tento storage.
-
Tím zajistíš, že uživatel bude moct vytvářet VM jen na tomto disku.
4️⃣ Omezení přístupu k hostiteli
-
Nepřidávej uživatele do
root
aniadmin
skupin. -
Nedávej mu SSH přístup k hostiteli, nebo pokud ano, jen omezený
chroot
do svého adresáře. -
Pokud používáš Proxmox GUI → uživatel uvidí jen datacentrum a storage, na které má oprávnění.
5️⃣ Test
-
Přihlas se novým uživatelem.
-
Zkontroluj, zda:
-
Může vytvořit VM jen na přiděleném storage.
-
Nemůže vidět ostatní VM ani storage.
-
Nemůže provádět operace nad jinými disky.
-
Pokud chceš, můžu ti připravit přesný seznam rolí a oprávnění v Proxmox GUI krok za krokem pro tento scénář, který funguje bez root přístupu a jen na dedikovaný disk.
Chceš, abych to připravil?
Řekl/a jsi:
Jak nastavím omezený chroot?
ChatGPT řekl:
Chroot v Linuxu je způsob, jak omezenému uživateli poskytnout přístup jen do jednoho vyhrazeného adresáře, kde uvidí jen „virtuální kořenový“ systém. Je to užitečné, pokud chceš uživateli dát SSH přístup, ale nechceš, aby mohl procházet hostitelský systém, měnit konfigurace Proxmoxu nebo vidět jiné VM.
V Proxmoxu to můžeš udělat přes chroot
nebo modernější chroot jail
přes systemd
nebo rssh
.
Níže ti ukážu standardní postup s klasickým chrootem, který funguje spolehlivě a je relativně jednoduchý.
1️⃣ Vytvoř základní adresář pro chroot
Například /srv/chroot/vmuser
:
mkdir -p /srv/chroot/vmuser
Doporučuji umístit ho na oddělený disk nebo oddíl, který uživatel bude spravovat.
Pokud už máš v Proxmoxu dedikovaný disk userdisk
, můžeš složku vytvořit rovnou tam, např. /mnt/userdisk/chroot
.
2️⃣ Vytvoř omezeného uživatele
Vytvoříme nového uživatele, například vmuser
:
adduser --home /srv/chroot/vmuser/home/vmuser --shell /bin/bash vmuser
-
Home adresář: musí být uvnitř chrootu, jinak se z něj uživatel dostane ven.
-
Heslo nastav pomocí:
passwd vmuser
3️⃣ Připrav základní strukturu uvnitř chrootu
Uvnitř chrootu je potřeba mít základní adresáře, jinak nebude fungovat ani základní shell.
mkdir -p /srv/chroot/vmuser/{bin,lib,lib64,usr,home,var,etc,tmp,dev,proc}
mkdir -p /srv/chroot/vmuser/home/vmuser
chown -R vmuser:vmuser /srv/chroot/vmuser/home/vmuser
chmod 700 /srv/chroot/vmuser/home/vmuser
4️⃣ Zkopíruj potřebné binárky a knihovny
Pokud chceš, aby měl uživatel k dispozici základní nástroje (bash
, ls
, scp
, rsync
), musíš je zkopírovat dovnitř chrootu.
Nejprve najdi, kde se nachází binárka, např.:
which bash
Typicky to bude /bin/bash
.
Zkopíruj ji:
cp /bin/bash /srv/chroot/vmuser/bin/
Pak zjisti, jaké knihovny potřebuje:
ldd /bin/bash
Výstup bude něco jako:
linux-vdso.so.1 (0x00007ffc18bde000)
libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f1a2d5f0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1a2d200000)
/lib64/ld-linux-x86-64.so.2 (0x00007f1a2d800000)
Teď tyto knihovny zkopíruj do chrootu:
cp /lib/x86_64-linux-gnu/libtinfo.so.6 /srv/chroot/vmuser/lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libc.so.6 /srv/chroot/vmuser/lib/x86_64-linux-gnu/
cp /lib64/ld-linux-x86-64.so.2 /srv/chroot/vmuser/lib64/
Pro každý další příkaz (ls
, scp
, rsync
) zopakuj tento postup.
⚡ Tip:
Pokud potřebuješ víc nástrojů, můžeš si pomoci balíkem debootstrap
, který ti vytvoří minimalní linuxové prostředí uvnitř chrootu:
apt-get install debootstrap
debootstrap --variant=minbase bookworm /srv/chroot/vmuser http://deb.debian.org/debian/
Tím získáš kompletní malou sadu nástrojů.
5️⃣ Nastav chroot v SSH (omezený přístup)
Edituj konfigurační soubor SSH:
nano /etc/ssh/sshd_config
Přidej na konec:
Match User vmuser
ChrootDirectory /srv/chroot/vmuser
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
Pokud chceš povolit plnohodnotný shell, vynech ForceCommand internal-sftp
.
Potom restartuj SSH:
systemctl restart sshd
6️⃣ Ověření chrootu
Přihlas se jako vmuser
:
ssh vmuser@server-ip
Očekávané chování:
-
Kořenový adresář
/
je/srv/chroot/vmuser
(uvidíš jen to, co je uvnitř). -
Příkaz
cd /
tě nevyvede ven. -
Pokus o
cd ..
tě nezavede do skutečného/
hostitele.
Zkontroluj, že funguje základní sada příkazů (ls
, pwd
, scp
).
7️⃣ Přidání jen storage pro VM
Pokud chceš, aby tento uživatel měl přístup jen k jednomu konkrétnímu storage, můžeš připojit storage do chrootu jako mount:
mount --bind /mnt/userdisk/vmstorage /srv/chroot/vmuser/vmstorage
Pokud chceš, aby to bylo trvalé i po restartu, přidej do /etc/fstab
:
/mnt/userdisk/vmstorage /srv/chroot/vmuser/vmstorage none bind 0 0
8️⃣ Bezpečnostní doporučení
-
Nepřiděluj uživateli
sudo
. -
Pokud potřebuješ, aby mohl spouštět jen konkrétní příkazy, použij místo klasického shellu
rbash
(restricted bash). -
Udržuj minimální počet knihoven a nástrojů uvnitř chrootu.
-
Vždy nastav
chmod 700
na citlivé adresáře, které nechceš sdílet.
Chceš, abych ti připravil konkrétní skript, který vytvoří celý chroot automaticky? Mohlo by to ušetřit spoustu manuální práce.
Lze omezit uživateli celkový počet jader?
ChatGPT řekl:
Ano, v Linuxu i v Proxmoxu lze uživateli omezit, kolik CPU jader může jeho virtuální stroj využívat, a to na několika úrovních.
Je důležité rozlišit, jestli chceš:
-
Omezit konkrétní VM – např. max. 2 jádra pro daný virtuální stroj.
-
Omezit konkrétního uživatele, aby celkově (v součtu všech jeho VM) nemohl překročit určitý počet jader.
Proxmox standardně hlídá jen nastavení jednotlivých VM, ale lze to obejít i pro globální limity uživatele pomocí cgroups nebo quotas.
1️⃣ Omezení počtu jader na úrovni konkrétní VM
To je nejjednodušší a přímo podporované v Proxmox GUI.
-
Otevři VM → Hardware → Processor (CPU).
-
Nastav Cores na počet jader, které smí tato VM využít (např. 2).
-
Volitelně nastav Sockets, pokud chceš simulovat více CPU socketů.
-
V záložce Resources můžeš nastavit ještě:
-
CPU Limit (v % jednoho jádra, např. 50 = max půl jádra)
-
CPU Units (priorita, výchozí 1024 – vyšší hodnota = vyšší priorita při sdílení CPU).
-
⚠️ Proxmox sám o sobě ale nebrání uživateli vytvořit více VM, z nichž každé má 2 jádra → tím může obejít omezení.
Pokud potřebuješ globální limit na uživatele, pokračuj dál.
2️⃣ Omezení celkového počtu jader pro uživatele (v součtu všech jeho VM)
To už vyžaduje zásah do Linuxu pomocí cgroups (control groups).
Proxmox běží nad Debianem, takže to jde nastavit standardními nástroji.
a) Zjisti cgroup pro uživatele
Každá běžící VM má svůj proces kvm
, který běží pod root
, ale Proxmox je organizuje do /sys/fs/cgroup/
.
Zkontroluj, kam Proxmox ukládá procesy VM:
systemd-cgls
Najdeš něco jako:
/machine.slice
└─qemu-100.scope
└─qemu-101.scope
Každá VM má vlastní scope (např. qemu-100.scope
).
b) Vytvoř cgroup pro konkrétního uživatele
Cílem je, aby všechny VM, které tento uživatel vytvoří, běžely uvnitř jedné skupiny s limitem.
-
Vytvoř cgroup:
mkdir -p /sys/fs/cgroup/cpu/vmuser_limit
-
Nastav maximální CPU čas, např. pro 2 jádra:
echo 200000 > /sys/fs/cgroup/cpu/vmuser_limit/cpu.cfs_quota_us
echo 100000 > /sys/fs/cgroup/cpu/vmuser_limit/cpu.cfs_period_us
-
cpu.cfs_period_us
= referenční perioda (obvykle 100000 µs = 100 ms). -
cpu.cfs_quota_us
= kolik času smí procesy v cgroup dostat. -
Hodnota
200000
znamená 2 jádra.
-
c) Přidávání VM procesů do cgroup
Jakmile uživatel spustí VM, zjisti PID procesu kvm
:
ps aux | grep qemu | grep 100
Poté přidej PID do cgroup:
echo PID > /sys/fs/cgroup/cpu/vmuser_limit/tasks
⚡ Automatizace:
Proxmox podporuje hook skripty (/etc/pve/local/hookscripts/
), které se spouští při startu/stopu VM.
Do hook skriptu můžeš přidat příkaz, který automaticky přesune proces do správné cgroup podle vlastníka.
3️⃣ Omezení přímo v Proxmoxu pro GUI uživatele
Pokud chceš, aby uživatel přes webové rozhraní vůbec nemohl nastavit víc než určitý počet jader, můžeš mu dát roli, která mu nedovolí měnit CPU konfiguraci.
Postup:
-
V Datacenter → Permissions → Roles vytvoř novou roli, např.
VM-Limited
. -
Povolené práva:
-
VM.Audit
-
VM.Console
-
VM.PowerMgmt
-
(volitelně)
VM.Backup
,VM.Snapshot
.
-
-
Nepovoluj
VM.Config.CPU
→ tím nebude moct měnit počet jader.
Pak můžeš sám jako admin přednastavit max. 2 jádra pro všechny jeho VM.
4️⃣ Elegantní řešení přes Proxmox vzdáleného API
Pokud máš více uživatelů, doporučuji použít Proxmox API a napojit to na vlastní provisioning skript.
Ten při vytvoření VM automaticky:
-
nastaví max. CPU cores,
-
případně ověří, kolik jader už má uživatel obsazených,
-
odmítne vytvoření nové VM, pokud by překročil limit.
Tím se vyhneš složitému ručnímu hlídání přes cgroups.
Shrnutí
Metoda | Výhoda | Nevýhoda |
---|---|---|
Nastavení Cores pro každou VM |
Jednoduché, přímo v Proxmox GUI | Uživatel může obejít vytvořením více VM |
cgroups limit pro uživatele |
Omezuje součet všech jader napříč VM | Nutná konfigurace a hook skripty |
Odebrání práva VM.Config.CPU |
Uživatel nemůže měnit CPU nastavení | Admin musí ručně nastavovat |
API provisioning | Automatizace a škálovatelnost | Vyšší složitost |
Chceš, abych ti připravil přímo hook skript, který při startu VM automaticky přidá její proces do cgroup s limitem jader? To by celý proces zautomatizovalo.