Chinaunix首页 | 论坛 | 博客
  • 博客访问: 966233
  • 博文数量: 86
  • 博客积分: 2283
  • 博客等级: 大尉
  • 技术积分: 861
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-04 09:02
个人简介

没什么好说的。

文章分类

全部博文(86)

文章存档

2014年(1)

2013年(5)

2012年(7)

2011年(26)

2010年(20)

2009年(27)

分类: LINUX

2010-04-30 13:44:16

网上看到不少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


阅读(2171) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~