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是很有必要的,:-D

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软件包,

#mkdir
/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中的资源如定义安装界面的方式
安装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上就可以顺利的安装。

图:安装后的目录信息

网络安装之Redhat衍生版的更多相关文章

  1. Percona,MariaDB,MySQL衍生版如何取舍

    缘起 自从甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险.而且Oracle对培养MySQL这个免费的儿子并不太用心,漏洞修补和版本升级的速度一段时间非常缓慢,所以业界对MySQL的未来普遍 ...

  2. RPM方式安装MySQL5.6和windows下安装mysql解压版

    下载地址: http://cdn.MySQL.com/archives/mysql-5.6/MySQL-server-5.6.13-1.el6.x86_64.rpmhttp://cdn.mysql.c ...

  3. 网络安装archlinux(2012.8.20)笔记

    周末闲极无聊,把烂笔记本翻出来想装个Archlinux,发现USB不能启动,光驱也挂了,只好网络安装. 我先后试了两种安装方式,一种纯互联网启动,安装,一种局域网启动,再互联网安装.分别说说. 不管哪 ...

  4. Tengine – Nginx衍生版

    Tengine是淘宝在Nginx基础上开发的一个衍生版.官方的简介说针对大访问量网站的需求,添加了很多高级功能和特性.Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验. ...

  5. pxe网络安装操作系统 原理与详细过程

    摘要:在实际工作中,我们经常会遇到这样的情况:想要安装Linux但是计算机不带光驱或软驱,或者是笔记本配置的非标准的软驱和光驱,如1394接口,USB接口等,在Linux安装时所引导的Linux内核一 ...

  6. CentOS7.4安装部署openstack [Liberty版] (一)

    一.OpenStack简介 OpenStack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目. OpenStack是一个 ...

  7. Linux系统网络安装——基于pxe+dhcp+nfs+tftp+kickstart

    原文发表于:2010-09-05 转载至cu于:2012-07-21 一.原理简介 PXE(preboot execute environment)工作于Client/Server的网络模式,支持工作 ...

  8. 安装SQL Server2016正式版

    安装SQL Server2016正式版 今天终于有时间安装SQL Server2016正式版,下载那个安装包都用了一个星期 安装包可以从这里下载: http://www.itellyou.cn/ ht ...

  9. 「ubuntu」通过无线网络安装Ubuntu Server,启动系统后如何连接无线网络

    接触Ubuntu系统不久,发现无线网络环境下安装Ubuntu Server一个不太人性化的设计:在安装过程中选择无线网卡,即使用无线网络安装(此时需要选择Wi-Fi网络并输入密码),但系统安装完成重启 ...

随机推荐

  1. H5 input type="search" 不显示搜索 解决方法

    在IOS(ipad iPhone等)系统的浏览器里打开H5页面.如下写法: <input type="search" name="search” id=" ...

  2. R语言 如何为图片添加文字说明(转载)

    转载:(中文翻译者)[http://blog.csdn.net/chen790646223/article/details/49766659] (原文链接)[http://datascienceplu ...

  3. ORACLE 检查数据库表中是否存在不规范字 段的语句参考.sql

    --查看是否有除number,char,date,varchar2,clob/blob之外的类型,比如:NVARCHAR2,TIMESTAMP(6),FLOATSELECT DISTINCT a.DA ...

  4. Netsharp快速入门(之14) 销售管理(报表A 热销滞销品统计)

    作者:秋时 杨昶   转载须说明出处 4.5     销售报表 4.5.1  热销滞销品统计 1.建立部件工作区,主部件选择报表.统计表,辅部件选择查询方案 2.设置报表模版.选择主部件,选择工具-报 ...

  5. JS 学习笔记--13---原型

    练习中使用的是IE11,如果有错误之处,还请各位朋友多多指教.本文关于原型难以描述,故多用代码展示 原型是JS中一个很重要的概念,也是JS中一个难点,语言上难以描述,原型对象的属性和方法叫做原型属性和 ...

  6. bzoj 1024 暴力深搜

    我们直接暴力的深搜怎么切就行了, 每一刀切的方案只有横着和竖着,横竖又分在几等分点切, 因为要保证每个人的面积相同,所以比较好处理了,第几个几等分点就 分给这边几刀. /*************** ...

  7. 响应式设计Responsinator工具推荐

    from:http://www.25xt.com/allcode/4066.html 原文推荐了5种,感觉有用的吧就这一种,所以收藏过来. Responsinator工具的好处Responsinato ...

  8. GPU crash unmap page access

    这类gpu crash是 texture 没有gpu address 调试方法 去看texture,  texture state 里面allocateMemoryBlock...这里面有gpuadd ...

  9. WPF编程学习——布局

    本文目录 1.布局简介 2.面板(Panel) 3.视图框(Viewbox) 4.滚动视图控件(ScrollViewer) 5.公共布局属性 1.布局简介 应用程序界面设计中,合理的元素布局至关重要, ...

  10. LCIS(m*n) 最长公共上升子序列

    详见:http://wenku.baidu.com/view/3e78f223aaea998fcc220ea0n3的: for(int i=1;i<=n;i++)             for ...