1
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

はじめに

Everything is a file

UNIX 哲学には「すべてはファイルである」という設計思想がある。

この思想に基づいて構築された Linux では 全ての入出力(I / O)操作は「ファイル」に対して行われる

ディレクトリ、デバイスファイル、パーティション、マウントポイントは全て、「ファイル」として扱われる

例えばパーティションに対する操作は、パーティションを表現する デバイスファイル に対して行う。

ファイルシステムを理解する上で重要なポイントは以下の 5 つ。

  • 物理ディスクは、複数の論理パーティションに分割できる
  • パーティションには、対応するデバイスファイルが存在する
  • ファイルシステムは、パーティションに対して構築される
  • パーティションに構築されたファイルシステムは、マウントポイントでマウントすることで、操作可能になる
  • マウントポイントは、ディレクトリである

ファイルの実体

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

  • ファイル名
  • データ本体
    • データブロック
    • 保存対象のデータ
  • inode
    • ファイルのメタデータ
    • ファイル所有者、パーミッション、更新日時など

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

ディレクトリの実体

ディレクトリのデータ本体部分には、

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

が保存されている。

つまりディレクトリは、ディレクトリ自身が保持しているファイル名と inode 番号のマッピング情報を保持する「ファイル」と考えればよい。

わかりづらいが、ディレクトリファイル自身のメタデータは、先述のとおりディレクトリファイルの inode として保持されている。

inode

ファイルごとに作成される、ファイルのメタデータを管理するバイナリデータ。

inode 番号によって識別される

ファイルの inode 番号を確認する
$ ls -i ファイル
$ stat -c %i ファイル

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

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

また、ファイル名と 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

ファイルシステム

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

ファイルシステムの存在によって、私たちはデータを扱う際に「ディスクの〇〇バイト目 ~ ××バイト目までのデータを読み出す」などという形式ではなく、「A ディレクトリの B ファイルを読み出す」という形式でデータを扱うことができる。

ファイルシステムにhいくつかの種類がある。

種類 特徴
ext2
ext3
ext4
Linux で最も一般的
XFS 高速、大容量向け(Red Hat 系)
Btrfs スナップショット、圧縮ができる
vfat Windows、USB で使用される
exfat フラッシュメモリ で使用される
iso9660 CD-ROM で使用される

Linux が起動するとき、基本的にはルートファイルシステムがすでに存在しているが、さらにルートファイルシステム配下で別のファイルシステムが構築されることがある。

$ mkfs コマンドを使用することによって、パーティションに対して作成することができる。

ルートファイルシステム

/(ルートディレクトリ)を起点とするファイルシステムのこと。

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

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

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

FHS

Filesystem Hierarchy Standard

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

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

ディレクトリ 説明
/ ルートディレクトリ
すべてのパスの起点となる
/bin 一般ユーザでも使用可能な基本コマンドが格納されるディレクトリ
$ ls
$ cp
$ mv
$ rm
/sbin システム管理用コマンドが格納されるディレクトリ
$ fdisk
$ shutdown
init
/lib 共有ライブラリ が格納されるディレクトリ
libc.so など
/etc 設定ファイルが格納されるディレクトリ
/etc/passwd/etc/fstab/etc/ld.so.conf など
/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 デバイス情報
/proc/self/mounts:マウント情報
/proc/mounts/proc/self/mounts への シンボリックリンク
/sys デバイスやドライバの情報(udev)が格納されるディレクトリ
/media USB メモリや CD-ROM などの自動マウントに使われる
/mnt 外部ストレージやネットワークドライブを手動で一時的にマウントするためのマウントポイントとなるディレクトリ
/boot システムの起動(ブート)に関わるファイルが格納されるディレクトリ
/boot/vmlinuz-バージョン:カーネル本体(圧縮ファイル)
/boot/vmlinuz:カーネル本体へのシンボリックリンク
/var ログや頻繁に更新されるデータが格納されるディレクトリ
独立したパーティションとする場合が多い
var/cache:一時的なキャッシュファイル
/var/log:ログファイル
/var/lock排他制御 に使用するためのロックファイルが格納されるディレクトリ
/var/run:システムの状態を示すファイル
/tmp 一時ファイル
スティッキービット が設定されることが多い
独立したパーティションとする場合が多い

仮想ファイルシステム

Vertual File System, VFS

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

前述 の通り、UNIX 哲学には「Everything is a file」という哲学があるため、カーネルや OS が内部的に必要とする情報も、「ファイル」として扱われる。

【代表的な仮想ファイルシステム】

  • /proc/
  • /sys/
    • システムの設定やデバイス情報
  • /dev/

デバイスファイル

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

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

デバイスファイルが「通常のファイル」と同様のインターフェースを提供することにより、

  • open
  • read
  • write
  • close

などの、通常はファイルに対して行う操作(システムコール)を、デバイスに対しても同様に行うことが可能となる。

つまり デバイスをファイルのように扱う ことが可能になる。

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

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

デバイスファイルにアクセスを行うのはカーネル(のデバイスドライバ)であり、操作できるユーザは 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

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

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

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

LPIC (5).png

例えばデバイス /dev/sdb をファイルシステムとして利用するには以下の操作が必要になる。

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

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

LPIC (6).png

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

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

GPT は MBR の後継版であり、作成できるパーティションの数が異なる。

  • MBR → 4 個
  • GPT → 128 個

パーティションの最大サイズも異なる。

  • MBR → 2 TiB (2.2 TB)
  • GPT → 8 ZiB (9.4 ZB)

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

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

マウント

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

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

LPIC (19).png

マウントは、特定のパーティションに対して行われ、ファイルシステムとの起点、接続点となる。

LPIC (20).png

マウントするディレクトリは、」中身が空でなければならない(空にしないとどうなるか)。

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

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

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

LPIC (22).png

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

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

デバイスドライバ

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

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

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

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 ディレクトリの設定ファイルを編集することによって制御することができる。つまり、特定のデバイスに対する自動処理に独自のルールを作成することができる。

スワップ

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

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

がある。

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

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

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

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

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

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

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

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

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 などで直接操作できるが、ファイル単位のアクセスはできない。ファイル単位の読み書きはマウントポイントを経由する必要がある。

マウントを理解する

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

file_system (1).png

サーバを構築する際、 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

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

$ 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

$ df$ du の違い

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

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

$ fdisk / $ gdisk / $ parted の違い

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

/etc/fstab

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

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

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

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

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

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

$ file

ファイルの種類を調べる
$ file ファイル

$ touch

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

$ mkdir

Make Directory

ディレクトリを作成する
$ mkdir ディレクトリ名
指定したディレクトリの親ディレクトリも自動作成する(parents)
$ mkdir -p ディレクトリパス
パーミッションを指定してディレクトリを作成する(mode)
$ mkdir -m パーミッション ディレクトリ名

$ mkdir -m で指定できる パーミッション は数値形式のみ。

$ rmdir

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

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

$ pwd

Print Working Directory

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

$ cd

Change Direcotry

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

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

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

$ mv

Move

ファイルやディレクトリを移動する。

基本構文
$ mv 移動元 移動先
ファイルを移動する
$ mv 移動したいファイル 移動先ディレクトリ/

複数のファイルやディレクトリを一括で移動することも可能。

複数のファイルをまとめて移動する
$ mv ファイル1 ファイル2 ファイル3 移動先ディレクトリ/

$ mv は、ファイルやディレクトリの移動だけでなく、名前の変更(リネーム)にも使用される。

「移動」と「名前変更」は本質的に「場所または名前を変更する」という点で同じ動作であり、どちらになるかは「移動先の存在」によって自動で決定される。

重要なのは 移動先が存在する場合には「移動」、存在しない場合には「名前変更」操作として扱われる 点である。

移動先が存在する → 移動
$ mv 移動したいファイル 既存ディレクトリ        # 既存ディレクトリ配下に移動
$ mv 移動したいディレクトリ 既存ディレクトリ     # 既存ディレクトリ配下に移動
移動先が存在しない → 名前変更
$ mv 名前変更したいファイル 変更後ファイル名            # ファイル名の変更
$ mv 名前変更したいディレクトリ 変更後ディレクトリ名     # ディレクトリ名の変更

「名前変更」ではなく「移動」をさせたい場合、移動先を 移動先/ としておくと意図が明確になる。ただし、 / の有無は挙動には影響がない。

「移動」の意図が明確になる
$ mv 移動したいファイル 既存ディレクトリ
$ mv 移動したいファイル 既存ディレクトリ/     # 推奨
$ mv 移動したいディレクトリ 既存ディレクトリ
$ mv 移動したいディレクトリ 既存ディレクトリ/  # 推奨

-f--force)オプションは、「ファイル上書き」が発生する場合にその確認をスキップするためのオプション。

「移動」か「名前変更」かの挙動には影響を与えない。

同名のファイルが存在する場合
$ mv -f old.txt new.txt  # new.txt が既に存在していても、確認なしで上書きされる
$ mv -f old.txt 移動先ディレクトリ/ # 移動先に元々存在していた old.txt が上書きされる

-f は「ファイルの上書き」が発生する場合のオプションである。同名のディレクトリが存在する場合には、エラーが発生する。

ディレクトリは上書きされない(移動先ディレクトリに、同名のディレクトリがあるとする)
$ mv -f ディレクトリ 移動先ディレクトリ
mv: cannot move 'ディレクトリ' to '移動先ディレクトリ': Directory not empty

$ cp

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

-p オプションで、ファイルの所有者、パーミッション、最終更新時刻などのタイムスタンプを維持したままコピーが行えr

属性情報を保持したままコピーする(preserve)
$ cp -p コピー元ディレクトリ コピー先ディレクトリ

$ rm

Remove

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

$ dirname

Directory Name

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

$ lsblk

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

ブロックデバイス

$ lspci

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

PCI デバイス:NIC、Bluetooth アダプタ、SCSI コントローラ など

$ lsusb

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

$ lsscsi

SCSI デバイスの情報を一覧表示する(-v:詳細表示)
$ lsscsi -v

SCSI デバイス:HDD、SSD、CD / DVD ドライブなど

$ lshw

ls hardware

システム全体のハードウェア(CPU、メモリ、マザーボード、ネットワークアダプタ、ストレージデバイス)情報を詳細に表示する
$ sudo lshw

$ lscpu

CPU に関する情報を表示する
$ lscpu

/proc/cpuinfo の情報が表示される。

$ lsof

List Open Files

システム内で開かれているファイルやソケットを一覧表示する。

システム上のすべての開いているファイルを一覧表示する
$ lsof
特定のプロセスが開いているファイルを調べる
$ lsof -p PID
特定のユーザが開いているファイルを調べる
$ lsof -u ユーザ名
特定のファイルを開いているプロセスを調べる
$ lsof ファイル名
特定のポートを使用しているプロセスを調べる
$ lsof -i:ポート番号

$ lsmod

/proc/modules の情報が表示される。

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

$ 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

Partition Editor

パーティションを作成するためのコマンド。

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

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

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

基本構文
$ parted デバイス

$ parted を実行すると、対話モードに切り替わる。

対話モードを使用しない場合、-s オプションを利用する。

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

$ mkfs

make filesystem

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

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

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

$ 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 デバイス

$ debugfs

ext2ext3ext4 ファイルシステムのデバッグ用ツール。

対話形式でデバイスをオープンして、内部のファイルシステムを解析する。

読み取り専用モードでオープン、解析する
$ debugfs デバイス

対話モードに遷移したら、$ quit で終了できる。

読み書きが可能なモードでオープン、解析する
$ debugfs -w デバイス

読み書きモードで実行した場合、ファイルシステムが破損することがある!

$ mount

デバイスを特定のディレクトリにマウントする
$ mount デバイス マウントポイント  # デバイス = パーティション、マウントポイント = ディレクトリ
ファイルシステムを指定してマウントする
$ mount -t ファイルシステム デバイス マウントポイント
/etc/fstab に記載されたエントリのオプションに auto が設定された全てのファイルシステムをマウントする
$ mount -a

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

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

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

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

--bind オプションを使用すると、マウント済みのパーティション内の特定のサブディレクトリを、別のディレクトリにバインドマウントすることができる。

マウント済みのディレクトリ配下のディレクトリを再マウントする
$ mount --bind ディレクトリ マウントポイント

$ umount

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

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

デバイスをアンマウントする
$ umount マウントポイント
$ umount デバイス

$ mkswap

make swap

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

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

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

$ swapon

swap on

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

$ swapon は、ログイン中のシェルセッション環境下でのみスワップを有効化する。そのため、特定のパーティションのスワップの有効化を行っても、再起動によってスワップが無効になるため、再度 $ swapon を実行する必要がある。

もし、スワップ有効化を永続化したい場合、/etc/fstab に以下の設定を追加する必要がある。

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

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

$ 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 ファイル
$ du ディレクトリ

引数を指定しない場合、ディレクトリ単位で使用容量が表示される。

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

$ modprobe

probe=探査する、調査する

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

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

$ fallocate

File Allocate

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

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

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

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

$ find

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

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

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

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

特殊文字の扱い

ファイル名にスペース「 」や、コーテーション「'」などの特殊文字が含まれている場合のTips。

ファイル名がhello world.txtのようにスペースを含む場合。

"" で囲う

""で囲う
$ find . "hello world.txt"

バックスラッシュ \ でエスケープする

\でエスケープ
$ find . hello\ world.txt

検索式

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

検索式 意味
-name ファイル名
-type ファイルの種類
f:ファイル
l:シンボリックリンク
d:ディレクトリ
-uid ファイル所有者の UID
-user ファイルを所有するユーザ名、ユーザ ID
-print 検索結果を標準出力として出力
-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
過去 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 {} +

-perm

パーミッションを指定して検索を行う。

指定方法が 3 つある。

  • 完全一致
    • -perm xxxx
    • 例:-perm 6000 → 6000 のみ該当
  • AND 一致
    • -perm -xxxx
    • 例:-perm -6000 → 4xxx かつ 2xxx → 6xxx が該当
  • OR 一致
    • -perm /xxxx
    • 例:-perm /6000 → 4xxx または 2xxx または 6xxx が該当
指定したパーミッション条件に一致したファイルを検索する
$ find 検索開始ディレクトリ -perm パーミッション条件

$ locate

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

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

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

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

$ updatedb

$ locate が検索に使用するデータベース(/var/lib/mlocate/mlocate.db)は $ updatedb によって手動で更新することができる。

ディストリビューションによってはデータベースは cron によって定期的に更新される。

データベースを更新する
$ sudo updatedb
特定のディレクトリを検索対象から外す
$ sudo updatedb -e ディレクトリ
1
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
1
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?