Beep: hangjelzés Linux boot folyamat végén

És hét pap vigyen hét, kosszarvból készült kürtöt a láda előtt. A hetedik napon pedig hétszer kerüljétek meg a várost, a papok pedig fújják meg a kürtöket.
É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.

Ószövetség, Józsué könyve, 6. fejezet.
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á! 📯🎉