GNU/Linux >> Znalost Linux >  >> Linux

Nahrazení rc.local v systemd systémech Linux

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:

  1. BIOS Power-On Self-Test (POST)
  2. Boot loader (GRUB2)
  3. Jádro
  4. 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.]


Linux
  1. Linux – všechno je soubor?

  2. Souborové systémy Linux:Ext2 vs Ext3 vs Ext4

  3. Linux - Nahrazení mezer v názvech souborů

  1. Spravujte spouštění pomocí systemd

  2. Pochopení systemd při startu na Linuxu

  3. Vzdálená úprava pomocí lokálního editoru (Linux)

  1. Linux – jaké souborové systémy v systému Linux ukládají dobu vytvoření?

  2. Podporované a doporučené souborové systémy v systému Linux

  3. Linux du command bez procházení připojených souborových systémů