遅々として進まない夏休みの宿題をほかしているうちに夏休みは終って
今週末(9月4日)にオープンソースカンファレンス2004というのがある。 http://osc.ospn.jp Begi.netの宮原さんに頼まれて出張カーネル読書会をやるので皆さんお誘い合わせの上参加ください。特に若い人(U20とか)と女子。恐くないよ。
それはともかく夏休みの宿題である。遅々として進まず。飲みに行っていたりするからいけないのですね。すんません。
梅田さんのセミナーの打ち上げで中村さんの奥さん(とってもチャーミングな方でした)に「消してしまったファイルを復活させるためにLinuxカーネルのソースコードを読んでいるよしおかさんです」と紹介されてしまったのはわたしである。ツカミは変なやつである。
それはともかく夏休みの宿題である。3日ほど会社を休んでぼーーっとしていたのだが、まあ、世間的には夏休みというほど長い休みではないけど、結局オリンピックを朝から晩そして深夜までみまくって夏休みの宿題にはまったく手を付けなかったのである。すいません。
さすがにカーネルのコードを読むより4年に一度の祭典を見る方が楽しい。4年に一度のことだから許してほすぃ〜
それはともかく夏休みの宿題である。すっかり何をやっていたのか忘れてしまったのでちょっと復習をしてみる。わたしは自分のホームディレクトリ以下全ファイルをすっかりさっぱり間違って意図せず消去してしまった。すっかりである。さっぱりである。潔く消去してしまった。自分の意図とは関係ないところで。そこで可能ならばそれを復活させたいと願ったのである。Linuxではext2というファイルシステムがあるのだけどわたしのホームディレクトリはそれなのでとりあえずext2なるものを学ぶ。教科書は詳解Linuxカーネル第2版ISBN:4873111331。訳者の皆さんはカーネル読書会でいつもお世話になっている方である、余談だけど。ディスク上にあるイメージのダンプ方法に関してはman odで学ぶ。高校の英語教師村松の教えに従って辞書を引くのである。
OD(1) OD(1) 名前 od - ファイルを 8 進数 (または他の形式) で出力する 書式 od [-v] [-j BYTES] [-s [LENGTH]] [-t TYPE] [-w WIDTH] [-A RADIX] [-N BYTES] [--address-radix=RADIX] [--format=TYPE] [--output-duplicates] [--read-bytes=BYTES] [--skip-bytes=BYTES] [--strings[=LENGTH]] [--width[=WIDTH]] [FILE...] od [--help] [--version] 非 POSIX オプション: od [-abcdfhilox] [FILE...] od -C [--traditional] [FILE] [[+]OFFSET [[+]LABEL]] 説明 od は FILE それぞれの内容を明確な形式で標準出力に書き出す。 FILE が一 も与えられないと標準入力から読み込む。また FILE が `-' だった場合には そのファイルには標準入力が用いられる 出力のそれぞれの行では、まず最も左のカラムに入力ファイルでのオフセ が 書 か れ、ファイルのデータのグループが続く。デフォルトでは od はオフ セットを 8 進数で、ファイルのデータのグループは 2 バイトずつ 8 進数で表 以下略
そしてファイルを管理しているinodeの見方について勉強した。根っ子のディレクトリであるルートディレクトリの読み方を学んだがそこからどうやって/home/hyoshiok(わたしのホームディレクトリ)にたどり着くかが問題である。Unixのファイルシステムではディレクトリもファイルである。そのフォーマットを理解しないことにはディレクトリの探検はできない。不思議な事にinodeにはファイル名が記録されていなくてファイルをファイル名で検索するにはディレクトリを渡り歩かないといけないのである。我々はファイルにアクセスする時、通常はファイル名を利用するが、ファイルシステムはinodeを利用する。ファイル名からinodeへの変換によって実際のコンテンツにたどりつくというのがUnix的ファイルシステムなのである。
ディレクトリのデータ構造を知るためにソース/usr/src/linux/include/linux/ext2_fs.hを眺めてみよう。
struct ext2_dir_entry_2 { __u32 inode; /* Inode number */ __u16 rec_len; /* Directory entry length */ __u8 name_len; /* Name length */ __u8 file_type; char name[EXT2_NAME_LEN]; /* File name */ };
ここで__u32は32ビット、__u16は16ビット、__u8は8ビットである。
31 0 15 7 7 **** **** **** **** **** **** **** **** **** **** A B C D E
Aがinode(32ビット)、Bがrec_len(16ビット)、Cがname_len(8ビット)、Dがfile_type(8ビット)、Eはファイル名。という感じである。