инициализированный скрипт busybox.Гора не найдена - PullRequest
0 голосов
/ 22 июня 2019

Я работаю над тем, что кажется немного странным.

Базовая машина - Ubuntu 18.04.Я экспериментирую с созданием пользовательского сценария initramfs + init для использования с пользовательскими скомпилированными ядрами, которые используются с экземплярами qemu.

Из каталога, который я использую в качестве базы для initramfs:

[~/initramfs] $ find .
.
./proc
./root
./dev
./dev/console
./dev/sda1
./dev/null
./dev/tty
./sbin
./init
./etc
./lib64
./mnt
./mnt/root
./lib
./bin
./bin/busybox
./sys

Только основы, необходимые на данный момент.Двоичный файл busybox поступает из пакета busybox-static, и я подтвердил, что он статически выполняется:

[~/initramfs]$ ldd bin/busybox
        not a dynamic executable

В сценарии инициализации у меня есть:

#!/bin/busybox sh

mount -t proc none /proc
mount -t sysfs none /sys

echo "Hi there"

umount /sys
umount /proc

poweroff

Оттуда создайтеinitramfs.gz:

find . -print0 | cpio --null --create --verbose --format=newc | pigz --best > ~/initramfs.gz

Когда я устанавливаю это как целевой initrd для qemu, ядро ​​запускается, как и ожидалось, тогда:

[    0.777443] Run /init as init process
/init: line 3: mount: not found
/init: line 4: mount: not found
Hi there
/init: line 8: umount: not found
/init: line 9: umount: not found
/init: line 11: poweroff: not found

mount является частью busybox.Так что это странно.

Если я изменю сценарий инициализации и введу /bin/busybox sh в качестве первой команды, которая будет выполнена, я попаду в оболочку busybox, как и следовало ожидать.

[    0.789949] Run /init as init process


BusyBox v1.27.2 (Ubuntu 1:1.27.2-2ubuntu3.2) built-in shell (ash)
Enter 'help' for a list of built-in commands.

sh: can't access tty; job control turned off
/ # [    1.364618] input: ImExPS/2 Generic Explorer Mouse as /devices/platform/i8042/serio1/input/input3
[    1.386482] tsc: Refined TSC clocksource calibration: 3392.105 MHz
[    1.388387] clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x30e52cb7a6c, max_idle_ns: 440795310382 ns
[    1.391965] clocksource: Switched to clocksource tsc

/ #

А потом показывает справка:

/ # help
Built-in commands:
------------------
        . : [ [[ alias bg break cd chdir command continue echo eval exec[   71.772009] random: fast init done

        exit export false fg getopts hash help history jobs kill let
        local printf pwd read readonly return set shift source test times
        trap true type ulimit umask unalias unset wait [ [[ acpid adjtimex
        ar arp arping ash awk basename blkdiscard blockdev brctl bunzip2
        bzcat bzip2 cal cat chgrp chmod chown chpasswd chroot chvt clear
        cmp cp cpio crond crontab cttyhack cut date dc dd deallocvt depmod
        devmem df diff dirname dmesg dnsdomainname dos2unix dpkg dpkg-deb
        du dumpkmap dumpleases echo ed egrep env expand expr factor fallocate
        false fatattr fdisk fgrep find fold free freeramdisk fsfreeze
        fstrim ftpget ftpput getopt getty grep groups gunzip gzip halt
        head hexdump hostid hostname httpd hwclock i2cdetect i2cdump
        i2cget i2cset id ifconfig ifdown ifup init insmod ionice ip ipcalc
        ipneigh kill killall klogd last less link linux32 linux64 linuxrc
        ln loadfont loadkmap logger login logname logread losetup ls
        lsmod lsscsi lzcat lzma lzop md5sum mdev microcom mkdir mkdosfs
        mke2fs mkfifo mknod mkpasswd mkswap mktemp modinfo modprobe more
        mount mt mv nameif nc netstat nl nproc nsenter nslookup od openvt
        partprobe passwd paste patch pidof ping ping6 pivot_root poweroff
        printf ps pwd rdate readlink realpath reboot renice reset rev
        rm rmdir rmmod route rpm rpm2cpio run-parts sed seq setkeycodes
        setpriv setsid sh sha1sum sha256sum sha512sum shred shuf sleep
        sort ssl_client start-stop-daemon stat static-sh strings stty
        su sulogin svc swapoff swapon switch_root sync sysctl syslogd
        tac tail tar taskset tee telnet telnetd test tftp time timeout
        top touch tr traceroute traceroute6 true truncate tty tunctl
        ubirename udhcpc udhcpd uevent umount uname uncompress unexpand
        uniq unix2dos unlink unlzma unshare unxz unzip uptime usleep
        uudecode uuencode vconfig vi w watch watchdog wc wget which who
        whoami xargs xxd xz xzcat yes zcat

Итак, я иду искать маунт и обнаруживаю, что тоже не найдено.Да, это работает, если я добавляю его к / bin / busybox для прямого вызова ...:

/ # type mount
mount is mount
/ # which mount
sh: which: not found
/ # /bin/busybox which mount
/ #

и я могу успешно выполнить команды, если добавлю к ним / bin / busybox:

/ # /bin/busybox mount -t proc none /proc
/ #

Это кажется действительно случайным, что будет и что не сработает из busybox, что сработает, а что нет, например, находка - это хорошо:

/ # find
.
./test
./sys
./bin
./bin/busybox
./lib
./mnt
./mnt/root
./lib64
./etc
./init
./sbin
./proc
./root
./dev
./dev/tty
./dev/null
./dev/sda1
./dev/console

Я могу обойти это, предварительно добавив каждую команду в файле инициализации с помощью /bin/busybox, но я бы предпочел этого не делать, если мне не нужно!

1 Ответ

1 голос
/ 22 июня 2019

Вы должны сделать символическую ссылку на все нужные вам апплеты, например, ln -s /bin/busybox /bin/mount.См. ИСПОЛЬЗОВАНИЕ в документах busybox :

ИСПОЛЬЗОВАНИЕ

BusyBox - это двоичный файл с несколькими вызовами.Бинарный файл с несколькими вызовами - это исполняемая программа, которая выполняет ту же работу, что и несколько утилит.Это означает, что существует только один двоичный файл BusyBox, но этот двоичный файл действует как большое количество утилит.Это позволяет уменьшить размер BusyBox, поскольку все встроенные служебные программы (мы называем их апплетами) могут совместно использовать код для многих общих операций.

Вы также можете вызвать BusyBox, введя команду в качестве аргумента в командной строке.,Например, ввод

    /bin/busybox ls 

также приведет к тому, что BusyBox будет вести себя как 'ls'.

Конечно, добавление / bin / busybox 'в каждую команду будет болезненным.Поэтому большинство людей будут вызывать BusyBox, используя ссылки на двоичный файл BusyBox.

Например, ввод

    ln -s /bin/busybox ls
    ./ls

приведет к тому, что BusyBox будет вести себя как 'ls' (если команда 'ls' быласкомпилировано в BusyBox).Вообще говоря, вам никогда не нужно создавать все эти ссылки самостоятельно, поскольку система сборки BusyBox сделает это за вас, когда вы запустите команду 'make install'.

Если вы вызываете BusyBox без аргументов, он будетпредоставить вам список апплетов, которые были скомпилированы в ваш двоичный файл BusyBox.

Команды, которые работают без него, это те, которые реализованы как свободные от форков и поэтому могут вызываться как встроенные.

...