Beep: hangjelzés Linux boot folyamat végén
És ha majd belefújnak a kosszarvba, mihelyt meghalljátok a kürt szavát, az egész nép harsány kiáltásban törjön ki, és magától leszakad a város kőfala, és fölmegy arra a nép, mindenki az előtte levő helyen.
Jerikó bevétele
Az routerem egy Mikrotik gyártmányú termék, és ezen van egy nagyon hasznos funkció: hangjelzéssel jelzi a bekapcsolás vagy újraindítás után a sikeres indulást, amikortól már elvárható a szolgáltatásinak helyes működése. Ez nagyon hasznos funkció olyan headless gépeken, amik a közvetlen környezetemben működnek. Ilyen az itthoni router mellett az itthoni NAS is. Mivel épp belakom az új gépet, amit erre a feladatra raktam össze, és most még viszonylag gyakran újra is indítom emiatt, így megcsináltam ezt a funkciót a NAS-ra is.
A NAS-on Fedora 31 fut, így a leírás arra vonatkozik, de minimális módosításokkal nyilván más systemd alapú Linux disztribúciókon is használható.
Beep-beep!
Először is a gépen szükséges egy hardveres hangkimenet. Én a PC Speakert választottam a feladatra, mert más hangforrást nem akarok a gépre kötni.
Linux alatt legegyszerűbben a beep programmal lehet PC Speakert tütülésre bírni. Ezt a legtöbb disztribúció szállítja. Fedora alatt a telepítése mindössze annyi, hogy:
dnf install -y beep kernel-modules-extra
Ezután a beep
parancsot kiadva… nem hallunk hangokat. Be kell tölteni a PC Speaker kernel modulját: modprobe pcspkr
. Ezt szállítja a kernel-modules-extra
csomag, amibe a cikk eredeti közlése óta átkerült. Ekkor kis szerencsével már hangokat ad a beep, de sudo alól nem szeret hangot adni. Én inkább root felhasználóval belépve kipróbáltam, és működött a nyavalyás: idegesítő sípolást hallatott!
Arra jutottam, hogy a tanácsával ellentétben nem az evdev eszközök jogait fogom beállítani udev varázslattal, mivel úgyis csak bootnál akarom bizgetni, és azt majd a megteszem rootként. Nálam finnyásabbaknak jó szórakozást kívánok az udev bűvöléshez!
Térjünk vissza a kernel modulhoz! Automatikusan be kellene tölteni a gép induláskor. A modern systemd világban ezt a /etc/modules-load.d/*.conf
fileokban felsorolt modulokra a systemd meg is csinálja nekünk!
echo pcspkr > /etc/modules-load.d/pcspkr.conf
Ha pedig systemd, akkor nyilván egy service kell a program induláskor futtatására is. Mire is van szükségem? Egy egyszer futó servicere, ami a modulok betöltése, és az ssh indulása után, a multiuser mód előtt fut, egyszer, és nem indul újra kilépése után. Ezt a /etc/systemd/system/beep-after-boot.service
file a következők írásával érhetjük el:
# Systemd unit file /etc/systemd/system/beep-after-boot.service
[Unit]
Description=Beep after boot is complete
After=sshd.service systemd-modules-load.service
[Service]
User=root
Group=root
# 100ms 2kHz beep, 100 ms silence (hack: 1Hz beep), 100ms 1kHz beep.
ExecStart=/usr/bin/beep -f 2000 -l 100 -n -f 1 -l 100 -n -f 1000 -l 100
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Ezután már csak a boot folyamathoz kell adni az új szolgáltatást:
systemctl enable beep-after-boot.service
Újraindítás után a gép vidáman csippant kettőt amikor lehet ssh-zni rá! 📯🎉