読者です 読者をやめる 読者になる 読者になる

initrd

initrd

linuxのルートファイルシステムをマウントする前に、initrdをルートファイルシステムとしてマウントして、各種設定(ドライバ)などをsるんですが、

Wikiより

initrd とinitramfs(Linux 2.6.13 以降利用可能)の2種類の方式があるが、文脈によってはこれらを総称してinitrdと呼んでいる場合もある

とのことで、initrdといいつつ、initramfsのことを指す場合があるとのことでした。結構なんでだろう〜って迷うときが多かったです。

init_post()

カーネルのinitを起動する箇所。これが実行される前にinitramfs/initrdのどちらかがメモリに展開されている。

  • initramfsの場合

    • run_init_process()でinitramfsの/initを実行して、その中のswitch_rootでlinuxのルートファイルシステムをマウントしてlinuxの/sbin/init が動き出す様子。
  • initrdの場合

798 /* This is a non __init function. Force it to be noinline otherwise gcc
799  * makes it inline to init() and it becomes part of init.text section
800  */
801 static noinline int init_post(void)
802 {
803         /* need to finish all async __init code before freeing the memory */
804         async_synchronize_full();
805         free_initmem();
806         mark_rodata_ro();
807         system_state = SYSTEM_RUNNING;
808         numa_default_policy();
809 
810 
811         current->signal->flags |= SIGNAL_UNKILLABLE;
812 
813         if (ramdisk_execute_command) {
814                 run_init_process(ramdisk_execute_command);
815                 printk(KERN_WARNING "Failed to execute %s\n",
816                                 ramdisk_execute_command);
817         }
818 
819         /*
820          * We try each of these until one succeeds.
821          *
822          * The Bourne shell can be used instead of init if we are
823          * trying to recover a really broken machine.
824          */
825         if (execute_command) {
826                 run_init_process(execute_command);
827                 printk(KERN_WARNING "Failed to execute %s.  Attempting "
828                                         "defaults...\n", execute_command);
829         }
830         run_init_process("/sbin/init");
831         run_init_process("/etc/init");
832         run_init_process("/bin/init");
833         run_init_process("/bin/sh");
834 
835         panic("No init found.  Try passing init= option to kernel. "
836               "See Linux Documentation/init.txt for guidance.");
837 }