linux blkid命令
blkid(Block ID) 命令用于显示块设备(如硬盘、分区)的属性信息,包括文件系统类型、UUID、卷标等,是磁盘管理和系统配置的重要工具。
一、Blkid 简介
blkid 命令用于查询和显示块设备(block device)的属性信息,主要功能包括:
- 显示块设备的 UUID(通用唯一识别码)
- 显示文件系统类型(ext4, xfs, ntfs, vfat 等)
- 显示卷标(LABEL)
- 显示分区表类型(PTUUID, PTTYPE)
- 显示块设备大小和其他属性
二、基本语法
blkid [选项] [设备...]
三、常用选项
| 选项 |
说明 |
-c 缓存文件 |
指定缓存文件(默认 /etc/blkid.tab, /run/blkid.tab, /dev/.blkid.tab) |
-d |
不显示结果,仅退出状态码(用于脚本) |
-g |
垃圾回收 blkid 缓存 |
-h |
显示帮助信息 |
-i |
显示设备 I/O 限制信息 |
-k |
列出所有已知的文件系统/RAID 类型 |
-L 标签 |
通过卷标查找设备 |
-o 格式 |
指定输出格式(full, value, list, device, udev, export) |
-p |
低级别的超级块探测(绕过缓存) |
-s 标签 |
显示指定标签的信息(如 UUID, LABEL, TYPE) |
-t 名称=值 |
通过标签值查找设备 |
-U UUID |
通过 UUID 查找设备 |
-V |
显示版本信息 |
-w 缓存文件 |
写缓存到指定文件 |
四、常用实例
1. 显示所有块设备信息
# 显示系统中所有块设备的信息
blkid
# 详细输出(完整格式)
blkid -o full
# 显示示例输出:
# /dev/sda1: UUID="xxxx-xxxx" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="xxxx-xxxx"
# /dev/sda2: UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" TYPE="ext4" PARTUUID="xxxx-xxxx"
2. 显示特定设备信息
# 显示特定分区信息
blkid /dev/sda1
# 显示多个设备信息
blkid /dev/sda1 /dev/sda2 /dev/sdb1
# 显示整个磁盘信息(无分区)
blkid /dev/sda
3. 使用不同输出格式
# 完整格式(默认)
blkid -o full
# 仅显示值(用于脚本)
blkid -o value -s UUID /dev/sda1
# 列表格式
blkid -o list
# 设备列表格式
blkid -o device
# Udev 格式
blkid -o udev /dev/sda1
# 导出格式(shell 环境变量)
blkid -o export /dev/sda1
4. 根据特定属性查找设备
# 通过 UUID 查找设备
blkid -U xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# 通过卷标(LABEL)查找设备
blkid -L "MyData"
# 通过标签值查找设备
blkid -t LABEL="MyData"
blkid -t TYPE="ext4"
blkid -t UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
5. 显示特定标签信息
# 仅显示 UUID
blkid -s UUID
# 仅显示文件系统类型
blkid -s TYPE
# 仅显示卷标
blkid -s LABEL
# 显示多个标签
blkid -s UUID -s TYPE -s LABEL
# 显示分区 UUID
blkid -s PARTUUID
# 显示分区标签
blkid -s PARTLABEL
6. 缓存管理
# 显示缓存信息
blkid -c /dev/null
# 垃圾回收缓存
blkid -g
# 将缓存写入文件
blkid -w /tmp/blkid.cache
# 从缓存文件读取
blkid -c /tmp/blkid.cache
7. 低级探测(绕过缓存)
# 直接探测设备(不读取缓存)
blkid -p /dev/sda1
# 显示I/O限制信息
blkid -i /dev/sda1
# 结合低级探测和特定标签
blkid -p -s UUID /dev/sda1
8. 列出已知文件系统类型
# 列出所有支持的文件系统/RAID类型
blkid -k
# 输出示例:
# ext2, ext3, ext4, xfs, btrfs, ntfs, vfat, swap, LVM2_member, crypto_LUKS, etc.
9. 在脚本中使用
#!/bin/bash
# 获取设备UUID
UUID=$(blkid -s UUID -o value /dev/sda1)
echo "UUID: $UUID"
# 获取文件系统类型
FSTYPE=$(blkid -s TYPE -o value /dev/sda1)
echo "Filesystem: $FSTYPE"
# 检查设备是否存在
if blkid /dev/sda1 > /dev/null 2>&1; then
echo "Device /dev/sda1 exists"
else
echo "Device /dev/sda1 not found"
fi
# 通过卷标挂载设备
LABEL="DataDisk"
DEVICE=$(blkid -L "$LABEL")
if [ -n "$DEVICE" ]; then
mount "$DEVICE" /mnt/data
fi
五、输出字段详解
| 字段 |
说明 |
示例 |
UUID |
通用唯一识别码,用于唯一标识文件系统 |
UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" |
TYPE |
文件系统类型 |
TYPE="ext4" |
LABEL |
卷标(用户定义的设备名称) |
LABEL="MyDisk" |
PARTUUID |
分区UUID(GPT分区表) |
PARTUUID="xxxx-xxxx" |
PARTLABEL |
分区标签(用户定义的分区名称) |
PARTLABEL="Linux filesystem" |
PTUUID |
分区表UUID |
PTUUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" |
PTTYPE |
分区表类型 |
PTTYPE="gpt" 或 PTTYPE="dos" |
VERSION |
文件系统版本 |
VERSION="1.0" |
USAGE |
设备用途 |
USAGE="filesystem" |
FSTABLABEL |
/etc/fstab 中的标签 |
FSTABLABEL="mydisk" |
六、实际应用场景
1. 系统启动脚本中的设备识别
#!/bin/bash
# 使用 UUID 而非设备名挂载,避免设备名变化导致挂载失败
UUID=$(blkid -s UUID -o value /dev/sdb1)
if [ -n "$UUID" ]; then
mount UUID="$UUID" /mnt/data
fi
2. 自动化备份脚本
#!/bin/bash
# 通过卷标识别备份磁盘
BACKUP_DEV=$(blkid -L "BackupDisk")
if [ -n "$BACKUP_DEV" ]; then
mount "$BACKUP_DEV" /backup
rsync -av /home/user/ /backup/
umount /backup
fi
3. 磁盘健康检查脚本
#!/bin/bash
# 检查所有 ext4 文件系统的磁盘
for DEVICE in $(blkid -t TYPE=ext4 -o device); do
echo "Checking $DEVICE..."
fsck -n "$DEVICE"
done
4. 生成 fstab 条目
#!/bin/bash
# 为所有 ext4 分区生成 fstab 条目
blkid -t TYPE=ext4 | while read LINE; do
DEVICE=$(echo "$LINE" | cut -d: -f1)
UUID=$(echo "$LINE" | grep -o 'UUID="[^"]*"' | cut -d'"' -f2)
echo "UUID=$UUID $(echo $DEVICE | sed 's/\/dev\///') ext4 defaults 0 2"
done
七、与其他命令结合使用
1. 结合 lsblk 使用
# 显示树状结构和 UUID
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,UUID
# 结合 blkid 获取更多信息
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT | while read LINE; do
DEV=$(echo $LINE | awk '{print $1}')
if [ -e "/dev/$DEV" ]; then
UUID=$(blkid -s UUID -o value "/dev/$DEV" 2>/dev/null)
echo "$LINE $UUID"
fi
done
2. 结合 findmnt 使用
# 显示已挂载设备的 UUID
findmnt -o SOURCE,TARGET,FSTYPE,OPTIONS,UUID
# 获取特定挂载点的设备信息
MOUNT_POINT="/home"
DEVICE=$(findmnt -n -o SOURCE "$MOUNT_POINT")
blkid "$DEVICE"
3. 结合 df 使用
# 显示磁盘使用情况和 UUID
df -h | while read LINE; do
DEV=$(echo $LINE | awk '{print $1}')
if [[ $DEV == /dev/* ]]; then
UUID=$(blkid -s UUID -o value "$DEV" 2>/dev/null)
echo "$LINE $UUID"
fi
done
4. 结合 mount 使用
# 使用 UUID 挂载设备
UUID=$(blkid -s UUID -o value /dev/sdb1)
mount UUID="$UUID" /mnt/data
# 使用卷标挂载
LABEL=$(blkid -s LABEL -o value /dev/sdb1)
mount LABEL="$LABEL" /mnt/data
八、常见问题解决
# 更新内核分区表信息
sudo partprobe
# 或者重新扫描 SCSI 总线
sudo rescan-scsi-bus.sh
# 强制重新探测设备(绕过缓存)
sudo blkid -p /dev/sdXN
# 重新读取分区表
sudo partx -u /dev/sdX
# ext2/3/4 文件系统生成新 UUID
sudo tune2fs -U random /dev/sdX1
# 生成特定 UUID
sudo tune2fs -U xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /dev/sdX1
# xfs 文件系统生成新 UUID
sudo xfs_admin -U generate /dev/sdX1
# swap 分区生成新 UUID
sudo swapoff /dev/sdX2
sudo mkswap -U xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /dev/sdX2
sudo swapon /dev/sdX2
# 重新生成所有分区UUID(危险!)
sudo blkid | grep -o '/dev/sd[a-z][0-9]' | while read DEV; do
sudo tune2fs -U random "$DEV" 2>/dev/null
done
# ext2/3/4 文件系统
sudo e2label /dev/sdX1 "NewLabel"
# 或者使用 tune2fs
sudo tune2fs -L "NewLabel" /dev/sdX1
# xfs 文件系统
sudo xfs_admin -L "NewLabel" /dev/sdX1
# FAT/VFAT 文件系统
sudo fatlabel /dev/sdX1 "NewLabel"
# NTFS 文件系统
sudo ntfslabel /dev/sdX1 "NewLabel"
# 查看新卷标
sudo blkid -s LABEL /dev/sdX1
九、相关命令对比
| 命令 |
用途 |
与 blkid 的区别 |
| lsblk |
列出块设备信息 |
显示设备树状结构,包含大小和挂载点,但 UUID 信息有限 |
| fdisk |
磁盘分区管理 |
创建/删除分区,不显示文件系统属性 |
| parted |
分区管理 |
GPT/MBR 分区操作,可显示分区UUID |
| udevadm |
设备管理 |
显示详细的 udev 设备信息,包含更多属性 |
| dumpe2fs |
ext 文件系统信息 |
显示 ext2/3/4 详细超级块信息 |
| tune2fs |
调整 ext 文件系统参数 |
可修改 UUID、卷标等参数 |
十、最佳实践
使用建议
- 在脚本中使用
-o value 选项获取纯净值
- 使用 UUID 而非设备名进行挂载,避免设备名变化
- 定期备份重要的 UUID 信息
- 为重要磁盘设置有意义的卷标
- 在系统配置中使用
blkid -p 确保信息准确
- 使用缓存提高多次查询效率
十一、高级技巧
1. 监控磁盘变化
#!/bin/bash
# 监控磁盘添加/移除
OLD_HASH=$(blkid | md5sum)
while true; do
sleep 5
NEW_HASH=$(blkid | md5sum)
if [ "$OLD_HASH" != "$NEW_HASH" ]; then
echo "Disk configuration changed!"
blkid
OLD_HASH="$NEW_HASH"
fi
done
2. 批量修改 UUID
#!/bin/bash
# 为所有 ext4 分区生成新 UUID
for DEVICE in $(blkid -t TYPE=ext4 -o device); do
echo "Changing UUID for $DEVICE"
sudo tune2fs -U random "$DEVICE"
done
3. 自动挂载脚本
#!/bin/bash
# 自动挂载所有未挂载的 ext4 分区
blkid -t TYPE=ext4 | while read LINE; do
DEVICE=$(echo "$LINE" | cut -d: -f1)
UUID=$(echo "$LINE" | grep -o 'UUID="[^"]*"' | cut -d'"' -f2)
MOUNT_POINT="/mnt/$(basename "$DEVICE")"
if ! grep -q "$UUID" /etc/mtab; then
echo "Mounting $DEVICE to $MOUNT_POINT"
sudo mkdir -p "$MOUNT_POINT"
sudo mount UUID="$UUID" "$MOUNT_POINT"
fi
done
提示: blkid 是系统管理员、开发人员和高级用户在磁盘管理、系统配置和脚本编写中的重要工具。正确使用它可以避免许多磁盘相关的系统问题。