Saturday, March 29, 2014

对juniper(junos)模拟器的个人理解

文档介绍:

作者:张蒙 
电子邮箱:
[email protected]

MSN:
[email protected]

QQ  :407-960-134 
博客地址:http://zmouc.cublog.cn 
建立日期:2008年10月28日 
版本: 1.0 
版权说明:本文基于创作共用约定,内容归作者版权所有,欢迎大家转载,但要请保留作者的完整信息和出处,谢谢!

有朋友写了一篇对cisco模拟器的理解(见附录),说的非常详细,也很透彻、明白。下面,我谈谈对juniper(junos)模拟器的个人理解。不当之处请指正。
对于cisco、juniper的交换机、路由器、防火墙而言,它们是一个完整的硬件及软件结合的平台。这个平台具有强大的功能,如juniper路由器的快速转发功能。但是,它们的价格都非常昂贵,于是出于某种需求:节约成本、学习技术等,我们利用一些手段模拟实现一台物理的路由器或者防火墙。一般的计算机平台都是如下架构:

Application
Operating System
Hardware

最底层是硬件,中间一层是操作系统,最上层是应用软件。
其中硬件部分可以是真实存在的一套硬件:包括CPU、主板、硬盘、内存、电源、网卡。可以是厂家生产的路由器硬件,也可以是自己组装的硬件。这个最底层的硬件也可以是软件模拟出来的。如著名的VMware,qemu,Jqemu(修改版的qemu,提供对i82559er网卡支持),还有微软的Virtual PC。这些模拟软件通过一些手段模拟出来了一套CPU、主板、硬盘、内存、电源、网卡,类似于真实的物理设备。各种各样的操作系统就是运行在这个硬件平台上面的。
下面,再分析一个概念:Olive。什么是Olive呢?说白了,就是一台运行junos的PC或者虚拟机。也就是说,一台Olive就是一个juniper路由器。只不过因为它的junos运行在PC或虚拟机上,所以我们称呼它为Olive。除了一些功能上的差异(如olive效率肯定不如真实的路由器高效),你可以认为Olive就是一台Juniper路由器。
再次利用上面的计算机平台模型,我们来比较一下cisco模拟器、Olive(也就是junos模拟器),windows XP,cisco call manager的差异:

cisco模拟器:
路由协议等应用
Cisco IOS
硬件平台


Olive(也就是junos模拟器)
Junos
FreeBSD
硬件平台


windows XP
Office,pplive…
Windows XP
硬件平台


cisco call manager
cisco call manager
Linux
硬件平台

大家看见了吧,cisco的IOS其实就是一个操作系统,它的地位和unix,linux,windows XP,FreeBSD是平等的。路由协议、ACL过滤,DHCP等相当于应用软件,运行在IOS这个操作系统上面。
那么对于Junos呢?它其实是一个应用软件,而绝非一个操作系统。通过上面的Olive模型,我们可以清晰地看到,junos运行在FreeBSD这个操作系统上面。Junos的地位和windows XP下面的office、pplive等应用软件的地位是一样的。
这一点通过junos的安装过程也可以看出来,我们都是先在硬件平台上安装FreeBSD这个类unix操作系统,然后才开始安装junos这个应用软件。但是呢,这个软件又比较特殊,它在安装的过程中会对原来的操作系统FreeBSD进行一些大幅度的修改(甚至重新格式化分区),并设置自己为开机自动运行,但是junos始终是运行在freebsd的核心之上,所以我们在打开Olive后直接进入到junos运行界面。当然我们也可以切换回FreeBSD进行操作(在junos的操作模式下输入start shell命令)。




下面我们来分析一下junos安装过程中的启动信息:
Hit [Enter] to boot immediately, or space bar for command prompt.
Booting [/boot/installer]...               
ACPI autoload failed - no such file or directory
Olive CPU    #junos安装程序检测到我们的硬件平台不是juniper路由器,而是PC,所以提示为Olive,看见了吧,Olive的称呼就是从这里来的。
GDB: debug ports: sio
GDB: current port: sio
KDB: debugger backends: ddb gdb
KDB: current backend: ddb
Copyright (c) 1996-2007, Juniper Networks, Inc.
All rights reserved.
Copyright (c) 1992-2006 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
        The Regents of the University of California. All rights reserved.
##以上为freebad的系统信息
JUNOS 8.5R1.14 #0: 2007-12-08 07:29:51 UTC  #开始安装junos
    [email protected]:/volume/build/junos/8.5/release/8.5R1.14/obj-i386/sys/compile/MFS
Timecounter "i8254" frequency 1193182 Hz quality 0
CPU: AMD Athlon(tm) 64 X2 Dual Core Processor TK-57 (1379.41-MHz 686-class CPU)
  Origin = "AuthenticAMD"  Id = 0x60f82  Stepping = 2  #检测CPU
  Features=0x78bfbff
  Features2=0x2001
  AMD Features=0xea500800
  AMD Features2=0x109,>
real memory  = 536870912 (512 MB)
avail memory = 512311296 (488 MB)   #检测内存
cpu0 on motherboard
pcib0:  pcibus 0 on motherboard
pir0:  on motherboard
pci0:  on pcib0
pcib1:  at device 1.0 on pci0
pci1:  on pcib1
isab0:  at device 7.0 on pci0
isa0:  on isab0
atapci0:  port 0x1f0-0x1f7,0x3f6,0x170-0x177,0x376,0x1060-0x106f at device 7.1 on pci0
ata0:  on atapci0
ata1:  on atapci0
smb0:  port 0x1040-0x104f at device 7.3 on pci0
smb0: controller initialization failed
pci cmd reg = 0x0001, SMB host conf = 0x00
pci0:  at device 15.0 (no driver attached)
pci0:  at device 16.0 (no driver attached)
pcib2:  mem 0xe8801000-0xe8801fff at device 17.0 on pci0
pci2:  on pcib2
pci2:  at device 0.0 (no driver attached)
pci2:  at device 3.0 (no driver attached)
orm0:  at iomem 0xc0000-0xc7fff,0xc8000-0xc8fff,0xdc000-0xdffff,0xe4000-0xe7fff on isa0
fdc0:  at port 0x3f0-0x3f5,0x3f7 irq 6 drq 2 on isa0
fdc0: [FAST]
fd0:  on fdc0 drive 0
atkbdc0:  at port 0x60,0x64 on isa0
atkbd0:  irq 1 on atkbdc0
atkbd0: [GIANT-LOCKED]
psm0:  irq 12 on atkbdc0
psm0: [GIANT-LOCKED]
psm0: model IntelliMouse, device ID 3
vga0:  at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0
sc0:  at flags 0x100 on isa0
sc0: VGA 
sio0 at port 0x3f8-0x3ff irq 4 flags 0x90 on isa0
sio0: type 16550A, console
sio1 at port 0x2f8-0x2ff irq 3 on isa0
sio1: type 16550A
sio2: configured irq 5 not in bitmap of probed irqs 0
sio2: port may not be enabled
sio3: configured irq 9 not in bitmap of probed irqs 0
sio3: port may not be enabled
Timecounter "TSC" frequency 1379406246 Hz quality 800
Timecounters tick every 1.000 msec
md0: Preloaded image  4980736 bytes at 0xc098b1c4
ad0: 8192MB  at ata0-master UDMA33
Trying to mount root from cd9660:/dev/md0
Disabling watchdog
#以上为检测CPU、内存、硬盘等硬件信息
=================== Bootstrap installer starting ===================
#开始正式安装Junos
Initialized the environment #初始化安装环境
Routing engine model is Olive #检测路由引擎为Olive(juniper路由器分为路由引擎和转发引擎两大部分,对于真实的juniper路由器,junos是运行在路由引擎上面的,所以我们这里的Olive说白了只模拟了juniper路由器的路由引擎,所以检测不到Forwarding engine)。
Discovered that flash disk =  , hard disk = ad0 #检测硬盘为ad0
Disk to install is ad0 
mfs: available=861136
Using 420Mb for /tmp
Setting ospackage=jboot-8.5R1.14.tgz, configpackage=configs-8.5R1.14.tgz
Setting packlist=jbundle-8.5R1.14-domestic.tgz
Packages and configurations copied to /tmp   
Filesystem 1K-blocks   Used  Avail Capacity iused ifree %iused  Mounted on
/dev/md1      430454 152458 273692    36%       6   248    2%   /tmp
Cleaning up ad0...
bsdlabel: /dev/ad0: no valid label found
WARNING: Unable to read disklabel of ad0. Hence need to partition it
Partitioning ad0...
bsdlabel: /dev/ad0: no valid label found
Could not read disk label from ad0, creating new label.
******* Working on device /dev/ad0 *******
Could not read disklabel for ad0
Installing disk label on ad0
Running newfs on ad0s1a...
/dev/ad0s1a: 220.5MB (451584 sectors) block size 16384, fragment size 2048
        using 4 cylinder groups of 55.14MB, 3529 blks, 7168 inodes.
super-block backups (for fsck -b #) at:
32, 112960, 225888, 338816
Running newfs on ad0s1e...
/dev/ad0s1e: 24.5MB (50176 sectors) block size 16384, fragment size 2048
        using 4 cylinder groups of 6.14MB, 393 blks, 896 inodes.
super-block backups (for fsck -b #) at:
32, 12608, 25184, 37760
Running newfs on ad0s1f...
/dev/ad0s1f: 6922.7MB (14177608 sectors) block size 16384, fragment size 2048
        using 38 cylinder groups of 183.69MB, 11756 blks, 23552 inodes.
super-block backups (for fsck -b #) at:
32, 376224, 752416, 1128608, 1504800, 1880992, 2257184, 2633376, 3009568,
3385760, 3761952, 4138144, 4514336, 4890528, 5266720, 5642912, 6019104,
6395296, 6771488, 7147680, 7523872, 7900064, 8276256, 8652448, 9028640,
9404832, 9781024, 10157216, 10533408, 10909600, 11285792, 11661984, 12038176,
12414368, 12790560, 13166752, 13542944, 13919136
上面的一部分信息为junos对硬盘ad0重新格式化分区,但是将freebsd核心和我们的安装文件jinstall-8.5R1.14-domestic-signed.tgz都拷贝到特定分区。以后还是要靠这个freebad操作系统内核做最底层的软件支撑。
Installing JUNOS on ad0...     #重新格式化分区后,开始安装junos组件
Adding jbase...
Mounted jbase on /mnt/packages/mnt/jbase (/dev/md2)
Adding jbundle-8.5R1.14-domestic.tgz...
Checking package integrity...
Verified SHA1 checksum of jbase-8.5R1.14.tgz
Verified SHA1 checksum of jboot-8.5R1.14.tgz
Verified SHA1 checksum of jcrypto-8.5R1.14.tgz
Verified SHA1 checksum of jdocs-8.5R1.14.tgz
Verified SHA1 checksum of jkernel-8.5R1.14.tgz
Verified SHA1 checksum of jpfe-8.5R1.14.tgz
Verified SHA1 checksum of jroute-8.5R1.14.tgz
Verified SHA1 checksum of pkgtools.tgz
Running requirements check first for jbundle-8.5R1.14-domestic...
Running pre-install for jbundle-8.5R1.14-domestic...
Installing jbundle-8.5R1.14-domestic in /var/tmp/pa1685.34/jbundle-8.5R1.14-domestic.x1685...
Running post-install for jbundle-8.5R1.14-domestic...
Adding jkernel...
Adding jcrypto...
Adding jpfe...
WARNING: hw.product.model='unknown' using jpfe-M40
Adding jdocs...
Adding jroute...
Restoring backed up configurations...
Unmounted /mnt/packages/mnt/jbase
machdep.bootsuccess: 0 -> 0
-> Waiting (max 60 seconds) for system process `vnlru' to stop...done
Waiting (max 60 seconds) for system process `bufdaemon' to stop...done
Waiting (max 60 seconds) for system process `syncer' to stop...
Syncing disks, vnodes remaining...0 0 done
#到这里,junos就全部安装完成了。

花了一天的时间整理了一下,以上是个人对Olive的一点理解,欢迎朋友们一起交流。
张蒙
2008-10-28


【附录:抛砖引玉:谈自己对模拟器的理解,以求对Juniper模拟实现的介绍】
(附录链接: 
http://wandering.blog.51cto.com/467932/106419
)
我刚刚接触Olive,还没有自己搭建过Juniper模拟环境,原来只做过 dynamips 模拟的 Cisco 路由器环境。
看了NetEmu论坛内和其它网上的一些文章,收获不少,增加了对 Olive 安装使用方面的认识。
不过,在阅读这些文章的过程中,有些问题却一直没有得到解决,反而越来越成为我心中的最大疑问。
下面,我就要把这个疑问和自己的理解阐述一下,请朋友们确认有哪些问题,并帮忙修正、指教,希望通过这个过程,可以使诸如我等新手朋友能更好地理解和学习相关技术。    
问题:Olive到底是什么?各类文章中介绍的JunOS、Qemu、JQemu等等是什么概念,以及它们之间的关系?
我的理解:
先说搭建 Juniper 模拟环境的原理和框架吧,其实任何一种模拟环境实现的基本原理都是相似的。
+--------------------+
|    Application     |
+--------------------+
|  Operating System  |
+--------------------+
|     Hardware       |
+--------------------+
Hardware: 这一层可以有2种实现方法,一种是用真实的物理设备,如PC;第二种方法是用模拟软件,如Qemu、VMWare、Dynamips等,都是模拟硬件平台的软件。它们实现了在真实主机中虚拟出其它的主机环境,这些虚拟主机从功能上非常接近真实主机。
Operating System: 运行在虚拟主机上的操作系统,如FreeBSD、Linux、Windows、Cisco IOS、JunOS等,都属于此类。
Application: 运行的虚拟系统平台上的应用软件,如Apache、MySQL、IIS、ISA等。这里要强调的是,我认为Cisco IOS和JunOS是Operating System和Application的集成,从用户的角度看是不可分割的,因此这类厂商的软件属于上面框架的2+3层结合。
OK,以上是我对模拟环境的基础原理的理解。
由于对 Dynamips 比较熟悉,因此我再谈谈对它的理解,希望能有朋友用同样的方式介绍一下 Olive (Juniper)。
Dynamips是专为模拟Cisco路由器硬件平台设计的软件,换句话说只有满足了这个要求Cisco IOS才能够正确地被安装并运行。
有些朋友一直奇怪、要求模拟交换机,从模拟器的实现原理看,这个是不太可能的。为什么?因为路由器和Juniper、F5、其它防火墙产品很相似,都是主机性质产品,也就是说主要功能是可以由CPU完成的。而交换机的功能实现主要是基于硬件(专用芯片,非进程处理),因此,除非能模拟出交换机的硬件环境,否则仅靠模拟一个基础的系统运行平台,装载IOS/COS,是不可能真正实现交换功能的。
因此,dynamips是模拟了一些接口模块,让IOS以为并识别这些模块,而接口基本上就是个纯物理层设备,对于路由器来说,主要还是要靠CPU处理各类工作,所以才能够实现模拟。
最后,再简单地介绍一下 Dynamips 的周边概念.
dynamips      Cisco Router 模拟器,模拟Cisco Router硬件环境,通过加载有限的IOS来模拟不同的路由器。
dynagen       dynamips 的字符界面前端,即通过dynagen可以更高效地使用dynamips管理模拟器,其配置文件的扩展名为net。
DynamipsGUI   国人开发的一款dynamips的图形界面前端,其基理是通过图形选配生成dos批命令,再通过批命令运行模拟器。
GNS3          外国人开发的一款dynamips的图形界面前端,道理相似,功能多一些。不过DynamipsGUI更符合一些国人的思维习惯。
VMWare        著名的虚拟主机平台软件,商业软件,基理是模拟主机的硬件环境,之后就可以在其上安装各类操作系统。把它当作软件PC用就行了。
VirtualBox    同VMWare是同类产品,免费软件,Sun在维护,我一直在使用它。
Qemu          同VMWare是同类产品,免费软件,目前还发展在命令行阶段。
好了,我知道的就这么多了,希望对 Juniper 模拟比较了解的朋友介绍一下自己的体会。

No comments: