Upgradovali jste svou knihovnu libc (nejzákladnější systémovou knihovnu) a nyní nefunguje žádný program. Abych byl přesný, žádný dynamicky propojený program nefunguje.
Ve vašem konkrétním scénáři by restartování mělo fungovat. Nyní nainstalovaná knihovna libc vyžaduje novější jádro a pokud restartujete, měli byste získat toto novější jádro.
Dokud máte stále běžící shell, často existuje způsob, jak se zotavit, ale může to být složité, pokud jste to neplánovali. Pokud nemáte shell, pak obvykle neexistuje jiné řešení než restartování.
Zde se možná nebudete moci obnovit bez restartu, ale můžete alespoň snadno zjistit, jaké jádro běží. Stačí použít způsob čtení /proc/version
který nevyžaduje externí příkaz.
read v </proc/version; echo $v
echo $(</proc/version) # in zsh/bash/ksh
Pokud stále máte kopii staré knihovny libc, můžete s ní spouštět programy. Pokud je například stará knihovna libc v /old/lib
a máte spustitelné soubory, které fungují s touto starou knihovnou libc v /old/bin
, můžete spustit
LD_LIBRARY_PATH=/old/lib /old/lib/ld-linux.so.2 /old/bin/uname
Pokud máte nějaké staticky propojené binární soubory, budou stále fungovat. Doporučuji nainstalovat statisticky propojené systémové nástroje pro tento druh problému (ale musíte to udělat dříve, než problém začne). Například na Debian/Ubuntu/Mint/… nainstalujte jeden nebo více z busybox-static (sbírka základních nástrojů příkazového řádku Linuxu včetně shellu), sash (shell s několika vestavěnými moduly navíc), zsh-static (jen shell, ale s několika vestavěnými užitečnými nástroji).
busybox-static uname
sash -c '-cat /proc/version'
zsh-static -c '</proc/version'
Zdá se, že to je chyba, kterou glibc vyvolá, pokud běží na jádře, které je starší než to, co je knihovna zkompilována, aby podporovala. Chybová zpráva je v DL_SYSDEP_OSCHECK(FATAL)
makro v sysdeps/unix/sysv/linux/dl-osinfo.h
K tomu existuje možnost kompilace:
--enable-kernel=version
Tato možnost je v současnosti užitečná pouze na systémech GNU/Linux. Parametr verze by měl mít tvar X.Y.Z a popisuje nejmenší verzi linuxového jádra, kterou má generovaná knihovna podporovat. Čím vyšší je číslo verze, tím méně kódu kompatibility je přidáno a tím rychlejší je kód.
Zdá se tedy, že z nějakého důvodu používáte systém se starým jádrem, ale nainstalovaným glibc, které již staré jádro nepodporuje. Jak jste to získali, je těžké říct bez informací o tom, o jaký systém se jedná, ale dalo by se předpokládat, že k tomu může dojít, pokud je knihovna aktualizována, ale jádro nikoli.
file
Zdá se, že ukazuje minimální verzi vyžadovanou spustitelným souborem nebo knihovnou (ale samozřejmě potřebujete funkční knihovnu k jejímu spuštění):
/lib/x86_64-linux-gnu/libc-2.23.so: ELF 64-bit LSB shared object, x86-64, ..., for GNU/Linux 2.6.32, stripped
Na mých poloaktuálních systémech Debian je požadovaná verze jádra 2.6.32
jak je uvedeno výše u všech binárních souborů, které jsem zkontroloval, takže je docela nepravděpodobné, že by došlo k problému s verzí jádra.
Zkuste to s tímto:
cat /proc/version