index

2002年 12月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
2003年 1月
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
2003年 2月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28    

アレ

  ▽20030109b #日記

えー...とりあえず昨日の続きの調査したりとか. /dev/ad0s1e から起動するより,こいつを /dev/ad0s1a にしてしまう方がよさげだ. けど,この辺って全然理解できてねーので, どういう風にしたものやらサッパリだ(笑)

えー...disklabel とゆーコマンドで, この辺の編集ができる...ようなんだけど, 「disklabel はエラーとか全然チェックしねーで書き込みます」とか書いてあって, 仕組みをよく理解しないで使うととっても後悔しそうな気がする(笑)  ということで先生方に IRC で確認.これでいいみたい.

なんだなぁ,a とか e とかってのは,簡単に書き換えちゃえるようなものなのかな?  ていうか e って何だよ e って. /dev/ad0s1a.0 とか 1 とかはなんとなくわかるんだけど. えーっと,b が swap パーティション用, c が「その HDD 全部」を示す用,で,a と d~ がフツーのパーティション用なんだが, /stand/sysinstall を使って HDD をアレコレする場合, a ってのは / にマウントするものじゃないといけなくて, そうでない場合は e とかを割り振るらしい. そんなテキトーな感じでいいのか?  ていうか a とか e とかって何で決まってるんだろう?

ということで,実際にダンプして見てみましょう.

# dd if=/dev/ad0s1c | od -x | more

えーっと,先頭の 512 バイトが MBR でー, その後ろのテーブルらしき部分を探す. きっとパーティションのサイズとか持ってるんだろうから,その辺をキーに.

えー,まずこっちが社の問題のパーティション.

disklabel -r /dev/ad0s1
#        size   offset    fstype   [fsize bsize bps/cpg]
  c:  8385867        0    unused        0     0         # (Cyl.    0 - 521*)
  e:  8385867        0    4.2BSD        0     0     0   # (Cyl.    0 - 521*)
dd if=/dev/ad0s1c | od -x
0001220      2000    0000    0000    0000    0000    0000    0000    0000
0001240      0000    0000    0000    0000    0000    0000    0000    0000
0001260      0000    0000    f54b    007f    0000    0000    0000    0000
0001300      0000    0000    0000    0000    0000    0000    0000    0000
0001320      0000    0000    f54b    007f    0000    0000    0000    0000
0001340      0007    0000    0000    0000    0000    0000    0000    0000

そんでこっちは家のマシン.

disklabel -r /dev/ad0s1
#         size   offset    fstype   [fsize bsize bps/cpg]
  a:   2097152        0    4.2BSD        0     0     0   # (Cyl.    0 - 130*)
  b:   2097152  2097152      swap                        # (Cyl.  130*- 261*)
  c: 156296322        0    unused        0     0         # (Cyl.    0 - 9728*)
  e:   8388608  4194304    4.2BSD        0     0     0   # (Cyl.  261*- 783*)
  f:  20971520 12582912    4.2BSD        0     0     0   # (Cyl.  783*- 2088*)
  g: 122741890 33554432    4.2BSD        0     0     0   # (Cyl. 2088*- 9728*)
dd if=/dev/ad0s1c | od -x
0001220      2000    0000    0000    0020    0000    0000    0000    0000
0001240      0007    0000    0000    0020    0000    0020    0000    0000
0001260      0001    0000    e482    0950    0000    0000    0000    0000
0001300      0000    0000    0000    0000    0000    0000    0000    0000
0001320      0000    0000    0000    0080    0000    0040    0000    0000
0001340      0007    0000    0000    0140    0000    00c0    0000    0000
0001360      0007    0000    e482    0750    0000    0200    0000    0000
0001400      0007    0000    0000    0000    0000    0000    0000    0000

8385867 は 0x7ff54b だし,2097152 は 0x200000,156296322 は 0x950e482 だ. つまりアレですかえーっと... 16bytes を 1レコードとして,テーブルの先頭から a b c d... と割り振られる,と. offset もレコード中に保持されてるようだから, 例えば「offset が昇順に並んでいねーとダメ」とかってルールがあったりしなければ, ここんとこを並べ替えればおっけーなのであろう. で,これをやるのが disklabel コマンド,なのかな.

index