通常、個人用途でWindowsやmacOSなどを使用している場合には、「ディレクトリ構造」について意識することは、ほとんどないかもしれません。しかし、業務で使用するPCであり、かつLinuxであるという場合、Windowsとはディレクトリ構造について認識を変える必要があります。この記事では、ディレクトリ構造とファイルシステムについてご説明します。
ディレクトリ構造の違いを理解する
WindowsPCに慣れた方であれば、まずPCを立ち上げて何らかのファイルを操作したいとき、Cドライブがあって、場合によっては内蔵のDドライブがあり、外付けしているHDDのEドライブがあり…と、そのようなイメージで使用していることでしょう。
Linuxの場合は、Windowsとはかなり事情が異なり、すべてのディレクトリとファイルがルートディレクトリ配下に置かれることになります。UNIX系OSは、「FHS(Filesystem Hierarchy Standard)」というファイルシステムの階層標準が定められているのです。
Linuxファイルシステムの階層標準
「FHS」は、Linux(などのUNIX系OS)の標準的なディレクトリ構成を定めた標準仕様です。
ディレクトリ名 | 用途 |
/ | ルートディレクトリ |
/bin |
基本コマンド(cat,cp,ls等) |
/boot | 起動に必要なファイル(カーネル、初期RAM) |
/dev | デバイスファイル(usb,cdrom,disk等) |
/etc | 設定ファイル |
/home | ユーザのホームディレクトリ |
/lib | 32bit 版のライブラリー(基本コマンドの実行に必要なライブラリ群) |
lib64 | 64bit 版のライブラリー(64bit版はこっち) |
/lost+found | 破損ファイルの断片が格納される |
/media | リムーバブルメディア用マウントポイント(cdrom等のマウントポイント) |
/mnt | ハードディスク等の一時的なマウントポイント |
/opt | アプリケーションソフトウェアパッケージのインストール先 |
/proc | カーネルやプロセス情報 |
/root | root用ホームディレクトリ |
/run | 実行時の可変データ群。再起動時に消去される |
/sbin | システム管理用コマンドなど(ip, shutdown, reboot など) |
/srv | HTTP、FTP 用データが置かれている。 |
/sys | デバイスやドライバーの設定ファイルなど |
/tmp | 一時的なファイル(再起動時に消去される) |
/usr | ユーザーが使用する各種プログラムなど |
/var | 変更されるデータ(内容が常に変化するファイル群が格納) |
シェルスクリプトを記述する際に、一番初めに記述するシェバンをご存じでしょうか?「#!/bin/sh」👈 (こんなやつ)
これは、Linuxの「/bin」ディレクトリへ格納されている基本コマンド「/bin/sh(Linuxの場合はbashへシンボリックリンク)」を指定しているのです。
ディレクトリの構造
Linuxのディレクトリ構造は「ツリー構造」と呼ばれます。まず「ルートディレクトリ」と呼ばれる頂点にあたるディレクトリがあり、その下に「home」や「media」「boot」といったディレクトリが並びます。
WindowsでいうところのCDROMやUSBメモリは、Linuxでは「media」ディレクトリの配下に配置されます。また、「home」ディレクトリ以下がWindowsで言うところの「CドライブのUsersフォルダ」の中に該当します。
実際に何が違うのかと言うと、「ツリー構造」の場合には、ディレクトリ階層を上へ上へ行けば、どこから登っていってもかならず「rootディレクトリ」にたどり着きます。
一方で、Windowsが持つパーティション構造は、そのパーティションのトップのディレクトリ(Cドライブ等)までしか到達しません。どれだけ「上」へ行こうとしても、DドライブはDドライブ直下までしか行けないのです。この違いは、主にファイル操作をコマンドで行う際に重要な違いとなってきます。
ちょっと紛らわしいですが、ディレクトリの最上層を「root(木の根っこ)」ディレクトリと呼びます。これと似た呼び方で「root(スーパーユーザー:最上位の権限保有者)」が存在します。「root(スーパーユーザー)」は、もともと、UNIX系OSでログイン時のホームディレクトリがシステムのルートディレクトリ(/)であることからこのように呼ばれるようになっています。紛らわしい・・
「ファイルシステム」とは?
Linuxで使うデータやプログラムは、基本的にハードデイスクやCDROMなどの記憶媒体に保存されています。記憶媒体上のデータやプログラムは、ファイルと呼ばれる単位で管理されます。この管理のしくみをファイルシステムといいます。
ざっくりと言ってしまえば、ファイルシステムとはファイルを取り扱う(操作だけでなくその所在を定義したり読み出したりする)際の枠組み(規格)」といえます。
主なファイルシステムの種類
ファイルシステムは、データの格納や引き出しに大きな役割を果たしています。
パソコン画面に表示されている「ファイル」や「ディレクトリ」も、ファイルシステムの機能によって、そう見せているのです。現実は「0」「1」の羅列で管理されています。
フォーマット | 説明 |
ext2 | Linux標準のファイルシステム |
ext3 | ext2の機能強化版 |
ext4 | ext3の機能強化版であり、現在のlinuxファイルシステムのスタンダード |
reiserfs | HansReiser氏による新しいファイルシステム |
vfat | Windows95/98~で利用 されているファイルシステム |
ntfs | WindowsNT/2000/XP~で利用 されているファイルシステム |
xfs | SGI社のIRⅨで利用 されているファイルシステム RHEL7からLinuxの主流に・・ |
nfs | ネットワークファイルシステム |
smbfs | smbmountによるマウントを行うファイルシステム |
usbfs | USB接続されているファイルシステム |
swap | スワップパーティションCD- ROM用のファイルシステム |
iso9660 | CD-ROM用のファイルシステム |
msdos | MS DOSで利用されているファイルシステム |
ファイルシステムの互換性
ファイルシステムの異なるディスク(ext4やntfs等)がある場合、そもそもそのディスクやファイルへのアクセスができなかったり、制限されたりといったことが発生する場合があります。
厳密に言えば「fat」や「ntfs」、「ext3」と「ext4」など、一部互換性のあるファイルフォーマットも存在しますが、基本的にプラットフォーム(OS)の異なるファイルシステム同士の互換性は無いと思っておいた方が良いでしょう。
代表的なファイルシステムの互換性
- ntfs(Windows)
ntfsの規格では、ドライブの最大容量は256TB、停電などによってディスクやシステムへの電源供給が急遽絶たれたという場合であっても、ファイルシステムに不整合を生じさせないという特徴を持っています。ディスクへの暗号化機能を有しており、セキュリティ面も配慮されています。ただし、ntfs規格でフォーマットされたディスクは、Windowsでしか書き込むことができないという制限があります。 - ext4(Linux)
Linuxではntfsではなく、現在は「ext4」と呼ばれるファイルシステムの規格が使用されています。ntfsと比較して大きく優れる、あるいは大きく劣る点はありません。ただし、もともとWindowsで使用されていた、またはWindows環境での使用を想定していたHDD・ストレージをLinuxで使用する予定の場合には、ntfsでフォーマットされている可能性が高いため、Linux環境で使用する際には用途に合わせた規格へフォーマットが必要です。
※「ext2とext3」、「ext3とext4」については、前方互換性を持ちます。すなわち、マウントする際は古いファイルシステムに合わせてマウントを行う必要があります。
まとめ
OSが異なれば、ファイルやその構造も異なることを念頭に入れておきましょう。
- Windowsはパーティション、Linuxはツリー
- Linuxのツリー構造はコマンドでの操作時に力を発揮する
- ファイルシステムの違いも頭に入れておく
この記事では、PCを操作する大きな目的のひとつであるといえる「ディレクトリ」と「ファイルシステム」について触れました。GUI環境で使用する限り、LinuxもWindowsもあまり差が見えないかもしれませんが、CUIでの操作時にその違いは顕著になります。
Linuxを扱うエンジニアとなる際には、こうした予備知識を習得しておくことが望ましいといえます。
Linux基礎知識(全12記事)
├─Linuxとは何か? Linuxの基本概要を理解しよう!
├─Linuxをインストールし、ログインしてみよう!
├─起動の仕組みとカーネルについて!
├─ディレクトリ構造とファイルシステムについて!
├─ユーザー環境(ユーザー、グループ、パスワード)の設定について!
├─ディレクトリ操作について!
├─ファイル操作について!
├─テキスト操作について!
├─Linuxの基本コマンドを覚えよう!
├─適切なアクセス制御を付与してみよう!
├─リンクとiノードについて理解を深めよう!
└─LVMとは?LVMを理解しよう?