如何制作LiveCD

1.什么是liveCD?

所谓liveCD,就是可以直接引导为可用 Linux 系统的 CD,与大多数广为应用的发行版本中可以使用的“拯救模式(rescue mode)”引导选项相反,LiveCD 的设计是,当从 CD 引导起来后,提供一整套可以使用的工具,其中有一些是通用的,有一些是高度专用的。

2.制作liveCD的工具

我们制作liveCD的工具是fedora的livecdtools,此工具可以生成iso文件,用于liveCD使用。

livecdtools是如何制作liveCD的:
a.设立一个ext3文件系统,它将包含liveCD的所有数据;
b.把上面建立的文件系统loop mount到安装的根下;
c.bind mount某些内核文件系统,(/dev, /dev/pts, /proc, /sys, /selinux)到安装根下;
d.使用一个配置文件来定义所要求的RPM包和默认配置此文件选项.这种格式文件和安装通过启动一个系统使用的是一样的;
e.使用yum安装,将使用给定的仓库安装所要求的RPM包;
f.运行liveCD配置文件中指定的脚本;
g.Relabels整个安装根(对于SELinux的安装根);
h.创建一个匹配的liveCD安装的内核具体initramfs;
i.卸载安装根里的内核文件系统;
j.卸载安装根;
k.创建一个squashfs 的文件系统只包含ext3 文件(就是把ext3 文件压缩成squashfs 格式的文件系统);
l.配置引导装载程序;
m.创建一个iso9660启动光盘.

3.开始制作liveCD
如何制作liveCD,我们可以参照以下链接内容:
http://fedoraproject.org/wiki/FedoraLiveCD/LiveCDHowTo
上面已经介绍了liveCD的制作工具的制作流程,下面是我做liveCD的过程,主要介绍如何是使用liveCD配置文件。

a.安装liveCD制作工具

这里我们需要安装两个包:

livecdtools  主要用于提供制作liveCD的脚本文件
spinkickstarts  主要用于提供制作liveCD的配置文件
安装这两个包可能还需要安装如下相关的依赖包;
安装 livecdtools

依赖包:
systemconfigkeyboard1.3.11.
lp.i586.rpm
pythonimgcreate0311.
lp.1.i586.rpm
isomd5sum1.0.45.1.
lpm.i586.rpm
syslinux3.811.3.
lpm.i586.rpm
squashfstools4.0cvs1.22.
lpm.i586.rpm
pykickstart1.542.
lp.noarch.rpm
genisoimage1.1.911.
lp.i586.rpm

安装 spinkickstarts
依赖包:
fedorakickstarts0.12.02.
lp.noarch.rpm

b.修改配置文件
修改配置文件需要修改两个方面:
yum安装仓库的源指向;
安装包的筛选;

LiveCD的配置文件:
对于Fedora项目,有两个最重要的liveCD配置文件:
livecdfedoraminimal.
ks liveCD系统的内核配置文件(包含在’livecdtools’中)
livecdfedoradesktop.
ks 完整的桌面应用程序和I/O在Fedora中所有支持的语言环境支持(包含在’spinkickstarts’中)

我们要制作包含XFCE桌面的liveCD,所以使用的是下面这两个配置文件,其中fedoralivebase.ks
是由包spinkickstarts提供的,Linuxlivecdxfce.ks是参照Fedora的模板自己编写的:
/usr/share/spinkickstarts/
Linuxlivecdxfce.ks
/usr/share/spinkickstarts/
fedoralivebase.ks

修改yum安装仓库的源指向
因为Linuxlivecdxfce.
ks中有一句: included this words:%included fedoralivebase.ks
所以我们需要修改fedoralivebase.ks中yum源的指向:
其中有一句:
repo–name=rawhide–mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=rawhide&arch=$basearch
(这是为制作Fedora的liveCD而配置的yum源)
我们把上句注释掉,并增加下面一句:
repo–name=Linux–baseurl=ftp://192.168.1.188/home/XXXX/install
(ftp://192.168.1.188/home/XXXX/install是我们在192.168.1.188上的安装目录,我们也可以修改yum源,使其指向本地磁盘或本地DVD或者其他的)
(这里’name’是本地安装目录的名称;’mirrorlist’指的是http服务的网站;’baseurl’指的是ftp服务或其他的源)

安装包的筛选:
在fedoralivecdxfce.ks的%Packages段加入RPM包的名字
所加包名是XFCE桌面上的包名及一些我们需要在liveCD重使用的RPM包,此文件中已经包含了部分包名,是默认的Fedora底下的,但是要制作属于自己的liveCD就需要去除原本没有的包,加上之前开发的包。

4.设置SELinux为permissive模式可以使用如下代码:

sudo setenforce 0
也可以在fedoralivebase.
ks里面把selinux enforce注释掉。

5.使用livecdtools制作liveCD

下面的代码将会产生Linuxlivecd1217.iso文件
livecdcreatorc/usr/share/spinkickstarts/Linuxlivecdxfce.ks fLinuxlivecd1217cache=/var/live/

PS:
livecdcreator由livecdtools提供
-c 后面指向liveCD的配置文件
-f 后面定义文件系统的labelcache

定义liveCD在本机的安装缓存,制作liveCD的过程中会下载安装目录到本地,如果没有这一项的话。制作完liveCD后就会把下载的安装目录删除。

如果执行过程中有停止报错的话,就可以根据报错信息进行调试,如果缺少包的话就需要看看仓库里是否有这个包,如果没有,就需要看看是否是被某个包依赖,如果这个包的这种依赖不是很重要的话就可以重新打包,去掉这个缺失的包依赖,然后把新版本的包在加入到仓库中去,如果这个包依赖很重要的话,我们可以看以下是否可以从配置文件中去掉这个包或者是上层对他有依赖关系的包,有些包可能还会有版本的依赖关系,这个就比较难处理只能升级他的版本号了。

这么做完之后,我们就可以在当前目录下看到一个Linuxlivecd1217.iso文件,把它刻盘或者用虚拟机测试就可以了。

但是接下来测试的时候确是怎么进不了系统,每次都是到switchroot这就停下来了,为了解决这个问题,我了解了LINUX的启动过程:

以下是我解决整个问题的过程:

要了解liveCD是如何启动的,才能明白他为什么不能进入系统:

我们把Linuxlivecd1217.

iso文件解压之后可以可能到里面的内容如下:
查看Linuxlivecd1217.iso文件的内容:
[root@localhost dev]# mkdir p/mnt/livcd
[root@localhost dev]# mount /root/Linuxlivecd1217.iso /mnt/livcd/ oloop
[root@localhost dev]# cd /mnt/livcd
[root@localhost livcd]# ls
LiveOS syslinux
[root@localhost livcd]# cd syslinux/
[root@localhost syslinux]# ls
boot.cat initrd0.img isolinux.bin ldlinux.sys memtest splash.jpg syslinux.cfg vesamenu.c32 vmlinuz0
[root@localhost syslinux]# cd ../LiveOS/
[root@localhost LiveOS]# ls
osmin.img squashfs.img

解压 initrd0.img
[root@localhost syslinux]# file initrd0.img
initrd0.img: gzip compressed data, was “initrd0.img”, from Unix, last modified: Mon Dec 14 16:12:34 2009
[root@localhost syslinux]# mv initrd0.img ../initrd0.img.gz
[root@localhost syslinux]# cd ../
[root@localhost usbdisk]# gzip d
initrd0.img.gz
[root@localhost usbdisk]# ls
initrd0.img LiveOS syslinux
[root@localhost usbdisk]# mkdir tmp
[root@localhost usbdisk]# cd tmp/
[root@localhost tmp]# cpio i<../initrd0.img
[root@localhost tmp]# ll
total 40
drwxrxrx2 XXXX root 4096 2009121715:42 bin
drwxrxrx2 XXXX root 4096 2009121715:42 dev
drwxrxrx4 XXXX root 4096 2009121715:42 etcrwxrxrx1 XXXX root 683 2009121715:42 init
drwxrxrx6 XXXX root 4096 2009121715:42 lib
drwxrxrx2 XXXX root 4096 2009121715:42 proc
drwxrxrx2 XXXX root 4096 2009121715:42 sbin
drwxrxrx2 XXXX root 4096 2009121715:42 sys
drwxrxrx2 XXXX root 4096 2009121715:42 sysroot
drwxrxrx4 XXXX root 4096 2009121715:42 usr

下面是我对开机后电脑是如何启动linux做的笔记:

grub在成功的读取了配置文件以后,将会找到 kernel所在的位置,加载内核并且把电脑的控制权交给kernel程序,现在,grub找到了内核(hd0,2) /boot/vmlinuz2.6.181.2798.fc6,它将整个电脑的控制权交给了这个程序,内核开始进行各种初始化的动作,内核做的都是一些和硬件打交道的事情,比如初始化内存,检测并初始化硬件等,在内核启动的最后,它将寻找init程序并将电脑的控制权交给这个程序。

initrd 参数指定一个小的文件系统,如果指定了initrd参数,内核在进行完自己的任务之后,将会运行initrd这个小文件系统中的init程序,由这个程序完成进一步的系统初始化动作,加载更多的硬件支持以便找到真正的根文件系统。在grub.conf文件中,这是通过initrd /boot/initrd2.6.181.2798.fc6.img这一行来完成的,扩展名img通常预示着这是一个小的系统镜像文件。

再解压缩initrd2.6.181.2798.fc6.img这个文件,我们就可以看到initrd文件系统了,这个系统中的文件不多,在根目录中包含一个init 文件,这就是内核初始化完毕以后要运行的文件,这是一个脚本文件,它使用nash解释执行,nash是专门为initrd定制的脚本解释器,它的功能小而专业,内建了很多initrd很需要的命令.

initrd系统到底做了那些事情呢?首先为了让包含在initrd镜像中的那些程序顺利执行,它需要完备当前的文件系统,包括挂载proc 和sys文件系统(这些是内核支持的系统目录,需要将其挂载到用户区),创建/dev 目录,并且在/ dev 目录中创建系统初始化所需的那些设备,最典型的设备比如console,有了这个设备,echo命令才能把信息显示到终端上,这个F阶C段6的initrd中的init程序创建的设备达到数十个之多。然后启动hotplug支持热插拔,这里的hotplug是nash内建支持的命令之一,然后使用内建的mkblkdevs命令根据/sys/block目录下的文件信息创建/dev目录中对应的设备文件,然后加载usb和ext3相关的模块,在这个过程中可能又有新的设备被发现,因此需要使用mkblkdevs命令再次更新设备目录,在准备好了/dev 设备目录以后,init程序开始调用内建的 mkrootdev命令来创建/dev/root这个设备作为后续操作的根分区,这个命令的大致逻辑是:如果内核命令行中指定了root参数,则使用其指定的那个参数作为root设备,如果指定的为LABEL,则检查所有的块设备并且寻找卷标为指定值的设备作为root设备,如果没有指定root参数,则使用/proc/sys/kernel/realrootdev指定的设备,这个命令除了将创建/dev目录中相应的root设备文件以外,还将更新 fstab文件,将当前找到的root文件的mount参数写入/etc/fstab文件,这样在接下来的命令中,可以直接使用mount命令加载根分区,成功加载完根分区以后,init使用nash内建的setuproot命令,将所有的sys,proc,dev等这些已经挂载在initrd文件系统中的目录重新转移至新的根分区,然后使用nash内建的switchroot命令(内核2.6以上的版本)将当前文件系统切换至新的根分区,并且执行新的根分区的init命令,这样.initrd也完成了自己的使命,剩下的事情就是真实的根分区中的init程序的工作了。

FC6将电脑的控制权交给真正的init程序后,通常使用的都是标准的SysVinit程序,这个程序读取配置文件/ets/inittab,然后按照其中的配置执行指定的任务。

首先, 这个配置文件指定运行文件/etc/rc.d/rc.sysinit,这是个使用bash的执行的脚本文件,它首先检测一些基本系统的挂载情况,然后从/etc/sysconfig/network文件中读取网络配置,检查SELinux(安全性增强Linux)的状态, 然后开始设置终端字体( 使用 /sbin/setsysfont 命令, 这个命令将读取/etc/sysconfig/i18n配置文件,然后开始打印 “Welcome to Fedora …”的字样,其中Fedora是从配置文件/etc/redhatrelease中读取的。然后开始提示按”I”键将进入交互启动模式,在这种模式,你可以选择是否启动某个特定的服务。然后,使用/sbin/hwclock这个程序从BIOS中读取系统时间,其间使用了配置文件 /etc/sysconfig/clock,然后杀死所有的nash(我们在initrd中使用的shell)进程,启动udev(动态设备管理进程,通过监视sysfs按照规则动态创建/dev目录中的设备,已经逐渐取代了hotplug和coldplug).

然后rc.sysinit程序检查/etc/sysconfig/modules/下的所有的脚本,如果找到可以执行的脚本,就执行它,这里的脚本通常用来定义一些用户级别的模块加载。

然后,FC6准备进入图形界面继续init过程,进入初始化需要满足的条件包括内核命令行参数中包含rhgb 参数并且不包含earlylogin参数, BOOTUP=”color”,GRAPHICAL=”yes”( 这些变量在/etc/sysconfig/init定义)并且 /usr/bin/rhgb是可执行的程序。如果所有这些条件都满足,那么现在将执行rhgb程序. rhgb程序的作用是在启动的时候建立一个临时的仅使用loopback网络的X窗口服务器,然后在这个窗口上显示启动进度,init程序的其他部分可以通过rhgbclient程序向这个进度窗口发送消息,rhgbclient使用到的update参数是在rhgb的代码中写死的,总共有20个步骤,从最开始的”RCclock”到最后的”loginscreen”。

这就是整个到登录画面所做的所有工作;

对比才发现原来我的initscripts8.955.i586.lp.rpm中没有/etc/rc.d/rc.sysinit

为什么缺少这个文件呢?

原来我们系统使用了最新的启动方式,使用upstart方式启动,已经不需要那个文件了,但是我的liveCD里没有upstartscripts这个包,也就是缺少相关启动的包。

这就是原因所在!
下面是的upstart启动方式:
1.内核启动init
2.init找到/etc/event.d/rdefault
文件,确定默认的运行级别(X)
3.触发相应的runlevel事件,开始运行/etc/event.d/rcX
4.rcX运行/etc/init.d/rc,传入参数X
5./etc/init.d/rc脚本进行一系列设置,最后运行相应的/etc/rcX.d/中的脚本
6./etc/rcX.d/中的脚本按事先设定的优先级依次启动,直至最后给出登录画面(启动X服务器和GDM)

Lite1.3的启动方式只是文件名稍有改变,其方式是一样的,所以关键lite1.3的启动方式是把传统的启动方式和upstart的启动方式结合起来,起要启动必须要安装有关启动的文件,总共就是以下这五个包:
sysvinittools
upstartscripts
upstart
initscripts
fastinit

我们在制作liveCD时会使用yum安装配置文件里面写到的包及其相关依赖的包,而upstartscripts这个包就是没有装上的,也就是因为没有装上这个包,所以我们没有办法启动系统。

我再次在配置文件Linuxlivecdxfce.ks里加上以上五个包,在重新做一次liveCD,这次很容易就启动了!

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注