差分

ファイルシステム

2,249 バイト追加, 2021年11月17日 (水) 08:35
/* ファイルシステム */
;補足
: 次の解説も大変役に立ちます。 '' Linux ファイルシステムの徹底調査, 階層化構造からの検討, IBM developerWorks '' ([http://www.ibm.com/developerworks/jp/linux/library/l-linux-filesystem/ リンクリンク切れ]) ([https://developer.ibm.com/tutorials/l-linux-filesystem/ オリジナル英語版])
=== ツリー構造 ===
Unixのファイルシステムは/を頂点にしたツリー構造です。Windows系のオペレーティングシステムではCを頂点にしたツリー構造です。Windows系のオペレーティングシステムでは 「C:といったようにハードウェアである「ドライブ」を意識した構造になっていますが、Unixでは(Cドライブ)」 といったようにハードウェアである「ドライブ」を意識した構造になっていますが、Unixでは「/を頂点にしたきれいなツリー構造になっています。ディレクトリとはパソコンで言う所のフォルダです。ディレクトリがファイルの属性情報を知っています。ファイル自体はデータのみ入っています。先頭から連続したバイト列になっています。むかしファイルといえば大型汎用機のファイル構成しかなかった時代では説明するのが大変でしたが、今、この辺りは既に感覚的に馴染んでいるので、特に説明する必要はないでしょう。」を頂点にしたツリー構造になっています。ディレクトリとはパソコンで言う所のフォルダです。ディレクトリがファイルの属性情報を知っています。ファイル自体はデータのみ入っています。UNIXにおいてのファイルは先頭から連続したバイト列になっています。この事に関して、私達の身の回りにあるコンピュータでは何の不思議もありませんが、むかしの大型汎用機のファイル構成はこのようになっていませんでした。UNIXが登場した当時としては、このような形式はUNIXの特徴でもあったのですが、今やあたりまえになってしまっています。
まずは/にどんなファイルやディレクトリがあるかコマンドlsで見てみましょう。オプション(ROOTと呼びます)」にどんなファイルやディレクトリがあるかコマンド ls で見てみましょう。オプション -Fは名前の後ろにキャラクタをつけて、それがファイルなのかディレクトリなのか、あるいは他の属性を持つのかを表現してくれます。F は名前の後ろにキャラクタをつけて、それがファイルなのかディレクトリなのか、あるいは他の属性を持つのかを表現してくれます。
名前の後ろに/がついているのがディレクトリです。ファイルの後ろに@がついているのはシンボリックリンクです。まず、細かいことを抜いて、外部記憶装置であるハードディスクが、このファイルシステムと対応しているのかというもっとも最初の部分を説明しましょう。Windows系であればCがついているのは[https://uc2.h2np.net/index.php/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0#.E3.83.8F.E3.83.BC.E3.83.89.E3.83.AA.E3.83.B3.E3.82.AF.E3.81.A8.E3.82.B7.E3.83.B3.E3.83.9C.E3.83.AA.E3.83.83.E3.82.AF.E3.83.AA.E3.83.B3.E3.82.AF シンボリックリンク]です。WindowsであればC:とかE:といったドライブ名で出てくるので直観的にわかり易いですか、一方でハードウェアを意識せざる得ない構造になっています。といったドライブ名で出てくるのでハードウェアを意識する構造になっていますが、UNIXはハードウェアとしてのハードディスクは意識しません。
=== ファイルシステムのマウント ===
MOでもUSBメモリでもハードディスクでも、あるいはファイルであってもブロックデバイスとみなせるものなら同じですが、話を単純化するために、ここではハードディスクということで話を勧めましょう。MOでもUSBメモリでもハードディスクでも、あるいはファイルであってもブロックデバイスとみなせるものなら同じですが、話を単純化するために、ここではハードディスクということで話を勧めましょう。
ファイルシステムとはファイルを管理するための仕組み全体を指します。ハーディスクのパーティションをext2やext3、あるいはそれ以外のファイルシステムの形式にフォーマットし、それをファイルシステムとしてマウントします。ファイルシステムとはファイルを管理するための仕組み全体を指します。ハーディスクのパーティションをext2やext3、あるいはそれ以外のファイルシステムの形式にフォーマットし、それをファイルシステムとしてマウントします。
まずハードディスクのパーティションを設定し、各々のパーティション上にファまずハードディスクのパーティションを設定し、各々のパーティション上にファイルシステムを構築し(フォーマットし)、そしてマウントします。コマンドdfを使うと、どのパーティションがどのディレクトリにマウントしているのかわかります。イルシステムを構築し(フォーマットし)、そしてマウントします。コマンドdfを使うと、どのパーティションがどのディレクトリにマウントしているのかわかります。このディレクトリをマウントポイントと呼びます。このディレクトリをマウントポイントと呼びます。
<pre class="bash">
$ df
Filesystem 1k 1K-blocks Used Available Use% Mounted on (省略)/dev/hda1 28834716 sda1 487634 1593820 261696 196242 25776172 658% /boot /dev/hda2 48062468 sda2 201820928 11906896 179647588 4817440 40803552 117% /home
</pre>
/dev/hda1は、IDE 0 Master に接続されるハードディスクの最初のパーティショsda1はSATA(Serial ATA)インタフェースで接続され認識された最初のハードディスクの最初のパーティションのことです。sda2は2番目のパーティションを意味しています。ンのことで、hda2は2番目のパーティションを意味しています。ハードディスクをまるごと1パーティションにすることもできます。SATAのインタフェースの場合は元々/dev/sdaとなります。その中のパーティションがsd? (?はアルファベット1文字が入る)はSCSIインタフェースのためのブロックデバイス名でしたが、現在ではSCSIだけではなく、SATA(Serial ATA)インタフェース、あるいは同等なインタフェースで接続された場合/dev/sda1や/dev/sda2となります。sd?と名前がつくスペシャルデバイスファイルはSCSIのインタフェースでアクセスする記憶装置です。に割り当てられます。実際にはハードウェア側がSCSIのインタフェースをもっていなくてもスペシャルデバイスファイルを経由しエミュレーションとしてSCSIを提供するという意味です。  SATAのハードディスクだけではなくUSBメモリを使うときも例えばUSBメモリを使うときも/dev/sd?となります。下の例はUSBメモリを挿した時の状態です。このUSBメモリには となります。下の例はUSBメモリを挿した時の状態です。このUSBメモリには ''HIRONOBU'' と名前を設定しています。
多くのディストリビューションのデフォルトでは /media/ユーザ名 の下に自動的にマウントします。
これらのファイルシステムは、それぞれ性能や機能に特徴があります。
ユーザの選択肢が広く、その選択をユーザにゆだねているのもまたLinuxの特徴です。
個々のファイルシステムの特徴に関しては後ほど説明します。
:; 調べてみよう| : Linux以前のUnixも一つのオペレーティングシステムは主たるファイルシステムは1つだけでした。それは何故でしょう。
ファイルシステムの構築とマウントは非常に簡単です。ハードディスクを指定してフォーマットし、それとマウントポイントとなるディレクトリへマウントするだけです。ファイルシステムの構築とマウントは非常に簡単です。ハードディスクを指定してフォーマットし、それとマウントポイントとなるディレクトリへマウントするだけです。
=== inode ===
inode番号はディレクトリ中にあるファイル名とinode番号を管理するデータ構造
struct dirent
<ref>httphttps://lxrgithub.com/torvalds/linux.no/sourceblob/master/include/linux/dirent.h?v=2.6.8.1</ref>
に格納されています。
カーネル内の関数nameiによりファイル名はinode番号に変換されます。
inode自体は
struct inode
<ref>httphttps://lxrgithub.com/torvalds/linux.no/sourceblob/master/include/linux/fs.h?v=2.6.8.1</ref>
を参照するとわかりますが、ファイルの属性に関する情報などを持っています。
一方でユーザはinode番号はわかりますがinodeが持っている情報には直接アク
複数のファイルシステム方式があるのに、何故ユーザは統一したインタフェースでファイルにアクセスできるのでしょう?
それはVFS (Virtual File System)
<ref>VFSに関する資料 httphttps://wwwdeveloper.valinuxibm.cocom/tutorials/l-virtual-filesystem-switch/</ref><ref>Overview of the Linux Virtual File System https://www.jpkernel.org/docsdoc/pdfhtml/D-2latest/filesystems/vfs.pdfhtml</ref>
が用意されているからです。
VFSの下に位置するファイルシステムは、少なくともカーネルのソースコードをチェックする限り30以上あります。VFSの下に位置するファイルシステムは、少なくともカーネルのソースコードで数えた所、50以上ありました。<ref>httphttps://lxrgithub.linux.nocom/torvalds/#linux+v2.6.36/tree/master/fs/</ref>
個々のファイルシステムがどこまで利用可能なのか、つまり、常用のファイルシステムとして使えるのか、
互換性のために残しているのか、あるいは読み込みだけで書き込みができない、
あるいは一部の機能しか使えないなどに関しての資料が見当たらないので一概に30以上というのは不適切かも知れません。あるいは一部の機能しか使えないなどに関しての資料が見当たらないので一概に50以上というのは不適切かも知れません。次によく使われるファイルシステムを取り上げて説明してみましょう。しかし、数種類、あるいは十数種類というレベルではないことは確かです。 次に主要なファイルシステムを取り上げて説明します。
== ファイルシステム ==
ここでは下位レイヤでのファイルシステムを個別に説明します。
その前に、現在利用しているGNU/Linuxのシステムがどのようなファイルシステムをサポートしているのかを確認する時は [[/proc/filesystems ]] を参照するとわかります。
<pre class="bash">
最大ファイルシステムサイズ4TB、最大ファイルサイズ4TBまで扱えます。
 
=== ext4 ファイルシステム ===
 
 
ext4 は ext3 の後継として作られたファイルシステムです。カーネル2.6.19 から正式採用しています。ext4 のファイルシステムは1EB、ファイルサイズは16TBのサイズをサポートしています。
 
同時期に存在していた競合していたJFSやXFSファイルシステムから良い点を導入しするなど新しい機能や拡張を行い、また安定性も十分に備え、ext3に比べて大きく進化しています。
 
たとえばパフォーマンスに関してはブロックの遅延アロケーションが可能になりました。これはなるべくディスク上の物理ブロックを連続に確保するために書き込みを遅滞させます。連続した物理ブロックに書き込むことが出来るようになり、その後にファイルをリードする際に高速に読み込むことが出来るようになります。ファイルサイズが最初にわかっている場合はファイルのプリアロケーションの機能を使いディスク上の物理ブロックを予め確保することが出来ます。
 
他にもたくさんの新しい機能があります。調べるには下記の資料が役に立つでしょう。
 
 
* RED HAT ENTERPRISE LINUX ストレージ管理ガイド [https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/storage_administration_guide/ch-ext4 第6章 EXT4 ファイルシステム]
 
* AAnatomy of ext4 [https://developer.ibm.com/tutorials/l-anatomy-ext4/ Anatomy of ext4 ]
=== JFS / ReiserFS / XFS ===
ext3と比べるべきファイルシステムとしてIBM社が開発したJFSファイルシステムext4と比べるべきファイルシステムとして過去IBM社が開発しLinuxカーネルにマージされているJFSファイルシステム
<ref>
JFS概説JFSジャーナル・ファイル・システムによるシステム再始動時間の短縮httphttps://wwwwiki.ibmarchlinux.com/developerworks/jp/linuxindex.php/library/l-jfs.htmlJFS
</ref>
ReiserFS ファイルシステム、
あるいはシリコングラフィックス社が開発したXFSファイルシステムあるいは過去シリコングラフィックス社が開発しLinuxカーネルにマージされているXFSファイルシステム
<ref>
http://xfs.org/index.php/Main_Page
熟練オペレーターによる運用が行われる場合、これらのエンタープライズ環境で必須な障害からの復帰などの能力や特性を十分に活かすことが出来るでしょう。
; 補足 : 日常利用するディスクトップのレベルであれば、GNU/Linuxのディストリビューションがデフォルトで選択するファイルシステムで十分な能力を発揮します。 === ext4 ===  ext4 は ext3 の後継として作られたファイルシステムです。カーネル2.6.19 から正式採用しています。ext4 のファイルシステムは1EB、ファイルサイズは16TBのサイズをサポートしています。 同時期に存在していた競合していたJFSやXFSファイルシステムから良い点を導入しするなど新しい機能や拡張を行い、また安定性も十分に備え、ext3に比べて大きく進化しています。 たとえばパフォーマンスに関してはブロックの遅延アロケーションが可能になりました。これはなるべくディスク上の物理ブロックを連続に確保するために書き込みを遅滞させます。連続した物理ブロックに書き込むことが出来るようになり、その後にファイルをリードする際に高速に読み込むことが出来るようになります。ファイルサイズが最初にわかっている場合はファイルのプリアロケーションの機能を使いディスク上の物理ブロックを予め確保することが出来ます。 他にもたくさんの新しい機能があります。調べるには下記の資料が役に立つでしょう。   * 第6章 EXT4 ファイルシステム https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/storage_administration_guide/ch-ext4* ext4 の徹底調査 第 4 世代拡張ファイルシステム、ext4 の紹介 https://www.ibm.com/developerworks/jp/linux/library/l-anatomy-ext4/index.htmlLinuxのディストリビューショ
=== Reiser4 / NILFS2 / Btrfs ===
=== tmpfs、ramfsファイルシステム ===
メモリ上に展開するファイルシステムです。メモリ上にあるのでシステムが停止すればなくなります。一時的なファイルを作成するファイルシステムとして利用されます。メモリ上に展開するファイルシステムです。メモリ上にあるのでシステムが停止すればなくなります。一時的なファイルを作成するファイルシステムとして利用されます。tmpfsは仮想記憶上に取られるので利用するシステムの記憶領域が足りない時はページイン・ページアウトが発生します。
; 調べてみよう : dfやmountコマンドを使って、自分のファイルシステムでtmpfsがどのように使われているか調べてみよう。
; 補足 : ramfsは物理的メモリしか使わないのに対し、tmpfsは仮想記憶上に取られます。つまりtmpfsは、システムの物理的記憶空間が足りなくなってきた場合、内容をスワップします。そのため、搭載している物理的メモリよりも大きなエリアを取ることも可能です。
 
=== JFFS / JFFS2 ===
 
USBストレージやSDカードなどフラッシュメモリを使った記憶装置をファイルシステムとして使うためのフラッシュ・ファイルシステムがLinuxには用意されています
<ref>
Linux フラッシュ・ファイルシステムの徹底調査 さまざまな選択肢とそのアーキテクチャー
https://www.ibm.com/developerworks/jp/linux/library/l-flash-filesystems/index.html
</ref>
フラッシュ・ファイルシステムとして
JFFS (Journaling Flash File System)、
JFFS2 (Journaling Flash File System 2)、
YAFFS2 (Yet Another Flash File System 2)
などがあります。
JFFSは現在では使われておらず、後継のJFFS2が利用されています。
 
 
フラッシュメモリ(ここではUSBストレージやSDカードに使われているNAND フラッシュ・デバイスとします)には書き込みや読み込みはハードディスクと違う動作を必要としますし、またフラッシュメモリには書き換え上限があり同じ場所で書き込みを繰り返し上限に達すると、その場所が書き込めなくなるります。そのためフラッシュメモリに特化したファイルシステムが用意されています。
 
 
一方で近年ではSDカードやUSBストレージのハードウェアも進化し特別なファイルシステムがなくとも効率よく、かつ寿命が伸びる仕組みを取り入れているのでSDカードやUSBストレージを使っているからといって必ずJFFS2のようなファイルシステムが必要であるというわけではない状況になって来ています。たとえばAndroidの場合、古くはJFFS2でしたが後にext4に切り替えています。
=== ネットワークファイルシステム ===