Làm thế nào để tạo hình ảnh initramfs với các liên kết busybox?


7

Đã được chuyển đến initramfs bằng một câu trả lời cho câu hỏi trước đó của tôi (cảm ơn!), Tôi đã làm việc để initramfs hoạt động. Bây giờ tôi có thể khởi động kernel và thả vào dấu nhắc shell, nơi tôi có thể thực thi các lệnh busybox, điều này thật tuyệt vời.

Đây là nơi tôi bị mắc kẹt-- có (ít nhất) hai phương pháp tạo hình ảnh initramfs:

  1. Bằng cách chuyển kernel, một đường dẫn đến hệ thống phân cấp thư mục dựng sẵn sẽ được nén
  2. Bằng cách chuyển kernel, tên của một tệp liệt kê các tệp được đưa vào.

Phương pháp thứ hai có vẻ sạch hơn một chút, vì vậy tôi đã sử dụng phương pháp đó.

Chỉ để tham khảo, đây là danh sách tập tin của tôi cho đến nay:

dir /dev 755 0 0
nod /dev/console 644 0 0 c 5 1
nod /dev/loop0 644 0 0 b 7 0
dir /bin 755 1000 1000
slink /bin/sh busybox 777 0 0
file /bin/busybox /home/brandon/rascal-initramfs/bin/busybox 755 0 0
dir /proc 755 0 0
dir /sys 755 0 0
dir /mnt 755 0 0
file /init /home/brandon/rascal-initramfs/init.sh 755 0 0

Thật không may, tôi đã học được rằng busybox yêu cầu một danh sách dài các liên kết để đóng vai trò là bí danh cho tất cả các lệnh khác nhau của nó. Có cách nào để tạo danh sách tất cả các lệnh này để tôi có thể thêm nó vào danh sách tệp của mình không?

Ngoài ra, tôi có thể chuyển sang phương thức 1, sử dụng hệ thống phân cấp thư mục dựng sẵn, nhưng tôi không chắc cách tạo các nút / dev trong trường hợp đó.

Cả hai con đường này có vẻ lộn xộn. Có một giải pháp thanh lịch cho điều này?


Bạn đã xem xét câu trả lời của user6113 chưa? Nó dường như là một câu trả lời tốt cho câu hỏi của bạn.
Léo Léopold Hertz

Câu trả lời:


4

Đó không phải là hạt nhân tạo ra initramfs , đó là cpio . Vì vậy, những gì bạn thực sự tìm kiếm là một cách để xây dựng một kho lưu trữ cpio có chứa các thiết bị, liên kết tượng trưng, ​​v.v.

Phương pháp 2 của bạn sử dụng usr/gen_init_cpiotrong cây nguồn kernel để xây dựng kho lưu trữ cpio trong quá trình xây dựng kernel. Đó thực sự là một cách tốt để xây dựng kho lưu trữ cpio mà không cần phải điền hệ thống tệp cục bộ trước (cần phải có quyền root để tạo tất cả các thiết bị hoặc sử dụng fakeroot hoặc hệ thống tệp FUSE mà tôi không chắc đã được viết).

Tất cả những gì bạn thiếu là tạo tệp đầu vào thành gen_init_cpiobước xây dựng. Ví dụ trong vỏ:

INITRAMFS_SOURCE_DIR=/home/brandon/rascal-initramfs
exec >initramfs_source.txt
echo "dir /bin 755 0 0"
echo "file /bin/busybox $INITRAMFS_SOURCE_DIR/bin/busybox 755 0 0"
for x in sh ls cp …; do echo "slink /bin/$x busybox 777 0 0" done
# etc …

Nếu bạn muốn phản ánh các liên kết tượng trưng đến busybox có trong cây xây dựng của bạn, thì đây là một cách (tôi giả sử bạn đang xây dựng trên Linux):

( cd "$INITRAMFS_SOURCE_DIR/bin" &&
  for x in *; do
    if [ "$(readlink "$x")" = busybox ]; then
      echo "slink /bin/$x busybox 777 0 0"
    fi
  done )

Đây là một cách để sao chép tất cả các liên kết tượng trưng của bạn:

find "$INITRAMFS_SOURCE_DIR" -type l -printf 'slink %p %l 777 0 0\n'

Đối với busybox, có thể cây xây dựng của bạn không có liên kết tượng trưng và thay vào đó bạn muốn tạo một liên kết cho mọi tiện ích bạn đã biên dịch. Cách đơn giản nhất tôi có thể nghĩ đến là xem qua cây xây dựng busybox của bạn để tìm .*.o.cmdtệp: có một lệnh được tạo.

find /path/to/busybox/build/tree -name '.*.cmd' -exec sh -c '
    for x; do
      x=${x##*/.}
      echo "slink /bin/${x%%.*} busybox 777 0 0"
    done
' _ {} +

Trên thực tế bạn không thiếu bước đăng? Tức là chỉ sau 'Chỉ để tham khảo, đây là danh sách tệp của tôi cho đến nay:'?
Maciej Piechotka

1
@Maciej: Điểm hay, tôi đã không nghĩ đến cách giải thích câu hỏi đó, nhưng phù hợp với khả năng của busybox thực thi với thế hệ initramfs dù sao cũng là một ý tưởng hay.
Gilles 'SO- ngừng trở nên xấu xa'

10

Một vài dòng đầu tiên của initscript trong initramfs của tôi chỉ đơn giản là:

busybox --install -s

Tạo các liên kết tượng trưng cho bạn .. Chỉ mất một lượng thời gian nhỏ không thể đo được trên bảng 500Mhz của tôi, có thể lâu hơn trên phần cứng rất thấp, nhưng có thể quản lý được. Lưu một loạt các vấn đề ghi nhớ để tạo tất cả các liên kết phù hợp khi bạn cập nhật BB ...


3

Nếu bạn đang ở trong vỏ hộp bận rộn (tro), bạn không cần phải lo lắng về bí danh vì chúng sẽ được chạy dưới dạng các lệnh theo mặc định IIRC. Dù sao busybox --helpđưa ra danh sách các lệnh được hỗ trợ. Trong trường hợp của tôi, họ là:

% busybox --help
BusyBox v1.17.4 (2010-11-25 12:49:55 GMT) multi-call binary.
Copyright (C) 1998-2009 Erik Andersen, Rob Landley, Denys Vlasenko
and others. Licensed under GPLv2.
See source distribution for full notice.

Usage: busybox [function] [arguments]...
   or: function [arguments]...

    BusyBox is a multi-call binary that combines many common Unix
    utilities into a single executable.  Most people will create a
    link to busybox for each function they wish to use and BusyBox
    will act like whatever it was invoked as.

Currently defined functions:
    [, [[, acpid, addgroup, adduser, adjtimex, ar, arp, arping, ash, awk,
    basename, bb, bbconfig, bbsh, beep, blkid, bootchartd, brctl, bunzip2,
    bzcat, bzip2, cal, cat, catv, chat, chattr, chgrp, chmod, chown,
    chpasswd, chpst, chroot, chrt, chvt, cksum, clear, cmp, comm, conspy,
    cp, cpio, crond, cryptpw, cttyhack, cut, date, dd, deallocvt, delgroup,
    deluser, depmod, devmem, df, dhcprelay, diff, dirname, dmesg,
    dnsdomainname, dos2unix, dpkg-deb, du, dumpkmap, dumpleases, echo, ed,
    egrep, eject, env, envdir, envuidgid, ether-wake, expand, expr, false,
    fbset, fdflush, fdformat, fdisk, fgconsole, fgrep, find, findfs,
    flash_eraseall, flash_lock, flash_unlock, flashcp, flock, free,
    freeramdisk, fsck, fsck.minix, fsync, ftpd, fuser, getopt, getty, grep,
    gunzip, gzip, halt, hd, hdparm, head, hexdump, hostname, httpd,
    hwclock, id, ifconfig, ifdown, ifenslave, ifplugd, ifup, init, insmod,
    install, ionice, ip, ipaddr, ipcrm, ipcs, iplink, iproute, iprule,
    iptunnel, kbd_mode, kill, killall, killall5, klogd, last, length, less,
    linux32, linux64, linuxrc, ln, loadfont, loadkmap, logger, login,
    logread, losetup, lpq, lpr, ls, lsattr, lsmod, lspci, lsusb, lzcat,
    lzma, lzop, lzopcat, makedevs, makemime, man, md5sum, mdev, mesg,
    microcom, mkdir, mkdosfs, mke2fs, mkfifo, mkfs.ext2, mkfs.minix,
    mkfs.reiser, mkfs.vfat, mknod, mkpasswd, mkswap, mktemp, modinfo,
    modprobe, more, mount, mountpoint, mt, mv, nameif, nc, netstat, nice,
    nmeter, nohup, nslookup, ntpd, openvt, passwd, patch, pgrep, pidof,
    ping, ping6, pipe_progress, pivot_root, pkill, popmaildir, poweroff,
    printenv, printf, ps, pscan, pwd, raidautorun, rdate, rdev, readahead,
    readlink, readprofile, realpath, reboot, reformime, renice, reset,
    resize, rev, rm, rmdir, rmmod, route, rtcwake, run-parts, runlevel,
    runsv, runsvdir, rx, script, scriptreplay, sed, sendmail, seq, setarch,
    setconsole, setfont, setkeycodes, setlogcons, setsid, setuidgid, sh,
    sha1sum, sha256sum, sha512sum, showkey, sleep, smemcap, softlimit,
    sort, split, start-stop-daemon, stat, strings, stty, su, sum, sv,
    svlogd, swapoff, swapon, switch_root, sync, sysctl, syslogd, tac, tail,
    tar, tee, telnet, telnetd, test, tftp, tftpd, time, timeout, top,
    touch, tr, traceroute, traceroute6, true, tty, ttysize, tunctl,
    tune2fs, ubiattach, ubidetach, udhcpc, udhcpd, umount, uname,
    uncompress, unexpand, uniq, unix2dos, unlzma, unlzop, unxz, unzip,
    uptime, usleep, vconfig, vi, vlock, volname, wall, watch, watchdog, wc,
    wget, which, who, whoami, xargs, xz, xzcat, yes, zcat, zcip

Trong trường hợp phương pháp đầu tiên bạn tạo bằng mknod(1)lệnh. Ví dụ:

# mknod /my/dir/with/initrd/dev/console -m 644 c 5 0

Trong trường hợp của OP, busybox --helpcó khả năng chỉ dẫn đến busybox: cannot execute binary file... Hầu hết sự phát triển được nhúng là biên dịch chéo, chúng tôi biết pingswept đang biên dịch cho arm và có lẽ anh ta đang biên dịch trên i386 hoặc amd64.
Gilles 'SO- ngừng trở nên xấu xa'

Vâng, đó là thực sự đúng. Tôi có thể chạy busybox - trợ giúp một khi tôi khởi động kernel trên bo mạch ARM. Điều đó hữu ích, nhưng nó không giúp ích nhiều cho việc tạo hình ảnh initramfs.
pingswept

@Gilles: Tôi giả sử rằng ai đó đã biên dịch kernel đã nghĩ về và, ví dụ, chạy trong trình giả lập. @pingswept: Có thể danh sách trên sẽ giúp ích.
Maciej Piechotka

Tại nơi làm việc, môi trường xây dựng tự động của chúng tôi không có quyền truy cập vào trình giả lập. Tôi nghĩ rằng đây là chuẩn mực trong phát triển nhúng.
Gilles 'SO- ngừng trở nên xấu xa'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.