diff --git a/misc/build.func b/misc/build.func index 0dcc26b1..d7faa131 100644 --- a/misc/build.func +++ b/misc/build.func @@ -2178,39 +2178,41 @@ build_container() { AMD_DEVICES=() NVIDIA_DEVICES=() - # Check for Intel/AMD GPUs via DRI devices - if [[ -d /dev/dri ]]; then - # Intel GPU detection - if lspci | grep -iq "VGA.*Intel\|Display.*Intel"; then + # Check for Intel GPU + if lspci 2>/dev/null | grep -iq "VGA.*Intel\|Display.*Intel"; then + msg_info "Detected Intel GPU" + if [[ -d /dev/dri ]]; then for d in /dev/dri/renderD* /dev/dri/card*; do [[ -e "$d" ]] && INTEL_DEVICES+=("$d") done - [[ ${#INTEL_DEVICES[@]} -gt 0 ]] && msg_info "Detected Intel GPU" fi + fi - # AMD GPU detection - if lspci | grep -iq "VGA.*AMD\|Display.*AMD\|VGA.*ATI\|Display.*ATI"; then + # Check for AMD GPU + if lspci 2>/dev/null | grep -iq "VGA.*AMD\|Display.*AMD\|VGA.*ATI"; then + msg_info "Detected AMD GPU" + if [[ -d /dev/dri ]]; then for d in /dev/dri/renderD* /dev/dri/card*; do [[ -e "$d" ]] && AMD_DEVICES+=("$d") done - [[ ${#AMD_DEVICES[@]} -gt 0 ]] && msg_info "Detected AMD GPU" fi fi - # NVIDIA GPU detection - if lspci | grep -iq "VGA.*NVIDIA\|3D.*NVIDIA"; then - for d in /dev/nvidia*; do + # Check for NVIDIA GPU + if lspci 2>/dev/null | grep -iq "VGA.*NVIDIA\|3D.*NVIDIA"; then + msg_info "Detected NVIDIA GPU" + for d in /dev/nvidia* /dev/nvidiactl /dev/nvidia-modeset; do [[ -e "$d" ]] && NVIDIA_DEVICES+=("$d") done + if [[ ${#NVIDIA_DEVICES[@]} -eq 0 ]]; then msg_warn "NVIDIA GPU detected but no /dev/nvidia* devices found" msg_warn "Please install NVIDIA drivers on host: apt install nvidia-driver" - else - msg_info "Detected NVIDIA GPU" fi fi } + # Configure USB passthrough for privileged containers configure_usb_passthrough() { if [[ "$CT_TYPE" != "0" ]]; then @@ -2245,9 +2247,21 @@ EOF # Count available GPU types local gpu_count=0 local available_gpus=() - [[ ${#INTEL_DEVICES[@]} -gt 0 ]] && { available_gpus+=("INTEL"); ((gpu_count++)); } - [[ ${#AMD_DEVICES[@]} -gt 0 ]] && { available_gpus+=("AMD"); ((gpu_count++)); } - [[ ${#NVIDIA_DEVICES[@]} -gt 0 ]] && { available_gpus+=("NVIDIA"); ((gpu_count++)); } + + if [[ ${#INTEL_DEVICES[@]} -gt 0 ]]; then + available_gpus+=("INTEL") + gpu_count=$((gpu_count + 1)) + fi + + if [[ ${#AMD_DEVICES[@]} -gt 0 ]]; then + available_gpus+=("AMD") + gpu_count=$((gpu_count + 1)) + fi + + if [[ ${#NVIDIA_DEVICES[@]} -gt 0 ]]; then + available_gpus+=("NVIDIA") + gpu_count=$((gpu_count + 1)) + fi if [[ $gpu_count -eq 0 ]]; then msg_info "No GPU devices found for passthrough" @@ -2293,19 +2307,23 @@ EOF for dev in "${devices[@]}"; do if [[ "$CT_TYPE" == "0" ]]; then # Privileged container - local major=$(stat -c '%t' "$dev") - local minor=$(stat -c '%T' "$dev") - echo "lxc.cgroup2.devices.allow: c $((0x$major)):$((0x$minor)) rwm" >>"$LXC_CONFIG" - echo "lxc.mount.entry: $dev dev/$(basename "$dev") none bind,optional,create=file" >>"$LXC_CONFIG" + 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" + echo "lxc.mount.entry: $dev dev/$(basename "$dev") none bind,optional,create=file" >>"$LXC_CONFIG" + fi else # Unprivileged container - use generic GID, will be fixed after start echo "dev${dev_idx}: $dev,uid=0,gid=44" >>"$LXC_CONFIG" - ((dev_idx++)) + dev_idx=$((dev_idx + 1)) fi done # Mount entire /dev/dri for privileged containers - if [[ "$CT_TYPE" == "0" ]]; then + if [[ "$CT_TYPE" == "0" && -d /dev/dri ]]; then echo "lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir" >>"$LXC_CONFIG" fi @@ -2321,10 +2339,14 @@ EOF for dev in "${NVIDIA_DEVICES[@]}"; do if [[ "$CT_TYPE" == "0" ]]; then - local major=$(stat -c '%t' "$dev") - local minor=$(stat -c '%T' "$dev") - echo "lxc.cgroup2.devices.allow: c $((0x$major)):$((0x$minor)) rwm" >>"$LXC_CONFIG" - echo "lxc.mount.entry: $dev dev/$(basename "$dev") none bind,optional,create=file" >>"$LXC_CONFIG" + 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" + echo "lxc.mount.entry: $dev dev/$(basename "$dev") none bind,optional,create=file" >>"$LXC_CONFIG" + fi else msg_warn "NVIDIA passthrough on unprivileged container may not work properly" fi