分享

运维社区,Linux运维,自动化运维,Nagios监控

 icecity1306 2014-12-15
简介

GNU/Linux开源,这个意义实在是非常的广泛,目前在distrowatch上表现活跃的300个发行版代表了GNU/Linux的主流,然而细心的Linux爱好者会发现CentOS-based distribution designed based on Slackware Linuxa distribution built from source software packages for Red Hat Enterprise Linuxa user-friendly Ubuntu-based distributionan Debian-based distribution等关键词汇,目前大多数的发行版基本上都是源于RedhatDebian/Ubuntu Suse Slackware等版本的衍生态,而构建Based Distribution的目的有很多,不乏有技术交流、功能完善、以及管理、更新Bug软件包等需求,同样这些Based Distribution也为Linux爱好者构建自己的Linux发行版本提供了很好的参照。本文作为独辟蹊径的系列文章,将带领大家初探基于Cenotos 5.4Linux发行版构建方式,为进一步深入研究提供一个基础。

Linux 启动过程

要实现基于CentOSLinux发行版本的构建,首先需要了解一下Linux启动过程以及Linux启动文件相关的了解,同时要对Linux发行版本的光盘结构以及软件包的结构进行了解分析。从主机加电到系统服务加载运行,Linux的启动(Linux安装的过程雷同)大致需要经历如下的过程:

第一阶段:
加载bios的硬件信息,并获取第一个启动的设备的代号;读取第一个启动设备的mbr的引导加载程序(lilogrub)的启动信息;加载核心操作系统的核心信息,核心开始解压缩,并且尝试驱动所有硬件设备;

分析此阶段是很有价值的,即便是Linux系统的安装也需要加载内核并解压内核、加载各类外设的驱动信息,构建一个最小化的Linux的文件系统以执行第二阶段的进程。

第二阶段:
核心执行init程序并获取运行信息;init执行/etc/rc.d/rc.sysinit文件;启动核心的外挂模块(/etc/modprobe.conf)init执行运行的各个批处理文件(Scripts);init执行/etc/rc.d/rc.local文件;执行/bin/login程序,等待用户登陆;登陆之后开始以shell控制主机。

Linux 安装程序架构

通俗的一个说法,Linux的光盘安装就是在第一阶段由stage2.img 构建产生的最小化的Linux文件系统之上运行anaconda之类的安装程序,完成Linux系统的安装过程。在Linux安装过程中第二阶段就是运行anaconda并配合系统安装预设选项完成对系统安装。
  构建Base CentOS DistributionLinux发行版可以简单分为两种方式,第一种是通过结合Kickstart安装预配置文件对CentOS系统安装的软件包并结合Kickstartpostpre的脚本对安装的系统进行初始化的配置;第二种方式是通过添加修改stage2.img所生成的Linux文件系统达到定制内核、在安装过程添加定义的向导信息等。第一种方式实现便捷、KickstartX界面工具操作也相对简单,如要略去光盘中不安装不需要的软件包,并添加第三方的rpm或者tar.gz源码包,就需要深入研究repodata中的comps.xml的基于yum的软件包依赖关系的定义,并能够有基本的shell脚本的累加能力,将要安装的软件包及设置通过脚本实现。相对第二种方式的不足之处就是还是使用CentOS的系统并没有对内核或其他参数做明确的发布调整,故此第二种方式就深入修改stage2.imganaconda相关的配置实现,以达到发布独立有别于Base CentOS DistributionLinux版本。
  基于CentOSLinux发行版的目的是为了在系统中能够快速,正确地建立Linux系统环境。实现的方式以分析CentOS的安装光盘为起点,在掌握对应的技巧方法,同时建立相应的测试环境。

CentOS 5.4 光盘架构

CentOS 5.4DVD介质为例,光盘中包含的主要与定制相关的目录如下:

isolinux目录存放光盘启动时的安装界面信息

repodata目录是与RPM包安装相关的依赖信息

images目录包括了必要启动映像文件

CentOS目录存放安装软件包信息

.discinfo文件是安装介质的识别信息,此文件不可缺少。

下面将重点剖析一下imagesisolinux的目录中的文件及其作用,相对CentOSrepodata的目录在深度定制时的意义要大得多。
images
文件夹包含了引导启动的映像文件,主要的为boot.iso文件其中包含信息如下:

|----vmlinuz Linux内核
|----ldlinux.sys 
引导Linux的系统文件
|----syslinux.cfg Linux
内核引导参数配置文件
|----initrd.img 
内存虚拟文件系统映像文件
|----*.msg
文件 引导时的各种提示信息文件

其中,initrd.imgLinux 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
  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的文件就是。要全面完成基于CentOSLinux发行版,使用和学习shellPython是很有必要的,:-D

anaconda
  |-------------------/bootdisk 
启动盘目录
  |-------------------/docs 
文档目录
  |-------------------/help 
安装过程帮助系统目录
  |-------------------/installclasses 
安装类型分类目录,常由四个文件workstation.py , server.py , laptop.pycustom.py来描述workstation(工作站)安装类型,server(服务器)安装类型,laptop(膝上型电脑)安装类型和custom(自定义)安装类型。
  |-------------------/iw 
安装各步骤响应目录,子目录中各文件定义了在图形界面安装状态时各步骤对NextPrev的响应函数。 
  |-------------------/loader 
安装程序装载器目录
  |-------------------/pixmap 
图形资源目录,包括安装过程中使用到的所有位图,图标。
  |-------------------/utils 
安装程序实用工具目录
  |-------------------*.py 
Python脚本文件

基于CentOSLinux发行版构建流程

 

 

定制CentOS linux发行版本实例

通过上面的内容分析,接下来具体定制一个基于CentOSLinux发行版本的实践过程。

第一步:导入yum原验证密码信息:

导入CentOS yum源的验证密码信息,并安装必要的软件包

#rpm --import /etc/pki/rpm-gpg/Packages-GPG-KEY*

#yum -y install anaconda anaconda-runtime

#yum -y install createrepo yum-utils anaconda-help busybox-anaconda mkisofs

第二步:复制镜像到硬盘:

CentOS DVD光盘镜像文件复制到硬盘CentOS制作目录中:

mkdir /CentOS

mount -o loop /home/ CentOS-5.4-x86_64-bin-DVD.iso /mnt#mount /dev/cdrom /mnt

# cd /mnt

tar -cf - repodata/ | ( cd /CentOS ; tar -xvpf - )

tar -cf - NOTES/ | ( cd /CentOS ; tar -xvpf - )

#tar -cf - isolinux/ | ( cd /CentOS ; tar -xvpf - )

#tar -cf - images/ | ( cd /CentOS ; tar -xvpf - )

tar -cf - .discinfo | ( cd /CentOS ; tar -xvpf - )

#tar -cf - .treeinfo | ( cd /CentOS ; tar -xvpf - )

 

第三步:根据install.log生成所需安装包得列表:

依据完整的安装日志 /root/install.log记录的软件包信息,结合shell脚本将rpm软件包复制到构建目录/CentOS/Packages中。
根据目标主机的install.log文件生成package.list软件包清单

#cat /root/install.log | grep Installing | awk -F " " '{print $2}'|awk -F -[0-9]. '{print $1}' >> /root/packages.list

 

第四步:生成Packages目录,复制rpm软件包:

建立Packages目录,存放复制需要的rpm软件包,

#mkdir /CentOS/Packages

cprpm.sh脚本清单,

#cat /root/cprpm.sh
#!/bin/bash
cd /mnt/CentOS
packages_list=$(( cat /root/packages.list ))
for packages in $packages_list
do
cp $packages*.rpm 
/CentOS/Packages
done
执行脚本将目标系统必要的
rpm包复制到/CentOS/Packages目录     #sh /root/cprpm.sh

注意:这里非常关键,你要检验复制过的包是否有遗漏(wc -l /root/packages.list与ls /CentOS/Packages|wc -l相等才行),需要把遗漏的包手工再次复制。返回到/CentOS目录下,执行createrepo程序生成repodata下的comps.xml文件

#cd /CentOS

#createrepo -g repodata/comps.xml .

 

第五步:设置kickstart文件:

使用Kickstart,创建一个包含自动应答信息的典型的安装配置脚本。结合使用Kickstart文件中的%post安装后的脚本,可以通过默认的shell脚本语法实现文件的下载、软件包的编译等工作,进一步达到发布定制的需求。
建立Kickstart文件并命名为ks.cfg

# Kickstart file automatically generated by anaconda.

install

cdrom

lang zh_CN.UTF-8

keyboard us

network --device eth0 --bootproto dhcp

rootpw --iscrypted $1$DitpSKpA$LEMm2xZNpAF2HCOGrTbBF/

firewall --enabled --port=2828:tcp

authconfig --enableshadow --enablemd5

selinux --disabled

timezone --utc Asia/Shanghai

zerombr yes

bootloader --location=mbr --driveorder=sda

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 / --fstype ext3 --name=LogVol00 --vgname=VolGroup00 --size=1024 --grow

logvol swap --fstype swap --name=LogVol01 --vgname=VolGroup00 --size=512 --grow --maxsize=1024

%packages

@base

@chinese-support

@core

@editors

keyutils

trousers

fipscheck

device-mapper-multipath

autoconf

automake

bison

bzip2

bzip2-devel

bzip2-libs

cpp

curl

curl-devel

e2fsprogs

e2fsprogs-devel

e2fsprogs-libs

flex

fontconfig-devel

freetype

freetype-devel

gcc

gcc-c++

glib2-devel

glibc

glibc-common

glibc-devel

glibc-headers

imake

kernel-devel

kernel-headers

keyutils-libs-devel

krb5-devel

krb5-libs

krb5-workstation

libchewing

libevent

libevent-devel

libgcc

libgomp

libidn

libidn-devel

libjpeg-devel

libpng

libpng-devel

libselinux

libselinux-devel

libselinux-python

libselinux-utils

libsepol

libsepol-devel

libstdc++

libstdc++-devel

libtool

libtool-ltdl

libXau-devel

libXaw

libXdmcp-devel

libXfontcache

libxml2

libxml2-devel

libXmu

libXpm

libXpm-devel

libXTrap

libXxf86misc

mesa-libGL

mesa-libGL-devel

ncurses-devel

nfs-utils

nscd

openssl

openssl-devel

patch

pkgconfig

scim

scim-chewing

scim-libs

scim-pinyin

scim-tables

scim-tables-chinese

vim-minimal

xorg-x11-proto-devel

xorg-x11-server-utils

xorg-x11-xauth

xorg-x11-xinit

zlib

zlib-devel

 

%post --nochroot

mkdir -p /mnt/cdrom

mount -r -t iso9660 /tmp/cdrom /mnt/cdrom

cp /mnt/cdrom/lnmp/* /mnt/sysimage/tmp > /dev/null

cd /mnt/sysimage/tmp/

tar -zxvf eaccelerator.tgz > /dev/null

tar -zxvf gd2.tgz > /dev/null

tar -zxvf jpeg6.tgz > /dev/null

tar -zxvf memcache-2.2.6.tgz > /dev/null

tar -zxvf memcached-1.4.5.tar.gz > /dev/null

tar -zxvf mysql.tgz > /dev/null

tar -zxvf nginx-0.8.53.tar.gz > /dev/null

tar -zxvf ngx_cache_purge-1.2.tar.gz > /dev/null

tar -zxvf pcre-8.01.tar.gz > /dev/null

tar -zxvf php-5.2.11.tar.gz > /dev/null

tar -jxvf proftpd-1.3.0.tar.bz2 > /dev/null

tar -zxvf Zend.tgz > /dev/null

 

%post

/usr/sbin/groupadd www -g 58

/usr/sbin/useradd -u 58 -g www www

 #Install LNMP

cd /tmp/mysql-5.1.43

sh BUILD/autorun.sh

./configure --prefix=/usr/local/mysql --localstatedir=/home/mysql --with-comment=Source --with-server-suffix=-Community-Server --with-mysqld-user=mysql --without-debug --with-big-tables --with-charset=utf8  --with-extra-charsets=all --with-pthread --enable-static --enable-thread-safe-client --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static --enable-assembler --with-innodb --without-ndb-debug --without-isam && make && make install

groupadd mysql

useradd -g mysql -s /sbin/nologin mysql

chown -R root /usr/local/mysql

chgrp -R mysql /usr/local/mysql

./scripts/mysql_install_db --user=mysql --datadir=/home/mysql

chgrp -R mysql /usr/local/mysql

chown -R mysql /home/mysql

chgrp -R mysql /home/mysql/

cp ../my.txt /etc/my.cnf

cp /usr/local/mysql/share/mysql/mysql.server /etc/rc.d/init.d/mysqld

chmod +x /etc/rc.d/init.d/mysqld

chkconfig --level 235 mysqld on

service mysqld start

ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql

#########################

cd ../jpeg6

./configure --prefix=/usr/local/jpeg6 && make

mkdir /usr/local/jpeg6

mkdir /usr/local/jpeg6/include

mkdir /usr/local/jpeg6/lib

make install-lib

mkdir /usr/local/jpeg6/bin

mkdir /usr/local/jpeg6/man

mkdir /usr/local/jpeg6/man/man1

make install

#########################

cd ../gd2

make clean

./configure --prefix=/usr/local/gd2 --with-jpeg=/usr/local/jpeg6 && make && make install

#########################

cd ..

gunzip php-5.2.11-fpm-0.5.13.diff.gz

patch -d php-5.2.11 -p1 < php-5.2.11-fpm-0.5.13.diff

cd php-5.2.11/

./configure --prefix=/usr/local/php5211 --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-fastcgi --enable-force-cgi-redirect --enable-fpm --with-zlib --with-curl --with-jpeg-dir --with-png-dir --with-gd  --with-freetype-dir --with-libxml-dir --enable-ftp --enable-soap --enable-mbstring --enable-pdo --with-pdo-sqlite --with-pdo-mysql=/usr/local/mysql/bin/mysql_config && make && make install

cp php.ini-dist /usr/local/php5211/lib/php.ini

#########################

cd ../eaccelerator

export PHP_PREFIX="/usr/local/php5211/"

$PHP_PREFIX/bin/phpize

./configure --enable-eaccelerator=shared --with-php-config=$PHP_PREFIX/bin/php-config

make && make install

cat >> /usr/local/php5211/lib/php.ini <<EOD

[eaccelerator]

extension_dir="/usr/local/php5211/lib/php/extensions/no-debug-non-zts-20060613/"

extension="eaccelerator.so"

eaccelerator.shm_size="32"

eaccelerator.cache_dir="/tmp/eaccelerator"

eaccelerator.enable="1"

eaccelerator.optimizer="1"

eaccelerator.check_mtime="1"

eaccelerator.debug="0"

eaccelerator.filter=""

eaccelerator.shm_max="0"

eaccelerator.shm_ttl="0"

eaccelerator.shm_prune_period="0"

eaccelerator.shm_only="0"

eaccelerator.compress="1"

eaccelerator.compress_level="9"

EOD

mkdir -p /tmp/eaccelerator

chmod 0777 /tmp/eaccelerator

#########################

cd ..

mkdir -p /usr/local/zend/lib

cp Zend/data/5_2_x_comp/ZendOptimizer.so  /usr/local/zend/lib/

cat >> /usr/local/php5211/lib/php.ini <<EOF

[Zend Optimizer]

zend_optimizer.optimization_level=15

zend_extension="/usr/local/zend/lib/ZendOptimizer.so"

EOF

#########################

cd pcre-8.01/

./configure && make && make install

#########################

cd ../nginx-0.8.53/

./configure --user=www --group=www --add-module=../ngx_cache_purge-1.2 --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module && make && make install

cp ../nginx /etc/rc.d/init.d/

cp ../nginx /etc/init.d/

chmod +x /etc/rc.d/init.d/nginx

chmod 755 /etc/init.d/nginx

chkconfig --add nginx

chkconfig --level 2345 nginx on

service nginx start

#########################

cd ../proftpd-1.3.0/

groupadd nogroup

./configure --prefix=/usr/local/proftpd

make && make install

cp contrib/dist/rpm/proftpd.init.d /etc/rc.d/init.d/proftpd

chmod +x /etc/rc.d/init.d/proftpd

chkconfig --add proftpd

chkconfig --levels 2345 proftpd on

cp /usr/local/proftpd/sbin/proftpd /bin

service proftpd start

#########################

cd ../memcache-2.2.6

/usr/local/php5211/bin/phpize

./configure -with-php-config=/usr/local/php5211/bin/php-config

make && make install

FILE=/usr/local/php5211/lib/php.ini

LINE=`grep -n "\./" $FILE | cut -d':' -f1`

sed -i -e "s/\.\//usr\/local\/php5211\/lib\/php\/extensions\/no-debug-non-zts-20060613/" $FILE

echo $LINE

sed -i -e `expr $LINE + 1`a'extension = memcache.so' $FILE

#########################

cd ../memcached-1.4.5

./configure

make && make install

/usr/local/bin/memcached -d -m 32 -l 127.0.0.1 -p 11211 -u root

 

#set open files

echo "fs.file-max=10240" >>/etc/sysctl.conf

echo "*  soft    nofile  65536" >>/etc/security/limits.conf

echo "*  hard    nofile  65536" >>/etc/security/limits.conf

 

#set SSHD

sed -i 's/^#UseDNS yes/UseDNS no/' /etc/ssh/sshd_config

sed -i 's/^port 22/port 2828/' /etc/ssh/sshd_config

 

#vim syntax on

echo 'syntax on' > /root/.vimrc 2>/dev/null

 

rm -rf /etc/cron.monthly/makewhatis.cron

rm -rf /etc/cron.weekly/makewhatis.cron

rm -rf /etc/cron.daily/makewhatis.cron

rm -rf /etc/cron.daily/mlocate.cron

 

cat >> /etc/sysctl.conf << EOD

net.ipv4.tcp_max_syn_backlog = 65536

net.core.netdev_max_backlog =  32768

net.core.somaxconn = 32768

net.core.wmem_default = 8388608

net.core.rmem_default = 8388608

net.core.rmem_max = 16777216

net.core.wmem_max = 16777216

net.ipv4.tcp_timestamps = 0

net.ipv4.tcp_synack_retries = 2

net.ipv4.tcp_syn_retries = 2

net.ipv4.tcp_tw_recycle = 1

#net.ipv4.tcp_tw_len = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_mem = 94500000 915000000 927000000

net.ipv4.tcp_max_orphans = 3276800

#net.ipv4.tcp_fin_timeout = 30

#net.ipv4.tcp_keepalive_time = 120

net.ipv4.ip_local_port_range = 1024  65535

net.ipv4.ip_forward=1

net.ipv4.tcp_syncookies=1

net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=3800

net.ipv4.ip_conntrack_max=300000

#varnish内核优化

net.ipv4.tcp_fin_timeout = 30

net.ipv4.tcp_keepalive_time = 300

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.ip_local_port_range = 5000    65000

EOD

 

#使配置立即生效:

/sbin/sysctl -p

sed -i 's/^NETWORKING_IPV6=yes/NETWORKING_IPV6=no/' /etc/sysconfig/network

chkconfig --levels 2345 iptables off

 

#优化系统服务:

/usr/bin/python -tt /usr/sbin/yum-updatesd

service_enable="atd auditd crond haldaemon irqbalance lvm2-monitor messagebus netfs n
etwork postfix psacct restorecond rpcgssd rpcidmapd rsyslog snmpd smartd sshd sysstat
 udev-post" 
for service_name in $service_enable
do
   chkconfig --level 34 $service_name on
done
service_disable="abrtd acpid autofs avahi-daemon certmonger cgconfig cgred cpuspeed i
p6tables iptables kdump mdmonitor microcode_ctl multipathd netconsole nfs nfslock nsc
d nslcd oddjobd rdisc rpcbind rpcsvcgssd saslauthd sssd tcsd ypbind"
for service_name in $service_disable
do
   chkconfig $service_name off
done

第六步:设置isolinux.cfg

ks.cfg添加进入到isolinux.cfg,已实现定制的Kickstart脚本能够被正确的执行。

default text

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 ks=cdrom:/ks.cfg

label text

  kernel vmlinuz

  append ks=cdrom:/ks.cfg initrd=initrd.img text

label local

  localboot 1

label memtest86

  kernel memtest

  append -

第七步:定制开机启动界面方式

启动画面用的是一种比较奇怪的格式lss16,它限制图片使用16种颜色,除去前景和背景色只能有14种颜色。我们需要ppmtolss16 giftopnm等程序,系统一般默认都安装了。
一般用gimp生成一个index模式的gif图形,颜色限制为14, 然后通过如下的办法进行转:
安装yum -y install syslinux 
giftopnm < splash.gif | ppmtolss16 > splash.lss
如果要编辑一个lss文件先用lsstoppm转成ppm格式,然后用gimp进行编辑.

第八步:生成ISO

制作生成ISO文件

#cd /CentOS/

#mkisofs -R -J -T -r -l -d -allow-multidot -allow-leading-dots -no-bak -o /home/CentOS_min.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table .

第九步:测试光盘

测试制作的安装光盘,通VMwareXENVirtualBox虚拟机测试如果没有出现问题,在PC上就可以顺利的安装。

图:安装后的目录信息
后记:本文讨论的是一个实现Base CentOS Linux发行版的实现方法,同时再次提醒本次是基于CentOS 5.4-X86_64的实现方式。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多