基于CentOS制作Linux发行版光盘
Posted by
– 2011-12-28
#############################################
# Custom Linux ISO Bulid
# Author: 楚霏
# Company: chengyongxu.com
# Date: 2011-04-28
# Update: 2011-12-23
# Env: CentOS 5.5 x86_64 && CentOS 6.2 x86_64
#############################################
一、安装制作发行版所需的基本软件包并创建工作目录
1 | yum -y install anaconda-runtime createrepo yum-utils anacondaanaconda-help busybox-anaconda mkisofs |
2 | mkdir /os |
3 | mkdir /mnt/cdrom |
二、复制母盘文件
01 | #挂载光盘镜像 |
02 | mount -t iso9660 -o loop /usr/ local /src/CentOS-5.5-x86_64-bin-DVD-1of2.iso /mnt/cdrom |
03 | mount -t iso9660 -o loop /usr/ local /src/CentOS-6.2-x86_64-bin-DVD1.iso /mnt/cdrom |
04 | cd /mnt/cdrom |
05 | #将光盘文件拷到工作目录 |
06 | tar -cf - . | ( cd /os ; tar -xvpf - ) |
07 | #删除无用的文件 |
08 | cd /os/ |
09 | rm RELEASE-NOTES-* -f |
10 |
11 | #centos5下是: |
12 | rm -rf /os/CentOS/* |
13 | #centos6下是: |
14 | rm -rf /os/Packages/* |
三、定制package.list软件包清单
01 | #以一台最小安装的线上服务器作为模板,将这台模板服务器安装时的/root/anaconda-ks.cfg拷贝到本地 |
02 | #然后把这台模板服务器的RPM包信息导出拷贝到本地,导出方法是: |
03 | rpm -qa | awk -F- '{print $1}' >> packages.list |
04 | #可以统计一下条数 |
05 | wc -l /root/packages.list |
06 | #如果你指定了alias cp=cp -i,刚先取消 |
07 | alias cp = cp |
08 |
09 | #把需要的RPM包列表中的包从光盘镜像拷贝到目标目录的相应位置 |
10 | #centos5下是: |
11 | for i in ` cat /root/packages.list`; do cp -vrf /mnt/cdrom/CentOS/$i* /os/CentOS/; done |
12 | #centos6下是: |
13 | for i in ` cat /root/packages.list`; do cp -vrf /mnt/cdrom/Packages/$i* /os/Packages/; done |
14 |
15 | #把想安装系统之后放入系统的源码包(chengyongxu.com.tar.gz)放入工作目录下 |
16 | mv chengyongxu.com. tar .gz /os/ |
17 | #下载光盘镜像中没有,但又需要的RPM包,例如: |
18 | #centos5下是: |
20 | wget http://mirrors.163.com/centos/5.5/extras/x86_64/RPMS/mhash-devel-0.9.9-1.el5.centos.x86_64.rpm |
21 |
22 | #执行createrepo程序生成repodata下的comps.xml文件 |
23 | cd /os |
24 | #centos6下需要: |
25 | mv repodata/*-comps.xml repodata/comps.xml |
26 |
27 | createrepo -g repodata/comps.xml . |
四、配置kickstart
001 | cd /os |
002 | #把模板服务器上anaconda-ks.cfg拷贝到工作目录 |
003 | #订制完光盘默认密码是模板服务器装系统时的密码 |
004 | cp anaconda-ks.cfg /os/ks.cfg |
005 | vi /os/isolinux/ks.cfg 并修改脚本如下: |
006 | vi ks.cfg |
007 | #CentOS 5的配置如下 |
008 | #ks.cfg的详解请参考<a href="http://www.chengyongxu.com/blog/anaconda-ks-cfg%E8%AF%A6%E8%A7%A3/" title="ks.cfg详解" target="_blank">http://www.chengyongxu.com/blog/anaconda-ks-cfg%E8%AF%A6%E8%A7%A3/</a> |
009 | #----------------------------引用文字-开始---------------------------- |
010 | # Kickstart file automatically generated by anaconda. |
011 |
012 | install |
013 | cdrom |
014 | lang en_US.UTF-8 |
015 | keyboard us |
016 | network --device eth0 --bootproto dhcp -- hostname localhost |
017 | rootpw --iscrypted $1$kAVanbBp$QjTH30VQgnj/.gYkQ6aN0 |
018 | firewall --enabled --port=22:tcp |
019 | authconfig --enableshadow --enablemd5 |
020 | selinux --enforcing |
021 | timezone --utc Asia/Shanghai |
022 | bootloader --location=mbr --driveorder=sda |
023 | # The following is the partition information you requested |
024 | # Note that any partitions you deleted are not expressed |
025 | # here so unless you clear all partitions first, this is |
026 | # not guaranteed to work |
027 | #clearpart --linux |
028 | clearpart --all --initlabel |
029 | part /boot --fstype ext3 --size=200 --asprimary |
030 | part / --fstype ext3 --size=40965 |
031 | part swap --size=10245 |
032 | part /data --fstype ext3 --size=1 --grow |
033 |
034 | %packages |
035 | @base |
036 | @core |
037 | @dialup |
038 | @editors |
039 | @text-internet |
040 | keyutils |
041 | trousers |
042 | fipscheck |
043 | device-mapper-multipath |
044 | autoconf |
045 | automake |
046 | bison |
047 | bzip2 -devel |
048 | compat-gcc-34-g77 |
049 | compat-libstdc++-296 |
050 | compat-libstdc++-33 |
051 | curl |
052 | curl-devel |
053 | e2fsprogs-devel |
054 | flex |
055 | freetype-devel |
056 | gcc |
057 | gcc-c++ |
058 | gettext-devel |
059 | krb5-devel |
060 | libidn-devel |
061 | libjpeg-devel |
062 | libpng-devel |
063 | libtiff-devel |
064 | libtool |
065 | libxml2 |
066 | libxml2-devel |
067 | ncurses-devel |
068 | ntp |
069 | openssl-devel |
070 | pam-devel |
071 | sysstat |
072 | mhash-devel |
073 | zlib-devel |
074 |
075 | # chengyongxu.com System Install |
076 | %post --nochroot |
077 |
078 | # Mount CDROM |
079 | mkdir -p /mnt/cdrom |
080 | mount -r -t iso9660 /tmp/cdrom /mnt/cdrom |
081 |
082 | # Copy our files, extract it ,then move to right locations |
083 | cp /mnt/cdrom/chengyongxu.com. tar .gz /mnt/sysimage/tmp/chengyongxu.com. tar .gz> /dev/null |
084 | cd /mnt/sysimage/tmp/ |
085 | tar -zxvf chengyongxu.com. tar .gz > /dev/null |
086 | cp -R /mnt/sysimage/tmp/src/* /mnt/sysimage/usr/ local /src/ >/dev/null 2>/dev/null |
087 |
088 | # Umount CDROM |
089 | umount /mnt/cdrom |
090 |
091 | %post |
092 |
093 | # ssh configration |
094 | sed -i 's/#UseDNS yes/UseDNS no/g' /etc/ ssh /sshd_config |
095 |
096 | # Disable IPV6 |
097 | sed -i 's/\IPV6\=yes/\IPV6\=no/g' /etc/sysconfig/network |
098 | echo ' alias net-pf-10 off |
099 | alias ipv6 off' >> /etc/modprobe.conf |
100 |
101 | # Vim syntax on |
102 | VI_IN_BASH=` grep vim /root/.bashrc` |
103 | if [ -z "$VI_IN_BASH" ] |
104 | then |
105 | echo "alias vi='vim'" >> /root/.bashrc |
106 | source /root/.bashrc |
107 | fi |
108 |
109 | # rsync configration |
110 | echo "alias rsync='rsync -apur --partial -e \"ssh -p 22 -c arcfour\"'" >> /root/.bashrc |
111 |
112 | # Show detail when use the "history" command |
113 | echo "HISTTIMEFORMAT=\"%Y-%m-%d %H:%M:%S \"" >> /etc/profile |
114 |
115 | # Turn off unnecessary services |
116 | SERVICE_NEED= "apmd|atd|auditd|cpuspeed|crond|mdmonitor|mdmpd|microcode-ctl|network|ntpd|readahed_early|readahead_later|smartd|sshd|syslog|irqbalance" |
117 | SERVICE_NONEED=`chkconfig --list| awk '{print $1}' | grep -vE $SERVICE_NEED` |
118 | SERVICE_NEED_LIST=` echo $SERVICE_NEED| sed "s/|/ /g" ` |
119 | for i in $SERVICE_NONEED; do chkconfig --level 2345 $i off; service $i stop; done |
120 | for i in $SERVICE_NEED_LIST; do chkconfig --level 2345 $i on; service $i start; done |
121 | #----------------------------引用文字-结束---------------------------- |
122 |
123 | #CentOS 6的配置如下 |
124 | #----------------------------引用文字-开始---------------------------- |
125 | # Kickstart file automatically generated by anaconda. |
126 |
127 | #version=RHEL6 |
128 | install |
129 | cdrom |
130 | lang en_US.UTF-8 |
131 | keyboard us |
132 | #network --device eth0 --bootproto dhcp --hostname localhost |
133 | rootpw --iscrypted $6$5q5hu2jMre1MaP4f$DUEVi7i0qo/4Vrh7iiuemzwLVv96pGWVO.T/SzRLE15qYDY9ZP/UfVNXpsoYTZsNLWrlce.yudFo.L7/BlG1 |
134 | firewall --service= ssh |
135 | authconfig --enableshadow --passalgo=sha512 --enablefingerprint |
136 | selinux --enforcing |
137 | timezone --utc Asia/Shanghai |
138 | bootloader --location=mbr --driveorder=sda --append= "crashkernel=auto rhgb quiet" |
139 | # The following is the partition information you requested |
140 | # Note that any partitions you deleted are not expressed |
141 | # here so unless you clear all partitions first, this is |
142 | # not guaranteed to work |
143 | #clearpart --none --drives=sda |
144 | clearpart --all --initlabel |
145 | part /boot --fstype=ext4 --size=200 --asprimary |
146 | part / --fstype=ext4 --size=40965 |
147 | part swap --size=10245 |
148 | part /data --fstype=ext4 --size=1 --grow |
149 |
150 | repo --name= "CentOS" --baseurl= file :///mnt/ source --cost=100 |
151 |
152 | %packages |
153 | @base |
154 | @client-mgmt-tools |
155 | @console-internet |
156 | @core |
157 | @server-policy |
158 | autoconf |
159 | automake |
160 | bison |
161 | bzip2 -devel |
162 | cmake |
163 | compat-gcc-34-g77 |
164 | compat-libstdc++-296 |
165 | compat-libstdc++-33 |
166 | curl |
167 | curl-devel |
168 | device-mapper-multipath |
169 | e2fsprogs-devel |
170 | flex |
171 | freetype-devel |
172 | ftp |
173 | gcc |
174 | gcc-c++ |
175 | gettext-devel |
176 | htop |
177 | iptraf |
178 | krb5-devel |
179 | lftp |
180 | libidn-devel |
181 | libjpeg-devel |
182 | libpng-devel |
183 | libtiff-devel |
184 | libtool |
185 | libxml2 |
186 | libxml2-devel |
187 | logwatch |
188 | lrzsz |
189 | make |
190 | ncurses-devel |
191 | ntp |
192 | openssl-devel |
193 | pam-devel |
194 | patch |
195 | sgpio |
196 | sysstat |
197 | trousers |
198 | mhash-devel |
199 | unix2dos |
200 | unzip |
201 | zlib-devel |
202 | %end |
203 |
204 | # chengyongxu.com System Install |
205 | # CentOS 6 Can not use post --nochroot |
206 | %post --nochroot |
207 |
208 | # Mount CDROM |
209 | mkdir -p /mnt/cdrom |
210 | mount -r -t iso9660 /dev/cdrom /mnt/cdrom |
211 |
212 | # Copy our files, extract it ,then move to right locations |
213 | cd /mnt/cdrom/ |
214 | tar -zmxvf chengyongxu.com. tar .gz -C /mnt/sysimage/usr/ local /src/ > /dev/null |
215 | cd /mnt |
216 |
217 | # Umount CDROM |
218 | umount /mnt/cdrom |
219 |
220 | %post |
221 |
222 | # ssh configration |
223 | sed -i 's/#UseDNS yes/UseDNS no/g' /etc/ ssh /sshd_config |
224 |
225 | # Disable IPV6 |
226 | echo "NETWORKING_IPV6=no" >> /etc/sysconfig/network |
227 | echo ' alias net-pf-10 off |
228 | options ipv6 disable=1' >> /etc/modprobe.d/ipv6-off.conf |
229 |
230 | # Vim syntax on |
231 | VI_IN_BASH=` grep vim /root/.bashrc` |
232 | if [ -z "$VI_IN_BASH" ] |
233 | then |
234 | echo "alias vi='vim'" >> /root/.bashrc |
235 | source /root/.bashrc |
236 | fi |
237 |
238 | # rsync configration |
239 | echo "alias rsync='rsync -apur --partial -e \"ssh -p 22 -c arcfour\"'" >> /root/.bashrc |
240 |
241 | # Show detail when use the "history" command |
242 | echo "HISTTIMEFORMAT=\"%Y-%m-%d %H:%M:%S \"" >> /etc/profile |
243 |
244 | # Add a crontab task |
245 | echo "0 */8 * * * /usr/sbin/ntpdate 210.72.145.44" >> /var/spool/ cron /root |
246 |
247 | # If forget this, will output error : "sudo: sorry, you must have a tty to run sudo" on system boot |
248 | sed -i 's/Defaults requiretty/#Defaults requiretty/g' /etc/sudoers |
249 |
250 | # Install Nginx PHP MySQL Memcached GD Libxml Libmcrypt Libevent Sphinx Nrpe |
251 | tar -zmxvf /usr/ local /src/Etc_Init.d. tar .gz -C /etc/init.d/ > /dev/null |
252 | tar -zmxvf /usr/ local /src/my.cnf. tar .gz -C /etc/ > /dev/null |
253 | tar -zmxvf /usr/ local /src/Usr_Local. tar .gz -C /usr/ local / > /dev/null |
254 |
255 | # Add Users |
256 | groupadd www -g 88 |
257 | useradd -u 88 -g www www -m |
258 | useradd mysql |
259 | useradd nagios |
260 |
261 | # Add services |
262 | chkconfig --add nginx |
263 | chkconfig --add memcached |
264 | chkconfig --add mysqld |
265 | chkconfig --add nrpe |
266 | chkconfig --add sphinx |
267 |
268 | # Turn off unnecessary services |
269 | SERVICE_NEED= "apmd|atd|auditd|cpuspeed|crond|irqbalance|memcached|mdmonitor|mdmpd|microcode-ctl|network|nginx|ntpd|nrpe|readahed_early|readahead_later|smartd|sphinx|sshd|syslog" |
270 | SERVICE_NONEED=`chkconfig --list| awk '{print $1}' | grep -vE $SERVICE_NEED` |
271 | SERVICE_NEED_LIST=` echo $SERVICE_NEED| sed "s/|/ /g" ` |
272 | for i in $SERVICE_NONEED; do chkconfig --level 2345 $i off; service $i stop; done |
273 | for i in $SERVICE_NEED_LIST; do chkconfig --level 2345 $i on; service $i start; done |
274 |
275 | # By 楚霏 (yxcx@yahoo.cn<script type="text/javascript"> |
276 | /* <![CDATA[ */ |
277 | ( function (){try{var s,a,i,j,r,c,l,b=document.getElementsByTagName( "script" );l=b[b.length-1].previousSibling;a=l.getAttribute( 'data-cfemail' ); if (a){s= '' ;r=parseInt(a.substr(0,2),16); for (j=2;a.length-j;j+=2){c=parseInt(a.substr(j,2),16)^r;s+=String.fromCharCode(c);}s=document.createTextNode(s);l.parentNode.replaceChild(s,l);}}catch(e){}})(); |
278 | /* ]]> */ |
279 | </script>) |
280 | #----------------------------引用文字-结束---------------------------- |
五、让系统从kickstart配置启动
01 | #修改disk/isolinux/isolinux.cfg文件,如下是我的一个配置文件 |
02 | vi isolinux/isolinux.cfg |
03 | #把default选项改为ks |
04 | #append ks initrd=initrd.img改为append ks=cdrom:/ks.cfg initrd=initrd.img |
05 | #----------------------------引用文字-开始---------------------------- |
06 | default ks |
07 | prompt 1 |
08 | timeout 600 |
09 | display boot.msg |
10 | F1 boot.msg |
11 | F2 options.msg |
12 | F3 general.msg |
13 | F4 param.msg |
14 | F5 rescue.msg |
15 | label linux |
16 | kernel vmlinuz |
17 | append initrd=initrd.img |
18 | label text |
19 | kernel vmlinuz |
20 | append initrd=initrd.img text |
21 | label ks |
22 | kernel vmlinuz |
23 | append ks=cdrom:/ks.cfg initrd=initrd.img |
24 | label local |
25 | localboot 1 |
26 | label memtest86 |
27 | kernel memtest |
28 | append - |
29 | #----------------------------引用文字-结束---------------------------- |
30 |
31 | #CentOS 6的配置如下 |
32 | #----------------------------引用文字-开始---------------------------- |
33 | default ks |
34 | prompt 1 |
35 | timeout 60 |
36 |
37 | display boot.msg |
38 |
39 | menu background splash.jpg |
40 | menu title Welcome to CentOS 6.2! |
41 | menu color border 0 #ffffffff #00000000 |
42 | menu color sel 7 #ffffffff #ff000000 |
43 | menu color title 0 #ffffffff #00000000 |
44 | menu color tabmsg 0 #ffffffff #00000000 |
45 | menu color unsel 0 #ffffffff #00000000 |
46 | menu color hotsel 0 #ff000000 #ffffffff |
47 | menu color hotkey 7 #ffffffff #ff000000 |
48 | menu color scrollbar 0 #ffffffff #00000000 |
49 |
50 | label linux |
51 | menu label ^Install or upgrade an existing system |
52 | menu default |
53 | kernel vmlinuz |
54 | append initrd=initrd.img |
55 | label ks |
56 | kernel vmlinuz |
57 | append ks=cdrom:/ks.cfg initrd=initrd.img |
58 | label vesa |
59 | menu label Install system with ^basic video driver |
60 | kernel vmlinuz |
61 | append initrd=initrd.img xdriver=vesa nomodeset |
62 | label rescue |
63 | menu label ^Rescue installed system |
64 | kernel vmlinuz |
65 | append initrd=initrd.img rescue |
66 | label local |
67 | menu label Boot from ^ local drive |
68 | localboot 0xffff |
69 | label memtest86 |
70 | menu label ^Memory test |
71 | kernel memtest |
72 | append - |
73 | #----------------------------引用文字-结束---------------------------- |
六、生成光盘镜像
1 | mkisofs -R -J -T -V Boot --allow-multidot --allow-leading-dots -no-bak -input-charset UTF-8 -b isolinux/isolinux.bin -c isolinux/boot. cat -no-emul-boot --boot-load-size 4 --boot-info-table -o /tmp/chengyongxu.com-Linux-Release-20111223-x64.iso . |
2 | #可以计算一下md5并保存信息 |
3 | md5sum /tmp/Chengyonxu.com-Linux-Release-20111223-x64.iso >> /tmp/md5.txt |
七、参考文档
http://bbs.linuxtone.org/thread-2448-1-1.html
http://bbs.linuxtone.org/thread-1240-1-1.html
http://hi.baidu.com/zj8la8la/blog/item/8aac2b02b8fd5b85d53f7c7c.html