职位:技术总监 1、精通c++(linux平台、vc++Mfc、qt)、java、php、unity3d,略懂python 2、用c++开发过嵌入式产品,用c++开发过大型银行运维产品 3、用java开发大型银行运维产品,学校教务系统 4、用php开发进销存系统(在销售中),用php开发淘宝小程序 5、用unity3d开发衣柜设计软件,在运营中
分类: LINUX
2011-08-26 23:29:02
制作自己的linux操作系统
目 录
*isolinux 目录存放光盘启动时的安装界面信息
*images 目录包括了必要的启动映像文件
*CentOS 目录存放安装软件包及信息
*.discinfo 文件是安装价质的识别信息
*lemp.tar.gz 文件存放系统初始化及其相关程序安装脚本.
环境说明:
CentOS-5.5-i386-bin-DVD.iso.
VMware
安装anaconda repodata createrepo mkisofs ,关联太多采用yum安装//定制过程需要产生comps.xml文件以及生成iso
yum -y install anaconda repodata createrepo mkisofs#安装制作发行版所需的基本软件包
yum -y install anaconda-runtime createrepo yum-utils anacondaanaconda-help busybox-anaconda mkisofs
生成packages.list 所安装的RPM包文件清单(由于install.log文件在root目录,所以该操作在root目录进行)
cat install.log | grep Installing | sed 's/Installing //g' > /root/packages.list #生成后,需要仔细看该文件,一般会在某些文件开始部分如“1:”这样的字符,需要删除这些字符,否在后面执行copy动作会报错,注意引项为英文版Shell
cat install.log | grep 安装 | sed 's/安装 //g' > /root/packages.list #同上,中文版Shell
删除1:的命令:
sed 's/[0-9]\{1,\}://g' packages.list > packagesnew.list
mkdir /disk #定制时要复制RPM包的目录
mkdir /mnt/cdrom #加载光驱目录
mount -o loop /dev/cdrom /mnt/cdrom #将光盘内容加载到/mnt/cdrom中
cd /mnt/cdrom/ #复制光盘内容到disk文件下,或者
tar -cf - . | ( cd /disk ; tar -xvpf - )
不能使用普通的复制,因为普通的复制不能复制隐藏文件
rm -rf /disk/CentOS/ #先删除所有RPM包
mkdir /disk/CentOS/ #创建RPM包存放目录
#!/bin/bash
DEBUG=0
DVD_CD=/disk/CentOS
ALL_RPMS_DIR=/mnt/cdrom/CentOS/
DVD_RPMS_DIR=$DVD_CD
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
将以上内容保存为copyrpms.sh
chmod 775 copyrpms.sh
./copyrpms.sh
经过一系列的复制就完成了你要定制的RPM包(在/disk/CentOS/目录下);
# mkdir /tmp/testdb
# rpm --initdb --dbpath /tmp/testdb
# rpm --test --dbpath /tmp/testdb -Uvh *.rpm
一般方便可以直接由root下面的anaconda-ks.cfg修改
cp anaconda-ks.cfg /disk/ks.cfg
样例内容如:
# Kickstart file automatically generated by anaconda.
install
cdrom
lang en_US.UTF-8
keyboard us
network --device eth0 --bootproto dhcp
firewall --disabled
authconfig --enableshadow --enablemd5
selinux --disabled
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
#clearpart --linux --drives=sda
#part /boot --fstype ext3 --size=100 --ondisk=sda
#part pv.6 --size=0 --grow --ondisk=sda
#volgroup VolGroup00 --pesize=32768 pv.6
#logvol / --fstype ext3 --name=LogVol00 --vgname=VolGroup00 --size=1024 --grow
#logvol swap --fstype swap --name=LogVol01 --vgname=VolGroup00 --size=1000 --grow --maxsize=4032
%packages
@mysql
@core
@base
@network-server
@web-server
%post
echo "HOSTNAME=icesoul.local" >> /etc/sysconfig/network
echo "# Do not remove the following line, or various programs" > /etc/hosts
echo "# that require network functionality will fail." >> /etc/hosts
echo "127.0.0.1 localhost" >> /etc/hosts
echo "127.0.0.1 icesoul.local" >> /etc/hosts
eject
reboot
修改isolinux.cfg文件// 将/disk/isolinux/目录下的isolinux.cfg文件第一行default linux修改成default linux ks=cdrom:/ks.cfg
原文:
default linux ks=cdrom:/ks.cfg
prompt 1
timeout 60
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 ks
kernel vmlinuz
append ks initrd=initrd.img
label local
localboot 1
label memtest86
kernel memtest
append –
简化后:(默认字符模式启动)
default text ks=cdrom:/ks.cfg
label text
kernel vmlinuz
append initrd=initrd.img text
cd /disk/
createrepo -g repodata/comps.xml /disk/
到此以上定制任务已经完成。
cd /disk/
mkisofs -o MyCentOS.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -R -J -v -T /disk/
mkisofs -o /mnt/hgfs/mycentos/MyCentOS.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -R -J -v -T /disk/
/disk/ 目录下产生的MyCentOS.iso 生成的ISO文件。
自动硬盘分区,分区策略是:30G根目录、1Gswap分区、其余为raid分区。
clearpart --linux
part / --fstype ext3 --size=30720
part swap --size=1024
part raid.3 --size=100 --grow
光盘rpm包的安装需要三个步骤:
u 1)拷贝rpm包到Centos目录下
u 2)重新生成comps.xml文件
u 3)配置ks.cfg文件的%packages字段
系统之外的rpm包,如mysql要放在%packages字段下,这个字段下可以填写包名字(这个报名字指的是comps.xml文件中规定的包),也可以填写rpm包。如:
%packages
@core
antlr
ccid
cdk
cdk-devel
cpp
drbd
e2fsprogs-devel
fipscheck-devel
fonts-ISO8859-2-75dpi
gcc
gcc-c++
giflib
gjdoc
glib2-devel
glibc-devel
glibc-headers
heartbeat
heartbeat-pils
heartbeat-stonith
java
java
jpackage-utils
kernel-headers
keyutils-libs-devel
kmod-drbd
krb5-devel
libgcj
libgomp
libselinux-devel
libsepol-devel
libstdc++-devel
libXmu
libXt
libXtst
lm_sensors
lua
lua-devel
make
mx
mysql
MySQL-python
mysql-server
nc
ncurses-devel
net-snmp
net-snmp-libs
ntp
openssl-devel
pcsc-lite
pcsc-lite-libs
perl-Compress-Zlib
perl-DBD-MySQL
perl-DBI
perl-HTML-Parser
perl-HTML-Tagset
perl-libwww-perl
perl-URI
perl-XML-Parser
pkgconfig
PyXML
rdesktop
rsyslog
telnet
telnet-server
vnc-server
vsftpd
xinetd
xorg-x11-fonts-base
xorg-x11-xauth
zip
zlib-devel
在光盘中执行脚本,是通过将脚本放在%post字段中来执行的。具体如下:
%post --nochroot
#!/bin/sh
# Mount CDROM
mkdir -p /mnt/cdrom
mkdir /mnt/sysimage/tempdir
mount -t iso9660 /tmp/cdrom /mnt/cdrom
cp -r /mnt/cdrom/cmd.sh /mnt/sysimage/tempdir
# Unmount CDROM
umount /mnt/cdrom
%post --log=/root/my.log
sh cmd.sh
参数%post代表光盘安装后所要做的工作。
这里有几个关键点要注意。%post分两个阶段,这两个阶段的目录结构是不一样的
1) 两个阶段
具体使用参数—nochroot来区分。我们规定,使用—nochroot阶段为“阶段一”,不使用的阶段为“阶段二”
2) 光盘路径
在阶段一,光盘路径是/tmp/cdrom, 阶段二光盘路径有待确定,好像就没有光盘了。
3) 系统目录路径
阶段一,根目录不是平常的linux路径,根目录的路径是/mnt/sysimage/
阶段二,就是我们熟悉的linux路径了,根目录的路径是/
光盘启动文件在目录isolinux下。其中splash.lss是启动图片,lss这是一种图片格式,是一种很怪异的图片格式。它限制图片使用16种颜色,可以通过gif图片转化而来。
n Gif转lss命令:
giftopnm< splash.gif | ppmtolss16 > splash.lss
n 制作高质量的16色gif图片:
先用photoshop打开任何一张图片,然后在文件的下拉菜单里,保存的时候选择“保存为WEB和设备使用格式“,再然后选择gif再选择16色保存就OK
n 图片格式:
大小640*300, 72像素,16色
在isolinux/isolinux.cfg中增加:
label h
localboot 0x80
意思是键入h,从硬盘启动
# cd /disk/isolinux/
# cp initrd.img /tmp/initrd.img.gz
# cd /tmp
# gunzip initrd.img.gz
# mkdir initrd
# mv initrd.img initrd
# cd initrd
# cpio -ivmd < initrd.img
#rm –f initrd.img
然后修改.buildstamp文件,将CentOS改为自定义名字即可.
制作initrd.img文件:
# find . | cpio -c -o >../initrd.img
# gzip ../initrd.img
# cp initrd.img /ltos/isolinux/
然后将initrd.img复制到/disk/isolinux/