内核启动参数init

init
---------------------------------------------------
    Linux kernel启动的最后,在内核源码的linux-2.6.24/init/main.c文件的init_post()函数中可以看到:

    if (execute_command) {
        run_init_process(execute_command);
        printk(KERN_WARNING "Failed to execute %s. Attempting "
                    "defaults.../n", execute_command);
    }
    run_init_process("/sbin/init");
    run_init_process("/etc/init");
    run_init_process("/bin/init");
    run_init_process("/bin/sh");

    panic("No init found. Try passing init= option to kernel.");

    即系统会按照上述顺序,逐次运行作为init的进程。当有任何一个进程被成功运行时,run_init_process()函数将不再返回。全局字符数组 execute_command保存了从系统启动命令行中传递的init参数。例如,系统启动参数包括init=/linuxrc,如果根文件系统中存在 文件/linuxrc,则它将被作为init进程的首选。

 

<think>好的,我现在需要帮助用户理解Linux内核启动参数中的noinitrd和init=/linuxrc的具体含义及作用。首先,我得回忆一下自己对这些参数的了解,并查阅提供的引用资料来确保准确性。 首先,用户提到的两个参数:noinitrd和init=/linuxrc。我需要分别解释它们的功能和用途,同时结合引用内容中的相关信息。 关于noinitrd参数,根据引用[3]中的描述,当内核配置了CONFIG_BLK_DEV_INITRD时,默认会支持initrd。initrd是一个初始化的RAM磁盘,用于在启动过程中装载临时根文件系统,直到真正的根文件系统被挂载。如果使用noinitrd参数,应该会禁用这个机制。那具体来说,noinitrd的作用是告诉内核不要解压并执行initrd,而是直接使用后续指定的根文件系统。这可能适用于不需要临时文件系统的情况,或者根文件系统已经可以直接访问的环境,比如嵌入式系统或者某些特定的硬件配置。 接下来是init=/linuxrc参数。引用[1]提到,init参数指定了内核启动后运行的第一个用户空间程序,通常是/sbin/init,但也可以是其他路径,比如/linuxrc。这里需要注意,/linuxrc通常是一个指向busybox的符号链接,尤其是在使用initrd的情况下。引用[2]提到,在initrd环境中,内核启动一个线程运行/linuxrc来完成初始化,比如挂载真正的根文件系统。而引用[3]也提到,linuxrc执行后会装载真正的根文件系统。因此,当用户指定init=/linuxrc时,内核会直接执行该脚本,而不是默认的init程序。这在initrd环境中常见,用于控制启动流程,比如在挂载真正的根文件系统前执行必要的操作。 不过,用户可能混淆了这两个参数的使用场景。例如,noinitrd可能和init=/linuxrc一起使用吗?根据引用[3],当使用initrd时,内核会执行/linuxrc来挂载真正的根文件系统。如果使用noinitrd,那么就不会有initrd的加载过程,因此/linuxrc可能不存在于根文件系统中,除非用户手动设置。这时候指定init=/linuxrc可能会导致启动失败,除非用户确保该路径下有可执行文件。 另外,引用[5]提到,在/etc/init.d/rcS中重复配置网络参数会导致问题,这说明启动脚本的执行顺序和参数设置的重要性。类似地,内核参数的正确使用对于启动流程至关重要。 总结下来,我需要分点解释这两个参数的功能和用途,并结合引用中的例子来说明它们在不同场景下的应用。同时,需要指出它们的关系和可能的注意事项,比如参数冲突或依赖条件。</think>### Linux内核启动参数`noinitrd`和`init=/linuxrc`的功能与用途 #### 1. **`noinitrd`参数** - **功能**:禁用初始化内存磁盘(initrd)机制。 - 默认情况下,若内核配置了`CONFIG_BLK_DEV_INITRD`,启动时会通过initrd加载临时根文件系统,完成硬件初始化或驱动加载后,再切换到真实根文件系统[^3]。 - 使用`noinitrd`时,内核会跳过这一过程,直接挂载指定的真实根文件系统(通过`root=`参数指定)[^3]。 - **典型场景**: - 当根文件系统可直接访问且无需临时初始化环境时(如某些嵌入式系统)。 - 调试阶段,需直接验证真实根文件系统的启动流程。 #### 2. **`init=/linuxrc`参数** - **功能**:指定内核启动后执行的第一个用户空间程序。 - 默认情况下,内核会尝试执行`/sbin/init`或`/etc/init`等标准初始化程序[^1]。 - 使用`init=/linuxrc`时,内核将直接执行根文件系统中的`/linuxrc`脚本(通常是一个符号链接,如指向BusyBox)[^2]。 - **典型场景**: - **搭配initrd使用**:在initrd环境中,`/linuxrc`负责挂载真实根文件系统并切换(例如加载驱动或解密文件系统)[^2][^3]。 - **定制启动流程**:跳过传统初始化系统(如systemd或SysVinit),直接运行自定义脚本。 #### 3. **参数组合与注意事项** - **冲突场景**: - 若同时使用`noinitrd`和`init=/linuxrc`,需确保真实根文件系统中存在`/linuxrc`,否则会导致启动失败。 - 在无initrd的环境中,`/linuxrc`需自行完成硬件初始化和根文件系统挂载。 - **调试技巧**: - 当根文件系统挂载失败时,可通过`init=/bin/sh`进入紧急Shell环境进行修复[^5]。 - 避免重复配置参数(如IP地址在启动参数和脚本中同时设置),否则可能导致网络初始化异常[^5]。 #### 4. **示例启动命令** ```bash # 使用initrd的标准流程 kernel /vmlinuz root=/dev/sda1 initrd=/initrd.img init=/linuxrc # 禁用initrd并直接运行自定义初始化程序 kernel /vmlinuz root=/dev/nfs noinitrd init=/my_custom_init ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值