|
|
SambaとREGZA Z2000
|
地デジTV「REGZA Z2000」LANをREGZA用に改良する録画用ハードディスクの追加番組録画用共有ポイント作成番組の録画データを解析する録画からの期間で自動消去使用ディスク容量で自動消去ビデオ&写真の共有ポイントREGZAチューナーD-TR1追加 |
録画データの保存期間で削除するスクリプト
まずは
"Galileo"
一定期間が経過したら録画データを消去するスクリプト"video_move.sh" このスクリプトを利用するにあたっては "/REGZA/" の下には録画用共有ポイントの "rec/" 以外に "trush/"(ゴミ箱) と "save/"(保存用) という二つの共有ポイントを作成し、REGZA Z2000に録画機器として登録します。もちろん所有者、所有グループは共に "nobody" パーミッション は "755" です。 ちなみにREGZA Z2000は共有ポイントを8つまで登録できます。
REGZA Z2000に録画機器を追加登録 更に "rec/" と "trush/" の下にはそれぞれ "保存フォルダ/" というディレクトリを作成しておきます。
スクリプト"video_move.sh"を利用するためのディレクトリ構成 "trush" は、録画用共有ポイント "rec" に保存された録画データが一週間経過したときに、このスクリプトによって自動的に移動されられる場所です。 |
|||||||||||
| "Galileo" の場合は録画リストで常に 消去されるまでの残り日数 が表示されるのでこういう姑息なことはしなくて良かったのですが...。 |
最初は「一週間経ったらいきなり消去しちゃえ!。」というスクリプトにしていたのですが、番組が何の前触れもなく突然消えてしまうのはちょっと具合が悪いので "trush"(ゴミ箱) に一時的に退避させておいて更に一週間後に消去されるように工夫したわけです。 "save" は消去されたくない録画データを入れておく場所です。 REGZA Z2000では、録画した番組ごとに "ロック" をかけることができるようになっていますが、それは録画ファイルの パーミッション の変更などで対応しているのではなく、REGZA Z2000が内部的に「簡単な操作では消させんゾー。」みたいなフラッグを立てているだけですので、ファイルごと削除されたらこのロックは何の役にも立ちません。で、 「レグザリモコンの操作だけで録画ファイルの自動消去処理の対象外にすることはできないか?。」 と考えたわけですが、レグザリモコンが録画データに対してできるアクションといえば、その "ロック" 以外には 録画データのフォルダ(ディレクトリ)移動 しかないので、この ”移動” 仕組みを利用するわけです。 つまり保存版にしたい録画データはレグザリモコンの操作で "rec/" の一つ下の "保存フォルダ/" という救済用ディレクトリに移動しておくことで、自動消去スクリプトの魔の手から逃れられるようになる、という寸法です。 |
|||||||||||
| REGZA Z2000のリモコン操作では異なる共有ポイント間での録画データの移動ができない仕様になっていますので、こんな面倒なことをしなくちゃならないわけです。 |
ということは当然 "trush/" にも同じく救済用ディレクトリ "保存フォルダ/" を設けなければならないことになりますが、そうすると保存フォルダが二つになってしまうため「あれっ、あの番組はどっちに保存してたっけ?。」ということになってしまって混乱の元になります。 そこでこの二つの "保存フォルダ/" にそれぞれ移動された録画データを、自動的にまとめて別の共有ポイント "save/" に移動することにしたわけです。 "del_temp/" は録画データの消去のためのテンポラリ用のディレクトリで、 "trush/" ディレクトリに移動してから一週間(つまり録画してから二週間)経過した録画データはいったんここに移動した後に rm で消去されるようになっています。 「そんな回りくどいことしないで、 "trush" ディレクトリの中の録画データを直接消しちゃえばいいじゃん?。」 と思われる方はちょっと読みが浅いです。 LinuxOS の ext3 ファイルシステムでは、ファイルの消去時にもデータの信頼性を高めるための処理を色々行うため、大きなファイルを削除するときには結構な時間がかかります。 例えばREGZA Z2000の録画データは一時間の地デジ番組で6 GB くらいにはなりますが、これを消去するのにも十秒程度はかかりますから、年末の特番なんかだと一分近くかかるかもしれません。 |
|||||||||||
|
通常こういったスクリプトを実行するときは、例えばスクリプトの実行が完了するまではREGZA Z2000がアクセスできないようにSambaを止めるなり、パーミッションを一時的に変更しておくなりするのでしょうけどね。
しかし今回のケースでは、そうやってしまうと録画データの削除が完了するまでの間に録画予約されている番組は録画できないことになっていまいます。 うーん難しい。 |
ということは "trush/" ディレクトリ内のデータを直接削除するようなスクリプトを組んでしまうと、スクリプトの実行開始後に誰かがREGZA Z2000でビデオを見始めたり、予約していた録画が始まったりしたときにはまだ "trush/" ディレクトリ内の録画データの消去作業が終わっていない可能性が高いわけで、下手をすると削除中の録画データにREGZA Z2000がアクセスしてしまう可能性があります。そうなると何が起こるかわかりません。 これでは非常にマズイわけですね。 一方このスクリプトで実行されるファイルの「ディレクトリ間の移動」は、あくまで 一つのパーティション の中で行われるわけですから、どんなにファイルが大きかろうと「一瞬」で完了します。 つまり削除すべき録画データを「移動」という手段で瞬間的にREGZA Z2000の手の届かないディレクトリにワープさせておいて、それからゆっくりと削除処理を行うようにすれば安心、ということです。 というわけでこの "del_temp/" は Samba の共有ポイントにはせず、単純に所有者及び所有グループを "root" 、 パーミッション を "755" としておきます。 1.REGZA Z2000の録画・再生中を判定する1. はREGZA Z2000含む誰かが "web0.obenri.com" のディレクトリ "/REGZA/" 以下にアクセスしているかどうかをチェックする部分です。
Samba で誰かがアクセスしているファイルは他のユーザーが書き換えできないように ロック されるようになっていて、 "smbstatus -L" を実行すると、そのロックファイルのリストを見ることができます。
つまりこの "smbstatus -L" を実行したときに "/REGZA/" が 標準出力 されるときには、誰か(何か)がディレクトリ "/REGZA/" 以下のファイルにアクセスしているということになります。 しかし実際のところはこのディレクトリ "/REGZA/" は録画専用の共有ポイントですので、この出力結果は 「REGZA Z2000が共有ポイント以下のデータに対して録画か再生を行っている。」 という判定に利用できるわけです。
具体的には
grep
コマンド
に対して
"smbstatus -L"
からの出力をパイプ処理
ただしここでは「結果が真の場合はREGZA Z2000がアクセスしているのでスクリプトの実行を中止。」という処理を行う必要があるので、条件式に "!" を付けて「真」と「偽」の結果を逆転させています。 ちなみに "> /dev/null" は標準出力を抑制するためのものです。 |
|||||||||||
| このスクリプトは crond で実行させるのが前提です |
crondで実行させるスクリプトやコマンドが何かを標準出力すると、その内容は "root" 宛てにメールされてしまいますから、このままではスクリプトを実行したときに "smbstatus | grep /REGZA/" の内容をメールしてくれることになります。 もちろんそんな結果をメールでもらっても仕方ないので標準出力そのものを抑制しているわけです。 2.自動削除したくない録画データを退避する2. は "保存フォルダ/" 以下の録画データを "save/" 以下に移動するためのルーチンです。
ここは単純に cd コマンド で カレント ディレクトリを "保存フォルダ/" に移動し、 mv コマンドで録画データを移動するだけです。 cdコマンドの行末に "&&" を付けているのは、cdコマンドが実行できないときにこの スクリプト を強制終了させるためのものです。 mvコマンドに "-f" オプションを付けているのは、移動するファイルが存在しないときにエラーを出させないようにするためです。 3.録画して一週間経った番組を"trush/"に移動この スクリプト の キモ の 3. 部分です。
|
|||||||||||
| ちなみにここで "*.dtv.rat" に対して検索を行うと録画終了時刻を基準に、 "*.dtv.meta" に対して検索を行うと最終視聴時刻を基準にすることができます。 |
次に
find
コマンドで録画開始時刻から一週間以上経った録画データのファイル名を録画データのメインファイル
"*.dtv"
fileコマンドの各オプションは、 -type f :対象をファイルに限定(ディレクトリやリンクを含めない) -maxdepth 1 :そのディレクトリ階層のみを検索対象に(下の階層を含めない) -name "*.dtv" :ファイル名"*.dtv"を検索対象にする -mtime +7 :現在時刻から7日以上経過したファイルを検索対象にする となります。
この場合findコマンドの出力結果は
"./[29文字のファイル名].dtv"
となりますから、そのまま
パイプ処理
cutコマンドはこのように "cut -b3-31 と指定すると、受け取った テキスト データの各行に対して 3バイト目から31バイト目までを 標準出力 します から、出力結果は先頭の "./" と ".dtv" が取り除かれた 29文字の録画ファイル名 が出力され、 変数"$fname1" に入力されることになるわけです。 そしてその変数を使って mv コマンドで "$fname1.dtv" 、 "$fname1.dtv.rat" 、 "$fname1.dtv.meta" の三つのファイルをセットで "../trush/" 、つまり "/REGZA/trush/" に移動するわけです。 4."trush/"に移動した番組を一週間後に"del_temp/"に移動4. は基本的には 3. と同じです。 違うのは対象になるディレクトリが "/REGZA/trush/" であることと、 find コマンド の日数オプションが "-mtime +14" で「二週間」になっていることと、録画データの移動先が "/REGZA/del_temp/" になっている点です。
このルーチンで録画から二週間経過した番組データを、REGZA Z200からはアクセスできない "/REGZA/del_temp/" に移動させてしまうわけです。 5.番組データの削除詳しい説明は不要でしょう。 "del_temp/" 以下のファイルをすべて削除します。
最初の行の mv コマンド のオプションだけが "-fv" になっているのは実際に削除された "*.dtv" の内容を出力したいからです。 このオプションを設定しておくと、 crond でこの スクリプト が実行されたとき、削除した録画データがあったとき管理者宛に
という内容のメールが送られてくるようになります。
|
|||||||||||
操作が面倒なわりに使いでのないスクリプトで...作成した シェル スクリプト は "video_move.sh" というファイル名で保存しました。 このスクリプトは "root" でのみ実行しますから、所有者と所有グループを "root" にして chmod コマンド で パーミッション を "700" にしました。 そして "/etc/cron.daily/" に放り込んで終了です。 このスクリプトが稼動し始めると、REGZA Z2000で "REC(WEB0)" に録画した番組は一週間後には "TRUSH(WEB0)" に自動的に移動し、更に一週間経つと削除されるようになります。 そして消されたくない番組はレグザリモコンを使って "保存フォルダ" に移動しておくことで、しばらくすると "SAVE(WEB0)" に自動的に移動し、保存版とすることができます。
REGZA Z2000に録画機器構成 と、自分ではそれなりに良いできだと思いましたが、家族には 大不評 でした。 スクリプトを作った本人は仕組みが解っているのでなんてことはないのですが、 「保存フォルダに入れておくとそのうちSAVEに移動する。」とか、「一週間経ったらTRUSHに移動して、もう一週間たったら消去される。」とか説明しても、 「で、結局どうしたらいいの?。」 ということらしいのです。確かに客観的にみてシンプルとはいえない仕組みになっています。これは。 お便利サーバー.com管理人は、スクリプトの仕組みだけを考えるあまり、実際にそれを利用するのが素人と子供であることを忘れてたわけですね。 で、このスクリプトは稼動からわずか二週間でボツになりましたとさ。
|
|
|
番組録画用共有ポイント作成
<<Previous
|
Next>>
使用ディスク容量で自動消去
|
| このサイトは既に更新を終了していますが、今のところ店じまいの予定はありません。 リンクフリー ですので、趣味や勉強のためでしたら、引用、転用、コピー、朗読、その他OKです。このサイトへのリンクについては こちら をご覧ください。 |
| ”Linux”は、Linus Torvalds 氏の各国における登録商標です。”Red Hat”及びRed Hatのロゴおよび Red Hat をベースとしたすべての商標とロゴは、各国におけるRed Hat, Inc. 社の商標または登録商標です。その他のプログラム名、システム名、製品名などは各メーカー、ベンダの各国における登録商標又は商標です。 |