Showing posts with label btrfs. Show all posts
Showing posts with label btrfs. Show all posts

6/06/2011

btrfs雑感

zfs相当のsend recvがないと運用には厳しいけど、個人で使ってる分はファイルの変更履歴が残して置けるのは便利
使っていようと思えば使っていられる。 パフォーマンスも悪くはない。

そういえば、ext4とbtrfsを性能とかで比較して「ext4の勝ち~btrfs超ザコなんですけどww」的な
blog書いてる人って馬鹿なの?死ぬの?
あるいはバグって止まったとか、マウントが死ぬほど遅いとか。

広い目で見た性能ならext3がまだしばらくの間ベストだよ、と。



kernelもナンバリングで開発版と安定版わけなくなったから紛らわしくなってるけど
btrfsってまだ開発途中であってテストリリースなんだよね(安定版kernelに入ってても)。
FSそのものの仕様も変わりうるし(ある日kernelのバージョンアップと同時に読み書きできなくなったり)
性能出すためのチューニングより機能の実装とか安定化(バグ潰し)の方が優先だから
そういうオバカさんたちが期待して求めることと、現状のbtrfsの進捗やリリース状況があってないのが
なんとも開発者達が不憫だなぁと。

目新しい機能だからってメジャーディストリ側で安易に対応するからバカが脊髄反射するんだと思うんだよね。
やめてほしい。

3/18/2011

btrfs with lzo

btrfsのlzo圧縮対応は地味にありがたいなぁ
zlibと比べると格段に低負荷になることと
圧縮率は落ちはすれども、テストケースによっては
無圧縮よりも高速にファイルの複製などができるようだ

2/08/2011

rubyの勉強続き

コンパクトにしてみた

ruby楽しいよ

個人の感想です


むか~し開発の仕事をしていて
C/C++やらJavaやらPerlを使っていたのだけれど
正直、好きじゃなかった

趣味でやってる分には楽しかったんだけど
途中で作るのが面倒になる

「ああもうシェルスクリプトでいいや」

充分にテストされてコンパクトで早いcoreutilsやら
枯れた実装かつノウハウ(悪いものも含めて)が充分にあるawkやらsedやら
bashやらzshの固有拡張機能があれば、いちいちPerlやら何やら持ち出すのが
バカバカしい。
(もちろんスクリプトで作りにくい、または現実的には困難なものもあるけど)

仕事じゃなくなってから、仰々しいものを作ったりしなくなったのも
「シェルスクリプトでいいや」を助長させてたと思う


なんで、シェルスクリプトでいいかというと
使い慣れたツールとの連携が可能、かつ楽
なによりも手軽に試せる。デバッグは面倒だけどテストは楽。
殆どのLinuxならzsh以外ならデフォルトで入ってるから
Linux間では可搬性も高い(違ったとしてもパスくらいだし)。


で、Rubyの勉強として過去作ったスクリプトの移植を試みてるんだけど
楽しいね。ほんと、純粋に楽しい。
awkやsed、grepレベルの文字列操作なら特に何も意識しなくても普通にできるし
「ちょっとやってみようかな」と思ったらすぐ試せる。シェルスクリプトばりに手軽。

PerlもJavaも構文が嫌いだった。Perlは後付臭いOOも嫌い。
あくまで”嫌い”なだけです。機能や性能や思想的な価値がRubyより劣るとか言ってるわけではありません。
ただ、私はPerlやJavaは大嫌いです。くそったれだと思います(個人の感想です)。
「ちょっとした小間使い的なツール作成」だと絶対に使いたくない。
(規模によってはJavaがいいかな、と思うこともある。ただしPerlはイヤだ)

RubyのALGOLみたいな構文はアレな気はしてたんだけど、書いてみてナルホドという感じ
こうじゃないといけなかったんだなぁと。

OOネイティブな感じもすばらしい。



思想的なものには一切興味はないんだけど
(例えばRubyのどこそこはどう美しい、それはなぜか とか)
規模問わず、お手軽にはじめられるのはいい。

とりあえずRubyで実装して、思考を整理したり実装する機能を選別したり検証してから
ほかの言語に移植(要件とか運用で使う言語変わるし)とかしてもいいかなと思えるくらい、良い。

2/07/2011

rubyでtapを覚えたかも

そのうち綺麗にします
とりあえずtapを覚えた
ファイルのhash取り込みも

snapshot.rb


勉強メモ

引き続きRuby中

メモを残す

#!/usr/bin/env ruby


require 'date'






def parse_dir(conf)
 snap = Hash::new

# hoge.tap{|h| hoge.each_pair{|src, dst| h[src] = "a"} }


 conf.each_pair {|src, dst| 
  _src = src.sub(/$\//,"").split(/\s*\/\s*/)
 if _src.size == 0
  snap[src] = "#{dst}/rootfs_#{Time.now.strftime("%Y%m%d").to_s}"
 else
  snap[src] = "#{dst}/#{_src[_src.size - 1].strip}_#{Time.now.strftime("%Y%m%d").to_s}"
 end
 }
 return snap
end


def get_conf(conf_file)
 conf = Hash[*open(conf_file).read.split(/\n/).map{|f| f.split}.flatten]
 return conf
end

class Snapshot
 def initialize(conf = "/etc/snap.conf")
 @snap = parse_dir(get_conf(conf))
 end
 def do_snap
 @snap.each_pair {|src, dst|
  system("btrfs","sub","snap",src,dst)
 }
 end
end


if ARGV[0] == nil
 snap = Snapshot.new
else
 if File::ftype(ARGV[0]) == "file"
  snap = Snapshot.new(ARGV[0])
 else
  p "no such file"
 end
end

if snap != nil
 snap.do_snap
end

rubyの勉強


やろう やろう と思いながら
結局3年くらい勉強しないままにしてたruby
せっかく参考書まで買ったのに一度も目を通してない
というわけで、仕事の空き時間に練習してみた
(参考書がないのでGoogle先生のお世話になりました)
構文からの勉強だから非常に時間がかかった(働け)

先日のbtrfsのスナップショット用スクリプトのruby移植+α版
ハッシュが使えるお陰で設定ファイルがシンプルになりました。
/path/src /path/dst の形式で1行ずつ書いてくだけ。
以前の階層に関連する制約がなくなりました。
データ構造をもう少し考えて
1つのでdstにつき、複数のsrcという形式で記述できるように
したほうがよかったかなと思ってます(今後の課題)
#!/usr/bin/env ruby

require 'date'


def parse_dir(conf)
snap = Hash::new
conf.each_pair {|src, dst|
_src = src.sub(/$\//,"").split(/\s*\/\s*/)
if _src.size == 0
snap[src] = "#{dst}/rootfs_#{Time.now.strftime("%Y%m%d").to_s}"
else
snap[src] = "#{dst}/#{_src[_src.size - 1].strip}_#{Time.now.strftime("%Y%m%d").to_s}"
end
}
return snap
end

def get_conf(conf_file)
conf = Hash::new
open(conf_file) {|file|
while i = file.gets
_line = i.split
conf[_line[0]] = _line[1]
end
}
return conf
end
class Snapshot
def initialize(conf = "/etc/snap.conf")
@snap = parse_dir(get_conf(conf))
end
def do_snap
@snap.each_pair {|src, dst|
system("btrfs","sub","snap",src,dst)
}
end
end

if ARGV[0] == nil
snap = Snapshot.new
else
if File::ftype(ARGV[0]) == "file"
snap = Snapshot.new(ARGV[0])
else
p "no such file"
end
end
if snap != nil
snap.do_snap
end

2/04/2011

btrfsの明示的に作成されてないサブボリュームの話

人によってはマスターボリュームとか親ボリュームとか言われるアレ


mount -o default,subvolid=0 /dev/hoge /mount/path
subvolid=0でマウントできる。スナップショットも取れる。
マスターとか親とか雰囲気的には間違いじゃないけど
このボリュームID 0さんもサブボリューム。

インストールルートをサブボリュームにしたときは
grubにrootflagsオプションを付ける必要がある。
root=UUID=hogehoge rootflags=subvol=rootfsとか
root=UUID=hogehoge rootflags=subvolid=xxxとか

btrfsのバックアップ運用

ちょっと考えてみた

一括でロールバックする手段はなさそうだから
あまり有り難味はないかもしれない
とりあえずバックアップ用のスクリプトを用意した

bashじゃなきゃだめ

しかもrootfsからみて2階層目までしか取得できない

/etc/snap.confをこんな内容で作成する
SNAP_DIR=(/ /home/user1 /home/user2)
それぞれのパーティション直下に.snapshotっていうサブボリュームを作っておく
なまえが気に入らなければ変数にして合わせて内容を変えればOK

#!/bin/bash

SNAP_DIR=(/)
_CONF="/etc/snap.conf"

##
_BTR_BIN=`which btrfs`
_SNAP_DEST_DIR=()
source "$_CONF"
_S_C=0
_D_C=0

_expr() {
    i=0
    for _A in $*
    do
        if [ "$_A" = "/" ]; then
            _SNAP_DEST_DIR[$i]="/.snapshot/rootfs_"`date '+%Y%m%d'`
        else
            _B=`echo $_A | awk -F/ '{print $2}'`
            _C=`echo $_A | awk -F/ '{print $3}'`
            _SNAP_DEST_DIR[$i]="${_A/$_B/$_B/.snapshot}/"
            if [ -z "$_C" ]; then
                _SNAP_DEST_DIR[$i]="${_SNAP_DEST_DIR[$i]}"$_B"_"`date '+%Y%m%d'`
            else
                _SNAP_DEST_DIR[$i]="${_SNAP_DEST_DIR[$i]/"$_C"\//$_C}""_"`date '+%Y%m%d'`
            fi
        fi
        i=`expr $i + 1`
    done     
}



_expr ${SNAP_DIR[@]}
_S_C=${#SNAP_DIR[@]}
_D_C=${#_SNAP_DEST_DIR[@]}

_I=0
while [ $_I -lt $_S_C -a $_I -lt $_D_C ]
do
    $_BTR_BIN sub snap ${SNAP_DIR[$_I]} ${_SNAP_DEST_DIR[$_I]}
    _I=`expr $_I + 1`
done

WSKY Bluetooth 5.0 トランスミッター レシーバー買いました

安くレシーバーモードでapt-x HDが使えるものというと非常に限られますが そのなかで高音質と評判のよかったものをということで購入しました。 音質は安いなりですね、apt-x HDで接続されている状態でも元がなんであれ痩せた音になります。 SBSにしか対応していない...