在Ubuntu 11.10上设置两个服务器之间的统一文件同步
本教程将介绍如何使用Unison在两台Ubuntu 11.10服务器之间设置文件同步。 Unison是一个类似于rsync的文件同步工具,但最大的区别在于它会跟踪/同步两个方向的更改,即在server1上更改的文件将被复制到server2,反之亦然。
我不会保证这将为您工作!
1初步说明
在本教程中,我使用以下两个Ubuntu 11.10服务器:
-
server1.example.com
,IP地址为192.168.0.100
-
server2.example.com
,IP地址为192.168.0.101
我想同步两个服务器之间的目录/ var / www
。 我将在本教程中以root用户身份运行Unison,以便Unison具有足够的权限来同步用户和组权限。
我使用root权限运行本教程中的所有步骤,因此请确保以root用户身份登录:
sudo su
2安装Unison
server1 / server2:
Unison必须安装在server1
和server2上
; 因为我们使用SSH从server1
连接到server2
,我们还需要SSH包。 这可以实现如下:
apt-get install unison openssh-server ssh
3在服务器1上创建私钥/公钥对
server1:
现在我们在server1.example.com
上创建一个私钥/公钥对:
ssh-keygen -t dsa
root @ server1:〜#ssh-keygen -t dsa
生成公共/私有dsa密钥对。
输入要保存密钥的文件(/root/.ssh/id_dsa):
< - ENTER 创建目录“/root/.ssh”。
输入密码(无密码为空):
< - ENTER 再次输入相同的密码:
< - ENTER 您的身份已保存在/root/.ssh/id_dsa中。
您的公钥已保存在/root/.ssh/id_dsa.pub中。
关键指纹是:
32:0f:f5:49:f0:32:f8:d0:63:8d:44:88:a5:12:f9:73 root@server1.example.com
关键的randomart形象是:
+ - [DSA 1024] ---- +
|
.. o.o + |
|
..... + = |
|
... o O + |
|
.o E = *。
|
|
o + S o |
|
= |
|
。
|
|
|
|
|
+ ----------------- +
root @ server1:〜#
重要的是,您不要输入密码,否则在没有人工交互的情况下镜像将无法正常工作,因此只需按ENTER键
!
接下来,我们将公钥复制到server2.example.com
(请注意,必须在server2.example.com
上启用root帐户,并且必须允许root登录。要启用Ubuntu系统上的root登录,请运行
sudo passwd root
要检查root登录是否允许,请检查/ etc / ssh / sshd_config中的指令PermitRootLogin
- 您可能需要重新启动SSH守护程序。):
ssh-copy-id -i $HOME/.ssh/id_dsa.pub root@192.168.0.101
root @ server1:〜#ssh-copy-id -i $ HOME / .ssh / id_dsa.pub root@192.168.0.101
主机'192.168.0.101(192.168.0.101)'的真实性无法建立。
ECDSA键指纹为a2:38:f3:df:7a:6c:b6:3c:d6:c3:9c:88:93:e2:f0:63。
您确定要继续连接(是/否)?
< - 是(只有这是您第一次连接到server2时才会看到)
警告:永久添加“192.168.0.101”(ECDSA)到已知主机列表。
root@192.168.0.101的密码:
< - server2 root password
现在尝试使用“ssh”root@192.168.0.101“登录机器,并签入:
〜/ .ssh / authorized_keys
以确保我们没有添加您不期望的额外密钥。
root @ server1:〜#
现在检查server2的
server1
的公钥是否正确传输:
server2:
cat $HOME/.ssh/authorized_keys
ssh-dss AAAAB3NzaC1kc3MAAACBAJgYGqpkEPBIV/Uiygz2FbOwCE9ggjXQK8anG/VxaTqH0KhZR+oL1i+Av2aZmK/D3msUQEkqClO51jarQXbm9i7ie7Y6OwQ4G8DBZXzy8A8nQ6V1bEikqif8xmmSayqVKPvHXMv3yINteUdCNYBHAuci1NB5iAf3Gmt/bo5SRpU1AAAAFQDJnh+a6lODf+zSF2eX1L4HvQgtxwAAAIAIOdjsJkzBDseOdTMD5oVZqrrp6cy0e1846DZ4C0PKQSeT9RQqKmbOICa8t94FF8MRLdV0p4x+R8I8VHRloErQ5v1CIVvrtzOGIGAR//Bo5wPI+8lsfbsOj8ZyZI6+bF6wHKjzNFLbgFpZjnIf/CisP87GtPp8MXq3bH7SI/7i6gAAAIAfByiUkqQZ7fOM18BHTqQhopxMjhJhvrATt0PJ/k2JzQp0lQm/Z31azpvccK5GF61AwWbfQSFAGy4AOKtVXZ6ztz80sKZeDwECNFJpT6rubjsbaSX2PvacrV8sAuJI1XZPAgQTl06mJLL9dC7rNrY+2QgXoJqFtgjiFGWhCC+UjQ== root@server1.example.com |
4跑步统一
server1:
我们现在可以首次运行Unison来同步两个服务器上的/ var / www
目录。 在server1上
运行:
unison /var/www ssh://192.168.0.101//var/www
输出将类似于这一个 - 您可能必须回答几个问题,因为这是第一次Unison正在运行:
root @ server1:〜#unison / var / www ssh://192.168.0.101//var/www
联系服务器...
已连接[//server1.example.com//var/www - > //server2.example.com//var/www]
寻找变化
警告:没有找到这些根的归档文件,其规范名称是:
/ var / www
//server2.example.com//var/www
这也可能发生
因为这是你第一次同步这些根,
或者因为您将Unison升级到具有其他版本的新版本
存档格式。
如果副本是,更新检测可能需要一段时间
大。
Unison会假设这两个副本的“最后同步状态”
完全是空的
这意味着任何不同的文件
将被报告为冲突,以及只存在于一个的任何文件
复制品将被判断为新的,并被传播到另一个副本。
如果两个副本相同,则不会有任何更改。
如果您重复看到此消息,可能是因为您的一台机器
正在从DHCP获取其地址,这导致其主机名更改
在同步之间。
请参阅UNISONLOCALHOSTNAME的文档
环境变量,建议如何纠正这一点。
非常感谢对Unison项目的捐款:
http://www.cis.upenn.edu/~bcpierce/unison
等待服务器的更改|
webalizer
协调变更
本地server2.e ...
dir ----> apps [f]
< - ENTER file ----> index.html [f]
< - ENTER 链接----> ispconfig [f]
< - ENTER dir ----> php-fcgi-scripts / apps [f]
< - ENTER dir ----> webalizer [f]
< - ENTER link ----> webmail [f]
< - ENTER 继续传播更新?
[]
< - y
传播更新
UNISON 2.32.52于2011年12月9日14:25:02开始传播变化
[BGN]将应用从/ var / www复制到//server2.example.com //var/www
[BGN]将index.html从/ var / www复制到//server2.example.com //var/www
[BGN]将ispconfig从/ var / www复制到//server2.example.com//var/www
[BGN]将php-fcgi-scripts / apps从/ var / www复制到//server2.example.com //var/www
[BGN]将webalizer从/ var / www复制到//server2.example.com //var/www
[BGN]将webmail从/ var / www复制到//server2.example.com //var/www
[END]复制ispconfig
[END]复制网页邮件
[END]复制应用程式
[END]复制webalizer
[END]复制index.html
[END]复制php-fcgi-scripts / apps
UNISON 2.32.52于2011年12月9日14:25:03完成传播变更
保存同步器状态
同步在14:25:03完成(传送6个项目,0跳过0个失败)
root @ server1:〜#
现在检查server1
和server2
上的/ var / www
目录,你应该会发现它们现在在同步。
当然,我们不想以交互方式运行Unison,因此我们可以创建一个首选项文件( /root/.unison/default.prf
),其中包含我们在命令行上必须指定的所有设置:
vi /root/.unison/default.prf
# Unison preferences file # Roots of the synchronization root = /var/www root = ssh://192.168.0.101//var/www # Paths to synchronize #path = current #path = common #path = .netscape/bookmarks.html # Some regexps specifying names and paths to ignore #ignore = Path stats ## ignores /var/www/stats #ignore = Path stats/* ## ignores /var/www/stats/* #ignore = Path */stats ## ignores /var/www/somedir/stats, but not /var/www/a/b/c/stats #ignore = Name *stats ## ignores all files/directories that end with "stats" #ignore = Name stats* ## ignores all files/directories that begin with "stats" #ignore = Name *.tmp ## ignores all files with the extension .tmp # When set to true, this flag causes the user interface to skip # asking for confirmations on non-conflicting changes. (More # precisely, when the user interface is done setting the # propagation direction for one entry and is about to move to the # next, it will skip over all non-conflicting entries and go # directly to the next conflict.) auto=true # When this is set to true, the user interface will ask no # questions at all. Non-conflicting changes will be propagated; # conflicts will be skipped. batch=true # !When this is set to true, Unison will request an extra # confirmation if it appears that the entire replica has been # deleted, before propagating the change. If the batch flag is # also set, synchronization will be aborted. When the path # preference is used, the same confirmation will be requested for # top-level paths. (At the moment, this flag only affects the # text user interface.) See also the mountpoint preference. confirmbigdel=true # When this preference is set to true, Unison will use the # modification time and length of a file as a `pseudo inode # number' when scanning replicas for updates, instead of reading # the full contents of every file. Under Windows, this may cause # Unison to miss propagating an update if the modification time # and length of the file are both unchanged by the update. # However, Unison will never overwrite such an update with a # change from the other replica, since it always does a safe # check for updates just before propagating a change. Thus, it is # reasonable to use this switch under Windows most of the time # and occasionally run Unison once with fastcheck set to false, # if you are worried that Unison may have overlooked an update. # The default value of the preference is auto, which causes # Unison to use fast checking on Unix replicas (where it is safe) # and slow checking on Windows replicas. For backward # compatibility, yes, no, and default can be used in place of # true, false, and auto. See the section "Fast Checking" for more # information. fastcheck=true # When this flag is set to true, the group attributes of the # files are synchronized. Whether the group names or the group # identifiers are synchronizeddepends on the preference numerids. group=true # When this flag is set to true, the owner attributes of the # files are synchronized. Whether the owner names or the owner # identifiers are synchronizeddepends on the preference # extttnumerids. owner=true # Including the preference -prefer root causes Unison always to # resolve conflicts in favor of root, rather than asking for # guidance from the user. (The syntax of root is the same as for # the root preference, plus the special values newer and older.) # This preference is overridden by the preferpartial preference. # This preference should be used only if you are sure you know # what you are doing! prefer=newer # When this preference is set to true, the textual user interface # will print nothing at all, except in the case of errors. # Setting silent to true automatically sets the batch preference # to true. silent=true # When this flag is set to true, file modification times (but not # directory modtimes) are propagated. times=true |
评论应该使文件自我解释,除了路径
指令。 如果不指定路径
指令,则根
指令中的目录
将被同步。 如果指定路径
指令,则路径是相对于根
路径(例如, root = / var / www
和path = current
转换为/ var / www / current
),只有这些子目录将被同步,而不是指定的整个目录在根
指令中。
通过查看Unison的手册页,可以找到有关可用选项的更多信息:
man unison
现在我们把所有的设置放在一个首选项文件(特别是root
(和可选的路径
)指令)中,我们可以运行Unison而不用任何参数:
unison
5创建Cron作业
server1:
我们希望自动化同步,这就是为什么我们在server1.example.com
上创建一个cron作业的原因
:
crontab -e
*/5 * * * * /usr/bin/unison &> /dev/null |
这将每5分钟运行一次; 根据您的需要进行调整(见
man 5 crontab
)。 我在这里使用完整的路径( / usr / bin / unison
),以确保cron知道在哪里找到一致
。 您的一致
位置可能不同。 跑
which unison
找出你的位置。
6链接
- Unison: http : //www.cis.upenn.edu/~bcpierce/unison/
- Ubuntu: http : //www.ubuntu.com/