haulm 发表于 2011-10-13 21:24:23

谁能解说一下 Livecd 的开发和启动原理

我倒是拥有一个曾经成功制做 magiclinux Livecd 的制做工具,但它用 lilo 引导,并且谁如果不小心在硬盘应用它的引导安装脚本会导致该硬盘无法简单地用 fdisk /mbr 清除 mbr ,lilo 引导一直存在着。。。我想用 grub1 取代 lilo ,但不知如何下手。
对于 Livecd 的工作原理,我只了解其中一小部份,即在 Livecd 的特制内核在最初的系统启动后挂载读取各个高压缩的系统文件,然后将启动过程交回给压缩的系统。但我不理解 Livecd 从原系统提取了哪些文件并需要哪些工作然后由 grub 引导使之完成最初的系统启动,我对系统启动环境一无所知。
比如我们现在所用的 MI2,就是从系统中提取基本的运行环境,然后加载图形安装界面和安装环境,然后完成安装过程。MI2 除 rpm 包安装,还可以实现普通压缩包解压安装,这个我还没有尝试过,但实现解压安装我觉得不够,因为 MI2 应该可以实现 Live 运行啊。。。

[ 本帖最后由 haulm 于 2011-10-13 21:31 编辑 ]

haulm 发表于 2011-10-13 21:37:15

其实 sunsine 在实现普通压缩包解压安装的思路时就没想过直接使用高压缩率的少数几个系统压缩包,在 MI2 加载完基本的指令环境后,挂载完整的系统完成 Live 桌面运行,安装系统就直接解压系统压缩包到指定分区即可。

zy_sunshine 发表于 2011-10-13 23:04:51

.看经典 LFS LiveCD 结构
./boot       <-- grub OR lilo
./boot/boot.cat
./boot/diag1.img
./boot/isolinux
./boot/isolinux/boot.msg
./boot/isolinux/F1.txt
./boot/isolinux/initramfs_data.cpio.gz       <-- initrd
./boot/isolinux/initramfs_data64.cpio.gz<-- initrd 64bit
./boot/isolinux/isolinux.bin
./boot/isolinux/isolinux.cfg
./boot/isolinux/linux                <-- kernel
./boot/isolinux/linux64            <-- kernel 64bit
./boot/isolinux/splash.lss
./drivers      <-- 各种驱动,内核模块(识别硬件后解压 配置x)
./drivers/fglrx-module-8.38.6-x86-1_kernel_2.6.22.5.tgz
./drivers/fglrx-module-8.38.6-x86_64-1_kernel_2.6.22.5_64bit.tgz
./drivers/fglrx-x710-8.38.6-x86-1.tgz
./drivers/NVIDIA-Linux-x86-1.0-7185-glx.tgz
./drivers/NVIDIA-Linux-x86-1.0-7185-kernel-2.6.22.5.tgz
./drivers/NVIDIA-Linux-x86-1.0-9639-glx.tgz
./drivers/NVIDIA-Linux-x86-1.0-9639-kernel-2.6.22.5.tgz
./drivers/NVIDIA-Linux-x86-100.14.11-glx.tgz
./drivers/NVIDIA-Linux-x86-100.14.11-kernel-2.6.22.5.tgz
./drivers/NVIDIA-Linux-x86_64-1.0-7185-kernel-2.6.22.5-64bit.tgz
./drivers/NVIDIA-Linux-x86_64-1.0-9639-kernel-2.6.22.5-64bit.tgz
./drivers/NVIDIA-Linux-x86_64-100.14.11-kernel-2.6.22.5-64bit.tgz
./lfs-sources<-- lfs 源码
./README.html
./root.ext2       <-- livecd 文件系统,这个其实就是一个兼容性极强的Linux操作系统
./    <-- 光盘启动文件
.//Bootable_NoEmulation.img

启动过程,加载Kernel + initrd
initrd 执行 init 程序,加载 root.ext2 为根目录,chroot 进入根目录,继续启动。
配置locale信息,识别键盘鼠标显示器,解压内核模块配置X。

现在的 MI2 就省略了加载 root 根目录,直接把 initrd 当做根目录。
MI 中的 initrd 也就是一个小型的嵌入式系统,包括Magic2.5的底层库(glibc),一些mi 主程序运行所需要的必要库和工具,一个busybox。
就这么简单。

现在如果做 LiveCD,只要做好 root.ext2 就好办了,root.ext2也就是可挂载的ext2文件系统,以文件形式存在。要求其系统兼容性极强。

sejishikong 发表于 2011-10-14 11:14:56

那个livecd本身的启动应该是syslinux的,lilo是可选项,安装到硬盘的话,如果用live方式,直接复制光盘内容就可以了,自己添加启动条目,如果用实机安装方式,需要另写个程序,或使用mi2的部分内容。livecd本身的启动完全可以改成grub,不困难,live启动的时候是启动的live本身的系统,然后chroot进magic的。所以live本身的系统怎么改并不会影响magic的环境的。

jiangtao9999 发表于 2011-10-14 21:40:53

Linux 启动顺序楼主知道了吧?

LiveCD 也一样。
只不过 LiveCD的引导和硬盘不同,而且光盘的设备识别也不同,而且光盘还是只读的,而且光盘容量不如硬盘大。
这就是区别导致的不同。

我觉得你有必要把这件事分成两部分考虑:
1、启动进内核
2、从内核启动到 / 文件系统

注意 / 是文件系统,不是分区,任何时候都不能把 Linux 的文件系统就直接认为是分区。分区是硬盘上面的一个区域,只是 Linux 文件系统的一个实现方式。

jiangtao9999 发表于 2011-10-14 21:42:37

光盘的启动区和硬盘的 MBR 一样,都是特殊位置而且不算文件系统里面的文件的。

huizige 发表于 2011-10-19 00:05:01

我最近也在开始对live cd的initrd文件做准备工作,我在LFS上安装systemd已经成功,期间安装systemd真的很曲直,依赖包安装完后还是启动不了,曾经看了自述文件说要重新安装udev源码,没注意,后来对比了安装后,同一个系统,只是安装路径不同,搜索网络上对应文件名时才想起自述文件的说明,在安装好systemd后,再重新安装一次udev,原来在udev检测到systemd安装后还会给systemd添加规则文件。

现在想试用LIVE CD上systemd,所以跟现有的资料有出入,希望大家能给技术上的支持。

还有,如果是内核版本2.6.29以上的内核内部支持squashfs后就可以直接装载squashfs格式的initrd文件,mksquashfs加上目录名和要打包的inirtd名字后就可以直接生成镜像文件。比cpio和ext2还方便。

haulm 发表于 2011-10-19 11:54:39

郁闷,GCC 编译通不过,4.5.3 和 4.6.1 出现一样的错误,每次编译 LFS 都打退堂鼓。

huizige 发表于 2011-10-19 12:07:35

我是用ALFS编译的,后续的BLFS都用生成脚本进行编译
页: [1]
查看完整版本: 谁能解说一下 Livecd 的开发和启动原理