🐧

原稿用紙からはじめるファイルシステム超入門

2023/07/24に公開

はじめに

  • ファイルシステムという言葉は聞いたことがあるが、何なのか、なぜ必要なのかがわからない
  • ファイルシステムには種類があり、ファイルはLinuxではiノードと関係すると聞いたことがある
  • ファイルシステムを勉強したいが取っ掛かりが難しくて挫折している

そんな人がファイルシステムとはそもそも何か、どのような構成かを理解するための記事です。
原稿用紙をHDDやSSDに見立てて、ファイルシステムが無い状態から段階的に簡素なファイルシステムを作り上げながら理解を目指します。

root@linux-kohama:~# df -i -t ext4    # iノード情報の表示
Filesystem     Inodes IUsed  IFree IUse% Mounted on
/dev/sda1      647168 79104 568064   13% /


Ext2データレイアウト
「ブロックアルゴリズムとB-Treeアルゴリズム:Linuxファイルシステム技術解説(2)- @IT」より引用 (https://atmarkit.itmedia.co.jp/ait/articles/0306/24/news002_2.html)

HDDやSSDはファイルの読み書きができない

(反論)「いやいや普通に出来てるし」
(回答)「それはファイルシステムがあるから」

HDDやSSDは記録位置とサイズで読み書き

  • HDDは円盤(プラッタ)、SSDは黒くて四角い素子(NANDフラッシュメモリ)に記録する
  • 記録位置(=アドレス、先頭から何番目か)とサイズを指定して読み書きする

難しい話になったので軌道修正(ここから本編)

HDDやSSDへの記録を原稿用紙に例えて考えます。

容量(400字と72GB)は違うが考え方は同じ

  • 原稿用紙の最小の記録単位はマス(1文字)、HDDやSSDはセクタ(512Bまたは4KB)だが、どちらもその位置をアドレス(先頭から何番目か)で指定出来るので同様に考えることができる

例えばこんな3種類の内容を記録しておきたい場合

  • 「正体」について

コナン=工藤新一

  • ストレージ用語

ハイエンドストレージは複数のコントローラを搭載することで数百万IOPSの性能と高い可用性を達成するが、フラッシュディスクの普及に伴い性能優位性は見出しにくくなっている

  • 海外旅行ToDo

今日…行先決定 明日…証明写真を撮る 今週中…パスポート申請 今月中…旅行会社で申込み

ファイルシステムが無い場合

  • HDDやSSD全体が1ファイルであるのと等しく、自分で記録位置を指定して読み書きが必要
  • キーワード等での検索は数百GB~十数TBあるHDDやSSD全体を読み込みするので現実的でない

簡易ファイルシステム(その1)

  • 単純に1行を1ファイル(固定長)とし、全部で20ファイルが格納できるファイルシステム
  • 内容ごとにファイルを分割出来たが 「正体」について以外は1つの内容を複数ファイルから読み書きする必要あり

簡易ファイルシステム(その2)

  • ファイルを管理領域とデータ領域に分けることでファイルサイズが可変長のファイルシステム
  • 内容ごとにファイルを分割、かつ、内容ごとに1ファイルを読み書きすればよい

  • 管理領域にデータ領域の位置が記録されているので、その位置が指す先を読み書きすることでデータにアクセスできる

  • ファイルに追記しても追記前と同様に管理領域からたどればデータへアクセスできる
    • 「正体」についてに追記し2つ目のデータ領域が使われた

簡易ファイルシステム(その3)

  • ディレクトリ実装、ファイル名はディレクトリにより付けられる(ファイル自体に名前はない
    • ディレクトリが破壊されファイル名が失われると、fsckの結果としてファイルがlost+foundディレクトリにiノード番号のファイル名になって格納される
  • ディレクトリは種別とデータ構造が通常ファイルと異なるファイルである

  • この簡易ファイルシステムの各領域を一般的な言葉で示すと以下の通り


Ext2データレイアウト(再掲)

結局ファイルシステムとは何だったのか?

HDDやSSDへのデータ読み書き・管理をファイルやディレクトリ操作として利用者に提供するためのデータ構造とソフトウェア

この記事ではデータ構造をメインに説明してきました。ソフトウェアはこのデータ構造を理解し、利用者(アプリケーションプログラム)に対してファイル操作を提供します。

更に知りたい人へ

書籍・資料等

情報処理学会会誌2017年12月号小特集「ファイルシステムとストレージ」:

  • 小特集の中でも「ファイルシステムとストレージ:1.ファイルシステム技術の最前線 -ファイルシステムの基礎から最先端ファイルシステムまで-」はお勧めです
  • 発行後2年が経過したので、登録不要・無料で読めます

http://id.nii.ac.jp/1001/00184223/

@IT 連載記事 「Linuxファイルシステム技術解説」:

  • 少し古い記事ですが多くのトピックがあり、ファイルシステムの理解に役立ちます

https://atmarkit.itmedia.co.jp/flinux/index/indexfiles/linuxfsindex.html

詳細に実装や動作の理解に踏み込みたい人向け:

  • UNIX Filesystems: Evolution, Design, and Implementation (ISBN-13:978-0471164838)
  • 詳解 Linuxカーネル 第3版 (ISBN-13:978-4873113135)

落穂拾い(おちぼひろい)

  • 1バイトのファイルを1024^2(≒100万)個作ったらファイルシステムはどれだけ消費する?
    • 1024^2バイト=1MB? ⇒ いいえ、4GBです(一般的なLinuxの場合)
      Linuxは4KBでHDDやSSDの領域を区切るので1バイトだけ書いても4KB使います
  • 共有ディスクのファイルシステムに対して複数サーバから読み書きしたらいい感じに使える?
    • 壊れます…各々のサーバが自分専用だと思って読み書きするので目も当てられない状況に…
  • ファイルシステムが変わると何か影響ある?
    • LinuxでExt4からXFSに変わるとファイルシステムの縮小が出来ません
    • ファイルをrenameした直後の電源断はファイルシステムの種類・オプションによってrename前に戻る可能性があるなど動作が変わるリスクがあります

追記

理解度のチェック+αの内容の演習編を公開しました。
https://zenn.dev/lightgreenface/articles/b2fd0c13c51b21

Discussion