开发机
操作系统版本:Slackware 11.0
索引:
- 分区
- 安装一个基础系统
- 安装帮助包
- 安装编辑器
- 安装文件比较工具
- 安装文件打开查看工具
- 安装网络工具包
- 安装库文件
- 安装开发工具包
- 安装字符界面浏览器
- 配置网络
- 防火墙配置
- 设置一些内核参数
- 安装checkinstall
- 安装splint
- 安装grub
- 制作新内核
- 安装zhcon
- 制作支持ipsec的内核
1.分区
- /dev/hda1, /boot, 100M
- /dev/hda2, swap, 256M
- /dev/hda3, /, 其他
2.安装一个基础系统
操作的一个理念是只安装需要的软件,力求做到“宁缺勿滥”,因为多余的软件包,只会占用更多的空间,增加更大的风险。
第一次安装的软件包全部在a目录下,采用expert模式安装。软件包列表如下:
- aaa_base-11.0.0-noarch-2
- aaa_elflibs-11.0.0-i486-9
- bash-3.1.017-i486-1
- bin-11.0-i486-3
- bzip2-1.0.3-i486-3
- coreutils-5.97-i486-1
- cxxlibs-6.0.3-i486-1
- dcron-2.3.3-i486-5
- devs-2.3.1-noarch-25
- e2fsprogs-1.38-i486-2
- etc-11.0-noarch-2
- findutils-4.2.28-i486-1
- gawk-3.1.5-i486-3
- gettext-0.15-i486-1
- glibc-solibs-2.3.6-i486-6
- glibc-zoneinfo-2.3.6-noarch-6
- grep-2.5-i486-3
- gzip-1.3.5-i486-1
- infozip-5.52-i486-1
- kernel-modules-2.4.33.3-i486-1
- less-394-i486-1
- lilo-22.7.1-i486-2
- logrotate-3.7.4-i486-1
- module-init-tools-3.2.2-i486-2
- pkgtools-11.0.0-i486-4
- procps-3.2.7-i486-1
- sed-4.1.5-i486-1
- shadow-4.0.3-i486-13
- slocate-3.1-i486-1
- sysklogd-1.4.1-i486-9
- sysvinit-2.84-i486-69
- tar-1.15.1-i486-2
- utempter-1.1.3-i486-1
- util-linux-2.12r-i486-5
使用lilo作为引导工具,安装在MBR中,安装在引导分区上会启动失败,原因不详。如果手头有grub的安装包,也可不用lilo,但方法要繁琐些,需要chroot,执行grub命令等。
有个偷懒的方法。由于以后所有系统都是从基础系统开始的,在硬件配置一致的情况下,可以备份此时的硬盘文件linux.vmdk,以后安装新的虚拟机时,可以用该文件覆盖新系统空白的硬盘文件,这样就可以直接建立一个基础系统,而不用再重复如上两步。
3.安装帮助包
基础系统可以启动并正常使用,但针对具体应用,缺少许多软件包。根据不同应用的需求,还需要安装相关的软件。
开发平台中,使用man、info等帮助是必须的。为此,安装如下软件包:
- ap/man-1.6c-i486-2
- ap/man-pages-2.39-noarch-1
- ap/groff-1.19.2-i486-1
- ap/texinfo-4.8-i486-1
4.安装编辑器
vi作为标准的全屏文本编辑器,是不可或缺的,这里使用的是vim。
- ap/vim-7.0.109-i486-1
5.安装文件比较工具
在开发过程中,尤其在使用了版本控制系统后,对文件不同内容的比较就是很常见的操作了。
- ap/diffutils-2.8.1-i486-3
6.安装文件打开查看工具
有时,我们需要知道一个文件当前是被谁打开的。尤其是在网络环境下,想知道一个套接口的打开者,则该工具就非常有用:
- ap/lsof-4.76-i486-1
7.安装网络工具包
一些用到的网络工具:
- n/mailx-12.1-i486-1
- n/tcpip-0.17-i486-39
- n/iptables-1.3.5-i486-2
- n/tcpdump-3.9.4-i486-2
- n/openssl-0.9.8d-i486-1
- n/openssh-4.4p1-i486-1
- n/gnupg-1.4.5-i486-1
注意,由于mailx依赖于ssl加密库,如果不安装openssl-0.9.8d-i486-1,则要安装a/openssl-solibs-0.9.8d-i486-1。
8.安装库文件
一些开发中涉及的基础库:
- l/glibc-2.3.6-i486-6
- l/glibc-i18n-2.3.6-noarch-6
- l/ncurses-5.5-i486-1
- l/zlib-1.2.3-i486-1
9.安装开发工具包
作为开发平台,这些工具就是你吃饭的家伙:
- d/autoconf-2.60-noarch-1
- d/automake-1.9.6-noarch-1
- d/m4-1.4.6-i486-1
- d/make-3.81-i486-1
- d/binutils-2.15.92.0.2-i486-3
- d/gcc-3.4.6-i486-1
- d/bison-2.1-i486-1
- d/flex-2.5.4a-i486-3
- d/cvs-1.11.22-i486-1
- d/gdb-6.5-i486-1
- d/libtool-1.5.22-i486-1
- d/perl-5.8.8-i486-3
- d/kernel-headers-2.4.33.3-i386-1
- d/gettext-tools-0.15-i486-1
当前只使用C和Perl两种语言。
10.安装字符界面浏览器
由于没有安装XWindow,无法使用图形界面,故安装字符界面的lynx,以便在一些场合,可以查看html文件。
- n/lynx-2.8.5rel.5-i486-2
11.配置网络
执行netconfig配置网络,也可手工编辑配置文件。注意的是虚拟机的网卡需要安装模块,当netconfig提示时,选择yes即可。
netconfig只能配置一个网卡,其余的需要编辑配置文件/etc/rc.d/rc.inet1.conf。
机器名:develop
域名:copyleft.net
IP地址:
- eth0:10.10.20.100/24
- eth1:10.10.40.100/24
- eth2:192.168.0.100/24
- eth3:172.16.0.100/24
使用ping和tcpdump命令测试网络配置的正确性。
12.防火墙配置
网络启动以后,机器都处于一个危险的环境中,进行一些安全方面的设置是非常必要的。
首先需要配置就是Linux自带的防火墙netfilter,通过iptables命令进行设置。
不同角色的机器需要不同设置的防火墙,为此提供一系列的iptables脚本模板,根据具体环境选择模板,再按实际情况进行更改使用。目前有这么些模板:
- rc.iptables-client.ref,客户机模板
- rc.iptables-gate.ref,网关模板(包含vpn)
- rc.iptables-gate-novpn.ref,网关模板(不含vpn)
- rc.iptables-server.ref,服务器模板
开发机相当于一台客户机,故使用rc.iptables-client.ref模板。模板说明如下(实际文件不含说明信息,放在/newpkg下):
#!/bin/sh # Start/stop/restart my iptables configuration for workstation. # start() { iptables -F # 缺省策略设置为禁止一切数据: iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP # 对于本地loopback接口,不做限制: iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # 虽然分片包有存在的理由,但在当今的网络现状下,已经很少了。分片出现更多 # 的是源于攻击,所以禁止分片包: iptables -A INPUT -f -j DROP # 作为客户机(桌面),我们可以访问任何地方,不应做限制。所以从本机发出的连 # 接都是允许的,相应的应答包也可进入本机: iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED \ -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED \ -j ACCEPT # 目前只提供ssh接入服务,相应的应答数据已经包含在上面的规则中,所以不需要 # 再添加一条OUTPUT规则: iptables -A INPUT -p tcp --dport ssh -m state --state NEW \ -j ACCEPT # 允许ping数据包,这纯粹是测试需要,实际应用中不应该存在: iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT # other } resume_all() { iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT } stop() { iptables -F } case "$1" in 'start') start ;; 'stop') stop resume_all ;; 'restart') stop start ;; *) echo "usage $0 start|stop|restart" esac
需要注意的是restart功能,一般实现都是先stop,然后start。如果stop功能取消了所有限制,那么在start启动之前,就会有一个时间空间,使机器在无防火墙监管之下,这是很危险的。为此,修改了stop的内容,额外提供一个resume_all()函数,以避免这种情况。
把模板脚本放到/etc/rc.d/目录下,改名为rc.iptables:
# cp /newpkg/rc.iptables-client.ref /etc/rc.d/rc.iptables
修改/etc/rc.d/rc.S文件,在末尾添加运行rc.iptables的内容。为此,也提供了一个模板rc.S.ref,把模板内容粘贴到rc.S的末尾即可。模板内容如下:
# If there is my iptables script, run it before network up. if [ -x /etc/rc.d/rc.iptables ]; then . /etc/rc.d/rc.iptables start fi
防火墙要在网络接口启动之前运行,否则就会留下时间空间,这就是脚本为什么放在rc.S中的原因,在rc.M中会启动网络接口。
13.设置一些内核参数
有几个内核参数需要设置一下,以避免潜在的网络攻击。同样也提供了一个模板rc.sysctl.ref:
#!/bin/sh # Start/stop/restart my some network kernel parameters. # start() { echo "enable tcp_syncookies" echo 1 > /proc/sys/net/ipv4/tcp_syncookies echo "disable accept_redirects" for i in /proc/sys/net/ipv4/conf/*/accept_redirects; do echo 0 > $i done echo "disable accept_source_route" for i in /proc/sys/net/ipv4/conf/*/accept_source_route; do echo 0 > $i done echo "enable rp_filter" for i in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $i done } stop() { echo "disable tcp_syncookies" echo 0 > /proc/sys/net/ipv4/tcp_syncookies echo "enable accept_redirects" for i in /proc/sys/net/ipv4/conf/*/accept_redirects; do echo 1 > $i done echo "enable accept_source_route" for i in /proc/sys/net/ipv4/conf/*/accept_source_route; do echo 1 > $i done echo "disable rp_filter" for i in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $i done } case "$1" in 'start') start ;; 'stop') stop ;; 'restart') stop start ;; *) echo "usage $0 start|stop|restart" esac
把模板文件复制到/etc/rc.d/目录下,改名为rc.sysctl:
# cp /newpkg/rc.sysctl.ref /etc/rc.d/rc.sysctl
编辑/etc/rc.d/rc.M,将脚本加入到rc.inet2的前面。网络接口启动以后有些参数设置才有效,所以不能象iptables那样在rc.S中进行,在网络接口启动后,网络服务启动(rc.inet2)前设置是一个不错的地方。有模板rc.M.ref可以参考:
# Initialize some networking parameters. if [ -x /etc/rc.d/rc.sysctl ]; then . /etc/rc.d/rc.sysctl start fi
另外有一个参数是关于IP转发的,Slackware提供了一个脚本/etc/rc.d/rc.ip_forward来打开这个功能。对于网关需要此功能,而客户机是不需要的,所以,确保rc.ip_forward没有执行权限。
14.安装checkinstall
checkinstall是一个很好的工具,可以方便的制作Slackware、Redhat等安装包。但该工具以前有些bug,在处理符号连接时不是那么可靠,导致一度被打入冷宫,改用Slackware自带的makepkg软件来制作。然而,makepkg也不是那么如意。令人高兴的是,新版本的checkinstall解决了存在的问题。现在决定再次启用checkinstall!
附带说明一下makepkg的使用:
在软件编译完成,进行make install安装之前,通过makepkg打包,如:
# make DESTDIR=/tmp/splint install # cd /tmp/splint # makepkg splint-3.1.1-i386-1.tgz # installpkg splint-3.1.1-i386-1.tgz
这里可能存在的问题是:DESTDIR不是所有的Makefile都认帐,遇到这样的Makefile时,就不会在临时目录下生成文件,而是直接安装了。除了DESTDIR,有的实现是prefix=/tmpdir、有的是INSTALL_PREFIX=/tmpdir等等,五花八门。比较头疼。
回到checkinstall。
从http://asic-linux.com.mx/~izto/checkinstall下载新版本的checkinstall-1.6.1.tgz。
所有的源代码包都统一放在/sources目录下,进行展开编译:
# cp checkinstall-1.6.1.tgz /sources # tar xzvf checkinstall-1.6.1.tgz # cd checkinstall-1.6.1 # make # make install # checkinstall
把生成的安装包checkinstall-1.6.1-i386-1.tgz放入/newpkg目录下。
以后编译源代码包时,当执行make install时都改成执行checkinstall,以制作安装包,之后再安装。以便也能在别的机器上安装,就不用每次都从源代码开始编译了,而且有些机器是不一定有开发工具的。
15.安装splint
在开发中,lint是一个很好的检查工具,但现在一般的linux发行版都没有集成该工具。有一个lint的替代品splint,源代码可以从http://www.splint.org下载。
# cp splint-3.1.1.src.tgz /sources # tar xzvf splint-3.1.1.src.tgz # cd splint-3.1.1 # ./configure --prefix=/usr # make # checkinstall
把安装包splint-3.1.1-i386-1.tgz放在/newpkg目录下。
安装:
# cd /newpkg # installpkg splint-3.1.1-i386-1.tgz
16.安装grub
作为引导程序,个人更喜欢grub,而且grub在编译测试新内核时比lilo更灵活一些。
从ftp://alpha.gnu.org/gnu/grub/中获得源代码包,我下载的版本是grub-0.96.tar.gz。
# cp grub-0.96.tar.gz /sources # tar xzvf grub-0.96.tar.gz # cd grub-0.96 # ./configure --prefix=/usr # make # make check # checkinstall
把安装包grub-0.96-i386-1.tgz放在/newpkg目录下。
安装:
# cd /newpkg # installpkg grub-0.96-i386-1.tgz
引导配置(这里安装到主引导记录MBR,以覆盖原来lilo的设置):
# grub-install /dev/hda
编辑生成/boot/grub/menu.lst文件,当然每次都从头写没有必要,事先编写一个模板文件menu.lst.ref,以后通过复制改写就行了。
menu.lst.ref的内容如下:
# grub.conf generated by anaconda # # Note that you do not have to rerun grub after making # changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/sda3 # initrd /initrd-version.img # # Normal VGA console # vga = normal # VESA framebuffer console @ 1024x768x64k # vga=791 # VESA framebuffer console @ 1024x768x32k # vga=790 # VESA framebuffer console @ 1024x768x256 # vga=773 # VESA framebuffer console @ 800x600x64k # vga=788 # VESA framebuffer console @ 800x600x32k # vga=787 # VESA framebuffer console @ 800x600x256 # vga=771 # VESA framebuffer console @ 640x480x64k # vga=785 # VESA framebuffer console @ 640x480x32k # vga=784 # VESA framebuffer console @ 640x480x256 # vga=769 # #boot=/dev/sda default=0 timeout=10 password --md5 $1$eYBMM0$YQM0aAWX836RhrPWEoYId. title Slackware Linux (2.4.22) root (hd0,1) kernel /vmlinuz ro root=/dev/sda3 vga=771 title Dos rootnoverify (hd0,0) chainloader +1
本机的menu.lst内容如下:
# grub.conf generated by anaconda # # Note that you do not have to rerun grub after making # changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/sda3 # initrd /initrd-version.img # # Normal VGA console # vga = normal # VESA framebuffer console @ 1024x768x64k # vga=791 # VESA framebuffer console @ 1024x768x32k # vga=790 # VESA framebuffer console @ 1024x768x256 # vga=773 # VESA framebuffer console @ 800x600x64k # vga=788 # VESA framebuffer console @ 800x600x32k # vga=787 # VESA framebuffer console @ 800x600x256 # vga=771 # VESA framebuffer console @ 640x480x64k # vga=785 # VESA framebuffer console @ 640x480x32k # vga=784 # VESA framebuffer console @ 640x480x256 # vga=769 # #boot=/dev/sda default=0 timeout=10 #password --md5 $1$eYBMM0$YQM0aAWX836RhrPWEoYId. title Slackware Linux (2.4.33.3) root (hd0,0) kernel /vmlinuz ro root=/dev/hda3 vga=771
重启机器,确认能够正常引导。
现在就可以卸载lilo了:
# removepkg lilo
上面使用的grub-install是一个shell,如果对grub命令比较熟悉,也可手工来完成引导设置。尤其在初次安装时不用lilo,通过chroot直接安装grub时,手工操作就非常有用。
对于本机的操作序列如下,具体含义可参阅grub文档:
# mkdir /boot/grub # cp /usr/lib/grub/i386-pc/stage1 /boot/grub # cp /usr/lib/grub/i386-pc/stage2 /boot/grub # cp /usr/lib/grub/i386-pc/e2fs_stage1_5 /boot/grub # grub >>root (hd0,0) >>setup (hd0) >>quit #
17.制作新内核
在测试过程中,编译内核是经常要进行的工作,比如增加vpn功能等。
首先构建一个当前最新版的内核(2.4.34.2),以满足功能需要最小化的原则进行配置,如只支持普通的IDE接口的硬盘和CDROM;只使用字符界面,不支持图形;网卡只支持pcnet32(虚拟网卡);包含全部netfilter支持等。
这样构建的内核只能够满足当前的测试需要。如果在实际应用中,还是应该构建一个功能完备的内核,以满足不同应用,不同硬件的需要,很多功能可以通过modules实现,不需要编译在内核中,除了耗费一点磁盘空间,对其他性能的影响基本可以忽略。
下面是具体步骤:
(1)下载内核
从http://www.kernel.org获得最新的2.4内核,这里是linux-2.4.34.2.tar.bz2,放入/usr/src目录下。
在/usr/src目录下解开(可以建立一个符号连接):
# cd /usr/src # tar xjvf /sources/linux-2.4.34.2.tar.bz2 # ln -s linux-2.4.34.2 linux
(2)编译准备:
# cd /usr/src/linux-2.4.34.2 # make mrproper
(3)内核配置:
# make menuconfig
配置结果保存在config-thin-2.4.34.2中,供以后参考使用。
详细配置内容:
Code maturity level options ---> [*] Prompt for development and/or incomplete code/drivers
- 说明:该部分本来是不用的,因为这里只需要保守的功能。增加目的纯粹是为了后面的Frame buffer,这样可以设置终端的分辨率(如menu.lst中所示),此外还有IPV6的支持。实际应用可以不选。
Loadable module support ---> [*] Enable loadable module support [*] Set version information on all module symbols [*] Kernel module loader
- 全部选中。
Processor type and features ---> (Pentium-III/Celeron(Coppermine)) Processor family [*] Machine Check Exception/dev/cpu/*/cpuid - CPU information support (off) High Memory Support
- CPU类型选择与本机匹配,只做了如上显示的设置。由于没有多于1G的内存,所以没有设置高位内存支持,实际应用中却是可能的,一般可以设为4G,超过4G设为64G。
General setup ---> [*] Networking support [*] PCI support (Any) PCI access mode [*] PCI device name database [*] Support for hot-pluggable devices [*] System V IPC [*] BSD Process Accounting [*] Sysctl support (ELF) Kernel core (/proc/kcore) format <*> Kernel support for a.out binaries [*] Kernel support for ELF binaries <*> Kernel support for MISC binaries [*] Power Management supportAdvanced Power Management BIOS support
- 设置如上内容,增加APM纯粹了为了方便关机,在实际服务器中,这是不需要的。
Memory Technology Devices (MTD) --->
- 不需要。
Parallel port support --->
- 不需要。
Plug and Play configuration ---> <*> Plug and Play support <*> ISA Plug and Play support
- 缺省设置,其实测试环境里是用不到的。
Block devices --->
- 不需要,因为虚拟机没有软驱等设备。实际应用中是可能用到的。
Multi-device support (RAID and LVM) --->
- 不需要,测试环境里没有用到RAID和逻辑卷,实际应用看情况而定。
Networking options ---> <*> Packet socket [*] Packet socket: mmapped IO [*] Network packet filtering (replaces ipchains) [*] Network packet filtering debugging [*] Socket Filtering <*> Unix domain sockets [*] TCP/IP networking [*] IP: multicasting [*] IP: advanced router [*] IP: policy routing [*] IP: use netfilter MARK value as routing key [*] IP: fast network address translation [*] IP: equal cost multipath [*] IP: use TOS value as routing key [*] IP: verbose route monitoring [*] IP: kernel level autoconfiguration [*] IP: DHCP support [*] IP: BOOTP support [*] IP: RARP support <*> IP: tunneling <*> IP: GRE tunnels over IP [*] IP: broadcast GRE over IP [*] IP: multicast routing [*] IP: PIM-SM version 1 support [*] IP: PIM-SM version 2 support [*] IP: ARP daemon support (EXPERIMENTAL) [*] IP: TCP Explicit Congestion Notification support [*] IP: TCP syncookie support (disabled per default)
- 网络部分是重点,拥有的功能基本都选择了(个别例外)。
IP: Netfilter Configuration ---> <*> Connection tracking (required for masq/NAT) <*> FTP protocol support <*> Amanda protocol support <*> TFTP protocol support <*> IRC protocol support <*> Userspace queueing via NETLINK (EXPERIMENTAL) <*> IP tables support (required for filtering/masq/NAT) <*> limit match support <*> MAC address match support <*> Packet type match support <*> netfilter MARK match support <*> Multiple port match support <*> TOS match support <*> recent match support <*> ECN match support <*> DSCP match support <*> AH/ESP match support <*> LENGTH match support <*> TTL match support <*> tcpmss match support <*> Helper match support <*> Connection state match support <*> Connection tracking match support <*> Unclean match support (EXPERIMENTAL) <*> Owner match support (EXPERIMENTAL) <*> Packet filtering <*> REJECT target support <*> MIRROR target support (EXPERIMENTAL) <*> Full NAT <*> MASQUERADE target support <*> REDIRECT target support <*> Basic SNMP-ALG support (EXPERIMENTAL) <*> Packet mangling <*> TOS target support <*> ECN target support <*> DSCP target support <*> MARK target support <*> LOG target support <*> ULOG target support <*> TCPMSS target support <*> ARP tables support <*> ARP packet filtering <*> ARP payload mangling
- 防火墙netfilter是重中之重,所有功能都选中,并构建在内核里,这样就不需要为事先装入模块费神了。
IP: Virtual Server Configuration --->
- 不需要。
<*> The IPv6 protocol (EXPERIMENTAL)
- 支持IPV6。
IPv6: Netfilter Configuration ---> <*> Userspace queueing via NETLINK (EXPERIMENTAL) <*> IP6 tables support (required for filtering/masq/NAT) <*> limit match support <*> MAC address match support <*> Routing header match support (EXPERIMENTAL) <*> Hop-by-Hop and Dst opts header match (EXPERIMENTAL) <*> Fragmentation header match support (EXPERIMENTAL) <*> HL match support <*> Multiple port match support <*> Owner match support (EXPERIMENTAL) <*> netfilter MARK match support <*> Owner match support (EXPERIMENTAL) <*> netfilter MARK match support <*> IPv6 Extension Headers Match (EXPERIMENTAL) <*> AH/ESP match support (EXPERIMENTAL) <*> Packet Length match support <*> EUI64 address check (EXPERIMENTAL) <*> Packet filtering <*> LOG target support <*> Packet mangling <*> MARK target support
- 同样,IPV6版的netfilter也全部选中。
Telephony Support --->
- 不需要。
ATA/IDE/MFM/RLL support ---> <*> ATA/IDE/MFM/RLL support IDE, ATA and ATAPI Block devices ---> <*> Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support <*> Include IDE/ATA-2 DISK support [*] Use multi-mode by default <*> Include IDE/ATAPI CDROM support
- 只支持最基本的IDE设备。
SCSI support --->
- 没有用到。
Fusion MPT device support --->
- 没有用到。
IEEE 1394 (FireWire) support (EXPERIMENTAL) --->
- 没有用到。
I2O device support --->
- 没有用到。
Network device support ---> [*] Network device support <M> Dummy net driver support Ethernet (10 or 100Mbit) ---> [*] Ethernet (10 or 100Mbit) [*] EISA, VLB, PCI and on board controllers <M> AMD PCnet32 PCI support
- 只选择用到的网卡模块pcnet32。
PPP (point-to-point protocol) support [*] PPP multilink support (EXPERIMENTAL) [*] PPP filtering <*> PPP support for async serial ports <*> PPP support for sync tty ports <*> PPP Deflate compression <*> PPP BSD-Compress compression <*> PPP over Ethernet (EXPERIMENTAL)
- 增加PPP协议的支持。
Amateur Radio support --->
- 没有用到。
IrDA (infrared) support --->
- 没有用到。
ISDN subsystem --->
- 没有用到。
Input core support --->
- 没有用到。
Character devices ---> [*] Virtual terminal [*] Support for console on virtual terminal <*> Standard/generic (8250/16550 and compatible UARTs) serial support [*] Support for console on serial port [*] Unix98 PTY support (256) Maximum number of Unix98 PTYs in use (0-2048)
- 选择基本的终端设置。
Multimedia devices --->
- 没有用到。
File systems ---> <*> Kernel automounter version 4 support (also supports v3) <*> Ext3 journalling file system support [*] JBD (ext3) debugging support [*] Virtual memory file system support (former shm fs) <*> ISO 9660 CDROM file system support [*] Microsoft Joliet CDROM extensions [*] Transparent decompression extension [*] /proc file system support [*] /dev/pts file system for Unix98 PTYs <*> Second extended fs support
- 只选择了用到的文件系统。
Network File Systems ---> <*> NFS file system support <*> NFS server support <*> SMB file system support (to mount Windows shares etc.) [*] Use a default NLS,Default Remote NLS Option: "cp437" [*] Enable Unix Extensions
- 网络文件系统选择NFS和SMB。
Native Language Support ---> (列表略)
- 全部内容选中,以模块形式<M>构建。
Console drivers ---> [*] VGA text console [*] Video mode selection support Frame-buffer support ---> [*] Support for frame buffer devices (EXPERIMENTAL) [*] VESA VGA graphics console
- 支持多彩的字符界面,这里只选择了VESA模式,因为内核引导用到,参见grub和lilo配置文件。
Sound --->
- 没有用到。
USB support --->
- 没有用到。
Bluetooth support --->
- 没有用到。
Kernel hacking --->
- 没有用到。
Cryptographic options --->
- 没有用到。
Library routines ---> <*> CRC32 functions
- 缺省设置。
(4)编译安装:
# make dep # make bzImage # make modules # make modules_install # cp System.map /boot/System.map-2.4.32 # cd arch/i386/boot # cp bzImage /boot/vmlinuz-2.4.32 # cd /boot # rm -rf System.map # ln -s System.map-2.4.32 System.map
(5)引导设置:
编辑/boot/grub/menu.lst,为新内核增加条目:
title Slackware Linux (2.4.34.2) root (hd0,0) kernel /vmlinuz-2.4.34.2 ro root=/dev/hda3 vga=771
重启系统,使用新内核运行。
如果新内核稳定,并且以后不会再使用老内核的话,可以修改/etc/rc.d/rc.modules,把其中装入模块的几行注释掉,因为这些模块在新内核中已经不存在了。留着也没有影响,只是会有一些出错提示信息。
如果想shutdown直接关机,则装入APM模块。编辑/etc/rc.d/rc.modules,把包含APM行的注释符号去掉:
/sbin/modprobe apm
生成的新内核及其相关文件放在/newpkg/kernel/2.4.34.2-thin/目录下,供别的机器安装使用:
- vmlinuz-2.4.34.2
- System.map-2.4.34.2
- modules-2.4.34.2.tar.bz2
- config-thin-2.4.34.2
其中modules-2.4.34.2.tar.bz2是/lib/modules/2.4.34.2目录内容的包。
18.安装zhcon
在中文环境下,有时不得已会遇到处理中文的情况。有关linux中文化的文章很多,多数都涉及X,配置相对复杂。而我们的应用环境基本都是在字符方式下使用的,几乎不会用到图形界面,对中文的要求也不是非常频繁。所以,以一个很小的代价在命令行模式下获得中文支持,是很理想的。zhcon正好满足了这方面的需求。
zhcon是控制台下使用的外挂式中文工具,类似于我上学时期使用的UCDOS,时隔多年,再次使用这样的工具,很有亲切感。
我获得的是0.2.3版本的zhcon,该版本有点老了,在Slackware 11.0下编译不过,所以这里直接安装了以前在Slackware 10.2下编译好的包。
# installpkg zhcon-0.2.3-i386-1.tgz
下面的内容是当初制作安装包的过程,注意系统是Slackware 10.2!
编译zhcon需要C++编译器,为此,需要安装C++工具:
- d/gcc-g++-3.3.6-i486-1
从http://zhcon.sourceforge.net下载稳定的0.2.3版本的zhcon。
# cp zhcon-0.2.3.tar.gz /sources # tar xzvf zhcon-0.2.3.tar.gz # cd zhcon-0.2.3
0.2.3版本的历史有点长了,在编译时会出错。为此,需要手工修改两个文件:src/inputclient.h、src/mouse.cpp。都增加对assert.h的包含:
#include <assert.h>
开始编译:
# ./configure --prefix=/usr # make # checkinstall
把安装包zhcon-0.2.3-i386-1.tgz放在/newpkg目录下。
注意:zhcon的运行需要root权限。
19.制作支持ipsec的内核
使用openswan搭建vpn环境。有两种方式,一种是编译模板,另一种是通过对内核patch构建在内核上。这里选择第二种方式。
(1).下载openswan
从www.openswan.org下载所需的源代码包和相关补丁:
- openswan-2.4.7.tar.gz
- openswan-2.4.7.kernel-2.4-klips.patch.gz
- openswan-2.4.7.kernel-2.4-natt.patch.gz
- openswan-2.4.7.kernel-2.6-klips.patch.gz
- openswan-2.4.7.kernel-2.6-natt.patch.gz
(2).安装gmp
编译openswan要用到gmp,所以需要事先安装这个包:
- l/gmp-4.2.1-i486-1
(3).patch内核
内核仍旧使用前面的2.4.34.2版本。如果需要nat-t支持,同样要打补丁。这里一并都打上,不想多次make内核了:
cd /sources gunzip openswan-2.4.7.kernel-2.4-klips.patch.gz gunzip openswan-2.4.7.kernel-2.4-natt.patch.gz cd /usr/src/linux-2.4.34.2 patch -p1 < /sources/openswan-2.4.7.kernel-2.4-klips.patch patch -p1 < /sources/openswan-2.4.7.kernel-2.4-natt.patch
(4).编译内核
config文件在原来的基础上制作,所以使用oldconfig方式,在有关klips和natt的提问中选择yes即可。
cd /usr/src/linux-2.4.34.2 make mrproper cp /newpkg/kernel/2.4.34.2-thin/config-thin-2.4.34.2 .config make oldconfig make dep make bzImage
这个版本的openswan有点问题,编译过程中会出错:
pfkey_v2.c:122: error: unknown field "owner" \ specified in initializer pfkey_v2.c:122: warning: initialization makes ... ... pfkey_v2.c:132: error: unknown field "owner" \ specified in initializer
经过查询openswan上的mailist,得知,可以修改/usr/src/linux-2.4.34.2/net/ipsec/pfkey_v2.c,把122和132行注释掉就可以了。
修改好后,接着编译:
make bzImage make modules
(5).备份内核文件
首先,注意不要覆盖掉原来的内核模块。
cd /lib/modules mv 2.4.34.2 2.4.34.2-thin cd /usr/src/linux-2.4.34.2 make modules_install cd /lib/modules tar cvf modules-klips-2.4.34.2.tar 2.4.34.2 mv 2.4.34.2 2.4.34.2-thin-klips mv 2.4.34.2-thin 2.4.34.2 bzip2 modules-klips-2.4.34.2.tar
把内核文件放到/newpkg/kernel/2.4.34.2-thin-klips/目录下:
- vmlinuz-klips-2.4.34.2
- System.map-klips-2.4.34.2
- modules-klips-2.4.34.2.tar.bz2
- config-thin-klips-2.4.34.2
(6).编译用户层工具
cd /sources/openswan-2.4.7 make KERNELSRC=/usr/src/linux-2.4.34.2 programs checkinstall make KERNELSRC=/usr/src/linux-2.4.34.2 install
生成的软件包openswan-2.4.7-i386-1.tgz会在/etc目录下生成rc1.d、rc2.d等目录,这在Slackware中是没有的,所以需要校正它。在临时目录下,解开这个包,删除所有的rc?.d目录,并修改doinst.sh,去掉对rc?.d的操作。之后再tar成新包。
由于该包的特殊性,所以和内核放在一起,也在/newpkg/kernel/2.4.34.2-thin-klips/目录下。
开发机上只是编译,具体使用在home-gate和away-gate上。