UNIXやLinuxのシステム管理(システム・コマンド・設定)に関する世界観4(ファイルシステム)です。
ファイルはデータの保管を抽象的に扱ったもので、プログラムはデータをストレージに保管する際にファイルとして保管する。
UNIXでは「原則ファイルとして扱う」という哲学があり、デバイスドライバによって操作されるデバイスもファイルとして扱われる。
また、ディレクトリはファイルを集めてひとつの場所に格納するもの。
絶対パスはルートディレクトリ(/)から始まる絶対的なファイルの場所のこと。
相対パスは、今の自分のいるディレクトリ、すなわち「作業ディレクトリ」から始まる相対的な場所のこと。
通常、ファイル名だけでアクセスする時は、作業ディレクトリからの相対パスとして扱われるが、「/」から始まるパスを指定すると絶対パスとして扱われる。
相対パスにおいて、「.」は現在のディレクトリ、「..」は現在のディレクトリの上のディレクトリ(親ディレクトリ)を表す。「./hogehoge」とすることで、現在のディレクトリの中にあるhogehogeを指定できる。
ファイルには、名前が設定されるが、この名前は本当は複数設定できる。名前のことをリンクあるいはハードリンクという。
だが、さまざまな制約があることから、通常ハードリンクは使われなくなった。ハードリンクは名前を複数設定するだけのものだが、これに対して、小さなリンク専用のファイルを作ってそこからパスを辿っていく、ソフトリンクあるいはシンボリックリンクが広く使われている。
ファイル、ディレクトリ、シンボリックリンク、ブロック型デバイスファイル、キャラクタ型デバイスファイルのほか、名前付きパイプやソケットなどもファイルとして扱われることがある。
(「詳解 Linuxカーネル 第2版」を読みながら自分で考えて書きました。)
Linuxでは、ストレージデバイスは使う際にマウントする必要がある。
Windowsでは、システムの入るドライブはC:ドライブであり、外部ストレージを接続するとD:ドライブやE:ドライブから直接操作することができるが、Linuxの場合、マウント専用のディレクトリ(マウントポイント)を切って、マウントしなければストレージデバイスを使うことはできない。
マウントするためにはmountコマンド、マウントを取り外す(アンマウント)ためにはumountコマンドを使う。
mountコマンドを使う際には、マウントポイントとなるディレクトリと、/dev/以下に存在するブロック型デバイスファイルを、マウントを行うための「とっかかり」として指定する。
マウントする前に、必ずLinuxで使うことのできるファイルシステムにストレージをフォーマットしておかなければならない。たとえばext2/3/4のようなフォーマットで一度ファイルシステムを作成しておく必要がある。
また、ファイルシステムを作る際に、事前にパーティションを切っておくことで、複数の領域を分割し、別々のファイルシステムを作り、別々のマウントポイントへとマウントすることができる。たとえば、WindowsとLinuxのデュアルブート構成で、NTFSとext4のファイルシステムを作成するパーティションを切ったり、ルートディレクトリ/とホームディレクトリ/homeをあらかじめ分割しておくことで、個人データだけを残したままディストリビューションを再インストールすることなどができる。
Linuxの起動時にマウントするディレクトリは、/etc/fstabで指定できる。/etc/fstabではローカルのディレクトリだけではなくNFSでリモートにあるディレクトリも指定できる。なので、/usr以下をNFSサーバで共有する、などといった昔のワークステーションで見られた使用法なども可能である。
2023.05.18
僕が思うに、ファイルシステムが分かれば、Linuxのほとんどは分かります。
ファイルシステムとは、ストレージの中のデータを整理するシステムのことです。
Linuxでは、プログラム、データファイル、設定ファイル、ログファイル、ドキュメント、ホームディレクトリの中の個人用のデータ、その他のOSのために必要とされるリソースなど、すべてファイルシステムに保管されます。
同時に、UNIXではファイルをリソースの統一された共通の表現として使うため、ハードウェアデバイス(デバイスファイル)やネットワーク接続(ソケット)などもファイルAPIを通じた読み書きとして行います。
Linuxでは、まず、ストレージにファイルシステムを作成します。そのためには、デバイスをfdiskなどでパーティションに分割し、パーティションにext2などのファイルシステムを作成し、ルートディレクトリ(/)を頂点とするディレクトリ階層を構築し、それぞれのパーティションをそれぞれのマウントポイントにマウントします。
もし、新しいデバイスが接続された時は、手動でマウントするか、あるいはホットプラグ(頻繁に抜き差しされるデバイス)の場合udevによって自動的にマウントされます。
ファイルシステムには、プログラムのバイナリファイルや共有ライブラリも含まれます。コマンドシェルなどからプログラムを実行する場合、プログラムをロードし、実行した時、それはプロセスとなって、それぞれのメモリ領域を与えられ、マルチタスクで実行されます。この時、作業ディレクトリ(カレントディレクトリ)や絶対パス・相対パスで指定されたファイルやディレクトリを、プログラムが読み書きし、プログラムがそのファイルに仕事を行うことで、ユーザーが目的とする仕事が行われます。
つまり、プログラムとファイルシステムがあること、これがLinuxのもっとも大切な基本です。そして、プログラムをシェルから実行した場合、そのプログラムはプロセスとなり、記憶領域を与えられた上で、そのプログラムはファイルシステムを読み書きします。
プログラムがファイルシステムの中のファイルを読み書きするには、「オープン」という作業が必要です。これはファイルを開くということであり、オープンしなければ読むことも書くこともできません。オープンができるかどうか、その内容を変更することができるかどうかは、所有ユーザー、所属グループ、その他のユーザーに対して決められた、読み書き実行の権限であるパーミッションに基づきます。しかしながら、システムにおいて必ずひとり用意されている、システムの管理者であるrootユーザーは、このパーミッションを無視して、どんな破壊行為でも行うことができます。
実際のコマンドラインの作業では、まず、cdディレクトリでカレントディレクトリを移動できます。cdディレクトリの引数には、ディレクトリの名前を相対パス(今の作業ディレクトリからの相対的なパス)あるいは絶対パス(ルートディレクトリからの絶対的なパス)で与えます。lsで、ファイル一覧を見ることができます。catでファイルの内容すべてを出力できます。lessで、ファイルの内容をスクロールして見ることができます。mkdirでディレクトリを作成できます。rmでファイルを削除できます。mvでファイルを移動あるいは名前変更できます。そして、viでテキストエディタviを開いてファイルを編集することができます。viの中では、iで挿入モードに移動して内容を編集でき、ESCキーで挿入モードからコマンドモードに戻り、exコマンドである:wqでファイルを保存してviを終了することができます。
UNIXコマンド(基本)やviも参照のこと。
マウントの基本は、まずマウントポイントがあり、どのディレクトリであっても、マウントポイントにしてしまえば、そこにファイルシステムの作成されたブロック型デバイスファイルをマウントし、ストレージデバイス内のファイルやディレクトリにアクセスできるということです。
Windowsとの違いは、WindowsではC:やD:といった複数のドライブがあり、その中にファイルができますが、UNIXでは、ひとつのルートディレクトリである/があり、/の下のディレクトリにすべてのファイルツリーが作成され、マウントポイントは必ずその中のサブディレクトリ(多くの場合/mnt以下)に設定されるということです。
また、ファイルシステムのトップディレクトリ(/以下)には、慣習的にUNIXシステムで共通の名前付けが行われます。これはたとえば/binや/usrや/varや/etcです。これらのディレクトリには、それぞれの「役割」から名前がつけられており、/bin(あるいは/usr/bin)にはプログラム、/usrにはUNIXシステムに必要なシステムリソース、/varには頻繁に変更されるファイルやネットワークで共有されないローカルで用意されるファイル、/etcには一度設定したら変更されることのない設定ファイルを置きます。
Windowsよりも劣っている点(と僕が考える点)は、基本的にアプリケーションごとにサブディレクトリは切りません。なので、/usr/bin以下にはあらゆるアプリケーションのバイナリ実行ファイルがごちゃまぜになってしまい、管理しづらくなります。このため、アプリケーション単位でインストールやアンインストールのできるパッケージ管理システムを使うことが多いです。パッケージ管理システムを使うと、/usrや/etcなどに分散されたファイルを、パッケージという単位で導入したり削除したりできます。
Windowsよりも優れているのは、耐障害性や管理のしやすさです。たとえばあるディレクトリだけをほかのファイルツリーへのマウントポイントとしてしまい、それだけを別のストレージあるいはパーティションにすることで、ほかのストレージやパーティションが破損したとしても、そのディレクトリだけは破損の影響を受けません。また、UNIXにはNFSというネットワーク上でファイルシステムを共有する機能があり、NFSを上手く使うことで、たとえば/usr/nfsをネットワーク上の複数のホストで共有するといったこともできます。また、単純に/etcだけを複製バックアップすることで、/etcの設定ファイルだけをバックアップしておき、もし破損したとしてもバックアップから復旧できるようにしたり、あるいは別のマシンであっても構成が同じであれば設定ファイルを複製することができます(最近のサーバーでは、設定を自動化できる構成管理ツールを使うこともあります)。
また、パーミッションという考え方があるため、マルチユーザーで使う時のセキュリティにも優れています。基本的に、/home/assyというホームディレクトリがあったとして、このディレクトリの中を別のユーザーは見ることができないように、所有ユーザー・所有グループ・パーミッションを適切に設定することができます。ただし、rootユーザーだけは超越的な権限を持っており、全ファイルを破壊できるので注意が必要です。UNIXを使う際には、できるだけrootユーザーの権限が必要ない場合は一般ユーザーで操作することが推奨されます。これにより、システムの大事なファイルがなんらかの理由で破壊されるのを防ぐことができます。
自分の書いたブログ「神々とともに生きる詩人」2021/01/27より。
Linuxでは、ファイルシステムはまずパーティションを作成し、その中にファイルシステムを作成し、それをマウントすることでディレクトリツリーとファイルを操作できる。
/etc/fstabには、起動時にマウントされるファイルシステムボリュームの設定をする。
Linuxのファイルシステムでは、VFSと呼ばれる仕組みによって、さまざまな別のファイルシステムを使うことができる。
ブロック型のext2やジャーナリング(途中で強制終了しても壊れない)に対応したext3/ext4などがある。
また、ReiserFSやXFSはB-Treeファイルシステムと知られる。
ブロック型のext4ではなくデータベースと同様のインデックス技術を用いた高速な検索が可能。
また、ZFSやBtrFSのようなコピーオンライトのファイルシステムでは、ファイルをコピーしてもほとんどのデータを共有データとし、書き換えられた時点で複製を作る(コピーオンライト)仕組みを採用している。
これにより、データリソースを大幅な削減ができるほか、毎日スナップショットをとってもデータの大幅な利用に繋がらないため、いつでも好きな地点にスナップショットからデータを復旧させることができ、信頼性の確保に繋がる。
ファイルシステム階層としては、基本的に/usrにはシステム全体で共有される、あまり頻繁に変更されないファイルを置く。
/varには、頻繁に変更されるファイル、たとえばログやスプールファイルを置く。
そして、/etcにはシステム管理者が設定する設定ファイルなどを置く。
/usr/localは、/usrと同様だが、パッケージ管理システムではなく、システム管理者が手動で管理するmakeビルドのプログラムを置く。
そして、/home/usernameにはユーザー個別のホームディレクトリが置かれる。
これらは、所有者、所有グループ、その他のユーザーに対する、実行、読み込み、書き込みの許可権限であるパーミッションで守られる。
しかしながら、特権ユーザーであるrootに莫大な権限があることが問題だったり、Webサーバなどのプロセスに権限を付加させたい場合などは、SELinuxなどのより強固なセキュアOSモジュールを使うこともできる。
UNIXでは、ハードディスクやUSBメモリのようなストレージデバイスの中のデータは、ファイルシステムと呼ばれる決まりによって扱われる。
ファイルシステムにおいては、全てのデータはファイルという単位で格納され、複数のファイルをひとつにまとめる(ひとつの場所に置いてまとめて管理する)ためにディレクトリと呼ばれるツリー構造の階層を作る。
ディレクトリは、/(ルートディレクトリ)を一番上に、/usrや/homeや/etcなどの重要なディレクトリがある。ファイルシステム階層を参照のこと。
ストレージデバイスがデバイスドライバによって認識されると、/devディレクトリにデバイスファイルができる。これは/dev/sdaのようになる(パーティションが区切られている場合は/dev/sda1や/dev/sda2のようになる)。デバイスファイルについてはLinux デバイスファイルを参照のこと。
このデバイスファイルを、ext2のようなLinuxカーネルで使うことのできるファイルシステムにフォーマットすることで、このデバイスをマウントして使えるようになる。マウントとは、ブロック型デバイスファイルにアクセスするカーネルの機構であり、ext2ファイルシステムを一度作ってしまえば、そのデバイスは/以下のどこにディレクトリにもマウントすることができる。ファイルシステムを作ってマウントすることで、その中にファイルやディレクトリを作ったり、プログラムから読み書きしてデータを保存することが可能となる。ext2などのファイルシステムの詳細はext2やLinuxカーネル(ファイルシステム)を参照のこと。
また、/dev/sdaxの最後のxはハードディスクを複数に分割するパーティションを意味する。パーティションはハードディスクを複数に分割する機能で、それぞれのパーティションを個別に別々のディレクトリにマウントすることができる。この時、それぞれのパーティションには別々のファイルシステムを構築できる(たとえば、/bootをext2で、/をext4で、といった具合)。パーティションはファイルシステムをフォーマットする前に、事前にfdiskなどで作る必要がある。
Linuxでは、ファイルはコマンドに対して「ls /usr/bin」のように引数として与えることで、「/usr/binの中のファイルの一覧を表示しろ」という命令として使える。また、コマンドプログラムの中からは、open(), write(), read(), close()のようなカーネルのシステムコールや、システムコールにバッファ操作など使いやすい機能を加えたlibcのライブラリ関数(stdio)からファイルを操作できる。Linuxのシステムコール・APIに関する世界観を参照のこと。
パーティションの分け方。パーティションはマウントポイントにマウントされて利用される。そのマウントポイント以下のディレクトリがマウントされていれば、ファイルはそのマウントされたパーティションの中にできる。簡単に言えば、/と/usrを分けると、/binなどは/に出来て、/usr/binなどは/usrに出来る。
後日注記:よくやる方法としては、/bootだけを別パーティションにして、もしディスクのどこかが破損したとしても、システムが起動できなくなるのを防ぐとか、/homeだけを分割してディストリビューションを再インストールする必要があっても個人用のデータを残しておきたいなどといった方法がある。過激な方法としては/usrをNFSに置いてネットワーク上でシステムを共有するなどといったやり方もある。ほかにも/varのWebサーバ用のデータを分割するとか、/etcの設定ファイルだけ別パーティションに分割して保管するなどといった方法もあるかもしれない。
後日注記:ディレクトリを分割して破損を防ぐ以外に、そのディレクトリの容量が肥大化することで、別のディレクトリに影響が起きるのを防ぐという目的でパーティションを分割することもある。
ソフトリンクあるいはシンボリックリンクは、Windowsで言うショートカットのようなもので、小さなリンク用のファイルを作り、それがファイルシステムの別のパス階層にリンクする。
UNIXにはもともとハードリンクというものがあり、ファイルの別名を設定できる。だが、ハードリンクはさまざまな制約があるため使われなくなった。
シンボリックリンクを作るには以下のようにする。
ln -s /usr/src/linux-5.17-hoge /usr/src/linux
後日注記:Linuxの世界では、シンボリックリンクは非常に多用されます。/etcにある設定ファイルなどで、システムのデフォルトのファイル(たとえば/usr/libなどに存在する)をコピーする代わりにシンボリックリンクにする、といった使われ方がよくされます。逆にハードリンクはほとんど使われません。
fdiskの場合は以下を参照のこと。
最近ではpartedを代わりに使いますが、僕も昔はfdiskを使っていました。難しいようで慣れれば簡単です。対話的なcfdiskというプログラムもある。
以下はUEFIを用いた新しいシステムの場合。
まず、以下でfdiskを起動。
fdisk /dev/sda
pでパーティションを確認し、gで新しいGPTラベルを作成(全パーティションの削除)するか、既に存在する場合はdと番号でひとつひとつパーティションを削除していく。
全て削除したら、ブートパーティションを作るためにn(新規パーティション作成), 1(1番目のパーティション), 2048, +256Mとする。
ブートパーティションをESP(EFIシステムパーティション)に設定するためにt, 1とする。
スワップパーティションを作成するには、n, 2(2番目のパーティション), 空行でEnter(開始セクタはデフォルト), +4Gとする。
パーティションタイプをswapにするために、t, 2, 19(Linux Swapを意味する)とする。
最後にシステムがインストールされるルートパーティションを作る。n, 3, 空行, 空行(残り全ての空き領域を当てる)としてEnter。
最後に、このパーティションのレイアウトを書き出すためにwとする。
詳しくは以下のページが参考になります。
ファイルシステムの作成。
基本的には以下のようにする。
# mkfs.ext2 /dev/sda1 # mkfs.ext4 /dev/sda3
mkfs.ext2に-jオプションをつけると、ジャーナリングを有効にできる(ext3)。
UEFIを用いた新しいシステムの場合、ESPパーティションはFAT32でフォーマットする。なので以下のようにする。
# mkfs.vfat -F 32 /dev/sda1
ext2やLinuxカーネル(ファイルシステム)も参照のこと。
スワップ領域は、メモリが足りなくなった時にハードディスクを代わりに使う機構。メモリが急に必要になった時に、使われていないメモリ領域をハードディスクに退避させる。512MB~4GB程度が必要とされる。
swapパーティションはfdiskなどでパーティションを作った上(ファイルシステムのタイプに"Linux Swap"を設定すること)で、以下のコマンドで作成する。
# mkswap /dev/sda2
また、以下でswap領域を有効にする。
# swapon /dev/sda2
また、ブートパーティションはカーネルやブートローダのファイルが置かれるパーティションで、伝統的にジャーナリングのないext2ファイルシステムで作る。(後日注記:ESPの場合、ブートパーティションはFAT32となる。)
Linuxカーネル(ファイルシステム)やLinuxブートも参照のこと。
マウントによって、デバイスをファイルシステムとして、ディレクトリとして使うことができる。
UNIXではマウントという概念があり、ファイルシステムを作成したデバイスをデバイスファイルをとっかかりにマウントすることで、ディレクトリツリーにそのファイルシステムを追加し、ファイルシステムとしてその中のファイルを編集・操作することができるようになる。
マウントはこんな感じ:
# mkdir /media/usb # mount /dev/sdb1 /media/usb
オプションは、たとえばext4であることを指示するには以下のようにする。
# mount -t ext4 /dev/sdb1 /media/usb
あるいは、読み取り専用でマウントするには以下のようにする。
# mount -o ro /dev/sdb1 /media/usb
アンマウントはumountコマンドで行う。
# umount /media/usb
詳しくは以下が参考になる。
以下はmountのman-page。
パーティションを記載する設定ファイル。ここに記述されたボリュームはOS起動時に自動的にマウントされる。
たとえばこうなる:
/dev/sda1 /boot vfat defaults,noatime 0 2 /dev/sda2 none swap defaults 0 0 /dev/sda3 / ext4 defaults,noatime 0 1 /dev/sda4 /mnt/fedora ext4 defaults,noatime 0 2 /dev/sda5 /mnt/suse ext4 defaults,noatime 0 2 UUID=... /mnt/backup exfat defaults,nofail,x-systemd.device-timeout=1 0 2
左から、「ファイルシステムの含まれるパーティション(/dev/sda1など)」「マウントポイント(/など)」「ファイルシステムの種類(ext4など)」「オプション」「dumpの対象指定(1か0)」「fsckチェックの順番(1が優先順位最大で/などに指定。2はほかのファイルシステムに指定。0はチェックされない)」となる。
defaultsはファイルシステムのデフォルトのオプションを指定する。noatimeを付けるとアクセス時にi-nodeアクセス時間を更新しなくなり、パフォーマンスが向上する。サーバでなくデスクトップで使う場合はnoatimeを付けたほうがベター。nofailはデバイスが存在しない時に無視する。またsystemd 219の仕様により、nofailを指定する際にはx-systemd.device-timeout=1も一緒に指定することが推奨される。(詳しくはfstab - ArchWikiを参照のこと。)
ファイルシステムをマウントするデバイスの指定方法には、カーネルの識別子によって指定する方法(/dev/sda1など)、UUID=によってUUIDで指定する方法、LABEL=によってGPTラベルで指定する方法の三種類がある。UUIDなどの情報は以下のコマンドで確認できる。
lsblk -f
NFSでネットワーク上にあるボリュームをマウントする場合も、同様に/etc/fstabを編集する。
ルートディレクトリを変更してシェルを実行する。
特に、ディストリビューションの手動によるインストールなどの際、マウントしたディレクトリに入る時などに使われる。
Gentoo Linuxではハンドブックによるインストールの時の必須ツールである。
自分の書いた「ニュース - 2021-04-第五週(2021-05-第一週)」2021/04/30より。
Linuxには、chrootというコマンドがある。
これは「ルートディレクトリを別のディレクトリに変える」というコマンドで、新しい環境を構築する時に役に立つ。
たとえば、/mnt/redhatにchrootすると、新しいbashが開いて、そのbashのルートディレクトリが/mnt/redhatになる。
つまり、新しいシェルにおいては/mnt/redhat/binが/binになり、/mnt/redhat/usrが/usrとなる。
たとえば、Gentoo Linuxのインストールの時、まずネットワークなどの設定をしたら、最低限のファイルを/mnt/gentooに展開し、/mnt/gentooにchrootしてそこで作業をする。
こうすることで、新しい/mnt/gentoo環境で、すべての作業を行うことができる。
注意点としては、カーネルはもとのままであるということ。カーネルのコンパイルはできるが、新しいカーネルを立ち上げさせるためには再起動をしなければならない。普通は、この再起動を最後に行う。
ファイルのバックアップを取りたい場合、さまざまな方法がある。
まず、tarコマンドで全体のアーカイブを取る。全体のファイル容量が小さい場合や、全体をまるごとバックアップしたい場合に有効。
次に、rsyncコマンドで同期する。ディレクトリ全体をミラーリングして、常に最新版にしたい場合、変更点が少ない場合に有効。
あとは、cpコマンドで全てコピーするとか、dumpとrestoreを使うとかいう方法がある。
Linuxアーカイブ・同期・デバイス処理も参照のこと。
使えるコマンドとしては、diffで差分を取るとか、findを上手く使うことで「更新日が最近の10日以内のファイルを一覧する」といったことも出来る。
特に、「どのフォルダで最新の更新をしたのか分からない」などといった場合は、findコマンドを上手く使おう。
diffコマンドも、上手く使えば「どのファイルが変更されているのかを突き止める」といった場合に使える。どこを変更したのかまで分かる。だが、実行速度は遅い。
findやLinux diffとpatch・テキスト処理も参照のこと。
最近は、gitなどの便利なシステムもある。たとえばローカルのデータをgitにコミットし、GitHubのリポジトリにプッシュ(アップロード)し、職場の環境からプル(ダウンロード)することで、いつでも職場とローカルの同期を簡単に実現できる。とても便利なシステムだが、たまに誤動作したり良く分からないアーカイブの取り方をするので、慣れないと使い辛いかもしれない。gitはWindowsから使うこともできる。
GitHubはリポジトリを公開する場合は無料だが、非公開にしたい場合は有料なため、ビジネス用のデータをアップロードすることは避けるべきである。ホームページのデータとか、オープンソースソフトウェアのプロジェクトのホスティングなどに使うことはできるが、公的・私的な利用をしたい場合は、Google Driveのようなオンラインストレージサービスを使おう。
Gitも参照のこと。
NFS(ネットワークファイルシステム)を使うことで、ネットワーク上のファイルシステムをマウントすることもできる。この場合、普通のディレクトリと全く同じようにコマンドやプログラムからアクセスできる。
NFSを参照のこと。
LinuxカーネルはVFS(仮想ファイルシステム)という仕組みを採用している。これにより、実際のファイルシステムが違っていても、プログラムは統一したインターフェースからシステムコールとしてファイルを操作することができる。
Linuxカーネル(ファイルシステム)も参照のこと。
ジャーナリングが備わったファイルシステムでは、突然システムが停止してもファイルシステムが壊れることがない。Ext2ではジャーナリングに対応していないが、Ext3/4ではジャーナリングに対応している。
Linuxのファイルシステム。基本的にExt4, ReiserFS, JFS, XFSなどがある。FreeBSDなどにはZFSと言うのも存在する。(ライセンスのGPLとの兼ね合いで、LinuxではZFSは基本的に対応していない。)
ext2-4以外にも、
ファイルシステム | 解説 |
---|---|
btrfs | さまざまな機能があるがまだ未熟 |
f2fs | フラッシュメモリ向け |
JFS | IBMの信頼できるファイルシステム |
ReiserFS | たくさんの小さなファイルがある場合向け |
XFS | 堅牢でスケーラブル |
などの先進的なファイルシステムがあります。Windows向けのものとしてはvfat, NTFSなどがあります。
詳しくはディスクの準備 - Gentoo Handbookが参考になります。
B-Treeファイルシステムも参照のこと。
RHEL 7では標準のファイルシステムがXFSになったとのこと。結構メモリを食うらしい。
Btrfsは進歩の期待度が高い。将来デフォルトになるかもしれないそうだ。
Btrfs/ZFSも参照のこと。
ZFSはLinuxではGPLとの兼ね合いで利用できないが、Btrfsの機能と良く似ているとのこと。
後日注記:最近はLinuxでもZFSを利用することができる。ライセンス問題を何とか解決しているようである。詳しくは自分で調べてほしい。
ファイルシステムの一貫性を検査・修復するソフトウェア。OSが正しくシャットダウンしなかった場合などに実行され、問題を自動的に修復してくれる。
Windowsにおけるchkdskと同様のツールである。
後日注記:ジャーナリングファイルシステムでは、OSが正しくシャットダウンされなかった場合、ファイルがジャーナリングから自動的に復旧されるため、fsckが実行されることは少ない。ジャーナリングの備わっていないファイルシステムの場合、正しくシャットダウンしなかった時は、再起動時にfsckが実行されることがある。
ハードディスクも参照のこと。
2023.02.13編集
LVMは、複数のストレージをひとつの論理的なボリュームに見せかけることのできる技術。
複数のハードディスクをひとつのボリュームとして扱ったり、後々になってからボリュームを拡大・縮小したり、別の装置を後で付け足すこともできる。
ただし、LVMが間に入るので、ファイル処理のパフォーマンスが低下するとか、破損した時に復旧が困難になるというデメリットもある。
[改訂第3版]Linuxコマンドポケットリファレンスを参考にしています。
スペシャルファイル(デバイスファイル)を作成する。/dev以下のデバイスファイルの作成に使う。
ファイルシステムやスワップ領域を作成するコマンド。
以下を参照のこと。
パーティションを切るコマンド。
以下を参照のこと。
ファイルシステムをマウント・アンマウントするコマンド。
以下を参照のこと。
syncはディスクにキャッシュを書き込むコマンド。
以下を参照のこと。
fsckはファイルシステムの整合性を修復するコマンド。
以下を参照のこと。
各ユーザの単位で一定容量を上限とするストレージの利用制限をかけることを「ディスククォータ」と呼ぶ。Linuxではソフトリミット(警告を表示する)とハードリミット(書き込みができなくなる)の2つの方法でディスククォータを管理できる。以下を参照のこと。
ストレージのパラメータやパーティションの情報を表示するコマンド。
以下を参照のこと。
ディスクの使用容量を確認する。Linux アーカイブ・同期・デバイス処理を参照のこと。
ファイルやディレクトリの使用容量を確認する。Linux アーカイブ・同期・デバイス処理を参照のこと。
mktempは一時ファイルを作成するコマンド。-dオプションでディレクトリも作成できる。
一部(ツイッターなど)ではエイリアスとしてcd $(mktemp -d)を設定しておくと便利だということらしい。
2023.08.14
さらなるファイルシステムの詳細については、Linuxカーネル(ファイルシステム)やext2を参照のこと。
ファイルを操作するAPIについては、Linuxのシステムコール・APIに関する世界観を参照のこと。
ファイルシステム階層については、ファイルシステム階層を参照のこと。
/devや/procのような特殊なディレクトリとデバイスファイルについては、Linux デバイスファイルやLinuxカーネル(デバイス)やUNIXシステム管理(システム情報と設定)を参照のこと。
Linuxアーカイブ・同期・デバイス処理やLinux diffとpatch・テキスト処理を参照のこと。
ソケットを用いたネットワーク通信については、Linuxカーネル(ソケット)を参照のこと。
Linuxのファイルシステムの管理については、Gentoo Linuxを設定・管理すると理解しやすいです。Gentooも参照のこと。