Morfitronik Security & Privacy

Skrypty startowe init w OpenWRT

2016-04-27 18:47:12
Morfik

Znaczna część usług, które są dostępne w OpenWRT, jest odpalana w fazie startowej routera. Te zadnia są realizowane przez skrypty startowe, które są dołączane w konkretnych pakietach. Takie skrypty są wywoływane w odpowiedniej kolejności. Każdy z nich można dodać lub usunąć z autostartu. W przypadku, gdy jakaś usługa nie dostarcza swojego skryptu startowego, możemy pokusić się o napisanie jej takowego. Oczywiście, nic też nie stoi na przeszkodzie, by utworzyć własne skrypty startowe, które niekoniecznie odnoszą się do określonych usług. Mogą one np. realizować pewne określone zadanie. W tym wpisie przybliżymy sobie trochę budowę skryptów startowych w OpenWRT tak, by być w stanie je tworzyć i edytować jeśli zajdzie taka potrzeba.

Gdzie zlokalizowane są skrypty startowe

Wszystkie skrypty startowe dostarczane w pakietach są po instalacji umieszczane w katalogu /etc/init.d/ . Każdy skrypt posiada szereg opcji, z którymi może zostać wywołany. Część z tych opcji jest wspólna dla wszystkich skryptów startowych. Niemniej jednak, nic nie stoi na przeszkodzie, aby stworzyć własne opcje i przypisać im określone akcje. By się dowiedzieć jakimi opcjami dysponuje jakiś skrypt startowy, najlepiej jest go po prostu podejrzeć lub też wywołać go bez żadnej opcji. Poniżej przykład:

Przy pomocy opcji start lub stop jesteśmy w stanie uruchomić usługę lub ją zatrzymać. Możemy także taką usługę zrestartować przy pomocy restart . Choć można ten sam stan rzeczy otrzymać wywołując kolejno stop i start . Nie każda usługa posiada opcję reload , która to wczytuje zmiany dokonane w plikach konfiguracyjnych, na których operuje skrypt. Natomiast wszystkie z usług posiadają opcje enable i disable . Odpowiadają one za włączenie i wyłączenie danego skryptu, czyli decydują o tym, czy jakaś usługa będzie aktywowana automatycznie podczas startu systemu routera czy też nie.

Dodawanie usług do autostartu systemu

Każdy z plików zlokalizowanych w /etc/init.d/ posiada nagłówek. W nim zawarte są min informacje na temat pozycji skryptu w kolejce podczas fazy boot. Odpowiada za to zmienna START . Z kolei zmienna STOP jest opcjonalna i dotyczy kolejności wyłączania usług. Poniżej jest przykład:

Te dwie powyższe zmienne są brane pod uwagę przy wywoływaniu skryptu z opcjami enable i disable . Po ich wydaniu, w katalogu /etc/rc.d/ zostaną utworzone dowiązania do skryptu, przykładowo:

Nazwa linku jest taka sama jak nazwa skryptu, z tą różnicą, że mamy tam dodatkowo literki S lub K i jakiś numerek. Skrypty, które mają linki zaczynające się od S będą ładowane przy starcie systemu. Natomiast te, które mają dowiązania zaczynające się od K , będą wykonywane przy restarcie czy wyłączeniu (via poweroff) routera. Z kolei liczba, np. 50 , oznacza wartość, która widnieje w zmiennej START/STOP w skrypcie startowym. Każdy skrypt ma jakiś numer. Te, które mają mniejsze numerki są wykonywane przed tymi co mają większe. W przypadku, gdy dwa skrypty mają taki sam numer, kolejność ich startu jest ustalana w oparciu o porządek alfabetyczny.

Budowa skryptów startowych

Wszystkie skrypty startowe obecne w katalogu /etc/init.d/ muszą posiadać atrybut wykonywalności ( chmod +x ), jako, że są to zwykle skrypty shell’owe. Każdy z tych plików musi także rozpoczynać się od poniższej linijki:

#!/bin/sh /etc/rc.common

Jest to wrapper zapewniający główną i domyślną funkcjonalność dla skryptu. Sprawdza on także skrypt startowy pod kątem ewentualnych błędów przed wykonaniem go. Dodatkowo, każdy skrypt musi posiadać przynajmniej dwa standardowe bloki kodu. Po jednym dla akcji start i stop :

start() {
...
}

stop() {
...
}

To w nich umieszczamy instrukcje, na podstawie, których system wie co ma robić przy przetwarzaniu konkretnego skryptu. W przypadku, gdy w skrypcie ma być zawarta inna procedura startu w stosunku do normalnego wywołania skryptu (w tym również w przypadku restartu usługi), to musimy także zawrzeć poniższy blok kodu:

boot() {
...
}

W skryptach startowych mogą być także zdefiniowane własne polecenia. Wystarczy w nagłówku pliku zawszeć poniższą linijkę:

EXTRA_COMMANDS="create delete"

Powyżej mamy zdefiniowane dwa nowe polecenia: create oraz delete . By je wykorzystać w pliku, tworzymy dla nich osobne sekcje podobne do tych powyżej:

create() {
...
}

delete() {
...
}

Komentarze

Zawartość wpisu