|
| 作 者 | 主题:freebsd下利用jail+PF做的虚拟机(穷人如何打造自己的服务器文章的补全) |
xiao2![]() =入木三分= 职务:版主 积分:1076 贴数:568 |
-------------------------------------------------------------------------------------------- 1,基本系统的安装 -------------------------------------------------------------------------------------------- freebsd5.3 mini安装 完成以后,安装src和ports 重新启动 需要安装的软件 为了节省时间我使用pkg_add 命令安装了一下软件 ccache-2.4_1, cvsup-without-gui-16.1h, perl-5.8.5, pftop-0.4_1, portaudit-0.5.9, portupgrade-20040701_3 strace-4.5.1 有一点要注意,我用pkg_add安装ccache-2.4.1时发现会去缺少一个libc.so.4这个文件,所以后来我用ports安装的。 cvsup src port src ports在开始的时候已经从光盘安装了,这里更新到最新的源码和软件包 # cp /usr/share/examples/cvsup/ports-supfile /root/cvsup/ # cp /usr/share/examples/cvsup/standard-supfile /root/cvsup/ # chmod 755 /root/cvsup/ports-supfile # chmod 755 /root/cvsup/standard-supfile 修改ports-supfile,stable-supfile文件中的服务器地址,可以用比较快的地址替换,完成后 # cvsup /root/cvsup/ports-supfile # cvsup /root/cvsup/standard-supfile -------------------------------------------------------------------------------------------- 2,对系统进行简单优化并重新make world -------------------------------------------------------------------------------------------- cvsup到新的源码和port后安装ccache CCACHE是为程序编译提供缓存,通过减少重复代码编译次数,加快编译时间的软件。 不过它对于一次性的编译没有什么帮助作用。cache是为多次重复编译加快速度的。 #cd /usr/ports/devel/ccache/ #make install clean #cd /usr/ #mkdir ccache #cd /usr/sbin #ln -s /usr/local/bin/ccache gcc #ln -s /usr/local/bin/ccache cc #ln -s /usr/local/bin/ccache c++ #ln -s /usr/local/bin/ccache g++ #ln -s /usr/local/bin/ccache cpp #echo "setenv CCACHE_DIR /usr/ccache" >> /root/.cshrc #rehash #exit 完成后,复制一份内核配制文件,不要把内核文件放到/usr/src下 可以考虑将内核配置文件放到别的地方, 然后在 i386 目录中建立一个符号连接指向它。 # cd /usr/src/sys/i386/conf # mkdir /root/kernels # cp GENERIC /root/kernels/MYKERNEL # ln -s /root/kernels/MYKERNEL 定制内核的配制文件,也就是刚才拷贝到/root/kernels/的MYkernel文件 精简内核并且加入pf选项 options NULLFS device pf device pflog device pfsync options ALTQ options ALTQ_CBQ 检查make.conf 5.3的/etc/make.conf可以参考下面的配制: NO_ACPI= true NO_BOOT= true NO_BIND= true NO_BLUETOOTH= true NO_FORTRAN= true NO_I4B= true NO_IPFILTER= true NO_PF= true NO_AUTHPF= true NO_KERBEROS= true NO_LPR= true NO_MODULES= true NO_SHAREDOCS= true NO_USB= true NOATM= true NOGAMES= true NOINET6= true NOLIBC_R= true NOPROFILE= true CXXFLAGS+= -fmemoize-lookups -fsave-memoized //如果编译失败,请去掉此行 SUP_UPDATE= yes SUP= /usr/local/bin/cvsup SUPFLAGS= -g -L 2 SUPHOST= cvsup2.freebsdchina.org SUPFILE= /root/cvsup/standard-supfile PORTSSUPFILE= /root/cvsup/ports-supfile DOCSUPFILE= /usr/share/examples/cvsup/doc-supfile MASTER_SITE_BACKUP?= \ ftp://ftp2.tsinghua.edu.cn/mirror/FreeBSD/ports/distfiles/${DIST_SUBDIR}/ \ ftp://ftp.freebsd.org.cn/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/ \ ftp://ftp.freebsdchina.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/ MASTER_SITE_OVERRIDE?= ${MASTER_SITE_BACKUP} 这时就可以makeworld了 make world时使用-j4选项,会同时启动4个进程来make world 进入/usr/src make -j4 buildworld 给 make 指定 -j 选项了,这样会使用产生出几个并发的进程来。 这在多处理器机器里最有用。但是, 由于大部分的编译过程是 IO 限制远胜 CPU 限制,它在单处理器的机器里也是有用的。 这时候make 会有至多 4 个进程在同一时刻执行。贴到邮件列表里的实验证据显示这样会收到最好的效果 如果您有一台多 CPU 机器,那您就使用 SMP 配置内核,试试 6 到 10 之间的值,看这些值提速如何。 同时使用4个进程,加上ccache的加速,make world的速度会有所提高 至于提高多少,还要看本身的机器性能了 makeworld是一个漫长的过程,我在p3 800的笔记本里运行vmware用了4个多小时 完成以后就可以编译和安装新内核 # cd /usr/src # make installworld # make buildkernel KERNCONF=MYkernel # make installkernel KERNCONF=MYkernel 重新启动 ==================== 到目前为止,一个全新的系统就完成了 接着我们对系统进行简单的设置: 修改/etc/rc.conf 加入: background_dhclient="YES" sendmail_enable="NONE" sendmail_submit_enable="NO" sendmail_outbound_enable="NO" sendmail_msp_queue_enable="NO" clear_tmp_enable="YES" tcp_extensions="YES" pf_enable="YES" //启用pf防火墙 pflog_enable="YES" ifconfig_lnc0="inet 10.0.64.253 netmask 255.255.248.0" //外网地址 ifconfig_lnc1="inet 172.16.0.1 netmask 255.255.255.0" //内网地址 ifconfig_lnc1_alias0="inet 172.16.0.2 netmask 255.255.255.255" //虚拟主机地址 ifconfig_lnc1_alias1="inet 172.16.0.3 netmask 255.255.255.255" //虚拟主机地址 在/boot/loader.conf中加入: autoboot_delay="2" //把默认的启动时间设置为2秒,原10秒 net.inet.tcp.tcbhashsize="2048" // 增大TCP控制块数量 beastie_disable="YES" // 关闭小恶魔图像启动菜单 console="comconsole" //如果需要把开机信息也在串口终端显示的话,否则注释掉此行 修改/etc/ttys文件 #ee /etc/ttys ttyd0 "/usr/libexec/getty std.9600" vt100 on secure 这样设置后就可以通过com1口进入服务器了 shell环境设定 /root/.cshrc加入: alias ls ls -FGw //ls彩色 setenv EDITOR ee // 默认编辑器为ee setenv PAGER less if ($?prompt) then中加入: set nobeep set prompt = ‘%n@%/%# ‘ set filec set autolist 打开 NAT 的 IP Forwarding #ee /etc/sysctl.conf net.inet.ip.forwarding=1 设定pf的规则 #ee /etc/pf.conf # Macros 定义网络接口 ext_if="lnc0" #外部 int_if="lnc1" #内部 vhost1="172.16.0.2" #定义内部服务器vhost1的地址 vhost2="172.16.0.3" #定义内部服务器vhost2的地址 如果还有虚拟机的同样的道理 # ALTQ 定义带宽的进出 # Outgoing bandwidth limit altq on $ext_if cbq bandwidth 512Kb queue { std_out } queue std_out bandwidth 256Kb cbq (default) # Incoming bandwidth limit altq on $int_if cbq bandwidth 2Mb queue { std_in } queue std_in bandwidth 768Kb cbq (default borrow) # NAT 启动nat nat on $ext_if from $int_if:network to any -> ($ext_if) #地址转换 rdr on $ext_if proto tcp from any to 10.0.64.253 port 221 -> $vhost1 port 22 #端口映射 rdr on $ext_if proto tcp from any to 10.0.64.253 port 222 -> $vhost2 port 22 #端口映射 # Filter Rules 规则设置 pass in all pass out all # Bandwidth Control pass out on $ext_if proto tcp from any to any queue std_out pass in on $int_if proto tcp from any to any queue std_in #这里防火墙得规则只是做了简单得设置,pf功能非常强大,,带宽控制我就没有列出来,如果想详细得设置规则,可以参考pf得文档 http://www.patching.net/bbs/viewdoc.asp?id=41412&bordid=4 pf的使用: # pfctl -f /etc/pf.conf 载入pf.conf配置文件 # pfctl -nf /etc/pf.conf 解析pf.conf文件, 但不载入。 # pfctl -Nf /etc/pf.conf 只从文件中载入NAT规则链。 # pfctl -Rf /etc/pf.conf 只从文件中载入过滤规则链。 # pfctl -sn 显示当前的NAT规则链 # pfctl -sr 显示当前的过滤规则链 # pfctl -ss 显示当前的状态 # pfctl -si 显示过滤状态和计数 # pfctl -sa 显示所有能显示的东西 另外,我们在前面还安装了个pftop这个软件,可以查看pf防火墙的状态 -------------------------------------------------------------------------------------------- 3,建立jail虚拟机 -------------------------------------------------------------------------------------------- 安装虚拟机上运行的网络服务程序 建立一个虚拟机 需要先为vhost准备一个目录: # mkdir -p /home/jail/ 因为先前我们已经make world过了,所以现在建立虚拟机就比较简单了 这里我给出一个脚本来自动建立虚拟机 #!/bin/sh echo ‘Enter vhost vhost name:‘ read path if [ "$path" = "" ]; then echo ‘Must input host name!‘ exit fi dir=/home/jail //定义所有虚拟机的根路径 cd /usr/src mkdir -p $dir/$path make installworld DESTDIR=$dir/$path cd etc make distribution DESTDIR=$dir/$path -DNO_MAKEDEV_RUN #cd $dir/$path/dev #sh MAKEDEV jail cd $dir/$path ln -sf dev/null kernel mount_devfs devfs $dir/$path/dev mkdir $dir/$path/usr/ports mount_nullfs /usr/ports $dir/$path/usr/ports mkdir $dir/$path/stand cp /stand/sysinstall $dir/$path/stand/ cp /etc/resolv.conf $dir/$path/etc touch $dir/$path/etc/fstab cp /etc/make.conf $dir/$path/etc/ 把它存为jail.sh,并且 #chmod 777 jail.sh 然后直接./jail.sh就可以了 它会询问要建立的虚拟机的名字 例如,我们输入vhost1 接着它会自动安装系统 准备vhost使用的地址 在前面,我们已经在 /etc/rc.conf中加入了: ifconfig_lnc1_alias0="inet 172.16.0.2 netmask 255.255.255.255" ifconfig_lnc1_alias1="inet 172.16.0.3 netmask 255.255.255.255" 进入vhost1: jail /home/jail/vhost1 vhost1.xiao2.org 172.16.0.2 /bin/sh 配置vhost1 进入vhost1的后,执行sysinstall工具: /stand/sysinstall Console中将Repeat设置为fast 更改root的密码 User Management中加入系统中的用户(记得要加一个wheel能su成root的用户哟) Time Zone中设置正确的时区 Networking中设置inetd为no、Mail为None、并选中sshd(inetd和sshd为必须) Startup中关了quotas 配置完成后输入: exit 退出 启动vhost1 jail /home/jail/vhost1 vhost1.xiao2.org 172.16.0.2 /bin/sh /etc/rc 执行后会看到一些启动信息,然后就返回了shell 这时就可以使用ssh连接到虚拟机起了 至此,一个完成的新的虚拟服务器就装好了 #ee /etc/ttys 修改ttyd0这行为: ttyd0 "/usr/libexec/getty std.9600" vt100 on secure 这样就可以通过com1口进入服务器了 如果需要把开机信息也显示出来的话,可以修改/boot/loader.conf 文件,加入 console="comconsole" 删除虚拟机的方法: 先转到你虚拟机的根目录 然后执行 chflags -R noschg * 这样就可以删除你的虚拟机了 至此,虚拟机就装好了,我们可以让虚拟机在系统开机时执行 在主系统的 /usr/local/etc/rc.d下建立一个文件vhost.sh,内容如下: mount_devfs devfs /home/jail/vhost1/dev mount_nullfs /usr/ports /home/jail/vhost1/usr/ports jail /home/jail/vhost1 vhost1.xiao2.org 172.16.0.2 /bin/sh /etc/rc mount_devfs devfs /home/jail/vhost2/dev mount_nullfs /usr/ports /home/jail/vhost2/usr/ports jail /home/jail/vhost2 vhost1.xiao2.org 172.16.0.3 /bin/sh /etc/rc 退出后更改可执行权限 chmod 777 vhost.sh 然后重新启动 这时我们ssh 主机的221端口,实际上连接到了vhost1的ssh端口上了 222端口就是vhost2的ssh 你可以在虚拟机里使用ports来安装软件 如果虚拟机在使用过程中提示缺少什么文件可以从主操作系统里复制 ------------------------------------------------------------------------ 附DB9口的接线图 CN1(DB9s) CN2(DB9s) pin 1 -------- pin 4 pin 2 -------- pin 3 pin 3 -------- pin 2 pin 4 -------- pin 6 pin 5 -------- pin 5 pin 6 -------- pin 4 pin 7 -------- pin 8 pin 8 -------- pin 9 将 pin1 与 pin6 短路 注:DB9s = DB9母头、DB9p = DB9公头 针脚名称 [、code] 说明: Pin1....DCD Pin2....RxD Pin3....TxD Pin4....DTR Pin5....SG Pin6....DSR Pin7....RTS Pin8....CTS Pin9.....RI |
|
阿刚 =八面玲珑= 积分:2674 贴数:288 |
好文,鼓励原创,我加精了,呵呵 |
test_1![]() =一知半解= 积分:102 贴数:89 |
既然是穷人就要使用民用ADSL接入 http://www.3322.org动态DNS支持 /usr/local/etc/rc.d下生成一个ipnat.sh脚本 这个脚本的作用是获取ADSL的IP,及生成ipnat所需要的配置文件(/etc/ipnat.rules) 但ASDL断线以后,IP就变化了 使用/etc/ppp/ppp.linkup 内容如下 adsl: iface clear !bg /usr/local/bin/ez-ipupdate -i tun0 -h XXXX.3322.org -S qdns -u username:password !bg /usr/local/etc/rc.d/ipnat.sh 这样就解决了,全自动 ps:把ipnat.sh放/usr/local/etc/rc.d显的有点多于,但为了一个清晰的文件存放结构.对实际使用无影响 /usr/local/etc/rc.d/ipnat.sh #!/bin/sh sleep 3 ADSLIP=`ifconfig tun0 |grep inet | cut -d ‘ ‘ -f 2` echo ‘map tun0 192.168.1.0/24 -> ‘$ADSLIP‘/32 proxy port ftp ftp/tcp‘ > /etc/ipnat.rul es echo ‘map tun0 192.168.1.0/24 -> ‘$ADSLIP‘/32 portmap tcp/udp auto‘ >> /etc/ipnat.rule s echo ‘map rl0 192.168.1.0/24 -> ‘$ADSLIP‘/32‘ >> /etc/ipnat.rules echo ‘rdr tun0 ‘$ADSLIP‘/32 port 554 -> 192.168.1.55 port 554‘ >> /etc/ipnat.rules echo ‘rdr rl0 ‘$ADSLIP‘/32 port 554 -> 192.168.1.55 port 554‘ >> /etc/ipnat.rules echo ‘rdr tun0 ‘$ADSLIP‘/32 port 80 -> 192.168.1.55 port 80‘ >> /etc/ipnat.rules echo ‘rdr rl0 ‘$ADSLIP‘/32 port 80 -> 192.168.1.55 port 80‘ >> /etc/ipnat.rules echo ‘rdr tun0 ‘$ADSLIP‘/32 port 443 -> 192.168.1.55 port 443‘ >> /etc/ipnat.rules echo ‘rdr rl0 ‘$ADSLIP‘/32 port 443 -> 192.168.1.55 port 443‘ >> /etc/ipnat.rules echo ‘rdr tun0 ‘$ADSLIP‘/32 port 21 -> 192.168.1.55 port 21‘ >> /etc/ipnat.rules echo ‘rdr rl0 ‘$ADSLIP‘/32 port 21 -> 192.168.1.55 port 21‘ >> /etc/ipnat.rules /sbin/ipnat -CF /sbin/ipnat -f /etc/ipnat.rules 机器为单网卡 接入是 internet-------adsl---------交 换 机 | | | | freebsb网关 客户机 最后是使用顶级域名 去买一个60-100RMB 这里有sell 然后用URL影藏转发过来&_& jail环境,不需要提供root shell的话 最好里面没多余的东西 就需要一服务本身所需要的东西 库文件,配置文件。越少越好。但调试非常花时间 |
| 返回《UNIX软件技术精华》 快速返回 | |
|
| |
|
|
如果您想发帖,请先注册或登录!
| Copyright © 2006 Patching.net All rights reserved. |