Script lefuttatása boot alatt

 ( TCH | 2019. március 4., hétfő - 13:01 )

Hogyan kell lefuttatni boot alatt egy scriptet?

Több módszert is ajánlottak a neten:

1. Tegyem be cronba @reboot-tal meghívva, full eléréssel, esetleg delay-jel. (@reboot sleep 10 && /path/to/my/script) Nem működött.

2. Tegyem be /etc/rc.local-ba, full eléréssel. Ez sem működött.

3. Tegyem be .bashrc-be vagy .bash_profile-ba. Ez ugyan működött, de csak akkor, ha már bejött a grafikus felület és kinyitottam egy terminált. Nekem pedig még a boot alatt kell.

4. Tegyem be initscriptbe, rakjak bele LSB header-t és hívjam rá az update-rc.d-t. Nem működött. Egy hasonszőrű topicban még mondták, hogy symlinkeljem be a scriptet az /etc/rc.d-be, de ez a könyvtár nem létezik.

A rendszer Devuan 2-es. (Debian 9 alapú.)

Valakinek ötlet?

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Leírtam, hogy az rc.local-os megoldás nem működött. Igen, futtatható volt az is, meg a script is.

Az /etc/init.d/-ben van rc.local bejegyzés?
Ha nincs egy ilyen jó lesz oda: https://pastebin.com/m0htuZJs

kellenek neki spéci környezeti változók? mert akkor simán lehet, hogy amiatt nem fut le. esetleg logolhatsz a scriptből, hogy mi a baja.

Ezen már rég túl vagyunk. :)
Hiányzott neki a $PATH-ból az /usr/local/bin, de egyébként tegnap este már sikerült megoldani.

Ha jól emlékszem, devuan az System V inittel megy.

Olvasd el az inittab man oldalát, de ha jól emlékszem, bootkor a /etc/rc.d/ könyvtárban lévő scripteket végrehajtja. Lehet, hogy S99scriptnév formára keres rá, és csak az így kezdődőeket.

Most látom csak, hogy nincs rc.d könyvtárad.

Akkor nézd meg, hogy milyen runlevelen indul el, és mondjuk ha 3-as, akkor a /etc/rc3.d/ könyvtárba linkeld be. Ott viszont már mindenképp csak a S99 kezdetű nevűt fogja végrehajtani.

Egyébként az, hogy nem működött, az elég kevés információ. Lehet, hogy te rontottál el valamit, vagy valamit nem tudtál és ezért nem csináltad meg. Logban megnézted a hibaüzeneteket pl?

Sajnos gőzöm sincs, hogy milyen runlevelen indul el, én ugyanis ezt nem állítottam be. Lehet, hogy ez volt a hiba?

Igen, 99+%-os valószínűséggel én rontok el valamit, csak nem tudom, hogy mit. Hibaüzenet nem volt semmilyen, se logban, se amúgy.

Első körben azt javasolnám, hogy olvasd el az inittab man page-et.

Vagy ezt a weboldalt: https://wiki.debian.org/RunLevel

A /etc/inittabba belenézve látod, hogy mi a default runlevel. Valószínűleg 2 lesz.

Szóval akkor a /etc/rc2.d-be kell a linket tenned.

runlevel vagy who -r és kiírja. chkconfig az induló szolgáltatásokat írja ki.

Thx, Zahy odalennt már felhomályosított ezügyben.

Systemd-hez csinálsz egy service fájl oneshot type-al. Ami külön jó, hogy erre más service-ek simán dependálhatnak. Pl.:

[Unit]
Description=Init script

[Service]
Type=oneshot
ExecStart= script path
RemainAfterExit=true
StandardOutput=journal

[Install]
WantedBy=multi-user.target

Leírtam, hogy Devuan 2-es, ld. az egyel feljebbi posztot gee-től: nincs systemd.

...habár felröhögtem, hogy devuan-os topic-hoz sikerült systemd-s megoldást hozni ( gondoltam, ez vicc és direkt trollkodsz :) ) ...de azért ez még jól jöhet :) Köszi :)

Odáig sikerült eljutnom, hogy valami debian 9 alapú cucc :) Utána olvasva mi ez tényleg trollkodásnak néz ki :) Az adott probléma mondjuk pont azok egyike ami systemd-vel elég szépen megoldható, sysvinittel meg óriási szívás.

> sysvinittel meg óriási szívás.

Nem szívás, csak én nem értek hozzá.

+1

Egyáltalán nem szívás egy scriptet bootkor lefuttatni egyszer. Több mód is van rá. Persze meg kell tanulni, hogy kell csinálni.
Én valaha tudtam, de amióta a disztribúcióm systemd-t használ, nem kellett foglalkozzam vele, ezért az emlékek megkoptak már.

> sysvinittel meg óriási szívás.

Kifejtenéd, hogy az eddig elhangzott lehetőségek (inittab, crontab, rc.local, /etc/rcX.d/Sxxsajatscriptem) közül melyik az óriási szívás és főleg miért? Ebből a crontab ugye init-től független (kivéve gondolom systemdland-ban), a másik három mind a SysVInit használatából és általánosan elterjedt konfigjából adódó lehetőség. Persze használni kell tudni őket ugyanúgy, mint ahogy a systemd-s konfigot is össze kell tudni precízen hegeszteni. Lásd még: systemd alatt is ugyanúgy fontos, hogy jól add meg a függőségeket, mint ahogy pl. az Sxxsajatscriptem használatakor az xx rossz kiválasztása sem segít a megoldásban.

=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?

Ha nem egyetlen adott gépen, adott disztrón kell megoldani, ezek mindegyike szívás nézzük sorban:

- crontab: A cron nem igazán erre való, azt, hogy mikor fut le nehéz belőni
- rc.local: ez régen nem volt minden disztróban
- inittab: simán felülírja valami
- rcX.d: Ez a legértelmesebb megoldás, de boot után elég nehéz lesz kihámozni, hogy tényleg lefutott-e a script és mit logolt.

> - crontab: A cron nem igazán erre való, azt, hogy mikor fut le nehéz belőni

Hogy mi? A cron pont arra való, hogy pontosan akkor fusson le a parancsod amikor akarod.

> - rc.local: ez régen nem volt minden disztróban

De te jelen időben mondtad, hogy most szívás. (Egyébként meg #define régen, legjobb tudomásom szerint az /etc/rc.local az UNIX 7 (1979) óta létezik...)

> - inittab: simán felülírja valami

Hogy mi? Mi írja felül, mikor, hol?

> - rcX.d: Ez a legértelmesebb megoldás, de boot után elég nehéz lesz kihámozni, hogy tényleg lefutott-e a script és mit logolt.

Miért lenne? /var/log/ nem vész el.

Ez engem is érdekelne, de init 0 és init 6 -nál.
Triviálisnak gondoltam, de eddig nem sikerült vele sokat haladni. (sysvinit)

-----------------------------------------
Linux parancsok, kezdőknek

Esetleg leírod, hogy mit próbáltál és mi lett az eredmény?

Vagy találgassunk? :-D

-

-----------------------------------------
Linux parancsok, kezdőknek

Egy ideje minden gépemen systemd van, úgyhogy csak emlékezetből írom:

Szerintem nem kellett semmi különös fejléc. Vagy nem tudom, mire gondolsz. Esetleg leírnád, hogy mi az, amit fejlécnek beírtál?

Mi az update-rc.d?

Nem tudom, Debiant használsz-e, nekem systemd előtti Debian rendszeren annyi volt, hogy a symlinket odatettem, a megfelelő elnevezési konvencióra (SXXfoo, KXXbar) figyelve, és onnantól a rendszer használta. Persze lehet, hogy azóta valamit változtattak.

Azt írod, hogy fejléc nélkül lett egy valami hiba, fejléccel egy valami más. Tehát akkor a scriptedet megpróbálta a rendszer futtatni, csak valami a tartalmával nem volt jó, gondolom.
Ha a hibaüzeneteket beírod, hátha valaki meg tudja mondani, hogy mi volt a gond.

Troll on: systemd-vel gyerekjáték volna

Valószínűleg itt is az, csak én nem tudom, hogy mit kell csinálni. Viszont, ha már trollkodás: mikor gyerekjáték? Miután letörölte az egész fájlrendszert, EFI-stül, mindenestül és be se bootol többet?

mit értesz pontosan a "boot alatt" kifejezésen??

a példákat amiker írsz, azok mind boot UTÁN futnak.

Ha pl az 1. módszer nem működik, akkor ~99% hogy a scriptedben van a hiba.

ha a 3. működik, akkor igen valószínű, hogy valami user session/environment főggősége van a scriptednek, azért nem megy máshogy.

De ha a script nem titkos, és megmutatod értelmesebb javaslatokat is kaphatsz ;)

--
zrubi.hu

Boot alatt azt értem, hogy mielőtt az X11 felkelne és az XDM feldobná a login formot.

Nem, végülis nem titkos a script. Lényegében arról van szó, hogy vannak a PIPO X8 és PIPO X8 Pro nevű minipécék, amikhez van egy live Linuxunk, amiről telepítjük a gépre. Az egyiken a cdc_ether driver kell, hogy vigye a netet, a másikon pedig a dm9601. Namármost, ez eddig egy dolog, de a sima PIPO-n, ha a dm9601 előbb betöltődik, mint a másik, akkor elszáll a net és csak reboottal lehet megjavítani; nem, sem unload, sem semmi nem segít. Ezt csak blacklisttel lehet orvosolni, viszont a másikon meg pont az a driver kell, amit itt blacklistelni kell. A probléma, hogy hol ezen, hol meg azon a fajta gépen kell felbootolni a telepítőknek a kulcsot, ezért írtam egy scriptet, ami annyit csinál, hogy megnézi, hogy ez melyik fajta PIPO, meg, hogy blacklistelve van e a dm9601 és a gép típusától függően tiltja vagy engedélyezi a drivert. Aztán rebootol, mert különben nem működik...

Ennyi a történet dióhéjban és itt vannak a scriptek:

detect_pipo: Ez ismeri fel a gépet.
detect_pipo_blacklist: Ez dönti el, hogy épp tiltva van-e az ominózus driver, vagy sem.
config_pipo_net: És ez az a script, amit meg akarok hívni, ami intézi az egészet.

Mind a három script az /usr/local/bin-ben lakik és mindegyik futtatható.

1) Egyébként az miért nem jó, hogy alapból blacklisteled mindkettőt, és simán modprobe-al húzod be a megfelelő modult (és megúszod a reboottal mókolást?). [ill. ha init scripből reboot-ot hívsz, tök jó reboot ciklusokat lehet csinálni]
2) Természetesen továbbra is a megfelelő LSB fejléc + update-rc.d lenne a korrekt megoldás, ha össze is sűríted egy scripbe
3) És természetesen: * laughs in systemd *

(egyébként pedig az _igazi_ megoldás: blacklist mindkettőre és egy-két jól irányzott udev szabály, hogy melyik modult töltse be)

BlackY
--
"en is amikor bejovok dolgozni, nem egy pc-t [..] kapcsolok be, hanem a mainframe-et..." (sj)

1) Nekem jó volna, de úgy nem működött. Nem tudom, hogy miért. Esik kel a Linux ezeken a gépeken.
2) Leírtam a nyitó posztban, hogy azt megpróbáltam és nem működött.
3) Csak nyugodtan. Én majd akkor fogok röhögni, amikor a systemd megint a levesbe küldi valakinek a gépét, mint a múltkor. (BTW, felesleges a trollkodás, nem a SysVInit nem működik, hanem én nem tudom, hogy hogy kéne ezt megoldani.)

Az udevnek lehet egyáltalán olyat mondani, hogy ha ez a CPU van, akkor ezt töltse be, ha meg az, akkor meg azt?

Idézet:
Az udevnek lehet egyáltalán olyat mondani, hogy ha ez a CPU van, akkor ezt töltse be, ha meg az, akkor meg azt?

Nem lennék meglepve, ha lehetne (ha más nem, a udev tud scriptet indítani, amivel kikeresheted), de itt nem tudom, hogy kell-e...

Jól látom, hogy ez valami USB-s kütyü? Nincs valami device attrib, amivel különbséget tudsz tenni köztük? Ha igen, onnantól két szabály, szűrsz arra az attribra, egyiknél modprobe cdc_ether, a másiknál dm9601...

Szerk.:

Idézet:
2) Leírtam a nyitó posztban, hogy azt megpróbáltam és nem működött.

Azt viszont nem, hogy _miért_ nem működött (meg _hogyan_ nem működött)

BlackY
--
"en is amikor bejovok dolgozni, nem egy pc-t [..] kapcsolok be, hanem a mainframe-et..." (sj)

> Jól látom, hogy ez valami USB-s kütyü? Nincs valami device attrib, amivel különbséget tudsz tenni köztük? Ha igen, onnantól két szabály, szűrsz arra az attribra, egyiknél modprobe cdc_ether, a másiknál dm9601...

A második fele jól hangzik, csak nem értem az első felében a kérdéseket. Mi az USB-s kütyü? Maga a minipc? Van rajta USB, de az miért fontos? Vagy úgy érted, hogy maga a hálókártya belül az USB porton ül-e? A CDC az lshw szerint a PCI expressen, a másikat nem tudom, de valószínűsítem, hogy az is.

> Azt viszont nem, hogy _miért_ nem működött (meg _hogyan_ nem működött)

Ez tény, de az elsőt nem is tudom leírni, mert én sem tudom, hogy miért nem működött (ha tudnám, akkor megoldottam volna. :/ ), a másikon meg nem nagyon van mit részletezni: egyszerűen nem történt semmi.

Gyors Google keresés után mindkét driverről úgy tűnt, hogy USB to Ethernet izék, azért kérdeztem. Egy lspci-t/lshw-t tudsz küldeni mindkét gépről?

BlackY
--
"en is amikor bejovok dolgozni, nem egy pc-t [..] kapcsolok be, hanem a mainframe-et..." (sj)

Még egy lsusb-t is légyszi :)

BlackY
--
"en is amikor bejovok dolgozni, nem egy pc-t [..] kapcsolok be, hanem a mainframe-et..." (sj)

Ez alapján elvileg tudnál matchelni (jobb híjján) a USB Bus / Device id-ra:

Fejből, közvetlenül a komment szövegmezőbe gépelve:

# PIPO
SUBSYSTEMS=="usb",ATTR{busnum}=="1",ATTR{devnum}=="2",RUN="modprobe cdc_ether"
# PIPOPRO
SUBSYSTEMS=="usb",ATTR{busnum}=="1",ATTR{devnum}=="3",RUN="modprobe dm9601"

(egyébként a Debian Wikiben azt írják, hogy mindig a cdc_ether kell, de néha elhasal: https://wiki.debian.org/InstallingDebianOn/PIPO/PIPO%20X8)

BlackY
--
"en is amikor bejovok dolgozni, nem egy pc-t [..] kapcsolok be, hanem a mainframe-et..." (sj)

Csináltam egy custom rule-t az /etc/udev/rules.d/pipo-net.rules néven, amibe beírtam ezt, de nem tölti be a drivereket.

Sry, a RUN-nak teljes elérési út kell (/sbin/modprobe). Ha van valami HW switch vagy valami az eszközön, amivel ki tudod rúgni a Wifi-t és vissza, akkor a udevadm monitor-ral tudod nézni, egyébként udevadm test /sys/bus/usb/devices/... -rel tudod tesztelni.

BlackY
--
"en is amikor bejovok dolgozni, nem egy pc-t [..] kapcsolok be, hanem a mainframe-et..." (sj)

Így meg betöltötte mind a kettőt...

Ja, feljebb elfelejtettem: a Debian Wiki oldala a cdc_ether-ről az csak a sima PIPO-nál működik a PIPO Pro-nál pont a dm9601 kell.

Ja, igen, mindkettő eszközön van valami mindkét eszköz úton... Keresd ki a /sys-ben az eszközt (/sys/bus/usb/devices/ alatt lesznek), aztán mindkettőre csinálj egy udevadm info -a /sys/... -t, kell, hogy legyen valami, amire tudod szűrni

Pl. még tudod a vendor és device id-ra is szűrni, valami ilyesmivel:

SUBSYSTEMS=="usb",ATTR{busnum}=="1",ATTR{devnum}=="2",ATTR{idProduct}=="0a46",ATTR{idVendor}=="1269",RUN="/sbin/modprobe cdc_ether"
# másikra ugyanez az idProduct/idVendor pár

BlackY
--
"en is amikor bejovok dolgozni, nem egy pc-t [..] kapcsolok be, hanem a mainframe-et..." (sj)

Beleírtam ezt:

# PIPO
SUBSYSTEMS=="usb",ATTR{busnum}=="1",ATTR{devnum}=="2",ATTR{idProduct}=="0a46",ATTR{idVendor}=="1269",RUN="/sbin/modprobe cdc_ether"
# PIPO PRO
SUBSYSTEMS=="usb",ATTR{busnum}=="1",ATTR{devnum}=="3",ATTR{idProduct}=="0a46",ATTR{idVendor}=="1269",RUN="/sbin/modprobe dm9601"

De így meg egyiket sem tölti be. Egyik gépen sem.

Szerintem valamit nem írtál jól le, hogy mi történt, vagy félreérted amit SzBlackY mond.

blacklistelni azt jelenti, hogy tiltod a modul automatikus betöltését. Megtetted ezt _mindkét_ modullal, amik ütik egymást? Ha igen, akkor boot után próbáld meg _kézzel_ betölteni őket! Mi történik? Így sem működik a rendszer? Mi a hibajelenség?

* Mert ha így is hibázik, akkor nem egyik modul interferál a másikkal, hanem valami harmadik dologgal interferálnak.
* Ha viszont így működik, akkor már csak azt a szkriptet kell megcsinálni, ami helyetted "kézzel" behúzza a megfelelő modult. (Én sysV init szolgáltatásként csinálnám meg ennek a betöltését.) A lényegi különbség eközött és a te megoldásod között az, hogy így megoldva nem kellene reboot, hanem a sticket bootolva egyből jó lenne a rendszer.

A normál PIPO-n a kettős blacklist és a modprobe cdc_ether után működik a net, viszont a PIPO Pro-n hiába mondom neki, hogy modprobe dm9601, utána nem hajlandó működni. ifup/ifdown azt mondja, hogy nincs konfigurálva, /etc/init.d/networking stop/start kiírja, hogy configuring done, majd ugyanúgy nem megy, az ifconfig eth0 up/down meg kiírja, hogy ilyen eszköz nincsen. Reboot életre leheli, de akkor a blacklistet el kell távolítani.

Itt nem harmadik dologgal ütköznek, hanem ennek a szar PIPO-nak a Linux támogatottsága egy raklap alsógatya. Esik-kel, boot-ba néha belefagy, stb.

Diffeld meg a betöltött kernel-modulokat, és a dmesg-et úgy, hogy blacklistelve van a modul és úgy, hogy nincs. Hátha ráakadsz arra a másik lépésre, ami a netkártya felállásához kell. Elég fura volna, ha boot alatt be lehetne tölteni, később meg már nem. (Ha egy másik driver valami invalid állapotba hozza a hardvert, az érthető hogy bajt okoz, de ha ilyen nincs, akkor mindegy kellene legyen, hogy mikor tölti be a drivert.)

Közben kiderült, miért nem ment: az /etc/udev/rules.d-ben volt egy konfig, ami már bejegyezte az eth0-át egy adott mac addressre és az eth1-et egy másikra. Miután kitöröltem, rebootoltam és modprobe dm9601 && /etc/init.d/networking restart és működik. Valahogy lehet forceolni, hogy ne csináljon persistent rulesetet az eth0-ra?

Troll on: Igen, valahogy lehet :-)
Troll off: fogalmam sincs. De legalább látszik az alagút vége, erre kapirgálva szerintem megoldáshoz fogsz érni.

Elvileg: ln -s /dev/null /etc/udev/rules.d/75-persistent-net-generator.rules

(ha a /lib/udev/rules.d-ben ilyen néven van a generáló szabály)

BlackY
--
"en is amikor bejovok dolgozni, nem egy pc-t [..] kapcsolok be, hanem a mainframe-et..." (sj)

70-persistent-net.rules volt, de amúgy megvan, thx.

Ez offtopic, ezért külön hozzászólás:

Idézet:
3) Csak nyugodtan. Én majd akkor fogok röhögni, amikor a systemd megint a levesbe küldi valakinek a gépét, mint a múltkor. (BTW, felesleges a trollkodás, nem a SysVInit nem működik, hanem én nem tudom, hogy hogy kéne ezt megoldani.)

Erre tudsz egy linket mondani? systemd "okozta" adatvesztésre egyedül az rémlik, amikor valaki azzal találkozott, hogy lehet a systemd-tempfiles-t rm /* -re paraméterezni...

BlackY
--
"en is amikor bejovok dolgozni, nem egy pc-t [..] kapcsolok be, hanem a mainframe-et..." (sj)

> Erre tudsz egy linket mondani? systemd "okozta" adatvesztésre egyedül az rémlik, amikor valaki azzal találkozott, hogy lehet a systemd-tempfiles-t rm /* -re paraméterezni...

Adatvesztésest? Tudok mondani azt is (ez pont az amit te is említettél), noha én nem arról beszéltem, hogy az adatokat küldi a levesbe, hanem azt, hogy a gépet. (Link erre is: https://news.ycombinator.com/item?id=10999335)

De ez itt tényleg off és felesleges is. Felhívnám a figyelmedet, hogy ezt nem systemd fikatopicnak szántam, én meg sem említettem a systemd-t, asch és te triggerelődtetek a Devuan említésére és hoztátok be a topicba.

[Feliratkozás]

Tegyel bele egy ilyet az rc.local-odba:

set >/home/username/env.txt

Igy kiderul, hogy tenyleg nem fut le, illetve milyen env. var-ok vannak beallitva. Ugy vettem eszre, a legtobbszor lefut a script, csak valami nincs beallitva, amit varna a scripten beluli program, ezert nem az tortenik, amit vartal.

--
When you tear out a man's tongue, you are not proving him a liar, you're only telling the world that you fear what he might say. -George R.R. Martin

Köszi a linket.

Beletettem, itt van az eredmény: http://everlink.hu/env.txt

Az /usr/local/bin ugyan nincs benne a $PATH-ban, de én teljes eléréssel írtam bele a scriptet. Próbáltam úgy is, hogy sh-val hívom meg.

A szkriptedben nem hívsz olyat, ami a /usr/local/bin-ben van? Próbálj a szkriptedben produkálni valami kimenetet (egy fájlba irányítva), hogy mi akad meg (debug-üzenetek).

+1, ill. hol vannak a detect_pipo és detect_pipo_blacklist scriptek? Mert a fenti env alapján a / a working directory...

BlackY
--
"en is amikor bejovok dolgozni, nem egy pc-t [..] kapcsolok be, hanem a mainframe-et..." (sj)

Pár poszttal feljebb, abban amire a systemd-s röhögőst választ adtad, le volt írva, hogy /usr/local/bin, de a config_pipo_net script full eléréssel van meghívva és már az sem fut le.

config_pipo_net script full eléréssel van meghívva és már az sem fut le.
Ezt miből állapítod meg?

szinte biztosan az a baj, hogy a scripten belül nincs megfelelő $PATH, így ezek egyike sem találja meg a lefuttatandó állományokat:

PIPO=`detect_pipo`
PIPOBL=`detect_pipo_blacklist`

mivel ezek nélkül nem csinál semmit a scripted, így érthető, hogy nem működik.

(amikor interaktív terminálból hívod meg, akkor a login session-ben még szerepel a $PATH-ban a /ust/local/bin, és működik - ahogy írtad is.)

Szerintem.
--
zrubi.hu

Közben nekem is eszembe jutott; asszem inkább egy scriptbe pakolom majd őket. Hacsak nem sikerül udevvel megoldani fentebb.

Azt próbáltam, de nem ment. Egyáltalán nem futtatta le a fájlt.

Akkor azt már tudod, hogy az rc.local-ból lefutott a script, mert megkaptad az env.txt-t.
Szóval ha ugyanígy az rc.local-ba berakva nem csinál semmit a másik script, akkor kezdd el telerakni debug üzenetekkel, aztán kiderül, hogy meddig jut, és mi lehet a baj.

Hát most hogy az env-ben az /usr/local/bin nincs benne a $PATH-ben, valószínűleg a másik két script hiányzott neki... De azért majd debuggolok.

"de én teljes eléréssel írtam bele a scriptet" vs http://everlink.hu/pipo_net/config_pipo_net

PIPO=`detect_pipo` a path-ben keres. Próbáld így: PIPO=`/usr/local/bin/detect_pipo`.

Közben nekem is eszembe jutott; asszem inkább egy scriptbe pakolom majd őket. Hacsak nem sikerül udevvel megoldani fentebb.

Noha jól látszik, hogy az /etc/rc.local segítségével már közelítesz a megoldáshoz, azért megemlítem, hogy a SysVinit esetén létezik olyan is, hogy /etc/inittab, és ebben azok a sorok, amiknél az action kulcsszó (a 3. mező) a "sysinit" / "boot" / "bootwait", azok a fenti sorrendben, a fájlbeli sorrendnek megfelelően futnak le a boot meglehetősen korai szakaszában. Mondjuk pl. ha rossz helyre teszi az ember, akkor simán lehet, hogy még nincs is felcsatolva a /usr, vagy a /usr/local.

Illetve megteheted, hogy kikeresed, hogy mi az alapértelmezett futási szint (az a sor, amiben "initdefault" a kulcsszó, abban a sorban a második - runlevel - mezőben szereplő legmagasabb értékű szám), és a fájl elejére felveszel néhány olyan sort, amiben a futási szint (2. mező) megegyezik ezzel a számmal, a kulcsszó (3. mező) a "once" kulcsszó, a negyedik mezőben pedig teljes elérési úttal az általad futtatni akart script.

És í. t. (Mint mások is mondták, a kicsit részletesebb hibaleírás sokat tud segíteni.) Ha pedig azt kell egy SysVInit-es rendszer esetén kideríteni, hgy mi az alapértelmezett futási szint, akkor az inittab tanulmányozása helyett használható a "who -r" parancs boot után egy terminálban.

=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?

> Noha jól látszik, hogy az /etc/rc.local segítségével már közelítesz a megoldáshoz, azért megemlítem, hogy a SysVinit esetén létezik olyan is, hogy /etc/inittab, és ebben azok a sorok, amiknél az action kulcsszó (a 3. mező) a "sysinit" / "boot" / "bootwait", azok a fenti sorrendben, a fájlbeli sorrendnek megfelelően futnak le a boot meglehetősen korai szakaszában.

Egy darab sysinit-est találtam: si::sysinit:/etc/init.d/rcS
A másik kettőből nincs.

> Mondjuk pl. ha rossz helyre teszi az ember, akkor simán lehet, hogy még nincs is felcsatolva a /usr, vagy a /usr/local.

Láma kérdés: felcsatolva? Mármint mountolva? Itt egy partíción van minden (kivéve a swap). Vagy úgy érted, hogy a $PATH-ben nincs még benne? Az már kiderült, hogy tényleg nincs akkor még benne.

> Illetve megteheted, hogy kikeresed, hogy mi az alapértelmezett futási szint (az a sor, amiben "initdefault" a kulcsszó, abban a sorban a második - runlevel - mezőben szereplő legmagasabb értékű szám), és a fájl elejére felveszel néhány olyan sort, amiben a futási szint (2. mező) megegyezik ezzel a számmal, a kulcsszó (3. mező) a "once" kulcsszó, a negyedik mezőben pedig teljes elérési úttal az általad futtatni akart script.

Ezt találtam: id:2:initdefault:
Tehát akkor be kéne elé szúrnom egy olyat, hogy piponet:2:once:/usr/local/bin/config_pipo_net ?

> És í. t. (Mint mások is mondták, a kicsit részletesebb hibaleírás sokat tud segíteni.) Ha pedig azt kell egy SysVInit-es rendszer esetén kideríteni, hgy mi az alapértelmezett futási szint, akkor az inittab tanulmányozása helyett használható a "who -r" parancs boot után egy terminálban.

Thx. Mondjuk ehhez valid service is kéne. Az LSB headert ugyan beleraktam, de ennek ellenére sem futott. Majd holnap retry.

No akkor sorban:

Az egy db. sysinit felhúzza a single-user módban szükséges dolgokat, az még korai. Az, hogy nincs boot/bootwait, az nem baj, opcionális.

Igen, felcsatolásként említettem a mountolást. Mondjuk ha nincsenek önálló fájlrendszerek, akkor ez nem érdekes.

A PATH-beli értéket akár te is változtathatod, ha mindenképp az a cél, hogy legyen benne a /usr/local/bin, akkor akár ezt is beteheted a scriptjeid elejére:
PATH=$PATH:/usr/local/bin
export PATH

Végül pedig igen, egy ilyen sor kell oda.

Azért ilyeneket még ellenőrizz:
- script futtatási joga
- script első sorában #! után álló shell létezzen (és szintén legyen futási joga)
- minden a scriptből hívott parancs vagy elérési útvonallal legyen, vagy olyan könyvtárban, ami benne van a PATH-ban
- eseleg script elejére (she-bang után) két ilyen sor:
exec 2> /tmp/stderr # stderr átirányítva ebbe a fájlba
set -x # ennek hatására minden parancs futtatása előtt kiíródik az stderr -re a parancs

innentől látszik, hogy milyen parancsnál lesz hiba, és mi az a hiba.
és a következő boot után megnézni, hogy mi van a /tmp/stderr nevű fájlban - és ez alapján javítani a scripten.

=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?

> A PATH-beli értéket akár te is változtathatod, ha mindenképp az a cél, hogy legyen benne a /usr/local/bin, akkor akár ezt is beteheted a scriptjeid elejére:
PATH=$PATH:/usr/local/bin
export PATH

De hülye vagyok, ez eszembe se jutott, hogy átállíthatom kézzel... :/

> - script futtatási joga
> - script első sorában #! után álló shell létezzen (és szintén legyen futási joga)

Ezek megvoltak.

> - minden a scriptből hívott parancs vagy elérési útvonallal legyen, vagy olyan könyvtárban, ami benne van a PATH-ban

Ez viszont nem, nem volt benne a PATH-ban...

> - eseleg script elejére (she-bang után) két ilyen sor:
> exec 2> /tmp/stderr # stderr átirányítva ebbe a fájlba
> set -x # ennek hatására minden parancs futtatása előtt kiíródik az stderr -re a parancs

Erre már nem kerül sor, mert azzal, hogy fel lett véve a hiányzó útvonal, a script életre kelt és megcsinálta, amit kellett, thx a rámutatást. Viszont sajnos csak azután teszi, hogy az X11 elindul és az XDM feljön. Bejelentkezni nem kell, de a telepítők ebbe bele fognak zavarodni, hogy most mikor kell várni, meg mikor nem, azonfelül a rebootba belehal a gép, kapok egy fehér képernyőt, rajta egy mozgatható pointerrel és kámpec. Ctrl + Alt + Fx sem segít, csak az eltáp. Hogyan lehetne az X11 előtt lerendezni ezt?

Nem tudom, hogy éppen most hogy működik a devuan alatt a systemvinit, amikor régen Debian alatt ment, akkor nem volt még párhuzamosítás és hasonló úri huncutságok, hanem sorban hajtotta végre a startup fájlokat.

Ha belenézel az rc2.d könyvtárba, az xdm valószínűleg az utolsó lehet, pl. S99xdm vagy hasonló néven.
Annyit kell tenned, hogy korábbra* teszed be a te parancsodat.

Már nem emlékszem hol (talán man inittab, vagy akár a /etc/inittab vagy /etc/rc2.d könyvtárban (vagy máshol valami doksiban)) le van írva, hogy melyik szám kb. mit jelent. Olyasmit képzelj el, hogy mondjuk 10-ig elindítja a core akármiket, logolást, eszközkezelést, modulokat. 20-ig valamivel molyol, 30-nál húzza fel a hálózatot, 40-nél mountolja fel a fájlrendszereket (amik ugye lehetnek elméletileg hálózaton is, pl. /usr és /home simán), 50-nél indítja azokat a dolgokat, amikhez kell a /usr 60 körül kész a karakteres alaprendszer, 99-nél elindítja az X-et.

A lényeg az, hogy meg kellene keresned azt, hogy hová illeszkedik logikailag a scripted. Pl. mivel a hálózat nem megy a scripted nélkül, gondolom arra a részre kellene rákeresni, ami a hálózati interfészek felhúzása előtt van (nézd meg, hogy hányas számnál indul a network, networking vagy mi a neve a linknek), és az elé érdemes beszúrni.

DE! Ha pl. a scriptednek kellenek olyan dolgok, amik nem a root fájlrendszeren vannak, akkor keresd meg azt a pontot, ahol a fájlrendszereket felmountolja, és a közé a pont és az xdm közé tedd valahová.

* arra, gondolom, rájöttél, hogy a számok sorrendjében hajtja végre a dolgokat az init által indított program (valami runner a neve, úgy rémlik). Szóval ha S42foo a scriptedre mutató link neve, akkor az S41bar után és az S50baz előtt fog lefutni.

Köszi a magyarázatot, mindenképpen bele fogom magam ásni, de úgy néz ki sikerült megoldani Zahy és SzBlackY javaslatainak összekombinálásával: Az eth0 rulesetet belinkeltem a /dev/null-ra, a két drivert blacklistre raktam és az rc.local-ban pedig meghívok egy scriptet, ami a korábbi módosult változata, nem blacklistel meg rebootol, csak loadol, aztán újrahúzza a network-öt: http://everlink.hu/init_pipo_net

Köszi mindenkinek!