Analizar el proceso de instalación en Linux sistema de ficheros raíz

  
 

Uno: Introducción descubierto hace algún tiempo en tiempo de compilación del kernel no monta en rootfs. La misma opción de la raíz a la versión anterior de la imagen lata. Con el fin de resolver este problema. Estudiar un poco de rootfs proceso de montaje. Especial resume a continuación, espero que esta parte de los puntos de conocimiento amigos más confundido un poco de ayuda. Dos: rootfs especie en general, rootfs divididas en dos tipos: el virtual y el rootfs reales ahora rootfs tendencias del núcleo es más funciones en el espacio de usuario para completar. Con el fin de mantenerse delgada del núcleo. Una forma es por cada rootfs distribuciones de Linux fabricantes virtuales ampliamente utilizados. Una parte del trabajo inicial se puede colocar en la realización virtual de la rootfs. A continuación, cambie al sistema de archivos real en el proceso de desarrollo de rootfs virtuales. Hay varias versiones: initramfs: initramfs en la tecnología introducida en el kernel 2.5, de hecho, su significado es: un espejo unido a la cpio paquete kernel, cpio paquete que contiene un sistema de archivos pequeños, el núcleo comienza cuando cuando, el paquete kernel cpio desatado y liberado al sistema de archivos contenido en el mismo rootfs, una parte del código de inicialización del núcleo será colocado en el sistema de archivos, tal como se lleva a cabo un proceso de nivel de usuario. Tales beneficios obvios se simplifican código del núcleo de inicialización, y permite que el proceso de inicialización del núcleo más fácil de personalizar. Este rootfs de esta manera es incluir .cpio-initrd la imagen del núcleo de en: rootfs formato cpio

imagen-initrd: el formato tradicional de rootfs realizadas en estos dos sistema de archivos virtual, por favor refiérase a su propio otra información de tres: el montaje del sistema de archivos rootfs proceso de aquí que es diferente del análisis rootfs rootfs anteriormente. Esto se refiere al momento de la inicialización del sistema radicular. Que los /nodos. Es el sistema de archivos rootfs en su memoria. Antes de esta parte de la < < > análisis proceso de arranque Linux; > el sistema de archivos, y se ha analizado. Para la continuidad del conocimiento de repetir aquí. Start_kernel () y agrave; mnt_init (): void __init mnt_init (void)

{… … … … init_rootfs (); init_mount_tree ();} Init_rootfs código es el siguiente: init_rootfs int __init (void)

{err int; err = bdi_init (&ramfs_backing_dev_info);

Si (err) Mensaje de retorno; err = register_filesystem (&rootfs_fs_type), si (err) bdi_destroy (&ramfs_backing_dev_info ); return err;} esta función es muy simple. Se rootfs registrada .init_mount_tree sistema de archivos () código es el siguiente: init_mount_tree __init static void (void)

{struct vfsmount * mnt; struct mnt_namespace * ns; struct raíz ruta; mnt = do_kern_mount (" rootfs " , 0, " rootfs ", NULL);

Si (IS_ERR (mNT)) pánico (" no se puede crear rootfs ");

ns = kmalloc (sizeof (* ns ), GFP_KERNEL); if (ns) pánico ("! no se puede asignar espacio de nombres inicial ");

atomic_set (&ns- > cuentan, 1); INIT_LIST_HEAD (&ns- > lista); init_waitqueue_head (&ns- > encuesta); ns- > evento = 0; list_add (&mnt- > mnt_list, &ns- > lista);

ns- > root = mnt; mnt- > mnt_ns = ns; init_task.nsproxy- > mnt_ns = ns; get_mnt_ns (ns); root.mnt = ns- > raíz; root.dentry = ns- > raíz > mnt_root; set_fs_pwd (current- > fs, &raíz); set_fs_root (current- > fs, &raíz);} aquí, se monta el sistema de archivos rootfs. Por defecto es el punto de montaje y " /y " directorio raíz del proceso de conmutación;. Pasado y el actual directorio es y " /y ". Este es el origen del directorio raíz. Pero aquí, sólo inicializado. Tras la finalización de la carga y otro sistema de archivos específico, generalmente el directorio raíz de un sistema de archivos específico. Así que después de que el sistema se inicia con el comando mount es un soporte rootfs invisibles información Cuatro: Montar el directorio raíz del sistema de archivos virtual ha sido colgar, se puede montar el sistema de archivos en un start_kernel específica () y agrave; .. rest_init () y agrave; kernel_init (): static int __init kernel_init (void * no se utiliza)

{… … … … do_basic_setup (); if (! ramdisk_execute_command)

ramdisk_execute_command = " /init ";

Si (sys_access ((const char * __user) ramdisk_execute_command, 0) = 0) {

ramdisk_execute_command = NULL;

prepare_namespace ();} /** Ok, hemos completado el arranque inicial, y

* estamos esencialmente en funcionamiento deshacerse de la Red

* segmentos initmem y empezar las cosas de modo de usuario. ..

* /init_post (); return 0;} do_basic_setup () es una función crítica, todos los módulos en el kernel directamente traducida están hechos en que se inicia. El siguiente fragmento de código: do_basic_setup __init static void (void)

{/* Los conductores enviar eventos de conexión en caliente * /init_workqueues (); usermodehelper_init (); driver_init (); init_irq_proc (); do_initcalls ();} Do_initcalls ( ) para iniciar todas las funciones en la sección __initcall_start y __initcall_end y estáticamente compilado en los módulos del núcleo será colocado en la entrada de esta sección. función de inicialización asociada con el sistema de archivos raíz será referenciado por la rootfs_initcall (). Tomando nota de la siguiente función de inicialización: rootfs_initcall (populate_rootfs); Eso sería llamar populate_rootfs en tiempo de inicialización del sistema para inicializar. Código es el siguiente: populate_rootfs __init static int (void)

{char * err = unpack_to_rootfs (__ initramfs_start, __ initramfs_end - __initramfs_start, 0); si (err) pánico (err), si (initrd_start) {#ifdef CONFIG_BLK_DEV_RAM

int fd; printk (KERN_INFO " comprobar si la imagen es initramfs ... ");

err = unpack_to_rootfs ((char *) initrd_start, España

Copyright © Conocimiento de Windows All Rights Reserved