Dlaczego w / bin znajduje się mieszanka dowiązań symbolicznych i dowiązań twardych?

10

Rozumiem różnicę techniczną między dowiązaniami symbolicznymi i dowiązaniami twardymi, jest to pytanie o ich użycie w praktyce, szczególnie jestem ciekawy, dlaczego oba są używane w pozornie podobnych warunkach: /binkatalogu.

Oto fragment jego wykazu w moim systemie:

~$ ls -lai /bin
total 10508
32770 drwxr-xr-x  2 root root    4096 Jun 14 11:47 .
    2 drwxr-xr-x 28 root root    4096 Sep  6 13:15 ..
  119 -rwxr-xr-x  1 root root  959120 Mar 28 22:02 bash
   2820 -rwxr-xr-x  3 root root   31112 Dec 15  2011 bunzip2
  127 -rwxr-xr-x  1 root root 1832016 Nov 16  2012 busybox
   2820 -rwxr-xr-x  3 root root   31112 Dec 15  2011 bzcat
 6191 lrwxrwxrwx  1 root root       6 Dec 15  2011 bzcmp -> bzdiff
 5640 -rwxr-xr-x  1 root root    2140 Dec 15  2011 bzdiff
 5872 lrwxrwxrwx  1 root root       6 Dec 15  2011 bzegrep -> bzgrep
 3520 -rwxr-xr-x  1 root root    4877 Dec 15  2011 bzexe
 6184 lrwxrwxrwx  1 root root       6 Dec 15  2011 bzfgrep -> bzgrep
 5397 -rwxr-xr-x  1 root root    3642 Dec 15  2011 bzgrep
   2820 -rwxr-xr-x  3 root root   31112 Dec 15  2011 bzip2
 2851 -rwxr-xr-x  1 root root   10336 Dec 15  2011 bzip2recover
 6189 lrwxrwxrwx  1 root root       6 Dec 15  2011 bzless -> bzmore
 5606 -rwxr-xr-x  1 root root    1297 Dec 15  2011 bzmore

Wciągnąłem hardlink do tego samego i-węzła dla lepszej widoczności. Więc są dowiązania stosowane w przypadku bzcmp, bzegrep, bzfgrep, bzlessi hardlinki w przypadku bzip2, bzcat, bunzip2?

Wszystkie są zwykłymi plikami (nie katalogami), znajdują się w jednym systemie plików, są narzędziami systemowymi, a nawet zostały stworzone do pracy z tym samym: archiwami bzip. Czy powody korzystania z linków / dowiązań symbolicznych w tym konkretnym przypadku mają charakter wyłącznie historyczny, czy czegoś brakuje?

Wyjaśnienie mojego pytania:

Ja nie pytając o:

  • Różnice techniczne między dowiązaniami symbolicznymi i dowiązaniami stałymi
  • Teoretyczne zalety i wady każdego z nich

Te pytania zostały poruszone w innych wątkach na SO. Próbuję zrozumieć, dlaczego w konkretnej sprawie podjęto różne decyzje: dla grupy powiązanych narzędzi systemowych. Technicznie rzecz biorąc, wszystkie mogły być dowiązaniami symbolicznymi lub wszystkie mogły być dowiązaniami stałymi, obie opcje działałyby (w obu przypadkach program nadal może dowiedzieć się, w jaki sposób jest wywoływany argv[0]). Chcę zrozumieć zamiar tutaj, jeśli istnieje.

Związane z:

Dmitrij Paszkiewicz
źródło
Myślę, że to zależy od opiekunów pakietu. np. uruchamiam gentoo, aw mojej /bintrzeciej kolumnie ls -laijest zawsze, 1więc wydaje się, że używam tylko miękkich linków. Jakiej dystrybucji używasz?
powtórka
Używam Ubuntu 12.04
Dmitry Pashkevich
1
Na pierwszy rzut oka wygląda to jakaś zasada typu: „hardlinks dla binariów, symlinks dla skryptów / wrapperów” .
peterph

Odpowiedzi:

5

Dlaczego warto korzystać z dowiązań twardych a dowiązań symbolicznych?

W tym scenariuszu istnieją przede wszystkim 3 zalety używania dowiązań twardych w stosunku do dowiązań symbolicznych.

Twarde linki

  1. W przypadku twardego łącza łącze wskazuje bezpośrednio na i-węzeł.
  2. Dowiązania twarde są jak posiadanie wielu kopii pliku wykonywalnego, ale z wykorzystaniem tylko jednego miejsca na dysku.
  3. Możesz zmienić nazwę dowolnej gałęzi twardego linku, nie przerywając niczego.

Linki symboliczne

  1. Link wskazuje na obiekt (który następnie z kolei wskazuje na i-węzeł).
  2. Mogą obejmować systemy plików, podczas gdy twarde łącza nie mogą.

Zalety łączenia w ogóle

Te linki istnieją, ponieważ wiele plików wykonywalnych zachowuje się inaczej w zależności od ich wywołania. Na przykład polecenia 2 bzlessi bzmoresą w rzeczywistości jeden wykonywalny bzmore. Plik wykonywalny będzie się różnie zachowywać w zależności od tego, które nazwy zostały użyte do jego wywołania.

Odbywa się to z różnych powodów. Oto niektóre z bardziej oczywistych:

  1. Łatwiej jest opracować jeden plik wykonywalny niż wiele
  2. Oszczędza miejsce na dysku
  3. Łatwiejsze wdrożenie

Dlaczego oba są używane?

Wybór jednej z tych aplikacji jest dyskusyjny. Każdy z nich może ułatwiać działanie jako alias, dzięki czemu pojedynczy plik wykonywalny może zostać przeciążony. To naprawdę kluczowa funkcja wykorzystywana przez twórców różnych programów tutaj.

Patrząc na FHS (Standard systemu plików) nawet określa go w ten sposób, że może to być jeden z nich.

fragment

Jeśli / bin / sh nie jest prawdziwą powłoką Bourne'a, musi to być twarde lub symboliczne łącze do prawdziwego polecenia powłoki.

Uzasadnieniem tego jest fakt, że sh i bash niekoniecznie zachowują się w ten sam sposób. Użycie dowiązania symbolicznego pozwala również użytkownikom łatwo zobaczyć, że / bin / sh nie jest prawdziwą powłoką Bourne'a.

...

...

Jeśli istnieją programy gunzip i zcat, muszą to być dowiązania symboliczne lub twarde do gzip. / bin / csh może być dowiązaniem symbolicznym do / bin / tcsh lub / usr / bin / tcsh.

Bibliografia

slm
źródło
Tak, rozumiem to, dziękuję, ale dlaczego czasami używa się dowiązań symbolicznych, a czasem hardlinków? To, co opisałeś, działałoby tak samo w obu przypadkach
Dmitrij Paszkiewicz
@DmitryPashkevich - OK Przeredagowałem moją odpowiedź, daj mi znać, czy tak jest lepiej.
slm
Może zadaję głupie pytanie, ale wydaje mi się, że wciąż nie ma na nie odpowiedzi :) Tak, znam techniczne różnice i zalety / wady dwóch rodzajów linków. Usiłuję zrozumieć konkretny przypadek: dlaczego w moim /bin/katalogu ZNAJDUJE SIĘ OBA hardlinki i dowiązania symboliczne ? Dlaczego twórcy tych narzędzi nie trzymali się jednego typu łącza?
Dmitrij Paszkiewicz
Zredagowałem moje pierwotne pytanie, aby (mam nadzieję) wyjaśnić
Dmitrij Paszkiewicz
@DmitryPashkevich - dodano trochę dodatkowej zawartości. Daj mi znać, jeśli to pomoże.
slm
5

Wygląda na to, że próbujesz dowiedzieć się na podstawie istniejącej praktyki, czy istnieje nietechniczna reguła, która mówi ci, jakiego rodzaju łącza użyć. (Mówię nietechnicznie, ponieważ znasz już techniczne powody, aby używać jednego nad drugim).

Odpowiedź brzmi: nie ma innej zasady. Ten przykład, który wskazałeś z bzip2pakietu Ubuntu, pokazuje tylko, że wielu programistów miesza je bez mnóstwa uprzedzeń. Wynika to z tego, że nie ma żadnych silnych wskazówek poza różnicami technicznymi, a różnice te są niewielkie.

Osobiście wolę zawsze używać dowiązań symbolicznych, ponieważ jestem gotów zapłacić za ich niewielki koszt w zamian za ich samodokumentację.

Inni programiści wybiorą twarde linki ze względu na ich niewielką wydajność.

Ten problem przypomina spacje vs. tabulacje lub dynamiczne vs. statyczne pisanie lub Emacs vs. vi , ale nie jest wystarczająco interesujący, aby wywołać świętą wojnę . Podobnie jak w przypadku bardziej interesujących bitew, istnieją powody, aby wybrać którąkolwiek z tych opcji, ale jeśli nie masz kogoś, kto ci powie, z której wybrać, możesz wybrać tę, która będzie dla ciebie bardziej sensowna.

Warren Young
źródło
1
Dziękujemy za podzielenie się swoją perspektywą! Myślę, że „samokontraktowanie” natury dowiązań symbolicznych jest często pomijane
Dmitrij Paszkiewicz w dniu