存档

2011年9月 的存档

pcre-7.9编译安装出错[pcrecpp.lo] Error 1

2011年9月19日 没有评论

下载pcre-7.9编译安装,make时报错:

source=’pcrecpp.cc’ object=’pcrecpp.lo’ libtool=yes

DEPDIR=.deps depmode=none /bin/sh ./depcomp

/bin/sh ./libtool –tag=CXX –mode=compile -DHAVE_CONFIG_H -I. -I/usr/kerberos/include -c -o pcrecpp.lo pcrecpp.cc

libtool: ignoring unknown tag CXX

libtool: unrecognized option -DHAVE_CONFIG_H'

Try libtool –help’ for more information.

make[1]: *** [pcrecpp.lo] Error 1

 

这个错误,基本可以断定是缺少系统包造成的,但是缺少哪个包却不明确,这里记录下,这个错误是缺少安装gcc-c++,只需yum -y install gcc-c++,重新configure,make && make install通过。

 

分类: linux 标签:

Linux CPU 信息查看

2011年9月17日 1 条评论

我们可以用/proc/cpuinfo 查看CPU 的信息。 该文件包含系统上每个处理器的数据段落。/proc/cpuinfo 描述中有 6 个条目适用于多内核和超线程(HT技术检查:processor, vendor id, physical id, siblings, core id cpu cores

1processor:包括这一逻辑处理器的唯一标识符。

2physical id :包括每个物理封装的唯一标识符。

3core id :保存每个内核的唯一标识符。

4siblings :列出了位于相同物理封装中的逻辑处理器的数量。

5cpu cores :包含位于相同物理封装中的内核数量。

6)如果处理器为英特尔处理器,则 vendor id 条目中的字符串是 GenuineIntel

拥有相同 physical id 的所有逻辑处理器共享同一个物理插座 每个 physical id 代表一个唯一的物理封装。Siblings 表示位于这一物理封装上的逻辑处理器的数量。逻辑处理器可能支持也可能不支持超线程(HT)技术。每个 core id 均代表一个唯一的处理器内核。所有带有相同 core id 的逻辑处理器均位于同一个处理器内核上。如果有一个以上逻辑处理器拥有相同的 core id physical id,则说明系统支持超线程(HT)技术。如果有两个或两个以上的逻辑处理器拥有相同的 physical id,但是 core id 不同,则说明这是一个多内核处理器。cpu cores 条目也可以表示是否支持多内核。

一. i386 i586 i686 之间的区别

他们指的是适用于intel i386 i586i686 兼容指令集的微处理器。一般来说,等级愈高的机器可接受较低等级的rpm文件。

i386—几乎所有的X86平台,不论是旧的pentum或者是新的pentum-IVK7系统CPU,都可以正常工作,i指得是Intel兼容的CPU,至于386就是CPU的等级。

i586—就是586等级的计算机,包括pentum第一代MMX CPUAMDK5K6系统CPUsocket7插脚)等CPU都是这个等级。

i686—pentum 2 以后的Intel系统CPUK7以后等级的CPU都属于这个686等级。
你可以透过/proc/cpuinfo这个档案查询你的CPU等级。

二. 查看CPU 信息

我们可以通过/proc/cpuinfo 这个文件来查看CPU 的信息。

[root@qs-wgdb-1 proc]# more /proc/cpuinfo

processor : 0

vendor_id : GenuineIntel

cpu family : 6

model : 44

model name : Intel(R) Xeon(R) CPU E5630 @ 2.53GHz

stepping : 2

cpu MHz : 2527.071

cache size : 12288 KB

physical id : 1

siblings : 8

core id : 0

cpu cores : 4

apicid : 32

fpu : yes

fpu_exception : yes

cpuid level : 11

wp : yes

flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dt

s acpi mmx fxsr sse sse2 ss ht tm syscall nx pdpe1gb rdtscp lm constant_tsc ida nonstop_tsc arat pni

monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm

bogomips : 5054.14

clflush size : 64

cache_alignment : 64

address sizes : 40 bits physical, 48 bits virtual

power management: [8]

processor : 1

vendor_id : GenuineIntel

cpu family : 6

model : 44

model name : Intel(R) Xeon(R) CPU E5630 @ 2.53GHz

stepping : 2

cpu MHz : 2527.071

cache size : 12288 KB

physical id : 0

siblings : 8

core id : 0

cpu cores : 4

apicid : 0

fpu : yes

fpu_exception : yes

cpuid level : 11

wp : yes

flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dt

s acpi mmx fxsr sse sse2 ss ht tm syscall nx pdpe1gb rdtscp lm constant_tsc ida nonstop_tsc arat pni

monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm

bogomips : 5054.02

clflush size : 64

cache_alignment : 64

address sizes : 40 bits physical, 48 bits virtual

power management: [8]

processor : 2

vendor_id : GenuineIntel

cpu family : 6

model : 44

model name : Intel(R) Xeon(R) CPU E5630 @ 2.53GHz

stepping : 2

cpu MHz : 2527.071

cache size : 12288 KB

physical id : 1

siblings : 8

core id : 1

cpu cores : 4

apicid : 34

fpu : yes

fpu_exception : yes

cpuid level : 11

wp : yes

flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dt

s acpi mmx fxsr sse sse2 ss ht tm syscall nx pdpe1gb rdtscp lm constant_tsc ida nonstop_tsc arat pni

monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm

bogomips : 5054.04

clflush size : 64

cache_alignment : 64

address sizes : 40 bits physical, 48 bits virtual

power management: [8]

….

processor : 14

vendor_id : GenuineIntel

cpu family : 6

model : 44

model name : Intel(R) Xeon(R) CPU E5630 @ 2.53GHz

stepping : 2

cpu MHz : 2527.071

cache size : 12288 KB

physical id : 1

siblings : 8

core id : 10

cpu cores : 4

apicid : 53

fpu : yes

fpu_exception : yes

cpuid level : 11

wp : yes

flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx pdpe1gb rdtscp lm constant_tsc ida nonstop_tsc arat pni monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm

bogomips : 5054.03

clflush size : 64

cache_alignment : 64

address sizes : 40 bits physical, 48 bits virtual

power management: [8]

processor : 15

vendor_id : GenuineIntel

cpu family : 6

model : 44

model name : Intel(R) Xeon(R) CPU E5630 @ 2.53GHz

stepping : 2

cpu MHz : 2527.071

cache size : 12288 KB

physical id : 0

siblings : 8

core id : 10

cpu cores : 4

apicid : 21

fpu : yes

fpu_exception : yes

cpuid level : 11

wp : yes

flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx pdpe1gb rdtscp lm constant_tsc ida nonstop_tsc arat pni monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm

bogomips : 5053.98

clflush size : 64

cache_alignment : 64

address sizes : 40 bits physical, 48 bits virtual

power management: [8]

三. 相关分析

3.1 查看服务器位数

[root@qs-wgdb-1 proc]# arch

x86_64

x86_64 64位系统

X8632位系统

3.2 查看CPU 是否支持64bit

[root@qs-wgdb-1 proc]# cat /proc/cpuinfo | grep flags | grep ‘ lm ‘ | wc -l

16

结果大于0, 说明支持64bit计算. lmlong mode, 支持lm则是64bit

3.3 逻辑CPU个数:
[root@qs-wgdb-1 proc]# cat /proc/cpuinfo | grep ‘processor’ | wc -l

16

注意:这里是逻辑CPU 就是我们在cpuinfo中看到的processor.

3.4 物理CPU个数:

[root@qs-wgdb-1 proc]# cat /proc/cpuinfo | grep ‘physical id’ | sort | uniq | wc -l

2

这里指的是物理CPU,就是我们在服务器上看到的2CPU 插槽。

3.5 每个物理CPUCore的个数:
[root@qs-wgdb-1 proc]# cat /proc/cpuinfo | grep ‘cpu cores’ | wc -l

16

3.6 是否为超线程:

如果有两个逻辑CPU具有相同的”core id”,那么超线程是打开的。每个物理CPU中逻辑CPU(可能是core, threadsboth)的个数.


[root@qs-wgdb-1 proc]# cat /proc/cpuinfo | grep ‘siblings’

siblings : 8

siblings : 8

siblings : 8

siblings : 8

siblings : 8

siblings : 8

siblings : 8

siblings : 8

siblings : 8

siblings : 8

siblings : 8

siblings : 8

siblings : 8

siblings : 8

siblings : 8

siblings : 8

四. CPU ID

CPU IDCPU生产厂家为识别不同类型的CPU,而为CPU制订的不同的单一的代码;不同厂家的CPU,其CPU ID定义也是不同的;如 “0F24”Inter处理器)、“681H”AMD处理器),根据这些数字代码即可判断CPU属于哪种类型,这就是一般意义上的CPU ID

于计算机使用的是十六进制,因此CPU ID也是以十六进制表示的。Inter处理器的CPU ID一共包含四个数字,如“0F24”,从左至右分别表示 Type(类型)、Family(系列)、Mode(型号)和Stepping(步进编号)。

CPUID“068X”的处理器开始,Inter另外增 加了Brand ID(品种标识)用来辅助应用程序识别CPU的类型,因此根据“068X”CPUID还不能正确判别PentiumCelerom处理 器。必须配合Brand ID来进行细分。

AMD处理器一般分为三位,如“681”,从左至右分别表示为Family(系列)、Mode(型号)和 Stepping(步进编号)。

Type(类型)

类型标识用来区别INTEL微处理器是用于由最终用户安装,还是由专业个人计算机系 统集成商、服务公司或制作商安装;数字“1”标识所测试的微处理器是用于由用户安装的;数字“0”标识所测试的微处理器是用于由专业个人计算机系统集成 商、服务公司或制作商安装的。我们通常使用的INTEL处理器类型标识都是“0”“0F24”CPUID就属于这种类型。

Family(系列)

系列标识可用来确定处理器属于那一代产品。如6系列的INTEL处理器包括Pentium ProPentium II Pentium II XeonPentium IIIPentium III Xeon处理器。5系列(第五代)包括Pentium处理器和采用 MMX技术的Pentium处理器。AMD6系列实际指有K7系列CPU,有DURONATHION两大类。最新一代的 INTEL Pentium 4系列处理器(包括相同核心的Celerom处理器)的系列值为“F”

Mode(型号)

型号标识可用来 确定处理器的制作技术以及属于该系列的第几代设计(或核心),型号与系列通常是相互配合使用的,用于确定计算机所安装的处理器是属于某系列处理器的哪种特 定类型。如可确定Celerom处理器是Coppermine还是Tualutin核心;Athlon XP处理器是Paiomino还是 Thorouhgbred核心。

Stepping(步进编号)

步进编号用来标识处理器的设计或制作版本,有助于控制和跟踪处理器的更 改,步进还可以让最终用户更具体地识别其系统安装的处理器版本,确定微处理器的内部设计或制作特性。步进编号就好比处理器的小版本号,如CPUID “686”“686A”就好比WINZIP8.08.1的关系。步进编号和核心步进是密切联系的。如CPUID“686”Pentium III 处理器是cCO核心,而“686A”表示的是更新版本cD0核心。

Brand ID(品种标识)

INTELCoppermine核心的处理器开始引入Brand ID作为CPU的辅助识别手段。如我们通过Brand ID可以识别出处理器究竟是Celerom还是Pentium 4

总结:

/proc/cpuinfo 这个文件,我们可以看出cpu的信息。 这个有2个概念。 一个是物理CPU个数和逻辑CPU 个数。 物理CPU 就是我们在主板上卡槽看到CPU的个数。 这个可以通过physical id 这个进行判断。 有几个不同的physical id 就有几个物理CPU 至于逻辑CPU 个数,我们可以通过processor来判断。 这个比较简单。 如果有2个物理封装的的CPU,有16个逻辑CPU 那么每个物理封装里面就有8个逻辑CPU

 

分类: life 标签:

如何查看Linux内存信息

2011年9月17日 没有评论

 

1. 内存的插槽数,已经使用多少插槽.每条内存多大,已使用内存多大

dmidecode | grep -P -A 5 “Memory\s+Device” | grep Size | grep -v Range

Size: 2048 MB
Size: 2048 MB
Size: No Module Installed
Size: No Module Installed
Size: No Module Installed
Size: No Module Installed
Size: No Module Installed
Size: No Module Installed

2. 支持的最大内存容量

dmidecode | grep -P ‘Maximum\s+Capacity’

Maximum Capacity: 64 GB

3. 查看内存的频率

dmidecode | grep -A16 “Memory Device”
dmidecode | grep -A16 “Memory Device” | grep ‘Speed’

Speed: 667 MHz (1.5 ns)
Speed: 667 MHz (1.5 ns)
Speed: 667 MHz (1.5 ns)
Speed: 667 MHz (1.5 ns)
Speed: 667 MHz (1.5 ns)
Speed: 667 MHz (1.5 ns)
Speed: 667 MHz (1.5 ns)
Speed: 667 MHz (1.5 ns)

分类: linux 标签:

卸载赛门铁克SEP11后不能上网的解决方法

2011年9月15日 3 条评论

我刚才删除了我系统上的,版本11.0.780.1109. 是运行安装程序后。选择的删除。

删除后确实就不能联网了。

 

按照官方手动删除的方法。第一步,找到网卡属性,在TCP/IP协议那一堆里。卸载“Teefer2 Driver”

重启电脑后能联网了

 

分类: safe 标签: ,

如何恢复Win7共享密码访问

2011年9月15日 没有评论

问 :恢复Win7共享密码访问

我这里有几台Windows7系统的电脑,组成了工作网络。我第一次访问其他电脑的共享文件夹,输入了网络密码,但当时没多考虑勾选了记住密码的选项,结果,我以后在访问这个共享目录就不用输入密码了,可是我不想这样,该如何恢复以前的要输入密码的状态呢?

 

答:这是因为最初时“记住密码”的操作Windows7保存了凭据,要恢复原始状体可以点击“控制面板—用户账号和家庭安全—凭据管理器”,找到凭据后将其删除,重新访问该共享就会出现“Windows 安全”标题的窗口了。

 

分类: windows 标签:

用Shell生成随机密码

2011年9月2日 没有评论

比如我们要产生一个8位的字母和数字混合的随机密码,可以这样:

[linux@test /tmp]$ cat /dev/urandom | head -1 | md5sum | head -c 8

6baf9282

只要修改最后面的”head -c 8″就可以产生你想要的随机密码了(最多可以生产32位,用做密码足够了:)

下面的方法也可以生成一个8位的随机字符串,用做密码很合适

[linux@test /tmp]$ od -N 4 -t x4 /dev/random | head -1 | awk ‘{print $2}’

##################################################

linux环境下有一个密码生成器的小工具非常好用(mkpasswd,需要装一个软件包:expect-5.43.0-5.1.src.rpm),可以根据自己的需要随机生成各种各样的密码:

mkpasswd -l 10 -d 3(密码长度为10个字符,其中含有3个数字)

生成单个密码的时候,很简单只要运行这个命令就可以,如果是多个用户的密码呢?

可以用以下的脚本来完成,以下是我自己写的一个非常简单的脚本。

#!/bin/bash

for i in seq 1 11;

do

mkpasswd

done

 

###################################################

shell脚本:

[root@10.10.90.97 ~!]# more password.sh
#!/bin/bash
array=( ^ % \* \# @ \( \) \] \[ \\ ! $ % _ + = \~ \, \: \; \' \" \| \
a b c d e f g h i j k m n o p q r s t u v w x y z \
0 1 2 3 4 5 6 7 8 9 \
A B C D E F G H I J K L M N P Q R S T U V W X Y Z)
mun=
echo ${#array[@]}
mininum=8
maxinum=
expr 8 + $((RANDOM%3))
for i in
seq 1 $maxinum;do
echo -n "${array[$((RANDOM%${mun}))]}"
done
echo

 

###############################################

[root@10.10.90.97  ~]# more passwd.pl
#!/usr/bin/perl
my $characterset = 'abcdefghijkmnopqrstuvwxyz23456789ABCDEFGHIJKLMNPQRSTUVWXYZ';
$characterset .= "
!@#$%^*()_=-~,.?;:|";
my $mininum = 8;
my $maxinum = 10;
sub MakePassword
{
my ($composition, $lowlength, $highlength) = @_;
return '' unless $composition;
my @p = split //, $composition;
my $arraylength = @p;
$lowlength = 7 if $lowlength < 1;
$highlength =7 if $highlength < 1;
if ($lowlength > $highlength) {
($highlength, $lowlength) = ($lowlength, $highlength);
}
my $length = int(rand($highlength - $lowlength + 1));
$length += $lowlength;
my $password = '';
for (1..$length) {
my $i = int(rand($arraylength));
$password .= $p[$i];
}
return $password;
}
my $password = MakePassword ($characterset, $mininum, $maxinum);
print $password;

##################################################

#! /bin/bash
getrandomkey() {
a=(0 1 2 3 4 5 6 7 8 9 a b c d A B C D @ %)
for ((i=0;i<$1;i++));do
echo -n ${a[$RANDOM % ${#a[*]}]}
done
}
key=
getrandomkey expr $RANDOM % 20 + 30`

分类: linux 标签:

svn checkout-从版本库签出工作副本

2011年9月2日 没有评论

分类: linux 标签: ,

SVN服务器几种备份策略

2011年9月2日 没有评论

转自:http://www.blogjava.net/jasmine214–love/archive/2010/09/28/333223.html

(本文例子基于FreeBSD/Linux实现,windows环境请自己做出相应修改)
配置管理的一个重要使命是保证数据的安全性,防止服务器应硬盘损坏、误操作造成数据无法恢复的灾难性后果。因此制定一个完整的备份策略非常重要。

一般来说,备份策略应规定如下几部分内容:备份频度、备份方式、备份存放地点、备份责任人、灾难恢复检查措施及规定。

备份频度、存放地点等内容可以根据自己的实际情况自行制定;本文重点描述备份方式。

svn备份一般采用三种方式:1)svnadmin dump 2)svnadmin hotcopy 3)svnsync.

注意,svn备份不宜采用普通的文件拷贝方式(除非你备份的时候将库暂停),如copy命令、rsync命令。
笔者曾经用 rsync命令来做增量和全量备份,在季度备份检查审计中,发现备份出来的库大部分都不可用,因此最好是用svn本身提供的功能来进行备份。

优缺点分析:
==============
第一种svnadmin dump是官方推荐的备份方式,优点是比较灵活,可以全量备份也可以增量备份,并提供了版本恢复机制。
缺点是:如果版本比较大,如版本数增长到数万、数十万,那么dump的过程将非常慢;备份耗时,恢复更耗时;不利于快速进行灾难恢复。
个人建议在版本数比较小的情况下使用这种备份方式。
第二种svnadmin hotcopy原设计目的估计不是用来备份的,只能进行全量拷贝,不能进行增量备份;
优点是:备份过程较快,灾难恢复也很快;如果备份机上已经搭建了svn服务,甚至不需要恢复,只需要进行简单配置即可切换到备份库上工作。
缺点是:比较耗费硬盘,需要有较大的硬盘支持(俺的备份机有1TB空间,呵呵)。
第三种svnsync实际上是制作2个镜像库,当一个坏了的时候,可以迅速切换到另一个。不过,必须svn1.4版本以上才支持这个功能。
优点是:当制作成2个镜像库的时候起到双机实时备份的作用;
缺点是:当作为2个镜像库使用时,没办法做到“想完全抛弃今天的修改恢复到昨晚的样子”;而当作为普通备份机制每日备份时,操作又较前2种方法麻烦。

下面具体描述这三种的备份的方法:
===============

1、svnadmin dump备份工具
————————
这是subversion官方推荐的备份方式。

1)定义备份策略:
备份频度:每周六进行一次全量备份,每周日到周五进行增量备份
备份地点:备份存储路径到/home/backup/svn/
备份命名:全量备份文件名为:weekly_fully_backup.yymmdd,增量备份文件命名为:daily-incremental-backup.yymmdd
备份时间:每晚21点开始
备份检查:每月末进行svnadmin load恢复试验。
2)建立全量备份脚本:
在~/下建立一个perl脚本文件,名为weekly_backup.pl,执行全量备份,并压缩备份文件,代码如下(本代码只针对一个库的备份,如果是多个库请做相应改动):

#!/usr/bin/perl -w
my $svn_repos=”/home/svn/repos/project1″;
my $backup_dir=”/home/backup/svn/”;
my $next_backup_file = “weekly_fully_backup.”.date +%Y%m%d;

$youngest=svnlook youngest $svn_repos;
chomp $youngest;

print “Backing up to revision $youngestn”;
my $svnadmin_cmd=”svnadmin dump –revision 0youngest $svn_repos >$backup_dir/$next_backup_file”;
$svnadmin_cmd;
open(LOG,”>$backup_dir/last_backed_up”); #记录备份的版本号
print LOG $youngest;
close LOG;
#如果想节约空间,则再执行下面的压缩脚本
print “Compressing dump file…n”;
print gzip -g $backup_dir/$next_backup_file;

3)建立增量备份脚本:
在全量备份的基础上,进行增量备份:在~/下建立一个perl脚本文件,名为:daily_backup.pl,代码如下:

#!/usr/bin/perl -w
my $svn_repos=”/home/svn/repos/project1″;
my $backup_dir=”/home/backup/svn/”;
my $next_backup_file = “daily_incremental_backup.”.date +%Y%m%d;

open(IN,”$backup_dir/last_backed_up”);
$previous_youngest = <IN>;
chomp $previous_youngest;
close IN;

$youngest=svnlook youngest $svn_repos;
chomp $youngest;
if ($youngest eq $previous_youngest)
{
print “No new revisions to backup.n”;
exit 0;
}
my $first_rev = $previous_youngest + 1;
print “Backing up revisions $youngest …n”;
my $svnadmin_cmd = “svnadmin dump –incremental –revision $first_revyoungest $svn_repos > $backup_dir/$next_backup_file”;
$svnadmin_cmd;
open(LOG,”>$backup_dir/last_backed_up”); #记录备份的版本号
print LOG $youngest;
close LOG;
#如果想节约空间,则再执行下面的压缩脚本
print “Compressing dump file…n”;
print gzip -g $backup_dir/$next_backup_file;

4)配置/etc/crontab文件
配置 /etc/crontab 文件,指定每周六执行weekly_backup.pl,指定周一到周五执行daily_backup.pl;
具体步骤俺就不啰嗦了.

5)备份恢复检查
在月底恢复检查中或者在灾难来临时,请按照如下步骤进行恢复:恢复顺序从低版本逐个恢复到高版本;即,先恢复最近的一次完整备份 weekly_full_backup.071201(举例),然后恢复紧挨着这个文件的增量备份 daily_incremental_backup.071202,再恢复后一天的备份071203,依次类推。如下:
user1>mkdir newrepos
user1>svnadmin create newrepos
user1>svnadmin load newrepos < weekly_full_backup.071201
user1>svnadmin load newrepos < daily_incremental_backup.071202
user1>svnadmin load newrepos < daily_incremental_backup.071203
….

如果备份时采用了gzip进行压缩,恢复时可将解压缩和恢复命令合并,简单写成:
user1>zcat weekly_full_backup.071201 | svnadmin load newrepos
user1>zcat daily_incremental_backup.071202 | svnadmin load newrepos

(这部分内容很多参考了《版本控制之道》)

2、svnadmin hotcopy整库拷贝方式
————————-
svnadmin hotcopy是将整个库都“热”拷贝一份出来,包括库的钩子脚本、配置文件等;任何时候运行这个脚本都得到一个版本库的安全拷贝,不管是否有其他进程正在使用版本库。
因此这是俺青睐的备份方式。

1)定义备份策略

备份频度:每天进行一次全量备份,
备份地点:备份目录以日期命名,备份路径到 /home/backup/svn/${mmdd}
备份保留时期:保留10天到15天,超过15天的进行删除。
备份时间:每晚21点开始
备份检查:备份完毕后自动运行检查脚本、自动发送报告。

2)建立备份脚本
在自己home目录 ~/下创建一个文件,backup.sh:

#!/bin/bash
SRCPATH=/home/svn/repos/; #定义仓库parent路径
DISTPATH=/home/backup/svn/date +%m%d/ ; #定义存放路径;
if [ -d “$DISTPATH” ]
then
else
mkdir $DISTPATH
chmod g+s $DISTPATH
fi
echo $DISTPATH
svnadmin hotcopy $SRCPATH/Project1 $DISTPATH/Project1 >/home/backup/svn/cpreport.log 2>&1;
svnadmin hotcopy $SRCPATH/Project2 $DISTPATH/Project2
cp $SRCPATH/access  $DISTPATH; #备份access文件
cp $SRCPATH/passwd  $DISTPATH; #备份passwd文件
perl /home/backup/svn/backup_check.pl #运行检查脚本
perl /home/backup/svn/deletDir.pl  #运行删除脚本,对过期备份进行删除。

3)建立检查脚本
在上面指定的地方/home/backup/svn/下建立一个perl脚本:backup_check.pl
备份完整性检查的思路是:对备份的库运行 svnlook youngest,如果能正确打印出最新的版本号,则表明备份文件没有缺失;如果运行报错,则说明备份不完整。我试过如果备份中断,则运行svnlook youngest会出错。
perl脚本代码如下:

#! /usr/bin/perl
## Author:xuejiang
## 2007-11-10
## http://www.scmbbs.com
use strict;
use Carp;
use Net::SMTP;

#### defined the var #######

my $smtp =Net::SMTP->new(‘mail.scmbbs.com’, Timeout => 30, Debug => 0)|| die “cann’t connect to mail.scmbbs.comn”;

my $bkrepos=”/home/backup/svn/”.&get_day;#定义备份路径
my $ssrepos=”http://www.scmbbs.com/repos”;#定义仓库url
my @repos = (“project1″,”project2”);

my $title=”echo “如下是昨晚备份结果与真实库对比的情况,如果给出备份版本数,则表示备份成功;如果给报错信息或没有备份版本数,则表示备份失败:” >./report”;
system $title  || die “exec failedn”;
foreach my $myrepos(@repos)
{
my $bkrepos1=$bkrepos.”/”.$myrepos;
my $ssrepos1=$ssrepos.”/”.$myrepos;
my $svnlookbk1 = “echo “$myrepos 昨晚备份的版本是:”>>./report;svnlook youngest “.$bkrepos1.” >> ./report 2>&1″;
my $svnlookss1 = “echo “$myrepos 真实库中的最新版本及最后修改时间是:”>>./report;svn log -r’HEAD’ “.$ssrepos1.” >> ./report 2>&1″;
system $svnlookbk1 || die “exec failedn”;
system $svnlookss1 || die “exec failedn”;

}

my $body       =”echo “=========================================================================” >>./report”;
my $bottom     =”echo “备份位置:来自http://www.scmbbs.com的”.$bkrepos.”” >>./report”;

system $body       || die “exec failedn”;
system $bottom     || die “exec failedn”;

###### report the result ####

open(SESAME,”./report”)|| die “can not open ./report”;
my @svnnews = <SESAME>;
close(SESAME);
foreach my $line1 (@svnnews)
{
print $line1.”n”;
}

my @email_addresses =(“scm@list.scmbbs.com”,”leader1@scmbbs.com”,”leader2@scmbbs.com”);
my $to              = join(‘, ‘, @email_addresses);
$smtp->mail(“scm@scmbbs.com”);
$smtp->recipient(@email_addresses);
$smtp->data();
$smtp->datasend(“Toton”);
$smtp->datasend(“From: svnReport@scmbbs.comn”);
$smtp->datasend(“Subject:svn备份检查报告”.&get_today.”n”);
$smtp->datasend(“Reply-to:scm@scmbbs.comn”);
$smtp->datasend(“@svnnews”);
$smtp->dataend();
$smtp->quit;

#############

sub get_today
{
my( $sec, $min, $hour, $day, $month, $year ) = localtime( time() );
$year += 1900;
$month++;
my $today = sprintf( “%04d%02d%02d”, $year, $month, $day);
return $today;
}
sub get_day
{
my( $sec, $min, $hour, $day, $month, $year ) = localtime( time() );
$year += 1900;
$month++;
my $today = sprintf( “%02d%02d”, $month, $day);
return $today;
}

4)定义删除脚本

由于是全量备份,所以备份不宜保留太多,只需要保留最近10来天的即可,对于超过15天历史的备份基本可以删除了。
在/home/backup/svn/下建立一个perl脚本:deletDir.pl
(注意,删除svn备份库可不像删除普通文件那么简单)
脚本代码请参看我的另一个帖子:http://www.scmbbs.com/cn/systp/2007/12/systp6.php

5)修改/etc/crontab 文件
在该文件中指定每晚21点执行“backup.sh”脚本。

3、svnsync备份
———————–
参阅:http://www.scmbbs.com/cn/svntp/2007/11/svntp4.php
使用svnsync备份很简单,步骤如下:
1)在备份机上创建一个空库:svnadmin create Project1
2)更改该库的钩子脚本pre-revprop-change(因为svnsync要改这个库的属性,也就是要将源库的属性备份到这个库,所以要启用这个脚本):
cd SMP/hooks;
cp pre-revprop-change.tmpl pre-revprop-change;
chmod 755 pre-revprop-change;
vi pre-revprop-change;
将该脚本后面的三句注释掉,或者干脆将它弄成一个空文件。
3)初始化,此时还没有备份任何数据:
svnsync init file:///home/backup/svn/svnsync/Project1/  http://svntest.subversion.com/repos/Project1
语法是:svnsync init {你刚创建的库url} {源库url}
注意本地url是三个斜杠的:///
4)开始备份(同步):
svnsync sync file:///home/backup/svn/svnsync/Project1
5)建立同步脚本
备份完毕后,建立钩子脚本进行同步。在源库/hooks/下建立/修改post-commit脚本,在其中增加一行,内容如下:

/usr/bin/svnsync sync  –non-interactive file:///home/backup/svn/svnsync/Project1

分类: linux 标签:

linux上svnsync配置

2011年9月2日 没有评论

要用到两个命令
1、svnsync init
初始化,建立目标库和源库之间的同步关系
命令格式 svnsync init 目标库URL 源库URL
2、svnsync sync
真正的同步
命令格式 svnsync sync 目标库URL
目标:
本次实现的是版本库的远程自动备份,将版本库备份到另一台机器上
假设我们要同步的源版本库为 http://192.168.0.1/svn/proj1 位于机器A,具体路径我们不必理会,因为我们使用http协议
目标库在机器B,file:///svn/proj1,这个为了简单和安全,我们使用file://协议
过程:
1、在机器B上,创建目标库
mkdir /svn
svnadmin create /svn/proj1
2、修改目标库的脚本pre-revprop-change
进入/svn/proj1/hooks/
cd /svn/proj1/hooks/
cp pre-revprop-change.tmpl  pre-revprop-change
vi pre-revprop-change
REPOS=”$1″
REV=”$2″
USER=”$3″
PROPNAME=”$4″
ACTION=”$5″
if [ “$ACTION” = “M” -a “$PROPNAME” = “svn:log” ]; then exit 0; fi
echo “Changing revision properties other than svn:log is prohibited” >&2
exit 1
原脚本的意思是如果修改的是svn:log属性,将允许修改,返回0;否则,不允许,返回1
我们要将它改为允许修改所有的属性,在脚本中直接返回0,新的脚本如下:
exit 0;
3、初始化
svnsync init file:///svn/proj1 http://192.168.0.1/svn/proj1
会提示输入用户名和密码,这里提供的用户名和密码是可以完全读取http://192.168.0.1/svn/proj1的用户名和密码
4、同步
svnsync sync file:///svn/proj1

依然会提示输入用户名和密码,不过,你可以在这个命令之后加上 username 、password参数,
例如svnsync sync file:///svn/proj1 –username username –password password

分类: linux 标签:

一次向svn中增加所有新增文件 svn add all new files

2011年9月2日 没有评论

以下摘自:《卓有成效的程序员》之自动化

我经常会一次往Subversion里添加一批文件。在使用命令行做这件事时,你必须指定所有想要添加的文件名。如果文件不多的话这还不算太糟糕,但如果 你要添加20个文件,那就费事了。当然你也可以用通配符,但这样一来就可能匹配到已经在版本控制之下的文件(这不会有什么损害,只不过会输出一堆错误信 息,可能会跟别的错误信息混淆)。为了解决这个问题,我写了一行简单的bash命令:

svn st | grep ‘^\?’ | tr ‘^\?’ ‘ ‘ | sed ‘s/[ ]*//’ | sed ‘s/[ ]/\\ /g’ | xargs svn add

表4.3详细解释了这一行命令。

我大概花了15分钟写出这条命令,然后用了它成百上千次。

****************************************************

这个自动化过程已经很完美了,一个“简单”的shell脚本,这是一个权威编写并使用了百上千次的脚本。

然后我在一个博客中看到这样一个脚本:

svn st|awk ‘{print $2}’|xargs svn add。

乍看之下觉得更加精炼,仔细看下就会发现这个脚本没有区分文件状态。所以完善了以下这个脚本:

svn st | awk ‘{if ( $1 == “?”) { print $2}}’ | xargs svn add

这样,以后我可能使用这个脚本成百上千次。(当然这个脚本也没有考虑过滤掉不要添加的文件)

当你第三次做一件事情的时候,就应该考虑将其工具化,自动化!

 

svn st | awk ‘{if ( $1 == “?”) { print $2}}’ | xargs svn ci -m “code update” –username “youruser” –password “yourpasswd”

分类: shell 标签:

解决 Subversion 的 “svn: Can’t convert string from ‘UTF-8’ to native encoding” 错误 – 编程夜未眠 – 博客频道 – CSDN.NET

2011年9月2日 没有评论

用Windows 下面的tortoisesvn的时候,一不小心把一个含有中文字符的文件给 check in了, 结果招来麻烦无数。

然后在Linux上面check out代码的时候,当遇到这个文件的时候老是报错。

view plain svn: Can’t convert string from ‘UTF-8’ to native encoding

害的我很是郁闷, 查了一下资料,发现解决方法也蛮简单的,也就一条命令

export LANG=”zh_CN.UTF-8″

或者写入 ~/.bashrc,以后就不会遇到这个问题了。