Como gerar imagem initramfs com links de busybox?

7

Ter sido direcionado ao initramfs por uma resposta a minha pergunta anterior ( obrigado!), Eu tenho trabalhado em obter initramfs funcionando. Agora posso inicializar o kernel e soltá-lo em um prompt do shell, onde posso executar comandos do busybox, o que é incrível.

Aqui é onde estou preso-- há (pelo menos) dois métodos de geração de imagens initramfs:

  1. Passando ao kernel um caminho para uma hierarquia de diretório pré-construída a ser compactada
  2. Passando ao kernel o nome de um arquivo que lista os arquivos a serem incluídos.

O segundo método parecia um pouco mais limpo, então eu tenho usado isso.

Apenas para referência, aqui está minha lista de arquivos até o momento:

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

Infelizmente, aprendi que o busybox requer uma longa lista de links para servir como aliases para todos os seus diferentes comandos. Existe uma maneira de gerar a lista de todos esses comandos para que eu possa adicioná-lo à minha lista de arquivos?

Como alternativa, eu poderia alternar para o método 1, usando a hierarquia de diretórios pré-configurada, mas não sei como criar os nós / dev nesse caso.

Ambos os caminhos parecem confusos. Existe uma solução elegante para isso?

    
por pingswept 09.12.2010 / 22:59

3 respostas

4

Não é o kernel que está gerando o initramfs , é cpio . Então, o que você está realmente procurando é uma maneira de construir um arquivo cpio que contenha dispositivos, links simbólicos, etc.

Seu método 2 usa usr/gen_init_cpio na árvore de código-fonte do kernel para construir o arquivo cpio durante a construção do kernel. Essa é realmente uma boa maneira de construir um arquivo cpio sem ter que preencher o sistema de arquivos local primeiro (o que exigiria que o root criasse todos os dispositivos ou usasse o fakeroot ou um sistema de arquivos FUSE que não tenho certeza se já foi escrito). / p>

Tudo o que você está perdendo é gerar o arquivo de entrada para gen_init_cpio como uma etapa de compilação. Por exemplo. no shell:

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 …

Se você quiser refletir os links simbólicos para o busybox que estão presentes na sua árvore de construção, aqui está uma maneira (suponho que você esteja construindo no 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 )

Aqui está uma maneira de copiar todos os seus links simbólicos:

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

Para o busybox, talvez sua árvore de construção não tenha os links simbólicos e, em vez disso, você deseja criar um para cada utilitário compilado. A maneira mais simples de pensar é procurar em sua árvore de construção do busybox .*.o.cmd files: há um por comando gerado.

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
' _ {} +
    
por 09.12.2010 / 23:24
10

As primeiras linhas do initscript no meu initramfs são simples:

busybox --install -s

Cria os links simbólicos para você. Leva apenas um tempo imensuravelmente pequeno na minha placa de 500Mhz, possivelmente mais em hardware muito baixo, mas provavelmente gerenciável. Salva um monte de problemas lembrando-se de criar todos os links certos quando você atualiza BB ...

    
por 28.03.2011 / 19:33
3

Se você está no shell busybox (ash), não precisa se preocupar com aliases, pois eles serão executados como comandos por padrão, o IIRC. De qualquer forma, busybox --help fornece lista de comandos suportados. No meu caso, eles são:

% 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

No caso do primeiro método, você cria pelo comando mknod(1) . Por exemplo:

# mknod /my/dir/with/initrd/dev/console -m 644 c 5 0
    
por 09.12.2010 / 23:26