专注业务连续性支持与数据保护
2009-05-25技术合集

多MASTER自增字段冲突的问题已关闭评论

多MASTER自增字段冲突的问题

  You may know about the MySQL Cluster, which is a complex architecture to achieve high availability and performance. One of the advantages of MySQL Cluster is that each node is a peer to the others, whereas in a normal replicating system you have a master and many slaves, and applications must be careful to write only to the master.
  The main disadvantages of MySQL Cluster are (as of MySQL 5.0):
  The database is in memory only, thus requiring more resources than a normal MySQL database. (MySQL 5.1 introduces table spaces, with the capability of storing nonindexed data on disk.)
  Some normal features are not available, such as full-text searches, referential integrity, and transaction isolation levels higher than READ COMMITTED.
  There are some cases where the MySQL Cluster is the perfect solution, but for the vast majority, replication is still the best choice.
  Replication, too, has its problems, though:
  There is a fastidious distinction between master and slaves. Your applications must be replication-aware, so that they will write on the master and read from the slaves. It would be so nice to have a replication array where you could use all the nodes in the same way, and every node could be at the same time master and slave.
  There is the fail-over problem. When the master fails, it’s true that you have the slaves ready to replace it, but the process of detecting the failure and acting upon it requires the administrator’s intervention.
  Fixing these two misfeatures is exactly the purpose of this article. Using features introduced in MySQL 5.0 and 5.1, it is possible to build a replication system where all nodes act as master and slave at the same time, with a built-in fail-over mechanism.
  Setting Up a Multimaster Replication System
  For those of you not well acquainted with the replication basics, I can refer to an earlier article explaining MySQL replication, and the demanding reader can integrate with the dry but extensive official MySQL replication manual.
  Back to business. Consider the situation where you set up a replication system with more than one master. This has been a common scenario over the past several years. Chapters 7 and 8 of Jeremy Zawodny’s High Performance MySQL describe such a solution. At the time of the book’s publication, though, the necessary technology was not yet available.
  One hard-to-solve problem in a multimaster replication is the conflict that can happen with self-generated keys. The AUTO_INCREMENT feature is quite convenient, but in a replication environment it will be disruptive. If node A and node B both insert an auto-incrementing key on the same table, conflicts arise immediately.
  Rescue comes with recent versions. MySQL 5 introduces a couple of server variables for replicated auto-increment that address this specific problem and allow for the creation of an array of peer-to-peer nodes with MySQL replication.
  Quoting from the manual:
  auto_increment_increment controls the increment between successive AUTO_INCREMENT values.
  auto_increment_offset determines the starting point for AUTO_INCREMENT column values.
  By choosing non-conflicting values for these variables on different masters, servers in a multiple-master configuration will not use conflicting AUTO_INCREMENT values when inserting new rows into the same table. To set up N master servers, set the variables like this:
  Set auto_increment_increment to N on each master.
  Set each of the N masters to have a different auto_increment_offset, using the values 1, 2, … , N.
  Using those two variables as described in the manual, you can ensure that all nodes in your replication array will use different sequences of auto-incrementing numbers. For example, using auto_increment_increment = 10 and auto_increment_offset=3, the numbers generated when inserting three records will be 3, 13, 23. Using 10, 7, you’ll get 7, 17, 27, and so on.
  For my four-node array, I set auto_increment_increment to 10 for each node, and auto_increment_offset to 1 in the first node, 2 in the second, and so on.
  This is theoretically clear, but it still isn’t clear how I managed to transform these servers into peer-to-peer nodes.
  The answer is a circular replication, where each node is master of the following node and slave of the preceding one.
  Circular replication with two nodes
  In its simplest form, circular replication has two nodes, where each one is at the same time master and slave of the other (Figure 1).

  Figure 1. Circular replication between two nodes
  For this test, I used two servers in my company (water and air; there will soon be two more, named fire and earth). Their basic configuration is:
  # node A – (water) setup
  [mysqld]
  server-id = 10
  # auto_increment_increment = 10
  # auto_increment_offset = 1
  master-host = air.stardata.it
  master-user = nodeAuser
  master-password = nodeApass
  # node B – (air) setup
  [mysqld]
  server-id = 20
  # auto_increment_increment = 10
  # auto_increment_offset = 2
  master-host = water.stardata.it
  master-user = nodeBuser
  master-password = nodeBpass
  Notice the two magic variables in the configuration files. If you omit such variables (or comment them, as in this example), then something nasty may happen, and the unfortunate circumstances are easy to demonstrate. Remember that MySQL replication is asynchronous. It means that the replication process in the slave can happen at a different time than the one taking place in the master. This feature makes replication more resilient and ensures that even if you suffer a connection breakdown between master and slave, replication will continue when the slave connection resumes. However, this feature has a nasty side effect when you deal with auto-incremented values. Assume that you have a table like this:
  Create TABLE x (
  id int(11) NOT NULL AUTO_INCREMENT,
  c char(10) DEFAULT NULL,
  PRIMARY KEY (id)
  ) ENGINE=MyISAM DEFAULT CHARSET=latin1
  Assume also that the connection between node A and node B breaks for a moment. Suppose you issue an Insert statement in both servers, while the replication is not working and the auto_increment variables are not set:
  [node A] insert into x values (null, ‘aaa’), (null, ‘bbb’), (null, ‘ccc’);
  [node B] insert into x values (null, ‘xxx’), (null, ‘yyy’), (null, ‘zzz’);
  When replication resumes, you get a blocking error in both nodes:
  Error ‘Duplicate entry ‘1’ for key ‘PRIMARY” on query. Default database:
  ’test’. Query: ‘insert into x values (null, ‘aaa’)’
  The reason is easy to discover:
  [node A] select * from x;
  +—-+——+
  | id | c |
  +—-+——+
  | 1 | aaa |
  | 2 | bbb |
  | 3 | ccc |
  +—-+——+
  [node B] select * from x;
  +—-+——+
  | id | c |
  +—-+——+
  | 1 | xxx |
  | 2 | yyy |
  | 3 | zzz |
  +—-+——+
  Both nodes have produced the same primary keys. Thus, when replication resumed, the DBMS justly complained that there was a mistake. Now activate those two variables to see what happens.
  [node A] set auto_increment_increment = 10;
  [node A] set auto_increment_offset = 1;
  [node B] set auto_increment_increment = 10;
  [node B] set auto_increment_offset = 2;
  Clean the errors, delete all the records in the test table, and redo the insertion (after stopping the replication, to simulate a communication breakdown):
  [node A] SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; start slave;
  [node B] SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; start slave;
  [node A] truncate x;
  [node A] stop slave ;
  [node B] stop slave ;
  [node A] insert into x values (null, ‘aaa’), (null, ‘bbb’), (null, ‘ccc’);
  [node B] insert into x values (null, ‘xxx’), (null, ‘yyy’), (null, ‘zzz’);
  Now the situation is different.
  [node A] select * from x;
  +—–+——+
  | id | c |
  +—–+——+
  | 1 | aaa |
  | 11 | bbb |
  | 21 | ccc |
  +—–+——+
  [node B] select * from x;
  +—–+——+
  | id | c |
  +—–+——+
  | 2 | xxx |
  | 12 | yyy |
  | 22 | zzz |
  +—–+——+
  Thus, when replication resumes, there is no conflicting error. This proves it. Choosing appropriate values for the auto_increment_increment and auto_increment_offset server variables prevents conflicts between auto-generated keys in this circular replication setup. QED.

2009-05-25生活琐记

MYSQL 的 MASTER到MASTER的主主循环同步已关闭评论

MYSQL 的 MASTER到MASTER的主主循环同步

  刚刚抽空做了一下MYSQL 的主主同步。
  把步骤写下来,至于会出现的什么问题,以后随时更新。这里我同步的数据库是TEST
  1、环境描述。
  主机:192.168.0.231(A)
  主机:192.168.0.232(B)
  MYSQL 版本为5.1.21
  2、授权用户。
  A:
  mysql> grant replication slave,file on *.* to ‘repl1’@’192.168.0.232’ identified
  by ‘123456’;
  Query OK, 0 rows affected (0.00 sec)
  mysql> flush privileges;
  Query OK, 0 rows affected (0.00 sec)
  B:
  mysql> grant replication slave,file on *.* to ‘repl2’@’192.168.0.231’ identified
  by ‘123456’;
  Query OK, 0 rows affected (0.00 sec)
  mysql> flush privileges;
  Query OK, 0 rows affected (0.00 sec)
  然后都停止MYSQL 服务器。
  3、配置文件。
  在两个机器上的my.cnf里面都开启二进制日志 。
  A:
  user = mysql
  log-bin=mysql-bin
  server-id = 1
  binlog-do-db=test
  binlog-ignore-db=mysql
  replicate-do-db=test
  replicate-ignore-db=mysql
  log-slave-updates
  slave-skip-errors=all
  sync_binlog=1
  auto_increment_increment=2
  auto_increment_offset=1
  B:
  user = mysql
  log-bin=mysql-bin
  server-id = 2
  binlog-do-db=test
  binlog-ignore-db=mysql
  replicate-do-db=test
  replicate-ignore-db=mysql
  log-slave-updates
  slave-skip-errors=all
  sync_binlog=1
  auto_increment_increment=2
  auto_increment_offset=2
  至于这些参数的说明具体看手册。
  红色的部分非常重要,如果一个MASTER 挂掉的话,另外一个马上接管。
  紫红色的部分指的是服务器频繁的刷新日志。这个保证了在其中一台挂掉的话,日志刷新到另外一台。从而保证了数据的同步 。
  4、重新启动MYSQL服务器。
  在A和B上执行相同的步骤
  [root@localhost ~]# /usr/local/mysql/bin/mysqld_safe &
  [1] 4264
  [root@localhost ~]# 071213 14:53:20 mysqld_safe Logging to ‘/usr/local/mysql/data/localhost.localdomain.err’.
  /usr/local/mysql/bin/mysqld_safe: line 366: [: -eq: unary operator expected
  071213 14:53:20 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data
  5、进入MYSQL的SHELL。
  A:
  mysql> flush tables with read lock\G
  Query OK, 0 rows affected (0.00 sec)
  mysql> show master status\G
  *************************** 1. row ***************************
  File: mysql-bin.000007
  Position: 528
  Binlog_Do_DB: test
  Binlog_Ignore_DB: mysql
  1 row in set (0.00 sec)
  B:
  mysql> flush tables with read lock;
  Query OK, 0 rows affected (0.00 sec)
  mysql> show master status\G
  *************************** 1. row ***************************
  File: mysql-bin.000004
  Position: 595
  Binlog_Do_DB: test
  Binlog_Ignore_DB: mysql
  1 row in set (0.00 sec)
  然后备份自己的数据,保持两个机器的数据一致。
  方法很多。完了后看下一步。
  6、在各自机器上执行CHANGE MASTER TO命令。
  A:
  mysql> change master to
  -> master_host=’192.168.0.232′,
  -> master_user=’repl2′,
  -> master_password=’123456′,
  -> master_log_file=’mysql-bin.000004′,
  -> master_log_pos=595;
  Query OK, 0 rows affected (0.01 sec)
  mysql> start slave;
  Query OK, 0 rows affected (0.00 sec)
  B:
  mysql> change master to
  -> master_host=’192.168.0.231′,
  -> master_user=’repl1′,
  -> master_password=’123456′,
  -> master_log_file=’mysql-bin.000007′,
  -> master_log_pos=528;
  Query OK, 0 rows affected (0.01 sec)
  mysql> start slave;
  Query OK, 0 rows affected (0.00 sec)
  7、查看各自机器上的IO进程和 SLAVE进程是否都开启。
  A:
  mysql> show processlist\G
  *************************** 1. row ***************************
  Id: 2
  User: repl
  Host: 192.168.0.232:54475
  db: NULL
  Command: Binlog Dump
  Time: 1590
  State: Has sent all binlog to slave; waiting for binlog to be updated
  Info: NULL
  *************************** 2. row ***************************
  Id: 3
  User: system user
  Host:
  db: NULL
  Command: Connect
  Time: 1350
  State: Waiting for master to send event
  Info: NULL
  *************************** 3. row ***************************
  Id: 4
  User: system user
  Host:
  db: NULL
  Command: Connect
  Time: 1149
  State: Has read all relay log; waiting for the slave I/O thread to update it
  Info: NULL
  *************************** 4. row ***************************
  Id: 5
  User: root
  Host: localhost
  db: test
  Command: Query
  Time: 0
  State: NULL
  Info: show processlist
  4 rows in set (0.00 sec)
  B:
  mysql> show processlist\G
  *************************** 1. row ***************************
  Id: 1
  User: system user
  Host:
  db: NULL
  Command: Connect
  Time: 2130
  State: Waiting for master to send event
  Info: NULL
  *************************** 2. row ***************************
  Id: 2
  User: system user
  Host:
  db: NULL
  Command: Connect
  Time: 1223
  State: Has read all relay log; waiting for the slave I/O thread to update it
  Info: NULL
  *************************** 3. row ***************************
  Id: 4
  User: root
  Host: localhost
  db: test
  Command: Query
  Time: 0
  State: NULL
  Info: show processlist
  *************************** 4. row ***************************
  Id: 5
  User: repl2
  Host: 192.168.0.231:50718
  db: NULL
  Command: Binlog Dump
  Time: 1398
  State: Has sent all binlog to slave; waiting for binlog to be updated
  Info: NULL
  4 rows in set (0.00 sec)
  如果红色部分没有出现,检查DATA目录下的错误文件。
  8、释放掉各自的锁,然后进行插数据测试。
  mysql> unlock tables;
  Query OK, 0 rows affected (0.00 sec)
  插入之前两个机器表的对比:
  A:
  mysql> show tables;
  +—————-+
  | Tables_in_test |
  +—————-+
  | t11_innodb |
  | t22 |
  +—————-+
  B:
  mysql> show tables;
  +—————-+
  | Tables_in_test |
  +—————-+
  | t11_innodb |
  | t22 |
  +—————-+
  从A机器上进行插入
  A:
  mysql> create table t11_replicas
  -> (id int not null auto_increment primary key,
  -> str varchar(255) not null) engine myisam;
  Query OK, 0 rows affected (0.01 sec)
  mysql> insert into t11_replicas(str) values
  -> (‘This is a master to master test table’);
  Query OK, 1 row affected (0.01 sec)
  mysql> show tables;
  +—————-+
  | Tables_in_test |
  +—————-+
  | t11_innodb |
  | t11_replicas |
  | t22 |
  +—————-+
  3 rows in set (0.00 sec)
  mysql> select * from t11_replicas;
  +—-+—————————————+
  | id | str |
  +—-+—————————————+
  | 1 | This is a master to master test table |
  +—-+—————————————+
  1 row in set (0.00 sec)
  现在来看B机器:
  mysql> show tables;
  +—————-+
  | Tables_in_test |
  +—————-+
  | t11_innodb |
  | t11_replicas |
  | t22 |
  +—————-+
  3 rows in set (0.00 sec)
  mysql> select * from t11_replicas;
  +—-+—————————————+
  | id | str |
  +—-+—————————————+
  | 1 | This is a master to master test table |
  +—-+—————————————+
  1 row in set (0.00 sec)
  现在反过来从B机器上插入数据:
  B:
  mysql> insert into t11_replicas(str) values(‘This is a test 2’);
  Query OK, 1 row affected (0.00 sec)
  mysql> select * from t11_replicas;
  +—-+—————————————+
  | id | str |
  +—-+—————————————+
  | 1 | This is a master to master test table |
  | 2 | This is a test 2 |
  +—-+—————————————+
  2 rows in set (0.00 sec)
  我们来看A
  A:
  mysql> select * from t11_replicas;
  +—-+—————————————+
  | id | str |
  +—-+—————————————+
  | 1 | This is a master to master test table |
  | 2 | This is a test 2 |
  +—-+—————————————+
  2 rows in set (0.00 sec)
  好了。现在两个表互相为MASTER。

2009-05-24技术合集

BIOS下的TELNET后门代码已关闭评论

BIOS下的TELNET后门代码

  该项目仅为实验性项目,主要目的是想隐藏一个Telnet后门在主板的BIOS内,并让其随着计算机系统及操作系统成功的运行起来。运行后能反向Telnet连接到指定的计算机接受控制。
  项目涉及的相关知识及技术目录
  1、实验环境,使用bochs调试工具。
  2、刷新BIOS技术问题。
  3、代码植入BIOS问题。
  4、源代码相关技术问题:
  A、如何编写BIOS模块(如:PCI、ISA)。
  B、实模式关于HOOK磁盘中断的问题。
  C、磁盘中断中选择再次HOOK的问题。
  D、NT保护模式下设置物理地址映射。
  E、NT保护模式下线性地址寻址问题。
  BIOS模块调试实验环境采用Bochs
  Bochs虚拟机可以调试BIOS及操作系统,Bochs使用主要是配置它的配置文件,我们以实例配置文件简单讲解,Bochs实验调试等网上有很多相关文章,这里简单讲解。
  我的配置实例:文件名xp.bxrc,修改后的及需要设置的内容如下:
  ######使用的系统BIOS模块######
  romimage:file=$BXSHARE/BIOS-bochs-latest
  ######使用的CPU相关参数######
  cpu:count=1,ips=10000000,reset_on_triple_fault=1
  ######设置内存大小######
  megs:128
  ######添加我们的BIOS模块######
  optromimage1:file=test.bin,address=0xd0000
  ######使用的VGAROM模块######
  vgaromimage:file=$BXSHARE/VGABIOS-lgpl-latest
  ######设置虚拟机硬盘与光盘######
  ata0-master:type=disk,path=”c.img”,mode=flat,cylinders=4161,heads=16,spt=63
  #ata0-slave:type=cdrom,path=”xp.iso”,status=inserted
  ######设置引导设备######
  boot:c
  #boot:cdrom,diskBochs调试加载配置文件方法:可以设置一个bat文件,如下内容:
  setBXSHARE=d:\bochs
  %BXSHARE%\bochsdbg.exe-q-fxp.bxrc
  如何刷新各种BIOS问题
  各种BIOS刷新相关工具早已在网上流传,工具的使用这里不作介绍,IcLord的作者已经给出很多编程方法实现。这里简单说下。
  UniFlash开源项目我也详细分析过,如果有必要我会给出UniFlash源代码的详解,该项目指出可以刷写所有BIOS芯片,但是该项目刷新BIOS存在很多问题,绝大多数情况是无法刷新的我实验过很多次,也尝试修改他的代码过很多次,没找到原因。
  AwordBIOS已经有通用的刷写API调用,不管在NT下还是在实模式下,IcLord也作了讲解。如果有时间我会给出实模式及NT下的刷写源代码及分析。
  代码植入BIOS问题
  关于网上提及的,IcLord讲到的我就不再做重复的分析。这里主要讲下我们的模块可以植入哪些地方以方便隐藏。以前的教程讲过的方法存的问题分析。
  一、ISA模块形式植入:这种方式只适合于较早的计算机,因为目前的计算机系统BIOS是不会加载ISA模块的。故只能做实验调试用的方法。
  二、PCI模块形式植入:该方法虽然系统BIOS都要加载PCIROM,但是系统BIOS只加载实际存在的PCI卡的ROM模块。而且通常BIOS设置中可以
  关闭相应的ROM启动。
  三、HOOKBootBlock或者说要启动的模块:该方法当然我认为是最有效的,但是又存在很多技术上的难题。检验和问题,不同BIOS的结构问题,过早的HOOK还存在再次获取CPU运行机会问题等等。
  本人实验过以上提及的所有方法,我认为HOOKPCI、VGA及相关启动模块是比较可寻的办法。为什么?一般这类的ROM模块是必须启动的,而且调试发现一般它的ROM本身代码用不完自身设置的大小,我们可以借助剩余大小隐藏我们的代码。例如:集成显卡会把显卡ROM集成到系统BIOS模块中,我们可以对该模块进行HOOK,修改ROM头部的跳转指令,跳到我们的代码开始处执行,我们的代码执行完后跳转到它的代码开始处执行。
  如何编写BIOS模块
  BIOS是分模块组合在一起的。这里对PCI及ISA模块作下简单分析,VGA模块跟PCI模块几乎一样。模块主要是头部有个规范,该规范适合所有BIOS系统。具体可以参看《PCI系统结构》及其他书籍。
  源代码实例可以参看国外ROMOS开源项目,该开源项目的思想很值得学习。该项目讲解了如何在BIOS中嵌入一个小型DOS,如:FreeDos。采用了把整个DOS系统盘镜像植入BIOS中,跟早期的PXE引导DOS机制类似,然后HOOK磁盘中断,模拟DOS系统盘镜像出一个盘,源代码编译后只有900多字节。这种思想在早期还是很值得学习的。
  实模式关于HOOK磁盘中断问题
  很早前就有业界内人士发贴问,为什么在我的ROM模块中HOOK磁盘中断会失败呢?关于这个问题现在目前网上已经有人作出过回答,国外的开源项目在2003年我都看到过。
  由于我们的ROM模块过早的运行,可能运行在磁盘服务前面了,这时如果HOOKInt13h会因为BIOS加载磁盘服务时重写Int13hIVT值,故我们设法HOOK其他服务,这个服务要求较早被BIOS安装且不会再次修改且加载操作系统前调用,最佳的这个服务选择就是int18h、int19h服务。可以参看
  BIOS源代码,也可以参看PXESDK说明文档略有讲过。
  我们的磁盘服务代码建议放在实模式高端内存,通过BIOS数据区域可修改,内存40:13,即物理地址413h处的值。降低常规内存值,高端的内存就留给我们用。我们的保护模式下运行的代码建议也放在这段内存,且要求放在以页基址开始的内存中,以便后面代码的页映射我们的保护模式代码物理页。页基址:内存物理页地地址开始的低12位为零,参看《80386保护模式教程》。
  若我们的代码直接在内存的ROM映射区内,可能导致在NT下访问不到我们的代码,因为NT内核加载程序ntldr可能不会映射该段内存,甚至可能BIOS在使用后都会关闭ROM区域这段内存,而且ROM区域这段内存在初始化后被系统BIOS设置成只读不能写。当然我们可以采取用int15h服务对ROM区域这段内存映射。
  当然也可以在NT启动过程中,在我们的磁盘服务中对想映射的内存都映射。由于代码大小的限制,故有些没必要的代码。尽量不使用了。
  磁盘中断服务中再次HOOK问题
  为了使我们的程序再次获得CPU运行机会,我们不得不得再次设法。调试发现NTLDR进入保护模式后在加载NT内核文件时,会切换CPU到实模式调用Int13H服务进行磁盘读。
  我们挂接磁盘服务就是为了截取NTLDR的读操作,这里我们可以HOOK或者修改NTLDR另一部分OsLoader的代码,跳转到我们的代码执行。当然也可以直接HOOKntosknrl导出的服务,参看我在2008.4.1发布的”程序从DOS/BIOS驻留内存到WINNT下监视内存数据”。
  注意,HOOKOsLoader的代码时选择HOOK指令问题,由于NTLDR切换到实模式读取数据,读完后会在保护模式下搬移数据到规划位置,进行内核的安装。故HOOK时选择HOOK指令就选择FFh/15h:使用CALLNEAR[OFS32]指令进行,该指令寻址采用绝对地址,类似指令也可以。
  当然我们的代码再次运行就会运行在OsLoader代码被我们HOOK处,调用我我们的代码执行,这时我们的代码运行环境:DS=ES=10h保护模式段,内存模式:FLAT。在这里我们可以通过扫描_BlLoaderData数据结构,获取NTOSKRNL镜像基址。
  可以通过PE搜索NTOSKRNL导出的API,可以参看网上相关教程。现在再次HOOKNTOSKRNL导出函数KeAddSystemServiceTable,HOOK该函数
  可以截获win32k.sys添加它自己的服务,以便我们再再次HOOkwin32.sys导出函数NtUserRegisterClassExWOW。HOOK该函数可以截取所有应用层程序注册窗口类,以便我们再再再次HOOK窗口类过程。这时我们的代码就运行在NT的应用层模式下。
  NT保护模式下设置物理地址映射
  先看一个WinDbg实例关于在我们的磁盘服务中获取CR3值修改页映射的分析,以前我的分析内容:
  NT内核被加载高端的2GB内存(80000000h~0ffffffffh)。参看NT内存安排..
  a、win2kadvser:WINDBG看到NTKernelbase=0x80400000也就是NTOSKRNL.exe加载位置
  kd>r@cr3;断点位置在NTOSKRNL.exe里现在还没有应用程序故低端内存还未使用
  cr3=00030000;->页目录表所在物理页(物理地址30000h)
  kd>d8003000080030800;看页目录发现现在低端2GB(0~80000000h)还未分配
  800300000000000000000000-0000000000000000…………….
  800300100000000000000000-0000000000000000…………….
  800300200000000000000000-0000000000000000…………….
  kd>d80030800;看高端开始分配情况页表(80000000h开始的分配情况)
  800308006321030063410300-6351030063310300c!..cA..cQ..c1..
  8003081063117c0063217c00-63317c0063417c00c.|.c!|.c1|.cA|.
  8003082063517c0063617c00-63717c0063817c00cQ|.ca|.cq|.c.|.
  ;实例1:看80400000h(NTKernelbase),这个线性地址到物理地址映射情况.
  ;线性地址最高10位页目录项(每项占4Byte):80400000h最高10位=201h.
  ;在页目表位置:201h*4=804h在内存地址=[cr3]+804h..具体看保护模式教程
  kd>d80030000+804;看在页目录表位置的值
  800308046341030063510300-6331030063117c00cA..cQ..c1..c.|.
  ;二级页表所在物理页地址:63410300转换下34163h,物理页地址:34000h,163h是页属性.
  kd>d80034000;看在页表的值
  800340006301400063114000-6321400063314000c.@.c.@.c!@.c1@.
  ;物理地址基址:63014000转换下400163h,#物理地址基址#:400000h,163h是页属性
  ;最后发现物理地址基址(页地址)在400000h..观察物理地址400000h是NTOSKRNL.exe映像.
  kd>d80400000;观察物理地址400000h
  804000004d5a900003000000-04000000ffff0000MZ…………..
  80400010b800000000000000-4000000000000000……..@…….
  ;实例2:看我们代码映射情况我们代码在物理地址:9e000h从线性地址8009e000h分析映射情况
  ;8009e000h在页目录位置最高10位=200h*4,在内存地址=[CR3]+200h*4…
  kd>d80030000+200*4
  800308006321030063410300-6351030063310300c!..cA..cQ..c1..
  ;二级页表对应物理地址:63210300转换下物理页基址=32000h,163是页属性
  ;8009e000h所在二级页表位置:32000h+9eh*4(8009e000h线性地址12~22的位)…
  kd>d80032000+9e*4
  8003227823e1090003f10900-03010a0003110a00#……………
  ;物理地址基址(页基址):23e10900转换下09e000h,123是页属性..
  ;#实例3:Windows运行起后用的页目录表线性地址:0c0000000h映射到物理地址情况.
  kd>d80030000+c00;计算略.页目录表位置,观察发现指向自己的…
  80030c00670003006300f017-000000006331a902g…c…….c1..
  b、winXP:WINDBG看到Kernelbase=0x804d8000PsLoadedModuleList=0x8055b420
  kd>r@cr3;断点位置在NTOSKRNL.exe里现在还没有应用程序故低端内存还未使用
  cr3=00039000;->页目录表所在物理页(页目录物理地址30000h)
  kd>d8003900080039800;看页目录发现现在低端2GB(0~80000000h)还未分配
  800390000000000000000000-0000000000000000…………….
  kd>d80039800;看高端开始分配情况页表(80000000h开始的分配情况)
  80039800e9b900f606a10810-751bf606a3081075……..u……u
  ;实例1:看我们代码映射情况我们代码在物理地址:9e000h从线性地址8009e000h分析映射情况
  ;8009e000h在页目录位置最高10位=200h*4,在内存地址=[CR3]+200h*4…
  kd>d80039000+200*4
  8003980063b10300e3014000-63e10300e3010001c…..@.c…….
  ;二级页表对应物理地址:63b10300转换下物理页基址=3b000h,163是页属性
  ;8009e000h所在二级页表位置:3b000h+9eh*4(8009e000h线性地址12~22的位)…
  kd>d8003b000+9e*4
  8003b27803e1090003f10900-03010a0003110a00…………….
  ;物理地址基址(页基址):03e10900转换下09e000h,103是页属性..
  ———>;*#实例2:手工修改分页让物理地址映射到线性地址,WINXP.80000000hBIOS/DOS向量区没映射.#*
  kd>d80000000;可看到现在没映射的情况,无法通过线性地址访问.
  80000000????????????????-????????????????????????????????
  80000010????????????????-????????????????????????????????
  ;80000000h的最高10位确定在页目录表位置=200h*4=800h.在页目录物理地址:[cr3]+800h
  kd>d80039000+200*4;可发现二级页表已映射(63b10300)页属性163.物理地址(页)3b000h
  8003980063b10300e3014000-63e10300e3010001c…..@.c…….
  ;80000000h的12~22位次高10位确定在二级页表位置:物理地址3b000h+0*4
  kd>d8003b000;观察发现确实没映射.全0.注意:一个页项占4字节…
  8003b0000000000000000000-0000000000000000…………….
  ;修改成让它对应物理地址:000就可以,只修改允许访问就可以.也就是byteptr[8003b000]=63
  kd>e8003b00063
  kd>d8003b000;修改成功
  8003b0006300000000000000-0000000000000000c……………
  ;观察修改后的情况.;注意:要想设置生效.让WINDBG执行下G.让0C0000000等cr3被改等..
  kd>g;让系统自动刷新TLB等寄存器….
  kd>d80000000
  8000000053ff00f053ff00f0-c3e200f053ff00f0S…S…….S…
  ;#实例3:Windows运行起后用的页目录表线性地址:0c0000000h映射到物理地址情况.
  kd>d80039000+c00;计算略.页目录表位置,观察发现指向自己的…
  80039c00679003006300f00f-000000006331e201g…c…….c1..
  c、分析以上总结:发现最开始获取的cr3值一直在用。
  故我们修改页项的效果会在windows运行后也生效通过以上的实例分析可以看出NT系统的页映射情况。
  进入保护模式之后这个CR3的值也就是页目录表位置被映射到了虚拟地址0c0000000h。
  上面调试的实例页目录表地址就可以直接使用这个虚地址。例如:在我们的代码中把我们的代码拷贝到SharedUserData空间未使用处去,就使用了页映射代码,直接修改第一个页指向的物理页,就是我们代码所在的物理页。
  NT保护模式下线性地址寻址问题
  关于我们的代码进入保护模式以后,所有指令的寻址问题,这里作一下分析。当我们代码第一个在保护模式下执行的指令,是前面提到的磁盘服务中对OsLoader的代码进入HOOK,也提到了采用什么样的HOOK指令以便寻址。
  接哪之后,我们的代码就开始运行在保护模式未分页情况下,我们采取的方法是把我们的代码拷贝到SharedUserData空间未使用处,涉及到拷贝的指令也必须运行在保护模式分页下,因为SharedUserData空间是一个虚地址。
  在这里我们采用了把我们的拷贝代码指令搬移到NTOSKRNL镜像的MZ与PE之间的区域,设置HOOKNTOSKRNL导出函数KeAddSystemServiceTable首先跳转到拷贝指令执行,HOOKNTOSKRNL导出函数KeAddSystemServiceTable采用相对跳转指令它们在同一个空间。
  当我们的拷贝指令把我们的代码拷贝到SharedUserData空间未使用处之后,我们的代码就有一个固定的虚地址,所有后续指令都可以采用这个虚地址进行寻址。

2009-05-23技术合集

NIS详解已关闭评论

NIS详解

  网络信息服务(NIS)是集中控制几个系统管理数据库的网络用品。NIS简化了UNIX和LINUX桌面客户的管理工作,客户端利用它可以使用中心服务器的管理文件。桌面系统的用户无需建立他们自己的/etc/passwd,他们只简单的使用维护在NIS服务器的文件即可。
  提到NIS不得不先说明一下WINDOWS2000的域控制器,在局域网内有一台WIN2000域控制器,下面有一些机器加入到这个域中,在下的机器登录时,有一个选项是选择登入到本机还时登入到域内(应该是这么说的,有点记不清楚了,大概就是这个了),登入本地的密码有本机控制,但是如果登入域内,密码支有域控制器负责管理。
  LINUX也是操作系统,跟WIN2000没有本质的区别,所以仔细读上段话,就能理解NIS是原理是什么样了,这时出现了一个重要的文件/etc/nsswitch.conf
  NIS是一个客户机/服务器系统,ypbind是定义NIS服务器的客户端进程。一旦确定了服务器位置,客户机绑定到了服务器上,所以客户端的住处查询都发往服务器。ypserv是回答客户端查询的服务器进程。
  安装ypbind客户端
  rpm -ivh ypbind*
  这没有什么好说的。
  配置NIS客户端
  进程ypbind这客记机的NIS域定位服务器,NIS域包括所有NIS服务器和客户机。它与DNS不同,尽管有些管理员将NIS域名等同于DNS的域名。NIS域名只对那NIS服务器和客户机起作用。
  有两种方式配置NIS域名:
  nisdomainname 定义显示NIS域名
  yp.conf文件配置NIS域名。
  #nisdomainname gogo
  #nisdomainname
  gogo
  默认地,ypbind使用nisdomainname命令返回NIS域名,向NIS服务器发出请求时在网络内广播该地址。
  yp.conf文件
  /etc/yp.conf定义了yp.conf配置。如果找不到yp.conf文件,ypconf进程使用nisdomainname 命令返回的NIS域名,广播定位NIS服务器。ypbind将绑定到第一个相应请求的服务器上。
  ypserver hostname
  domain nisdomain broadcast | server hostname
  ========
  hostname,nisdomain字符为变量。
  使用ypserver配置选项为客户机指定服务器。yp.conf文件包括ypserver选项时,客户机使用命令nisdomainname返回的NIS域名,向ypserver命令的hostname字段指定的服务器发出请求。/etc/hosts文件中必须包含该主机的IP地址,还记得我说过什么了吗,DNS是取代的HOSTS的,在DNS中设定也是可以的。ypserver选项强制客户机连接到特定的服务器上。
  在yp.conf文件中使用domain选项定义了NIS域名,指出客户机是广播定位还是直接向服务器发送请求。
  example:
  #/etc/yp.conf
  #
  domain first server jh
  =========
  first作为域名,jh是这个域的服务器 jh在hosts中必须有相对应的IP地址
  或者jh IN A 192.168.1.1还记得这条指令是干什么的吗?
  ------------------------
  创建NIS服务器
  安装ypserv
  rpm -ivh ypserv*
  -----------
  NIS服务器提供的数据库,称为NIS映射表.
  创建独立服务器
  如果用户只有一个NIS域服务器,建立独立服务器,如果用户NIS域中有多个服务器,就需要选择其中一个作为该域的主服务器。其他作为从服务器。
  用户可以使用make命令初始化独立服务器,建立NIS映射表,文件/var/yp/Makefile包含了创建数据库的命令。
  example:
  #nsidomainname first
  #cd /var/yp
  #make
  gamke[1]:Entering directory ‘/var/yp/terns’
  Updateing passd.byname……
  Updateing passwd.byuid…….
  …………
  ……..
  …..
  …
  ---------
  创新主从服务器
  使用ypinit命令初始化主服务器,常见NIS映射表。默认地.ypinit同make命令给出的操作一样。要创建相对于从服务器的主服务器,用户需要编辑/var/yp/Makefile文件。在Makefile文件中找到NOPUSH设置为NOPUSH=false.
  修改后,运行ypinit -m
  exmpale:
  #nisdomwiname first
  #cd /var/yp
  #/usr/lib/yp/ypinit m
  ………..
  next host to add:1111.first.myhome.com
  next host to add:2222.first.myhome.com
  …………..
  …………
  …………..
  is this correct? [y/n]y
  ……….
  ………
  updateing passwd.byname………
  ………….
  ……….
  ………..
  从服务器配置比主服务器简单。主服务器保存了所有的映射表。从服务器只需知道哪个是主服务器即可。ypinit -s 配置从服务器。
  example:
  #/usr/lib/yp/ypinit -s salve
  salve的IP地址也必须保存在hosts中。
  ----------
  安全性
  用户可以在/var/yp/securenets文件中定义服务器的安全性能。
  example:
  255.255.255.0 192.168.1.0
  授权192.168.1.0子网的用户可以访问服务器。
  —————–
  ypserv.conf文件
  用户必须使用securenets文件,未必用ypserv.conf定义安全性。
  语法如下:
  host:map:security:[mangle[]]
  字段如下
  host 授权或禁止访问的计算机,它由地址/掩码对确定.例如 192.168.1.0/255.255.255.0 . *表示所有主机
  map 该字段表示访问的NIS映射表项名称。例如:passwd.byuid。*表示映射表   中所有的字段都可用。
  security 授权访问类型
  none 允许访问,不加强安全性。
  port 允许特权端口访问。只接收源端口小于1024的连接。
  deny 禁止访问。
  des 访问时需要数字加密标准(DES)认证。
  [mangle[]] 指定应该在发出响应之前用”X”覆盖掉的字段(不明白)
  example:
  # Host : MAP : Security : mangle
  192.168.1.0/255.255.255.0 : * :none :no
  * :* :deny :no
  启动服务器
  /etc/init.d/ypserv restart
  启动NIS客户端
  /etc/init.d/ypbind restart
  测试NIS
  NIS客户端应该绑定到服务器。ypwhich命令可以检测客户端是否正确的连接到服务器。
  如果客户机正确的绑定到服务器,用ypcat检测服务器提供的信息。
  NIS与DNS是两会事,大家一定要搞清楚。虽然都有可能涉及到域名。但确实是两会事,他们之间会有一些连系。但绝不可以混在一起。切记,切记。
  ====================================
  nsswitch.conf文件
  nsswitch.conf文件不仅能处理主机表和DNS之间的优先次序,还能处理其它的问题。它为几个不同的系统管理数据库定义来源(多看几篇这句话,”几个不同的系统管理数据库”,可以是DNS,NIS,大家想一想)
  由nsswitch.conf控制的数据库
  alias EMAIL别名
  ehters 用于RARP的以太网地址。
  hosts   主机名和IP地址
  password 用户帐号信息。
  还有许多,没有列出来。
  使用不带NIS的nsswitch.conf example:
  password: files
  shadow: files
  ………..
  hosts: dns files
  #这句很重要,dns在先,files在后,这里的files指的是/etc/hosts文件,如果有客户端查询的时候,先找dns,再找files。顺序很重要。
  aliases: files
  ………
  ………
  ………
  使用带NIS的nsswitch.conf example:
  hosts: files nis dns
  protocols: nis files
  ………
  ……..
  ……..
  控制选择过程
  nsswitch.conf文件提供了几个可用于查询测试的状态关键字:
  success(成功) 查询返回所期望的结果。该状态的缺省的动作是返回结果给提交查询的应用程序(想一下,在我的DNS第二讲,说到解析器,就可以是提交查询的应用程序,不过他是DNS查询是了),然后退出查询过程。
  nofound(没有找到) 虽然查询工作正常,但所期望值没有找到。缺省的动作是查询下一行的源。
  unavail(不可用) 提交查询的源不可用。例,名称服务器没有运行。
  tryagain(重度) 源暂时不可用。缺省的动作是继续向下一个源提交查询。
  有两个关键字可以识别缺省的动作:return和continue。return告诉解析器返回值给应用程序并结束查询。continue告诉解析器继续向下一个源提交查询。
  状态和动作关键字可以结合起来,加到nsswitch.conf文件的源单中,以控制查询过程何时移到下一个源。
  状态检查的语法是:
  [ ( ! ? status=action ) + ]
  问号(?)代表任何状态值;叹号(!)对状态值取反。!SUCCESS是不成功的意思。方括号”[]”用于包括整个条件语句。圆括号”()”是可选的,只用来包含每个测试条件,可以有多个条件,每个条件用圆括号包含,之间用加号连接。
  例如:
  [ ( NOFOUND=RETURN ) + ( TRYAGAIN+TRETURN) ]
  其实就是C语言中的”与””或””非”的关系。
  下面是nsswitch.conf中的主机一行:
  hosts: dns [ !UNAVAIL=return ] files
  说明了UNAVAIL之外的所有状态,解析器应该将返回值给应用程序,然后退出。
  只有当DNS名称服务器没有运行的时候,解析器才能向主机表查询。如果有条件语句改变,缺省的动作卞会起作用,UNAVAI的缺省动作是continue。
  nsswich.conf文件已经取代了hosts.conf,因为它可以提供更多的资源控制方式。LINUX系统中通常这两个文件都有,但实际上起作用的是nsswitch.conf文件。
  hosts.conf文件介绍在我的DNS第三讲中有介绍

2009-05-22技术合集

vsftp配置实例已关闭评论

vsftp配置实例

  配置vsftp,使匿名用户只能下载,用户ftpup则可以上传和下载.
  以下操作均以root身份完成
  安装:
  rpm -ivh vsftpd-2.0.1-5.EL4.3.x86_64.rpm
  1.建立ftpup用户和ftpup组,将系统用户ftp加入ftpup组
  gropuadd ftpup
  useradd ftpup -g ftpup
  2.建立ftp服务目录:
  mkdir /var/incoming
  chmod 755 /var/incoming
  chown ftpup /var/incoming
  chgrp ftpup /var/incoming
  3.修改/etc/vsftpd/vsftpd.conf为如下内容:
  anonymous_enable=YES
  local_enable=YES
  write_enable=YES
  local_umask=022
  dirmessage_enable=YES
  xferlog_enable=YES
  connect_from_port_20=YES
  xferlog_std_format=YES
  chroot_list_enable=YES
  chroot_local_user=NO
  chroot_list_file=/etc/vsftpd.chroot_list
  pam_service_name=vsftpd
  userlist_enable=YES
  userlist_deny=NO
  listen=YES
  tcp_wrappers=YES
  anon_root=/var/incoming
  local_root=/var/incoming
  4.修改/etc/vsftpd.ftpusers为如下内容
  root
  bin
  daemon
  adm
  lp
  sync
  shutdown
  halt
  mail
  news
  uucp
  operator
  games
  nobody
  5.修改/etc/vsftpd.chroot_list为如下内容
  ftpup
  6.修改/etc/vsftpd.user_list为如下内容
  ftpup
  anonymous

2009-05-21技术合集

Exchange的备份与恢复已关闭评论

Exchange的备份与恢复

  一. Exchange的备份与恢复概谈
  Exchange备份分为联机备份和脱机备份两种。顾名思义,当运行exchange时执行的备份为联机备份,这类备份往往需要支持exchange的程序来完成,如NTBACKUP以及第三方备份软件针对exchange的数据库提供的解决方案。这类程序按逻辑备份数据,也就是说,备份所有与信息存储相关的数据和所有与目录服务相关的数据。脱机备份则是在服务停止时执行的文件级的备份。
  联机备份
  Exchange 支持四种类型的联机备份:常规或完全、复制、增量和差异。常规备份先备份您的数据库文件,然后备份事务日志文件,之后再从目录中删除事务日志文件。这意味着您可禁用循环日志记录,因为您的备份软件会删除日志文件。因此如果执行常规备份,您就不会遇到日志文件充满驱动器的问题。要还原常规备份,只需要还原上次常规备份集并启动该服务即可。
  增量备份只作用于日志文件,因此仅适用于禁用循环日志记录的情况。象常规备份一样,增量备份也会在备份后将日志文件清除。因此,它提供了在不损害可恢复性的情况下去掉日志文件的另一种方法。要还原增量备份,必须返回到上次常规备份集(其中包含您的数据库文件)。还原这些数据库文件,再还原常规备份后的每个增量备份集,然后启动该服务。请注意,只有当您还原所有的备份集之后,才能启动该服务,否则在备份集之后还原的任何日志都不能向前运行。
  象增量备份一样,差异备份也作用于日志文件,因此若要使用它,就必须禁用循环日志记录。然而与增量备份不同的是,差异备份不删除日志文件。要还原差异备份集,请返回到上次常规备份并还原您的差异备份集(它包含上次常规备份后产生的所有日志文件)。使用增量备份时,只有当您还原了所有的备份集之后,才能启动该服务。
  脱机备份
  任何备份软件都可以执行脱机备份。不过,在还原时脱机备份不能象对应的联机备份一样自动放出所有日志文件。因此,Microsoft 不推荐使用脱机备份进行每日备份。但是,当联机备份失败后,脱机备份就非常重要。
  恢复
  恢复数据的方式取决于您是返回到联机备份还是返回到脱机备份,而还原联机备份比还原脱机备份要容易一些。在每日常规备份中,您只是简单地还原上次常规备份并启动该服务。在常规加增量备份中,您将还原上次常规备份和所有增量集并启动该服务,而 Exchange 会放出所有日志文件。在常规加差异备份中,您将还原上次常规备份,还原上次差异备份,并启动该服务。
  在脱机备份中,您将执行还原目录服务的一个步骤和还原信息存储的另一个步骤。对于目录服务,应还原 DSADATA 目录,必要时使用 Windows NT 注册表在各个不同的驱动器上找到多个 DSADATA 目录。然后,启动该服务。对于信息存储,应还原 MDBDATA 目录(其位置也出现在注册表中),然后运行 Microsoft Exchange Server 下 bin 目录中的 ISINTEG.EXE 程序,并给此程序提供 -patch 命令行选项。然后,停止该服务,它自己应当再次启动。
  二. 如何做
  ü 联机备份
  要使用”备份向导”对 Exchange Server 计算机执行联机备份
  单击开始,指向程序,指向附件,指向系统工具,然后单击备份。或者,在命令提示符处键入 ntbackup。
  在”要备份的内容”对话框中,选择”备份选定的文件、驱动器或网络数据”,然后单击下一步。这将启动联机备份。
  在”要备份的项目”对话框中,展开 Exchange Server 树,选择单位中要备份的任何或所有 Exchange Server 计算机,然后单击下一步。
  备注:您不能选择词语”Microsoft Exchange”旁边变灰的框。必须双击 Microsoft Exchange 或单击加号 (+) 展开 Exchange Server 树。您可以将此树向下展开到任何服务器的目录或信息存储区。
  确认”备份媒体或文件名”框中列出的文件是您要将数据备份到的文件,然后单击下一步。
  单击完成继续进行备份。
  要不使用向导备份 Exchange Server 计算机,请按照以下步骤操作:
  单击开始,指向程序,指向附件,指向系统工具,然后单击备份。或者,在命令提示符处键入 ntbackup。
  在”欢迎使用 Windows 2000 备份及故障恢复工具”对话框中,单击备份选项卡,然后展开 Microsoft Exchange 树。选择单位中要备份的任何或所有 Exchange Server 计算机。备注:您无法选择词语”Microsoft Exchange”旁边变灰的框。您必须双击 Microsoft Exchange 或单击加号 (+) 展开 Exchange Server 树。您可以将此树向下展开到任何服务器的目录或信息存储区。
  确认”备份媒体或文件名”框中列出的文件是您要将数据备份到的文件,然后单击开始备份。
  验证备份作业信息对话框中的信息,然后单击开始备份.
  ü 脱机备份与恢复
  检查工作:
  确定是否为存储组启用循环日志(不要启用)。(exchange系统管理器>存储组->属性->通用,不钩选启用循环日志。)
  确定 Exchange 数据库、流、事务日志和检查点文件的路径位置以及存储组的日志文件前缀。(exchange系统管理器>存储组->属性->通用,记录日志文件前缀(E0n),事务日志位置 (E0n*.log)系统路径位置 (E0n.chk), 数据库路径列在每个 database_name 对象的 Database 属性中,*.stm,*.edb)
  Dismount 要备份的数据库。
  脱机备份
  1. 验证验证数据库文件(.edb 和 .stm 文件)一致且相互匹配。为此,请对每个文件运行以下命令
  eseutil /mh database(*.edb) file | find /i “DB Signature”
  eseutil /mh database file (*.stm)| find /i “DB Signature”
  若两个文件DB签名相同,则说明属于同一文件集。
  eseutil /mh database file ,state=clean shutdown
  2. 将*.edb,*.stm文件备份。
  3. 装入已备份的数据库。
  4. 若稍后要钱滚,则备份所有带编号的事务日志文件(E0nxxxxx.log 文件)。不要备份 E0n.log、Res1.log 和 Res2.log 文件。
  5. 查看检查点文件的标头,以确定可以安全删除的编号最大的日志文件。如果数据库异常停止,检查点将跟踪自动恢复所需的编号最小的日志文件。要查看检查点文件,运行以下命令:eseutil /mk E0n.chk
  6. 令验证已备份日志文件的完整性:eseutil /ml E0n
  脱机恢复
  ”时点”恢复。日志文件不会重放到数据库中。备份后所创建的所有数据都将丢失。存储组中的所有已停止数据库必须一致,并且必须存在有效的检查点文件。不要删除当前的检查点文件或任何现有的日志文件。
  ”前滚”恢复。备份后所创建的日志文件将被播放到数据库中。如果所有日志文件都可用,则备份后所创建的全部数据都可保存下来。如果启用了循环记录,则必须对脱机备份执行”时点”恢复,而不能选择”前滚”恢复。存储组中的所有数据库必须停止且一致,并且生成备份后创建的所有日志文件都必须存在(包括当前的 E0n.log)。必须删除检查点文件。
  ”时点”恢复
  1. 卸除掉要恢复的数据库,并验证其一致,匹配,且检查点有效。
  eseutil /mk E0n.chk | FIND /i “checkpoint”
  eseutil /ml E0n.log | FIND /i “lgeneration” 看检查点是否位于日志中。
  2. 将已备份的 .edb 和 .stm 文件复制到适当的数据库和流式文件位置。
  3. 在Exchange 系统管理器中数据库对象的”数据库”属性内单击以选中 This database can be overwritten by a restore(可以用恢复覆盖此数据库)复选框。
  4. 装入已恢复的数据库。
  ”前滚恢复”
  1. 卸除掉要恢复的数据库。
  2. 检查一致性。
  3. 检查每个数据库标头中记录的日志签名是否为低锚定日志的签名。运行以下命令:
  eseutil /mh database_name | find /i “Log Signature”
  eseutil /ml low_anchor_log | find /i “Signature”
  4. 检查当前数据库路径位置是否与创建备份时的路径位置相同。
  eseutil /ml “Last_Consistent”_log | find /i “database name or pattern”
  5. 从连续序列中尽可能靠前的低锚定编号开始,收集所有日志,并将这些日志复制到当前的事务日志路径中。
  6. 验证所有日志是否共享同一日志签名并处于连续序列中。
  eseutil /ml E0n > 20049995942.htm.txt
  7. 如果高锚定日志尚未命名为 E0n.log,则重命名它。
  8. 从”系统路径”文件夹中删除 E0n.chk 文件。
  9. 作为装入存储组前的最后一步检查,请验证以下几个方面:
  ü 所有数据库文件都存在于其运行路径中。
  ü 运行事务日志路径中仅有的日志文件从低锚定日志开始,并至少持续到高锚定日志,其中编号最大的可用日志名为 E0n.log。
  ü “系统路径”文件夹中没有 E0n.chk 文件。
  10. 如果信息存储尚未运行,请启动它,然后至少在存储组中装入一个数据库。
  三. 数据库故障处理
  当无法mount上数据库时,按下列步骤操作
  1. 尝试启动信息存储,看错误提示和事件日志。
  2. 检查一致性
  eseutil /mh databasename
  3. 若state=dirty shutdown,则不要remove log
  若state=clean shutdown,则把log移出,转到第11步。
  4. 不一致执行软恢复eseutil /r
  成功再检查一致性,转到第9步。
  5. 若磁盘空间不足,执行碎片整理(eseutil /d)
  6. 数据库不一致并且软恢复不成功
  删除mdbdata中的所有Log文件,还有chk文件,以及temp.edb文件。
  7. 执行eseutil /p,恢复到一致状态。
  8. 将数据库装入一次,并马上卸除。
  9. 使用 Isinteg.exe 修复 Pub1.edb 数据库和 Priv1.edb 数据库(isinteg -s (servername) -fix -test alltests)
  10. 如果能够启动信息存储服务,而且信息存储较为稳定,并且在多次运行 Isinteg.exe 后仍报告同样的错误和警告,请使用 ExMerge 实用工具,通过将数据导出为 .pst 格式,然后将其重新导入新的或干净的数据库结构中来重建信息存储。
  11. 重新启动信息存储,mount 存储。
  12. 做一次全备份。
  四. 其它信息
  .edb 和 .stm 文件是所有数据库信息的最终储存库。在大多数情况下,应将这两个文件视为一个文件;请一前一后地备份和恢复这两个文件。这两个文件必须在时间上相互保持同步;在某一天备份的 .edb 文件不能匹配在另一天备份的流式文件。为避免对哪些日志文件属于各个存储组产生混乱,以唯一的日志前缀命名属于指定存储组的 Exchange 日志,该前缀是文件名的前三个字符,存储组的当前日志文件总是 E0n.log。事务日志的大小统一为 5 MB。如果当前日志文件已满,将用十六进制序列号(称为日志生成编号)将其重命名,并生成新的当前日志文件。日志文件被编号为 E0n00001.log、E0n00002.log,依此类推。带编号的日志文件一般被指定为 E0nxxxxx.log。
  如果数据库异常停止,则检查点文件 (E0n.chk) 将记录作为恢复起点的事务日志,恢复必须从此起点处开始重放,以恢复数据库一致性。该过程称为”软恢复”。软恢复与”硬恢复”相对,后者是在恢复联机备份后重放日志文件的过程。软恢复和硬恢复之间最重要的区别是:在硬恢复期间,将修补文件数据插入了日志文件重放过程。不一致的 Exchange 数据库文件是没有将所有未完成事务全部写入其中的文件。在正常操作期间,Exchange 数据库文件是不一致的,因为在缓存中存在尚未物理写入该文件的信息。通常,只有数据库服务正常关闭后,Exchange 数据库文件才被认为是一致的。不过,数据库作为一个整体(该整体被认为是事务日志和数据库文件中的信息总和)始终是一致的,除非所需的日志文件被过早删除。
  处理数据库签名与路径不匹配问题
  与日志文件一样,数据库也有自己的签名。不同的是,虽然自创建 E0n000001.log 文件之后日志签名不会再更改,但每当数据库的物理拓扑改变时,数据库签名将会更改,并且不通过日志文件对这些更改进行跟踪。使用 Eseutil 对数据库进行脱机碎片整理或修复时,会更改 DB 签名。经过这样的事件后,数据库可以附加到先前的同一日志流,但它将不接受数据库具有先前签名时所执行的所有事务的重放。数据库的以前副本不接受数据库签名更改后所执行的任何事务的重放。由于数据库签名以这种方式重置,因此强烈建议您在对数据库进行脱机碎片整理或修复后,立即创建完全数据库备份。如果您以后恢复具有旧签名的数据库副本,将会成功重放到签名更改点,但您将会丢失该点之后的所有更改。如果在日志流中间更改了数据库路径,其效果与更改签名类似:重放将在更改点中断。(联机备份 API 提供了一种手段,可以在恢复过程中重新映射路径;因此,即使在创建备份后更改了路径,联机备份 API 也可以完全重放日志。)

2009-05-21生活琐记

未公开DNS服务器已关闭评论

未公开DNS服务器

  DNS Server 211.157.x.x
  服务器: UnKnown
  Address: 211.157.33.6
  服务器: UnKnown
  Address: 211.157.113.214
  服务器: UnKnown
  Address: 211.157.20.227
  服务器: UnKnown
  Address: 211.157.101.61
  服务器: dns1.apcix.com.cn
  Address: 211.157.15.189
  服务器: UnKnown
  Address: 211.157.108.133
  服务器: UnKnown
  Address: 211.157.103.20
  服务器: dns-servc.bjltb.gov.cn
  Address: 211.157.219.22
  服务器: UnKnown
  Address: 211.157.103.202
  服务器: UnKnown
  Address: 211.157.20.237
  服务器: S211040.chinahr.com
  Address: 211.157.102.40
  服务器: UnKnown
  Address: 211.157.111.243
  服务器: UnKnown
  Address: 211.157.109.155
  服务器: hao.richmedia.com.cn
  Address: 211.157.24.59
  服务器: UnKnown
  Address: 211.157.101.60
  服务器: UnKnown
  Address: 211.157.100.16
  服务器: UnKnown
  Address: 211.157.15.188
  服务器: support.candishosting.com.cn
  Address: 211.157.103.169
  服务器: UnKnown
  Address: 211.157.111.243
  服务器: UnKnown
  Address: 211.157.109.155
  服务器: hao.richmedia.com.c
  Address: 211.157.24.59
  服务器: UnKnown
  Address: 211.157.101.60
  服务器: UnKnown
  Address: 211.157.100.16
  服务器: UnKnown
  Address: 211.157.15.188
  服务器: UnKnown
  Address: 211.157.17.72
  服务器: UnKnown
  Address: 211.157.103.201
  服务器: UnKnown
  Address: 211.157.108.67
  服务器: UnKnown
  Address: 211.157.100.15
  服务器: UnKnown
  Address: 211.157.105.117
  服务器: UnKnown
  Address: 211.157.21.33
  服务器: UnKnown
  Address: 211.157.10.42
  服务器: UnKnown
  Address: 211.157.117.66
  服务器: UnKnown
  Address: 211.157.107.151
  服务器: desktops.candishosting.com.cn
  Address: 211.157.103.200
  服务器: UnKnown
  Address: 211.157.24.25
  服务器: ftp.everfocus.com.cn
  Address: 211.157.108.130
  服务器: UnKnown
  Address: 211.157.19.83
  服务器: UnKnown
  Address: 211.157.35.176
  服务器: bjmx01drac.candishosting.com.cn
  Address: 211.157.103.199
  服务器: dns.metalchina.com
  Address: 211.157.219.115
  服务器: mail.ticketmaster.cn
  Address: 211.157.102.101
  服务器: UnKnown
  Address: 211.157.100.13
  服务器: UnKnown
  Address: 211.157.10.8
  服务器: UnKnown
  Address: 211.157.21.106
  服务器: server.1979s.com
  Address: 211.157.105.254
  服务器: ns1.cngnu.net
  Address: 211.157.2.95
  服务器: drac.asianamericancoal.com
  Address: 211.157.103.198
  服务器: mail.enrolme.cn
  Address: 211.157.108.107
  服务器: UnKnown
  Address: 211.157.108.64
  服务器: UnKnown
  Address: 211.157.100.12
  服务器: UnKnown
  Address: 211.157.35.78
  服务器: mail.shgerald.com
  Address: 211.157.19.242
  服务器: UnKnown
  Address: 211.157.103.197
  服务器: UnKnown
  Address: 211.157.113.219
  服务器: UnKnown
  Address: 211.157.110.162
  服务器: UnKnown
  Address: 211.157.99.21
  服务器: UnKnown
  Address: 211.157.111.120
  服务器: UnKnown
  Address: 211.157.106.200
  服务器: UnKnown
  Address: 211.157.100.43
  服务器: vps02.candishosting.com.cn
  Address: 211.157.103.207
  服务器: ns.cngnu.net
  Address: 211.157.2.9
  服务器: www.thatsbj.com
  Address: 211.157.103.196
  服务器: UnKnown
  Address: 211.157.100.10
  服务器: UnKnown
  Address: 211.157.18.89
  服务器: UnKnown
  Address: 211.157.108.201
  服务器: UnKnown
  Address: 211.157.19.90
  服务器: UnKnown
  Address: 211.157.109.234
  服务器: UnKnown
  Address: 211.157.111.54
  服务器: UnKnown
  Address: 211.157.109.116
  服务器: UnKnown
  Address: 211.157.209.207
  服务器: UnKnown
  Address: 211.157.10.47
  服务器: UnKnown
  Address: 211.157.103.216
  服务器: UnKnown
  Address: 211.157.100.9
  服务器: UnKnown
  Address: 211.157.113.120
  服务器: mail.cemma.com
  Address: 211.157.108.200
  服务器: UnKnown
  Address: 211.157.5.116
  服务器: vps03drac.candishosting.com.cn
  Address: 211.157.103.205
  服务器: UnKnown
  Address: 211.157.100.148
  服务器: newleadersgroup.com
  Address: 211.157.108.157
  服务器: club.16888.com.cn
  Address: 211.157.10.218
  服务器: UnKnown
  Address: 211.157.113.34
  服务器: UnKnown
  Address: 211.157.101.63
  服务器: UnKnown
  Address: 211.157.214.126
  服务器: UnKnown
  Address: 211.157.113.55
  服务器: UnKnown
  Address: 211.157.10.46
  服务器: UnKnown
  Address: 211.157.100.8
  服务器: UnKnown
  Address: 211.157.35.74
  服务器: UnKnown
  Address: 211.157.36.75
  服务器: UnKnown
  Address: 211.157.8.247
  服务器: UnKnown
  Address: 211.157.103.204
  服务器: UnKnown
  Address: 211.157.33.7
  服务器: UnKnown
  Address: 211.157.101.62
  服务器: UnKnown
  Address: 211.157.97.68
  服务器: dns1.qiji1.com
  Address: 211.157.2.68
  服务器: UnKnown
  Address: 211.157.103.21
  服务器: UnKnown
  Address: 211.157.103.203
  服务器: mmyee.com
  Address: 211.157.10.23
  =====================================================
  DNS Server 202.97.x.x
  Server: UnKnown
  Address: 202.97.150.202
  Server: UnKnown
  Address: 202.97.173.162
  Server: UnKnown
  Address: 202.97.177.5
  Server: ns1.cn.net
  Address: 202.97.7.17
  Server: UnKnown
  Address: 202.97.139.187
  Server: ns.chinanet.cn.net
  Address: 202.97.7.6
  Server: pdns.dqsh.com.cn
  Address: 202.97.244.4
  Server: UnKnown
  Address: 202.97.246.231
  Server: ns.daqing.gov.cn
  Address: 202.97.194.129
  Server: UnKnown
  Address: 202.97.179.122
  Server: UnKnown
  Address: 202.97.143.242
  Server: UnKnown
  Address: 202.97.136.244
  Server: UnKnown
  Address: 202.97.138.171
  Server: UnKnown
  Address: 202.97.246.46
  Server: UnKnown
  Address: 202.97.246.35
  Server: UnKnown
  Address: 202.97.143.101
  Server: 180.156.97.202.adsl-pool.sx.cn
  Address: 202.97.156.180
  Server: 151.140.97.202.adsl-pool.sx.cn
  Address: 202.97.140.151
  Server: UnKnown
  Address: 202.97.144.37
  Server: UnKnown
  Address: 202.97.179.130
  Server: UnKnown
  Address: 202.97.171.3
  Server: UnKnown
  Address: 202.97.179.129
  Server: UnKnown
  Address: 202.97.171.2
  Server: UnKnown
  Address: 202.97.143.99
  Server: UnKnown
  Address: 202.97.251.113