Parę słów odnośnie różnicy między programami cp i install, czyli o tym jakie niemiłe skutki może spowodować instalowanie programów i bibliotek poprzez cp, zamiast install. Podstawowa „składnia” obu programów jest podobna, na pierwszy rzut oka wydaje się, że oba programy robią dokładnie to samo, jednak jak się często zdarza diabeł tkwi w szczegółach.
Dla przykładu, jeśli spróbujemy zaktualizować /bin/top
który jest właśnie uruchomiony, przy pomocy cp to dostaniemy komunikat o błędzie w stylu: „cp: nie można utworzyć zwykłego pliku „top”: Plik wykonywalny zajęty
„. Jeśli spróbujemy tą metodą zaktualizować jakąś bibliotekę np. /lib/libc.so.6
to w starszych linuks’ach dostaniemy komunikat analogiczny jak przy próbie nadpisania/aktualizacji uruchomionego programu np. /bin/top
, natomiast w nowszych wywalimy każdy działający program w ułamku sekundy! Natomiast program/polecenie install wykona to bez problemów zarówno dla działającego programu jak i dla urzywanej biblioteki!
Powodem wywoływania błędu przez cp jest to, że Linux (oraz wszystkie współczesne Unix’y i MS Windows’y) wykorzystują do ładowania plików wykonywalnych i bibliotek współdzielonych mapowanie pamięci (mmap). Zawartość pliku wykonywalnego lub biblioteki współdzielonej jest mapowana do liniowej przestrzeni adresowej procesu. W związku z tym wszystkie zmiany w pliku oddziałują na przestrzeń adresową procesu i mogą spowodować jego zatrzymanie.
Jak „install” rozwiązuje ten problem? Bardzo prosto — odłącza plik przed zapisem nowego. Wtedy stary plik nie występuje już w drzewie katalogu, ale wciąż jest na dysku dopóki działa ostatni odwołujący się do niego proces, a nowy plik jest zapisywany w innym węźle (ang. inode). W ten sposób programy uruchomione przed aktualizacją używają starej wersji, a te uruchomione po aktualizacji nowej i wszystkie są szczęśliwe.
Ponadto polecenie install, posiada nie tylko funkcjonalność prawidłowego kopiowania plików wykonywalnych. Jako bonus dostajemy także możliwość tworzenia katalogów na kopiowane pliki, zmiany praw dostępu oraz właściciela i grupę zstępując w ten sposób nie tylko cp, ale także mkdir, chmod, chown.