LinuxSir.cn,穿越时空的Linuxsir!

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

[原创&经验分享]制作<200M的tomcat+mysql服务器

[复制链接]
发表于 2006-7-28 17:38:56 | 显示全部楼层 |阅读模式
制作<200M的tomcat+mysql服务器

stlxv, contact me: stlxv@21cn.com/stlxv@126.com

    最近制作了个系统,要用来当web服务器的。由于要装入一张flash卡,所以尺寸要尽量小,200M的容量(包括20M的数据库文件,实际上只有180M),是可以满足要求的。目前还只是装在硬盘上,还没有放到FLASH卡上。系统组成(除去tomcat/jdk/mysql估计有十M左右)如下:
    busybox+udev+bash+dhcpcd+tomcat+mysql+jdk+grub
其中:
    busybox 1.2.0
    udev 076
    bash 3.0
    dhcpcd 1.3.22-pl4 (pl4是版本的一部分吗?)
    tomcat 5.5
    mysql 5.0
    jdk 1.5.0.07

制作工具:
    LFS 6.11-4 LIVECD
    一个已经做好的LFS 6.11系统(其中部分JDK要用到的库来自这个系统)

成品下载:
   毕竟不是在虚拟机上做的,所以……

制作过程:

1. 参照LFS BOOK,制作整条tool chain,3个测试工具就算了。
2. 参照http://www.linuxsir.cn/bbs/showt ... 链临时系统。
3. 编译和安装内核和其它东西,编译的时候尽量去掉库依赖。
可以在make的时候加上LDFLAGS="-static"来链接静态库(记住一定要加,否则解决库依赖是很痛苦的事情,要一个一个地去查)。gcc的-static参数可以用来强制链接静态库。由于链接静态库只是从静态库中复制程序段到程序中。

busybox:
默认make install的时候是到_install目录,编译完之后只有busybox一个执行文件,其它的都是到它的链接。完了后cp到/下就可以了。注意在cp前先设置好权限!

udev:
编译完后也是make install到_install目录吧,然后再从中复制文件出来到目标系统,具体操作见说明文件。为什么还要udev?因为想在系统启动的时候动态生成设备文件。我不清楚具体哪些可以不要,所以全部都复制过去了。

bash:
make后我们只需要bash一个执行文件就可以了,也可以到其它系统那里cp一个,不过要先检查是否静态编译。(可以用ldd检查)
为什么要一个bash呢?因为busybox启动时默认的shell很不爽。busybox启动时会要你按下ENTER才可以进入系统,解决方法是修改源代码。在文件init/init.c中有一段(500多行的地方):
                        bb_full_write(1, press_enter, sizeof(press_enter) - 1);
                        while(read(0, &c, 1) == 1 && c != '\n')
                                ;
把上面3行注释掉就可以了。方法:
/*
                        bb_full_write(1, press_enter, sizeof(press_enter) - 1);
                        while(read(0, &c, 1) == 1 && c != '\n')
                                ;
*/
不过去掉后就只有一个终端了,这最好不过了。

dhcpcd:
make后dhcpcd一个文件就足够了。

内核:
编译后把bzImage复制到/boot中。

grub:
编译后复制stage1和stage2到/boot/grub就可以了,如后编辑/boot/menu.lst。完了进入grub shell来安装grub。

最后,记住要strip哦!整个过程完了可以:
strip --strip-all /bin
strip --strip-all /lib

4. 上面这些完了之后就可以调整系统了,编写脚本让系统正常工作。
系统启动时会启动/sbin/init,它其实并不是一个脚本,用一般的脚本来做init的话是不成功的,/sbin/init其实也是到busybox的链接。busybox启动时会先执行/etc/profile,然后进入它的shell。这里我的/etc/profile最后加上/bin/bash来启动bash。注意/etc/profile执行时还没有PATH(你设置了也没用),所以全部要用完整路径。bash启动时会找/.bashrc而不是/root/.bashrc。因而启动要做的事情可以在这里做。

关于mount:
    要在硬盘上touch /proc/mount。

关于fstab:
    写完/etc/fstab后,会发现mount -a时无法正常挂载swap分区(no such file or directory),先mount -a之后再用swapon -a来挂载swap分区。但是swap分区要在/etc/fstab中写明,否则swapon -a不会自己找到(估计swapon只是从那个文件去寻找swap分区)。

关于网络:
   /etc/hosts和/etc/resolv.conf一定要先存在。

关于dhcpcd:
   有一个目录(也可能是文件)需要事先存在,具体忘了,可以在第一次运行dhcpcd时看到错误消息后设定。

关于dev:
/dev中其实只要有null、console、/dev/pts/, /dev/shm就可以了,其它的设备文件在系统启动后让udev创建在tmpfs里。注意null要让各个用户都可写,否则mysql启动时(应该是,不是就是在安装初始数据库时)会出错。

5. 继续安装各种服务器。

jdk 1.5:
这是最麻烦的,整个100多M,想办法裁减到那些用不着的,最后剩下100M,不过还能再小,只是我觉得再小也小不是很多了,所以没继续裁减。而我下载来的是编译好的,它依赖于很多库,我一个一个用ldd去查找需要的库,结果都满足了还不行,说缺少HPI库(libhpi我却没找到……)。为了解决库问题,我把上周做的系统里的/lib的东西全部复制过来了,问题就解决了。注意,还要复制ld.so.2(好像是),然后要touch /etc/ld.so.conf、/etc/ld.so.cache,还要运行ldconfig(最好是复制过来,有新的库的时候可以运行ldconfig来添加到缓存)。另外,为了让jdk可以顺利运行,要把bin目录加到PATH中去。
我的/lib目录(2M多):
ld-linux.so.2
libBrokenLocale.so.1
libanl.so.1
libblkid.so.1
libbz2.so.1.0
libc.so.6
libcom_err.so.2
libcrypt.so.1
libdl.so.2
libe2p.so.2
libext2fs.so.2
libhistory.so.5
libm.so.6
libncurses.so.5
libnsl.so.1
libnss_compat.so.2
libnss_dns.so.2
libnss_files.so.2
libnss_hesiod.so.2
libnss_nis.so.2
libnss_nisplus.so.2
libpthread.so.0
libreadline.so.5
libresolv.so.2
librt.so.1
libshadow.so.0
libss.so.2
libthread_db.so.1
libutil.so.1
libuuid.so.1
libz.so
libz.so.1

mysql 5:
可以去下载个只有服务器的静态编译版本,我下载了个MySQL-server-5.0.22-0.i386.rpm,直接解压。解压完了要创建mysql用户和mysql组。由于我的busybox没有useradd, groupadd这样的东西,所以只要自己修改/etc/passwd, /etc/group,依样画葫芦,这两个用户就出来了。此时还要运行hostname localhost来设置一下本机名称。(mysql只会找localhost)
创建完了要运行mysql_install_db来安装初始数据库(这将占用20M),印象中好像要先su mysql然后再运行,这个时候还要保证一些目录可写,可以根据错误提示来更改。以后数据库文件就存放在/var/lib/mysql中了!

tomcat 5:
下载服务器包就可以了,解压后删掉示例程序可以减掉约10M的空间。为了让tomcat可以启动和运行,需要让127.0.0.1可以使用,为了让tomcat可以关闭,必须让localhost可用!注意tomcat需要环境变量JAVA_HOME。

6. 附:我写的脚本(可以正常启动,虽然会有错误信息):

/etc/profile:
/sbin/init_scripts/init-dev

/bin/mount -a
/bin/bash

/.bashrc:
# set up network
/sbin/init_scripts/init-network

# set up jdk enviroment
export JAVA_HOME=/usr/jdk1.5.0_07
export PATH=$PATH:/usr/jdk1.5.0_07/bin

# start tomcat server
echo "starting tomcat server 5.5"
/usr/tomcat/bin/startup.sh

# start mysql server
mysqld_safe --user=mysql &

/sbin/init_scripts/init-dev:
# init devices before udev

/bin/mount -vt proc proc /proc
/bin/mount -vt sysfs sysfs /sys
/bin/mount -vft tmpfs tmpfs /dev
/bin/mkdir /dev/pts
/bin/mkdir /dev/shm

# start udev to make device nodes

/sbin/udevstart

/sbin/init_scripts/init-network:  <--  这个东西让我郁闷了好久!
# bring up loopback interface
ip addr add 127.0.0.1/8 label lo dev lo
ip link set lo up
hostname localhost           <--- 这里一定要先设127.0.0.1再设localhost

# bring up eth0
. /etc/network/network-select

case ${SELECT} in
        dhcp)
                echo "network: DHCP"
                . /sbin/init_scripts/init-dhcp
                ;;
        ip-static)
                echo "network: static IP"
                /sbin/init_scripts/init-static-ip
                ;;
esac

/sbin/init_scripts/init-dhcp:
echo "init-dhcp"
dhcpcd -k
dhcpcd eth0
. /var/lib/dhcpc/dhcpcd-eth0.info


/sbin/init_scripts/init-static-ip:
. /etc/network/ipv4

if [ -n "$IP" -a -n "$PREFIX" ]; then
        ip_netmask="$IP/$PREFIX"
fi

if [ -n "$BROADCAST" ]; then
        bcast="broadcast $BROADCAST"
fi

if [ -n $ip_netmask ]; then
        ip addr add $ip_netmask $bcast dev eth0
        ip link set eth0 up
       
        if [ -n $GATEWAY ]; then
                ip route add default via $GATEWAY dev eth0
        fi
fi

7. 附:我的配置文件

/etc/fstab:
# Begin /etc/fstab

# filesystem        mount-point        fs-type                options                dump        fsck-order
/dev/hdd1        /                ext3                defaults        0        0
/dev/hdd6        /boot                ext3                defaults        0        0
/dev/hdd3        /filedata        ext3                defaults        0        0
/dev/hdd4        /fileback        ext3                defaults        0        0
proc                /proc                proc                defaults        0        0
sysfs                /sys                sysfs                defaults        0        0
devpts                /dev/pts        devpts                gid=4,mode=620        0        0
shm                /dev/shm        tmpfs                defaults        0        0
/dev/hdd5        swap                swap                defaults        0        0

# End /etc/fstab


/etc/hosts:
127.0.0.1 localhost


/etc/resolv.conf:
nameserver 202.96.128.68


/etc/network/network-select:    <--  不好意思不要笑我英文烂,我觉得里面的英文肯定是不对的,特别是selection应该用chosen更对
# uncomment the following line to have make the selection static IP
# SELECT=ip-static

# uncomment the following line to have make the selection of DHCP
SELECT=dhcp


/etc/network/ipv4:
IP=192.168.1.150
PREFIX=24
BROADCAST=192.168.1.255
GATEWAY=192.168.1.1


(转载请注明出处)
发表于 2006-7-31 10:06:38 | 显示全部楼层
基本系统都安装了哪些内容,全部都静态编译那也太...........
送你一个分析动态链接库文件的脚本:
[PHP]#!/bin/sh
if [ -z "$1" ]; then
    echo "Usage: searchldd [PATH]"
    exit
fi
for I in `find "$1" -name "*" -type f`; do
    ldd "$I" | tee -a temp.txt
done
cat temp.txt | sort | uniq > fina.list
rm -rf temp.txt
[/PHP]
保存为searchldd文件,并给可执行权限,最后生成的fina.list就是所有需要的动态库文件
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-8-2 10:58:18 | 显示全部楼层
基本系统大概是:busybox+udev+bash+dhcpcd+grub
虽然是全部静态编译,但是编译出来的东西大小还可以接受。

bash: 1022K(似乎大了点)
busybox: 1.4M
dhcpcd: 503K
udev: 3.4M
grub: 116K
回复 支持 反对

使用道具 举报

发表于 2006-8-2 21:28:24 | 显示全部楼层
记得去掉那个 linux-gate.so 噢:)。。嘿嘿

谢谢分享,支持原创。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-8-3 11:28:06 | 显示全部楼层
呵呵,知道。

linux-gate.so这个东西每个都有,就是哪里都找不到。另外找出来的东西还有很多重复的,毕竟地址不同。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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