raw 命令主要用于直接访问和操作块设备(如硬盘分区、U盘、SD卡等)上的原始扇区数据,它绕过了文件系统(如 ext4, NTFS, FAT32),直接与设备硬件进行交互,这在数据恢复、低级格式化、磁盘镜像、嵌入式系统开发等场景下非常有用。

核心功能与用途
raw 命令的核心功能是提供一个设备文件,让用户可以像访问普通文件一样,直接读写磁盘的物理扇区。
主要用途包括:
-
数据恢复:
- 当文件系统损坏时,可以使用
raw命令直接读取磁盘扇区,尝试从底层恢复被删除或损坏的文件。 - 一个被删除的文件,其数据可能仍然存在于磁盘上,只是文件系统的元信息(如 inode)被标记为可覆盖。
raw命令可以帮你把这些数据块“抓”出来。
- 当文件系统损坏时,可以使用
-
磁盘镜像:
- 可以使用
dd命令配合raw设备文件,创建一个磁盘的精确副本(镜像),这对于系统备份、克隆系统到多台机器或进行取证分析至关重要。 dd if=/dev/raw/raw1 of=/path/to/disk.img bs=4M
- 可以使用
-
低级格式化/写入引导扇区:
(图片来源网络,侵删)可以直接向磁盘的特定扇区(如主引导记录 MBR 或 GUID 分区表 GPT)写入数据,这在安装引导程序(如 GRUB)或修复引导扇区时非常有用。
-
嵌入式系统开发:
- 在开发嵌入式设备时,经常需要将整个操作系统(如 Yocto, Buildroot)或固件直接烧录到存储介质(如 eMMC, SD 卡)的特定偏移位置。
raw命令提供了精确的控制。
- 在开发嵌入式设备时,经常需要将整个操作系统(如 Yocto, Buildroot)或固件直接烧录到存储介质(如 eMMC, SD 卡)的特定偏移位置。
-
性能测试:
可以绕过文件系统的缓存和开销,直接测试磁盘的原始读写性能。
(图片来源网络,侵删)
如何使用 raw 命令
raw 命令的使用分为两步:
- 绑定:将一个
/dev/raw/下的设备文件(如raw1)绑定到一个实际的块设备(如/dev/sdb1)。 - 使用:像使用普通文件一样,通过
/dev/raw/raw1来访问/dev/sdb1的原始数据。
前提条件
raw 命令通常需要 root 权限才能执行。
示例:将 raw1 绑定到 /dev/sdb1
假设你有一块 U 盘,系统识别为 /dev/sdb,并且上面有一个主分区 /dev/sdb1,你想直接访问这个分区的原始数据。
-
检查块设备 使用
lsblk或fdisk -l确认你的设备信息。$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 238.5G 0 disk ├─sda1 8:1 0 512M 0 part /boot/efi └─sda2 8:2 0 238G 0 part / sdb 8:16 1 14.9G 0 disk <-- 这是我们的U盘 └─sdb1 8:17 1 14.9G 0 part <-- 这是U盘的主分区
-
绑定设备 使用
raw命令将/dev/raw/raw1绑定到/dev/sdb1。# sudo raw /dev/raw/raw1 /dev/sdb1
/dev/raw/raw1:这是你要创建的原始设备文件。raw0,raw1,raw2... 最多可以创建 8 到 64 个(取决于内核配置)。/dev/sdb1:这是你要绑定的源块设备。
-
验证绑定 绑定成功后,
/dev/raw/raw1文件就会被创建,你可以检查它的权限和所有者,并查看它指向的设备。# ls -l /dev/raw/raw1 brw-rw---- 1 root disk 162, 1 Dec 1 10:00 /dev/raw/raw1
b表示这是一个块设备。162, 1是它的主设备号和次设备号,这通常与/dev/sdb1的设备号一致,说明绑定成功。
-
使用原始设备 你可以使用任何命令来操作
/dev/raw/raw1,创建一个磁盘镜像:# dd if=/dev/raw/raw1 of=/home/user/usb_backup.img bs=4M
这条命令会把 U 盘
/dev/sdb1的所有内容备份到usb_backup.img文件中。 -
解除绑定 当你使用完毕后,应该解除绑定,释放资源。
# raw /dev/raw/raw1 /dev/null
将
/dev/raw/raw1绑定到/dev/null就相当于解除了它之前的绑定。
raw 命令的详细选项
raw 命令本身非常简单,主要用法如下:
raw [OPTION] <rawdevice> <major> <minor> raw [OPTION] <rawdevice> <existing-device> raw -qa
选项说明:
-
-q或--query:查询绑定状态。raw -q /dev/raw/raw1:查询raw1的绑定情况。raw -qa:查询所有raw设备的绑定情况。
-
-a或--assign:显式地指定主设备号和次设备号来绑定,这是比较底层的方式。- 示例:
raw /dev/raw/raw1 8 17。8是/dev/sda的主设备号,17是/dev/sda1的次设备号,这种方式不如直接指定设备名直观。
- 示例:
-
--remove:解除绑定。- 示例:
raw --remove /dev/raw/raw1
- 示例:
两种绑定方式的区别
-
通过设备名绑定(推荐)
raw /dev/raw/raw1 /dev/sdb1
- 优点:简单直观,无需关心设备号,即使内核重新加载模块导致设备号变化,只要设备名(如
/dev/sdb1)不变,绑定关系依然有效。 - 缺点:依赖于
udev或类似机制来创建/dev/sdb1这样的设备文件。
- 优点:简单直观,无需关心设备号,即使内核重新加载模块导致设备号变化,只要设备名(如
-
通过设备号绑定
raw /dev/raw/raw1 8 17
- 优点:不依赖于
udev,在某些最小化系统或嵌入式环境中可能有用。 - 缺点:不直观,如果设备号发生变化(插入其他磁盘导致
sdb变成sdc),绑定就会失效。
- 优点:不依赖于
重要注意事项与警告
使用 raw 命令风险极高,操作不当会导致数据永久丢失。
-
数据丢失风险:直接写入磁盘会完全覆盖目标区域的数据,如果你错误地将
/dev/sda绑定到raw1并写入数据,你的整个系统分区都可能被毁掉。- 黄金法则:在执行
dd或其他写入命令前,务必再三确认if=(输入)和of=(输出)的参数是否正确!
- 黄金法则:在执行
-
需要 Root 权限:所有
raw命令的操作都需要sudo或root用户执行。 -
设备文件不存在:
/dev/raw/目录下没有raw1这样的文件,你需要手动创建它们,在较新的 Linux 发行版中,udev会自动创建它们,如果没有,可以手动创建:# mknod /dev/raw/raw1 b 162 1 # chown root:disk /dev/raw/raw1 # chmod 660 /dev/raw/raw1
162和1是你目标设备的主次设备号。 -
现代替代方案:在现代 Linux 系统中,
raw命令的功能在很大程度上被更现代、更安全的工具所取代,losetup:用于创建回环设备,可以挂载一个文件(如磁盘镜像)像块设备一样使用。ddrescue:比dd更强大的数据恢复和克隆工具,它会尝试读取和恢复坏扇区,而不是简单地失败。kpartx:用于为磁盘镜像文件中的分区创建设备映射(如/dev/loop0p1),方便直接访问分区。
| 特性 | 描述 |
|---|---|
| 功能 | 绕过文件系统,直接访问块设备的物理扇区。 |
| 用途 | 数据恢复、磁盘镜像、低级格式化、固件烧录。 |
| 风险 | 极高! 错误操作会导致数据永久丢失。 |
| 核心命令 | sudo raw /dev/raw/raw1 /dev/sdXn (绑定) |
| 查询 | raw -qa (查询所有) |
| 解除 | sudo raw /dev/raw/raw1 /dev/null (解除绑定) |
| 替代方案 | losetup, ddrescue, kpartx |
raw 是一个非常强大但危险的工具,适用于高级用户和特定任务,在使用它之前,请务必充分了解其工作原理,并始终对重要数据进行备份。
