第12章 ディスクとファイルシステムの管理
12.1 ディスクストレージについて知ろう
ほとんどのモダンなOSで、データストレージの基本的な仕組みは同じだよ。ディスクは永続的なストレージとして使われて、RAM(Random Access Memory、ランダムアクセスメモリ)とスワップ領域は一時的なストレージとして使われるんだ。例えば、コマンドを実行するとき、そのコマンドはハードディスクからRAMにコピーされるんだ。そうすると、コンピューターのプロセッサ(CPU)がもっと速くコマンドにアクセスできるようになるからね。
ハードディスクからデータにアクセスするより、CPUはRAMからの方がずっと速くアクセスできるんだ。でも、RAMは値段が高いし、電源が切れるとデータが消えちゃうから、ディスクの容量はRAMよりはるかに大きいんだよ。
たくさんのプロセスを動かしたり、メモリリークのあるプロセスを動かしてRAMがいっぱいになっちゃったとき、システムにメモリを拡張する方法がないと、新しいプロセスが起動できなくなることがあるんだ。そこでスワップ領域が登場するってわけ。いくつかのアルゴリズムを使って、一部のデータをRAMからディスクに移動させて、必要になったらまたRAMに戻すんだよ。
異なる種類のOS間でファイルをやり取りする必要があるときは、通常VFATファイルシステムが使われることが多いよ。
12.2 ハードディスクをパーティション分割しよう
パーティションの変更はシステムが起動しなくなる原因になることもあるから、まずは空のハードディスクでしっかり慣れてから、実際に使うことをおすすめするよ。
12.2.1 パーティションテーブルを理解しよう
昔から、PCアーキテクチャのコンピューターは、MBR(Master Boot Record)パーティションテーブルを使ってハードディスクのパーティションサイズと配置情報を保存してきたんだ。だけど、最近ではGUID(Global Unique Identifier)パーティションテーブルっていう新しい規格が、一部のUEFIコンピューターアーキテクチャのコンピューターで使われるようになって、古いBIOSシステム起動方法に取って代わってるんだ。
MBRの仕様が持つ限界が、GUIDパーティションを必要とさせたんだよね。MBRパーティションのサイズは2TBまでに制限されているけど、GUIDパーティションだと最大9.4ZBのパーティションが作れるんだよ。
fdiskコマンドはGPTパーティションに対応してないから、partedコマンドを使うことができるよ。
12.2.2 ディスクパーティションを確認しよう
fdisk -l /dev/sda または parted -l /dev/sdb
sd?デバイス(sda、sdbなど)で表されるSCSIやUSBストレージデバイスは、最大16個のマイナーデバイス(例えばメインの
/dev/sdcデバイスと/dev/sdc1から/dev/sdc15まで)を持つことができるんだ。だから全部で15個のパーティションがあるってことになるね。nvmeデバイス(nvme0、nvme1など)で表されるNVMe SSDストレージデバイスは、1つ以上のネームスペース(ほとんどのデバイスは最初のものだけを使うけどね)とパーティションに分割できるんだ。例えば
/dev/nvme0n1p1は、最初のnvmeデバイス上の最初のネームスペースの最初のパーティションを表してるよ。x86コンピューターの場合、ディスクには最大4つのプライマリパーティションを持つことができるんだ。だから、4つ以上のパーティションが欲しいなら、少なくとも1つは拡張パーティションにしておく必要があるよ。4つのプライマリパーティション以外のパーティションはすべて論理パーティションで、拡張パーティションの領域を使っているんだ。
12.2.3 シングルパーティションのハードディスクを作成しよう
一般的に、ストレージメディアを追加する手順はこうだよ:
新しいハードディスクを取り付けるか、新しいUSBフラッシュドライブを挿し込む。
新しいハードディスクをパーティション分割する。
新しいハードディスク上にファイルシステムを作成する。
ファイルシステムをマウントする。
もし
partedコマンドを使って変更する場合は、一歩一歩慎重に進めてね。なぜかっていうと、partedコマンドの変更はすぐに反映されちゃうからだよ。 一方でfdiskコマンドは取り消し可能で、変更を確定するときに初めて実際に反映されるんだ。データは宝物、慎重に操作してね。
新しく追加したデバイスの名前を確認する。
方法はたくさんあるけど、例えばシステムログを見る方法があるよ。
journalctl -f例えば、割り当てられた名前が
/dev/sdbだったとするね。もしデバイスが自動でマウントされちゃってたら、まずアンマウントする必要があるよ。
/dev/sdbがマウントされているか確認するには:mount | grep sdbパーティションをアンマウントするには:
umount /dev/sdb1partedコマンドを使ってパーティションを作成する。parted /dev/sdb実行するとpartedコマンドモードになるから、partedのシングルレターコマンドでパーティションを設定できるよ。
パーティションを削除する。
単一コマンド
pで、全てのパーティションをリスト表示する。rmコマンドを使って、Enterを押してから該当するNumberを入力すれば、そのパーティションを削除できるよ。GPTパーティションテーブルを作成する。
mklabel gptコマンドを使うんだ。新しいパーティションを作成する。
mkpartコマンドを入力すると、パーティション名、ファイルシステムの種類、そしてパーティションの開始と終了を入力するよう促されるよ。例えば、yexca-UDisk と名付けて、ファイルタイプを xfs に、パーティションを1MBから123GBまでと設定するなら、こうだよ:
1 2 3 4 5(parted) mkpart Partition name? []? yexca-UDisk File system type? [ext2]? xfs Start? 1 End? 123GBパーティションが正しく作成されたか確認する。
単一コマンド
pで、全てのパーティションをリスト表示する。パーティションの作成が終わったら、そのパーティション上にファイルシステムを作成する必要があるよ。
例えばXFSファイルシステムを作成するには:
mkfs -t xfs /dev/sdb1-tオプションがない場合、デフォルトでext2ファイルシステムが作成されるんだ。ファイルシステムをマウントする。
1 2 3 4# マウント用のフォルダを作る mkdir /mnt/tmp # /dev/sdb1を/mnt/tmpにマウントする mount /dev/sdb1 /mnt/tmpファイルシステムをアンマウントする。
umount /dev/sdb1コマンドを使うよ。
デフォルトでは、USBデバイスを挿すとたいてい自動でマウントされることが多いよ。
もし手動でマウントしたいなら、/etc/fstabに一行追加すればいいんだ。
| |
全部で6つのセクションがあるよ。
パーティション
マウントするフォルダ
ファイルシステム
パーティション起動時のマウントオプション
dumpコマンドでパーティションファイルをバックアップするかどうか(0はバックアップしない)特定のマウント回数の後にパーティションのエラーチェックを行うかどうか
12.2.4 マルチパーティションディスクを作成しよう
fdiskコマンドを使った説明だよ。
fdiskコマンドモードに入る。
fdisk /dev/sdbパーティションを作成する。
単一コマンド
nを入力して、次にプライマリパーティションのpか拡張パーティションのeを選んで、パーティションの位置を選ぶんだ(デフォルトで大丈夫だよ)。それから割り当てるスペースなんだけど、開始スペースはデフォルトでいいとして、Enterを押した後、終了スペースを入力するんだ。例えば5GBのスペースを割り当てるなら
+5Gと入力するよ。もし直接数字を入れると、セクタとして認識されちゃうから気をつけてね。4番目のパーティション、つまり拡張パーティションは、スペースの割り当てを2回ともデフォルトで大丈夫だよ。
パーティションを確認する。
単一コマンド
p。デフォルトのパーティションタイプはLinuxなんだけど、もしパーティションタイプを変更したいなら。
tコマンドを使って、パーティション番号を選んでからLを入力してパーティションタイプのリストを見るんだ。目的の16進コードを見つけたら、それを入力して変更するよ。変更を確認して保存する。
単一コマンド
pで確認して、単一コマンドwで変更を保存するよ。変更が終わったら、カーネルがパーティションテーブルの変更を認識しているか確認するんだ。
1 2 3 4 5grep sdb /proc/partitions # もし期待通りの結果が出なかったら、以下のコマンドを実行してね。 partprobe /dev/sdb # もう一度確認する grep sdb /proc/partitionsファイルシステムを作成する。
1 2 3 4 5 6 7 8 9 10# ext4ファイルシステムを作成する mkfs -t ext4 /dev/sdb1 # スワップ領域を作成する mkswap /dev/sdb2 # ext2ファイルシステムを作成する(デフォルトだよ) mkfs /dev/sdb3 # VFATファイルシステムを作成する mkfs -t vfat /dev/sdb4 # このパーティションをLVM物理ボリュームにする pvcreate /dev/sdb5
12.3 論理ボリューム管理でパーティションを管理しよう
もしディスクの容量が足りなくなったら、データを別のより大きなディスクにコピーするしかないだろうね。でも、そのプロセスはシステムを停止する必要があるし、効率も悪いんだ。
LVM(Logical Volume Management、論理ボリューム管理)を使うと、ストレージの変更に柔軟かつ効率的に対応できるんだ。LVMを使えば、物理ディスクパーティションを「ボリュームグループ」と呼ばれる領域のプールに追加できるんだよ。論理ボリュームは、必要に応じてボリュームグループから領域を割り当てるんだ。
12.3.1 既存のLVMを確認しよう
fdisk -l /dev/sdaコマンドを使って、Linux LVMパーティションがあるか確認するんだ。例えば/dev/sda2がLVMパーティションだと仮定するね。
そのLVMパーティションがLVMグループで使われているか確認する。
pvdisplay /dev/sda2
ボリュームグループ(VG Name)がvg_abcだと仮定して、そのボリュームグループの情報を確認するよ。
vgdisplay vg_abc
物理ボリュームが使う最小のストレージ単位はPE(Physical Extent)サイズってわかるよ。
ボリュームグループのPEがどこに割り当てられているか確認する。
lvdisplay vg_abc
出力には複数の論理ボリューム名が表示されるんだけど、これらの論理ボリュームは物理ボリュームと同じように名前を使って直接マウントできるんだよ。

12.3.2 LVM論理ボリュームを作成しよう
LVM論理ボリュームの利用はトップダウンだけど、作成プロセスはボトムアップなんだ。まず1つ以上の物理ボリューム(PV)を作成して、次にその物理ボリュームを使ってボリュームグループ(VG)を作成し、最後にボリュームグループから論理ボリューム(LV)を作成するんだ。
LVMパーティションを持つストレージデバイスを準備する。
作成プロセスについては12.2.4で触れたよね。
その物理ボリュームをボリュームグループに追加する。
vgcreate myvg0 /dev/sdb5ボリュームグループを確認する。
vgdisplay myvg0パーティションが400Mだったら、396Mのスペース(4M単位で)を使うことができるよ。
1 2 3 4 5 6# ボリュームグループの一部領域から論理ボリュームを作成する。例えば1Gの論理ボリュームを作成するなら。 lvcreate -n name -L 1G myvg0 # その論理ボリュームが存在するか確認する。 ls /dev/mapper/myvg0* # 以下の出力があれば作成成功だよ。 /dev/mapper/myvg0-nameファイルシステムを入れてマウントする。
1 2 3 4 5 6 7 8# ext4ファイルシステムを作成する mkfs -t ext4 /dev/mapper/myvg0-name # マウント用フォルダを作成する mkdir /mnt/tmp # マウントする mount /dev/mapper/myvg0-name /mnt/tmp # マウントが成功したか確認する df -h /mnt/tmpもしくは
/etc/fstabに書き込んで自動マウントさせることもできるよ。
12.3.3 LVM論理ボリュームを拡張しよう
もし論理ボリュームの容量を使い切っちゃったら、その論理ボリュームをアンマウントせずに容量を追加できるよ。そのためには、ボリュームグループに利用可能なスペースがある必要があって、それから論理ボリュームを拡張するんだ。
残りの容量を確認する。
1 2 3 4# ボリュームグループの利用可能スペースを確認する vgdisplay myvg0 # 論理ボリュームの利用可能スペースを確認する df -h /mnt/tmp論理ボリュームを拡張する。
lvextend -L +1G /dev/mapper/myvg0-nameファイルシステムのサイズを調整する。
resize2fs -p /dev/mapper/myvg0-name調整が成功したか確認する。
df -h /mnt/tmp
12.4 ファイルシステムをマウントしよう
実は前の2つのセクションで、ファイルシステムをマウントするコマンドmountや自動マウントの設定(/etc/fstabファイル)についてはすでに触れてるんだ。
12.4.1 サポートされているファイルシステム
cat /proc/filesystemsコマンドを入力して、サポートされているファイルシステムタイプを確認できるよ。以下はその一部だね。
| ファイルシステム | 説明 |
|---|---|
| ext4 | 人気のext3ファイルシステムの後継だよ。最大1EBのボリュームと最大16TBのファイルをサポートしてるんだ。 |
| iso9660 | High Sierraファイルシステム(CD-ROMの元々の標準規格だよ)から発展したもの。データCD-ROMでよく使われるファイルシステムだね。 |
| Minix | UNIXのMinix版で最初に使われたもの。最大30文字までのファイル名しかサポートしてないんだ。 |
| msdos | MS-DOSのファイルシステムタイプで、Windows OSのフロッピーディスクをマウントするのに使えるよ。 |
| vfat | Microsoftが拡張したFATファイルタイプだね。 |
| exfat | SDカード、USBドライブ、その他のフラッシュメモリ向けに最適化された拡張FATファイルシステムだよ。 |
| proc | 本当のファイルシステムじゃないんだ。Linuxカーネルのファイルシステムインターフェースだよ。/procのマウントポイントはprocファイルシステムであるべきだね。多くのユーティリティが/procに依存してLinuxカーネル情報にアクセスしてるんだ。 |
| ReiserFS | ジャーナリングファイルシステムだよ。かつて複数のLinuxディストリビューションでデフォルトのファイルシステムタイプだったけど、今ではextやxfsが主流だね。 |
| swap | スワップパーティションに使われるよ。 |
| squashfs | 圧縮されていて読み取り専用のファイルシステムタイプだよ。 |
| NFS | Network Filesystemの略で、他のLinuxやUNIXコンピューター上のファイルシステムをマウントするのに使うんだ。 |
| ntfs | Windows NTファイルシステムだね。 |
| xfs | 元々はSilicon Graphicsが開発した高性能ファイルシステムで、大きなファイルの扱いにとても優れてるんだ。 |
| gfs2 | 共有ディスクファイルシステムの一種だよ。複数のコンピューターがCIFSやNFSのようなネットワークファイルシステム層を介さずに、共通の共有ディスクを使えるようにするものだね。 |
man fsと入力して、さらに詳しいLinuxファイルシステム関連の情報を知ることができるよ。
12.4.2 スワップ領域を起動しよう
| |
もし/etc/fstabにスワップパーティション関連の項目を追加しているなら、例えばこうだね:
/var/opt/myswap swap swap defaults 0 0
swapon -aで有効にできるよ。
12.4.3 スワップ領域を無効にしよう
swapoff /var/opt/myswap
12.4.4 fstabファイルを使ってマウント可能なファイルシステムを定義しよう
12.2.3で説明済みだけど、2番目のフィールドはデバイス名ではなくUUIDを使ってもいいんだ。デバイス名は変わる可能性があるからね。
UUIDを確認するには:blkid
12.4.5 mountコマンドを使ってファイルシステムをマウントしよう
これも12.2.3で説明済みだよ。
12.4.6 ループバック方式でディスクイメージをマウントしよう
つまりISOイメージファイルをマウントするってことだね。
| |
12.4.7 umountコマンドを使おう
デバイスパーティション名かディレクトリ名を入力できるよ。
デバイスパーティション名なら:umount /dev/sdb1
ディレクトリ名なら:umount /mnt/tmp
通常は、ディレクトリ名を使うのがいいよ。
もしディレクトリが使用中でアンマウントできない場合は、こうできるよ:
遅延アンマウント:
umount -l強制アンマウント:
umount -f
12.5 Cockpitを使ってストレージを管理しよう
GUIだよ。起動の仕方は第8章を見てね。