linux bootdisk
https://www.tldp.org/HOWTO/Bootdisk-HOWTO/x88.html
boot process
ROM(BIOS) sector 0, cylinder 0
引导驱动通常是一个软驱(linux里一般为/dev/fd0), BIOS会执行第一个分区,这个分区通常包含
- 引导代码(定位kernel,加载执行到开机)
- 内核代码的开始
当内核完成加载时,它初始化设备驱动和它内部的数据结构,一旦它完成初始化,就会跳转到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系统的最低要求
- 基本的文件系统结构
- 最小化目录集合 /dev, /proc, /bin, /etc, /lib, /usr, /tmp
- 基础的工具套件: sh, ls, cp, mv, etc…
- 最小化的配置文件: rc, inittab, fstab, etc…
- 设备: /dev/hd*, /dev/tty*, /dev/fd0, etc…
- 运行时库提供基础的功能.
当然,任何使系统变得有用的东西都可以加入到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制作文件系统的启动流程:
- BIOS
- init脚本
- /etc/inittab
- /etc/init.d/rcS