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ユーティリティがあることに注意してください。見ているだけで、wget
、ping
、telnet
、sha1sum
...がわかります。なぜここにあるのですか?
これが私の/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=""
初期のramdiskはBusyboxを使用してスペースを節約します。基本的に、mv
やcp
のようなユーティリティはすべて、多くの共通ロジックを共有します。ファイル記述子を開いたり、バッファをメモリに読み込んだりします。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のおかげで)、利益は実際には問題になるほど重要ではありません。したがって、パッケージャは賢明な方法を取り、ネットワーキングには何もしません。
あまり一般的な設定ではありませんが、一部のインストールではローカルストレージが非常に小さいか、まったくない場合があり、カーネルを含むブートコードを [〜#〜] tftp [を介して取得します。 〜#〜] 。次に、カーネルはそのルートファイルシステムをネットワーク経由でマウントします。 with [〜#〜] nfs [〜#〜] 。このようなシステムの場合、ルートファイルシステムを見つけてマウントするために基本的なネットワークツールが必要になる場合があります。
初期のramdiskには、ルートファイルシステムのマウントに必要な機能に対応するカーネルモジュール、 BusyBox ユーティリティスイート、およびその他のいくつかのユーティリティが含まれています。 initramfsは、システムのニーズに基づいて mkinitcpio によってアセンブルされます(これはディストリビューションに依存します。たとえば、Debianベースのディストリビューションは同様のプログラムを使用します mkinitramfs )。各ドライバーは個別のファイルに保存されるため、initramfsのカーネルモジュールをシステムに必要なものだけに切り詰めることができます(ただし、システムを別のハードウェアで起動できなくするという犠牲を払って)。 BusyBoxは、コンパイル時に選択されたすべての機能を含む単一のバイナリで提供されるため、トリミングするには再コンパイルが必要になります。静的なセットアップと限られたスペースで組み込みデバイスを構築しているのでない限り、複雑にする価値はありません。
簡単に言えば、それはbusybox
がどこから来たのかを引き継いだものです。ブートリカバリ環境からのネットワークアクセスが必要になる可能性は低いです。オッズは偶数低いネットワークドライバーも利用できます-ディストリビューションカーネルにはそれらが組み込まれておらず、組み込まれていませんyouがそれらをそこに置かない限り、initrdにあります。