0
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でインタラクティブにデバイス(ボリューム)をマウント/アンマウント操作するShellスクリプト

Posted at

Volume Manager Script

Linux システム上のブロックデバイス(ボリューム)を一覧表示し、インタラクティブに マウント / アンマウント操作 を行うためのツール

機能概要

主な処理内容

  1. ボリューム一覧の取得
    • lsblk コマンドを用いて、デバイス名・ラベル・ファイルシステム・マウント先・サイズなどを取得
    • 各ボリュームを番号付きで表示
  2. ユーザー選択による操作
    • 表示された一覧から操作対象を番号で選択
    • 選択後、対象ボリュームの詳細情報(ラベル・ファイルシステム・マウント状態など)を表示
  3. マウント操作
    • 未マウントのボリュームを選択した場合、マウントするかどうかを確認
    • デフォルトのマウント先は /mnt/<デバイス名> (変更可能)。
    • すでに使用中のマウントポイントやマウント済みデバイスは検出して警告を出す
    • 成功時には ✅ メッセージを、失敗時には ❌ と dmesg の確認方法を案内
  4. アンマウント操作
    • マウント済みのボリュームを選択した場合、アンマウントするかどうかを確認
    • 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 変数を用いて各コマンドの終了コードを追跡
  • returnexit の両対応で、関数実行・直接実行の両ケースに対応
  • 日本語メッセージでユーザーフレンドリーなインタラクティブ操作を実現

コード本体

#!/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
0
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
0
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?