0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Linux ファイルシステム

Last updated at Posted at 2025-02-10

はじめに

Linux のファイルシステムでは、ファイルは データ本体 と inode で構成される。

  • データ本体(データブロック)
    • ファイルの中身そのもの
  • inode
    • ファイルのメタデータ

ディレクトリは 特別なファイル という扱いになっている。

前提知識

ルートファイルシステム

Linuxシステムの基本となるファイルが格納された、 /(ルートディレクトリ)を起点とするファイルシステムのこと。

ext4xfs などのファイルシステムを使用して構築されるが、 ルートファイルシステムという種類があるわけではない

カーネルがブート後、最初に マウント するファイルシステムでもある。ルートファイルシステムをマウントする パーティションルートパーティション という。

FHS の表にあるような主要なディレクトリが含まれている。

inode

ファイルのメタデータを管理する構造体。

ファイルやディレクトリごとに作成されるバイナリデータ。inode 番号によって識別される

inode 番号を確認する
$ ls -i 

inode には、以下のような情報が含まれている。

  • ファイルの属性
  • ファイルの種類(通常ファイル、ディレクトリ、リンクの種類など)
  • ファイルのサイズ
  • 所有者(ユーザーID、グループID)
  • パーミッション
  • タイムスタンプ(作成時刻、最終更新時刻、最終アクセス時刻)
  • リンク数(ハードリンクの数)
  • データ本体への参照

また、ファイル名と inode 番号の対応関係はディレクトリに保存される

ファイル名は inode に含まれない

ディレクトリファイルに保存される ファイル名 と inode 番号

ディレクトリは特殊なファイルとして扱われる。

ディレクトリファイルのデータ本体には、

  • ディレクトリに含まれるファイルの名前inode 番号
  • ディレクトリに含まれるディレクトリの名前inode 番号

が記録されている。

つまりディレクトリは、ファイル名と inode 番号のマッピング情報を保持する単なるメタデータを保持する「ファイル」と考えることができる。

SCSI

Small Computer System Interface

通信規格の一つ。

デバイスファイル /dev/sda/dev/sdbsdSCSI disk の略。

ただし、現在では SATA や USB なども /dev/sda などの sd デバイスとして扱われる。

SCSI

SATA

Serial Advanced Technology Attachment

通信規格の一つ。

PCI

Peripheral Component Interconnect

拡張カードや周辺機器を接続するためのバス規格の一つ。

PCIバスに接続されたデバイスは PCIデバイス と呼ばれる。

主な PCI デバイスには以下がある。

  • GPU
  • 拡張カード(NIC、サウンドカード、SCSIカード)

現在は PCI Express(PCIe) が主流で、従来のPCIよりも高速なデータ転送が可能。

UUID

Universally Unique Identifier

ストレージデバイスを一意に識別するための 128ビットの識別子。

UUIDを確認する①
$ lsblk -f
UUIDを確認する②(Block Identifier)
$ blkid

ファイルシステム

ディスク上のデータをファイル単位で操作するための基本的な仕組み。

いくつかの種類がある。

種類 特徴
ext4 Linux で最も一般的
XFS 高速、大容量向け(Red Hat 系)
Btrfs スナップショット、圧縮ができる
vhat Windows、USB で使用される

$ mkfs

make filesystem

パーティション 上にファイルシステムを作成する。

-t オプションで種類を指定することができる。もしくはそれぞれのファイルシステムごとのコマンドも用意されている。

ファイルシステムを作成する
$ mkfs -t ファイルシステム デバイス # デバイス = パーティション
$ mkfs.ファイルシステム デバイス
$ mkfs -t ext4 /dev/sdb1
$ mkfs.ext4 /dev/sdb1

FHS

Filesystem Hierarchy Standard

Linux や Unix 系 OS のディレクトリ構造とその役割を規定した規格。

この標準規格に従うことで、異なるディストリビューション間でも共通のディレクトリ構成を持つことになるため、管理や運用がしやすくなる。

ディレクトリ 説明
/ ルートディレクトリ
すべてのパスの起点となる
/bin/ 一般ユーザでも使用可能な基本コマンドが格納されるディレクトリ
$ ls$ cp$ mv$ rm など
/sbin/ システム管理用コマンドが格納されるディレクトリ
$ fdisk$ shutdown など
/lib/ 共有ライブラリ(主に /bin/sbin 内のコマンドが必要とするライブラリ)が格納されるディレクトリ
libc.so など
/etc/ 設定ファイルが格納されるディレクトリ
$ passwd$ fstab など
/dev/ デバイスファイルが格納されるディレクトリ
/dev/sda/dev/null など
/home/ 一般ユーザーのホームディレクトリ
肥大化しやすいため、ルートパーティションと分けた方が良い
/root/ root ユーザーのホームディレクトリ
/usr/ ユーザが利用するプログラム、ライブラリ、ドキュメントが格納されるディレクトリ
/usr/bin/*/usr/sbin/*/usr/lib/*/usr/local/*
/opt/ 追加でインストールしたソフトウェアが格納されるディレクトリ
/proc/ カーネル情報にアクセスするための 仮想ファイル(実際のディスク上には存在しない)が格納されるディレクトリ
proc/プロセスID/fd/ファイルディスクリプタ 情報
/proc/cpuinfo:CPU情報
/proc/meminfo:メモリ情報
/proc/bus/usb/*:USBデバイス情報 など
/sys/ デバイスやドライバの情報(udev)が格納されるディレクトリ
/media/ USB メモリや CD-ROM などの自動マウントに使われる
/mnt/ 外部ストレージやネットワークドライブを手動で一時的にマウントするためのマウントポイントとなるディレクトリ
/boot/ システムの起動(ブート)に関わるファイルが格納されるディレクトリ
カーネル本体(vmlinuz)もここにある
/var/ ログや頻繁に更新されるデータが格納されるディレクトリ
var/cache:一時的なキャッシュファイル
/var/log:ログファイル
/var/lock排他制御 に使用するためのロックファイルが格納されるディレクトリ
/var/run:システムの状態を示すファイル
/tmp/ 一時ファイル

$ fsck

File System Check

ファイルシステムの整合性をチェックし、必要に応じて修復する。

クラッシュ、強制終了、電源断などのディスクの異常発生時に、ファイルシステムの破損を検出・修復するために使用される。

ファイルシステムをアンマウントした状態で実行する

ファイルシステムの整合性をチェック、必要に応じて修復する
$ fsck デバイス

ファイルシステム ごとに $ fsck を使い分ける必要はなく、内部的に、現在使用中のファイルシステムに応じたプログラムが呼び分けられる仕組みになっている。

実際には実行しないが、実行した場合の処理を表示する
$ fsck -N デバイス
/etc/fstab の全パーティションをチェックする
$ fsck -A

/etc/fstab

$ tune2fs

Tune ext2 File System

ext2ext3ext4 ファイルシステムのパラメータを変更、調整(tune)する。

基本構文
$ sudo tune2fs デバイス
現在の設定を表示する
$ sudo tune2fs -l デバイス

仮想ファイルシステム

Vertual File System, VFS

実際の物理的なストレージ(HDDやSSDなど)に存在しないファイルを、ファイルシステムの中で仮想的なファイルやディレクトリとして提供する仕組み。

実際には存在しないが、実在するファイルのように振る舞う仮想ファイルの存在により、カーネルや OS が内部的に必要とするデータや情報を、ファイル同様に扱うことが可能になる。

代表的な仮想ファイルシステムには以下がある。

  • /proc/
    • カーネルやシステムの状態に関する情報を提供する
    • プロセスの情報やシステムの設定、ハードウェアの状態などが仮想ファイルとして提供される
    • /proc/cpuinfo:CPU情報
    • /proc/プロセスID/fd/:ファイルディスクリプタ情報
  • /sys/
    • システムの設定やデバイス情報にアクセスする
    • デバイスドライバやカーネルのパラメータが仮想ファイルとして提供される
  • /dev/
    • デバイスファイルが格納されているディレクトリ
    • 下記の仮想的なデバイスファイルも含まれている
    • /dev/null:データ破棄用
    • /dev/zero0埋め用

デバイスファイル

カーネルが周辺機器、デバイス、システム内のリソースにアクセスするための インターフェースとして機能する 特別なファイル。

各デバイスに対応するデバイスファイルは通常 /dev/ 以下に作成されるが、パーティション のように、動的に生成されたり削除される場合がある。

デバイスファイルが「通常のファイル」と同様のインターフェースを提供することにより、openreadwriteclose などの、通常はファイルに対して行う操作を、デバイスに対しても同様に行うことが可能となる。つまり デバイスをファイルのように扱う ことが可能になる。

デバイスファイルはファイルシステムに組み込まれているが、カーネルが管理するインターフェースであり、実際のストレージ上には「通常のファイル」が持つような データ本体 が存在するわけではない。

デバイスファイルの実体はストレージ上には存在しない

デバイスファイルにアクセスを行うのはカーネル(のデバイスドライバ)であり、操作できるユーザは root のみ

種類として キャラクタデバイス と ブロックデバイス がある。

キャラクタデバイス

Character Device

1 byte 単位(文字単位) でデータをやり取りするデバイスファイル。

  • 端末/dev/tty1/dev/pts/0
  • キーボード(/dev/input/event0/dev/input/mouse0
  • マウス(/dev/input/event0/dev/input/mouse0
  • シリアルポート(/dev/ttyS0/dev/ttyUSB0

ファイル種別c で表示される。

キャラクタデバイス
$ ls -l /dev/ttys1
crw--w----  1 root  tty  0x10000000 Nov  1 05:34 /dev/ttys1

文字単位でストリーム的にデータの入出力を行うため、バッファなどを使用しない即時性が求められるキーボード、マウスなどの入出力に適している

キャラクタデバイスに対して読み書きは行えるが、シーク操作は行うことができない。シーク操作とは、デバイス内でアクセスする場所を変更する操作を指す。

ブロックデバイス

ブロック単位(一定サイズ) でデータをやりとりするデバイスファイル。

  • ハードディスク(/dev/sda/dev/sdb/dev/sdc
  • USBストレージ(/dev/sda/dev/sdb/dev/sdc
  • CD / DVD ドライブ(/dev/sr0/dev/sr1/dev/sr2

ファイル種別は b で表示される。

ブロックデバイス
$ ls -l /dev/disk0
brw-r-----  1 root  operator  0x1000000 Oct 26 21:18 /dev/disk0

デバイスファイル名のアルファベット

デバイスファイル /dev/sdXX の位置にあるアルファベット部分 (abc、…) は、物理ディスクごとに付与された識別子を表す。

起動順や接続順、OSがデバイスを認識した順番で sdasdbsdc という様に名前が付与される。

デバイスファイル名の数字

デバイスファイル /dev/sdYY の位置にある数字(123、 …) は、ディスク内の パーティション 番号を表す。

/dev/sda にパーティションを作成した場合、/dev/sda1/dev/sda2 のように番号が続く。

特殊な意味を持つデバイスファイル

デバイスファイル 意味
/dev/null 書き込んだデータをすべて破棄する
コマンド出力を破棄する際に使用される
/dev/full 常に「ディスクいっぱい」のエラーを返す
ディスクがいっぱいの状態が必要なテストなどで利用される
/dev/zero 無限にゼロ (\0) を返す
ファイルの初期化、メモリのクリアに利用される
/dev/random 真の乱数を生成する(低速)
高い安全性が求められる暗号鍵の生成で利用される
/dev/urandom 擬似的な乱数を生成する(高速)
APIキー、セッションID、一時パスワードの生成など、暗号的に安全だが高速な乱数が求められる場面で利用される
/dev/tty 現在の 端末 を返す

udev

Universal Device Management

カーネルが検出したデバイスに対して、適切なデバイスノード(/dev)を動的に作成、管理するシステムまたは仕組み。

主要なLinuxディストリビューションに標準搭載されている。

USBなどのデバイスが接続された際に、カーネルは sysfs(/sys/)と呼ばれる仮想ファイルシステムにデバイス情報(/sys/bus/usb/devices/1-1/ など)を作成する。

sysfs は仮想的に作成されるファイルで、ディスク上ではなくメモリ上に存在し、ベンダーID(idVendor)、製品ID(idProduct)、デバイス名(product) などの情報が格納されている。

udev は /sys ディレクトリを監視し、新しいデバイスが追加されると自動的に /dev/ にデバイスファイルを作成する。

このときの動作を /etc/udev/rules.d ディレクトリの設定ファイルを編集することによって制御することができる。つまり、特定のデバイスに対する自動処理に独自のルールを作成することができる。

$ lsblk

ブロックデバイスを一覧表示する
$ lsblk

$ lspci

システムに接続されているPCIデバイスを一覧表示する(-v : 詳細表示)
$ lspci -v

PCI

$ lsusb

システムに接続されているUSBデバイスを一覧表示する(-v : 詳細表示)
$ lsusb -v

デバイスドライバ

カーネルがハードウェアを制御するためのインターフェースとして機能するソフトウェア。

Linux では カーネルモジュール として実装されることが多い。

カーネルモジュールはカーネルの一部として機能し、カーネルを再起動することなく追加、削除することができる。また、デバイスドライバをカーネルモジュールとしてカーネルに取り込むことは ロードする と表現される。

$ lsmod

現在カーネルにロードされているカーネルモジュール(デバイスドライバ)を一覧表示する
$ lsmod

/proc/modules ファイルにも同様の情報が格納されている。

$ modprobe

probe=探査する、調査する

モジュールが必要とする別のモジュールなど、依存関係も自動で探査(probe)し、ロードすることができる。

カーネルモジュールをロードする
$ sudo modprobe モジュール名
カーネルモジュールをアンロードする
$ sudo modprobe -r モジュール名

マウント

HDD、SSD、USBなどの外部のストレージを OS に認識させ、自身のディレクトリツリーに組み込むことで、そのストレージのファイルシステムにアクセスできるようすること。

Windowsでは独立したドライブレター(C:D:)でストレージを識別するが、Linuxでは ルートディレクトリ を起点とするディレクトリ構造の一部として接続する。

物理的に認識されたデバイス(デバイスファイル)は、特定のディレクトリでマウントする必要がある。このとき使用するディレクトリは空である必要がある(参考)。

マウントするディレクトリを マウントポイント と呼び、デバイス上のファイルシステムのルートディレクトリは、このマウントポイントに統合される。

通常は /dev/sdb などのディスク全体ではなく、その中の /dev/sdb1 などの パーティション をマウントする

USBドライブ(/dev/sdb1)を /mnt/usb でマウントする
$ mount /dev/sdb1 /mnt/usb

パーティションとして作成されたデバイス「ファイル」に対して、「ディレクトリ」をマウントする

マウントポイントにする予定のディレクトリは空である必要がある

$ mount

デバイスを特定のディレクトリにマウントする
$ mount デバイス マウントポイント  # デバイス = パーティション、マウントポイント = ディレクトリ
ファイルシステムを指定してマウントする
$ mount -t ファイルシステム デバイス マウントポイント

引数無しで実行すると、マウント済みのデバイス一覧を表示することができる。

マウント済みのデバイス一覧を表示する
$ mount

-o オプションは複数のオプション引数を , で受け取ることができる。

-o(option)
$ mount -o オプション引数1,オプション引数2,オプション引数3 デバイス マウントポイント  
オプション引数 説明
remount マウント済みのファイルシステムのオプションを変更する
ro 読み取り専用にする
rw 読み書き可能にする
noexec 実行可能ファイルを実行不可にする
nosuid SUID / SGID を無効化する
nodev デバイスファイルを無効化する
async 非同期書き込みを有効化する
sync 同期書き込み(書き込みが即時反映される)を有効化する

$ umount

デバイスのマウントを解除(アンマウント、取り外し)する。

アンマウントすることで、デバイスを安全に取り外すことができる。

デバイスをアンマウントする
$ umount マウントポイント
$ umount デバイス # マウント済みのデバイスを指定してもOK

自動マウント

/etc/fstab ファイル(File System Table)に設定されたストレージは起動時に systemd によって自動的にマウントされる。

日常的に使用するストレージにはこの設定をしていることが多い。

以下の様な形式で設定を記述する。

/etc/fstab
UUID=デバイスのUUID マウントポイント ファイルシステム オプション dump fsck
UUID=12345678-90ab-cdef-1234-567890abcdef / ext4 defaults 0 1
UUID=abcdef12-3456-7890-abcd-ef1234567890 /home ext4 defaults 0 2
設定項目 説明
デバイスのUUID UUID を使うとデバイス名の変動に影響されない。
$ lsblk -f で確認できる。
マウントポイント マウントポイント となるディレクトリ
スワップ 有効化の際は none
ファイルシステム ファイルシステム
ext4xfsntfs など
オプション パフォーマンス、セキュリティ、利便性に関わるオプション(複数指定可)
defaults:デフォルトのオプションセット(通常)
sw:スワップ領域としての標準オプションセット
dump フラグ $ dump コマンドを実行した時にバックアップ対象とするかしないか有無。実際の運用ではほとんどのシステムで $ dump コマンドは使われないため 0 が一般的。
0:バックアップ対象としない
1:バックアップ対象とする
fsck 起動時にファイルシステムの整合性を $ fsck でチェックするかどうか(file system check)、またチェックする場合の優先順位(ファイルシステムの破損を防ぐために使用される)
0:チェックしない
1:最優先でチェックされる。ルートファイルシステム(/)専用。
2:ルート以外のパーティションでチェックを行う場合は 2 を使用する

例えば、Ubuntu のルートファイルシステム //home/boot などは、/etc/fstab に記載されているため、起動時に自動でマウントされる。

デスクトップ環境(GNOME、KDE など)では、udisks2gvfs などのデーモンを利用して自動マウントされることもある。

Read-only file system と出力されたら...

//etc がシステム起動時に読み取り専用モード(ro:read only)でマウントされている場合、配下のファイルを編集しようとすると

Read-only file system

と出力されることがある。

$ mount コマンドで一覧表示することで ro かどうかが確認できる。

ro モードであることを確認する
$ mount
/dev/sda1 on / type ext4 (ro)

このような場合に、マウントし直すことで書き込み可能にすることができる。マウント済みのデバイスファイルは、再マウント時に指定する必要がない。

/ (ルートディレクトリ)を読み書きモード(rw:read write)でマウントし直す
$ sudo mount -o remount,rw /

ただし、この変更は再起動すると元(ro)に戻る可能性がある。

デバイスファイルとマウントポイントの違い

どちらもデータを処理するためのインターフェースとして機能するが、利用する主体が異なる。

デバイスファイルは

カーネルによって低レベルなデータ処理を行うためのインターフェースとして機能する。実際には read()write() などの システムコール を通じて、カーネルがデバイスとやり取りしている。

例えば、以下のような $ dd を用いた操作ではマウントポイントは意識されない。

デバイスを丸ごとバックアップする
$ dd if=/dev/sdb1 of=backup.img

一方 マウントポイントは

ユーザによって直感的な(高レベル)ファイルシステム操作を行うためのインターフェースとして機能する。

/mnt/usb/ のようなマウントポイントは、ユーザがデバイス内のファイルにアクセスするためのディレクトリパスであり、/mnt/usb/sample.txt のように通常のファイルとして操作できる。

USBのファイルをローカル環境にコピーする
$ cp /mnt/usb/sample.txt /home/user1/Documents/

ただし、マウント前の /mnt/usb ディレクトリは単なる空のディレクトリであり、マウント後にデバイス内のファイルシステムと接続される。

デバイスファイル (/dev/sdb1 など) はマウントしなくても $ dd などで直接操作できるが、ファイル単位のアクセスはできない。ファイル単位の読み書きはマウントポイントを経由する必要がある。

マウントを理解する

マウントはパーティションとして作成されたデバイス「ファイル」に対して「ディレクトリ」を用いて行われる。

サーバを構築する際、 FHS にあるディレクトリのうち、下記のディレクトリはルートパーティションとは独立したパーティションとして設計されることが多い。

ディレクトリ 一般的な用途
(マウントポイントとして利用し、パーティションを分ける理由)
/ (ルート) ルートファイルシステムの起点(通常、独立したパーティション)
/home/ ユーザーデータを管理しやすくするため
/var/ ログや頻繁に変更されるデータを独立させ、ルートの容量圧迫を防ぐため
/boot/ ブートローダ関連のファイルを独立させることで、システムの互換性や安定性を高めるため
/tmp/ 一時ファイルの保存領域を分け、不要なデータで / を圧迫しないようにするため
/usr/ ソフトウェアやライブラリの保存領域を分け、管理しやすくするため
/opt/ 追加インストールしたソフトウェアを分けて管理するため

実際には以下のような対応で設定されることが多い。

パーティション マウントポイント 用途
/dev/sda1 /boot/ OSのカーネルやGRUBの設定を格納
/dev/sda2 / ルートファイルシステム
/dev/sda3 /home/ 各ユーザのデータ
/dev/sda4 /var/ ログ、データベース、メールなど

また下記のディレクトリについては、独立したパーティションとして分けることはあまりない。

ディレクトリ パーティションを分けない理由
/bin/ 基本コマンドが含まれており、システム起動に必要なため
/sbin/ /bin と同様、システム管理コマンドがあるため
/lib/ /bin/sbin のコマンドが必要とするライブラリのため
/etc/ 設定ファイルが格納されており、システムの一貫性を保つため
/dev/ 仮想ファイル を含むディレクトリのため
/proc/ 仮想ファイルが格納されるディレクトリのため
/sys/ 仮想ファイルが格納されるディレクトリのため

ルートディレクトリをマウントするパーティションと、ルートディレクトリ内の特定のディレクトリをマウントする様子を図にしてみた。

LPIC (3).png

ここで、もしマウントする前に /home/ 配下に何らかのファイルが存在していたら、どうなるのかが気になった。

調べてみると、あるディレクトリに別のファイルシステムをマウントすると、そのディレクトリのもともとの内容は 見えなくなるということだった。

/home/file1 というファイルが既に存在している状態で home/ ディレクトリをマウントに利用すると、マウント先のデバイスのファイルシステムが表面化し、/home/file1 は見えなくなる。マウントを解除すると、再び /home/file1 が見えるようになる。

つまり、マウントポイントにする予定のディレクトリは空である必要がある。

Mac に Ubuntu をインストール した際は、こんな設定画面が出ていた。

Screenshot 2025-02-16 at 16.50.38.png

パーティション ( MBR / GPT )

物理ストレージ(HDDやSSD)を複数の論理的な領域に区切る仕組み。

それぞれのパーティションは OS からは独立したストレージ領域として認識される。

LPIC (5).png

例えばデバイス /dev/sdb に対して、パーティション /dev/sdb1 を作成し、利用できる状態にするためにはパーティションの作成以外にも下記の操作が必要となる。

  1. パーティションの作成
  2. 作成したパーティションに対するフォーマット(ファイルシステム)の設定
  3. 作成したパーティション(/dev/sdb1)のマウント

ルートファイルシステム をマウントするパーティションはルートパーティションと呼ばれる。

LPIC (6).png

ファイルシステムにはいくつかの種類(ext4ntfsfat32)があり、それぞれのパーティションには異なるファイルシステムを作成することも可能。

パーティションの方式には MBR(Master Boot Record) と GPT(GUID Partition Table) がある。

GPT は MBR の後継版であり、MBR が作成できるパーティションが 4 つなのに対して作成可能なパーティションが 128 個となっている。

MBR では作成できるパーティションは最大 4 つであるため、それ以上のパーティションが必要となった場合に、以下のような仮想的にパーティションを増やす仕組みがある。

  • 基本パーティション
    • 最大 4 つ作成可能
    • ファイルシステムを設定する
    • /dev/sda1/dev/sda2/dev/sda3/dev/sda4
  • 拡張パーティション
    • 論理パーティションを作成するための領域
    • 基本パーティションの内の 1 つを拡張パーティションとすることができる
    • 通常、/dev/sda4 が選択される
  • 論理パーティション
    • 拡張パーティション内に作成される仮想パーティション
    • /dev/sda5/dev/sda6、...

MBR と GPT の違い

項目 MBR GPT
パーティション数 最大 4 つ 最大 128 個
拡張パーティション 基本パーティションの内の 1 つ -
対応容量 最大 2 TB ZB(ゼタバイト)単位で作成可能
ブート方式 BIOS UEFI
データ復旧 復旧困難 リカバリテーブルにより、普及しやすい

ディレクトリとパーティション

パーティションとディレクトリはどちらもデータを整理するための概念で、似ていると思ったので整理して理解したい。

パーティションは

/dev/sdb などのディスク内に作成された 論理的な区画 を指す。具体的には /dev/sd1/dev/sdb2、... などのデバイスファイルがパーティションを表現する。

パーティションは、ディスク全体の一部を論理的に区切った領域であり、OS からはそれぞれが異なるストレージ領域のように認識される。ただし、実際には異なるパーティション同士であっても同じ物理ディスク上に存在するデータであり、独立したストレージではない。

パーティションを使用するには、ext4ntfsfat32 などのファイルシステム(フォーマット)を設定する必要がある。

ディレクトリは

ファイルや他のディレクトリを管理するファイルシステム上の 仮想的な構造 であり、単なる「フォルダ」として機能する。

ディレクトリはパーティションの中に作られるため、パーティションが未フォーマット(ファイルシステムが未作成)の場合、ディレクトリを作ることはできない。

パーティションは、ディレクトリ(マウントポイント)にマウントされることで初めてアクセスが可能になる。

パーティションはディスク上の物理的な領域であり、その上にファイルシステムが構築され、その中に仮想的なディレクトリが作られる。パーティションがフォーマットされて初めてディレクトリを作成できる。

$ fdisk / $ gdisk

ストレージ内のデータを破壊できるコマンドのため、使用には十分注意する

fixed disk : MS-DOS時代から使われている MBR 形式のパーティション管理ツール
GPT fdisk : GPT形式のディスクを管理するための $ fdisk に相当するツール

パーティション情報を表示する
$ sudo fdisk -l デバイス
$ sudo gdisk -l デバイス

-l をつけない場合、対話モードに切り替わる。

パーティションを作成する
$ sudo fdisk 対象ディスクのデバイスファイル
$ sudo gdisk 対象ディスクのデバイスファイル

対話モードに切り替わったら サブコマンド によって操作を行う。

サブコマンド 説明
m ヘルプを表示(menu)
p 現在のパーティション情報を表示(print)
n 新しいパーティションを作成(new)
d 既存のパーティションを削除(delete)
t パーティションのタイプを変更(type)
w 変更を保存して終了(write)
q 変更せずに終了(quit)

$ parted

ストレージ内のデータを破壊できるコマンドのため、使用には十分注意する。
$ fdisk$ gdisk では、変更を w で書き込むまで確定しないが、$ parted は即時適用される。

Partition Editor

MBR と GPT の両方をサポートする高機能なパーティション管理ツール。

対話モードを使用せずにスクリプトによって一括処理することもできる。

サブコマンド 説明
check 番号 ファイルシステムの簡単なチェックを行う
mklabel 新しいパーティションテーブルを作成する(make label)
mkpart 種類 開始 終了 指定した種類のパーティションを作成する(make partition)
rm 番号 指定したパーティションを削除する
p / print パーティションテーブルを表示する
q / quit 終了する

$ fdisk / $ gdisk / parted の違い

機能 $ fdisk $ gdisk $ parted
MBR ×
GPT ×
2TB 以上対応 ×
対話モード
スクリプト実行 × ×
パーティションサイズ変更 × ×

スワップ

物理メモリ(RAM)の容量が不足した際に、ストレージ 上で確保される一時的なメモリ領域。

  • パーティションをスワップとして利用する方法
  • ファイルをスワップとして利用する方法

がある。

$ mkswap / $ swapon

make swap / swap on

パーティション上にスワップ領域を作成する。

実行するには root 権限が必要。

スワップ領域を作成する
$ sudo mkswap デバイス # デバイス = パーティション

作成したスワップ領域は $ swapon で有効化される。

スワップを有効化する
$ swapon デバイス # デバイス = パーティション

ただし $ swapon は、ログイン中のセルセッション環境下でのみスワップを有効化するため、再起動後は再度 $ swapon を実行する必要がある。スワップ有効化を永続化する場合、/etc/fstab に以下の設定を追加する必要がある。

スワップの有効化を起動時に行うよう設定する
$ /dev/sdb1 none swap sw 0 0

$ mkswap で作成したスワップ領域は $ swapon で有効化する必要がある。
永続化する場合、/etc/fstb への設定追加が必要。

スワップファイルを作成する

$ fallocate を使用する方法。

1Gのスワップ用ファイル swapfile を作成する
$ sudo fallocate -l 1G ./swapfile

スワップファイル作成後は $ chmod でパーミッションを変更し、ファイル所有者以外がアクセスできないようにするのが一般的。

権限を変更
$ sudo chmod 600 ./swapfile

また $ fallocate でなく、$ dd を使用する方法もある。

$ dd の場合、実際にデータを 0 埋めによって書き込むため処理が低速だが、一部のファイルシステム(XFS)では $ fallocate で作成したファイルをスワップにできない場合がある。

$ dd を使ってスワップファイルを作成する
$ sudo dd if=/dev/zero of=/swapfile bs=1M count=1024

/dev/zero

$ fallocate

File Allocate

ファイルシステム上に指定サイズのファイル領域を 事前に 確保する。

物理ディスクに対してファイルとして利用する領域を事前に割り当てることにより、ディスクのフラグメンテーション(断片化)を防ぎ、書き込み時のパフォーマンスを向上させることができる。

サイズを指定するための-l オプションが必須。

ファイル領域を確保する
$ fallocate -l サイズ ファイル名
$ fallocate -l 100M ./sample  # 100MB
$ fallocate -l 1G ./sample    #   1GB

$ df

Disk Free

ディスクの空き容量や使用状況を確認する
$ df 
見やすい形式(KB、MB、GB)で表示する(human-readable)
$ df -h
特定のディレクトリやデバイスを対象とする
$ df -f ディレクトリ
$ df -f デバイス

-i オプションで inode の数を表示することもできる。Linux におけるファイルは、それぞれに対応する inode を一必ずつ持つため、inode の数はファイルの数を表す。

inode の数(ファイル数)を確認する
$ df -i

それぞれのファイルシステムには、作成可能な inode の個数が決まっており、ディスクに空き容量があったとしても inode に空きがない限り、ファイルを作成することができない。

$ du

Disk Usage

カレントディレクトリの使用状況を表示する
$ du
見やすい形式(KB、MB、GB)で表示する(human-readable)
$ du -h
特定のファイル、ディレクトリの使用量を確認する
$ du ファイル
$ du ディレクトリ

$ df$ du の違い

$ df
ファイルシステム(パーティション)ごとの使用状況を表示する。ファイルごとの使用量はわからない。

$ du
ディレクトリやファイル単位の使用量を表示する。また使用量を表示するため、空き容量はわからない。

$ dirname

Directory Name

ファイルパスのディレクトリ部分を抽出する
$ dirname ファイルパス
親ディレクトリを表示する
$ dirname ディレクトリパス/

$ pwd

Print Working Directory

カレントディレクトリを表示する
$ pwd

$ cd

Change Direcotry

カレントディレクトリを移動する
$ cd パス # 相対パスもしくは絶対パスを指定できる

- を指定すると一つ前の作業ディレクトリに戻ることができる。

一つ前の作業ディレクトリに戻る
$ cd -

$ mv

Move

ファイル、ディレクトリを移動する。もしくはファイル名、ディレクトリ名を変更する。複数のファイルを同時に操作することはできない。

ファイルを移動する
$ mv 旧パス 新パス

移動先の指定はディレクトリ(末尾に /)でも良い。

ファイルを指定したディレクトリ配下へ移動する
$ mv ファイル ディレクトリ/
ディレクトリを移動する
$ mv 旧ディレクトリ/ 新ディレクトリ/
ファイル名を変更する
$ mv 旧ファイル名 新ファイル名
ディレクトリ名を変更する
$ mv 旧ディレクトリ名/ 新ディレクトリ名/

$ cp

ファイルやディレクトリをコピーする
$ cp コピー元 コピー先
複数ファイルをまとめてコピーする
$ cp コピー元1 コピー元2 ディレクトリ/
ディレクトリごとコピーする(recursive)
$ cp -r コピー元ディレクトリ コピー先ディレクトリ

$ mkdir

Make Directory

ディレクトリを作成する
$ mkdir ディレクトリ名

$ rm

Remove

ファイルを削除する
$ rm ファイル
複数のファイルをまとめて削除する
$ rm ファイル1 ファイル2 ファイル3 
カレントディレクトリ内のすべてのファイルを削除する
$ rm *
ファイルの存在有無を問わない(fource)
$ rm -f ファイル
削除前の確認あり(interactive)
$ rm -f ファイル
ディレクトリを含むファイルを再帰的に削除する(recursive)
$ rm -r ディレクトリ

$ rmdir

ディレクトリを削除する。ただし、ディレクトリ内が空の場合に限る

ディレクトリを削除する
$ rmdir ディレクトリ名

$ touch

新規ファイルを作成する
$ touch ファイル名

$ find

特定のディレクトリツリー配下から、条件に一致するファイルを再帰的に検索する。

条件に一致するファイルを検索開始ディレクトリ配下で探す
$ find 検索開始ディレクトリ 検索式

検索開始ディレクトリを省略すると、カレントディレクトリ配下が検索対象になる。

カレントディレクトリ配下を検索する
$ find 検索式
カレントディレクトリ以下のすべてのファイルとディレクトリを表示
$ find .

検索式

$ find コマンドの検索式はやや特殊な構文となっている。

検索式 意味
-name ファイル名
-type ファイルの種類
f:ファイル
l:シンボリックリンク
d:ディレクトリ
-atime 最終アクセス時刻(日単位)
-amin 最終アクセス時刻(時間単位)
-mtime 最終更新時刻
-size ファイルサイズ
-exec コマンド {} \; 一致したファイルが指定したコマンドの引数として {} に展開され、実行される
コマンドは 1 ファイルづつ実行されるため、ファイル数が多いとコマンドの実行回数も増えるため、処理が遅くなることがある
-exec コマンド {} + + を使うことで、ファイルを一度に処理する
引数をまとめて処理できるコマンド($ rm$ ls$ echo など)に対して特に有効
-ok コマンド {} \; -exec と同じ
確認あり

-name

特定の名前のファイルを検索
$ find 検索開始ディレクトリ -name ファイル名
拡張子(.txt)を持つファイルを検索
$ find 検索開始ディレクトリ -name "*.txt"

-type

ファイルを検索
$ find 検索開始ディレクトリ -type f -name ファイル名
ディレクトリを検索
$ find 検索開始ディレクトリ -type d -name ディレクトリ名

-atime

過去1日以内にアクセスされたファイルを検索
$ find 検索開始ディレクトリ -atime -1

-amin

過去1時間以内にアクセスされたファイルを検索
$ find 検索開始ディレクトリ -amin -60

-size

100MB以上のファイルを検索
$ find 検索開始ディレクトリ -size +100M

-exec

{} には一致したファイルパスが展開される。

\; で終了した場合、{} はコマンドに対して 1 つずつ渡される。一致したファイル数が多い場合、処理速度は低速になることがある。

; はシェルで特別な意味を持つため、\ でエスケープする必要がある。

条件に一致したファイルを削除する(一つずつ実行)
$ find 検索開始ディレクトリ 検索式 -exec rm {} \;

一方、+ で終了した場合、コマンドに対して {} はまとめて渡される。

指定するコマンドは引数をまとめて処理できるコマンド($ rm$ ls$ echo など)である必要がある。

条件に一致したファイルを削除する(まとめて実行)
$ find 検索開始ディレクトリ 検索式 -exec rm {} +

$ locate / $ updatedb

ファイルを検索するためのコマンド。

事前に作成されたデータベースを使って検索を行うため、$ find よりも高速に動作する。

システム全体から検索を行う。ディレクトリを限定した検索は行うことができない。

ファイルを検索する
$ locate 検索ワード

$ locate が検索に使用するデータベース(/var/lib/mlocate/mlocate.db)は $ updatedb によって手動で更新することができる。ディストリビューションによってはデータベースは cron によって定期的に更新される。

データベースを更新する
$ sudo updatedb
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?