GNU/Linux >> Znalost Linux >  >> Linux

Portování starých návyků Sysvinit na Systemd?

Mám sérii skriptů, pomocí kterých jsem mohl nainstalovat a nakonfigurovat nově stabilní systémy Debianu. K automatickému spouštění programů používám /etc/rc.local ale pro ostatní případy jsem musel ručně změnit /etc/inittab soubor. Mám i další změny, jako je přidání --noclear na řádek 1:2345:respawn:/sbin/getty --noclear 38400 tty1 .

Protože jsem musel přizpůsobit proces vypínání, skončil jsem takto:

l0:0:wait:/etc/rc.halt 0
...
l6:6:wait:/etc/rc.halt 6

a můj /etc/rc.halt vypadá takto

#!/bin/sh
#   
# rc.halt
#   
# This script is executed when entering level 6/0 (on halt or reboot)

su - teststand -c "/home/teststand/stop_server.sh"  # my custom command

# making sure the halt/reboot process is resumed
test -n "${1}" && /etc/init.d/rc ${1}

exit 0

Dnes jsem poprvé instaloval nový Debian 8 s systemd jako výchozí init systém. Nepřemýšlel jsem o tom a nejprve mě překvapilo, že /etc/inittab soubor chyběl.

Na svých běžících systémech (@work &@home) stále spouštím své systémy s sysvinit a to je důvod, proč nemám žádné zkušenosti s systemd .

Vím, že mohu přejít na starý sysvinit ale chci vidět rozdíly s systemd . Kromě toho, že právě upravuji novou instalaci a nemám příliš mnoho času na její dokončení, proto teď nemám čas prohlížet si dokumentaci.

Moje otázka:existuje způsob, jak rychle změnit systemd chování, abych mohl přidat --noclear na getty a pomocí /etc/rc.halt jako výchozí bod pro restart/zastavení?

V podstatě mohu rychle importovat svůj starý inittab změní na systemd ?

Díky

Přijatá odpověď:

systemd není zpětně kompatibilní se systémem 5 init , pouze System 5 rc .

Správa systému ve stylu Linux System 5 se skládá ze dvou částí, init který běží jako proces #1 a rc která má na starosti spouštění start a stop skriptů. Ty jsou ve skutečnosti ze dvou odlišných balíčků v Debianu. init je z balíčku sysvinit; a rc je obvykle z balíčku sysv-rc, ale může být z balíčku file-rc nebo openrc.

/etc/inittab je konfigurační soubor zpracovaný init . systemd pro to neposkytuje žádný mechanismus zpětné kompatibility. Mechanismus zpětné kompatibility System 5 společnosti systemd je pouze pro System 5 rc , který spouští programy v /etc/init.d/ . (Je to pouze pro tuto specifickou variantu rc , navíc. systemd neimplementuje žádný mechanismus zpětné kompatibility pro konfigurační mechanismy file-rc a openrc.)

Toto není něco, co je specifické pro systemd. Spíše ne náhradní init/systémový manažer (s pouhou 1 výjimkou za tři desetiletí) zpracovává /etc/inittab .

Chcete-li službu nainstalovat do systemd, musíte použít mechanismy, které dělá podporu, konkrétně vlastní servisní jednotku soubory a (prostřednictvím generátoru, který se automaticky převádí na soubory jednotek) System 5 rc konfigurační soubory v /etc/init.d/ .

Zapomeňte na úrovně běhu.

Všechny tyto věci na úrovni běhu, se kterými pracujete, byly v operačních systémech systemd Linux prohlášeny za „zastaralé“. Neexistuje spustit úroveň 0 nebo 6 pro vstup. Neexistují bez několika náhradních dílů pro kompatibilitu.

Aby služba běžela při vypnutí, zřejmá odpověď, kterou mnozí dávají, je vytvořit servisní jednotku, která je WantedBy shutdown.target . To má však několik jemných úskalí. Lepší, ale méně zřejmá odpověď je vytvořit jinak normální servisní jednotku s DefaultDependencies=yes abyste zajistili, že bude v konfliktu s cílem vypnutí, a vložte jádro služby do ExecStop místo v ExecStart .

[Unit]
Documentation=https://unix.stackexchange.com/questions/233561/

[Service]
Type=oneshot
User=teststand
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/home/teststand/stop_server.sh

[Install]
WantedBy=multi-user.target

Neházejte svého vlastního dozorce Dæmona Poor Mana ve skriptu shellu.

Takové věci se vždy špatně píší.

Související:Vytvořit výstup tail -f na prasklé trubce?

Pokud je vaše „služba“ jednoduše spuštěním příkazu s názvem „stop_server.sh“, pak z toho vyplývá, že se jedná o skript, který zastaví server pod nějakým ručně vytvořeným systémem správy služeb shell-script.

Je to pro tyto špatně napsané, vratké, nespolehlivé a nebezpečné katastrofy:stop_server.sh stop_server.sh stop_server.sh stop_server.sh stop_server.sh stop_server.sh

Máte systemd. Využijte toho a spusťte jakoukoli službu, která je zde spuštěna, pomocí vhodných mechanismů správy služeb. Tento podivný ExecStop nebudete potřebovat -pouze služba, pokud uděláte skutečnou službu spustitelnou přes systemd s DefaultDependencies=true , protože systemd se o vypnutí služby postará v době vypnutí.

Vzít supervizora Poor Man's Dæmon do skriptu shell, který „spravuje“ jednu službu, a pak to zabalit do servisní jednotky systemd pro druhou službu, kterou pak člověk zařídí, aby se spustila při vypnutí, kdy cílem není nic jiného než spravovat první služba a nechat jej vypnout, když je systém zastaven nebo vypnut, je dobrý způsob, jak vstoupit do systemd House of Horror.

Svět chce, abyste si vyčistili obrazovku.

Nechci ne Jak Greg Wooledge a další zjistili, vymazat virtuální terminál mezi odhlášením a následným přihlášením je velmi proti proudu. Přítomnost citlivých výstupů od privilegovaných uživatelů nebo šéfů, které zůstaly po odhlášení, byla bezpečnostním problémem pro Unices (a vlastně i jiné operační systémy s časovým sdílením vzdáleného přístupu) od 70. let minulého století a vyžaduje hodně úsilí, aby se vše vrátilo zpět. věci, které lidé vložili, aby tomuto problému zabránili.

  • Mnoho systémů má clear_console standardně v jejich odhlašovacích skriptech shellu. (Toto je problematické samo o sobě, protože to nehraje dobře s grafickými programy běžícími na virtuálním terminálu jádra #1 a nefunguje s žádnými jinými druhy terminálů, virtuálními nebo skutečnými.)

    Tento příkaz musí být odstraněn.

  • Výchozí v programech getty zaměřených na virtuální terminály, jako je mingetty , je vymazat terminál. (Dělá to před přihlášením, což znamená, že výstup terminálu může zůstat nevymazán, pokud je zastavena přihlašovací služba TTY. Je ironií, že tuto funkci by bylo lepší umístit do login , který díky nezbytnostem PAM stále běží při odhlášení.)

    --noclear Chcete-li to zakázat, musí být nasazena možnost. To zahrnuje zapsání jednoho nebo více souborů přepisu souborů jednotek a změnu ExecStart nebo jednoduše přejděte na [email protected] v souboru místní jednotky vlastního návrhu.

  • [email protected] od společnosti systemd sady jednotek šablony TTYVTDisallocate=yes který instruuje systemd, aby vyčistil virtuální terminál jádra. (Toto opět nefunguje s žádnými jinými druhy terminálů, dokonce ani s virtuálními terminály v uživatelském prostoru, jak se částečně odráží v jeho názvu.)

    I toto musí být odstraněno, opět přepsáním nebo jinou šablonou služby, na kterou odkazuje [email protected] .

Další čtení

  • Jonathan de Boyne Pollard (2015). /etc/inittab je minulostí. . Často uváděné odpovědi.
  • https://unix.stackexchange.com/a/196014/5132
  • Jak spustit skript pomocí systemd těsně před vypnutím?
  • Jonathan de Boyne Pollard (2014). Nezneužívejte su pro zrušení uživatelských oprávnění. . Často uváděné odpovědi.
  • Greg Wooledge (2014-04-08). Stop Clearing My God Damned Console . Gregova Wiki.
  • Jonathan de Boyne Pollard (22. 8. 2015). Zamrznutí systému s několika ttys v Debianu Jessie . [email protected] debian-user.
  • https://unix.stackexchange.com/a/194218/5132
  • Jonathan de Boyne Pollard (2015). Systémový dům hrůzy . Často uváděné odpovědi.
Související:Dobré podrobné vysvětlení syntaxe /etc/network/interfaces?
Linux
  1. Linux – Jak nastavit výchozí afinitu CPU pro všechny démony v Systemd?

  2. Návratová hodnota x =os.system(..)

  3. Jaké jsou bezpečnostní důsledky systemd ve srovnání s systemv init?

  1. Rozdíl mezi těmito příkazy pro svržení linuxového serveru?

  2. pomocí časovačů systemd místo cronu

  3. Systém odmítá SSH a po instalaci systemd se zasekl při 'bootování'

  1. Linux – Jak zjistit, zda systém používá Sysv, Upstart nebo Systemd Initsystem?

  2. Centos – Jaký je rozdíl mezi /usr/lib/systemd/system a /etc/systemd/system?

  3. Fixing System nebyl zaveden s systemd as init system Error