linux下的initrd问题~

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux下的initrd问题~相关的知识,希望对你有一定的参考价值。

initrd里面有些驱动程序用已安装驱动的,我对这个驱动这块不明白,主要是平时我们插入硬盘时直接硬盘自动安装驱动为什么在linux里就不能自动安装驱动还需要把相应的驱动程序拿出来单独放在一个地方?!

首先来说,很多驱动程序并没有被编译进内核,而是作为一个LKM存在,这样减轻了内核的负担也增加了驱动加载的灵活性。
再来,对于initrd---全名init ram disk,它确切的来说使用一个文件模拟的一个磁盘分区,这个文件里面就放了一些必要的程序库,以及驱动程序模块。
在linux驱动过程中,它最终要去挂载真正的根分区(物理分区),那么首先就要在内存中加载内核镜像和initrd文件,解压initrd文件以后,然后挂载这个模拟的文件系统,这个时候,就相当于用内存模拟了硬盘,而还没有真正接触到物理硬盘。所以,ram disk由此而来。然后,内核在ramdisk下,加载硬盘驱动,如scsi的,然后才能控制硬盘,挂载分区,并切换到真正的根分区之上……
所以,initrd起到一个中间转换的作用,但据我所知,initrd也并非必须,比如ide的硬盘驱动直接编译进内核……
你想,假如硬盘驱动没有被编译进内核,那么在启动操作的系统的过程中,需要驱动,但是驱动程序又存放在了硬盘之上,但是你又没有加载硬盘驱动不能访问硬盘,则不是陷入了一个矛盾的问题嘛,所以,用内存模拟硬盘来存放驱动,然后加载就可以访问硬盘了……不能说不佩服这些大神

说了个大概,可以多多交流一下 。不明白可以high我追问

我不明白的是平时我们新买的一块硬盘刚插入计算机时会自动安装相关驱动程序,如果是一个新型的硬盘,电脑里没有他的相关驱动而驱动在硬盘里这就是蛋和鸡的问题,可为什么它会自动安装而在linux里就因为蛋与鸡的问题不能安装了?!

追答

首先,你要知道。你买的硬盘它只是一个硬件,它其中是一些硬件电路。而驱动程序,是软件,提供驱动程序的是,内核本身以及可加载内核模块。
所以,在你安装操作系统的时候,那么内核及其相关的驱动就会被安装拷贝到硬盘。

你所谓的自动安装:

我的理解,第一:如果机器现在只有一张硬盘,那么你肯定要给它装操作系统,在这个 过程中,驱动(内核)存放在外部介质如光盘之中,安装就可以识别硬盘。

第二:你现在机器已经在运行,有一块硬盘,你上第二块硬盘。硬盘不是热插拔的,你要重启,就回到了操作系统启动的加载驱动的过程。

你要理解驱动只是一段程序……

参考技术A 因为 Linux 内核是巨内核,也就是宏内核。
所有驱动如果放入内核,会导致占地面积很大。所以,把内核驱动独立出来,再需要的时候载入就可以很好的解决内核的内存占用和压力。内核里面只存放最少量的必备驱动。

不过驱动独立出来,有个问题就是什么时候载入。
计算机在开机时,内存里面没有任何东西,驱动都在硬盘上。而硬盘控制器(也就是所谓的硬盘驱动)也在硬盘上。

之后就有一个先有鸡还是先有蛋的问题了:读取硬盘需要驱动,但驱动在硬盘里。这样实际就不能读取驱动了。
这样,就有了 initrd ,initrd 的作用是把一些数据存储在一个特殊格式文件里面,这个文件会随内核载入时一同载入到内存里面
这样,内核启动时,在还没有读取硬盘里面的驱动的时候,就已经有了一个可以读取的地方来读取数据(initrd 也需要驱动哦,不过这个驱动明显比所有硬盘控制器的驱动要小,地球上的主板芯片有很多种,还有很多其他的存储设备可以启动 Linux ,这些设备的驱动不可能都直接扔进内核里面)。

这就是 initrd 的作用,也就是 Linux 在内核启动阶段就可以提供一个存储空间来存放数据。这些数据不一定是驱动,也可以是别的东西,乃至一个完整的 Linux 根目录。

至于“主要是平时我们插入硬盘时直接硬盘自动安装驱动为什么在linux里就不能自动安装驱动还需要把相应的驱动程序拿出来单独放在一个地方?!”
我真没看懂你在说什么。
我觉得你连驱动是什么都还不知道吧……追问

我不明白的是平时我们新买的一块硬盘刚插入计算机时会自动安装相关驱动程序,如果是一个新型的硬盘,电脑里没有他的相关驱动而驱动在硬盘里这就是蛋和鸡的问题,可为什么它会自动安装而在linux里就因为蛋与鸡的问题不能安装了?!

追答

因为新买的硬盘驱动程序装到了老的硬盘里面了。而且驱动程序装了只是装了,被操作系统调用了才是真正有效。
单一个硬盘,Windows 下面的驱动程序实现是另一种方式,Windows 会先用磁盘控制器的兼容模式读取驱动程序,读取完驱动程序后,再用驱动程序实现正确的高性能模式启动。

Linux 用 initrd 而不是 Windows 那种直接启动,原因是 Linux 支持的文件系统更多,硬件控制器也更多,而且还支持网络启动(桌面版,服务器版,集群版,手机版,各种 CPU 架构,各种硬件设计的内核都是这一套东西,驱动非常多的)。initrd 可以在内存里面开辟一个驱动程序存储区域,在 GRUB 读取、启动 Linux 内核说一起载入,这样内核就可以实现按需载入而不需要去支持所有的存储设备。
而且,很多 Linux 的文件系统并不能直接拿来用的,有些还需要启动某些服务进程后才能读取这些文件系统,所以 initrd 不光是放驱动程序,还是用来存放这些服务程序的地方。

Windows 也有鸡和蛋的问题,一个最简单的例子就是 Windows XP 的 SP3 之前的版本。不支持 SATA 的 ICH 模式,这样,Windows XP 启动就需要硬盘的 SATA 驱动程序,但 SATA 驱动程序在硬盘里。没办法启动。Windows XP 的初始时直接读取硬盘导致的另一个问题就是那个装好驱动,就不能在 Bios 里面修改硬盘模式的 bug ,也类似鸡和蛋的问题。

initrd 就类似于 Windows 的用兼容方式读取驱动,只不过 initrd 是一个完整的文件系统放在内存里,Windows 是直接读取硬盘上对应位置的驱动程序文件。

还有,Windows 下面的驱动安装很多时候不是去“装”驱动,而是给设备增加相关的配置设置参数什么的内容。这样情况下,其实是没有新驱动载入的。

参考技术B initrd 就是在启动的时候建立的虚拟盘,利用initrd里的映像文件来加载模块,在kernel驱动完外部硬件后,虚拟盘也就被删除了

Liunx目录下的各个系统文件夹的作用

Linux根目录”/“下各个系统文件夹的含义和用途
/boot 该目录默认下存放的是Linux的启动文件和内核。
/initrd 它的英文含义是boot loader initialized RAM disk,就是由boot loader初始化的内存盘。在linux
内核启动前,boot loader会将存储介质(一般是硬盘)中的initrd文件加载到内存,内核启动时会在访问真正
的根文件系统前先访问该内存中的initrd文件系统。
/bin 该目录中存放Linux的常用命令。
/sbin 该目录用来存放系统管理员使用的管理程序。
/var 该目录存放那些经常被修改的文件,包括各种日志、数据文件。
/etc 该目录存放系统管理时要用到的各种配置文件和子目录,例如网络配置文件、文件系统、X系统配置文
件、设备配置信息、设置用户信息等。
/dev 该目录包含了Linux系统中使用的所有外部设备,它实际上是访问这些外部设备的端口,访问这些外部
设备与访问一个文件或一个目录没有区别。
/mnt 临时将别的文件系统挂在该目录下。
/root 如果你是以超级用户的身份登录的,这个就是超级用户的主目录。
/home 如果建立一个名为“xx”的用户,那么在/home目录下就有一个对应的“/home/xx”路径,用来存放该
用户的主目录。
/usr 用户的应用程序和文件几乎都存放在该目录下。
/lib 该目录用来存放系统动态链接共享库,几乎所有的应用程序都会用到该目录下的共享库。
/opt 第三方软件在安装时默认会找这个目录,所以你没有安装此类软件时它是空的,但如果你一旦把它删除了
,以后在安装此类软件时就有可能碰到麻烦。
/tmp 用来存放不同程序执行时产生的临时文件,该目录会被系统自动清理干净。
/proc 可以在该目录下获取系统信息,这些信息是在内存中由系统自己产生的,该目录的内容不在硬盘上而
在内存里。
/misc 可以让多用户堆积和临时转移自己的文件。
/lost+found 该目录在大多数情况下都是空的。但当突然停电、或者非正常关机后,有些文件就临时存放在
这里。
文件颜色的含义:蓝色为文件夹;绿色是可执行文件;浅蓝色是链接文件;红框文件是加了SUID位,任意限
权;红色为压缩文件;褐色为设备文件。
参考技术A   对于linux新手来说,最感到迷惑的问题之一就是文件都存在哪里呢?特别是对于那些从windows转过来的新手来说,linux的目录结构看起来有些奇怪哦。所以,在这里讲一下linux下的主要目录以及它们都是用来干什么的。
  /
  This is the root directory. The mothership. The home field. The one and only top directory for your whole computer. Everything, and I mean EVERYTHING starts here. When you type '/home' what you're really saying is "start at / and then go to the home directory."
  /
  这就是根目录。对你的电脑来说,有且只有一个根目录。所有的东西,我是说所有的东西都是从这里开始。举个例子:当你在终端里输入“/home”,你其实是在告诉电脑,先从/(根目录)开始,再进入到home目录。
  /root
  This is where the root user lives. The root user is the god of your system. Root can do anything, up to and including removing your entire filesystem. So be careful using root.
  /root
  这是系统管理员(root user)的目录。对于系统来说,系统管理员就好比是上帝,它能对系统做任何事情,甚至包括删除你的文件。因此,请小心使用root帐号。
  /bin
  Here's where your standard linux utilities(read programs) live -- things like "ls" and "vi" and "more". Generally this directory is included in your path. What this means is that if you type 'ls', /bin is one of the places your shell will look to see if 'ls' means anything.
  /bin
  这里存放了标准的(或者说是缺省的)linux的工具,比如像“ls”、“vi”还有“more”等等。通常来说,这个目录已经包含在你的“path”系统变量里面了。什么意思呢?就是:当你在终端里输入ls,系统就会去/bin目录下面查找是不是有ls这个程序。
  /etc
  Here's where the administrative and system configuration stuff lives. For instance, if you have samba installed, and you want to modify the samba configuration files, you'd find them in /etc/samba.
  /etc
  这里主要存放了系统配置方面的文件。举个例子:你安装了samba这个套件,当你想要修改samba配置文件的时候,你会发现它们(配置文件)就在/etc/samba目录下。
  /dev
  Here's where files that control peripherals live. Talking to a printer? Your computer is doing it from here. Same goes for disk drives, usb devices, and other such stuff.
  /dev
  这里主要存放与设备(包括外设)有关的文件(unix和linux系统均把设备当成文件)。想连线打印机吗?系统就是从这个目录开始工作的。另外还有一些包括磁盘驱动、USB驱动等都放在这个目录。
参考技术B /bin:bin是binary(二进制)的缩写。这个目录是对UNIX系统习惯的沿袭,存放着使用者最经常使用的命令。例如:cp,ls,cat。  /boot:这里存放的是启动LINUX时使用的一些核心文件。  /dev:dev是device(设备)的缩写。这个目录下是所有LINUX的外部设备,其功能类似DOS下的.sys和Win下的.vxd。在LINUX中设备和文件是用同种方法访问的。例如:/dev/hda代表第一个物理IDE硬盘。  /etc:这个目录用来存放所有的系统管理所需要的配置文件和子目录。  /home:用户的主目录,比如说有个用户叫liubin,那他的主目录就是/home/liubin也可以用~liubin表示,说到这里,打个岔,你现应该明白在我们访问一些个人网页(如 http://www.liubin.net/~liubin)的时候,~liubin就是表示访问www.liubin.net站点中的用户liubin的用户主目录。更多内容请去 http://showyou.org/?p=50,他上面有更全面的! 参考技术C 参考资料: http://www.diybl.com/course/6_system/linux/Linuxjs/2007114/84049.html 参考技术D 详细查看这里 http://blog.163.com/zhangbaoqiang68@126/blog/static/29797565200931845836680/

以上是关于linux下的initrd问题~的主要内容,如果未能解决你的问题,请参考以下文章

linux下如何制作initrd镜像?

linux 如何查看一个软连接实际指向的文件的位置

安装Linux ubuntu 用过Linux的进

uefi下如何启动linux?

2-2 Linux 根文件系统详解

initrd in linux 2.6.32.27