2013年5月31日金曜日
2013年5月10日金曜日
RAM を一切使わずにプリントデバッグ
Linux Kernel のコードを見ていると、
arch/arm/kernel/debug.S にかなりローレベルなプリントデバッグ用のサブルーチンがありますね。
これをちょっと真似して、より少ない資源で、ARM の起動初期のプリントデバッグができるように改良したものを作ってみました。
表示したい数値もしくは文字列を r0 にセットして、上記のマクロを call すれば使えます。
Linux Kernel に含まれているバージョンとの違いは
RAM を一切使用せず、破壊するレジスタは r0, r1, r2, r3のみです。
printunsigned と printsigned はオリジナルで作りました。
これら用途としては、ブートのかなり初期で、RAM もまだ使えない状態で、簡単にプリントデバッグしたいときのために作ったものなのです。
(LEDぐらいしか点灯しないとなるとかなりデバッグが苦しいですので。)
私は U-Boot で lowlevel_init 関数とかのデバッグ用途に使っていました。
以下、コードです。
レジスタビューは 16550 を想定してます。
最初に
---
arch/arm/kernel/debug.S にかなりローレベルなプリントデバッグ用のサブルーチンがありますね。
これをちょっと真似して、より少ない資源で、ARM の起動初期のプリントデバッグができるように改良したものを作ってみました。
printhex2: 2桁の16進数を表示するprinthex4: 4桁の16進数を表示するprinthex8: 8桁の16進数を表示するprintunsigned: unsigned な10進数を表示するprintsigned: signed な10進数を表示するprintascii: 文字列表示printch: 一文字表示表示したい数値もしくは文字列を r0 にセットして、上記のマクロを call すれば使えます。
printhex2, printhex4, printhex8, printascii, printch は Linux Kernelにもあるのですが、Linux Kernel に含まれているバージョンとの違いは
RAM を一切使用せず、破壊するレジスタは r0, r1, r2, r3のみです。
printunsigned と printsigned はオリジナルで作りました。
これら用途としては、ブートのかなり初期で、RAM もまだ使えない状態で、簡単にプリントデバッグしたいときのために作ったものなのです。
(LEDぐらいしか点灯しないとなるとかなりデバッグが苦しいですので。)
私は U-Boot で lowlevel_init 関数とかのデバッグ用途に使っていました。
以下、コードです。
レジスタビューは 16550 を想定してます。
最初に
early_serial_initを call する必要があります。DEBUG_UART_BASE, UART_SHIFT, DIVISOR あたりは自分の環境に合わせて変更して下さい。---
#define DEBUG_UART_BASE 0xXXXXXXXXX #define UART_SHIFT 1 /* * DIVISER = ((BAUDCLK / 8 / BAUDRATE + 1) / 2) */ //#define DIVISOR 40 /* 19200 bps */ //#define DIVISOR 20 /* 38400 bps */ #define DIVISOR 7 /* 115200 bps */ #define UART_TX 0 /* Out: Transmit buffer */ #define UART_LCR 3 /* Out: Line Control Register */ #define UART_LCR_DLAB 0x80 /* Divisor latch access bit */ #define UART_LCR_WLEN8 0x03 /* Wordlength: 8 bits */ #define UART_LSR 5 /* In: Line Status Register */ #define UART_LSR_TEMT 0x40 /* Transmitter empty */ #define UART_LSR_THRE 0x20 /* Transmit-hold-register empty */ /* * DLAB=1 */ #define UART_DLL 0 /* Out: Divisor Latch Low */ #define UART_DLM 1 /* Out: Divisor Latch High */ /* * Call the routine once * before calling printhex8/4/2, printascii, printch. */ ENTRY(early_serial_init) addruart r3 mov r0, #UART_LCR_DLAB strb r0, [r3, #UART_LCR << UART_SHIFT] mov r0, #(DIVISOR & 0xff) @ LSB of divisor strb r0, [r3, #UART_DLL << UART_SHIFT] mov r0, #((DIVISOR >> 8) & 0xff) @ MSB of divisor strb r0, [r3, #UART_DLM << UART_SHIFT] mov r0, #UART_LCR_WLEN8 strb r0, [r3, #UART_LCR << UART_SHIFT] mov pc, lr ENDPROC(early_serial_init) .macro addruart, rx ldr \rx, =DEBUG_UART_BASE .endm .macro senduart,rd,rx strb \rd, [\rx, #UART_TX << UART_SHIFT] .endm .macro busyuart,rd,rx 1002: ldrb \rd, [\rx, #UART_LSR << UART_SHIFT] and \rd, \rd, #UART_LSR_TEMT | UART_LSR_THRE teq \rd, #UART_LSR_TEMT | UART_LSR_THRE bne 1002b .endm /* * Useful debugging routines * * printhex8, printhex4, printhex2: * print a number in 8, 4, 2 digits hexadecimal, respectively. * r0 = number * r1-r3 corrupted * * printunsigned, printsigned * print a number in decimal. * r0 = number * r1-r3 corrupted * * printascii * print a string * r0 = pointer to string * r0-r3 corrupted * * printch * print a character * r0 = character code * r0-r3 corrupted */ ENTRY(printhex8) mov r2, #28 b printhex ENDPROC(printhex8) ENTRY(printhex4) mov r2, #12 b printhex ENDPROC(printhex4) ENTRY(printhex2) mov r2, #4 printhex: addruart r3 1: mov r1, r0, lsr r2 and r1, r1, #15 cmp r1, #10 addlt r1, r1, #'0' addge r1, r1, #'a' - 10 senduart r1, r3 busyuart r1, r3 subs r2, r2, #4 bge 1b mov pc, lr ENDPROC(printhex2) ENTRY(printunsigned) mov r1, #1 mov r2, #0 1: mov r1, r1, lsl #1 @ r1 = 2 * r1 add r1, r1, r1, lsl #2 @ r1 = 5 * r1 add r2, r2, #1 cmp r2, #10 @ prevent overflow of r1 bge 2f cmp r1, r0 bls 1b 2: mov r3, r2 @ number of digits 3: mov r1, #1 mov r2, #0 4: add r2, r2, #1 cmp r2, r3 movlt r1, r1, lsl #1 @ r1 = 2 * r1 addlt r1, r1, r1, lsl #2 @ r1 = 5 * r1 blt 4b mov r2, #0 5: cmp r1, r0 subls r0, r0, r1 addls r2, r2, #1 blo 5b add r2, r2, #'0' addruart r1 senduart r2, r1 busyuart r2, r1 subs r3, r3, #1 bgt 3b mov pc, lr ENDPROC(printunsigned) ENTRY(printsigned) cmp r0, #0 bge printunsigned @ signed greater or equal addruart r3 mov r1, #'-' senduart r1, r3 busyuart r1, r3 rsb r0, r0, #0 @ r0 = 0 - r0 b printunsigned ENDPROC(printsigned) ENTRY(printascii) addruart r3 b 2f 1: senduart r1, r3 busyuart r2, r3 teq r1, #'\n' moveq r1, #'\r' beq 1b 2: teq r0, #0 ldrneb r1, [r0], #1 teqne r1, #0 bne 1b mov pc, lr ENDPROC(printascii) ENTRY(printch) addruart r3 mov r1, r0 mov r0, #0 b 1b ENDPROC(printch)
2013年5月6日月曜日
2013年4月29日月曜日
アドレスサイズプレフィックス、オペランドサイズプレフィックス
GNU assemblerの話。
.code16, .code32, .code64でそれぞれ 16bit, 32bit, 64bit モードでアセンブルしてくれるようです。
まず、レジスタの名前ですが、ビット長ごとに以下の通り。
16bit 32bit 64bit
%ax %eax %rax
%bx %ebx %rbx
%cx %ecx %rcx
%dx %edx %rdx
%si %esi %rsi
%di %edi %rdi
例えば、以下のような test.s というファイルを作る。
.file "test.s"
.text
.code16
main16:
mov (%si), %ax
mov (%si), %eax
mov (%esi), %ax
mov (%esi), %eax
.code32
main32:
mov (%si), %ax
mov (%si), %eax
mov (%esi), %ax
mov (%esi), %eax
.code64
main64:
// mov (%si), %ax
// mov (%si), %eax
// mov (%si), %rax
mov (%esi), %ax
mov (%esi), %eax
mov (%esi), %rax
mov (%rsi), %ax
mov (%rsi), %eax
mov (%rsi), %rax
16 64 不可 不可 不可
32 16 67 66 6766
32 32 6766 なし 67
32 64 不可 不可 6748
64 16 不可 不可 66
64 32 不可 不可 なし
64 64 不可 不可 48
.code16, .code32, .code64でそれぞれ 16bit, 32bit, 64bit モードでアセンブルしてくれるようです。
まず、レジスタの名前ですが、ビット長ごとに以下の通り。
16bit 32bit 64bit
%ax %eax %rax
%bx %ebx %rbx
%cx %ecx %rcx
%dx %edx %rdx
%si %esi %rsi
%di %edi %rdi
例えば、以下のような test.s というファイルを作る。
.file "test.s"
.text
.code16
main16:
mov (%si), %ax
mov (%si), %eax
mov (%esi), %ax
mov (%esi), %eax
.code32
main32:
mov (%si), %ax
mov (%si), %eax
mov (%esi), %ax
mov (%esi), %eax
.code64
main64:
// mov (%si), %ax
// mov (%si), %eax
// mov (%si), %rax
mov (%esi), %ax
mov (%esi), %eax
mov (%esi), %rax
mov (%rsi), %ax
mov (%rsi), %eax
mov (%rsi), %rax
リストファイルを出してみる。
$ gcc -Wa,-a=test.lst -c -o test.o test.s
$ cat test.lst
GAS LISTING test.s page 1
1 .file "test.s"
2 .text
3
4 .code16
5 main16:
6 0000 8B04 mov (%si), %ax
7 0002 668B04 mov (%si), %eax
8 0005 678B06 mov (%esi), %ax
9 0008 67668B06 mov (%esi), %eax
10
11 .code32
12 main32:
13 000c 67668B04 mov (%si), %ax
14 0010 678B04 mov (%si), %eax
15 0013 668B06 mov (%esi), %ax
16 0016 8B06 mov (%esi), %eax
17
18 .code64
19 main64:
20 // mov (%si), %ax
21 // mov (%si), %eax
22 // mov (%si), %rax
23 0018 67668B06 mov (%esi), %ax
24 001c 678B06 mov (%esi), %eax
25 001f 67488B06 mov (%esi), %rax
26 0023 668B06 mov (%rsi), %ax
27 0026 8B06 mov (%rsi), %eax
28 0028 488B06 mov (%rsi), %rax
29
GAS LISTING test.s page 2
DEFINED SYMBOLS
*ABS*:0000000000000000 test.s
test.s:5 .text:0000000000000000 main16
test.s:12 .text:000000000000000c main32
test.s:19 .text:0000000000000018 main64
NO UNDEFINED SYMBOLS
ここで気が付くのは、同じ命令でも、違うコードが出ている。
例えば、
mov (%esi), %eax
は
16bitでは、67668B06
32bitでは、8B06
64bitでは、678B06
となっている。
67というのは、アドレスサイズプレフィックス
66というのは、オペランドサイズプレフィックス
これを見ると、各モードで、最も命令コードが短くなるアドレスサイズ、オペランドサイズが決まっているように見える。
16bitモードでは、アドレスサイズ、オペランドサイズが16bitが基本。
67を付けるとアドレスサイズが32bitになる。
66を付けるとオペランドサイズが32bitになる。
32bitモードでは、アドレスサイズ、オペランドサイズが32bitが基本。
67を付けるとアドレスサイズが16bitになる。
66を付けるとオペランドサイズが16bitになる。
64bitモードでは、アドレスサイズ64bit、オペランドサイズ32bitが基本。
67を付けるとアドレスサイズが16bitになる。
66を付けるとオペランドサイズが16bitになる。
48を付けるとオペランドサイズが64bitになる。
以下の表はアドレスサイズとオペランドサイズのbit幅に対し、どのようなプレフィックスを付ければいいのかを表している。
Mode
Addr Data 16bit 32bit 64bit
Mode
Addr Data 16bit 32bit 64bit
16 16 なし 6766 不可
16 32 66 67 不可16 64 不可 不可 不可
32 16 67 66 6766
32 32 6766 なし 67
32 64 不可 不可 6748
64 16 不可 不可 66
64 32 不可 不可 なし
64 64 不可 不可 48
2013年3月24日日曜日
ハンダ用の排気ダクトを自作する
ハンダ付けを長時間やったりすると、ヤニで頭が痛くなることがありますよね。
そこで、低予算で排気ダクトを作ってみました。
材料は、コーナンで売ってるものと、ありあわせのもので作ってみました。
<<材料>>
(1) アルミダクトホース (Φ100 x 3000mm)
コーナンProで購入。698円。
(2) クーラーキャップ
コーナンProで購入。248円。
(3) アルミテープ
コーナンProで購入。598円。
(4)CPUファン
余っているものを流用。
Scythe製の NINJA3 というCPUクーラーについてた FANが余っていたので、それを使います。
Scythe製の NINJA3 というCPUクーラーについてた FANが余っていたので、それを使います。
(5)ACアダプタ (12V)
余っているものを流用。
(6) DCジャック
電子工作用に、秋月で買い置きしておいたものですが、流用できそうです。
秋月で100円で売っています。
電子工作用に、秋月で買い置きしておいたものですが、流用できそうです。
秋月で100円で売っています。
<<作り方>>
ダクトホースにキャップをはめ、空気が漏れないように、しっかりとアルミテープでとめます。
キャップは必須ではないのですが、アルミダクトホースは端の部分で手を切りやすいので、安全のために、キャップを取り付けておいた方がよいです。
キャップは必須ではないのですが、アルミダクトホースは端の部分で手を切りやすいので、安全のために、キャップを取り付けておいた方がよいです。
その上に、CPUファンを取り付けて、アルミテープでとめます。
DCジャックからピンヘッダに変換して、CPUファンへ給電しています。
完成したところ。
写真ではわかりにくいのですが、煙を勢い良く吸い込んでくれています。
NINJA3 付属のファンはボリューム付きなのが良いですね。
写真ではわかりにくいのですが、煙を勢い良く吸い込んでくれています。
NINJA3 付属のファンはボリューム付きなのが良いですね。
2013年3月2日土曜日
gschem 覚書き
(1) 回路図をPDF として出力する。
方法1
gschem のメニューから
ファイル -> Print...
Destination で File を選択。
いったん、ps ファイルとして出力したあと、 ps2pdf コマンドで PDF へ変換する。
方法2
$ apt-get install cups-pdf
で cups-pdf をインストールします。
$ lpstat -p
で printer PDF が表示されればOK。
あとは gschem のメニューから
ファイル -> Print...
Command で lpr -P PDF
でプリントする。
~/PDF 以下に出力されているはず。
(2) gschem のカスタマイズ
/etc/gEDA/system-gschemrc を直接書きかえてもよいが、
個人の趣向に基づく変更がシステム全体に及ぶのも気が引ける。
そこで
~/.gEDA/gschemrc
もしくは
プロジェクトのディレクトリに gschemrc を置く。
emacs のように LISP で記述する。
どんな設定ができるのかは
/etc/gEDA/system-gschemrc の中身を見ればわかる。
(3) gschemrc に設定しておいた方がよい内容
/etc/gEDA/system-gschemrc を見れば、どんな設定ができるのかわかる。
# デフォルトでは背景が黒なので、色を白に変更する
(load (build-path geda-rc-path "gschem-colormap-lightbg")) ; light background
# プリントアウト用の色も黒から白へ変更する
(load (build-path geda-rc-path "print-colormap-lightbg")) ; light background
# デフォルトでは プリントアウトが白黒なので、カラー化する。
(output-color "enabled") ; for color PDF output
# 独自コンポーネントを置くディレクトリの設定。
# /usr/share/gEDA/sym/local に独自のシンボルを置けるようになっているが、rootしかできない。
# プロジェクトの下に mysym というディレクトリを作って、そこに置きたいので、以下のようにする。
(component-library "mysym")
# ネットが勝手に吸い付くのがうっとおしいので、デフォルトでOFFにする。
(magnetic-net-mode "disabled")
(4) さらに色をカスタマイズする
/etc/gEDA/gschem-colormap-lightbg
/etc/gEDA/print-colormap-lightbg
の色では満足できない場合、
上記の2ファイルの中身を gshcemrc へコピペする。
そして自分の所望の色に変更する。
自分は働き始めて最初に使ったのが OrCADだったので、OrCADに愛着があります。
ちょっと OrCAD っぽい色使いに変更してみました。
(display-color-map
'((background "#f0f0f0")
(pin "#ff0000")
(net-endpoint "#cd0000")
(graphic "#0000bb")
(net "#cd0000")
(attribute "#000000")
(logic-bubble "#008b8b")
(dots-grid "#7f7f7f")
(mesh-grid-major "#e1e1e1")
(mesh-grid-minor "#e8e8e8")
(detached-attribute "#ff0000")
(text "#000000")
(bus "#0000ff")
(select "#b22222")
(bounding-box "#ffa500")
(stroke "#a020f0")
(zoom-box "#008b8b")
(lock "#666666")
(output-background #f)
(junction "#ff00ff")
(freestyle1 #f)
(freestyle2 #f)
(freestyle3 #f)
(freestyle4 #f)
))
(print-color-map
'((background "#ffffff")
(pin "#ff0000")
(net-endpoint "#ffffff")
(graphic "#0000ff")
(net "#cd0000")
(attribute "#000000")
(logic-bubble "#008b8b")
(grid #f)
(detached-attribute "#ff0000")
(text "#000000")
(bus "#0000ff")
(select #f)
(bounding-box #f)
(zoom-box #f)
(stroke #f)
(lock "#666666")
(output-background "#ffffff")
(junction "#ff00ff")
(freestyle1 #f)
(freestyle2 #f)
(freestyle3 #f)
(freestyle4 #f)
))
方法1
gschem のメニューから
ファイル -> Print...
Destination で File を選択。
いったん、ps ファイルとして出力したあと、 ps2pdf コマンドで PDF へ変換する。
方法2
$ apt-get install cups-pdf
で cups-pdf をインストールします。
$ lpstat -p
で printer PDF が表示されればOK。
あとは gschem のメニューから
ファイル -> Print...
Command で lpr -P PDF
でプリントする。
~/PDF 以下に出力されているはず。
(2) gschem のカスタマイズ
/etc/gEDA/system-gschemrc を直接書きかえてもよいが、
個人の趣向に基づく変更がシステム全体に及ぶのも気が引ける。
そこで
~/.gEDA/gschemrc
もしくは
プロジェクトのディレクトリに gschemrc を置く。
emacs のように LISP で記述する。
どんな設定ができるのかは
/etc/gEDA/system-gschemrc の中身を見ればわかる。
(3) gschemrc に設定しておいた方がよい内容
/etc/gEDA/system-gschemrc を見れば、どんな設定ができるのかわかる。
# デフォルトでは背景が黒なので、色を白に変更する
(load (build-path geda-rc-path "gschem-colormap-lightbg")) ; light background
# プリントアウト用の色も黒から白へ変更する
(load (build-path geda-rc-path "print-colormap-lightbg")) ; light background
(output-color "enabled") ; for color PDF output
# 独自コンポーネントを置くディレクトリの設定。
# /usr/share/gEDA/sym/local に独自のシンボルを置けるようになっているが、rootしかできない。
# プロジェクトの下に mysym というディレクトリを作って、そこに置きたいので、以下のようにする。
(component-library "mysym")
# ネットが勝手に吸い付くのがうっとおしいので、デフォルトでOFFにする。
(magnetic-net-mode "disabled")
# デフォルトのプリント先はPDF 出力にする
(print-command "lpr -P PDF")
(4) さらに色をカスタマイズする
/etc/gEDA/gschem-colormap-lightbg
/etc/gEDA/print-colormap-lightbg
の色では満足できない場合、
上記の2ファイルの中身を gshcemrc へコピペする。
そして自分の所望の色に変更する。
自分は働き始めて最初に使ったのが OrCADだったので、OrCADに愛着があります。
ちょっと OrCAD っぽい色使いに変更してみました。
(display-color-map
'((background "#f0f0f0")
(pin "#ff0000")
(net-endpoint "#cd0000")
(graphic "#0000bb")
(net "#cd0000")
(attribute "#000000")
(logic-bubble "#008b8b")
(dots-grid "#7f7f7f")
(mesh-grid-major "#e1e1e1")
(mesh-grid-minor "#e8e8e8")
(detached-attribute "#ff0000")
(text "#000000")
(bus "#0000ff")
(select "#b22222")
(bounding-box "#ffa500")
(stroke "#a020f0")
(zoom-box "#008b8b")
(lock "#666666")
(output-background #f)
(junction "#ff00ff")
(freestyle1 #f)
(freestyle2 #f)
(freestyle3 #f)
(freestyle4 #f)
))
(print-color-map
'((background "#ffffff")
(pin "#ff0000")
(net-endpoint "#ffffff")
(graphic "#0000ff")
(net "#cd0000")
(attribute "#000000")
(logic-bubble "#008b8b")
(grid #f)
(detached-attribute "#ff0000")
(text "#000000")
(bus "#0000ff")
(select #f)
(bounding-box #f)
(zoom-box #f)
(stroke #f)
(lock "#666666")
(output-background "#ffffff")
(junction "#ff00ff")
(freestyle1 #f)
(freestyle2 #f)
(freestyle3 #f)
(freestyle4 #f)
))
2013年2月15日金曜日
zfs のオートスナップショット
Solaris ならば、定期的にスナップショットを取ってくれる機能がついています。
ZFS on Linux を使っていている時に、同じようなことをやりたいな、と思って超簡単なシェルスクリプトを書いてみました。
かなり、やっつけなので、どなたかもっといい感じに書き直してください。
定期的にジョブを実行するのには、crond を使用します。
/etc/cron.hourly/
/etc/cron.daily/
/etc/cron.weekly/
/etc/cron.monthy/
の下に放り込めばよいです。
hourly より細かいスケジュールを組みたい場合は /etc/crontab
に直接記載します。
以下は、 /rpool/share と /rpool/home の下を定期的にバックアップをとっている場合です。
●/etc/crontab に追加する内容
● /etc/cron.hourly/zfs-autosnap-hourly の内容
frequently は 10分おきに 6個まで
hourly は 1時間おきに24個まで
daily は1日おきに7個まで
weekly は1週おきに 4個まで
monthly は1ヶ月おきに 12個まで
スナップショットを取っています。
それ以上の数になると、古いものから消えていきます。
スナップショットを表示されると以下のような感じです。
ZFS on Linux を使っていている時に、同じようなことをやりたいな、と思って超簡単なシェルスクリプトを書いてみました。
かなり、やっつけなので、どなたかもっといい感じに書き直してください。
定期的にジョブを実行するのには、crond を使用します。
/etc/cron.hourly/
/etc/cron.daily/
/etc/cron.weekly/
/etc/cron.monthy/
の下に放り込めばよいです。
hourly より細かいスケジュールを組みたい場合は /etc/crontab
に直接記載します。
以下は、 /rpool/share と /rpool/home の下を定期的にバックアップをとっている場合です。
●/etc/crontab に追加する内容
10 * * * * root /usr/local/sbin/zfs-autosnap frequent 20 * * * * root /usr/local/sbin/zfs-autosnap frequent 30 * * * * root /usr/local/sbin/zfs-autosnap frequent 40 * * * * root /usr/local/sbin/zfs-autosnap frequent 50 * * * * root /usr/local/sbin/zfs-autosnap frequent
● /etc/cron.hourly/zfs-autosnap-hourly の内容
#!/bin/sh
if [ -x /usr/local/sbin/zfs-autosnap ]; then
/usr/local/sbin/zfs-autosnap hourly
fi
exit 0
● /etc/cron.daily/zfs-autosnap-dailyの内容
#!/bin/sh
if [ -x /usr/local/sbin/zfs-autosnap ]; then
/usr/local/sbin/zfs-autosnap daily
fi
exit 0
●/etc/cron.weekly/zfs-autosnap-weekly の内容
#!/bin/sh
if [ -x /usr/local/sbin/zfs-autosnap ]; then
/usr/local/sbin/zfs-autosnap weekly
fi
exit 0
●/etc/cron.monthly/zfs-autosnap-monthly の内容
#!/bin/sh
if [ -x /usr/local/sbin/zfs-autosnap ]; then
/usr/local/sbin/zfs-autosnap monthly
fi
exit 0
● /usr/local/sbin/zfs-autosnap の内容
#!/bin/sh
date=`date +%Y-%m-%d-%Hh%M`
snapname=zfs-auto-snap_$1-$date
for fs in rpool/share rpool/home
do
zfs snapshot -r $fs@$snapname
done
if [ -x /usr/local/sbin/zfs-autosnap-cleanup ]; then
/usr/local/sbin/zfs-autosnap-cleanup $1
fi
exit 0
●/usr/local/sbin/zfs-autosnap-cleanup の内容
#!/bin/sh
frequency=$1
case $frequency in
frequent) max=6;;
hourly) max=24;;
daily) max=7;;
weekly) max=4;;
monthly) max=12;;
*) max=999;;
esac
for fs in rpool/home rpool/share
do
snapshots=$(zfs list -t snapshot | sed -n "s|$fs@\(zfs-auto-snap_$frequency-[^[:blank:]]*\).*|\1|p" | sort)
nr_snapshots=$(echo $snapshots | wc -w)
set $snapshots
while [ $nr_snapshots -gt $max ]
do
zfs destroy -r "$fs@$1"
nr_snapshots=$(( $nr_snapshots - 1 ))
shift
done
done
exit 0
のようになっています。
frequently は 10分おきに 6個まで
hourly は 1時間おきに24個まで
daily は1日おきに7個まで
weekly は1週おきに 4個まで
monthly は1ヶ月おきに 12個まで
スナップショットを取っています。
それ以上の数になると、古いものから消えていきます。
スナップショットを表示されると以下のような感じです。
# zfs list -t snapshot
(中略)
rpool/share@zfs-auto-snap_monthly-2013-01-17-03h22 0 - 20.5G -
rpool/share@zfs-auto-snap_weekly-2013-01-21-03h04 0 - 20.5G -
rpool/share@zfs-auto-snap_weekly-2013-01-28-04h00 98.6K - 20.5G -
rpool/share@zfs-auto-snap_weekly-2013-02-04-03h26 0 - 20.5G -
rpool/share@zfs-auto-snap_daily-2013-02-09-03h19 0 - 20.5G -
rpool/share@zfs-auto-snap_daily-2013-02-10-03h21 0 - 20.5G -
rpool/share@zfs-auto-snap_daily-2013-02-11-03h35 0 - 20.5G -
rpool/share@zfs-auto-snap_weekly-2013-02-11-03h55 0 - 20.5G -
rpool/share@zfs-auto-snap_daily-2013-02-12-03h21 0 - 20.5G -
rpool/share@zfs-auto-snap_daily-2013-02-13-03h23 0 - 20.5G -
rpool/share@zfs-auto-snap_monthly-2013-02-14-03h11 0 - 20.5G -
rpool/share@zfs-auto-snap_daily-2013-02-14-04h49 0 - 20.5G -
rpool/share@zfs-auto-snap_hourly-2013-02-14-14h01 0 - 20.5G -
rpool/share@zfs-auto-snap_hourly-2013-02-14-15h01 0 - 20.5G -
rpool/share@zfs-auto-snap_hourly-2013-02-14-16h01 0 - 20.5G -
rpool/share@zfs-auto-snap_hourly-2013-02-14-17h01 0 - 20.5G -
rpool/share@zfs-auto-snap_hourly-2013-02-14-18h01 125K - 40.3G -
rpool/share@zfs-auto-snap_hourly-2013-02-14-19h01 32.0K - 40.3G -
rpool/share@zfs-auto-snap_hourly-2013-02-14-20h01 0 - 40.3G -
rpool/share@zfs-auto-snap_hourly-2013-02-14-21h01 0 - 40.3G -
rpool/share@zfs-auto-snap_hourly-2013-02-14-22h01 0 - 40.3G -
rpool/share@zfs-auto-snap_hourly-2013-02-14-23h01 0 - 40.3G -
rpool/share@zfs-auto-snap_hourly-2013-02-15-00h01 0 - 40.3G -
rpool/share@zfs-auto-snap_hourly-2013-02-15-01h01 0 - 40.3G -
rpool/share@zfs-auto-snap_hourly-2013-02-15-02h01 0 - 40.3G -
rpool/share@zfs-auto-snap_hourly-2013-02-15-03h01 0 - 40.3G -
rpool/share@zfs-auto-snap_daily-2013-02-15-03h41 0 - 40.3G -
rpool/share@zfs-auto-snap_hourly-2013-02-15-04h01 0 - 40.3G -
rpool/share@zfs-auto-snap_hourly-2013-02-15-05h01 0 - 40.3G -
rpool/share@zfs-auto-snap_hourly-2013-02-15-06h01 0 - 40.3G -
rpool/share@zfs-auto-snap_hourly-2013-02-15-07h01 0 - 40.3G -
rpool/share@zfs-auto-snap_hourly-2013-02-15-08h01 0 - 40.3G -
rpool/share@zfs-auto-snap_hourly-2013-02-15-09h01 0 - 40.3G -
rpool/share@zfs-auto-snap_hourly-2013-02-15-10h01 0 - 40.3G -
rpool/share@zfs-auto-snap_hourly-2013-02-15-11h01 0 - 40.3G -
rpool/share@zfs-auto-snap_frequent-2013-02-15-11h50 0 - 40.3G -
rpool/share@zfs-auto-snap_hourly-2013-02-15-12h01 0 - 40.3G -
rpool/share@zfs-auto-snap_frequent-2013-02-15-12h10 0 - 40.3G -
rpool/share@zfs-auto-snap_frequent-2013-02-15-12h20 0 - 40.3G -
rpool/share@zfs-auto-snap_frequent-2013-02-15-12h30 0 - 40.3G -
rpool/share@zfs-auto-snap_frequent-2013-02-15-12h40 0 - 40.3G -
rpool/share@zfs-auto-snap_frequent-2013-02-15-12h50 0 - 40.3G -
rpool/share@zfs-auto-snap_hourly-2013-02-15-13h01 0 - 40.3G -
登録:
投稿 (Atom)










