69 lines
1.8 KiB
Bash
69 lines
1.8 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
# AMD GPU Helper Functions for Proxmox LXC / ROCm passthrough
|
|
# Author: CanbiZ
|
|
# License: MIT
|
|
|
|
set -euo pipefail
|
|
|
|
function exit_script() {
|
|
printf "⚠️ User exited script\n"
|
|
exit 0
|
|
}
|
|
|
|
function msg() {
|
|
local type="$1"
|
|
shift
|
|
case "$type" in
|
|
info) printf " \033[36m➤\033[0m %s\n" "$@" ;;
|
|
ok) printf " \033[32m✔\033[0m %s\n" "$@" ;;
|
|
warn) printf " \033[33m⚠\033[0m %s\n" "$@" >&2 ;;
|
|
err) printf " \033[31m✘\033[0m %s\n" "$@" >&2 ;;
|
|
esac
|
|
}
|
|
|
|
function amd_gpu_available() {
|
|
lspci | grep -qi 'VGA.*AMD' && [[ -e /dev/kfd ]]
|
|
}
|
|
|
|
function passthrough_amd_to_lxc() {
|
|
local ctid="$1"
|
|
local conf="/etc/pve/lxc/${ctid}.conf"
|
|
|
|
if ! amd_gpu_available; then
|
|
msg warn "No AMD GPU with ROCm support detected"
|
|
return 1
|
|
fi
|
|
|
|
grep -q "/dev/kfd" "$conf" 2>/dev/null && return 0
|
|
|
|
{
|
|
echo "# AMD ROCm GPU"
|
|
echo "lxc.cgroup2.devices.allow: c 226:* rwm"
|
|
echo "lxc.cgroup2.devices.allow: c 238:* rwm"
|
|
echo "lxc.mount.entry: /dev/kfd dev/kfd none bind,optional,create=file"
|
|
echo "lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir"
|
|
} >>"$conf"
|
|
|
|
msg ok "AMD ROCm passthrough applied to CT $ctid"
|
|
return 0
|
|
}
|
|
|
|
function install_amd_tools_in_ct() {
|
|
local ctid="$1"
|
|
|
|
if pct exec "$ctid" -- grep -qi alpine /etc/os-release; then
|
|
msg warn "Skipping tool installation: Alpine container detected"
|
|
return 0
|
|
fi
|
|
|
|
msg info "Installing AMD GPU tools in CT $ctid..."
|
|
pct exec "$ctid" -- bash -c "
|
|
apt-get update &&
|
|
DEBIAN_FRONTEND=noninteractive apt-get install -y rocm-smi rocm-utils &&
|
|
adduser \$(id -un 0) video &&
|
|
adduser \$(id -un 0) render" >/dev/null 2>&1 || true
|
|
|
|
msg ok "Installed ROCm tools inside CT $ctid"
|
|
}
|