Proxmox LXCs automatisches ausführen von Befehlen nach Reboot

Azghul0815

Captain
Registriert
Dez. 2019
Beiträge
3.510
Hallo zusammen,

ich habe 1 Frage zu meinem Proxmox 8.
Aktuell nutze ich 2 kleine Workarounds, die funktionieren bis zum Reboot des Nodes, bzw. bis zum Update:
HW ist ein Intel Nuc12 mit 1240p und 1 GB RAM

Problem 1:
Jellyfin durchreichen der iGPU.
Nach einem Neustart habe ich beim eingeben von:
Code:
ls -l /dev/dri
folgendes Bild:
1697015934575.png

Problem ist das (verzeiht das möglicherweise falsche Wording) der User oder die Gruppe "ssl-cert 226" dem device "renderD128" zugewiesen ist. Das ist ein "Problem" von Proxmox 8 (mit 7 gings ohne Probleme)
Mit dem Code
Code:
chgrp render /dev/dri/renderD128
kann ich die Gruppe ändern zu:
1697016188074.png

und alles ist wieder gut.

Frage: Kann ich diesen Befehl irgendwie in einen Autostart einbinden oder habt ihr eine alternative/bessere Lösung?

Grüsse und Danke.
 
probier mal mit Crontab zu lösen

crontab -e
Code:
@reboot chgrp render /dev/dri/renderD128
 
  • Gefällt mir
Reaktionen: KenshiHH
tifa schrieb:
probier mal mit Crontab zu lösen

crontab -e
Code:
@reboot chgrp render /dev/dri/renderD128
Bitte den kompletten Pfad zu chgrp angeben (which chgrp). Bei Cron ist das sehr empfehlenswert, da PATH oftmals noch nicht bekannt ist
 
tifa schrieb:
probier mal mit Crontab zu lösen

crontab -e
Code:
@reboot chgrp render /dev/dri/renderD128
Versuche ich und Danke. Hab den Crontab total vergessen...hätte ich auch selber drauf kommen können.
@Salamimander
Erwischt mich auf dem falschen Fuss. Ich dachte sowas wie chgrp ist ein allg. gültiges Command. Kannst du mir auf die Sprünge helfen, wie ich den Pfad rausfinde?

@CoMo
Hier der Inhalt der default.rules:
Code:
# do not edit this file, it will be overwritten on update

# run a command on remove events
ACTION=="remove", ENV{REMOVE_CMD}!="", RUN+="$env{REMOVE_CMD}"
ACTION=="remove", GOTO="default_end"

# The md driver increments diskseq *after* emitting 'change' uevent.
# Drop the line below if it is fixed on the kernel side.
SUBSYSTEM=="block", KERNEL=="md*", ENV{ID_IGNORE_DISKSEQ}="1"

SUBSYSTEM=="virtio-ports", KERNEL=="vport*", ATTR{name}=="?*", SYMLINK+="virtio-ports/$attr{name}"

# select "system RTC" or just use the first one
SUBSYSTEM=="rtc", ATTR{hctosys}=="1", SYMLINK+="rtc"
SUBSYSTEM=="rtc", KERNEL=="rtc0", SYMLINK+="rtc", OPTIONS+="link_priority=-100"

SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", IMPORT{builtin}="usb_id", IMPORT{builtin}="hwdb --subsystem=usb"
ENV{MODALIAS}!="", IMPORT{builtin}="hwdb --subsystem=$env{SUBSYSTEM}"

ACTION!="add", GOTO="default_end"

SUBSYSTEM=="tty", KERNEL=="ptmx", GROUP="tty", MODE="0666"
SUBSYSTEM=="tty", KERNEL=="tty", GROUP="tty", MODE="0666"
SUBSYSTEM=="tty", KERNEL=="tty[0-9]*", GROUP="tty", MODE="0620"
SUBSYSTEM=="tty", KERNEL=="sclp_line[0-9]*", GROUP="tty", MODE="0620"
SUBSYSTEM=="tty", KERNEL=="ttysclp[0-9]*", GROUP="tty", MODE="0620"
SUBSYSTEM=="tty", KERNEL=="3270/tty[0-9]*", GROUP="tty", MODE="0620"
SUBSYSTEM=="vc", KERNEL=="vcs*|vcsa*", GROUP="tty"
KERNEL=="tty[A-Z]*[0-9]|ttymxc[0-9]*|pppox[0-9]*|ircomm[0-9]*|noz[0-9]*|rfcomm[0-9]*", GROUP="dialout"

SUBSYSTEM=="mem", KERNEL=="mem|kmem|port", GROUP="kmem", MODE="0640"

SUBSYSTEM=="input", GROUP="input"
SUBSYSTEM=="input", KERNEL=="js[0-9]*", MODE="0664"

SUBSYSTEM=="video4linux", GROUP="video"
SUBSYSTEM=="graphics", GROUP="video"
SUBSYSTEM=="drm", KERNEL!="renderD*", GROUP="video"
SUBSYSTEM=="dvb", GROUP="video"
SUBSYSTEM=="media", GROUP="video"
SUBSYSTEM=="drm", KERNEL=="renderD*", GROUP="render", MODE="0660"
SUBSYSTEM=="kfd", GROUP="render", MODE="0660"

SUBSYSTEM=="misc", KERNEL=="sgx_enclave", GROUP="sgx", MODE="0660"
SUBSYSTEM=="misc", KERNEL=="sgx_vepc", GROUP="sgx", MODE="0660"

# When using static_node= with non-default permissions, also update
# tmpfiles.d/static-nodes-permissions.conf.in to keep permissions synchronized.

SUBSYSTEM=="sound", GROUP="audio", \
  OPTIONS+="static_node=snd/seq", OPTIONS+="static_node=snd/timer"

SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0664"

SUBSYSTEM=="firewire", TEST=="units", TEST=="model", \
  IMPORT{builtin}="hwdb 'ieee1394:node:ven$attr{vendor}mo$attr{model}units$attr{units}'"

SUBSYSTEM=="firewire", TEST=="units", TEST!="model", \
  IMPORT{builtin}="hwdb 'ieee1394:node:ven$attr{vendor}units$attr{units}'"

SUBSYSTEM=="firewire", TEST=="units", ENV{IEEE1394_UNIT_FUNCTION_MIDI}=="1", GROUP="audio"
SUBSYSTEM=="firewire", TEST=="units", ENV{IEEE1394_UNIT_FUNCTION_AUDIO}=="1", GROUP="audio"
SUBSYSTEM=="firewire", TEST=="units", ENV{IEEE1394_UNIT_FUNCTION_VIDEO}=="1", GROUP="video"

KERNEL=="parport[0-9]*", GROUP="lp"
SUBSYSTEM=="printer", KERNEL=="lp*", GROUP="lp"
SUBSYSTEM=="ppdev", GROUP="lp"
KERNEL=="lp[0-9]*", GROUP="lp"
KERNEL=="irlpt[0-9]*", GROUP="lp"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ENV{ID_USB_INTERFACES}=="*:0701??:*", GROUP="lp"

SUBSYSTEM=="block", GROUP="disk"
SUBSYSTEM=="block", KERNEL=="sr[0-9]*", GROUP="cdrom"
SUBSYSTEM=="scsi_generic", SUBSYSTEMS=="scsi", ATTRS{type}=="4|5", GROUP="cdrom"
KERNEL=="sch[0-9]*", GROUP="cdrom"
KERNEL=="pktcdvd[0-9]*", GROUP="cdrom"
KERNEL=="pktcdvd", GROUP="cdrom"

SUBSYSTEM=="scsi_generic|scsi_tape", SUBSYSTEMS=="scsi", ATTRS{type}=="1|8", GROUP="tape"

SUBSYSTEM=="scsi_generic|scsi_tape", SUBSYSTEMS=="scsi", ATTRS{type}=="1|8", GROUP="tape"
SUBSYSTEM=="scsi_generic", SUBSYSTEMS=="scsi", ATTRS{type}=="0", GROUP="disk"
KERNEL=="qft[0-9]*|nqft[0-9]*|zqft[0-9]*|nzqft[0-9]*|rawqft[0-9]*|nrawqft[0-9]*", GROUP="disk"
KERNEL=="loop-control", GROUP="disk", OPTIONS+="static_node=loop-control"
KERNEL=="btrfs-control", GROUP="disk"
KERNEL=="rawctl", GROUP="disk"
SUBSYSTEM=="raw", KERNEL=="raw[0-9]*", GROUP="disk"
SUBSYSTEM=="aoe", GROUP="disk", MODE="0220"
SUBSYSTEM=="aoe", KERNEL=="err", MODE="0440"

KERNEL=="rfkill", MODE="0664"
KERNEL=="tun", MODE="0666", OPTIONS+="static_node=net/tun"

KERNEL=="fuse", MODE="0666", OPTIONS+="static_node=fuse"

# The static_node is required on s390x and ppc (they are using MODULE_ALIAS)
KERNEL=="kvm", GROUP="kvm", MODE="0660", OPTIONS+="static_node=kvm"

KERNEL=="vfio", MODE="0666", OPTIONS+="static_node=vfio/vfio"

KERNEL=="vsock", MODE="0666"
KERNEL=="vhost-vsock", GROUP="kvm", MODE="0660", OPTIONS+="static_node=vhost-vsock"

KERNEL=="vhost-net", GROUP="kvm", MODE="0660", OPTIONS+="static_node=vhost-net"

KERNEL=="udmabuf", GROUP="kvm"

SUBSYSTEM=="ptp", ATTR{clock_name}=="KVM virtual PTP", SYMLINK += "ptp_kvm"

SUBSYSTEM=="ptp", ATTR{clock_name}=="hyperv", SYMLINK += "ptp_hyperv"

SUBSYSTEM!="dmi", GOTO="dmi_end"
ENV{ID_SYS_VENDOR_IS_RUBBISH}!="1", ENV{ID_VENDOR}="$attr{sys_vendor}"
ENV{ID_SYSFS_ATTRIBUTE_MODEL}=="", ENV{ID_PRODUCT_NAME_IS_RUBBISH}!="1", ENV{ID_MODEL}="$attr{product_name}"
ENV{ID_SYSFS_ATTRIBUTE_MODEL}=="product_name", ENV{ID_MODEL}="$attr{product_name}"
ENV{ID_SYSFS_ATTRIBUTE_MODEL}=="product_version", ENV{ID_MODEL}="$attr{product_version}"
# fallback to board information
ENV{ID_VENDOR}=="", ENV{ID_VENDOR}="$attr{board_vendor}"
ENV{ID_MODEL}=="", ENV{ID_MODEL}="$attr{board_name}"
LABEL="dmi_end"
LABEL="default_end"

Edit: inhalt in Spoiler korrigiert.
 
Zuletzt bearbeitet:
Stand dahinter in klammern :D

Führe
which chgrp
aus, das zeigt dir den Pfad.

Das Problem an Cron und PATH ist, dass das sooo oft von irgendjemanden oder irgendwas verhunzt wurde, das ICH dazu übergegangen bin, absolute Pfade zu verwenden.
 
Code:
root@jellyfin:~# grep "ssl-cert" /lib/udev/rules.d/*
root@jellyfin:~# grep "render" /lib/udev/rules.d/*
/lib/udev/rules.d/50-udev-default.rules:SUBSYSTEM=="drm", KERNEL!="renderD*", GROUP="video"
/lib/udev/rules.d/50-udev-default.rules:SUBSYSTEM=="drm", KERNEL=="renderD*", GROUP="render", MODE="0660"
/lib/udev/rules.d/50-udev-default.rules:SUBSYSTEM=="kfd", GROUP="render", MODE="0660"
/lib/udev/rules.d/60-drm.rules:ENV{ID_PATH}=="?*", KERNEL=="renderD*", SYMLINK+="dri/by-path/$env{ID_PATH}-render"
/lib/udev/rules.d/70-uaccess.rules:# DRI render nodes
/lib/udev/rules.d/70-uaccess.rules:SUBSYSTEM=="drm", KERNEL=="renderD*", TAG+="uaccess"
root@jellyfin:~#
 
Hier mal alles vom Host:
Code:
Last login: Sat Sep 30 09:21:37 CEST 2023 on pts/0
root@Nuc12:~# grep "ssl-cert" /etc/udev/rules.d/*
root@Nuc12:~# grep "render" /etc/udev/rules.d/*
root@Nuc12:~# grep "ssl-cert" /lib/udev/rules.d/*
root@Nuc12:~# grep "render" /lib/udev/rules.d/*
/lib/udev/rules.d/50-udev-default.rules:SUBSYSTEM=="drm", KERNEL!="renderD*", GROUP="video"
/lib/udev/rules.d/50-udev-default.rules:SUBSYSTEM=="drm", KERNEL=="renderD*", GROUP="render", MODE="0660"
/lib/udev/rules.d/50-udev-default.rules:SUBSYSTEM=="kfd", GROUP="render", MODE="0660"
/lib/udev/rules.d/60-drm.rules:ENV{ID_PATH}=="?*", KERNEL=="renderD*", SYMLINK+="dri/by-path/$env{ID_PATH}-render"
/lib/udev/rules.d/70-uaccess.rules:# DRI render nodes
/lib/udev/rules.d/70-uaccess.rules:SUBSYSTEM=="drm", KERNEL=="renderD*", TAG+="uaccess"
root@Nuc12:~#
 
Da ist auch nicht erkennbar, warum sich die Gruppe ändert.

Jetzt bliebe noch übrig, Audit-Logging für die Datei zu aktivieren.

In etwa so:

Code:
apt install auditd

In der /etc/audit/auditd.conf

Code:
log_file = /var/log/audit/audit.log
log_format = RAW

In der /etc/audit/rules.d/renderD128.rules

Code:
-a always,exit -F path=/dev/dri/renderD128 -F perm=chgrp

Und dann

Code:
systemctl enable auditd

Und dann nach dem Reboot schauen, was in die /var/log/audit/audit.log geloggt wird.

Bzw:

Code:
ausearch -f /dev/dri/renderD128
 
Seit Debian 10 is /etc/rc.local deprecated (Proxmox basiert auf Debian) aber das war quasi der "Autostart" den du wolltest. Das kann man aber auch in Debian 12/Proxmox 8 wieder in Handarbeit nachrüsten, Anleitung z.B hier. Dort kannst du dann deinen Befehl als Autostart auf die Schnelle eintragen.
 
  • Gefällt mir
Reaktionen: Azghul0815
ich habe btw das gleiche Problem, bei mir reicht aber schon ein Neustart des Proxmox Hosts aus, um die Gruppe von dem RenderD128 zu ändern.
 
hmm. ich habe den Befehl von oben auch über crontab -e eingefügt, allerdings scheint es bei mir nicht zu klappen.

Genauer gesagt, ist nach einem Neustart vom Proxmox Host wieder die SSL Gruppe am Start und der Cronjob den ich eingefügt hatte ist auch nicht mehr da.

Screenshot_3.jpg


Sieht auf den ersten Blick so aus, also würde sich der Container zurück setzen nach einem Neu Start. Bin leider wenig erfahren.

Jmd eine Idee wieso das passieren kann?
 
Zurück
Oben