网上看到不少LFS的文章,看久了实在是头大,有没有简单的裁剪LINUX的方法?回想redhat 5.2时代,最小化安装LINUX也就不到100M,那时候机器都比较烂,编译一次内核用掉半天时间很正常,如果象LFS那样从头到脚重新编译,岂不要死人(深入研究LFS的话,没完没了的编译和优化是基本功),因此懒人必须有懒办法,才能快速裁剪通用的LINUX发行版。
所谓懒办法,就是不动手编译发行版已有版本的软件,包括内核、应用软件等等,纯粹是cp,为了cp不走样,所有cp一律是cp -cpR,万一cp过头的话,再rm -f
下面开始动手:
首先选定发行版,我用惯了RH系列,因此用CentOS-4.3,和centos风格相同的还有RHEL AS4、Fedora 4等,之所以用centos是因为它体积最小(DVD安装光盘也就2.1G)。
然后就是安装裁剪前的系统,要安装2份,一份是完全安装(占用6.2G空间),这个是用来日常学习调试用的,另一份是用来裁剪的“母版”,能多小就多小(最小不会小于1.3G),为了方便我cp和rm,我是这么安排硬盘的(我日用的LINUX全在一块160G的硬盘上):
Disk /dev/hdb: 160.0 GB, 160041885696 bytes
Device Boot Start End Blocks Id System
/dev/hdb1 * 1 2047 16442496 83 Linux
/dev/hdb2 2048 4095 16450560 83 Linux
/dev/hdb3 4096 6144 16458592+ 83 Linux
/dev/hdb4 6145 19457 106936672+ 5 Extended
/dev/hdb5 6145 6656 4112608+ 82 Linux swap
/dev/hdb6 6657 7168 4112608+ 82 Linux swap
/dev/hdb7 7169 11264 32901088+ 83 Linux
/dev/hdb8 11265 15360 32901088+ 83 Linux
/dev/hdb9 15361 19457 32909121 83 Linux
我把centos-4.3完全安装在/dev/hdb1,把fedora4完全安装在/dev/hdb2,
/dev/hdb3专门用来安装裁剪前的“母版”,其它分区用来装系统无关的数据和资料
所有系统安装之后,启动机器进入完全安装的系统,把“母版”给mount到某个目录来,观察一下关机后的系统是啥样,比如我把/dev/hdb3给mount在/mnt/test了,ls一下:
bin/ dev/ halt initrd/ lost+found/ misc/ opt/ root/ selinux/ sys/ usr/
boot/ etc/ home/ lib/ media/ mnt/ proc/ sbin/ srv/ tmp/ var/
注意里面有个大小为0字节的halt文件,这个是关机程序生的,正常启动后系统会自动清除这个文件,另外就是dev/是个空目录,这和AS3还有RH9有很大区别,因为现在流行的发行版用了udev,所以关机状态的dev/目录是空目录,所以我也不去cp设备文件了。为了操作方便,建议首先用cp -cpR把“母版”安装的东西统统复制到某个目录,比如centos_min,然后这个分区就可以格式化掉干别的用了(比如用来安装另外一个发行版的最小化安装)
下面我开始cp -cpR我要的东西,发扬懒人精神,写个烂脚本让电脑来干:
#!/bin/sh
#SYSTEM_DIR_SRC表示原始安装系统文件存放目录
SYSTEM_DIR_SRC=centos_min
#SYSTEM_DIR_DEST表示裁剪后系统文件存放目录
SYSTEM_DIR_DEST=my_centos
#清除原有结果
rm $SYSTEM_DIR_DEST -fr
mkdir $SYSTEM_DIR_DEST
#复制除usr以外的所有目录
cp -cpR $SYSTEM_DIR_SRC/bin $SYSTEM_DIR_DEST/
cp -cpR $SYSTEM_DIR_SRC/dev $SYSTEM_DIR_DEST/
cp -cpR $SYSTEM_DIR_SRC/initrd $SYSTEM_DIR_DEST/
cp -cpR $SYSTEM_DIR_SRC/misc $SYSTEM_DIR_DEST/
cp -cpR $SYSTEM_DIR_SRC/opt $SYSTEM_DIR_DEST/
cp -cpR $SYSTEM_DIR_SRC/root $SYSTEM_DIR_DEST/
cp -cpR $SYSTEM_DIR_SRC/selinux $SYSTEM_DIR_DEST/
cp -cpR $SYSTEM_DIR_SRC/sys $SYSTEM_DIR_DEST/
cp -cpR $SYSTEM_DIR_SRC/boot $SYSTEM_DIR_DEST/
cp -cpR $SYSTEM_DIR_SRC/etc $SYSTEM_DIR_DEST/
cp -cpR $SYSTEM_DIR_SRC/home $SYSTEM_DIR_DEST/
cp -cpR $SYSTEM_DIR_SRC/lib $SYSTEM_DIR_DEST/
cp -cpR $SYSTEM_DIR_SRC/media $SYSTEM_DIR_DEST/
cp -cpR $SYSTEM_DIR_SRC/mnt $SYSTEM_DIR_DEST/
cp -cpR $SYSTEM_DIR_SRC/proc $SYSTEM_DIR_DEST/
cp -cpR $SYSTEM_DIR_SRC/sbin $SYSTEM_DIR_DEST/
cp -cpR $SYSTEM_DIR_SRC/srv $SYSTEM_DIR_DEST/
cp -cpR $SYSTEM_DIR_SRC/tmp $SYSTEM_DIR_DEST/
cp -cpR $SYSTEM_DIR_SRC/var $SYSTEM_DIR_DEST/
#创建usr目录结构
mkdir $SYSTEM_DIR_DEST/usr
mkdir $SYSTEM_DIR_DEST/usr/bin
mkdir $SYSTEM_DIR_DEST/usr/kerberos
mkdir $SYSTEM_DIR_DEST/usr/libexec
mkdir $SYSTEM_DIR_DEST/usr/sbin
mkdir $SYSTEM_DIR_DEST/usr/etc
mkdir $SYSTEM_DIR_DEST/usr/lib
mkdir $SYSTEM_DIR_DEST/usr/local
mkdir $SYSTEM_DIR_DEST/usr/share
#删除etc和var的多余内容
rm -fr $SYSTEM_DIR_DEST/etc/gconf
rm -fr $SYSTEM_DIR_DEST/var/lib/canna
rm -fr $SYSTEM_DIR_DEST/var/lib/wnn
rm -fr $SYSTEM_DIR_DEST/var/lib/rpm
#复制udev不会创建的三个设备文件
cp -cpR /dev/console $SYSTEM_DIR_DEST/dev/
cp -cpR /dev/null $SYSTEM_DIR_DEST/dev/
cp -cpR /dev/zero $SYSTEM_DIR_DEST/dev/
#end
用上这个烂脚本,产生了一个叫my_centos的目录,大小约80M,
我就得到了一个基本的LINUX系统,为了让它真正成为一个可用的系统,
里面还缺一些文件,这些文件全部位于usr/目录下,我还要接著cp -cpR,
又是个烂脚本:
#!/bin/sh
SYSTEM_DIR_DEST=my_centos
#复制/usr/share的部分内容
cp -cpR /usr/share/nmap $SYSTEM_DIR_DEST/usr/share/
cp -cpR /usr/share/i18n $SYSTEM_DIR_DEST/usr/share/
cp -cpR /usr/share/empty $SYSTEM_DIR_DEST/usr/share/
mkdir $SYSTEM_DIR_DEST/usr/share/terminfo
cp -cpR /usr/share/terminfo/l $SYSTEM_DIR_DEST/usr/share/terminfo/
cp -cpR /usr/share/terminfo/v $SYSTEM_DIR_DEST/usr/share/terminfo/
cp -cpR /usr/share/terminfo/x $SYSTEM_DIR_DEST/usr/share/terminfo/
#复制/usr/bin下面的最常用命令
# awk du host nslookup telnet zip
# bzip2 find id ssh top zipcloak
# bzip2recover free kill ssh-add tr zipgrep
# clear ftp killall ssh-agent unzip zipinfo
# dig ftp-rfc ldd ssh-keygen unzipsfx zipnote
# dircolors gzip nmap ssh-keyscan wget zipsplit
cp -cpR /usr/bin/awk $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/bzip2 $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/bzip2recover $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/clear $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/dig $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/dircolors $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/du $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/find $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/free $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/ftp $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/ftp-rfc $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/gzip $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/host $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/id $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/kill $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/killall $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/ldd $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/nmap $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/nslookup $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/ssh $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/ssh-agent $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/ssh-keygen $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/ssh-keyscan $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/telnet $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/top $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/tr $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/unzip $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/unzipsfx $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/wget $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/zip $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/zipcloak $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/zipgrep $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/zipinfo $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/zipnote $SYSTEM_DIR_DEST/usr/bin/
cp -cpR /usr/bin/zipsplit $SYSTEM_DIR_DEST/usr/bin/
#复制/usr/sbin下面的最常用命令
# chroot lsof stunnel tcpdump traceroute vsftpd
# kudzu sshd tcpd tcpslice traceroute6 x86info
cp -cpR /usr/sbin/chroot $SYSTEM_DIR_DEST/usr/sbin/
cp -cpR /usr/sbin/kudzu $SYSTEM_DIR_DEST/usr/sbin/
cp -cpR /usr/sbin/sshd $SYSTEM_DIR_DEST/usr/sbin/
cp -cpR /usr/sbin/lsof $SYSTEM_DIR_DEST/usr/sbin/
cp -cpR /usr/sbin/stunnel $SYSTEM_DIR_DEST/usr/sbin/
cp -cpR /usr/sbin/tcpd $SYSTEM_DIR_DEST/usr/sbin/
cp -cpR /usr/sbin/tcpdump $SYSTEM_DIR_DEST/usr/sbin/
cp -cpR /usr/sbin/tcpslice $SYSTEM_DIR_DEST/usr/sbin/
cp -cpR /usr/sbin/traceroute $SYSTEM_DIR_DEST/usr/sbin/
cp -cpR /usr/sbin/traceroute6 $SYSTEM_DIR_DEST/usr/sbin/
cp -cpR /usr/sbin/vsftpd $SYSTEM_DIR_DEST/usr/sbin/
cp -cpR /usr/sbin/x86info $SYSTEM_DIR_DEST/usr/sbin/
#复制/usr/lib下面的最常用动态库
# libbz2.so.1 libkrb5.so.3 libslang-utf8.so.1
# libbz2.so.1.0.2 libkrb5.so.3.2 libslang-utf8.so.1.4.9
# libdns.so.16 libncurses.so.5 libstdc++.so.6
# libdns.so.16.0.0 libncurses.so.5.4 libstdc++.so.6.0.3
# libgssapi_krb5.so.2 libnewt.so.0.51 libwrap.so.0
# libgssapi_krb5.so.2.2 libnewt.so.0.51.6 libwrap.so.0.7.6
# libisc.so.7 libpopt.so.0 libz.so.1
# libisc.so.7.1.5 libpopt.so.0.0.0 libz.so.1.2.1.2
# libk5crypto.so.3 libreadline.so.4
# libk5crypto.so.3.0 libreadline.so.4.3
cp -cpR /usr/lib/libbz2.so.* $SYSTEM_DIR_DEST/usr/lib/
cp -cpR /usr/lib/libdns.so.* $SYSTEM_DIR_DEST/usr/lib/
cp -cpR /usr/lib/libgssapi_krb5.so.* $SYSTEM_DIR_DEST/usr/lib/
cp -cpR /usr/lib/libisc.so.* $SYSTEM_DIR_DEST/usr/lib/
cp -cpR /usr/lib/libk5crypto.so.* $SYSTEM_DIR_DEST/usr/lib/
cp -cpR /usr/lib/libkrb5.so.* $SYSTEM_DIR_DEST/usr/lib/
cp -cpR /usr/lib/libncurses.so.* $SYSTEM_DIR_DEST/usr/lib/
cp -cpR /usr/lib/libnewt.so.* $SYSTEM_DIR_DEST/usr/lib/
cp -cpR /usr/lib/libpopt.so.* $SYSTEM_DIR_DEST/usr/lib/
cp -cpR /usr/lib/libreadline.so.* $SYSTEM_DIR_DEST/usr/lib/
cp -cpR /usr/lib/libslang-utf8.so.* $SYSTEM_DIR_DEST/usr/lib/
cp -cpR /usr/lib/libstdc++.so.* $SYSTEM_DIR_DEST/usr/lib/
cp -cpR /usr/lib/libwrap.so.* $SYSTEM_DIR_DEST/usr/lib/
cp -cpR /usr/lib/libz.so.* $SYSTEM_DIR_DEST/usr/lib/
#end
注意这个脚本都是从我正在运行的系统中复制文件的,前面说过,那个“母版”也是同一张安装光盘安装的系统,我安装“母版”系统的真正目的是为了快速得到系统目录结构,在流行的LINUX发行版中,etc/和var/两个目录的复杂程度仅次于usr/目录,如果从完全安装的系统来裁剪,难度不亚于编译某些高度简化的LFS,实际上运行这两个脚本后生成的文件夹完全可以作为以后添加功能的蓝本,原先备份的“母版”系统文件夹也可以删除了。
裁剪后对个别影响启动的文件的修改现在我已经得到粗制烂造的裁剪后centos-4.3了,它全部在目录my_centos中,大小约99M,我需要安装它到某块硬盘或是USB Disk上面去,我打算把它安装到U盘上,为此需要对grub和fstab进行修改,下面的修改适用于以ramdisk方式挂载根文件系统,要制作ramdisk镜像。
1、修改boot/grub/grub.conf,原始的grub.conf文件大抵如此:
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
title CentOS-4 i386 (2.6.9-34.EL)
root (hd0,0)
kernel /boot/vmlinuz-2.6.9-34.EL ro root=/dev/hdb1 rhgb quiet
initrd /boot/initrd-2.6.9-34.EL.img
我要把它改成下面这个样子:
timeout=0
title CentOS-4 i386 (2.6.9-34.EL)
root (hd0,0)
kernel /boot/vmlinuz-2.6.9-34.EL rw root=/dev/ram0 ramdisk=131072 quiet
initrd /boot/system.img
2、修改boot/grub/device.map为:
(hd0) /dev/sda
3、修改etc/fstab为:
/dev/ram0 / ext2 defaults 0 0
none /dev/pts devpts gid=5,mode=620 0 0
none /dev/shm tmpfs defaults 0 0
none /proc proc defaults 0 0
none /sys sysfs defaults 0 0
4、修改etc/rc.sysinit
这个文件是个很大的脚本,有1处需要去掉,否则在某些兼容性不好的主板启动会卡住,就是# Initialiaze ACPI bits这段,可能让系统卡住
建议建立一个目录专门放这几个修改后的文件,用的时候cp一下即可。
制作ramdisk
以闪存芯片为存储介质的U盘有个缺点,那就是写入寿命大大小于读取寿命,如果根文件系统挂载到U盘上,启动还有运行过程中频繁写入U盘会使U盘很快嗝屁,速度也慢,因此按照LFS的习惯把全部系统都做在initrd中,这样做虽然会多耗内存,但启动后可以拔掉U盘,仍旧写个简单脚本制作它:
#!/bin/sh
#创建128M的ramdisk镜像文件并mount在/mnt/test上
dd if=/dev/zero of=sysimage bs=1024 count=128k
mkfs.ext2 -F -m0 sysimage
mount -t ext2 -o loop sysimage /mnt/test
#复制所有系统文件到ramdisk镜像文件中
cp -cpR my_centos/* /mnt/test
#更新修改过的fstab和rc.sysinit文件
cp -f fstab /mnt/test/etc/
cp -f rc.sysinit /mnt/test/etc/rc.d/rc.sysinit
sync
umount /mnt/test
#压缩ramdisk镜像文件为system.img
rm -f initrd.img
gzip -9 sysimage
mv sysimage.gz system.img
#end
这样就得到了文件名为system.img的initrd文件了,initrd文件名一定要
和修改后的grub.conf的“initrd=”的参数一致,否则将无法启动。另外就是前面步骤修改后的etc/fstab一定要在这个镜像文件里面
5、安装系统到U盘
在我的机器上因为没有SCSI硬盘所以U盘的设备文件是/dev/sda,其第一个分区是/dev/sda1,如果不是这样,用下面的脚本前一定要修改成对应的设备文件,否则会产生无法挽回的后果,其威力绝不亚于《UNIX痛恨者手册》的任何悲惨报道:
#!/bin/sh
#格式化U盘并mount在/mnt/test上
mkfs.ext3 /dev/sda1
mount -t ext3 /dev/sda1 /mnt/test
#复制boot/目录到U盘
cp -cpR my_centos/boot /mnt/test/
#复制新的initrd文件和相关grub配置文件
cp system.img /mnt/test/boot/
cp -f grub.conf /mnt/test/boot/grub/
cp -f device.map /mnt/test/boot/grub/
sync
#安装grub到U盘的MBR
grub-install --root-directory=/mnt/test /dev/sda
sync
umount /mnt/test
#end
阅读(2167) | 评论(0) | 转发(0) |