zfs send remote encrypted backup

I’ve been trying to finally move some of my file storage off site. Here’s a little script I wrote to help facilitate that.

zfs-backup:

#!/bin/sh

usage() {
        echo "Usage: "`basename $0`" snapshot-name";
        exit 1;
}

if [ "x$1" = "x" ]; then
        usage;
fi

if zfs list -t snapshot $1 > /dev/null 2>&1; then
        SNAP=$1
        SAN=`echo $1 | sed 's/[^A-Za-z0-9]/-/g'`
else
        echo "Invalid snapshot given.  Try zfs list -t snapshot for ideas.";
        usage;
fi

BASE=`basename $0`
FIFODIR=$(mktemp -d $BASE-tmp-XXXXXXXX) || exit 2
FIFO=$FIFODIR/$SAN
CHK=$FIFODIR/sha256

CONTAINER=$SAN.gz.sc

mkfifo $FIFO;

echo "Sending snapshot "$SNAP;

sha256 < $FIFO > $CHK &
zfs send "$SNAP" | pigz | scrypt enc /dev/stdin | tee $FIFO | ssh -c arcfour256 X_HOSTSPEC_X "umask 0077 && cat > .zfs-backup/$CONTAINER"

SHA256=`cat $CHK`
printf "%s  %s\n" $SHA256 $CONTAINER | ssh X_HOSTSPEC_X "umask 0077 && cat > .zfs-backup/$CONTAINER.sha256sum"

echo "Tranfered snapshot with checksum: "$SHA256;

rm $CHK;
rm $FIFO;
rmdir $FIFODIR;

Some notes about choices of utilities:

  • pigz could easily be replaced with gzip or lzma, or whatever.
  • I’m debating switching scrypt out for something like openssl or gpg with an actual random key, or possibly a curve25519 chacha20 poly1305 container, I haven’t done the research to see how smart/easy this is.  I understand what scrypt is doing, it’s installed on my machine, and It’s a Good Thing.
  • I’m using arcfour256 for the bulk transfer, because the security of the stream isn’t important.  It’s already protected by scrypt/AES256.
  • I tee to a fifo so that I can check that the transfer wasn’t corrupted on the remote end without typing my pass phrase into the untrusted machine.  The tee/fifo feels hackish to me, but I don’t have another idea.
    • I investigated the scrypt format, and there is no length in the file header, nor any tailing magic bytes, so it’s impossible to tell if the file is truncated without trying to decrypt the file.  Based on the code, adding a length header, or tailing magic would break the current on-disk format.
    • This checksum won’t help if, say, the scrypt process is interrupted – I’m guessing you will get a partial transfer, and matching checksums.
  • I copy the checksum to the remote machine also, in a format that can be parsed by sha256sum
  • I run this in a screen session

FreeDOS 1.1 USB Boot Image

I’ve updated the FreeDOS USB boot image to now include the official FreeDOS 1.1 kernel, and command interpreter, now that it has been officially released.

FreeDOS USB Image: FreeDOS-1.1-USB-Boot.img.bz2

Size: 117652 bytes
SHA1: 7d8a3c73f9cfdc71611e3f7a5b7b134529179821

If you are looking for a FreeDOS 1.0 USB Boot Image, see my earlier post of the same title.

If you run in to trouble, take a look at the comments for 1.0 first, many will apply.  If that doesn’t solve your issue, leave a comment.

Cellpipe 7130 Line Stats

Ahhh... Much Better!

I created a quick greasemonkey script to enable viewing the stats on the Bell Canada branded Cellpipe 7130 modem:

Cellpipe 7130 VDSL Stats Display Greasemonkey Script

Also, I didn’t really like Bell’s logo all over the gear:

Replace Bell’s logo with TekSavvy’s on Cellpipe 7130 Greasemonkey Script

.flac to .mp3 parallel conversion script

I’ve been using FLAC to backup my CDs for some time, but due to the ubiquity of MP3, I frequently found myself transcoding a large number of these files for various devices.

I found a good number of scripts[1] for doing the conversion, and it seems to be  a bike shed everyone wants to chime in on.  What I found didn’t really handle modern multi-core processors, so I made some quick tweaks and thought I’d post my results.  There are two scripts:

mp3xcode:

#!/bin/bash

mkdir mp3
parallel mp3xcode_sub — *.flac

mp3xcode_sub:

#!/bin/bash

[ -r “$1″ ] || { echo can not read file \”$1\” >&1 ; exit 1 ; } ;

FLAC=$1
MP3=”mp3/${FLAC%.flac}.mp3″

eval `metaflac –export-tags-to=- “$FLAC” | sed ‘s/=\(.*\)/=”\1″/’`

flac -dc “$FLAC” | lame –replaygain-accurate -v -V 2 –tt “$TITLE” \
–tn “$TRACKNUMBER” \
–tg “$GENRE” \
–ty “$DATE” \
–ta “$ARTIST” \
–tl “$ALBUM” \
–add-id3v2 \
– “$MP3”

This script seems to be a good way to do it. I’ve only tested this on linux.

On FreeBSD, there may be some tweaks required to not depend on bash.  Also, you’ll need to install the GNU parallel program (sysutils/parallel).

FreeDOS 1.0 USB Boot Image

Update (2012-01-17) new version available: FreeDOS 1.1 USB Boot Image
Update (2011-10-20) download the FreeDOS USB Image: FreeDOS-1.0-USB-Boot.img.bz2

I was trying to update the BIOS of my new SATA controller (a Syba SD-SATA2-4IR, or SD-81012336 – you decide), as the system will not boot with the RAID BIOS, unless you have a logical drive defined.  Since this fakeraid is generally garbage, and I’ll be using ZFS as well as gmirror, I thought I would try and work around it.

Continue reading FreeDOS 1.0 USB Boot Image