linux blockdev命令

简介:blockdev命令允许从命令行调用块设备ioctl,用于查询和设置块设备的参数。它是一个强大的低级块设备管理工具,常用于脚本和系统管理中。

语法格式

blockdev [选项] [命令] [命令参数] 设备文件

常用命令和选项

命令/选项 参数 说明
--report 设备文件 报告指定设备的信息
--getsz 设备文件 获取设备的大小(512字节扇区数)
--getss 设备文件 获取逻辑扇区大小
--getpbsz 设备文件 获取物理扇区大小
--getra 设备文件 获取预读扇区数
--setra N N(扇区数) 设置预读扇区数
--getro 设备文件 检查设备是否为只读(1=只读,0=读写)
--setro 设备文件 将设备设置为只读
--setrw 设备文件 将设备设置为读写
--flushbufs 设备文件 刷新缓冲区
--getdiscardzeroes 设备文件 检查丢弃操作是否返回零
--getioopt 设备文件 获取最优I/O大小
--getalignoff 设备文件 获取对齐偏移
--getmaxsect 设备文件 获取最大扇区数
-q - 安静模式,只输出错误信息
-v - 详细模式
-V - 显示版本信息

使用示例

示例1:获取设备详细信息报告
# 显示设备的详细报告
sudo blockdev --report /dev/sda

# 输出示例:
RO    RA   SSZ   BSZ   StartSec            Size   Device
rw   256   512  4096          0   500107862016   /dev/sda
字段说明:
  • RO: 只读标志(rw=读写,ro=只读)
  • RA: 预读扇区数
  • SSZ: 扇区大小(字节)
  • BSZ: 块大小(字节)
  • StartSec: 起始扇区
  • Size: 设备大小(字节)
示例2:获取设备基本信息
# 获取设备大小(512字节扇区数)
sudo blockdev --getsz /dev/sda

# 获取逻辑扇区大小
sudo blockdev --getss /dev/sda

# 获取物理扇区大小
sudo blockdev --getpbsz /dev/sda

# 获取预读扇区数
sudo blockdev --getra /dev/sda

# 检查是否为只读设备
sudo blockdev --getro /dev/sda
示例3:设置设备参数
# 设置预读扇区数为1024(512KB)
sudo blockdev --setra 1024 /dev/sda

# 将设备设置为只读
sudo blockdev --setro /dev/sda

# 将设备设置为读写
sudo blockdev --setrw /dev/sda

# 刷新缓冲区
sudo blockdev --flushbufs /dev/sda
注意:预读(readahead)设置会影响磁盘性能,较大的值可以提高顺序读性能,但可能浪费内存。
示例4:脚本中使用blockdev
#!/bin/bash
# 设备信息收集脚本

DEVICE="/dev/sda"

echo "=== 设备信息报告 ==="
echo "设备: $DEVICE"

# 获取设备大小(扇区数)
SECTORS=$(sudo blockdev --getsz "$DEVICE")
echo "扇区数: $SECTORS"

# 获取扇区大小
SECTOR_SIZE=$(sudo blockdev --getss "$DEVICE")
echo "扇区大小: $SECTOR_SIZE 字节"

# 计算设备总大小(GB)
TOTAL_SIZE=$((SECTORS * SECTOR_SIZE / 1024 / 1024 / 1024))
echo "设备总大小: $TOTAL_SIZE GB"

# 检查设备状态
READ_ONLY=$(sudo blockdev --getro "$DEVICE")
if [ "$READ_ONLY" -eq 1 ]; then
    echo "设备状态: 只读"
else
    echo "设备状态: 读写"
fi

# 获取预读设置
READAHEAD=$(sudo blockdev --getra "$DEVICE")
echo "预读扇区数: $READAHEAD"

echo "=== 报告结束 ==="

应用场景

场景1:性能优化
优化预读设置提升性能
# 根据不同设备类型设置合适的预读值
# SSD通常需要较小的预读值,HDD需要较大的预读值

# 对于SSD设备
sudo blockdev --setra 256 /dev/nvme0n1

# 对于传统机械硬盘
sudo blockdev --setra 1024 /dev/sda

# 查看当前预读设置
sudo blockdev --getra /dev/sda
性能优化建议:
  • SSD: 预读值设置为256-512扇区
  • HDD(桌面): 预读值设置为512-1024扇区
  • HDD(服务器): 预读值设置为2048-4096扇区
  • RAID阵列: 可能需要更大的预读值
场景2:安全保护
防止意外写入重要设备
# 在备份期间将设备设置为只读
sudo blockdev --setro /dev/sdb1

# 执行备份操作(此时设备不可写)
# rsync -av /source/ /mnt/backup/

# 备份完成后恢复读写状态
sudo blockdev --setrw /dev/sdb1
自动监控脚本:
#!/bin/bash
# 监控设备是否被意外设置为只读

DEVICES=("/dev/sda" "/dev/sdb" "/dev/sdc")

for DEV in "${DEVICES[@]}"; do
    STATUS=$(sudo blockdev --getro "$DEV")
    if [ "$STATUS" -eq 1 ]; then
        echo "警告: $DEV 被设置为只读模式!" | mail -s "设备只读警告" admin@example.com
    fi
done
场景3:系统维护和调试
系统诊断和修复
# 诊断工具:收集所有块设备信息
for DEV in /dev/sd[a-z] /dev/nvme*; do
    if [ -b "$DEV" ]; then
        echo "=== $DEV 信息 ==="
        sudo blockdev --report "$DEV"
        echo ""
    fi
done

# 检查设备物理属性
sudo blockdev --getpbsz /dev/sda  # 物理扇区大小
sudo blockdev --getalignoff /dev/sda  # 对齐偏移
sudo blockdev --getmaxsect /dev/sda  # 最大扇区数
blockdev的优势
  • 直接操作内核块设备接口
  • 无需挂载即可操作设备
  • 脚本友好,易于自动化
  • 支持多种块设备类型
  • 可获取底层设备信息
  • 对系统影响小
注意事项
  • 需要root权限
  • 操作不当可能导致数据丢失
  • 部分设置重启后可能失效
  • 某些命令可能不适用于所有设备
  • 改变预读设置可能影响性能
  • 只读设置不会阻止底层格式化
常见问题解答
Q: blockdev和hdparm有什么区别?

A: 主要区别:

  • blockdev: 通用块设备接口工具,支持所有块设备类型
  • hdparm: 主要针对ATA/IDE硬盘,功能更专一
  • blockdev 更适合脚本和通用管理,hdparm 提供更多硬盘特定功能
Q: 预读设置重启后会失效吗?

A: 是的,通过blockdev设置的预读值是临时的,重启后会恢复默认值。要永久设置,需要在系统启动脚本中添加相应命令。

# 在/etc/rc.local中添加
blockdev --setra 1024 /dev/sda
Q: 如何查看所有块设备?
# 使用lsblk查看所有块设备
lsblk

# 或使用fdisk
sudo fdisk -l

# 查看块设备主号码
ls -l /dev/sda
Q: blockdev可以用于USB设备吗?

A: 可以,blockdev支持所有块设备,包括USB存储设备、SD卡等。

sudo blockdev --report /dev/sdb  # USB设备通常为sdb
相关命令对比
命令 主要用途 适用设备 特点
blockdev 通用块设备控制 所有块设备 接口统一,脚本友好
hdparm ATA/IDE硬盘管理 ATA/IDE硬盘 功能专一,性能调整
sdparm SCSI设备管理 SCSI/SAS设备 SCSI特定功能
smartctl SMART信息监控 支持SMART的设备 健康状态监控