web-dev-qa-db-ja.com

最初のramdiskにインターネットユーティリティがあるのはなぜですか?

mkinitcpioを使用して作成されたかなり標準的な初期ramdiskがあります。私はArchGNU/Linuxを使用しています。

しばらく前、私はレスキューシェルに立ち寄り、RAMディスクの/binをざっと見て、何が利用できるかを確認しました。何らかの理由で、無関係と思われるユーティリティがたくさんありました(pingのようなものを考えてください-なぜレスキュー環境でそれが必要なのですか?)。

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$ 

画像にweirdestユーティリティがあることに注意してください。見ているだけで、wgetpingtelnetsha1sum...がわかります。なぜここにあるのですか?

これが私の/etc/mkinitcpio.confの出力です。画像は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=""
3
strugee

初期のramdiskはBusyboxを使用してスペースを節約します。基本的に、mvcpのようなユーティリティはすべて、多くの共通ロジックを共有します。ファイル記述子を開いたり、バッファをメモリに読み込んだりします。Busyboxは基本的に、すべての共通ロジックを1つのバイナリに入れて変更します。呼び出された名前に応じて動作します。そのRAMディスクを見てみましょう。

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$ 

ご覧のとおり、この画像のほぼすべてのバイナリが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

画像には116個のファイルがありますが、実際には14個だけがバイナリです。残りはkmodまたはbusyboxへのシンボリックリンクです。

だから:ランダムなユーティリティがたくさんある理由は、そこに入れたほうがいいからです。シンボリックリンクはスペースを占有せず、それらを削除しても、機能はBusyboxバイナリに残り、スペースを占有します。すべてのリンクを削除する本当の理由はないので、パッケージャーは削除しません。

考慮すべきもう1つの質問があります。Busyboxバイナリからネットワーク機能を単純に削除してみませんか? @Gillesが言及しているように、are initcpioでネットワークを必要とする正当な(一般的ではないにしても)ケースがあります。したがって、パッケージャには2つのオプションがあります。1つは現在行っていることを実行し、デフォルトですべてを含めるか、2つはネットワーク機能を独自のmkinitcpioフックに分割することです。前者は非常に簡単で(基本的に何もしません)、コストは非常にわずかですが、2番目は非常に複雑で(これを指摘してくれた@Gillesのおかげで)、利益は実際には問題になるほど重要ではありません。したがって、パッケージャは賢明な方法を取り、ネットワーキングには何もしません。

6
strugee

あまり一般的な設定ではありませんが、一部のインストールではローカルストレージが非常に小さいか、まったくない場合があり、カーネルを含むブートコードを [〜#〜] tftp [を介して取得します。 〜#〜] 。次に、カーネルはそのルートファイルシステムをネットワーク経由でマウントします。 with [〜#〜] nfs [〜#〜] 。このようなシステムの場合、ルートファイルシステムを見つけてマウントするために基本的なネットワークツールが必要になる場合があります。

初期のramdiskには、ルートファイルシステムのマウントに必要な機能に対応するカーネルモジュール、 BusyBox ユーティリティスイート、およびその他のいくつかのユーティリティが含まれています。 initramfsは、システムのニーズに基づいて mkinitcpio によってアセンブルされます(これはディストリビューションに依存します。たとえば、Debianベースのディストリビューションは同様のプログラムを使用します mkinitramfs )。各ドライバーは個別のファイルに保存されるため、initramfsのカーネルモジュールをシステムに必要なものだけに切り詰めることができます(ただし、システムを別のハードウェアで起動できなくするという犠牲を払って)。 BusyBoxは、コンパイル時に選択されたすべての機能を含む単一のバイナリで提供されるため、トリミングするには再コンパイルが必要になります。静的なセットアップと限られたスペースで組み込みデバイスを構築しているのでない限り、複雑にする価値はありません。

簡単に言えば、それはbusyboxがどこから来たのかを引き継いだものです。ブートリカバリ環境からのネットワークアクセスが必要になる可能性は低いです。オッズは偶数低いネットワークドライバーも利用できます-ディストリビューションカーネルにはそれらが組み込まれておらず、組み込まれていませんyouがそれらをそこに置かない限り、initrdにあります。

4
Ricky Beam