洛阳铲的日志

2011年05月10日

virtualenv和distribute

Filed under: 生活小札 — 洛阳铲 @ 14:50

在使用virtualenv之前,我是使用PEAK的virtual-python来构造python虚拟环境、在虚拟环境中使用PEAK的setuptools
安装python扩展(仅仅是安装,不是管理,它没有卸载、查询等等操作,这和常常使用的CPAN以及gem相比差太远)。
virtualenv是virtual-python的增强版,同时作为workingenv的替换者,它构造的不仅是一个虚拟的python环境,
更多的是一个完整的独立的环境。和使用符号链接的virtual-python相比,virtualenv可以在不支持符号链接的windows平台使用。

这类python虚拟环境工具可以给我们提供一个干净稳定的、被隔离的、安全的应用环境。

一来可以解决依赖冲突问题,比如某个应用依赖python2.5,同时使用pysqlite-1.0.1,这样才能很好的运行,但是另外一个应用却需要使用
python2.6,同时使用pysqlite-2.4.1。这属于麻烦的跷跷板问题:这头按下去,那头冒起来。使用virtualenv可以给
每个应用创建一个单独的干净稳定、安全的环境。

同时还可以解决,诸如在虚拟主机,没有权限安装python扩展包到全局site-packages中去的问题。

使用virtualenv之前,先要安装好它,可以下载 tarball来安装,或者使用easy_install virtualenv来安装。安装后就可以使用:

[gavin_kou@shadow ~/downloads/virtualenv-1.1]$ /usr/bin/python2.5 virtualenv.py –distribute ~/local/python2.5

这样就在~/local/python2.5下面创建了一个独立的python2.5环境了,要使用这个环境,可以使用~/local/python2.5/bin/python来调用python。

[gavin_kou@shadow ~]$ ~/local/python2.5/bin/python -V
Python 2.5.2

安装virtualenv的同时,还会自动安装setuptools或者distribute到新的环境,如果要使用distribute,需要像签名那样使用–distribute选项。
在新的virtualenv中,还支持一个新的包管理工具:pip 

Web部署之FastCGI

Filed under: 生活小札 — 洛阳铲 @ 07:32

FastCGI介绍

FastCGI是一个快速、开发、安全的web服务接口,可以解决CGI带来的性能问题,
而不用改动从web appweb服务器API的任何代码。支持FastCGI的模块可以
以插件的方式支持众多的Web服务器:ApacheAPINSAPI以及ISAPIFastCGI设计
关键点包含:

  • 降低CGI程序(比如一些perl脚本写成的程序)迁移成本
  • 支持单线程或者多线程的程序
  • 支持分布式部署、以提供可伸缩性以及高可靠性
  • CGI”响应角色前面的gateway角色更加通用化

因为CGI的限制,如果使用WebServerAPI的话,将出现这样一些问题:

  • 复杂度提高:WebServerAPI的复杂度,导致API开发的难度曲线陡然增高
  • 语言依赖
  • 进程干扰,应用进程位于服务器进程空间,无法相互隔离
  • 架构限制:限制在指定的系统架构之上

FastCGI是一个新实现的CGI、设计目的是为了解决CGI的性能问题,主要的实现区别有:

  • FastCGI进程是持久的,在处理完请求之后,继续等待新的请求
  • 较之CGI的使用系统环境变量和管道,FastCGI协议支持多种环境信息:基于单个全双工连接之上
    的基本输入输出以及错误,这样让FastCGI进程和Web服务器之间透过TCP连接,运行在
    不同的服务器上成为可能。

FastCGI也是CGI,也像CGI那样运行在独立的进程空间,自然避免上面提到的WebAPI带来的问题。
同时和CGI一样,和Web服务器进行完全一模一样的CGI信息,唯独不一样的是交互的方式不同。

FastCGI协议的实现,主要有两个版本,一个是FastCGI协议的提出者“Open Market”,另外一个是潘庆峰2004
实现的fcgid(新的URL参考此处),后者回来被
Chris Darroch2009年正式纳入Apache基金会的二级项目之一

“Open Market”已经提供一个免费的FastCGI应用库,该库实现了FastCGI协议,为FastCGI应用程序
开发者隐藏了诸多的协议细节,这样编写FastCGI程序便和CGI程序一样简单了。

该库通过替换标准库中的标准I/O,比如printfgets等等调用。

Mod_fastcgi使用说明

mod_fastcgiapache的模块,用以支持FastCGI协议,FastCGI 模块定义了FastCGI应用的三种运行模式:
static
dynamicexternal。分别使用FastCGIServerFastCGIConfigFastCGIExternalServer指令配置。
任何被Apache当成是FastCGI请求的URL,默认是作为DynamicFastCGI应用来处理。FastCGI staticdynamic
应用进程是由FastCGI进程管理器FastCGI Process Manager(fcgi-pm)管理的。该管理器进程由apache
启动的时候初始化的。而external应用则不由该管理器管理,并且需要由系统管理员单独创建。

通过fastcgi_modapache中注册的fastcgi-script处理器,apache可以将指定的RUI识别为FastCGI请求。
可以使用
SetHandler fastcgi-script
来让apache讲所有的请求都识别为FastCGI请求,也可以使用:
AddHandler fastcgi-script fcg fcgi fpl
将扩展名为fcgfcgifpl的请求交给fastcgi_mod处理。

另外,dynamic FastCGI应用所在目录必须要设置ExecCGI选项。

mod_fastcgiCGI应用的日志记录在请求对应的日志中,一般是虚拟主机的错误日志和访问日志,
fastcgi进程管理器,fast-pm,则把日志记录在apache的主日志中。

UNIX平台中,fast-pm会向CGI应用发送SIGPIPESIGUSR1SIGTERM信号:

  1. 如果客户端取消一个请求,FastCGI也会取消到CGI应用的请求,同时向CGI应用发送SIGPIPE信号。
  2. Apache进行“graceful”关闭/重启时,Apache使用SIGUSR1来向apache进程组(由mod_fastcgi
    派生的cgi应用也包含在内)发送信号,一般来讲,CGI应用应该处理完当前请求,然后退出。
  3. 一旦fast-pm要退出时,会想cgi应用发送SIGTERM信号,然后退出。

如果希望设置一些请求级别的环境变量时,可以使用mod_envmod_setenvif(BrowserMatch,
BrowserMatchNoCase, SetEnvIf, SetEnvIfNoCase
等指令)乃至mod_rewrite模块(此模块有apache
瑞士军刀之号)。

最新的CC++Perl
FastCGI
库中包含有以上三种信号的默认处理器FastCGI指令参考:

  1. FastCgiServer
  2. FastCgiConfig
  3. FastCgiExternalServer
  4. FastCgiIpcDir
  5. FastCgiWrapper
  6. FastCgiAuthenticator
  7. FastCgiAuthenticatorAuthoritative
  8. FastCgiAuthorizer
  9. FastCgiAuthorizerAuthoritative
  10. FastCgiAccessChecker
  11. FastCgiAccessCheckerAuthoritative

FastCgiServer
语法:   FastCgiServer filename [option1, options2,…..]
上下文: 服务器配置,
虚拟主机配置

FastCgiServer设置指定的filenamedynamic FastCGI应用,如果文件名不以‘/’开头,则表示相对于ServerRoot
默认情况下,FastCGI进程管理器会使用如下的默认配置参数启动一个应用进程以等待请求,如果该应用进程退出
则会派生出新的FastCGI进程,同时记下该事件。

选项设置可以使用一下参数:

-appConnTimeout n( 0 secondes)
-group groupname|#gid
-idle-time n(30 sec)
-initial-env name[=[value]] (none)
-init-start-delay n (1 second)
-flush (none)   
-listen-queue-depth n (100)   
-min-server-life n (30)   
-nph   
-pass-header header (none)  
-port n (none)  
-priority n (0)  
-processes n (1)  
-restart-delay n (5 seconds)  
-socket filename (generated)
-user username|#uid (none)
   

FastCgiConfig
语法:  FastCgiConfig option [option …]
上下文:  server config

该指令设置所有的dynamic类型的FastCGI请求的默认参数。因为是dynamic,所以不会影响static
external应用。dynamic应用进程不会在apache启动的时候创建,而是根据需要动态创建,请求
多是多创建一些dynamic应用,请求少时,杀掉一下dynamic应用进程。

-appConnTimeout n (0 seconds)   Fast_CGI应用连接的超时时间
-autoUpdate (none)   
自动侦测Fast_CGI应用是否被更新,如果经常部署代码,可以设置是
-flush (none)    
强制使用非缓存模式向客户端发生响应
-gainValue n (0.5)
-idle-timeout n (30 seconds)
-initial-env name[=[value]] (none) 
派生Fast_CGI应用进程时,设置的环境变量
-init-start-delay n (1 second)   
创建Fast_CGI应用进程时,最少的时间间隔
-killInterval n (300 seconds)   
多少时间删掉Fast_CGI应用进程,这个数字越小,越接近于纯CGI模式。
-listen-queue-depth n (100)
-maxClassProcesses n (10)  
-maxProcesses n (50)  
-min-server-life n (30) 
-minProcesses n (5)
-multiThreshold n (50)
-pass-header header (none)   
-priority n (0)   
-processSlack n (5)   
-restart (none)  
-restart-delay n (5 seconds)  
-singleThreshold n (0)  
-startDelay n (3 seconds)  
-updateInterval n (300 seconds)
  

FastCgiExternalServer

FastCgiIpcDir
Syntax:  Unix:  FastCgiIpcDir directory
             Windows :  FastCgiIpcDir name
Default:  Unix/Apache:  FastCgiIpcDir logs/fastcgi
         Unix/Apache2:  FastCgiIpcDir RUNTIMEDIR/fastcgi
         Windows NT:  FastCgiIpcDir \\\\.\\pipe\\ModFastCgi\\
Context:  server config

UNIX:  FastCgiIpcDir指令设置了apache服务器和FastCGI应用程序间通讯的socket文件存放目录。
当然仅仅对于static或者dynamic才是所需的,目录名使用相对路径时,以ServerRoot为基准目录,
如果指定目录不存在,mod_fastcgi会尝试创建,如果指定为比如/tmp这样会定时清理文件的目录的
话,因为socket文件被删除,可能导致mod_fastcgi出错。

Windows NT:  ignore

FastCgiIpcDir指令需要在FastCgiServer或者FastCgiExternalServer指令之前设置,所设目录必须
owner
必须为apache,且为700

FastCgiWrapper
Syntax:  FastCgiWrapper On | Off | filename
Default:  FastCgiWrapper Off
Context:  server config

FastCgiWrapper指令用于支持suexec或者cgiwrap一类的cgi封装,一旦FastCgiWrapper启用,cgi应用的
权限、路径等等需要由封装器来处理。

FastCGI会使用:usernamegroupapplcation为参数调用CGI应用,如果dynamic时,CGI应用就是apache
解析出来的应用名,如果是external时,CGI应用就是参数是所设的外部CGI应用。

一旦启用FastCGI,静态或者外部CGI程序的位置相当重要。在apache21.3不再讨论)中,必须设置FastCgiServer
FastCgiExternalServer
–user–group选项,而FastCgiConfigdynamic则使用虚拟主机的用户名和组。

 
 

其余的FastCgi配置指令参考FastCgi官方文档,不做冗述。

此处以美国著名的IDC Dreamhost的一个配置为例,做个总结,他们的FastCGI配置如下:
FastCgiConfig -autoUpdate -initial-env RAILS_ENV=production -idle-timeout 60 -startDelay 10 -maxClassProcesses 2 -killInterval 300

-autoUpdate是说,自动侦测FastCGI应用的代码改动
-initial-env RAILS_ENV=production

这是为FastCGI应用设置一个环境变量: RAILS_ENV=production
这是为rails应用准备的,rails开发者知道,这是告诉rails,此处是生产环境。
-idle-timeout 60  60
秒空闲时间,超过60秒,没有新的请求进入的话,FastCGI便自动退出以释放资源。
-startDelay 10  
设置apache在正式连接FastCGI应用前等待10秒,换句话说给予FastCGI 10秒的初始化时间。
-maxClassProcesses 2
设置最多允许每个FastCGI应用运行2个实例。
-killInterval 300   
每个FastCGI执行300秒后,会被FastCGI进程管理器自动终止。

除了官方的mod_fastcgi之外,还有mod_fcgid,也是apache上部署FastCGI的选择。mod_fcgidapache提供了fcgid-script处理器
来处理FastCGI应用,完整的文档可以在这儿看到,其部署

多个选择的时候,总是少不了PK,在这儿,几月mod_fcgidmod_fastcgi的两个“hellow world”php程序的Benchmark
结果为: fcgid  204 reqs/sec,  fastcgi: 550.94 reqs/secfastcgifcgid整整多出一倍。

对应PHP的应用,因为mod_php的原因,大多数phpmod_php方式部署,在此处有一个benchmark,结果是mod_php
略微快过mod_fcgid

参考资料:

  1. A High-Performance Web Server Interface
  2. FastCGI process manager for Apache web server
  3. FastCGI: A High-Performance Gateway Interface
  4. FastCGI Specification
  5. Apache Module mod_fcgid Manual
  6. Apache with fcgid: acceptable performance and better resource utilization
  7. Apache2 – mod_fcgid vs mod_fastcgi

2011年05月9日

释放艾未未! 因为今天是艾未未,明天就会是你,是我!

Filed under: 生活小札 — 洛阳铲 @ 22:30

释放艾未未! 因为今天是艾未未,明天就会是你,是我!

在美国波士顿犹太大屠杀纪念碑上,一个叫马丁的德国新教神父留下了沉痛的忏悔之语:“
起初他们追杀共产主义者,我不是共产主义者,我不说话;接着他们追杀犹太人,我不是犹太人,我不说话;
后来他们追杀工会成员,我不是工会成员,我不说话;此后他们追杀天主教徒,我不是天主教徒,我不说话;
最后他们奔我而来,再也没有人站起来为我说话了。”德国民众面对纳粹暴行“不说话”终于付出了昂贵的代价!
今天,达豪集中营入口处刻着17世纪一位诗人的名言:“当一个政权开始烧书的时候,若不加阻止,它下一步就要烧人!”
“当一个政权开始禁言的时候,若不加阻止,它下一步就要灭口!”
其出口处又有一预言:“当世人忘掉这些事的时候,那就是说,这些事还会发生。”

 

 

 

snapmirror使用参考

Filed under: NetApp — 洛阳铲 @ 22:28

netapp的snapmirror可以提供基于卷或者qtree的数据镜像,在购买源和目标都支持snapmirror的license之后,
便可以使用。

snapmirror使用需要注意的是目的卷必须为受限(restricted)卷,而且目的卷的大小必须等于或者大于源卷;
目的qtree必须不存在(snapmirror自动创建目标qtree)。

对于异步镜像,接受数据的目的卷,定期请求镜像源以获取更新数据,请求的周期根据snapmirror.conf来设置

除了周期自动同步外,也可以用snapmirror update命令手动执行同步。在完成初始化同步之后,目的卷或者qtree
会进入snapmirrored状态,这时候便可以使用了,但是是只读的。

当然如果让客户可以写这些目的卷或者qtree,可以使用snapmirror break命令来中断和镜像源之间的关系,让镜像
目的卷或者qtree进入broken-off状态,这时候目的卷或者qtree便可以写了。

而snapmirror resync命令可以让之前进入broken-off的目的卷或者qtree恢复到snapmirrored状态,且重新进入
下一轮的数据镜像,如果给resync指定了之前的源,那么会将前面的镜像源设置为镜像目标,这样原来的源和目标
就颠倒了角色。

netapp 系统会追踪、记录每一个镜像目标(无论是直接镜像还是镜像的镜像),使用snapmirror destinations都
可以看到所有的镜像目标列表,而snapmirror release可以告诉netapp,某个直接镜像不在请求数据更新。
snapmirror destinations的输出结果可以作为snapmirror release的参数使用,比如在查看到镜像目标列表之后
希望停止其中一个镜像,可以使用该参数调用snapmirror release来达到目的,这两个命令都是在源filer上面执行的。

为了节省网络带宽,可以直接使用snapmirror store命令来dump镜像到磁带,然后使用snapmirror retrive把镜像从
磁带还原,当使用多个磁带保存镜像的时候,可以使用snapmirro use来切换磁带

镜像目的root卷中的snapmirror.conf控制目的netapp如何配置以及调度数据镜像,snapmirror的格式除了多一个源
和目标之外,以及镜像参数外,剩下的5个域的意义和crontab的格式一模一样。

而源filer的options设置中,snapmirror.access值则告诉netapp哪些镜像源的访问规则

增加snapmirror.conf
 ds1.la.vclk.net:/vol/mezi_build_prd/build.mezimedia.com nss6-wl:/vol/mezi_build_beta/build.mezimedia.com  – – – – – –

$ sudo rsh nss6.wl.vclk.net snapmirror status
Snapmirror is on.
Source                                                         Destination                                            State          Lag        Status
……
……
ds1.la.vclk.net:/vol/mezi_build_prd/build.mezimedia.com        nss6-wl:/vol/mezi_build_beta/build.mezimedia.com       Uninitialized  –          Idle
……
……
$ sudo rsh nss6.wl.vclk.net snapmirror initialize nss6-wl:/vol/mezi_build_beta/build.mezimedia.com
Transfer started.
Monitor progress with ‘snapmirror status’ or the snapmirror log.
$
$ sudo rsh nss6.wl.vclk.net snapmirror status
Snapmirror is on.
Source                                                         Destination                                            State          Lag        Status
……
……
ds1.la.vclk.net:/vol/mezi_build_prd/build.mezimedia.com        nss6-wl:/vol/mezi_build_beta/build.mezimedia.com       Uninitialized  –          Transferring  (1715 MB done)
……
……

$ sudo rsh nss6.wl.vclk.net snapmirror status
Snapmirror is on.
Source                                                         Destination                                            State          Lag        Status
……
……
ds1.la.vclk.net:/vol/mezi_build_prd/build.mezimedia.com        nss6-wl:/vol/mezi_build_beta/build.mezimedia.com       Snapmirrored   00:37:22   Idle
……
……

临时snapmirror,

$ sudo rsh nss6.wl.vclk.net snapmirror initialize -S  nss6.la.vclk.net:/vol/mezi_shared_prd/httpd /vol/mezi_build_beta/httpd
Transfer aborted: could not read from socket.

被拒绝,查看日志
$$ tail log/snapmirror
……
dst Tue Apr 12 08:33:13 GMT nss6.la.vclk.net:/vol/mezi_shared_prd/httpd nss6-wl:/vol/mezi_build_beta/httpd Request (Initialize)
dst Tue Apr 12 08:33:16 GMT nss6.la.vclk.net:/vol/mezi_shared_prd/httpd nss6-wl:/vol/mezi_build_beta/httpd Abort (could not read from socket)
……
……
$ sudo rsh nss6.la.vclk.net options snapmirror.access
snapmirror.access            host=ds1.sj2.vclk.net,ds2.sj2.vclk.net,filer3.sb.fastclick.net,nss4.sto.vclk.net,ds2.la.vclk.net,nss2.la.vclk.net,nas4.la1.cj.com,nss5.la.vclk.net,filer4.sb.fastclick.net,nss3.wl.vclk.net
$ sudo rsh nss6.la.vclk.net options snapmirror.access ‘host=ds1.sj2.vclk.net,ds2.sj2.vclk.net,filer3.sb.fastclick.net,nss4.sto.vclk.net,ds2.la.vclk.net,nss2.la.vclk.net,nas4.la1.cj.com,nss5.la.vclk.net,filer4.sb.fastclick.net,nss3.wl.vclk.net,nss6.wl.vclk.net’
$ sudo rsh nss6.la.vclk.net options snapmirror.access
snapmirror.access            host=ds1.sj2.vclk.net,ds2.sj2.vclk.net,filer3.sb.fastclick.net,nss4.sto.vclk.net,ds2.la.vclk.net,nss2.la.vclk.net,nas4.la1.cj.com,nss5.la.vclk.net,filer4.sb.fastclick.net,nss3.wl.vclk.net,nss6.wl.vclk.net

OK,成功设置snapmirror.access,再次snapmirror initialize
$ sudo rsh nss6.wl.vclk.net snapmirror initialize -S  nss6.la.vclk.net:/vol/mezi_shared_prd/httpd /vol/mezi_build_beta/httpd
Transfer started.
Monitor progress with ‘snapmirror status’ or the snapmirror log.
$

成功。过段时间查看查看snapmirror状态:

$ sudo rsh nss6.wl.vclk.net snapmirror status /vol/mezi_build_beta/httpd
Snapmirror is on.
Source                                       Destination                         State          Lag        Status
nss6.la.vclk.net:/vol/mezi_shared_prd/httpd  nss6-wl:/vol/mezi_build_beta/httpd  Snapmirrored   00:01:28   Idle

镜像完成之后,中断镜像关系:
$ sudo rsh nss6.wl.vclk.net snapmirror break /vol/mezi_build_beta/httpd
snapmirror break:  /vol/mezi_build_beta/httpd: The destination is not quiesced. Please run “snapmirror quiesce” on this destination before running “snapmirror break”.
$ sudo rsh nss6.wl.vclk.net snapmirror quiesce /vol/mezi_build_beta/httpd
snapmirror quiesce: in progress
 This can be a long-running operation. Use Control – C (^C) to interrupt.
snapmirror quiesce: /vol/mezi_build_beta/httpd :  Successfully quiesced
$ sudo rsh nss6.wl.vclk.net snapmirror status /vol/mezi_build_beta/httpd
Snapmirror is on.
Source                                       Destination                         State          Lag        Status
nss6.la.vclk.net:/vol/mezi_shared_prd/httpd  nss6-wl:/vol/mezi_build_beta/httpd  Quiesced       00:06:45   Idle
$ sudo rsh nss6.wl.vclk.net snapmirror break /vol/mezi_build_beta/httpd
snapmirror break: Destination /vol/mezi_build_beta/httpd is now writable.
$ sudo rsh nss6.wl.vclk.net snapmirror status /vol/mezi_build_beta/httpd
Snapmirror is on.
Source                                       Destination                         State          Lag        Status
nss6.la.vclk.net:/vol/mezi_shared_prd/httpd  nss6-wl:/vol/mezi_build_beta/httpd  Broken-off     00:18:48   Idle
break之后,记得在源执行snapmirror release,这样告诉源无需为snapmirror保留snapshot,同时会自动清理snapmirror创建
的snapshot。

如何删掉Broken-off状态的snapmirror relationship?

对于目的镜像卷或者qtree,只要删掉目标filer对应的snap shot即可,而镜像源使用snapmirror release即可:

$ sudo rsh nss6.wl.vclk.net snapmirror status
Snapmirror is on.
Source                                                         Destination                                            State          Lag        Status
…….
…….
ds1.la.vclk.net:/vol/mezi_build_prd/build.mezimedia.com        nss6-wl:/vol/mezi_build_beta/build.mezimedia.com       Snapmirrored   03:02:59   Idle
nss6.la.vclk.net:/vol/mezi_shared_prd/httpd                    nss6-wl:/vol/mezi_build_beta/httpd                     Broken-off     01:13:46   Idle
ds2.la.vclk.net:/vol/mezi_dpstomcat_dev/amdfeed.mezimedia.com  nss6-wl:/vol/mezi_dpstomcat_dev/amdfeed.mezimedia.com  Snapmirrored   00:40:57   Idle
…….
…….
$ sudo rsh nss6.wl.vclk.net snap list mezi_build_beta
Volume mezi_build_beta
working…

  %/used       %/total  date          name
———-  ———-  ————  ——–
  0% ( 0%)    0% ( 0%)  Apr 12 08:42  nss6-wl(0118060994)_mezi_build_beta_httpd-dst.2
  0% ( 0%)    0% ( 0%)  Apr 12 08:20  ds1-la(0151702346)_mezi_build_prd_build_data-src.0 (snapmirror)
  0% ( 0%)    0% ( 0%)  Apr 12 08:00  hourly.0
  0% ( 0%)    0% ( 0%)  Apr 12 07:29  nss6-wl(0118060994)_mezi_build_beta_build.mezimedia.com-dst.2 (busy,snapmirror)
  0% ( 0%)    0% ( 0%)  Apr 12 00:00  nightly.0
  0% ( 0%)    0% ( 0%)  Apr 11 20:00  hourly.1
$ sudo rsh nss6.wl.vclk.net snap delete ‘mezi_build_beta nss6-wl(0118060994)_mezi_build_beta_httpd-dst.2’
deleting snapshot…
[ggou@fs1.vclk.net /netapp/nss6.wl.vclk.net/etc]$ sudo rsh nss6.wl.vclk.net snap list mezi_build_beta
Volume mezi_build_beta
working…

  %/used       %/total  date          name
———-  ———-  ————  ——–
  0% ( 0%)    0% ( 0%)  Apr 12 08:20  ds1-la(0151702346)_mezi_build_prd_build_data-src.0 (snapmirror)
  0% ( 0%)    0% ( 0%)  Apr 12 08:00  hourly.0
  0% ( 0%)    0% ( 0%)  Apr 12 07:29  nss6-wl(0118060994)_mezi_build_beta_build.mezimedia.com-dst.2 (busy,snapmirror)
  0% ( 0%)    0% ( 0%)  Apr 12 00:00  nightly.0
  0% ( 0%)    0% ( 0%)  Apr 11 20:00  hourly.1
$ sudo rsh nss6.wl.vclk.net snapmirror status
Snapmirror is on.
Source                                                         Destination                                            State          Lag        Status
……
……
ds1.la.vclk.net:/vol/mezi_build_prd/build.mezimedia.com        nss6-wl:/vol/mezi_build_beta/build.mezimedia.com       Snapmirrored   03:07:06   Idle
ds2.la.vclk.net:/vol/mezi_dpstomcat_dev/amdfeed.mezimedia.com  nss6-wl:/vol/mezi_dpstomcat_dev/amdfeed.mezimedia.com  Snapmirrored   00:45:04   Idle
……
……
单个filer上,vol之间snapmirror:  
$ sudo rsh nss6.wl.vclk.net snapmirror initialize -S mezi_mmfdb101_dev mezi_mmfdb102_dev
Transfer aborted: destination must be restricted for an initial transfer.
$ sudo rsh nss6.wl.vclk.net vol  status  mezi_mmfdb102_dev
         Volume State           Status            Options
mezi_mmfdb102_dev online          raid_dp, flex
                         Volume UUID: 95008ed6-6b26-11e0-93d5-00a0980cb33f
                Containing aggregate: ‘aggr0’
$ sudo rsh nss6.wl.vclk.net vol  restrict  mezi_mmfdb102_dev
Volume ‘mezi_mmfdb102_dev’ is now restricted.
$ sudo rsh nss6.wl.vclk.net vol  status  mezi_mmfdb102_dev
         Volume State           Status            Options
mezi_mmfdb102_dev restricted      raid_dp, flex
                         Volume UUID: 95008ed6-6b26-11e0-93d5-00a0980cb33f
                Containing aggregate: ‘aggr0’

$ sudo rsh nss6.wl.vclk.net snapmirror initialize -S nss6-wl:mezi_mmfdb101_dev mezi_mmfdb102_dev
Transfer aborted: destination volume too small; it must be equal to or larger than the source volume.
$ sudo rsh nss6.wl.vclk.net snapmirror initialize -S nss6-wl:mezi_mmfdb101_dev mezi_mmfdb102_dev
Transfer started.
Monitor progress with ‘snapmirror status’ or the snapmirror log.
$ sudo rsh nss6.wl.vclk.net snapmirror initialize -S nss6-wl:mezi_mmfdb101_dev mezi_mmfdb103_dev
Transfer started.
Monitor progress with ‘snapmirror status’ or the snapmirror log.
$ sudo rsh nss6.wl.vclk.net snapmirror status | grep mmfdb
ds2.la.vclk.net:mezi_mmfdb101_dev                              nss6-wl:mezi_mmfdb101_dev                              Uninitialized  01:29:28   Idle
nss6-wl:mezi_mmfdb101_dev                                      nss6-wl:mezi_mmfdb102_dev                              Uninitialized  –          Transferring  (1149 MB done)
nss6-wl:mezi_mmfdb101_dev                                      nss6-wl:mezi_mmfdb103_dev                              Uninitialized  –          Transferring  (455 MB done)
$

中断正在传输数据的snapmirror。 snap abort:
$ sudo rsh nss6.wl.vclk.net snapmirror status | grep mezi_mmfdb
nss6-wl:mezi_mmfdb101_dev                                      nss6-wl:mezi_mmfdb102_dev                              Uninitialized  –          Transferring  (203 GB done)
nss6-wl:mezi_mmfdb101_dev                                      nss6-wl:mezi_mmfdb103_dev                              Uninitialized  –          Transferring  (203 GB done)
$ sudo rsh nss6.wl.vclk.net snapmirror abort mezi_mmfdb102_dev
$ sudo rsh nss6.wl.vclk.net snapmirror status | grep mezi_mmfdb
nss6-wl:mezi_mmfdb101_dev                                      nss6-wl:mezi_mmfdb102_dev                              Uninitialized  –          Idle with restart checkpoint (at 195 GB)
nss6-wl:mezi_mmfdb101_dev                                      nss6-wl:mezi_mmfdb103_dev                              Uninitialized  –          Transferring  (208 GB done)

在源上停止snapmirror,可以使用snapmirror release,这样会让源filer:
1.  删掉snapmirror自动建立的snapshot
2.  删掉snapm relastionship
可以直接使用snapmirror destinations的输出,作为给传递snapmirror release的参数。

$ sudo rsh ds2.la.vclk.net snapmirror destinations
Path       Destination
……
mezi_mmdb101_dev nss6-wl:mezi_mmdb101_dev
mezi_mmfdb101_beta nss5-wl:mezi_mmfdb101_beta
mezi_mmfdb102_beta nss5-wl:mezi_mmfdb102_beta
mezi_mmfdb102_dev nss5-wl:mezi_mmfdb102_dev
……
$ sudo rsh ds2.la.vclk.net snap list mezi_mmfdb101_beta
Volume mezi_mmfdb101_beta
working…

  %/used       %/total  date          name
———-  ———-  ————  ——–
  0% ( 0%)    0% ( 0%)  Apr 18 09:40  nss5-wl(0118060459)_mezi_mmfdb101_beta.311 (snapmirror)
$ sudo rsh ds2.la.vclk.net snapmirror release mezi_mmfdb101_beta nss5-wl:mezi_mmfdb101_beta
$ sudo rsh ds2.la.vclk.net snap list mezi_mmfdb101_beta
Volume mezi_mmfdb101_beta
working…

No snapshots exist.
$ sudo rsh ds2.la.vclk.net snapmirror status | grep mmfdb101
$

最后这个问题,世界上很多人都在问,就用英语写了,方便中外朋友参考。
how to clear a unused snapmirror relationship:
1.  dest filer: snapmirror break,  vol status will changed to online from restricted
2.  src filer: snapmirror relase( use the snapmirror destinations outputss as the arguments); 
    this will tell snapmirror to stop gennerate the snap shot , and delete the unused snap shouts generated by snapmirror
3.  dest filer:  snap delete -a -f vol_name;   delete the snap shot generated automaticlly by snapmirror
4.  dest filer: delete the schedule in snapmirror.conf if exists this setting

恢复引导记录

Filed under: OS_Tips — 洛阳铲 @ 22:25

什么是MBR?可以参考维基百科的解释,很多时候需要恢复mbr,比如安装了多系统之后
又想恢复XP/Vista/Win7默认的启动界面,或者被病毒破坏,等等情况

用到的工具是mbrfix工具包,首先去这儿,下载免费的mbrfix。然后参考其说明文档,备份好现在的mbr:

然后使用fixmbr子命令,修复mbr即可。如果是vista或者win7,加上相应的/vista或者/win7作为参数

ok,现在重启机器,便可以看见结果了。

Powered by WordPress