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 <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
使用
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 <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. 检查内核模块占用的设备
如果是内核模块(如
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 <PID>
或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 <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
设备过多,可以:
卸载不用的 Snap 应用。
改用
apt
安装软件(减少 Snap 依赖)。调整
max_loop
限制(避免无限增长)。