<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>pig-monkey.com - backups</title><link href="https://pig-monkey.com/" rel="alternate"/><link href="https://pig-monkey.com/tag/backups/feed" rel="self"/><id>https://pig-monkey.com/</id><updated>2026-05-08T08:30:19.519307-07:00</updated><entry><title>Restic Continuum</title><link href="https://pig-monkey.com/2026/05/restic-continuum/" rel="alternate"/><published>2026-05-08T00:00:00-07:00</published><updated>2026-05-08T08:30:19.519307-07:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2026-05-08:/2026/05/restic-continuum/</id><summary type="html">&lt;p&gt;As I was &lt;a href="/2026/05/restic-adoption/"&gt;migrating my online backups to Restic&lt;/a&gt;, I was concurrently building a system that would allow me to use &lt;a href="https://restic.net/"&gt;Restic&lt;/a&gt; to complete full-disk backups to external USB drives, thus replacing my use of &lt;a href="https://github.com/pigmonkey/cryptshot"&gt;cryptshot&lt;/a&gt; and &lt;a href="https://rsnapshot.org/"&gt;rsnapshot&lt;/a&gt;. I give you &lt;a href="https://github.com/pigmonkey/resnap"&gt;Resnap&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For me, the main appeal of rsnapshot has …&lt;/p&gt;</summary><content type="html">&lt;p&gt;As I was &lt;a href="/2026/05/restic-adoption/"&gt;migrating my online backups to Restic&lt;/a&gt;, I was concurrently building a system that would allow me to use &lt;a href="https://restic.net/"&gt;Restic&lt;/a&gt; to complete full-disk backups to external USB drives, thus replacing my use of &lt;a href="https://github.com/pigmonkey/cryptshot"&gt;cryptshot&lt;/a&gt; and &lt;a href="https://rsnapshot.org/"&gt;rsnapshot&lt;/a&gt;. I give you &lt;a href="https://github.com/pigmonkey/resnap"&gt;Resnap&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For me, the main appeal of rsnapshot has always been that the resulting backups are just directories full of files. When it comes time to restore, no special tooling is required for access. Just copy the files over using &lt;code&gt;rsync&lt;/code&gt; or &lt;code&gt;cp&lt;/code&gt; or whatever tickles your fancy. If you can read the disk, you can recover data. Most competing systems create backups in a way that you also need the backup tool for recovery. This introduces fragility into the setup. My experience has been that most people do not think or care about this, but I have spent many years thinking about how not to lose data. I have certain requirements for backup systems. &amp;ldquo;Robustness&amp;rdquo; is a big one.&lt;/p&gt;
&lt;p&gt;Restic does fall into the second category of tool. If you have a copy of a Restic repository but the Restic project has imploded and you do not have or cannot execute the tool, you&amp;rsquo;re in for a bad time. But the reason Restic has been on my radar since the project first stated a decade ago (it takes me a while to adopt new backup software &amp;ndash; also I recall it took them a while to implement compression) is that it is compiled to a single, statically linked Go binary. This means you can easily store the tool itself alongside (not within) your backups. You&amp;rsquo;re not going to do that with a sprawling Python project like &lt;a href="https://www.borgbackup.org/"&gt;Borg&lt;/a&gt;, which is why I continued to use rsnapshot for my local full-disk backups even after I adopted Borg for online backups.&lt;/p&gt;
&lt;p&gt;But with Restic you can just &lt;code&gt;cp&lt;/code&gt; the binary to the backup drive. &lt;a href="https://github.com/pigmonkey/resnap/blob/380caaea8a35224a26ac5f20a3bd2cf8a95afb56/resnap#L112"&gt;And that&amp;rsquo;s what I do&lt;/a&gt;. Resnap also provides &lt;a href="https://github.com/pigmonkey/resnap/blob/master/resnap-restore"&gt;&lt;code&gt;resnap-restore&lt;/code&gt;&lt;/a&gt;, a simple wrapper script that makes it easy to perform the &lt;code&gt;restic restore ...&lt;/code&gt; operation during full-disk recovery. This too is stored on the backup drive alongside the binary.&lt;/p&gt;
&lt;p&gt;What this means is that you can use Resnap to create a full-disk backup to an external drive and then bury that drive in your backyard for 25 years (properly sealed). After you dig it up, as long as you have the passphrase, can read the drive&amp;rsquo;s filesystem (ext4 for me), and can execute a binary compiled for whatever architecture you were using 25 years ago (x86-64 for me) &amp;ndash; both highly likely given the commonality of those systems &amp;ndash; you are going to have no problem restoring that data (subject to the physics of spinning rust). An unlikely scenario perhaps, but that&amp;rsquo;s sort of the data backup baseline we plan for here at pig-monkey.com.&lt;/p&gt;</content><category term="general"/><category term="backups"/><category term="linux"/></entry><entry><title>Restic Adoption</title><link href="https://pig-monkey.com/2026/05/restic-adoption/" rel="alternate"/><published>2026-05-06T00:00:00-07:00</published><updated>2026-05-06T08:26:42.653975-07:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2026-05-06:/2026/05/restic-adoption/</id><summary type="html">&lt;p&gt;After mulling it over for many cycles, I finally decided to migrate my online backups to &lt;a href="https://restic.net/"&gt;Restic&lt;/a&gt;. As is my wont, I have published my solution as &lt;a href="https://github.com/pigmonkey/restash/"&gt;Restash&lt;/a&gt; so that members of the Pig Monkey Data Backups Fan Club can be like me.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://github.com/pigmonkey/restash/blob/master/restash"&gt;&lt;code&gt;restash&lt;/code&gt; script&lt;/a&gt; will look pretty familiar …&lt;/p&gt;</summary><content type="html">&lt;p&gt;After mulling it over for many cycles, I finally decided to migrate my online backups to &lt;a href="https://restic.net/"&gt;Restic&lt;/a&gt;. As is my wont, I have published my solution as &lt;a href="https://github.com/pigmonkey/restash/"&gt;Restash&lt;/a&gt; so that members of the Pig Monkey Data Backups Fan Club can be like me.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://github.com/pigmonkey/restash/blob/master/restash"&gt;&lt;code&gt;restash&lt;/code&gt; script&lt;/a&gt; will look pretty familiar to anyone who has been using my old &lt;a href="/2017/07/borg/"&gt;Borg wrapper script&lt;/a&gt;. It is mostly the same basic structure, with Borg logic replaced with Restic logic, and two other significant differences.&lt;/p&gt;
&lt;p&gt;Previously I ran the Borg wrapper hourly via a systemd timer, and used &lt;a href="https://github.com/pigmonkey/backitup"&gt;backitup&lt;/a&gt; to run the verification checks (and &lt;a href="/2024/07/borg-compact/"&gt;compacting&lt;/a&gt;) less frequently. Now the script has subcommands, and I use different systemd units to call the different functions on different schedules &amp;ndash; backups more frequently, verification and pruning less frequently.&lt;/p&gt;
&lt;p&gt;Previously I achieved redundancy by using Borg to backup hourly to my &lt;a href="https://www.rsync.net/products/borg.html"&gt;rsync.net&lt;/a&gt; account, while &lt;a href="https://www.tarsnap.com/"&gt;Tarsnap&lt;/a&gt; ran daily backups of a smaller subset of the same data. Now I&amp;rsquo;m using Restic to backup hourly to my &lt;a href="https://www.rsync.net/products/restic.html"&gt;rsync.net&lt;/a&gt; account, and also using Restic to backup the same data daily to a &lt;a href="https://www.backblaze.com/cloud-storage"&gt;Backblaze B2&lt;/a&gt; bucket. I&amp;rsquo;ve been an rsync.net customer since 2014 and I think highly of their service, but the B2 bucket is cheap insurance that helps me &lt;a href="/2018/11/sleep/"&gt;sleep&lt;/a&gt; better.&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://github.com/pigmonkey/restash/blob/master/restash.conf.example"&gt;the example config&lt;/a&gt; you will see that the &lt;code&gt;SFTP_HOST&lt;/code&gt; is simply &lt;code&gt;restic&lt;/code&gt;. That refers to an entry in my &lt;code&gt;~/.ssh/config&lt;/code&gt;, which looks something like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Host restic
    Hostname abc123.rsync.net
    User abc123
    IdentityFile ~/.ssh/passphraseless-key
    IdentitiesOnly yes
    BatchMode yes
    ServerAliveInterval 60
    ServerAliveCountMax 3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The only other significant change from the old Borg wrapper script is that I broke out some of the config options, backup targets, and excludes to separate files to make it easier for you, my adoring public, to reuse the tool.&lt;/p&gt;
&lt;p&gt;As hinted at in the README, I still use &lt;a href="https://github.com/pigmonkey/nmtrust"&gt;nmtrust&lt;/a&gt; to only execute backups on trusted networks. Don&amp;rsquo;t be a data litterer.&lt;/p&gt;</content><category term="general"/><category term="backups"/><category term="linux"/></entry><entry><title>Cloning Backup Drives</title><link href="https://pig-monkey.com/2025/02/cloning-backup-disks/" rel="alternate"/><published>2025-02-05T00:00:00-08:00</published><updated>2025-02-05T18:21:34.710305-08:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2025-02-05:/2025/02/cloning-backup-disks/</id><summary type="html">&lt;p&gt;Continuing with the theme of &lt;a href="/2025/01/git-annex-recovery/"&gt;replacing drives&lt;/a&gt;, recently I decided to preemptively replace one of the external drives that I backup to via &lt;a href="https://rsnapshot.org/"&gt;rsnapshot&lt;/a&gt; &amp;ndash; or, more specifically, via &lt;a href="https://github.com/pigmonkey/cryptshot"&gt;cryptshot&lt;/a&gt;. The drive was functioning nominally, but its date of manufacture was 2014. That&amp;rsquo;s way too long to trust spinning rust …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Continuing with the theme of &lt;a href="/2025/01/git-annex-recovery/"&gt;replacing drives&lt;/a&gt;, recently I decided to preemptively replace one of the external drives that I backup to via &lt;a href="https://rsnapshot.org/"&gt;rsnapshot&lt;/a&gt; &amp;ndash; or, more specifically, via &lt;a href="https://github.com/pigmonkey/cryptshot"&gt;cryptshot&lt;/a&gt;. The drive was functioning nominally, but its date of manufacture was 2014. That&amp;rsquo;s way too long to trust spinning rust.&lt;/p&gt;
&lt;p&gt;rsnapshot implements deduplication via hard links. Were I to just &lt;code&gt;rsync&lt;/code&gt; the contents of the old drive to the new drive without any special consideration for the links, it would dereference the links, copying them over as separate files. This would cause the size of the backups to balloon past the capacity of the drive. Rsync provides the &lt;code&gt;--hard-links&lt;/code&gt; flag to address this, but I&amp;rsquo;ve heard some stories about this failing to act as expected when the source directory has a large number of hard links (for some unknown definition of &amp;ldquo;large&amp;rdquo;). I&amp;rsquo;ve been &lt;a href="/2012/09/cryptshot-automated-encrypted-backups-rsnapshot/"&gt;rsnapshotting since 2012&lt;/a&gt; (after a pause sometime &lt;a href="/2006/02/rsnapshot/"&gt;after 2006&lt;/a&gt;, apparently) and feel safe assuming that my rsnapshot repository does have a &amp;ldquo;large&amp;rdquo; number of hard links.&lt;/p&gt;
&lt;p&gt;I also do not really care about syncing. The destination is completely empty. There&amp;rsquo;s no file comparison that needs to happen. I don&amp;rsquo;t need to the ability to pause partway through the transfer and resume later. Rsync is my default solution for pushing files around, but in this case it is not really needed. I only want to mirror the contents of the old drive onto the new drive, exactly as they exist on the old drive. So I avoided the problem all together and just copied the partition via &lt;code&gt;dd&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Both drives are encrypted with LUKS, so first I decrypt them. Importantly, I do not mount either decrypted partition. I don&amp;rsquo;t want to risk any modifications being made to either while the copy is ongoing.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;cryptsetup&lt;span class="w"&gt; &lt;/span&gt;luksOpen&lt;span class="w"&gt; &lt;/span&gt;/dev/sda&lt;span class="w"&gt; &lt;/span&gt;old
$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;cryptsetup&lt;span class="w"&gt; &lt;/span&gt;luksOpen&lt;span class="w"&gt; &lt;/span&gt;/dev/sdb&lt;span class="w"&gt; &lt;/span&gt;new
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then I copy the old partition to the new one.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;dd&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/mapper/old&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/mapper/new&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;32M&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;progress
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;My new drive is the same size as my old drive, so after &lt;code&gt;dd&lt;/code&gt; finished I was done. If the sizes differed I would need to use &lt;code&gt;resize2fs&lt;/code&gt; to resize the partition on the new drive.&lt;/p&gt;
&lt;p&gt;If I was replacing the old drive not just because it was old and I was ageist, but because I thought it may be corrupted, I would probably do this with &lt;a href="https://www.gnu.org/software/ddrescue/ddrescue.html"&gt;GNU ddrescue&lt;/a&gt; rather than plain old &lt;code&gt;dd&lt;/code&gt;. (Though, realistically, if that was the case I&amp;rsquo;d probably just copy the contents of my other rsnapshot target drive to the new drive, and replace the corrupt drive with that. Multiple backup mediums make life easier.)&lt;/p&gt;</content><category term="general"/><category term="backups"/><category term="linux"/></entry><entry><title>Git Annex Recovery</title><link href="https://pig-monkey.com/2025/01/git-annex-recovery/" rel="alternate"/><published>2025-01-26T00:00:00-08:00</published><updated>2025-01-26T12:44:43.937577-08:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2025-01-26:/2025/01/git-annex-recovery/</id><summary type="html">&lt;p&gt;Occasionally I&amp;rsquo;ll come across some sort of corruption on one of my &lt;a href="/2016/08/storage/"&gt;cold storage drives&lt;/a&gt;. This can typically repaired in-place via &lt;a href="https://git-annex.branchable.com/git-annex-repair/"&gt;git-annex-repair&lt;/a&gt;, but I usually take it as a sign that the hard drive itself is beginning to fail. I prefer to replace the drive. At the end of …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Occasionally I&amp;rsquo;ll come across some sort of corruption on one of my &lt;a href="/2016/08/storage/"&gt;cold storage drives&lt;/a&gt;. This can typically repaired in-place via &lt;a href="https://git-annex.branchable.com/git-annex-repair/"&gt;git-annex-repair&lt;/a&gt;, but I usually take it as a sign that the hard drive itself is beginning to fail. I prefer to replace the drive. At the end of the process, I want the new drive to be mounted at the same location as the old one was, and I want the repository on the new drive to have the same UUID as the old one. This way the migration is invisible to all other copies of the repository.&lt;/p&gt;
&lt;p&gt;To do this, I first prepare the new drive using whatever sort of LUKS encryption and formatting I want, and then mount it at the same location as wherever the old drive was normally mounted to. Call this path &lt;code&gt;$good&lt;/code&gt;. The old drive I&amp;rsquo;ll mount to some other location. Call this path &lt;code&gt;$bad&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Next I create a new clone of the repository on the new drive. Most recently I did this for my video repo, which lives at &lt;code&gt;~/library/video&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;~/library/video&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$good&lt;/span&gt;/video
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;.git/config&lt;/code&gt; file from the old drive will have the UUID of the annex and other configuration options, as well as any knowledge about other remotes. I copy that into the new repo.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;cp&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$bad&lt;/span&gt;/video/.git/config&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$good&lt;/span&gt;/video/.git/config
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The actual file contents are stored in the &lt;code&gt;.git/annex/objects/&lt;/code&gt; directory. I copy those over to the new drive.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$good&lt;/span&gt;/video/.git/annex
$&lt;span class="w"&gt; &lt;/span&gt;rsync&lt;span class="w"&gt; &lt;/span&gt;-avhP&lt;span class="w"&gt; &lt;/span&gt;--no-compress&lt;span class="w"&gt; &lt;/span&gt;--info&lt;span class="o"&gt;=&lt;/span&gt;progress2&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$bad&lt;/span&gt;/video/.git/annex/objects&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$good&lt;/span&gt;/video/.git/annex/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Next I initialize the new annex. It will recognize the old config and existing objects that were copied over.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$good&lt;/span&gt;/video
$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;annex&lt;span class="w"&gt; &lt;/span&gt;init
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;At this point I could be done. But if I suspect that there was corruption in one of the files in the &lt;code&gt;.git/annex/objects&lt;/code&gt; directory that I copied over, I will next tell the annex to run a check on all its files. I&amp;rsquo;ll usually start this with &lt;code&gt;--incremental&lt;/code&gt; in case I want to kill it before it completes and resume it later. I&amp;rsquo;ll provide some integer to &lt;code&gt;--jobs&lt;/code&gt; depending on how many cores I want to devote to hashing and what I think is appropriate for the disk read and transfer speeds.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;annex&lt;span class="w"&gt; &lt;/span&gt;fsck&lt;span class="w"&gt; &lt;/span&gt;--incremental&lt;span class="w"&gt; &lt;/span&gt;--jobs&lt;span class="o"&gt;=&lt;/span&gt;N
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If any of the files did fail, I&amp;rsquo;ll make sure one of the other remotes is available and then tell the new annex to get whatever it wants.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;annex&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;--auto
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Finally, I would want to get rid of any of those corrupt objects that are now just wasting space.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;annex&lt;span class="w"&gt; &lt;/span&gt;unused
$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;annex&lt;span class="w"&gt; &lt;/span&gt;dropunused&lt;span class="w"&gt; &lt;/span&gt;all
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="general"/><category term="backups"/><category term="linux"/><category term="annex"/></entry><entry><title>Optimizing Local Munitions</title><link href="https://pig-monkey.com/2025/01/optimizing-local-munitions/" rel="alternate"/><published>2025-01-14T00:00:00-08:00</published><updated>2025-01-14T19:19:35.484626-08:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2025-01-14:/2025/01/optimizing-local-munitions/</id><summary type="html">&lt;p&gt;As previously mentioned, &lt;a href="/2017/06/repos/"&gt;I use myrepos to keep local copies of useful code repositories&lt;/a&gt;. While working with backups yesterday I noticed that this directory had gotten quite large. I realized that in the 8 years that I&amp;rsquo;ve been using this system, I&amp;rsquo;ve never once run &lt;a href="https://git-scm.com/docs/git-gc"&gt;git gc&lt;/a&gt; in …&lt;/p&gt;</summary><content type="html">&lt;p&gt;As previously mentioned, &lt;a href="/2017/06/repos/"&gt;I use myrepos to keep local copies of useful code repositories&lt;/a&gt;. While working with backups yesterday I noticed that this directory had gotten quite large. I realized that in the 8 years that I&amp;rsquo;ve been using this system, I&amp;rsquo;ve never once run &lt;a href="https://git-scm.com/docs/git-gc"&gt;git gc&lt;/a&gt; in any of the repos.&lt;/p&gt;
&lt;p&gt;Fortunately this is the sort of thing that myrepos makes simple &amp;ndash; even &lt;a href="https://myrepos.branchable.com/"&gt;providing it as an example on its homepage&lt;/a&gt;. I added two new lines to the &lt;code&gt;[DEFAULT]&lt;/code&gt; section of my &lt;code&gt;~/library/src/myrepos.conf&lt;/code&gt; file: one telling it that it can run 3 parallel jobs, and one teaching it how to run &lt;code&gt;git gc&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[DEFAULT]&lt;/span&gt;
&lt;span class="na"&gt;skip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;[ &amp;quot;$1&amp;quot; = update ] &amp;amp;&amp;amp; ! hours_since &amp;quot;$1&amp;quot; 24&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;3&lt;/span&gt;
&lt;span class="na"&gt;git_gc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;git gc &amp;quot;$@&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;That allowed me to use my existing &lt;code&gt;lmr&lt;/code&gt; alias to clean up all the git repositories. The software knows which repositories are git, and only attempts to run the command in those.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;lmr&lt;span class="w"&gt; &lt;/span&gt;gc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;After completing this process &amp;ndash; which burned through a lot of CPU &amp;ndash; my &lt;code&gt;~/library/src&lt;/code&gt; directory dropped from 70 GB to 15 GB.&lt;/p&gt;
&lt;p&gt;So that helped.&lt;/p&gt;</content><category term="general"/><category term="linux"/><category term="backups"/></entry><entry><title>Wherein the Author Learns to Compact Borg Archives</title><link href="https://pig-monkey.com/2024/07/borg-compact/" rel="alternate"/><published>2024-07-05T00:00:00-07:00</published><updated>2024-07-05T08:05:13.057539-07:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2024-07-05:/2024/07/borg-compact/</id><summary type="html">&lt;p&gt;I noticed that my &lt;a href="https://www.borgbackup.org/"&gt;Borg&lt;/a&gt; directory on &lt;a href="https://www.rsync.net/products/borg.html"&gt;The Cloud&lt;/a&gt; was 239 GB. This struck me as problematic, as I could see in my local logs that Borg itself reported the deduplicated size of all archives to be 86 GB.&lt;/p&gt;
&lt;p&gt;A web search revealed &lt;a href="https://borgbackup.readthedocs.io/en/stable/usage/compact.html"&gt;&lt;code&gt;borg compact&lt;/code&gt;&lt;/a&gt;, which apparently I have been …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I noticed that my &lt;a href="https://www.borgbackup.org/"&gt;Borg&lt;/a&gt; directory on &lt;a href="https://www.rsync.net/products/borg.html"&gt;The Cloud&lt;/a&gt; was 239 GB. This struck me as problematic, as I could see in my local logs that Borg itself reported the deduplicated size of all archives to be 86 GB.&lt;/p&gt;
&lt;p&gt;A web search revealed &lt;a href="https://borgbackup.readthedocs.io/en/stable/usage/compact.html"&gt;&lt;code&gt;borg compact&lt;/code&gt;&lt;/a&gt;, which apparently I have been meant to run manually &lt;a href="https://borgbackup.readthedocs.io/en/stable/changes.html#version-1-2-0a2-and-earlier-2019-02-24"&gt;since 2019&lt;/a&gt;. Oops. After compacting, the directory dropped from 239 GB to 81 GB.&lt;/p&gt;
&lt;p&gt;My borg wrapper script now looks like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;
&lt;span class="normal"&gt;24&lt;/span&gt;
&lt;span class="normal"&gt;25&lt;/span&gt;
&lt;span class="normal"&gt;26&lt;/span&gt;
&lt;span class="normal"&gt;27&lt;/span&gt;
&lt;span class="normal"&gt;28&lt;/span&gt;
&lt;span class="normal"&gt;29&lt;/span&gt;
&lt;span class="normal"&gt;30&lt;/span&gt;
&lt;span class="normal"&gt;31&lt;/span&gt;
&lt;span class="normal"&gt;32&lt;/span&gt;
&lt;span class="normal"&gt;33&lt;/span&gt;
&lt;span class="normal"&gt;34&lt;/span&gt;
&lt;span class="normal"&gt;35&lt;/span&gt;
&lt;span class="normal"&gt;36&lt;/span&gt;
&lt;span class="normal"&gt;37&lt;/span&gt;
&lt;span class="normal"&gt;38&lt;/span&gt;
&lt;span class="normal"&gt;39&lt;/span&gt;
&lt;span class="normal"&gt;40&lt;/span&gt;
&lt;span class="normal"&gt;41&lt;/span&gt;
&lt;span class="normal"&gt;42&lt;/span&gt;
&lt;span class="normal"&gt;43&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/.keys/borg.sh
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;BORG_REPO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;borg-rsync:borg/nous&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;BORG_REMOTE_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;borg1&amp;#39;&lt;/span&gt;

&lt;span class="c1"&gt;# Create backups&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Creating backups...&amp;quot;&lt;/span&gt;
borg&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;--verbose&lt;span class="w"&gt; &lt;/span&gt;--stats&lt;span class="w"&gt; &lt;/span&gt;--compression&lt;span class="o"&gt;=&lt;/span&gt;lz4&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--exclude&lt;span class="w"&gt; &lt;/span&gt;~/projects/foo/bar/baz&lt;span class="w"&gt;                        &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--exclude&lt;span class="w"&gt; &lt;/span&gt;~/projects/xyz/bigfatbinaries&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;::&lt;span class="s1"&gt;&amp;#39;{hostname}-{user}-{utcnow:%Y-%m-%dT%H:%M:%S}&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;~/documents&lt;span class="w"&gt;                                             &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;~/projects&lt;span class="w"&gt;                                              &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;~/mail&lt;span class="w"&gt;                                                  &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# ...etc&lt;/span&gt;

&lt;span class="c1"&gt;# Prune&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Pruning backups...&amp;quot;&lt;/span&gt;
borg&lt;span class="w"&gt; &lt;/span&gt;prune&lt;span class="w"&gt; &lt;/span&gt;--verbose&lt;span class="w"&gt; &lt;/span&gt;--list&lt;span class="w"&gt; &lt;/span&gt;--glob-archives&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{hostname}-{user}-*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--keep-within&lt;span class="o"&gt;=&lt;/span&gt;1d&lt;span class="w"&gt;                                                &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--keep-daily&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;14&lt;/span&gt;&lt;span class="w"&gt;                                                 &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--keep-weekly&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="w"&gt;                                                 &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--keep-monthly&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="w"&gt;                                               &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;

&lt;span class="c1"&gt;# Compact&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Compacting repository...&amp;quot;&lt;/span&gt;
backitup&lt;span class="w"&gt;                                &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;604800&lt;/span&gt;&lt;span class="w"&gt;                           &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-l&lt;span class="w"&gt; &lt;/span&gt;~/.borg_compact-repo.lastrun&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-b&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;borg compact --verbose&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;

&lt;span class="c1"&gt;# Check&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Checking repository...&amp;quot;&lt;/span&gt;
backitup&lt;span class="w"&gt; &lt;/span&gt;-a&lt;span class="w"&gt;                                                         &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;172800&lt;/span&gt;&lt;span class="w"&gt;                                                       &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-l&lt;span class="w"&gt; &lt;/span&gt;~/.borg_check-repo.lastrun&lt;span class="w"&gt;                                   &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-b&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;borg check --verbose --repository-only --max-duration=1200&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Checking archives...&amp;quot;&lt;/span&gt;
backitup&lt;span class="w"&gt; &lt;/span&gt;-a&lt;span class="w"&gt;                                             &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;259200&lt;/span&gt;&lt;span class="w"&gt;                                           &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-l&lt;span class="w"&gt; &lt;/span&gt;~/.borg_check-arch.lastrun&lt;span class="w"&gt;                       &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-b&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;borg check --verbose --archives-only --last 18&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Other than the addition of a weekly &lt;code&gt;compact&lt;/code&gt;, my setup is the &lt;a href="/2017/07/borg/"&gt;same as it ever was&lt;/a&gt;.&lt;/p&gt;</content><category term="general"/><category term="backups"/><category term="linux"/></entry><entry><title>I published my script for creating optical backups.</title><link href="https://pig-monkey.com/2020/04/optician/" rel="alternate"/><published>2020-04-23T00:00:00-07:00</published><updated>2020-04-23T17:45:01.257656-07:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2020-04-23:/2020/04/optician/</id><summary type="html">&lt;p&gt;&lt;a href="https://github.com/pigmonkey/optician"&gt;Optician&lt;/a&gt; archives a directory, optionally encrypts it, records the integrity of all the things, and burns it to disc. I created it last year after writing about the steps I took to create &lt;a href="/2019/06/optical-financal-backups/"&gt;optical backups of financial archives&lt;/a&gt;. Since then I&amp;rsquo;ve used it to create my monthly password database …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://github.com/pigmonkey/optician"&gt;Optician&lt;/a&gt; archives a directory, optionally encrypts it, records the integrity of all the things, and burns it to disc. I created it last year after writing about the steps I took to create &lt;a href="/2019/06/optical-financal-backups/"&gt;optical backups of financial archives&lt;/a&gt;. Since then I&amp;rsquo;ve used it to create my monthly password database backups, yearly e-book library backups, and this year&amp;rsquo;s annual financial backup.&lt;/p&gt;</content><category term="general"/><category term="micro"/><category term="linux"/><category term="backups"/></entry><entry><title>New Year, New Drive</title><link href="https://pig-monkey.com/2020/01/new-year-new-drive/" rel="alternate"/><published>2020-01-19T00:00:00-08:00</published><updated>2020-01-19T16:50:17.201243-08:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2020-01-19:/2020/01/new-year-new-drive/</id><summary type="html">&lt;p&gt;My first solid state drive was a &lt;a href="https://www.samsung.com/us/computing/memory-storage/solid-state-drives/ssd-850-pro-2-5-sata-iii-1tb-mz-7ke1t0bw/"&gt;Samsung 850 Pro 1TB&lt;/a&gt; purchased in 2015. Originally I installed it in my T430s. The following year it migrated to my new &lt;a href="/2016/04/x260/"&gt;X260&lt;/a&gt;, where it has served admirably ever since. It still seems healthy, as best as I can tell. Sometime ago I …&lt;/p&gt;</summary><content type="html">&lt;p&gt;My first solid state drive was a &lt;a href="https://www.samsung.com/us/computing/memory-storage/solid-state-drives/ssd-850-pro-2-5-sata-iii-1tb-mz-7ke1t0bw/"&gt;Samsung 850 Pro 1TB&lt;/a&gt; purchased in 2015. Originally I installed it in my T430s. The following year it migrated to my new &lt;a href="/2016/04/x260/"&gt;X260&lt;/a&gt;, where it has served admirably ever since. It still seems healthy, as best as I can tell. Sometime ago I found &lt;a href="http://www.jdgleaver.co.uk/blog/2014/05/23/samsung_ssds_reading_total_bytes_written_under_linux.html"&gt;a script for measuring the health of Samsung SSDs&lt;/a&gt;. It reports:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;------------------------------&lt;/span&gt;
&lt;span class="c"&gt; SSD Status:   /dev/sda&lt;/span&gt;
&lt;span class="nb"&gt;------------------------------&lt;/span&gt;
&lt;span class="c"&gt; On time:      17&lt;/span&gt;&lt;span class="nt"&gt;,&lt;/span&gt;&lt;span class="c"&gt;277 hr&lt;/span&gt;
&lt;span class="nb"&gt;------------------------------&lt;/span&gt;
&lt;span class="c"&gt; Data written:&lt;/span&gt;
&lt;span class="c"&gt;           MB: 47&lt;/span&gt;&lt;span class="nt"&gt;,&lt;/span&gt;&lt;span class="c"&gt;420&lt;/span&gt;&lt;span class="nt"&gt;,&lt;/span&gt;&lt;span class="c"&gt;539&lt;/span&gt;&lt;span class="nt"&gt;.&lt;/span&gt;&lt;span class="c"&gt;560&lt;/span&gt;
&lt;span class="c"&gt;           GB: 46&lt;/span&gt;&lt;span class="nt"&gt;,&lt;/span&gt;&lt;span class="c"&gt;309&lt;/span&gt;&lt;span class="nt"&gt;.&lt;/span&gt;&lt;span class="c"&gt;120&lt;/span&gt;
&lt;span class="c"&gt;           TB: 45&lt;/span&gt;&lt;span class="nt"&gt;.&lt;/span&gt;&lt;span class="c"&gt;223&lt;/span&gt;
&lt;span class="nb"&gt;------------------------------&lt;/span&gt;
&lt;span class="c"&gt; Mean write rate:&lt;/span&gt;
&lt;span class="c"&gt;        MB/hr: 2&lt;/span&gt;&lt;span class="nt"&gt;,&lt;/span&gt;&lt;span class="c"&gt;744&lt;/span&gt;&lt;span class="nt"&gt;.&lt;/span&gt;&lt;span class="c"&gt;720&lt;/span&gt;
&lt;span class="nb"&gt;------------------------------&lt;/span&gt;
&lt;span class="c"&gt; Drive health: 98 %&lt;/span&gt;
&lt;span class="nb"&gt;------------------------------&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The 1 terabyte of storage has begun to feel tight over the past couple of years. I&amp;rsquo;m not sure where it all goes, but I regularly only have about 100GB free, which is not much of a buffer. I&amp;rsquo;ve had my eye on a &lt;a href="https://www.samsung.com/us/computing/memory-storage/solid-state-drives/ssd-860-evo-2-5--sata-iii-2tb-mz-76e2t0b-am/"&gt;Samsung 860 Evo 2TB&lt;/a&gt; as a replacement. Last November &lt;a href="https://camelcamelcamel.com/product/B0786QNSBD"&gt;my price monitoring tool&lt;/a&gt; notified me of a significant price drop for this new drive, so I snatched one up. This weekend I finally got around to installing it.&lt;/p&gt;
&lt;p&gt;The health script reports that my new drive is, in fact, both new and healthy:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;------------------------------&lt;/span&gt;
&lt;span class="c"&gt; SSD Status:   /dev/sda&lt;/span&gt;
&lt;span class="nb"&gt;------------------------------&lt;/span&gt;
&lt;span class="c"&gt; On time:      17 hr&lt;/span&gt;
&lt;span class="nb"&gt;------------------------------&lt;/span&gt;
&lt;span class="c"&gt; Data written:&lt;/span&gt;
&lt;span class="c"&gt;           MB: 872&lt;/span&gt;&lt;span class="nt"&gt;,&lt;/span&gt;&lt;span class="c"&gt;835&lt;/span&gt;&lt;span class="nt"&gt;.&lt;/span&gt;&lt;span class="c"&gt;635&lt;/span&gt;
&lt;span class="c"&gt;           GB: 852&lt;/span&gt;&lt;span class="nt"&gt;.&lt;/span&gt;&lt;span class="c"&gt;378&lt;/span&gt;
&lt;span class="c"&gt;           TB: &lt;/span&gt;&lt;span class="nt"&gt;.&lt;/span&gt;&lt;span class="c"&gt;832&lt;/span&gt;
&lt;span class="nb"&gt;------------------------------&lt;/span&gt;
&lt;span class="c"&gt; Mean write rate:&lt;/span&gt;
&lt;span class="c"&gt;        MB/hr: 51&lt;/span&gt;&lt;span class="nt"&gt;,&lt;/span&gt;&lt;span class="c"&gt;343&lt;/span&gt;&lt;span class="nt"&gt;.&lt;/span&gt;&lt;span class="c"&gt;272&lt;/span&gt;
&lt;span class="nb"&gt;------------------------------&lt;/span&gt;
&lt;span class="c"&gt; Drive health: 100 %&lt;/span&gt;
&lt;span class="nb"&gt;------------------------------&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;When migrating to a new drive, the simple solution is to just copy the complete contents of the old drive. I usually do not take this approach. Instead I prefer to imagine that the old drive is lost, and use the migration as an exercise to ensure that my &lt;a href="/tag/backups/"&gt;excessive backup strategies&lt;/a&gt; and &lt;a href="https://github.com/pigmonkey/spark"&gt;OS provisioning system&lt;/a&gt; are both fully operational. Successfully rebuilding my laptop like this, with a minimum expenditure of time and effort &amp;ndash; and no data loss &amp;ndash; makes me feel good about my backup and recovery tooling.&lt;/p&gt;</content><category term="general"/><category term="backups"/><category term="hardware"/></entry><entry><title>Optical Backups of Financial Archives</title><link href="https://pig-monkey.com/2019/06/optical-financal-backups/" rel="alternate"/><published>2019-06-29T00:00:00-07:00</published><updated>2019-06-29T14:49:50.497321-07:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2019-06-29:/2019/06/optical-financal-backups/</id><summary type="html">&lt;p&gt;Every year I burn an optical archive of my financial documents, similar to how (and why) I &lt;a href="/2013/05/optical-photo-backups/"&gt;create optical backups of photos&lt;/a&gt;. I schedule this financial archive for the spring, after the previous year&amp;rsquo;s taxes have been submitted and accepted. &lt;a href="https://taskwarrior.org/"&gt;Taskwarrior&lt;/a&gt; solves the problem of remembering to complete the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Every year I burn an optical archive of my financial documents, similar to how (and why) I &lt;a href="/2013/05/optical-photo-backups/"&gt;create optical backups of photos&lt;/a&gt;. I schedule this financial archive for the spring, after the previous year&amp;rsquo;s taxes have been submitted and accepted. &lt;a href="https://taskwarrior.org/"&gt;Taskwarrior&lt;/a&gt; solves the problem of remembering to complete the archive.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;task&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;project:finance&lt;span class="w"&gt; &lt;/span&gt;due:2019-04-30&lt;span class="w"&gt; &lt;/span&gt;recur:yearly&lt;span class="w"&gt; &lt;/span&gt;wait:due-4weeks&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;burn optical financial archive with parity&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The archive includes two &lt;a href="https://git-annex.branchable.com/"&gt;git-annex&lt;/a&gt; repositories.&lt;/p&gt;
&lt;p&gt;The first is my &lt;a href="https://www.ledger-cli.org/"&gt;ledger&lt;/a&gt; repository. Ledger is the double-entry accounting system I began using in 2012 to record the movement of every penny that crosses one of my bank accounts (small cash transactions, less than about $20, are usually-but-not-always except from being recorded). In addition to the plain-text ledger files, this repository also holds PDF or JPG images of receipts.&lt;/p&gt;
&lt;p&gt;The second repository holds my tax information. Each tax year gets a &lt;a href="https://git.zx2c4.com/ctmg/about/"&gt;ctmg&lt;/a&gt; container which contains any documents used to complete my tax returns, the returns themselves, and any notifications of those returns being accepted.&lt;/p&gt;
&lt;p&gt;The yearly optical archive that I create holds the entirety of these two repositories &amp;ndash; not just the information from the previous year &amp;ndash; so really each disc only needs to have a shelf life of 12 months. Keeping the older discs around just provides redundancy for prior years.&lt;/p&gt;
&lt;h2&gt;Creating the Archive&lt;/h2&gt;
&lt;p&gt;The process of creating the archive is very similar to the process I outlined six years ago for the photo archives.&lt;/p&gt;
&lt;p&gt;The two repositories, combined, are about 2GB (most of that is the directory of receipts from the ledger repository). I burn these to a 25GB BD-R disc, so file size is not a concern. I&amp;rsquo;ll &lt;code&gt;tar&lt;/code&gt; them, but skip any compression, which would just add extra complexity for no gain.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;~/tmp/archive
$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/library
$&lt;span class="w"&gt; &lt;/span&gt;tar&lt;span class="w"&gt; &lt;/span&gt;cvf&lt;span class="w"&gt; &lt;/span&gt;~/tmp/archive/ledger.tar&lt;span class="w"&gt; &lt;/span&gt;ledger
$&lt;span class="w"&gt; &lt;/span&gt;tar&lt;span class="w"&gt; &lt;/span&gt;cvf&lt;span class="w"&gt; &lt;/span&gt;~/tmp/archive/tax.tar&lt;span class="w"&gt; &lt;/span&gt;tax
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The ledger archive will get signed and encrypted with my PGP key. The contents of the tax repository are already encrypted, so I&amp;rsquo;ll skip encryption and just sign the archive. I like using detached signatures for this.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/tmp/archive
$&lt;span class="w"&gt; &lt;/span&gt;gpg&lt;span class="w"&gt; &lt;/span&gt;-e&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;peter@havenaut.net&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;ledger.tar.gpg&lt;span class="w"&gt; &lt;/span&gt;ledger.tar
$&lt;span class="w"&gt; &lt;/span&gt;gpg&lt;span class="w"&gt; &lt;/span&gt;-bo&lt;span class="w"&gt; &lt;/span&gt;ledger.tar.gpg.sig&lt;span class="w"&gt; &lt;/span&gt;ledger.tar.gpg
$&lt;span class="w"&gt; &lt;/span&gt;gpg&lt;span class="w"&gt; &lt;/span&gt;-bo&lt;span class="w"&gt; &lt;/span&gt;tax.tar.sig&lt;span class="w"&gt; &lt;/span&gt;tax.tar
$&lt;span class="w"&gt; &lt;/span&gt;rm&lt;span class="w"&gt; &lt;/span&gt;ledger.tar
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Previously, when creating optical photo archives, I used &lt;a href="https://web.archive.org/web/20160427222800/http://dvdisaster.net/en/index.html"&gt;DVDisaster&lt;/a&gt; to create the disc image with parity. DVDisaster no longer exists. The code can still be found, and the program still works, but nobody is developing it and it doesn&amp;rsquo;t even an official web presence. This makes me uncomfortable for a tool that is part of my long-term archiving plans. As a result, I&amp;rsquo;ve moved back to using &lt;a href="https://parchive.github.io/"&gt;Parchive&lt;/a&gt; for parity. Parchive also does not have much in the way of active development around it, but it &lt;a href="https://github.com/Parchive/par2cmdline/commits/master"&gt;is still maintained&lt;/a&gt;, has been around for a long period of time, is still used by a wide community, and will probably continue to exist as long as people share files on less-than-perfectly-reliable mediums.&lt;/p&gt;
&lt;p&gt;As previously mentioned, I&amp;rsquo;m not worried about the storage space for these files, so I tell &lt;code&gt;par2create&lt;/code&gt; to create PAR2 files with 30% redundancy. I suppose I could go even higher, but 30% seems like a good number. By default this process will be allowed to use 16MB of memory, which is cute, but RAM is cheap and I usually have enough to spare so I&amp;rsquo;ll give it permission to use up to 8GB.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;par2create&lt;span class="w"&gt; &lt;/span&gt;-r30&lt;span class="w"&gt; &lt;/span&gt;-m8000&lt;span class="w"&gt; &lt;/span&gt;recovery.par2&lt;span class="w"&gt; &lt;/span&gt;*
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Next I&amp;rsquo;ll use &lt;a href="http://md5deep.sourceforge.net/"&gt;hashdeep&lt;/a&gt; to generate message digests for all the files in the archive.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;hashdeep&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;hashes
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;At this point all the file processing is completed. I&amp;rsquo;ll put a blank disc in my burner (a &lt;a href="https://pioneerelectronics.com/PUSA/Computer/Computer+Drives/BDR-XD05B"&gt;Pioneer BDR-XD05B&lt;/a&gt;) and burn the directory using &lt;a href="http://fy.chalmers.se/~appro/linux/DVD+RW/"&gt;growisofs&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;growisofs&lt;span class="w"&gt; &lt;/span&gt;-Z&lt;span class="w"&gt; &lt;/span&gt;/dev/sr0&lt;span class="w"&gt; &lt;/span&gt;-V&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Finances 2019&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;*
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Verification&lt;/h2&gt;
&lt;p&gt;The final step is to verify the disc. I have a few options on this front. These are the same steps I&amp;rsquo;d take years down the road if I actually needed to recover data from the archive.&lt;/p&gt;
&lt;p&gt;I can use the previous hashes to find any files that do not match, which is a quick way to identify bit rot.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;hashdeep&lt;span class="w"&gt; &lt;/span&gt;-x&lt;span class="w"&gt; &lt;/span&gt;-k&lt;span class="w"&gt; &lt;/span&gt;hashes&lt;span class="w"&gt; &lt;/span&gt;*.&lt;span class="o"&gt;{&lt;/span&gt;gpg,tar,sig,par2&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I can check the integrity of the PGP signatures.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;gpg&lt;span class="w"&gt; &lt;/span&gt;--verify&lt;span class="w"&gt; &lt;/span&gt;tax.tar.gpg&lt;span class="o"&gt;{&lt;/span&gt;.sig,&lt;span class="o"&gt;}&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;gpg&lt;span class="w"&gt; &lt;/span&gt;--verify&lt;span class="w"&gt; &lt;/span&gt;tax.tar&lt;span class="o"&gt;{&lt;/span&gt;.sig,&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I can use the PAR2 files to verify the original data files.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;par2&lt;span class="w"&gt; &lt;/span&gt;verify&lt;span class="w"&gt; &lt;/span&gt;recovery.par2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="general"/><category term="backups"/><category term="crypto"/><category term="linux"/><category term="annex"/></entry><entry><title>Archiving Bookmarks</title><link href="https://pig-monkey.com/2018/11/archiving-bookmarks/" rel="alternate"/><published>2018-11-23T00:00:00-08:00</published><updated>2018-12-01T19:30:07.517631-08:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2018-11-23:/2018/11/archiving-bookmarks/</id><summary type="html">&lt;p&gt;I signed-up for &lt;a href="https://pinboard.in/"&gt;Pinboard&lt;/a&gt; in 2014. It provides everything I need from a bookmarking service, which is mostly, you know, bookmarking. I pay for the &lt;a href="https://pinboard.in/upgrade/"&gt;archival account&lt;/a&gt;, meaning that Pinboard downloads a copy of everything I bookmark and provides me with full-text search. I find this useful and well worth …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I signed-up for &lt;a href="https://pinboard.in/"&gt;Pinboard&lt;/a&gt; in 2014. It provides everything I need from a bookmarking service, which is mostly, you know, bookmarking. I pay for the &lt;a href="https://pinboard.in/upgrade/"&gt;archival account&lt;/a&gt;, meaning that Pinboard downloads a copy of everything I bookmark and provides me with full-text search. I find this useful and well worth the $25 yearly fee, but Pinboard&amp;rsquo;s archive is only part of the solution. I also need an offline copy of my bookmarks.&lt;/p&gt;
&lt;p&gt;Pinboard provides an &lt;a href="https://pinboard.in/api/"&gt;API&lt;/a&gt; that makes it easy to acquire a list of bookmarks. I have a &lt;a href="https://github.com/pigmonkey/systools/blob/master/pinboard-backup.sh"&gt;small shell script&lt;/a&gt; which pulls down a JSON-formatted list of my bookmarks and adds the file to &lt;a href="https://git-annex.branchable.com/"&gt;git-annex&lt;/a&gt;. This is controlled via a systemd &lt;a href="https://github.com/pigmonkey/dotfiles/blob/master/config/systemd/user/pinboard-backup.service"&gt;service&lt;/a&gt; and &lt;a href="https://github.com/pigmonkey/dotfiles/blob/master/config/systemd/user/pinboard-backup.timer"&gt;timer&lt;/a&gt;, which wraps the script in &lt;a href="https://github.com/pigmonkey/backitup/"&gt;backitup&lt;/a&gt; to ensure daily dumps. The systemd timer itself is controlled by &lt;a href="https://github.com/pigmonkey/nmtrust"&gt;nmtrust&lt;/a&gt;, so that it only runs when I am connected to a trusted network.&lt;/p&gt;
&lt;p&gt;This provides data portability, ensuring that I could import my tagged URLs to another bookmarking service if I ever found something better than Pinboard (unlikely, &lt;a href="https://blog.pinboard.in/2017/06/pinboard_acquires_delicious/"&gt;competing with Pinboard is futile&lt;/a&gt;). But I also want a locally archived copy of the pages themselves, which Pinboard does not offer through the API. I carry very much about being able to &lt;a href="/2012/10/working-offline/"&gt;work offline&lt;/a&gt;. The usefulness of a computer is directly propertional to the amount of data that is accessible without a network connection.&lt;/p&gt;
&lt;p&gt;To address this I use &lt;a href="https://github.com/pirate/bookmark-archiver"&gt;bookmark-archiver&lt;/a&gt;, a Python script which reads URLs from a variety of input files, including Pinboard&amp;rsquo;s JSON dumps. It archives each URL via wget, generates a screenshot and PDF via headless Chromium, and submits the URL to the Internet Archive (&lt;a href="https://github.com/pirate/bookmark-archiver/issues/6"&gt;with WARC hopefully on the way&lt;/a&gt;). It will then generate an HTML index page, allowing the archives to be easily browsed. When I want to browse the archive, I simply change into the directory and use &lt;code&gt;python -m http.server&lt;/code&gt; to serve the bookmarks at &lt;code&gt;localhost:8000&lt;/code&gt;. Once downloaded locally, the archives are of course backed up, via the usual suspects like &lt;a href="/2017/07/borg/"&gt;borg&lt;/a&gt; and &lt;a href="https://github.com/pigmonkey/cryptshot"&gt;cryptshot&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The archiver is configured via environment variables. I configure my preferences and point the program at the Pinboard JSON dump in my annex via &lt;a href="https://github.com/pigmonkey/systools/blob/master/bookmark-archiver"&gt;a shell script&lt;/a&gt; (creatively also named &lt;code&gt;bookmark-archiver&lt;/code&gt;). This wrapper script &lt;a href="https://github.com/pigmonkey/systools/blob/master/pinboard-backup.sh#L14"&gt;is called by the previous script&lt;/a&gt; which dumps the JSON from Pinboard.&lt;/p&gt;
&lt;p&gt;The result of all of this is that every day I get a fresh dump of all my bookmarks, each URL is archived locally in multiple formats, and the archive enters into my normal backup queue. &lt;a href="https://www.gwern.net/Archiving-URLs#link-rot"&gt;Link rot&lt;/a&gt; may &lt;a href="https://www.theatlantic.com/technology/archive/2013/09/49-of-the-links-cited-in-supreme-court-decisions-are-broken/279901/"&gt;defeat the Supreme Court&lt;/a&gt;, but between this and my &lt;a href="/2017/06/repos/"&gt;automated repository tracking&lt;/a&gt; I have a pretty good system for backing up useful pieces of other people&amp;rsquo;s data.&lt;/p&gt;</content><category term="general"/><category term="annex"/><category term="linux"/><category term="backups"/></entry><entry><title>On E-Books</title><link href="https://pig-monkey.com/2018/11/ebooks/" rel="alternate"/><published>2018-11-17T00:00:00-08:00</published><updated>2018-11-17T16:07:18.096775-08:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2018-11-17:/2018/11/ebooks/</id><summary type="html">&lt;p&gt;The &lt;a href="https://en.wikipedia.org/wiki/Amazon_Kindle#Kindle_Paperwhite_(2nd_generation)"&gt;Kindle Paperwhite&lt;/a&gt; has been my primary medium for consuming books since the beginning of 2014. &lt;a href="https://en.wikipedia.org/wiki/E_Ink"&gt;E Ink&lt;/a&gt; is a great display technology that I wish was more wide spread, but beyond the fact that the Kindle (and I assume other e-readers) makes for a pleasant reading experience, the real …&lt;/p&gt;</summary><content type="html">&lt;p&gt;The &lt;a href="https://en.wikipedia.org/wiki/Amazon_Kindle#Kindle_Paperwhite_(2nd_generation)"&gt;Kindle Paperwhite&lt;/a&gt; has been my primary medium for consuming books since the beginning of 2014. &lt;a href="https://en.wikipedia.org/wiki/E_Ink"&gt;E Ink&lt;/a&gt; is a great display technology that I wish was more wide spread, but beyond the fact that the Kindle (and I assume other e-readers) makes for a pleasant reading experience, the real value in electronic books is storage.&lt;/p&gt;
&lt;p&gt;At its peak my physical collection was somewhere north of 200 books. As &lt;a href="/2010/08/on-books/"&gt;I mentioned years ago&lt;/a&gt; I took inspiration from Gary Snyder&amp;rsquo;s character in The Dharma Bums and stored my books in milk crates, which stack like a bookcase for normal use and kept the collection pre-boxed for moving. But that many books still take up space, and are still annoying to move. And in some regards they are fragile &amp;ndash; redundant data storage is expensive in meatspace.&lt;/p&gt;
&lt;p&gt;My digital library currently sits at 572 books and 13 gigabytes (the size skyrocketed after I began to archive a few comics). I could not justify that many physical books in my life. I still have a collection of dead trees, but I&amp;rsquo;m down to 3 milk crates. I store my digital library in &lt;a href="https://git-annex.branchable.com/"&gt;git-annex&lt;/a&gt;, allowing me to &lt;a href="/2016/08/rclone/"&gt;redundantly replicate&lt;/a&gt; my collection across the globe, as well as keep copies in &lt;a href="/2016/08/storage/"&gt;cold storage&lt;/a&gt;. I also burn yearly &lt;a href="/2013/05/optical-photo-backups/"&gt;optical backups&lt;/a&gt; of the library to &lt;a href="https://en.wikipedia.org/wiki/M-DISC"&gt;M-DISC&lt;/a&gt;. The library is managed with &lt;a href="https://calibre-ebook.com/"&gt;Calibre&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When I first bought the Kindle it required internet access to associate with my Amazon account. Ever since then, it has been in airplane mode. I spun up a temporary wireless network for the setup that I then deleted after the process was complete, ensuring that even if Amazon&amp;rsquo;s airplane mode was untrustworthy, the device would not be able to phone home. The advantages of giving the Kindle internet access seem minute, and are far outweighed by the disadvantage of having to trust Amazon.&lt;/p&gt;
&lt;p&gt;If I purchase a book from Amazon, I select the &amp;ldquo;Download &amp;amp; Transfer via USB&amp;rdquo; option. This results in a crippled &lt;a href="https://en.wikipedia.org/wiki/Kindle_File_Format"&gt;AZW&lt;/a&gt; file. I am under the radical delusion that I should own what I purchase, so I import that file into Calibre using the &lt;a href="https://github.com/apprenticeharper/DeDRM_tools"&gt;DeDRM_tools&lt;/a&gt; plugin. This strips any DRM, making the book ready to be consumed and archived. Books are transferred between my computer and the Kindle via USB, which Calibre makes simple.&lt;/p&gt;
&lt;p&gt;When I acquire books through other channels, my preferred format is always &lt;a href="https://en.wikipedia.org/wiki/EPUB"&gt;EPUB&lt;/a&gt;: an open format that is simply a zip archive of HTML files. Calibre&amp;rsquo;s built-in conversion tools are quite good, giving me confidence that any e-book format I import into the library will be readable at any point in the future, but my preference is to store data in formats that are open, accessible, and understandable. The closer one gets to well-formatted plain text, the closer one gets to god.&lt;/p&gt;
&lt;p&gt;While the Kindle excels at the linear reading of novels, I&amp;rsquo;ve also come to appreciate digital copies of reference books and technical manuals. Often the first reading of these types of books involves lots of flipping back and forth, which is easier in the dead tree variant, but after that first reading the searchability of the digital copy is far more useful for reference. The physical size of these types of books also makes them even more difficult to carry and store than other books, all but guaranteeing you won&amp;rsquo;t have access to them when you need to reference them. Digital books solve that problem.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m confident in my ability to securely store digital data. Whenever I import a book into my library, I know that I now have permanent access to that knowledge for the rest of my life, regardless of environmental disaster, the whims of publishing houses, or the size of my living quarters.&lt;/p&gt;</content><category term="general"/><category term="books"/><category term="annex"/><category term="backups"/></entry><entry><title>LUKS Header Backup</title><link href="https://pig-monkey.com/2017/07/luks/" rel="alternate"/><published>2017-07-16T00:00:00-07:00</published><updated>2017-07-16T11:03:56.747465-07:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2017-07-16:/2017/07/luks/</id><summary type="html">&lt;p&gt;I&amp;rsquo;d neglected backup &lt;a href="https://en.wikipedia.org/wiki/Linux_Unified_Key_Setup"&gt;LUKS&lt;/a&gt; headers until &lt;a href="https://www.gwern.net/Notes#november-2016-data-loss-postmortem"&gt;Gwern&amp;rsquo;s data loss postmortem&lt;/a&gt; last year. After reading his post I dumped the headers of the drives I had accessible, but I never got around to performing the task on my less frequently accessed drives. Last month I had trouble mounting one …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I&amp;rsquo;d neglected backup &lt;a href="https://en.wikipedia.org/wiki/Linux_Unified_Key_Setup"&gt;LUKS&lt;/a&gt; headers until &lt;a href="https://www.gwern.net/Notes#november-2016-data-loss-postmortem"&gt;Gwern&amp;rsquo;s data loss postmortem&lt;/a&gt; last year. After reading his post I dumped the headers of the drives I had accessible, but I never got around to performing the task on my less frequently accessed drives. Last month I had trouble mounting one of those drives. It turned out I was simply using the wrong passphrase, but the experience prompted me to make sure I had completed the header backup procedure for all drives.&lt;/p&gt;
&lt;p&gt;I dump the header to memory using &lt;a href="https://wiki.archlinux.org/index.php/Dm-crypt/Device_encryption#Backup_using_cryptsetup"&gt;the procedure from the Arch wiki&lt;/a&gt;. This is probably unnecessary, but only takes a few extra steps. The header is stored in my password store, which is obsessively backed up.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;/mnt/tmp
$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;mount&lt;span class="w"&gt; &lt;/span&gt;ramfs&lt;span class="w"&gt; &lt;/span&gt;/mnt/tmp&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;ramfs
$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;cryptsetup&lt;span class="w"&gt; &lt;/span&gt;luksHeaderBackup&lt;span class="w"&gt; &lt;/span&gt;/dev/sdc&lt;span class="w"&gt; &lt;/span&gt;--header-backup-file&lt;span class="w"&gt; &lt;/span&gt;/mnt/tmp/dump
$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;chown&lt;span class="w"&gt; &lt;/span&gt;pigmonkey:pigmonkey&lt;span class="w"&gt; &lt;/span&gt;/mnt/tmp/dump
$&lt;span class="w"&gt; &lt;/span&gt;pass&lt;span class="w"&gt; &lt;/span&gt;insert&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;crypt/luksheader/themisto&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;&lt;span class="w"&gt; &lt;/span&gt;/mnt/tmp/dump
$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;umount&lt;span class="w"&gt; &lt;/span&gt;/mnt/tmp
$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;rmdir&lt;span class="w"&gt; &lt;/span&gt;/mnt/tmp
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="general"/><category term="backups"/><category term="crypto"/><category term="linux"/></entry><entry><title>Borg Assimilation</title><link href="https://pig-monkey.com/2017/07/borg/" rel="alternate"/><published>2017-07-05T00:00:00-07:00</published><updated>2017-11-15T10:10:07.935016-08:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2017-07-05:/2017/07/borg/</id><summary type="html">&lt;p&gt;For years the core of my backup strategy has been &lt;a href="http://rsnapshot.org/"&gt;rsnapshot&lt;/a&gt; via &lt;a href="https://github.com/pigmonkey/cryptshot"&gt;cryptshot&lt;/a&gt; to various external drives for local backups, and &lt;a href="https://www.tarsnap.com/"&gt;Tarsnap&lt;/a&gt; for remote backups.&lt;/p&gt;
&lt;p&gt;Tarsnap, however, can be slow. It tends to take somewhere between 15 to 20 minutes to create my dozen or so archives, even if little …&lt;/p&gt;</summary><content type="html">&lt;p&gt;For years the core of my backup strategy has been &lt;a href="http://rsnapshot.org/"&gt;rsnapshot&lt;/a&gt; via &lt;a href="https://github.com/pigmonkey/cryptshot"&gt;cryptshot&lt;/a&gt; to various external drives for local backups, and &lt;a href="https://www.tarsnap.com/"&gt;Tarsnap&lt;/a&gt; for remote backups.&lt;/p&gt;
&lt;p&gt;Tarsnap, however, can be slow. It tends to take somewhere between 15 to 20 minutes to create my dozen or so archives, even if little has changed since the last run. My impression is that this is simply due to the number of archives I have stored and the number of files I ask it to archive. Once it has decided what to do, the time spent transferring data is negligible. I run Tarsnap hourly. Twenty minutes out of every hour seems like a lot of time spent Tarsnapping.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve  eyed &lt;a href="https://github.com/borgbackup/borg"&gt;Borg&lt;/a&gt; for a while (and before that, &lt;a href="https://attic-backup.org/"&gt;Attic&lt;/a&gt;), but avoided using it due to the rapid development of its earlier days. While activity is nice, too many changes too close together do not create a reassuring image of a backup project. Borg seems to have stabilized now and has a large enough user base that I feel comfortable with it. About a month ago, I began using it to backup my laptop to &lt;a href="http://www.rsync.net/products/attic.html"&gt;rsync.net&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Initially I played with &lt;a href="https://torsion.org/borgmatic/"&gt;borgmatic&lt;/a&gt; to perform and maintain the backups. Unfortunately it seems to have issues with signal handling, which caused me to end up with annoying lock files left over from interrupted backups. Borg itself has &lt;a href="https://borgbackup.readthedocs.io/en/stable/"&gt;good documentation&lt;/a&gt; and is &lt;a href="https://borgbackup.readthedocs.io/en/stable/usage.html"&gt;easy to use&lt;/a&gt;, and I think it is useful to build familiarity with the program itself instead of only interacting with it through something else. So I did away with borgmatic and wrote a small bash script to handle my use case.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://borgbackup.readthedocs.io/en/stable/usage.html#borg-create"&gt;Creating the backups&lt;/a&gt; is simple enough. Borg disables compression by default, but after a little experimentation I found that LZ4 seemed to be a decent compromise between compression and performance.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://borgbackup.readthedocs.io/en/stable/usage.html#borg-prune"&gt;Pruning backups&lt;/a&gt; is equally easy. I knew I wanted to match roughly what I had with Tarsnap: hourly backups for a day or so, daily backups for a week or so, then a month or two of weekly backups, and finally a year or so of monthly backups.&lt;/p&gt;
&lt;p&gt;My only hesitation was in how to maintain the health of the backups. Borg provides the convenient &lt;a href="https://borgbackup.readthedocs.io/en/stable/usage.html#borg-check"&gt;borg check&lt;/a&gt; command, which is able to verify the consistency of both a repository and the archives themselves. Unsurprisingly, this is a slow process. I didn&amp;rsquo;t want to run it with my hourly backups. Daily, or perhaps even weekly, seemed more reasonable, but I did want to make sure that both checks were completed successfully with some frequency. Luckily this is just the problem that I wrote &lt;a href="https://github.com/pigmonkey/backitup"&gt;backitup&lt;/a&gt; to solve.&lt;/p&gt;
&lt;p&gt;Because the consistency checks take a while and consume some resources, I thought it would also be a good idea to avoid performing them when I&amp;rsquo;m running on battery. Giving backitup the ability to detect if the machine is on battery or AC power was &lt;a href="https://github.com/pigmonkey/backitup/commit/0cd4d3a45df02a5f592617f8a4ad3811a02c9a38"&gt;a simple hack&lt;/a&gt;. The script now features the &lt;code&gt;-a&lt;/code&gt; switch to specify that the program should only be executed when on AC power.&lt;/p&gt;
&lt;p&gt;My completed Borg wrapper is thus:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;
&lt;span class="normal"&gt;24&lt;/span&gt;
&lt;span class="normal"&gt;25&lt;/span&gt;
&lt;span class="normal"&gt;26&lt;/span&gt;
&lt;span class="normal"&gt;27&lt;/span&gt;
&lt;span class="normal"&gt;28&lt;/span&gt;
&lt;span class="normal"&gt;29&lt;/span&gt;
&lt;span class="normal"&gt;30&lt;/span&gt;
&lt;span class="normal"&gt;31&lt;/span&gt;
&lt;span class="normal"&gt;32&lt;/span&gt;
&lt;span class="normal"&gt;33&lt;/span&gt;
&lt;span class="normal"&gt;34&lt;/span&gt;
&lt;span class="normal"&gt;35&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;BORG_PASSPHRASE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;supers3cr3t&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;BORG_REPO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;borg-rsync:borg/nous&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;BORG_REMOTE_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;borg1&amp;#39;&lt;/span&gt;

&lt;span class="c1"&gt;# Create backups&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Creating backups...&amp;quot;&lt;/span&gt;
borg&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;--verbose&lt;span class="w"&gt; &lt;/span&gt;--stats&lt;span class="w"&gt; &lt;/span&gt;--compression&lt;span class="o"&gt;=&lt;/span&gt;lz4&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--exclude&lt;span class="w"&gt; &lt;/span&gt;~/projects/foo/bar/baz&lt;span class="w"&gt;                        &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--exclude&lt;span class="w"&gt; &lt;/span&gt;~/projects/xyz/bigfatbinaries&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;::&lt;span class="s1"&gt;&amp;#39;{hostname}-{user}-{utcnow:%Y-%m-%dT%H:%M:%S}&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;~/documents&lt;span class="w"&gt;                                             &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;~/projects&lt;span class="w"&gt;                                              &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;~/mail&lt;span class="w"&gt;                                                  &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# ...etc&lt;/span&gt;

&lt;span class="c1"&gt;# Prune backups&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Pruning backups...&amp;quot;&lt;/span&gt;
borg&lt;span class="w"&gt; &lt;/span&gt;prune&lt;span class="w"&gt; &lt;/span&gt;--verbose&lt;span class="w"&gt; &lt;/span&gt;--list&lt;span class="w"&gt; &lt;/span&gt;--prefix&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{hostname}-{user}-&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--keep-within&lt;span class="o"&gt;=&lt;/span&gt;2d&lt;span class="w"&gt;                                         &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--keep-daily&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;14&lt;/span&gt;&lt;span class="w"&gt;                                          &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--keep-weekly&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="w"&gt;                                          &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--keep-monthly&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="w"&gt;                                        &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;

&lt;span class="c1"&gt;# Check backups&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Checking repository...&amp;quot;&lt;/span&gt;
backitup&lt;span class="w"&gt; &lt;/span&gt;-a&lt;span class="w"&gt;                                             &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;172800&lt;/span&gt;&lt;span class="w"&gt;                                           &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-l&lt;span class="w"&gt; &lt;/span&gt;~/.borg_check-repo.lastrun&lt;span class="w"&gt;                       &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-b&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;borg check --verbose --repository-only&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Checking archives...&amp;quot;&lt;/span&gt;
backitup&lt;span class="w"&gt; &lt;/span&gt;-a&lt;span class="w"&gt;                                             &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;259200&lt;/span&gt;&lt;span class="w"&gt;                                           &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-l&lt;span class="w"&gt; &lt;/span&gt;~/.borg_check-arch.lastrun&lt;span class="w"&gt;                       &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-b&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;borg check --verbose --archives-only --last 24&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is executed by a &lt;a href="https://github.com/pigmonkey/dotfiles/blob/master/config/systemd/user/borg.service"&gt;systemd service&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;span class="na"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Borg Backup&lt;/span&gt;

&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;oneshot&lt;/span&gt;
&lt;span class="na"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/home/pigmonkey/bin/borgwrapper.sh&lt;/span&gt;

&lt;span class="k"&gt;[Install]&lt;/span&gt;
&lt;span class="na"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;multi-user.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The service is called hourly by a &lt;a href="https://github.com/pigmonkey/dotfiles/blob/master/config/systemd/user/borg.timer"&gt;systemd timer&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;span class="na"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Borg Backup Timer&lt;/span&gt;

&lt;span class="k"&gt;[Timer]&lt;/span&gt;
&lt;span class="na"&gt;Unit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;borg.service&lt;/span&gt;
&lt;span class="na"&gt;OnCalendar&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;hourly&lt;/span&gt;
&lt;span class="na"&gt;Persistent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;True&lt;/span&gt;

&lt;span class="k"&gt;[Install]&lt;/span&gt;
&lt;span class="na"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;timers.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I don&amp;rsquo;t enable the timer directly, but add it to &lt;code&gt;/usr/local/etc/trusted_units&lt;/code&gt; so that &lt;a href="https://github.com/pigmonkey/nmtrust"&gt;nmtrust&lt;/a&gt; activates it when I&amp;rsquo;m connected to trusted networks.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;borg.timer,user:pigmonkey&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/usr/local/etc/trusted_units
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I&amp;rsquo;ve been running this for about a month now and have been pleased with the results. It averages about 30 seconds to create the backups every hour, and another 30 seconds or so to prune the old ones. As with Tarsnap, deduplication is great.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;------------------------------------------------------------------------------&lt;/span&gt;
&lt;span class="c"&gt;                       Original size      Compressed size    Deduplicated size&lt;/span&gt;
&lt;span class="c"&gt;This archive:               19&lt;/span&gt;&lt;span class="nt"&gt;.&lt;/span&gt;&lt;span class="c"&gt;87 GB             18&lt;/span&gt;&lt;span class="nt"&gt;.&lt;/span&gt;&lt;span class="c"&gt;41 GB             10&lt;/span&gt;&lt;span class="nt"&gt;.&lt;/span&gt;&lt;span class="c"&gt;21 MB&lt;/span&gt;
&lt;span class="c"&gt;All archives:              836&lt;/span&gt;&lt;span class="nt"&gt;.&lt;/span&gt;&lt;span class="c"&gt;02 GB            773&lt;/span&gt;&lt;span class="nt"&gt;.&lt;/span&gt;&lt;span class="c"&gt;35 GB             19&lt;/span&gt;&lt;span class="nt"&gt;.&lt;/span&gt;&lt;span class="c"&gt;32 GB&lt;/span&gt;
&lt;span class="c"&gt;                       Unique chunks         Total chunks&lt;/span&gt;
&lt;span class="c"&gt;Chunk index:                  371527             14704634&lt;/span&gt;
&lt;span class="nb"&gt;------------------------------------------------------------------------------&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The most recent repository consistency check took about 30 minutes, but only runs every 172800 seconds, or once every other day. The most recent archive consistency check took about 40 minutes, but only runs every 259200 seconds, or once per 3 days. I&amp;rsquo;m not sure that those schedules are the best option for the consistency checks. I may tweak their frequencies, but because I know they will only be executed when I am on a trusted network and AC power, I&amp;rsquo;m less concerned about the length of time.&lt;/p&gt;
&lt;p&gt;With Borg running hourly, I&amp;rsquo;ve reduced Tarsnap to run only once per day. Time will tell if Borg will slow as the number of stored archives increase, but for now running Borg hourly and Tarsnap daily seems like a great setup. Tarsnap and Borg both target the same files (with a few exceptions). Tarsnap runs in the AWS us-east-1 region. I&amp;rsquo;ve always kept my rsync.net account in their Zurich datacenter. This provides the kind of redundancy that lets me rest easy.&lt;/p&gt;
&lt;p&gt;Contrary to what you might expect given the &lt;a href="/tag/backups/"&gt;number of blog posts on the subject&lt;/a&gt;, I actually spend close to no time worrying about data loss in my day to day life, thanks to stuff like this. An ounce of prevention, and all that. (Maybe a few kilograms of prevention in my case.)&lt;/p&gt;</content><category term="general"/><category term="backups"/><category term="crypto"/><category term="linux"/></entry><entry><title>Automated Repository Tracking</title><link href="https://pig-monkey.com/2017/06/repos/" rel="alternate"/><published>2017-06-29T00:00:00-07:00</published><updated>2017-06-29T20:45:55.755985-07:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2017-06-29:/2017/06/repos/</id><summary type="html">&lt;p&gt;I have confidence in my backup strategies for my own data, but until recently I had not considered backing up other people&amp;rsquo;s data.&lt;/p&gt;
&lt;p&gt;Recently, the author of a repository that I tracked on GitHub deleted his account and disappeared from the information super highway. I had a local copy …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I have confidence in my backup strategies for my own data, but until recently I had not considered backing up other people&amp;rsquo;s data.&lt;/p&gt;
&lt;p&gt;Recently, the author of a repository that I tracked on GitHub deleted his account and disappeared from the information super highway. I had a local copy of the repository, but I had not pulled it for a month. A number of recent changes were lost to me. This inspired me to setup the system I now use to automatically update local copies of any code repositories that are useful or interesting to me.&lt;/p&gt;
&lt;p&gt;I clone the repositories into &lt;code&gt;~/library/src&lt;/code&gt; and use &lt;a href="https://myrepos.branchable.com/"&gt;myrepos&lt;/a&gt; to interact with them. I use myrepos for work and personal repositories as well, so to keep this stuff segregated I setup a separate config file and a &lt;a href="https://github.com/pigmonkey/dotfiles/blob/master/aliases#L63"&gt;shell alias&lt;/a&gt; to refer to it.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;lmr&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="nx"&gt;mr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nx"&gt;HOME&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="kn"&gt;library&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;myrepos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;conf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;directory&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nx"&gt;HOME&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="kn"&gt;library&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Now when I want to add a new repository, I clone it normally and register it with myrepos.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/library/src
$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/warner/magic-wormhole
$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;magic-wormhole&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;lmr&lt;span class="w"&gt; &lt;/span&gt;register
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;~/library/src/myrepos.conf&lt;/code&gt; file has a default section which states that no repository should be updated more than once every 24 hours.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[DEFAULT]&lt;/span&gt;
&lt;span class="na"&gt;skip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;[ &amp;quot;$1&amp;quot; = update ] &amp;amp;&amp;amp; ! hours_since &amp;quot;$1&amp;quot; 24&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Now I can ask myrepos to update all of my tracked repositories. If it sees that it has already updated a repository within 24 hours, myrepos will skip the repository.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;lmr&lt;span class="w"&gt; &lt;/span&gt;update
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;To automate this I create a &lt;a href="https://github.com/pigmonkey/dotfiles/blob/master/config/systemd/user/library-repos.service"&gt;systemd service&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;span class="na"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Update library repositories&lt;/span&gt;

&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;oneshot&lt;/span&gt;
&lt;span class="na"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/bin/mr --config %h/library/src/myrepos.conf -j5 update&lt;/span&gt;

&lt;span class="k"&gt;[Install]&lt;/span&gt;
&lt;span class="na"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;multi-user.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And a &lt;a href="https://github.com/pigmonkey/dotfiles/blob/master/config/systemd/user/library-repos.timer"&gt;systemd timer to run the service every hour&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;span class="na"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Update library repositories timer&lt;/span&gt;

&lt;span class="k"&gt;[Timer]&lt;/span&gt;
&lt;span class="na"&gt;Unit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;library-repos.service&lt;/span&gt;
&lt;span class="na"&gt;OnCalendar&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;hourly&lt;/span&gt;
&lt;span class="na"&gt;Persistent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;True&lt;/span&gt;

&lt;span class="k"&gt;[Install]&lt;/span&gt;
&lt;span class="na"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;timers.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I don&amp;rsquo;t enable this timer directly, but instead add it to my &lt;code&gt;trusted_units&lt;/code&gt; file so that &lt;a href="https://github.com/pigmonkey/nmtrust"&gt;nmtrust&lt;/a&gt; will enable it only when I am on a trusted network.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;library-repos.timer,user:pigmonkey&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/usr/local/etc/trusted_units
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If I&amp;rsquo;m curious to see what has been recently active, I can &lt;code&gt;ls -ltr ~/library/src&lt;/code&gt;. I find this more useful than &lt;a href="https://help.github.com/articles/about-stars/"&gt;GitHub stars&lt;/a&gt; or similar bookmarking.&lt;/p&gt;
&lt;p&gt;I currently track 120 repositories. This is only 3.3 GB, which means I can incorporate it into my normal backup strategies without being concerned about the extra space.&lt;/p&gt;
&lt;p&gt;The internet can be fickle, but it will be difficult for me to loose a repository again.&lt;/p&gt;</content><category term="general"/><category term="linux"/><category term="backups"/></entry><entry><title>Cold Storage</title><link href="https://pig-monkey.com/2016/08/storage/" rel="alternate"/><published>2016-08-26T00:00:00-07:00</published><updated>2016-08-27T18:19:34.591277-07:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2016-08-26:/2016/08/storage/</id><summary type="html">&lt;p&gt;This past spring I mentioned my &lt;a href="/2016/03/backup/"&gt;cold storage setup&lt;/a&gt;: a number of encrypted 2.5&amp;rdquo; drives in external enclosures, stored inside a &lt;a href="http://www.pelican.com/us/en/product/watertight-protector-hard-cases/small-case/standard/1200/"&gt;Pelican 1200&lt;/a&gt; case, secured with &lt;a href="https://securitysnobs.com/Abloy-Protec2-PL-321-Padlock.html"&gt;Abloy Protec2 321&lt;/a&gt; locks. Offline, secure, and infrequently accessed storage is an important component of any strategy for resilient data. The ease with …&lt;/p&gt;</summary><content type="html">&lt;p&gt;This past spring I mentioned my &lt;a href="/2016/03/backup/"&gt;cold storage setup&lt;/a&gt;: a number of encrypted 2.5&amp;rdquo; drives in external enclosures, stored inside a &lt;a href="http://www.pelican.com/us/en/product/watertight-protector-hard-cases/small-case/standard/1200/"&gt;Pelican 1200&lt;/a&gt; case, secured with &lt;a href="https://securitysnobs.com/Abloy-Protec2-PL-321-Padlock.html"&gt;Abloy Protec2 321&lt;/a&gt; locks. Offline, secure, and infrequently accessed storage is an important component of any strategy for resilient data. The ease with which this can be managed with &lt;a href="https://git-annex.branchable.com/"&gt;git-annex&lt;/a&gt; only increases &lt;a href="/tag/annex/"&gt;my infatuation with the software&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/pigmonkey/29168947362/in/dateposted/" title="Data Data Data Data Data"&gt;&lt;img src="https://c3.staticflickr.com/9/8405/29168947362_2c7ecc9a97_c.jpg" width="800" height="450" alt="Data Data Data Data Data"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been happy with the &lt;a href="https://www.amazon.com/gp/product/B00MPWYLHO/"&gt;Seagate ST2000LM003&lt;/a&gt; drives for this application. Unfortunately the enclosures I first purchased did not work out so well. I had two die within a few weeks. They&amp;rsquo;ve been replaced with the &lt;a href="https://www.amazon.com/gp/product/B00YT6TOJO/"&gt;SIG JU-SA0Q12-S1&lt;/a&gt;. These claim to be compatible with drives up to 8TB (someday I&amp;rsquo;ll be able to buy 8TB 2.5&amp;rdquo; drives) and support USB 3.1. They&amp;rsquo;re also a bit thinner than the previous enclosures, so I can easily fit five in my box. The Seagate drives offer about 1.7 terabytes of usable space, giving this setup a total capacity of 8.5 terabytes.&lt;/p&gt;
&lt;p&gt;Setting up git-annex to support this type of cold storage is fairly straightforward, but does necessitate some familiarity with how the program works. Personally, I prefer to do all my setup manually. I&amp;rsquo;m happy to let the &lt;a href="http://git-annex.branchable.com/assistant/"&gt;assistant&lt;/a&gt; watch my repositories and manage them after the setup, and I&amp;rsquo;ll occasionally fire up the &lt;a href="https://git-annex.branchable.com/design/assistant/webapp/"&gt;web app&lt;/a&gt; to see what the assistant daemon is doing, but I like the control and understanding provided by a manual setup. The power and flexibility of git-annex is deceptive. Using it solely through the simplified interface of the web app greatly limits what can be accomplished with it.&lt;/p&gt;
&lt;h2&gt;Encryption&lt;/h2&gt;
&lt;p&gt;Before even getting into git-annex, the drive should be encrypted with &lt;a href="https://en.wikipedia.org/wiki/Linux_Unified_Key_Setup"&gt;LUKS&lt;/a&gt;/&lt;a href="https://en.wikipedia.org/wiki/Dm-crypt"&gt;dm-crypt&lt;/a&gt;. The need for this could be avoided by using something like &lt;a href="https://git-annex.branchable.com/special_remotes/gcrypt/"&gt;gcrypt&lt;/a&gt;, but LUKS/dm-crypt is an ingrained habit and part of my workflow for all external drives. Assuming the drive is &lt;code&gt;/dev/sdc&lt;/code&gt;, pass &lt;code&gt;cryptsetup&lt;/code&gt; some sane defaults:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;cryptsetup&lt;span class="w"&gt; &lt;/span&gt;--cipher&lt;span class="w"&gt; &lt;/span&gt;aes-xts-plain64&lt;span class="w"&gt; &lt;/span&gt;--key-size&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;512&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--hash&lt;span class="w"&gt; &lt;/span&gt;sha512&lt;span class="w"&gt; &lt;/span&gt;luksFormat&lt;span class="w"&gt; &lt;/span&gt;/dev/sdc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;With the drive encrypted, it can then be opened and formatted. I&amp;rsquo;ll give the drive a human-friendly label of &lt;code&gt;themisto&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;cryptsetup&lt;span class="w"&gt; &lt;/span&gt;luksOpen&lt;span class="w"&gt; &lt;/span&gt;/dev/sdc&lt;span class="w"&gt; &lt;/span&gt;themisto_crypt
$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;mkfs.ext4&lt;span class="w"&gt; &lt;/span&gt;-L&lt;span class="w"&gt; &lt;/span&gt;themisto&lt;span class="w"&gt; &lt;/span&gt;/dev/mapper/themisto_crypt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;At this point the drive is ready. I close it and then mount it with &lt;a href="https://github.com/coldfix/udiskie"&gt;udiskie&lt;/a&gt; to make sure everything is working. How the drive is mounted doesn&amp;rsquo;t matter, but I like udiskie because it can &lt;a href="https://github.com/pigmonkey/dotfiles/blob/master/config/udiskie/config.yml#L5"&gt;integrate with my password manager&lt;/a&gt; to get the drive passphrase.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;cryptsetup&lt;span class="w"&gt; &lt;/span&gt;luksClose&lt;span class="w"&gt; &lt;/span&gt;/dev/mapper/themisto_crypt
$&lt;span class="w"&gt; &lt;/span&gt;udiskie-mount&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;/dev/sdc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Git-Annex&lt;/h2&gt;
&lt;p&gt;With the encryption handled, the drive should now be mounted at &lt;code&gt;/media/themisto&lt;/code&gt;. For the first few steps, we&amp;rsquo;ll basically follow the &lt;a href="https://git-annex.branchable.com/walkthrough/"&gt;git-annex walkthrough&lt;/a&gt;. Let&amp;rsquo;s assume that we are setting up this drive to be a repository of the annex &lt;code&gt;~/video&lt;/code&gt;. The first step is to go to the drive, clone the repository, and initialize the annex. When initializing the annex I prepend the name of the remote with &lt;code&gt;satellite :&lt;/code&gt;. My cold storage drives are all named after satellites, and doing this allows me to easily identify them when looking at a list of remotes.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/media/themisto
$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;~/video
$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;video
$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;annex&lt;span class="w"&gt; &lt;/span&gt;init&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;satellite : themisto&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Disk Reserve&lt;/h3&gt;
&lt;p&gt;Whenever dealing with a repository that is bigger (or may become bigger) than the drive it is being stored on, it is important to set a disk reserve. This tells git-annex to always keep some free space around. I generally like to set this to 1 GB, which is way larger than it needs to be.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;config&lt;span class="w"&gt; &lt;/span&gt;annex.diskreserve&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;1 gb&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Adding Remotes&lt;/h3&gt;
&lt;p&gt;I&amp;rsquo;ll then tell this new repository where the original repository is located. In this case I&amp;rsquo;ll refer to the original using the name of my computer, &lt;code&gt;nous&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;remote&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;nous&lt;span class="w"&gt; &lt;/span&gt;~/video
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If other remotes already exist, now is a good time to add them. These could be &lt;a href="https://git-annex.branchable.com/special_remotes/"&gt;special remotes&lt;/a&gt; or normal ones. For this example, let&amp;rsquo;s say that we have already completed this whole process for another cold storage drive called &lt;code&gt;sinope&lt;/code&gt;, and that we have an &lt;a href="https://git-annex.branchable.com/special_remotes/S3/"&gt;s3&lt;/a&gt; remote creatively named &lt;code&gt;s3&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;remote&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;sinope&lt;span class="w"&gt; &lt;/span&gt;/media/sinope/video
$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;AWS_ACCESS_KEY_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;...&amp;quot;&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;AWS_SECRET_ACCESS_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;...&amp;quot;&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;annex&lt;span class="w"&gt; &lt;/span&gt;enableremote&lt;span class="w"&gt; &lt;/span&gt;s3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Trust&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://git-annex.branchable.com/trust/"&gt;Trust&lt;/a&gt; is a critical component of how git-annex works. Any new annex will default to being semi-trusted, which means that when running operations within the annex on the main computer &amp;ndash; say, dropping a file &amp;ndash; git-annex will want to confirm that &lt;code&gt;themisto&lt;/code&gt; has the files that it is supposed to have. In the case of &lt;code&gt;themisto&lt;/code&gt; being a USB drive that is rarely connected, this is not very useful. I tell git-annex to trust my cold storage drives, which means that if git-annex has a record of a certain file being on the drive, it will be satisfied with that. This increases the risk for potential data-loss, but for this application I feel it is appropriate.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;annex&lt;span class="w"&gt; &lt;/span&gt;trust&lt;span class="w"&gt; &lt;/span&gt;.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Preferred Content&lt;/h3&gt;
&lt;p&gt;The final step that needs to be taken on the new repository is to tell it what files it should want. This is done using &lt;a href="https://git-annex.branchable.com/preferred_content/"&gt;preferred content&lt;/a&gt;. The &lt;a href="https://git-annex.branchable.com/preferred_content/standard_groups/"&gt;standard groups&lt;/a&gt; that git-annex ships with cover most of the bases. Of interest for this application is the &lt;code&gt;archive&lt;/code&gt; group, which wants all content except that which has already found its way to another archive. This is the behaviour I want, but I will duplicate it into a custom group called &lt;code&gt;satellite&lt;/code&gt;. This keeps my cold storage drives as standalone things that do not influence any other remotes where I may want to use the default &lt;code&gt;archive&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;annex&lt;span class="w"&gt; &lt;/span&gt;groupwanted&lt;span class="w"&gt; &lt;/span&gt;satellite&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;(not copies=satellite:1) or approxlackingcopies=1&amp;quot;&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;annex&lt;span class="w"&gt; &lt;/span&gt;group&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;satellite
$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;annex&lt;span class="w"&gt; &lt;/span&gt;wanted&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;groupwanted
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;For other repositories, I may want to store the data on multiple cold storage drives. In that case I would create a &lt;code&gt;redundantsatellite&lt;/code&gt; group that wants all content which is not already present in two other members of the group.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;annex&lt;span class="w"&gt; &lt;/span&gt;groupwanted&lt;span class="w"&gt; &lt;/span&gt;redundantsatellite&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;(not copies=redundantsatellite:2) or approxlackingcopies=1&amp;quot;&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;annex&lt;span class="w"&gt; &lt;/span&gt;group&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;redundantsatellite
$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;annex&lt;span class="w"&gt; &lt;/span&gt;wanted&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;groupwanted
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Syncing&lt;/h3&gt;
&lt;p&gt;With everything setup, the new repository is ready to sync and to start to ingest content from the remotes it knows about!&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;annex&lt;span class="w"&gt; &lt;/span&gt;sync&lt;span class="w"&gt; &lt;/span&gt;--content
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;However, the original repository also needs to know about the new remote.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/video
$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;remote&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;themisto&lt;span class="w"&gt; &lt;/span&gt;/media/themisto/video
$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;annex&lt;span class="w"&gt; &lt;/span&gt;sync
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The same is the case for any other previously existing repository, such as &lt;code&gt;sinope&lt;/code&gt;.&lt;/p&gt;</content><category term="general"/><category term="backups"/><category term="linux"/><category term="annex"/><category term="crypto"/></entry><entry><title>Redundant File Storage</title><link href="https://pig-monkey.com/2016/08/rclone/" rel="alternate"/><published>2016-08-19T00:00:00-07:00</published><updated>2016-08-19T20:27:23.295501-07:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2016-08-19:/2016/08/rclone/</id><summary type="html">&lt;p&gt;As I&amp;rsquo;ve &lt;a href="/tag/annex/"&gt;mentioned previously&lt;/a&gt;, I store just about everything that matters in &lt;a href="https://git-annex.branchable.com/"&gt;git-annex&lt;/a&gt; (the only exception is code, which is stored directly in regular git). One of git-annex&amp;rsquo;s many killer features is &lt;a href="https://git-annex.branchable.com/special_remotes/"&gt;special remotes&lt;/a&gt;. They make tenable this whole &amp;ldquo;cloud storage&amp;rdquo; thing that we do now.&lt;/p&gt;
&lt;p&gt;A special …&lt;/p&gt;</summary><content type="html">&lt;p&gt;As I&amp;rsquo;ve &lt;a href="/tag/annex/"&gt;mentioned previously&lt;/a&gt;, I store just about everything that matters in &lt;a href="https://git-annex.branchable.com/"&gt;git-annex&lt;/a&gt; (the only exception is code, which is stored directly in regular git). One of git-annex&amp;rsquo;s many killer features is &lt;a href="https://git-annex.branchable.com/special_remotes/"&gt;special remotes&lt;/a&gt;. They make tenable this whole &amp;ldquo;cloud storage&amp;rdquo; thing that we do now.&lt;/p&gt;
&lt;p&gt;A special remote allows me to store my files with a large number of service providers. It makes this easy to do by abstracting away the particulars of the provider, allowing me to interact with all of them in the same way. It makes this safe to do by providing &lt;a href="https://git-annex.branchable.com/encryption/"&gt;encryption&lt;/a&gt;. These factors encourage redundancy, reducing my reliance on any one provider.&lt;/p&gt;
&lt;p&gt;Recently I began playing with &lt;a href="http://rclone.org/"&gt;rclone&lt;/a&gt;. Rclone is a program that supports file syncing for a handful of cloud storage providers. That&amp;rsquo;s semi-interesting by itself but, more significantly, there is &lt;a href="https://github.com/DanielDent/git-annex-remote-rclone"&gt;a git-annex special remote wrapper&lt;/a&gt;. That means any of the providers supported by rclone can be used as a special remote. I looked through all of rclone&amp;rsquo;s supported providers and decided there were a few that I had no reason not to use.&lt;/p&gt;
&lt;h2&gt;Hubic&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://hubic.com/en/"&gt;Hubic&lt;/a&gt; is a storage provider from &lt;a href="https://www.ovh.com/us/"&gt;OVH&lt;/a&gt; with a data center in France. Their &lt;a href="https://hubic.com/en/offers/"&gt;pricing&lt;/a&gt; is attractive. I&amp;rsquo;d happily pay €50 per year for 10TB of storage. Unfortunately they limit connections to 10 Mbit/s. In my experience they ended up being even slower than this. Slow enough that I don&amp;rsquo;t want to give them money, but there&amp;rsquo;s still no reason not to take advantage of their free 25 GB plan.&lt;/p&gt;
&lt;p&gt;After signing up, I &lt;a href="http://rclone.org/hubic/"&gt;setup a new remote in rclone&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rclone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;
&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;New&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;configuration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;
&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Quit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;
&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;
&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hubic&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;annex&lt;/span&gt;
&lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;storage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="nf"&gt;Choose&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;below&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;your&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;own&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;value&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Amazon&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Drive&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;amazon cloud drive&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Amazon&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;S3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;also&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Dreamhost&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Ceph&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;s3&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Backblaze&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;B2&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;b2&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Dropbox&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;dropbox&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Google&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Cloud&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Storage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Google&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Drive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;google cloud storage&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Google&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Drive&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;drive&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Hubic&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;hubic&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Disk&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;local&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OneDrive&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;onedrive&amp;quot;&lt;/span&gt;
&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Openstack&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Swift&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Rackspace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Cloud&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Files&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Memset&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Memstore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OVH&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;swift&amp;quot;&lt;/span&gt;
&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Yandex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Disk&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;yandex&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;Storage&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;
&lt;span class="n"&gt;Hubic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;leave&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;blank&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;normally&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;client_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="n"&gt;Hubic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Secret&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;leave&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;blank&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;normally&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;client_secret&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="n"&gt;Remote&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;
&lt;span class="k"&gt;Use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;auto&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="vm"&gt;?&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Say&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sure&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Say&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;you&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;are&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;working&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;on&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;headless&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;machine&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Yes&lt;/span&gt;
&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;No&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;
&lt;span class="k"&gt;If&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;your&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;doesn&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;open&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;automatically&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;following&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;link&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="mf"&gt;127.0.0.1&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;53682&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;
&lt;span class="nf"&gt;Log&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;authorize&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rclone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;access&lt;/span&gt;
&lt;span class="n"&gt;Waiting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;Got&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;
&lt;span class="c1"&gt;--------------------&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;client_id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="n"&gt;client_secret&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;access_token&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;XXXXXX&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;--------------------&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Yes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OK&lt;/span&gt;
&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Edit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt;
&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Delete&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;With that setup, I went into my &lt;code&gt;~/documents&lt;/code&gt; annex and added the remote.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;annex&lt;span class="w"&gt; &lt;/span&gt;initremote&lt;span class="w"&gt; &lt;/span&gt;hubic&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;external&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;externaltype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rclone&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;hubic-annex&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;annex-documents&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;chunk&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;50MiB&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;encryption&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;shared&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rclone_layout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;lower&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mac&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;HMACSHA512
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I want git-annex to automatically send everything to Hubic, so I took advantage of &lt;a href="https://git-annex.branchable.com/preferred_content/standard_groups/"&gt;standard groups&lt;/a&gt; and put the repository in the &lt;code&gt;backup&lt;/code&gt; group.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;annex&lt;span class="w"&gt; &lt;/span&gt;wanted&lt;span class="w"&gt; &lt;/span&gt;hubic&lt;span class="w"&gt; &lt;/span&gt;standard
$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;annex&lt;span class="w"&gt; &lt;/span&gt;group&lt;span class="w"&gt; &lt;/span&gt;hubic&lt;span class="w"&gt; &lt;/span&gt;backup
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Given Hubic&amp;rsquo;s slow speed, I don&amp;rsquo;t really want to download files from it unless I need to. This can be configured in git-annex by setting the cost of the remote. Local repositories default to 100 and remote repositories default to 200. I gave the Hubic remote a high cost so that it will only be used if no other remotes are available.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;config&lt;span class="w"&gt; &lt;/span&gt;remote.hubic.annex-cost&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;500&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If you would like to try Hubic, I have a &lt;a href="https://hubic.com/home/new/?referral=FATDIA"&gt;referral code&lt;/a&gt; which gives us both an extra 5GB for free.&lt;/p&gt;
&lt;h2&gt;Backblaze B2&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.backblaze.com/b2/cloud-storage.html"&gt;B2&lt;/a&gt; is the cloud storage offering from backup company &lt;a href="https://www.backblaze.com/"&gt;Backblaze&lt;/a&gt;. I don&amp;rsquo;t know anything about them, but at $0.005 per GB I like their &lt;a href="https://www.backblaze.com/b2/cloud-storage-providers.html"&gt;pricing&lt;/a&gt;. A quick search of reviews shows that the main complaint about the service is that they offer no geographic redundancy, which is entirely irrelevant to me since I build my own redundancy with my half-dozen or so remotes per repository.&lt;/p&gt;
&lt;p&gt;Signing up with Backblaze took a bit longer. They wanted a phone number for 2-factor authentication, I wanted to give them a credit card so that I could use more than the 10GB they offer for free, and I had to generate an application key to use with rclone. After that, the &lt;a href="http://rclone.org/b2/"&gt;rclone setup&lt;/a&gt; was simple.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rclone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;
&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;New&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;configuration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;
&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Quit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;
&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;
&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b2&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;annex&lt;/span&gt;
&lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;storage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="nf"&gt;Choose&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;below&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;your&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;own&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;value&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Amazon&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Drive&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;amazon cloud drive&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Amazon&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;S3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;also&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Dreamhost&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Ceph&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;s3&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Backblaze&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;B2&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;b2&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Dropbox&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;dropbox&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Google&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Cloud&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Storage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Google&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Drive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;google cloud storage&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Google&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Drive&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;drive&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Hubic&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;hubic&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Disk&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;local&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OneDrive&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;onedrive&amp;quot;&lt;/span&gt;
&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Openstack&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Swift&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Rackspace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Cloud&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Files&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Memset&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Memstore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OVH&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;swift&amp;quot;&lt;/span&gt;
&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Yandex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Disk&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;yandex&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;Storage&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="n"&gt;Account&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;
&lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;123456789&lt;/span&gt;&lt;span class="n"&gt;abc&lt;/span&gt;
&lt;span class="n"&gt;Application&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Key&lt;/span&gt;
&lt;span class="k"&gt;key&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0123456789&lt;/span&gt;&lt;span class="n"&gt;abcdef0123456789abcdef0123456789&lt;/span&gt;
&lt;span class="n"&gt;Endpoint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;leave&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;blank&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;normally&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="n"&gt;Remote&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;
&lt;span class="c1"&gt;--------------------&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;123456789&lt;/span&gt;&lt;span class="n"&gt;abc&lt;/span&gt;
&lt;span class="k"&gt;key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0123456789&lt;/span&gt;&lt;span class="n"&gt;abcdef0123456789abcdef0123456789&lt;/span&gt;
&lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="c1"&gt;--------------------&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Yes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OK&lt;/span&gt;
&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Edit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt;
&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Delete&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;With that, it was back to &lt;code&gt;~/documents&lt;/code&gt; to initialize the remote and send it all the things&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;annex&lt;span class="w"&gt; &lt;/span&gt;initremote&lt;span class="w"&gt; &lt;/span&gt;b2&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;external&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;externaltype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rclone&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;b2-annex&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;annex-documents&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;chunk&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;50MiB&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;encryption&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;shared&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rclone_layout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;lower&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mac&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;HMACSHA512
$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;annex&lt;span class="w"&gt; &lt;/span&gt;wanted&lt;span class="w"&gt; &lt;/span&gt;b2&lt;span class="w"&gt; &lt;/span&gt;standard
$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;annex&lt;span class="w"&gt; &lt;/span&gt;group&lt;span class="w"&gt; &lt;/span&gt;b2&lt;span class="w"&gt; &lt;/span&gt;backup
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;While I did not measure the speed with B2, it feels as fast as my &lt;a href="https://aws.amazon.com/s3/"&gt;S3&lt;/a&gt; or &lt;a href="http://www.rsync.net/products/git-annex-pricing.html"&gt;rsync.net&lt;/a&gt; remotes, so I didn&amp;rsquo;t bother setting the cost.&lt;/p&gt;
&lt;h2&gt;Google Drive&lt;/h2&gt;
&lt;p&gt;While I do not regularly use Google services for personal things, I do have a Google account for Android stuff. Google Drive offers &lt;a href="https://support.google.com/drive/answer/2375123?hl=en"&gt;15 GB of storage for free&lt;/a&gt; and &lt;a href="http://rclone.org/drive/"&gt;rclone supports it&lt;/a&gt;, so why not take advantage?&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rclone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;
&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;New&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;configuration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;
&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Quit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;
&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;
&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;gdrive&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;annex&lt;/span&gt;
&lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;storage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="nf"&gt;Choose&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;below&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;your&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;own&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;value&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Amazon&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Drive&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;amazon cloud drive&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Amazon&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;S3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;also&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Dreamhost&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Ceph&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;s3&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Backblaze&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;B2&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;b2&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Dropbox&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;dropbox&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Google&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Cloud&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Storage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Google&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Drive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;google cloud storage&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Google&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Drive&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;drive&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Hubic&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;hubic&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Disk&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;local&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OneDrive&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;onedrive&amp;quot;&lt;/span&gt;
&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Openstack&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Swift&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Rackspace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Cloud&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Files&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Memset&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Memstore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OVH&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;swift&amp;quot;&lt;/span&gt;
&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Yandex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Disk&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;yandex&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;Storage&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;
&lt;span class="n"&gt;Google&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Application&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;leave&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;blank&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;normally&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;client_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="n"&gt;Google&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Application&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Secret&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;leave&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;blank&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;normally&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;client_secret&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="n"&gt;Remote&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;
&lt;span class="k"&gt;Use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;auto&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="vm"&gt;?&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Say&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sure&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Say&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;you&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;are&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;working&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;on&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;headless&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;machine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;didn&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;t work&lt;/span&gt;
&lt;span class="s1"&gt;y) Yes&lt;/span&gt;
&lt;span class="s1"&gt;n) No&lt;/span&gt;
&lt;span class="s1"&gt;y/n&amp;gt; y&lt;/span&gt;
&lt;span class="s1"&gt;If your browser doesn&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;open&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;automatically&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;following&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;link&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="mf"&gt;127.0.0.1&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;53682&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;
&lt;span class="nf"&gt;Log&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;authorize&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rclone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;access&lt;/span&gt;
&lt;span class="n"&gt;Waiting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;Got&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;
&lt;span class="c1"&gt;--------------------&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;client_id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="n"&gt;client_secret&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;AccessToken&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;xxxx.x.xxxxx_xxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;RefreshToken&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;1/xxxxxxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxxxx&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;Expiry&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;2014-03-16T13:57:58.955387075Z&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;Extra&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;--------------------&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Yes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OK&lt;/span&gt;
&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Edit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt;
&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Delete&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And again, to &lt;code&gt;~/documents&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;annex&lt;span class="w"&gt; &lt;/span&gt;initremote&lt;span class="w"&gt; &lt;/span&gt;gdrive&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;external&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;externaltype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rclone&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;gdrive-annex&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;annex-documents&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;chunk&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;50MiB&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;encryption&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;shared&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rclone_layout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;lower&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mac&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;HMACSHA512
$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;annex&lt;span class="w"&gt; &lt;/span&gt;wanted&lt;span class="w"&gt; &lt;/span&gt;gdrive&lt;span class="w"&gt; &lt;/span&gt;standard
$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;annex&lt;span class="w"&gt; &lt;/span&gt;group&lt;span class="w"&gt; &lt;/span&gt;gdrive&lt;span class="w"&gt; &lt;/span&gt;backup
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Rinse and repeat the process for other annexes. Revel in having simple, secure, and redundant storage.&lt;/p&gt;</content><category term="general"/><category term="backups"/><category term="linux"/><category term="annex"/></entry></feed>