⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 新建 文本文档 (5).txt

📁 关于Linux嵌入裁减的技术文档
💻 TXT
📖 第 1 页 / 共 2 页
字号:
 
云上的老鼠
云上的日子
 

  DonewsBlog  |  Donews首页  |  Donews社区  |  Donews邮箱  |  我的首页  |  联系作者  |  聚合   |  登录      61篇文章 :: 0篇收藏:: 37篇评论:: 0个Trackbacks  
 

公告
这是quickmouse的blog哟

^______^

文章的转载请保留全文以及注明出处,谢谢合作!

文章
Linux的小技巧(RSS)
讲台之上(RSS)
经典收藏(RSS)
面包板上的时光(RSS)
随笔(RSS)
云上的日子(RSS)
收藏
相册
采风
我的宝宝们
常用链接
白云黄鹤BBS(term)
白云黄鹤BBS(web)
我的联系方式
Email Me
友情推荐
aw's blog
主人推荐
tcpdump/libpcap过滤规则解析的bug
如何在Linux当中判断USB控制器的类型
寄语Dian团队的队员
裁减Linux(老文一篇)
存档
2006年07月(1)
2006年06月(3)
2006年05月(1)
2006年04月(7)
2006年03月(8)
2006年02月(4)
2005年12月(2)
2005年11月(4)
2005年10月(2)
2005年07月(2)
2005年06月(4)
2005年05月(5)
2005年04月(3)
2005年03月(6)
2004年11月(3)
2004年10月(6)
最近评论
aw:钟老师,啥时候搞出了我们国家自己的芯片就好了!
quickmouse:发现前面的评论讲错了,现在用得多的是25系列的,包括25T,25K,25G等,22和23系列的就是比较老的了。不过25K现在限速142km/h,25T才可以到160。另外,25T现在一般是独立编组,不带发电车和行李车,因为车钩问题还真的是限制了编组的灵活性
tmsonhust:很受启发 
学习上 
心态上 
获益不少。。。。
Awflasher:good
ta:我从来不喜欢看这种教人性质的文章,不过觉得老师这篇文章真的写到点上了.可能是和我们的将来联系比较紧吧,所以通篇看完后觉得真的很不错,赞一个


裁减Linux(老文一篇) 
  这是自己在2003年初发表与华中白云黄鹤BBS Linux讨论区的一篇文章了,摘录于此,权做一个纪念,顺便更正当中的一些错误。不过文中的一些内容现在看来是有冗余的了,配置文件的理解也不如现在透彻,以后在撰文详述吧,搞一个patch?呵呵

发信站: 武汉白云黄鹤站 (2003年01月14日15:36:07 星期二), 站内信件 

小弟近日对Linux进行了小小的裁减,偶有心得,愿大家共享 


说到裁减Linux,无非是为了减小磁盘占用或者是为了某些特定场合的应用(如嵌入式系统)。以RedHat 7.3为例,其最小安装仍然达到了300M,这不得不让人对一直号称小而全的Linux系统感到疑惑。 


作为自己手中课题的一个铺垫,不久前我尝试了对Linux进行裁减,虽然没有达到预期的一张软盘大小,但结果也相当有吸引力。下面我对此一一做说明。 


参考文档: 
Linux bootdisk-HOWTO: 
    http://www.linux.org.tw/CLDP/gb/Bootdisk-HOWTO.html 

initrd introduce on Linux system: 
   /usr/src/linux-2.4/Documentation/initrd.txt 


裁减Linux一般有两种办法,其一是重新生成kernel和文件系统,其二是在原有的系统上删除不必要的文件缩小“体积” 

对从一个完整的RedHat 7.3版本而言,其最小安装也有300M,因此,第二个方法是不太现实的。于是重构文件系统和kernel成为了必然。 


裁减目标:构成一最小Linux系统担负实验室网关工作,系统载体为硬盘,运行使用RAMDISK,从而减小意外断电造成的文件系统修整消耗提高系统可靠性。 


目标平台:P2-400,8G/64M,8139LAN adapt x 2 


首先裁减kernel,既然是最小系统,则kernel里所有必须的部件都将直接编译进入内核。但是内核对module的支持需要保留。 


如何编译内核,不再累述,具体说说哪些选项先: 
Code maturity level options ---> 不选 
Loadable module support ---> 当中的Set version....的可以不要,其他两个留着 
Processor type and features ---> 按照目标系统选择对应的Process Family ,其他的嘛,留下Machine Check Exception、Low Latency....、HIGHMEM Support,其余都可以不要 
General setup --->当中,PCI的选上,其他的不要(注意对照你的系统),SYSTEM V IPC、BSD Process accounting、sysctl support留下,Kernel support ELF binary留着,其他的可以不要 
Binary emulation of other systems ---> 
Memory Technology Devices (MTD) ---> 
Parallel port support ---> 
以上三项都是可以不要的 
Plug and Play configuration ---> 选上,不过如果没有ISA设备,可以不选对ISA P&P的支持(比如我的目标系统) 
Block devices --->各取所需了,一般来说,如果你要用软盘,就选上Normal floppy disk support,大多数嵌入式系统是不要的。中间几个也是没有的;Loopback device是一定要的,Network block device我也没把握,可能可以不要不过我选了,呵呵,RAM Disk一定要,Initrd RAM Disk support当然要选。至于Default Ramdisk size就无所谓了,反正可以在启动的时候修改,呵呵。 

Multi-device support (RAID and LVM) ---> 这个一般也用不上,不选了。 
Networking options --->既然是打算做网关,呵呵,里面大部分东西都要选上而且是[*],编译入内核(前面已经说过了,没有编译为模块的)。从上到下一直选到IP: Virtual Server Configuration --->(从这个开始(含),可以不要了)。 

需要说明的是,其中的IP: Netfilter Configuration --->子项即便选择全部编译到内核,似乎并没有什么变化,用iptables的时候一样要iptables的.so支持 :( 不过对irc和ftp的跟踪倒是不需要insmod了 

Telephony Support ---> 
SCSI support ---> 
Fusion MPT device support ---> 
I2O device support ---> 
Amateur Radio support ---> 
IrDA (infrared) support ---> 
ISDN subsystem ---> 
Old CD-ROM drivers (not SCSI, not IDE) ---> 
上面几个都不用,为什么RedHat那么大,他们有不小的功劳哟~~~ 

Network device support --->里面找出你目标系统的网卡(我这里是8139)选上,其他的统统去掉吧。 
Input core support --->如果你不是用的USB接口鼠标键盘,可以不用选他们。 
Character devices --->这里面我只选了Virtual Terminal以及Support for console on virtual terminal,其他好多东西都没有选。 
Multimedia devices ---> 
Crypto Hardware support ---> 

这两个对一般的最小系统来说都是不用的 

File systems --->这个是内核大小的大头,ext2(Second extended...)是必要的,ext3也用上吧,/proc有必要,DOS FAT/VFAT(win-95)估计你可能也需要,分区表只要支持PC BIOS就可以了,Native Language我把iso8859-1给内置了 
console drivers->我只选了VGA text console 
Sound ---> 
USB support ---> 
Additional device driver support ---> 
Kernel hacking ---> 
这几个都没有选,make dep;make clean;make bzImage 
看看吧,内核大概是700~800k左右


以前我总以为裁减kernel就是裁减Linux了,后来才发现是大错特错。 
以前总以为最难的是裁减kernel,后来才发现自己多么无知。学习裁减内核,大概只用了一两天,编译一次内核也就20分钟不到,可是后来居然重建文件系统花了一两个星期,呜呜~~~ 

关于文件系统和kernel的关系,从参考文档里面可以知道,大家自己去看。如果连这个都不懂,建议暂时不要做裁减的事情,以为照着我的文章依葫芦画瓢多半是不能成功的。 

首先按照ramdisk的生成方法或者loopback device的生成方法生成一个8M的磁盘挂接到/mnt(或者其他目录)上,就可以以/mnt为根目录构造文件系统。注意将其按照ext2方式格式化 
lrwxrwxrwx    1 root     root            4 Dec 28 09:31 bin -> sbin 
drwxr-xr-x    5 root     root         1024 Dec 27 13:42 dev 
drwxr-xr-x    7 root     root         1024 Jan  6 15:14 etc 
drwxr-xr-x    2 root     root         1024 Dec 12 08:33 initrd 
drwxr-xr-x    4 root     root         1024 Dec 30 06:52 lib 
drwxr-xr-x    2 root     root         1024 Dec 11 07:52 mnt 

dr-xr-xr-x   24 root     root            0 Jan  6 15:14 proc 
drwxr-xr-x    2 root     root         1024 Dec 26 03:03 root 
drwxr-xr-x    2 root     root         1024 Dec 30 07:28 sbin 
drwxr-xr-x    2 root     root         1024 Dec 26 03:04 sysroot 
drwxr-xr-x    2 root     root         1024 Apr 19  2002 tmp 
drwxr-xr-x    3 root     root         1024 Dec 12 07:45 usr 
drwxr-xr-x    5 root     root         1024 Dec 12 02:43 var 


这几个目录是必须的 


先看看bin下面有什么 
lrwxrwxrwx    1 root     root            6 Dec 30 07:28 ash -> ./bash 
-rwxr-xr-x    1 root     root       541096 Dec 30 07:27 bash 
-rwxr-xr-x    1 root     root        16020 Dec 13 08:56 cat 
-rwxr-xr-x    1 root     root        16680 Dec 27 15:40 chmod 
-rwxr-xr-x    1 root     root        36360 Dec 28 09:10 cp 
-rwxr-xr-x    1 root     root        62756 Dec 28 09:25 ftp 
-rwxr-xr-x    1 root     root       100624 Dec 28 09:14 grep 
-rwxr-xr-x    1 root     root         8672 Dec 26 03:27 halt 
-rwxr-xr-x    1 root     root         9624 Dec 28 09:14 hostname 
-rwxr-xr-x    1 root     root        54316 Dec 28 09:14 ifconfig 
-rwxr-xr-x    1 root     root        26920 Dec 12 02:42 init 
-rwxr-xr-x    1 root     root       105768 Dec 27 13:44 ip 
-rwxr-xr-x    1 root     root        60764 Dec 28 09:15 iptables 
-rwxr-xr-x    1 root     root         7764 Dec 26 17:26 kill 
-rwxr-xr-x    1 root     root        19080 Dec 12 02:25 login 
-rwxr-xr-x    1 root     root         9172 Dec 11 07:54 losetup 
-rwxr-xr-x    1 root     root        46888 Dec 13 08:55 ls 
-rwxr-xr-x    1 root     root        10316 Dec 13 08:37 mingetty 
-rwxr-xr-x    1 root     root        17992 Dec 27 14:15 mkdir 
-rwsr-xr-x    1 root     root        60104 Dec 11 07:54 mount 
-rwxr-xr-x    1 root     root        43496 Dec 28 10:02 mv 
-rwxr-xr-x    1 root     root        22196 Dec 26 02:09 nash 
-rwxr-xr-x    1 root     root        29464 Dec 28 09:49 ping 
-r-xr-xr-x    1 root     root        63304 Dec 26 16:57 ps 
lrwxrwxrwx    1 root     root            4 Dec 26 03:33 reboot -> halt 
-rwxr-xr-x    1 root     root        26216 Dec 26 17:35 rm 
lrwxrwxrwx    1 root     root            6 Dec 30 07:28 sh -> ./bash 
-rwxr-xr-x    1 root     root        14952 Dec 11 09:44 shutdown 
-rwxr-xr-x    1 root     root       219932 Dec 28 10:06 ssh 
-rwxr-xr-x    1 root     root       260616 Dec 27 14:04 sshd 
lrwxrwxrwx    1 root     root            6 Dec 26 16:48 swapoff -> swapon 
-rwxr-xr-x    1 root     root         7108 Apr  1  2002 swapon 
-rwxr-xr-x    1 root     root        27208 Dec 27 14:13 syslogd 
-rwxr-xr-x    1 root     root        78808 Dec 28 09:30 telnet 
-rwsr-xr-x    1 root     root        30664 Dec 27 14:23 umount 
-rwxr-xr-x    1 root     root         7832 Dec 12 01:54 update 
-rwxr-xr-x    1 root     root       386120 Dec 28 09:13 vi 
-rwxr-xr-x    1 root     root        13896 Dec 30 06:53 who 


这里面包含了ftp、telnet、ssh客户端以及sshd服务器常用的命令和网络设置命令,iptables防火墙,vi编辑器,shell用的是bash,虽然ash很小但是总是不习惯没有auto complete功能,tcsh不大不小功能又全,可是对一些shell脚本的支持不太好。nash用来解析linuxrc,后面会讲到(如果你看了最前面提到的initrd.txt)也会明白。 


接着,用ldd命令看bin目录下面的各个可执行文件分别都和哪些动态库连接把他们cp到/mnt/lib目录下,如用ldd看mv命令,结果如下

   libc.so.6 => /lib/i686/libc.so.6 (0x42000000) 
    /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) 

把/lib/i686/libc.so.6和/lib/ld-linux.so.2复制到/mnt/lib下面即可。 
libc.so.6是基本的libc库,好像不同的处理器还不一样,我就在一台P-MMX下面用P2的libc,结果死掉了。查了半天 :( 
iptables命令除了其显示的以外,还要把/lib/iptables目录复制到/mnt/lib下面 
/lib/security下面是PAM需要的库,最小系统只需要复制/lib/security下面的pam_unix.so、pam_stack.so到/mnt/lib/security下面即可 


/etc下面的东西最是麻烦,要改的不是一点点 
/etc/inittab init的配置文件,我改的是这样的: 

id:3:initdefault: 
si::sysinit:/etc/rc 
1:2345:respawn:/sbin/mingetty tty1 
2:23:respawn:/sbin/mingetty tty2 
l0:0:wait:/etc/rc0 
l6:6:wait:/etc/rc6 

呵呵,简单吧 

/etc/fstab记录系统启动应该mount的文件系统,因为系统在ramdisk上面跑,所以是这样的: 

/dev/ram0               /                       ext2    defaults        1 0
none                    /proc                   proc    defaults        0 0


从inittab里面知道,启动后执行脚本/etc/rc我是这样写的: 

#!/bin/sh 
/bin/mount -n -t proc /proc /proc 
/bin/mount -n -o remount,rw / 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -