initrd
initrd
linuxのルートファイルシステムをマウントする前に、initrdをルートファイルシステムとしてマウントして、各種設定(ドライバ)などをsるんですが、
Wikiより
initrd とinitramfs(Linux 2.6.13 以降利用可能)の2種類の方式があるが、文脈によってはこれらを総称してinitrdと呼んでいる場合もある
とのことで、initrdといいつつ、initramfsのことを指す場合があるとのことでした。結構なんでだろう〜って迷うときが多かったです。
init_post()
カーネルのinitを起動する箇所。これが実行される前にinitramfs/initrdのどちらかがメモリに展開されている。
initramfsの場合
initrdの場合
- 830の箇所以降からスクリプトを探し出して実行する、
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 }