Sdílená paměť je způsob, jak sdílet stav mezi procesy. Sdílená paměť, jak již název napovídá, je metoda „sdílení“ dat mezi procesy. Oba procesy definují stejnou paměťovou oblast jako „sdílenou“ a mohou si pak vyměňovat informace pouhým zápisem do ní. To (bývalo a stále je poněkud) rychlejší než alternativa posílání zpráv mezi procesy prostřednictvím sítě nebo potrubí.
Pokud paměť vidíte jako prostředek k ukládání dat, soubor v systému souborů lze považovat za sdílenou paměť (tj. sdílený soubor). Je těžké počítat se sdílenou pamětí. Patří to k jednomu procesu? Oba? Ani? Pokud naivně sečteme paměť patřící více procesům, hrubě „přepočítáme“.
Jak název napovídá, sdílená (virtuální) paměť označuje virtuální paměť, kterou sdílí více než jeden proces a poté ji může používat více programů současně. Přestože virtuální paměť umožňuje procesům mít oddělené (virtuální) adresní prostory, jsou chvíle, kdy procesy potřebují ke sdílení paměti. Sdílená paměť (SHM) je další metodou meziprocesové komunikace (IPC), kdy několik procesů sdílí jeden kus paměti pro komunikaci.
Sdílená paměť poskytuje nejrychlejší způsob, jak si procesy vzájemně předávají velké množství dat. /dev/shm není nic jiného než implementace tradičního konceptu sdílené paměti. Je to účinný prostředek pro předávání dat mezi programy. Jeden program vytvoří paměťovou část, ke které mají přístup jiné procesy (pokud je to povoleno). To povede k urychlení práce na Linuxu.
Problém
Při každém restartu serveru se změní oprávnění /dev/shm:
$ ls -alrt /dev/ | grep shm drwxr-xr-t. 2 root root 60 jul 6 11:14 shm
Původní povolení (1777):
# ls -ld /dev/shm drwxrwxrwt. 2 root root 200 Aug 20 03:44 /dev/shm
Stávající oprávnění (1754):
$ ls -alrt /dev/ | grep shm drwxr-xr-t. 2 root root 60 jul 6 11:14 shm
Řešení
Příčinou problému je existující balíček initscripts [initscripts-9.49.37-1.0.1.el7_3.1.x86_64].
Řešení
Krok 1 :Maskování služby ( rhel-import-state):
# systemctl mask rhel-import-state
Krok 2 :Zkontrolujte stav služby. Bude vypadat podobně jako níže:
rhel-import-state.service Loaded: masked (/dev/null; bad) << Active: active (exited) since Fri 2017-07-21 18:28:05 EDT; 2 weeks 3 days ago Main PID: 600 (code=exited, status=0/SUCCESS) CGroup: /system.slice/rhel-import-state.service
Krok 3 :Restartujte počítač a ověřte, zda se stejný problém opakuje nebo ne.
Poznámka :Toto je akční plán řešení. Pro trvalé řešení upgradujte verzi balíčku initscripts na 9.49.39-1.0.1, která je součástí aktualizace CentOS/RHEL7 4.Vrácení změn
Změny můžete také vrátit zpět provedením níže uvedeného příkazu k odmaskování maskované služby.
# systemctl unmask rhel-import-state.service # systemctl status rhel-import-state.service