Nouja, met cp kan het iig goed fout gaan.
cp opent de source file om te lezen, en de destination file om te schrijven, en gooit dan de inhoud over. Hierbij wordt de destination file dus niet verwijderd, het is en blijft dezelfde file, alleen met een andere inhoud na het kopieren.
Het probleem is dat programma's die gestart zijn gebruik maken van die lib. Als je die library die op de HD staat wijzigt, dan wordt dat doorgevoerd in de draaiende programma's, en draaiende programma's hebben het er niet zo op dat een library die ze gebruiken onder hun neus wordt verbouwd
Wat gebeurt er dus? cp begint met kopieren, en wijzigt dus je libc6. *Elk* programma op je computer maakt van libc6 gebruik, dus *elk* programma gaat over de zeik. Kortom: haal het stof maar van je reset-knop.
Maar daar houdt het niet op... cp was aan het kopieren, maar tijdens het kopieren gaat ook cp zelf over de zeik. Daarom is je libc6 deels oude, deels nieuwe lib. Gevolg: geen enkel prog wil nog starten, dus booten wil ook niet echt opschieten.
Hoe moet je je libc6 dan wel (handmatig) upgraden?
Verwijder de oude, en kopieer/move een nieuwe naar /lib .
Als je een file die in gebruik is door een of meer processes verwijdert dmv de unlink() system call, dan wordt die file niet meteen verwijderd door de kernel. De directory-entry wordt wel verwijderd, dus de file is niet meer zichtbaar, maar de data zelf blijft gewoon staan, zodat het process dat de file open heeft nog van de file gebruik kan maken.
Als een draaiend process tegen een library gelinkt is, dan heeft dat process die library open. Als je libc6 dus verwijdert, dan blijven processes dus gebruik maken van die onzichtbare file waarvan alleen nog de data bestaat. Als je dan een nieuwe libc6 naar die plaats kopieert, dan maken nieuw gestarte processes gebruik van die nieuwe libc6, en processes van voor de upgrade van de oude.
De oude file wordt pas echt verwijderd op het moment dat geen enkel process hem nog open heeft.
Dat verwijderen, nieuwe file maken is ook de manier waarop rpm en dpkg files vervangen (onder andere vanwege bovenstaande reden). Wat me meteen tot het volgende leidt: waarom niet libc6 upgraden via een rpm? Of zijn die niet goed te vinden voor E-smith?
Bovenstaande wijsheid heb ik trouwens sinds ik "strip *" deed in /usr/lib op een remote bak. Vond (onder andere) ssh niet lief
Je kunt het zelf uit proberen door een of andere file (een plaatje bv) over een library heen te kopieren. Als je bijvoorbeeld /usr/lib/libgnome zo verneukt, dan storten alle draaiende gnome progs als kaartenhuizen in elkaar
Als je dit wil proberen dan spreekt het voor zich dat je een backup van de lib in kwestie moet maken (zodat je het daarna weer werkend kunt maken), en dat je geen al te cruciale lib moet uitzoeken