Linux常见设备

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 命令(推荐)

findmnt 是 util-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'

只显示 tmpfs 或 nfs 等特定类型:

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 # 强制结束单个进程

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

使用 lsof 或 fuser 查找占用进程并结束。

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

Q2: USB 设备无法安全移除

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

使用 udisksctl power-off 或 eject。

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

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

总结

场景

命令

普通卸载

sudo umount /mnt/usb 或 sudo umount /dev/sdb1

强制结束占用进程

sudo fuser -km /mnt/usb 或 sudo lsof +f -- /mnt/usb

延迟卸载

sudo umount -l /mnt/usb

安全移除硬件

udisksctl power-off -b /dev/sdb 或 sudo eject /dev/sdb

卸载 LVM

sudo umount /dev/mapper/vg0-lv0 → sudo vgchange -an vg0

卸载加密设备

sudo umount /mnt/encrypted → sudo 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,而是由内核网络子系统管理。

通过 ifconfig 或 ip 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 常用于脚本和编程。

网络设备(eth0、wlan0)不由 /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 :进程名(如 bash、vim)。

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

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. 检查内核模块占用的设备

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

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

结合查看块设备和进程

如果设备被占用,可以:

结束进程 :kill -9 或 fuser -km。

延迟卸载 :umount -l。

检查内核模块 :dmesg 或 lsmod

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

使用 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 # 删除特定 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

禁用 Snap 服务

sudo systemctl disable --now snapd

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

卸载不用的 Snap 应用。

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

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

🌸 相关推荐 🌸

世界十大著名体育明星 菲尔普斯第八,乔丹第一
365bet足球论坛

世界十大著名体育明星 菲尔普斯第八,乔丹第一

📅 09-21 👀 8933
AAG的主要含义
365bet足球论坛

AAG的主要含义

📅 08-02 👀 3002
清除输入法(搜狗)弹窗广告,以及电脑弹窗广告(小推荐)