Linuxでディスクをマウントする:lsblk、パーティション、mkfs、mount、fstab
Linux でのディスクのマウントとは、パーティションのファイルシステムを、ディレクトリツリーの任意のディレクトリ(例:/data)に接続することです。新しいディスクは lsblk で見つけ、fdisk または parted でパーティションを作成し、mkfs.ext4 でフォーマットして、mount /dev/sdb1 /data でマウントします。再起動後も自動で接続されるように、UUID を使った行を /etc/fstab に追加し、mount -a で確認します。
Linux にはドライブ文字がありません。すべてのストレージデバイスは、/ から始まる1つのディレクトリツリーに組み込まれます。ディスクのマウントとは、パーティションのファイルシステムを空のディレクトリ(マウントポイント)に「取り付ける」操作です。新しいディスクの手順は常に同じです。デバイスを見つけ(lsblk)、パーティションを作成し(fdisk または parted)、ファイルシステムを作り(mkfs)、マウントし(mount)、/etc/fstab に登録します。各ステップを見ていき、df と du で容量がどこに消えたのかを確認する方法も紹介します。
Linux のディスクとパーティションの仕組み
カーネルは各ディスクを /dev にあるデバイスファイルとして扱います。名前は接続方式によって異なります。
| 名前 | 内容 | パーティション |
|---|---|---|
/dev/sda、/dev/sdb | SATA、SAS、USB のディスク。多くの仮想ディスク | /dev/sda1、/dev/sda2 |
/dev/vda | KVM 仮想マシンの virtio ディスク | /dev/vda1 |
/dev/nvme0n1 | NVMe SSD | /dev/nvme0n1p1 |
/dev/mapper/... | LVM の論理ボリュームや暗号化ボリューム | — |
ディスクはパーティションに分割され、パーティションにファイルシステム(ext4、xfs、btrfs)を作成し、そのファイルシステムをディレクトリにマウントします。マウントされていないパーティションは、ディスクが物理的に接続されていても中のファイルにアクセスできません。
ディスクを確認する:lsblk と blkid
ディスク作業の最初のコマンドは lsblk です。デバイスのツリー、サイズ、マウントポイントを表示します。
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 39G 0 part /
sdb 8:16 0 100G 0 disk
ここでは sdb が、パーティションもマウントポイントもない 100 GB の新しいディスクであることが分かります。便利なオプションは次のとおりです。
lsblk -f:各パーティションのファイルシステムの種類、ラベル、UUID を表示。lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT,MODEL:必要な列だけを表示。sudo blkid:すべてのパーティションの UUID とファイルシステムの種類。sudo fdisk -l:すべてのディスクのパーティションテーブルをセクタ単位で表示。
仮想マシンにディスクを稼働中に追加したのに lsblk に表示されない場合は、カーネルにバスの再スキャンを指示します:echo "- - -" | sudo tee /sys/class/scsi_host/host*/scan。
パーティションの作成:fdisk と parted
パーティションを作成する前に、対象のデバイスを正しく選んだか、もう一度確認してください。パーティションテーブルをシステムディスクに書き込むと、データが失われます。lsblk の出力でサイズと、マウントポイントがないことを確認してください。
GPT か MBR か
新しいディスクには GPT を使います。GPT は 2 TB を超えるディスクと最大 128 個のパーティションに対応します。MBR(dos)は、BIOS 起動が必要な古いシステムでブートローダーが要求する場合にだけ使います。
fdisk による作成
最近の fdisk は GPT と MBR の両方に対応しています。対話形式で操作します。
$ sudo fdisk /dev/sdb
Command (m for help): g # 空の GPT テーブルを作成
Command (m for help): n # 新しいパーティション
Partition number (1-128, default 1): Enter
First sector: Enter
Last sector, +/-sectors or +/-size{K,M,G,T,P}: Enter # ディスク全体
Command (m for help): w # 変更を書き込んで終了
w を入力するまでディスクには何も書き込まれないので、q で変更せずに終了できます。
parted による1行での作成
スクリプトでは、対話なしで動く parted が便利です。
$ sudo parted -s /dev/sdb mklabel gpt
$ sudo parted -s /dev/sdb mkpart primary ext4 0% 100%
$ lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sdb 8:16 0 100G 0 disk
└─sdb1 8:17 0 100G 0 part
パーセント指定の境界は、パーティションのアライメントを正しく保ちます。新しいパーティションが表示されない場合は、sudo partprobe /dev/sdb を実行して、カーネルにパーティションテーブルを再読み込みさせてください。
ファイルシステムの作成:mkfs
パーティションは、ブロックの連続した範囲にすぎません。ファイルを保存するには、その上にファイルシステムを作成します。
$ sudo mkfs.ext4 -L data /dev/sdb1
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 26214144 4k blocks and 6553600 inodes
...
Writing superblocks and filesystem accounting information: done
-L はラベルを付けます。後で分かりやすくなります。ファイルシステムの選び方は次のとおりです。
| ファイルシステム | コマンド | 向いている用途 |
|---|---|---|
| ext4 | mkfs.ext4 | 標準的な既定の選択。縮小も可能 |
| XFS | mkfs.xfs | 大容量ファイルとボリューム。RHEL の標準。拡張のみ可能 |
| Btrfs | mkfs.btrfs | スナップショット、圧縮、サブボリューム |
| vfat/exFAT | mkfs.vfat、mkfs.exfat | Windows や macOS とやり取りする USB メモリ |
mkfs はパーティション上のすべてを消去します。空のパーティションでも確認は求められないので、デバイス名を必ず再確認してください。
mount でディスクをマウントする
マウントポイントとなるディレクトリを作成し、そこにパーティションを接続します。
$ sudo mkdir -p /data
$ sudo mount /dev/sdb1 /data
$ df -h /data
Filesystem Size Used Avail Use% Mounted on
/dev/sdb1 98G 24K 93G 1% /data
ファイルシステムの種類は mount が自動で判定しますが、mount -t xfs のように明示することもできます。マウントポイントに既存のファイルがあった場合、マウント後も削除されるわけではありません。新しいファイルシステムの下に隠れ、アンマウントすると再び見えるようになります。
マウントオプション
オプションは -o の後にカンマ区切りで指定します。
ro/rw:読み取り専用、または読み書き可能。noatime:読み取りのたびにアクセス時刻を更新しない。無駄な書き込みが減る。noexec:このパーティションからのプログラムの実行を禁止(/tmpやダウンロード用ディレクトリに有効)。nosuid、nodev:SUID ビットとデバイスファイルを無視。remount:アンマウントせずにオプションを変更。例:sudo mount -o remount,ro /data。
どのファイルシステムがどのオプションでマウントされているかは findmnt で確認できます。例:findmnt /data や findmnt -t ext4。
マウントしたディスクの権限
新しい ext4 のルートディレクトリは root が所有しているため、一般ユーザーは書き込めません。マウント後に、必要なユーザーにディレクトリを渡してください。例:sudo chown alice:alice /data。vfat や exFAT には Unix の権限がないため、所有者はマウント時に uid=、gid=、umask= のオプションで指定します。
アンマウント:umount と target is busy
取り外しには umount を使います(末尾の n はありません)。デバイス名かディレクトリを指定します。
$ sudo umount /data
umount: /data: target is busy.
このエラーは、そのファイルシステム上のファイルを開いているプロセスがあるか、そこを作業ディレクトリにしているプロセスがあることを意味します。よくあるのは cd /data の後のターミナル自体です。原因を探すには次のコマンドを使います。
$ sudo lsof +f -- /data
$ sudo fuser -vm /data
プロセスを停止するか、ディレクトリから出てから、もう一度実行してください。最後の手段は umount -l(lazy)です。ファイルシステムはすぐにツリーから外れ、プロセスがファイルを閉じた時点で実際に解放されます。
起動時の自動マウント:/etc/fstab
mount コマンドの効果は再起動までです。ディスクを自動で接続するには、/etc/fstab に行を追加します。パーティションは /dev/sdb1 のような名前ではなく UUID で指定してください。ディスクを追加するとデバイス名の順番が変わることがありますが、UUID は変わりません。
$ sudo blkid /dev/sdb1
/dev/sdb1: LABEL="data" UUID="3f1c9a2e-7b5d-4c1e-9a8f-2d6e4b0c1a77" TYPE="ext4" PARTUUID="..."
行は6つのフィールドで構成されます。
# <デバイス> <マウントポイント> <種類> <オプション> <dump> <fsck>
UUID=3f1c9a2e-7b5d-4c1e-9a8f-2d6e4b0c1a77 /data ext4 defaults,noatime 0 2
| フィールド | 意味 |
|---|---|
| デバイス | UUID=...、LABEL=...、またはパス |
| マウントポイント | マウント先のディレクトリ(存在している必要がある) |
| 種類 | ext4、xfs、swap、nfs など |
| オプション | defaults に必要なもの(noatime、nofail など)を追加 |
| dump | ほぼ常に 0 |
| fsck | 検査の順序。ルートは 1、それ以外は 2、検査しない場合は 0 |
再起動の前に fstab を必ず確認する
/etc/fstab に誤りがあると、起動時にシステムが緊急モードで止まることがあります。コンソールがないクラウドのサーバーでは、これは深刻な問題です。編集した直後に次を実行してください。
$ sudo findmnt --verify
$ sudo systemctl daemon-reload
$ sudo mount -a
$ findmnt /data
mount -a は、fstab の中でまだマウントされていないものをすべてマウントし、問題があればすぐに表示します。取り外し可能なディスクやネットワークドライブには nofail を付けてください。デバイスがなくても、起動は続行されます。systemd では fstab の各行が .mount ユニットになります。たとえば data.mount で、状態は systemctl status data.mount で確認できます。
空き容量を確認する:df
df は、マウントされたファイルシステムの使用状況を表示します。
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 39G 37G 1.1G 98% /
/dev/sda1 974M 180M 727M 20% /boot
/dev/sdb1 98G 24K 93G 1% /data
-h:サイズを読みやすい単位で表示。-T:ファイルシステムの種類の列を追加。-i:inode の数を表示。小さなファイルを大量に作ると、空きギガバイトがあっても容量不足になることがあります。-x tmpfs -x devtmpfs:仮想ファイルシステムを隠す。
Size が Used + Avail と一致しない理由は、ext4 がルートユーザー用に約 5% の領域を予約しているためです。これにより、ディスクがいっぱいでもシステムは動き続けられます。データ用のパーティションでは、この予約を減らせます。例:sudo tune2fs -m 1 /dev/sdb1。
容量はどこに消えたのか:du
df はディスクが満杯だと教えてくれますが、何が使っているかは分かりません。そこで du を使います。du はディレクトリごとにファイルのサイズを合計します。
$ sudo du -sh /var/log
4.2G /var/log
$ sudo du -xh --max-depth=1 / 2>/dev/null | sort -rh | head
37G /
21G /var
9.8G /home
3.1G /usr
-s:ディレクトリごとの合計のみ。-aはファイルごとに表示。--max-depth=1(または-d 1):1 階層だけ表示。最も大きいディレクトリを選んで、さらに深く調べます。-x:別のファイルシステムに入らない。指定しないと、/data、/proc、ネットワークドライブも合計に含まれます。sort -rh:読みやすいサイズで並べ替え。最も大きいものが上に来ます。
個々の大きなファイルを探すなら find の方が便利です。例:sudo find / -xdev -type f -size +1G -exec ls -lh {} +。
df は満杯なのに du では見つからない
よくある状況は、大きなログを削除したのに容量が戻らない場合です。ファイルはディレクトリから消えていても、プロセス(たとえば Web サーバー)がまだ開いたままなので、ブロックが解放されていません。そのようなファイルは次のコマンドで探せます。
$ sudo lsof +L1
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NLINK NODE NAME
nginx 812 www 5w REG 8,2 8589934592 0 13054 /var/log/nginx/access.log (deleted)
プロセスを再起動するか、ログを開き直すように指示すると、容量が戻ります。今後は、使用中のログを削除せずに空にしてください。例:sudo truncate -s 0 /var/log/nginx/access.log。もう1つの原因は、マウントポイントの下に隠れたファイルです。これらはルートのパーティションの容量を使いますが、その上にファイルシステムがマウントされている間は du から見えません。
よくあるエラーと対処
| メッセージ | 原因 | 対処 |
|---|---|---|
mount point /data does not exist | ディレクトリがない | sudo mkdir -p /data |
wrong fs type, bad option, bad superblock | パーティションにファイルシステムがない、種類が違う、またはドライバーがない | lsblk -f で確認。exFAT や NTFS なら exfatprogs や ntfs-3g をインストール |
only root can do that | sudo なしでマウントした | sudo で実行するか、fstab に user オプションを追加 |
target is busy | ディレクトリをプロセスが使用中 | lsof や fuser で調べ、ディレクトリから出る |
| 緊急モードで起動する | fstab の誤り、またはディスクがない | root でログインして fstab を修正し、nofail を追加 |
手順例:データ用の新しいディスク
lsblk:新しいディスク(例:/dev/sdb)を見つける。sudo parted -s /dev/sdb mklabel gpt mkpart primary ext4 0% 100%:パーティションを作成する。sudo mkfs.ext4 -L data /dev/sdb1:ファイルシステムを作成する。sudo mkdir -p /data:マウントポイントを作成する。sudo blkid /dev/sdb1:UUID を調べ、/etc/fstabに行を追加する。sudo mount -a && df -h /data:マウントして確認する。sudo chown ユーザー: /data:権限を設定する。
サービスを止めずに容量を増やしたい場合や、複数のディスクをまとめたい場合は、通常のパーティションの代わりに LVM を使います。ディスクを物理ボリュームにし、そこから論理ボリュームを切り出します。論理ボリュームは lvextend -r で拡張できます。
まとめ
Linux でのディスクのマウントは、lsblk → パーティション作成 → mkfs → mount → /etc/fstab という流れです。パーティションは UUID で指定し、再起動の前に mount -a で fstab を確認し、任意のディスクには nofail を使いましょう。容量が足りなくなったら、df -h でどのパーティションがいっぱいかを確認し、du -xh --max-depth=1 | sort -rh と lsof +L1 で何が使っているのかを調べます。ディスク、パーティション、スワップ、LVM、RAID は、Linux コースで実践しながら解説しています。
よくある質問
Linux で USB メモリをマウントするには?
lsblk で場所を確認します(通常は /dev/sdb1)。ディレクトリを作成して sudo mount /dev/sdb1 /mnt/usb を実行します。グラフィカル環境では、USB メモリは /media/ユーザー名 や /run/media に自動でマウントされることが多いです。
ISO イメージをマウントするには?
sudo mount -o loop,ro image.iso /mnt/iso を実行します。loop オプションはファイルをブロックデバイスとして接続します。取り外しは通常の umount で行います。
fstab でネットワーク共有をマウントするには?
NFS の場合は server:/export /mnt/nfs nfs defaults,_netdev,nofail 0 0 のように書きます。SMB の場合は //server/share /mnt/smb cifs credentials=/root/.smbcred,_netdev,nofail 0 0 のように書きます。_netdev オプションは、ネットワークが起動するまで待つ指定です。
UUID と PARTUUID の違いは何ですか?
UUID はファイルシステムに属し、mkfs をやり直すと変わります。PARTUUID は GPT テーブル内のパーティションに属し、再フォーマットしても変わりません。fstab では通常 UUID を使います。
ファイルシステムにエラーがないか確認するには?
パーティションをアンマウントしてから、ext4 なら sudo fsck -f /dev/sdb1、XFS なら sudo xfs_repair /dev/sdb1 を実行します。マウントされたままのファイルシステムを書き込み可能な状態で検査すると、データを壊すおそれがあるので行わないでください。