Volume Manager Script
Linux システム上のブロックデバイス(ボリューム)を一覧表示し、インタラクティブに マウント / アンマウント操作 を行うためのツール
機能概要
主な処理内容
- ボリューム一覧の取得
-
lsblkコマンドを用いて、デバイス名・ラベル・ファイルシステム・マウント先・サイズなどを取得 - 各ボリュームを番号付きで表示
-
- ユーザー選択による操作
- 表示された一覧から操作対象を番号で選択
- 選択後、対象ボリュームの詳細情報(ラベル・ファイルシステム・マウント状態など)を表示
- マウント操作
- 未マウントのボリュームを選択した場合、マウントするかどうかを確認
- デフォルトのマウント先は
/mnt/<デバイス名>(変更可能)。 - すでに使用中のマウントポイントやマウント済みデバイスは検出して警告を出す
- 成功時には ✅ メッセージを、失敗時には ❌ と
dmesgの確認方法を案内
- アンマウント操作
- マウント済みのボリュームを選択した場合、アンマウントするかどうかを確認
-
sudo umount実行後、結果を表示し、エラー内容を/tmp/umount_error.logに保存
使用方法
# bash volume_manager.sh
source volume_manager.sh
実行すると、次のようなフローで操作
=== ボリューム一覧 ===
[ 1] /dev/sda1 なし ext4 / 合計:100G 空き:20G
[ 2] /dev/sdb1 USB_DRIVE vfat (未マウント) 合計:32G 空き:N/A
...
操作するボリューム番号を入力(何も入力しないと終了): 2
その後、選択したボリュームの状態に応じてマウントまたはアンマウント操作を確認
依存コマンド
このスクリプトは以下のコマンドを利用
| コマンド | 役割 |
|---|---|
lsblk |
ブロックデバイス情報の取得 |
df |
使用量・空き容量の取得 |
awk, sed, eval
|
テキスト整形 |
sudo, mount, umount
|
マウント操作 |
mkdir, rmdir
|
マウントポイントの作成・削除 |
権限について
- マウント・アンマウントには 管理者権限(sudo) が必要
- 通常ユーザーで実行する場合でも、プロンプトで
sudoパスワード入力を求められる
エラーハンドリング
- ボリュームが存在しない場合は安全に終了
- マウントポイントの競合や既存マウントを検出して警告を出す
- マウント失敗時はログ出力 (
dmesg | tail -n 10) の確認を促す - 空ディレクトリを自動削除するオプションも提供
互換性
| 環境 | 動作確認 |
|---|---|
| Ubuntu / Debian 系 | ✅ |
| RHEL / CentOS 系 | ✅ |
| macOS | ⚠️ 一部コマンド非対応(lsblk, mountpoint など) |
macOS での使用には GNU coreutils 等の追加インストールが必要かも(未検証)
終了方法
- ボリューム番号を入力せずに Enter を押すと安全に終了
- どの段階でも
Ctrl + Cにより中断可能
メモ
-
rc変数を用いて各コマンドの終了コードを追跡 -
returnとexitの両対応で、関数実行・直接実行の両ケースに対応 - 日本語メッセージでユーザーフレンドリーなインタラクティブ操作を実現
コード本体
#!/bin/bash
echo "=== ボリューム一覧 ==="
volumes=$(lsblk -P -o NAME,LABEL,FSTYPE,MOUNTPOINT,SIZE)
if [ -z "$volumes" ]; then
echo "ボリュームが見つかりません。"
return 0 2>/dev/null || exit 0
fi
i=1
while IFS= read -r line; do
eval "$line"
dev="/dev/$NAME"
label="${LABEL:-なし}"
fstype="${FSTYPE:-不明}"
mountpoint="${MOUNTPOINT:-}"
size="${SIZE:-不明}"
if [ -n "$mountpoint" ]; then
used_info=$(df -h "$mountpoint" 2>/dev/null | awk 'NR==2 {print $2, $4}')
total_size=$(echo "$used_info" | awk '{print $1}')
avail_size=$(echo "$used_info" | awk '{print $2}')
else
total_size="$size"
avail_size="N/A"
mountpoint="(未マウント)"
fi
printf "[%2d] %-22s %-10s %-10s %-15s 合計:%-7s 空き:%-7s\n" \
"$i" "$dev" "$label" "$fstype" "$mountpoint" "$total_size" "$avail_size"
i=$((i + 1))
done <<< "$volumes"
echo
echo -n "操作するボリューム番号を入力(何も入力しないと終了): "
read num
if [[ -z "$num" || ! "$num" =~ ^[0-9]+$ ]]; then
echo "終了します。"
return 0 2>/dev/null || exit 0
fi
target=$(echo "$volumes" | sed -n "${num}p")
if [ -z "$target" ]; then
echo "指定した番号のボリュームが存在しません。"
return 0 2>/dev/null || exit 0
fi
eval "$target"
dev="/dev/$NAME"
label="${LABEL:-なし}"
fstype="${FSTYPE:-不明}"
mountpoint="${MOUNTPOINT:-}"
echo
echo "選択されたボリューム: $dev"
echo "ラベル: $label"
echo "ファイルシステム: $fstype"
echo "マウントポイント: ${mountpoint:-未マウント}"
echo
if [ -z "$mountpoint" ]; then
echo -n "このボリュームをマウントしますか? (y/n): "
read ans
if [ "$ans" = "y" ]; then
default_mnt="/mnt/${NAME}"
echo -n "マウント先ディレクトリを入力してください [既定: ${default_mnt}]: "
read mnt
mnt=${mnt:-$default_mnt}
if mountpoint -q "$mnt"; then
echo "⚠️ マウントポイント $mnt はすでに使用中です。別のディレクトリを指定してください。"
return 0 2>/dev/null || exit 0
fi
if grep -q "^$dev " /etc/mtab; then
echo "⚠️ デバイス $dev はすでにマウント済みです。"
return 0 2>/dev/null || exit 0
fi
sudo mkdir -p "$mnt"
echo "→ マウント先: $mnt"
sudo mount "$dev" "$mnt"
rc=$? # ← status → rc に変更
if [ $rc -eq 0 ]; then
echo "✅ マウント完了: $dev → $mnt"
else
echo "❌ マウントに失敗しました(コード: $rc)"
echo "💡 詳細は 'dmesg | tail -n 10' で確認できます。"
if [ -d "$mnt" ] && [ -z "$(ls -A "$mnt")" ]; then
echo -n "空のマウント先ディレクトリを削除しますか? (y/n): "
read del
if [ "$del" = "y" ]; then
sudo rmdir "$mnt" && echo "🗑️ 削除しました: $mnt"
fi
fi
fi
else
echo "マウントをスキップしました。"
fi
else
echo -n "このボリュームをアンマウントしますか? (y/n): "
read ans
if [ "$ans" = "y" ]; then
sudo umount "$dev" 2>/tmp/umount_error.log
rc=$? # ← ここも rc に変更
if [ $rc -eq 0 ]; then
echo "✅ アンマウント完了: $dev"
else
echo "❌ アンマウントに失敗しました。"
echo "💡 詳細: $(cat /tmp/umount_error.log)"
fi
else
echo "アンマウントをスキップしました。"
fi
fi