はじめに
Linux のファイルシステムでは、ファイルは データ本体 と inode で構成される。
-
データ本体(データブロック)
- ファイルの中身そのもの
-
inode
- ファイルのメタデータ
ディレクトリは 特別なファイル という扱いになっている。
前提知識
ルートファイルシステム
Linuxシステムの基本となるファイルが格納された、 /
(ルートディレクトリ)を起点とするファイルシステムのこと。
ext4
や xfs
などのファイルシステムを使用して構築されるが、 ルートファイルシステムという種類があるわけではない。
カーネルがブート後、最初に マウント するファイルシステムでもある。ルートファイルシステムをマウントする パーティション を ルートパーティション という。
FHS の表にあるような主要なディレクトリが含まれている。
inode
ファイルのメタデータを管理する構造体。
ファイルやディレクトリごとに作成されるバイナリデータ。inode 番号によって識別される。
$ ls -i
inode には、以下のような情報が含まれている。
- ファイルの属性
- ファイルの種類(通常ファイル、ディレクトリ、リンクの種類など)
- ファイルのサイズ
- 所有者(ユーザーID、グループID)
- パーミッション
- タイムスタンプ(作成時刻、最終更新時刻、最終アクセス時刻)
- リンク数(ハードリンクの数)
- データ本体への参照
また、ファイル名と inode 番号の対応関係はディレクトリに保存される。
ファイル名は inode に含まれない
ディレクトリファイルに保存される ファイル名 と inode 番号
ディレクトリは特殊なファイルとして扱われる。
ディレクトリファイルのデータ本体には、
- ディレクトリに含まれるファイルの名前 と inode 番号
- ディレクトリに含まれるディレクトリの名前 と inode 番号
が記録されている。
つまりディレクトリは、ファイル名と inode 番号のマッピング情報を保持する単なるメタデータを保持する「ファイル」と考えることができる。
SCSI
Small Computer System Interface
通信規格の一つ。
デバイスファイル /dev/sda
や /dev/sdb
の sd
は SCSI 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ビットの識別子。
$ lsblk -f
$ 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 デバイス
$ fsck -A
$ tune2fs
Tune ext2 File System
ext2
、ext3
、ext4
ファイルシステムのパラメータを変更、調整(tune)する。
$ sudo tune2fs デバイス
$ sudo tune2fs -l デバイス
仮想ファイルシステム
Vertual File System, VFS
実際の物理的なストレージ(HDDやSSDなど)に存在しないファイルを、ファイルシステムの中で仮想的なファイルやディレクトリとして提供する仕組み。
実際には存在しないが、実在するファイルのように振る舞う仮想ファイルの存在により、カーネルや OS が内部的に必要とするデータや情報を、ファイル同様に扱うことが可能になる。
代表的な仮想ファイルシステムには以下がある。
-
/proc/
- カーネルやシステムの状態に関する情報を提供する
- プロセスの情報やシステムの設定、ハードウェアの状態などが仮想ファイルとして提供される
-
/proc/cpuinfo
:CPU情報 -
/proc/プロセスID/fd/
:ファイルディスクリプタ情報
-
/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
デバイスファイル名のアルファベット
デバイスファイル /dev/sdX
の X
の位置にあるアルファベット部分 (a
、b
、c
、…) は、物理ディスクごとに付与された識別子を表す。
起動順や接続順、OSがデバイスを認識した順番で sda
、sdb
、sdc
という様に名前が付与される。
デバイスファイル名の数字
デバイスファイル /dev/sdY
の Y
の位置にある数字(1
、2
、3
、 …) は、ディスク内の パーティション 番号を表す。
/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
$ lspci -v
※ PCI
$ lsusb
$ 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
などの パーティション をマウントする。
$ mount /dev/sdb1 /mnt/usb
パーティションとして作成されたデバイス「ファイル」に対して、「ディレクトリ」をマウントする
マウントポイントにする予定のディレクトリは空である必要がある
$ mount
$ mount デバイス マウントポイント # デバイス = パーティション、マウントポイント = ディレクトリ
$ mount -t ファイルシステム デバイス マウントポイント
引数無しで実行すると、マウント済みのデバイス一覧を表示することができる。
$ mount
-o
オプションは複数のオプション引数を ,
で受け取ることができる。
$ 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
によって自動的にマウントされる。
日常的に使用するストレージにはこの設定をしていることが多い。
以下の様な形式で設定を記述する。
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
|
ファイルシステム |
ファイルシステムext4 、xfs 、ntfs など |
オプション | パフォーマンス、セキュリティ、利便性に関わるオプション(複数指定可)defaults :デフォルトのオプションセット(通常)sw :スワップ領域としての標準オプションセット |
dump フラグ |
$ dump コマンドを実行した時にバックアップ対象とするかしないか有無。実際の運用ではほとんどのシステムで $ dump コマンドは使われないため 0 が一般的。0 :バックアップ対象としない1 :バックアップ対象とする |
fsck | 起動時にファイルシステムの整合性を $ fsck でチェックするかどうか(file system check)、またチェックする場合の優先順位(ファイルシステムの破損を防ぐために使用される)0 :チェックしない1 :最優先でチェックされる。ルートファイルシステム(/ )専用。2 :ルート以外のパーティションでチェックを行う場合は 2 を使用する |
例えば、Ubuntu のルートファイルシステム /
や /home
、/boot
などは、/etc/fstab
に記載されているため、起動時に自動でマウントされる。
デスクトップ環境(GNOME、KDE など)では、udisks2
や gvfs
などのデーモンを利用して自動マウントされることもある。
Read-only file system
と出力されたら...
/
や /etc
がシステム起動時に読み取り専用モード(ro
:read only)でマウントされている場合、配下のファイルを編集しようとすると
Read-only file system
と出力されることがある。
$ mount
コマンドで一覧表示することで ro
かどうかが確認できる。
$ mount
/dev/sda1 on / type ext4 (ro)
このような場合に、マウントし直すことで書き込み可能にすることができる。マウント済みのデバイスファイルは、再マウント時に指定する必要がない。
$ sudo mount -o remount,rw /
ただし、この変更は再起動すると元(ro
)に戻る可能性がある。
デバイスファイルとマウントポイントの違い
どちらもデータを処理するためのインターフェースとして機能するが、利用する主体が異なる。
デバイスファイルは、
カーネルによって低レベルなデータ処理を行うためのインターフェースとして機能する。実際には read()
や write()
などの システムコール を通じて、カーネルがデバイスとやり取りしている。
例えば、以下のような $ dd
を用いた操作ではマウントポイントは意識されない。
$ dd if=/dev/sdb1 of=backup.img
一方 マウントポイントは、
ユーザによって直感的な(高レベル)ファイルシステム操作を行うためのインターフェースとして機能する。
/mnt/usb/
のようなマウントポイントは、ユーザがデバイス内のファイルにアクセスするためのディレクトリパスであり、/mnt/usb/sample.txt
のように通常のファイルとして操作できる。
$ 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/ |
仮想ファイルが格納されるディレクトリのため |
ルートディレクトリをマウントするパーティションと、ルートディレクトリ内の特定のディレクトリをマウントする様子を図にしてみた。
ここで、もしマウントする前に /home/
配下に何らかのファイルが存在していたら、どうなるのかが気になった。
調べてみると、あるディレクトリに別のファイルシステムをマウントすると、そのディレクトリのもともとの内容は 見えなくなるということだった。
/home/file1
というファイルが既に存在している状態で home/
ディレクトリをマウントに利用すると、マウント先のデバイスのファイルシステムが表面化し、/home/file1
は見えなくなる。マウントを解除すると、再び /home/file1
が見えるようになる。
つまり、マウントポイントにする予定のディレクトリは空である必要がある。
Mac に Ubuntu をインストール した際は、こんな設定画面が出ていた。
パーティション ( MBR / GPT )
物理ストレージ(HDDやSSD)を複数の論理的な領域に区切る仕組み。
それぞれのパーティションは OS からは独立したストレージ領域として認識される。
例えばデバイス /dev/sdb
に対して、パーティション /dev/sdb1
を作成し、利用できる状態にするためにはパーティションの作成以外にも下記の操作が必要となる。
- パーティションの作成
- 作成したパーティションに対するフォーマット(ファイルシステム)の設定
- 作成したパーティション(
/dev/sdb1
)のマウント
ルートファイルシステム をマウントするパーティションはルートパーティションと呼ばれる。
ファイルシステムにはいくつかの種類(ext4
、ntfs
、fat32
)があり、それぞれのパーティションには異なるファイルシステムを作成することも可能。
パーティションの方式には 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 からはそれぞれが異なるストレージ領域のように認識される。ただし、実際には異なるパーティション同士であっても同じ物理ディスク上に存在するデータであり、独立したストレージではない。
パーティションを使用するには、ext4
、ntfs
、fat32
などのファイルシステム(フォーマット)を設定する必要がある。
ディレクトリは、
ファイルや他のディレクトリを管理するファイルシステム上の 仮想的な構造 であり、単なる「フォルダ」として機能する。
ディレクトリはパーティションの中に作られるため、パーティションが未フォーマット(ファイルシステムが未作成)の場合、ディレクトリを作ることはできない。
パーティションは、ディレクトリ(マウントポイント)にマウントされることで初めてアクセスが可能になる。
パーティションはディスク上の物理的な領域であり、その上にファイルシステムが構築され、その中に仮想的なディレクトリが作られる。パーティションがフォーマットされて初めてディレクトリを作成できる。
$ 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
を使用する方法。
$ sudo fallocate -l 1G ./swapfile
スワップファイル作成後は $ chmod
でパーミッションを変更し、ファイル所有者以外がアクセスできないようにするのが一般的。
$ sudo chmod 600 ./swapfile
また $ fallocate
でなく、$ dd
を使用する方法もある。
$ dd
の場合、実際にデータを 0
埋めによって書き込むため処理が低速だが、一部のファイルシステム(XFS)では $ fallocate
で作成したファイルをスワップにできない場合がある。
$ sudo dd if=/dev/zero of=/swapfile bs=1M count=1024
$ fallocate
File Allocate
ファイルシステム上に指定サイズのファイル領域を 事前に 確保する。
物理ディスクに対してファイルとして利用する領域を事前に割り当てることにより、ディスクのフラグメンテーション(断片化)を防ぎ、書き込み時のパフォーマンスを向上させることができる。
サイズを指定するための-l
オプションが必須。
$ fallocate -l サイズ ファイル名
$ fallocate -l 100M ./sample # 100MB
$ fallocate -l 1G ./sample # 1GB
$ df
Disk Free
$ df
$ df -h
$ df -f ディレクトリ
$ df -f デバイス
-i
オプションで inode の数を表示することもできる。Linux におけるファイルは、それぞれに対応する inode を一必ずつ持つため、inode の数はファイルの数を表す。
$ df -i
それぞれのファイルシステムには、作成可能な inode の個数が決まっており、ディスクに空き容量があったとしても inode に空きがない限り、ファイルを作成することができない。
$ du
Disk Usage
$ du
$ 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 ディレクトリ/
$ cp -r コピー元ディレクトリ コピー先ディレクトリ
$ mkdir
Make Directory
$ mkdir ディレクトリ名
$ rm
Remove
$ rm ファイル
$ rm ファイル1 ファイル2 ファイル3
$ rm *
$ rm -f ファイル
$ rm -f ファイル
$ 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 ファイル名
$ find 検索開始ディレクトリ -name "*.txt"
-type
$ find 検索開始ディレクトリ -type f -name ファイル名
$ find 検索開始ディレクトリ -type d -name ディレクトリ名
-atime
$ find 検索開始ディレクトリ -atime -1
-amin
$ find 検索開始ディレクトリ -amin -60
-size
$ 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