特定のディレクトリにスナップショットを纏めておきたい時は、このsnapqを
用いればよさそう。
negix# mkdir /snaps
negix# ln -s `hammer snapq /miku/hachune "neginegi"` /snaps/miku.hachune-121126_2000
negix# ls -l /snaps/miku.hachune-121126_2000
lrwxr-xr-x 1 root wheel 33 Nov 26 19:01
/snaps/miku.hachune-121126_2000
-> /miku/hachune@@0x000000010b40f760
negix# ls -l /snaps/miku.hachune-121126_2000/
total 0
drwxr-xr-x 1 root miku 0 Nov 26 18:54 negi
lrwxr-xr-x 1 root miku 33 Nov 26 18:55 snap-20121126-1855
-> /miku/hachune@@0x000000010b40f540
作成したスナップショットから過去の状態を参照する場合は、TransactionID
を指定し各コマンドを実行する。スナップショットのTransactionIDはsnapls
サブコマンドで確認できる。
negix# hammer snapls /miku
Snapshots on /miku PFS #8
Transaction ID Timestamp Note
0x0000000106e4d170 2012-11-22 20:03:44 JST -
0x0000000106e552a0 2012-11-22 20:06:42 JST add neginegi
0x0000000106e55440 2012-11-22 20:11:48 JST -
0x0000000106e555a0 2012-11-22 20:15:04 JST -
0x0000000106e55b60 2012-11-22 20:23:28 JST -
0x0000000106e55da0 2012-11-22 20:38:37 JST -
0x0000000106e55ea0 2012-11-22 20:40:04 JST -
0x0000000106e56000 2012-11-22 20:47:21 JST -
0x0000000106e560c0 2012-11-22 20:48:36 JST -
0x0000000106e56140 2012-11-22 20:48:49 JST -
0x0000000106e56260 2012-11-22 20:49:56 JST -
negix# ls /miku/@@0x0000000106e55da0
mikumiku snap-20121122-2003 snap-20121122-2023
neginegi snap-20121122-2006
rinrin snap-20121122-2015
ディレクトリのスナップショットに対しシンボリックリンクを貼ることで、リー
ドオンリーの状態でそのディレクトリ以下の過去の状態を参照できる。
negix# ln -s /miku/@@0x0000000106e55da0 /tmp/miku
negix# ls /tmp/miku
mikumiku rinrin snap-20121122-2006 snap-20121122-2023
neginegi snap-20121122-2003 snap-20121122-2015
スナップショット間のdiffも同様に指定することで閲覧できる。
negix# diff /home/miku/.history@@0x0000000106892480 \
> /home/miku/.history@@0x0000000106cf8170
56a57,88
> #+1353130082
> ls
> #+1353130085
> top
> #+1353130086
> ls
> #+1353130094
> tmux
> #+1353130103
> ls /usr/pkg/bin/zsh
> #+1353130111
> chsh -s /usr/pkg/bin/zsh
> #+1353130119
historyサブコマンドにより、ファイル毎のトランザクション履歴を確認する
こともできる。この履歴はスナップショットに関わらず作成されるため、作業
中にうっかりファイルを壊してしまった場合などに有用である。
negix# hammer history ~/.history
/root/.history 0000000102c5113d clean {
0000000102c61ca0 16-Nov-2012 21:53:05
0000000106895e40 17-Nov-2012 14:27:32
00000001068960a0 17-Nov-2012 14:29:55
0000000106cf6fb0 21-Nov-2012 21:50:28
0000000106e3cdf0 22-Nov-2012 19:52:30
0000000106e66d20 22-Nov-2012 21:33:22
}
残念ながら、ファイルを一旦rmしてしまうとhistoryでは追えなくなってしま
うようだ。(過去のTransactionIDが分かれば一応参照はできる)
negix% rm miku.txt
negix% hammer history miku.txt
miku.txt No such file or directory
negix% cat miku.txt@@0x000000010b4100a0
miku
mikumiku
mikumikumiku
negix% touch miku.txt
negix% hammer history miku.txt
miku.txt 000000010a01792d dirty {
}
また、historyを元に行う操作はundoコマンドを用いて行うこともできる。
"undo -a"で全履歴の表示、"undo -t TransactionID -u"でTransactionID時点
にロールバックした.undoファイルの作成が行える。
negix% echo luka > luka.txt
negix% echo lukaluka >> luka.txt
negix% echo lukalukaluka >> luka.txt
negix% undo -a luka.txt
luka.txt: ITERATE ENTIRE HISTORY
>>> luka.txt 0001 0x000000010b432a20 03-Dec-2012 03:00:56
luka
lukaluka
lukalukaluka
>>> luka.txt 0002 0x000000010b432ee0 03-Dec-2012 03:01:50
luka
>>> luka.txt 0003 0x000000010b432fa0 03-Dec-2012 03:02:02
luka
lukaluka
lukalukaluka
negix% undo -t 0x000000010b432ee0 -u luka.txt
negix% cat luka.txt.undo.0000
luka
スナップショット以外にもトランザクション履歴を追える機能などは、Linux
のnilfs2の機能と似ているかもしれない。