linux发行版DVD安装机制分析
想知道linux发行版究竟是怎么启动安装的吗,下面简单的分析下dvd光盘启动linux机制。
ISO 9660 标准
如果系统支持DVD启动,CD/DVD镜像格式必须满足标准,目前主要是采用ISO 9660标准。
ISO 9660是CD-ROM的标准文件系统。它还广泛用于DVD和BD介质上,也可能存在于USB sticks或硬盘上。
ISO 9660基本信息:
- 扇区大小
ISO 9660扇区正常都是2KB,尽管规范说可选,但是很难找到不是2K扇区大小的DVD - 数字编码
支持大段和小端模式 - 字符串编码
采用ASCII编码,但并不是所有字符都可用。但并不是所有DVD遵循这个规范。 - 大小限制
最大2^32的block,即8TB。 - 系统区域
前32KB(16个扇区)可以存储任意数据。如果ISO 9660文件系统存放在usb sticks或者硬盘,则一般用于存放boot代码(MBR)。
启动过程
BIOS/EFI固件支持CD/DVD启动,根据ISO 9660标准寻找光盘上的boot record记录,根据boot record进而找到boot image(isolinux.bin),
执行bootimage代码,根据isolinux.cfg的配置加载内核(vmlinuz)和RAM DISK(initrd),加载完后跳转到
内核执行。
这个initrd在内核启动时作为内存根文件系统使用,加载必要的驱动,然后内核切换到真正的根文件系统上面。
对于RHEL系就是光盘LiveOS下的squashfs.img。内核会挂载squashfs镜像,然后切换到其中的根文件系统。
1 | [root@vm]# file squashfs.img |
挂载该squashfs镜像后可得到里边是一个rootfs.img(ext4文件系统镜像)。
这个rootfs.img就是内核在安装发行版时使用的根文件系统。
vmlinuz的生成
vmlinuz是内核文件,如果是自己编译内核,可以到官网下载对应版本的
源码,编译。对于RHEL系发行版,一般有对应版本的源码包,如RPM源码包,安装后可以使用
rpmbuild编译内核。
对于debian系发行版,可以参考这里。
1 | [root@vm]# file vmlinuz |
initrd的解压和打包
1 | [root@vm]# file initrd.img |
一般initrd都是经过压缩的,如上是采用lzma压缩的。需要lzma解压,完成后得到cpio包。
1 | cpio -idmv <initrd.img |
经过cpio命令可以解压得到里边的内容。
1 | [root@vm]# ls |
这时可以对里边的内容修改,如替换成自己的内核驱动等等。
1 | find . | cpio -c -o ../initrd.img |
上面用于打包cpio,然后经过lzma压缩就可以得到可用的initrd。
这里注意如果使用自己的lib/modules/xxxx替换,需要depmod一下,生成
对应的modules.alias等文件,这样系统才能正常工作。
1 | depmod -a -b <lib/modules/xxxx中lib的父目录> -F <Your System.map文件> -E <Your symvers文件> <lib/modules/xxxx中的xxxx字符串即内核版本号> |
经过上述步骤后打包成的initrd是可以正常工作的。
squashfs镜像的解压和打包
1 | mkdir tmp_squashfs |
如果需要修改其中的rootfs.img需要拷贝出来,然后挂载该rootfs镜像,修改完直接卸载。
然后重新做成squashfs镜像。
1 | mksquashfs <Your squashfs目录> squashfs.img |
总结
经过上述步骤可以详细了解linux发行版启动安装机制。
简单讲首先运行一个linux内核(CD/DVD上面),然后执行发行版的安装程序完成具体的安装。
安装程序负责对硬盘分区,挂载,使用CD/DVD上的目录作为安装源安装软件,最好配置重启完成安装。