foltia ANIME LOCKERの録画ファイルを適当に整理しながらバックアップする

日々、foltia ANIME LOCKERで主にキーワード録画を使ってアレコレ録画しているのですが、 以前の記事 の通り、裸族の5Bayが安定しなかったり、SMBで音ズレするしってので、結局、4TBのHDD一発に録画をしているという状況です。そして、とうとうHDDの使用容量が75%を超え、いい加減、いろいろ録画ファイルを消そうかなと思ったのが発端。

現状、とりあえず適当にrsyncでバックアップはしているのですが、foltiaって独特のディレクトリ構造とファイル名がついていて、そのままrsyncすると、そもそも番組情報がわからない形のファイル名で、じゃあということで、samba経由で参照すると、ALL,MP4-SD,MP-HDみたいな形で分けられていて、ALLとその他でディレクトリごとにファイルが重複したり、そもそもファイルに録画日時が入ってしまっている影響で、同一の録画ファイル(違う時間に放送されているけど、タイトルとか一緒のやつ、これは本来、録画の挙動としては当然別れるべきものなんだけど、最終的に再放送で同じタイトルなら上書きしてバックアップしたくなるのが人情ですよね。)もちゃんと別になってしまったりというので、バックアップはしてるものの、後からfoltiaから消えてるものを掘り返して見ようという気にはならない感じでバックアップされっちゃてるのが現状です。

というわけで、これを改善するために、裸族の5Bayにそもそもfoltiaから消す前のデータを定期的に整理しながらコピーすることにして、細かい階層構造はやめて、番組名/番組タイトル_[HD|SD].MP4という形式に統一してしまいます。これを1時間に1回くらいのペースでcronで実行して、どんどんバックアップしつつ、foltiaからは古そうなやつを手動で消していく、という感じに変えてみました。

というわけで、四苦八苦しながら書いたスクリプトがこんな感じ。

#!/bin/sh

IFS=$'\n'

function rsync_keyword_files() {
    dirname=$1
    printf "processing dir: %s\n" $dirname

    mp4_files=`find $dirname -name "*.MP4" -print | grep \/ALL\/`
    for mp4_f in $mp4_files
    do
        printf "f: %s\n" $mp4_f
        src_f=`basename $mp4_f`
        dest_f=`echo $src_f | tr -d ' '`
        #printf "src : %s\ndest: %s\n" $src_f $dest_f
        rsync -avuzP "$mp4_f" "/tv/`basename $dirname`/$dest_f"
    done
}

function rsync_anime_files() {
    dirname=$1
    printf "processing dir: %s\n" $dirname

    mp4_files=`find $dirname -name "*.MP4" -print | grep \/ALL\/`
    for mp4_f in $mp4_files
    do
        printf "f: %s\n" $mp4_f
        src_f=`basename $mp4_f`
        dest_f=`echo $src_f | sed -e 's/^\([0-9]\+-[0-9]\+_\)\(.*\)\(_-[0-9]\+.MP4\)$/\2.MP4/'`
        dest_f=`echo $dest_f | tr -d ' '`
        #printf "src : %s\ndest: %s\n" $src_f $dest_f
        rsync -avuzP "$mp4_f" "/tv/$dirname/$dest_f"
    done

}

cd /foltia/04-キーワード録画
for f in `find . -maxdepth 1 -type d | sed -e '1,1d' | sort`
do
  dirname=`basename "$f"`
  rsync_keyword_files $dirname
done

cd /foltia/02-アニメ自動録画
for f in `find . -mindepth 3 -maxdepth 3 -type d | sort`
do
  rsync_anime_files $f
done

とりあえず、/foltiaにsamba経由でマウントしているのが前提で、キーワード録画とアニメ自動録画分をファイル名とディレクトリの階層構造をいじりながらrsyncを実行するだけで。いまんところ、rsync実行がまとめてではなく、ファイル毎に逐次になってて、ほんとはリストで渡すほうがいいのかなとおもいつつ、まあそれほど速度に差がでたりもしなさそうなので放置してます。

要はディレクトリごとに、/ALL/を含むファイルリストを作る→(キーワード録画の場合は)ファイル名の余計な部分を削除してファイル名整形→rsyncでコピーする、というシンプルな手順を踏んでいます。最初はコピーしてからmvでリネームとかやってたんですが、rsyncの-uで更新分だけコピーとかするためには最初からリネーム後のファイルでrsyncしないとダメなことに気づいて書き直したのと、sedでファイル名を切り貼りするところの正規表現がちょっとめんどくさかったけど、たぶんそれは正規表現が苦手だったのと、戦闘に./がついてることに気づかなくてアホっぽいハマリかたしたところが一番時間かかりました。

書いてての感想は以下くらいな感じ。

  • IFSをnに限定しておかないと、ファイル名に空白含んでいて切ないことになる
  • キーワード録画のほうは、ファイル名に日時なんかも入っているので、無理矢理sedでファイル名を変更してるけど、正規表現難しい
  • ALL以外のディレクトリを無視する良い方法が思いつかなくて結構力技っぽい感じになってもうた

基本はファイル名とディレクトリ名の変形が面倒くさいだけで、シンプルにrsyncしてるだけ、というか、更新分だけコピーしたいという話がなければ、cpでもいいレベルですね。あと進捗見たいという話もありました。こちらはpvを使うという手も無くはない気がします。

これで、とりあえず、/tv以下に番組名/番組タイトル_[SD|HD].MP4という形でファイルがまとまるようになったので、シリーズで録画が終わったあとなんかでは基本的にこちらを見るほうが便利になりそうな感じで。こんな流れで、foltiaの古いファイルを移しながら今後運用していこうかなぁと考えています。

でも、結局、裸族の5Bayが不安定でつらい

というわけで、大体意図通りのコピーができるようになったのでそこはいい感じなのですが、今回のコピー先(/tv)は裸族の5Bayでそれぞれのディスクをmdとしてraid0で束ねる→LVMでボリュームにする→xfsにしてマウントという形で使っているのですが、コピー処理ですごい勢いで書き込みまくると、なーんか応答が1分くらい全然なくなる(iowaitがすごい占有する)→そのうち復活を繰り返す感じで割と使い物にならない感じです。で、最終的にドライバ層でエラーになってI/O Errorになって死にます。readする分にはこんなことも起こらないのですが。

Apr 22 23:13:45 aso kernel: [ 2192.530098] Result: hostbyte=DID_OK driverbyte=DRIVER_TIMEOUT
Apr 22 23:13:45 aso kernel: [ 2192.530100] sd 10:0:0:0: [sdj] CDB:
Apr 22 23:13:45 aso kernel: [ 2192.530100] Write(10): 2a 00 55 23 30 10 00 04 00 00
Apr 22 23:13:45 aso kernel: [ 2192.530110] sd 10:0:0:0: [sdj] Unhandled error code
Apr 22 23:13:45 aso kernel: [ 2192.530111] sd 10:0:0:0: [sdj]

Apr 23 21:37:02 aso kernel: [ 7061.708294] ata12: hard resetting link

とかとか、こんな感じで、その他、failed command: WRITE FPDMA QUEUEDとかになったりで、なんかすごい不安定です。これほんとどうにかならんもんかなぁというのが悩み…実はrsyncの合間にsleepとか入れたら直ったりしたりするんでしょうか。それと、raid0として束ねずに単純にLVMでJBOD的に束ねるのも一応今後ためしてみる予定です…なーんかあんまり関係なさそうな予感はするのですが。

全然関係なく、SATAカードも増設していて、そちら経由で5台くらいHDDを束ねているほうはまったくもってこういうエラーは起きないので、確実に裸族5Bayのインターフェース石のほうが調子わるいか、ドライバとの相性なのか、そのへんかとは思うのですが、いまのところ解決策無くどうしたもんかなぁという。eSATA載ってて、この手のエンクロージャでもうすこし安定しているものを探して交換したいような気はしますが、いまのところ、そこまで金書けるのもなぁという感じで躊躇しているところです。