Por que existem utilitários de internet no meu ramdisk inicial?

3

Eu tenho um ramdisk inicial bastante padronizado criado usando mkinitcpio . Estou no Arch GNU / Linux.

Algum tempo atrás eu fui jogado em uma concha de resgate e procurei o /bin do disco para ver o que estava disponível. Por alguma razão, havia um monte de utilitários que pareciam irrelevantes (pense em coisas como ping - por que você iria querer isso em um ambiente de resgate?).

alex@alexs-arch-imac:/tmp$ mkdir initramfs
alex@alexs-arch-imac:/tmp$ cd initramfs
alex@alexs-arch-imac:/tmp/initramfs$ cp /boot/initramfs-linux.img .
alex@alexs-arch-imac:/tmp/initramfs$ cat initramfs-linux.img | unlzma - > 

initramfs-linux # needed because unlzma complains that it doesn't recognize the .img extension
alex@alexs-arch-imac:/tmp/initramfs$ cpio -iV < initramfs-linux
.............................................................................................................................................................................................................................................................................................................................................................
24225 blocks
alex@alexs-arch-imac:/tmp/initramfs$ ls
bin  buildconfig  config  dev  etc  hooks  init  init_functions  initramfs-linux  initramfs-linux.img  lib  lib64  new_root  proc  run  sbin  shutdown  sys  tmp  usr  VERSION
alex@alexs-arch-imac:/tmp/initramfs$ ls -l bin
lrwxrwxrwx 1 alex alex 7 Mar 24 17:06 bin -> usr/bin
alex@alexs-arch-imac:/tmp/initramfs$ ls bin
[         blkid    chown       cttyhack  dirname  egrep    free    hexdump   ip       iptunnel  less      ls      mkfifo    mount       nslookup  ping6     readlink  route    sha1sum    stat              tac     touch    uniq    yes
[[        busybox  chroot      cut       dmesg    env      getopt  ifconfig  ipaddr   kbd_mode  ln        lsblk   mknod     mountpoint  openvt    poweroff  reboot    sed      sha256sum  strings           tail    true     uptime
ash       cat      clear       dd        dmsetup  expr     grep    init      iplink   kill      loadfont  lsmod   mktemp    mv          pgrep     printf    rm        seq      sha512sum  switch_root       telnet  udevadm  vi
awk       chgrp    cp          depmod    du       false    halt    insmod    iproute  killall   loadkmap  md5sum  modinfo   nc          pidof     ps        rmdir     setfont  sleep      sync              test    umount   wc
basename  chmod    cryptsetup  df        echo     findmnt  head    install   iprule   kmod      losetup   mkdir   modprobe  netstat     ping      pwd       rmmod     sh       sort       systemd-tmpfiles  tftp    uname    wget
alex@alexs-arch-imac:/tmp/initramfs$ 

Observe que a imagem tem os utilitários weirdest . Apenas olhando para ele, vejo wget , ping , telnet , sha1sum ... por que eles estão aqui?

Aqui está a saída do meu /etc/mkinitcpio.conf . Imagens foram geradas usando mkinitcpio -p linux .

# vim:set ft=sh
# MODULES
# The following modules are loaded before any boot hooks are
# run.  Advanced users may wish to specify all system modules
# in this array.  For instance:
#     MODULES="piix ide_disk reiserfs"
MODULES=""

# BINARIES
# This setting includes any additional binaries a given user may
# wish into the CPIO image.  This is run last, so it may be used to
# override the actual binaries included by a given hook
# BINARIES are dependency parsed, so you may safely ignore libraries
BINARIES=""

# FILES
# This setting is similar to BINARIES above, however, files are added
# as-is and are not parsed in any way.  This is useful for config files.
FILES=""

# HOOKS
# This is the most important setting in this file.  The HOOKS control the
# modules and scripts added to the image, and what happens at boot time.
# Order is important, and it is recommended that you do not change the
# order in which HOOKS are added.  Run 'mkinitcpio -H <hook name>' for
# help on a given hook.
# 'base' is _required_ unless you know precisely what you are doing.
# 'udev' is _required_ in order to automatically load modules
# 'filesystems' is _required_ unless you specify your fs modules in MODULES
# Examples:
##   This setup specifies all modules in the MODULES setting above.
##   No raid, lvm2, or encrypted root is needed.
#    HOOKS="base"
#
##   This setup will autodetect all modules for your system and should
##   work as a sane default
#    HOOKS="base udev autodetect block filesystems"
#
##   This setup will generate a 'full' image which supports most systems.
##   No autodetection is done.
#    HOOKS="base udev block filesystems"
#
##   This setup assembles a pata mdadm array with an encrypted root FS.
##   Note: See 'mkinitcpio -H mdadm' for more information on raid devices.
#    HOOKS="base udev block mdadm encrypt filesystems"
#
##   This setup loads an lvm2 volume group on a usb device.
#    HOOKS="base udev block lvm2 filesystems"
#
##   NOTE: If you have /usr on a separate partition, you MUST include the
#    usr, fsck and shutdown hooks.
HOOKS="base udev autodetect modconf keyboard block encrypt resume filesystems fsck shutdown"

# COMPRESSION
# Use this to compress the initramfs image. By default, gzip compression
# is used. Use 'cat' to create an uncompressed image.
#COMPRESSION="gzip"
#COMPRESSION="bzip2"
COMPRESSION="lzma"
#COMPRESSION="xz"
#COMPRESSION="lzop"
#COMPRESSION="lz4"

# COMPRESSION_OPTIONS
# Additional options for the compressor
#COMPRESSION_OPTIONS=""
    
por strugee 25.03.2014 / 01:26

3 respostas

6

Os ramdisks iniciais usam o Busybox para economizar espaço. Essencialmente, utilitários como mv e cp compartilham muita lógica comum - abra um descritor de arquivo, leia buffers na memória, etc. O Busybox basicamente coloca toda a lógica comum em um binário que muda a maneira como ele se comporta, dependendo do nome com o qual foi chamado. Vamos dar uma olhada nesse disco.

alex@alexs-arch-imac:/tmp/initramfs/bin$ ls -l
total 1308
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 [ -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 [[ -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 ash -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 awk -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 basename -> busybox
-rwxr-xr-x 1 alex alex  68840 Mar 24 17:06 blkid
-rwxr-xr-x 1 alex alex 287096 Mar 24 17:06 busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 cat -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 chgrp -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 chmod -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 chown -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 chroot -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 clear -> busybox
-rwxr-xr-x 1 alex alex 130272 Mar 24 17:06 cp
-rwxr-xr-x 1 alex alex  59264 Mar 24 17:06 cryptsetup
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 cttyhack -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 cut -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 dd -> busybox
lrwxrwxrwx 1 alex alex      4 Mar 24 17:06 depmod -> kmod
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 df -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 dirname -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 dmesg -> busybox
-r-xr-xr-x 1 alex alex  92227 Mar 24 17:06 dmsetup
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 du -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 echo -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 egrep -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 env -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 expr -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 false -> busybox
-rwxr-xr-x 1 alex alex  53696 Mar 24 17:06 findmnt
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 free -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 getopt -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 grep -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 halt -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 head -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 hexdump -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 ifconfig -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 init -> busybox
lrwxrwxrwx 1 alex alex      4 Mar 24 17:06 insmod -> kmod
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 install -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 ip -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 ipaddr -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 iplink -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 iproute -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 iprule -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 iptunnel -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 kbd_mode -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 kill -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 killall -> busybox
-rwxr-xr-x 1 alex alex 142424 Mar 24 17:06 kmod
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 less -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 ln -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 loadfont -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 loadkmap -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 losetup -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 ls -> busybox
-rwxr-xr-x 1 alex alex  70192 Mar 24 17:06 lsblk
lrwxrwxrwx 1 alex alex      4 Mar 24 17:06 lsmod -> kmod
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 md5sum -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 mkdir -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 mkfifo -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 mknod -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 mktemp -> busybox
lrwxrwxrwx 1 alex alex      4 Mar 24 17:06 modinfo -> kmod
lrwxrwxrwx 1 alex alex      4 Mar 24 17:06 modprobe -> kmod
-rwsr-xr-x 1 alex alex  40168 Mar 24 17:06 mount
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 mountpoint -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 mv -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 nc -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 netstat -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 nslookup -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 openvt -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 pgrep -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 pidof -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 ping -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 ping6 -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 poweroff -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 printf -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 ps -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 pwd -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 readlink -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 reboot -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 rm -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 rmdir -> busybox
lrwxrwxrwx 1 alex alex      4 Mar 24 17:06 rmmod -> kmod
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 route -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 sed -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 seq -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 setfont -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 sh -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 sha1sum -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 sha256sum -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 sha512sum -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 sleep -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 sort -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 stat -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 strings -> busybox
-rwxr-xr-x 1 alex alex  14816 Mar 24 17:06 switch_root
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 sync -> busybox
-rwxr-xr-x 1 alex alex  63992 Mar 24 17:06 systemd-tmpfiles
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 tac -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 tail -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 telnet -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 test -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 tftp -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 touch -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 true -> busybox
-rwxr-xr-x 1 alex alex 264696 Mar 24 17:06 udevadm
-rwsr-xr-x 1 alex alex  27616 Mar 24 17:06 umount
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 uname -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 uniq -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 uptime -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 vi -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 wc -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 wget -> busybox
lrwxrwxrwx 1 alex alex      7 Mar 24 17:06 yes -> busybox
alex@alexs-arch-imac:/tmp/initramfs/bin$ 

Como você pode ver, quase todos os binários dessa imagem estão vinculados ao Busybox.

alex@alexs-arch-imac:/tmp/initramfs/bin$ ls -l | grep --invert-match busybox -
total 1308
-rwxr-xr-x 1 alex alex  68840 Mar 24 17:06 blkid
-rwxr-xr-x 1 alex alex 130272 Mar 24 17:06 cp
-rwxr-xr-x 1 alex alex  59264 Mar 24 17:06 cryptsetup
lrwxrwxrwx 1 alex alex      4 Mar 24 17:06 depmod -> kmod
-r-xr-xr-x 1 alex alex  92227 Mar 24 17:06 dmsetup
-rwxr-xr-x 1 alex alex  53696 Mar 24 17:06 findmnt
lrwxrwxrwx 1 alex alex      4 Mar 24 17:06 insmod -> kmod
-rwxr-xr-x 1 alex alex 142424 Mar 24 17:06 kmod
-rwxr-xr-x 1 alex alex  70192 Mar 24 17:06 lsblk
lrwxrwxrwx 1 alex alex      4 Mar 24 17:06 lsmod -> kmod
lrwxrwxrwx 1 alex alex      4 Mar 24 17:06 modinfo -> kmod
lrwxrwxrwx 1 alex alex      4 Mar 24 17:06 modprobe -> kmod
-rwsr-xr-x 1 alex alex  40168 Mar 24 17:06 mount
lrwxrwxrwx 1 alex alex      4 Mar 24 17:06 rmmod -> kmod
-rwxr-xr-x 1 alex alex  14816 Mar 24 17:06 switch_root
-rwxr-xr-x 1 alex alex  63992 Mar 24 17:06 systemd-tmpfiles
-rwxr-xr-x 1 alex alex 264696 Mar 24 17:06 udevadm
-rwsr-xr-x 1 alex alex  27616 Mar 24 17:06 umount
alex@alexs-arch-imac:/tmp/initramfs/bin$ ls | wc -l # total number of files
116
alex@alexs-arch-imac:/tmp/initramfs/bin$ ls -l | grep --invert-match busybox - | grep --invert-match kmod | wc -l # number of real binaries minus two (busybox and kmod)
12

Existem 116 arquivos na imagem, mas apenas 14 deles são realmente binários. O resto são links simbólicos para kmod ou busybox .

Então: a razão pela qual existem tantos utilitários aleatórios é porque você também pode colocá-los lá. Os links simbólicos não ocupam espaço, e mesmo se você os removesse, a funcionalidade permaneceria no binário do Busybox, ocupando espaço. Como não há nenhum motivo real para remover todos os links, os empacotadores não o fazem.

Aqui está outra questão a considerar: por que não simplesmente remover a funcionalidade de rede do binário do Busybox? Como o @Gilles menciona, são casos legítimos (se não comuns) onde você precisaria de rede em um initcpio. Portanto, os empacotadores têm duas opções: uma, fazer o que eles fazem agora e incluir tudo isso, por padrão, ou duas funcionalidades de rede divididas em seu próprio mkinitcpio hook. O primeiro é fácil (basicamente você não faz nada) e custa uma quantia muito pequena, enquanto o segundo é muito complexo (mais uma vez, graças ao @Gilles por apontar isso) e os ganhos realmente não são significativos o suficiente para serem importantes. Portanto, os empacotadores saem de maneira inteligente e não fazem nada com a rede.

    
por 25.03.2014 / 01:26
5

Embora não seja uma configuração muito comum, algumas instalações possuem apenas um armazenamento local muito pequeno, ou mesmo nenhum, e recuperam o código de inicialização incluindo o kernel via TFTP . O kernel então monta seu sistema de arquivos raiz através da rede, e. com NFS . Para tais sistemas, ferramentas básicas de rede podem ser necessárias para localizar e montar o sistema de arquivos raiz.

O ramdisk inicial contém módulos do kernel correspondentes aos recursos necessários para montar o sistema de arquivos raiz, o pacote de utilitários BusyBox e mais alguns utilitários. O initramfs é montado com base nas necessidades do seu sistema por mkinitcpio (isso depende da distribuição, por exemplo, distribuições baseadas usam o programa similar mkinitramfs ). Cada driver é armazenado em um arquivo separado, portanto é possível reduzir os módulos do kernel no initramfs para apenas os necessários para o seu sistema (mas às custas de tornar seu sistema não inicializável em hardware diferente). BusyBox vem em um único binário contendo todos os recursos que foram escolhidos em tempo de compilação, então reduzi-lo implicaria recompilá-lo. A menos que você esteja criando um dispositivo incorporado com uma configuração estática e espaço limitado, não vale a pena a complexidade.

    
por 26.03.2014 / 01:53
4

Resposta curta, é uma retenção de onde veio o busybox . As probabilidades são baixas. Você precisará de acesso à rede a partir do ambiente de recuperação de inicialização. As probabilidades são ainda menores e você ainda tem um driver de rede disponível - os kernels de distribuição não os têm embutidos, e eles não estarão no initrd a menos que você colocá-los lá.

    
por 25.03.2014 / 01:51