Fix GPU passthrough: use dev0/dev1 format instead of lxc.mount.entry, fix GID detection, cleanup output
This commit is contained in:
parent
a7daaee5ae
commit
68aa1df1b6
109
misc/build.func
109
misc/build.func
@ -2579,20 +2579,13 @@ EOF
|
|||||||
[[ "$selected_gpu" == "INTEL" ]] && devices=("${INTEL_DEVICES[@]}")
|
[[ "$selected_gpu" == "INTEL" ]] && devices=("${INTEL_DEVICES[@]}")
|
||||||
[[ "$selected_gpu" == "AMD" ]] && devices=("${AMD_DEVICES[@]}")
|
[[ "$selected_gpu" == "AMD" ]] && devices=("${AMD_DEVICES[@]}")
|
||||||
|
|
||||||
# Add lxc.mount.entry for each device
|
# Use pct set to add devices with proper dev0/dev1 format
|
||||||
|
# GIDs will be detected and set after container starts
|
||||||
|
local dev_index=0
|
||||||
for dev in "${devices[@]}"; do
|
for dev in "${devices[@]}"; do
|
||||||
echo "lxc.mount.entry: $dev $dev none bind,optional,create=file" >>"$LXC_CONFIG"
|
# Add to config using pct set (will be visible in GUI)
|
||||||
|
echo "dev${dev_index}: ${dev},gid=44" >>"$LXC_CONFIG"
|
||||||
if [[ "$CT_TYPE" == "0" ]]; then
|
((dev_index++))
|
||||||
# Privileged container - also add cgroup allows
|
|
||||||
local major minor
|
|
||||||
major=$(stat -c '%t' "$dev" 2>/dev/null || echo "0")
|
|
||||||
minor=$(stat -c '%T' "$dev" 2>/dev/null || echo "0")
|
|
||||||
|
|
||||||
if [[ "$major" != "0" && "$minor" != "0" ]]; then
|
|
||||||
echo "lxc.cgroup2.devices.allow: c $((0x$major)):$((0x$minor)) rwm" >>"$LXC_CONFIG"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
done
|
||||||
|
|
||||||
export GPU_TYPE="$selected_gpu"
|
export GPU_TYPE="$selected_gpu"
|
||||||
@ -2605,20 +2598,11 @@ EOF
|
|||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Add lxc.mount.entry for each NVIDIA device
|
# Use pct set for NVIDIA devices
|
||||||
|
local dev_index=0
|
||||||
for dev in "${NVIDIA_DEVICES[@]}"; do
|
for dev in "${NVIDIA_DEVICES[@]}"; do
|
||||||
echo "lxc.mount.entry: $dev $dev none bind,optional,create=file" >>"$LXC_CONFIG"
|
echo "dev${dev_index}: ${dev},gid=44" >>"$LXC_CONFIG"
|
||||||
|
((dev_index++))
|
||||||
if [[ "$CT_TYPE" == "0" ]]; then
|
|
||||||
# Privileged container - also add cgroup allows
|
|
||||||
local major minor
|
|
||||||
major=$(stat -c '%t' "$dev" 2>/dev/null || echo "0")
|
|
||||||
minor=$(stat -c '%T' "$dev" 2>/dev/null || echo "0")
|
|
||||||
|
|
||||||
if [[ "$major" != "0" && "$minor" != "0" ]]; then
|
|
||||||
echo "lxc.cgroup2.devices.allow: c $((0x$major)):$((0x$minor)) rwm" >>"$LXC_CONFIG"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
done
|
||||||
|
|
||||||
export GPU_TYPE="NVIDIA"
|
export GPU_TYPE="NVIDIA"
|
||||||
@ -2939,79 +2923,40 @@ fix_gpu_gids() {
|
|||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Silent operation to avoid spinner conflicts
|
|
||||||
msg_custom "🔧" "${BL}" "Detecting and setting correct GPU group IDs"
|
msg_custom "🔧" "${BL}" "Detecting and setting correct GPU group IDs"
|
||||||
|
|
||||||
# Ermittle die tatsächlichen GIDs aus dem Container
|
# Get actual GIDs from container
|
||||||
local video_gid=$(pct exec "$CTID" -- sh -c "getent group video 2>/dev/null | cut -d: -f3")
|
local video_gid=$(pct exec "$CTID" -- sh -c "getent group video 2>/dev/null | cut -d: -f3")
|
||||||
local render_gid=$(pct exec "$CTID" -- sh -c "getent group render 2>/dev/null | cut -d: -f3")
|
local render_gid=$(pct exec "$CTID" -- sh -c "getent group render 2>/dev/null | cut -d: -f3")
|
||||||
|
|
||||||
# Fallbacks wenn Gruppen nicht existieren
|
# Create groups if they don't exist
|
||||||
if [[ -z "$video_gid" ]]; then
|
if [[ -z "$video_gid" ]]; then
|
||||||
# Versuche die video Gruppe zu erstellen
|
pct exec "$CTID" -- sh -c "groupadd -r video 2>/dev/null || true" >/dev/null 2>&1
|
||||||
pct exec "$CTID" -- sh -c "groupadd -r video 2>/dev/null || true"
|
|
||||||
video_gid=$(pct exec "$CTID" -- sh -c "getent group video 2>/dev/null | cut -d: -f3")
|
video_gid=$(pct exec "$CTID" -- sh -c "getent group video 2>/dev/null | cut -d: -f3")
|
||||||
[[ -z "$video_gid" ]] && video_gid="44" # Ultimate fallback
|
[[ -z "$video_gid" ]] && video_gid="44"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -z "$render_gid" ]]; then
|
if [[ -z "$render_gid" ]]; then
|
||||||
# Versuche die render Gruppe zu erstellen
|
pct exec "$CTID" -- sh -c "groupadd -r render 2>/dev/null || true" >/dev/null 2>&1
|
||||||
pct exec "$CTID" -- sh -c "groupadd -r render 2>/dev/null || true"
|
|
||||||
render_gid=$(pct exec "$CTID" -- sh -c "getent group render 2>/dev/null | cut -d: -f3")
|
render_gid=$(pct exec "$CTID" -- sh -c "getent group render 2>/dev/null | cut -d: -f3")
|
||||||
[[ -z "$render_gid" ]] && render_gid="104" # Ultimate fallback
|
[[ -z "$render_gid" ]] && render_gid="104"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
msg_custom "ℹ️" "${DGN}" "Container GIDs detected - video:${video_gid}, render:${render_gid}"
|
# Stop container to update config
|
||||||
|
pct stop "$CTID" >/dev/null 2>&1
|
||||||
|
sleep 1
|
||||||
|
|
||||||
# Prüfe ob die GIDs von den Defaults abweichen
|
# Update dev entries with correct GIDs
|
||||||
local need_update=0
|
sed -i.bak -E "s|(dev[0-9]+: /dev/dri/renderD[0-9]+),gid=[0-9]+|\1,gid=${render_gid}|g" "$LXC_CONFIG"
|
||||||
if [[ "$video_gid" != "44" ]] || [[ "$render_gid" != "104" ]]; then
|
sed -i -E "s|(dev[0-9]+: /dev/dri/card[0-9]+),gid=[0-9]+|\1,gid=${video_gid}|g" "$LXC_CONFIG"
|
||||||
need_update=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ $need_update -eq 1 ]]; then
|
# Restart container
|
||||||
msg_custom "🔄" "${YW}" "Updating device GIDs in container config"
|
pct start "$CTID" >/dev/null 2>&1
|
||||||
|
sleep 2
|
||||||
|
|
||||||
# Stoppe Container für Config-Update
|
msg_ok "GPU passthrough configured (video:${video_gid}, render:${render_gid})"
|
||||||
pct stop "$CTID" >/dev/null 2>&1
|
|
||||||
|
|
||||||
# Update die dev Einträge mit korrekten GIDs
|
# For privileged containers: also fix permissions inside container
|
||||||
# Backup der Config
|
|
||||||
cp "$LXC_CONFIG" "${LXC_CONFIG}.bak"
|
|
||||||
|
|
||||||
# Parse und update jeden dev Eintrag
|
|
||||||
while IFS= read -r line; do
|
|
||||||
if [[ "$line" =~ ^dev[0-9]+: ]]; then
|
|
||||||
# Extract device path
|
|
||||||
local device_path=$(echo "$line" | sed -E 's/^dev[0-9]+: ([^,]+).*/\1/')
|
|
||||||
local dev_num=$(echo "$line" | sed -E 's/^(dev[0-9]+):.*/\1/')
|
|
||||||
|
|
||||||
if [[ "$device_path" =~ renderD ]]; then
|
|
||||||
# RenderD device - use render GID
|
|
||||||
echo "${dev_num}: ${device_path},gid=${render_gid}"
|
|
||||||
elif [[ "$device_path" =~ card ]]; then
|
|
||||||
# Card device - use video GID
|
|
||||||
echo "${dev_num}: ${device_path},gid=${video_gid}"
|
|
||||||
else
|
|
||||||
# Keep original line
|
|
||||||
echo "$line"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
# Keep non-dev lines
|
|
||||||
echo "$line"
|
|
||||||
fi
|
|
||||||
done <"$LXC_CONFIG" >"${LXC_CONFIG}.new"
|
|
||||||
|
|
||||||
mv "${LXC_CONFIG}.new" "$LXC_CONFIG"
|
|
||||||
|
|
||||||
# Starte Container wieder
|
|
||||||
pct start "$CTID" >/dev/null 2>&1
|
|
||||||
sleep 3
|
|
||||||
|
|
||||||
msg_ok "Device GIDs updated successfully"
|
|
||||||
else
|
|
||||||
msg_ok "Device GIDs are already correct"
|
|
||||||
fi
|
|
||||||
if [[ "$CT_TYPE" == "0" ]]; then
|
if [[ "$CT_TYPE" == "0" ]]; then
|
||||||
pct exec "$CTID" -- bash -c "
|
pct exec "$CTID" -- bash -c "
|
||||||
if [ -d /dev/dri ]; then
|
if [ -d /dev/dri ]; then
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user