发新话题
打印

[分享] 彻底解决JunOS安装后过大的问题!优化后junos vmdk约250M

彻底解决JunOS安装后过大的问题!优化后junos vmdk约250M

目前vmware下的junos虽然很稳定,组播也搞定了,但是由于不支持vlan-tagging,以致做个大点的试验,起个7台虚拟机,硬盘空间
就占的太大了(因为我的是从8.3升级到8.5的,搞完了就1.6G的vmdk了),但实际上用df -hl查看vmdk实际上也就用了300M不到的
空间,有没有好的方法可以搞定呢?

经过周末的探索想到如下几种方法:
1.直接安装freebsd6.1+JunOS8.5,但是如果不注意/var 的分区必须在ad0s1f的话,很容易安装失败;(安装后约900M,还是看起
来不爽,值得优化)
2.利用JunOS自带的备份功能,用已经装好的junos8.5带一块空的vmdk盘启动,并用request system snapshot partition命令进行备份
,但是做完了发现一个问题,启动时找不到ad1这块盘,因为junos默认只有一块硬盘且备份后硬盘的启动分区表指定到了ad1,但是
备份后我们的磁盘是直接挂到主盘位置,我们需要的是从ad0启动,而不是备份时的ad1了,尝试磁盘挂到ide0的slave位,VM无法启动
不了;在单用户模式下虽然能手动挂接,但是太不方便;经过分析后发现junos在备份时篡改了/etc/fstab文件,导致默认从ad1启动
,用vi改回去;启动是没有问题,但是死活停留在了单用户模式,一看log说找不到swap分区,在/dev/下看的确就没有ad0s1b这个分
区,晕死,重新做request system snapshot partition发现JunOS压根就没有分swap区,本来想用指定一块slice的方法来做,但
是做完了junos就600M了,效果不理想;
3.突然想到前段时间给sun设备换硬盘并做磁盘镜像的经历了,于是经过琢磨和试验后顺利搞定,方法如下:(经过试验镜像后JunOS
总共250M左右,如果备份前删掉jbundle就才150M了,实际上仅需要备份root区和/var区,var有最重要的preinstall_boot_loader.conf)

1.用qemu-img create  -f vmdk junos.vmdk 3G创建一块新的盘
2.挂接freebsd启动,利用freebsd对相应的vmdk盘进行分区(当然可以直接在JunOS单用户模式下来做,但是考虑到方便性,   还是
推荐用freebsd分区):
2.1.首先用configure中的fdisk,按A使用整块磁盘,按W存盘,并退出重启;
2.2.重启后继续用configure中的label,利用C创建如下分区:
      ad0s1a   /                  1024M
      ad0s1b   swap            512M
      ad0s1d   /tmp            512M
      ad0s1e   /config         32M
      ad0s1f    /var             利用剩余的空间约970M
3.利用已经安装junos8.5的vmdk设为主盘,将刚刚格式化的新的vmdk作为从盘,启动
   在10秒倒计时的时候按下空格(space)键,在ok模式输入boot -s  
   然后在#后输入
   fsck -p
   mount -u /
   mount -a
   swapon -a  
   adjkerntz -i
4.建立新硬盘分区的挂载点(mount point)
   mkdir /backup
   mkdir /backup/root
   mkdir /backup/var
5.挂接新的磁盘并用dump命令进行磁盘镜像:
   mount /dev/ad1s1a /backup/root
   mount /dev/ad1s1e /backup/var
   ( dump -0f - / ) | ( cd /backup/root ; restore -rf - )
   ( dump -0f - /var ) | ( cd /backup/var ; restore -rf - )
   umount /backup/root
   umount /backup/var
   tunefs -n enable /dev/ad1s1a  
   tunefs -n enable /dev/ad1s1e
   tunefs -n enable /dev/ad1s1f
   tunefs -n enable /dev/ad1s1d
   sync;sync;sync;sync;sync;sync;
6.重新使用新的vmdk启动,你会发现250M左右的junos便能顺利运行了,哈哈哈哈
  这下大家就不用再担心用VMware时起10台junos光vmdk就会占掉20G了,你可以用U盘装着到处跑了

题外话:推荐有条件的还是买个pc来做olive,稳定!而且现在运气好的话还能掏到ATM的pci网卡,加上驱动olive下也可以认,拿个
尾纤环一下就是当年JNCIE lab的东东了,但是现在像我这种天天外面晃的人,还是期待着高人编个虚拟的
atm网卡或者希望哪位大牛把vm的网卡部分重新编译一下支持vlan,这样olive就真的爽了,期待中。。。。

TOP

不错,我开始一直想着需要用vmtools裁剪大小。

TOP

昨天又试验了一下,用安装好的JUNOS8.5带一块空的vmdk启动,直接敲request system snapshot partition,但是这种方法junos只默认复制root和/config区的内容,还需要手动挂接ad1s1f区,并拷贝/var/tmp/preinstall_boot_loader.conf到ad1s1f的对应位置,并利用旧JunOS8.5中/etc/fstab覆盖到ad1s1a区对应位置的fstab文件;然后umount分区,并halt虚拟机,重新用新的vmdk启动就好了,方法是比第三种简单,但问题在于由于缺乏swap分区,导致你分配了多少内存给qemu就会全部当作swap分区用了,你想我的本本才2G内存,一共能起几台?推荐喜欢动手的朋友还是用方法3;

不过我一直在想JUNOS为什么不分Swap区呢?
想想如果在真实设备上如果利用swap分区的话,一来硬盘读写速度不可能有内存快,更没有ECC校验之类的功能,二来如果让一个硬盘的分区马不停蹄的读写2年估计也离挂掉不远了,(毕竟硬盘是不可能达到电信级产品,又不是闪存卡)请大家试想一下如果硬盘挂掉的时候,RIB信息还有部分在硬盘上,会是怎样个情形;而真实设备大部分会在启动之后加载kernel到内存后,脱离硬盘而独立运行,而硬盘只是作为log或其他与核心进程无关操作的载体,而且由于硬盘问题导致整机挂死在别的厂商是有血的教训的,所以我想这也许就是request system snapshot partition时偏偏不分SWAP区的原因吧:)仅供猜想;

TOP

感谢楼主分享经验 同时希望逻辑路由可以解决哈

TOP

首先感谢hellospark提供的瘦身方法!在junos8.5(直接安装的)上试了试,虽然没有达到hellospark的优化后的尺寸,但效果非常不错。去掉jbuddle后,含jweb共270M左右。

试验过程中有几个小问题,供其他人参考
引用:
原帖由 hellospark 于 2008-2-4 17:11 发表
3.利用已经安装junos8.5的vmdk设为主盘,将刚刚格式化的新的vmdk作为从盘,启动
   在10秒倒计时的时候按下空格(space)键,在ok模式输入boot -s  
同打multicast补丁一样,一开始怎么也进不去单用户模式,后来才明白过来,即使改了loader.conf也没用,输出信息被重定向到com口了,所以需要一个软件named pipe tcp proxy(该软件可以从vmware.cn下载),这样启动时信息就可以都看到了,进单用户模式也就没问题了。
引用:
原帖由 hellospark 于 2008-2-4 17:11 发表
4.建立新硬盘分区的挂载点(mount point)
   mkdir /backup
   mkdir /backup/root
   mkdir /backup/var
如果系统之间做过一些设置,最好/config一起备份,否则需要重新配置。
增加mkdir /backup/config
引用:
原帖由 hellospark 于 2008-2-4 17:11 发表
5.挂接新的磁盘并用dump命令进行磁盘镜像:
   mount /dev/ad1s1a /backup/root
   mount /dev/ad1s1e /backup/var
   ( dump -0f - / ) | ( cd /backup/root ; restore -rf - )
   ( dump -0f - /var ) | ( cd /backup/var ; restore -rf - )
   umount /backup/root
   umount /backup/var
其中mount /dev/ad1s1e /backup/var应该是有typo,应该是mount /dev/ad1s1f /backup/var
另外为了备份/config,还要增加以下部分
mount /dev/ad1s1e /backup/config
( dump -0f - /config ) | ( cd /backup/config ; restore -rf - )
umount /backup/config

[ 本帖最后由 skyocean 于 2008-2-16 15:00 编辑 ]
本帖最近评分记录
  • 小漏 人品 +10 精品文章 2008-2-16 16:09
  • 小漏 白银 +10 精品文章 2008-2-16 16:09

TOP

其实还有另外一个简单的办法,那就是再装一个BSD,把olive中的所以文件压缩,然后copy到新的BSD中解压就可以了。在4.4版本中就有人这样瘦身过的,我也尝试过,但是由于不太熟悉BSD的压缩和解压的使用,没有弄好。楼主比较熟悉系统,可以这样试一下!!!!

TOP

用Linux Live CD比较方便
复制内容到剪贴板
代码:

#fdisk /dev/hda
复制内容到剪贴板
代码:

Command (m for help): p

Device Boot      Start         End      Blocks   Id  System
/dev/hda1               1       15502     7812976+  83  Linux
/dev/hda2           15503       31004     7813008   83  Linux
/dev/hda3           31005       31063       29736   83  Linux
/dev/hda4           31064       77545    23426928    5  Extended
/dev/hda5           31064       32056      500440+  83  Linux
/dev/hda6           32057       55308    11718976+  83  Linux
/dev/hda7           55309       77545    11207416+  83  Linux
设置分区属性:
复制内容到剪贴板
代码:

Command (m for help): t
Partition number (1-7): 1
在fdisk 命令下,有一个b选项,相当于FreeBSD的disklabel命令.
进入FreeBSD区域,进行分区:
复制内容到剪贴板
代码:

Command (m for help): b
Reading disklabel of /dev/hda1  at sector 64.
/dev/hda1  contains no disklabel.
Do you want to create a disklabel? (y/n) y
# /dev/hda1 :
type: ST506
disk:
label:
flags:
bytes/sector: 512
sectors/track: 63
tracks/cylinder: 16
sectors/cylinder: 1008
cylinders: 77545
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0           # milliseconds
track-to-track seek: 0  # milliseconds
drivedata: 0
4 partitions:
#       start       end      size     fstype   [fsize bsize   cpg]
  c:        1*    15502     15501*    unused        0     0
  d:        1     77545     77545     unused        0     0
复制内容到剪贴板
代码:

BSD disklabel command (m for help): n
Partition (a-p): a
First cylinder (1-15502, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-15502, default 15502): +100M

BSD disklabel command (m for help): p

4 partitions:
#       start       end      size     fstype   [fsize bsize   cpg]
  a:        1       195       195     unused        0     0
  c:        1*    15502     15501*    unused        0     0
  d:        1     77545     77545     unused        0     0

BSD disklabel command (m for help): t
Partition (a-d): a
Hex code (type L to list codes): L

0  unused           5  4.1BSD           9  4.4LFS           d  boot
1  swap             6  Eighth Edition   a  unknown          e  ADOS
2  Version 6        7  4.2BSD           b  HPFS             f  HFS
3  Version 7        8  MS-DOS           c  ISO-9660        10  AdvFS
4  System V
Hex code (type L to list codes): 7

BSD disklabel command (m for help): p

4 partitions:
#       start       end      size     fstype   [fsize bsize   cpg]
  a:        1       195       195     4.2BSD        0     0     0
  c:        1*    15502     15501*    unused        0     0
  d:        1     77545     77545     unused        0     0

TOP

并且。。。用snapshot方法做出来,JunOS8.5R1.13才 129MB。。。。。。。。。


貌似7.2版本的不支持对ad做snapshot???

[ 本帖最后由 flickxie 于 2008-2-20 10:10 编辑 ]

TOP

发新话题