Cómo utilizar Busybox para crear un sistema de archivos raíz
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.