linux 启动引导

linux bootdisk

https://www.tldp.org/HOWTO/Bootdisk-HOWTO/x88.html

boot process

ROM(BIOS) sector 0, cylinder 0
引导驱动通常是一个软驱(linux里一般为/dev/fd0), BIOS会执行第一个分区,这个分区通常包含

  1. 引导代码(定位kernel,加载执行到开机)
  2. 内核代码的开始

当内核完成加载时,它初始化设备驱动和它内部的数据结构,一旦它完成初始化,就会跳转到ramdisk的镜像上,它告诉我们怎样找周到它的rootfs文件系统,rootfs是一个被简单挂在到 / 目录上, 内核被告诉在哪里寻找rootfs,如果它找不到可以加载的镜像,就会halt
在一些从软件引导的情景里,rootfs被加载到ramdisk ( 被系统认为是一个硬盘 ), 内存的速度比软盘快, 并且内核能够加载 压缩了的文件系统并解压它到ramdisk上,从而能够允许更多的文件被存储到软盘上。

当文件系统被加载和挂在后,会看到这样一条消息

  VFS: Mounted root (ext2 filesystem) readonly.

当系统加载rootfs后,它会执行 init 程序 (/bin/init 或者 /sbin/init ), init 程序读取配置文件 /et/initab , 寻找一行指定了 sysinit, 执行指定名字的脚本. sysinit指定的脚本一般为 /etc/rc 或者是 /etc/init.d/boot , 这个脚本启动了基础的系统服务,例如fsck,加载了必需的系统模块,初始化交换分区,初始化网络,然后挂在/etc/fstab文件分区。

这个脚本通常调用各种脚本做一些初始化的工作,比如 通常SysVinit structure,在/etc/rc.d 下包含了启动和关闭系统服务的文件。 然而 sysinit 脚本却很简单。

硬盘类型

boot disk

一个包含了能够被引导的内核的硬盘,这个硬盘能够用来引导内核/加载另一个硬盘上的rootfs。这个引导硬盘通常被告知rootfs的位置。

root

一个包含着运行linux系统必需文件的硬盘。一旦内核被引导,通常这个root disk会被自动拷贝到ramdisk中,这样会使root disk的访问更快。

boot/root

包含了kernel和rootfs的硬盘,也就是说它包含了一个linux系统运行必要的所有的东西(除了一个硬盘),它的优点是兼容性非常好。

utility

一个包含了文件系统的硬盘,不被用于挂载为rootfs, 只是一个普通的额外的磁盘。

一般我们所谈论的 building a bootdisk制作一个启动盘的意思是我们创建了一个能够实现boot和rootfs的功能组合,(它可以实现在不同的硬盘上)

构建一个rootfs

一个rootfs包含着一个linux系统所需要的一切,为了能够做这个,这个硬盘必需包含着linux系统的最低要求

  1. 基本的文件系统结构
  2. 最小化目录集合 /dev, /proc, /bin, /etc, /lib, /usr, /tmp
  3. 基础的工具套件: sh, ls, cp, mv, etc…
  4. 最小化的配置文件: rc, inittab, fstab, etc…
  5. 设备: /dev/hd*, /dev/tty*, /dev/fd0, etc…
  6. 运行时库提供基础的功能.
    当然,任何使系统变得有用的东西都可以加入到rootfs里。
创建文件系统
dd if=/dev/zero of=DEVICE bs=1k count=4096

linux内核能够识别两种文件系统(minix/ext2)能够自动被拷贝到ramdisk中。如果使用ext2, 可以使用 -N 选项指定更多的inodes, 推荐使用 -N 2000 ,也可以通过移除不必要的/dev文件节约inodes.

mke2fs -m 0 -N 2000 DEVICE

mount -t ext2 DEVICE /mnt
填充文件系统
/dev  设备文件,用于IO
/proc  proc文件系统
/etc 系统配置文件
/sbin 系统二进制文件
/bin 必要的系统二进制文件
/lib 提供运行时支持的共享库
/mnt 挂载点
/usr 额外的工具和应用

/proc, /usr, /mnt 这是哪个目录通常是空的。

/dev
cp -dpR /dev/fd[01]* /mnt/dev
cp -dpR /dev/tty[0-6] /mnt/dev

确认要包含以下几个文件

/dev/console
 /dev/kmem
 /dev/mem
 /dev/null
 /dev/ram0
 /dev/tty1
/etc/
rc.d/*
fstab
inittab
gettydefs
passwd
group
shadow
termcap

rc:

#!/binsh
/bin/mount -av
/bin/hostname KKKKKK

fstab

/dev/ram0	/	ext2	defaults
/dev/fd0	/	ext2	defaults
/proc	/proc	proc defaults

inittab:

id:2:initdefault:
si::sysinit:/etc/rc
1:2345:respawn:/sbin/getty 9600 tty1
2:23:respawn:/sbin/getty 9600 tty2
# cat rootfs/etc/inittab
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r

/etc/inittab文件中每个登记项的结构都是一样的,共分为以冒号“:”分隔的4个字段。具体如下:

identifier : run_level : action : process

其中,各字段以及与其相关的说明如下:
identifier  登记项标识符,最多为4个字符。用于惟一地标识/etc/inittab文件中的每一个登记项
run_level  系统运行级,即执行登记项的init级别。用于指定相应的登记项适用于哪一个运行级,即在哪一个运行级中被处理。如果该字段为空,那么相应的登记项将适用于所有的运行级。在该字段中,可以同时指定一个或多个运行级,其中各运行级分别以数字0.1.2.3.4.5.6或字母a、b、c表示,且无需对其进行分隔。
action    动作关键字。用于指定init(M)命令或进程对相应进程(在“process”字段定义)所实施的动作。具体动作包括:
1、boot:只有在引导过程中,才执行该进程,但不等待该进程的结束;当该进程死亡时,也不重新启动该进程。
2、bootwait:只有在引导过程中,才执行该进程,并等待进程的结束:当该进程死亡时,也不重新启动该进程。实际上,只有在系统被引导后,并从单用户方式进入多用户方式时,这些登记项才被处理;如果系统的默认运行级设置为2(即多用户方式),那么这些登记项在系统引导后将马上被处理。
init进程
init的进程号为1,是所有进程的父进程,内核初始化完毕之后,init程序开始运行。其他软件也同时开始运行。init程序通过/etc/inittab文件进行配置。

/bin /sbin

ls, mv, cat, dd

/lib
提供PAM、NSS

最后

umount /mnt
dd if=DEVICE bs=1k | gzip -v9 > rootfs.gz

busybox制作文件系统的启动流程:

  1. BIOS
  2. init脚本
  3. /etc/inittab
  4. /etc/init.d/rcS
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值