Nedávno jsem narazil na dva různé problémy na dvou různých hostitelích Linuxu. Každý z nich vyžadoval jedinečné obcházení, protože jsem ještě nenašel skutečné řešení. Metoda pro každé obcházení však byla stejná:Spustit příkaz během nebo krátce po spuštění Linuxu.
rc.local
soubor byl – a v některých případech stále je – místem, kde správci systému Linux zadávali příkazy, které je třeba spustit při spuštění. Použití rc.local
soubor je nejen zastaralý, ale po několika hodinách pokusů v žádném případě nefungoval. A to navzdory skutečnosti, že systemd
dokumentace zmiňuje použití "generátoru", který generuje systemd
služby z rc.local
soubor, pokud existuje. (Zdá se, že je to dobrý způsob, jak vynutit ukončení podpory – aby to nefungovalo.)
Podrobnosti mého konkrétního problému nejsou pro tuto diskuzi nijak zvlášť relevantní, takže jako obsah našeho místního spouštěcího souboru použiji jednoduchý a snadno sledovatelný příkaz. Do souboru místního protokolu přidáme řádek s datem, abychom ověřili, že program Bash, který potřebujeme spustit při spuštění, skutečně funguje.
Boot vs. spuštění
Pochopení procesu spouštění a spouštění systému Linux je důležité pro konfiguraci systému Linux a řešení problémů se spouštěním. Ve skutečnosti existují dvě posloupnosti událostí, které jsou nutné ke spuštění počítače se systémem Linux a jeho použití:spuštění a spuštění. Zaváděcí sekvence začíná po zapnutí počítače a končí, když je inicializováno jádro a systemd
je spuštěna. Proces spouštění pak převezme a dokončí úkol uvést počítač se systémem Linux do provozního stavu.
Celkově je proces spouštění a spouštění Linuxu poměrně jednoduchý na pochopení. Skládá se z následujících kroků, které budou podrobněji popsány později:
- BIOS Power-On Self-Test (POST)
- Boot loader (GRUB2)
- Jádro
systemd
Mnohem podrobnější popis spouštěcí a spouštěcí sekvence naleznete v mém článku Úvod do procesu spouštění a spouštění Linuxu.
Místní spuštění
Sysadmins někdy přidávají do spouštěcí sekvence příkazy, které jsou lokálně užitečné. Cílem těchto doplňků může být spouštění nebo spouštění místních procesů, které nejsou součástí standardního systemd
spuštění. Je možné přidat nový systemd
servisní jednotka ke spuštění každého programu potřebného při startu, ale stará rc.local
metoda poskytla jeden spustitelný soubor pro všechny potřeby místního spuštění. I my můžeme použít tento jednosouborový přístup s systemd
. Elegance tohoto řešení spočívá v tom, že usnadňuje přidávání dalších spouštěcích příkazů později, aniž by bylo nutné přidávat další servisní jednotky do systemd
.
Naším řešením je vytvořit jediný systemd
servisní jednotku a umístěte všechny potřebné příkazy Linuxu do spustitelného souboru. Toto řešení má dvě části. Jeden je jasný:Potřebujeme spustitelný soubor. A za druhé, musíme vytvořit servisní jednotku pro systemd
který spustí spustitelný soubor.
Vytvořte spustitelný soubor
Toto je triviální cvičení pro každého správce systému obeznámeného s programováním Bash. Ve skutečnosti vytvoříme program Bash a umístíme jej do umístění Linux Filesystem Hierarchical Standard (FHS) pro místní spustitelné soubory, /usr/local/bin
. Je možné použít argument pro umístění tohoto spustitelného souboru na jiné místo, ale /usr/local/bin
je ten, který mi dává největší smysl, protože toto umístění usnadňuje systémovému správci spuštění skriptu z příkazového řádku v případě potřeby. /usr/local/bin
adresář je vždy v $PATH
každého uživatele , včetně uživatele root.
Vytvořte mystartup.sh
zde zobrazený soubor a umístěte jej do /usr/local/bin
(ujistěte se, že je spustitelný). Ujistěte se, že používáte umístění pro Bash, které je správné pro vaši distribuci. Například distribuce založené na Debianu naleznou Bash na /bin/bash
.
#!/usr/bin/bash
################################################################################
# mystartup.sh
#
# This shell program is for testing a startup like rc.local using systemd.
# By David Both
# Licensed under GPL V2
#
################################################################################
# This program should be placed in /usr/local/bin
################################################################################
# This is a test entry
echo `date +%F" "%T` "Startup worked" >> /root/mystartup.log
Poznámka: Komentáře v přiložených souborech vám řeknou, kde je třeba je umístit.
Nezapomeňte otestovat tento spustitelný soubor spuštěním z příkazového řádku. Při prvním spuštění tohoto shell skriptu byste měli vidět nový soubor /root/mystartup.log
, s časem a datem spolu s textem "Startup worked"
. Tento soubor protokolu vytváříme a přidáváme do něj řádky pokaždé, když je skript spuštěn, jako jednoduchý test, abychom se ujistili, že náš skript funguje.
Spusťte skript ještě několikrát. Vaše výsledky by měly být podobné těm zde:
[root@testvm1 ~]# mystartup.sh
[root@testvm1 ~]# cat mystartup.log
2019-09-12 19:58:00 Startup worked
2019-09-12 19:58:17 Startup worked
2019-09-12 19:58:54 Startup worked
2019-09-12 19:59:00 Startup worked
2019-09-12 20:01:08 Startup worked
2019-09-12 20:04:01 Startup worked
2019-09-12 20:04:13 Startup worked
2019-09-12 20:06:11 Startup worked
2019-09-12 20:06:28 Startup worked
2019-09-16 09:51:21 Startup worked
2019-09-16 09:51:51 Startup worked
To je vše, co musíme udělat, abychom vytvořili soubor, který může případně obsahovat naše místní spouštěcí příkazy. Stačí do tohoto souboru přidat vše, co se má spustit při spuštění.
Vytvořte službu systemd
Servisní jednotka, kterou nyní vytvoříme, je standardní systemd
soubor servisní jednotky. Tento jednoduchý soubor se používá pouze ke spuštění mystartup.sh
skript při spuštění.
Vytvořte nový soubor, /usr/local/lib/systemd/system/mystartup.service
a přidejte obsah zobrazený níže:
################################################################################
# mystartup.service
#
# This service unit is for testing my systemd startup service
# By David Both
# Licensed under GPL V2
#
################################################################################
# This program should be placed in /usr/local/lib/systemd/system/.
# Create a symlink to it from the /etc/systemd/system directory.
################################################################################
[Unit]
Description=Runs /usr/local/bin/mystartup.sh
[Service]
ExecStart=/usr/local/bin/mystartup.sh
[Install]
WantedBy=multi-user.target
Tento soubor nemusí být spustitelný. Tento soubor může být také umístěn v /etc/systemd/system
, ale jako lokální soubor je lepší jej umístit do /usr/local
větev adresářové struktury s odkazem na ni z /etc/systemd.system
.
Nyní přejděte do /etc/systemd/system
a vytvořte symbolický odkaz v souboru servisní jednotky:
[root@testvm1 system]# ln -s /usr/local/lib/systemd/system/mystartup.service
Otestujte servisní jednotku
Před restartováním hostitele Linuxu pro závěrečný test bychom měli otestovat konečný soubor servisní jednotky. Nejprve ověřte, že systemd
vidí službu:
[root@testvm1 ~]# systemctl status mystartup
● mystartup.service - Runs /usr/local/bin/mystartup.sh
Loaded: loaded (/usr/local/lib/systemd/system/mystartup.service; linked; vendor preset: disabled)
Active: inactive (dead)
[root@testvm1 ~]#
Tento výsledek nám říká, že služba je rozpoznána systemd
. Nyní spustíme službu. Pokud tak učiníte, spustí se skript, ale nenakonfiguruje se nová služba tak, aby se spouštěla při spouštění:
[root@testvm1 ~]# systemctl start mystartup
Zkontrolujte obsah souboru protokolu a ověřte, že byl přidán nový řádek.
Povolte službu
Zbývá pouze povolit službu, aby běžela při spuštění:
[root@testvm1 ~]# systemctl enable mystartup
Created symlink /etc/systemd/system/multi-user.target.wants/mystartup.service →
/usr/local/lib/systemd/system/mystartup.service.
[root@testvm1 ~]#
Závěrečný test
Než restartujeme, podívejme se na journalctl
a jak jej můžeme použít k zobrazení záznamů žurnálu, které se týkají mystartup.service
. Můžeme také použít journalctl
příkaz k ověření, protože systemd
vede deník o všem, co dělá.
V následujícím příkazu -u
volba zobrazuje pouze položky pro mystartup
jednotka:
[root@testvm1 ~]# journalctl -u mystartup
-- Logs begin at Mon 2019-04-15 22:50:27 EDT, end at Mon 2019-09-16 11:44:30 EDT. --
Sep 16 11:09:28 testvm1 systemd[1]: Started Runs /usr/local/bin/mystartup.sh.
[root@testvm1 ~]#
Nyní restartujte hostitele Linuxu a zkontrolujte soubor protokolu, abyste se ujistili, že byl přidán nový řádek:
[root@testvm1 ~]# systemctl status mystartup
● mystartup.service - Runs /usr/local/bin/mystartup.sh
Loaded: loaded (/usr/local/lib/systemd/system/mystartup.service; enabled; vendor preset: disabled)
Active: inactive (dead) since Mon 2019-09-16 11:45:59 EDT; 1min 30s ago
Process: 819 ExecStart=/usr/local/bin/mystartup.sh (code=exited, status=0/SUCCESS)
Main PID: 819 (code=exited, status=0/SUCCESS)
Sep 16 11:45:55 testvm1 systemd[1]: Started Runs /usr/local/bin/mystartup.sh.
[root@testvm1 ~]# journalctl -u mystartup
-- Logs begin at Mon 2019-04-15 22:50:27 EDT, end at Mon 2019-09-16 11:47:45 EDT. --
Sep 16 11:09:28 testvm1 systemd[1]: Started Runs /usr/local/bin/mystartup.sh.
-- Reboot --
Sep 16 11:45:55 testvm1 systemd[1]: Started Runs /usr/local/bin/mystartup.sh.
[root@testvm1 ~]#
Závěr
Skript prostředí Bash, který jsme pro tento experiment vytvořili, se spustí jednou při spuštění a poté se ukončí. Nezůstává v paměti jako démon, protože k tomu nebyl navržen.
Pokud jste si toho nevšimli, postup, který jsme použili k vytvoření naší místní spouštěcí služby, lze také použít k vytvoření jakékoli nové služby pro systemd
. Není to tak těžké, když víme, jak na to.
Aktualizovat
Brzy po zveřejnění tohoto článku jsem obdržel e-mail od Toma Murphyho, který mě informoval o existenci rc-local
služba, která je součástí systemd
. Oceňuji tento e-mail, protože jsem o této službě nevěděl, takže jsem se dozvěděl něco nového.
Je možné přidat podporu pro starý rc.local
soubor povolením služby pomocí příkazu systemctl enable rc-local
. Příkazy v souboru rc.local se spustí při příštím spuštění. Samozřejmě můžete použít systemctl enable rc-local
ke spuštění rc.local
okamžitě.
Stále však platí, že rc.local je zastaralý. Manuál pro systemd-rc-local-generator
uvádí:„Podpora pro /etc/rc.local je poskytována pouze pro kompatibilitu se specifickými systémy System V. Důrazně se však doporučuje nepoužívat tento skript dnes a místo toho poskytnout správné soubory jednotek s vhodnými závislostmi pro všechny skripty, které se spouštějí během procesu spouštění.“
Zdroje
-
Linux Filesystem Hierarchical Standard (FHS) DataBook pro Linux
-
Informace o GNU GRUB
-
GNU GRUB manuál
-
Hlavní spouštěcí záznam
-
Specifikace multiboot
-
systemd informace
-
proces spouštění systemd
-
systemd index manuálových stránek
-
Úvod do procesu spouštění a spouštění Linuxu
[Chcete vyzkoušet Red Hat Enterprise Linux? Stáhněte si jej nyní zdarma.]