- 文档
- 教程
【免费下载链接】linux-command
Linux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集。https://git.io/linux
blockdev是 Linux 下用于从命令行调用"区块设备控制程序"的工具,其本质是通过ioctl系统调用直接对块设备下发控制指令,从而查询或修改设备只读状态、扇区大小、刷新缓冲区、重读分区表等底层参数。本文以 linux-command 仓库中的 blockdev 手册 为主体,结合仓库内fdisk、lsblk、mount、hdparm、losetup等磁盘管理命令文档,系统讲解blockdev的语法、全部选项、典型实战场景及其底层原理,帮助你安全、精准地完成设备只读保护、分区表重载等运维操作。
blockdev 是什么:站在 ioctl 之上的块设备控制入口
blockdev命令用于"从命令行调用区块设备控制程序",其核心机制是在命令内部调用ioctl函数,向设备驱动下发控制指令,从而实现对块设备的控制(见 blockdev.md 的"补充说明")。
理解这一点非常关键:blockdev并不是去读写设备上的文件数据,而是直接与内核的设备驱动程序对话。ioctl(Input/Output Control)是 Linux 中用户态程序与设备驱动之间传递控制命令的标准通道,blockdev将--setro、--getss这类高层选项翻译成对应的ioctl请求码,发送给块设备驱动后由内核完成实际的状态切换与查询。
从仓库目录结构看,blockdev与其他磁盘管理命令共同构成了完整的块设备操作工具链:
- fdisk:查看磁盘使用情况和磁盘分区;
- lsblk:列出块设备信息及依赖关系;
- mount:挂载文件系统;
- hdparm:显示与设定 IDE/SCSI 硬盘参数;
- losetup:设定与控制 loop 循环设备。
其中blockdev的定位最为底层——它直接操控块设备本身的状态,而不是文件系统或分区表内容,因此常被用在系统维护、脚本化运维和应急只读保护等场景中。
语法与参数:最小可运行的命令形态
blockdev的语法遵循"选项 + 参数"的标准结构:
blockdev(选项)(参数)参数为设备文件名,即指定要操作的磁盘设备,例如/dev/hda4、/dev/sda、/dev/nvme0n1等。绝大多数操作都需要以 root 权限执行,因为修改设备只读状态、刷新缓冲区等属于内核级操作。
一个最简单的调用示例:
blockdev --getss /dev/sda该命令会打印/dev/sda的扇区大小(单位为字节),并立即退出。
选项全解:从只读控制到分区表重读
原手册列出了 8 个核心选项,下表将其逐一展开,并补充每个选项的实际含义与典型用途:
| 选项 | 功能说明 | 实战要点 |
|---|---|---|
-V | 打印版本号并退出 | 用于确认环境中blockdev的版本 |
-q | 安静模式 | 脚本中使用可避免多余输出 |
-v | 详细信息模式 | 输出执行过程中的详细信息,便于排错 |
--setro | 将设备设为只读 | 修改后该设备上的写入请求将被内核拒绝 |
--setrw | 将设备设为可读写 | 与--setro对应的反向操作,用于解除只读保护 |
--getro | 打印只读状态 | 输出1表示只读,输出0表示非只读 |
--getss | 打印扇区大小 | 单位为字节;原文档中标注"通常为 521",实际现代磁盘普遍为 512 字节逻辑扇区,4K 高级格式化盘为 4096,具体以设备为准 |
--flushbufs | 刷新缓冲区 | 将设备缓冲区的数据强制刷写,用于保证数据落盘 |
--rereadpt | 重新读取分区表 | 修改分区表后无需重启即可让内核感知新分区,常用于配合fdisk使用 |
关于--getss的一点澄清
原手册中"通常为 521"存在笔误。从现代 Linux 内核的实际行为看,--getss返回的是设备的逻辑扇区大小(Logical Sector Size),绝大多数 SATA/NVMe 磁盘为 512 字节,部分"高级格式化"(Advanced Format)磁盘为 4096 字节。判断设备扇区大小最稳妥的方式是直接运行命令查看返回值:
blockdev --getss /dev/sda将其与 lsblk(列出块设备拓扑与挂载点)、fdisk(查看分区表)配合使用,可以完整还原一块磁盘的物理布局。
实战:设置、查询与恢复设备的只读状态
原手册给出了三个最经典的实例,完整覆盖"保护—验证—恢复"闭环:
1. 将设备设置为只读
blockdev --setro /dev/hda4执行后,/dev/hda4在内核层面被标记为只读,对它的写入操作将被拒绝。这在以下场景非常有用:
- 对关键数据盘进行临时写保护,防止误操作;
- 挂载只读介质前的预防性设置;
- 备份任务前锁定源盘,保证备份一致性。
2. 查询设备是否为只读
blockdev --getro /dev/hda4命令返回结果:
1:表示设备当前为只读;0:表示设备当前非只读(可读写)。
该选项适合在脚本中做条件判断,例如:
if [ "$(blockdev --getro /dev/sdb)" = "1" ]; then echo "sdb 处于只读保护状态" fi3. 将设备恢复为可读写
blockdev --setrw /dev/hda4--setrw是--setro的反向操作,用于解除只读保护。需要注意:--setro与--setrw是内核级标志位的切换,与文件系统层面的只读挂载(mount -o ro,见 mount 手册)是两回事——前者阻止对块设备的底层写入,后者阻止文件系统层面的写操作,两者可以独立存在、互不替代。
进阶:刷新缓冲区与重新读取分区表
刷新缓冲区:让数据真正落盘
blockdev --flushbufs /dev/sdaLinux 内核为块设备维护了页缓存/缓冲区,写入的数据可能暂存在内存中。--flushbufs会强制将这些缓冲数据刷写到底层设备,确保数据落盘。在拔盘、关机、或对设备做底层操作之前执行刷新,可以显著降低数据丢失风险。
重新读取分区表:免重启生效
blockdev --rereadpt /dev/sda在 fdisk 的手册中可以看到,修改分区表并执行w保存时,fdisk 会调用ioctl()重新读取分区表并 "Syncing disks"。blockdev --rereadpt提供的正是这一能力的独立入口:当你用fdisk、parted等工具修改分区后,如果不希望重启系统,可以执行该命令让内核重新扫描分区表,新分区立即生效。
典型的联动流程如下:
fdisk /dev/sdb # 修改分区表(见 fdisk 手册的完整交互示例) blockdev --rereadpt /dev/sdb # 内核重新读取分区表,无需重启 lsblk # 使用 lsblk 确认新分区已出现 mkfs.ext4 /dev/sdb1 # 格式化新分区 mount /dev/sdb1 /data # 挂载使用(见 mount 手册)--rereadpt使用场景包括:磁盘热插拔后分区表未自动更新、脚本化分区操作、以及 fdisk 退出时提示需要重启或重新读取分区表的情况。注意:如果该设备正在被使用(有挂载点或进程占用),重读分区表可能失败并提示 "Device or resource busy",此时需要先卸载(umount)再操作。
关联工具链:blockdev 在磁盘运维中的位置
blockdev擅长的是设备层状态控制,但它并不能独立完成"分区—格式化—挂载"的完整流程,实践中需要与其他命令协同:
| 阶段 | 命令 | 说明 |
|---|---|---|
| 查看设备信息 | lsblk | 树状列出所有块设备及挂载点,查看 RO 只读列、SIZE、TYPE |
| 查看/修改分区表 | fdisk | 交互式分区,p查看、n新建、w保存 |
| 设备层控制 | blockdev | 只读状态、扇区大小、刷新缓冲区、重读分区表 |
| 底层参数调优 | hdparm | 读取速度测试、DMA/缓存模式、电源管理等 IDE/SCSI 参数 |
| 镜像文件虚拟化 | losetup | 将镜像文件关联为 loop 设备 |
| 挂载/卸载 | mount | 将块设备或镜像挂载到目录 |
以挂载磁盘镜像为例,losetup 手册 展示的流程是先dd创建镜像、再losetup /dev/loop1 floppy.img将文件虚拟成块设备、最后mount /dev/loop0 /tmp挂载。在这个过程中,blockdev同样可以作用于 loop 设备(如blockdev --getro /dev/loop1查询其只读状态),体现了该命令对"一切块设备"的普适性。
综合实战:脚本化只读保护示例
将上述知识点串成一个可复用的运维脚本片段:
#!/bin/bash # 保护目标设备 DEV=/dev/sdb # 1. 查询并记录当前只读状态 echo "操作前只读状态: $(blockdev --getro $DEV)" # 2. 设置为只读 blockdev --setro $DEV # 3. 验证设置生效 if [ "$(blockdev --getro $DEV)" = "1" ]; then echo "已进入只读保护模式" fi # 4. 业务完成后恢复可读写 blockdev --setrw $DEV执行任何--setro/--setrw/--rereadpt操作时都建议配合blockdev -v或先用--getro、--getss这类只读查询选项确认设备状态,避免误操作生产数据盘。
小结
blockdev通过ioctl直接操控块设备内核状态,是 Linux 磁盘运维中不可替代的底层工具:
- 查询类:
--getro(只读状态)、--getss(扇区大小)可用于脚本化状态采集; - 控制类:
--setro/--setrw(只读切换)、--flushbufs(刷新缓冲区)、--rereadpt(重读分区表)覆盖日常运维的高频操作; - 与其他工具协同:与 fdisk、lsblk、mount 配合可完成从分区、格式化、保护到挂载的完整链路。
如需在 linux-command 仓库中进一步查阅相关命令手册,可直接阅读 blockdev.md 原文,或对照 fdisk.md、lsblk.md、hdparm.md、losetup.md 等相邻文档构建完整的块设备运维知识体系。
- 文档
- 教程
【免费下载链接】linux-command
Linux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集。https://git.io/linux
相关推荐
Redocly CLI完全指南:轻松掌握OpenAPI文档生成与API验证技巧
Redocly CLI完全指南:轻松掌握OpenAPI文档生成与API验证技巧 Redocly CLI是一款功能强大的OpenAPI工具,能够帮助开发者轻松实现
开发工具Linux Device Mapper 的 kcopyd:块设备扇区异步复制框架的原理与用法
Linux Device Mapper 的 kcopyd:块设备扇区异步复制框架的原理与用法 导读 kcopyd 是 Linux Device Mapper(D
操作系统内核驱动驱动开发虚拟化嵌入式网络存储Linux 内核 blkdevparts 命令行分区解析:eMMC 嵌入式设备的分区表配置指南
Linux 内核 blkdevparts 命令行分区解析:eMMC 嵌入式设备的分区表配置指南 导读 blkdevparts 是 Linux 内核提供的一种从内
操作系统内核驱动驱动开发虚拟化嵌入式网络存储
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考