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 dologin
, 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ěnuExecStart
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 šablonyTTYVTDisallocate=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.