Linux eject 命令 - 弹出可移动介质

eject 命令用于弹出可移动介质,如CD/DVD光盘、USB设备、软盘驱动器等。它不仅可以物理弹出设备,还可以在逻辑上卸载已挂载的设备,是管理可移动存储设备的重要工具。

支持的可移动介质类型
  • CD/DVD 驱动器:包括CD-ROM、DVD-ROM、蓝光驱动器
  • USB 存储设备:U盘、移动硬盘、读卡器等
  • 软盘驱动器:传统的3.5英寸或5.25英寸软驱
  • 磁带驱动器:SCSI或IDE接口的磁带机
  • 可移动磁盘:Zip驱动器、Jaz驱动器等

语法格式

eject [选项] [设备名]

如果不指定设备名,默认使用/dev/cdrom或第一个可弹出设备。

常用选项

选项 说明
-h--help 显示帮助信息
-v--verbose 详细模式,显示更多信息
-d--default 列出默认设备名
-a on|off|1|0 启用/禁用自动弹出模式
-c 编号 选择CD-ROM驱动器槽位(如果有多个)
-t--trayclose 关闭光盘托盘
-T--traytoggle 切换光盘托盘状态(开/关)
-x 速度 设置CD-ROM的读取速度
-n--noop 不执行操作,只显示将执行的操作
-r--cdrom 以CD-ROM形式弹出
-s--scsi 以SCSI设备形式弹出
-f--floppy 以软盘形式弹出
-q--tape 以磁带设备形式弹出

识别可弹出设备

# 查看默认的弹出设备
eject -d

# 查看所有块设备(包括可移动设备)
lsblk

# 查看SCSI设备列表
lsscsi

# 查看系统中的CD/DVD驱动器
ls -l /dev/cdrom*
ls -l /dev/sr*

# 使用udevadm查看设备信息
udevadm info --query=all --name=/dev/sr0

基本示例

示例1:弹出默认CD/DVD驱动器

# 弹出默认CD/DVD驱动器(通常是/dev/cdrom)
eject

# 使用完整路径弹出特定CD/DVD驱动器
eject /dev/cdrom
eject /dev/sr0

对于大多数系统,/dev/cdrom/dev/sr0的符号链接。

示例2:弹出USB设备

# 首先查找USB设备名
lsblk

# 假设USB设备是/dev/sdb1,先卸载它
sudo umount /dev/sdb1

# 然后弹出设备
sudo eject /dev/sdb

# 或者使用设备挂载点
sudo eject /media/usb-drive

lsblk输出示例:

NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 465.8G  0 disk
├─sda1   8:1    0   512M  0 part /boot/efi
└─sda2   8:2    0 465.3G  0 part /
sdb      8:16   1  14.9G  0 disk
└─sdb1   8:17   1  14.9G  0 part /media/usb-drive
sr0     11:0    1  1024M  0 rom

示例3:关闭光盘托盘

# 关闭已打开的光盘托盘
eject -t

# 或使用长选项
eject --trayclose

示例4:切换光盘托盘状态

# 切换托盘状态(如果打开则关闭,如果关闭则打开)
eject -T

# 或使用长选项
eject --traytoggle

高级用法

示例5:启用/禁用自动弹出

# 启用自动弹出模式(某些设备支持)
eject -a on
eject -a 1

# 禁用自动弹出模式
eject -a off
eject -a 0

自动弹出模式允许在设备卸载后自动物理弹出介质。

示例6:使用设备挂载点而非设备文件

# 如果设备已挂载,可以使用挂载点而不是设备文件
sudo eject /mnt/cdrom
sudo eject /media/username/DRIVE_NAME

示例7:设置CD-ROM读取速度

# 设置CD-ROM的最大读取速度(以KB/s为单位)
eject -x 52 /dev/cdrom  # 52x CD-ROM速度

# 设置较低的读取速度以降低噪音
eject -x 24 /dev/cdrom  # 24x CD-ROM速度

示例8:测试模式(不执行实际操作)

# 查看eject命令将执行什么操作,但不实际执行
eject -n /dev/cdrom
eject --noop /dev/sdb1

实际应用场景

场景1:安全移除USB设备脚本
#!/bin/bash
# safe_eject.sh - 安全移除USB设备

DEVICE=$1
MOUNT_POINT=$(mount | grep "$DEVICE" | awk '{print $3}')

if [ -z "$MOUNT_POINT" ]; then
    echo "设备 $DEVICE 未挂载"
    sudo eject $DEVICE
else
    echo "正在卸载 $MOUNT_POINT ..."
    sudo umount $MOUNT_POINT

    if [ $? -eq 0 ]; then
        echo "卸载成功,正在弹出设备..."
        sudo eject $DEVICE
    else
        echo "卸载失败,设备可能正在使用中"
        echo "请关闭使用该设备的程序后重试"
        exit 1
    fi
fi
场景2:自动备份光盘内容后弹出
#!/bin/bash
# backup_and_eject.sh - 备份光盘内容后弹出

CDROM="/dev/cdrom"
BACKUP_DIR="/backup/cdrom_$(date +%Y%m%d_%H%M%S)"
ISO_FILE="$BACKUP_DIR/disk.iso"

# 创建备份目录
mkdir -p "$BACKUP_DIR"

# 检查是否有光盘
if [ -b $CDROM ]; then
    echo "检测到光盘,正在创建ISO镜像..."

    # 创建光盘镜像
    dd if=$CDROM of="$ISO_FILE" bs=2048

    if [ $? -eq 0 ]; then
        echo "备份完成,文件保存在: $ISO_FILE"

        # 弹出光盘
        eject $CDROM
        echo "光盘已弹出"
    else
        echo "备份失败"
        exit 1
    fi
else
    echo "未检测到光盘"
    exit 1
fi
场景3:监控并自动弹出空白光盘
#!/bin/bash
# auto_eject_blank.sh - 检测并弹出空白光盘

CDROM="/dev/cdrom"
CHECK_INTERVAL=30  # 检查间隔(秒)

while true; do
    # 尝试挂载光盘
    mount $CDROM /mnt/cdrom 2>/dev/null

    if [ $? -ne 0 ]; then
        echo "$(date): 检测到空白或无法读取的光盘"
        eject $CDROM
        echo "$(date): 已弹出光盘"
    else
        # 如果成功挂载,卸载它
        umount /mnt/cdrom
    fi

    sleep $CHECK_INTERVAL
done

图形界面替代工具

桌面环境中的弹出工具

大多数Linux桌面环境提供了图形化的设备弹出工具:

  • GNOME/GDM:文件管理器中右键点击设备 → 弹出
  • KDE/Plasma:设备通知器 → 安全移除
  • XFCE:Thunar文件管理器 → 卸载设备
  • Nautilus:GNOME默认文件管理器中的弹出按钮
  • Dolphin:KDE默认文件管理器中的弹出选项

在终端中,也可以使用udisksctl命令:udisksctl unmount -b /dev/sdb1 && udisksctl power-off -b /dev/sdb

注意事项

  • 权限问题:弹出设备通常需要root权限,普通用户可能只能弹出CD/DVD驱动器
  • 设备忙:如果设备正在使用中(文件被打开,进程正在访问),eject命令会失败
  • 安全移除:对于USB设备,建议先使用umount卸载文件系统,再使用eject弹出
  • 物理弹出:某些设备(如没有托盘的吸入式光驱)可能不支持物理弹出功能
  • 设备名称:设备名称可能因系统配置而异,使用lsblk确认正确的设备名
  • 虚拟设备:虚拟机中的虚拟CD/DVD驱动器可能不支持所有eject选项

相关命令

  • umount:卸载文件系统(eject会自动尝试卸载)
  • mount:挂载文件系统
  • lsblk:列出块设备信息
  • udisksctl:udisks命令行工具,用于管理存储设备
  • dd:创建光盘镜像
  • mkisofs/genisoimage:创建ISO光盘镜像
  • wodim/cdrecord:刻录光盘

常见问题与故障排除

# 1. "设备忙"错误
# 检查哪些进程正在使用设备
sudo lsof /dev/cdrom
sudo fuser -m /mnt/cdrom

# 结束使用设备的进程
sudo fuser -k /mnt/cdrom

# 2. 权限不足错误
# 使用sudo或以root身份运行
sudo eject /dev/cdrom

# 3. 设备未找到错误
# 确认设备存在
ls -l /dev/cdrom
lsblk

# 4. USB设备无法安全移除
# 先卸载再弹出
sudo umount /dev/sdb1
sudo eject /dev/sdb

# 5. 光盘托盘无法关闭
# 强制关闭(如果有物理按钮,可能需要手动关闭)
eject -t
# 或者尝试多次切换
eject -T && sleep 1 && eject -T

# 6. 吸入式光驱问题
# 某些吸入式光驱需要特殊处理
eject -i on /dev/cdrom  # 有些版本支持-i选项
硬件兼容性说明

eject命令依赖于硬件的ATAPI/SCSI命令支持。大多数现代设备都能良好工作,但某些旧设备或特殊设备可能需要:

  • IDE/ATAPI设备:通常通过/dev/hdX/dev/cdrom访问
  • SCSI/SATA设备:通常通过/dev/srX/dev/scdX访问
  • USB设备:作为SCSI设备处理,通过/dev/sdX访问
  • 虚拟设备:虚拟机中的设备可能限制部分功能