Red de conocimiento informático - Material del sitio web - Cómo utilizar Busybox para crear un sistema de archivos raíz

Cómo utilizar Busybox para crear un sistema de archivos raíz

Seleccione la versión de Busybox-1.9.2.tar.bz2 y compílela estáticamente, es decir, el Busybox generado se ejecutará sin soporte de biblioteca ***. De esta manera, no necesitamos implementar la biblioteca. La desventaja es que los programas arm-linux escritos por usted mismo no podrán ejecutarse en este sistema de archivos raíz debido a la falta de soporte para la biblioteca habilitada para ****. Pero no se preocupe, siempre que la biblioteca del compilador arm-linux-gcc del host esté montada en /lib de arm-linux en la computadora de destino mediante montaje NFS, podemos ejecutar nuestro propio programa perfectamente.

Ahora, comencemos a crear el sistema de archivos raíz para la biblioteca de enlaces estáticos.

1. Prepare el sistema de archivos raíz

Primero, prepare la herramienta BusyBox 1.9.2.

Prepare la herramienta de compilación cruzada arm-linux-gcc 3.3.2.

Crea una carpeta para rootfs en la máquina

#mkdir rootfs

Crea una carpeta para linux en rootfs. Crear carpetas típicas de sistemas Linux en rootfs

#cd rootfs

#mkdir root home bin sbin etc dev usr lib tmp mnt sys proc

#mkdir usr/ lib usr/bin

#pwd

/home/su/rootfs

2. Descomprima el paquete de código fuente

# tar xjf. ocupadobox-1.9.2.tar.bz2

#cd ocupadobox-1.9.2

3 Modificar el Makefile,

#vi Makefile

.

Cambie

CROSS_COMPILE ?=

en el Makefile a

CROSS_COMPILE ? = /usr/local/arm/3.3.2/bin/ arm -linux-

Nota: Esta versión de Busybox tiene algunos problemas al compilar con arm-linux-gcc 3.4.1, pero se compila normalmente cuando se usa 3.3.2.

4. Personalizar ocupadobox

Seleccionar todos los archivos ejecutables en ocupadobox

#make defconfig

Ir a opciones de configuración

p>

#make menuconfig

Establecer método de compilación estático

Configuración de Busybox ---gt; opciones de compilación ---gt [*] Construir BusyBox como estático; binario (Sin biblioteca compartida)

Configuración de Busybox ---gt; Opciones de instalación ---gt; Ingrese la ruta /home/su/rootfs donde se encuentra el archivo para crear el sistema de archivos raíz.

Otros valores predeterminados.

Seleccione [*] para compilar BusyBox como un archivo binario estático (sin bibliotecas compartidas), guarde y salga

5. Ejecute make para compilar

#make

Error de compilación, la información es la siguiente:

applets/applets.c:15:2: advertencia: #advertencia los enlaces estáticos contra glibc producirán un archivo ejecutable incorrecto

applets/applets.c:16:2: advertencia: #advertencia (glibc no se adapta bien a ld --gc-sections).

applets/applets.c:17:2: advertencia: #advertencia Consulte fuentes.redhat.com/bugzilla/show_bug.cgi?id=3400

applets/applets.c:18:2:

applets/applets.c: 19: 2: advertencia: #advertencia Si aún desea hacerlo, elimine -Wl, --gc-sections

applets/applets.c: 20: 2: advertencia: #advertencia de scripts/trylink y elimine esta advertencia.

applets/applets.c:21:2: advertencia: #applets.c:21:2: error: #error Abortando la compilación.

make[1 ]: *** [applets/applets.o] Error 1

Sigue las indicaciones para modificar la línea 21 del archivo applets/applets.c y reemplaza <

#error Abortando compilación .

Coméntalo:

Ejecutar make y recompilar

#make

La compilación pasa, se crea Busybox y luego se ejecuta

#hacer instalación

. Busybox se instala en la ruta especificada /home/su/rootfs. Puede ver que hay un archivo liunxrc adicional en rootfs, y también hay muchos archivos adicionales en bin y sbin. Si observa uno de los archivos usando el comando ls -l, verá que es un enlace al vinculador de Busybox, por lo que la mayoría de los comandos que ejecutamos en la máquina de destino llamarán al archivo Busybox.

Si olvida especificar la ruta, se generará en el directorio temporal ocupadobox-1.9.2/_install.

6. Escriba un programa de inicialización en el directorio de configuración/etc (se puede omitir)

La forma más sencilla es copiar todos los archivos en ocupadobox-1.9.2/examples/. directorio bootflip Vaya al directorio Busybox-1.9.2/install.

2. Copie todos los archivos en/examples/bootfloppy/etc al directorio etc del archivo de destino

#cd /home/su/busybox-1.9 .2/examples/bootfloppy/etc

#cp -rf * /home/su/rootfs/etc

O puedes escribir estos archivos tú mismo.

7. Crear imagen rootfs

#mkcramfs rootfs rootfs.cramfs

8. Grabar rootfs.cramfs en la máquina de destino.

9. Ejecute la máquina de destino

En este momento, encontrará un mensaje de error:

No se puede abrir tty2

No se puede para abrir tty3

No se puede abrir tty4

Solución alternativa: elimine la tercera línea "tty2::askfirst:-bin/sh" del archivo /rootfs/etc/inittab .

Vuelve al paso 7 y hazlo de nuevo.

De hecho, el método de compilación dinámica es más adecuado para las necesidades del proyecto, por lo que el método dinámico se utiliza generalmente para compilar el sistema de archivos raíz. Si elige el método de compilación dinámica, el método general sigue siendo el mismo, pero existen algunas diferencias:

Una de las diferencias es:

Ir a opciones de configuración

#make menuconfig

Seleccionar método dinámico

Configuración de Busybox---gt; Opciones de compilación---gt [*] Crear libbusybox compartido

La segunda diferencia es:

Si elige el método de compilación dinámica, el compilador se cerrará automáticamente durante el proceso de compilación:

El mensaje de error anterior que aparece durante la compilación estática ya no aparecerá. aparecen, por lo que no es necesario realizar ninguna modificación en el programa, pero aún así debe compilarse con arm-linux-gcc 3.3.2; de lo contrario, se producirán errores. 3.2 compilar; de lo contrario, el problema persistirá.

La tercera diferencia (y la mayor diferencia) es:

Después de la compilación, debes ir a la biblioteca en el directorio rootfs y agregarle algunas bibliotecas.

p>

#cd /home/su/rootfs/lib

Aquí hay una pregunta, ¿cómo sé qué bibliotecas se necesitan para admitirlo?

La forma más sencilla es copiar toda la biblioteca lib desde arm-linux-gcc 3.3.2, lo cual es sencillo. Pero hay un problema con esto: el sistema de archivos raíz es muy grande.

Otro método es:

#cd /home/su/rootfs/bin

#arm-linux-readelf togetherbox grep compartido

Esto mostrará qué bibliotecas son necesarias para que el sistema esté en funcionamiento, luego copie las bibliotecas apropiadas en /home/su/rootfs/bin. /su/rootfs/lib. En términos generales, hay dos bibliotecas del sistema: ld-linux.so (un enlazador dinámico) y Glibc (una biblioteca c).

Glibc incluye:

ld-linux: enlazador dinámico, esencial

libc: biblioteca c estándar, esencial

libm: biblioteca de matemáticas, generalmente esencial

libdl: biblioteca **** cargada dinámicamente, utilizada con menos frecuencia

libcrypt: biblioteca adicional de cifrado, utilizada para programas que requieren verificación, utilizada con menos frecuencia

libpthread: hilo POSIX biblioteca, generalmente requerida

libpthread: biblioteca de subprocesos POSIX, generalmente requerida

Si necesitamos una biblioteca específica, podemos copiarla y el enlace simbólico correspondiente al directorio /lib del destino sistema de archivos raíz. Para simplificar, debe utilizar la opción -d o la opción -a al invocar el comando cp, que conserva la información completa del enlace simbólico.

Ejemplo:

#cp -a libc.so.6 /home/su/rootfs/lib/

Para reducir el tamaño de la biblioteca en tiempo de ejecución, Deberíamos usar la versión compilada cruzada (arm-linux-gcc 3.3.2) de la utilidad strip para procesar las bibliotecas en el sistema de archivos raíz, eliminando las tablas de símbolos y la información de depuración contenida en el binario.

Ejemplo:

#arm-linux-strip /home/su/rootfs/lib/*.so

Nota:

Cuando utilices togetherbox como sistema de archivos, ejecuta el comando make y el sistema mostrará inmediatamente:

Sin archivo /dev/null

Pero seguirá funcionando. p>

Pero finalmente compiló con éxito el sistema de archivos raíz. El problema es que al reiniciar el sistema Linux, la máquina no puede ingresar. El mensaje de error es el siguiente:

/etc/rc.d/rc.sysinit: línea 173: /dev/null: sistema de archivos de solo lectura

/etc/rc. d/rc .sysinit: línea 173: /dev/null: sistema de archivos de solo lectura

/etc/rc.d/rc.sysinit: línea 184: /dev/null: sistema de archivos de solo lectura

/etc/rc.d/rc.sysinit: Línea 184: /dev/null: Sistema de archivos de solo lectura

/etc/rc.d/rc.sysinit: Línea 200: /dev/null: sistema de archivos de sólo lectura

.

.

.

***Se produjo un error mientras comprobando el sistema de archivos.

***Te lleva al shell; el sistema se reiniciará

***Cuando sales del shell

***Cuando sales del shell

Establezca la contraseña de root para el sistema de archivos.

p>

Mantenga la contraseña de root

(o escriba Control-D para continuar):

Solución:

Ingrese la contraseña cuando se le solicite del usuario root, presione Enter, podrá ver

(Reparar el sistema de archivos) 1#:

Ingrese los comandos en orden:

(Reparar el sistema de archivos) 1# mount -n -o remount, rw /

(reparar el sistema de archivos) 1# rm -f /dev/null

(reparar el sistema de archivos) 1 # mknod -m 0666 /dev/null c 1 3

(Reparar el sistema de archivos) 1# reiniciar

Problema resuelto.