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 是系统管理员、开发人员和高级用户在磁盘管理、系统配置和脚本编写中的重要工具。正确使用它可以避免许多磁盘相关的系统问题。