24.03.2015 Views

利用CentOS 快速构建自己的发行版【背景】 一.制作 ... - LinuxTone.Org

利用CentOS 快速构建自己的发行版【背景】 一.制作 ... - LinuxTone.Org

利用CentOS 快速构建自己的发行版【背景】 一.制作 ... - LinuxTone.Org

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

IT 运 维 专 家 网<br />

http://www.linuxtone.org<br />

利 用 CentOS 快 速 构 建 自 己 的 发 行 版<br />

作 者 : NetSeek http://www.linuxtone.org<br />

日 期 : 2009-4-10 版 本 号 :V1<br />

【 背 景 】<br />

我 的 朋 友 不 少 是 个 人 网 站 站 长 并 且 网 站 运 营 的 都 很 不 错 。 但 是 每 次 业 务 扩 容 装 Linux 系 统 都 让 他 们 很 头 痛 。<br />

有 的 IDC 技 术 不 会 装 Linux 系 统 , 或 者 有 的 就 是 装 一 次 系 统 收 取 一 定 的 费 用 。 为 此 一 个 朋 友 向 我 提 出 能 不 能<br />

做 一 个 精 简 一 点 的 CentOS 发 行 版 , 并 且 针 对 <strong>LinuxTone</strong> 论 坛 里 的 做 个 版 本 并<br />

且 集 成 初 始 化 优 化 脚 本 。 为 此 我 建 立 了 LTOS 这 个 发 行 版 。 以 下 是 具 体 的 制 作 过 程 和 朋 友 们 一 起 分 享 ! 希 望<br />

能 共 同 进 步 并 且 支 持 http://www.linuxtone.org 的 发 展 !<br />

一 . 制 作 LTOS 具 体 过 程<br />

光 盘 结 构 介 绍<br />

* isolinux 目 录 存 放 光 盘 启 动 时 的 安 装 界 面 信 息<br />

* images 目 录 包 括 了 必 要 的 启 动 映 像 文 件<br />

* CentOS 目 录 存 放 安 装 软 件 包 及 信 息<br />

* .discinfo 文 件 是 安 装 价 质 的 识 别 信 息<br />

* lemp.tar.gz 文 件 存 放 系 统 初 始 化 及 其 相 关 程 序 安 装 脚 本 .<br />

》》 环 境 说 明 :CentOS 5.3-i386 Vmware Workstation 上 完 成 制 作 工 作 .<br />

1. 安 装 制 作 发 行 版 所 需 的 基 本 软 件 包<br />

# yum -y install anaconda-runtime createrepo yum-utils anaconda anaconda-help busybox-anaconda mkisofs<br />

2. 制 作 ltos 源 文 件 夹<br />

# mkdir /ltos<br />

# mkdir /mnt/cdrom<br />

# mount -t iso9660 -o loop /dev/cdrom /mnt/cdrom/ 挂 载 光 盘 镜 像<br />

或 者 挂 载 ISO 文 件 到 /mnt/cdrom<br />

# mount -t iso9660 -o loop centos.xxx.iso /mnt/cdrom 将 CentOS 的 ISO 文 件 挂 载 到 /mnt/cdrom 目 录<br />

# cd /mnt/cdrom<br />

# tar -cf - . | ( cd /ltos ; tar -xvpf - ) // 将 /mnt/cdrom 里 的 文 件 利 用 tar 全 部 拷 贝 到 /ltsos 这 个 目 录 下 .<br />

#cd /ltos // 进 入 此 目 录 删 除 一 些 无 关 的 文 件 , 仍 后 进 入 后 面 的 工 作 .<br />

[root@server ltos]# ls -al<br />

total 88<br />

drwxr-xr-x 6 root root 4096 Apr 11 21:00 .<br />

drwxr-xr-x 27 root root 4096 Apr 12 05:26 ..<br />

drwxr-xr-x 2 root root 36864 Apr 8 16:06 CentOS<br />

-rw-r--r-- 1 root root 97 Apr 8 16:43 .discinfo<br />

drwxr-xr-x 4 root root 4096 Mar 21 23:04 images<br />

drwxr-xr-x 2 root root 4096 Apr 12 00:00 isolinux<br />

-rw-r--r-- 1 root root 14371 Apr 11 23:16 lemp.tar.gz<br />

后 面 的 ks.cfg 脚 本 就 可 以 明 白 他 的 用 途 .<br />

drwxr-xr-x 2 root root 4096 Apr 11 21:00 repodata<br />

// 这 个 软 件 包 是 我 们 后 面 要 建 立 的 , 读 者 可 以 分 析 一 下<br />

IT 运 维 专 家 网 ------“ 我 为 人 人 , 人 人 为 我 ! 知 识 源 于 分 享 , 源 于 交 流 !”---<strong>LinuxTone</strong> 技 术 交 流 分 享 社 区 !


IT 运 维 专 家 网<br />

http://www.linuxtone.org<br />

-r--r--r-- 1 root root 7048 Mar 21 23:05 TRANS.TBL<br />

3. 定 制 package.list 软 件 包 清 单<br />

如 安 装 一 个 CentOS5.3 的 系 统 , 根 据 自 己 的 需 求 选 择 软 件 包 ; 如 果 想 你 的 系 统 很 小 , 建 议 选 择 最 少 的 包 。 安<br />

装 完 成 以 后 , 在 系 统 里 会 产 生 日 志 。 日 文 文 件 存 放 在 /root/install.log。<br />

# cat install.log | grep Installing | sed 's/Installing //g'|sed 's/^[0-9]\+://g' > packages.list<br />

#mkdir /ltos/CentOS 建 立 存 放 rpm 包 的 目 录 .<br />

创 建 自 动 提 取 相 关 rpm 脚 本 :<br />

#vi cprpms.sh<br />

#!/bin/bash<br />

DEBUG=0<br />

LT_CD=/mnt/cdrom<br />

ALL_RPMS_DIR=/mnt/cdrom/CentOS # 挂 载 光 盘 存 放 的 目 录<br />

LT_RPMS_DIR=/ltos/CentOS # 存 放 RPM 包 的 目 录<br />

packages_list=/root/packages.list<br />

number_of_packages=`cat $packages_list | wc -l`<br />

i=1<br />

while [ $i -le $number_of_packages ] ; do<br />

line=`head -n $i $packages_list | tail -n -1`<br />

name=`echo $line | awk '{print $1}'`<br />

version=`echo $line | awk '{print $3}' | cut -f 2 -d :`<br />

if [ $DEBUG -eq "1" ] ; then<br />

echo $i: $line<br />

echo $name<br />

echo $version<br />

fi<br />

if [ $DEBUG -eq "1" ] ; then<br />

ls $ALL_RPMS_DIR/$name-$version*<br />

if [ $? -ne 0 ] ; then<br />

echo "cp $ALL_RPMS_DIR/$name-$version* "<br />

fi<br />

else<br />

echo "cp $ALL_RPMS_DIR/$name-$version* $LT_RPMS_DIR/"<br />

cp $ALL_RPMS_DIR/$name-$version* $LT_RPMS_DIR/<br />

# in case the copy failed<br />

if [ $? -ne 0 ] ; then<br />

echo "cp $ALL_RPMS_DIR/$name-$version* "<br />

cp $ALL_RPMS_DIR/$name* $LT_RPMS_DIR/<br />

fi<br />

fi<br />

i=`expr $i + 1`<br />

IT 运 维 专 家 网 ------“ 我 为 人 人 , 人 人 为 我 ! 知 识 源 于 分 享 , 源 于 交 流 !”---<strong>LinuxTone</strong> 技 术 交 流 分 享 社 区 !


IT 运 维 专 家 网<br />

http://www.linuxtone.org<br />

done<br />

执 行 以 上 脚 本 将 定 制 ltos 必 要 的 rpm 复 制 到 /ltos/CentOS 目 录<br />

返 回 到 /ltos 目 录 下 , 执 行 createrepo 程 序 生 成 repodata 下 的 comps.xml 文 件<br />

#cd /ltos<br />

#createrepo -g repodata/comps.xml .<br />

4. 配 置 kickstart 脚 本<br />

通 过 CentOS5.3 定 制 安 装 系 统 以 后 , 会 在 系 统 里 产 生 一 个 kickstart 安 装 脚 本 (/root/anaconda-ks.cfg)<br />

# cp anaconda-ks.cfg /ltos/isolinux/ks.cfg<br />

# vi /ltos/isolinux/ks.cfg 并 修 改 脚 本 如 下 :<br />

# Kickstart file automatically generated by anaconda.<br />

# Install CentOS instead of Upgrade<br />

install<br />

text<br />

#install from cd-rom<br />

cdrom<br />

lang en_US.UTF-8<br />

keyboard us<br />

# Skip the X Configuration<br />

skipx<br />

network --device eth0 --bootproto dhcp --hostname ltos.linuxtone.org<br />

rootpw --iscrypted $1$jPZf0P0r$JRe7pd.5wq9k.VZEMOgdq/<br />

# Setup the firewall with SSH, HTTP/S, Syslog, Webmin, and Netflow enabled<br />

firewall --enabled --port=22:tcp --port=69:udp --port=80:tcp --port=443:tcp<br />

authconfig --enableshadow --enablemd5<br />

# Disable SELinux<br />

selinux --disabled<br />

timezone --utc Asia/Shanghai<br />

# Clear the Bootloader and load it to the Master Boot Record<br />

bootloader --location=mbr<br />

zerombr yes<br />

# Set the Mouse<br />

IT 运 维 专 家 网 ------“ 我 为 人 人 , 人 人 为 我 ! 知 识 源 于 分 享 , 源 于 交 流 !”---<strong>LinuxTone</strong> 技 术 交 流 分 享 社 区 !


IT 运 维 专 家 网<br />

http://www.linuxtone.org<br />

mouse generic3ps/2<br />

# The following is the partition information you requested<br />

# Note that any partitions you deleted are not expressed<br />

# here so unless you clear all partitions first, this is<br />

# not guaranteed to work<br />

clearpart --all --initlabel<br />

part /boot --fstype ext3 --size=100 --asprimary<br />

part / --fstype ext3 --size=25000<br />

part swap --size=4096<br />

part /data --fstype ext3 --size=1 --grow<br />

#--- Reboot the host after installation is done<br />

reboot<br />

%packages<br />

@development-libs<br />

@editors<br />

@system-tools<br />

@text-internet<br />

@legacy-network-server<br />

@dialup<br />

@core<br />

@base<br />

@mail-server<br />

@development-tools<br />

audit<br />

net-snmp-utils<br />

sysstat<br />

iptraf<br />

dstat<br />

tftp<br />

lynx<br />

device-mapper-multipath<br />

imake<br />

-zsh<br />

-vnc<br />

-zisofs-tools<br />

-xdelta<br />

-openldap-clients<br />

-samba-client<br />

-fetchmail<br />

-dovecot<br />

IT 运 维 专 家 网 ------“ 我 为 人 人 , 人 人 为 我 ! 知 识 源 于 分 享 , 源 于 交 流 !”---<strong>LinuxTone</strong> 技 术 交 流 分 享 社 区 !


IT 运 维 专 家 网<br />

http://www.linuxtone.org<br />

-spamassassin<br />

#<br />

# ------- Begin LEMP Install ---------<br />

#<br />

%post --nochroot<br />

# Mount CDROM<br />

mkdir -p /mnt/cdrom<br />

mount -r -t iso9660 /tmp/cdrom /mnt/cdrom<br />

# Copy our tar file and extract it<br />

cp /mnt/cdrom/lemp.tar.gz /mnt/sysimage/tmp/lemp.tar.gz > /dev/null<br />

cd /mnt/sysimage/tmp/<br />

tar -zxvf lemp.tar.gz > /dev/null<br />

# Move the contents of the tar into their new locations<br />

cp -R /mnt/sysimage/tmp/boot/* /mnt/sysimage/boot/ > /dev/null 2>/dev/null<br />

cp -R /mnt/sysimage/tmp/etc/* /mnt/sysimage/etc/ > /dev/null 2>/dev/null<br />

# Unmount CDROM<br />

umount /mnt/cdrom<br />

%post<br />

#vim syntax on<br />

sed -i "8 s/^/alias vi='vim'/" /root/.bashrc 2>/dev/null<br />

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

# Disable IPv6 until Cacti at least supports it<br />

echo "alias net-pf-10 off" >> /etc/modprobe.conf<br />

echo "alias ipv6 off" >> /etc/modprobe.conf<br />

/sbin/chkconfig --level 35 ip6tables off<br />

#init_ssh<br />

ssh_cf="/etc/ssh/sshd_config"<br />

sed -i -e '74 s/^/#/' -i -e '76 s/^/#/' $ssh_cf<br />

sed -i "s/#UseDNS yes/UseDNS no/" $ssh_cf<br />

#client<br />

sed -i -e '44 s/^/#/' -i -e '48 s/^/#/' $ssh_cf<br />

IT 运 维 专 家 网 ------“ 我 为 人 人 , 人 人 为 我 ! 知 识 源 于 分 享 , 源 于 交 流 !”---<strong>LinuxTone</strong> 技 术 交 流 分 享 社 区 !


IT 运 维 专 家 网<br />

http://www.linuxtone.org<br />

# Remove the ISO File translation files<br />

find / -name TRANS.TBL -exec rm {} \; /dev/null 2>/dev/null<br />

# Remove some unneeded services<br />

#--------------------------------------------------------------------------------<br />

cat >/etc/security/limits.conf<br />

.<br />

5. 让 系 统 从 kickstart 配 置 启 动<br />

# vi /ltos/ isolinux/ isolinux.cfg<br />

default auto<br />

prompt 1<br />

timeout 600<br />

display boot.msg<br />

IT 运 维 专 家 网 ------“ 我 为 人 人 , 人 人 为 我 ! 知 识 源 于 分 享 , 源 于 交 流 !”---<strong>LinuxTone</strong> 技 术 交 流 分 享 社 区 !


IT 运 维 专 家 网<br />

http://www.linuxtone.org<br />

F1 boot.msg<br />

F2 options.msg<br />

F3 general.msg<br />

F4 param.msg<br />

F5 rescue.msg<br />

label linux<br />

kernel vmlinuz<br />

append initrd=initrd.img<br />

label text<br />

kernel vmlinuz<br />

append initrd=initrd.img text<br />

label auto<br />

kernel vmlinuz<br />

append ks=cdrom:/isolinux/ks.cfg initrd=initrd.img<br />

label ks<br />

kernel vmlinuz<br />

append ks initrd=initrd.img<br />

label local<br />

localboot 1<br />

label memtest86<br />

kernel memtest<br />

append -<br />

二 . 个 性 化 定 制 你 的 系 统 ( 问 答 形 式 )<br />

1. 如 何 定 制 安 装 开 机 画 面 :<br />

启 动 画 面 用 的 是 一 种 比 较 奇 怪 的 格 式 lss16, 它 限 制 图 片 使 用 16 种 颜 色 , 除 去 前 景 和 背 景 色 只 能 有 14 种 颜<br />

色 。 我 们 需 要 ppmtolss16 giftopnm 等 程 序 , 系 统 一 般 默 认 都 安 装 了 。<br />

一 般 用 gimp 生 成 一 个 index 模 式 的 gif 图 形 , 颜 色 限 制 为 14, 然 后 通 过 如 下 的 办 法 进 行 转 :<br />

安 装 yum -y install syslinux<br />

giftopnm < splash.gif | ppmtolss16 > splash.lss<br />

另 外 你 还 需 要 修 改 isolinux/boot.msg 文 件 , 做 一 些 个 性 化 的 提 示 .<br />

? 如 何 生 成 高 质 量 的 图 。<br />

先 用 photoshop 打 开 任 何 一 张 图 片 , 然 后 在 文 件 的 下 拉 菜 单 里 , 保 存 的 时 候 选 择 “ 保 存 为 WEB 和 设 备 使 用 格<br />

式 “, 再 然 后 选 择 gif 再 选 择 16 色 保 存 就 OK.<br />

仍 后 利 用 giftopnm < splash.gif | ppmtolss16 > splash.lss 转 换 即 可 .<br />

2. 如 何 生 成 GRUP 的 xpm 文 件 ?<br />

(1) 将 备 一 张 640 x 480 16 色 图 片 , 档 案 类 型 为 JPG 的 格 式<br />

(2)convert grub.gif -colors 14 -geometry 640x480! splash.xpm && gzip -9 splash.xpm<br />

(3) 直 接 替 换 /boot/grup/splash.xpm.gz 文 件 即 可 .<br />

IT 运 维 专 家 网 ------“ 我 为 人 人 , 人 人 为 我 ! 知 识 源 于 分 享 , 源 于 交 流 !”---<strong>LinuxTone</strong> 技 术 交 流 分 享 社 区 !


IT 运 维 专 家 网<br />

http://www.linuxtone.org<br />

? 利 用 上 面 方 法 生 成 的 图 片 可 能 无 法 显 示 , 或 者 质 量 不 高 , 如 何 生 成 高 质 量 的 grub 图 片 呢 .<br />

利 用 文 中 后 面 我 提 供 的 ltospackl.tar.gz 里 面 的 grubtool.exe 即 可 在 windows 平 台 将 jpg,bmp 图 生 成 为 .xpm.gz<br />

格 式 的 文 件 , 直 接 替 换 /boot/grup 下 的 文 件 即 可 .<br />

2. 如 何 去 掉 安 装 过 程 中 的 CentOS 字 样 ?<br />

在 安 装 光 盘 里 面 有 两 个 .buildstamp 文 件 , 一 个 位 于 stage2.img 中 , 一 个 位 于 initrd.img 中 ,<br />

安 装 光 盘 运 行 时 读 取 的 是 initrd.img 中 的 那 个 .buildstamp 文 件 , 所 以 只 要 把 initrd.img 文 件 改 了 就 可 以 了 。<br />

如 何 解 压 initr.dimg 文 件 :<br />

2.6 内 核 中 的 initrd.img 采 用 cpio 压 缩 , 不 再 是 2.4 内 核 使 用 的 ext2 格 式 , 无 法 使 用 mount -o loop 挂 载 。 需<br />

要 使 用 gunzip 解 压 缩 , 然 后 再 使 用<br />

利 用 cpio 给 img 解 包<br />

# cd /ltos/isolinux/<br />

# cp initrd.img /tmp/initrd.img.gz<br />

# cd /tmp<br />

# gunzip initrd.img.gz<br />

# mkdir initrd<br />

# mv initrd.img initrd<br />

# cd initrd<br />

# cpio -ivmd < initrd.img<br />

仍 后 修 改 .buildstamp 文 件 , 将 CentOS 改 为 LTOS 即 可 .<br />

如 何 制 作 initrd.img 文 件 :<br />

# 假 设 当 前 目 录 位 于 准 备 好 的 initrd 文 件 系 统 的 根 目 录 下<br />

# find . | cpio -c -o > ../initrd.img<br />

# gzip ../initrd.img<br />

# mv initrd.img.gz initrd.img<br />

# cp initrd.img /ltos/isolinux/<br />

仍 后 将 initrd.img 复 制 到 /ltos/isolinux/<br />

3. 如 何 替 换 安 装 以 后 的 grub ?<br />

在 安 装 光 盘 里 的 ks.cfg 文 件 里 写 好 替 换 splash.xpm.gz 文 件 即 可 .<br />

4. 如 何 去 掉 启 动 过 程 中 的 "CentOS release 5 (Final)"<br />

在 安 装 光 盘 里 的 ks.cfg 文 件 里 写 好 脚 本 , 直 接 替 换 /etc/redhat-release 即 可 .<br />

三 . 打 包 生 成 ISO 文 件 发 布<br />

# cd /ltos<br />

# declare -x discinfo=`head -1 .discinfo`<br />

# createrepo -u "media://$discinfo" -g repodata/comps.xml .<br />

生 成 ISO 文 件<br />

#mkisofs -R -J -T -r -l -d -allow-multidot -allow-leading-dots -no-bak -o /tmp/ltos-0.1-i386.iso \<br />

-b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table .<br />

Md5<br />

IT 运 维 专 家 网 ------“ 我 为 人 人 , 人 人 为 我 ! 知 识 源 于 分 享 , 源 于 交 流 !”---<strong>LinuxTone</strong> 技 术 交 流 分 享 社 区 !


IT 运 维 专 家 网<br />

http://www.linuxtone.org<br />

/usr/lib/anaconda-runtime/implantisomd5 /tmp/ltos-0.1-i386.iso<br />

相 关 脚 本 及 制 作 工 具 下 载 :<br />

http://www.linuxtone.org/project/ltos/ltospack.tar.gz // 相 关 脚 本 及 工 具 下 载 .<br />

四 . 安 装 光 盘 效 果 演 示 图<br />

启 动 安 装 光 盘<br />

Grub 界 面<br />

IT 运 维 专 家 网 ------“ 我 为 人 人 , 人 人 为 我 ! 知 识 源 于 分 享 , 源 于 交 流 !”---<strong>LinuxTone</strong> 技 术 交 流 分 享 社 区 !


IT 运 维 专 家 网<br />

http://www.linuxtone.org<br />

系 统 登 陆 界 面 演 示<br />

五 . 参 考 文 档 ( 并 对 以 下 文 章 作 者 表 示 感 谢 和 致 敬 !)<br />

1. http://lingxiang.tang.googlepages.com/createalesssizecentos5<br />

2. http://sipx-wiki.calivia.com/index.php/A_Kickstart_CD_for_sipX_on_CentOS<br />

3. http://linux.chinaunix.net/ebook/doc/2009/04/02/1095757.shtml<br />

4. http://www.ibm.com/developerworks/cn/linux/l-k26initrd/<br />

IT 运 维 专 家 网 ------“ 我 为 人 人 , 人 人 为 我 ! 知 识 源 于 分 享 , 源 于 交 流 !”---<strong>LinuxTone</strong> 技 术 交 流 分 享 社 区 !

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!