LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3013|回复: 33

裁LINUX-2.6.6技巧

[复制链接]
发表于 2004-5-31 14:27:53 | 显示全部楼层 |阅读模式
在LINUX-2.4.4上升级2-6.6内核后, 整个文件系统共有2G, 而如果将其移植到只有100M的IDE如何办, 如何定制自己的MINI LINUX目前的裁减工具是:GENTOO和LFS, (用手工不可能)下面介绍如何用GENTOO来定制俺们的MINI LINUX待序
发表于 2004-5-31 16:33:01 | 显示全部楼层
Kao! 偶顶先!
期待搂住的美文,
3x!

最近也在这方面努力,所有应用都要运行在x-window上,老兄裁减下来的x-window多大?
发表于 2004-6-1 10:06:56 | 显示全部楼层
your ID translated as GD-chinese is :  si ba ,xiao zi.



hehe, only a joke.
发表于 2004-6-1 16:00:31 | 显示全部楼层
呵呵,怎么还没有开始贴出来呢?
期待ing..........
发表于 2004-6-7 10:35:25 | 显示全部楼层
怎么就没有回文了,我也想用X-windows,同时要再加一个postresQL数据库,整个系统越小越好!
发表于 2004-6-7 13:47:29 | 显示全部楼层
试试看Debian吧,X用xfce?安装上需要的东西以后,开始卸载开发工具和其他用不到的东西。
发表于 2004-6-8 09:37:59 | 显示全部楼层
楼主怎么说着说着就没有下文了。不会是吊我们的胃口吧?
 楼主| 发表于 2004-6-8 21:26:45 | 显示全部楼层
对不住大家了!这几天较忙!没时间!
kernel的裁减不讲!,下面是shell的选择和编译。 对于linux而言,kernel只是提供系统调用接口,本身无法直接使用,需要外部shell的支持。一般shell有几种选择,如bash、ash、busybox等,由于busybox相对尺寸最小,而且提供了基本完整的功能,所以选择busybox做为系统的shell。详细信息参阅www.busybox.net,附件中有 ... 个基本系统。 busybox的配置文件在附件中有,这里就不列举了。

编译过程:
和kernel基本相似
1、解压busybox
2、复制config到busybox源码目录下
3、make menuconfig #不做改动即可退出
4、make dep && make

三、基本系统的安装:
到此时,busybox和kernel都已经准备完毕,接下来需要一个分区来安装他们。 不管是使用一个单独的分区还是完整的DOM都可以,但总归需要一个完整的目标分区供使用。假设目标分区为/dev/hdc1,下面的说明会以此为基准。 需要说明的一点是,一开始尽量不要用DOM直接调试,因为其速度和容量都十分的不好,会造成调试的困难,直到调试后期再使用是个比较不错的主意。

现在进入基本系统的组装:
# fdisk /dev/hdc1 and format it with ext2 or ext3. My suggest is ext3.
Mount /dev/hdc1 /mnt/dom # mount目标分区
mkdir /mnt/dom/boot
mkdir /mnt/dom/boot/grub
cp /boot/grubbzImage /mnt/dom/boot # copy kernel to dom
cp (kernelbackup)/initrd.splash /mnt/dom/boot # copy initrd splash to dom
mkdir /mnt/dom/lib
mkdir /mnt/dom/lib/modules
cp (kernelbackup)/2.4.20 /mnt/dom/lib/modules -arf # copy all modules to dom cd (busyboxpath)
make PREFIX=/mnt/dom install # install busybox to dom
现在,一个基本系统基本安装完毕,接下来是配置问题:
mkdir /mnt/dom/etc # all config here
mkdir /mnt/dom/dev # device file
mkdir /mnt/dom/mnt
mkdir /mnt/dom/proc
mkdir /mnt/dom/tmp
mkdir /mnt/dom/var
mkdir /mnt/dom/lib
mkdir /mnt/dom/root # home of root
mkdir /mnt/dom/usr # X window-manager lib, etc
cp (busyboxpath)/examples/bootfloppy/etc/* /mnt/dom/etc -arf # base config
cp /dev/* /mnt/dom/dev -arf # device file. Will cutdown part of all

下面是加入必需的连接库:
1、ldd busybox
2、查看busybox使用了哪些连接库,拷贝至目标分区中同样的路径下,一般为/lib
3、再用ldd查看连接库是否还有需要的库文件,如果有同样拷贝到目标分区中
4、重复第三步
5、cp /dev/* /mnt/dom/dev/ -arf # 后期还会做一些裁减
Grub配置:
# add below to your grub.conf
title new kernel(2.4.20) # title just, u can modify it anywhere
root (hd0,0) # root setup
kernel (hd0,0)/boot/bzImage-2.4.20 ro root=/dev/hda1 vga=791 splash=silent # just.....
initrd (hd0,0)/boot/initrd.splash # splash that show when booting of OS

现在可以做一些测试,看看基本系统是否工作正常。执行下面的命令
cd /mnt
mkdir dom
mount /dev/hdc1 dom # mount it
chroot /mnt/dom /bin/sh
如果你看到登陆成功的信息就表示基本系统没有什么问题了。

重新启动机器,并选择新的启动选项,看看基本系统是否正常,如果有问题,重新检查前面的步骤是否做的有问题。如果启动正常,那么,基本系统就基本完备,可以继续后面的步骤了。

四、Xfree86的裁减和安装:
基本系统已经正常工作,接下来就是xfree86的裁减和安装,首先切换到目标分区并确定系统处于正常工作状态。
在这里需要说明一下Linux的目录分布和作用情况。首先通过“ls /”列举一下根分区,大致会有以下目录:
bin boot dev etc home lib mnt opt proc root sbin tmp usr var
下面逐一说明:
bin: shell的工作目录,比如sh、bash、mount等命令
boot: kernel、ramdisk文件以及grub(lilo)的存放目录,有的发行版会为此目录单独创建一个分区,以防止系统崩溃的影响。在DOM中是不考虑的。
dev: 所有的设备文件都存放在这里,比如/dev/video0、/dev/hda等。全部设备文件大概要占用400K左右的空间,但似乎全部拷贝过来的话,DOM总是会报空间不足,但实际还是有空间的,原因不明。目前的做法是对设备文件做了一些调整,去除了不需要的部分,参考后面的文件列表。
etc: Ap配置以及系统配置存放目录
home:普通用户的工作目录根
lib:基本库存放目录
mnt:mount
opt:看情形,目前是用做存放firebird
proc:系统工作所需的目录
root:一般为root的工作目录,可以调换
sbin:常规命令存放目录
tmp:一般为临时目录
usr:所有扩展命令和xfree86,以及window-manager所在目录,是系统最大的一个目录,包含内容最多。对于DOM来说,主要是存放连接库、xfree86、字体、window-manager等。
Var:临时目录,一般在发行版中为存放website文件、安装文件以及一些log信息等,在DOM中只作为临时目录使用

大致的分布情况说明完毕,接下来就是具体的裁减工作了。 实际上,xfree86有一些替代实现,比如freedesktop、fb等,甚至framebuffer也是一个可以考虑的方向,但是由于AP使用了nvidia显卡提供的opengl 1.3接口,导致目前的唯一选择就是xfree86。也许有其他更小的实现,希望能在以后改进。 进入正题,xfree86的主程序实际上就是一个XFree86,位于/usr/X11R6/bin,有的发行版下X是一个指向XFree86的连接,有的却是一个完整的程序,但不管怎么样,Xfree86就是最主要的程序。现在,在目标分区上mount发行版,以便可以拷贝我们所需要的:
cd /mnt
mkdir dist # create mount path of distribute
mount /dev/hda1 dist # /dev/hda1 is root partition of your distribute. Check it.
现在/mnt/dist就是发行版所在的位置。

mkdir /usr/X11R6
mkdir /usr/X11R6/bin
mkdir /usr/lib
mkdir /usr/X11R6/lib
创建一些需要的目录。

cp /mnt/dist/usr/X11R6/bin/XFree86 /usr/X11R6/bin -arf 拷贝xfree86的主程序。
cp /mnt/dist/usr/bin/ldd /sbin # copy ldd that is used to cutdown
ldd是用来在DOM的环境中做裁减工作的,直接输入ldd看看是否可以运行,如果执行有问题,一般是相关的连接库不全,按照之前的方法复制过来就可以了。

现在,要查看XFree86需要哪些连接库和配置文件,以保证其可以运行起来。
cd /usr/X11R6/bin
ldd Xfree86
此时会看到很多的连接库,那么就需要把这些库全部从发行版上复制过来,可以直接复制到相对应的目录下,比如/usr/lib/或者/usr/X11R6/lib/下,需要注意的一点是,有些库本身还会需要其他的库,可以一层层的ldd出来,网络中有人做过自动工作的工具,但还是手动裁减比较可靠。全部的库导入完毕后,尝试运行/usr/X11R6/bin/XFree86,会看到一些出错信息,提示/etc/X11/XF86Config不存在,那么就将发行版中的/etc/X11目录全部复制到目标分区中:
cp /mnt/dist/etc/X11 /etc -arf
实际上这个目录中不是全部都需要的,某些部分是可以删除的,但我没有具体实验,而且尺寸并不是很大,就全部使用了。
现在再执行/usr/X11R6/bin/XFree86,会提示一些库没有找到,但实际上之前已经全部复制过来了,原因是从shell执行一条命令的时候,命令所需要的库是从以下的途径得到的:
1、搜索/lib
2、搜索/etc/ld.so.cache
之前所复制的库文件大半是放在/usr/lib和/usr/X11R6/lib下的,而且现在的/etc下还没有ld.so.cache文件,要生成这个文件就需要ldconfig这个命令:
cp /mnt/dist/sbin/ldconfig /sbin -arf
现在ldconfig是有了,但还需要与之有关的配置文件/etc/ld.so.conf,所以:
vi /etc/ld.so.conf
/usr/lib
/usr/X11R6/lib
现在执行ldconfig,就会在/etc/下出现一个ld.so.cache。以后如果有新加入的库文件,而且不是存放在/lib/下的,都按照这个步骤来导入。现在,执行/usr/X11R6/bin/XFree86,出现的错误提示为无法打开/var/kdb和/var/log。
这里需要说明配置上的一个修改,cat /etc/fstab,会看到现在的fstab只有一句话:
none /proc proc defaults 0 0
现在要加入一些新的配置,新的fstab如下:
proc /proc proc defaults 0 0
none /var tmpfs defaults 0 0
none /tmp tmpfs defaults 0 0
none /dev/pts devpts gid=5,mode=620 0 0
none /data tmpfs defaults 0 0
现在/var、/tmp和/data都是在内存中了,其中/data是将来mount磁盘的地方,需要手动mkdir出来:
mkdir /data
现在修改/etc/init.d/rcS:
#! /bin/sh

/bin/mount -a

mkdir /var/log
mkdir /var/lib
mkdir /var/lib/xkb

重启DOM,现在应该存在/var/log、/var/lib、/var/xkb目录了,当然这些目录只是存放在内存中,所以需要每次启动时临时创建。
再运行XFree86,应该会看到一个错误的提示,说明还需要opengl的一些连接库,从发行版中复制出来就可以了。
尝试在目标分区中执行/usr/X11R6/bin/XFree86,如果没有进入X界面,需要检查之前的步骤是否有没有做对的地方。

五、Window-Manager的选择安装:
到目前为止,X已经完全移植到DOM中了,但一个包含基本系统和X的系统还不能满足AP的要求,接下来是Window-manager的选择和安装。
kde和gnome是无法安装到DOM中的,尺寸太大,可能的选择包括twm、fluxbox、windowmaker、icewm等,但需要满足以下几个条件:
1、有caption,而且Modal dialog不能被切到后台,以符合用户的操作习惯
2、X上不能有任何多余的部分,即除了AP,不存在任何UI,如taskbar之类
3、尺寸要小
4、最好不要有system menu和system buttons

经过挑选,最终选择了fluxbox作为DOM的window-manager,尺寸相对其他window manager要大一些(10M),但是较好的满足了以上条件。

安装过程:
1、下载fluxbox
2、./configure
3、make
4、make install
5、复制相关文件到DOM的相同目录中
6、测试,如果有问题,重复第一步
等window manager安装完毕后,一个包含基本系统和window的环境就创建成功了。接下来就是一些附属部件的裁减和安装了。

六、其他部件的裁减和安装:
先切换到发行版。最后定义的数据库引擎为Firebird 1.5,所以先下载firebird 1.5(http://prdownloads.sourceforge.net/...0-0.i686.tar.gz),然后在发行版上先安装。firebird会安装在/opt目录下,将/opt/firebird复制到目标分区中:
cp /opt/firebird /mnt/dom/opt -arf

然后修改配置文件:
vi /mnt/dom/etc/init.d/rcS
#! /bin/sh

/bin/mount -a

mkdir /var/log
mkdir /var/lib
mkdir /var/lib/xkb

/opt/firebird/bin/fb_lock_mgr &
/opt/firebird/bin/fb_inet_server &

现在切换到目标分区中,会看到进程列表中有一个fb_lock_mgr,这说明firebird已经安装成功。

由于实际的裁减过程中会遇到各种各样的问题,有些方面牵涉太广,以至没有办法单独说明,所以接下来是一些可能会遇到的问题说明:
1、nvidia的驱动需要先在发行版上解开,再执行make && make install > install,然后修改install中的目标路径以将相关文件安装到DOM上,比如cp libGL.so /usr/lib改为cp libGL.so /mnt/dom/usr/lib。具体操作就不列举了。
2、busybox的mount有问题,不能mount -o loop,所以cramfs的文件需要用发行版的mount,所以在dom的/mnt/cramfs目录下有一个mount,而/bin也有一个mount
3、为了便于调试,在dom中加入了telnet server和ftp client,分别使用的是utelnetd和cmdftp,出处可以通过google搜索
4、grub的安装使用grub-install即可
5、由于firebird等模块至少需要一个root用户,而busybox缺省是没有用户的,所以需要在/etc下复制两个文件:shadow和passwd
6、dhcp client使用的是udhcpc
7、字体主要和以下目录有关:/usr/lib/gconv、/usr/lib/locale、/usr/X11R6/lib/X11/font和/usr/X11R6/lib/X11/locale(限于redhat,其他发行版会有一些差异,但具体内容是一样的)
8、硬件自检使用的是hwsetup,并对源代码做过一些修改,只保留了audio和network card的检测,在附件里有原始和修改过的两个版本,可以对比参考
9、web site功能是用kylix自己实现的,没有使用apache
10、由于dom的空间不足以摊平所有文件,所以/usr下面的文件全部都是以一个cramfs文件的格式出现的,参看后面的文件列表。

七、DOM的最后安装和打包:
cramfs文件的创建:
1、确定目标分区的可运行
2、确定/mnt/dom/usr/目录下的文件完整性
3、mkcramfs /mnt/usr.cramfs /mnt/dom/usr # make a cramfs file of usr path
4、保存/mnt/dom下的完整列表,以备将来的修改
5、rm /mnt/dom/usr/* -rf
6、mkdir /mnt/dom/mnt/cramfs
7、cp /mnt/usr.cramfs /mnt/dom/mnt/cramfs
8、cp /bin/mount /mnt/dom/mnt/cramfs -arf
9、add /mnt/dom/etc/init.d/rcS:/mnt/cramfs/mount -o loop -t cramfs /mnt/cramfs/usr.cramfs /usr

现在,/mnt/dom目录下就已经是一个除了grub全部都是完整的DOM镜像了。那么最后要将这个镜像导入真实的DOM之中:
mkdir /mnt/realdom
mount /dev/hdc1 /mnt/realdom # assume /dev/hdc1 is real dom
cp /mnt/dom/* /mnt/realdom/ -arf
sync
此时DOM中已经有了一个完整的镜像,但还没有grub,那么执行:
grub-install /dev/hdc1
重新启动,并在BOIS中选择真正的DOM,确认DOM的启动没有问题。重新切换到发行版,开始做DOM的镜像文件:
dd if=/dev/hdc of=domfs # domfs is image of dom
保存好这个名字为domfs的镜像文件,这就是一个可安装的包,安装到其他DOM中时,输入:
dd if=domfs of=/dev/hdc
到目前为止,所有的流程都走了一遍,剩下的就是不断的实践和验证了。

后记:
经过一次完整的裁减过程,很自然的对Linux的整体结构和方式有了很清晰的了解,虽然不能对kernel有深入了解,但是起码为以后kernel方面的学习打下了很好的基础。由于牵涉方面比较多和杂,有。
 楼主| 发表于 2004-6-9 14:03:56 | 显示全部楼层

精简版

我就上面的内容精简一番:
因为有些朋友觉得很罗嗦
是一个完整的基本的LINUX根文件系统!
/dev(全部考过来或一部分CP /DEV/* /MNT/DEV/ -ARF,), /bin(BUSYBOX自动生成), /var, /sbin(自动生成),/usr,/tmp(空),/mnt(空),/boot(拷贝2.6.6的VMLINUZ),/root(空),/etc(自动又BUSYBOX生成),
用的是BUSYBOX做SHELL的,实际上整个过程并不复杂:
在64M的目标分区中,建一个基本的目录, --------然后将BUSYBOX安装到目标分区中,:MAKE PREFIX=/MNT INSTALL,即可,BUSYBOX自动在目标分区中的各个目录做一个软链接!如:/BIN, /SBIN, /ETC中形成基本系统的SHELL,-------然后查看BUSYBOX所需的库文件DD BUSYBOX并将其拷到目标系统中的/LIB中,查看XFREE86所需的库文件:
LDD /USR/X11R6/BIN/XFREE86, 将其同样拷进来!-----将X WINDOW的主程序拷到相应的目录下:CP /USR/X116/BIN/XFREE86 /MNT/USR/X11R6/BIN,这个文件较大又1.8M,接着拷一些必要的文件即可!--------这是我的整个过程!
我的内核用的是2.6.6,
发表于 2004-6-11 19:44:05 | 显示全部楼层
小声的问楼主OM是虾米东西?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表