pasado en la sección Explicamos cómo crear y probar una imagen initramfs. En esta sección, queremos crear un directorio raíz mínimo (rootfs) y estático ve lugar de trabajo dinámico Vamos a explicar las diferencias entre los archivos.
Compilación estática y dinámica
Estático mientras que un archivo no necesita ninguna dependencia lugar de trabajo dinámico Un archivo compilado tiene dependencias. Para saber si un archivo es dinámico ldd se utiliza el comando.
$ ldd busybox no es un ejecutable dinámico $ ldd /bin/bash linux-vdso.so.1 (0x00007ffd63d6a000) libreadline.so.8 => /lib64/libreadline.so.8 (0x00007f6121182000) libtinfo.so.6 => /lib64 /libtinfo.so.6 (0x00007f6121141000) libc.so.6 => /lib64/libc.so.6 (0x00007f6120f71000) libtinfow.so.6 => /lib64/libtinfow.so.6 (0x00007f6120f30000) /lib64/ld- linux-x86-64.so.2 (0x00007f61212d2000)
Todos los archivos compilados dinámicos necesitan el archivo libc.so.6 y el archivo de interpretación ld-linux-x86-64.so.2. Aparte de eso, hay dependencias de bibliotecas adicionales que usa la aplicación. El árbol de dependencias de las distribuciones de Linux está construido teniendo esto en cuenta.
Ahora tengamos un código fuente en C como el que se muestra a continuación y compilemos este código fuente.
#incluir int main(){ puts("Hola Palabra"); devolver 0; }
# compilación dinámica gcc -o main.dynamic main.c # compilación estática gcc -o main.static main.c -static
Puede verificar ambos con el comando ldd.
Los archivos estáticos son más grandes porque todas las bibliotecas requeridas están incluidas en un solo archivo, lo que hace que aumente de tamaño. Es por eso que en las distribuciones, generalmente se prefiere la compilación dinámica a la estática.
Creando rootfs mínimos
Ahora desde un archivo compilado dinámico rootfs Vamos a crear. Para esto, primero copiemos nuestro archivo a un directorio vacío y presentar Averigüemos el nombre del intérprete usando el comando.
$ archivo principal principal: ejecutable circular LSB de 64 bits ELF, x86-64, versión 1 (SYSV), vinculado dinámicamente, intérprete /lib64/ld-linux-x86-64.so.2, para GNU/Linux 3.2.0, nota despojada
Burada /lib64/ld-linux-x86-64.so.2 El archivo debe estar en el mismo lugar en nuestro directorio. Por esta razón, abramos el directorio lib64 y copiémoslo en él.
$ mkdir lib64 $ instalar /lib64/ld-linux-x86-64.so.2 lib64/
Las distribuciones de Linux tienen el directorio /lib. Podemos enlazar nuestro directorio lib64 aquí.
$ ln -s lib64 lib
Ahora tambien ldd Encontremos sus dependencias usando el comando y copiémoslas también.
$ ldd main linux-vdso.so.1 (0x00007ffd1efe6000) libc.so.6 => /lib64/libc.so.6 (0x00007f0af6a13000) /lib64/ld-linux-x86-64.so.2 (0x00007f0af6bfe000) # intérprete No lo copiamos una segunda vez porque ya ha sido copiado. # linux-vdso.so.1 no se encuentra en el sistema como archivo. Proviene del kernel de Linux. Nosotros tampoco lo copiamos. # En este caso solo necesitamos copiar nuestro archivo libc.so.6. $ instalar /lib64/libc.so.6 lib64
Ahora hemos creado rootfs. Probar chroot /principal Podemos usar el comando.
$ chroot. /main HolaPalabra
Como puede ver, obtuvimos rootfs mínimos y lo ejecutamos. Si queremos, podemos cambiar nuestro directorio rootfs a initramfs. El archivo que compilamos /en eso Pongamos el archivo en su lugar y volvamos a empaquetarlo. Como sigue pánico del kernel dará error. Esto se debe a que el proceso principal del sistema (pid 1) no debe cerrarse.

initramfs El init en las distribuciones de linux se usa para montar la partición donde está instalado el sistema e iniciar el administrador de servicios en ella. Los administradores de servicios, por otro lado, están diseñados para no cerrarse nunca. Podemos evitar que se cierre cambiando el código C en este ejemplo de la siguiente manera.
#incluir int main(){ puts("Hola Palabra"); mientras(1); devolver 0; }
Ahora vamos a compilar y empaquetar nuestra imagen initramfs nuevamente.

Como puede ver, no recibimos un error de pánico del kernel porque nuestro código no sale.