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
延迟卸载 :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
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 限制(避免无限增长)。