在早期启动阶段,linux内核使用一种ram磁盘来访问模块。出于好奇,我想了解我有一个问题: 在这个阶段,包含initramfs/initrd的文件必须可供内核访问。这意味着内核必须支持适当的文件系统。那么,为什么initramfs的内容不能和普通文件在同一个文件系统中呢?为什么不只是纯文件而不是initramfs或initrd?
1
A
回答
1
它可以。 initrd映像不需要引导,但大多数使用它。但是,这样做可以让您为文件系统设置不同的设置。例如,在使用非ext2文件系统(NFS?XFS?),使用RAID时,或在不常用设备(USB驱动器?带有unionfs的CDROM?)上托管根文件系统时,通常需要initrd。
这当然可以通过编译适当的文件系统或RAID驱动程序到您的内核来避免,但这会使您的内核变大。
6
包含initramfs/initrd的文件在此阶段必须可供内核访问。
这似乎是你的困惑的心脏:它不是内核,读取的initramfs/initrd的,这是引导程序!内核不需要知道如何访问initramfs/initrd。这是练习的整个点!
引导加载程序将initramfs/initrd加载到内存中,并且有一个明确定义的通信协议,它允许引导加载程序告诉内核它在哪个内存地址加载了initramfs/initrd。
对于initramfs,initramfs映像也可以附加到内核映像。
1
第一个引导程序(可能是LILO或Grub)使用BIOS调用从引导驱动器读取内核映像。然后它将控制权交给刚刚放在系统RAM中的内核。
内核不使用BIOS调用来访问磁盘。在内核启动时,它会扫描系统中的设备,并为系统中的每个设备加载设备驱动程序模块,安装根文件系统并启动第一个用户进程。
但是等待:内核如何加载设备驱动程序模块,以便磁盘子系统被加载?这里有一个鸡与鸡蛋的问题,你需要访问磁盘以获取允许你访问磁盘的设备驱动程序。
解决方法是将所有这些驱动程序放入初始ramdisk(initrd);该引导加载程序读取该ramdisk映像,并将其与内核一起放入RAM中,并为内核提供进入根文件系统所需的一组驱动程序。
没有这个,你将需要所有的驱动程序来访问内核的根文件系统。
相关问题
- 1. Initrd,Ramdisk,Initramfs,uclinux
- 2. 为什么此java邮件以纯文本而不是html作为收件人?
- 3. 这是什么编码/为什么这些.txt文件不是纯文本?
- 4. 输出为HTML而不是纯文本
- 5. 为什么=而不是:?
- 6. 为什么不是DbConnection而不是SqlConnection或OracleConnection?
- 7. ajax成功功能是打印[object Object]而不是纯文本。为什么?
- 8. 为什么“从文件读取”不是纯函数?
- 9. 为什么Bootstrap使用Javascript而不是纯CSS?
- 10. jQuery Flip:为什么只有我的文字转而不是.card?
- 11. 为什么要用div.classname,而不是只是.classname
- 12. 为什么只是参考而不是价值?
- 13. 使用ObjectId而不是纯String的优点是什么?
- 14. 为什么DateTime.Now.Year是int而不是ushort
- 15. 'num_of_cmt'是4而不是2。为什么?
- 16. 为什么retainCount是0而不是1?
- 17. 为什么我应该选择Crystal Report或SSRS而不是纯HTML表格?
- 18. wsimport .wsdl:为什么生成.class文件而不是.java文件?
- 19. 为什么libtool寻找.lib文件而不是.a文件?
- 20. 是什么,而不
- 21. 为什么我不添加到文件而不是覆盖?
- 22. 为什么总是TECH_DISCOVERED或TAG_DISCOVERED而不是NDEF_DISCOVERED?
- 23. 为什么Symfony2 File-> getMimeType()为CSS文件返回文本/纯文本而不是文本/ CSS?
- 24. 为什么为(;;)而不是while(1)?
- 25. Fluentd纯文本输出,而不是JSON
- 26. Android的 - 为什么是IMarketBillingService文件的IADL文件,而不是的.java
- 27. 为什么此代码只读取第一行而不是整个.txt文件?
- 28. 为什么不能我只是使用公共财产,而不是在
- 29. 这是为什么不从txt文件
- 30. C - 为什么printf不只是打印?
简洁明了!我学到了东西。 –