BusyBox został zaprojektowany w dość nowatorski sposób, co może być dość mylące, gdy zaczniesz szperać w katalogach / bin.
Jak wskazali MSalters , BusyBox to tylko jeden plik wykonywalny. Ale zależy to od utworzenia dowiązania symbolicznego do tego pliku wykonywalnego dla każdego „polecenia” w nim zawartego. Znając nazwę dowiązania symbolicznego, z którym został uruchomiony, umie uruchomić funkcję C dla tego polecenia.
Tak więc początek mojego katalogu PuppyLinux 5.2.8 Lucid / bin wygląda jak ...
sh-4.1# ls -l
total 4889
lrwxrwxrwx 1 root root 7 2011-08-17 10:49 [ -> busybox
lrwxrwxrwx 1 root root 7 2011-08-17 10:49 [[ -> busybox
lrwxrwxrwx 1 root root 7 2011-08-17 10:49 addgroup -> busybox
lrwxrwxrwx 1 root root 7 2011-08-17 10:49 adduser -> busybox
lrwxrwxrwx 1 root root 7 2011-08-17 10:49 ash -> busybox
-rwxr-xr-x 1 root root 2844 2011-08-17 11:04 autologinroot
lrwxrwxrwx 1 root root 4 2011-08-17 10:49 awk -> gawk
lrwxrwxrwx 1 root root 7 2011-08-17 10:49 basename -> busybox
-rwxr-xr-x 1 root root 805960 2011-08-17 11:04 bash
-r-xr-xr-x 1 root root 6835 2011-01-21 01:29 bashbug
lrwxrwxrwx 1 root root 7 2011-08-17 10:49 bbconfig -> busybox
-rwxr-xr-x 1 root root 30200 2011-08-17 11:04 bunzip2
lrwxrwxrwx 1 root root 7 2011-08-17 10:49 bunzip2-BB-NOTUSED -> busybox
-rwxr-xr-x 1 root root 637960 2011-08-17 11:04 busybox
-rwxr-xr-x 1 root root 30200 2011-08-17 11:04 bzcat
lrwxrwxrwx 1 root root 7 2011-08-17 10:49 bzcat-BB-NOTUSED -> busybox
Zauważ, że większość poleceń to dowiązania symboliczne busybox
. Obejmuje to ash
bardzo minimalistyczną powłokę używaną głównie podczas operacji rozruchu. Zauważ też, że autor dystrybucji zdecydował się na dołączenie samodzielnych poleceń bunzip2
i bzcat
zamiast używać wersji busyboksa. Dowiązania symboliczne bunzip-BB-NOTUSED
i bzcat-BB-NOTUSED
nie są tak naprawdę konieczne, ale pomagają dokumentować, co się dzieje za cenę samego łącza symbolicznego.
Zauważ też, że lista katalogów, która zgłasza rozmiary dla celu dowiązań symbolicznych ( ls -lL
lub ls -l --dereference
) zamiast samego dowiązania symbolicznego, zgłosi rozmiar każdego polecenia tak samo, jak rozmiar busybox
. Zatem ta sama lista z -L
opcją pokazuje ...
sh-4.1# ls -lL
total 60402
-rwxr-xr-x 1 root root 637960 2011-08-17 11:04 [
-rwxr-xr-x 1 root root 637960 2011-08-17 11:04 [[
-rwxr-xr-x 1 root root 637960 2011-08-17 11:04 addgroup
-rwxr-xr-x 1 root root 637960 2011-08-17 11:04 adduser
-rwxr-xr-x 1 root root 637960 2011-08-17 11:04 ash
-rwxr-xr-x 1 root root 2844 2011-08-17 11:04 autologinroot
-rwxr-xr-x 1 root root 317880 2011-08-17 11:04 awk
-rwxr-xr-x 1 root root 637960 2011-08-17 11:04 basename
-rwxr-xr-x 1 root root 805960 2011-08-17 11:04 bash
-r-xr-xr-x 1 root root 6835 2011-01-21 01:29 bashbug
-rwxr-xr-x 1 root root 637960 2011-08-17 11:04 bbconfig
-rwxr-xr-x 1 root root 30200 2011-08-17 11:04 bunzip2
-rwxr-xr-x 1 root root 637960 2011-08-17 11:04 bunzip2-BB-NOTUSED
-rwxr-xr-x 1 root root 637960 2011-08-17 11:04 busybox
-rwxr-xr-x 1 root root 30200 2011-08-17 11:04 bzcat
-rwxr-xr-x 1 root root 637960 2011-08-17 11:04 bzcat-BB-NOTUSED
Celem BusyBox jest maksymalne ponowne wykorzystanie kodu w sobie, aby zminimalizować wymaganą pamięć i miejsce na dysku (tj. „Ślad”) dla wspólnego zestawu poleceń ... bez konieczności używania samej powłoki.
Bash i inne pociski osiągają to samo. Ale w tym celu implementują własne środowisko wiersza poleceń. Ten cel jest również jednym z powodów bardzo archaicznej składni wielu funkcji powłoki.
Obecnie używam tej „techniki BusyBox” do biblioteki funkcji Bash i łatwiejszych w użyciu opakowań dla różnych bashism . Pozwoliło mi to łatwo „rozszerzyć” komendy o --help
opcje i odpalić wersje GUI, jeśli są dostępne.