Linux常见设备

linux上设备的分类?

设备分两种,字符设备和块设备。

  • 块设备(Block Device):以固定大小数据块访问的设备(如磁盘、SSD),通常挂载后使用。

  • 字符设备(Character Device):按字符流访问的设备(如键盘、串口),无需挂载。

怎么查看系统的所有设备?

通过 /dev 目录查看

  • /dev 是Linux系统中设备文件的默认目录,包含所有已识别的块设备和字符设备。

  • 运行以下命令列出所有设备:

    bash

复制代码
ls -l /dev
  • 若要区分类型:

    • 块设备 (如磁盘、分区)显示为 b,例如:

      bash

    • ls -l /dev/sd* /dev/nvme* # 查看常见的块设备(SCSI/SATA/NVMe磁盘)

  • 字符设备 (如终端、串口)显示为 c,例如:

    bash

复制代码
    ls -l /dev/tty* /dev/input/*  # 查看终端和输入设备

怎么查看系统挂载了那些设备?

1. 使用 mount 命令

最直接的方式是运行 mount 命令,它会列出所有当前挂载的文件系统(包括磁盘、分区、虚拟文件系统等):

bash

复制代码
mount

或格式化输出:

bash

复制代码
mount -l

输出示例

复制代码
/dev/sda2 on / type ext4 (rw,relatime)
/dev/sdb1 on /mnt/data type xfs (rw,noatime)
tmpfs on /run type tmpfs (rw,nosuid,nodev)

2. 查看 /proc/mounts 文件

Linux内核会将挂载信息实时记录到 /proc/mounts 中:

bash

复制代码
cat /proc/mounts

此文件内容与 mount 命令类似,但格式更机器友好(每行包含设备、挂载点、文件系统类型、挂载选项等)。

3. 使用 df 命令(查看磁盘使用情况附带挂载点)

df 命令主要用于显示磁盘空间使用情况,但也会列出挂载点:

bash

复制代码
df -hT

参数说明

  • -h:人类可读的容量单位(如 GB/MB)。

  • -T:显示文件系统类型。
    输出示例

复制代码
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/sda2      ext4       50G   20G   28G  42% /
/dev/sdb1      xfs       100G   30G   70G  30% /mnt/data

4. 使用 findmnt 命令(推荐)

findmntutil-linux 包提供的工具,能以树形结构清晰展示挂载关系:

bash

复制代码
findmnt

或指定设备名:

bash

复制代码
findmnt /dev/sda1

输出示例

复制代码
TARGET    SOURCE         FSTYPE OPTIONS
/         /dev/sda2     ext4   rw,relatime
├─/boot   /dev/sda1     vfat   rw,fmask=0022
└─/mnt    /dev/sdb1     xfs    rw,noatime

5. 查看 /etc/fstab/etc/mtab

  • /etc/fstab:系统启动时自动挂载的静态配置(不一定是当前已挂载的):

    bash

复制代码
cat /etc/fstab
  • /etc/mtab :当前已挂载的文件系统(动态更新,内容与 mount 命令一致):

    bash

复制代码
cat /etc/mtab

6. 过滤特定类型的挂载设备

  • 只显示物理设备(排除虚拟文件系统)

    bash

复制代码
mount | grep '^/dev'
  • 只显示 tmpfsnfs 等特定类型

    bash

复制代码
mount -t tmpfs,nfs

怎么查看系统加载了那些设备驱动?

通过 /proc/devices 查看已加载的设备驱动

  • 该文件列出了内核已识别的块设备和字符设备(按设备号分类):

    bash

复制代码
cat /proc/devices

输出示例:

复制代码
Character devices:
 1 mem
 4 /dev/vc/0
Block devices:
 8 sd

怎么卸载设备?

在 Linux 中卸载(卸载)设备通常指 卸载(umount)已挂载的文件系统安全移除硬件设备(如 USB、磁盘)。

1. 卸载文件系统(umount)

(1) 基本卸载命令

bash

复制代码
sudo umount <挂载点或设备>

示例

bash

复制代码
sudo umount /mnt/usb      # 通过挂载点卸载
sudo umount /dev/sdb1     # 通过设备名卸载

(2) 如果卸载失败(target is busy

设备可能被某个进程占用,解决方法:

① 查找占用进程并结束

bash

复制代码
sudo lsof +f -- <挂载点或设备>   # 查看占用进程
sudo fuser -vm <挂载点或设备>    # 查看占用进程(更简洁)

结束进程

bash

复制代码
sudo kill -9 <PID>                # 强制结束单个进程
sudo fuser -km <挂载点或设备>     # 结束所有相关进程
② 延迟卸载(Lazy Unmount)

强制卸载,等设备不再使用时自动卸载:

bash

复制代码
sudo umount -l <挂载点或设备>

2. 安全移除硬件设备(如 USB、磁盘)

(1) 确保设备未被占用

bash

复制代码
sudo sync   # 确保所有数据写入设备
sudo umount /dev/sdb1  # 卸载文件系统

(2) 使用 udisksctl(适用于桌面环境)

bash

复制代码
udisksctl unmount -b /dev/sdb1      # 卸载
udisksctl power-off -b /dev/sdb     # 安全移除(物理断电)

(3) 使用 eject(适用于光驱/USB)

bash

复制代码
sudo eject /dev/sdb     # 弹出设备

3. 卸载 LVM/加密设备

(1) 卸载 LVM 逻辑卷

bash

复制代码
sudo umount /dev/mapper/vg0-lv0   # 先卸载文件系统
sudo vgchange -an vg0             # 停用卷组

(2) 卸载加密设备(LUKS)

bash

复制代码
sudo umount /mnt/encrypted        # 卸载文件系统
sudo cryptsetup close encrypted   # 关闭加密设备

4. 卸载网络文件系统(NFS/CIFS)

bash

复制代码
sudo umount -f /mnt/nfs   # 强制卸载(NFS)
sudo umount -t cifs /mnt/smb  # 卸载 SMB/CIFS

5. 卸载内核模块(驱动)

如果设备关联内核模块(如 USB 驱动):

bash

复制代码
lsmod | grep usb_storage   # 查看相关模块
sudo modprobe -r usb_storage  # 卸载模块(谨慎操作!)

常见问题

Q1: umount 报错 device is busy

  • 使用 lsoffuser 查找占用进程并结束。

  • 仍无法解决?尝试 umount -l(延迟卸载)。

Q2: USB 设备无法安全移除

  • 确保所有文件已关闭,终端未在挂载目录下。

  • 使用 udisksctl power-offeject

Q3: 卸载后设备仍显示(如 /dev/sdb

  • 这是正常的,设备节点仍存在,但数据已同步。

总结

场景 命令
普通卸载 sudo umount /mnt/usbsudo umount /dev/sdb1
强制结束占用进程 sudo fuser -km /mnt/usbsudo lsof +f -- /mnt/usb
延迟卸载 sudo umount -l /mnt/usb
安全移除硬件 udisksctl power-off -b /dev/sdbsudo eject /dev/sdb
卸载 LVM sudo umount /dev/mapper/vg0-lv0sudo vgchange -an vg0
卸载加密设备 sudo umount /mnt/encryptedsudo cryptsetup close encrypted

注意 :卸载前确保数据已同步(sync),避免数据丢失


有哪些特殊的设备?

1. 设备分类

(1) 块设备(Block Device)

  • 特点

    • 按固定大小的数据块(如 512B、4KB)进行读写。

    • 支持随机访问(如磁盘、SSD)。

    • 通常用于存储设备,可以挂载文件系统。

  • 典型设备

    • /dev/sda(SATA/SCSI 磁盘)

    • /dev/nvme0n1(NVMe SSD)

    • /dev/loop0(回环设备,用于挂载镜像文件)

    • /dev/md0(RAID 设备)

(2) 字符设备(Character Device)

  • 特点

    • 按字节流(stream)访问,不支持随机寻址。

    • 通常用于串行通信、终端、输入设备等。

  • 典型设备

    • /dev/tty(终端设备)

    • /dev/null(黑洞设备,丢弃所有写入数据)

    • /dev/zero(提供无限 \0 字节)

    • /dev/random/dev/urandom(随机数生成器)

    • /dev/input/mice(鼠标输入)

2. 特殊设备

除了块设备和字符设备,Linux 还有一些特殊的设备:

(1) 网络设备(Network Device)

  • 特点

    • 不属于 /dev,而是由内核网络子系统管理。

    • 通过 ifconfigip addr 查看。

  • 典型设备

    • eth0(传统以太网卡)

    • wlan0(无线网卡)

    • lo(本地回环设备)

(2) 伪终端设备(PTY, Pseudo Terminal)

  • 特点

    • 模拟终端,用于 SSH、终端仿真器(如 xterm)。
  • 典型设备

    • /dev/pts/0(第一个伪终端)

    • /dev/tty1(第一个虚拟控制台)

(3) 虚拟设备(Virtual Device)

  • 特点

    • 不关联物理硬件,由内核或用户空间程序模拟。
  • 典型设备

    • /dev/null(丢弃所有写入,返回 EOF 读取)

    • /dev/zero(提供无限 \0 字节)

    • /dev/full(写入时返回 ENOSPC 错误,模拟满设备)

    • /dev/random/dev/urandom(随机数生成)

(4) 设备映射器(Device Mapper)

  • 特点

    • 用于 LVM、磁盘加密(LUKS)、快照等高级存储功能。
  • 典型设备

    • /dev/mapper/lvm-root(LVM 逻辑卷)

    • /dev/dm-0(Device Mapper 设备)

(5) 内存设备(Memory Device)

  • 特点

    • 直接操作内存,不涉及磁盘 I/O。
  • 典型设备

    • /dev/mem(直接访问物理内存,危险!)

    • /dev/kmem(访问内核虚拟内存)

    • tmpfs(内存文件系统)

(6) 音频设备(Audio Device)

  • 特点

    • 用于声音输入/输出。
  • 典型设备

    • /dev/snd/*(ALSA 音频设备)

    • /dev/dsp(旧版 OSS 音频设备)

(7) 视频设备(Video Device)

  • 特点

    • 用于摄像头、帧缓冲(framebuffer)。
  • 典型设备

    • /dev/video0(第一个摄像头)

    • /dev/fb0(帧缓冲设备,用于图形显示)

(8) 串口设备(Serial Device)

  • 特点

    • 用于串行通信(如 UART、RS-232)。
  • 典型设备

    • /dev/ttyS0(第一个串口)

    • /dev/ttyUSB0(USB 转串口设备)

3. 如何查看设备类型?

(1) 使用 ls -l /dev 查看设备类型

bash

复制代码
ls -l /dev/sda /dev/tty1 /dev/null

输出示例

复制代码
brw-rw---- 1 root disk 8, 0 May 10 10:00 /dev/sda   # b=块设备
crw-rw-rw- 1 root root 5, 2 May 10 10:00 /dev/pts/0 # c=字符设备
  • b 开头 → 块设备

  • c 开头 → 字符设备

(2) 使用 file 命令

bash

复制代码
file /dev/sda

输出

复制代码
/dev/sda: block special (8/0)  # 块设备

(3) 使用 stat 命令

bash

复制代码
stat /dev/null

输出

复制代码
Device: 5h/5d   Inode: 1       Links: 1 Device type: 1,3
  • Device type 中的 1,3 表示主设备号 1,次设备号 3。

4. 特殊设备的作用

设备 类型 用途
/dev/null 字符设备 丢弃所有写入,读取返回 EOF
/dev/zero 字符设备 提供无限 \0 字节
/dev/random 字符设备 真随机数(可能阻塞)
/dev/urandom 字符设备 伪随机数(不阻塞)
/dev/full 字符设备 写入返回 ENOSPC(模拟磁盘满)
/dev/loop0 块设备 挂载镜像文件(如 ISO)
/dev/mem 字符设备 直接访问物理内存(危险!)
/dev/tty 字符设备 当前进程的控制终端

5. 总结

  • 块设备:用于存储(磁盘、SSD、LVM)。

  • 字符设备:用于流式 I/O(终端、随机数、音频)。

  • 特殊设备

    • /dev/null/dev/zero/dev/random 常用于脚本和编程。

    • 网络设备(eth0wlan0)不由 /dev 管理。

    • 伪终端(/dev/pts/*)用于 SSH 和终端仿真。

    • 虚拟设备(/dev/loop/dev/mapper)用于高级存储管理。

这些设备在 Linux 系统中扮演重要角色,理解它们的用途有助于系统管理和故障排查


怎么查看设备被那个进程使用?

在 Linux 中,如果某个设备(如磁盘、USB、光驱等)正在被进程使用,可能会导致无法卸载(umount 失败)或出现 device is busy 错误。

1. 使用 lsof 命令(推荐)

lsof(List Open Files)可以列出所有打开的文件和设备的进程信息。
语法

bash

复制代码
sudo lsof /dev/<设备名>      # 查看特定设备
sudo lsof <挂载点>          # 查看挂载目录

示例

bash

复制代码
sudo lsof /dev/sdb1         # 查看谁在使用 /dev/sdb1
sudo lsof /mnt/usb          # 查看谁在访问 /mnt/usb

输出示例

复制代码
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
bash    1234 root  cwd    DIR   8,17     4096    2 /mnt/usb
vim     5678 user    4u   REG   8,17     1024    3 /mnt/usb/file.txt
  • COMMAND :进程名(如 bashvim)。

  • PID :进程 ID,可以用 kill -9 <PID> 结束进程。

  • USER:运行该进程的用户。

  • FD :文件描述符(cwd=当前工作目录,mem=内存映射文件等)。

2. 使用 fuser 命令

fuser 可以显示正在使用某个设备或挂载点的进程 PID。
语法

bash

复制代码
sudo fuser -v /dev/<设备名>    # 查看设备
sudo fuser -v <挂载点>        # 查看挂载目录
sudo fuser -vm /mnt/usb      # 显示详细信息

示例

bash

复制代码
sudo fuser -v /dev/sdb1
sudo fuser -vm /mnt/usb

输出示例

复制代码
                     USER        PID ACCESS COMMAND
/mnt/usb:            root     kernel mount /mnt/usb
                     alice    1234 ..c.. bash
  • ACCESS 列:

    • c:当前目录在该挂载点。

    • f:打开的文件在该挂载点。

    • m:内存映射文件(如 lib 库或 mmap 文件)。

结束占用进程

bash

复制代码
sudo fuser -km /mnt/usb    # 强制结束所有占用 /mnt/usb 的进程

3. 使用 lsblk + lsof 结合

如果想查看所有挂载的设备及其占用情况:

bash

复制代码
lsblk                     # 查看块设备
sudo lsof /dev/sdb1       # 查看特定设备的进程

4. 特殊情况:umount 失败时如何查找进程

如果 umount 报错 target is busy,可以:

bash

复制代码
sudo umount -l /mnt/usb   # 延迟卸载(lazy unmount),等设备不再使用时自动卸载

或者:

bash

复制代码
sudo lsof +f -- /mnt/usb  # 强制检查挂载点
sudo fuser -vm /mnt/usb   # 查看占用进程

5. 检查内核模块占用的设备

如果是内核模块(如 nfsdmdadm)占用设备,可以:

bash

复制代码
dmesg | grep <设备名>      # 查看内核日志
lsmod | grep nfs          # 查看是否 NFS 相关模块占用

总结

方法 命令 适用场景
lsof sudo lsof /dev/sdb1 查看具体哪个进程打开了设备文件
fuser sudo fuser -vm /mnt/usb 快速查看占用进程并结束
umount -l sudo umount -l /mnt/usb 延迟卸载,避免 device is busy
lsblk + lsof lsblk + lsof 结合查看块设备和进程

如果设备被占用,可以:

  1. 结束进程kill -9 <PID>fuser -km

  2. 延迟卸载umount -l

  3. 检查内核模块dmesglsmod


怎么查看设备的详细信息?

使用 udevadm 获取设备的属性和信息:

bash

复制代码
udevadm info --query=all --name=/dev/sda  # 替换为你的设备名

loop设备

1. 什么是 loop 设备?

  • loop 设备 允许将 普通文件(如 .iso.snap 当作 块设备(如 /dev/sda1 挂载。

  • 常用于:

    • 挂载 ISO 镜像(如安装系统)。

    • Snap 应用(Ubuntu 的沙盒化软件包)。

    • Docker 容器存储。

2. 为什么会有这么多 loop 设备?

你列出的 loop 设备大多与 Snap 应用 相关:

  • /snap/core20/snap/core22 → Ubuntu Core 系统基础组件。

  • /snap/gnome-42-2204 → GNOME 桌面环境 Snap 版。

  • /snap/lxd → LXD 容器管理工具。

  • /snap/snapd → Snap 守护进程。

每次安装或更新 Snap 应用时,可能会生成新的 loop 设备。

3. 如何管理 loop 设备?

(1) 查看所有 loop 设备

bash

复制代码
losetup -a  # 查看所有活跃的 loop 设备

或:

bash

复制代码
lsblk | grep loop  # 列出所有 loop 设备及其挂载点

(2) 手动挂载/卸载 loop 设备

  • 挂载 ISO 文件

    bash

复制代码
sudo mount -o loop ubuntu.iso /mnt/iso
  • 卸载 loop 设备

    bash

复制代码
sudo umount /snap/core20/2496  # 先卸载挂载点
sudo losetup -d /dev/loop2     # 再释放 loop 设备

(3) 清理未使用的 loop 设备

bash

复制代码
sudo apt purge --autoremove snapd  # 卸载 Snap(谨慎操作,可能影响系统)

或手动清理:

bash

复制代码
sudo losetup -D  # 强制释放所有未使用的 loop 设备

4. 如何减少 loop 设备数量?

方法 1:限制 Snap 自动挂载

bash

复制代码
sudo systemctl disable snapd.service  # 禁用 Snap 服务(谨慎)
sudo systemctl stop snapd.service

方法 2:改用传统 .deb

bash

复制代码
sudo apt install gnome-software --install-recommends  # 用 apt 替代 Snap

方法 3:调整 loop 设备上限

bash

复制代码
echo "options loop max_loop=16" | sudo tee /etc/modprobe.d/loop.conf  # 限制最多 16 个
sudo update-initramfs -u  # 更新内核配置
sudo reboot  # 重启生效

5. 常见问题

Q1: loop 设备占用太多空间?

  • Snap 应用会占用 /var/lib/snapd 空间,清理旧版本:

    bash

复制代码
sudo snap remove --purge <package>  # 删除特定 Snap
sudo snap list --all | grep disabled | awk '{print $1}' | xargs -n1 sudo snap remove --purge  # 清理旧版本

Q2: 能安全删除 loop 设备吗?

  • 不要直接删除 /dev/loopX,应该先卸载关联的 Snap:

    bash

复制代码
sudo snap remove gnome-42-2204  # 示例

Q3: 为什么 df -h 显示很多 loop

  • Snap 应用默认挂载为 squashfs(只读压缩文件系统),df 会显示它们。

6. 总结

操作 命令
查看 loop 设备 losetup -a / `lsblk
卸载 loop 设备 sudo umount /snap/xxx + sudo losetup -d /dev/loopX
清理 Snap 旧版本 sudo snap remove --purge <package>
禁用 Snap 服务 sudo systemctl disable --now snapd

如果你的系统 loop 设备过多,可以:

  1. 卸载不用的 Snap 应用

  2. 改用 apt 安装软件(减少 Snap 依赖)。

  3. 调整 max_loop 限制(避免无限增长)。


相关推荐
linux-hzh18 分钟前
Shell 脚本
linux·shell
漫步云端-r23 分钟前
Python自动化之selenium语句——浏览器设置显示尺寸、截图、刷新网页
运维·selenium·自动化
hixiaoyang28 分钟前
MVCC 原理与并发控制实现
运维·服务器·数据库
iceland934 分钟前
Docker安装
运维·docker·容器
2501_9111212342 分钟前
LVS+Keepalived 高可用
java·linux·运维
weixin_307779131 小时前
RabbitMQ备份与恢复技术详解:策略、工具与最佳实践
运维·分布式·rabbitmq
炎码工坊1 小时前
CentOS:企业级Linux的社区力量与未来演进
linux
郁大锤2 小时前
Docker容器启动失败的常见原因分析
运维·docker·容器
小王努力学编程2 小时前
【Linux网络编程】传输层协议TCP,UDP
linux·网络·c++·udp·tcp
好奇的菜鸟2 小时前
如何将 WSL 的 Ubuntu-24.04 迁移到其他电脑
linux·运维·ubuntu