差分
ファイルシステム
,/* ファイルシステム */
;補足
: 次の解説も大変役に立ちます。 '' 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はハードウェアとしてのハードディスクは意識しません。
=== ファイルシステムのマウント ===
<pre class="bash">
$ df
</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/ユーザ名 の下に自動的にマウントします。
</pre>
; 補足
: [[USBメモリをLinuxファイルシステムとして使う]]
これらのファイルシステムは、それぞれ性能や機能に特徴があります。
ユーザの選択肢が広く、その選択をユーザにゆだねているのもまたLinuxの特徴です。
個々のファイルシステムの特徴に関しては後ほど説明します。
=== inode ===
できません。ls -iを使えばinode番号が表示されます。
<pre class="bash">
$ ls -i *.txt
540463 memo.txt 540446 section-4.txt 540452 section-8.txt
540416 section-2.txt 540420 section-6.txt
540443 section-3.txt 540447 section-7.txt
</pre>
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が持っている情報には直接アク
これはLinuxのような今日的なUnix系のオペレーティングシステムでは、
複数のファイルシステムの方式を同時に持っているからです。
=== VFS ===
複数のファイルシステム方式があるのに、何故ユーザは統一したインタフェースでファイルにアクセスできるのでしょう?
それは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>
が用意されているからです。
個々のファイルシステムがどこまで利用可能なのか、つまり、常用のファイルシステムとして使えるのか、
互換性のために残しているのか、あるいは読み込みだけで書き込みができない、
== ファイルシステム ==
ここでは下位レイヤでのファイルシステムを個別に説明します。
その前に、現在利用しているGNU/Linuxのシステムがどのようなファイルシステムをサポートしているのかを確認する時は [[/proc/filesystems]] を参照するとわかります。
<pre class="bash">
% cat /proc/filesystems
</pre>
=== ext2 ファイルシステム ===
<ref>ext2に関する資料
http://www.linux.or.jp/JF/JFdocs/Filesystems-HOWTO-6.html</ref>
は正式名称Second Extented Filesystemといい、ext2fsとも書きます。Linux のために開発されたファイルシステムです。とも書きます。Linuxのために開発されたファイルシステムです。前身である前身である Ext ファイルシステムの次のバージョンと位置づけられます。最大ファイルシファイルシステムの次のバージョンと位置づけられます。現在も /boot のファイルシステムは ext2 ファイルシステムを利用しているディストリビューションが多くあります。ステムサイズ4TB、最大ファイルサイズ2GB 最大ファイルシステムサイズ4TB (カーネル2.6からは32TB)、最大ファイルサイズ2GB まで扱えます。
ext2ファイルシステムはファイルの読み書きで良い局所性を出すための工夫がされています。ext2ファイルシステムはファイルの読み書きで良い局所性を出すための工夫が書き出しが行われる時、同じブロックグループ内で、隣接する8ブロックを先行して割り当てするので、連続しての書き込みの効率があがります。されています。書き出しが行われる時、同じブロックグループ内で、隣接する8ブロックを先行して割り当てするので、連続しての書き込みの効率があがります。このような書き方をするので当然、連続しての読み込みをする際のヒット率が高くなります。このような書き方をするので当然、連続しての読み込みをする際のヒット率が高くなります。
=== ext3 ファイルシステム ===
ext3
<ref>ext3に関する資料 http://www.valinux.co.jp/docs/pdf/D-3.pdf</ref>
* AAnatomy of ext4 [https://developer.ibm.com/tutorials/l-anatomy-ext4/ Anatomy of ext4 ]
=== JFS / ReiserFS / XFS ===
<ref>
</ref>
、
ReiserFS ファイルシステム、
<ref>
http://xfs.org/index.php/Main_Page
</ref>
などもあります。
JFS は IBM の AIX、
XFS はシリコングラフィックス社の IRIX といった実績のあるUNIX系OSで使われていたものであり、
; 補足 : 日常利用するディスクトップのレベルであれば、GNU/Linuxのディストリビューショ
JFSやXFSやReiserFSの次の世代のファイルシステムです。
* Reiser4 : ReiserFSの後継。まったくの別実装。
* NILFS2 : Log-structured ファイルシステム、耐故障性の向上、スナップショット機能
=== tmpfs、ramfsファイルシステム ===
; 調べてみよう : 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に切り替えています。
=== ネットワークファイルシステム ===
==== NFS ====
NFS (Network filesystem) はUnixで最初に使われたネットワークを経由してはUnixで最初に使われたネットワークを経由してファイルシステムをマウントする仕組みです。ファイルシステムをマウントする仕組みです。NFSの仕様はUNIXだけではなくNFSの仕様はUNIXだけではなく抽象化したファイルシステムとなっています。抽象化したファイルシステムとなっています。たとえば異なるUnixの種類同士たとえば異なるUnixの種類同士(例えばFreeBSDのファイルシステムとLinuxとか、あるいはSUN SolarisとSystemV SolarisとSystemV IIIとか)、あるいはUnixとWindowsといったファイルシステムの種類、の異なるものでもネットワークを介して共有することができます。LANで接続あるいはUnixとWindowsといったファイルシステムの種類の異なるものでもネットワークを介して共有することができます。されたコンピュータ間でファイルを共有することを想定しています。LANで接続されたコンピュータ間でファイルを共有することを想定しています。
<pre class="bash">
$ echo 'abcd' > i
$ cat i
$ cat t
cat: t: そのようなファイルやディレクトリはありません
</pre>
ているので、ファイルの中身はまだ存在しています。
<pre class="bash">
$ echo 'abcd' > i
$ ln i t
合計 4
8488913 -rw-r--r-- 1 hironobu hironobu 5 2005-11-21 20:14 t
</pre>