v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
st1\:*{behavior:url(#ieooui) }
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
原文路径:
GNU/Linux 开源,这个意义实在是非常的广泛,目前在distrowatch 上表现活跃的300 个发行版代表了GNU/Linux 的主流,然而细心的Linux 爱好者会发现CentOS-based distribution designed 、based on
Slackware Linux 、a distribution built from source
software packages for Red Hat Enterprise Linux 、a
user-friendly Ubuntu-based distribution 、an Debian-based
distribution 等关键词汇,目前大多数的发行版基本上都是源于Redhat 、Debian/Ubuntu , Suse ,
Slackware 等版本的衍生态,而构建Based Distribution 的目的有很多,不乏有技术交流、功能完善、以及管理、更新Bug 软件包等需求,同样这些Based Distribution 也为Linux 爱好者构建自己的Linux 发行版本提供了很好的参照。本文作为独辟蹊径的系列文章,将带领大家初探基于Cenotos 5.2 的Linux 发行版构建方式,为进一步深入研究提供一个基础。
要实现基于Centos 的Linux 发行版本的构建,首先需要了解一下Linux 启动过程以及Linux 启动文件相关的了解,同时要对Linux 发行版本的光盘结构以及软件包的结构进行了解分析。从主机加电到系统服务加载运行,Linux 的启动(Linux 安装的过程雷同)大致需要经历如下的过程:
第一阶段:
加载bios 的硬件信息,并获取第一个启动的设备的代号;读取第一个启动设备的mbr 的引导加载程序(lilo 或grub )的启动信息;加载核心操作系统的核心信息,核心开始解压缩,并且尝试驱动所有硬件设备;
分析此阶段是很有价值的,即便是Linux 系统的安装也需要加载内核并解压内核、加载各类外设的驱动信息,构建一个最小化的Linux 的文件系统以执行第二阶段的进程。
第二阶段:
核心执行init 程序并获取运行信息;init 执行/etc/rc.d/rc.sysinit 文件;启动核心的外挂模块(/etc/modprobe.conf) ;init 执行运行的各个批处理文件(Scripts );init 执行/etc/rc.d/rc.local 文件;执行/bin/login 程序,等待用户登陆;登陆之后开始以shell 控制主机。
通俗的一个说法,Linux 的光盘安装就是在第一阶段由stage2.img 构建产生的最小化的Linux 文件系统之上运行anaconda 之类的安装程序,完成Linux 系统的安装过程。在Linux 安装过程中第二阶段就是运行anaconda 并配合系统安装预设选项完成对系统安装。
构建Base Centos Distribution 的Linux 发行版可以简单分为两种方式,第一种是通过结合Kickstart 安装预配置文件对Centos 系统安装的软件包并结合Kickstart 的post 及pre 的脚本对安装的系统进行初始化的配置;第二种方式是通过添加修改stage2.img 所生成的Linux 文件系统达到定制内核、在安装过程添加定义的向导信息等。第一种方式实现便捷、Kickstart 有X 界面工具操作也相对简单,如要略去光盘中不安装不需要的软件包,并添加第三方的rpm 或者tar.gz 源码包,就需要深入研究repodata 中的comps.xml 的基于yum 的软件包依赖关系的定义,并能够有基本的shell 脚本的累加能力,将要安装的软件包及设置通过脚本实现。相对第二种方式的不足之处就是还是使用Centos 的系统并没有对内核或其他参数做明确的发布调整,故此第二种方式就深入修改stage2.img 及anaconda 相关的配置实现,以达到发布独立有别于Base Centos
Distribution 的Linux 版本。
基于Cenotos 的Linux 发行版的目的是为了在系统中能够快速,正确地建立Linux 系统环境。实现的方式以分析Centos 的安装光盘为起点,在掌握对应的技巧方法,同时建立相应的测试环境。
以centos 5.2 的DVD 介质为例,光盘中包含的主要与定制相关的目录如下:
isolinux 目录存放光盘启动时的安装界面信息
repodata 目录是与RPM 包安装相关的依赖信息
images 目录包括了必要启动映像文件
CentOS 目录存放安装软件包信息
.discinfo 文件是安装介质的识别信息,此文件不可缺少。
下面将重点剖析一下images 与isolinux 的目录中的文件及其作用,相对Centos 与repodata 的目录在深度定制时的意义要大得多。
images 文件夹包含了引导启动的映像文件,主要的为boot.iso 文件其中包含信息如下:
|----vmlinuz Linux 内核
|----ldlinux.sys 引导Linux 的系统文件
|----syslinux.cfg Linux 内核引导参数配置文件
|----initrd.img 内存虚拟文件系统映像文件
|----*.msg 文件 引导时的各种提示信息文件
其中,initrd.img 为Linux ext2 文件系统,构成如下:
initrd.img
|----/bin
|----/dev
|----/etc
|----/module
|----/sbin ------ loader
安装程序装载器
|----/tmp
|----/var
可执行文件/sbin/loader 的任务是判断安装介质的有效性,并从中执行安装程序。
在系统启动时被执行后在内存建立起了Linux 内核, 并根据配置文件syslinux.cfg 装载虚拟文件系统,形成了完整的Linux 系统,为后续的工作提供了必要的操作系统环境。可以通过如下命令查看boot.iso 中的文件:
#mount -o loop boot.iso /mnt
#cd /mnt
## tree
.
|-- TRANS.TBL
`-- isolinux
|-- TRANS.TBL
|-- boot.cat
|-- boot.msg
|-- general.msg
|-- initrd.img
|-- isolinux.bin
|-- isolinux.cfg
|-- memtest
|-- options.msg
|-- param.msg
|-- rescue.msg
|-- splash.lss
`-- vmlinuz
images 文件夹的stage2.img 是当安装介质为CD-ROM 时的安装程序映像文件。
这里主要讨论stage2.img 的内容
stage2.img
|----/etc
|----/modules
|----/proc
|----/usr----/bin----anaconda
安装程序主执行文件
|
|------/lib-----/anaconda
安装程序脚本文件目录
| |----/installclasses
| |----/iw
| |----/texttw
| |----*.py
|
|------/share---/anaconda
安装程序资源文件目录
| |----/help
| |----/pixmaps
安装引导图形资源目录,包括安装过程中使用到的所有位图,图标,可以通过GMIP 等工具修改
stage2.img 映像文件中的主要部分是安装程序anaconda ,它的主执行体是/usr/bin 下的anaconda ,由其调用的大量例程分布在/usr/lib/anaconda 下,而安装过程中要用到的资源文件分布在/usr/share/anaconda 下。可以通过执行如下命令具体查看stage2.img 中的内容:
#mount -o loop -t squashfs
stage2.img /mnt
#cd /mnt
#ls
etc lib modules proc usr var
顺带说一下anaconda 安装程序,主要用Python 语言写成,它是一种解释性的,面向对象的脚本语言,在其源码目录中有很多py 的文件就是。要全面完成基于Centos 的Linux 发行版,使用和学习shell 、Python 是很有必要的。
anaconda
|-------------------/bootdisk
启动盘目录
|-------------------/docs
文档目录
|-------------------/help
安装过程帮助系统目录
|-------------------/installclasses
安装类型分类目录,常由四个文件workstation.py , server.py , laptop.py 和custom.py 来描述workstation( 工作站) 安装类型,server( 服务器) 安装类型,laptop( 膝上型电脑) 安装类型和custom( 自定义) 安装类型。
|-------------------/iw
安装各步骤响应目录,子目录中各文件定义了在图形界面安装状态时各步骤对Next 和Prev 的响应函数。
|-------------------/loader
安装程序装载器目录
|-------------------/pixmap
图形资源目录,包括安装过程中使用到的所有位图,图标。
|-------------------/utils
安装程序实用工具目录
|-------------------*.py
各Python 脚本文件
图:基于Centos 的Linux 发行版构建流程
通过上面的内容分析,接下俩具体定制一个基于Centos 的Linux 发行版本的实践过程,并通过脚本安装openvpn 。
一、导入Centos yum 源的验证密码信息,并安装必要的软件包
#rpm --import
/etc/pki/rpm-gpg/RPM-GPG-KEY*
#yum -y install anaconda
anaconda-runtime
#yum -y install createrepo
二、将Centos DVD 光盘镜像文件复制到硬盘Centos5 制作目录中
#mkdir /CentOS5
#mount -o loop
/home/CentOS-5.2-i386-bin-DVD.iso /mnt
#cp -ar /mnt/* . 操作结束需要检查.discinfo 是否复制
#tar -cf - .|(cd /CentOS5;
tar -xvpf -)
三、依据完整的安装日志 /root/install.log 记录的软件包信息,结合shell 脚本将rpm 软件包复制到构建目录CentOS 中,通过createrepo 生成comps.xml 。
根据目标主机的install.log 文件生成package.list 软件包清单
#cat install.log | grep
Installing | sed 's/Installing //g' > packages.list
建立RPM 目录,临时存放复制需要rpm 软件包,
cprpm.sh 脚本清单
cat cprpm.sh
#!/bin/bash
DEBUG=0
DVD_CD=/mnt
ALL_RPMS_DIR=/mnt/CentOS
DVD_RPMS_DIR=/RPM
packages_list=/root/packages.list
number_of_packages=`cat
$packages_list | wc -l`
i=1
while [ $i -le
$number_of_packages ] ; do
line=`head -n $i
$packages_list | tail -n -1`
name=`echo $line | awk
'{print $1}'`
version=`echo $line | awk
'{print $3}' | cut -f 2 -d :`
if [ $DEBUG -eq
"1" ] ; then
echo $i: $line
echo $name
echo $version
fi
if [ $DEBUG -eq
"1" ] ; then
ls
$ALL_RPMS_DIR/$name-$version*
if [ $? -ne 0 ] ; then
echo "cp
$ALL_RPMS_DIR/$name-$version* "
fi
else
echo "cp
$ALL_RPMS_DIR/$name-$version* $DVD_RPMS_DIR/"
cp
$ALL_RPMS_DIR/$name-$version* $DVD_RPMS_DIR/
# in case the copy failed
if [ $? -ne 0 ] ; then
echo "cp
$ALL_RPMS_DIR/$name-$version* "
cp $ALL_RPMS_DIR/$name*
$DVD_RPMS_DIR/
fi
fi
i=`expr $i + 1`
done
执行脚本将目标系统必要的rpm 复制到/Centos5/CentOS 目录
#rm -rf /CentOS5/CentOS
#cp -a /myRPM/*
/CentOS5/CentOS
返回到/CentOS5 目录下,执行createrepo 程序生成repodata 下的comps.xml 文件
#cd /CentOS5
#createrepo -g
repodata/comps.xml .
四、使用Kickstart ,创建一个包含自动应答信息的典型的安装配置脚本。结合使用Kickstart 文件中的%post 安装后的脚本,可以通过默认的shell 脚本语法实现文件的下载、软件包的编译等工作,进一步达到发布定制的需求。
建立Kickstart 文件并命名为ks1483.cfg
# Kickstart file
automatically generated by anaconda.
install
cdrom
lang en_US.UTF-8
keyboard us
network --device eth0
--bootproto static --ip 172.16.1.148 --netmask 255.255.0.0 --gateway
172.16.1.9 --nameserver 172.16.1.9 --hostname trs.lvs.local
reboot
rootpw --iscrypted
$1$t5sWRB7u$MJAcDD0IBMivcTMP65YBC.
firewall --enabled
--port=22:tcp
authconfig --enableshadow
--enablemd5
selinux --enforcing
timezone --utc Asia/Shanghai
bootloader --location=mbr
--driveorder=sda
# The following is the
partition information you requested
# Note that any partitions
you deleted are not expressed
# here so unless you clear
all partitions first, this is
# not guaranteed to work
zerombr yes
clearpart --all --drives=sda
part /boot --fstype ext3
--size=100 --ondisk=sda
part pv.2 --size=0 --grow
--ondisk=sda
volgroup VolGroup00
--pesize=32768 pv.2
logvol swap --fstype swap
--name=LogVol01 --vgname=VolGroup00 --size=1000 --grow --maxsize=1984
logvol / --fstype ext3
--name=LogVol00 --vgname=VolGroup00 --size=1024 --grow
%packages
@editors
@text-internet
@core
@base
@development-libs
@development-tools
device-mapper-multipath
-sysreport
%post
mount /dev/cdrom /mnt
cp -rf /mnt/lvsheat /usr/local/src
cd /usr/local/src/lvsheat
tar zxvf lzo-2.03.tar.gz -C
/usr/src
cd /usr/src/lzo-2.03
./configure && make
&& make install
cd -
tar zxvf openvpn-2.0.9.tar.gz
-C /usr/src
cd /usr/src/openvpn-2.0.9
./configure && make
&& make install
将光盘中的lvsheat 目录中的openvpn 编译需要的软件包通过脚本复制到系统的/usr/local/src/lvsheat 目录并解压编译对应的源码包,完成对openvpn 的编译安装操作。
将ks1483.cfg 添加进入到isolinux.cfg ,已实现定制的Kickstart 脚本能够被正确的执行。
cat isolinux.cfg
default auto
prompt 1
timeout 600
display boot.msg
F1 boot.msg
F2 options.msg
F3 general.msg
F4 param.msg
F5 rescue.msg
label linux
kernel vmlinuz
append initrd=initrd.img
label text
kernel vmlinuz
append initrd=initrd.img
text
label auto
kernel vmlinuz
append
ks=cdrom:/isolinux/ks1483.cfg initrd=initrd.img
label ks
kernel vmlinuz
append ks initrd=initrd.img
label local
localboot 1
label memtest86
kernel memtest
append -
五、制作生成ISO 文件
#cd /CentOS5/
#mkisofs -R -J -T -r -l -d
-allow-multidot -allow-leading-dots -no-bak -o ../home/CentOS.iso -b
isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4
-boot-info-table .
扩展方式:
1、 关于修改anaconda 中的资源如定义安装界面的方式
2、 安装yum install squashfs-tools
anaconda 资源修改:
加载anaconda 文件
#mkdir /mnt/anaconda
#mount -o loop -t squashfs
stage2.img /mnt/anaconda
然后进入到/mnt/anaconda 中修改定制具体的文件。
打包anaconda 文件
#mkfs.cramfs /mnt/anaconda
stage2.img
或者执行
#mksquashfs /mnt/anaconda
/tmp/stage2.img.new -all-root -no-fragments
图:简单定制的安装过程背景图
2 、定制开机启动界面方式
启动画面用的是一种比较奇怪的格式lss16 ,它限制图片使用16 种颜色,除去前景和背景色只能有14 种颜色。我们需要ppmtolss16 giftopnm 等程序,系统一般默认都安装了。
一般用gimp 生成一个index 模式的gif 图形,颜色限制为14, 然后通过如下的办法进行转:
安装yum -y install syslinux
giftopnm < splash.gif |
ppmtolss16 > splash.lss
如果要编辑一个lss 文件先用lsstoppm 转成ppm 格式,然后用gimp 进行编辑.
另外你还需要修改isolinux/boot.msg 文件如下
^L
^Xsplash.lss
- Babel
Com Australia Fedora Core Linux installer.
- Use
the function keys listed below for more information.
^O02[F1-Main] [F2-Options] [F3-General] [F4-Kernel] [F5-Rescue]^O07
图:简单修改的开机启动画面
六、测试制作的安装光盘,通VMware 、XEN 、VirtualBox 虚拟机测试如果没有出现问题,在PC 上就可以顺利的安装。
图:安装后的目录信息
后记:本文讨论的是一个实现Base
Centos Linux 发行版的实现方法,同时再次提醒奔放是基于Centos 5.2 的实现方式。也欢迎爱好Linux 发行版实现探究的朋友一起来交流。
阅读(2422) | 评论(0) | 转发(0) |