简介 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.4的Linux发行版构建方式,为进一步深入研究提供一个基础。 Linux 启动过程 要实现基于CentOS的Linux发行版本的构建,首先需要了解一下Linux启动过程以及Linux启动文件相关的了解,同时要对Linux发行版本的光盘结构以及软件包的结构进行了解分析。从主机加电到系统服务加载运行,Linux的启动(Linux安装的过程雷同)大致需要经历如下的过程: 第一阶段: 分析此阶段是很有价值的,即便是Linux系统的安装也需要加载内核并解压内核、加载各类外设的驱动信息,构建一个最小化的Linux的文件系统以执行第二阶段的进程。 第二阶段: Linux 安装程序架构 通俗的一个说法,Linux的光盘安装就是在第一阶段由stage2.img 构建产生的最小化的Linux文件系统之上运行anaconda之类的安装程序,完成Linux系统的安装过程。在Linux安装过程中第二阶段就是运行anaconda并配合系统安装预设选项完成对系统安装。 CentOS 5.4 光盘架构 以CentOS 5.4的DVD介质为例,光盘中包含的主要与定制相关的目录如下: isolinux目录存放光盘启动时的安装界面信息 repodata目录是与RPM包安装相关的依赖信息 images目录包括了必要启动映像文件 CentOS目录存放安装软件包信息 .discinfo文件是安装介质的识别信息,此文件不可缺少。 下面将重点剖析一下images与isolinux的目录中的文件及其作用,相对CentOS与repodata的目录在深度定制时的意义要大得多。 |----vmlinuz Linux内核 其中,initrd.img为Linux ext2文件系统,构成如下: 在系统启动时被执行后在内存建立起了Linux内核,并根据配置文件syslinux.cfg装载虚拟文件系统,形成了完整的Linux 系统,为后续的工作提供了必要的操作系统环境。可以通过如下命令查看boot.iso中的文件: #mount -o loop boot.iso /mnt images文件夹的stage2.img 是当安装介质为CD-ROM时的安装程序映像文件。 这里主要讨论stage2.img的内容 #mount -o loop -t squashfs stage2.img /mnt 顺带说一下anaconda安装程序,主要用Python语言写成,它是一种解释性的,面向对象的脚本语言,在其源码目录中有很多py的文件就是。要全面完成基于CentOS的Linux发行版,使用和学习shell、Python是很有必要的,:-D anaconda 基于CentOS的Linux发行版构建流程 ![]() 定制CentOS linux发行版本实例 通过上面的内容分析,接下来具体定制一个基于CentOS的Linux发行版本的实践过程。 第一步:导入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中。 #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 注意:这里非常关键,你要检验复制过的包是否有遗漏(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 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 network 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等程序,系统一般默认都安装了。 第八步:生成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 . 第九步:测试光盘 测试制作的安装光盘,通VMware、XEN、VirtualBox虚拟机测试如果没有出现问题,在PC上就可以顺利的安装。 |
|
来自: icecity1306 > 《Linux》