Ahoj,
Ty se v tom PHP pokoušíš otevřít
/dev/ttyAMA0 pro zápis a čtení
fopen('/dev/ttyAMA0','r+');
Ale protože je používáno jako sériová console (terminál), je na něm spuštěno
getty, a tedy k němu má přístup jen skupina
tty, a to
jen pro zápis.
$ ls -l /dev/ttyAMA0
crw--w---- 1 root tty 204, 64 Jun 1 21:10 /dev/ttyAMA0
Proto ti pod Apachem funguje např.
system ('echo hups> /dev/ttyAMA0');
když je Apache (uživatel
www-data) ve skupině
tty.
Podívej se do
/proc/cmdline a uvidíš tam něco jako
console=ttyAMA0,115200. Systemd potom na tomhle portu pustí getty a to nastaví zařízení
/dev/ttyAMA0 práva jako consoli (terminálu). Do terminálu smí zapisovat jen skupina
tty, ale nesmí z něho číst. Zápis je nutný např. pokud chceš poslat zprávu na všechny terminály, můžeš použít
/usr/bin/wall, který je vlastněn skupinou
tty a má nastaven
SETGID bit.
Ten odkaz ti měl napovědět. Jen tam místo řešení příčiny -
/dev/ttyAMA0 se používá jako sériová console - ji obchází tím, že zakážou systemd unitu
serial-getty@.service, která na zařízení
/dev/ttyAMA0 spustí
getty.
man 8 systemd-getty-generatorOdstraň z
/boot/cmdline.txt text
console=ttyAMA0,115200 a rebootuj.
Nyní už nebude
/dev/ttyAMA0 používán jako console (nepoběží na něm getty), ale bude dostupný jako seriový port, ke kterému budou mít přístup uživatelé ve skupině
dialout, pro čtení i zápis.
$ ls -l /dev/ttyAMA0
crw-rw---- 1 root dialout 204, 64 Jun 2 11:29 /dev/ttyAMA0
Dej apache (uživatele
www-data) do skupiny
dialout; odstraň ho ze skupiny
tty a restartuj.
Viz.
https://wiki.debian.org/SystemGroups