<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Soul Of Free Loop &#187; 同步</title>
	<atom:link href="https://zohead.com/archives/tag/sync/feed/" rel="self" type="application/rss+xml" />
	<link>https://zohead.com</link>
	<description>Uranus Zhou&#039;s Blog</description>
	<lastBuildDate>Sat, 19 Jul 2025 15:42:46 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.8</generator>
	<item>
		<title>EasyMoney财务数据迁移到随手记的流程</title>
		<link>https://zohead.com/archives/easymoney-to-feidee/</link>
		<comments>https://zohead.com/archives/easymoney-to-feidee/#comments</comments>
		<pubDate>Wed, 21 Aug 2013 16:33:01 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[shell]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[财务]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[CSV]]></category>
		<category><![CDATA[EasyMoney]]></category>
		<category><![CDATA[easymoney2feidee]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[同步]]></category>
		<category><![CDATA[报表]]></category>
		<category><![CDATA[脚本]]></category>
		<category><![CDATA[迁移]]></category>
		<category><![CDATA[随手记]]></category>

		<guid isPermaLink="false">http://zohead.com/?p=484</guid>
		<description><![CDATA[关于 EasyMoney 记账软件 之前在 Android 手机一直都用一个比较小巧的记账软件 Handy EasyMoney（轻松理财） 来记录管理平时的理财开销等数据，虽然这个 App 也比较流畅好用，但用到后来越来越发现 EasyMoney 的缺点： 只支持 Android 平台，不支持 iOS、Windows 等平台； 完全不支持网络，没有同步、Web 管理等操作，更别想实现全平台同步等目标了； 老版本导出的数据有可能导入不了新版本，有点不保险； 条件查询、报表管理功能还比较薄弱； 采用私有的数据格式，导出只能再选择 CSV 格式导出，不方便迁移到其它软件； 不支持导入其它财务软件的数 [&#8230;]]]></description>
				<content:encoded><![CDATA[<h2>关于 EasyMoney 记账软件</h2>
<p>之前在 Android 手机一直都用一个比较小巧的记账软件 Handy EasyMoney（轻松理财） 来记录管理平时的理财开销等数据，虽然这个 App 也比较流畅好用，但用到后来越来越发现 EasyMoney 的缺点：</p>
<ul>
<li>只支持 Android 平台，不支持 iOS、Windows 等平台；</li>
<li>完全不支持网络，没有同步、Web 管理等操作，更别想实现全平台同步等目标了；</li>
<li>老版本导出的数据有可能导入不了新版本，有点不保险；</li>
<li>条件查询、报表管理功能还比较薄弱；</li>
<li>采用私有的数据格式，导出只能再选择 CSV 格式导出，不方便迁移到其它软件；</li>
<li>不支持导入其它财务软件的数据。</li>
</ul>
<p>而最近看到的随手记软件（官网：<a href="http://www.feidee.com/" target="_blank">http://www.feidee.com/</a>）则基本都解决了上面的问题，特别是全平台同步（不止主流的 Android、iPhone、iPad 等平台，连软件现在很稀少的 Windows Store 上都有随手记了）和强大的 Web 管理功能还是有比较深的印象。</p>
<p>最近想着能把数据从 EasyMoney 迁移到随手记，但由于 EasyMoney 并不是特别知名，随手记支持的数据导入方式并没有 EasyMoney，而我在 EasyMoney 上已经记了一年多的财务数据，如果手工导入是会疯掉的。因此稍研究了下 EasyMoney 的 CSV 导出数据格式和随手记的 Web 导入格式，写了一个脚本来自动实现数据转换，方便进行导入。</p>
<h2>EasyMoney 数据导入随手记</h2>
<p>下面以我现在使用的 Handy EasyMoney 1.6.3 汉化版本为例子说明如何将 EasyMoney 财务数据导入到随手记中，英文版的 EasyMoney 的方法需要稍做下改动，请注意下面的说明。</p>
<p>首先进入手机的 EasyMoney App，记下随手记里的各个账户的名称和初始余额，例如我的账户列表为（名称不可出错）：<strong>现金</strong>、<strong>信用卡</strong>、<strong>银行账户</strong>、<strong>支付宝</strong>。然后点击菜单中的“数据库工具”，选择“导出.CSV”，然后就可以选择不同的账户类型进行导出，建议将“字段分隔符”设置为“|”或者“Tab”，防止和财务数据中的信息冲突 ：</p>
<p><a href="https://zohead.com/wp-content/uploads/easymoney-export-csv.jpg"><img title="EasyMoney导出CSV数据" alt="EasyMoney导出CSV数据" src="https://zohead.com/wp-content/uploads/easymoney-export-csv.jpg" width="219" height="246" /></a></p>
<p>点击“导出”按钮就会在 SD 卡的 EasyMoney/csv_output 文件夹中产生对应的 CSV 文件，将 CSV 文件拷贝到 PC 中，可以用支持 UTF-8 的文本编辑器打开检查下，格式就像下面这样：</p>
<pre class="brush: plain; title: 现金_cny.csv; notranslate">
PAYEE_ITEM_DESC|CATEGORY|AMOUNT|STATUS|TRAN_DATE|REMARKS
&quot;上海汽车站&quot;|&quot;交通&quot;|-42.00|&quot;未清算&quot;|&quot;21 Aug 2013&quot;|&quot;回常熟汽车票&quot;|
&quot;常熟公交&quot;|&quot;交通&quot;|-1.00|&quot;未清算&quot;|&quot;21 Aug 2013&quot;|&quot;汽车南站回公司&quot;|
&quot;银环面馆&quot;|&quot;食品&quot;|-8.00|&quot;未清算&quot;|&quot;21 Aug 2013&quot;|&quot;午餐&quot;|
&quot;华兴便利&quot;|&quot;食品&quot;|-1.50|&quot;未清算&quot;|&quot;21 Aug 2013&quot;|&quot;中午雪糕&quot;|
&quot;安徽大排档&quot;|&quot;食品&quot;|-8.00|&quot;未清算&quot;|&quot;21 Aug 2013&quot;|&quot;晚餐&quot;|
&quot;华联超市&quot;|&quot;购物&quot;|-13.60|&quot;未清算&quot;|&quot;21 Aug 2013&quot;|&quot;瑞士卷、山楂、雪碧、牙膏&quot;|
</pre>
<p>下面先访问<a href="http://www.feidee.com/" target="_blank">随手记官方网站</a>，进入 “我的账本”，点击 “账户” 标签，向随手记的账户列表预先添加好需要的账户以备导入，账户列表里的账户名称最好与 EasyMoney 中的账户名称一致，这样批量导入数据比较方便（可以等导入完成之后修改账户名称的）。</p>
<p>例如如下图所示，我把现金账户中的子账户名称改为与 EasyMoney 对应的名称：<strong>现金</strong>，并设置初始余额，将信用卡账户中的子账户名称改为：<strong>信用卡</strong>，将金融账户中的子账户名称改为：<strong>银行账户</strong>，并在虚拟账户中建立一个账户，名称为：<strong>支付宝</strong>。</p>
<p><a href="https://zohead.com/wp-content/uploads/efeidee-account-list.jpg"><img title="随手记账户列表" alt="随手记账户列表" src="https://zohead.com/wp-content/uploads/feidee-account-list.jpg" width="428" height="306" /></a></p>
<p>需注意的是 EasyMoney 中信用卡账户与普通账户没什么区别，初始余额表示信用卡的初始可用额度，例如 10000 元的信用卡初始余额为 8000 元；而在随手记中初始余额表示信用卡的负债数额，这样上面的情况就可以用随手记专门的“信用卡”功能模块，先设置信用卡可用额度为 10000 元，初始负载数额为 2000 元。</p>
<p>随后进入随手记 Web 版的 “记账” 标签，这时就有几条记录表示余额变更，此时需要将这几条记录的时间修改为 EasyMoney 中最早的记录时间之前，这样导入数据之后账户的余额就是正确的值。</p>
<p>下载导入数据用的随手记 Web 版 Excel 模板（点击 [<a href="http://money.feidee.com/u07/downloadDoc/template.xls" target="_blank">这里</a>] 下载），打开查看一下随手记的数据格式如下所示：</p>
<p><a href="https://zohead.com/wp-content/uploads/feidee-template.jpg"><img title="随手记数据格式" alt="随手记数据格式" src="https://zohead.com/wp-content/uploads/feidee-template.jpg" width="585" height="122" /></a></p>
<p>简单研究了随手记的 Excel 模板格式之后，我写了一个 Linux shell 环境（Windows 上也可以使用 Cygwin 等 shell 环境）下运行的 easymoney2feidee.sh 脚本来自动将 EasyMoney 导出的数据转换为随手记的数据格式。</p>
<p>你可以直接点击 [<a href="http://0paste.com/528.txt" target="_blank">这里</a>] 或 [<a href="http://paste.ubuntu.com/6010802/" target="_blank">这里</a>] 下载此脚本，脚本内容如下：</p>
<pre class="brush: bash; title: easymoney2feidee.sh; notranslate">
#!/bin/sh
if [ $# -lt 3 ]; then
echo &quot;Usage: $0 csv-file account-type out-file&quot;
exit
fi

EM_FILE=&quot;$1&quot;
EM_TYPE=&quot;$2&quot;
EM_OUT=&quot;$3&quot;

sed -i 's/\&quot;//g' $EM_FILE

gawk -F '|' -v ETYPE=&quot;$EM_TYPE&quot; 'BEGIN{
m = split(&quot;Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec&quot;, d, &quot;|&quot;)
for (o = 1; o &lt;= m; o++){
months[d[o]] = sprintf(&quot;%02d&quot;, o)
}
}
{
if (NR &gt; 1 &amp;&amp; $2 != &quot;转账 (转入)&quot;) {
OUT_TYPE = &quot;&quot;;
OUT_VAL = $3;
if ($2 == &quot;转账 (转出)&quot;) {
if (substr($1, 1, 13) == &quot;转入账户 &quot;) {
OUT_TYPE = substr($1, 14);
}
printf &quot;转账&quot;;
} else if ($3 &gt; 0) {
printf &quot;收入&quot;;
} else {
printf &quot;支出&quot;;
}
if ($3 &lt; 0) {
OUT_VAL = -OUT_VAL;
}
split($5, time, &quot; &quot;);
date = time[3]&quot; &quot;months[time[2]]&quot; &quot;time[1]&quot; 0 0 0&quot;
printf &quot;\t&quot;strftime(&quot;%Y-%m-%d&quot;, mktime(date));
if (length(OUT_TYPE) &lt;= 0) {
printf &quot;\t&quot;$2;
} else {
printf &quot;\t&quot;;
}
printf &quot;\t&quot;;
printf &quot;\t&quot;ETYPE;
printf &quot;\t&quot;OUT_TYPE;
printf &quot;\t&quot;OUT_VAL;
printf &quot;\t本人&quot;;
if (length(OUT_TYPE) &lt;= 0) {
printf &quot;\t&quot;$1;
} else {
printf &quot;\t&quot;;
}
printf &quot;\t&quot;;
printf &quot;\t&quot;$6&quot;\n&quot;;
}
}' $EM_FILE &gt; $EM_OUT
</pre>
<p>下面简单说明下脚本：</p>
<p>在 shell 下运行 easymoney2feidee.sh 脚本并传入 3 个参数，分别表示 EasyMoney CSV 文件名、CSV 文件对应的账户名称、输出文件名称。</p>
<p>如果你的 CSV 文件不是用 “|” 隔开的，请修改脚本第 13 行中的 “|” 分隔符。脚本首先会去掉 CSV 文件中的所有双引号方便处理数据，然后按分割符得到数据，并判断是否是 EasyMoney 的转账处理（转出需要分别记录本账户名称、转入的账户名称；如果是转入则不需要记录），先记录财务记录类型，然后将 EasyMoney 的日期（EasyMoney 只支持日期，没有细化到具体时间）转换为随手记的时间格式，记录商家、金额（EasyMoney 金额为正值表示收入，负值表示支出）等信息，最终以 Tab 隔开生成输出文件（Tab 隔开的文本复制到随手记 Excel 表格中时可以自动跨越列）。</p>
<p>需要注意的是此脚本处理的是汉化版的 EasyMoney 的数据，其中转账用的固定值为：<strong>转账 (转入)</strong>、<strong>转账 (转出)</strong>、<strong>转入账户</strong>，如果你使用的是英文原版的 EasyMoney App，那需要将脚本小做下修改。</p>
<p>例如我在 Cygwin 环境下运行脚本将 “现金” 账户的 CSV 文件转为随手记的数据：</p>
<p>./easymoney2feidee.sh <strong>现金_cny.csv</strong> <strong>现金</strong> <strong>现金.txt</strong></p>
<p>输出的文件即为：<strong>现金.txt</strong> 文件，使用文本编辑器打开 <strong>现金.txt</strong> 文件，并将所有内容复制到随手记的模板 Excel 文件中并保存，最终数据形式即符合随手记的要求了（检查下与 EasyMoney 的 CSV 数据是否相符）：</p>
<p><a href="https://zohead.com/wp-content/uploads/feidee-data.jpg"><img title="导入的随手记数据" alt="导入的随手记数据" src="https://zohead.com/wp-content/uploads/feidee-data.jpg" width="608" height="106" /></a></p>
<p>然后就可以到随手记的 “我的账本” 首页中选择 “导入导出” 并选择数据导入选项的 “随手记web版”，选择上面生成的 Excel 文件，点击 “上传数据” 等待片刻，随手记就能识别到数据，此时还需要最后一步选择分类数据和随手记账户：</p>
<p><a href="https://zohead.com/wp-content/uploads/feidee-import.jpg"><img title="导入随手记数据" alt="导入随手记数据" src="https://zohead.com/wp-content/uploads/feidee-import.jpg" width="614" height="381" /></a></p>
<p>如上图所示，仔细选择 EasyMoney 中的分类和随手记分类的对应关系，并选择导入的随手记账户，点击导入数据按钮，稍等几分钟数据就正确导入了（我的现金账户 2000 条数据导入花了 4 分钟左右），在随手记 Web 版的记账界面中可以查看到：</p>
<p><a href="https://zohead.com/wp-content/uploads/feidee-view-data.jpg"><img title="成功导入的数据" alt="成功导入的数据" src="https://zohead.com/wp-content/uploads/feidee-view-data.jpg" width="594" height="130" /></a></p>
<p>如果你发现刚才选择的分类有的条目不对应，完全可以借助随手记强大的条件查询功能先搜索到对应条目，然后使用批量修改功能统一进行修改，总之比 EasyMoney 的可用性好不少。</p>
<p>本文为个人总结经验所得，所写的脚本并不适合所有的情况，因此使用中有任何问题欢迎提出指正哦，玩的开心~~~ ^_^</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/easymoney-to-feidee/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>密码保护：Linux kernel dm-log-userspace介绍及使用</title>
		<link>https://zohead.com/archives/dm-log-userspace/</link>
		<comments>https://zohead.com/archives/dm-log-userspace/#comments</comments>
		<pubDate>Sat, 27 Oct 2012 15:23:37 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[Device mapper]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[cmirrord]]></category>
		<category><![CDATA[connector]]></category>
		<category><![CDATA[dm-log-userspace]]></category>
		<category><![CDATA[dm-mirror]]></category>
		<category><![CDATA[netlink]]></category>
		<category><![CDATA[同步]]></category>

		<guid isPermaLink="false">http://zohead.com/?p=329</guid>
		<description><![CDATA[无法提供摘要。这是一篇受保护的文章。]]></description>
				<content:encoded><![CDATA[<form action="https://zohead.com/wp-login-zohead.php?action=postpass" class="post-password-form" method="post">
<p>这是一篇受密码保护的文章，您需要提供访问密码：</p>
<p><label for="pwbox-329">密码： <input name="post_password" id="pwbox-329" type="password" size="20" /></label> <input type="submit" name="Submit" value="提交" /></p>
</p></form>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/dm-log-userspace/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用Linux kernel dm-mirror实现设备间同步</title>
		<link>https://zohead.com/archives/dm-mirror-sync-device/</link>
		<comments>https://zohead.com/archives/dm-mirror-sync-device/#comments</comments>
		<pubDate>Thu, 11 Oct 2012 02:41:42 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[Device mapper]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[DM]]></category>
		<category><![CDATA[dm-log]]></category>
		<category><![CDATA[dm-mirror]]></category>
		<category><![CDATA[dmsetup]]></category>
		<category><![CDATA[DRBD]]></category>
		<category><![CDATA[kcopyd]]></category>
		<category><![CDATA[loop]]></category>
		<category><![CDATA[SAN]]></category>
		<category><![CDATA[同步]]></category>

		<guid isPermaLink="false">http://zohead.com/?p=311</guid>
		<description><![CDATA[本文同步自（最佳显示效果请点击）：https://zohead.com/archives/dm-mirror-sync-device/ 在某些场合下，用户需要在 Linux 系统中实现直接的块设备同步方式，需要将一个裸设备中的内容完全同步到另一个裸设备，有时甚至需要能自定义位移和大小进行同步，这时 Linux 自带的 dm-mirror 模块很可能是比较好的实现方案。 dm-mirror 是 Linux kernel 中 device-mapper（DM）模块（device-mapper 内部称为 target）中的一个，可以实现多个块设备间的数据同步，并支持通过 dm-log 模块保存同步时 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>本文同步自（最佳显示效果请点击）：<a href="https://zohead.com/archives/dm-mirror-sync-device/" target="_blank">https://zohead.com/archives/dm-mirror-sync-device/</a></p>
<p>在某些场合下，用户需要在 Linux 系统中实现直接的块设备同步方式，需要将一个裸设备中的内容完全同步到另一个裸设备，有时甚至需要能自定义位移和大小进行同步，这时 Linux 自带的 dm-mirror 模块很可能是比较好的实现方案。</p>
<p>dm-mirror 是 Linux kernel 中 device-mapper（DM）模块（device-mapper 内部称为 target）中的一个，可以实现多个块设备间的数据同步，并支持通过 dm-log 模块保存同步时的元数据信息，方便在关机和重启之后能够继续之前的进度进行同步，而且 dm-mirror 的元数据可以选择保存在内存中或者固定的块设备中。LVM 逻辑卷管理中的 pvmove 命令可以在卷组中替换物理卷，pvmove 命令正是基于 dm-mirror 模块实现的。Linux kernel 中还包含了其它的一些 device-mapper target 模块，例如 dm-linear（用于实现 LVM 逻辑卷管理）、dm-crypt（加密数据）、dm-snapshot（用于实现即时快照）等。</p>
<p>dm-mirror 的主要实现代码在 Linux kernel 代码树的 drivers/md/dm-raid1.c 中，dm-mirror 的日志元数据记录功能通过 dm-log 模块实现，同步的区块划分由 dm-region-hash 模块实现，底层的同步实现则由 kcopyd 来实现。kcopyd 的功能就是从一个块设备拷贝一定扇区的数据到另一个或多个块设备，kcopyd 支持异步的完成通知功能，目前主要被 dm-snapshot 和 dm-mirror 模块使用。有关 Linux kernel 中 kcopyd 的说明请参考这里：<a href="http://www.kernel.org/doc/Documentation/device-mapper/kcopyd.txt" target="_blank">http://www.kernel.org/doc/Documentation/device-mapper/kcopyd.txt</a>。</p>
<p>dm-mirror 设备的装载通过 dmsetup 命令来实现，以下说明的地址都是以扇区为单位（固定为 512 个字节），先看看 dm-mirror target 的 table 格式：</p>
<p><strong>start length mirror log_type #logargs logarg1 ... logargN #devs device1 offset1 ... deviceN offsetN [#features &lt;features&gt;]</strong></p>
<p>对每个值分别说明如下：</p>
<ul>
<li>start 为虚拟设备起始扇区地址，一般固定为 0</li>
<li>length 为 dm-mirror 设备的大小，也就是同步的总扇区大小</li>
<li>mirror 值固定，表示这是一个 dm-mirror 设备</li>
<li>log_type 指定日志元数据类型，常用的是 core 和 disk 两种类型</li>
<li>#logargs 表示后面的 logarg1 ... logargN 一共有多少个</li>
<li>#devs 表示需要同步的设备个数，每个设备都有一个 device 值和一个 offset 值</li>
<li>deviceN offsetN 为每个需要同步的设备的设备路径（或者设备号）和偏移地址</li>
<li>#features 和 features 为可选的值，#features 表示可选项个数</li>
<li>如果指定了 #features，则必须为 1，且 features 必须为 handle_errors（表示 dm-mirror 会自动进行错误处理，即同步出错时自动停止同步并删除 dm-mirror 虚拟设备）</li>
</ul>
<p>然后是 core 和 disk 两种日志元数据类型的介绍（另外有 clustered_core 和 clustered_disk 两种适用于集群的日志类型，有兴趣可以自己去了解下哦）：</p>
<ul>
<li>core 类型（内存）：<br />
日志保存在内存中，关机或者重启之后会丢失，因此安全性较差，但由于元数据存放在内存中，性能相对 disk 类型来说是非常好的。#logargs 个数为 1-2 个，日志参数格式为：<br />
<strong>regionsize [[no]sync]</strong>regionsize 为日志区块的大小（512 个字节的扇区为单位），可选的 sync 和 nosync 用于指定 dm-mirror 是否已经同步过。</li>
<li>disk 类型（磁盘）：<br />
日志保存在磁盘（块设备）中，因此可以在关机或重启之后继续之前的同步进度，当然性能比 core 类型肯定是要差一些的。#logargs 个数为 2-3 个，日志参数格式为：<br />
<strong>logdevice regionsize [[no]sync]</strong>logdevice 指定日志元数据存放在哪个块设备上，可以使用设备路径或者主从设备号形式，其它参数与 core 类型相同。</li>
</ul>
<p>Linux 系统中 dm-mirror 具体使用步骤举例如下：</p>
<ol>
<li>首先加载 dm-mirror 模块：<br />
<strong>modprobe dm-mirror</strong></li>
<li> 准备好需要同步的设备，假设是实际应用中的一种常见需求：Linux 系统盘为 /dev/sda，系统中另外有个数据盘 /dev/sdb。但由于磁盘 /dev/sdb 寿命快到了，需要将 /dev/sdb 磁盘上的数据同步到 /dev/sdc 上，/dev/sdc 的容量比 /dev/sdb 要大。<br/><br/>先得到 /dev/sdb 和 /dev/sdc 的容量大小（以 512 个字节的扇区为单位）：<br />
<strong>blockdev --getsz /dev/sdb</strong><br />
<strong>blockdev --getsz /dev/sdc</strong><br/></br>假设分别为 <strong>209715200</strong>（100G） 和 <strong>314572800</strong>（150G）。</li>
<li>在系统中通过文件方式产生 loop 设备用作 dm-mirror 同步存放日志元数据的设备，防止关机或重启之后同步进度丢失，1MB 的文件已完全足够保存日志元数据：<br/><br/><strong>dd if=/dev/zero of=meta.dat bs=1024k count=1</strong><br/>运行完成将产生一个 1MB 大小的 meta.dat 文件。</li>
<li>准备 loop 设备：<br/><br/><strong>losetup -f</strong><br />
得到空闲的 loop 设备名，假设为 <strong>/dev/loop0</strong>；<br/><br/><strong>losetup /dev/loop0 meta.dat</strong><br />
装载 loop 设备。</li>
<li>运行 dmsetup create 命令创建 dm-mirror 设备进行同步：<br/><br/><strong>echo "<span style="color: #008000;">0 209715200 mirror disk 2 /dev/loop0 16384 2 /dev/sdb 0 /dev/sdc 0 1 handle_errors</span>" | dmsetup create mirror0</strong><br/><br/>运行成功之后将产生名称为 mirror0 的虚拟 dm-mirror 设备。<br/><br/>echo 中间的字符串即为 dm-mirror 的 table 格式：209715200 为同步的大小，disk 指定元数据保存在磁盘中，/dev/loop0 为元数据设备，16384 为区块大小（这里指定为 8MB 为提高同步性能），后面的参数指定将 /dev/sdb（源设备，起始地址为 0）的数据同步到 /dev/sdc（目标设备，起始地址为 0），1 和 handle_errors 表示不忽略同步错误。</li>
<li>查询同步状态和进度：<br/><br/><strong>dmsetup status mirror0</strong><br/><br/>输出类似下面：<br/><br/><strong><span style="color: #008000;">mirror0: 0 209715200 mirror 2 8:16 8:32 417/12800 1 AA 3 disk 7:0 A</span></strong><br/><br/>8:16 和 8:32 为 /dev/sdb 和 /dev/sdc 的设备号，209715200 个扇区的数据以 16384 个扇区为单位可得到需要划分为 12800 个区块，现在已经同步了 417 个区块，AA 表示两个要同步的设备都正常，7:0 为日志元数据设备 /dev/loop0 的设备号。</li>
<li>定期运行 <strong>dmsetup status mirror0</strong> 查看进度，同步完成时，进步部分将显示为：12800/12800，表示所有区块都已经同步好了；</li>
<li>删除没有用了的 dm-mirror 设备：<br />
<strong>dmsetup remove mirror0</strong></li>
<li>删除没有用了的 loop 设备：<br />
<strong>losetup -d /dev/loop0</strong></li>
<li type="_moz">至此两块磁盘间的同步操作已经完成，在此过程中间即使有非正常的重启或者关机操作，也只需要在重新启动之后，再运行第 4 和 第 5 步就可以继续重启之前的进度进行同步。</li>
</ol>
<p>从上面的例子可以看出 dm-mirror 在 Linux 系统中还是很有用处的。实际上上面的例子中在同步完成之后就把 dm-mirror 设备删除了，如果不删除的话，是可以直接继续对 dm-mirror 设备（上面例子中的 dm-mirror 设备的实际路径为：/dev/mapper/mirror0）进行读写的，dm-mirror 设备在写时会自动将下面的设备数据进行同步，这样实际上就是类似 RAID1 磁盘阵列的效果了。</p>
<p>另外一种比较典型的应用是利用 dm-mirror 实现两个 SAN 网络设备间的同步，这看起来比较类似于 DRBD 的功能，但在实现上远比 DRBD 要简单和透明的多。可以实现单独的服务器分别连接两个不同的 SAN target（光纤、Infiniband 或者 iSCSI 都可以），得到两个不同的 SCSI 设备，然后就可以使用 dm-mirror 创建新的虚拟设备，在这个新的虚拟设备上的读写操作会在 Linux kernel 底层自动同步到对应的两个 SAN 设备中。</p>
<p>由于 dm-mirror 没有比较正式的官方文档，以上为个人参考 Linux kernel 源码和相关说明总结出来的，其中有任何问题欢迎提出指正，玩的开心 ^_^</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/dm-mirror-sync-device/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>rsync在 Linux/cygwin/msys 环境下的备份性能对比</title>
		<link>https://zohead.com/archives/rsync-performance-linux-cygwin-msys/</link>
		<comments>https://zohead.com/archives/rsync-performance-linux-cygwin-msys/#comments</comments>
		<pubDate>Fri, 27 Apr 2012 18:58:39 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[cygwin]]></category>
		<category><![CDATA[mingw]]></category>
		<category><![CDATA[MSYS]]></category>
		<category><![CDATA[rsync]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[同步]]></category>
		<category><![CDATA[备份]]></category>
		<category><![CDATA[测试]]></category>

		<guid isPermaLink="false">http://zohead.com/?p=96</guid>
		<description><![CDATA[本文博客链接：https://zohead.com/archives/rsync-performance-linux-cygwin-msys/ rsync是一个开源免费的文件同步和备份工具，可用于本地备份，本地与远程服务器之间的备份，可以实现增量和差异备份，而且由于比较好的算法，在文件备份速度上也相对其它一些文件备份工具有明显的优势。 但 rsync 一直以来没有 Windows 下的原生客户端，都是基于 cygwin 环境实现，实际备份性能会受一些影响，近日看到 rsync 的 基于 MSYS 的 Win32 原生客户端已经被 port 出来，故简单做下性能对比测试。 测试环境： rsync [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>本文博客链接：<a href="https://zohead.com/archives/rsync-performance-linux-cygwin-msys/" target="_blank">https://zohead.com/archives/rsync-performance-linux-cygwin-msys/</a></p>
<p>	rsync是一个开源免费的文件同步和备份工具，可用于本地备份，本地与远程服务器之间的备份，可以实现增量和差异备份，而且由于比较好的算法，在文件备份速度上也相对其它一些文件备份工具有明显的优势。</p>
<p>	但 rsync 一直以来没有 Windows 下的原生客户端，都是基于 cygwin 环境实现，实际备份性能会受一些影响，近日看到 rsync 的 基于 MSYS 的 Win32 原生客户端已经被 port 出来，故简单做下性能对比测试。</p>
<p>	<strong>测试环境：</strong></p>
<p>	rsync服务器为 RHEL5 Linux 64bit，8个SATA盘的RAID0做下层存储，采用单千兆网络和千兆交换机<br />
	rsync客户端为：RHEL5 Linux 64bit，Windows 2003 Enterprise 32bit</p>
<p>	测试时 rsync 均通过匿名方式访问，不经过SSH做用户验证，由于考虑到测试的 rsync 客户端的系统盘速度有瓶颈，客户端文件读写都通过内存文件系统来实现（Linux 上使用 tmpfs，Windows 上使用 ImDisk 模拟内存盘）。</p>
<p>	使用同样的客户端主板分别在 Linux 和 Windows 内存中产生 1.5GB 的测试文件，然后通过 rsync 客户端进行备份到服务器（写操作）和从服务器上恢复（读操作）的操作。</p>
<p>	备份命令示例：<br />
	<em> rsync -hv x.dat 192.168.1.125::rsync0/</em></p>
<p>	<strong> 测试软件列表：</strong></p>
<ul>
<li>标准 Linux rsync 客户端（RHEL 5 系统自带）</li>
<li>cygwin rsync 客户端</li>
<li>MSYS rsync 客户端<br />
		<a href="http://sourceforge.net/projects/mingw/files/MSYS/Extension/rsync/" target="_blank">http://sourceforge.net/projects/mingw/files/MSYS/Extension/rsync/</a></li>
<li>RsyncWin32 客户端<br />
		<a href="http://sourceforge.net/projects/rsyncwin32/" target="_blank">http://sourceforge.net/projects/rsyncwin32/</a></li>
</ul>
<p>
	<strong>测试结果：</strong><br />
	&nbsp;</p>
<table border="0" cellpadding="0" cellspacing="1" id="evttab" style="background-color:#858585;" width="400">
<tbody>
<tr>
<td style="color:#FFFFFF; font-weight:bold;" width="120">测试软件</td>
<td style="color:#FFFFFF; font-weight:bold;">写性能（MB/s）</td>
<td style="color:#FFFFFF; font-weight:bold;">读性能（MB/s）</td>
</tr>
<tr>
<td style="background-color:#e7e7e7;">Linux rsync</td>
<td style="background-color:#e7e7e7;">105.27</td>
<td style="background-color:#e7e7e7;">105.28</td>
</tr>
<tr>
<td style="background-color:#e7e7e7;">cygwin rsync</td>
<td style="background-color:#e7e7e7;">76.22</td>
<td style="background-color:#e7e7e7;">64.49</td>
</tr>
<tr>
<td style="background-color:#e7e7e7;">MSYS rsync</td>
<td style="background-color:#e7e7e7;">7.98</td>
<td style="background-color:#e7e7e7;">8.14</td>
</tr>
<tr>
<td style="background-color:#e7e7e7;">RsyncWin32</td>
<td style="background-color:#e7e7e7;">76.72<span style="color:#f00;">（出现错误）</span></td>
<td style="background-color:#e7e7e7;">38.50<span style="color:#f00;">（出现错误）</span></td>
</tr>
</tbody>
</table>
<p>
	从测试结果看，由于 rsync 本身面向类 Linux 环境开发，在 Linux 系统中有着非常好的性能，cygwin rsync 与 Linux 相比有一定差距，但实际使用中还是比较稳定的，而 MSYS rsync 还处于测试阶段，虽然没有出现备份错误，但在千兆网络环境下性能非常差，RsyncWin32 则相对而言问题比较多，备份过程中甚至会出现备份错误。</p>
<p>	综上看来，目前在 Windows 上使用 cygwin rsync 做备份客户端仍然算是比较好的解决方案，MSYS rsync 的问题可以啥时候有空再看看咯。</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/rsync-performance-linux-cygwin-msys/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
