`
isiqi
  • 浏览: 16498400 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

system:initrd和nash

阅读更多

1、什么是initrd

  • initrd 的英文含义是 boot loader initialized RAM disk,即由引导程序初始化的RAM磁盘。initrd是在实际根文件系统可用之前挂载到系统中的一个初始根文件系统。initrd与内核绑定在一起, 并作为内核引导过程的一部分进行加载。内核然后会将这个initrd文件作为其阶段引导过程的一部分来加载模块,这样才能在以后的引导过程中使用真正的文 件系统,并挂载实际的根文件系统。根文件系统可以存储在包括IDE、SCSI、USB在内的多种介质上,如果将这些设备的驱动都编译进内核,可以想象内核 会多么庞大、臃肿。所以可以把initrd看做是在启动过程中连接内核与根文件系统的一个桥梁。

initrd 中包含了实现这个目标所需要的目录和可执行程序的最小集合,例如将内核模块加载到内核中所使用的 insmod工具。以及一些mount、mknod等命令,这些会在后面的nash部分讲到。Initrd 的用途主要有以下四种:*

1. linux 发行版的必备部件 linux 发行版必须适应各种不同的硬件架构,将所有的驱动编译进内核是不现实的,initrd 技术是解决该问题的关键技术。Linux 发行版在内核中只编译了基本的硬件驱动,在安装过程中通过检测系统硬件,生成包含安装系统硬件驱动的 initrd,无非是一种即可行又灵活的解决方案。

2. livecd 的必备部件 同 linux 发行版相比,livecd 可能会面对更加复杂的硬件环境,所以也必须使用 initrd。

3. 制作 Linux usb 启动盘必须使用 initrd usb 设备是启动比较慢的设备,从驱动加载到设备真正可用大概需要几秒钟时间。如果将 usb 驱动编译进内核,内核通常不能成功访问 usb 设备中的文件系统。因为在内核访问 usb 设备时, usb 设备通常没有初始化完毕。所以常规的做法是,在 initrd 中加载 usb 驱动,然后休眠几秒中,等待 usb设备初始化完毕后再挂载 usb 设备中的文件系统。

4. 嵌入式开发中常用做永久根文件系统。

5. 在 linuxrc 脚本中可以很方便地启用个性化 bootsplash。

2、剖析initrd

在linux2.4内核initrd的文件格式是文件系统镜像文件,即使用loop设备来构建的。loop设备是一个设备驱动程序,利用它可以将文件作为 一个块设备挂载到系统中,然后就可以查看这个文件系统中的内容了。到了linux2.6 内核的 initrd 的文件格式即支持原来的文件系统镜像文件,也支持 cpio 格式,而cpio就是用来取代原来的文件系统镜像文件格式。通过如下步骤可以查看到initrd文件里面的内容:

# mv initrd-2.6.18-8.2.img initrd-2.6.18-8.2.img.gz
# gunzip initrd-2.6.18-8.2.img.gz
# cpio -id < initrd-2.6.18-8.2.img
# ls -l
drwx------ 2 root root 4096 08-31 11:13 bin
drwx------ 3 root root 4096 08-31 11:13 dev
drwx------ 2 root root 4096 08-31 11:13 etc
-rwx------ 1 root root 1833 08-31 11:13 init
drwx------ 2 root root 4096 08-31 11:13 lib
drwx------ 2 root root 4096 08-31 11:13 proc
lrwxrwxrwx 1 root root 3 08-31 11:13 sbin -> bin
drwx------ 2 root root 4096 08-31 11:13 sys
drwx------ 2 root root 4096 08-31 11:13 sysroot

从上面的结果可以看出,initrd里面是一个很小的根文件系统,在 /bin 目录中有一组很少但却非常必要的应用程序,包括 nash、insmod等。init则是其引导的核心文件,在cpio格式的initrd里,该文件的名称只能是init。而在原来镜像文件格式的 initrd其核心文件可以是init和linuxrc。init通常是一个脚本文件,负责加载内核访问根文件系统必须的驱动,以及加载根文件系统。关于 nash的解释是,nash (not a shell)它不是一个SHELL,是一个设计的尽可能小的简单命令解释器。主要用于初始化RAM DISK时候解释里面的linuxrc或者init这些简单的脚本。nash目前常用的构建命令如下:

echo 

将字符串输出到标准输出,只是功能上没有系统里面echo那么多。

find

显示指定路径下所匹配名称的文件,即只支持linux系统里find命令中的-name参数。

losetup  

将文件帮定到回环设备/dev/loopdev上

mkdevices

指定创建的块设备文件存放路径,如:mkdevices /dev

mknod 

创建设备文件

mkrootdev 

创建根文件系统的设备节点,根据内核传递参数当中的“root=”来创建对应该设备的节点,节点的名称是/dev/root,它不仅能够根据root= /dev/xxx来生成对应的设备节点,还能够在碰到root=LABEL=/的情况下探测所有的硬盘分区,以便找到对应着卷标为/的分区。

pivot_root  

转换根文件系统,以及挂载临时根文件系统。

raidautorun 

自动检测所有的raid设备

showlabels 

显示设备的LABEL以及UUID sw

itchroot  

与pivot_root功能类似,用于转换根文件系统。但只能用于2.6或以后的核心。

3、手工创建initrd

对于传统的 Linux 系统来说,initrd 映像是在 Linux 构建过程中创建的。有很多工具,例如 mkinitrd,都可以用来使用必要的库和模块自动构建 initrd,从而用作与真实的根文件系统之间的桥梁。mkinitrd 工具实际上就是一个 shell 脚本,有兴趣的可以研究一下。下面将以GTES11为基础制作U盘上的操作系统为例来描述initrd的创建过程:

1、将grub写到U盘上

# mount /dev/sdb1 /mnt
# grub-install --root-directory=/mnt hd1
Installation finished. No error reported.
This is the contents of the device map /mnt/boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.

(fd0) /dev/fd0
(hd0) /dev/sda
(hd1) /dev/sdb

2、创建grub.conf文件

default=0
timeout=5
title Flashdisk-System (2.6.18-8.2)
root (hd0,0)
kernel /boot/vmlinuz-2.6.18-8.2 root=/dev/sda1
initrd /boot/initrd.img

3、复制系统核心到/boot

# cp /boot/vmlinuz-2.6.18-8.2 /mnt/boot

4、制作initrd 这也是制作U盘上操作系统最为关键的一步,稍有出错就会看到“kernel panic”错误提示,制作initrd时可以参照系统的initrd来修改,按照前面的方法解开 initrd-2.6.18-8.2.img ,并修改其中init文件为如下:

#!/bin/nash
#创建必备的设备文件
mount -t proc /proc /proc
setquiet
echo Mounting proc filesystem
echo Mounting sysfs filesystem
mount -t sysfs /sys /sys
echo Creating /dev
mount -o mode=0755 -t tmpfs /dev /dev
mkdir /dev/pts
mount -t devpts -o gid=5,mode=620 /dev/pts /dev/pts
mkdir /dev/shm
mkdir /dev/mapper
echo Creating initial device nodes
mknod /dev/null c 1 3
mknod /dev/zero c 1 5
mknod /dev/systty c 4 0
mknod /dev/tty c 5 0
mknod /dev/console c 5 1
mknod /dev/ptmx c 5 2
mknod /dev/rtc c 10 135
mknod /dev/tty0 c 4 0
mknod /dev/tty1 c 4 1
mknod /dev/tty2 c 4 2
mknod /dev/tty3 c 4 3
mknod /dev/tty4 c 4 4
mknod /dev/tty5 c 4 5
mknod /dev/tty6 c 4 6
mknod /dev/tty7 c 4 7

#加载U盘驱动
echo "Loading scsi_mod.ko module"
insmod /lib/scsi_mod.ko
echo "Loading sd_mod.ko module"
insmod /lib/sd_mod.ko
insmod /lib/sg.ko
echo "Loading usb-storage.ko module"
insmod /lib/usb-storage.ko
echo "Loading uhci-hcd.ko module"
insmod /lib/uhci-hcd.ko
echo "Loading ohci-hcd.ko module"
insmod /lib/ohci-hcd.ko
echo "Loading ehci-hcd.ko module"
insmod /lib/ehci-hcd.ko
echo "initialization flash disk"
sleep 10

#挂载和转换根文件系统
echo Creating root device.
mkrootdev -t ext2 -o defaults sda1
mknod /dev/sda b 8 0
mknod /dev/sda1 b 8 1
mknod /dev/root b 8 1
echo Mounting root filesystem.
mount /sysroot
echo Setting up other filesystems.
Setuproot
echo Switching to new root and running init.
switchroot

然后拷贝U盘必须的驱动文件到该lib目录下,如下:

# cp /lib/modules/2.6.18-8.2/kernel/drivers/usb/host/ehci-hcd.ko ./lib
# cp /lib/modules/2.6.18-8.2/kernel/drivers/usb/host/ohci-hcd.ko ./lib
# cp /lib/modules/2.6.18-8.2/kernel/drivers/scsi/scsi_mod.ko ./lib
# cp /lib/modules/2.6.18-8.2/kernel/drivers/scsi/sd_mod.ko ./lib
# cp /lib/modules/2.6.18-8.2/kernel/drivers/scsi/sg.ko ./lib
# cp /lib/modules/2.6.18-8.2/kernel/drivers/usb/host/uhci-hcd.ko ./lib
# cp /lib/modules/2.6.18-8.2/kernel/drivers/usb/storage/usb-storage.ko ./lib

接下就需要将修改后的initrd做成一个cpio的包并压缩,并将生成的initrd.img文件复制到U盘的boot目录下,如下:

# find . |cpio -H newc -o | gzip -i > ../initrd.img
# cp ../initrd.img /mnt/boot

其中的newc表示使用新型(SVR4)跨平台格式,SVR4是UNIX操作系统的一种新的内核标准。

5、建立U盘上文件 创建完引导initrd后,下面就需要在U盘上制作系统一些必须的程序,如shell,常用的命令等等。当然这些可以从系统里复制这些必须的文件,但是考 虑到U盘的大小,所以在这里采用busybox,关于busybox的使用请参照知识库的另外一篇文章:http://www.turbolinux.com.cn/turbo/wiki/doku.php?id=system:busybox,将建立好的busybox文件以及busybox所依赖的库文件一起拷贝到U盘的根目录下。

# ls -l /mnt
drwxr-xr-x 2 root root 3072 2007-08-26 11:24 bin
drwxr-xr-x 3 root root 1024 2007-08-31 16:35 boot
drwxr-xr-x 2 root root 1024 2007-08-23 16:52 lib
drwxr-xr-x 2 root root 1024 2007-08-26 11:24 sbin
drwxr-xr-x 4 root root 1024 2007-08-26 11:24 usr

# ls -l /mnt/lib
-rwxr-xr-x 1 root root 121804 2007-08-23 16:52 ld-2.5.so
lrwxrwxrwx 1 root root 9 2007-08-31 15:59 ld-linux.so.2 -> ld-2.5.so
-rwxr-xr-x 1 root root 1580376 2007-08-23 16:52 libc-2.5.so
-rwxr-xr-x 1 root root 27976 2007-08-23 16:52 libcrypt-2.5.so
lrwxrwxrwx 1 root root 15 2007-08-31 15:59 libcrypt.so.1 -> libcrypt-2.5.so
lrwxrwxrwx 1 root root 11 2007-08-31 15:59 libc.so.6 -> libc-2.5.so
-rwxr-xr-x 1 root root 209316 2007-08-23 16:52 libm-2.5.so
lrwxrwxrwx 1 root root 11 2007-08-31 15:59 libm.so.6 -> libm-2.5.so

6、建立etc目录 etc目录下,需要创建文件有inittab、fstab以及init.d/rcS,当initrd把引导权交给busybox的时候,busybox会自动去执行这些文件的内容。文件的内容分别如下:

etc/inittab:

#!/bin/ash
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/ash
tty2::respawn:/bin/ash
tty3::respawn:/bin/ash

ash是bash的克隆,所以在这里我们采用ash做为系统的shell。

etc/fstab:

/dev/sda1 /         ext2    defaults       1 1
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0

etc/init.d/rcS:

#!/bin/ash
mount -a

7、建立dev目录 使用cp -a命令拷贝常用的设备文件,包括console、tty1、tty2、tty3、sda、sda1等设备文件。总共需要设备文件的有如下:

# ls /mnt/dev
console ram sda systty tty0 tty2 tty4 tty6 tty8 ttyS0
null root sda1 tty tty1 tty3 tty5 tty7 tty9

最后再建立proc、sys、sysroot这几个空目录即可完成。制作完成后,设置BIOS从U盘引导,就可以看到U盘启动后初始化内核的打印信息了,如果看到“按下enter键激活控制台”这样的提示表明制作成功!

<!-- wikipage stop -->
分享到:
评论

相关推荐

    initrd映像文档的作用和制作

    `initrd`包含了一些初始化程序,如模块(如sisc_mod、ext3、sd_mod等)和命令(如insmod、nash等),它们会在系统真正挂载根文件系统之前运行。 **制作initrd映像文档** 制作`initrd`映像文档通常使用`mkinitrd`...

    initrd 文件系统详解

    initrd 文件系统的工作机理是这样的:在 Linux 系统启动时,initrd 文件系统会被加载到内存中,然后 Linux 内核会从 initrd 文件系统中读取所需的文件和数据,以便正确地初始化和启动 Linux 系统。initrd 文件系统的...

    Linux2.6 内核的 Initrd 机制解析

    - **LiveCD和USB启动**:Initrd是制作LiveCD和USB启动盘的必要组件,它能够加载所需的驱动,确保系统在不同硬件环境下稳定运行。 - **个性化Bootsplash**:在Linuxrc脚本中,可以方便地启用个性化Bootsplash,提升...

    initrd.img文件分析

    initrd.img 文件是 Linux 系统启动过程中的一个关键文件,它负责加载系统所需的驱动程序和模块,以便系统能够正确地启动和运行。initrd.img 文件的分析可以帮助我们更好地理解系统的启动过程,并且可以根据需要对 ...

    linux中ramdisk和initrd的区别

    Linux中的Ramdisk和Initrd是两种在早期启动过程中利用内存创建临时文件系统的技术。它们都是为了在系统启动时提供一个可操作的文件系统环境,但它们的用途和工作方式有所不同。 ## Ramdisk简介 Ramdisk是一种将...

    Linux启动流程 initrd与initramfs的区别

    在此过程中,initrd(initial ram disk)和initramfs(initial ram filesystem)是两个经常被提及的概念,它们在Linux系统启动过程中扮演着关键的角色。 Linux启动流程可以分为几个主要的步骤,包括BIOS或UEFI的...

    grub启动内核和initrd.img

    - **制作自己的initrd:** 用户可以根据需要制作自己的`initrd`文件,这在调试或定制系统启动过程时非常有用。一个常见的做法是使用`mkinitramfs`工具来创建`initrd`。 - **BusyBox:** 在制作`initrd`时,经常使用...

    官方下载initrd+vmlinuz打包

    在Linux操作系统,特别是Ubuntu系列中,`initrd`和`vmlinuz`是两个至关重要的文件,它们在系统启动过程中起到关键作用。本篇文章将详细解释这两个文件的含义、功能以及它们如何协同工作来完成系统的启动。 `initrd`...

    initrd机制解析-我的笔记

    在本文中,我们将深入探讨 initrd 机制的概念、用途和处理流程。 initrd 概念 initrd 的英文含义是 boot loader initialized RAM disk,也就是由 boot loader 初始化的内存盘。在 Linux 内核启动前,boot loader 会...

    debian5.02的vmlinuz和initrd.gz

    标题中的"debian5.02的vmlinuz和initrd.gz"指的是Debian 5.02(代号Lenny)操作系统的引导加载组件。这些文件对于Linux发行版的启动过程至关重要,特别是当进行硬盘安装时。在此场景下,用户需要这两个文件来成功...

    btrfs-initrd:创建 initrd 以支持从 btrfs 子卷启动

    btrfs-initrd 创建一个 initrd 映像以支持在引导期间以 root 身份挂载 btrfs 子卷。 用法 $ mount /boot # Creates /boot/initrd-btrfs-$KERNEL.gz $ ./btrfs_create_initrd.sh 之后,更新您的引导加载程序配置。 ...

    ubuntu-10.10-alternate-i386 安装时引导所需文件

    然后将这5个文件和ISO都放到C盘根目录下,修改启动等待时间,重启即可引导到安装程序。 注意:此内核文件是为Alternate版本的,如果安装Desktop版本,请直接从ISO中解压出这两个文件来替换,然后修改menu.lst文件中...

    kylin ft2000 arm aarch64 boot uImage initrd dtb

    这个标题揭示了我们要讨论的核心内容,它涉及到Kylin操作系统、FT2000处理器、ARM架构以及AARCH64指令集,还有启动过程中至关重要的几个文件:uImage、initrd和dtb。 首先,让我们来逐一解析这些关键术语: 1. **...

    vmlinuz.txt与initrd 用于windows中安装linux

    1. 下载vmlinuz和initrd.gz:首先,你需要访问Linux发行版的官方网站,找到对应版本的vmlinuz和initrd.gz文件,下载到本地。 2. 创建引导媒体:将这两个文件复制到一个USB驱动器或光盘,这将成为安装Linux的引导...

    Debian6.0.7硬盘引导(initrd.gz、vmlinuz)

    在安装或维护Debian系统时,了解如何进行硬盘引导以及相关文件initrd.gz和vmlinuz的作用至关重要。 硬盘引导是指Linux系统从硬盘启动的过程,这是系统启动的关键步骤。在Debian6.0.7中,这个过程涉及到几个核心组件...

    BT4硬盘安装需要的 initrd.gz

    BT4硬盘安装需要的 initrd.gz

    bzImage+initrd.gz

    `bzImage`承载了内核的执行代码,而`initrd.gz`则提供了启动时的临时环境,确保内核能正确地初始化硬件和挂载主根文件系统。在内核版本3.10.108中,这两个文件被编译并测试为可用,对于内核调试和其他特定工作非常...

    Linux initrd

    Linux hard disk install file _ initrd

Global site tag (gtag.js) - Google Analytics