|
|
制作<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
(转载请注明出处) |
|